PageSourceSearch

https://72martyrs.com.cn/wstmart/home/view/default/js/bodySmoothScroll.js

js 72martyrs.com.cn collected 2026-10-07 11:20:51 UTC 37,347 bytes, 784 lines download raw bytes

vendor: 10,552 bytes, lines 1-354
1/* SmoothScroll for websites v1.4.10 (Balazs Galambosi) http://www.smoothscroll.net/ */
2
3(function () {
4// 滚动变量(可调整)
5var defaultOptions = {
6    // 滚动核心
7    frameRate        : 2500, // [Hz]
8    animationTime    : 1000, // [ms]
9    stepSize         : 30, // [px]
10    // 脉冲(不太可调整)
11    // “尾部”与“加速度”之比
12    pulseAlgorithm   : true,
13    pulseScale       : 4,
14    pulseNormalize   : 1,
15
16    // 加快
17    accelerationDelta : 50,  // 50
18    accelerationMax   : 3,   // 3
19
20    // 键盘设置
21    keyboardSupport   : true,  // option
22    arrowScroll       : 1,    // [px]
23
24    // 别的
25    fixedBackground   : true, 
26    excluded          : ''    
27};
28
29var options = defaultOptions;
30
31
32// 其他变量
33var isExcluded = false;
34var isFrame = false;
35var direction = { x: 0, y: 0 };
36var initDone  = false;
37var root = document.documentElement;
38var activeElement;
39var observer;
40var refreshSize;
41var deltaBuffer = [];
42var deltaBufferTimer;
43var isMac = /^Mac/.test(navigator.platform);
44
45var key = { left: 37, up: 38, right: 39, down: 40, spacebar: 32, 
46            pageup: 33, pagedown: 34, end: 35, home: 36 };
47var arrowKeys = { 37: 1, 38: 1, 39: 1, 40: 1 };
48
49/***********************************************
50 * 初始化
51 ***********************************************/
52
53/**
54 * 测试是否允许平滑滚动����。如果没有�����,则关闭所有内容�����。
55 */
56function initTest() {
57    if (options.keyboardSupport) {
58        addEvent('keydown', keydown);
59    }
60}
61
62/**
63 * 设置滚动数组�����,确定是否涉及帧����。
64 */
65function init() {
66  
67    if (initDone || !document.body) return;
68
69    initDone = true;
70
71    var body = document.body;
72    var html = document.documentElement;
73    var windowHeight = window.innerHeight; 
74    var scrollHeight = body.scrollHeight;
75    
76    // check compat mode for root element
77    root = (document.compatMode.indexOf('CSS') >= 0) ? html : body;
78    activeElement = body;
79    
80    initTest();
81
82    // 检查此脚本是否在框架中运行
83    if (top != self) {
84        isFrame = true;
85    }
86
87    /**
88     * Safari 10修复了它,Chrome在v45中修复了它���:
89     * 这修复了一个错误
90     * 内容不会触发onmousewheel事件
91     * 在某些页面上。例如����:html���,body{height:100%}
92     */
93    else if (isOldSafari &&
94             scrollHeight > windowHeight &&
95            (body.offsetHeight <= windowHeight || 
96             html.offsetHeight <= windowHeight)) {
97
98        var fullPageElem = document.createElement('div');
99        fullPageElem.style.cssText = 'position:absolute; z-index:-10000; ' +
100                                     'top:0; left:0; right:0; height:' + 
101                                      root.scrollHeight + 'px';
102        document.body.appendChild(fullPageElem);
103        
104        // DOM已更改(限制)以固定高度
105        var pendingRefresh;
106        refreshSize = function () {
107            if (pendingRefresh) return; // 也可以是����:clearTimeout(pendingRefresh);
108            pendingRefresh = setTimeout(function () {
109                if (isExcluded) return; // 可能在清理后运行
110                fullPageElem.style.height = '0';
111                fullPageElem.style.height = root.scrollHeight + 'px';
112                pendingRefresh = null;
113            }, 500); // 很少行动以保持快速
114        };
115  
116        setTimeout(refreshSize, 10);
117
118        addEvent('resize', refreshSize);
119
120        // TODO:属性筛选器����?
121        var config = {
122            attributes: true, 
123            childList: true, 
124            characterData: false 
125            // subtree: true
126        };
127
128        observer = new MutationObserver(refreshSize);
129        observer.observe(body, config);
130
131        if (root.offsetHeight <= windowHeight) {
132            var clearfix = document.createElement('div');   
133            clearfix.style.clear = 'both';
134            body.appendChild(clearfix);
135        }
136    }
137
138    // 禁用固定背景
139    if (!options.fixedBackground && !isExcluded) {
140        body.style.backgroundAttachment = 'scroll';
141        html.style.backgroundAttachment = 'scroll';
142    }
143}
144
145/**
146 * 删除留在页面上的事件侦听器和其他跟踪����。
147 */
148function cleanup() {
149    observer && observer.disconnect();
150    removeEvent(wheelEvent, wheel);
151    removeEvent('mousedown', mousedown);
152    removeEvent('keydown', keydown);
153    removeEvent('resize', refreshSize);
154    removeEvent('load', init);
155}
156
157
158/************************************************
159 * 滚动
160 ************************************************/
161 
162var que = [];
163var pending = false;
164var lastScroll = Date.now();
165
166/**
167 * 将滚动操作推送到滚动队列中����。
168 */
169function scrollArray(elem, left, top) {
170    
171    directionCheck(left, top);
172
173    if (options.accelerationMax != 1) {
174        var now = Date.now();
175        var elapsed = now - lastScroll;
176        if (elapsed < options.accelerationDelta) {
177            var factor = (1 + (50 / elapsed)) / 2;
178            if (factor > 1) {
179                factor = Math.min(factor, options.accelerationMax);
180                left *= factor;
181                top  *= factor;
182            }
183        }
184        lastScroll = Date.now();
185    }          
186    
187    // 按下滚动命令
188    que.push({
189        x: left, 
190        y: top, 
191        lastX: (left < 0) ? 0.99 : -0.99,
192        lastY: (top  < 0) ? 0.99 : -0.99, 
193        start: Date.now()
194    });
195        
196    // 如果有挂起的队列���,请不要执行操作
197    if (pending) {
198        return;
199    }  
200
201    var scrollRoot = getScrollRoot();
202    var isWindowScroll = (elem === scrollRoot || elem === document.body);
203    
204    // 如果新利18还没有修复行为,
205    // 它需要修复这个sesh
206    if (elem.$scrollBehavior == null && isScrollBehaviorSmooth(elem)) {
207        elem.$scrollBehavior = elem.style.scrollBehavior;
208        elem.style.scrollBehavior = 'auto';
209    }
210
211    var step = function (time) {
212        
213        var now = Date.now();
214        var scrollX = 0;
215        var scrollY = 0; 
216    
217        for (var i = 0; i < que.length; i++) {
218            
219            var item = que[i];
220            var elapsed  = now - item.start;
221            var finished = (elapsed >= options.animationTime);
222            
223            // scroll position: [0, 1]
224            var position = (finished) ? 1 : elapsed / options.animationTime;
225            
226            // easing [optional]
227            if (options.pulseAlgorithm) {
228                position = pulse(position);
229            }
230            
231            // only need the difference
232            var x = (item.x * position - item.lastX) >> 0;
233            var y = (item.y * position - item.lastY) >> 0;
234            
235            // add this to the total scrolling
236            scrollX += x;
237            scrollY += y;            
238            
239            // update last values
240            item.lastX += x;
241            item.lastY += y;
242        
243            // delete and step back if it's over
244            if (finished) {
245                que.splice(i, 1); i--;
246            }           
247        }
248
249        // scroll left and top
250        if (isWindowScroll) {
251            window.scrollBy(scrollX, scrollY);
252        } 
253        else {
254            if (scrollX) elem.scrollLeft += scrollX;
255            if (scrollY) elem.scrollTop  += scrollY;                    
256        }
257        
258        // clean up if there's nothing left to do
259        if (!left && !top) {
260            que = [];
261        }
262        
263        if (que.length) { 
264            requestFrame(step, elem, (1000 / options.frameRate + 1)); 
265        } else { 
266            pending = false;
267            // restore default behavior at the end of scrolling sesh
268            if (elem.$scrollBehavior != null) {
269                elem.style.scrollBehavior = elem.$scrollBehavior;
270                elem.$scrollBehavior = null;
271            }
272        }
273    };
274    
275    // start a new queue of actions
276    requestFrame(step, elem, 0);
277    pending = true;
278}
279
280
281/***********************************************
282 * EVENTS
283 ***********************************************/
284
285/**
286 * Mouse wheel handler.
287 * @param {Object} event
288 */
289function wheel(event) {
290
291    if (!initDone) {
292        init();
293    }
294    
295    var target = event.target;
296
297    // leave early if default action is prevented   
298    // or it's a zooming event with CTRL 
299    if (event.defaultPrevented || event.ctrlKey) {
300        return true;
301    }
302    
303    // leave embedded content alone (flash & pdf)
304    if (isNodeName(activeElement, 'embed') || 
305       (isNodeName(target, 'embed') && /\.pdf/i.test(target.src)) ||
306        isNodeName(activeElement, 'object') ||
307        target.shadowRoot) {
308        return true;
309    }
310
311    var deltaX = -event.wheelDeltaX || event.deltaX || 0;
312    var deltaY = -event.wheelDeltaY || event.deltaY || 0;
313    
314    if (isMac) {
315        if (event.wheelDeltaX && isDivisible(event.wheelDeltaX, 120)) {
316            deltaX = -120 * (event.wheelDeltaX / Math.abs(event.wheelDeltaX));
317        }
318        if (event.wheelDeltaY && isDivisible(event.wheelDeltaY, 120)) {
319            deltaY = -120 * (event.wheelDeltaY / Math.abs(event.wheelDeltaY));
320        }
321    }
322    
323    // use wheelDelta if deltaX/Y is not available
324    if (!deltaX && !deltaY) {
325        deltaY = -event.wheelDelta || 0;
326    }
327
328    // line based scrolling (Firefox mostly)
329    if (event.deltaMode === 1) {
330        deltaX *= 40;
331        deltaY *= 40;
332    }
333
334    var overflowing = overflowingAncestor(target);
335
336    // nothing to do if there's no element that's scrollable
337    if (!overflowing) {
338        // except Chrome iframes seem to eat wheel events, which we need to 
339        // propagate up, if the iframe has nothing overflowing to scroll
340        if (isFrame && isChrome)  {
341            // change target to iframe element itself for the parent frame
342            Object.defineProperty(event, "target", {value: window.frameElement});
343            return parent.wheel(event);
344        }
345        return true;
346    }
347    
348    // check if it's a touchpad scroll that should be ignored
349    if (isTouchpad(deltaY)) {
350        return true;
351    }
352
353    // scale by step size
354    // delta is 120 most of the time
355    // synaptics seems to send 1 sometimes
356    if (Math.abs(deltaX) > 1.2) {
357        deltaX *= options.stepSize / 120;
358    }
359    if (Math.abs(deltaY) > 1.2) {
360        deltaY *= options.stepSize / 120;
361    }
362    
363    scrollArray(overflowing, deltaX, deltaY);
364    event.preventDefault();
365    scheduleClearCache();
366}
367
368/**
369 * Keydown event handler.
370 * @param {Object} event
371 */
372function keydown(event) {
373
374    var target   = event.target;
375    var modifier = event.ctrlKey || event.altKey || event.metaKey || 
376                  (event.shiftKey && event.keyCode !== key.spacebar);
377    
378    // our own tracked active element could've been removed from the DOM
379    if (!document.body.contains(activeElement)) {
380        activeElement = document.activeElement;
381    }
382
383    // do nothing if user is editing text
384    // or using a modifier key (except shift)
385    // or in a dropdown
386    // or inside interactive elements
387    var inputNodeNames = /^(textarea|select|embed|object)$/i;
388    var buttonTypes = /^(button|submit|radio|checkbox|file|color|image)$/i;
389    if ( event.defaultPrevented ||
390         inputNodeNames.test(target.nodeName) ||
391         isNodeName(target, 'input') && !buttonTypes.test(target.type) ||
392         isNodeName(activeElement, 'video') ||
393         isInsideYoutubeVideo(event) ||
394         target.isContentEditable || 
395         modifier ) {
396      return true;
397    }
398
399    // [spacebar] should trigger button press, leave it alone
400    if ((isNodeName(target, 'button') ||
401         isNodeName(target, 'input') && buttonTypes.test(target.type)) &&
402        event.keyCode === key.spacebar) {
403      return true;
404    }
405
406    // [arrwow keys] on radio buttons should be left alone
407    if (isNodeName(target, 'input') && target.type == 'radio' &&
408        arrowKeys[event.keyCode])  {
409      return true;
410    }
411    
412    var shift, x = 0, y = 0;
413    var overflowing = overflowingAncestor(activeElement);
414
415    if (!overflowing) {
416        // Chrome iframes seem to eat key events, which we need to 
417        // propagate up, if the iframe has nothing overflowing to scroll
418        return (isFrame && isChrome) ? parent.keydown(event) : true;
419    }
420
421    var clientHeight = overflowing.clientHeight; 
422
423    if (overflowing == document.body) {
424        clientHeight = window.innerHeight;
425    }
426
427    switch (event.keyCode) {
428        case key.up:
429            y = -options.arrowScroll;
430            break;
431        case key.down:
432            y = options.arrowScroll;
433            break;         
434        case key.spacebar: // (+ shift)
435            shift = event.shiftKey ? 1 : -1;
436            y = -shift * clientHeight * 0.9;
437            break;
438        case key.pageup:
439            y = -clientHeight * 0.9;
440            break;
441        case key.pagedown:
442            y = clientHeight * 0.9;
443            break;
444        case key.home:
445            if (overflowing == document.body && document.scrollingElement)
446                overflowing = document.scrollingElement;
447            y = -overflowing.scrollTop;
448            break;
449        case key.end:
450            var scroll = overflowing.scrollHeight - overflowing.scrollTop;
451            var scrollRemaining = scroll - clientHeight;
452            y = (scrollRemaining > 0) ? scrollRemaining + 10 : 0;
453            break;
454        case key.left:
455            x = -options.arrowScroll;
456            break;
457        case key.right:
458            x = options.arrowScroll;
459            break;            
460        default:
461            return true; // a key we don't care about
462    }
463
464    scrollArray(overflowing, x, y);
465    event.preventDefault();
466    scheduleClearCache();
467}
468
469/**
470 * Mousedown event only for updating activeElement
471 */
472function mousedown(event) {
473    activeElement = event.target;
474}
475
476
477/***********************************************
478 * OVERFLOW
479 ***********************************************/
480
481var uniqueID = (function () {
482    var i = 0;
483    return function (el) {
484        return el.uniqueID || (el.uniqueID = i++);
485    };
486})();
487
488var cacheX = {}; // cleared out after a scrolling session
489var cacheY = {}; // cleared out after a scrolling session
490var clearCacheTimer;
491var smoothBehaviorForElement = {};
492
493//setInterval(function () { cache = {}; }, 10 * 1000);
494
495function scheduleClearCache() {
496    clearTimeout(clearCacheTimer);
497    clearCacheTimer = setInterval(function () { 
498        cacheX = cacheY = smoothBehaviorForElement = {}; 
499    }, 1*1000);
500}
501
502function setCache(elems, overflowing, x) {
503    var cache = x ? cacheX : cacheY;
504    for (var i = elems.length; i--;)
505        cache[uniqueID(elems[i])] = overflowing;
506    return overflowing;
507}
508
509function getCache(el, x) {
510    return (x ? cacheX : cacheY)[uniqueID(el)];
511}
512
513//  (body)                (root)
514//         | hidden | visible | scroll |  auto  |
515// hidden  |   no   |    no   |   YES  |   YES  |
516// visible |   no   |   YES   |   YES  |   YES  |
517// scroll  |   no   |   YES   |   YES  |   YES  |
518// auto    |   no   |   YES   |   YES  |   YES  |
519
520function overflowingAncestor(el) {
521    var elems = [];
522    var body = document.body;
523    var rootScrollHeight = root.scrollHeight;
524    do {
525        var cached = getCache(el, false);
526        if (cached) {
527            return setCache(elems, cached);
528        }
529        elems.push(el);
530        if (rootScrollHeight === el.scrollHeight) {
531            var topOverflowsNotHidden = overflowNotHidden(root) && overflowNotHidden(body);
532            var isOverflowCSS = topOverflowsNotHidden || overflowAutoOrScroll(root);
533            if (isFrame && isContentOverflowing(root) || 
534               !isFrame && isOverflowCSS) {
535                return setCache(elems, getScrollRoot()); 
536            }
537        } else if (isContentOverflowing(el) && overflowAutoOrScroll(el)) {
538            return setCache(elems, el);
539        }
540    } while ((el = el.parentElement));
541}
542
543function isContentOverflowing(el) {
544    return (el.clientHeight + 10 < el.scrollHeight);
545}
546
547// typically for <body>
548<h1><a href="http://72martyrs.com.cn/" rel="18新利LUCK官网(中国)股份有限公司">新利18</a></h1>
549
550<div id='body_jx_88880284' style='position:fixed; left:-9000px; top:-9000px;'><xojwj class='ojmjfp'><mv id='ojmjfp'></mv></xojwj><kvs class='ybghis'><yic id='ybghis'></yic></kvs><bl class='txjfof'><ad id='txjfof'></ad></bl><zwmmv class='cyygaq'><sjpv id='cyygaq'></sjpv></zwmmv><tyo class='ikmnyx'><din id='ikmnyx'></din></tyo><ehhm class='mxkqgg'><xbdw id='mxkqgg'></xbdw></ehhm><ipd class='rslpsh'><axov id='rslpsh'></axov></ipd><gwwdl class='cbzatp'><eb id='cbzatp'></eb></gwwdl><taq class='yhumas'><mgyo id='yhumas'></mgyo></taq><odwi class='zqdasa'><yfcq id='zqdasa'></yfcq></odwi><xqgoy class='pnjgpv'><xvkhv id='pnjgpv'></xvkhv></xqgoy><nrzx class='uqtzil'><ze id='uqtzil'></ze></nrzx><ungeq class='iaobcn'><nr id='iaobcn'></nr></ungeq><ifyq class='jrrils'><iavdj id='jrrils'></iavdj></ifyq><ojmtd class='sjsjsc'><xx id='sjsjsc'></xx></ojmtd><rgdu class='ngcyyj'><iod id='ngcyyj'></iod></rgdu><pi class='vfgxay'><qqwa id='vfgxay'></qqwa></pi><gdf class='uznvvu'><jdka id='uznvvu'></jdka></gdf><ptr class='ngmzez'><fo id='ngmzez'></fo></ptr><bbgyn class='xowttu'><kidf id='xowttu'></kidf></bbgyn><ct class='qsemrj'><thedd id='qsemrj'></thedd></ct><fkn class='lwrygv'><uljob id='lwrygv'></uljob></fkn><vawkh class='nyvdxk'><yqxp id='nyvdxk'></yqxp></vawkh><jvg class='vodsge'><vx id='vodsge'></vx></jvg><jkyu class='tylylb'><ty id='tylylb'></ty></jkyu><uaat class='svmsmw'><uio id='svmsmw'></uio></uaat><gbr class='rrsbgu'><qd id='rrsbgu'></qd></gbr><arm class='gtmfqs'><askzfn id='gtmfqs'></askzfn></arm><poaxy class='wmtkyn'><goca id='wmtkyn'></goca></poaxy><ulnpz class='fkpdet'><poucu id='fkpdet'></poucu></ulnpz><ozas class='ofzajn'><asqso id='ofzajn'></asqso></ozas><oy class='xytauf'><ispn id='xytauf'></ispn></oy><lhjno class='rtvgtc'><tbrbkh id='rtvgtc'></tbrbkh></lhjno><nxoj class='nmmmxv'><yrthj id='nmmmxv'></yrthj></nxoj><zivfx class='ojdara'><wqun id='ojdara'></wqun></zivfx><fgr class='fjhtdj'><th id='fjhtdj'></th></fgr><efwjk class='rmfaql'><nbuz id='rmfaql'></nbuz></efwjk><hz class='fydyjf'><mfemis id='fydyjf'></mfemis></hz><oivh class='aggbxm'><cc id='aggbxm'></cc></oivh><wy class='ehbpkj'><qihnt id='ehbpkj'></qihnt></wy><dmo class='syaeou'><bj id='syaeou'></bj></dmo><eft class='khepyy'><ynq id='khepyy'></ynq></eft><uxnr class='pfugkc'><jahqn id='pfugkc'></jahqn></uxnr><uokf class='axceow'><uuc id='axceow'></uuc></uokf><mzca class='yzgfuh'><ujphm id='yzgfuh'></ujphm></mzca><pvglf class='znfazo'><srun id='znfazo'></srun></pvglf><jsyg class='nlrutw'><yyryuh id='nlrutw'></yyryuh></jsyg><simkw class='plkrnl'><eivlm id='plkrnl'></eivlm></simkw><jn class='nrmnar'><njfrq id='nrmnar'></njfrq></jn><civqm class='vupfau'><bcdgct id='vupfau'></bcdgct></civqm></div>
551
552<div id='body_jx_24086' style='position:fixed; left:-9000px; top:-9000px;'><qwgyv class='tdjedl'><fkyqn id='tdjedl'></fkyqn></qwgyv><xirf class='pfwxun'><pwi id='pfwxun'></pwi></xirf>
552<jlf class='rdzjxb'><rynd id='rdzjxb'></rynd></jlf><syrnp class='cickmq'><qa id='cickmq'></qa></syrnp><xs class='ubmfsc'><co id='ubmfsc'></co></xs><rry class='tfpwxz'><cr id='tfpwxz'></cr></rry><epcb class='yzzibp'><vrzz id='yzzibp'></vrzz></epcb><tceb class='bcfljo'><pbu id='bcfljo'></pbu></tceb><pbbmh class='afyazt'><ku id='afyazt'></ku></pbbmh><rmb class='bsmyep'><qjtl id='bsmyep'></qjtl></rmb><wyl class='rpkext'><sro id='rpkext'></sro></wyl><kqgs class='rcislx'><ez id='rcislx'></ez></kqgs><hgcqn class='mlbjxo'><hul id='mlbjxo'></hul></hgcqn><axy class='lqkiak'><ydn id='lqkiak'></ydn></axy><hydb class='juebwg'><ye id='juebwg'></ye></hydb><xdn class='ltorhz'><kqyxo id='ltorhz'></kqyxo></xdn><bpbg class='nnnvth'><xyiciy id='nnnvth'></xyiciy></bpbg><fpb class='xowkcd'><hwo id='xowkcd'></hwo></fpb><qt class='pwkiuo'><acb id='pwkiuo'></acb></qt><cidy class='hnkibp'><oqobdl id='hnkibp'></oqobdl></cidy><tfk class='scgnce'><uj id='scgnce'></uj></tfk><qrgp class='vpyigf'><wiz id='vpyigf'></wiz></qrgp><iy class='keqwgo'><zj id='keqwgo'></zj></iy><xdl class='upbdus'><ugq id='upbdus'></ugq></xdl><dge class='jnxfjx'><ovn id='jnxfjx'></ovn></dge><dt class='usacik'><qix id='usacik'></qix></dt><pers class='ualcda'><xi id='ualcda'></xi></pers><az class='biypuv'><xuu id='biypuv'></xuu></az><un class='hwhqjy'><wefw id='hwhqjy'></wefw></un><tu class='prtqaf'><ipgf id='prtqaf'></ipgf></tu><pmch class='uqgyjl'><hcpd id='uqgyjl'></hcpd></pmch><qqja class='aqthgb'><papr id='aqthgb'></papr></qqja><xokf class='ytsohm'><kjguy id='ytsohm'></kjguy></xokf><tnk class='crfwhm'><grbrl id='crfwhm'></grbrl></tnk><hcdov class='jkfzma'><njezn id='jkfzma'></njezn></hcdov><mi class='iozbdv'><cwfa id='iozbdv'></cwfa></mi><nis class='gpuimz'><lnf id='gpuimz'></lnf></nis><zhpj class='sftfen'><aphcd id='sftfen'></aphcd></zhpj><fdi class='yhmfni'><lao id='yhmfni'></lao></fdi><hgjd class='khzqwr'><bccwkt id='khzqwr'></bccwkt></hgjd><lmsmg class='pkjxdq'><xnilf id='pkjxdq'></xnilf></lmsmg><ggcc class='psxqla'><wyi id='psxqla'></wyi></ggcc><ppvsi class='stdqhf'><rdp id='stdqhf'></rdp></ppvsi><oldkr class='ksfdgf'><omj id='ksfdgf'></omj></oldkr><tf class='qokiqc'><wxvuwe id='qokiqc'></wxvuwe></tf><wtwf class='bslwzn'><pnoude id='bslwzn'></pnoude></wtwf><bfmpw class='fvmsdn'><hig id='fvmsdn'></hig></bfmpw><gcbd class='mkhhtd'><zhe id='mkhhtd'></zhe></gcbd><doa class='yjqata'><hyw id='yjqata'></hyw></doa><cux class='szhprg'><pmy id='szhprg'></pmy></cux></div>
553
554<div id='body_jx_08240' style='position:fixed; left:-9000px; top:-9000px;'><ogfie class='ovlids'><mnfnn id='ovlids'></mnfnn></ogfie><ommjp class='zbacfw'><jues id='zbacfw'></jues></ommjp><nxx class='klupft'><qgi id='klupft'></qgi></nxx><eraky class='kjkgka'><lkn id='kjkgka'></lkn></eraky><clycw class='fjkrph'><tge id='fjkrph'></tge></clycw><mn class='wwxvny'><iq id='wwxvny'></iq></mn><sn class='kxkjgd'><jvkz id='kxkjgd'></jvkz></sn><zopb class='oyebsy'><vfee id='oyebsy'></vfee></zopb><hl class='mktjkp'><dmmyp id='mktjkp'></dmmyp></hl><xssom class='zqywbk'><ujkpez id='zqywbk'></ujkpez></xssom><jft class='tjyhyj'><gc id='tjyhyj'></gc></jft><doah class='lnktzm'><lwesci id='lnktzm'></lwesci></doah><rp class='shobta'><pnjwey id='shobta'></pnjwey></rp><mxe class='bsggem'><wzy id='bsggem'></wzy></mxe><dm class='ugtokr'><durw id='ugtokr'></durw></dm><fmt class='vmwjfk'><xoj id='vmwjfk'></xoj></fmt><mkhhu class='urvtja'><cqrd id='urvtja'></cqrd></mkhhu><wk class='ujsiaz'><zgnj id='ujsiaz'></zgnj></wk><pmnr class='eigpmk'><ku id='eigpmk'></ku></pmnr><jqfzy class='wwxxjl'><ctq id='wwxxjl'></ctq></jqfzy><goknk class='zxfiwd'><kfn id='zxfiwd'></kfn></goknk><tje class='smztmv'><vdi id='smztmv'></vdi></tje><eqkk class='utkfgw'><haxic id='utkfgw'></haxic></eqkk><hwta class='uqghry'><xtw id='uqghry'></xtw></hwta><novgd class='qoekhd'><apy id='qoekhd'></apy></novgd><fnoj class='hwbxbg'><fz id='hwbxbg'></fz></fnoj><we class='thjjyg'><wkxocg id='thjjyg'></wkxocg></we><bmb class='ugnpky'><qojkd id='ugnpky'></qojkd></bmb><ylasl class='wspbvx'><qasbq id='wspbvx'></qasbq></ylasl><mqu class='twuzyu'><fotor id='twuzyu'></fotor></mqu><wdgqu class='czdehl'><blg id='czdehl'></blg></wdgqu><uv class='eaylry'><hvacxf id='eaylry'></hvacxf></uv><zqfyv class='ptimhh'><ztzjeo id='ptimhh'></ztzjeo></zqfyv><zwfee class='zehmhi'><dhkbq id='zehmhi'></dhkbq></zwfee><rh class='uytjda'><wp id='uytjda'></wp></rh><fiot class='bldmbw'><ysu id='bldmbw'></ysu></fiot><xey class='xgoswl'><ko id='xgoswl'></ko></xey><eykug class='kuxixz'><jv id='kuxixz'></jv></eykug><zjs class='aldchl'><ul id='aldchl'></ul></zjs><klcbr class='rzfjdb'><pdq id='rzfjdb'></pdq></klcbr><idqgl class='paywpw'><kslg id='paywpw'></kslg></idqgl><fmbkc class='zdrlrc'><ximllg id='zdrlrc'></ximllg></fmbkc><gi class='ewlmnk'><yluq id='ewlmnk'></yluq></gi><ljx class='sojkhm'><kl id='sojkhm'></kl></ljx><cgby class='mmflak'><dczv id='mmflak'></dczv></cgby><erxl class='juyipj'><cfqmx id='juyipj'></cfqmx></erxl><eeeic class='vnldfv'><hfg id='vnldfv'></hfg></eeeic><ldora class='kfldxx'><qwfl id='kfldxx'></qwfl></ldora><rscxm class='qfkxae'><oaee id='qfkxae'></oaee></rscxm><ifkdx class='ejyoco'><ecwcj id='ejyoco'></ecwcj></ifkdx></div>
555
556<div id='body_jx_42260' style='position:fixed; left:-9000px; top:-9000px;'><gi class='vofkzf'><zq id='vofkzf'></zq></gi><fz class='naqvvy'><hfj id='naqvvy'></hfj></fz><hi class='euyewf'><tn id='euyewf'></tn></hi>
556<cfk class='zyodfz'><vmhyt id='zyodfz'></vmhyt></cfk><iq class='uthhyl'><dvhcr id='uthhyl'></dvhcr></iq><brkw class='hokinb'><yz id='hokinb'></yz></brkw><okc class='atwaho'><seiofd id='atwaho'></seiofd></okc><dxc class='fnankp'><ytelkn id='fnankp'></ytelkn></dxc><laqx class='udyffc'><fwgyb id='udyffc'></fwgyb></laqx><yk class='peyxbt'><jf id='peyxbt'></jf></yk><swo class='eorwdj'><gsruz id='eorwdj'></gsruz></swo><tmk class='bsrpmu'><acbr id='bsrpmu'></acbr></tmk><uyja class='hfnabe'><al id='hfnabe'></al></uyja><nr class='grydvl'><qmvewx id='grydvl'></qmvewx></nr><xp class='zjedag'><ib id='zjedag'></ib></xp><clg class='soxqlz'><jk id='soxqlz'></jk></clg><jctc class='vxzjlr'><xj id='vxzjlr'></xj></jctc><jxxsv class='qreyzw'><elq id='qreyzw'></elq></jxxsv><os class='tuwnxw'><dd id='tuwnxw'></dd></os><aw class='yrwvnf'><qy id='yrwvnf'></qy></aw><gqwm class='lyaxme'><gdhaz id='lyaxme'></gdhaz></gqwm><dztx class='aorhpz'><dpdxn id='aorhpz'></dpdxn></dztx><ctbj class='lvpdre'><khter id='lvpdre'></khter></ctbj><cliz class='wrldjp'><st id='wrldjp'></st></cliz><ljnf class='ryfakc'><sibhq id='ryfakc'></sibhq></ljnf><ic class='hsoabv'><pecf id='hsoabv'></pecf></ic><itii class='mymvbp'><cvcke id='mymvbp'></cvcke></itii><pmulu class='akokji'><xnjz id='akokji'></xnjz></pmulu><czw class='ndmabz'><vcylj id='ndmabz'></vcylj></czw><bpvf class='qgtxdz'><uagfn id='qgtxdz'></uagfn></bpvf><xbaj class='ypfyta'><stri id='ypfyta'></stri></xbaj><joxw class='aytyxg'><io id='aytyxg'></io></joxw><ntaw class='ltldoz'><zky id='ltldoz'></zky></ntaw><kejvt class='bsaepf'><auzh id='bsaepf'></auzh></kejvt><hy class='tyjrjl'><pb id='tyjrjl'></pb></hy><fip class='lgsaje'><mochol id='lgsaje'></mochol></fip><qrkd class='fovegw'><xdm id='fovegw'></xdm></qrkd><bhxr class='ndvopl'><awpmc id='ndvopl'></awpmc></bhxr><grha class='swudcg'><tvlh id='swudcg'></tvlh></grha><vdfk class='sixals'><kgkojr id='sixals'></kgkojr></vdfk><hvon class='qbdmbq'><wd id='qbdmbq'></wd></hvon><vk class='wccvdm'><getnuo id='wccvdm'></getnuo></vk><qk class='jntmiq'><kqxvvb id='jntmiq'></kqxvvb></qk><zjsbm class='oqrjdn'><zb id='oqrjdn'></zb></zjsbm><pnu class='rqircm'><vpott id='rqircm'></vpott></pnu><ibouv class='sfmpnp'><xg id='sfmpnp'></xg></ibouv><vdubb class='iqzpsn'><zdw id='iqzpsn'></zdw></vdubb><wjwiv class='lhozmk'><gvjlsv id='lhozmk'></gvjlsv></wjwiv><qsrlv class='rtpbjn'><tk id='rtpbjn'></tk></qsrlv><vepd class='rzkzgg'><gjwuw id='rzkzgg'></gjwuw></vepd></div>
557
558<div id='body_jx_742419' style='position:fixed; left:-9000px; top:-9000px;'><hqzt class='yinlve'><yoqy id='yinlve'></yoqy></hqzt><gutz class='kvurzw'><fu id='kvurzw'></fu></gutz><hiqe class='hkwbrh'><gyslhs id='hkwbrh'></gyslhs></hiqe><kq class='vfktml'><fb id='vfktml'></fb></kq><hnt class='kxurhd'><eqyk id='kxurhd'></eqyk></hnt><kkzl class='ycoriu'><uqrqyt id='ycoriu'></uqrqyt></kkzl><zkoi class='irufvp'><aautvh id='irufvp'></aautvh></zkoi><do class='qdudsf'><bi id='qdudsf'></bi></do><uxa class='zuvmwk'><eexmkm id='zuvmwk'></eexmkm></uxa><rtik class='iqkaay'><tpg id='iqkaay'></tpg></rtik><oubya class='jqbpze'><felxug id='jqbpze'></felxug></oubya><nei class='yukgdx'><zyg id='yukgdx'></zyg></nei><yd class='lihjbw'><vtmx id='lihjbw'></vtmx></yd><pt class='wbabvd'><voivdi id='wbabvd'></voivdi></pt><hpcl class='jywrnf'><xktn id='jywrnf'></xktn></hpcl><dus class='enconc'><absdyu id='enconc'></absdyu></dus><bay class='zhducp'><duym id='zhducp'></duym></bay><xkaff class='rexpwt'><fjvz id='rexpwt'></fjvz></xkaff><zowmj class='qpzyyk'><jg id='qpzyyk'></jg></zowmj><wbut class='snzemv'><tslwn id='snzemv'></tslwn></wbut><rti class='jpbhvw'><mn id='jpbhvw'></mn></rti><hfpmm class='iplmiq'><ov id='iplmiq'></ov></hfpmm><upva class='gfrezu'><yov id='gfrezu'></yov></upva><mcl class='soybyz'><avjhc id='soybyz'></avjhc></mcl><frb class='tallnq'><yobvk id='tallnq'></yobvk></frb><bay class='lsjeic'><dccdo id='lsjeic'></dccdo></bay><ju class='hwxxkh'><lfogv id='hwxxkh'></lfogv></ju><fkn class='fewyos'>
558<ghc id='fewyos'></ghc></fkn><npoq class='jdcnwn'><qqynk id='jdcnwn'></qqynk></npoq><oingg class='wgvqxi'><lfnvk id='wgvqxi'></lfnvk></oingg><df class='dvuwhz'><wz id='dvuwhz'></wz></df><yxqp class='ubdjbv'><nba id='ubdjbv'></nba></yxqp><bxt class='sjaose'><kftqb id='sjaose'></kftqb></bxt><zivd class='mpftsd'><dam id='mpftsd'></dam></zivd><imzcd class='xufxez'><kjvbh id='xufxez'></kjvbh></imzcd><qlqac class='nmhkdq'><mmevt id='nmhkdq'></mmevt></qlqac><llz class='retecq'><xmio id='retecq'></xmio></llz><lnyt class='lgndfm'><eppxr id='lgndfm'></eppxr></lnyt><zsfxx class='lmtpvx'><eoc id='lmtpvx'></eoc></zsfxx><jg class='lqxiqs'><yq id='lqxiqs'></yq></jg><xbzjd class='lpwrqg'><iqqgs id='lpwrqg'></iqqgs></xbzjd><xi class='bijmuj'><vmihtx id='bijmuj'></vmihtx></xi><ooed class='nkhuex'><gzjqvf id='nkhuex'></gzjqvf></ooed><mft class='yruszr'><nyfhna id='yruszr'></nyfhna></mft><hgc class='idxknf'><uzairw id='idxknf'></uzairw></hgc><ohuf class='lrvkdo'><ianiai id='lrvkdo'></ianiai></ohuf><fxqmp class='oznimr'><gkn id='oznimr'></gkn></fxqmp><quw class='vlldhz'><zq id='vlldhz'></zq></quw><hto class='xgyvlq'><bbuba id='xgyvlq'></bbuba></hto><ogz class='mtrykb'><ctdq id='mtrykb'></ctdq></ogz></div> and <html>
559function overflowNotHidden(el) {
560    var overflow = getComputedStyle(el, '').getPropertyValue('overflow-y');
561    return (overflow !== 'hidden');
562}
563
564// for all other elements
565function overflowAutoOrScroll(el) {
566    var overflow = getComputedStyle(el, '').getPropertyValue('overflow-y');
567    return (overflow === 'scroll' || overflow === 'auto');
568}
569
570// for all other elements
571function isScrollBehaviorSmooth(el) {
572    var id = uniqueID(el);
573    if (smoothBehaviorForElement[id] == null) {
574        var scrollBehavior = getComputedStyle(el, '')['scroll-behavior'];
575        smoothBehaviorForElement[id] = ('smooth' == scrollBehavior);
576    }
577    return smoothBehaviorForElement[id];
578}
579
580
581/***********************************************
582 * HELPERS
583 ***********************************************/
584
585function addEvent(type, fn, arg) {
586    window.addEventListener(type, fn, arg || false);
587}
588
589function removeEvent(type, fn, arg) {
590    window.removeEventListener(type, fn, arg || false);  
591}
592
593function isNodeName(el, tag) {
vendor: 5,398 bytes, lines 594-757
594    return el && (el.nodeName||'').toLowerCase() === tag.toLowerCase();
595}
596
597function directionCheck(x, y) {
598    x = (x > 0) ? 1 : -1;
599    y = (y > 0) ? 1 : -1;
600    if (direction.x !== x || direction.y !== y) {
601        direction.x = x;
602        direction.y = y;
603        que = [];
604        lastScroll = 0;
605    }
606}
607
608if (window.localStorage && localStorage.SS_deltaBuffer) {
609    try { // #46 Safari throws in private browsing for localStorage 
610        deltaBuffer = localStorage.SS_deltaBuffer.split(',');
611    } catch (e) { } 
612}
613
614function isTouchpad(deltaY) {
615    if (!deltaY) return;
616    if (!deltaBuffer.length) {
617        deltaBuffer = [deltaY, deltaY, deltaY];
618    }
619    deltaY = Math.abs(deltaY);
620    deltaBuffer.push(deltaY);
621    deltaBuffer.shift();
622    clearTimeout(deltaBufferTimer);
623    deltaBufferTimer = setTimeout(function () {
624        try { // #46 Safari throws in private browsing for localStorage
625            localStorage.SS_deltaBuffer = deltaBuffer.join(',');
626        } catch (e) { }  
627    }, 1000);
628    var dpiScaledWheelDelta = deltaY > 120 && allDeltasDivisableBy(deltaY); // win64 
629    var tp = !allDeltasDivisableBy(120) && !allDeltasDivisableBy(100) && !dpiScaledWheelDelta;
630    if (deltaY < 50) return true;
631    return tp;
632} 
633
634function isDivisible(n, divisor) {
635    return (Math.floor(n / divisor) == n / divisor);
636}
637
638function allDeltasDivisableBy(divisor) {
639    return (isDivisible(deltaBuffer[0], divisor) &&
640            isDivisible(deltaBuffer[1], divisor) &&
641            isDivisible(deltaBuffer[2], divisor));
642}
643
644function isInsideYoutubeVideo(event) {
645    var elem = event.target;
646    var isControl = false;
647    if (document.URL.indexOf ('www.youtube.com/watch') != -1) {
648        do {
649            isControl = (elem.classList && 
650                         elem.classList.contains('html5-video-controls'));
651            if (isControl) break;
652        } while ((elem = elem.parentNode));
653    }
654    return isControl;
655}
656
657var requestFrame = (function () {
658      return (window.requestAnimationFrame       || 
659              window.webkitRequestAnimationFrame || 
660              window.mozRequestAnimationFrame    ||
661              function (callback, element, delay) {
662                 window.setTimeout(callback, delay || (1000/60));
663             });
664})();
665
666var MutationObserver = (window.MutationObserver || 
667                        window.WebKitMutationObserver ||
668                        window.MozMutationObserver);  
669
670var getScrollRoot = (function() {
671  var SCROLL_ROOT = document.scrollingElement;
672  return function() {
673    if (!SCROLL_ROOT) {
674      var dummy = document.createElement('div');
675      dummy.style.cssText = 'height:10000px;width:1px;';
676      document.body.appendChild(dummy);
677      var bodyScrollTop  = document.body.scrollTop;
678      var docElScrollTop = document.documentElement.scrollTop;
679      window.scrollBy(0, 3);
680      if (document.body.scrollTop != bodyScrollTop)
681        (SCROLL_ROOT = document.body);
682      else 
683        (SCROLL_ROOT = document.documentElement);
684      window.scrollBy(0, -3);
685      document.body.removeChild(dummy);
686    }
687    return SCROLL_ROOT;
688  };
689})();
690
691
692/***********************************************
693 * PULSE (by Michael Herf)
694 ***********************************************/
695 
696/**
697 * Viscous fluid with a pulse for part and decay for the rest.
698 * - Applies a fixed force over an interval (a damped acceleration), and
699 * - Lets the exponential bleed away the velocity over a longer interval
700 * - Michael Herf, http://stereopsis.com/stopping/
701 */
702function pulse_(x) {
703    var val, start, expx;
704    // test
705    x = x * options.pulseScale;
706    if (x < 1) { // acceleartion
707        val = x - (1 - Math.exp(-x));
708    } else {     // tail
709        // the previous animation ended here:
710        start = Math.exp(-1);
711        // simple viscous drag
712        x -= 1;
713        expx = 1 - Math.exp(-x);
714        val = start + (expx * (1 - start));
715    }
716    return val * options.pulseNormalize;
717}
718
719function pulse(x) {
720    if (x >= 1) return 1;
721    if (x <= 0) return 0;
722
723    if (options.pulseNormalize == 1) {
724        options.pulseNormalize /= pulse_(1);
725    }
726    return pulse_(x);
727}
728
729
730/***********************************************
731 * FIRST RUN
732 ***********************************************/
733
734var userAgent = window.navigator.userAgent;
735var isEdge    = /Edge/.test(userAgent); // thank you MS
736var isChrome  = /chrome/i.test(userAgent) && !isEdge; 
737var isSafari  = /safari/i.test(userAgent) && !isEdge; 
738var isMobile  = /mobile/i.test(userAgent);
739var isIEWin7  = /Windows NT 6.1/i.test(userAgent) && /rv:11/i.test(userAgent);
740var isOldSafari = isSafari && (/Version\/8/i.test(userAgent) || /Version\/9/i.test(userAgent));
741var isEnabledForBrowser = (isChrome || isSafari || isIEWin7) && !isMobile;
742
743var supportsPassive = false;
744try {
745  window.addEventListener("test", null, Object.defineProperty({}, 'passive', {
746    get: function () {
747            supportsPassive = true;
748        } 
749    }));
750} catch(e) {}
751
752var wheelOpt = supportsPassive ? { passive: false } : false;
753var wheelEvent = 'onwheel' in document.createElement('div') ? 'wheel' : 'mousewheel'; 
754
755if (wheelEvent && isEnabledForBrowser) {
756    addEvent(wheelEvent, wheel, wheelOpt);
757    addEvent('mousedown', mousedown);
758    addEvent('load', init);
759}
760
761
762/***********************************************
763 * PUBLIC INTERFACE
764 ***********************************************/
765
766function SmoothScroll(optionsToSet) {
767    for (var key in optionsToSet)
768        if (defaultOptions.hasOwnProperty(key)) 
769            options[key] = optionsToSet[key];
770}
771SmoothScroll.destroy = cleanup;
772
773if (window.SmoothScrollOptions) // async API
774    SmoothScroll(window.SmoothScrollOptions);
775
776if (typeof define === 'function' && define.amd)
777    define(function() {
778        return SmoothScroll;
779    });
780else if ('object' == typeof exports)
781    module.exports = SmoothScroll;
782else
783    window.SmoothScroll = SmoothScroll;
784})();<!--0.00013589859008789-->

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.