1. 程式人生 > >關於搶火車票的那些事兒(一)

關於搶火車票的那些事兒(一)

關於搶火車票的那些事兒(一)
又到了年底了,沒到這個時候外出工作的人兒又開始犯愁了火車票的事兒~ 票不好買,於是黃牛呀,各種搶票軟體走進了大家的事業。 搶票軟體到底是怎麼做的呢? 正好最近工作不忙,我也比較感興趣,那就來探究一下。
據說用python 比較好,但是我沒學過python怎麼辦?
本著學習的目的我在Github上搜索12306,找了一個專案作為base code.

這個專案的程式碼總體說來還是比較規整,介紹上說是作者學習網路爬蟲的產物,我們就秉著學習的態度瞭解一下。
我的思路應該是: 登陸12306 查詢餘票 如果沒有我想要的車次就繼續查詢 有我想要的車次,就買買買啊
嗯,思路是這樣, 那還需要什麼工具呢? 瀏覽器總要有一個吧、 同時推薦抓包工具Fiddler~
先看了一眼程式碼裡面登陸12306的login程式碼 看到了一個讓人懵逼的URL,好長好長。。
url = 'https://kyfw.12306.cn/otn/HttpZF/logdevice?algID=QRqR6wPyKZ&hashCode=lkUTDoJPpSm3zCb7GSoeajQQHkpHcXusReeMHhKXtMk&FMQw=0&q4f3=en-US&VySQ=FGH9RLTQe0Il8zvsUhAS0D1MpIRW0RrY&VPIf=1&custID=133&VEek=unknown&dzuS=0&yD16=1&EOQP=a6588b471456c0b2345c44dc367af87d&jp76=223017b546a29cfe7aa7f1efcefc0b88&hAqN=Win32&platform=WEB&ks0Q=ebda3f4fca91cb13d8a03858320fadbb&TeRS=777x1449&tOHY=24xx815x1449&Fvje=i1l1s1&q5aJ=-8&wNLf=99115dfb07133750ba677d055874de87&0aew={}&E3gR=009220e11f272d503c007d3cdb571082×tamp={}'.format(
                   self.session.headers['User-Agent'], str(round(time.time() * 1000)))

還是自己動手看看這是什麼鬼吧~ 開Fiddler,開啟瀏覽器訪問12306購票的登陸頁,如果不是第一次訪問,請記得先清理Cookie

看下Fiddler的結果,看到了登陸頁的url
以及。。。 這個URL 並不是我們輸入的,但是事實上瀏覽器同時Get了這個url的頁面,並且返回了一個json資料包。 一般這種情況是瀏覽器執行了網站提供的JS。
返回的資料:
callbackFunction('{"exp":"1516684953759","dfp":"Obx0B8YpTc4w_TvvjFdnemQfr8qDcnOBWe-icB28BDZzz0tUvoetQnMerrd1wFpDX0fc_ctRLiFhogrQyrqa0crPAgKGxrpoFn_IFUaSOcgm-Ik9Fb7a46VnA2FEAuS79h0l0HhmyHhixL5oSWDfe4RleORr_5dT"}')
這個是幹什麼用的呢?
我們在網頁上登陸一下在抓包就會發現
對比上圖,我們會發現Cookie多了兩項,而且值就是那個URL返回的資料。
這下我們可以猜測: 訪問登入頁的時候,網站提供了JS給瀏覽器執行,執行的結果是動態取了兩個Value放進了Cookie裡面。。這樣瀏覽器可以正常訪問,一些簡單模擬https登陸的小軟體Cookie沒有這兩個值,可以不給登陸。。 66666
等等,我們跟程式碼裡面確認一下我們的猜測
response = self.session.get(requests.utils.requote_uri(url))
                pattern = re.compile('\(\'(.*?)\'\)')
                userVerify3 = eval(pattern.findall(response.text)[0])
                 print('設定cookie')
                 print(userVerify3)
                railExpiration = userVerify3['exp']
                railDeviceId = userVerify3['dfp']
                self.session.cookies['RAIL_EXPIRATION'] = railExpiration
                self.session.cookies['RAIL_DEVICEID'] = railDeviceId
果然是這樣,哈哈哈哈 but...問題來了,程式碼裡面寫死這個url,感覺非常不可取,我們可以發現瀏覽器執行JS的結果每次url都是不同的,這樣寫個死的,而且後面還帶個時間戳,如果網站有過期判定,那不是不能夠用了麼。。

url = 'https://kyfw.12306.cn/otn/HttpZF/logdevice?algID=QRqR6wPyKZ&hashCode=lkUTDoJPpSm3zCb7GSoeajQQHkpHcXusReeMHhKXtMk&FMQw=0&q4f3=en-US&VySQ=FGH9RLTQe0Il8zvsUhAS0D1MpIRW0RrY&VPIf=1&custID=133&VEek=unknown&dzuS=0&yD16=1&EOQP=a6588b471456c0b2345c44dc367af87d&jp76=223017b546a29cfe7aa7f1efcefc0b88&hAqN=Win32&platform=WEB&ks0Q=ebda3f4fca91cb13d8a03858320fadbb&TeRS=777x1449&tOHY=24xx815x1449&Fvje=i1l1s1&q5aJ=-8&wNLf=99115dfb07133750ba677d055874de87&0aew={}&E3gR=009220e11f272d503c007d3cdb571082×tamp={}'.format(
                   self.session.headers['User-Agent'], str(round(time.time() * 1000)))
忽然理解了為什麼搶票軟體更新那麼頻繁。。。。。。。
但是我們怎麼獲取這個動態的URL呢?
我們先看看能不能看懂JS程式碼怎麼生成的吧
開啟瀏覽器除錯模式(F12)

壓縮過的。。太亂了,複製出來格式化一下吧。 2K多行的JS。。感興趣的可以看一下文末那些JS程式碼。
我反正是放棄讀懂它了。。
那還有沒有其他的路獲取這個Cookie資料呢? 可以執行JS呀,可以給python 掛個JS引擎。。雖然笨重。 但是我沒有這樣做,我是用C# Webbrowser 寫個個exe,exe的作用就是訪問登入頁,獲取Cookie並且寫入文字 然後Python再去讀文字獲取Cookie就好了。。
            try:
                #Run C#程式獲取完成Cookie
                os.system('Wpf12306.exe')
                #win32api.ShellExecute(0, 'open', 'Wpf12306.exe', '', '', 0)
                f = open("Cookie.txt", "r")
                lines = f.readline()
                f.close()
                tuCookies = tuple(lines.split(";"))
                for i in tuCookies:
                    tut = i.split("=")
                    self.session.cookies[tut[0]] = tut[1]


Cookie.txt的內容
JSESSIONID=69A073C9272D98E95296EC126BCEFD27; RAIL_DEVICEID=ji3AS1K5ZPE6dsmsd4GMrolxXkX9xPX1cXV0VXF4-3tuAc7MrLWQDmGtRB7GMGHs-LPdcQ8aEkynSmgTLUyQClBZedTxYLLTPyR40nDE8SBQhp2ZUT1D8nxubdw3sKq29dfSClTH_JRlxQvkKRqIbmEeDC_gwRnC; RAIL_EXPIRATION=1516506547281; route=495c805987d0f5c8c84b14f60212447d; BIGipServerotn=1708720394.64545.0000; BIGipServerpassport=786956554.50215.0000

誒,12306的機制果然不一般吶,這僅僅是登陸之前要準備的工作之一。。。
第一篇先寫到這裡吧~


