{"version":3,"sources":["scrolloverflow.js"],"names":["window","document","Math","rAF","requestAnimationFrame","webkitRequestAnimationFrame","mozRequestAnimationFrame","oRequestAnimationFrame","msRequestAnimationFrame","callback","setTimeout","utils","me","_elementStyle","createElement","style","_vendor","vendors","i","l","length","substr","_prefixStyle","charAt","toUpperCase","getTime","Date","now","extend","target","obj","addEvent","el","type","fn","capture","addEventListener","removeEvent","removeEventListener","prefixPointerEvent","pointerEvent","MSPointerEvent","momentum","current","start","time","lowerMargin","wrapperSize","deceleration","destination","duration","distance","speed","abs","undefined","round","_transform","hasTransform","hasPerspective","hasTouch","hasPointer","PointerEvent","hasTransition","isBadAndroid","appVersion","navigator","test","safariVersion","match","parseFloat","transform","transitionTimingFunction","transitionDuration","transitionDelay","transformOrigin","hasClass","e","c","RegExp","className","addClass","newclass","split","push","join","removeClass","re","replace","offset","left","offsetLeft","top","offsetTop","offsetParent","preventDefaultException","exceptions","eventType","touchstart","touchmove","touchend","mousedown","mousemove","mouseup","pointerdown","pointermove","pointerup","MSPointerDown","MSPointerMove","MSPointerUp","ease","quadratic","k","circular","sqrt","back","bounce","elastic","pow","sin","f","PI","tap","eventName","ev","createEvent","initEvent","pageX","pageY","dispatchEvent","click","tagName","MouseEvent","view","detail","screenX","screenY","clientX","clientY","ctrlKey","altKey","shiftKey","metaKey","button","relatedTarget","_constructed","IScroll","options","this","wrapper","querySelector","scroller","children","scrollerStyle","resizeScrollbars","mouseWheelSpeed","snapThreshold","disablePointer","disableTouch","disableMouse","startX","startY","scrollY","directionLockThreshold","bounceTime","bounceEasing","preventDefault","HWCompositing","useTransition","useTransform","bindToWrapper","onmousedown","translateZ","eventPassthrough","scrollX","freeScroll","resizePolling","position","shrinkScrollbars","invertWheelDirection","x","y","directionX","directionY","_events","_init","refresh","scrollTo","enable","createDefaultScrollbar","direction","interactive","scrollbar","indicator","cssText","height","width","pointerEvents","appendChild","Indicator","wrapperStyle","indicatorStyle","listenX","listenY","resize","defaultScrollbars","shrink","fade","speedRatioX","speedRatioY","sizeRatioX","sizeRatioY","maxPosX","maxPosY","durationProp","self","opacity","prototype","version","_initEvents","scrollbars","indicators","_initIndicators","mouseWheel","_initWheel","snap","_initSnap","keyBindings","_initKeys","destroy","clearTimeout","resizeTimeout","_execEvent","_transitionEnd","isInTransition","_transitionTime","resetPosition","_start","which","enabled","initiated","pos","point","touches","moved","distX","distY","directionLocked","startTime","getComputedPosition","_translate","isAnimating","absStartX","absStartY","pointX","pointY","_move","newX","newY","absDistX","absDistY","deltaX","deltaY","timestamp","endTime","hasHorizontalScroll","hasVerticalScroll","maxScrollX","maxScrollY","_end","changedTouches","momentumX","momentumY","distanceX","distanceY","easing","flick","wrapperWidth","wrapperHeight","max","_nearestSnap","currentPage","snapSpeed","min","_resize","that","disable","offsetHeight","clientWidth","clientHeight","scrollerWidth","offsetWidth","scrollerHeight","wrapperOffset","on","off","index","indexOf","splice","apply","slice","call","arguments","scrollBy","transitionType","_transitionTimingFunction","_animate","scrollToElement","offsetX","offsetY","nodeType","transitionTime","updatePosition","remove","matrix","getComputedStyle","interactiveScrollbars","customStyle","fadeScrollbars","concat","_indicatorsMap","wheelTimeout","_wheel","userAgent","wheelDeltaX","wheelDeltaY","deltaMode","wheelDelta","goToPage","querySelectorAll","n","cx","cy","m","stepX","snapStepX","stepY","snapStepY","pages","snapThresholdX","snapThresholdY","posX","posY","next","prev","keys","pageUp","pageDown","end","home","up","right","down","charCodeAt","_key","prevTime","keyTime","keyAcceleration","keyCode","destX","destY","easingFn","destTime","step","handleEvent","stopPropagation","fadeTimeout","parentNode","removeChild","lastPointX","lastPointY","_pos","display","bottom","indicatorWidth","minBoundaryX","maxBoundaryX","indicatorHeight","minBoundaryY","maxBoundaryY","ignoreBoundaries","val","hold","visible","delay","bind","module","exports","define","amd","fp_scrolloverflow","SCROLLABLE","SCROLLABLE_SEL","ACTIVE_SEL","SECTION_SEL","SECTION_ACTIVE_SEL","SLIDE_SEL","TABLE_CELL_SEL","scrollBarHandler","createScrollBarForAll","fp_utils","body","forEachSectionAndSlide","removeScrollBar","createScrollBar","element","css","overflow","contentHeight","section","scrollOverflowHandler","wrap","wrapContent","closest","scrollable","paddings","parseInt","scrollHeight","verticalCentered","$","getWindowHeight","scrollHeightWidthoutPaddings","update","wrapInner","create","iscrollOptions","forEach","slides","slide","init","readyState","fullpage_api","shared","afterRenderActions","wheelOn","wheelOff","g_fullpageOptions","iscrollHandler","refreshId","iScrollInstances","lastScrollY","hasBeenInit","hideScrollbars","isTouch","msMaxTouchPoints","deepExtend","scrollOverflowOptions","toggleWheel","value","item","iScrollInstance","fp_iscrollInstance","setIscroll","action","onLeave","beforeLeave","afterLoad","instance","isScrolled","getScrollTop","isDoubleChecking","activeSection","unwrap","silentMoveTo"],"mappings":"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","file":"scrolloverflow.min.js","sourcesContent":["/*!\n* Scrolloverflow 2.0.6 module for fullPage.js >= 3\n* https://github.com/alvarotrigo/fullPage.js\n*/\n/**\n* Customized version of iScroll.js 0.1.3\n* It fixes bugs affecting its integration with fullpage.js\n* @license\n*/\n/*! iScroll v5.2.0 ~ (c) 2008-2016 Matteo Spinelli ~ http://cubiq.org/license */\n(function (window, document, Math) {\nvar rAF = window.requestAnimationFrame  ||\n    window.webkitRequestAnimationFrame  ||\n    window.mozRequestAnimationFrame     ||\n    window.oRequestAnimationFrame       ||\n    window.msRequestAnimationFrame      ||\n    function (callback) { window.setTimeout(callback, 1000 / 60); };\n\nvar utils = (function () {\n    var me = {};\n\n    var _elementStyle = document.createElement('div').style;\n    var _vendor = (function () {\n        var vendors = ['t', 'webkitT', 'MozT', 'msT', 'OT'],\n            transform,\n            i = 0,\n            l = vendors.length;\n\n        for ( ; i < l; i++ ) {\n            transform = vendors[i] + 'ransform';\n            if ( transform in _elementStyle ) return vendors[i].substr(0, vendors[i].length-1);\n        }\n\n        return false;\n    })();\n\n    function _prefixStyle (style) {\n        if ( _vendor === false ) return false;\n        if ( _vendor === '' ) return style;\n        return _vendor + style.charAt(0).toUpperCase() + style.substr(1);\n    }\n\n    me.getTime = Date.now || function getTime () { return new Date().getTime(); };\n\n    me.extend = function (target, obj) {\n        for ( var i in obj ) {\n            target[i] = obj[i];\n        }\n    };\n\n    me.addEvent = function (el, type, fn, capture) {\n        el.addEventListener(type, fn, !!capture);\n    };\n\n    me.removeEvent = function (el, type, fn, capture) {\n        el.removeEventListener(type, fn, !!capture);\n    };\n\n    me.prefixPointerEvent = function (pointerEvent) {\n        return window.MSPointerEvent ?\n            'MSPointer' + pointerEvent.charAt(7).toUpperCase() + pointerEvent.substr(8):\n            pointerEvent;\n    };\n\n    me.momentum = function (current, start, time, lowerMargin, wrapperSize, deceleration) {\n        var distance = current - start,\n            speed = Math.abs(distance) / time,\n            destination,\n            duration;\n\n        deceleration = deceleration === undefined ? 0.0006 : deceleration;\n\n        destination = current + ( speed * speed ) / ( 2 * deceleration ) * ( distance < 0 ? -1 : 1 );\n        duration = speed / deceleration;\n\n        if ( destination < lowerMargin ) {\n            destination = wrapperSize ? lowerMargin - ( wrapperSize / 2.5 * ( speed / 8 ) ) : lowerMargin;\n            distance = Math.abs(destination - current);\n            duration = distance / speed;\n        } else if ( destination > 0 ) {\n            destination = wrapperSize ? wrapperSize / 2.5 * ( speed / 8 ) : 0;\n            distance = Math.abs(current) + destination;\n            duration = distance / speed;\n        }\n\n        return {\n            destination: Math.round(destination),\n            duration: duration\n        };\n    };\n\n    var _transform = _prefixStyle('transform');\n\n    me.extend(me, {\n        hasTransform: _transform !== false,\n        hasPerspective: _prefixStyle('perspective') in _elementStyle,\n        hasTouch: 'ontouchstart' in window,\n        hasPointer: !!(window.PointerEvent || window.MSPointerEvent), // IE10 is prefixed\n        hasTransition: _prefixStyle('transition') in _elementStyle\n    });\n\n    /*\n    This should find all Android browsers lower than build 535.19 (both stock browser and webview)\n    - galaxy S2 is ok\n    - 2.3.6 : `AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1`\n    - 4.0.4 : `AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30`\n   - galaxy S3 is badAndroid (stock brower, webview)\n     `AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30`\n   - galaxy S4 is badAndroid (stock brower, webview)\n     `AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30`\n   - galaxy S5 is OK\n     `AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Mobile Safari/537.36 (Chrome/)`\n   - galaxy S6 is OK\n     `AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Mobile Safari/537.36 (Chrome/)`\n  */\n    me.isBadAndroid = (function() {\n        var appVersion = window.navigator.appVersion;\n        // Android browser is not a chrome browser.\n        if (/Android/.test(appVersion) && !(/Chrome\\/\\d/.test(appVersion))) {\n            var safariVersion = appVersion.match(/Safari\\/(\\d+.\\d)/);\n            if(safariVersion && typeof safariVersion === \"object\" && safariVersion.length >= 2) {\n                return parseFloat(safariVersion[1]) < 535.19;\n            } else {\n                return true;\n            }\n        } else {\n            return false;\n        }\n    })();\n\n    me.extend(me.style = {}, {\n        transform: _transform,\n        transitionTimingFunction: _prefixStyle('transitionTimingFunction'),\n        transitionDuration: _prefixStyle('transitionDuration'),\n        transitionDelay: _prefixStyle('transitionDelay'),\n        transformOrigin: _prefixStyle('transformOrigin')\n    });\n\n    me.hasClass = function (e, c) {\n        var re = new RegExp(\"(^|\\\\s)\" + c + \"(\\\\s|$)\");\n        return re.test(e.className);\n    };\n\n    me.addClass = function (e, c) {\n        if ( me.hasClass(e, c) ) {\n            return;\n        }\n\n        var newclass = e.className.split(' ');\n        newclass.push(c);\n        e.className = newclass.join(' ');\n    };\n\n    me.removeClass = function (e, c) {\n        if ( !me.hasClass(e, c) ) {\n            return;\n        }\n\n        var re = new RegExp(\"(^|\\\\s)\" + c + \"(\\\\s|$)\", 'g');\n        e.className = e.className.replace(re, ' ');\n    };\n\n    me.offset = function (el) {\n        var left = -el.offsetLeft,\n            top = -el.offsetTop;\n\n        // jshint -W084\n        while (el = el.offsetParent) {\n            left -= el.offsetLeft;\n            top -= el.offsetTop;\n        }\n        // jshint +W084\n\n        return {\n            left: left,\n            top: top\n        };\n    };\n\n    me.preventDefaultException = function (el, exceptions) {\n        for ( var i in exceptions ) {\n            if ( exceptions[i].test(el[i]) ) {\n                return true;\n            }\n        }\n\n        return false;\n    };\n\n    me.extend(me.eventType = {}, {\n        touchstart: 1,\n        touchmove: 1,\n        touchend: 1,\n\n        mousedown: 2,\n        mousemove: 2,\n        mouseup: 2,\n\n        pointerdown: 3,\n        pointermove: 3,\n        pointerup: 3,\n\n        MSPointerDown: 3,\n        MSPointerMove: 3,\n        MSPointerUp: 3\n    });\n\n    me.extend(me.ease = {}, {\n        quadratic: {\n            style: 'cubic-bezier(0.25, 0.46, 0.45, 0.94)',\n            fn: function (k) {\n                return k * ( 2 - k );\n            }\n        },\n        circular: {\n            style: 'cubic-bezier(0.1, 0.57, 0.1, 1)',   // Not properly \"circular\" but this looks better, it should be (0.075, 0.82, 0.165, 1)\n            fn: function (k) {\n                return Math.sqrt( 1 - ( --k * k ) );\n            }\n        },\n        back: {\n            style: 'cubic-bezier(0.175, 0.885, 0.32, 1.275)',\n            fn: function (k) {\n                var b = 4;\n                return ( k = k - 1 ) * k * ( ( b + 1 ) * k + b ) + 1;\n            }\n        },\n        bounce: {\n            style: '',\n            fn: function (k) {\n                if ( ( k /= 1 ) < ( 1 / 2.75 ) ) {\n                    return 7.5625 * k * k;\n                } else if ( k < ( 2 / 2.75 ) ) {\n                    return 7.5625 * ( k -= ( 1.5 / 2.75 ) ) * k + 0.75;\n                } else if ( k < ( 2.5 / 2.75 ) ) {\n                    return 7.5625 * ( k -= ( 2.25 / 2.75 ) ) * k + 0.9375;\n                } else {\n                    return 7.5625 * ( k -= ( 2.625 / 2.75 ) ) * k + 0.984375;\n                }\n            }\n        },\n        elastic: {\n            style: '',\n            fn: function (k) {\n                var f = 0.22,\n                    e = 0.4;\n\n                if ( k === 0 ) { return 0; }\n                if ( k == 1 ) { return 1; }\n\n                return ( e * Math.pow( 2, - 10 * k ) * Math.sin( ( k - f / 4 ) * ( 2 * Math.PI ) / f ) + 1 );\n            }\n        }\n    });\n\n    me.tap = function (e, eventName) {\n        var ev = document.createEvent('Event');\n        ev.initEvent(eventName, true, true);\n        ev.pageX = e.pageX;\n        ev.pageY = e.pageY;\n        e.target.dispatchEvent(ev);\n    };\n\n    me.click = function (e) {\n        var target = e.target,\n            ev;\n\n        if ( !(/(SELECT|INPUT|TEXTAREA)/i).test(target.tagName) ) {\n            // https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/initMouseEvent\n            // initMouseEvent is deprecated.\n            ev = document.createEvent(window.MouseEvent ? 'MouseEvents' : 'Event');\n            ev.initEvent('click', true, true);\n            ev.view = e.view || window;\n            ev.detail = 1;\n            ev.screenX = target.screenX || 0;\n            ev.screenY = target.screenY || 0;\n            ev.clientX = target.clientX || 0;\n            ev.clientY = target.clientY || 0;\n            ev.ctrlKey = !!e.ctrlKey;\n            ev.altKey = !!e.altKey;\n            ev.shiftKey = !!e.shiftKey;\n            ev.metaKey = !!e.metaKey;\n            ev.button = 0;\n            ev.relatedTarget = null;\n            ev._constructed = true;\n            target.dispatchEvent(ev);\n        }\n    };\n\n    return me;\n})();\nfunction IScroll (el, options) {\n    this.wrapper = typeof el == 'string' ? document.querySelector(el) : el;\n    this.scroller = this.wrapper.children[0];\n    this.scrollerStyle = this.scroller.style;       // cache style for better performance\n\n    this.options = {\n\n        resizeScrollbars: true,\n\n        mouseWheelSpeed: 20,\n\n        snapThreshold: 0.334,\n\n// INSERT POINT: OPTIONS\n        disablePointer : !utils.hasPointer,\n        disableTouch : utils.hasPointer || !utils.hasTouch,\n        disableMouse : utils.hasPointer || utils.hasTouch,\n        startX: 0,\n        startY: 0,\n        scrollY: true,\n        directionLockThreshold: 5,\n        momentum: true,\n\n        bounce: true,\n        bounceTime: 600,\n        bounceEasing: '',\n\n        preventDefault: true,\n        preventDefaultException: { tagName: /^(INPUT|TEXTAREA|BUTTON|SELECT|LABEL)$/ },\n\n        HWCompositing: true,\n        useTransition: true,\n        useTransform: true,\n        bindToWrapper: typeof window.onmousedown === \"undefined\"\n    };\n\n    for ( var i in options ) {\n        this.options[i] = options[i];\n    }\n\n    // Normalize options\n    this.translateZ = this.options.HWCompositing && utils.hasPerspective ? ' translateZ(0)' : '';\n\n    this.options.useTransition = utils.hasTransition && this.options.useTransition;\n    this.options.useTransform = utils.hasTransform && this.options.useTransform;\n\n    this.options.eventPassthrough = this.options.eventPassthrough === true ? 'vertical' : this.options.eventPassthrough;\n    this.options.preventDefault = !this.options.eventPassthrough && this.options.preventDefault;\n\n    // If you want eventPassthrough I have to lock one of the axes\n    this.options.scrollY = this.options.eventPassthrough == 'vertical' ? false : this.options.scrollY;\n    this.options.scrollX = this.options.eventPassthrough == 'horizontal' ? false : this.options.scrollX;\n\n    // With eventPassthrough we also need lockDirection mechanism\n    this.options.freeScroll = this.options.freeScroll && !this.options.eventPassthrough;\n    this.options.directionLockThreshold = this.options.eventPassthrough ? 0 : this.options.directionLockThreshold;\n\n    this.options.bounceEasing = typeof this.options.bounceEasing == 'string' ? utils.ease[this.options.bounceEasing] || utils.ease.circular : this.options.bounceEasing;\n\n    this.options.resizePolling = this.options.resizePolling === undefined ? 60 : this.options.resizePolling;\n\n    if ( this.options.tap === true ) {\n        this.options.tap = 'tap';\n    }\n\n    // https://github.com/cubiq/iscroll/issues/1029\n    if (!this.options.useTransition && !this.options.useTransform) {\n        if(!(/relative|absolute/i).test(this.scrollerStyle.position)) {\n            this.scrollerStyle.position = \"relative\";\n        }\n    }\n\n    if ( this.options.shrinkScrollbars == 'scale' ) {\n        this.options.useTransition = false;\n    }\n\n    this.options.invertWheelDirection = this.options.invertWheelDirection ? -1 : 1;\n\n// INSERT POINT: NORMALIZATION\n\n    // Some defaults\n    this.x = 0;\n    this.y = 0;\n    this.directionX = 0;\n    this.directionY = 0;\n    this._events = {};\n\n// INSERT POINT: DEFAULTS\n\n    this._init();\n    this.refresh();\n\n    this.scrollTo(this.options.startX, this.options.startY);\n    this.enable();\n}\n\nIScroll.prototype = {\n    version: '5.2.0',\n\n    _init: function () {\n        this._initEvents();\n\n        if ( this.options.scrollbars || this.options.indicators ) {\n            this._initIndicators();\n        }\n\n        if ( this.options.mouseWheel ) {\n            this._initWheel();\n        }\n\n        if ( this.options.snap ) {\n            this._initSnap();\n        }\n\n        if ( this.options.keyBindings ) {\n            this._initKeys();\n        }\n\n// INSERT POINT: _init\n\n    },\n\n    destroy: function () {\n        this._initEvents(true);\n        clearTimeout(this.resizeTimeout);\n        this.resizeTimeout = null;\n        this._execEvent('destroy');\n    },\n\n    _transitionEnd: function (e) {\n        if ( e.target != this.scroller || !this.isInTransition ) {\n            return;\n        }\n\n        this._transitionTime();\n        if ( !this.resetPosition(this.options.bounceTime) ) {\n            this.isInTransition = false;\n            this._execEvent('scrollEnd');\n        }\n    },\n\n    _start: function (e) {\n        // React to left mouse button only\n        if ( utils.eventType[e.type] != 1 ) {\n          // for button property\n          // http://unixpapa.com/js/mouse.html\n          var button;\n        if (!e.which) {\n          /* IE case */\n          button = (e.button < 2) ? 0 :\n                   ((e.button == 4) ? 1 : 2);\n        } else {\n          /* All others */\n          button = e.button;\n        }\n            if ( button !== 0 ) {\n                return;\n            }\n        }\n\n        if ( !this.enabled || (this.initiated && utils.eventType[e.type] !== this.initiated) ) {\n            return;\n        }\n\n        if ( this.options.preventDefault && !utils.isBadAndroid && !utils.preventDefaultException(e.target, this.options.preventDefaultException) ) {\n            e.preventDefault();\n        }\n\n        var point = e.touches ? e.touches[0] : e,\n            pos;\n\n        this.initiated  = utils.eventType[e.type];\n        this.moved      = false;\n        this.distX      = 0;\n        this.distY      = 0;\n        this.directionX = 0;\n        this.directionY = 0;\n        this.directionLocked = 0;\n\n        this.startTime = utils.getTime();\n\n        if ( this.options.useTransition && this.isInTransition ) {\n            this._transitionTime();\n            this.isInTransition = false;\n            pos = this.getComputedPosition();\n            this._translate(Math.round(pos.x), Math.round(pos.y));\n            this._execEvent('scrollEnd');\n        } else if ( !this.options.useTransition && this.isAnimating ) {\n            this.isAnimating = false;\n            this._execEvent('scrollEnd');\n        }\n\n        this.startX    = this.x;\n        this.startY    = this.y;\n        this.absStartX = this.x;\n        this.absStartY = this.y;\n        this.pointX    = point.pageX;\n        this.pointY    = point.pageY;\n\n        this._execEvent('beforeScrollStart');\n    },\n\n    _move: function (e) {\n        if ( !this.enabled || utils.eventType[e.type] !== this.initiated ) {\n            return;\n        }\n\n        if ( this.options.preventDefault ) {    // increases performance on Android? TODO: check!\n            e.preventDefault();\n        }\n\n        var point       = e.touches ? e.touches[0] : e,\n            deltaX      = point.pageX - this.pointX,\n            deltaY      = point.pageY - this.pointY,\n            timestamp   = utils.getTime(),\n            newX, newY,\n            absDistX, absDistY;\n\n        this.pointX     = point.pageX;\n        this.pointY     = point.pageY;\n\n        this.distX      += deltaX;\n        this.distY      += deltaY;\n        absDistX        = Math.abs(this.distX);\n        absDistY        = Math.abs(this.distY);\n\n        // We need to move at least 10 pixels for the scrolling to initiate\n        if ( timestamp - this.endTime > 300 && (absDistX < 10 && absDistY < 10) ) {\n            return;\n        }\n\n        // If you are scrolling in one direction lock the other\n        if ( !this.directionLocked && !this.options.freeScroll ) {\n            if ( absDistX > absDistY + this.options.directionLockThreshold ) {\n                this.directionLocked = 'h';     // lock horizontally\n            } else if ( absDistY >= absDistX + this.options.directionLockThreshold ) {\n                this.directionLocked = 'v';     // lock vertically\n            } else {\n                this.directionLocked = 'n';     // no lock\n            }\n        }\n\n        if ( this.directionLocked == 'h' ) {\n            if ( this.options.eventPassthrough == 'vertical' ) {\n                e.preventDefault();\n            } else if ( this.options.eventPassthrough == 'horizontal' ) {\n                this.initiated = false;\n                return;\n            }\n\n            deltaY = 0;\n        } else if ( this.directionLocked == 'v' ) {\n            if ( this.options.eventPassthrough == 'horizontal' ) {\n                e.preventDefault();\n            } else if ( this.options.eventPassthrough == 'vertical' ) {\n                this.initiated = false;\n                return;\n            }\n\n            deltaX = 0;\n        }\n\n        deltaX = this.hasHorizontalScroll ? deltaX : 0;\n        deltaY = this.hasVerticalScroll ? deltaY : 0;\n\n        newX = this.x + deltaX;\n        newY = this.y + deltaY;\n\n        // Slow down if outside of the boundaries\n        if ( newX > 0 || newX < this.maxScrollX ) {\n            newX = this.options.bounce ? this.x + deltaX / 3 : newX > 0 ? 0 : this.maxScrollX;\n        }\n        if ( newY > 0 || newY < this.maxScrollY ) {\n            newY = this.options.bounce ? this.y + deltaY / 3 : newY > 0 ? 0 : this.maxScrollY;\n        }\n\n        this.directionX = deltaX > 0 ? -1 : deltaX < 0 ? 1 : 0;\n        this.directionY = deltaY > 0 ? -1 : deltaY < 0 ? 1 : 0;\n\n        if ( !this.moved ) {\n            this._execEvent('scrollStart');\n        }\n\n        this.moved = true;\n\n        this._translate(newX, newY);\n\n/* REPLACE START: _move */\n\n        if ( timestamp - this.startTime > 300 ) {\n            this.startTime = timestamp;\n            this.startX = this.x;\n            this.startY = this.y;\n        }\n\n/* REPLACE END: _move */\n\n    },\n\n    _end: function (e) {\n        if ( !this.enabled || utils.eventType[e.type] !== this.initiated ) {\n            return;\n        }\n\n        if ( this.options.preventDefault && !utils.preventDefaultException(e.target, this.options.preventDefaultException) ) {\n            e.preventDefault();\n        }\n\n        var point = e.changedTouches ? e.changedTouches[0] : e,\n            momentumX,\n            momentumY,\n            duration = utils.getTime() - this.startTime,\n            newX = Math.round(this.x),\n            newY = Math.round(this.y),\n            distanceX = Math.abs(newX - this.startX),\n            distanceY = Math.abs(newY - this.startY),\n            time = 0,\n            easing = '';\n\n        this.isInTransition = 0;\n        this.initiated = 0;\n        this.endTime = utils.getTime();\n\n        // reset if we are outside of the boundaries\n        if ( this.resetPosition(this.options.bounceTime) ) {\n            return;\n        }\n\n        this.scrollTo(newX, newY);  // ensures that the last position is rounded\n\n        // we scrolled less than 10 pixels\n        if ( !this.moved ) {\n            if ( this.options.tap ) {\n                utils.tap(e, this.options.tap);\n            }\n\n            if ( this.options.click ) {\n                utils.click(e);\n            }\n\n            this._execEvent('scrollCancel');\n            return;\n        }\n\n        if ( this._events.flick && duration < 200 && distanceX < 100 && distanceY < 100 ) {\n            this._execEvent('flick');\n            return;\n        }\n\n        // start momentum animation if needed\n        if ( this.options.momentum && duration < 300 ) {\n            momentumX = this.hasHorizontalScroll ? utils.momentum(this.x, this.startX, duration, this.maxScrollX, this.options.bounce ? this.wrapperWidth : 0, this.options.deceleration) : { destination: newX, duration: 0 };\n            momentumY = this.hasVerticalScroll ? utils.momentum(this.y, this.startY, duration, this.maxScrollY, this.options.bounce ? this.wrapperHeight : 0, this.options.deceleration) : { destination: newY, duration: 0 };\n            newX = momentumX.destination;\n            newY = momentumY.destination;\n            time = Math.max(momentumX.duration, momentumY.duration);\n            this.isInTransition = 1;\n        }\n\n\n        if ( this.options.snap ) {\n            var snap = this._nearestSnap(newX, newY);\n            this.currentPage = snap;\n            time = this.options.snapSpeed || Math.max(\n                    Math.max(\n                        Math.min(Math.abs(newX - snap.x), 1000),\n                        Math.min(Math.abs(newY - snap.y), 1000)\n                    ), 300);\n            newX = snap.x;\n            newY = snap.y;\n\n            this.directionX = 0;\n            this.directionY = 0;\n            easing = this.options.bounceEasing;\n        }\n\n// INSERT POINT: _end\n\n        if ( newX != this.x || newY != this.y ) {\n            // change easing function when scroller goes out of the boundaries\n            if ( newX > 0 || newX < this.maxScrollX || newY > 0 || newY < this.maxScrollY ) {\n                easing = utils.ease.quadratic;\n            }\n\n            this.scrollTo(newX, newY, time, easing);\n            return;\n        }\n\n        this._execEvent('scrollEnd');\n    },\n\n    _resize: function () {\n        var that = this;\n\n        clearTimeout(this.resizeTimeout);\n\n        this.resizeTimeout = setTimeout(function () {\n            that.refresh();\n        }, this.options.resizePolling);\n    },\n\n    resetPosition: function (time) {\n        var x = this.x,\n            y = this.y;\n\n        time = time || 0;\n\n        if ( !this.hasHorizontalScroll || this.x > 0 ) {\n            x = 0;\n        } else if ( this.x < this.maxScrollX ) {\n            x = this.maxScrollX;\n        }\n\n        if ( !this.hasVerticalScroll || this.y > 0 ) {\n            y = 0;\n        } else if ( this.y < this.maxScrollY ) {\n            y = this.maxScrollY;\n        }\n\n        if ( x == this.x && y == this.y ) {\n            return false;\n        }\n\n        this.scrollTo(x, y, time, this.options.bounceEasing);\n\n        return true;\n    },\n\n    disable: function () {\n        this.enabled = false;\n    },\n\n    enable: function () {\n        this.enabled = true;\n    },\n\n    refresh: function () {\n        var rf = this.wrapper.offsetHeight;     // Force reflow\n\n        this.wrapperWidth   = this.wrapper.clientWidth;\n        this.wrapperHeight  = this.wrapper.clientHeight;\n\n/* REPLACE START: refresh */\n\n        this.scrollerWidth  = this.scroller.offsetWidth;\n        this.scrollerHeight = this.scroller.offsetHeight;\n\n        this.maxScrollX     = this.wrapperWidth - this.scrollerWidth;\n        this.maxScrollY     = this.wrapperHeight - this.scrollerHeight;\n\n/* REPLACE END: refresh */\n\n        this.hasHorizontalScroll    = this.options.scrollX && this.maxScrollX < 0;\n        this.hasVerticalScroll      = this.options.scrollY && this.maxScrollY < 0;\n\n        if ( !this.hasHorizontalScroll ) {\n            this.maxScrollX = 0;\n            this.scrollerWidth = this.wrapperWidth;\n        }\n\n        if ( !this.hasVerticalScroll ) {\n            this.maxScrollY = 0;\n            this.scrollerHeight = this.wrapperHeight;\n        }\n\n        this.endTime = 0;\n        this.directionX = 0;\n        this.directionY = 0;\n\n        this.wrapperOffset = utils.offset(this.wrapper);\n\n        this._execEvent('refresh');\n\n        this.resetPosition();\n\n// INSERT POINT: _refresh\n\n    },\n\n    on: function (type, fn) {\n        if ( !this._events[type] ) {\n            this._events[type] = [];\n        }\n\n        this._events[type].push(fn);\n    },\n\n    off: function (type, fn) {\n        if ( !this._events[type] ) {\n            return;\n        }\n\n        var index = this._events[type].indexOf(fn);\n\n        if ( index > -1 ) {\n            this._events[type].splice(index, 1);\n        }\n    },\n\n    _execEvent: function (type) {\n        if ( !this._events[type] ) {\n            return;\n        }\n\n        var i = 0,\n            l = this._events[type].length;\n\n        if ( !l ) {\n            return;\n        }\n\n        for ( ; i < l; i++ ) {\n            this._events[type][i].apply(this, [].slice.call(arguments, 1));\n        }\n    },\n\n    scrollBy: function (x, y, time, easing) {\n        x = this.x + x;\n        y = this.y + y;\n        time = time || 0;\n\n        this.scrollTo(x, y, time, easing);\n    },\n\n    scrollTo: function (x, y, time, easing) {\n        easing = easing || utils.ease.circular;\n\n        this.isInTransition = this.options.useTransition && time > 0;\n        var transitionType = this.options.useTransition && easing.style;\n        if ( !time || transitionType ) {\n                if(transitionType) {\n                    this._transitionTimingFunction(easing.style);\n                    this._transitionTime(time);\n                }\n            this._translate(x, y);\n        } else {\n            this._animate(x, y, time, easing.fn);\n        }\n    },\n\n    scrollToElement: function (el, time, offsetX, offsetY, easing) {\n        el = el.nodeType ? el : this.scroller.querySelector(el);\n\n        if ( !el ) {\n            return;\n        }\n\n        var pos = utils.offset(el);\n\n        pos.left -= this.wrapperOffset.left;\n        pos.top  -= this.wrapperOffset.top;\n\n        // if offsetX/Y are true we center the element to the screen\n        if ( offsetX === true ) {\n            offsetX = Math.round(el.offsetWidth / 2 - this.wrapper.offsetWidth / 2);\n        }\n        if ( offsetY === true ) {\n            offsetY = Math.round(el.offsetHeight / 2 - this.wrapper.offsetHeight / 2);\n        }\n\n        pos.left -= offsetX || 0;\n        pos.top  -= offsetY || 0;\n\n        pos.left = pos.left > 0 ? 0 : pos.left < this.maxScrollX ? this.maxScrollX : pos.left;\n        pos.top  = pos.top  > 0 ? 0 : pos.top  < this.maxScrollY ? this.maxScrollY : pos.top;\n\n        time = time === undefined || time === null || time === 'auto' ? Math.max(Math.abs(this.x-pos.left), Math.abs(this.y-pos.top)) : time;\n\n        this.scrollTo(pos.left, pos.top, time, easing);\n    },\n\n    _transitionTime: function (time) {\n        if (!this.options.useTransition) {\n            return;\n        }\n        time = time || 0;\n        var durationProp = utils.style.transitionDuration;\n        if(!durationProp) {\n            return;\n        }\n\n        this.scrollerStyle[durationProp] = time + 'ms';\n\n        if ( !time && utils.isBadAndroid ) {\n            this.scrollerStyle[durationProp] = '0.0001ms';\n            // remove 0.0001ms\n            var self = this;\n            rAF(function() {\n                if(self.scrollerStyle[durationProp] === '0.0001ms') {\n                    self.scrollerStyle[durationProp] = '0s';\n                }\n            });\n        }\n\n\n        if ( this.indicators ) {\n            for ( var i = this.indicators.length; i--; ) {\n                this.indicators[i].transitionTime(time);\n            }\n        }\n\n\n// INSERT POINT: _transitionTime\n\n    },\n\n    _transitionTimingFunction: function (easing) {\n        this.scrollerStyle[utils.style.transitionTimingFunction] = easing;\n\n\n        if ( this.indicators ) {\n            for ( var i = this.indicators.length; i--; ) {\n                this.indicators[i].transitionTimingFunction(easing);\n            }\n        }\n\n\n// INSERT POINT: _transitionTimingFunction\n\n    },\n\n    _translate: function (x, y) {\n        if ( this.options.useTransform ) {\n\n/* REPLACE START: _translate */\n\n            this.scrollerStyle[utils.style.transform] = 'translate(' + x + 'px,' + y + 'px)' + this.translateZ;\n\n/* REPLACE END: _translate */\n\n        } else {\n            x = Math.round(x);\n            y = Math.round(y);\n            this.scrollerStyle.left = x + 'px';\n            this.scrollerStyle.top = y + 'px';\n        }\n\n        this.x = x;\n        this.y = y;\n\n\n    if ( this.indicators ) {\n        for ( var i = this.indicators.length; i--; ) {\n            this.indicators[i].updatePosition();\n        }\n    }\n\n\n// INSERT POINT: _translate\n\n    },\n\n    _initEvents: function (remove) {\n        var eventType = remove ? utils.removeEvent : utils.addEvent,\n            target = this.options.bindToWrapper ? this.wrapper : window;\n\n        eventType(window, 'orientationchange', this);\n        eventType(window, 'resize', this);\n\n        if ( this.options.click ) {\n            eventType(this.wrapper, 'click', this, true);\n        }\n\n        if ( !this.options.disableMouse ) {\n            eventType(this.wrapper, 'mousedown', this);\n            eventType(target, 'mousemove', this);\n            eventType(target, 'mousecancel', this);\n            eventType(target, 'mouseup', this);\n        }\n\n        if ( utils.hasPointer && !this.options.disablePointer ) {\n            eventType(this.wrapper, utils.prefixPointerEvent('pointerdown'), this);\n            eventType(target, utils.prefixPointerEvent('pointermove'), this);\n            eventType(target, utils.prefixPointerEvent('pointercancel'), this);\n            eventType(target, utils.prefixPointerEvent('pointerup'), this);\n        }\n\n        if ( utils.hasTouch && !this.options.disableTouch ) {\n            eventType(this.wrapper, 'touchstart', this);\n            eventType(target, 'touchmove', this);\n            eventType(target, 'touchcancel', this);\n            eventType(target, 'touchend', this);\n        }\n\n        eventType(this.scroller, 'transitionend', this);\n        eventType(this.scroller, 'webkitTransitionEnd', this);\n        eventType(this.scroller, 'oTransitionEnd', this);\n        eventType(this.scroller, 'MSTransitionEnd', this);\n    },\n\n    getComputedPosition: function () {\n        var matrix = window.getComputedStyle(this.scroller, null),\n            x, y;\n\n        if ( this.options.useTransform ) {\n            matrix = matrix[utils.style.transform].split(')')[0].split(', ');\n            x = +(matrix[12] || matrix[4]);\n            y = +(matrix[13] || matrix[5]);\n        } else {\n            x = +matrix.left.replace(/[^-\\d.]/g, '');\n            y = +matrix.top.replace(/[^-\\d.]/g, '');\n        }\n\n        return { x: x, y: y };\n    },\n    _initIndicators: function () {\n        var interactive = this.options.interactiveScrollbars,\n            customStyle = typeof this.options.scrollbars != 'string',\n            indicators = [],\n            indicator;\n\n        var that = this;\n\n        this.indicators = [];\n\n        if ( this.options.scrollbars ) {\n            // Vertical scrollbar\n            if ( this.options.scrollY ) {\n                indicator = {\n                    el: createDefaultScrollbar('v', interactive, this.options.scrollbars),\n                    interactive: interactive,\n                    defaultScrollbars: true,\n                    customStyle: customStyle,\n                    resize: this.options.resizeScrollbars,\n                    shrink: this.options.shrinkScrollbars,\n                    fade: this.options.fadeScrollbars,\n                    listenX: false\n                };\n\n                this.wrapper.appendChild(indicator.el);\n                indicators.push(indicator);\n            }\n\n            // Horizontal scrollbar\n            if ( this.options.scrollX ) {\n                indicator = {\n                    el: createDefaultScrollbar('h', interactive, this.options.scrollbars),\n                    interactive: interactive,\n                    defaultScrollbars: true,\n                    customStyle: customStyle,\n                    resize: this.options.resizeScrollbars,\n                    shrink: this.options.shrinkScrollbars,\n                    fade: this.options.fadeScrollbars,\n                    listenY: false\n                };\n\n                this.wrapper.appendChild(indicator.el);\n                indicators.push(indicator);\n            }\n        }\n\n        if ( this.options.indicators ) {\n            // TODO: check concat compatibility\n            indicators = indicators.concat(this.options.indicators);\n        }\n\n        for ( var i = indicators.length; i--; ) {\n            this.indicators.push( new Indicator(this, indicators[i]) );\n        }\n\n        // TODO: check if we can use array.map (wide compatibility and performance issues)\n        function _indicatorsMap (fn) {\n            if (that.indicators) {\n                for ( var i = that.indicators.length; i--; ) {\n                    fn.call(that.indicators[i]);\n                }\n            }\n        }\n\n        if ( this.options.fadeScrollbars ) {\n            this.on('scrollEnd', function () {\n                _indicatorsMap(function () {\n                    this.fade();\n                });\n            });\n\n            this.on('scrollCancel', function () {\n                _indicatorsMap(function () {\n                    this.fade();\n                });\n            });\n\n            this.on('scrollStart', function () {\n                _indicatorsMap(function () {\n                    this.fade(1);\n                });\n            });\n\n            this.on('beforeScrollStart', function () {\n                _indicatorsMap(function () {\n                    this.fade(1, true);\n                });\n            });\n        }\n\n\n        this.on('refresh', function () {\n            _indicatorsMap(function () {\n                this.refresh();\n            });\n        });\n\n        this.on('destroy', function () {\n            _indicatorsMap(function () {\n                this.destroy();\n            });\n\n            delete this.indicators;\n        });\n    },\n\n    _initWheel: function () {\n        utils.addEvent(this.wrapper, 'wheel', this);\n        utils.addEvent(this.wrapper, 'mousewheel', this);\n        utils.addEvent(this.wrapper, 'DOMMouseScroll', this);\n\n        this.on('destroy', function () {\n            clearTimeout(this.wheelTimeout);\n            this.wheelTimeout = null;\n            utils.removeEvent(this.wrapper, 'wheel', this);\n            utils.removeEvent(this.wrapper, 'mousewheel', this);\n            utils.removeEvent(this.wrapper, 'DOMMouseScroll', this);\n        });\n    },\n\n    _wheel: function (e) {\n        if ( !this.enabled ) {\n            return;\n        }\n\n        // in IE we can not preventDefault() or otherwise it won't scroll to the prev/next section.\n        // I commented on it here back then: https://github.com/cubiq/iscroll/issues/980\n        // isIE taken from: https://stackoverflow.com/a/49986758/1081396\n        var isIE = window.navigator.userAgent.match(/(MSIE|Trident)/);\n        if(!isIE){\n            e.preventDefault();\n        }\n\n        var wheelDeltaX, wheelDeltaY,\n            newX, newY,\n            that = this;\n\n        if ( this.wheelTimeout === undefined ) {\n            that._execEvent('scrollStart');\n        }\n\n        // Execute the scrollEnd event after 400ms the wheel stopped scrolling\n        clearTimeout(this.wheelTimeout);\n        this.wheelTimeout = setTimeout(function () {\n            if(!that.options.snap) {\n                that._execEvent('scrollEnd');\n            }\n            that.wheelTimeout = undefined;\n        }, 400);\n\n        if ( 'deltaX' in e ) {\n            if (e.deltaMode === 1) {\n                wheelDeltaX = -e.deltaX * this.options.mouseWheelSpeed;\n                wheelDeltaY = -e.deltaY * this.options.mouseWheelSpeed;\n            } else {\n                wheelDeltaX = -e.deltaX;\n                wheelDeltaY = -e.deltaY;\n            }\n        } else if ( 'wheelDeltaX' in e ) {\n            wheelDeltaX = e.wheelDeltaX / 120 * this.options.mouseWheelSpeed;\n            wheelDeltaY = e.wheelDeltaY / 120 * this.options.mouseWheelSpeed;\n        } else if ( 'wheelDelta' in e ) {\n            wheelDeltaX = wheelDeltaY = e.wheelDelta / 120 * this.options.mouseWheelSpeed;\n        } else if ( 'detail' in e ) {\n            wheelDeltaX = wheelDeltaY = -e.detail / 3 * this.options.mouseWheelSpeed;\n        } else {\n            return;\n        }\n\n        wheelDeltaX *= this.options.invertWheelDirection;\n        wheelDeltaY *= this.options.invertWheelDirection;\n\n        if ( !this.hasVerticalScroll ) {\n            wheelDeltaX = wheelDeltaY;\n            wheelDeltaY = 0;\n        }\n\n        if ( this.options.snap ) {\n            newX = this.currentPage.pageX;\n            newY = this.currentPage.pageY;\n\n            if ( wheelDeltaX > 0 ) {\n                newX--;\n            } else if ( wheelDeltaX < 0 ) {\n                newX++;\n            }\n\n            if ( wheelDeltaY > 0 ) {\n                newY--;\n            } else if ( wheelDeltaY < 0 ) {\n                newY++;\n            }\n\n            this.goToPage(newX, newY);\n\n            return;\n        }\n\n        newX = this.x + Math.round(this.hasHorizontalScroll ? wheelDeltaX : 0);\n        newY = this.y + Math.round(this.hasVerticalScroll ? wheelDeltaY : 0);\n\n        this.directionX = wheelDeltaX > 0 ? -1 : wheelDeltaX < 0 ? 1 : 0;\n        this.directionY = wheelDeltaY > 0 ? -1 : wheelDeltaY < 0 ? 1 : 0;\n\n        if ( newX > 0 ) {\n            newX = 0;\n        } else if ( newX < this.maxScrollX ) {\n            newX = this.maxScrollX;\n        }\n\n        if ( newY > 0 ) {\n            newY = 0;\n        } else if ( newY < this.maxScrollY ) {\n            newY = this.maxScrollY;\n        }\n\n        this.scrollTo(newX, newY, 0);\n\n// INSERT POINT: _wheel\n    },\n\n    _initSnap: function () {\n        this.currentPage = {};\n\n        if ( typeof this.options.snap == 'string' ) {\n            this.options.snap = this.scroller.querySelectorAll(this.options.snap);\n        }\n\n        this.on('refresh', function () {\n            var i = 0, l,\n                m = 0, n,\n                cx, cy,\n                x = 0, y,\n                stepX = this.options.snapStepX || this.wrapperWidth,\n                stepY = this.options.snapStepY || this.wrapperHeight,\n                el;\n\n            this.pages = [];\n\n            if ( !this.wrapperWidth || !this.wrapperHeight || !this.scrollerWidth || !this.scrollerHeight ) {\n                return;\n            }\n\n            if ( this.options.snap === true ) {\n                cx = Math.round( stepX / 2 );\n                cy = Math.round( stepY / 2 );\n\n                while ( x > -this.scrollerWidth ) {\n                    this.pages[i] = [];\n                    l = 0;\n                    y = 0;\n\n                    while ( y > -this.scrollerHeight ) {\n                        this.pages[i][l] = {\n                            x: Math.max(x, this.maxScrollX),\n                            y: Math.max(y, this.maxScrollY),\n                            width: stepX,\n                            height: stepY,\n                            cx: x - cx,\n                            cy: y - cy\n                        };\n\n                        y -= stepY;\n                        l++;\n                    }\n\n                    x -= stepX;\n                    i++;\n                }\n            } else {\n                el = this.options.snap;\n                l = el.length;\n                n = -1;\n\n                for ( ; i < l; i++ ) {\n                    if ( i === 0 || el[i].offsetLeft <= el[i-1].offsetLeft ) {\n                        m = 0;\n                        n++;\n                    }\n\n                    if ( !this.pages[m] ) {\n                        this.pages[m] = [];\n                    }\n\n                    x = Math.max(-el[i].offsetLeft, this.maxScrollX);\n                    y = Math.max(-el[i].offsetTop, this.maxScrollY);\n                    cx = x - Math.round(el[i].offsetWidth / 2);\n                    cy = y - Math.round(el[i].offsetHeight / 2);\n\n                    this.pages[m][n] = {\n                        x: x,\n                        y: y,\n                        width: el[i].offsetWidth,\n                        height: el[i].offsetHeight,\n                        cx: cx,\n                        cy: cy\n                    };\n\n                    if ( x > this.maxScrollX ) {\n                        m++;\n                    }\n                }\n            }\n\n            this.goToPage(this.currentPage.pageX || 0, this.currentPage.pageY || 0, 0);\n\n            // Update snap threshold if needed\n            if ( this.options.snapThreshold % 1 === 0 ) {\n                this.snapThresholdX = this.options.snapThreshold;\n                this.snapThresholdY = this.options.snapThreshold;\n            } else {\n                this.snapThresholdX = Math.round(this.pages[this.currentPage.pageX][this.currentPage.pageY].width * this.options.snapThreshold);\n                this.snapThresholdY = Math.round(this.pages[this.currentPage.pageX][this.currentPage.pageY].height * this.options.snapThreshold);\n            }\n        });\n\n        this.on('flick', function () {\n            var time = this.options.snapSpeed || Math.max(\n                    Math.max(\n                        Math.min(Math.abs(this.x - this.startX), 1000),\n                        Math.min(Math.abs(this.y - this.startY), 1000)\n                    ), 300);\n\n            this.goToPage(\n                this.currentPage.pageX + this.directionX,\n                this.currentPage.pageY + this.directionY,\n                time\n            );\n        });\n    },\n\n    _nearestSnap: function (x, y) {\n        if ( !this.pages.length ) {\n            return { x: 0, y: 0, pageX: 0, pageY: 0 };\n        }\n\n        var i = 0,\n            l = this.pages.length,\n            m = 0;\n\n        // Check if we exceeded the snap threshold\n        if ( Math.abs(x - this.absStartX) < this.snapThresholdX &&\n            Math.abs(y - this.absStartY) < this.snapThresholdY ) {\n            return this.currentPage;\n        }\n\n        if ( x > 0 ) {\n            x = 0;\n        } else if ( x < this.maxScrollX ) {\n            x = this.maxScrollX;\n        }\n\n        if ( y > 0 ) {\n            y = 0;\n        } else if ( y < this.maxScrollY ) {\n            y = this.maxScrollY;\n        }\n\n        for ( ; i < l; i++ ) {\n            if ( x >= this.pages[i][0].cx ) {\n                x = this.pages[i][0].x;\n                break;\n            }\n        }\n\n        l = this.pages[i].length;\n\n        for ( ; m < l; m++ ) {\n            if ( y >= this.pages[0][m].cy ) {\n                y = this.pages[0][m].y;\n                break;\n            }\n        }\n\n        if ( i == this.currentPage.pageX ) {\n            i += this.directionX;\n\n            if ( i < 0 ) {\n                i = 0;\n            } else if ( i >= this.pages.length ) {\n                i = this.pages.length - 1;\n            }\n\n            x = this.pages[i][0].x;\n        }\n\n        if ( m == this.currentPage.pageY ) {\n            m += this.directionY;\n\n            if ( m < 0 ) {\n                m = 0;\n            } else if ( m >= this.pages[0].length ) {\n                m = this.pages[0].length - 1;\n            }\n\n            y = this.pages[0][m].y;\n        }\n\n        return {\n            x: x,\n            y: y,\n            pageX: i,\n            pageY: m\n        };\n    },\n\n    goToPage: function (x, y, time, easing) {\n        easing = easing || this.options.bounceEasing;\n\n        if ( x >= this.pages.length ) {\n            x = this.pages.length - 1;\n        } else if ( x < 0 ) {\n            x = 0;\n        }\n\n        if ( y >= this.pages[x].length ) {\n            y = this.pages[x].length - 1;\n        } else if ( y < 0 ) {\n            y = 0;\n        }\n\n        var posX = this.pages[x][y].x,\n            posY = this.pages[x][y].y;\n\n        time = time === undefined ? this.options.snapSpeed || Math.max(\n            Math.max(\n                Math.min(Math.abs(posX - this.x), 1000),\n                Math.min(Math.abs(posY - this.y), 1000)\n            ), 300) : time;\n\n        this.currentPage = {\n            x: posX,\n            y: posY,\n            pageX: x,\n            pageY: y\n        };\n\n        this.scrollTo(posX, posY, time, easing);\n    },\n\n    next: function (time, easing) {\n        var x = this.currentPage.pageX,\n            y = this.currentPage.pageY;\n\n        x++;\n\n        if ( x >= this.pages.length && this.hasVerticalScroll ) {\n            x = 0;\n            y++;\n        }\n\n        this.goToPage(x, y, time, easing);\n    },\n\n    prev: function (time, easing) {\n        var x = this.currentPage.pageX,\n            y = this.currentPage.pageY;\n\n        x--;\n\n        if ( x < 0 && this.hasVerticalScroll ) {\n            x = 0;\n            y--;\n        }\n\n        this.goToPage(x, y, time, easing);\n    },\n\n    _initKeys: function (e) {\n        // default key bindings\n        var keys = {\n            pageUp: 33,\n            pageDown: 34,\n            end: 35,\n            home: 36,\n            left: 37,\n            up: 38,\n            right: 39,\n            down: 40\n        };\n        var i;\n\n        // if you give me characters I give you keycode\n        if ( typeof this.options.keyBindings == 'object' ) {\n            for ( i in this.options.keyBindings ) {\n                if ( typeof this.options.keyBindings[i] == 'string' ) {\n                    this.options.keyBindings[i] = this.options.keyBindings[i].toUpperCase().charCodeAt(0);\n                }\n            }\n        } else {\n            this.options.keyBindings = {};\n        }\n\n        for ( i in keys ) {\n            this.options.keyBindings[i] = this.options.keyBindings[i] || keys[i];\n        }\n\n        utils.addEvent(window, 'keydown', this);\n\n        this.on('destroy', function () {\n            utils.removeEvent(window, 'keydown', this);\n        });\n    },\n\n    _key: function (e) {\n        if ( !this.enabled ) {\n            return;\n        }\n\n        var snap = this.options.snap,   // we are using this alot, better to cache it\n            newX = snap ? this.currentPage.pageX : this.x,\n            newY = snap ? this.currentPage.pageY : this.y,\n            now = utils.getTime(),\n            prevTime = this.keyTime || 0,\n            acceleration = 0.250,\n            pos;\n\n        if ( this.options.useTransition && this.isInTransition ) {\n            pos = this.getComputedPosition();\n\n            this._translate(Math.round(pos.x), Math.round(pos.y));\n            this.isInTransition = false;\n        }\n\n        this.keyAcceleration = now - prevTime < 200 ? Math.min(this.keyAcceleration + acceleration, 50) : 0;\n\n        switch ( e.keyCode ) {\n            case this.options.keyBindings.pageUp:\n                if ( this.hasHorizontalScroll && !this.hasVerticalScroll ) {\n                    newX += snap ? 1 : this.wrapperWidth;\n                } else {\n                    newY += snap ? 1 : this.wrapperHeight;\n                }\n                break;\n            case this.options.keyBindings.pageDown:\n                if ( this.hasHorizontalScroll && !this.hasVerticalScroll ) {\n                    newX -= snap ? 1 : this.wrapperWidth;\n                } else {\n                    newY -= snap ? 1 : this.wrapperHeight;\n                }\n                break;\n            case this.options.keyBindings.end:\n                newX = snap ? this.pages.length-1 : this.maxScrollX;\n                newY = snap ? this.pages[0].length-1 : this.maxScrollY;\n                break;\n            case this.options.keyBindings.home:\n                newX = 0;\n                newY = 0;\n                break;\n            case this.options.keyBindings.left:\n                newX += snap ? -1 : 5 + this.keyAcceleration>>0;\n                break;\n            case this.options.keyBindings.up:\n                newY += snap ? 1 : 5 + this.keyAcceleration>>0;\n                break;\n            case this.options.keyBindings.right:\n                newX -= snap ? -1 : 5 + this.keyAcceleration>>0;\n                break;\n            case this.options.keyBindings.down:\n                newY -= snap ? 1 : 5 + this.keyAcceleration>>0;\n                break;\n            default:\n                return;\n        }\n\n        if ( snap ) {\n            this.goToPage(newX, newY);\n            return;\n        }\n\n        if ( newX > 0 ) {\n            newX = 0;\n            this.keyAcceleration = 0;\n        } else if ( newX < this.maxScrollX ) {\n            newX = this.maxScrollX;\n            this.keyAcceleration = 0;\n        }\n\n        if ( newY > 0 ) {\n            newY = 0;\n            this.keyAcceleration = 0;\n        } else if ( newY < this.maxScrollY ) {\n            newY = this.maxScrollY;\n            this.keyAcceleration = 0;\n        }\n\n        this.scrollTo(newX, newY, 0);\n\n        this.keyTime = now;\n    },\n\n    _animate: function (destX, destY, duration, easingFn) {\n        var that = this,\n            startX = this.x,\n            startY = this.y,\n            startTime = utils.getTime(),\n            destTime = startTime + duration;\n\n        function step () {\n            var now = utils.getTime(),\n                newX, newY,\n                easing;\n\n            if ( now >= destTime ) {\n                that.isAnimating = false;\n                that._translate(destX, destY);\n\n                if ( !that.resetPosition(that.options.bounceTime) ) {\n                    that._execEvent('scrollEnd');\n                }\n\n                return;\n            }\n\n            now = ( now - startTime ) / duration;\n            easing = easingFn(now);\n            newX = ( destX - startX ) * easing + startX;\n            newY = ( destY - startY ) * easing + startY;\n            that._translate(newX, newY);\n\n            if ( that.isAnimating ) {\n                rAF(step);\n            }\n        }\n\n        this.isAnimating = true;\n        step();\n    },\n    handleEvent: function (e) {\n        switch ( e.type ) {\n            case 'touchstart':\n            case 'pointerdown':\n            case 'MSPointerDown':\n            case 'mousedown':\n                this._start(e);\n                break;\n            case 'touchmove':\n            case 'pointermove':\n            case 'MSPointerMove':\n            case 'mousemove':\n                this._move(e);\n                break;\n            case 'touchend':\n            case 'pointerup':\n            case 'MSPointerUp':\n            case 'mouseup':\n            case 'touchcancel':\n            case 'pointercancel':\n            case 'MSPointerCancel':\n            case 'mousecancel':\n                this._end(e);\n                break;\n            case 'orientationchange':\n            case 'resize':\n                this._resize();\n                break;\n            case 'transitionend':\n            case 'webkitTransitionEnd':\n            case 'oTransitionEnd':\n            case 'MSTransitionEnd':\n                this._transitionEnd(e);\n                break;\n            case 'wheel':\n            case 'DOMMouseScroll':\n            case 'mousewheel':\n                this._wheel(e);\n                break;\n            case 'keydown':\n                this._key(e);\n                break;\n            case 'click':\n                if ( this.enabled && !e._constructed ) {\n                    e.preventDefault();\n                    e.stopPropagation();\n                }\n                break;\n        }\n    }\n};\nfunction createDefaultScrollbar (direction, interactive, type) {\n    var scrollbar = document.createElement('div'),\n        indicator = document.createElement('div');\n\n    if ( type === true ) {\n        scrollbar.style.cssText = 'position:absolute;z-index:9999';\n        indicator.style.cssText = '-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;position:absolute;background:rgba(0,0,0,0.5);border:1px solid rgba(255,255,255,0.9);border-radius:3px';\n    }\n\n    indicator.className = 'iScrollIndicator';\n\n    if ( direction == 'h' ) {\n        if ( type === true ) {\n            scrollbar.style.cssText += ';height:7px;left:2px;right:2px;bottom:0';\n            indicator.style.height = '100%';\n        }\n        scrollbar.className = 'iScrollHorizontalScrollbar';\n    } else {\n        if ( type === true ) {\n            scrollbar.style.cssText += ';width:7px;bottom:2px;top:2px;right:1px';\n            indicator.style.width = '100%';\n        }\n        scrollbar.className = 'iScrollVerticalScrollbar';\n    }\n\n    scrollbar.style.cssText += ';overflow:hidden';\n\n    if ( !interactive ) {\n        scrollbar.style.pointerEvents = 'none';\n    }\n\n    scrollbar.appendChild(indicator);\n\n    return scrollbar;\n}\n\nfunction Indicator (scroller, options) {\n    this.wrapper = typeof options.el == 'string' ? document.querySelector(options.el) : options.el;\n    this.wrapperStyle = this.wrapper.style;\n    this.indicator = this.wrapper.children[0];\n    this.indicatorStyle = this.indicator.style;\n    this.scroller = scroller;\n\n    this.options = {\n        listenX: true,\n        listenY: true,\n        interactive: false,\n        resize: true,\n        defaultScrollbars: false,\n        shrink: false,\n        fade: false,\n        speedRatioX: 0,\n        speedRatioY: 0\n    };\n\n    for ( var i in options ) {\n        this.options[i] = options[i];\n    }\n\n    this.sizeRatioX = 1;\n    this.sizeRatioY = 1;\n    this.maxPosX = 0;\n    this.maxPosY = 0;\n\n    if ( this.options.interactive ) {\n        if ( !this.options.disableTouch ) {\n            utils.addEvent(this.indicator, 'touchstart', this);\n            utils.addEvent(window, 'touchend', this);\n        }\n        if ( !this.options.disablePointer ) {\n            utils.addEvent(this.indicator, utils.prefixPointerEvent('pointerdown'), this);\n            utils.addEvent(window, utils.prefixPointerEvent('pointerup'), this);\n        }\n        if ( !this.options.disableMouse ) {\n            utils.addEvent(this.indicator, 'mousedown', this);\n            utils.addEvent(window, 'mouseup', this);\n        }\n    }\n\n    if ( this.options.fade ) {\n        this.wrapperStyle[utils.style.transform] = this.scroller.translateZ;\n        var durationProp = utils.style.transitionDuration;\n        if(!durationProp) {\n            return;\n        }\n        this.wrapperStyle[durationProp] = utils.isBadAndroid ? '0.0001ms' : '0ms';\n        // remove 0.0001ms\n        var self = this;\n        if(utils.isBadAndroid) {\n            rAF(function() {\n                if(self.wrapperStyle[durationProp] === '0.0001ms') {\n                    self.wrapperStyle[durationProp] = '0s';\n                }\n            });\n        }\n        this.wrapperStyle.opacity = '0';\n    }\n}\n\nIndicator.prototype = {\n    handleEvent: function (e) {\n        switch ( e.type ) {\n            case 'touchstart':\n            case 'pointerdown':\n            case 'MSPointerDown':\n            case 'mousedown':\n                this._start(e);\n                break;\n            case 'touchmove':\n            case 'pointermove':\n            case 'MSPointerMove':\n            case 'mousemove':\n                this._move(e);\n                break;\n            case 'touchend':\n            case 'pointerup':\n            case 'MSPointerUp':\n            case 'mouseup':\n            case 'touchcancel':\n            case 'pointercancel':\n            case 'MSPointerCancel':\n            case 'mousecancel':\n                this._end(e);\n                break;\n        }\n    },\n\n    destroy: function () {\n        if ( this.options.fadeScrollbars ) {\n            clearTimeout(this.fadeTimeout);\n            this.fadeTimeout = null;\n        }\n        if ( this.options.interactive ) {\n            utils.removeEvent(this.indicator, 'touchstart', this);\n            utils.removeEvent(this.indicator, utils.prefixPointerEvent('pointerdown'), this);\n            utils.removeEvent(this.indicator, 'mousedown', this);\n\n            utils.removeEvent(window, 'touchmove', this);\n            utils.removeEvent(window, utils.prefixPointerEvent('pointermove'), this);\n            utils.removeEvent(window, 'mousemove', this);\n\n            utils.removeEvent(window, 'touchend', this);\n            utils.removeEvent(window, utils.prefixPointerEvent('pointerup'), this);\n            utils.removeEvent(window, 'mouseup', this);\n        }\n\n        if ( this.options.defaultScrollbars ) {\n            this.wrapper.parentNode.removeChild(this.wrapper);\n        }\n    },\n\n    _start: function (e) {\n        var point = e.touches ? e.touches[0] : e;\n\n        e.preventDefault();\n        e.stopPropagation();\n\n        this.transitionTime();\n\n        this.initiated = true;\n        this.moved = false;\n        this.lastPointX = point.pageX;\n        this.lastPointY = point.pageY;\n\n        this.startTime  = utils.getTime();\n\n        if ( !this.options.disableTouch ) {\n            utils.addEvent(window, 'touchmove', this);\n        }\n        if ( !this.options.disablePointer ) {\n            utils.addEvent(window, utils.prefixPointerEvent('pointermove'), this);\n        }\n        if ( !this.options.disableMouse ) {\n            utils.addEvent(window, 'mousemove', this);\n        }\n\n        this.scroller._execEvent('beforeScrollStart');\n    },\n\n    _move: function (e) {\n        var point = e.touches ? e.touches[0] : e,\n            deltaX, deltaY,\n            newX, newY,\n            timestamp = utils.getTime();\n\n        if ( !this.moved ) {\n            this.scroller._execEvent('scrollStart');\n        }\n\n        this.moved = true;\n\n        deltaX = point.pageX - this.lastPointX;\n        this.lastPointX = point.pageX;\n\n        deltaY = point.pageY - this.lastPointY;\n        this.lastPointY = point.pageY;\n\n        newX = this.x + deltaX;\n        newY = this.y + deltaY;\n\n        this._pos(newX, newY);\n\n// INSERT POINT: indicator._move\n\n        e.preventDefault();\n        e.stopPropagation();\n    },\n\n    _end: function (e) {\n        if ( !this.initiated ) {\n            return;\n        }\n\n        this.initiated = false;\n\n        e.preventDefault();\n        e.stopPropagation();\n\n        utils.removeEvent(window, 'touchmove', this);\n        utils.removeEvent(window, utils.prefixPointerEvent('pointermove'), this);\n        utils.removeEvent(window, 'mousemove', this);\n\n        if ( this.scroller.options.snap ) {\n            var snap = this.scroller._nearestSnap(this.scroller.x, this.scroller.y);\n\n            var time = this.options.snapSpeed || Math.max(\n                    Math.max(\n                        Math.min(Math.abs(this.scroller.x - snap.x), 1000),\n                        Math.min(Math.abs(this.scroller.y - snap.y), 1000)\n                    ), 300);\n\n            if ( this.scroller.x != snap.x || this.scroller.y != snap.y ) {\n                this.scroller.directionX = 0;\n                this.scroller.directionY = 0;\n                this.scroller.currentPage = snap;\n                this.scroller.scrollTo(snap.x, snap.y, time, this.scroller.options.bounceEasing);\n            }\n        }\n\n        if ( this.moved ) {\n            this.scroller._execEvent('scrollEnd');\n        }\n    },\n\n    transitionTime: function (time) {\n        time = time || 0;\n        var durationProp = utils.style.transitionDuration;\n        if(!durationProp) {\n            return;\n        }\n\n        this.indicatorStyle[durationProp] = time + 'ms';\n\n        if ( !time && utils.isBadAndroid ) {\n            this.indicatorStyle[durationProp] = '0.0001ms';\n            // remove 0.0001ms\n            var self = this;\n            rAF(function() {\n                if(self.indicatorStyle[durationProp] === '0.0001ms') {\n                    self.indicatorStyle[durationProp] = '0s';\n                }\n            });\n        }\n    },\n\n    transitionTimingFunction: function (easing) {\n        this.indicatorStyle[utils.style.transitionTimingFunction] = easing;\n    },\n\n    refresh: function () {\n        this.transitionTime();\n\n        if ( this.options.listenX && !this.options.listenY ) {\n            this.indicatorStyle.display = this.scroller.hasHorizontalScroll ? 'block' : 'none';\n        } else if ( this.options.listenY && !this.options.listenX ) {\n            this.indicatorStyle.display = this.scroller.hasVerticalScroll ? 'block' : 'none';\n        } else {\n            this.indicatorStyle.display = this.scroller.hasHorizontalScroll || this.scroller.hasVerticalScroll ? 'block' : 'none';\n        }\n\n        if ( this.scroller.hasHorizontalScroll && this.scroller.hasVerticalScroll ) {\n            utils.addClass(this.wrapper, 'iScrollBothScrollbars');\n            utils.removeClass(this.wrapper, 'iScrollLoneScrollbar');\n\n            if ( this.options.defaultScrollbars && this.options.customStyle ) {\n                if ( this.options.listenX ) {\n                    this.wrapper.style.right = '8px';\n                } else {\n                    this.wrapper.style.bottom = '8px';\n                }\n            }\n        } else {\n            utils.removeClass(this.wrapper, 'iScrollBothScrollbars');\n            utils.addClass(this.wrapper, 'iScrollLoneScrollbar');\n\n            if ( this.options.defaultScrollbars && this.options.customStyle ) {\n                if ( this.options.listenX ) {\n                    this.wrapper.style.right = '2px';\n                } else {\n                    this.wrapper.style.bottom = '2px';\n                }\n            }\n        }\n\n        var r = this.wrapper.offsetHeight;  // force refresh\n\n        if ( this.options.listenX ) {\n            this.wrapperWidth = this.wrapper.clientWidth;\n            if ( this.options.resize ) {\n                this.indicatorWidth = Math.max(Math.round(this.wrapperWidth * this.wrapperWidth / (this.scroller.scrollerWidth || this.wrapperWidth || 1)), 8);\n                this.indicatorStyle.width = this.indicatorWidth + 'px';\n            } else {\n                this.indicatorWidth = this.indicator.clientWidth;\n            }\n\n            this.maxPosX = this.wrapperWidth - this.indicatorWidth;\n\n            if ( this.options.shrink == 'clip' ) {\n                this.minBoundaryX = -this.indicatorWidth + 8;\n                this.maxBoundaryX = this.wrapperWidth - 8;\n            } else {\n                this.minBoundaryX = 0;\n                this.maxBoundaryX = this.maxPosX;\n            }\n\n            this.sizeRatioX = this.options.speedRatioX || (this.scroller.maxScrollX && (this.maxPosX / this.scroller.maxScrollX));\n        }\n\n        if ( this.options.listenY ) {\n            this.wrapperHeight = this.wrapper.clientHeight;\n            if ( this.options.resize ) {\n                this.indicatorHeight = Math.max(Math.round(this.wrapperHeight * this.wrapperHeight / (this.scroller.scrollerHeight || this.wrapperHeight || 1)), 8);\n                this.indicatorStyle.height = this.indicatorHeight + 'px';\n            } else {\n                this.indicatorHeight = this.indicator.clientHeight;\n            }\n\n            this.maxPosY = this.wrapperHeight - this.indicatorHeight;\n\n            if ( this.options.shrink == 'clip' ) {\n                this.minBoundaryY = -this.indicatorHeight + 8;\n                this.maxBoundaryY = this.wrapperHeight - 8;\n            } else {\n                this.minBoundaryY = 0;\n                this.maxBoundaryY = this.maxPosY;\n            }\n\n            this.maxPosY = this.wrapperHeight - this.indicatorHeight;\n            this.sizeRatioY = this.options.speedRatioY || (this.scroller.maxScrollY && (this.maxPosY / this.scroller.maxScrollY));\n        }\n\n        this.updatePosition();\n    },\n\n    updatePosition: function () {\n        var x = this.options.listenX && Math.round(this.sizeRatioX * this.scroller.x) || 0,\n            y = this.options.listenY && Math.round(this.sizeRatioY * this.scroller.y) || 0;\n\n        if ( !this.options.ignoreBoundaries ) {\n            if ( x < this.minBoundaryX ) {\n                if ( this.options.shrink == 'scale' ) {\n                    this.width = Math.max(this.indicatorWidth + x, 8);\n                    this.indicatorStyle.width = this.width + 'px';\n                }\n                x = this.minBoundaryX;\n            } else if ( x > this.maxBoundaryX ) {\n                if ( this.options.shrink == 'scale' ) {\n                    this.width = Math.max(this.indicatorWidth - (x - this.maxPosX), 8);\n                    this.indicatorStyle.width = this.width + 'px';\n                    x = this.maxPosX + this.indicatorWidth - this.width;\n                } else {\n                    x = this.maxBoundaryX;\n                }\n            } else if ( this.options.shrink == 'scale' && this.width != this.indicatorWidth ) {\n                this.width = this.indicatorWidth;\n                this.indicatorStyle.width = this.width + 'px';\n            }\n\n            if ( y < this.minBoundaryY ) {\n                if ( this.options.shrink == 'scale' ) {\n                    this.height = Math.max(this.indicatorHeight + y * 3, 8);\n                    this.indicatorStyle.height = this.height + 'px';\n                }\n                y = this.minBoundaryY;\n            } else if ( y > this.maxBoundaryY ) {\n                if ( this.options.shrink == 'scale' ) {\n                    this.height = Math.max(this.indicatorHeight - (y - this.maxPosY) * 3, 8);\n                    this.indicatorStyle.height = this.height + 'px';\n                    y = this.maxPosY + this.indicatorHeight - this.height;\n                } else {\n                    y = this.maxBoundaryY;\n                }\n            } else if ( this.options.shrink == 'scale' && this.height != this.indicatorHeight ) {\n                this.height = this.indicatorHeight;\n                this.indicatorStyle.height = this.height + 'px';\n            }\n        }\n\n        this.x = x;\n        this.y = y;\n\n        if ( this.scroller.options.useTransform ) {\n            this.indicatorStyle[utils.style.transform] = 'translate(' + x + 'px,' + y + 'px)' + this.scroller.translateZ;\n        } else {\n            this.indicatorStyle.left = x + 'px';\n            this.indicatorStyle.top = y + 'px';\n        }\n    },\n\n    _pos: function (x, y) {\n        if ( x < 0 ) {\n            x = 0;\n        } else if ( x > this.maxPosX ) {\n            x = this.maxPosX;\n        }\n\n        if ( y < 0 ) {\n            y = 0;\n        } else if ( y > this.maxPosY ) {\n            y = this.maxPosY;\n        }\n\n        x = this.options.listenX ? Math.round(x / this.sizeRatioX) : this.scroller.x;\n        y = this.options.listenY ? Math.round(y / this.sizeRatioY) : this.scroller.y;\n\n        this.scroller.scrollTo(x, y);\n    },\n\n    fade: function (val, hold) {\n        if ( hold && !this.visible ) {\n            return;\n        }\n\n        clearTimeout(this.fadeTimeout);\n        this.fadeTimeout = null;\n\n        var time = val ? 250 : 500,\n            delay = val ? 0 : 300;\n\n        val = val ? '1' : '0';\n\n        this.wrapperStyle[utils.style.transitionDuration] = time + 'ms';\n\n        this.fadeTimeout = setTimeout((function (val) {\n            this.wrapperStyle.opacity = val;\n            this.visible = +val;\n        }).bind(this, val), delay);\n    }\n};\n\nIScroll.utils = utils;\n\nif ( typeof module != 'undefined' && module.exports ) {\n    module.exports = IScroll;\n} else if ( typeof define == 'function' && define.amd ) {\n    define( function () { return IScroll; } );\n\n    //making sure scrollOverflow works when using Require.js\n    //in the browser\n    if(typeof window !== 'undefined'){\n        window.IScroll = IScroll;\n    }\n} else {\n    window.IScroll = IScroll;\n}\n\n})(window, document, Math);\n\n\n/*!\n* Scrolloverflow 2.0.6 module for fullPage.js >= 3\n* https://github.com/alvarotrigo/fullPage.js\n* @license MIT licensed\n*\n* Copyright (C) 2015 alvarotrigo.com - A project by Alvaro Trigo\n*/\n(function (window, document) {\n    window.fp_scrolloverflow = (function() {\n\n        // check if IScroll is available in global scope\n        if (!window.IScroll) {\n            // otherwise create local one from module.exports\n            window.IScroll = module.exports;\n        }\n\n        // keeping central set of classnames and selectors\n        var SCROLLABLE =            'fp-scrollable';\n        var SCROLLABLE_SEL =        '.' + SCROLLABLE;\n\n        var ACTIVE =                'active';\n        var ACTIVE_SEL =            '.' + ACTIVE;\n\n        var SECTION =               'fp-section';\n        var SECTION_SEL =           '.' + SECTION;\n        var SECTION_ACTIVE_SEL =    SECTION_SEL + ACTIVE_SEL;\n\n        var SLIDE =                 'fp-slide';\n        var SLIDE_SEL =             '.' + SLIDE;\n        var SLIDE_ACTIVE_SEL =      SLIDE_SEL + ACTIVE_SEL;\n\n        var SLIDES_WRAPPER =        'fp-slides';\n        var SLIDES_WRAPPER_SEL =    '.' + SLIDES_WRAPPER;\n\n        var TABLE_CELL =            'fp-tableCell';\n        var TABLE_CELL_SEL =        '.' + TABLE_CELL;\n\n        var RESPONSIVE =            'fp-responsive';\n        var AUTO_HEIGHT_RESPONSIVE= 'fp-auto-height-responsive';\n\n        /*\n        * Turns iScroll `mousewheel` option off dynamically\n        * https://github.com/cubiq/iscroll/issues/1036\n        */\n        IScroll.prototype.wheelOn = function () {\n            this.wrapper.addEventListener('wheel', this);\n            this.wrapper.addEventListener('mousewheel', this);\n            this.wrapper.addEventListener('DOMMouseScroll', this);\n        };\n\n        /*\n        * Turns iScroll `mousewheel` option on dynamically\n        * https://github.com/cubiq/iscroll/issues/1036\n        */\n        IScroll.prototype.wheelOff = function () {\n            this.wrapper.removeEventListener('wheel', this);\n            this.wrapper.removeEventListener('mousewheel', this);\n            this.wrapper.removeEventListener('DOMMouseScroll', this);\n        };\n\n        /**\n        * Returns an integer representing the padding dimensions in px.\n        */\n        function getPaddings(element){\n            var section = fp_utils.closest(element, SECTION_SEL);\n            if(section != null){\n                return parseInt(getComputedStyle(section)['padding-bottom']) + parseInt(getComputedStyle(section)['padding-top']);\n            }\n            return 0;\n        }\n\n        function scrollBarHandler(){\n            var self = this;\n            self.options = null;\n\n            self.init = function(options, iscrollOptions){\n                self.options = options;\n                self.iscrollOptions = iscrollOptions;\n\n                if(document.readyState === 'complete'){\n                    createScrollBarForAll();\n                    fullpage_api.shared.afterRenderActions();\n                }\n                //after DOM and images are loaded\n                window.addEventListener('load', function(){\n                    createScrollBarForAll();\n                    fullpage_api.shared.afterRenderActions();\n                });\n\n                return self;\n            };\n\n            /**\n            * Creates the scrollbar for the sections and slides in the site\n            */\n            function createScrollBarForAll(){\n                if(fp_utils.hasClass(document.body, RESPONSIVE)){\n                    forEachSectionAndSlide(removeScrollBar);\n                }\n                else{\n                    forEachSectionAndSlide(createScrollBar);\n                }\n            }\n\n            /**\n            * Checks if the element needs scrollbar and if the user wants to apply it.\n            * If so it creates it.\n            *\n            * @param {Object} element   jQuery object of the section or slide\n            */\n            function createScrollBar(element){\n                //User doesn't want scrollbar here? Sayonara baby!\n                if(fp_utils.hasClass(element, 'fp-noscroll')) return;\n\n                //necessary to make `scrollHeight` work under Opera 12\n                fp_utils.css(element, {'overflow': 'hidden'});\n\n                var scrollOverflowHandler = self.options.scrollOverflowHandler;\n                var wrap = scrollOverflowHandler.wrapContent();\n                var section = fp_utils.closest(element, SECTION_SEL); //in case element is a slide\n                var scrollable = scrollOverflowHandler.scrollable(element);\n                var contentHeight;\n                var paddings = getPaddings(section);\n\n                //if there was scroll, the contentHeight will be the one in the scrollable section\n                if(scrollable != null){\n                    contentHeight = scrollOverflowHandler.scrollHeight(element);\n                }\n                else{\n                    contentHeight = element.scrollHeight;\n                    if(self.options.verticalCentered){\n                        contentHeight = $(TABLE_CELL_SEL, element)[0].scrollHeight;\n                    }\n                }\n\n                var scrollHeight = fp_utils.getWindowHeight();\n                var contentHeightWidthPaddings = contentHeight + paddings;\n                var scrollHeightWidthoutPaddings = scrollHeight - paddings;\n                \n                //needs scroll?\n                if ( contentHeightWidthPaddings > scrollHeight) {\n                    //did we already have an scrollbar ? Updating it\n                    if(scrollable != null){\n                        scrollOverflowHandler.update(element, scrollHeightWidthoutPaddings);\n                    }\n                     //creating the scrolling\n                    else{\n                        if(self.options.verticalCentered){\n                            fp_utils.wrapInner($(TABLE_CELL_SEL, element)[0], wrap.scroller);\n                            fp_utils.wrapInner($(TABLE_CELL_SEL, element)[0], wrap.scrollable);\n                        }else{\n                            fp_utils.wrapInner(element, wrap.scroller);\n                            fp_utils.wrapInner(element, wrap.scrollable);\n                        }\n                        scrollOverflowHandler.create(element, scrollHeightWidthoutPaddings, self.iscrollOptions);\n                    }\n                }\n\n                //removing the scrolling when it is not necessary anymore\n                else{\n                    scrollOverflowHandler.remove(element);\n                }\n\n                //undo\n                fp_utils.css(element, {'overflow': ''});\n            }\n\n            /**\n            * Applies a callback function to each section in the site\n            * or the slides within them\n            */\n            function forEachSectionAndSlide(callback){\n                $(SECTION_SEL).forEach(function(section){\n                    var slides = $(SLIDE_SEL, section);\n\n                    if(slides.length){\n                        slides.forEach(function(slide){\n                            callback(slide);\n                        });\n                    }else{\n                        callback(section);\n                    }\n                });\n            }\n\n            /**\n            * Removes scrollOverflow for sections using the class `fp-auto-height-responsive`\n            */\n            function removeScrollBar(element){\n                var scrollOverflowHandler = self.options.scrollOverflowHandler;\n                if(fp_utils.hasClass( fp_utils.closest(element, SECTION_SEL), AUTO_HEIGHT_RESPONSIVE)){\n                    scrollOverflowHandler.remove(element);\n                }\n            }\n\n            //public functions\n            self.createScrollBarForAll = createScrollBarForAll;\n            self.createScrollBar = createScrollBar;\n        }\n\n        /**\n         * An object to handle overflow scrolling.\n         * This uses jquery.slimScroll to accomplish overflow scrolling.\n         * It is possible to pass in an alternate scrollOverflowHandler\n         * to the fullpage.js option that implements the same functions\n         * as this handler.\n         *\n         * @type {Object}\n         */\n        var $ = null;\n        var g_fullpageOptions = null;\n        var iscrollHandler = {\n            refreshId: null,\n            iScrollInstances: [],\n            lastScrollY: null,\n            hasBeenInit: false,\n\n            // Default options for iScroll.js used when using scrollOverflow\n            iscrollOptions: {\n                scrollbars: true,\n                mouseWheel: true,\n                hideScrollbars: false,\n                fadeScrollbars: false,\n                disableMouse: true,\n                interactiveScrollbars: true\n            },\n\n            init: function(options){\n                $ = fp_utils.$;\n                g_fullpageOptions = options;\n\n                var isTouch = (('ontouchstart' in window) || (navigator.msMaxTouchPoints > 0) || (navigator.maxTouchPoints));\n\n                //fixing bug in iScroll with links: https://github.com/cubiq/iscroll/issues/783\n                iscrollHandler.iscrollOptions.click = isTouch; // see #2035\n\n                iscrollHandler.hasBeenInit = true;\n\n                //extending iScroll options with the user custom ones\n                iscrollHandler.iscrollOptions = fp_utils.deepExtend(iscrollHandler.iscrollOptions, options.scrollOverflowOptions);\n\n                return new scrollBarHandler().init(options, iscrollHandler.iscrollOptions);\n            },\n\n            // Enables or disables the mouse wheel for the active section or all slides in it\n            toggleWheel: function(value){\n                var scrollable = $(SCROLLABLE_SEL, $(SECTION_ACTIVE_SEL)[0]);\n                scrollable.forEach(function(item){\n                    var iScrollInstance = item.fp_iscrollInstance;\n                    if(iScrollInstance != null){\n                        if(value){\n                            iScrollInstance.wheelOn();\n                        }\n                        else{\n                            iScrollInstance.wheelOff();\n                        }\n                    }\n                });\n            },\n\n            // Enables or disables the whole iScroll feature based on the given parameter.\n            setIscroll: function(target, enable){\n                if(!iscrollHandler.hasBeenInit || !target){\n                    return;\n                }\n                var scrollable = fp_utils.closest(target, SCROLLABLE_SEL) || ($(SCROLLABLE_SEL, target) && $(SCROLLABLE_SEL, target)[0]);\n                var action = enable ? 'enable' : 'disable';\n                \n                if(scrollable){\n                    scrollable.fp_iscrollInstance[action]();\n                }\n            },\n\n            /**\n            * Turns off iScroll for the destination section.\n            * When scrolling very fast on some trackpads (and Apple laptops) the inertial scrolling would\n            * scroll the destination section/slide before the sections animations ends.\n            */\n            onLeave: function(){\n                iscrollHandler.toggleWheel(false);\n            },\n\n            // Turns off iScroll for the leaving section\n            beforeLeave: function(){\n                iscrollHandler.onLeave()\n            },\n\n            // Turns on iScroll on section load\n            afterLoad: function(){\n                iscrollHandler.toggleWheel(true);\n            },\n\n            /**\n             * Called when overflow scrolling is needed for a section.\n             *\n             * @param  {Object} element      jQuery object containing current section\n             * @param  {Number} scrollHeight Current window height in pixels\n             */\n            create: function(element, scrollHeight, iscrollOptions) {\n                var scrollable = $(SCROLLABLE_SEL, element);\n\n                scrollable.forEach(function(item) {\n                    fp_utils.css(item, {'height': scrollHeight + 'px'});\n\n                    var iScrollInstance = item.fp_iscrollInstance;\n                    if (iScrollInstance != null) {\n                        iscrollHandler.iScrollInstances.forEach(function(instance){\n                            instance.destroy();\n                        });\n                    }\n\n                    iScrollInstance = new IScroll(item, iscrollOptions);\n                    iscrollHandler.iScrollInstances.push(iScrollInstance);\n\n                    if(!fp_utils.hasClass(fp_utils.closest(element, SECTION_SEL), ACTIVE)){\n                        //off by default until the section gets active\n                        iScrollInstance.wheelOff();\n                    }\n\n                    item.fp_iscrollInstance = iScrollInstance;\n                });\n            },\n\n            /**\n             * Return a boolean depending on whether the scrollable element is a\n             * the end or at the start of the scrolling depending on the given type.\n             *\n             * @param  {String}  type       Either 'top' or 'bottom'\n             * @param  {Object}  scrollable jQuery object for the scrollable element\n             * @return {Boolean}\n             */\n            isScrolled: function(type, scrollable) {\n                var scroller = scrollable.fp_iscrollInstance;\n\n                //no scroller?\n                if (!scroller) {\n                    return true;\n                }\n\n                // two times reporting the same Y position ? \n                // that means we are on the top or on the bottom of the scroller\n                \n                if (type === 'top'){\n                    return scroller.y >= 0 && !fp_utils.getScrollTop(scrollable);\n                } else if (type === 'bottom') {\n\n                    // Checking the same position twice? We are at the very bottom (at least on Desktop)\n                    var isDoubleChecking = iscrollHandler.lastScrollY === scroller.y;\n                    iscrollHandler.lastScrollY = scroller.y;\n    \n                    // An offset of 1px is required for IE / Edge to work\n                    var offset = isDoubleChecking ? 1 : 0;\n                    \n                    return offset + (0 - scroller.y) + fp_utils.getScrollTop(scrollable) + scrollable.offsetHeight >= scrollable.scrollHeight;\n                }\n            },\n\n            /**\n             * Returns the scrollable element for the given section.\n             * If there are landscape slides, will only return a scrollable element\n             * if it is in the active slide.\n             *\n             * @param  {Object}  activeSection jQuery object containing current section\n             * @return {Boolean}\n             */\n            scrollable: function(activeSection){\n                // if there are landscape slides, we check if the scrolling bar is in the current one or not\n                if ($(SLIDES_WRAPPER_SEL, activeSection).length) {\n                    return $(SCROLLABLE_SEL, $(SLIDE_ACTIVE_SEL, activeSection)[0] )[0];\n                }\n                return $(SCROLLABLE_SEL, activeSection)[0];\n            },\n\n            /**\n             * Returns the scroll height of the wrapped content.\n             * If this is larger than the window height minus section padding,\n             * overflow scrolling is needed.\n             *\n             * @param  {Object} element jQuery object containing current section\n             * @return {Number}\n             */\n            scrollHeight: function(element) {\n                return $('.fp-scroller', $(SCROLLABLE_SEL, element)[0] )[0].scrollHeight;\n            },\n\n            /**\n             * Called when overflow scrolling is no longer needed for a section.\n             *\n             * @param  {Object} element      jQuery object containing current section\n             */\n            remove: function(element) {\n                if(element == null) return;\n\n                var scrollable = $(SCROLLABLE_SEL, element)[0];\n                if (scrollable != null) {\n                    var iScrollInstance = scrollable.fp_iscrollInstance;\n                    if(iScrollInstance != null){\n                        iScrollInstance.destroy();\n                    }\n\n                    scrollable.fp_iscrollInstance = null;\n\n                    //unwrapping...\n                    fp_utils.unwrap($('.fp-scroller', element)[0]);\n                    fp_utils.unwrap($(SCROLLABLE_SEL, element)[0]);\n                }\n            },\n\n            /**\n             * Called when overflow scrolling has already been setup but the\n             * window height has potentially changed.\n             *\n             * @param  {Object} element      jQuery object containing current section\n             * @param  {Number} scrollHeight Current window height in pixels\n             */\n            update: function(element, scrollHeight) {\n                //using a timeout in order to execute the refresh function only once when `update` is called multiple times in a\n                //short period of time.\n                //it also comes on handy because iScroll requires the use of timeout when using `refresh`.\n                clearTimeout(iscrollHandler.refreshId);\n                iscrollHandler.refreshId = setTimeout(function(){\n                    iscrollHandler.iScrollInstances.forEach(function(instance){\n                        instance.refresh();\n\n                        //ugly hack that we are forced to use due to the timeout delay\n                        //otherwise done on the fullpage.js reBuild function\n                        fullpage_api.silentMoveTo(fp_utils.index($(SECTION_ACTIVE_SEL)[0]) + 1);\n                    });\n                }, 150);\n\n                //updating the wrappers height\n                fp_utils.css($(SCROLLABLE_SEL, element)[0], {'height': scrollHeight + 'px'});\n\n                if(g_fullpageOptions.verticalCentered){\n                    fp_utils.css($(SCROLLABLE_SEL, element)[0].parentNode, {'height': scrollHeight + 'px'});\n                }\n            },\n\n            /**\n             * Called to get any additional elements needed to wrap the section\n             * content in order to facilitate overflow scrolling.\n             *\n             * @return {String|Object} Can be a string containing HTML,\n             *                         a DOM element, or jQuery object.\n             */\n            wrapContent: function() {\n                var scrollable = document.createElement('div');\n                scrollable.className = SCROLLABLE;\n\n                var scroller = document.createElement('div');\n                scroller.className = 'fp-scroller';\n\n                return {\n                    scrollable: scrollable,\n                    scroller: scroller\n                };\n            }\n        };\n\n        return {\n            iscrollHandler: iscrollHandler\n        };\n    })();\n})(window, document);\n"]}