{"version":3,"sources":["scrolloverflow.js"],"names":["window","document","Math","IScroll","el","options","this","wrapper","querySelector","scroller","children","scrollerStyle","style","resizeScrollbars","mouseWheelSpeed","snapThreshold","disablePointer","utils","hasPointer","disableTouch","hasTouch","disableMouse","startX","startY","scrollY","directionLockThreshold","momentum","bounce","bounceTime","bounceEasing","preventDefault","preventDefaultException","tagName","HWCompositing","useTransition","useTransform","bindToWrapper","onmousedown","i","translateZ","hasPerspective","hasTransition","hasTransform","eventPassthrough","scrollX","freeScroll","ease","circular","resizePolling","undefined","tap","test","position","shrinkScrollbars","invertWheelDirection","x","y","directionX","directionY","_events","_init","refresh","scrollTo","enable","createDefaultScrollbar","direction","interactive","type","scrollbar","createElement","indicator","cssText","className","height","width","pointerEvents","appendChild","Indicator","wrapperStyle","indicatorStyle","listenX","listenY","resize","defaultScrollbars","shrink","fade","speedRatioX","speedRatioY","sizeRatioX","sizeRatioY","maxPosX","maxPosY","addEvent","prefixPointerEvent","transform","durationProp","transitionDuration","isBadAndroid","self","rAF","opacity","requestAnimationFrame","webkitRequestAnimationFrame","mozRequestAnimationFrame","oRequestAnimationFrame","msRequestAnimationFrame","callback","setTimeout","_prefixStyle","_vendor","charAt","toUpperCase","substr","me","_elementStyle","vendors","l","length","getTime","Date","now","extend","target","obj","fn","capture","addEventListener","removeEvent","removeEventListener","pointerEvent","MSPointerEvent","current","start","time","lowerMargin","wrapperSize","deceleration","destination","duration","distance","speed","abs","round","_transform","PointerEvent","appVersion","navigator","safariVersion","match","parseFloat","transitionTimingFunction","transitionDelay","transformOrigin","hasClass","e","c","re","RegExp","addClass","newclass","split","push","join","removeClass","replace","offset","left","offsetLeft","top","offsetTop","offsetParent","exceptions","eventType","touchstart","touchmove","touchend","mousedown","mousemove","mouseup","pointerdown","pointermove","pointerup","MSPointerDown","MSPointerMove","MSPointerUp","quadratic","k","sqrt","back","b","elastic","f","pow","sin","PI","eventName","ev","createEvent","initEvent","pageX","pageY","dispatchEvent","click","MouseEvent","view","detail","screenX","screenY","clientX","clientY","ctrlKey","altKey","shiftKey","metaKey","button","relatedTarget","_constructed","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","momentumX","momentumY","changedTouches","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","_indicatorsMap","interactiveScrollbars","customStyle","fadeScrollbars","concat","wheelTimeout","_wheel","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","acceleration","keyAcceleration","keyCode","destX","destY","easingFn","step","destTime","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","$","ACTIVE","ACTIVE_SEL","SECTION","SECTION_SEL","SECTION_ACTIVE_SEL","SLIDE","SLIDE_SEL","SLIDE_ACTIVE_SEL","SLIDES_WRAPPER","SLIDES_WRAPPER_SEL","SCROLLABLE","SCROLLABLE_SEL","wheelOn","wheelOff","iscrollHandler","refreshId","iScrollInstances","toggleWheel","value","scrollable","find","each","iScrollInstance","data","onLeave","beforeLeave","afterLoad","create","element","scrollHeight","scrollOverflowOptions","$this","get","isScrolled","scrollTop","innerHeight","activeSection","first","unwrap","update","css","parent","wrapContent","jQuery","fp_scrolloverflow","scrollBarHandler","createScrollBarForAll","RESPONSIVE","removeResponsiveScrollOverflows","forEachSectionAndSlide","createScrollBar","getPaddings","section","closest","parseInt","contentHeight","scrollOverflowHandler","wrap","paddings","verticalCentered","TABLE_CELL_SEL","wrapInner","iscrollOptions","slides","AUTO_HEIGHT_RESPONSIVE","init","readyState","fullpage","shared","afterRenderActions","TABLE_CELL","hideScrollbars","isTouch","msMaxTouchPoints","silentMoveTo"],"mappings":"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","file":"scrolloverflow.min.js","sourcesContent":["/*!\n* Customized version of iScroll.js 0.0.5\n* It fixes bugs affecting its integration with fullpage.js\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        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} else {\n    window.IScroll = IScroll;\n}\n\n})(window, document, Math);\n\n/*!\n * fullPage ScrollOverflow\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, $) {\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    var SLIDES_WRAPPER =        'fp-slides';\n    var SLIDES_WRAPPER_SEL =    '.' + SLIDES_WRAPPER;\n\n    // scrolloverflow\n    var SCROLLABLE =            'fp-scrollable';\n    var SCROLLABLE_SEL =        '.' + SCROLLABLE;\n\n    if(typeof IScroll !== 'undefined'){\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    /**\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    window.iscrollHandler = {\n        refreshId: null,\n        iScrollInstances: [],\n\n        // Enables or disables the mouse wheel for the active section or all slides in it\n        toggleWheel: function(value){\n            var scrollable = $(SECTION_ACTIVE_SEL).find(SCROLLABLE_SEL);\n            scrollable.each(function(){\n                var iScrollInstance = $(this).data('iscrollInstance');\n                if(typeof iScrollInstance !== 'undefined' && iScrollInstance){\n                    if(value){\n                        iScrollInstance.wheelOn();\n                    }\n                    else{\n                        iScrollInstance.wheelOff();\n                    }\n                }\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, scrollOverflowOptions) {\n            var scrollable = element.find(SCROLLABLE_SEL);\n\n            scrollable.height(scrollHeight);\n            scrollable.each(function() {\n                var $this = $(this);\n                var iScrollInstance = $this.data('iscrollInstance');\n                if (iScrollInstance) {\n                    $.each(iscrollHandler.iScrollInstances, function(){\n                        $(this).destroy();\n                    });\n                }\n\n                iScrollInstance = new IScroll($this.get(0), scrollOverflowOptions);\n\n                iScrollInstance.on('scrollEnd', function() {\n                    this['fp_isAtTop'] = this.y > -30;\n                    this['fp_isAtEnd'] = this.y - this.maxScrollY < 30;\n                });\n\n                iscrollHandler.iScrollInstances.push(iScrollInstance);\n\n                //off by default until the section gets active\n                iScrollInstance.wheelOff();\n\n                $this.data('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.data('iscrollInstance');\n\n            //no scroller?\n            if (!scroller) {\n                return true;\n            }\n\n            if (type === 'top') {\n                return scroller.y >= 0 && !scrollable.scrollTop();\n            } else if (type === 'bottom') {\n                return (0 - scroller.y) + scrollable.scrollTop() + 1 + scrollable.innerHeight() >= scrollable[0].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 (activeSection.find(SLIDES_WRAPPER_SEL).length) {\n                return activeSection.find(SLIDE_ACTIVE_SEL).find(SCROLLABLE_SEL);\n            }\n            return activeSection.find(SCROLLABLE_SEL);\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 element.find(SCROLLABLE_SEL).children().first().get(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            var scrollable = element.find(SCROLLABLE_SEL);\n            if (scrollable.length) {\n                var iScrollInstance = scrollable.data('iscrollInstance');\n                if(iScrollInstance){\n                    iScrollInstance.destroy();\n                }\n\n                scrollable.data('iscrollInstance', null);\n            }\n            element.find(SCROLLABLE_SEL).children().first().children().first().unwrap().unwrap();\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                $.each(iscrollHandler.iScrollInstances, function(){\n                    $(this).get(0).refresh();\n                });\n            }, 150);\n\n            //updating the wrappers height\n            element.find(SCROLLABLE_SEL).css('height', scrollHeight + 'px').parent().css('height', scrollHeight + 'px');\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            return '<div class=\"' + SCROLLABLE + '\"><div class=\"fp-scroller\"></div></div>';\n        }\n    };\n})(window, jQuery);\n\n\n// scrolloverflow module\n(function (window, document, $) {\n    $.fn.fp_scrolloverflow = (function() {\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        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                    $.fn.fullpage.shared.afterRenderActions();\n                }\n                //after DOM and images are loaded\n                $(window).on('load', function(){\n                    createScrollBarForAll();\n                    $.fn.fullpage.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($('body').hasClass(RESPONSIVE)){\n                    removeResponsiveScrollOverflows();\n                }\n                else{\n                    forEachSectionAndSlide(createScrollBar);\n                }\n            }\n\n            /**\n            * Returns an integer representing the padding dimensions in px.\n            */\n            function getPaddings(element){\n                var section = element.closest(SECTION_SEL);\n                if(section.length){\n                    return parseInt(section.css('padding-bottom')) + parseInt(section.css('padding-top'));\n                }\n                return 0;\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(element.hasClass('fp-noscroll')) return;\n\n                //necessary to make `scrollHeight` work under Opera 12\n                element.css('overflow', 'hidden');\n\n                var scrollOverflowHandler = self.options.scrollOverflowHandler;\n                var wrap = scrollOverflowHandler.wrapContent();\n                var section = element.closest(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.length){\n                    contentHeight = scrollOverflowHandler.scrollHeight(element);\n                }\n                else{\n                    contentHeight = element.get(0).scrollHeight - paddings;\n                    if(self.options.verticalCentered){\n                        contentHeight = element.find(TABLE_CELL_SEL).get(0).scrollHeight - paddings;\n                    }\n                }\n\n                var scrollHeight = $(window).height() - paddings;\n\n                //needs scroll?\n                if ( contentHeight > scrollHeight) {\n                    //did we already have an scrollbar ? Updating it\n                    if(scrollable.length){\n                        scrollOverflowHandler.update(element, scrollHeight);\n                    }\n                    //creating the scrolling\n                    else{\n                        if(self.options.verticalCentered){\n                            element.find(TABLE_CELL_SEL).wrapInner(wrap);\n                        }else{\n                            element.wrapInner(wrap);\n                        }\n                        scrollOverflowHandler.create(element, scrollHeight, self.iscrollOptions);\n                    }\n                }\n                //removing the scrolling when it is not necessary anymore\n                else{\n                    scrollOverflowHandler.remove(element);\n                }\n\n                //undo\n                element.css('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).each(function(){\n                    var slides = $(this).find(SLIDE_SEL);\n\n                    if(slides.length){\n                        slides.each(function(){\n                            callback($(this));\n                        });\n                    }else{\n                        callback($(this));\n                    }\n                });\n            }\n\n            /**\n            * Removes scrollOverflow for sections using the class `fp-auto-height-responsive`\n            */\n            function removeResponsiveScrollOverflows(){\n                var scrollOverflowHandler = self.options.scrollOverflowHandler;\n                forEachSectionAndSlide(function(element){\n                    if(element.closest(SECTION_SEL).hasClass(AUTO_HEIGHT_RESPONSIVE)){\n                        scrollOverflowHandler.remove(element);\n                    }\n                });\n            }\n\n            //public functions\n            self.createScrollBarForAll = createScrollBarForAll;\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 iscrollHandler = {\n            refreshId: null,\n            iScrollInstances: [],\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                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                //extending iScroll options with the user custom ones\n                iscrollHandler.iscrollOptions = $.extend(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 = $(SECTION_ACTIVE_SEL).find(SCROLLABLE_SEL);\n                scrollable.each(function(){\n                    var iScrollInstance = $(this).data('iscrollInstance');\n                    if(typeof iScrollInstance !== 'undefined' && iScrollInstance){\n                        if(value){\n                            iScrollInstance.wheelOn();\n                        }\n                        else{\n                            iScrollInstance.wheelOff();\n                        }\n                    }\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 = element.find(SCROLLABLE_SEL);\n\n                scrollable.height(scrollHeight);\n                scrollable.each(function() {\n                    var $this = $(this);\n                    var iScrollInstance = $this.data('iscrollInstance');\n                    if (iScrollInstance) {\n                        $.each(iscrollHandler.iScrollInstances, function(){\n                            $(this).destroy();\n                        });\n                    }\n\n                    iScrollInstance = new IScroll($this.get(0), iscrollOptions);\n                    iscrollHandler.iScrollInstances.push(iScrollInstance);\n\n                    //off by default until the section gets active\n                    iScrollInstance.wheelOff();\n\n                    $this.data('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.data('iscrollInstance');\n\n                //no scroller?\n                if (!scroller) {\n                    return true;\n                }\n\n                if (type === 'top') {\n                    return scroller.y >= 0 && !scrollable.scrollTop();\n                } else if (type === 'bottom') {\n                    return (0 - scroller.y) + scrollable.scrollTop() + 1 + scrollable.innerHeight() >= scrollable[0].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 (activeSection.find(SLIDES_WRAPPER_SEL).length) {\n                    return activeSection.find(SLIDE_ACTIVE_SEL).find(SCROLLABLE_SEL);\n                }\n                return activeSection.find(SCROLLABLE_SEL);\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 element.find(SCROLLABLE_SEL).children().first().get(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                var scrollable = element.find(SCROLLABLE_SEL);\n                if (scrollable.length) {\n                    var iScrollInstance = scrollable.data('iscrollInstance');\n                    iScrollInstance.destroy();\n\n                    scrollable.data('iscrollInstance', null);\n                }\n                element.find(SCROLLABLE_SEL).children().first().children().first().unwrap().unwrap();\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                    $.each(iscrollHandler.iScrollInstances, function(){\n                        $(this).get(0).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                        $.fn.fullpage.silentMoveTo($(SECTION_ACTIVE_SEL).index() + 1);\n                    });\n                }, 150);\n\n                //updating the wrappers height\n                element.find(SCROLLABLE_SEL)\n                    .css('height', scrollHeight + 'px')\n                    .parent().css('height', scrollHeight + getPaddings(element) + 'px');\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                return '<div class=\"' + SCROLLABLE + '\"><div class=\"fp-scroller\"></div></div>';\n            }\n        };\n\n        return {\n            iscrollHandler: iscrollHandler\n        };\n    })();\n})(window, document, jQuery);"]}