PageSourceSearch

https://accutestglobal.com/js/jquery.mb.YTPlayer.min.js

js accutestglobal.com collected 2026-10-08 10:12:04 UTC 90,480 bytes, 1,243 lines download raw bytes

vendor: 90,480 bytes, lines 1-1243
1/*jquery.mb.YTPlayer 23-01-2021
2 _ jquery.mb.components 
3 _ email: [email protected] 
4 _ Copyright (c) 2001-2021. Matteo Bicocchi (Pupunzi); 
5 _ blog: http://pupunzi.open-lab.com 
6 _ Open Lab s.r.l., Florence - Italy 
7 */
8
9var ytp = ytp || {};
10let YTPRndSuffix = (new Date).getTime(),
11    YTPTimerLabels = {
12        init: "YTPlayerInit_" + YTPRndSuffix,
13        startPlaying: "YTPlayerStartPlay_" + YTPRndSuffix
14    };
15
16function onYouTubeIframeAPIReady() {
17    ytp.YTAPIReady || (ytp.YTAPIReady = !0, jQuery(document).trigger("YTAPIReady"))
18}
19let getYTPVideoID = function(e) {
20    let r, t;
21    return e.indexOf("youtu.be") > 0 || e.indexOf("youtube.com/embed") > 0 ? r = (t = (r = e.substr(e.lastIndexOf("/") + 1, e.length)).indexOf("?list=") > 0 ? r.substr(r.lastIndexOf("="), r.length) : null) ? r.substr(0, r.lastIndexOf("?")) : r : e.indexOf("http") > -1 ? (r = e.match(/[\\?&]v=([^&#]*)/)[1], t = e.indexOf("list=") > 0 ? e.match(/[\\?&]list=([^&#]*)/)[1] : null) : t = (r = e.length > 15 ? null : e) ? null : e, {
22        videoID: r,
23        playlistID: t
24    }
25};
26! function(jQuery, ytp) {
27    jQuery.mbYTPlayer = {
28        name: "jquery.mb.YTPlayer",
29        version: "3.3.9",
30        build: "7581",
31        author: "Matteo Bicocchi (pupunzi)",
32        apiKey: "",
33        defaults: {
34            videoURL: null,
35            containment: "body",
36            ratio: "auto",
37            fadeOnStartTime: 1e3,
38            startAt: 0,
39            stopAt: 0,
40            autoPlay: !0,
41            delayAtStart: 1e3,
42            coverImage: !1,
43            loop: !0,
44            addRaster: !1,
45            mask: !1,
46            opacity: 1,
47            quality: "hd1080",
48            vol: 50,
49            mute: !1,
50            showControls: !0,
51            anchor: "center,center",
52            showAnnotations: !1,
53            cc_load_policy: !1,
54            showYTLogo: !0,
55            useOnMobile: !0,
56            playOnlyIfVisible: !1,
57            onScreenPercentage: 30,
58            goFullScreenOnPlay: !1,
59            stopMovieOnBlur: !0,
60            realFullscreen: !0,
61            optimizeDisplay: !0,
62            abundance: .3,
63            gaTrack: !0,
64            remember_last_time: !1,
65            addFilters: !1,
66            useNoCookie: !0,
67            onReady: function(e) {},
68            onError: function(e, r) {},
69            onEnd: function() {}
70        },
71        controls: {
72            play: "P",
73            pause: "p",
74            mute: "M",
75            unmute: "A",
76            onlyYT: "O",
77            showSite: "R",
78            ytLogo: "Y"
79        },
80        controlBar: null,
81        locationProtocol: "https:",
82        defaultFilters: {
83            grayscale: {
84                value: 0,
85                unit: "%"
86            },
87            hue_rotate: {
88                value: 0,
89                unit: "deg"
90            },
91            invert: {
92                value: 0,
93                unit: "%"
94            },
95            opacity: {
96                value: 0,
97                unit: "%"
98            },
99            saturate: {
100                value: 0,
101                unit: "%"
102            },
103            sepia: {
104                value: 0,
105                unit: "%"
106            },
107            brightness: {
108                value: 0,
109                unit: "%"
110            },
111            contrast: {
112                value: 0,
113                unit: "%"
114            },
115            blur: {
116                value: 0,
117                unit: "px"
118            }
119        },
120        buildPlayer: function(options) {
121            if (ytp.YTAPIReady || void 0 !== window.YT) setTimeout(function() {
122                jQuery(document).trigger("YTAPIReady"), ytp.YTAPIReady = !0
123            }, 100);
124            else {
125                jQuery("#YTAPI").remove();
126                let e = jQuery("<script>").attr({
127                    src: "https://www.youtube.com/iframe_api?v=" + jQuery.mbYTPlayer.version,
128                    id: "YTAPI"
129                });
130                jQuery("head").prepend(e)
131            }
132
133            function isIframe() {
134                let e = !1;
135                try {
136                    self.location.href !== top.location.href && (e = !0)
137                } catch (r) {
138                    e = !0
139                }
140                return e
141            }
142            return this.each(function() {
143                let YTPlayer = this,
144                    $YTPlayer = jQuery(YTPlayer);
145                $YTPlayer.hide(), YTPlayer.loop = 0, YTPlayer.state = 0, YTPlayer.filters = jQuery.extend(!0, {}, jQuery.mbYTPlayer.defaultFilters), YTPlayer.filtersEnabled = !0, YTPlayer.id = YTPlayer.id || "YTP_" + (new Date).getTime(), $YTPlayer.addClass("mb_YTPlayer");
146                let property = $YTPlayer.data("property") && "string" == typeof $YTPlayer.data("property") ? eval("(" + $YTPlayer.data("property") + ")") : $YTPlayer.data("property");
147                "object" != typeof property && (property = {}), YTPlayer.opt = jQuery.extend(!0, {}, jQuery.mbYTPlayer.defaults, YTPlayer.opt, options, property), YTPRndSuffix = getYTPVideoID(YTPlayer.opt.videoURL).videoID, YTPTimerLabels = {
148                    init: "YTPlayerInit_" + YTPRndSuffix,
149                    startPlaying: "YTPlayerStartPlay_" + YTPRndSuffix
150                }, console.time(YTPTimerLabels.init), console.time(YTPTimerLabels.startPlaying), YTPlayer.opt.elementId = YTPlayer.id, 0 === YTPlayer.opt.vol && (YTPlayer.opt.vol = 1, YTPlayer.opt.mute = !0), YTPlayer.opt.loop && "boolean" == typeof YTPlayer.opt.loop && (YTPlayer.opt.loop = 9999);
151                let fullScreenAvailable = document.fullscreenEnabled || document.webkitFullscreenEnabled || document.mozFullScreenEnabled || document.msFullscreenEnabled;
152                YTPlayer.opt.realFullscreen = !(isIframe() || !fullScreenAvailable) && YTPlayer.opt.realFullscreen, YTPlayer.opt.showAnnotations = YTPlayer.opt.showAnnotations ? "1" : "3", YTPlayer.opt.cc_load_policy = YTPlayer.opt.cc_load_policy ? "1" : "0", YTPlayer.opt.coverImage = YTPlayer.opt.coverImage || YTPlayer.opt.backgroundImage, YTPlayer.opt.quality = "hd1080", jQuery.mbBrowser.msie && jQuery.mbBrowser.version < 9 && (YTPlayer.opt.opacity = 1), YTPlayer.opt.containment = "self" === YTPlayer.opt.containment ? $YTPlayer : jQuery(YTPlayer.opt.containment), YTPlayer.isRetina = window.retina || window.devicePixelRatio > 1, YTPlayer.opt.ratio = "auto" === YTPlayer.opt.ratio ? 16 / 9 : YTPlayer.opt.ratio, YTPlayer.opt.ratio = eval(YTPlayer.opt.ratio);
153                let origContainmentBackground = YTPlayer.opt.containment.css("background-image");
154                origContainmentBackground = "none" === origContainmentBackground ? null : origContainmentBackground, YTPlayer.orig_containment_background = origContainmentBackground, $YTPlayer.attr("id") || $YTPlayer.attr("id", "ytp_" + (new Date).getTime()), YTPlayer.playerID = "iframe_" + YTPlayer.id, YTPlayer.isAlone = !1, YTPlayer.hasFocus = !0, YTPlayer.videoID = YTPlayer.opt.videoURL ? getYTPVideoID(YTPlayer.opt.videoURL).videoID : !!$YTPlayer.attr("href") && getYTPVideoID($YTPlayer.attr("href")).videoID, YTPlayer.playlistID = YTPlayer.opt.videoURL ? getYTPVideoID(YTPlayer.opt.videoURL).playlistID : !!$YTPlayer.attr("href") && getYTPVideoID($YTPlayer.attr("href")).playlistID;
155                let start_from_last = 0;
156                if (jQuery.mbCookie.get("YTPlayer_start_from" + YTPlayer.videoID) && (start_from_last = parseFloat(jQuery.mbCookie.get("YTPlayer_start_from" + YTPlayer.videoID))), YTPlayer.opt.remember_last_time && start_from_last && (YTPlayer.start_from_last = start_from_last, jQuery.mbCookie.remove("YTPlayer_start_from" + YTPlayer.videoID)), YTPlayer.isPlayer = $YTPlayer.is(YTPlayer.opt.containment), YTPlayer.isBackground = YTPlayer.opt.containment.is("body"), YTPlayer.isBackground && ytp.backgroundIsInited) return;
157                if (YTPlayer.isPlayer && $YTPlayer.show(), YTPlayer.overlay = jQuery("<div/>").css({
158                        position: "absolute",
159                        top: 0,
160                        left: 0,
161                        width: "100%",
162                        height: "100%"
163                    }).addClass("YTPOverlay"), $YTPlayer.changeCoverImage(), YTPlayer.wrapper = jQuery("<div/>").attr("id", "wrapper_" + YTPlayer.id).css({
164                        position: "absolute",
165                        zIndex: 0,
166                        minWidth: "100%",
167                        minHeight: "100%",
168                        left: 0,
169                        top: 0,
170                        overflow: "hidden",
171                        opacity: 0
172                    }).addClass("mbYTP_wrapper"), YTPlayer.isPlayer) {
173                    let e = jQuery.mbBrowser.mobile ? "inlinePlayButtonMobile" : "inlinePlayButton";
174                    YTPlayer.inlinePlayButton = jQuery("<div/>").addClass("inlinePlayButton").html(jQuery.mbYTPlayer.controls.play), $YTPlayer.append(YTPlayer.inlinePlayButton), YTPlayer.inlinePlayButton.on("click", function(e) {
175                        $YTPlayer.YTPPlay(), YTPlayer.inlinePlayButton.hide(), YTPlayer.opt.goFullScreenOnPlay && $YTPlayer.YTPFullscreen(), e.stopPropagation()
176                    }), YTPlayer.opt.autoPlay && YTPlayer.inlinePlayButton.hide(), YTPlayer.overlay.on("click", function() {
177                        $YTPlayer.YTPTogglePlay(), YTPlayer.opt.goFullScreenOnPlay && $YTPlayer.YTPFullscreen()
178                    }).css({
179                        cursor: "pointer"
180                    })
181                }
182                let playerBox = jQuery("<div/>").attr("id", YTPlayer.playerID).addClass("playerBox");
183                if (playerBox.css({
184                        position: "absolute",
185                        zIndex: 0,
186                        width: "100%",
187                        height: "100%",
188                        top: 0,
189                        left: 0,
190                        overflow: "hidden",
191                        opacity: 1
192                    }), YTPlayer.wrapper.append(playerBox), playerBox.after(YTPlayer.overlay), YTPlayer.isPlayer && (YTPlayer.inlineWrapper = jQuery("<div/>").addClass("inline-YTPlayer"), YTPlayer.inlineWrapper.css({
193                        position: "relative",
194                        maxWidth: YTPlayer.opt.containment.css("width")
195                    }), YTPlayer.opt.containment.css({
196                        position: "relative",
197                        paddingBottom: "56.25%",
198                        overflow: "hidden",
199                        height: 0
200                    }), YTPlayer.opt.containment.wrap(YTPlayer.inlineWrapper)), YTPlayer.opt.containment.children().not("script, style").each(function() {
201                        "static" === jQuery(this).css("position") && jQuery(this).css("position", "relative")
202                    }), YTPlayer.isBackground ? (jQuery("body").css({
203                        boxSizing: "border-box"
204                    }), YTPlayer.wrapper.css({
205                        position: "fixed",
206                        top: 0,
207                        left: 0,
208                        zIndex: 0
209                    })) : "static" === YTPlayer.opt.containment.css("position") && (YTPlayer.opt.containment.css({
210                        position: "relative"
211                    }), $YTPlayer.show()), YTPlayer.opt.containment.prepend(YTPlayer.wrapper), YTPlayer.isBackground || YTPlayer.overlay.on("mouseenter", function() {
212                        YTPlayer.controlBar && YTPlayer.controlBar.length && YTPlayer.controlBar.addClass("visible")
213                    }).on("mouseleave", function() {
214                        YTPlayer.controlBar && YTPlayer.controlBar.length && YTPlayer.controlBar.removeClass("visible")
215                    }), jQuery.mbBrowser.mobile && !YTPlayer.opt.useOnMobile) return YTPlayer.opt.coverImage && (YTPlayer.wrapper.css({
216                    backgroundImage: "url(" + YTPlayer.opt.coverImage + ")",
217                    backgroundPosition: "center center",
218                    backgroundSize: "cover",
219                    backgroundRepeat: "no-repeat",
220                    opacity: 1
221                }), YTPlayer.wrapper.css({
222                    opacity: 1
223                })), $YTPlayer;
224                jQuery.mbBrowser.mobile && YTPlayer.opt.autoPlay && YTPlayer.opt.useOnMobile && jQuery("body").one("touchstart", function() {
225                    YTPlayer.player.playVideo()
226                }), jQuery(document).one("YTAPIReady", function() {
227                    $YTPlayer.trigger("YTAPIReady_" + YTPlayer.id), ytp.YTAPIReady = !0
228                }), YTPlayer.isOnScreen = jQuery.mbYTPlayer.isOnScreen(YTPlayer, YTPlayer.opt.onScreenPercentage), $YTPlayer.one("YTAPIReady_" + YTPlayer.id, function() {
229                    let e = this,
230                        r = jQuery(e);
231                    e.isBackground && ytp.backgroundIsInited || e.isInit || (e.isBackground && (ytp.backgroundIsInited = !0), e.opt.autoPlay = void 0 === e.opt.autoPlay ? !!e.isBackground : e.opt.autoPlay, e.opt.vol = e.opt.vol ? e.opt.vol : 100, jQuery.mbYTPlayer.getDataFromAPI(e), jQuery(e).on("YTPChanged", function(t) {
232                        if (e.isInit) return;
233                        e.isInit = !0;
234                        let a = {
235                            modestbranding: 1,
236                            autoplay: 0,
237                            controls: 0,
238                            showinfo: 0,
239                            rel: 0,
240                            enablejsapi: 1,
241                            version: 3,
242                            playerapiid: e.playerID,
243                            origin: "*",
244                            allowfullscreen: !0,
245                            wmode: "transparent",
246                            iv_load_policy: e.opt.showAnnotations,
247                            cc_load_policy: e.opt.cc_load_policy,
248                            playsinline: jQuery.mbBrowser.mobile && !e.isPlayer ? 1 : 0,
249                            html5: document.createElement("video").canPlayType ? 1 : 0
250                        };
251                        new YT.Player(e.playerID, {
252                            host: e.opt.useNoCookie ? "https://www.youtube-nocookie.com" : "https://www.youtube.com",
253                            playerVars: a,
254                            events: {
255                                onReady: function(t) {
256                                    e.player = t.target, e.player.loadVideoById({
257                                        videoId: e.videoID.toString(),
258                                        suggestedQuality: e.opt.quality
259                                    }), r.trigger("YTPlayerIsReady_" + e.id)
260                                },
261                                onStateChange: function(r) {
262                                    if ("function" != typeof r.target.getPlayerState) return;
263                                    let t, a = r.target.getPlayerState();
264                                    if (e.preventTrigger || e.isStarting) return void(e.preventTrigger = !1);
265                                    switch (e.state = a, r.data === YT.PlayerState.PLAYING && r.target.setPlaybackQuality(e.opt.quality), a) {
266                                        case -1:
267                                            t = "YTPUnstarted";
268                                            break;
269                                        case 0:
270                                            t = "YTPRealEnd";
271                                            break;
272                                        case 1:
273                                            t = "YTPPlay", e.controlBar.length && e.controlBar.find(".mb_YTPPlayPause").html(jQuery.mbYTPlayer.controls.pause), e.isPlayer && e.inlinePlayButton.hide(), jQuery(document).off("mousedown.YTPstart");
274                                            break;
275                                        case 2:
276                                            t = "YTPPause", e.controlBar.length && e.controlBar.find(".mb_YTPPlayPause").html(jQuery.mbYTPlayer.controls.play), e.isPlayer && e.inlinePlayButton.show();
277                                            break;
278                                        case 3:
279                                            e.player.setPlaybackQuality(e.opt.quality), t = "YTPBuffering", e.controlBar.length && e.controlBar.find(".mb_YTPPlayPause").html(jQuery.mbYTPlayer.controls.play);
280                                            break;
281                                        case 5:
282                                            t = "YTPCued"
283                                    }
284                                    let o = jQuery.Event(t);
285                                    o.time = e.currentTime, jQuery(e).trigger(o)
286                                },
287                                onPlaybackQualityChange: function(r) {
288                                    let t = r.target.getPlaybackQuality(),
289                                        a = jQuery.Event("YTPQualityChange");
290                                    a.quality = t, jQuery(e).trigger(a)
291                                },
292                                onError: function(t) {
293                                    switch ("function" == typeof e.opt.onError && e.opt.onError(r, t), console.debug("error:", t), t.data) {
294                                        case 2:
295                                            console.error("video ID:: " + e.videoID + ": The request contains an invalid parameter value. For example, this error occurs if you specify a video ID that does not have 11 characters, or if the video ID contains invalid characters, such as exclamation points or asterisks.");
296                                            break;
297                                        case 5:
298                                            console.error("video ID:: " + e.videoID + ": The requested content cannot be played in an HTML5 player or another error related to the HTML5 player has occurred.");
299                                            break;
300                                        case 100:
301                                            console.error("video ID:: " + e.videoID + ": The video requested was not found. This error occurs when a video has been removed (for any reason) or has been marked as private.");
302                                            break;
303                                        case 101:
304                                        case 150:
305                                            console.error("video ID:: " + e.videoID + ": The video doesn't exist or The owner does not allow it to be played in embedded players.")
306                                    }
307                                    e.isList && jQuery(e).YTPPlayNext()
308                                }
309                            }
310                        }), r.on("YTPlayerIsReady_" + e.id, function() {
311                            if (e.isReady) return this;
312                            e.playerEl = e.player.getIframe(), jQuery(e.playerEl).unselectable(), r.optimizeDisplay(), jQuery(window).off("resize.YTP_" + e.id).on("resize.YTP_" + e.id, function() {
313                                r.optimizeDisplay()
314                            }), jQuery(window).off("orientationchange.YTP_" + e.id).on("orientationchange.YTP_" + e.id, function() {
315                                r.optimizeDisplay()
316                            }), e.opt.remember_last_time && jQuery(window).on("unload.YTP_" + e.id, function() {
317                                let r = e.player.getCurrentTime();
318                                jQuery.mbCookie.set("YTPlayer_start_from" + e.videoID, r, 0)
319                            }), r.YTPCheckForState()
320                        })
321                    }))
322                }), $YTPlayer.off("YTPTime.mask"), jQuery.mbYTPlayer.applyMask(YTPlayer), console.timeEnd(YTPTimerLabels.init), setTimeout(function() {
323                    ytp.YTAPIReady || "object" != typeof window.YT || (jQuery(document).trigger("YTAPIReady"), ytp.YTAPIReady = !0, console.error("YTPlayer: More then a call to the YT API has been detected"))
324                }, YTPlayer.opt.delayAtStart)
325            })
326        },
327        isOnScreen: function(e, r) {
328            r = r || 10;
329            let t = e.wrapper,
330                a = jQuery(window).scrollTop(),
331                o = a + jQuery(window).height(),
332                n = t.height() * r / 100,
333                i = t.offset().top + n;
334            return t.offset().top + (t.height() - n) <= o && i >= a
335        },
336        getDataFromAPI: function(e) {
337            e.videoData = jQuery.mbStorage.get("YTPlayer_data_" + e.videoID), e.videoData ? (setTimeout(function() {
338                e.dataReceived = !0;
339                let r = jQuery.Event("YTPChanged");
340                r.time = e.currentTime, r.videoId = e.videoID, r.opt = e.opt, jQuery(e).trigger(r);
341                let t = jQuery.Event("YTPData");
342                t.prop = {};
343                for (let r in e.videoData) e.videoData.hasOwnProperty(r) && (t.prop[r] = e.videoData[r]);
344                jQuery(e).trigger(t)
345            }, e.opt.fadeOnStartTime), e.hasData = !0) : jQuery.mbYTPlayer.apiKey ? jQuery.getJSON("https://www.googleapis.com/youtube/v3/videos?id=" + e.videoID + "&key=" + jQuery.mbYTPlayer.apiKey + "&part=snippet", function(r) {
346                e.dataReceived = !0;
347                let t = jQuery.Event("YTPChanged");
348                t.time = e.currentTime, t.videoId = e.videoID, jQuery(e).trigger(t), r.items[0] ? (! function(r) {
349                    e.videoData = {}, e.videoData.id = e.videoID, e.videoData.channelTitle = r.channelTitle, e.videoData.title = r.title, e.videoData.description = r.description.length < 400 ? r.description : r.description.substring(0, 400) + " ...", e.videoData.thumb_max = r.thumbnails.maxres ? r.thumbnails.maxres.url : null, e.videoData.thumb_high = r.thumbnails.high ? r.thumbnails.high.url : null, e.videoData.thumb_medium = r.thumbnails.medium ? r.thumbnails.medium.url : null, jQuery.mbStorage.set("YTPlayer_data_" + e.videoID, e.videoData)
350                }(r.items[0].snippet), e.hasData = !0) : (e.videoData = {}, e.hasData = !1);
351                let a = jQuery.Event("YTPData");
352                a.prop = {};
353                for (let r in e.videoData) a.prop[r] = e.videoData[r];
354                jQuery(e).trigger(a)
355            }).fail(function(r) {
356                console.error("YT data error:: ", r), e.hasData = !1;
357                let t = jQuery.Event("YTPChanged");
358                t.time = e.currentTime, t.videoId = e.videoID, jQuery(e).trigger(t)
359            }) : (setTimeout(function() {
360                let r = jQuery.Event("YTPChanged");
361                r.time = e.currentTime, r.videoId = e.videoID, jQuery(e).trigger(r)
362            }, 10), e.videoData = null), e.opt.ratio = "auto" == e.opt.ratio ? 16 / 9 : e.opt.ratio, e.isPlayer && !e.opt.autoPlay && (e.loading = jQuery("<div/>").addClass("loading").html("Loading").hide(), jQuery(e).append(e.loading), e.loading.fadeIn())
363        },
364        removeStoredData: function() {
365            jQuery.mbStorage.remove()
366        },
367        getVideoData: function() {
368            return this.get(0).videoData
369        },
370        getVideoID: function() {
371            return this.get(0).videoID || !1
372        },
373        getPlaylistID: function() {
374            return this.get(0).playlistID || !1
375        },
376        setVideoQuality: function(e) {
377            let r = this.get(0),
378                t = r.player.getCurrentTime();
379            return jQuery(r).YTPPause(), r.opt.quality = e, r.player.setPlaybackQuality(e), r.player.seekTo(t), jQuery(r).YTPPlay(), this
380        },
381        getVideoQuality: function() {
382            return this.get(0).player.getPlaybackQuality()
383        },
384        playlist: function(e, r, t) {
385            let a = this.get(0);
386            return a.isList = !0, r && (e = jQuery.shuffle(e)), a.videoID || (a.videos = e, a.videoCounter = 1, a.videoLength = e.length, jQuery(a).data("property", e[0]), jQuery(a).YTPlayer()), "function" == typeof t && jQuery(a).on("YTPChanged", function() {
387                t(a)
388            }), jQuery(a).on("YTPEnd", function() {
389                jQuery(a).YTPPlayNext()
390            }), this
391        },
392        playNext: function() {
393            let e = this.get(0);
394            return e.videoCounter++, e.videoCounter > e.videoLength && (e.videoCounter = 1), jQuery(e).YTPPlayIndex(e.videoCounter), this
395        },
396        playPrev: function() {
397            let e = this.get(0);
398            return e.videoCounter--, e.videoCounter <= 0 && (e.videoCounter = e.videoLength), jQuery(e).YTPPlayIndex(e.videoCounter), this
399        },
400        playIndex: function(e) {
401            let r = this.get(0);
402            r.checkForStartAt && (clearInterval(r.checkForStartAt), clearInterval(r.getState)), r.videoCounter = e, r.videoCounter >= r.videoLength && (r.videoCounter = r.videoLength);
403            let t = r.videos[r.videoCounter - 1];
404            return jQuery(r).YTPChangeVideo(t), this
405        },
406        changeVideo: function(e) {
407            let r = this,
408                t = r.get(0);
409            t.opt.startAt = 0, t.opt.stopAt = 0, t.opt.mask = !1, t.opt.mute = !0, t.opt.autoPlay = !0, t.opt.addFilters = !1, t.opt.coverImage = !1, t.hasData = !1, t.hasChanged = !0, t.player.loopTime = void 0, e && jQuery.extend(t.opt, e), t.videoID = getYTPVideoID(t.opt.videoURL).videoID, t.opt.loop && "boolean" == typeof t.opt.loop && (t.opt.loop = 9999), t.wrapper.css({
410                background: "none"
411            }), jQuery(t.playerEl).CSSAnimate({
412                opacity: 0
413            }, t.opt.fadeOnStartTime, function() {
414                jQuery.mbYTPlayer.getDataFromAPI(t), r.YTPGetPlayer().loadVideoById({
415                    videoId: t.videoID,
416                    suggestedQuality: t.opt.quality
417                }), r.YTPPause(), r.optimizeDisplay(), t.checkForStartAt && (clearInterval(t.checkForStartAt), clearInterval(t.getState)), r.YTPCheckForState()
418            });
419            let a = jQuery.Event("YTPChangeVideo");
420            return a.time = t.currentTime, jQuery(t).trigger(a), jQuery.mbYTPlayer.applyMask(t), this
421        },
422        getPlayer: function() {
423            let e = this.get(0);
424            return e.isReady ? e.player : null
425        },
426        playerDestroy: function() {
427            let e = this.get(0);
428            return e.isReady ? (ytp.YTAPIReady = !0, ytp.backgroundIsInited = !1, e.isInit = !1, e.videoID = null, e.isReady = !1, e.wrapper.remove(), jQuery("#controlBar_" + e.id).remove(), clearInterval(e.checkForStartAt), clearInterval(e.getState), this) : this
429        },
430        fullscreen: function(real) {
431            let YTPlayer = this.get(0);
432            void 0 === real && (real = eval(YTPlayer.opt.realFullscreen));
433            let controls = jQuery("#controlBar_" + YTPlayer.id),
434                fullScreenBtn = controls.find(".mb_OnlyYT"),
435                videoWrapper = YTPlayer.isPlayer ? YTPlayer.opt.containment : YTPlayer.wrapper;
436            if (real) {
437                let e = jQuery.mbBrowser.mozilla ? "mozfullscreenchange" : jQuery.mbBrowser.webkit ? "webkitfullscreenchange" : "fullscreenchange";
438                jQuery(document).off(e).on(e, function() {
439                    RunPrefixMethod(document, "IsFullScreen") || RunPrefixMethod(document, "FullScreen") ? jQuery(YTPlayer).trigger("YTPFullScreenStart") : (YTPlayer.isAlone = !1, fullScreenBtn.html(jQuery.mbYTPlayer.controls.onlyYT), jQuery(YTPlayer).YTPSetVideoQuality(YTPlayer.opt.quality), videoWrapper.removeClass("YTPFullscreen"), videoWrapper.CSSAnimate({
440                        opacity: YTPlayer.opt.opacity
441                    }, YTPlayer.opt.fadeOnStartTime), videoWrapper.css({
442                        zIndex: 0
443                    }), YTPlayer.isBackground ? jQuery("body").after(controls) : YTPlayer.wrapper.before(controls), jQuery(window).resize(), jQuery(YTPlayer).trigger("YTPFullScreenEnd"))
444                })
445            }
446            if (YTPlayer.isAlone) jQuery(document).off("mousemove.YTPlayer"), clearTimeout(YTPlayer.hideCursor), YTPlayer.overlay.css({
447                cursor: "auto"
448            }), real ? cancelFullscreen() : (videoWrapper.CSSAnimate({
449                opacity: YTPlayer.opt.opacity
450            }, YTPlayer.opt.fadeOnStartTime), videoWrapper.css({
451                zIndex: 0
452            })), fullScreenBtn.html(jQuery.mbYTPlayer.controls.onlyYT), YTPlayer.isAlone = !1;
453            else {
454                function hideMouse() {
455                    YTPlayer.overlay.css({
456                        cursor: "none"
457                    })
458                }
459                jQuery(document).on("mousemove.YTPlayer", function(e) {
460                    YTPlayer.overlay.css({
461                        cursor: "auto"
462                    }), clearTimeout(YTPlayer.hideCursor), jQuery(e.target).parents().is(".mb_YTPBar") || (YTPlayer.hideCursor = setTimeout(hideMouse, 3e3))
463                }), hideMouse(), real ? (videoWrapper.css({
464                    opacity: 0
465                }), videoWrapper.addClass("YTPFullscreen"), launchFullscreen(videoWrapper.get(0)), setTimeout(function() {
466                    videoWrapper.CSSAnimate({
467                        opacity: 1
468                    }, 2 * YTPlayer.opt.fadeOnStartTime), videoWrapper.append(controls), jQuery(YTPlayer).optimizeDisplay(), YTPlayer.player.seekTo(YTPlayer.player.getCurrentTime() + .1, !0)
469                }, YTPlayer.opt.fadeOnStartTime)) : videoWrapper.css({
470                    zIndex: 1e4
471                }).CSSAnimate({
472                    opacity: 1
473                }, 2 * YTPlayer.opt.fadeOnStartTime), fullScreenBtn.html(jQuery.mbYTPlayer.controls.showSite), YTPlayer.isAlone = !0
474            }
475
476            function RunPrefixMethod(e, r) {
477                let t, a, o = ["webkit", "moz", "ms", "o", ""],
478                    n = 0;
479                for (; n < o.length && !e[t];) {
480                    if (t = r, "" === o[n] && (t = t.substr(0, 1).toLowerCase() + t.substr(1)), "undefined" != (a = typeof e[t = o[n] + t])) return o = [o[n]], "function" == a ? e[t]() : e[t];
481                    n++
482                }
483            }
484
485            function launchFullscreen(e) {
486                RunPrefixMethod(e, "RequestFullScreen")
487            }
488
489            function cancelFullscreen() {
490                (RunPrefixMethod(document, "FullScreen") || RunPrefixMethod(document, "IsFullScreen")) && RunPrefixMethod(document, "CancelFullScreen")
491            }
492            return this
493        },
494        toggleLoops: function() {
495            let e = this.get(0),
496                r = e.opt;
497            return 1 == r.loop ? r.loop = 0 : (r.startAt ? e.player.seekTo(r.startAt) : e.player.playVideo(), r.loop = 1), this
498        },
499        play: function() {
500            let e = this.get(0),
501                r = jQuery(e);
502            return e.isReady ? (setTimeout(function() {
503                r.YTPSetAbundance(e.opt.abundance)
504            }, 300), e.player.playVideo(), jQuery(e.playerEl).css({
505                opacity: 1
506            }), e.wrapper.css({
507                backgroundImage: "none"
508            }), e.wrapper.CSSAnimate({
509                opacity: e.isAlone ? 1 : e.opt.opacity
510            }, e.opt.fadeOnStartTime), jQuery("#controlBar_" + e.id).find(".mb_YTPPlayPause").html(jQuery.mbYTPlayer.controls.pause), e.state = 1, this) : this
511        },
512        togglePlay: function(e) {
513            let r = this.get(0);
514            return r.isReady ? (1 === r.state ? this.YTPPause() : this.YTPPlay(), "function" == typeof e && e(r.state), this) : this
515        },
516        stop: function() {
517            let e = this.get(0);
518            return e.isReady ? (jQuery("#controlBar_" + e.id).find(".mb_YTPPlayPause").html(jQuery.mbYTPlayer.controls.play), e.player.stopVideo(), this) : this
519        },
520        pause: function() {
521            let e = this.get(0);
522            return e.isReady ? (e.opt.abundance < .2 && this.YTPSetAbundance(.2), e.player.pauseVideo(), e.state = 2, this) : this
523        },
524        seekTo: function(e) {
525            let r = this.get(0);
526            return r.isReady ? (r.player.seekTo(e, !0), this) : this
527        },
528        getPlaybackRate: function() {
529            let e = this.get(0);
530            return e.isReady ? e.player.getPlaybackRate() : this
531        },
532        setPlaybackRate: function(e) {
533            let r = this.get(0);
534            return r.isReady ? (r.player.setPlaybackRate(e), this) : this
535        },
536        setVolume: function(e) {
537            let r = this.get(0);
538            return r.isReady ? (r.opt.vol = e, this.YTPUnmute(), r.player.setVolume(r.opt.vol), r.volumeBar && r.volumeBar.length && r.volumeBar.updateSliderVal(e), this) : this
539        },
540        getVolume: function() {
541            let e = this.get(0);
542            return e.isReady ? e.player.getVolume() : this
543        },
544        toggleVolume: function() {
545            let e = this.get(0);
546            return e.isReady ? (e.isMute ? (jQuery.mbBrowser.mobile || this.YTPSetVolume(e.opt.vol), this.YTPUnmute()) : this.YTPMute(), this) : this
547        },
548        mute: function() {
549            let e = this.get(0);
550            if (!e.isReady) return this;
551            if (e.isMute) return this;
552            e.player.mute(), e.isMute = !0, e.player.setVolume(0), e.volumeBar && e.volumeBar.length && e.volumeBar.width() > 10 && e.volumeBar.updateSliderVal(0), jQuery("#controlBar_" + e.id).find(".mb_YTPMuteUnmute").html(jQuery.mbYTPlayer.controls.unmute), jQuery(e).addClass("isMuted"), e.volumeBar && e.volumeBar.length && e.volumeBar.addClass("muted");
553            let r = jQuery.Event("YTPMuted");
554            return r.time = e.currentTime, e.preventTrigger || jQuery(e).trigger(r), this
555        },
556        unmute: function() {
557            let e = this.get(0);
558            if (!e.isReady) return this;
559            if (!e.isMute) return this;
560            e.player.unMute(), e.isMute = !1, jQuery(e).YTPSetVolume(e.opt.vol), e.volumeBar && e.volumeBar.length && e.volumeBar.updateSliderVal(e.opt.vol > 10 ? e.opt.vol : 10), jQuery("#controlBar_" + e.id).find(".mb_YTPMuteUnmute").html(jQuery.mbYTPlayer.controls.mute), jQuery(e).removeClass("isMuted"), e.volumeBar && e.volumeBar.length && e.volumeBar.removeClass("muted");
561            let r = jQuery.Event("YTPUnmuted");
562            return r.time = e.currentTime, e.preventTrigger || jQuery(e).trigger(r), this
563        },
564        applyFilter: function(e, r) {
565            let t = this.get(0);
566            if (!t.isReady) return this;
567            t.filters[e].value = r, t.filtersEnabled && this.YTPEnableFilters()
568        },
569        applyFilters: function(e) {
570            let r = this,
571                t = r.get(0);
572            if (!t.isReady) return jQuery(t).on("YTPReady", function() {
573                r.YTPApplyFilters(e)
574            }), this;
575            for (let t in e) r.YTPApplyFilter(t, e[t]);
576            r.trigger("YTPFiltersApplied")
577        },
578        toggleFilter: function(e, r) {
579            let t = this.get(0);
580            return t.isReady ? (t.filters[e].value ? t.filters[e].value = 0 : t.filters[e].value = r, t.filtersEnabled && jQuery(t).YTPEnableFilters(), this) : this
581        },
582        toggleFilters: function(e) {
583            let r = this.get(0);
584            return r.isReady ? (r.filtersEnabled ? (jQuery(r).trigger("YTPDisableFilters"), jQuery(r).YTPDisableFilters()) : (jQuery(r).YTPEnableFilters(), jQuery(r).trigger("YTPEnableFilters")), "function" == typeof e && e(r.filtersEnabled), this) : this
585        },
586        disableFilters: function() {
587            let e = this.get(0);
588            if (!e.isReady) return this;
589            let r = jQuery(e.playerEl);
590            return r.css("-webkit-filter", ""), r.css("filter", ""), e.filtersEnabled = !1, this
591        },
592        enableFilters: function() {
593            let e = this.get(0);
594            if (!e.isReady) return this;
595            let r = jQuery(e.playerEl),
596                t = "";
597            for (let r in e.filters) e.filters[r].value && (t += r.replace("_", "-") + "(" + e.filters[r].value + e.filters[r].unit + ") ");
598            return r.css("-webkit-filter", t), r.css("filter", t), e.filtersEnabled = !0, this
599        },
600        removeFilter: function(e, r) {
601            let t = this,
602                a = t.get(0);
603            if (!a.isReady) return this;
604            if ("function" == typeof e && (r = e, e = null), e) t.YTPApplyFilter(e, 0), "function" == typeof r && r(e);
605            else {
606                for (let e in a.filters) a.filters.hasOwnProperty(e) && (t.YTPApplyFilter(e, 0), "function" == typeof r && r(e));
607                a.filters = jQuery.extend(!0, {}, jQuery.mbYTPlayer.defaultFilters)
608            }
609            let o = jQuery.Event("YTPFiltersApplied");
610            return t.trigger(o), this
611        },
612        getFilters: function() {
613            let e = this.get(0);
614            return e.isReady ? e.filters : this
615        },
616        addMask: function(e) {
617            let r = this.get(0);
618            e || (e = r.actualMask);
619            let t = jQuery("<img/>").attr("src", e).on("load", function() {
620                r.overlay.CSSAnimate({
621                    opacity: 0
622                }, r.opt.fadeOnStartTime, function() {
623                    r.hasMask = !0, t.remove(), r.overlay.css({
624                        backgroundImage: "url(" + e + ")",
625                        backgroundRepeat: "no-repeat",
626                        backgroundPosition: "center center",
627                        backgroundSize: "cover"
628                    }), r.overlay.CSSAnimate({
629                        opacity: 1
630                    }, r.opt.fadeOnStartTime)
631                })
632            });
633            return this
634        },
635        removeMask: function() {
636            let e = this.get(0);
637            return e.overlay.CSSAnimate({
638                opacity: 0
639            }, e.opt.fadeOnStartTime, function() {
640                e.hasMask = !1, e.overlay.css({
641                    backgroundImage: "",
642                    backgroundRepeat: "",
643                    backgroundPosition: "",
644                    backgroundSize: ""
645                }), e.overlay.CSSAnimate({
646                    opacity: 1
647                }, e.opt.fadeOnStartTime)
648            }), this
649        },
650        applyMask: function(e) {
651            let r = jQuery(e);
652            if (r.off("YTPTime.mask"), e.opt.mask)
653                if ("string" == typeof e.opt.mask) r.YTPAddMask(e.opt.mask), e.actualMask = e.opt.mask;
654                else if ("object" == typeof e.opt.mask) {
655                for (let r in e.opt.mask) e.opt.mask[r] && (img = jQuery("<img/>").attr("src", e.opt.mask[r]));
656                e.opt.mask[0] && r.YTPAddMask(e.opt.mask[0]), r.on("YTPTime.mask", function(t) {
657                    for (let a in e.opt.mask) t.time === a && (e.opt.mask[a] ? (r.YTPAddMask(e.opt.mask[a]), e.actualMask = e.opt.mask[a]) : r.YTPRemoveMask())
658                })
659            }
660        },
661        toggleMask: function() {
662            let e = this.get(0),
663                r = jQuery(e);
664            return e.hasMask ? r.YTPRemoveMask() : r.YTPAddMask(), this
665        },
666        manageProgress: function() {
667            let e = this.get(0),
668                r = jQuery("#controlBar_" + e.id),
669                t = r.find(".mb_YTPProgress"),
670                a = r.find(".mb_YTPLoaded"),
671                o = r.find(".mb_YTPseekbar"),
672                n = t.outerWidth(),
673                i = Math.floor(e.player.getCurrentTime()),
674                l = Math.floor(e.player.getDuration()),
675                s = i * n / l,
676                u = 100 * e.player.getVideoLoadedFraction();
677            return a.css({
678                left: 0,
679                width: u + "%"
680            }), o.css({
681                left: 0,
682                width: s
683            }), {
684                totalTime: l,
685                currentTime: i
686            }
687        },
688        buildControls: function(YTPlayer) {
689            if (jQuery("#controlBar_" + YTPlayer.id).remove(), !YTPlayer.opt.showControls) return void(YTPlayer.controlBar = !1);
690            if (YTPlayer.opt.showYTLogo = YTPlayer.opt.showYTLogo || YTPlayer.opt.printUrl, jQuery("#controlBar_" + YTPlayer.id).length) return;
691            YTPlayer.controlBar = jQuery("<div/>").attr("id", "controlBar_" + YTPlayer.id).addClass("mb_YTPBar").css({
692                whiteSpace: "noWrap",
693                position: YTPlayer.isBackground ? "fixed" : "absolute",
694                zIndex: YTPlayer.isBackground ? 1e4 : 1e3
695            }).hide().on("click", function(e) {
696                e.stopPropagation()
697            });
698            let buttonBar = jQuery("<div/>").addClass("buttonBar"),
699                playpause = jQuery("<span>" + jQuery.mbYTPlayer.controls.play + "</span>").addClass("mb_YTPPlayPause ytpicon").on("click", function(e) {
700                    e.stopPropagation(), jQuery(YTPlayer).YTPTogglePlay()
701                }),
702                MuteUnmute = jQuery("<span>" + jQuery.mbYTPlayer.controls.mute + "</span>").addClass("mb_YTPMuteUnmute ytpicon").on("click", function(e) {
703                    e.stopPropagation(), jQuery(YTPlayer).YTPToggleVolume()
704                }),
705                volumeBar = jQuery("<div/>").addClass("mb_YTPVolumeBar").css({
706                    display: "inline-block"
707                });
708            YTPlayer.volumeBar = volumeBar;
709            let idx = jQuery("<span/>").addClass("mb_YTPTime"),
710                vURL = YTPlayer.opt.videoURL ? YTPlayer.opt.videoURL : "";
711            vURL.indexOf("http") < 0 && (vURL = "https://www.youtube.com/watch?v=" + YTPlayer.opt.videoURL);
712            let movieUrl = jQuery("<span/>").html(jQuery.mbYTPlayer.controls.ytLogo).addClass("mb_YTPUrl ytpicon").attr("title", "view on YouTube").on("click", function() {
713                    window.open(vURL, "viewOnYT")
714                }),
715                onlyVideo = jQuery("<span/>").html(jQuery.mbYTPlayer.controls.onlyYT).addClass("mb_OnlyYT ytpicon").on("click", function(e) {
716                    e.stopPropagation(), jQuery(YTPlayer).YTPFullscreen(YTPlayer.opt.realFullscreen)
717                }),
718                progressBar = jQuery("<div/>").addClass("mb_YTPProgress").css("position", "absolute").on("click", function(e) {
719                    e.stopPropagation(), timeBar.css({
720                        width: e.clientX - timeBar.offset().left
721                    }), YTPlayer.timeW = e.clientX - timeBar.offset().left, YTPlayer.controlBar.find(".mb_YTPLoaded").css({
722                        width: 0
723                    });
724                    let r = Math.floor(YTPlayer.player.getDuration());
725                    YTPlayer.goto = timeBar.outerWidth() * r / progressBar.outerWidth(), YTPlayer.player.seekTo(parseFloat(YTPlayer.goto), !0), YTPlayer.controlBar.find(".mb_YTPLoaded").css({
726                        width: 0
727                    })
728                }),
729                loadedBar = jQuery("<div/>").addClass("mb_YTPLoaded").css("position", "absolute"),
730                timeBar = jQuery("<div/>").addClass("mb_YTPseekbar").css("position", "absolute");
731            progressBar.append(loadedBar).append(timeBar), buttonBar.append(playpause).append(MuteUnmute).append(volumeBar).append(idx), YTPlayer.opt.showYTLogo && buttonBar.append(movieUrl), (YTPlayer.isBackground || eval(YTPlayer.opt.realFullscreen) && !YTPlayer.isBackground) && buttonBar.append(onlyVideo), YTPlayer.controlBar.append(buttonBar).append(progressBar), YTPlayer.isBackground ? jQuery("body").after(YTPlayer.controlBar) : (YTPlayer.controlBar.addClass("inlinePlayer"), YTPlayer.wrapper.before(YTPlayer.controlBar)), volumeBar.simpleSlider({
732                initialval: YTPlayer.opt.vol,
733                scale: 100,
734                orientation: "h",
735                callback: function(e) {
736                    0 == e.value ? jQuery(YTPlayer).YTPMute() : jQuery(YTPlayer).YTPUnmute(), YTPlayer.player.setVolume(e.value), YTPlayer.isMute || (YTPlayer.opt.vol = e.value)
737                }
738            })
739        },
740        changeCoverImage: function(e) {
741            let r = this.get(0);
742            if (r.opt.coverImage || r.orig_containment_background) {
743                let t = e || (r.opt.coverImage ? "url(" + r.opt.coverImage + ") center center" : r.orig_containment_background);
744                t && r.opt.containment.css({
745                    background: t,
746                    backgroundSize: "cover",
747                    backgroundRepeat: "no-repeat",
748                    backgroundAttachment: "fixed"
749                })
750            }
751            return this
752        },
753        checkForState: function() {
754            let YTPlayer = this.get(0),
755                $YTPlayer = jQuery(YTPlayer);
756            clearInterval(YTPlayer.getState);
757            let interval = 100;
758            if (!jQuery.contains(document, YTPlayer)) return $YTPlayer.YTPPlayerDestroy(), clearInterval(YTPlayer.getState), void clearInterval(YTPlayer.checkForStartAt);
759            jQuery.mbYTPlayer.checkForStart(YTPlayer), YTPlayer.getState = setInterval(function() {
760                let $YTPlayer = jQuery(YTPlayer);
761                if (!YTPlayer.isReady) return;
762                let prog = jQuery(YTPlayer).YTPManageProgress(),
763                    stopAt = YTPlayer.opt.stopAt > YTPlayer.opt.startAt ? YTPlayer.opt.stopAt : 0;
764                if (stopAt = stopAt < YTPlayer.player.getDuration() ? stopAt : 0, YTPlayer.currentTime != prog.currentTime) {
765                    let e = jQuery.Event("YTPTime");
766                    e.time = YTPlayer.currentTime, jQuery(YTPlayer).trigger(e)
767                }
768                if (YTPlayer.currentTime = prog.currentTime, YTPlayer.totalTime = YTPlayer.player.getDuration(), 0 == YTPlayer.player.getVolume() ? $YTPlayer.addClass("isMuted") : $YTPlayer.removeClass("isMuted"), YTPlayer.opt.showControls && (prog.totalTime ? YTPlayer.controlBar.find(".mb_YTPTime").html(jQuery.mbYTPlayer.formatTime(prog.currentTime) + " / " + jQuery.mbYTPlayer.formatTime(prog.totalTime)) : YTPlayer.controlBar.find(".mb_YTPTime").html("-- : -- / -- : --")), eval(YTPlayer.opt.stopMovieOnBlur) && (document.hasFocus() ? document.hasFocus() && !YTPlayer.hasFocus && -1 != YTPlayer.state && 0 != YTPlayer.state && (YTPlayer.hasFocus = !0, YTPlayer.preventTrigger = !0, $YTPlayer.YTPPlay()) : 1 == YTPlayer.state && (YTPlayer.hasFocus = !1, YTPlayer.preventTrigger = !0, $YTPlayer.YTPPause())), YTPlayer.opt.playOnlyIfVisible) {
769                    let e = jQuery.mbYTPlayer.isOnScreen(YTPlayer, YTPlayer.opt.onScreenPercentage);
770                    e || 1 != YTPlayer.state ? e && !YTPlayer.isOnScreen && (YTPlayer.isOnScreen = !0, YTPlayer.player.playVideo()) : (YTPlayer.isOnScreen = !1, $YTPlayer.YTPPause())
771                }
772                if (YTPlayer.controlBar.length && YTPlayer.controlBar.outerWidth() <= 400 && !YTPlayer.isCompact ? (YTPlayer.controlBar.addClass("compact"), YTPlayer.isCompact = !0, !YTPlayer.isMute && YTPlayer.volumeBar && YTPlayer.volumeBar.updateSliderVal(YTPlayer.opt.vol)) : YTPlayer.controlBar.length && YTPlayer.controlBar.outerWidth() > 400 && YTPlayer.isCompact && (YTPlayer.controlBar.removeClass("compact"), YTPlayer.isCompact = !1, !YTPlayer.isMute && YTPlayer.volumeBar && YTPlayer.volumeBar.updateSliderVal(YTPlayer.opt.vol)), YTPlayer.player.getPlayerState() > 0 && (parseFloat(YTPlayer.player.getDuration() - YTPlayer.opt.fadeOnStartTime / 1e3) < YTPlayer.player.getCurrentTime() || stopAt > 0 && parseFloat(YTPlayer.player.getCurrentTime()) >= stopAt)) {
773                    if (YTPlayer.isEnded) return;
774                    if (YTPlayer.isEnded = !0, setTimeout(function() {
775                            YTPlayer.isEnded = !1
776                        }, 1e3), YTPlayer.isList) {
777                        if (!YTPlayer.opt.loop || YTPlayer.opt.loop > 0 && YTPlayer.player.loopTime === YTPlayer.opt.loop - 1) {
778                            YTPlayer.player.loopTime = void 0, clearInterval(YTPlayer.getState);
779                            let e = jQuery.Event("YTPEnd");
780                            return e.time = YTPlayer.currentTime, void jQuery(YTPlayer).trigger(e)
781                        }
782                    } else if (!YTPlayer.opt.loop || YTPlayer.opt.loop > 0 && YTPlayer.player.loopTime === YTPlayer.opt.loop - 1) return YTPlayer.player.loopTime = void 0, YTPlayer.state = 2, $YTPlayer.changeCoverImage(YTPlayer), jQuery(YTPlayer).YTPPause(), void YTPlayer.wrapper.CSSAnimate({
783                        opacity: 0
784                    }, YTPlayer.opt.fadeOnStartTime, function() {
785                        YTPlayer.controlBar.length && YTPlayer.controlBar.find(".mb_YTPPlayPause").html(jQuery.mbYTPlayer.controls.play), $YTPlayer.changeCoverImage();
786                        let e = jQuery.Event("YTPEnd");
787                        e.time = YTPlayer.currentTime, jQuery(YTPlayer).trigger(e), YTPlayer.player.seekTo(YTPlayer.opt.startAt, !0)
788                    });
789                    YTPlayer.player.loopTime = YTPlayer.player.loopTime ? ++YTPlayer.player.loopTime : 1, YTPlayer.opt.startAt = YTPlayer.opt.startAt || 1, YTPlayer.preventTrigger = !0, YTPlayer.state = 2, YTPlayer.player.seekTo(YTPlayer.opt.startAt, !0)
790                }
791            }, interval)
792        },
793        checkForStart: function(YTPlayer) {
794            let $YTPlayer = jQuery(YTPlayer);
795            if (!jQuery.contains(document, YTPlayer)) return void $YTPlayer.YTPPlayerDestroy();
796            if (jQuery.mbYTPlayer.buildControls(YTPlayer), YTPlayer.overlay)
797                if (YTPlayer.opt.addRaster) {
798                    let e = "dot" == YTPlayer.opt.addRaster ? "raster-dot" : "raster";
799                    YTPlayer.overlay.addClass(YTPlayer.isRetina ? e + " retina" : e)
800                } else YTPlayer.overlay.removeClass(function(e, r) {
801                    let t = r.split(" "),
802                        a = [];
803                    return jQuery.each(t, function(e, r) {
804                        /raster.*/.test(r) && a.push(r)
805                    }), a.push("retina"), a.join(" ")
806                });
807            YTPlayer.preventTrigger = !0, YTPlayer.state = 2, YTPlayer.preventTrigger = !0, YTPlayer.player.mute(), YTPlayer.player.playVideo(), YTPlayer.isStarting = !0;
808            let startAt = YTPlayer.start_from_last ? YTPlayer.start_from_last : YTPlayer.opt.startAt ? YTPlayer.opt.startAt : 1;
809            return YTPlayer.preventTrigger = !0, YTPlayer.checkForStartAt = setInterval(function() {
810                YTPlayer.player.mute(), YTPlayer.player.seekTo(startAt, !0);
811                let canPlayVideo = YTPlayer.player.getVideoLoadedFraction() >= startAt / YTPlayer.player.getDuration();
812                if (jQuery.mbBrowser.mobile && (canPlayVideo = !0), YTPlayer.player.getDuration() > 0 && YTPlayer.player.getCurrentTime() >= startAt && canPlayVideo) {
813                    YTPlayer.start_from_last = null, YTPlayer.preventTrigger = !0, $YTPlayer.YTPPause(), clearInterval(YTPlayer.checkForStartAt), "function" == typeof YTPlayer.opt.onReady && YTPlayer.opt.onReady(YTPlayer), YTPlayer.isReady = !0, $YTPlayer.YTPRemoveFilter(), YTPlayer.opt.addFilters ? $YTPlayer.YTPApplyFilters(YTPlayer.opt.addFilters) : $YTPlayer.YTPApplyFilters(), $YTPlayer.YTPEnableFilters();
814                    let YTPready = jQuery.Event("YTPReady");
815                    if (YTPready.time = YTPlayer.currentTime, $YTPlayer.trigger(YTPready), YTPlayer.state = 2, YTPlayer.opt.mute ? $YTPlayer.YTPMute() : YTPlayer.opt.autoPlay ? (console.debug("We muted the audio to make the video 'auto-play' according with the latest vendor policy. The audio will unmute at the first user interaction with the page"), YTPlayer.player.mute(), YTPlayer.forcedMuted = !0, jQuery(document).on("mousedown.YTPstartAudio", function() {
816                            YTPlayer.forcedMuted && (console.debug("AAAAAAA"), YTPlayer.player.unMute(), YTPlayer.forcedMuted = !1, jQuery(document).off("mousedown.YTPstartAudio"))
817                        }), jQuery(window).on("scroll", function() {
818                            console.debug("AAAAA")
819                        })) : YTPlayer.player.unMute(), "undefined" != typeof _gaq && eval(YTPlayer.opt.gaTrack) ? _gaq.push(["_trackEvent", "YTPlayer", "Play", YTPlayer.hasData ? YTPlayer.videoData.title : YTPlayer.videoID.toString()]) : "undefined" != typeof ga && eval(YTPlayer.opt.gaTrack) && ga("send", "event", "YTPlayer", "play", YTPlayer.hasData ? YTPlayer.videoData.title : YTPlayer.videoID.toString()), YTPlayer.opt.autoPlay) {
820                        let e = jQuery.Event("YTPStart");
821                        e.time = YTPlayer.currentTime, jQuery(YTPlayer).trigger(e), YTPlayer.isStarting = !1, "mac" === jQuery.mbBrowser.os.name && jQuery.mbBrowser.safari && jQuery("body").one("mousedown.YTPstart", function() {
822                            $YTPlayer.YTPPlay()
823                        }), $YTPlayer.YTPPlay(), console.timeEnd(YTPTimerLabels.startPlaying)
824                    } else YTPlayer.preventTrigger = !0, $YTPlayer.YTPPause(), YTPlayer.start_from_last && YTPlayer.player.seekTo(startAt, !0), setTimeout(function() {
825                        YTPlayer.preventTrigger = !0, $YTPlayer.YTPPause(), YTPlayer.isPlayer || (YTPlayer.opt.coverImage ? (YTPlayer.wrapper.css({
826                            opacity: 0
827                        }), setTimeout(function() {
828                            $YTPlayer.changeCoverImage()
829                        }, YTPlayer.opt.fadeOnStartTime)) : (jQuery(YTPlayer.playerEl).CSSAnimate({
830                            opacity: 1
831                        }, YTPlayer.opt.fadeOnStartTime), YTPlayer.wrapper.CSSAnimate({
832                            opacity: YTPlayer.isAlone ? 1 : YTPlayer.opt.opacity
833                        }, YTPlayer.opt.fadeOnStartTime))), YTPlayer.isStarting = !1
834                    }, 500), YTPlayer.controlBar.length && YTPlayer.controlBar.find(".mb_YTPPlayPause").html(jQuery.mbYTPlayer.controls.play);
835                    YTPlayer.isPlayer && !YTPlayer.opt.autoPlay && YTPlayer.loading && YTPlayer.loading.length && (YTPlayer.loading.html("Ready"), setTimeout(function() {
836                        YTPlayer.loading.fadeOut()
837                    }, 100)), YTPlayer.controlBar && YTPlayer.controlBar.length && YTPlayer.controlBar.slideDown(1e3)
838                }
839                "mac" === jQuery.mbBrowser.os.name && jQuery.mbBrowser.safari && (YTPlayer.player.playVideo(), startAt >= 0 && YTPlayer.player.seekTo(startAt, !0))
840            }, 100), $YTPlayer
841        },
842        getTime: function() {
843            let e = this.get(0);
844            return jQuery.mbYTPlayer.formatTime(e.currentTime)
845        },
846        getTotalTime: function() {
847            let e = this.get(0);
848            return jQuery.mbYTPlayer.formatTime(e.totalTime)
849        },
850        formatTime: function(e) {
851            let r = Math.floor(e / 60),
852                t = Math.floor(e - 60 * r);
853            return (r <= 9 ? "0" + r : r) + " : " + (t <= 9 ? "0" + t : t)
854        },
855        setAnchor: function(e) {
856            this.optimizeDisplay(e)
857        },
858        getAnchor: function() {
859            return this.get(0).opt.anchor
860        },
861        setAbundance: function(e, r) {
862            let t = this.get(0);
863            return r && (t.opt.abundance = e), this.optimizeDisplay(t.opt.anchor, e), this
864        },
865        getAbundance: function() {
866            return this.get(0).opt.abundance
867        },
868        setOption: function(e, r) {
869            return this.get(0).opt[e] = r, this
870        }
871    }, jQuery.fn.optimizeDisplay = function(anchor, abundanceX) {
872        let YTPlayer = this.get(0),
873            vid = {},
874            el = YTPlayer.wrapper,
875            iframe = jQuery(YTPlayer.playerEl);
876        YTPlayer.opt.anchor = anchor || YTPlayer.opt.anchor, YTPlayer.opt.anchor = "undefined " != typeof YTPlayer.opt.anchor ? YTPlayer.opt.anchor : "center,center";
877        let YTPAlign = YTPlayer.opt.anchor.split(","),
878            ab = abundanceX || YTPlayer.opt.abundance;
879        if (YTPlayer.opt.optimizeDisplay) {
880            let abundance = el.height() * ab,
881                win = {};
882            win.width = el.outerWidth(), win.height = el.outerHeight() + abundance, YTPlayer.opt.ratio = "auto" === YTPlayer.opt.ratio ? 16 / 9 : YTPlayer.opt.ratio, YTPlayer.opt.ratio = eval(YTPlayer.opt.ratio), vid.width = win.width + abundance, vid.height = Math.ceil(vid.width / YTPlayer.opt.ratio), vid.marginTop = Math.ceil(-(vid.height - win.height + abundance) / 2), vid.marginLeft = -abundance / 2;
883            let lowest = vid.height < win.height;
884            lowest && (vid.height = win.height + abundance, vid.width = Math.ceil(vid.height * YTPlayer.opt.ratio), vid.marginTop = -abundance / 2, vid.marginLeft = Math.ceil(-(vid.width - win.width) / 2));
885            for (let e in YTPAlign)
886                if (YTPAlign.hasOwnProperty(e)) {
887                    let r = YTPAlign[e].replace(/ /g, "");
888                    switch (r) {
889                        case "top":
890                            vid.marginTop = -abundance;
891                            break;
892                        case "bottom":
893                            vid.marginTop = Math.ceil(-(vid.height - win.height) - abundance / 2);
894                            break;
895                        case "left":
896                            vid.marginLeft = -abundance;
897                            break;
898                        case "right":
899                            vid.marginLeft = Math.ceil(-(vid.width - win.width) + abundance / 2)
900                    }
901                }
902        } else vid.width = "100%", vid.height = "100%", vid.marginTop = 0, vid.marginLeft = 0;
903        iframe.css({
904            width: vid.width,
905            height: vid.height,
906            marginTop: vid.marginTop,
907            marginLeft: vid.marginLeft,
908            maxWidth: "initial"
909        })
910    }, jQuery.shuffle = function(e) {
911        let r = e.slice(),
912            t = r.length,
913            a = t;
914        for (; a--;) {
915            let e = parseInt(Math.random() * t),
916                o = r[a];
917            r[a] = r[e], r[e] = o
918        }
919        return r
920    }, jQuery.fn.unselectable = function() {
921        return this.each(function() {
922            jQuery(this).css({
923                "-moz-user-select": "none",
924                "-webkit-user-select": "none",
925                "user-select": "none"
926            }).attr("unselectable", "on")
927        })
928    }, jQuery.fn.YTPlayer = jQuery.mbYTPlayer.buildPlayer, jQuery.fn.mb_YTPlayer = jQuery.mbYTPlayer.buildPlayer, jQuery.fn.YTPCheckForState = jQuery.mbYTPlayer.checkForState, jQuery.fn.YTPGetPlayer = jQuery.mbYTPlayer.getPlayer, jQuery.fn.YTPGetVideoID = jQuery.mbYTPlayer.getVideoID, jQuery.fn.YTPGetPlaylistID = jQuery.mbYTPlayer.getPlaylistID, jQuery.fn.YTPChangeVideo = jQuery.fn.YTPChangeMovie = jQuery.mbYTPlayer.changeVideo, jQuery.fn.YTPPlayerDestroy = jQuery.mbYTPlayer.playerDestroy, jQuery.fn.YTPPlay = jQuery.mbYTPlayer.play, jQuery.fn.YTPTogglePlay = jQuery.mbYTPlayer.togglePlay, jQuery.fn.YTPStop = jQuery.mbYTPlayer.stop, jQuery.fn.YTPPause = jQuery.mbYTPlayer.pause, jQuery.fn.YTPSeekTo = jQuery.mbYTPlayer.seekTo, jQuery.fn.YTPGetPlaybackRate = jQuery.mbYTPlayer.getPlaybackRate, jQuery.fn.YTPSetPlaybackRate = jQuery.mbYTPlayer.setPlaybackRate, jQuery.fn.changeCoverImage = jQuery.mbYTPlayer.changeCoverImage, jQuery.fn.YTPlaylist = jQuery.mbYTPlayer.playlist, jQuery.fn.YTPPlayNext = jQuery.mbYTPlayer.playNext, jQuery.fn.YTPPlayPrev = jQuery.mbYTPlayer.playPrev, jQuery.fn.YTPPlayIndex = jQuery.mbYTPlayer.playIndex, jQuery.fn.YTPMute = jQuery.mbYTPlayer.mute, jQuery.fn.YTPUnmute = jQuery.mbYTPlayer.unmute, jQuery.fn.YTPToggleVolume = jQuery.mbYTPlayer.toggleVolume, jQuery.fn.YTPSetVolume = jQuery.mbYTPlayer.setVolume, jQuery.fn.YTPGetVolume = jQuery.mbYTPlayer.getVolume, jQuery.fn.YTPGetVideoData = jQuery.mbYTPlayer.getVideoData, jQuery.fn.YTPFullscreen = jQuery.mbYTPlayer.fullscreen, jQuery.fn.YTPToggleLoops = jQuery.mbYTPlayer.toggleLoops, jQuery.fn.YTPManageProgress = jQuery.mbYTPlayer.manageProgress, jQuery.fn.YTPSetVideoQuality = jQuery.mbYTPlayer.setVideoQuality, jQuery.fn.YTPGetVideoQuality = jQuery.mbYTPlayer.getVideoQuality, jQuery.fn.YTPApplyFilter = jQuery.mbYTPlayer.applyFilter, jQuery.fn.YTPApplyFilters = jQuery.mbYTPlayer.applyFilters, jQuery.fn.YTPToggleFilter = jQuery.mbYTPlayer.toggleFilter, jQuery.fn.YTPToggleFilters = jQuery.mbYTPlayer.toggleFilters, jQuery.fn.YTPRemoveFilter = jQuery.mbYTPlayer.removeFilter, jQuery.fn.YTPDisableFilters = jQuery.mbYTPlayer.disableFilters, jQuery.fn.YTPEnableFilters = jQuery.mbYTPlayer.enableFilters, jQuery.fn.YTPGetFilters = jQuery.mbYTPlayer.getFilters, jQuery.fn.YTPGetTime = jQuery.mbYTPlayer.getTime, jQuery.fn.YTPGetTotalTime = jQuery.mbYTPlayer.getTotalTime, jQuery.fn.YTPAddMask = jQuery.mbYTPlayer.addMask, jQuery.fn.YTPRemoveMask = jQuery.mbYTPlayer.removeMask, jQuery.fn.YTPToggleMask = jQuery.mbYTPlayer.toggleMask, jQuery.fn.YTPGetAbundance = jQuery.mbYTPlayer.getAbundance, jQuery.fn.YTPSetAbundance = jQuery.mbYTPlayer.setAbundance, jQuery.fn.YTPSetAnchor = jQuery.mbYTPlayer.setAnchor, jQuery.fn.YTPGetAnchor = jQuery.mbYTPlayer.getAnchor, jQuery.fn.YTPSetOption = jQuery.mbYTPlayer.setOption
929}(jQuery, ytp);
930var nAgt = navigator.userAgent;
931
932function isTouchSupported() {
933    var e = nAgt.msMaxTouchPoints,
934        r = "ontouchstart" in document.createElement("div");
935    return !(!e && !r)
936}
937jQuery.browser = jQuery.browser || {}, jQuery.browser.mozilla = !1, jQuery.browser.webkit = !1, jQuery.browser.opera = !1, jQuery.browser.safari = !1, jQuery.browser.chrome = !1, jQuery.browser.androidStock = !1, jQuery.browser.msie = !1, jQuery.browser.edge = !1, jQuery.browser.ua = nAgt;
938var getOS = function() {
939        var e = {
940            version: "Unknown version",
941            name: "Unknown OS"
942        };
943        return -1 != navigator.appVersion.indexOf("Win") && (e.name = "Windows"), -1 != navigator.appVersion.indexOf("Mac") && 0 > navigator.appVersion.indexOf("Mobile") && (e.name = "Mac"), -1 != navigator.appVersion.indexOf("Linux") && (e.name = "Linux"), /Mac OS X/.test(nAgt) && !/Mobile/.test(nAgt) && (e.version = /Mac OS X ([\._\d]+)/.exec(nAgt)[1], e.version = e.version.replace(/_/g, ".").substring(0, 5)), /Windows/.test(nAgt) && (e.version = "Unknown.Unknown"), /Windows NT 5.1/.test(nAgt) && (e.version = "5.1"), /Windows NT 6.0/.test(nAgt) && (e.version = "6.0"), /Windows NT 6.1/.test(nAgt) && (e.version = "6.1"), /Windows NT 6.2/.test(nAgt) && (e.version = "6.2"), /Windows NT 10.0/.test(nAgt) && (e.version = "10.0"), /Linux/.test(nAgt) && /Linux/.test(nAgt) && (e.version = "Unknown.Unknown"), e.name = e.name.toLowerCase(), e.major_version = "Unknown", e.minor_version = "Unknown", "Unknown.Unknown" != e.version && (e.major_version = parseFloat(e.version.split(".")[0]), e.minor_version = parseFloat(e.version.split(".")[1])), e
944    },
945    nameOffset, verOffset, ix;
946if (jQuery.browser.os = getOS(), jQuery.browser.hasTouch = isTouchSupported(), jQuery.browser.name = navigator.appName, jQuery.browser.fullVersion = "" + parseFloat(navigator.appVersion), jQuery.browser.majorVersion = parseInt(navigator.appVersion, 10), -1 != (verOffset = nAgt.indexOf("Opera"))) jQuery.browser.opera = !0, jQuery.browser.name = "Opera", jQuery.browser.fullVersion = nAgt.substring(verOffset + 6), -1 != (verOffset = nAgt.indexOf("Version")) && (jQuery.browser.fullVersion = nAgt.substring(verOffset + 8));
947else if (-1 != (verOffset = nAgt.indexOf("OPR"))) jQuery.browser.opera = !0, jQuery.browser.name = "Opera", jQuery.browser.fullVersion = nAgt.substring(verOffset + 4);
948else if (-1 != (verOffset = nAgt.indexOf("MSIE"))) jQuery.browser.msie = !0, jQuery.browser.name = "Microsoft Internet Explorer", jQuery.browser.fullVersion = nAgt.substring(verOffset + 5);
949else if (-1 != nAgt.indexOf("Trident")) {
950    jQuery.browser.msie = !0, jQuery.browser.name = "Microsoft Internet Explorer";
951    var start = nAgt.indexOf("rv:") + 3,
952        end = start + 4;
953    jQuery.browser.fullVersion = nAgt.substring(start, end)
954} else -1 != (verOffset = nAgt.indexOf("Edge")) ? (jQuery.browser.edge = !0, jQuery.browser.name = "Microsoft Edge", jQuery.browser.fullVersion = nAgt.substring(verOffset + 5)) : -1 != (verOffset = nAgt.indexOf("Chrome")) ? (jQuery.browser.webkit = !0, jQuery.browser.chrome = !0, jQuery.browser.name = "Chrome", jQuery.browser.fullVersion = nAgt.substring(verOffset + 7)) : -1 < nAgt.indexOf("mozilla/5.0") && -1 < nAgt.indexOf("android ") && -1 < nAgt.indexOf("applewebkit") && !(-1 < nAgt.indexOf("chrome")) ? (verOffset = nAgt.indexOf("Chrome"), jQuery.browser.webkit = !0, jQuery.browser.androidStock = !0, jQuery.browser.name = "androidStock", jQuery.browser.fullVersion = nAgt.substring(verOffset + 7)) : -1 != (verOffset = nAgt.indexOf("Safari")) ? (jQuery.browser.webkit = !0, jQuery.browser.safari = !0, jQuery.browser.name = "Safari", jQuery.browser.fullVersion = nAgt.substring(verOffset + 7), -1 != (verOffset = nAgt.indexOf("Version")) && (jQuery.browser.fullVersion = nAgt.substring(verOffset + 8))) : -1 != (verOffset = nAgt.indexOf("AppleWebkit")) ? (jQuery.browser.webkit = !0, jQuery.browser.safari = !0, jQuery.browser.name = "Safari", jQuery.browser.fullVersion = nAgt.substring(verOffset + 7), -1 != (verOffset = nAgt.indexOf("Version")) && (jQuery.browser.fullVersion = nAgt.substring(verOffset + 8))) : -1 != (verOffset = nAgt.indexOf("Firefox")) ? (jQuery.browser.mozilla = !0, jQuery.browser.name = "Firefox", jQuery.browser.fullVersion = nAgt.substring(verOffset + 8)) : (nameOffset = nAgt.lastIndexOf(" ") + 1) < (verOffset = nAgt.lastIndexOf("/")) && (jQuery.browser.name = nAgt.substring(nameOffset, verOffset), jQuery.browser.fullVersion = nAgt.substring(verOffset + 1), jQuery.browser.name.toLowerCase() == jQuery.browser.name.toUpperCase() && (jQuery.browser.name = navigator.appName));
955
956function uncamel(e) {
957    return e.replace(/([A-Z])/g, function(e) {
958        return "-" + e.toLowerCase()
959    })
960}
961
962function setUnit(e, r) {
963    return "string" != typeof e || e.match(/^[\-0-9\.]+jQuery/) ? "" + e + r : e
964}
965
966function setFilter(e, r, t) {
967    var a = uncamel(r),
968        o = jQuery.browser.mozilla ? "" : jQuery.CSS.sfx;
969    e[o + "filter"] = e[o + "filter"] || "", t = setUnit(t > jQuery.CSS.filters[r].max ? jQuery.CSS.filters[r].max : t, jQuery.CSS.filters[r].unit), e[o + "filter"] += a + "(" + t + ") ", delete e[r]
970} - 1 != (ix = jQuery.browser.fullVersion.indexOf(";")) && (jQuery.browser.fullVersion = jQuery.browser.fullVersion.substring(0, ix)), -1 != (ix = jQuery.browser.fullVersion.indexOf(" ")) && (jQuery.browser.fullVersion = jQuery.browser.fullVersion.substring(0, ix)), jQuery.browser.majorVersion = parseInt("" + jQuery.browser.fullVersion, 10), isNaN(jQuery.browser.majorVersion) && (jQuery.browser.fullVersion = "" + parseFloat(navigator.appVersion), jQuery.browser.majorVersion = parseInt(navigator.appVersion, 10)), jQuery.browser.version = jQuery.browser.majorVersion, jQuery.browser.android = /Android/i.test(nAgt), jQuery.browser.blackberry = /BlackBerry|BB|PlayBook/i.test(nAgt), jQuery.browser.ios = /iPhone|iPad|iPod|webOS/i.test(nAgt), jQuery.browser.operaMobile = /Opera Mini/i.test(nAgt), jQuery.browser.windowsMobile = /IEMobile|Windows Phone/i.test(nAgt), jQuery.browser.kindle = /Kindle|Silk/i.test(nAgt), jQuery.browser.mobile = jQuery.browser.android || jQuery.browser.blackberry || jQuery.browser.ios || jQuery.browser.windowsMobile || jQuery.browser.operaMobile || jQuery.browser.kindle, jQuery.isMobile = jQuery.browser.mobile, jQuery.isTablet = jQuery.browser.mobile && 765 < jQuery(window).width(), jQuery.isAndroidDefault = jQuery.browser.android && !/chrome/i.test(nAgt), jQuery.mbBrowser = jQuery.browser, jQuery.browser.versionCompare = function(e, r) {
971        if ("stringstring" != typeof e + typeof r) return !1;
972        for (var t = e.split("."), a = r.split("."), o = 0, n = Math.max(t.length, a.length); o < n; o++) {
973            if (t[o] && !a[o] && 0 < parseInt(t[o]) || parseInt(t[o]) > parseInt(a[o])) return 1;
974            if (a[o] && !t[o] && 0 < parseInt(a[o]) || parseInt(t[o]) < parseInt(a[o])) return -1
975        }
976        return 0
977    }, jQuery.support.CSStransition = function() {
978        var e = (document.body || document.documentElement).style;
979        return void 0 !== e.transition || void 0 !== e.WebkitTransition || void 0 !== e.MozTransition || void 0 !== e.MsTransition || void 0 !== e.OTransition
980    }(), jQuery.CSS = {
981        name: "mb.CSSAnimate",
982        author: "Matteo Bicocchi",
983        version: "2.0.0",
984        transitionEnd: "transitionEnd",
985        sfx: "",
986        filters: {
987            blur: {
988                min: 0,
989                max: 100,
990                unit: "px"
991            },
992            brightness: {
993                min: 0,
994                max: 400,
995                unit: "%"
996            },
997            contrast: {
998                min: 0,
999                max: 400,
1000                unit: "%"
1001            },
1002            grayscale: {
1003                min: 0,
1004                max: 100,
1005                unit: "%"
1006            },
1007            hueRotate: {
1008                min: 0,
1009                max: 360,
1010                unit: "deg"
1011            },
1012            invert: {
1013                min: 0,
1014                max: 100,
1015                unit: "%"
1016            },
1017            saturate: {
1018                min: 0,
1019                max: 400,
1020                unit: "%"
1021            },
1022            sepia: {
1023                min: 0,
1024                max: 100,
1025                unit: "%"
1026            }
1027        },
1028        normalizeCss: function(e) {
1029            var r = jQuery.extend(!0, {}, e);
1030            for (var t in jQuery.browser.webkit || jQuery.browser.opera ? jQuery.CSS.sfx = "-webkit-" : jQuery.browser.mozilla ? jQuery.CSS.sfx = "-moz-" : jQuery.browser.msie && (jQuery.CSS.sfx = "-ms-"), jQuery.CSS.sfx = "", r) {
1031                if ("transform" === t && (r[jQuery.CSS.sfx + "transform"] = r[t], delete r[t]), "transform-origin" === t && (r[jQuery.CSS.sfx + "transform-origin"] = e[t], delete r[t]), "filter" !== t || jQuery.browser.mozilla || (r[jQuery.CSS.sfx + "filter"] = e[t], delete r[t]), "blur" === t && setFilter(r, "blur", e[t]), "brightness" === t && setFilter(r, "brightness", e[t]), "contrast" === t && setFilter(r, "contrast", e[t]), "grayscale" === t && setFilter(r, "grayscale", e[t]), "hueRotate" === t && setFilter(r, "hueRotate", e[t]), "invert" === t && setFilter(r, "invert", e[t]), "saturate" === t && setFilter(r, "saturate", e[t]), "sepia" === t && setFilter(r, "sepia", e[t]), "x" === t) {
1032                    var a = jQuery.CSS.sfx + "transform";
1033                    r[a] = r[a] || "", r[a] += " translateX(" + setUnit(e[t], "px") + ")", delete r[t]
1034                }
1035                "y" === t && (r[a = jQuery.CSS.sfx + "transform"] = r[a] || "", r[a] += " translateY(" + setUnit(e[t], "px") + ")", delete r[t]), "z" === t && (r[a = jQuery.CSS.sfx + "transform"] = r[a] || "", r[a] += " translateZ(" + setUnit(e[t], "px") + ")", delete r[t]), "rotate" === t && (r[a = jQuery.CSS.sfx + "transform"] = r[a] || "", r[a] += " rotate(" + setUnit(e[t], "deg") + ")", delete r[t]), "rotateX" === t && (r[a = jQuery.CSS.sfx + "transform"] = r[a] || "", r[a] += " rotateX(" + setUnit(e[t], "deg") + ")", delete r[t]), "rotateY" === t && (r[a = jQuery.CSS.sfx + "transform"] = r[a] || "", r[a] += " rotateY(" + setUnit(e[t], "deg") + ")", delete r[t]), "rotateZ" === t && (r[a = jQuery.CSS.sfx + "transform"] = r[a] || "", r[a] += " rotateZ(" + setUnit(e[t], "deg") + ")", delete r[t]), "scale" === t && (r[a = jQuery.CSS.sfx + "transform"] = r[a] || "", r[a] += " scale(" + setUnit(e[t], "") + ")", delete r[t]), "scaleX" === t && (r[a = jQuery.CSS.sfx + "transform"] = r[a] || "", r[a] += " scaleX(" + setUnit(e[t], "") + ")", delete r[t]), "scaleY" === t && (r[a = jQuery.CSS.sfx + "transform"] = r[a] || "", r[a] += " scaleY(" + setUnit(e[t], "") + ")", delete r[t]), "scaleZ" === t && (r[a = jQuery.CSS.sfx + "transform"] = r[a] || "", r[a] += " scaleZ(" + setUnit(e[t], "") + ")", delete r[t]), "skew" === t && (r[a = jQuery.CSS.sfx + "transform"] = r[a] || "", r[a] += " skew(" + setUnit(e[t], "deg") + ")", delete r[t]), "skewX" === t && (r[a = jQuery.CSS.sfx + "transform"] = r[a] || "", r[a] += " skewX(" + setUnit(e[t], "deg") + ")", delete r[t]), "skewY" === t && (r[a = jQuery.CSS.sfx + "transform"] = r[a] || "", r[a] += " skewY(" + setUnit(e[t], "deg") + ")", delete r[t]), "perspective" === t && (r[a = jQuery.CSS.sfx + "transform"] = r[a] || "", r[a] += " perspective(" + setUnit(e[t], "px") + ")", delete r[t])
1036            }
1037            return r
1038        },
1039        getProp: function(e) {
1040            var r, t = [];
1041            for (r in e) 0 > t.indexOf(r) && t.push(uncamel(r));
1042            return t.join(",")
1043        },
1044        animate: function(e, r, t, a, o) {
1045            return this.each(function() {
1046                function n() {
1047                    i.called = !0, i.CSSAIsRunning = !1, l.off(jQuery.CSS.transitionEnd + "." + i.id), clearTimeout(i.timeout), l.css(jQuery.CSS.sfx + "transition", ""), "function" == typeof o && o.apply(i), "function" == typeof i.CSSqueue && (i.CSSqueue(), i.CSSqueue = null)
1048                }
1049                var i = this,
1050                    l = jQuery(this);
1051                i.id = i.id || "CSSA_" + (new Date).getTime();
1052                var s = s || {
1053                    type: "noEvent"
1054                };
1055                if (i.CSSAIsRunning && i.eventType == s.type && !jQuery.browser.msie && 9 >= jQuery.browser.version) i.CSSqueue = function() {
1056                    l.CSSAnimate(e, r, t, a, o)
1057                };
1058                else if (i.CSSqueue = null, i.eventType = s.type, 0 !== l.length && e) {
1059                    if (e = jQuery.normalizeCss(e), i.CSSAIsRunning = !0, "function" == typeof r && (o = r, r = jQuery.fx.speeds._default), "function" == typeof t && (a = t, t = 0), "string" == typeof t && (o = t, t = 0), "function" == typeof a && (o = a, a = "cubic-bezier(0.65,0.03,0.36,0.72)"), "string" == typeof r)
1060                        for (var u in jQuery.fx.speeds) {
1061                            if (r == u) {
1062                                r = jQuery.fx.speeds[u];
1063                                break
1064                            }
1065                            r = jQuery.fx.speeds._default
1066                        }
1067                    if (r || (r = jQuery.fx.speeds._default), "string" == typeof o && (a = o, o = null), jQuery.support.CSStransition) {
1068                        var y = {
1069                            default: "ease",
1070                            in: "ease-in",
1071                            out: "ease-out",
1072                            "in-out": "ease-in-out",
1073                            snap: "cubic-bezier(0,1,.5,1)",
1074                            easeOutCubic: "cubic-bezier(.215,.61,.355,1)",
1075                            easeInOutCubic: "cubic-bezier(.645,.045,.355,1)",
1076                            easeInCirc: "cubic-bezier(.6,.04,.98,.335)",
1077                            easeOutCirc: "cubic-bezier(.075,.82,.165,1)",
1078                            easeInOutCirc: "cubic-bezier(.785,.135,.15,.86)",
1079                            easeInExpo: "cubic-bezier(.95,.05,.795,.035)",
1080                            easeOutExpo: "cubic-bezier(.19,1,.22,1)",
1081                            easeInOutExpo: "cubic-bezier(1,0,0,1)",
1082                            easeInQuad: "cubic-bezier(.55,.085,.68,.53)",
1083                            easeOutQuad: "cubic-bezier(.25,.46,.45,.94)",
1084                            easeInOutQuad: "cubic-bezier(.455,.03,.515,.955)",
1085                            easeInQuart: "cubic-bezier(.895,.03,.685,.22)",
1086                            easeOutQuart: "cubic-bezier(.165,.84,.44,1)",
1087                            easeInOutQuart: "cubic-bezier(.77,0,.175,1)",
1088                            easeInQuint: "cubic-bezier(.755,.05,.855,.06)",
1089                            easeOutQuint: "cubic-bezier(.23,1,.32,1)",
1090                            easeInOutQuint: "cubic-bezier(.86,0,.07,1)",
1091                            easeInSine: "cubic-bezier(.47,0,.745,.715)",
1092                            easeOutSine: "cubic-bezier(.39,.575,.565,1)",
1093                            easeInOutSine: "cubic-bezier(.445,.05,.55,.95)",
1094                            easeInBack: "cubic-bezier(.6,-.28,.735,.045)",
1095                            easeOutBack: "cubic-bezier(.175, .885,.32,1.275)",
1096                            easeInOutBack: "cubic-bezier(.68,-.55,.265,1.55)"
1097                        };
1098                        y[a] && (a = y[a]), l.off(jQuery.CSS.transitionEnd + "." + i.id), y = jQuery.CSS.getProp(e);
1099                        var d = {};
1100                        jQuery.extend(d, e), d[jQuery.CSS.sfx + "transition-property"] = y, d[jQuery.CSS.sfx + "transition-duration"] = r + "ms", d[jQuery.CSS.sfx + "transition-delay"] = t + "ms", d[jQuery.CSS.sfx + "transition-timing-function"] = a, setTimeout(function() {
1101                            l.one(jQuery.CSS.transitionEnd + "." + i.id, n), l.css(d)
1102                        }, 1), i.timeout = setTimeout(function() {
1103                            i.called || !o ? (i.called = !1, i.CSSAIsRunning = !1) : (l.css(jQuery.CSS.sfx + "transition", ""), o.apply(i), i.CSSAIsRunning = !1, "function" == typeof i.CSSqueue && (i.CSSqueue(), i.CSSqueue = null))
1104                        }, r + t + 10)
1105                    } else {
1106                        for (y in e) "transform" === y && delete e[y], "filter" === y && delete e[y], "transform-origin" === y && delete e[y], "auto" === e[y] && delete e[y], "x" === y && (s = e[y], e[u = "left"] = s, delete e[y]), "y" === y && (s = e[y], e[u = "top"] = s, delete e[y]), "-ms-transform" !== y && "-ms-filter" !== y || delete e[y];
1107                        l.delay(t).animate(e, r, o)
1108                    }
1109                }
1110            })
1111        }
1112    }, jQuery.fn.CSSAnimate = jQuery.CSS.animate, jQuery.normalizeCss = jQuery.CSS.normalizeCss, jQuery.fn.css3 = function(e) {
1113        return this.each(function() {
1114            var r = jQuery(this),
1115                t = jQuery.normalizeCss(e);
1116            r.css(t)
1117        })
1118    },
1119    function(e) {
1120        e.simpleSlider = {
1121            defaults: {
1122                initialval: 0,
1123                maxval: 100,
1124                orientation: "h",
1125                readonly: !1,
1126                callback: !1
1127            },
1128            events: {
1129                start: e.browser.mobile ? "touchstart" : "mousedown",
1130                end: e.browser.mobile ? "touchend" : "mouseup",
1131                move: e.browser.mobile ? "touchmove" : "mousemove"
1132            },
1133            init: function(r) {
1134                return this.each(function() {
1135                    var t = this,
1136                        a = e(t);
1137                    a.addClass("simpleSlider"), t.opt = {}, e.extend(t.opt, e.simpleSlider.defaults, r), e.extend(t.opt, a.data());
1138                    var o = "h" === t.opt.orientation ? "horizontal" : "vertical";
1139                    o = e("<div/>").addClass("level").addClass(o), a.prepend(o), t.level = o, a.css({
1140                        cursor: "default"
1141                    }), "auto" == t.opt.maxval && (t.opt.maxval = e(t).outerWidth()), a.updateSliderVal(), t.opt.readonly || (a.on(e.simpleSlider.events.start, function(r) {
1142                        e.browser.mobile && (r = r.changedTouches[0]), t.canSlide = !0, a.updateSliderVal(r), "h" === t.opt.orientation ? a.css({
1143                            cursor: "col-resize"
1144                        }) : a.css({
1145                            cursor: "row-resize"
1146                        }), t.lastVal = t.val, e.browser.mobile || (r.preventDefault(), r.stopPropagation())
1147                    }), e(document).on(e.simpleSlider.events.move, function(r) {
1148                        e.browser.mobile && (r = r.changedTouches[0]), t.canSlide && (e(document).css({
1149                            cursor: "default"
1150                        }), a.updateSliderVal(r), e.browser.mobile || (r.preventDefault(), r.stopPropagation()))
1151                    }).on(e.simpleSlider.events.end, function() {
1152                        e(document).css({
1153                            cursor: "auto"
1154                        }), t.canSlide = !1, a.css({
1155                            cursor: "auto"
1156                        })
1157                    }))
1158                })
1159            },
1160            updateSliderVal: function(r) {
1161                var t = this.get(0);
1162                if (t.opt) {
1163                    t.opt.initialval = "number" == typeof t.opt.initialval ? t.opt.initialval : t.opt.initialval(t);
1164                    var a = e(t).outerWidth(),
1165                        o = e(t).outerHeight();
1166                    t.x = "object" == typeof r ? r.clientX + document.body.scrollLeft - this.offset().left : "number" == typeof r ? r * a / t.opt.maxval : t.opt.initialval * a / t.opt.maxval, t.y = "object" == typeof r ? r.clientY + document.body.scrollTop - this.offset().top : "number" == typeof r ? (t.opt.maxval - t.opt.initialval - r) * o / t.opt.maxval : t.opt.initialval * o / t.opt.maxval, t.y = this.outerHeight() - t.y, t.scaleX = t.x * t.opt.maxval / a, t.scaleY = t.y * t.opt.maxval / o, t.outOfRangeX = t.scaleX > t.opt.maxval ? t.scaleX - t.opt.maxval : 0 > t.scaleX ? t.scaleX : 0, t.outOfRangeY = t.scaleY > t.opt.maxval ? t.scaleY - t.opt.maxval : 0 > t.scaleY ? t.scaleY : 0, t.outOfRange = "h" === t.opt.orientation ? t.outOfRangeX : t.outOfRangeY, t.value = void 0 !== r ? "h" === t.opt.orientation ? t.x >= this.outerWidth() ? t.opt.maxval : 0 >= t.x ? 0 : t.scaleX : t.y >= this.outerHeight() ? t.opt.maxval : 0 >= t.y ? 0 : t.scaleY : "h" === t.opt.orientation ? t.scaleX : t.scaleY, "h" === t.opt.orientation ? t.level.width(Math.floor(100 * t.x / a) + "%") : t.level.height(Math.floor(100 * t.y / o)), t.lastVal === t.value && ("h" === t.opt.orientation && (t.x >= this.outerWidth() || 0 >= t.x) || "h" !== t.opt.orientation && (t.y >= this.outerHeight() || 0 >= t.y)) || ("function" == typeof t.opt.callback && t.opt.callback(t), t.lastVal = t.value)
1167                }
1168            }
1169        }, e.fn.simpleSlider = e.simpleSlider.init, e.fn.updateSliderVal = e.simpleSlider.updateSliderVal
1170    }(jQuery),
1171    function(e) {
1172        e.mbCookie = {
1173            set: function(e, r, t, a) {
1174                "object" == typeof r && (r = JSON.stringify(r)), a = a ? "; domain=" + a : "";
1175                var o = new Date,
1176                    n = "";
1177                0 < t && (o.setTime(o.getTime() + 864e5 * t), n = "; expires=" + o.toGMTString()), document.cookie = e + "=" + r + n + "; path=/" + a
1178            },
1179            get: function(e) {
1180                e += "=";
1181                for (var r = document.cookie.split(";"), t = 0; t < r.length; t++) {
1182                    for (var a = r[t];
1183                        " " == a.charAt(0);) a = a.substring(1, a.length);
1184                    if (0 == a.indexOf(e)) try {
1185                        return JSON.parse(a.substring(e.length, a.length))
1186                    } catch (r) {
1187                        return a.substring(e.length, a.length)
1188                    }
1189                }
1190                return null
1191            },
1192            remove: function(r) {
1193                e.mbCookie.set(r, "", -1)
1194            }
1195        }, e.mbStorage = {
1196            set: function(e, r) {
1197                "object" == typeof r && (r = JSON.stringify(r)), localStorage.setItem(e, r)
1198            },
1199            get: function(e) {
1200                if (!localStorage[e]) return null;
1201                try {
1202                    return JSON.parse(localStorage[e])
1203                } catch (r) {
1204                    return localStorage[e]
1205                }
1206            },
1207            remove: function(e) {
1208                e ? localStorage.removeItem(e) : localStorage.clear()
1209            }
1210        }
1211    }(jQuery);
1212var nAgt = navigator.userAgent;
1213
1214function isTouchSupported() {
1215    var e = nAgt.msMaxTouchPoints,
1216        r = "ontouchstart" in document.createElement("div");
1217    return !(!e && !r)
1218}
1219jQuery.mbBrowser = {}, jQuery.mbBrowser.mozilla = !1, jQuery.mbBrowser.webkit = !1, jQuery.mbBrowser.opera = !1, jQuery.mbBrowser.safari = !1, jQuery.mbBrowser.chrome = !1, jQuery.mbBrowser.androidStock = !1, jQuery.mbBrowser.msie = !1, jQuery.mbBrowser.edge = !1, jQuery.mbBrowser.ua = nAgt;
1220var getOS = function() {
1221        var e = {
1222            version: "Unknown version",
1223            name: "Unknown OS"
1224        };
1225        return -1 != navigator.appVersion.indexOf("Win") && (e.name = "Windows"), -1 != navigator.appVersion.indexOf("Mac") && 0 > navigator.appVersion.indexOf("Mobile") && (e.name = "Mac"), -1 != navigator.appVersion.indexOf("Linux") && (e.name = "Linux"), /Mac OS X/.test(nAgt) && !/Mobile/.test(nAgt) && (e.version = /Mac OS X ([\._\d]+)/.exec(nAgt)[1], e.version = e.version.replace(/_/g, ".").substring(0, 5)), /Windows/.test(nAgt) && (e.version = "Unknown.Unknown"), /Windows NT 5.1/.test(nAgt) && (e.version = "5.1"), /Windows NT 6.0/.test(nAgt) && (e.version = "6.0"), /Windows NT 6.1/.test(nAgt) && (e.version = "6.1"), /Windows NT 6.2/.test(nAgt) && (e.version = "6.2"), /Windows NT 10.0/.test(nAgt) && (e.version = "10.0"), /Linux/.test(nAgt) && /Linux/.test(nAgt) && (e.version = "Unknown.Unknown"), e.name = e.name.toLowerCase(), e.major_version = "Unknown", e.minor_version = "Unknown", "Unknown.Unknown" != e.version && (e.major_version = parseFloat(e.version.split(".")[0]), e.minor_version = parseFloat(e.version.split(".")[1])), e
1226    },
1227    nameOffset, verOffset, ix;
1228if (jQuery.mbBrowser.os = getOS(), jQuery.mbBrowser.hasTouch = isTouchSupported(), jQuery.mbBrowser.name = navigator.appName, jQuery.mbBrowser.fullVersion = "" + parseFloat(navigator.appVersion), jQuery.mbBrowser.majorVersion = parseInt(navigator.appVersion, 10), -1 != (verOffset = nAgt.indexOf("Opera"))) jQuery.mbBrowser.opera = !0, jQuery.mbBrowser.name = "Opera", jQuery.mbBrowser.fullVersion = nAgt.substring(verOffset + 6), -1 != (verOffset = nAgt.indexOf("Version")) && (jQuery.mbBrowser.fullVersion = nAgt.substring(verOffset + 8));
1229else if (-1 != (verOffset = nAgt.indexOf("OPR"))) jQuery.mbBrowser.opera = !0, jQuery.mbBrowser.name = "Opera", jQuery.mbBrowser.fullVersion = nAgt.substring(verOffset + 4);
1230else if (-1 != (verOffset = nAgt.indexOf("MSIE"))) jQuery.mbBrowser.msie = !0, jQuery.mbBrowser.name = "Microsoft Internet Explorer", jQuery.mbBrowser.fullVersion = nAgt.substring(verOffset + 5);
1231else if (-1 != nAgt.indexOf("Trident")) {
1232    jQuery.mbBrowser.msie = !0, jQuery.mbBrowser.name = "Microsoft Internet Explorer";
1233    var start = nAgt.indexOf("rv:") + 3,
1234        end = start + 4;
1235    jQuery.mbBrowser.fullVersion = nAgt.substring(start, end)
1236} else -1 != (verOffset = nAgt.indexOf("Edge")) ? (jQuery.mbBrowser.edge = !0, jQuery.mbBrowser.name = "Microsoft Edge", jQuery.mbBrowser.fullVersion = nAgt.substring(verOffset + 5)) : -1 != (verOffset = nAgt.indexOf("Chrome")) ? (jQuery.mbBrowser.webkit = !0, jQuery.mbBrowser.chrome = !0, jQuery.mbBrowser.name = "Chrome", jQuery.mbBrowser.fullVersion = nAgt.substring(verOffset + 7)) : -1 < nAgt.indexOf("mozilla/5.0") && -1 < nAgt.indexOf("android ") && -1 < nAgt.indexOf("applewebkit") && !(-1 < nAgt.indexOf("chrome")) ? (verOffset = nAgt.indexOf("Chrome"), jQuery.mbBrowser.webkit = !0, jQuery.mbBrowser.androidStock = !0, jQuery.mbBrowser.name = "androidStock", jQuery.mbBrowser.fullVersion = nAgt.substring(verOffset + 7)) : -1 != (verOffset = nAgt.indexOf("Safari")) ? (jQuery.mbBrowser.webkit = !0, jQuery.mbBrowser.safari = !0, jQuery.mbBrowser.name = "Safari", jQuery.mbBrowser.fullVersion = nAgt.substring(verOffset + 7), -1 != (verOffset = nAgt.indexOf("Version")) && (jQuery.mbBrowser.fullVersion = nAgt.substring(verOffset + 8))) : -1 != (verOffset = nAgt.indexOf("AppleWebkit")) ? (jQuery.mbBrowser.webkit = !0, jQuery.mbBrowser.safari = !0, jQuery.mbBrowser.name = "Safari", jQuery.mbBrowser.fullVersion = nAgt.substring(verOffset + 7), -1 != (verOffset = nAgt.indexOf("Version")) && (jQuery.mbBrowser.fullVersion = nAgt.substring(verOffset + 8))) : -1 != (verOffset = nAgt.indexOf("Firefox")) ? (jQuery.mbBrowser.mozilla = !0, jQuery.mbBrowser.name = "Firefox", jQuery.mbBrowser.fullVersion = nAgt.substring(verOffset + 8)) : (nameOffset = nAgt.lastIndexOf(" ") + 1) < (verOffset = nAgt.lastIndexOf("/")) && (jQuery.mbBrowser.name = nAgt.substring(nameOffset, verOffset), jQuery.mbBrowser.fullVersion = nAgt.substring(verOffset + 1), jQuery.mbBrowser.name.toLowerCase() == jQuery.mbBrowser.name.toUpperCase() && (jQuery.mbBrowser.name = navigator.appName)); - 1 != (ix = jQuery.mbBrowser.fullVersion.indexOf(";")) && (jQuery.mbBrowser.fullVersion = jQuery.mbBrowser.fullVersion.substring(0, ix)), -1 != (ix = jQuery.mbBrowser.fullVersion.indexOf(" ")) && (jQuery.mbBrowser.fullVersion = jQuery.mbBrowser.fullVersion.substring(0, ix)), jQuery.mbBrowser.majorVersion = parseInt("" + jQuery.mbBrowser.fullVersion, 10), isNaN(jQuery.mbBrowser.majorVersion) && (jQuery.mbBrowser.fullVersion = "" + parseFloat(navigator.appVersion), jQuery.mbBrowser.majorVersion = parseInt(navigator.appVersion, 10)), jQuery.mbBrowser.version = jQuery.mbBrowser.majorVersion, jQuery.mbBrowser.android = /Android/i.test(nAgt), jQuery.mbBrowser.blackberry = /BlackBerry|BB|PlayBook/i.test(nAgt), jQuery.mbBrowser.ios = /iPhone|iPad|iPod|webOS/i.test(nAgt), jQuery.mbBrowser.operaMobile = /Opera Mini/i.test(nAgt), jQuery.mbBrowser.windowsMobile = /IEMobile|Windows Phone/i.test(nAgt), jQuery.mbBrowser.kindle = /Kindle|Silk/i.test(nAgt), jQuery.mbBrowser.mobile = jQuery.mbBrowser.android || jQuery.mbBrowser.blackberry || jQuery.mbBrowser.ios || jQuery.mbBrowser.windowsMobile || jQuery.mbBrowser.operaMobile || jQuery.mbBrowser.kindle, jQuery.isMobile = jQuery.mbBrowser.mobile, jQuery.isTablet = jQuery.mbBrowser.mobile && 765 < jQuery(window).width(), jQuery.isAndroidDefault = jQuery.mbBrowser.android && !/chrome/i.test(nAgt), jQuery.mbBrowser = jQuery.mbBrowser, jQuery.mbBrowser.versionCompare = function(e, r) {
1237    if ("stringstring" != typeof e + typeof r) return !1;
1238    for (var t = e.split("."), a = r.split("."), o = 0, n = Math.max(t.length, a.length); o < n; o++) {
1239        if (t[o] && !a[o] && 0 < parseInt(t[o]) || parseInt(t[o]) > parseInt(a[o])) return 1;
1240        if (a[o] && !t[o] && 0 < parseInt(a[o]) || parseInt(t[o]) < parseInt(a[o])) return -1
1241    }
1242    return 0
1243};

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.