參考JS
(function() {
    function Qa() {
        if ( - 1 == F("RAIL_EXPIRATION")) for (var a = 0; 10 > a; a++) G(function() { (new ja).getFingerPrint()
        },
        20 + 2E3 * Math.pow(a, 2));
        else(new ja).getFingerPrint();
        G(function() {
            r.setInterval(function() { (new ja).getFingerPrint()
            },
            3E5)
        },
        3E5)
    }
    function nb(a) {
        this.isTimeout = 0;
        var b = this,
        c = r.RTCPeerConnection || r.webkitRTCPeerConnection || r.mozRTCPeerConnection;
        if ("function" == typeof c) {
            try {
                var d = new c({
                    iceServers: []
                });
                d.createDataChannel("", {
                    reliable: !1
                })
            } catch(f) {
                if (2 != b.isTimeout) {
                    b.isTimeout = 1;
                    a();
                    return
                }
            }
            var e = !1;
            d.onicecandidate = function(c) {
                var d = /([0-9]{1,3}(\.[0-9]{1,3}){3})/,
                f = [];
                "complete" != c.target.iceGatheringState || e || (e = !0, c.target.localDescription.sdp.split("\n").forEach(function(a) { (a = d.exec(a)) && "127.0.0.1" != a[1] && "0.0.0.0" != a[1] && -1 === f.indexOf(a[1]) && f.push(a[1])
                }), 2 != b.isTimeout && (b.isTimeout = 1, a({
                    localAddr: 0 < f.length ? f.sort()[0] : ""
                })))
            };
            d.onaddstream = function(a) {
                remoteVideo.src = r.URL.createObjectURL(a.stream)
            };
            d.createOffer(function(a) {
                d.setLocalDescription(a,
                function() {},
                function() {})
            },
            function() {},
            {})
        } else a();
        G(function() {
            0 == b.isTimeout && (b.isTimeout = 2, a())
        },
        500)
    }
    function ka(a) {
        return Y.SHA256(a).toString(Y.enc.Base64)
    }
    function ob(a) {
        var b = a.split(".");
        if (4 !== b.length) throw Error("Invalid format -- expecting a.b.c.d");
        for (var c = a = 0; c < b.length; ++c) {
            var d = parseInt(b[c], 10);
            if (Number.isNaN(d) || 0 > d || 255 < d) throw Error("Each octet must be between 0 and 255");
            a |= d << 8 * (b.length - c - 1);
            a >>>= 0
        }
        return a
    }
    function za(a) {
        if (!a) return "";
        if (pb(a)) return a.replace(/\s/g, ""); - 1 != a.indexOf("://") && (a = a.substr(a.indexOf("://") + 3));
        var b = "com net org gov edu mil biz name info mobi pro travel museum int areo post rec".split(" "),
        c = a.split(".");
        if (1 >= c.length || !isNaN(c[c.length - 1])) return a;
        for (a = 0; a < b.length && b[a] != c[c.length - 1];) a++;
        if (a != b.length) return "." + c[c.length - 2] + "." + c[c.length - 1];
        for (a = 0; a < b.length && b[a] != c[c.length - 2];) a++;
        return a == b.length ? c[c.length - 2] + "." + c[c.length - 1] : "." + c[c.length - 3] + "." + c[c.length - 2] + "." + c[c.length - 1]
    }
    function Ra(a) {
        return null != /[\\\"<>\.;]/.exec(a) && "undefined" != typeof encodeURIComponent ? encodeURIComponent(a) : a
    }
    function P(a, b) {
        if (Sa) {
            var c = b ? "visible": "hidden";
            Q && J(a) ? J(a).style.visibility = c: Ta("#" + a, "visibility:" + c)
        }
    }
    function Ta(a, b, c, d) {
        if (!m.ie || !m.mac) {
            var e = q.getElementsByTagName("head")[0];
            e && (c = c && "string" == typeof c ? c: "screen", d && (Aa = L = null), L && Aa == c || (d = q.createElement("style"), d.setAttribute("type", "text/css"), d.setAttribute("media", c), L = e.appendChild(d), m.ie && m.win && "undefined" != typeof q.styleSheets && 0 < q.styleSheets.length && (L = q.styleSheets[q.styleSheets.length - 1]), Aa = c), m.ie && m.win ? L && "object" == typeof L.addRule && L.addRule(a, b) : L && "undefined" != typeof q.createTextNode && L.appendChild(q.createTextNode(a + " {" + b + "}")))
        }
    }
    function la(a) {
        var b = m.pv;
        a = a.split(".");
        a[0] = parseInt(a[0], 10);
        a[1] = parseInt(a[1], 10) || 0;
        a[2] = parseInt(a[2], 10) || 0;
        return b[0] > a[0] || b[0] == a[0] && b[1] > a[1] || b[0] == a[0] && b[1] == a[1] && b[2] >= a[2] ? !0 : !1
    }
    function J(a) {
        var b = null;
        try {
            b = q.getElementById(a)
        } catch(c) {}
        return b
    }
    function Ua(a) {
        var b = J(a);
        b && "OBJECT" == b.nodeName && (m.ie && m.win ? (b.style.display = "none",
        function d() {
            if (4 == b.readyState) {
                var e = J(a);
                if (e) {
                    for (var f in e)"function" == typeof e[f] && (e[f] = null);
                    e.parentNode.removeChild(e)
                }
            } else G(d, 10)
        } ()) : b.parentNode.removeChild(b))
    }
    function Ba(a, b, c) {
        var d, e = J(c);
        if (m.wk && 312 > m.wk) return d;
        if (e) if ("undefined" == typeof a.id && (a.id = c), m.ie && m.win) {
            var f = "",
            h;
            for (h in a) a[h] != Object.prototype[h] && ("data" == h.toLowerCase() ? b.movie = a[h] : "styleclass" == h.toLowerCase() ? f += ' class\x3d"' + a[h] + '"': "classid" != h.toLowerCase() && (f += " " + h + '\x3d"' + a[h] + '"'));
            h = "";
            for (var p in b) b[p] != Object.prototype[p] && (h += '\x3cparam name\x3d"' + p + '" value\x3d"' + b[p] + '" /\x3e');
            e.outerHTML = '\x3cobject classid\x3d"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"' + f + "\x3e" + h + "\x3c/object\x3e";
            ma[ma.length] = a.id;
            d = J(a.id)
        } else {
            p = q.createElement("object");
            p.setAttribute("type", "application/x-shockwave-flash");
            for (var g in a) a[g] != Object.prototype[g] && ("styleclass" == g.toLowerCase() ? p.setAttribute("class", a[g]) : "classid" != g.toLowerCase() && p.setAttribute(g, a[g]));
            for (f in b) b[f] != Object.prototype[f] && "movie" != f.toLowerCase() && (a = p, h = f, g = b[f], c = q.createElement("param"), c.setAttribute("name", h), c.setAttribute("value", g), a.appendChild(c));
            e.parentNode.replaceChild(p, e);
            d = p
        }
        return d
    }
    function Ca(a) {
        var b = q.createElement("div");
        if (m.win && m.ie) b.innerHTML = a.innerHTML;
        else if (a = a.getElementsByTagName("object")[0]) if (a = a.childNodes) for (var c = a.length,
        d = 0; d < c; d++) 1 == a[d].nodeType && "PARAM" == a[d].nodeName || 8 == a[d].nodeType || b.appendChild(a[d].cloneNode(!0));
        return b
    }
    function qb(a) {
        if (m.ie && m.win && 4 != a.readyState) {
            var b = q.createElement("div");
            a.parentNode.insertBefore(b, a);
            b.parentNode.replaceChild(Ca(a), b);
            a.style.display = "none"; (function d() {
                4 == a.readyState ? a.parentNode.removeChild(a) : G(d, 10)
            })()
        } else a.parentNode.replaceChild(Ca(a), a)
    }
    function Da(a, b, c, d) {
        na = !0;
        Ea = d || null;
        Va = {
            id: c,
            success: !1
        };
        var e = J(c);
        if (e) {
            "OBJECT" == e.nodeName ? (Z = Ca(e), oa = null) : (Z = e, oa = c);
            a.id = "SWFObjectExprInst";
            if ("undefined" == typeof a.width || !/%$/.test(a.width) && 310 > parseInt(a.width, 10)) a.width = "310";
            if ("undefined" == typeof a.height || !/%$/.test(a.height) && 137 > parseInt(a.height, 10)) a.height = "137";
            q.title = q.title.slice(0, 47) + " - Flash Player Installation";
            d = m.ie && m.win ? "ActiveX": "PlugIn";
            d = "MMredirectURL\x3d" + I.location.toString().replace(/&/g, "%26") + "\x26MMplayerType\x3d" + d + "\x26MMdoctitle\x3d" + q.title;
            b.flashvars = "undefined" != typeof b.flashvars ? b.flashvars + ("\x26" + d) : d;
            m.ie && m.win && 4 != e.readyState && (d = q.createElement("div"), c += "SWFObjectNew", d.setAttribute("id", c), e.parentNode.insertBefore(d, e), e.style.display = "none",
            function h() {
                4 == e.readyState ? e.parentNode.removeChild(e) : G(h, 10)
            } ());
            Ba(a, b, c)
        }
    }
    function Fa() {
        return ! na && la("6.0.65") && (m.win || m.mac) && !(m.wk && 312 > m.wk)
    }
    function Ga(a) {
        var b = null; (a = J(a)) && "OBJECT" == a.nodeName && ("undefined" != typeof a.SetVariable ? b = a: (a = a.getElementsByTagName("object")[0]) && (b = a));
        return b
    }
    function Ha() {
        var a = M.length;
        if (0 < a) for (var b = 0; b < a; b++) {
            var c = M[b].id,
            d = M[b].callbackFn,
            e = {
                id: c,
                success: !1
            };
            if (0 < m.pv[0]) {
                var f = J(c);
                if (f) if (!la(M[b].swfVersion) || m.wk && 312 > m.wk) if (M[b].expressInstall && Fa()) {
                    e = {};
                    e.data = M[b].expressInstall;
                    e.width = f.getAttribute("width") || "0";
                    e.height = f.getAttribute("height") || "0";
                    f.getAttribute("class") && (e.styleclass = f.getAttribute("class"));
                    f.getAttribute("align") && (e.align = f.getAttribute("align"));
                    for (var h = {},
                    f = f.getElementsByTagName("param"), p = f.length, g = 0; g < p; g++)"movie" != f[g].getAttribute("name").toLowerCase() && (h[f[g].getAttribute("name")] = f[g].getAttribute("value"));
                    Da(e, h, c, d)
                } else qb(f),
                d && d(e);
                else P(c, !0),
                d && (e.success = !0, e.ref = Ga(c), d(e))
            } else P(c, !0),
            d && ((c = Ga(c)) && "undefined" != typeof c.SetVariable && (e.success = !0, e.ref = c), d(e))
        }
    }
    function Wa(a) {
        if ("undefined" != typeof I.addEventListener) I.addEventListener("load", a, !1);
        else if ("undefined" != typeof q.addEventListener) q.addEventListener("load", a, !1);
        else if ("undefined" != typeof I.attachEvent) {
            var b = I;
            b.attachEvent("onload", a);
            T[T.length] = [b, "onload", a]
        } else if ("function" == typeof I.onload) {
            var c = I.onload;
            I.onload = function() {
                c();
                a()
            }
        } else I.onload = a
    }
    function Xa(a) {
        Q ? a() : pa[pa.length] = a
    }
    function U() {
        if (!Q) {
            try {
                var a = q.getElementsByTagName("body")[0].appendChild(q.createElement("span"));
                a.parentNode.removeChild(a)
            } catch(c) {
                return
            }
            Q = !0;
            for (var a = pa.length,
            b = 0; b < a; b++) pa[b]()
        }
    }
    function Ya(a) {
        return 4294967296 * (a - (a | 0)) | 0
    }
    function aa(a) {
        if (! (this instanceof aa)) return new aa(a);
        this.options = this.extend(a, {
            sortPluginsFor: [/palemoon/i],
            detectScreenOrientation: !0,
            swfPath: "flash/compiled/FontList.swf",
            swfContainerId: "fingerprintjs2",
            userDefinedFonts: []
        });
        this.nativeForEach = Array.prototype.forEach;
        this.nativeMap = Array.prototype.map
    }
    function C(a, b, c, d, e, f, h) {
        return A(b & d | c & ~d, a, b, e, f, h)
    }
    function ba(a) {
        for (var b = [], c = (1 << ca) - 1, d = 0; d < a.length * ca; d += ca) b[d >> 5] |= (a.charCodeAt(d / ca) & c) << d % 32;
        a = a.length * ca;
        b[a >> 5] |= 128 << a % 32;
        b[(a + 64 >>> 9 << 4) + 14] = a;
        a = 1732584193;
        for (var c = -271733879,
        d = -1732584194,
        e = 271733878,
        f = 0; f < b.length; f += 16) {
            var h = a,
            p = c,
            g = d,
            m = e;
            a = D(a, c, d, e, b[f + 0], 7, -680876936);
            e = D(e, a, c, d, b[f + 1], 12, -389564586);
            d = D(d, e, a, c, b[f + 2], 17, 606105819);
            c = D(c, d, e, a, b[f + 3], 22, -1044525330);
            a = D(a, c, d, e, b[f + 4], 7, -176418897);
            e = D(e, a, c, d, b[f + 5], 12, 1200080426);
            d = D(d, e, a, c, b[f + 6], 17, -1473231341);
            c = D(c, d, e, a, b[f + 7], 22, -45705983);
            a = D(a, c, d, e, b[f + 8], 7, 1770035416);
            e = D(e, a, c, d, b[f + 9], 12, -1958414417);
            d = D(d, e, a, c, b[f + 10], 17, -42063);
            c = D(c, d, e, a, b[f + 11], 22, -1990404162);
            a = D(a, c, d, e, b[f + 12], 7, 1804603682);
            e = D(e, a, c, d, b[f + 13], 12, -40341101);
            d = D(d, e, a, c, b[f + 14], 17, -1502002290);
            c = D(c, d, e, a, b[f + 15], 22, 1236535329);
            a = C(a, c, d, e, b[f + 1], 5, -165796510);
            e = C(e, a, c, d, b[f + 6], 9, -1069501632);
            d = C(d, e, a, c, b[f + 11], 14, 643717713);
            c = C(c, d, e, a, b[f + 0], 20, -373897302);
            a = C(a, c, d, e, b[f + 5], 5, -701558691);
            e = C(e, a, c, d, b[f + 10], 9, 38016083);
            d = C(d, e, a, c, b[f + 15], 14, -660478335);
            c = C(c, d, e, a, b[f + 4], 20, -405537848);
            a = C(a, c, d, e, b[f + 9], 5, 568446438);
            e = C(e, a, c, d, b[f + 14], 9, -1019803690);
            d = C(d, e, a, c, b[f + 3], 14, -187363961);
            c = C(c, d, e, a, b[f + 8], 20, 1163531501);
            a = C(a, c, d, e, b[f + 13], 5, -1444681467);
            e = C(e, a, c, d, b[f + 2], 9, -51403784);
            d = C(d, e, a, c, b[f + 7], 14, 1735328473);
            c = C(c, d, e, a, b[f + 12], 20, -1926607734);
            a = A(c ^ d ^ e, a, c, b[f + 5], 4, -378558);
            e = A(a ^ c ^ d, e, a, b[f + 8], 11, -2022574463);
            d = A(e ^ a ^ c, d, e, b[f + 11], 16, 1839030562);
            c = A(d ^ e ^ a, c, d, b[f + 14], 23, -35309556);
            a = A(c ^ d ^ e, a, c, b[f + 1], 4, -1530992060);
            e = A(a ^ c ^ d, e, a, b[f + 4], 11, 1272893353);
            d = A(e ^ a ^ c, d, e, b[f + 7], 16, -155497632);
            c = A(d ^ e ^ a, c, d, b[f + 10], 23, -1094730640);
            a = A(c ^ d ^ e, a, c, b[f + 13], 4, 681279174);
            e = A(a ^ c ^ d, e, a, b[f + 0], 11, -358537222);
            d = A(e ^ a ^ c, d, e, b[f + 3], 16, -722521979);
            c = A(d ^ e ^ a, c, d, b[f + 6], 23, 76029189);
            a = A(c ^ d ^ e, a, c, b[f + 9], 4, -640364487);
            e = A(a ^ c ^ d, e, a, b[f + 12], 11, -421815835);
            d = A(e ^ a ^ c, d, e, b[f + 15], 16, 530742520);
            c = A(d ^ e ^ a, c, d, b[f + 2], 23, -995338651);
            a = E(a, c, d, e, b[f + 0], 6, -198630844);
            e = E(e, a, c, d, b[f + 7], 10, 1126891415);
            d = E(d, e, a, c, b[f + 14], 15, -1416354905);
            c = E(c, d, e, a, b[f + 5], 21, -57434055);
            a = E(a, c, d, e, b[f + 12], 6, 1700485571);
            e = E(e, a, c, d, b[f + 3], 10, -1894986606);
            d = E(d, e, a, c, b[f + 10], 15, -1051523);
            c = E(c, d, e, a, b[f + 1], 21, -2054922799);
            a = E(a, c, d, e, b[f + 8], 6, 1873313359);
            e = E(e, a, c, d, b[f + 15], 10, -30611744);
            d = E(d, e, a, c, b[f + 6], 15, -1560198380);
            c = E(c, d, e, a, b[f + 13], 21, 1309151649);
            a = E(a, c, d, e, b[f + 4], 6, -145523070);
            e = E(e, a, c, d, b[f + 11], 10, -1120210379);
            d = E(d, e, a, c, b[f + 2], 15, 718787259);
            c = E(c, d, e, a, b[f + 9], 21, -343485551);
            a = N(a, h);
            c = N(c, p);
            d = N(d, g);
            e = N(e, m)
        }
        b = [a, c, d, e];
        a = "";
        for (c = 0; c < 4 * b.length; c++) a += "0123456789abcdef".charAt(b[c >> 2] >> c % 4 * 8 + 4 & 15) + "0123456789abcdef".charAt(b[c >> 2] >> c % 4 * 8 & 15);
        return a
    }
    function D(a, b, c, d, e, f, h) {
        return A(b & c | ~b & d, a, b, e, f, h)
    }
    function N(a, b) {
        var c = (a & 65535) + (b & 65535);
        return (a >> 16) + (b >> 16) + (c >> 16) << 16 | c & 65535
    }
    function E(a, b, c, d, e, f, h) {
        return A(c ^ (b | ~d), a, b, e, f, h)
    }
    function A(a, b, c, d, e, f) {
        a = N(N(b, a), N(d, f));
        return N(a << e | a >>> 32 - e, c)
    }
    function F(a) {
        var b, c, d, e = u.cookie.split(";");
        for (b = 0; b < e.length; b++) if (c = e[b].substr(0, e[b].indexOf("\x3d")), d = e[b].substr(e[b].indexOf("\x3d") + 1), c = c.replace(/^\s+|\s+$/g, ""), a = a.replace(/^\s+|\s+$/g, ""), c == a) return unescape(d)
    }
    function V(a, b, c, d, e, f) {
        var h = new Date;
        h.setTime(h.getTime()); - 1 != c ? (c *= 864E5, h = new Date(h.getTime() + c), cookieString = a + "\x3d" + escape(b) + (c ? ";expires\x3d" + h.toGMTString() : "") + (d ? ";path\x3d" + d: "") + (e ? ";domain\x3d" + e: "") + (f ? ";secure": "")) : (h = -1, cookieString = a + "\x3d" + escape(b) + (c ? ";expires\x3d" + h: "") + (d ? ";path\x3d" + d: "") + (e ? ";domain\x3d" + e: "") + (f ? ";secure": ""));
        u.cookie = cookieString
    }
    function pb(a) {
        a = a.replace(/\s/g, "");
        if (/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/.test(a)) {
            a = a.split(".");
            if (0 == parseInt(parseFloat(a[0])) || 0 == parseInt(parseFloat(a[3]))) return ! 1;
            for (var b = 0; b < a.length; b++) if (255 < parseInt(parseFloat(a[b]))) return ! 1;
            return ! 0
        }
        return ! 1
    }
    function l(a, b) {
        this.key = a;
        this.value = b
    }
    function V(a, b, c) {
        var d = new Date;
        d.setTime(d.getTime() + 864E5 * Number(c));
        u.cookie = a + "\x3d" + b + "; path\x3d/;expires \x3d " + d.toGMTString() + ";domain\x3d" + za(r.location.host.split(":")[0])
    }
    function Ia() {
        var a = g.userAgent.toLowerCase();
        return 0 <= a.indexOf("windows phone") ? "WindowsPhone": 0 <= a.indexOf("win") ? "Windows": 0 <= a.indexOf("android") ? "Android": 0 <= a.indexOf("linux") ? "Linux": 0 <= a.indexOf("iphone") || 0 <= a.indexOf("ipad") ? "iOS": 0 <= a.indexOf("mac") ? "Mac": "Other"
    }
    function ja() {
        this.ec = new evercookie;
        this.deviceEc = new evercookie;
        this.cfp = new aa;
        this.packageString = "";
        this.moreInfoArray = []
    }
    var u = document,
    r = window,
    g = navigator,
    y = screen,
    G = setTimeout,
    rb = top,
    sb = location,
    tb = parent;
    Array.prototype.indexOf || (Array.prototype.indexOf = function(a, b) {
        var c;
        if (null == this) throw new TypeError("'this' is null or undefined");
        var d = Object(this),
        e = d.length >>> 0;
        if (0 === e) return - 1;
        c = +b || 0;
        Infinity === Math.abs(c) && (c = 0);
        if (c >= e) return - 1;
        for (c = Math.max(0 <= c ? c: e - Math.abs(c), 0); c < e;) {
            if (c in d && d[c] === a) return c;
            c++
        }
        return - 1
    });
    var Za = {
        removeElem: function(a) {
            var b = a.parentNode;
            if (b) try {
                b.removeChild(a)
            } catch(c) {}
        },
        getJSON: function(a, b, c) {
            b = u.createElement("script");
            b.type = "text/javascript";
            b.src = a;
            b.id = "id_callbackFunction";
            r.callbackFunction = function(a) {
                r.callbackFunction = void 0;
                var b = u.getElementById("id_callbackFunction");
                b && Za.removeElem(b);
                c(a)
            }; (a = u.getElementsByTagName("head")) && a[0] && a[0].appendChild(b)
        },
        rand: function() {
            return Math.random().toString().substr(2)
        },
        parseData: function(a) {
            var b = "";
            if ("string" === typeof a) b = a;
            else if ("object" === typeof a) for (var c in a) b += "\x26" + c + "\x3d" + encodeURIComponent(a[c]);
            b += "\x26_time\x3d" + this.now();
            return b = b.substr(1)
        },
        now: function() {
            return (new Date).getTime()
        }
    },
    $a = ["WEB", "WAP"];
    "object" != typeof JSON && (JSON = {}); (function() {
        function a(a) {
            return 10 > a ? "0" + a: a
        }
        function b() {
            return this.valueOf()
        }
        function c(a) {
            return n.lastIndex = 0,
            n.test(a) ? '"' + a.replace(n,
            function(a) {
                var b = h[a];
                return "string" == typeof b ? b: "\\u" + ("0000" + a.charCodeAt(0).toString(16)).slice( - 4)
            }) + '"': '"' + a + '"'
        }
        function d(a, b) {
            var v, h, z, B, k, g = e,
            n = b[a];
            switch (n && "object" == typeof n && "function" == typeof n.toJSON && (n = n.toJSON(a)), "function" == typeof p && (n = p.call(b, a, n)), typeof n) {
            case "string":
                return c(n);
            case "number":
                return isFinite(n) ? String(n) : "null";
            case "boolean":
            case "null":
                return String(n);
            case "object":
                if (!n) return "null";
                if (e += f, k = [], "[object Array]" === Object.prototype.toString.apply(n)) {
                    B = n.length;
                    for (v = 0; B > v; v += 1) k[v] = d(v, n) || "null";
                    return z = 0 === k.length ? "[]": e ? "[\n" + e + k.join(",\n" + e) + "\n" + g + "]": "[" + k.join(",") + "]",
                    e = g,
                    z
                }
                if (p && "object" == typeof p) for (B = p.length, v = 0; B > v; v += 1)"string" == typeof p[v] && (h = p[v], z = d(h, n), z && k.push(c(h) + (e ? ": ": ":") + z));
                else for (h in n) Object.prototype.hasOwnProperty.call(n, h) && (z = d(h, n), z && k.push(c(h) + (e ? ": ": ":") + z));
                return z = 0 === k.length ? "{}": e ? "{\n" + e + k.join(",\n" + e) + "\n" + g + "}": "{" + k.join(",") + "}",
                e = g,
                z
            }
        }
        var e, f, h, p, g = /^[\],:{}\s]*$/,
        m = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,
        K = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,
        k = /(?:^|:|,)(?:\s*\[)+/g,
        n = /[\\\"\u0000-\u001f\u007f-\u009f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,
        l = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;
        "function" != typeof Date.prototype.toJSON && (Date.prototype.toJSON = function() {
            return isFinite(this.valueOf()) ? this.getUTCFullYear() + "-" + a(this.getUTCMonth() + 1) + "-" + a(this.getUTCDate()) + "T" + a(this.getUTCHours()) + ":" + a(this.getUTCMinutes()) + ":" + a(this.getUTCSeconds()) + "Z": null
        },
        Boolean.prototype.toJSON = b, Number.prototype.toJSON = b, String.prototype.toJSON = b);
        "function" != typeof JSON.stringify && (h = {
            "\r": "\\r",
            "\b": "\\b",
            '"': '\\"',
            "\n": "\\n",
            "   ": "\\t",
            "\f": "\\f",
            "\\": "\\\\"
        },
        JSON.stringify = function(a, b, c) {
            var v;
            if (e = "", f = "", "number" == typeof c) for (v = 0; c > v; v += 1) f += " ";
            else "string" == typeof c && (f = c);
            if (p = b, b && "function" != typeof b && ("object" != typeof b || "number" != typeof b.length)) throw Error("JSON.stringify");
            return d("", {
                "": a
            })
        });
        "function" != typeof JSON.parse && (JSON.parse = function(a, b) {
            function c(a, d) {
                var e, f, v = a[d];
                if (v && "object" == typeof v) for (e in v) Object.prototype.hasOwnProperty.call(v, e) && (f = c(v, e), void 0 !== f ? v[e] = f: delete v[e]);
                return b.call(a, d, v)
            }
            var d;
            if (a = String(a), l.lastIndex = 0, l.test(a) && (a = a.replace(l,
            function(a) {
                return "\\u" + ("0000" + a.charCodeAt(0).toString(16)).slice( - 4)
            })), g.test(a.replace(m, "@").replace(K, "]").replace(k, ""))) return d = eval("(" + a + ")"),
            "function" == typeof b ? c({
                "": d
            },
            "") : d;
            throw new SyntaxError("JSON.parse");
        })
    })();
    debug = !1;
    var Ja;
    if (! (Ja = Y)) {
        var da = Math,
        qa = {},
        ra = qa.lib = {},
        ab = function() {},
        ea = ra.Base = {
            clone: function() {
                return this.init.prototype.extend(this)
            },
            init: function() {},
            extend: function(a) {
                ab.prototype = this;
                var b = new ab;
                a && b.mixIn(a);
                b.hasOwnProperty("init") || (b.init = function() {
                    b.$super.init.apply(this, arguments)
                });
                b.init.prototype = b;
                b.$super = this;
                return b
            },
            create: function() {
                var a = this.extend();
                a.init.apply(a, arguments);
                return a
            },
            mixIn: function(a) {
                for (var b in a) a.hasOwnProperty(b) && (this[b] = a[b]);
                a.hasOwnProperty("toString") && (this.toString = a.toString)
            }
        },
        fa = ra.WordArray = ea.extend({
            clamp: function() {
                var a = this.words,
                b = this.sigBytes;
                a[b >>> 2] &= 4294967295 << 32 - b % 4 * 8;
                a.length = da.ceil(b / 4)
            },
            init: function(a, b) {
                a = this.words = a || [];
                this.sigBytes = void 0 != b ? b: 4 * a.length
            },
            random: function(a) {
                for (var b = [], c = 0; c < a; c += 4) b.push(4294967296 * da.random() | 0);
                return new fa.init(b, a)
            },
            concat: function(a) {
                var b = this.words,
                c = a.words,
                d = this.sigBytes;
                a = a.sigBytes;
                this.clamp();
                if (d % 4) for (var e = 0; e < a; e++) b[d + e >>> 2] |= (c[e >>> 2] >>> 24 - e % 4 * 8 & 255) << 24 - (d + e) % 4 * 8;
                else if (65535 < c.length) for (e = 0; e < a; e += 4) b[d + e >>> 2] = c[e >>> 2];
                else b.push.apply(b, c);
                this.sigBytes += a;
                return this
            },
            toString: function(a) {
                return (a || ub).stringify(this)
            },
            clone: function() {
                var a = ea.clone.call(this);
                a.words = this.words.slice(0);
                return a
            }
        }),
        Ka = qa.enc = {},
        ub = Ka.Hex = {
            parse: function(a) {
                for (var b = a.length,
                c = [], d = 0; d < b; d += 2) c[d >>> 3] |= parseInt(a.substr(d, 2), 16) << 24 - d % 8 * 4;
                return new fa.init(c, b / 2)
            },
            stringify: function(a) {
                var b = a.words;
                a = a.sigBytes;
                for (var c = [], d = 0; d < a; d++) {
                    var e = b[d >>> 2] >>> 24 - d % 4 * 8 & 255;
                    c.push((e >>> 4).toString(16));
                    c.push((e & 15).toString(16))
                }
                return c.join("")
            }
        },
        bb = Ka.Latin1 = {
            parse: function(a) {
                for (var b = a.length,
                c = [], d = 0; d < b; d++) c[d >>> 2] |= (a.charCodeAt(d) & 255) << 24 - d % 4 * 8;
                return new fa.init(c, b)
            },
            stringify: function(a) {
                var b = a.words;
                a = a.sigBytes;
                for (var c = [], d = 0; d < a; d++) c.push(String.fromCharCode(b[d >>> 2] >>> 24 - d % 4 * 8 & 255));
                return c.join("")
            }
        },
        vb = Ka.Utf8 = {
            stringify: function(a) {
                try {
                    return decodeURIComponent(escape(bb.stringify(a)))
                } catch(b) {
                    throw Error("Malformed UTF-8 data");
                }
            },
            parse: function(a) {
                return bb.parse(unescape(encodeURIComponent(a)))
            }
        },
        cb = ra.BufferedBlockAlgorithm = ea.extend({
            _minBufferSize: 0,
            clone: function() {
                var a = ea.clone.call(this);
                a._data = this._data.clone();
                return a
            },
            reset: function() {
                this._data = new fa.init;
                this._nDataBytes = 0
            },
            _append: function(a) {
                "string" == typeof a && (a = vb.parse(a));
                this._data.concat(a);
                this._nDataBytes += a.sigBytes
            },
            _process: function(a) {
                var b = this._data,
                c = b.words,
                d = b.sigBytes,
                e = this.blockSize,
                f = d / (4 * e),
                f = a ? da.ceil(f) : da.max((f | 0) - this._minBufferSize, 0);
                a = f * e;
                d = da.min(4 * a, d);
                if (a) {
                    for (var h = 0; h < a; h += e) this._doProcessBlock(c, h);
                    h = c.splice(0, a);
                    b.sigBytes -= d
                }
                return new fa.init(h, d)
            }
        });
        ra.Hasher = cb.extend({
            blockSize: 16,
            _createHmacHelper: function(a) {
                return function(b, c) {
                    return (new wb.HMAC.init(a, c)).finalize(b)
                }
            },
            reset: function() {
                cb.reset.call(this);
                this._doReset()
            },
            finalize: function(a) {
                a && this._append(a);
                return this._doFinalize()
            },
            update: function(a) {
                this._append(a);
                this._process();
                return this
            },
            cfg: ea.extend(),
            _createHelper: function(a) {
                return function(b, c) {
                    return (new a.init(c)).finalize(b)
                }
            },
            init: function(a) {
                this.cfg = this.cfg.extend(a);
                this.reset()
            }
        });
        var wb = qa.algo = {};
        Ja = qa
    }
    for (var Y = Ja,
    sa = Math,
    ta = Y,
    R = ta.lib,
    xb = R.WordArray,
    ua = R.Hasher,
    R = ta.algo,
    db = [], eb = [], va = 2, ga = 0; 64 > ga;) {
        var W;
        a: {
            W = va;
            for (var yb = sa.sqrt(W), La = 2; La <= yb; La++) if (! (W % La)) {
                W = !1;
                break a
            }
            W = !0
        }
        W && (8 > ga && (db[ga] = Ya(sa.pow(va, .5))), eb[ga] = Ya(sa.pow(va, 1 / 3)), ga++);
        va++
    }
    var S = [],
    R = R.SHA256 = ua.extend({
        _doProcessBlock: function(a, b) {
            for (var c = this._hash.words,
            d = c[0], e = c[1], f = c[2], h = c[3], p = c[4], g = c[5], m = c[6], K = c[7], k = 0; 64 > k; k++) {
                if (16 > k) S[k] = a[b + k] | 0;
                else {
                    var n = S[k - 15],
                    l = S[k - 2];
                    S[k] = ((n << 25 | n >>> 7) ^ (n << 14 | n >>> 18) ^ n >>> 3) + S[k - 7] + ((l << 15 | l >>> 17) ^ (l << 13 | l >>> 19) ^ l >>> 10) + S[k - 16]
                }
                n = K + ((p << 26 | p >>> 6) ^ (p << 21 | p >>> 11) ^ (p << 7 | p >>> 25)) + (p & g ^ ~p & m) + eb[k] + S[k];
                l = ((d << 30 | d >>> 2) ^ (d << 19 | d >>> 13) ^ (d << 10 | d >>> 22)) + (d & e ^ d & f ^ e & f);
                K = m;
                m = g;
                g = p;
                p = h + n | 0;
                h = f;
                f = e;
                e = d;
                d = n + l | 0
            }
            c[0] = c[0] + d | 0;
            c[1] = c[1] + e | 0;
            c[2] = c[2] + f | 0;
            c[3] = c[3] + h | 0;
            c[4] = c[4] + p | 0;
            c[5] = c[5] + g | 0;
            c[6] = c[6] + m | 0;
            c[7] = c[7] + K | 0
        },
        _doFinalize: function() {
            var a = this._data,
            b = a.words,
            c = 8 * this._nDataBytes,
            d = 8 * a.sigBytes;
            b[d >>> 5] |= 128 << 24 - d % 32;
            b[(d + 64 >>> 9 << 4) + 14] = sa.floor(c / 4294967296);
            b[(d + 64 >>> 9 << 4) + 15] = c;
            a.sigBytes = 4 * b.length;
            this._process();
            return this._hash
        },
        _doReset: function() {
            this._hash = new xb.init(db.slice(0))
        },
        clone: function() {
            var a = ua.clone.call(this);
            a._hash = this._hash.clone();
            return a
        }
    });
    ta.SHA256 = ua._createHelper(R);
    ta.HmacSHA256 = ua._createHmacHelper(R);
    var fb = Y,
    zb = fb.lib.WordArray;
    fb.enc.Base64 = {
        parse: function(a) {
            var b = a.length,
            c = this._map,
            d = c.charAt(64);
            d && (d = a.indexOf(d), -1 != d && (b = d));
            for (var d = [], e = 0, f = 0; f < b; f++) if (f % 4) {
                var h = c.indexOf(a.charAt(f - 1)) << f % 4 * 2,
                p = c.indexOf(a.charAt(f)) >>> 6 - f % 4 * 2;
                d[e >>> 2] |= (h | p) << 24 - e % 4 * 8;
                e++
            }
            return zb.create(d, e)
        },
        stringify: function(a) {
            var b = a.words,
            c = a.sigBytes,
            d = this._map;
            a.clamp();
            a = [];
            for (var e = 0; e < c; e += 3) for (var f = (b[e >>> 2] >>> 24 - e % 4 * 8 & 255) << 16 | (b[e + 1 >>> 2] >>> 24 - (e + 1) % 4 * 8 & 255) << 8 | b[e + 2 >>> 2] >>> 24 - (e + 2) % 4 * 8 & 255, h = 0; 4 > h && e + .75 * h < c; h++) a.push(d.charAt(f >>> 6 * (3 - h) & 63));
            if (b = d.charAt(64)) for (; a.length % 4;) a.push(b);
            return a.join("")
        },
        _map: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_"
    };
    var gb = {
        browserVersion: "d435",
        hasLiedLanguages: "j5po",
        scrAvailSize: "TeRS",
        localStorage: "XM7l",
        hasLiedOs: "ci5c",
        sessionStorage: "HVia",
        indexedDb: "3sw-",
        userAgent: "0aew",
        userLanguage: "hLzX",
        scrAvailHeight: "88tV",
        browserName: "-UVA",
        scrColorDepth: "qmyu",
        hasLiedResolution: "3neK",
        scrWidth: "ssI5",
        adblock: "FMQw",
        historyList: "kU5z",
        touchSupport: "wNLf",
        os: "hAqN",
        scrDeviceXDPI: "3jCe",
        doNotTrack: "VEek",
        srcScreenSize: "tOHY",
        openDatabase: "V8vl",
        timeZone: "q5aJ",
        appcodeName: "qT7b",
        webSmartID: "E3gR",
        systemLanguage: "e6OK",
        hasLiedBrowser: "2xC5",
        cpuClass: "Md7A",
        javaEnabled: "yD16",
        browserLanguage: "q4f3",
        localCode: "lEnu",
        cookieEnabled: "VPIf",
        online: "9vyE",
        appMinorVersion: "qBVW",
        flashVersion: "dzuS",
        mimeTypes: "jp76",
        scrHeight: "5Jwy",
        storeDb: "Fvje",
        scrAvailWidth: "E-lJ",
        jsFonts: "EOQP",
        plugins: "ks0Q",
        cookieCode: "VySQ"
    },
    X,
    I = r,
    q = u,
    O = g,
    hb = !1,
    pa = [function() {
        if (hb) {
            var a = q.getElementsByTagName("body")[0],
            b = q.createElement("object");
            b.setAttribute("type", "application/x-shockwave-flash");
            var c = a.appendChild(b);
            if (c) {
                var d = 0; (function f() {
                    if ("undefined" != typeof c.GetVariable) {
                        var h = c.GetVariable("$version");
                        h && (h = h.split(" ")[1].split(","), m.pv = [parseInt(h[0], 10), parseInt(h[1], 10), parseInt(h[2], 10)])
                    } else if (10 > d) {
                        d++;
                        G(f, 10);
                        return
                    }
                    a.removeChild(b);
                    c = null;
                    Ha()
                })()
            } else Ha()
        } else Ha()
    }],
    M = [],
    ma = [],
    T = [],
    Z,
    oa,
    Ea,
    Va,
    Q = !1,
    na = !1,
    L,
    Aa,
    Sa = !0,
    m,
    Ab = "undefined" != typeof q.getElementById && "undefined" != typeof q.getElementsByTagName && "undefined" != typeof q.createElement,
    wa = O.userAgent.toLowerCase(),
    xa = O.platform.toLowerCase(),
    Bb = xa ? /win/.test(xa) : /win/.test(wa),
    Cb = xa ? /mac/.test(xa) : /mac/.test(wa),
    Db = /webkit/.test(wa) ? parseFloat(wa.replace(/^.*webkit\/(\d+(\.\d+)?).*$/, "$1")) : !1,
    Ma = !+"\x0B1",
    ha = [0, 0, 0],
    H = null;
    if ("undefined" != typeof O.plugins && "object" == typeof O.plugins["Shockwave Flash"]) ! (H = O.plugins["Shockwave Flash"].description) || "undefined" != typeof O.mimeTypes && O.mimeTypes["application/x-shockwave-flash"] && !O.mimeTypes["application/x-shockwave-flash"].enabledPlugin || (hb = !0, Ma = !1, H = H.replace(/^.*\s+(\S+\s+\S+$)/, "$1"), ha[0] = parseInt(H.replace(/^(.*)\..*$/, "$1"), 10), ha[1] = parseInt(H.replace(/^.*\.(.*)\s.*$/, "$1"), 10), ha[2] = /[a-zA-Z]/.test(H) ? parseInt(H.replace(/^.*[a-zA-Z]+(.*)$/, "$1"), 10) : 0);
    else if ("undefined" != typeof I.ActiveXObject) try {
        if (H = (new ActiveXObject("ShockwaveFlash.ShockwaveFlash")).GetVariable("$version")) Ma = !0,
        H = H.split(" ")[1].split(","),
        ha = [parseInt(H[0], 10), parseInt(H[1], 10), parseInt(H[2], 10)]
    } catch(a) {}
    m = {
        pv: ha,
        win: Bb,
        ie: Ma,
        mac: Cb,
        wk: Db,
        w3: Ab
    };
    m.w3 && (("undefined" != typeof q.readyState && "complete" == q.readyState || "undefined" == typeof q.readyState && (q.getElementsByTagName("body")[0] || q.body)) && U(), Q || ("undefined" != typeof q.addEventListener && q.addEventListener("DOMContentLoaded", U, !1), m.ie && m.win && (q.attachEvent("onreadystatechange",
    function b() {
        "complete" == q.readyState && (q.detachEvent("onreadystatechange", b), U())
    }), I == rb &&
    function c() {
        if (!Q) {
            try {
                q.documentElement.doScroll("left")
            } catch(d) {
                G(c, 0);
                return
            }
            U()
        }
    } ()), m.wk &&
    function b() {
        Q || (/loaded|complete/.test(q.readyState) ? U() : G(b, 0))
    } (), Wa(U)));
    m.ie && m.win && r.attachEvent("onunload",
    function() {
        for (var a = T.length,
        b = 0; b < a; b++) T[b][0].detachEvent(T[b][1], T[b][2]);
        a = ma.length;
        for (b = 0; b < a; b++) Ua(ma[b]);
        for (var c in m) m[c] = null;
        m = null;
        for (var d in X) X[d] = null;
        X = null
    });
    X = {
        registerObject: function(a, b, c, d) {
            if (m.w3 && a && b) {
                var e = {};
                e.id = a;
                e.swfVersion = b;
                e.expressInstall = c;
                e.callbackFn = d;
                M[M.length] = e;
                P(a, !1)
            } else d && d({
                id: a,
                success: !1
            })
        },
        getFlashPlayerVersion: function() {
            return {
                minor: m.pv[1],
                release: m.pv[2],
                major: m.pv[0]
            }
        },
        getObjectById: function(a) {
            if (m.w3) return Ga(a)
        },
        createCSS: function(a, b, c, d) {
            m.w3 && Ta(a, b, c, d)
        },
        ua: m,
        switchOffAutoHideShow: function() {
            Sa = !1
        },
        expressInstallCallback: function() {
            if (na) {
                var a = J("SWFObjectExprInst");
                a && Z && (a.parentNode.replaceChild(Z, a), oa && (P(oa, !0), m.ie && m.win && (Z.style.display = "block")), Ea && Ea(Va));
                na = !1
            }
        },
        showExpressInstall: function(a, b, c, d) {
            m.w3 && Fa() && Da(a, b, c, d)
        },
        createSWF: function(a, b, c) {
            if (m.w3) return Ba(a, b, c)
        },
        embedSWF: function(a, b, c, d, e, f, h, p, g, l) {
            var K = {
                id: b,
                success: !1
            };
            m.w3 && !(m.wk && 312 > m.wk) && a && b && c && d && e ? (P(b, !1), Xa(function() {
                c += "";
                d += "";
                var k = {};
                if (g && "object" === typeof g) for (var n in g) k[n] = g[n];
                k.data = a;
                k.width = c;
                k.height = d;
                n = {};
                if (p && "object" === typeof p) for (var m in p) n[m] = p[m];
                if (h && "object" === typeof h) for (var q in h) n.flashvars = "undefined" != typeof n.flashvars ? n.flashvars + ("\x26" + q + "\x3d" + h[q]) : q + "\x3d" + h[q];
                if (la(e)) m = Ba(k, n, b),
                k.id == b && P(b, !0),
                K.success = !0,
                K.ref = m;
                else {
                    if (f && Fa()) {
                        k.data = f;
                        Da(k, n, b, l);
                        return
                    }
                    P(b, !0)
                }
                l && l(K)
            })) : l && l(K)
        },
        removeSWF: function(a) {
            m.w3 && Ua(a)
        },
        addLoadEvent: Wa,
        hasFlashPlayerVersion: la,
        addDomLoadEvent: Xa,
        getQueryParamValue: function(a) {
            var b = q.location.search || q.location.hash;
            if (b) { / \ ? /.test(b)&&(b=b.split("?")[1]);if(null==a)return Ra(b);for(var b=b.split("\x26"),c=0;c<b.length;c++)if(b[c].substring(0,
b[c].indexOf("\x3d"))==a)return Ra(b[c].substring(b[c].indexOf("\x3d")+1))}return""}};var ca=8,Eb=["scrAvailWidth","scrAvailHeight"],Fb=["sessionStorage","localStorage","indexedDb","openDatabase"],Gb="appCodeName appMinorVersion appName cpuClass onLine systemLanguage userLanguage historyList hasLiedLanguages hasLiedResolution hasLiedOs hasLiedBrowser".split(" ");aa.prototype={isCanvasSupported:function(){var a=u.createElement("canvas");return!(!a.getContext||!a.getContext("2d"))},sessionStorageKey:function(a){!this.options.excludeSessionStorage&&
this.hasSessionStorage()&&a.push({key:"session_storage",value:1});return a},x64Rotl:function(a,b){b%=64;if(32===b)return[a[1],a[0]];if(32>b)return[a[0]<<b|a[1]>>>32-b,a[1]<<b|a[0]>>>32-b];b-=32;return[a[1]<<b|a[0]>>>32-b,a[0]<<b|a[1]>>>32-b]},pixelRatioKey:function(a){this.options.excludePixelRatio||a.push({value:this.getPixelRatio(),key:"pixel_ratio"});return a},getHasLiedResolution:function(){return y.width<y.availWidth||y.height<y.availHeight?!0:!1},hasSessionStorage:function(){try{return!!r.sessionStorage}catch(a){return!0}},
getAdBlock:function(){var a=u.createElement("div");a.innerHTML="\x26nbsp;";a.className="adsbox";var b="0";try{u.body.appendChild(a),0===u.getElementsByClassName("adsbox")[0].offsetHeight&&(b="1"),u.body.removeChild(a)}catch(c){b="0"}return b},screenResolutionKey:function(a){return this.options.excludeScreenResolution?a:this.getScreenResolution(a)},getHasLiedBrowser:function(){var a=g.userAgent.toLowerCase(),b=g.productSub,a=0<=a.indexOf("firefox")?"Firefox":0<=a.indexOf("opera")||0<=a.indexOf("opr")?
"Opera":0<=a.indexOf("chrome")?"Chrome":0<=a.indexOf("safari")?"Safari":0<=a.indexOf("trident")?"Internet Explorer":"Other";if(("Chrome"===a||"Safari"===a||"Opera"===a)&&"20030107"!==b)return!0;b=eval.toString().length;if(37===b&&"Safari"!==a&&"Firefox"!==a&&"Other"!==a||39===b&&"Internet Explorer"!==a&&"Other"!==a||33===b&&"Chrome"!==a&&"Opera"!==a&&"Other"!==a)return!0;var c;try{throw"a";}catch(d){try{d.toSource(),c=!0}catch(e){c=!1}}return c&&"Firefox"!==a&&"Other"!==a?!0:!1},map:function(a,b,
c){var d=[];if(null==a)return d;if(this.nativeMap&&a.map===this.nativeMap)return a.map(b,c);this.each(a,function(a,f,h){d[d.length]=b.call(c,a,f,h)});return d},languageKey:function(a){this.options.excludeLanguage||a.push({key:"language",value:g.language||g.userLanguage||g.browserLanguage||g.systemLanguage||""});return a},hasSwfObjectLoaded:function(){return"undefined"!==typeof r.swfobject},extend:function(a,b){if(null==a)return b;for(var c in a)null!=a[c]&&b[c]!==a[c]&&(b[c]=a[c]);return b},touchSupportKey:function(a){this.options.excludeTouchSupport||
a.push({key:"touch_support",value:this.getTouchSupport()});return a},x64hash128:function(a,b){a=a||"";b=b||0;for(var c=a.length%16,d=a.length-c,e=[0,b],f=[0,b],h,p,g=[2277735313,289559509],m=[1291169091,658871167],l=0;l<d;l+=16)h=[a.charCodeAt(l+4)&255|(a.charCodeAt(l+5)&255)<<8|(a.charCodeAt(l+6)&255)<<16|(a.charCodeAt(l+7)&255)<<24,a.charCodeAt(l)&255|(a.charCodeAt(l+1)&255)<<8|(a.charCodeAt(l+2)&255)<<16|(a.charCodeAt(l+3)&255)<<24],p=[a.charCodeAt(l+12)&255|(a.charCodeAt(l+13)&255)<<8|(a.charCodeAt(l+
14)&255)<<16|(a.charCodeAt(l+15)&255)<<24,a.charCodeAt(l+8)&255|(a.charCodeAt(l+9)&255)<<8|(a.charCodeAt(l+10)&255)<<16|(a.charCodeAt(l+11)&255)<<24],h=this.x64Multiply(h,g),h=this.x64Rotl(h,31),h=this.x64Multiply(h,m),e=this.x64Xor(e,h),e=this.x64Rotl(e,27),e=this.x64Add(e,f),e=this.x64Add(this.x64Multiply(e,[0,5]),[0,1390208809]),p=this.x64Multiply(p,m),p=this.x64Rotl(p,33),p=this.x64Multiply(p,g),f=this.x64Xor(f,p),f=this.x64Rotl(f,31),f=this.x64Add(f,e),f=this.x64Add(this.x64Multiply(f,[0,5]),
[0,944331445]);h=[0,0];p=[0,0];switch(c){case 15:p=this.x64Xor(p,this.x64LeftShift([0,a.charCodeAt(l+14)],48));case 14:p=this.x64Xor(p,this.x64LeftShift([0,a.charCodeAt(l+13)],40));case 13:p=this.x64Xor(p,this.x64LeftShift([0,a.charCodeAt(l+12)],32));case 12:p=this.x64Xor(p,this.x64LeftShift([0,a.charCodeAt(l+11)],24));case 11:p=this.x64Xor(p,this.x64LeftShift([0,a.charCodeAt(l+10)],16));case 10:p=this.x64Xor(p,this.x64LeftShift([0,a.charCodeAt(l+9)],8));case 9:p=this.x64Xor(p,[0,a.charCodeAt(l+8)]),
p=this.x64Multiply(p,m),p=this.x64Rotl(p,33),p=this.x64Multiply(p,g),f=this.x64Xor(f,p);case 8:h=this.x64Xor(h,this.x64LeftShift([0,a.charCodeAt(l+7)],56));case 7:h=this.x64Xor(h,this.x64LeftShift([0,a.charCodeAt(l+6)],48));case 6:h=this.x64Xor(h,this.x64LeftShift([0,a.charCodeAt(l+5)],40));case 5:h=this.x64Xor(h,this.x64LeftShift([0,a.charCodeAt(l+4)],32));case 4:h=this.x64Xor(h,this.x64LeftShift([0,a.charCodeAt(l+3)],24));case 3:h=this.x64Xor(h,this.x64LeftShift([0,a.charCodeAt(l+2)],16));case 2:h=
this.x64Xor(h,this.x64LeftShift([0,a.charCodeAt(l+1)],8));case 1:h=this.x64Xor(h,[0,a.charCodeAt(l)]),h=this.x64Multiply(h,g),h=this.x64Rotl(h,31),h=this.x64Multiply(h,m),e=this.x64Xor(e,h)}e=this.x64Xor(e,[0,a.length]);f=this.x64Xor(f,[0,a.length]);e=this.x64Add(e,f);f=this.x64Add(f,e);e=this.x64Fmix(e);f=this.x64Fmix(f);e=this.x64Add(e,f);f=this.x64Add(f,e);return("00000000"+(e[0]>>>0).toString(16)).slice(-8)+("00000000"+(e[1]>>>0).toString(16)).slice(-8)+("00000000"+(f[0]>>>0).toString(16)).slice(-8)+
("00000000"+(f[1]>>>0).toString(16)).slice(-8)},pluginsKey:function(a){this.options.excludePlugins||(this.isIE()?this.options.excludeIEPlugins||a.push({value:this.getIEPlugins(),key:"ie_plugins"}):a.push({value:this.getRegularPlugins(),key:"regular_plugins"}));return a},hasLiedLanguagesKey:function(a){this.options.excludeHasLiedLanguages||a.push({key:"has_lied_languages",value:this.getHasLiedLanguages()});return a},getCanvasFp:function(){var a=[],b=u.createElement("canvas");b.width=2E3;b.height=200;
b.style.display="inline";var c=b.getContext("2d");c.rect(0,0,10,10);c.rect(2,2,6,6);a.push("canvas winding:"+(!1===c.isPointInPath(5,5,"evenodd")?"yes":"no"));c.textBaseline="alphabetic";c.fillStyle="#f60";c.fillRect(125,1,62,20);c.fillStyle="#069";c.font=this.options.dontUseFakeFontInCanvas?"11pt Arial":"11pt no-real-font-123";c.fillText("Cwm fjordbank glyphs vext quiz, \ud83d\ude03",2,15);c.fillStyle="rgba(102, 204, 0, 0.2)";c.font="18pt Arial";c.fillText("Cwm fjordbank glyphs vext quiz, \ud83d\ude03",
4,45);c.globalCompositeOperation="multiply";c.fillStyle="rgb(255,0,255)";c.beginPath();c.arc(50,50,50,0,2*Math.PI,!0);c.closePath();c.fill();c.fillStyle="rgb(0,255,255)";c.beginPath();c.arc(100,50,50,0,2*Math.PI,!0);c.closePath();c.fill();c.fillStyle="rgb(255,255,0)";c.beginPath();c.arc(75,100,50,0,2*Math.PI,!0);c.closePath();c.fill();c.fillStyle="rgb(255,0,255)";c.arc(75,75,75,0,2*Math.PI,!0);c.arc(75,75,25,0,2*Math.PI,!0);c.fill("evenodd");a.push("canvas fp:"+b.toDataURL());return a.join("~")},
platformKey:function(a){this.options.excludePlatform||a.push({value:this.getNavigatorPlatform(),key:"navigator_platform"});return a},getWebglFp:function(){function a(a){b.clearColor(0,0,0,1);b.enable(b.DEPTH_TEST);b.depthFunc(b.LEQUAL);b.clear(b.COLOR_BUFFER_BIT|b.DEPTH_BUFFER_BIT);return"["+a[0]+", "+a[1]+"]"}var b;b=this.getWebglCanvas();if(!b)return null;var c=[],d=b.createBuffer();b.bindBuffer(b.ARRAY_BUFFER,d);var e=new Float32Array([-.2,-.9,0,.4,-.26,0,0,.732134444,0]);b.bufferData(b.ARRAY_BUFFER,
e,b.STATIC_DRAW);d.itemSize=3;d.numItems=3;var e=b.createProgram(),f=b.createShader(b.VERTEX_SHADER);b.shaderSource(f,"attribute vec2 attrVertex;varying vec2 varyinTexCoordinate;uniform vec2 uniformOffset;void main(){varyinTexCoordinate\x3dattrVertex+uniformOffset;gl_Position\x3dvec4(attrVertex,0,1);}");b.compileShader(f);var h=b.createShader(b.FRAGMENT_SHADER);b.shaderSource(h,"precision mediump float;varying vec2 varyinTexCoordinate;void main() {gl_FragColor\x3dvec4(varyinTexCoordinate,0,1);}");
b.compileShader(h);b.attachShader(e,f);b.attachShader(e,h);b.linkProgram(e);b.useProgram(e);e.vertexPosAttrib=b.getAttribLocation(e,"attrVertex");e.offsetUniform=b.getUniformLocation(e,"uniformOffset");b.enableVertexAttribArray(e.vertexPosArray);b.vertexAttribPointer(e.vertexPosAttrib,d.itemSize,b.FLOAT,!1,0,0);b.uniform2f(e.offsetUniform,1,1);b.drawArrays(b.T