/* Replayable replacements for global functions */

/***************************************************************
 * BEGIN STABLE.JS
 **************************************************************/
//! stable.js 0.1.3, https://github.com/Two-Screen/stable
//! © 2012 Stéphan Kochen, Angry Bytes. MIT licensed.
(function() {

// A stable array sort, because `Array#sort()` is not guaranteed stable.
// This is an implementation of merge sort, without recursion.

var stable = function(arr, comp) {
    if (typeof(comp) !== 'function') {
        comp = function(a, b) {
            a = String(a);
            b = String(b);
            if (a < b) return -1;
            if (a > b) return 1;
            return 0;
        };
    }

    var len = arr.length;

    if (len <= 1) return arr;

    // Rather than dividing input, simply iterate chunks of 1, 2, 4, 8, etc.
    // Chunks are the size of the left or right hand in merge sort.
    // Stop when the left-hand covers all of the array.
    var oarr = arr;
    for (var chk = 1; chk < len; chk *= 2) {
        arr = pass(arr, comp, chk);
    }
    for (var i = 0; i < len; i++) {
        oarr[i] = arr[i];
    }
    return oarr;
};

// Run a single pass with the given chunk size. Returns a new array.
var pass = function(arr, comp, chk) {
    var len = arr.length;
    // Output, and position.
    var result = new Array(len);
    var i = 0;
    // Step size / double chunk size.
    var dbl = chk * 2;
    // Bounds of the left and right chunks.
    var l, r, e;
    // Iterators over the left and right chunk.
    var li, ri;

    // Iterate over pairs of chunks.
    for (l = 0; l < len; l += dbl) {
        r = l + chk;
        e = r + chk;
        if (r > len) r = len;
        if (e > len) e = len;

        // Iterate both chunks in parallel.
        li = l;
        ri = r;
        while (true) {
            // Compare the chunks.
            if (li < r && ri < e) {
                // This works for a regular `sort()` compatible comparator,
                // but also for a simple comparator like: `a > b`
                if (comp(arr[li], arr[ri]) <= 0) {
                    result[i++] = arr[li++];
                }
                else {
                    result[i++] = arr[ri++];
                }
            }
            // Nothing to compare, just flush what's left.
            else if (li < r) {
                result[i++] = arr[li++];
            }
            else if (ri < e) {
                result[i++] = arr[ri++];
            }
            // Both iterators are at the chunk ends.
            else {
                break;
            }
        }
    }

    return result;
};

var arrsort = function(comp) {
    return stable(this, comp);
};

if (Object.defineProperty) {
    Object.defineProperty(Array.prototype, "sort", {
        configurable: true, writable: true, enumerable: false,
        value: arrsort
    });
} else {
    Array.prototype.sort = arrsort;
}

})();
/***************************************************************
 * END STABLE.JS
 **************************************************************/

/*
 * In a generated replay, this file is partially common, boilerplate code
 * included in every replay, and partially generated replay code. The following
 * header applies to the boilerplate code. A comment indicating "Auto-generated
 * below this comment" marks the separation between these two parts.
 *
 * Copyright (C) 2011, 2012 Purdue University
 * Written by Gregor Richards
 * All rights reserved.
 * 
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 * 
 * 1. Redistributions of source code must retain the above copyright notice,
 *    this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright notice,
 *    this list of conditions and the following disclaimer in the documentation
 *    and/or other materials provided with the distribution.
 * 
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 */

(function() {
    // global eval alias
    var geval = eval;

    // detect if we're in a browser or not
    var inbrowser = false;
    var inharness = false;
    var finished = false;
    if (typeof window !== "undefined" && "document" in window) {
        inbrowser = true;
        if (window.parent && "JSBNG_handleResult" in window.parent) {
            inharness = true;
        }
    } else if (typeof global !== "undefined") {
        window = global;
        window.top = window;
    } else {
        window = (function() { return this; })();
        window.top = window;
    }

    if ("console" in window) {
        window.JSBNG_Console = window.console;
    }

    var callpath = [];

    // global state
    var JSBNG_Replay = window.top.JSBNG_Replay = {
        push: function(arr, fun) {
            arr.push(fun);
            return fun;
        },

        path: function(str) {
            verifyPath(str);
        },

        forInKeys: function(of) {
            var keys = [];
            for (var k in of)
                keys.push(k);
            return keys.sort();
        }
    };

    var currentTimeInMS;
    if (inharness) {
        currentTimeInMS = window.parent.currentTimeInMS;
    } else {
        if (window.performance && window.performance.now)
            currentTimeInMS = function() { return window.performance.now() };
        else if (typeof preciseTime !== 'undefined')
            currentTimeInMS = function() { return preciseTime() * 1000; };
        else
            currentTimeInMS = function() { return Date.now(); };
    }

    // the actual replay runner
    function onload() {
        try {
            delete window.onload;
        } catch (ex) {}

        var jr = JSBNG_Replay$;
        var cb = function() {
            var end = currentTimeInMS();
            finished = true;

            var msg = "Time: " + (end - st) + "ms";
    
            if (inharness) {
                window.parent.JSBNG_handleResult({error:false, time:(end - st)});
            } else if (inbrowser) {
                var res = document.createElement("div");
    
                res.style.position = "fixed";
                res.style.left = "1em";
                res.style.top = "1em";
                res.style.width = "35em";
                res.style.height = "5em";
                res.style.padding = "1em";
                res.style.backgroundColor = "white";
                res.style.color = "black";
                res.appendChild(document.createTextNode(msg));
    
                document.body.appendChild(res);
            } else if (typeof console !== "undefined") {
                console.log(msg);
            } else if (typeof print !== "undefined") {
                // hopefully not the browser print() function :)
                print(msg);
            }
        };

        // force it to JIT
        jr(false);

        // then time it
        var st = currentTimeInMS();
        while (jr !== null) {
            jr = jr(true, cb);
        }
    }

    // add a frame at replay time
    function iframe(pageid) {
        var iw;
        if (inbrowser) {
            // represent the iframe as an iframe (of course)
            var iframe = document.createElement("iframe");
            iframe.style.display = "none";
            document.body.appendChild(iframe);
            iw = iframe.contentWindow;
            iw.document.write("<script type=\"text/javascript\">var JSBNG_Replay_geval = eval;</script>");
            iw.document.close();
        } else {
            // no general way, just lie and do horrible things
            var topwin = window;
            (function() {
                var window = {};
                window.window = window;
                window.top = topwin;
                window.JSBNG_Replay_geval = function(str) {
                    eval(str);
                }
                iw = window;
            })();
        }
        return iw;
    }

    // called at the end of the replay stuff
    function finalize() {
        if (inbrowser) {
            setTimeout(onload, 0);
        } else {
            onload();
        }
    }

    // verify this recorded value and this replayed value are close enough
    function verify(rep, rec) {
        if (rec !== rep &&
            (rep === rep || rec === rec) /* NaN test */) {
            // FIXME?
            if (typeof rec === "function" && typeof rep === "function") {
                return true;
            }
            if (typeof rec !== "object" || rec === null ||
                !(("__JSBNG_unknown_" + typeof(rep)) in rec)) {
                return false;
            }
        }
        return true;
    }

    // general message
    var firstMessage = true;
    function replayMessage(msg) {
        if (inbrowser) {
            if (firstMessage)
                document.open();
            firstMessage = false;
            document.write(msg);
        } else {
            console.log(msg);
        }
    }

    // complain when there's an error
    function verificationError(msg) {
        if (finished) return;
        if (inharness) {
            window.parent.JSBNG_handleResult({error:true, msg: msg});
        } else replayMessage(msg);
        throw new Error();
    }

    // to verify a set
    function verifySet(objstr, obj, prop, gvalstr, gval) {
        if (/^on/.test(prop)) {
            // these aren't instrumented compatibly
            return;
        }

        if (!verify(obj[prop], gval)) {
            var bval = obj[prop];
            var msg = "Verification failure! " + objstr + "." + prop + " is not " + gvalstr + ", it's " + bval + "!";
            verificationError(msg);
        }
    }

    // to verify a call or new
    function verifyCall(iscall, func, cthis, cargs) {
        var ok = true;
        var callArgs = func.callArgs[func.inst];
        iscall = iscall ? 1 : 0;
        if (cargs.length !== callArgs.length - 1) {
            ok = false;
        } else {
            if (iscall && !verify(cthis, callArgs[0])) ok = false;
            for (var i = 0; i < cargs.length; i++) {
                if (!verify(cargs[i], callArgs[i+1])) ok = false;
            }
        }
        if (!ok) {
            var msg = "Call verification failure!";
            verificationError(msg);
        }

        return func.returns[func.inst++];
    }

    // to verify the callpath
    function verifyPath(func) {
        var real = callpath.shift();
        if (real !== func) {
            var msg = "Call path verification failure! Expected " + real + ", found " + func;
            verificationError(msg);
        }
    }

    // figure out how to define getters
    var defineGetter;
    if (Object.defineProperty) {
        var odp = Object.defineProperty;
        defineGetter = function(obj, prop, getter, setter) {
            if (typeof setter === "undefined") setter = function(){};
            odp(obj, prop, {"enumerable": true, "configurable": true, "get": getter, "set": setter});
        };
    } else if (Object.prototype.__defineGetter__) {
        var opdg = Object.prototype.__defineGetter__;
        var opds = Object.prototype.__defineSetter__;
        defineGetter = function(obj, prop, getter, setter) {
            if (typeof setter === "undefined") setter = function(){};
            opdg.call(obj, prop, getter);
            opds.call(obj, prop, setter);
        };
    } else {
        defineGetter = function() {
            verificationError("This replay requires getters for correct behavior, and your JS engine appears to be incapable of defining getters. Sorry!");
        };
    }

    var defineRegetter = function(obj, prop, getter, setter) {
        defineGetter(obj, prop, function() {
            return getter.call(this, prop);
        }, function(val) {
            // once it's set by the client, it's claimed
            setter.call(this, prop, val);
            Object.defineProperty(obj, prop, {
                "enumerable": true, "configurable": true, "writable": true,
                "value": val
            });
        });
    }

    // for calling events
    var fpc = Function.prototype.call;

// resist the urge, don't put a })(); here!
/******************************************************************************
 * Auto-generated below this comment
 *****************************************************************************/
var ow449694821 = window;
var f449694821_0;
var o0;
var o1;
var f449694821_4;
var f449694821_7;
var f449694821_16;
var f449694821_17;
var f449694821_18;
var o2;
var o3;
var o4;
var f449694821_57;
var o5;
var f449694821_64;
var f449694821_239;
var f449694821_386;
var f449694821_387;
var f449694821_388;
var f449694821_389;
var f449694821_391;
var o6;
var o7;
var f449694821_394;
var o8;
var f449694821_396;
var o9;
var f449694821_398;
var o10;
var f449694821_405;
var f449694821_406;
var o11;
var o12;
var o13;
var o14;
var o15;
var o16;
var o17;
var f449694821_419;
var o18;
var f449694821_422;
var f449694821_424;
var f449694821_427;
var f449694821_428;
var f449694821_402;
var o19;
var o20;
var o21;
var o22;
var o23;
var o24;
var o25;
var o26;
var o27;
var f449694821_443;
var f449694821_444;
var f449694821_445;
var f449694821_446;
var f449694821_450;
var o28;
var o29;
var o30;
var o31;
var o32;
var o33;
var o34;
var f449694821_466;
var o35;
var o36;
var o37;
var o38;
var o39;
var o40;
var f449694821_479;
var o41;
var o42;
var o43;
var f449694821_510;
var f449694821_511;
var f449694821_512;
var o44;
var f449694821_514;
var f449694821_516;
var f449694821_517;
var o45;
var f449694821_520;
var f449694821_521;
var f449694821_522;
var o46;
var o47;
var o48;
var o49;
var o50;
var o51;
var o52;
var o53;
var o54;
var o55;
var o56;
var o57;
var o58;
var o59;
var o60;
var o61;
var o62;
var o63;
var o64;
var f449694821_553;
var o65;
var f449694821_563;
var f449694821_566;
var f449694821_691;
var f449694821_748;
var f449694821_767;
var f449694821_770;
var f449694821_771;
var f449694821_795;
var f449694821_799;
var f449694821_800;
var f449694821_802;
var f449694821_812;
var f449694821_816;
var f449694821_818;
var f449694821_820;
var f449694821_822;
var f449694821_823;
var f449694821_824;
var f449694821_825;
var f449694821_826;
var fo449694821_803_readyState;
var f449694821_914;
var f449694821_915;
var f449694821_916;
var f449694821_917;
var f449694821_919;
var f449694821_920;
var f449694821_921;
var f449694821_922;
var o66;
var o67;
var o68;
var o69;
var o70;
var o71;
var o72;
var o73;
var o74;
var o75;
var o76;
var o77;
var o78;
var o79;
var o80;
var o81;
var o82;
var o83;
var o84;
var o85;
var o86;
var o87;
var o88;
var o89;
var o90;
var o91;
var o92;
var o93;
var o94;
var o95;
var o96;
var o97;
var o98;
var o99;
var o100;
var o101;
var o102;
var o103;
var o104;
var o105;
var o106;
var o107;
var o108;
var o109;
var o110;
var o111;
var o112;
var o113;
var o114;
var o115;
var o116;
var o117;
var o118;
var o119;
var o120;
var o121;
var o122;
var o123;
var o124;
var o125;
var o126;
var o127;
var o128;
var o129;
var o130;
var o131;
var o132;
var o133;
var o134;
var o135;
var o136;
var o137;
var o138;
var o139;
var o140;
var o141;
var o142;
var o143;
var o144;
var o145;
var o146;
var o147;
var o148;
var o149;
var o150;
var o151;
var o152;
var o153;
var o154;
var o155;
var o156;
var o157;
var o158;
var o159;
var o160;
var o161;
var o162;
var o163;
var o164;
var o165;
var o166;
var o167;
var o168;
var o169;
var o170;
var o171;
var o172;
var o173;
var o174;
var o175;
var o176;
var o177;
var o178;
var o179;
var o180;
var o181;
var o182;
var o183;
var o184;
var o185;
var o186;
var o187;
var o188;
var o189;
var o190;
var o191;
var o192;
var o193;
var o194;
var o195;
var o196;
var o197;
var o198;
var o199;
var o200;
var o201;
var o202;
var o203;
var o204;
var o205;
var o206;
var o207;
var o208;
var o209;
var o210;
var o211;
var o212;
var o213;
var o214;
var o215;
var o216;
var o217;
var o218;
var o219;
var o220;
var o221;
var o222;
var o223;
var o224;
var o225;
var o226;
var o227;
var o228;
var o229;
var o230;
var o231;
var o232;
var o233;
var o234;
var o235;
var o236;
var o237;
var o238;
var o239;
var o240;
var o241;
var o242;
var o243;
var o244;
var o245;
var o246;
var o247;
var o248;
var o249;
var o250;
var o251;
var o252;
var o253;
var o254;
JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1 = [];
JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_222 = [];
JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_190 = [];
JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_278 = [];
JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_376 = [];
JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_378 = [];
JSBNG_Replay.s5e7dba3ea700a5261ca8857ec975a807389e8969_42 = [];
JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_96 = [];
JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_225 = [];
JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39 = [];
JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_226 = [];
// 1
// record generated by JSBench 8fa236f2f0ec at 2013-07-10T21:01:21.708Z
// 2
// 3
f449694821_0 = function() { return f449694821_0.returns[f449694821_0.inst++]; };
f449694821_0.returns = [];
f449694821_0.inst = 0;
// 4
ow449694821.JSBNG__Date = f449694821_0;
// 5
o0 = {};
// 6
ow449694821.JSBNG__document = o0;
// 7
o1 = {};
// 8
ow449694821.JSBNG__sessionStorage = o1;
// 11
f449694821_4 = function() { return f449694821_4.returns[f449694821_4.inst++]; };
f449694821_4.returns = [];
f449694821_4.inst = 0;
// 12
ow449694821.JSBNG__getComputedStyle = f449694821_4;
// 17
f449694821_7 = function() { return f449694821_7.returns[f449694821_7.inst++]; };
f449694821_7.returns = [];
f449694821_7.inst = 0;
// 18
ow449694821.JSBNG__addEventListener = f449694821_7;
// 19
ow449694821.JSBNG__top = ow449694821;
// 28
ow449694821.JSBNG__scrollX = 0;
// 29
ow449694821.JSBNG__scrollY = 0;
// 38
f449694821_16 = function() { return f449694821_16.returns[f449694821_16.inst++]; };
f449694821_16.returns = [];
f449694821_16.inst = 0;
// 39
ow449694821.JSBNG__setTimeout = f449694821_16;
// 40
f449694821_17 = function() { return f449694821_17.returns[f449694821_17.inst++]; };
f449694821_17.returns = [];
f449694821_17.inst = 0;
// 41
ow449694821.JSBNG__setInterval = f449694821_17;
// 42
f449694821_18 = function() { return f449694821_18.returns[f449694821_18.inst++]; };
f449694821_18.returns = [];
f449694821_18.inst = 0;
// 43
ow449694821.JSBNG__clearTimeout = f449694821_18;
// 60
ow449694821.JSBNG__frames = ow449694821;
// 63
ow449694821.JSBNG__self = ow449694821;
// 64
o2 = {};
// 65
ow449694821.JSBNG__navigator = o2;
// 68
o3 = {};
// 69
ow449694821.JSBNG__history = o3;
// 70
ow449694821.JSBNG__content = ow449694821;
// 81
ow449694821.JSBNG__closed = false;
// 84
ow449694821.JSBNG__pkcs11 = null;
// 87
ow449694821.JSBNG__opener = null;
// 88
ow449694821.JSBNG__defaultStatus = "";
// 89
o4 = {};
// 90
ow449694821.JSBNG__location = o4;
// 91
ow449694821.JSBNG__innerWidth = 994;
// 92
ow449694821.JSBNG__innerHeight = 603;
// 93
ow449694821.JSBNG__outerWidth = 994;
// 94
ow449694821.JSBNG__outerHeight = 690;
// 95
ow449694821.JSBNG__screenX = 9;
// 96
ow449694821.JSBNG__screenY = 31;
// 97
ow449694821.JSBNG__mozInnerScreenX = 0;
// 98
ow449694821.JSBNG__mozInnerScreenY = 0;
// 99
ow449694821.JSBNG__pageXOffset = 0;
// 100
ow449694821.JSBNG__pageYOffset = 0;
// 101
ow449694821.JSBNG__scrollMaxX = 0;
// 102
ow449694821.JSBNG__scrollMaxY = 0;
// 103
ow449694821.JSBNG__fullScreen = false;
// 136
ow449694821.JSBNG__frameElement = null;
// 141
ow449694821.JSBNG__mozPaintCount = 0;
// 142
f449694821_57 = function() { return f449694821_57.returns[f449694821_57.inst++]; };
f449694821_57.returns = [];
f449694821_57.inst = 0;
// 143
ow449694821.JSBNG__mozRequestAnimationFrame = f449694821_57;
// 144
ow449694821.JSBNG__mozAnimationStartTime = 1373490145767;
// 145
o5 = {};
// 146
ow449694821.JSBNG__mozIndexedDB = o5;
// 155
ow449694821.JSBNG__devicePixelRatio = 1;
// 158
f449694821_64 = function() { return f449694821_64.returns[f449694821_64.inst++]; };
f449694821_64.returns = [];
f449694821_64.inst = 0;
// 159
ow449694821.JSBNG__XMLHttpRequest = f449694821_64;
// 166
ow449694821.JSBNG__name = "";
// 173
ow449694821.JSBNG__status = "";
// 176
ow449694821.JSBNG__Components = undefined;
// 511
f449694821_239 = function() { return f449694821_239.returns[f449694821_239.inst++]; };
f449694821_239.returns = [];
f449694821_239.inst = 0;
// 512
ow449694821.JSBNG__Event = f449694821_239;
// 771
ow449694821.JSBNG__indexedDB = o5;
// undefined
o5 = null;
// 804
ow449694821.JSBNG__onerror = null;
// 807
f449694821_386 = function() { return f449694821_386.returns[f449694821_386.inst++]; };
f449694821_386.returns = [];
f449694821_386.inst = 0;
// 808
ow449694821.Math.JSBNG__random = f449694821_386;
// 809
// 813
f449694821_387 = function() { return f449694821_387.returns[f449694821_387.inst++]; };
f449694821_387.returns = [];
f449694821_387.inst = 0;
// 814
f449694821_0.now = f449694821_387;
// 815
f449694821_387.returns.push(1373490150930);
// 816
o4.search = "?sk=welcome";
// 832
// 833
// 835
f449694821_388 = function() { return f449694821_388.returns[f449694821_388.inst++]; };
f449694821_388.returns = [];
f449694821_388.inst = 0;
// 836
o0.JSBNG__addEventListener = f449694821_388;
// 837
o2.userAgent = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:21.0) Gecko/20100101 Firefox/21.0";
// 839
f449694821_388.returns.push(undefined);
// 840
f449694821_389 = function() { return f449694821_389.returns[f449694821_389.inst++]; };
f449694821_389.returns = [];
f449694821_389.inst = 0;
// 841
ow449694821.JSBNG__onload = f449694821_389;
// 849
o5 = {};
// 856
o0.documentMode = void 0;
// 858
f449694821_391 = function() { return f449694821_391.returns[f449694821_391.inst++]; };
f449694821_391.returns = [];
f449694821_391.inst = 0;
// 859
o0.getElementsByTagName = f449694821_391;
// 860
o6 = {};
// 861
f449694821_391.returns.push(o6);
// 862
o6.length = 1;
// 863
o7 = {};
// 864
o6["0"] = o7;
// 865
f449694821_394 = function() { return f449694821_394.returns[f449694821_394.inst++]; };
f449694821_394.returns = [];
f449694821_394.inst = 0;
// 866
o0.createDocumentFragment = f449694821_394;
// 867
o8 = {};
// 868
f449694821_394.returns.push(o8);
// 870
f449694821_387.returns.push(1373490151003);
// 871
f449694821_396 = function() { return f449694821_396.returns[f449694821_396.inst++]; };
f449694821_396.returns = [];
f449694821_396.inst = 0;
// 872
o0.createElement = f449694821_396;
// 873
o9 = {};
// 874
f449694821_396.returns.push(o9);
// 875
// 876
// 877
// 878
// 879
// 880
// 881
f449694821_398 = function() { return f449694821_398.returns[f449694821_398.inst++]; };
f449694821_398.returns = [];
f449694821_398.inst = 0;
// 882
o8.appendChild = f449694821_398;
// 883
f449694821_398.returns.push(o9);
// 885
f449694821_387.returns.push(1373490151006);
// 887
o10 = {};
// 888
f449694821_396.returns.push(o10);
// 889
// 890
// 891
// 892
// 893
// 894
// 896
f449694821_398.returns.push(o10);
// 897
o7.appendChild = f449694821_398;
// 898
f449694821_398.returns.push(o8);
// 903
f449694821_387 = function() { return f449694821_387.returns[f449694821_387.inst++]; };
f449694821_387.returns = [];
f449694821_387.inst = 0;
// 905
f449694821_387.returns.push(1373490150930);
// 922
// 923
// 925
f449694821_388 = function() { return f449694821_388.returns[f449694821_388.inst++]; };
f449694821_388.returns = [];
f449694821_388.inst = 0;
// 929
f449694821_388.returns.push(undefined);
// 930
f449694821_389 = function() { return f449694821_389.returns[f449694821_389.inst++]; };
f449694821_389.returns = [];
f449694821_389.inst = 0;
// 939
o5 = {};
// 948
f449694821_391 = function() { return f449694821_391.returns[f449694821_391.inst++]; };
f449694821_391.returns = [];
f449694821_391.inst = 0;
// 950
o6 = {};
// 951
f449694821_391.returns.push(o6);
// 952
o6.length = 1;
// 953
o7 = {};
// 954
o6["0"] = o7;
// undefined
o6 = null;
// 955
f449694821_394 = function() { return f449694821_394.returns[f449694821_394.inst++]; };
f449694821_394.returns = [];
f449694821_394.inst = 0;
// 957
o8 = {};
// 958
f449694821_394.returns.push(o8);
// 960
f449694821_387.returns.push(1373490151003);
// 961
f449694821_396 = function() { return f449694821_396.returns[f449694821_396.inst++]; };
f449694821_396.returns = [];
f449694821_396.inst = 0;
// 963
o9 = {};
// 964
f449694821_396.returns.push(o9);
// 965
// 966
// 967
// 968
// 969
// 970
// 971
f449694821_398 = function() { return f449694821_398.returns[f449694821_398.inst++]; };
f449694821_398.returns = [];
f449694821_398.inst = 0;
// 972
o8.appendChild = f449694821_398;
// 973
f449694821_398.returns.push(o9);
// 975
f449694821_387.returns.push(1373490151006);
// 977
o10 = {};
// 978
f449694821_396.returns.push(o10);
// 979
// 980
// 981
// 982
// 983
// 984
// 986
f449694821_398.returns.push(o10);
// 987
o7.appendChild = f449694821_398;
// 988
f449694821_398.returns.push(o8);
// undefined
o8 = null;
// 999
f449694821_386.returns.push(0.10655516814670318);
// 1000
f449694821_405 = function() { return f449694821_405.returns[f449694821_405.inst++]; };
f449694821_405.returns = [];
f449694821_405.inst = 0;
// 1001
ow449694821.JSBNG__onunload = f449694821_405;
// 1003
f449694821_387.returns.push(1373490154326);
// 1004
f449694821_406 = function() { return f449694821_406.returns[f449694821_406.inst++]; };
f449694821_406.returns = [];
f449694821_406.inst = 0;
// 1005
o1.getItem = f449694821_406;
// undefined
o1 = null;
// 1006
f449694821_406.returns.push(null);
// 1008
f449694821_387.returns.push(1373490154328);
// 1009
f449694821_18.returns.push(undefined);
// 1010
f449694821_16.returns.push(2);
// 1014
o1 = {};
// 1015
o0.documentElement = o1;
// 1016
o1.className = "no_js";
// 1017
// 1019
o0.domain = "jsbngssl.www.facebook.com";
// 1020
// 1022
o4.href = "https://www.facebook.com/?sk=welcome";
// 1066
o6 = {};
// 1067
f449694821_391.returns.push(o6);
// 1068
o6.length = 8;
// 1069
o8 = {};
// 1070
o6["0"] = o8;
// 1071
o8.rel = "alternate";
// 1073
o11 = {};
// 1074
o6["1"] = o11;
// 1075
o11.rel = "stylesheet";
// 1077
o11.href = "http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y0/r/RxMmKV8uOEh.css";
// 1080
o12 = {};
// 1081
o6["2"] = o12;
// 1082
o12.rel = "stylesheet";
// 1084
o12.href = "http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yj/r/KbSyGJkqroJ.css";
// 1093
o13 = {};
// 1094
o6["3"] = o13;
// 1095
o13.rel = "stylesheet";
// 1097
o13.href = "http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yS/r/AXbdtQOFsWr.css";
// 1102
o14 = {};
// 1103
o6["4"] = o14;
// 1104
o14.rel = "shortcut icon";
// 1106
o15 = {};
// 1107
o6["5"] = o15;
// 1108
o15.rel = "stylesheet";
// 1110
o15.href = "http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yD/r/OWwnO_yMqhK.css";
// 1113
o16 = {};
// 1114
o6["6"] = o16;
// 1115
o16.rel = "stylesheet";
// 1117
o16.href = "http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yb/r/tOU0wFcLVo_.css";
// 1120
o17 = {};
// 1121
o6["7"] = o17;
// undefined
o6 = null;
// 1122
o17.rel = "stylesheet";
// 1124
o17.href = "http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yw/r/JDr6pTZ60bK.css";
// 1153
o6 = {};
// 1154
f449694821_396.returns.push(o6);
// 1155
// 1156
// 1157
f449694821_419 = function() { return f449694821_419.returns[f449694821_419.inst++]; };
f449694821_419.returns = [];
f449694821_419.inst = 0;
// 1158
o6.getElementsByTagName = f449694821_419;
// 1159
o18 = {};
// 1160
f449694821_419.returns.push(o18);
// 1161
o18.length = 0;
// undefined
o18 = null;
// 1163
o18 = {};
// 1164
o6.childNodes = o18;
// undefined
o6 = null;
// 1165
f449694821_422 = function() { return f449694821_422.returns[f449694821_422.inst++]; };
f449694821_422.returns = [];
f449694821_422.inst = 0;
// 1166
o18.item = f449694821_422;
// 1167
o18.length = 1;
// 1168
o6 = {};
// 1169
o18["0"] = o6;
// undefined
o18 = null;
// 1170
f449694821_424 = function() { return f449694821_424.returns[f449694821_424.inst++]; };
f449694821_424.returns = [];
f449694821_424.inst = 0;
// 1171
o6.getAttributeNode = f449694821_424;
// undefined
o6 = null;
// 1173
o6 = {};
// 1174
f449694821_424.returns.push(o6);
// 1175
o6.value = "u_0_1";
// undefined
o6 = null;
// 1224
f449694821_387.returns.push(1373490160712);
// 1226
f449694821_387.returns.push(1373490160713);
// 1227
f449694821_18.returns.push(undefined);
// 1228
f449694821_16.returns.push(3);
// 1233
f449694821_387.returns.push(1373490160714);
// 1234
o6 = {};
// 1235
o0.body = o6;
// 1236
o6.getElementsByTagName = f449694821_419;
// 1237
f449694821_427 = function() { return f449694821_427.returns[f449694821_427.inst++]; };
f449694821_427.returns = [];
f449694821_427.inst = 0;
// 1238
o0.querySelectorAll = f449694821_427;
// 1239
f449694821_428 = function() { return f449694821_428.returns[f449694821_428.inst++]; };
f449694821_428.returns = [];
f449694821_428.inst = 0;
// 1240
o6.querySelectorAll = f449694821_428;
// 1241
o18 = {};
// 1242
f449694821_428.returns.push(o18);
// 1243
o18.length = 0;
// undefined
o18 = null;
// 1244
f449694821_18.returns.push(undefined);
// 1245
f449694821_16.returns.push(4);
// 1251
o1.clientWidth = 979;
// 1268
f449694821_402 = {};
// 1269
o1.JSBNG__addEventListener = f449694821_402;
// 1271
f449694821_402 = function() { return f449694821_402.returns[f449694821_402.inst++]; };
f449694821_402.returns = [];
f449694821_402.inst = 0;
// 1272
f449694821_402.returns.push(undefined);
// 1274
f449694821_402.returns.push(undefined);
// 1283
f449694821_402.returns.push(undefined);
// 1296
// 1297
// 1298
// 1305
// 1309
// 1313
// 1317
// 1321
// 1325
// 1329
// 1333
// 1337
// 1341
// 1345
// 1349
// 1350
o18 = {};
// 1354
f449694821_387.returns.push(1373490165428);
// 1359
o19 = {};
// 1360
f449694821_394.returns.push(o19);
// 1362
f449694821_387.returns.push(1373490165430);
// 1364
o20 = {};
// 1365
f449694821_396.returns.push(o20);
// 1366
// 1367
// 1368
// 1369
// 1370
// 1371
// 1372
o19.appendChild = f449694821_398;
// 1373
f449694821_398.returns.push(o20);
// 1375
f449694821_387.returns.push(1373490165431);
// 1377
o21 = {};
// 1378
f449694821_396.returns.push(o21);
// 1379
// 1380
// 1381
// 1382
// 1383
// 1384
// 1386
f449694821_398.returns.push(o21);
// 1388
f449694821_387.returns.push(1373490165431);
// 1390
o22 = {};
// 1391
f449694821_396.returns.push(o22);
// 1392
// 1393
// 1394
// 1395
// 1396
// 1397
// 1399
f449694821_398.returns.push(o22);
// 1401
f449694821_387.returns.push(1373490165432);
// 1403
o23 = {};
// 1404
f449694821_396.returns.push(o23);
// 1405
// 1406
// 1407
// 1408
// 1409
// 1410
// 1412
f449694821_398.returns.push(o23);
// 1414
f449694821_387.returns.push(1373490165433);
// 1416
o24 = {};
// 1417
f449694821_396.returns.push(o24);
// 1418
// 1419
// 1420
// 1421
// 1422
// 1423
// 1425
f449694821_398.returns.push(o24);
// 1427
f449694821_387.returns.push(1373490165438);
// 1429
o25 = {};
// 1430
f449694821_396.returns.push(o25);
// 1431
// 1432
// 1433
// 1434
// 1435
// 1436
// 1438
f449694821_398.returns.push(o25);
// 1440
f449694821_387.returns.push(1373490165439);
// 1442
o26 = {};
// 1443
f449694821_396.returns.push(o26);
// 1444
// 1445
// 1446
// 1447
// 1448
// 1449
// 1451
f449694821_398.returns.push(o26);
// 1453
f449694821_387.returns.push(1373490165439);
// 1455
o27 = {};
// 1456
f449694821_396.returns.push(o27);
// 1457
// 1458
// 1459
// 1460
// 1461
// 1462
// 1464
f449694821_398.returns.push(o27);
// 1466
f449694821_398.returns.push(o19);
// 1468
f449694821_398.returns.push(o24);
// 1470
f449694821_387.returns.push(1373490165438);
// 1472
o25 = {};
// 1473
f449694821_396.returns.push(o25);
// 1474
// 1475
// 1476
// 1477
// 1478
// 1479
// 1481
f449694821_398.returns.push(o25);
// 1483
f449694821_387.returns.push(1373490165439);
// 1485
o26 = {};
// 1486
f449694821_396.returns.push(o26);
// 1487
// 1488
// 1489
// 1490
// 1491
// 1492
// 1494
f449694821_398.returns.push(o26);
// 1496
f449694821_387.returns.push(1373490165439);
// 1498
o27 = {};
// 1499
f449694821_396.returns.push(o27);
// 1500
// 1501
// 1502
// 1503
// 1504
// 1505
// 1507
f449694821_398.returns.push(o27);
// 1509
f449694821_398.returns.push(o19);
// 1512
f449694821_398.returns.push(o24);
// 1514
f449694821_387.returns.push(1373490165438);
// 1516
o25 = {};
// 1517
f449694821_396.returns.push(o25);
// 1518
// 1519
// 1520
// 1521
// 1522
// 1523
// 1525
f449694821_398.returns.push(o25);
// 1527
f449694821_387.returns.push(1373490165439);
// 1529
o26 = {};
// 1530
f449694821_396.returns.push(o26);
// 1531
// 1532
// 1533
// 1534
// 1535
// 1536
// 1538
f449694821_398.returns.push(o26);
// 1540
f449694821_387.returns.push(1373490165439);
// 1542
o27 = {};
// 1543
f449694821_396.returns.push(o27);
// 1544
// 1545
// 1546
// 1547
// 1548
// 1549
// 1551
f449694821_398.returns.push(o27);
// 1553
f449694821_398.returns.push(o19);
// undefined
o19 = null;
// 1559
o4.protocol = "https:";
// 1560
o0.cookie = "c_user=100006118350059; csm=2";
// 1562
f449694821_387.returns.push(1373490165629);
// 1563
o19 = {};
// 1564
f449694821_0.returns.push(o19);
// 1565
f449694821_443 = function() { return f449694821_443.returns[f449694821_443.inst++]; };
f449694821_443.returns = [];
f449694821_443.inst = 0;
// 1566
o19.toGMTString = f449694821_443;
// undefined
o19 = null;
// 1567
f449694821_443.returns.push("Wed, 17 Jul 2013 21:02:45 GMT");
// 1568
o4.hostname = "jsbngssl.www.facebook.com";
// 1571
f449694821_387.returns.push(1373490165631);
// 1580
o1.nodeName = "HTML";
// 1581
o1.__FB_TOKEN = void 0;
// 1582
// 1583
f449694821_444 = function() { return f449694821_444.returns[f449694821_444.inst++]; };
f449694821_444.returns = [];
f449694821_444.inst = 0;
// 1584
o1.getAttribute = f449694821_444;
// 1585
f449694821_445 = function() { return f449694821_445.returns[f449694821_445.inst++]; };
f449694821_445.returns = [];
f449694821_445.inst = 0;
// 1586
o1.hasAttribute = f449694821_445;
// 1588
f449694821_445.returns.push(false);
// 1591
f449694821_402.returns.push(undefined);
// 1592
o1.JSBNG__oninput = null;
// 1597
f449694821_402.returns.push(undefined);
// 1598
o1.JSBNG__onkeyup = null;
// 1605
f449694821_402.returns.push(undefined);
// 1606
f449694821_446 = function() { return f449694821_446.returns[f449694821_446.inst++]; };
f449694821_446.returns = [];
f449694821_446.inst = 0;
// 1607
o1.JSBNG__onsubmit = f449694821_446;
// 1610
// 1616
o0.title = "Facebook";
// 1617
// 1620
// 1625
o19 = {};
// 1626
f449694821_396.returns.push(o19);
// undefined
o19 = null;
// 1628
o19 = {};
// 1629
f449694821_396.returns.push(o19);
// undefined
o19 = null;
// 1632
o19 = {};
// 1633
f449694821_396.returns.push(o19);
// 1634
f449694821_450 = function() { return f449694821_450.returns[f449694821_450.inst++]; };
f449694821_450.returns = [];
f449694821_450.inst = 0;
// 1635
o0.getElementById = f449694821_450;
// 1636
o28 = {};
// 1637
f449694821_450.returns.push(o28);
// 1638
o28.getElementsByTagName = f449694821_419;
// 1640
o28.querySelectorAll = f449694821_428;
// 1641
o29 = {};
// 1642
f449694821_428.returns.push(o29);
// 1643
o29.length = 1;
// 1644
o30 = {};
// 1645
o29["0"] = o30;
// undefined
o29 = null;
// 1646
o30.getElementsByTagName = f449694821_419;
// 1648
o30.querySelectorAll = f449694821_428;
// 1649
o29 = {};
// 1650
f449694821_428.returns.push(o29);
// 1651
o29.length = 1;
// 1652
o31 = {};
// 1653
o29["0"] = o31;
// undefined
o29 = null;
// 1654
o31.getElementsByTagName = f449694821_419;
// 1656
o31.querySelectorAll = f449694821_428;
// 1657
o29 = {};
// 1658
f449694821_428.returns.push(o29);
// 1659
o29.length = 1;
// 1660
o32 = {};
// 1661
o29["0"] = o32;
// undefined
o29 = null;
// 1665
o29 = {};
// 1666
f449694821_428.returns.push(o29);
// 1667
o29.length = 1;
// 1668
o33 = {};
// 1669
o29["0"] = o33;
// undefined
o29 = null;
// 1670
o33.getElementsByTagName = f449694821_419;
// 1672
o33.querySelectorAll = f449694821_428;
// 1673
o29 = {};
// 1674
f449694821_428.returns.push(o29);
// 1675
o29.length = 1;
// 1676
o34 = {};
// 1677
o29["0"] = o34;
// undefined
o29 = null;
// 1678
f449694821_16.returns.push(5);
// 1679
o30.nodeName = "DIV";
// 1680
o30.__FB_TOKEN = void 0;
// 1681
// 1682
o30.getAttribute = f449694821_444;
// 1683
o30.hasAttribute = f449694821_445;
// 1685
f449694821_445.returns.push(false);
// 1686
o30.JSBNG__addEventListener = f449694821_402;
// 1688
f449694821_402.returns.push(undefined);
// 1689
o30.JSBNG__onJSBNG__scroll = void 0;
// 1691
o28.nodeName = "DIV";
// 1692
o28.__FB_TOKEN = void 0;
// 1693
// 1694
o28.getAttribute = f449694821_444;
// 1695
o28.hasAttribute = f449694821_445;
// 1697
f449694821_445.returns.push(false);
// 1698
o28.JSBNG__addEventListener = f449694821_402;
// 1700
f449694821_402.returns.push(undefined);
// 1701
o28.JSBNG__onmousemove = null;
// 1703
o33.nodeName = "DIV";
// 1704
o33.__FB_TOKEN = void 0;
// 1705
// 1706
o33.getAttribute = f449694821_444;
// 1707
o33.hasAttribute = f449694821_445;
// 1709
f449694821_445.returns.push(false);
// 1710
o33.JSBNG__addEventListener = f449694821_402;
// 1712
f449694821_402.returns.push(undefined);
// 1713
o33.JSBNG__onclick = null;
// 1715
o29 = {};
// 1716
o19.style = o29;
// 1718
// 1720
// undefined
o29 = null;
// 1722
o19.__html = void 0;
// 1724
o29 = {};
// 1725
f449694821_394.returns.push(o29);
// 1727
o1.appendChild = f449694821_398;
// 1728
f449694821_398.returns.push(o29);
// undefined
o29 = null;
// 1729
o29 = {};
// 1730
f449694821_4.returns.push(o29);
// 1731
o29.pointerEvents = void 0;
// undefined
o29 = null;
// 1732
o19.parentNode = null;
// undefined
o19 = null;
// 1736
f449694821_402.returns.push(undefined);
// 1737
o28.JSBNG__onmouseover = null;
// 1742
f449694821_402.returns.push(undefined);
// 1743
o28.JSBNG__onmouseout = null;
// 1748
f449694821_402.returns.push(undefined);
// 1749
o28.JSBNG__onfocusin = void 0;
// 1754
f449694821_402.returns.push(undefined);
// 1755
o28.JSBNG__onfocusout = void 0;
// 1758
f449694821_402.returns.push(undefined);
// 1759
o34.nodeName = "DIV";
// 1760
o34.__FB_TOKEN = void 0;
// 1761
// 1762
o34.getAttribute = f449694821_444;
// 1763
o34.hasAttribute = f449694821_445;
// 1765
f449694821_445.returns.push(false);
// 1766
o34.JSBNG__addEventListener = f449694821_402;
// 1768
f449694821_402.returns.push(undefined);
// 1769
o34.JSBNG__onmousedown = null;
// 1771
o19 = {};
// 1772
o28.classList = o19;
// 1774
f449694821_466 = function() { return f449694821_466.returns[f449694821_466.inst++]; };
f449694821_466.returns = [];
f449694821_466.inst = 0;
// 1775
o19.add = f449694821_466;
// 1776
f449694821_466.returns.push(undefined);
// 1779
o29 = {};
// 1780
f449694821_450.returns.push(o29);
// 1781
o29.getElementsByTagName = f449694821_419;
// 1783
o29.querySelectorAll = f449694821_428;
// 1784
o35 = {};
// 1785
f449694821_428.returns.push(o35);
// 1786
o35.length = 1;
// 1787
o36 = {};
// 1788
o35["0"] = o36;
// undefined
o35 = null;
// 1789
o36.getElementsByTagName = f449694821_419;
// 1791
o36.querySelectorAll = f449694821_428;
// 1792
o35 = {};
// 1793
f449694821_428.returns.push(o35);
// 1794
o35.length = 1;
// 1795
o37 = {};
// 1796
o35["0"] = o37;
// undefined
o35 = null;
// 1797
o37.getElementsByTagName = f449694821_419;
// 1799
o37.querySelectorAll = f449694821_428;
// 1800
o35 = {};
// 1801
f449694821_428.returns.push(o35);
// 1802
o35.length = 1;
// 1803
o38 = {};
// 1804
o35["0"] = o38;
// undefined
o35 = null;
// 1808
o35 = {};
// 1809
f449694821_428.returns.push(o35);
// 1810
o35.length = 1;
// 1811
o39 = {};
// 1812
o35["0"] = o39;
// undefined
o35 = null;
// 1813
o39.getElementsByTagName = f449694821_419;
// 1815
o39.querySelectorAll = f449694821_428;
// 1816
o35 = {};
// 1817
f449694821_428.returns.push(o35);
// 1818
o35.length = 1;
// 1819
o40 = {};
// 1820
o35["0"] = o40;
// undefined
o35 = null;
// 1821
f449694821_16.returns.push(6);
// 1822
o36.nodeName = "DIV";
// 1823
o36.__FB_TOKEN = void 0;
// 1824
// 1825
o36.getAttribute = f449694821_444;
// 1826
o36.hasAttribute = f449694821_445;
// 1828
f449694821_445.returns.push(false);
// 1829
o36.JSBNG__addEventListener = f449694821_402;
// 1831
f449694821_402.returns.push(undefined);
// 1832
o36.JSBNG__onJSBNG__scroll = void 0;
// 1834
o29.nodeName = "DIV";
// 1835
o29.__FB_TOKEN = void 0;
// 1836
// 1837
o29.getAttribute = f449694821_444;
// 1838
o29.hasAttribute = f449694821_445;
// 1840
f449694821_445.returns.push(false);
// 1841
o29.JSBNG__addEventListener = f449694821_402;
// 1843
f449694821_402.returns.push(undefined);
// 1844
o29.JSBNG__onmousemove = null;
// 1846
o39.nodeName = "DIV";
// 1847
o39.__FB_TOKEN = void 0;
// 1848
// 1849
o39.getAttribute = f449694821_444;
// 1850
o39.hasAttribute = f449694821_445;
// 1852
f449694821_445.returns.push(false);
// 1853
o39.JSBNG__addEventListener = f449694821_402;
// 1855
f449694821_402.returns.push(undefined);
// 1856
o39.JSBNG__onclick = null;
// 1861
f449694821_402.returns.push(undefined);
// 1862
o29.JSBNG__onmouseover = null;
// 1867
f449694821_402.returns.push(undefined);
// 1868
o29.JSBNG__onmouseout = null;
// 1873
f449694821_402.returns.push(undefined);
// 1874
o29.JSBNG__onfocusin = void 0;
// 1879
f449694821_402.returns.push(undefined);
// 1880
o29.JSBNG__onfocusout = void 0;
// 1883
f449694821_402.returns.push(undefined);
// 1884
o40.nodeName = "DIV";
// 1885
o40.__FB_TOKEN = void 0;
// 1886
// 1887
o40.getAttribute = f449694821_444;
// 1888
o40.hasAttribute = f449694821_445;
// 1890
f449694821_445.returns.push(false);
// 1891
o40.JSBNG__addEventListener = f449694821_402;
// 1893
f449694821_402.returns.push(undefined);
// 1894
o40.JSBNG__onmousedown = null;
// 1896
o35 = {};
// 1897
o29.classList = o35;
// 1899
o35.add = f449694821_466;
// 1900
f449694821_466.returns.push(undefined);
// 1906
f449694821_402.returns.push(undefined);
// 1907
o1.JSBNG__onkeydown = null;
// 1917
f449694821_402.returns.push(undefined);
// 1918
f449694821_479 = function() { return f449694821_479.returns[f449694821_479.inst++]; };
f449694821_479.returns = [];
f449694821_479.inst = 0;
// 1919
o1.JSBNG__onclick = f449694821_479;
// 1922
// 1925
f449694821_386.returns.push(0.08142863190076899);
// 1930
f449694821_402.returns.push(undefined);
// 1931
o1.JSBNG__onmousedown = null;
// 1936
o41 = {};
// 1937
f449694821_396.returns.push(o41);
// 1938
// 1939
// 1940
o41.getElementsByTagName = f449694821_419;
// 1941
o42 = {};
// 1942
f449694821_419.returns.push(o42);
// 1943
o42.length = 0;
// undefined
o42 = null;
// 1945
o42 = {};
// 1946
o41.childNodes = o42;
// undefined
o41 = null;
// 1947
o42.item = f449694821_422;
// 1948
o42.length = 1;
// 1949
o41 = {};
// 1950
o42["0"] = o41;
// undefined
o42 = null;
// 1951
o41.getElementsByTagName = f449694821_419;
// 1953
o41.querySelectorAll = f449694821_428;
// 1954
o42 = {};
// 1955
f449694821_428.returns.push(o42);
// 1956
o42.length = 0;
// undefined
o42 = null;
// 1957
o41.__html = void 0;
// 1958
o41.mountComponentIntoNode = void 0;
// 1959
o42 = {};
// 1960
o41.classList = o42;
// undefined
o41 = null;
// 1962
o42.add = f449694821_466;
// undefined
o42 = null;
// 1963
f449694821_466.returns.push(undefined);
// 1965
o41 = {};
// 1966
f449694821_396.returns.push(o41);
// 1967
// 1968
o41.firstChild = null;
// 1971
o42 = {};
// 1972
f449694821_394.returns.push(o42);
// 1974
o41.appendChild = f449694821_398;
// 1975
f449694821_398.returns.push(o42);
// undefined
o42 = null;
// 1977
o42 = {};
// 1978
f449694821_396.returns.push(o42);
// 1979
// 1980
o42.firstChild = null;
// 1981
o41.__html = void 0;
// 1983
o43 = {};
// 1984
f449694821_394.returns.push(o43);
// 1986
o42.appendChild = f449694821_398;
// 1987
f449694821_398.returns.push(o43);
// undefined
o43 = null;
// 1988
o43 = {};
// 1989
o42.classList = o43;
// 1991
o43.add = f449694821_466;
// undefined
o43 = null;
// 1992
f449694821_466.returns.push(undefined);
// 1993
o43 = {};
// 1994
o41.style = o43;
// undefined
o41 = null;
// 1995
// undefined
o43 = null;
// 1999
f449694821_466.returns.push(undefined);
// 2000
o42.__FB_TOKEN = void 0;
// 2001
// 2002
o42.nodeName = "DIV";
// 2003
o42.getAttribute = f449694821_444;
// 2004
o42.hasAttribute = f449694821_445;
// 2006
f449694821_445.returns.push(false);
// 2007
o42.JSBNG__addEventListener = f449694821_402;
// 2009
f449694821_402.returns.push(undefined);
// 2010
o42.JSBNG__onclick = null;
// 2015
f449694821_402.returns.push(undefined);
// 2016
o42.JSBNG__onsubmit = null;
// 2021
f449694821_402.returns.push(undefined);
// 2022
o42.JSBNG__onsuccess = void 0;
// 2027
f449694821_402.returns.push(undefined);
// 2028
o42.JSBNG__onerror = null;
// undefined
o42 = null;
// 2030
f449694821_16.returns.push(7);
// 2033
o41 = {};
// 2034
f449694821_396.returns.push(o41);
// 2035
// 2036
// 2037
o41.getElementsByTagName = f449694821_419;
// 2038
o42 = {};
// 2039
f449694821_419.returns.push(o42);
// 2040
o42.length = 0;
// undefined
o42 = null;
// 2042
o42 = {};
// 2043
o41.childNodes = o42;
// undefined
o41 = null;
// 2044
o42.item = f449694821_422;
// 2045
o42.length = 1;
// 2046
o41 = {};
// 2047
o42["0"] = o41;
// undefined
o42 = null;
// 2048
o41.getElementsByTagName = f449694821_419;
// 2050
o41.querySelectorAll = f449694821_428;
// undefined
o41 = null;
// 2051
o41 = {};
// 2052
f449694821_428.returns.push(o41);
// 2053
o41.length = 1;
// 2054
o42 = {};
// 2055
o41["0"] = o42;
// undefined
o41 = null;
// undefined
o42 = null;
// 2064
// 2065
o41 = {};
// 2066
o42 = {};
// 2068
o41.length = 1;
// 2069
o41["0"] = "63VzN";
// 2071
o43 = {};
// 2072
f449694821_510 = function() { return f449694821_510.returns[f449694821_510.inst++]; };
f449694821_510.returns = [];
f449694821_510.inst = 0;
// 2073
o43._needsGripper = f449694821_510;
// 2074
f449694821_511 = function() { return f449694821_511.returns[f449694821_511.inst++]; };
f449694821_511.returns = [];
f449694821_511.inst = 0;
// 2075
o43._throttledComputeHeights = f449694821_511;
// 2077
f449694821_387.returns.push(1373490165887);
// 2078
o28.clientHeight = 0;
// 2079
o32.offsetHeight = 0;
// 2080
o33.offsetHeight = 0;
// 2081
f449694821_16.returns.push(9);
// 2082
f449694821_511.returns.push(undefined);
// 2083
o43._gripperHeight = NaN;
// 2084
o43._trackHeight = 0;
// 2085
f449694821_510.returns.push(false);
// 2086
f449694821_512 = function() { return f449694821_512.returns[f449694821_512.inst++]; };
f449694821_512.returns = [];
f449694821_512.inst = 0;
// 2087
o43._throttledShowGripperAndShadows = f449694821_512;
// 2089
f449694821_387.returns.push(1373490165889);
// 2091
f449694821_387.returns.push(1373490165890);
// 2092
o44 = {};
// 2093
o34.classList = o44;
// 2095
o44.add = f449694821_466;
// 2096
f449694821_466.returns.push(undefined);
// 2097
o30.scrollTop = 0;
// 2100
f449694821_514 = function() { return f449694821_514.returns[f449694821_514.inst++]; };
f449694821_514.returns = [];
f449694821_514.inst = 0;
// 2101
o19.remove = f449694821_514;
// undefined
o19 = null;
// 2102
f449694821_514.returns.push(undefined);
// 2107
f449694821_514.returns.push(undefined);
// 2108
f449694821_16.returns.push(10);
// 2109
f449694821_512.returns.push(undefined);
// 2110
o19 = {};
// 2111
o19._needsGripper = f449694821_510;
// 2112
f449694821_516 = function() { return f449694821_516.returns[f449694821_516.inst++]; };
f449694821_516.returns = [];
f449694821_516.inst = 0;
// 2113
o19._throttledComputeHeights = f449694821_516;
// 2115
f449694821_387.returns.push(1373490165892);
// 2116
o29.clientHeight = 0;
// 2117
o38.offsetHeight = 0;
// 2118
o39.offsetHeight = 0;
// 2119
f449694821_16.returns.push(11);
// 2120
f449694821_516.returns.push(undefined);
// 2121
o19._gripperHeight = NaN;
// 2122
o19._trackHeight = 0;
// 2123
f449694821_510.returns.push(false);
// 2124
f449694821_517 = function() { return f449694821_517.returns[f449694821_517.inst++]; };
f449694821_517.returns = [];
f449694821_517.inst = 0;
// 2125
o19._throttledShowGripperAndShadows = f449694821_517;
// 2127
f449694821_387.returns.push(1373490165896);
// 2129
f449694821_387.returns.push(1373490165897);
// 2130
o45 = {};
// 2131
o40.classList = o45;
// 2133
o45.add = f449694821_466;
// 2134
f449694821_466.returns.push(undefined);
// 2135
o36.scrollTop = 0;
// 2138
o35.remove = f449694821_514;
// undefined
o35 = null;
// 2139
f449694821_514.returns.push(undefined);
// 2144
f449694821_514.returns.push(undefined);
// 2145
f449694821_16.returns.push(12);
// 2146
f449694821_517.returns.push(undefined);
// 2147
o35 = {};
// 2152
f449694821_387.returns.push(1373490165906);
// 2153
f449694821_520 = function() { return f449694821_520.returns[f449694821_520.inst++]; };
f449694821_520.returns = [];
f449694821_520.inst = 0;
// 2154
o3.pushState = f449694821_520;
// 2155
o0.JSBNG__URL = "http://jsbngssl.www.facebook.com/?sk=welcome";
// 2156
f449694821_521 = function() { return f449694821_521.returns[f449694821_521.inst++]; };
f449694821_521.returns = [];
f449694821_521.inst = 0;
// 2157
o3.replaceState = f449694821_521;
// undefined
o3 = null;
// 2158
f449694821_521.returns.push(undefined);
// 2159
f449694821_7.returns.push(undefined);
// 2160
f449694821_522 = function() { return f449694821_522.returns[f449694821_522.inst++]; };
f449694821_522.returns = [];
f449694821_522.inst = 0;
// 2166
// 2167
o41 = {};
// 2168
o42 = {};
// 2170
o41.length = 1;
// 2171
o41["0"] = "63VzN";
// 2173
o43 = {};
// 2174
f449694821_510 = function() { return f449694821_510.returns[f449694821_510.inst++]; };
f449694821_510.returns = [];
f449694821_510.inst = 0;
// 2175
o43._needsGripper = f449694821_510;
// 2176
f449694821_511 = function() { return f449694821_511.returns[f449694821_511.inst++]; };
f449694821_511.returns = [];
f449694821_511.inst = 0;
// 2177
o43._throttledComputeHeights = f449694821_511;
// 2179
f449694821_387.returns.push(1373490165887);
// 2183
f449694821_16.returns.push(9);
// 2184
f449694821_511.returns.push(undefined);
// 2185
o43._gripperHeight = NaN;
// 2186
o43._trackHeight = 0;
// 2187
f449694821_510.returns.push(false);
// 2188
f449694821_512 = function() { return f449694821_512.returns[f449694821_512.inst++]; };
f449694821_512.returns = [];
f449694821_512.inst = 0;
// 2189
o43._throttledShowGripperAndShadows = f449694821_512;
// 2191
f449694821_387.returns.push(1373490165889);
// 2193
f449694821_387.returns.push(1373490165890);
// 2194
o44 = {};
// 2197
o44.add = f449694821_466;
// 2198
f449694821_466.returns.push(undefined);
// 2202
f449694821_514 = function() { return f449694821_514.returns[f449694821_514.inst++]; };
f449694821_514.returns = [];
f449694821_514.inst = 0;
// 2204
f449694821_514.returns.push(undefined);
// 2209
f449694821_514.returns.push(undefined);
// 2210
f449694821_16.returns.push(10);
// 2211
f449694821_512.returns.push(undefined);
// 2212
o19 = {};
// 2213
o19._needsGripper = f449694821_510;
// 2214
f449694821_516 = function() { return f449694821_516.returns[f449694821_516.inst++]; };
f449694821_516.returns = [];
f449694821_516.inst = 0;
// 2215
o19._throttledComputeHeights = f449694821_516;
// 2217
f449694821_387.returns.push(1373490165892);
// 2221
f449694821_16.returns.push(11);
// 2222
f449694821_516.returns.push(undefined);
// 2223
o19._gripperHeight = NaN;
// 2224
o19._trackHeight = 0;
// 2225
f449694821_510.returns.push(false);
// 2226
f449694821_517 = function() { return f449694821_517.returns[f449694821_517.inst++]; };
f449694821_517.returns = [];
f449694821_517.inst = 0;
// 2227
o19._throttledShowGripperAndShadows = f449694821_517;
// 2229
f449694821_387.returns.push(1373490165896);
// 2231
f449694821_387.returns.push(1373490165897);
// 2232
o45 = {};
// 2235
o45.add = f449694821_466;
// 2236
f449694821_466.returns.push(undefined);
// 2241
f449694821_514.returns.push(undefined);
// 2246
f449694821_514.returns.push(undefined);
// 2247
f449694821_16.returns.push(12);
// 2248
f449694821_517.returns.push(undefined);
// 2249
o35 = {};
// 2254
f449694821_387.returns.push(1373490165906);
// 2255
f449694821_520 = function() { return f449694821_520.returns[f449694821_520.inst++]; };
f449694821_520.returns = [];
f449694821_520.inst = 0;
// 2258
f449694821_521 = function() { return f449694821_521.returns[f449694821_521.inst++]; };
f449694821_521.returns = [];
f449694821_521.inst = 0;
// 2260
f449694821_521.returns.push(undefined);
// 2261
f449694821_7.returns.push(undefined);
// 2262
f449694821_522 = function() { return f449694821_522.returns[f449694821_522.inst++]; };
f449694821_522.returns = [];
f449694821_522.inst = 0;
// 2269
// 2270
o41 = {};
// 2271
o42 = {};
// 2273
o41.length = 1;
// 2274
o41["0"] = "63VzN";
// 2276
o43 = {};
// 2277
f449694821_510 = function() { return f449694821_510.returns[f449694821_510.inst++]; };
f449694821_510.returns = [];
f449694821_510.inst = 0;
// 2278
o43._needsGripper = f449694821_510;
// 2279
f449694821_511 = function() { return f449694821_511.returns[f449694821_511.inst++]; };
f449694821_511.returns = [];
f449694821_511.inst = 0;
// 2280
o43._throttledComputeHeights = f449694821_511;
// 2282
f449694821_387.returns.push(1373490165887);
// 2286
f449694821_16.returns.push(9);
// 2287
f449694821_511.returns.push(undefined);
// 2288
o43._gripperHeight = NaN;
// 2289
o43._trackHeight = 0;
// 2290
f449694821_510.returns.push(false);
// 2291
f449694821_512 = function() { return f449694821_512.returns[f449694821_512.inst++]; };
f449694821_512.returns = [];
f449694821_512.inst = 0;
// 2292
o43._throttledShowGripperAndShadows = f449694821_512;
// undefined
o43 = null;
// 2294
f449694821_387.returns.push(1373490165889);
// 2296
f449694821_387.returns.push(1373490165890);
// 2297
o44 = {};
// 2300
o44.add = f449694821_466;
// undefined
o44 = null;
// 2301
f449694821_466.returns.push(undefined);
// 2305
f449694821_514 = function() { return f449694821_514.returns[f449694821_514.inst++]; };
f449694821_514.returns = [];
f449694821_514.inst = 0;
// 2307
f449694821_514.returns.push(undefined);
// 2312
f449694821_514.returns.push(undefined);
// 2313
f449694821_16.returns.push(10);
// 2314
f449694821_512.returns.push(undefined);
// 2315
o19 = {};
// 2316
o19._needsGripper = f449694821_510;
// 2317
f449694821_516 = function() { return f449694821_516.returns[f449694821_516.inst++]; };
f449694821_516.returns = [];
f449694821_516.inst = 0;
// 2318
o19._throttledComputeHeights = f449694821_516;
// 2320
f449694821_387.returns.push(1373490165892);
// 2324
f449694821_16.returns.push(11);
// 2325
f449694821_516.returns.push(undefined);
// 2326
o19._gripperHeight = NaN;
// 2327
o19._trackHeight = 0;
// 2328
f449694821_510.returns.push(false);
// 2329
f449694821_517 = function() { return f449694821_517.returns[f449694821_517.inst++]; };
f449694821_517.returns = [];
f449694821_517.inst = 0;
// 2330
o19._throttledShowGripperAndShadows = f449694821_517;
// undefined
o19 = null;
// 2332
f449694821_387.returns.push(1373490165896);
// 2334
f449694821_387.returns.push(1373490165897);
// 2335
o45 = {};
// 2338
o45.add = f449694821_466;
// undefined
o45 = null;
// 2339
f449694821_466.returns.push(undefined);
// 2344
f449694821_514.returns.push(undefined);
// 2349
f449694821_514.returns.push(undefined);
// 2350
f449694821_16.returns.push(12);
// 2351
f449694821_517.returns.push(undefined);
// 2352
o35 = {};
// undefined
o35 = null;
// 2357
f449694821_387.returns.push(1373490165906);
// 2358
f449694821_520 = function() { return f449694821_520.returns[f449694821_520.inst++]; };
f449694821_520.returns = [];
f449694821_520.inst = 0;
// 2361
f449694821_521 = function() { return f449694821_521.returns[f449694821_521.inst++]; };
f449694821_521.returns = [];
f449694821_521.inst = 0;
// 2363
f449694821_521.returns.push(undefined);
// 2364
f449694821_7.returns.push(undefined);
// 2365
f449694821_522 = function() { return f449694821_522.returns[f449694821_522.inst++]; };
f449694821_522.returns = [];
f449694821_522.inst = 0;
// 2370
o2.platform = "MacIntel";
// 2375
o3 = {};
// 2376
f449694821_391.returns.push(o3);
// 2377
o3.length = 44;
// 2378
o19 = {};
// 2379
o3["0"] = o19;
// 2380
o19.src = "http://jsbngssl.www.facebook.com/JSBENCH_NG_RECORD_OBJECTS.js";
// 2382
o35 = {};
// 2383
o3["1"] = o35;
// 2384
o35.src = "http://jsbngssl.www.facebook.com/JSBENCH_NG_RECORD.js";
// 2386
o43 = {};
// 2387
o3["2"] = o43;
// 2388
o43.src = "";
// 2390
o44 = {};
// 2391
o3["3"] = o44;
// 2392
o44.src = "";
// 2394
o45 = {};
// 2395
o3["4"] = o45;
// 2396
o45.src = "";
// 2398
o46 = {};
// 2399
o3["5"] = o46;
// 2400
o46.src = "http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yu/r/PHN_xWtDFVJ.js";
// 2402
o47 = {};
// 2403
o3["6"] = o47;
// 2404
o47.src = "";
// 2406
o48 = {};
// 2407
o3["7"] = o48;
// 2408
o48.src = "";
// 2410
o3["8"] = o9;
// 2412
o3["9"] = o10;
// 2414
o49 = {};
// 2415
o3["10"] = o49;
// 2416
o49.src = "";
// 2418
o50 = {};
// 2419
o3["11"] = o50;
// 2420
o50.src = "";
// 2422
o3["12"] = o20;
// 2424
o3["13"] = o21;
// 2426
o3["14"] = o22;
// 2428
o3["15"] = o23;
// 2430
o3["16"] = o24;
// 2432
o3["17"] = o25;
// 2434
o3["18"] = o26;
// 2436
o3["19"] = o27;
// 2438
o51 = {};
// 2439
o3["20"] = o51;
// 2440
o51.src = "";
// 2442
o52 = {};
// 2443
o3["21"] = o52;
// 2444
o52.src = "";
// 2446
o53 = {};
// 2447
o3["22"] = o53;
// 2448
o53.src = "";
// 2450
o54 = {};
// 2451
o3["23"] = o54;
// 2452
o54.src = "";
// 2454
o55 = {};
// 2455
o3["24"] = o55;
// 2456
o55.src = "";
// 2458
o56 = {};
// 2459
o3["25"] = o56;
// 2460
o56.src = "";
// 2462
o57 = {};
// 2463
o3["26"] = o57;
// 2464
o57.src = "";
// 2466
o58 = {};
// 2467
o3["27"] = o58;
// 2468
o58.src = "";
// 2470
o59 = {};
// 2471
o3["28"] = o59;
// 2472
o59.src = "";
// 2474
o60 = {};
// 2475
o3["29"] = o60;
// 2476
o60.src = "";
// 2478
o61 = {};
// 2479
o3["30"] = o61;
// 2480
o61.src = "";
// 2482
o62 = {};
// 2483
o3["31"] = o62;
// 2484
o62.src = "";
// 2486
o63 = {};
// 2487
o3["32"] = o63;
// 2488
o63.src = "";
// 2490
o64 = {};
// 2499
o3 = {};
// 2500
f449694821_391.returns.push(o3);
// 2501
o3.length = 44;
// 2502
o19 = {};
// 2503
o3["0"] = o19;
// 2504
o19.src = "http://jsbngssl.www.facebook.com/JSBENCH_NG_RECORD_OBJECTS.js";
// 2506
o35 = {};
// 2507
o3["1"] = o35;
// 2508
o35.src = "http://jsbngssl.www.facebook.com/JSBENCH_NG_RECORD.js";
// 2510
o43 = {};
// 2511
o3["2"] = o43;
// 2512
o43.src = "";
// 2514
o44 = {};
// 2515
o3["3"] = o44;
// 2516
o44.src = "";
// 2518
o45 = {};
// 2519
o3["4"] = o45;
// 2520
o45.src = "";
// 2522
o46 = {};
// 2523
o3["5"] = o46;
// 2524
o46.src = "http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yu/r/PHN_xWtDFVJ.js";
// 2526
o47 = {};
// 2527
o3["6"] = o47;
// 2528
o47.src = "";
// 2530
o48 = {};
// 2531
o3["7"] = o48;
// 2532
o48.src = "";
// 2534
o3["8"] = o9;
// 2536
o3["9"] = o10;
// 2538
o49 = {};
// 2539
o3["10"] = o49;
// 2540
o49.src = "";
// 2542
o50 = {};
// 2543
o3["11"] = o50;
// 2544
o50.src = "";
// 2546
o3["12"] = o20;
// 2548
o3["13"] = o21;
// 2550
o3["14"] = o22;
// 2552
o3["15"] = o23;
// 2554
o3["16"] = o24;
// 2556
o3["17"] = o25;
// 2558
o3["18"] = o26;
// 2560
o3["19"] = o27;
// 2562
o51 = {};
// 2563
o3["20"] = o51;
// 2564
o51.src = "";
// 2566
o52 = {};
// 2567
o3["21"] = o52;
// 2568
o52.src = "";
// 2570
o53 = {};
// 2571
o3["22"] = o53;
// 2572
o53.src = "";
// 2574
o54 = {};
// 2575
o3["23"] = o54;
// 2576
o54.src = "";
// 2578
o55 = {};
// 2579
o3["24"] = o55;
// 2580
o55.src = "";
// 2582
o56 = {};
// 2583
o3["25"] = o56;
// 2584
o56.src = "";
// 2586
o57 = {};
// 2587
o3["26"] = o57;
// 2588
o57.src = "";
// 2590
o58 = {};
// 2591
o3["27"] = o58;
// 2592
o58.src = "";
// 2594
o59 = {};
// 2595
o3["28"] = o59;
// 2596
o59.src = "";
// 2598
o60 = {};
// 2599
o3["29"] = o60;
// 2600
o60.src = "";
// 2602
o61 = {};
// 2603
o3["30"] = o61;
// 2604
o61.src = "";
// 2606
o62 = {};
// 2607
o3["31"] = o62;
// 2608
o62.src = "";
// 2610
o63 = {};
// 2611
o3["32"] = o63;
// 2612
o63.src = "";
// 2614
o64 = {};
// 2622
o3 = {};
// 2623
f449694821_391.returns.push(o3);
// 2624
o3.length = 44;
// 2625
o19 = {};
// 2626
o3["0"] = o19;
// 2627
o19.src = "http://jsbngssl.www.facebook.com/JSBENCH_NG_RECORD_OBJECTS.js";
// 2629
o35 = {};
// 2630
o3["1"] = o35;
// 2631
o35.src = "http://jsbngssl.www.facebook.com/JSBENCH_NG_RECORD.js";
// 2633
o43 = {};
// 2634
o3["2"] = o43;
// 2635
o43.src = "";
// 2637
o44 = {};
// 2638
o3["3"] = o44;
// 2639
o44.src = "";
// 2641
o45 = {};
// 2642
o3["4"] = o45;
// 2643
o45.src = "";
// 2645
o46 = {};
// 2646
o3["5"] = o46;
// 2647
o46.src = "http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yu/r/PHN_xWtDFVJ.js";
// 2649
o47 = {};
// 2650
o3["6"] = o47;
// 2651
o47.src = "";
// 2653
o48 = {};
// 2654
o3["7"] = o48;
// 2655
o48.src = "";
// 2657
o3["8"] = o9;
// 2659
o3["9"] = o10;
// 2661
o49 = {};
// 2662
o3["10"] = o49;
// 2663
o49.src = "";
// 2665
o50 = {};
// 2666
o3["11"] = o50;
// 2667
o50.src = "";
// 2669
o3["12"] = o20;
// 2671
o3["13"] = o21;
// 2673
o3["14"] = o22;
// 2675
o3["15"] = o23;
// 2677
o3["16"] = o24;
// 2679
o3["17"] = o25;
// 2681
o3["18"] = o26;
// 2683
o3["19"] = o27;
// 2685
o51 = {};
// 2686
o3["20"] = o51;
// 2687
o51.src = "";
// 2689
o52 = {};
// 2690
o3["21"] = o52;
// 2691
o52.src = "";
// 2693
o53 = {};
// 2694
o3["22"] = o53;
// 2695
o53.src = "";
// 2697
o54 = {};
// 2698
o3["23"] = o54;
// 2699
o54.src = "";
// 2701
o55 = {};
// 2702
o3["24"] = o55;
// 2703
o55.src = "";
// 2705
o56 = {};
// 2706
o3["25"] = o56;
// 2707
o56.src = "";
// 2709
o57 = {};
// 2710
o3["26"] = o57;
// 2711
o57.src = "";
// 2713
o58 = {};
// 2714
o3["27"] = o58;
// 2715
o58.src = "";
// 2717
o59 = {};
// 2718
o3["28"] = o59;
// 2719
o59.src = "";
// 2721
o60 = {};
// 2722
o3["29"] = o60;
// 2723
o60.src = "";
// 2725
o61 = {};
// 2726
o3["30"] = o61;
// 2727
o61.src = "";
// 2729
o62 = {};
// 2730
o3["31"] = o62;
// 2731
o62.src = "";
// 2733
o63 = {};
// 2734
o3["32"] = o63;
// 2735
o63.src = "";
// 2737
o64 = {};
// 2747
o3 = {};
// 2748
f449694821_391.returns.push(o3);
// 2749
o3.length = 44;
// 2750
o19 = {};
// 2751
o3["0"] = o19;
// 2752
o19.src = "http://jsbngssl.www.facebook.com/JSBENCH_NG_RECORD_OBJECTS.js";
// 2754
o35 = {};
// 2755
o3["1"] = o35;
// 2756
o35.src = "http://jsbngssl.www.facebook.com/JSBENCH_NG_RECORD.js";
// 2758
o43 = {};
// 2759
o3["2"] = o43;
// 2760
o43.src = "";
// 2762
o44 = {};
// 2763
o3["3"] = o44;
// 2764
o44.src = "";
// 2766
o45 = {};
// 2767
o3["4"] = o45;
// 2768
o45.src = "";
// 2770
o46 = {};
// 2771
o3["5"] = o46;
// 2772
o46.src = "http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yu/r/PHN_xWtDFVJ.js";
// 2774
o47 = {};
// 2775
o3["6"] = o47;
// 2776
o47.src = "";
// 2778
o48 = {};
// 2779
o3["7"] = o48;
// 2780
o48.src = "";
// 2782
o3["8"] = o9;
// 2784
o3["9"] = o10;
// 2786
o49 = {};
// 2787
o3["10"] = o49;
// 2788
o49.src = "";
// 2790
o50 = {};
// 2791
o3["11"] = o50;
// 2792
o50.src = "";
// 2794
o3["12"] = o20;
// 2796
o3["13"] = o21;
// 2798
o3["14"] = o22;
// 2800
o3["15"] = o23;
// 2802
o3["16"] = o24;
// 2804
o3["17"] = o25;
// 2806
o3["18"] = o26;
// 2808
o3["19"] = o27;
// 2810
o51 = {};
// 2811
o3["20"] = o51;
// 2812
o51.src = "";
// 2814
o52 = {};
// 2815
o3["21"] = o52;
// 2816
o52.src = "";
// 2818
o53 = {};
// 2819
o3["22"] = o53;
// 2820
o53.src = "";
// 2822
o54 = {};
// 2823
o3["23"] = o54;
// 2824
o54.src = "";
// 2826
o55 = {};
// 2827
o3["24"] = o55;
// 2828
o55.src = "";
// 2830
o56 = {};
// 2831
o3["25"] = o56;
// 2832
o56.src = "";
// 2834
o57 = {};
// 2835
o3["26"] = o57;
// 2836
o57.src = "";
// 2838
o58 = {};
// 2839
o3["27"] = o58;
// 2840
o58.src = "";
// undefined
o58 = null;
// 2842
o59 = {};
// 2843
o3["28"] = o59;
// 2844
o59.src = "";
// undefined
o59 = null;
// 2846
o60 = {};
// 2847
o3["29"] = o60;
// 2848
o60.src = "";
// undefined
o60 = null;
// 2850
o61 = {};
// 2851
o3["30"] = o61;
// 2852
o61.src = "";
// undefined
o61 = null;
// 2854
o62 = {};
// 2855
o3["31"] = o62;
// 2856
o62.src = "";
// undefined
o62 = null;
// 2858
o63 = {};
// 2859
o3["32"] = o63;
// 2860
o63.src = "";
// undefined
o63 = null;
// 2862
o64 = {};
// 2866
ow449694821.JSBNG__requestAnimationFrame = undefined;
// 2867
ow449694821.JSBNG__webkitRequestAnimationFrame = undefined;
// 2868
f449694821_57.returns.push(1);
// 2870
o58 = {};
// 2871
f449694821_450.returns.push(o58);
// 2872
o58.getElementsByTagName = f449694821_419;
// 2874
o58.querySelectorAll = f449694821_428;
// 2875
o59 = {};
// 2876
f449694821_428.returns.push(o59);
// 2877
o59.length = 1;
// 2878
o60 = {};
// 2879
o59["0"] = o60;
// undefined
o59 = null;
// 2880
f449694821_7.returns.push(undefined);
// 2881
f449694821_553 = function() { return f449694821_553.returns[f449694821_553.inst++]; };
f449694821_553.returns = [];
f449694821_553.inst = 0;
// 2882
ow449694821.JSBNG__onresize = f449694821_553;
// 2886
o59 = {};
// 2887
f449694821_450.returns.push(o59);
// 2888
o59.getElementsByTagName = f449694821_419;
// 2890
o59.querySelectorAll = f449694821_428;
// 2891
o61 = {};
// 2892
f449694821_428.returns.push(o61);
// 2893
o61.length = 1;
// 2894
o62 = {};
// 2895
o61["0"] = o62;
// undefined
o61 = null;
// 2897
o61 = {};
// 2898
f449694821_450.returns.push(o61);
// 2899
o61.getElementsByTagName = f449694821_419;
// 2901
o61.querySelectorAll = f449694821_428;
// 2902
o63 = {};
// 2903
f449694821_428.returns.push(o63);
// 2904
o63.length = 1;
// 2905
o65 = {};
// 2906
o63["0"] = o65;
// undefined
o63 = null;
// 2908
o63 = {};
// 2909
f449694821_450.returns.push(o63);
// undefined
o63 = null;
// 2911
o63 = {};
// 2912
f449694821_450.returns.push(o63);
// undefined
o63 = null;
// 2914
o63 = {};
// 2915
o6.classList = o63;
// 2917
f449694821_563 = function() { return f449694821_563.returns[f449694821_563.inst++]; };
f449694821_563.returns = [];
f449694821_563.inst = 0;
// 2918
o63.contains = f449694821_563;
// undefined
o63 = null;
// 2919
f449694821_563.returns.push(false);
// 2920
o4.pathname = "/";
// undefined
o4 = null;
// 2921
o4 = {};
// 2922
o4.getElementsByTagName = f449694821_419;
// 2924
o4.querySelectorAll = f449694821_428;
// undefined
o4 = null;
// 2925
o4 = {};
// 2926
f449694821_428.returns.push(o4);
// 2927
o4.length = 0;
// undefined
o4 = null;
// 2929
o0.getAttributeNode = void 0;
// 2932
o4 = {};
// 2933
f449694821_391.returns.push(o4);
// 2934
o4.length = 314;
// 2935
o4["0"] = o1;
// 2936
f449694821_566 = function() { return f449694821_566.returns[f449694821_566.inst++]; };
f449694821_566.returns = [];
f449694821_566.inst = 0;
// 2937
o1.getAttributeNode = f449694821_566;
// 2939
o63 = {};
// 2940
f449694821_566.returns.push(o63);
// 2941
o63.value = "facebook";
// undefined
o63 = null;
// 2943
o4["1"] = o7;
// 2944
o7.getAttributeNode = f449694821_566;
// undefined
o7 = null;
// 2946
f449694821_566.returns.push(null);
// 2948
o7 = {};
// 2949
o4["2"] = o7;
// 2950
o7.getAttributeNode = f449694821_566;
// undefined
o7 = null;
// 2952
f449694821_566.returns.push(null);
// 2954
o4["3"] = o19;
// 2955
o19.getAttributeNode = f449694821_566;
// undefined
o19 = null;
// 2957
f449694821_566.returns.push(null);
// 2959
o4["4"] = o35;
// 2960
o35.getAttributeNode = f449694821_566;
// undefined
o35 = null;
// 2962
f449694821_566.returns.push(null);
// 2964
o4["5"] = o43;
// 2965
o43.getAttributeNode = f449694821_566;
// undefined
o43 = null;
// 2967
f449694821_566.returns.push(null);
// 2969
o7 = {};
// 2970
o4["6"] = o7;
// 2971
o7.getAttributeNode = f449694821_566;
// undefined
o7 = null;
// 2973
f449694821_566.returns.push(null);
// 2975
o4["7"] = o44;
// 2976
o44.getAttributeNode = f449694821_566;
// undefined
o44 = null;
// 2978
f449694821_566.returns.push(null);
// 2980
o4["8"] = o45;
// 2981
o45.getAttributeNode = f449694821_566;
// undefined
o45 = null;
// 2983
f449694821_566.returns.push(null);
// 2985
o7 = {};
// 2986
o4["9"] = o7;
// 2987
o7.getAttributeNode = f449694821_566;
// undefined
o7 = null;
// 2989
f449694821_566.returns.push(null);
// 2991
o7 = {};
// 2992
o4["10"] = o7;
// 2993
o7.getAttributeNode = f449694821_566;
// undefined
o7 = null;
// 2995
f449694821_566.returns.push(null);
// 2997
o7 = {};
// 2998
o4["11"] = o7;
// 2999
o7.getAttributeNode = f449694821_566;
// undefined
o7 = null;
// 3001
o7 = {};
// 3002
f449694821_566.returns.push(o7);
// 3003
o7.value = "meta_referrer";
// undefined
o7 = null;
// 3005
o4["12"] = o8;
// 3006
o8.getAttributeNode = f449694821_566;
// undefined
o8 = null;
// 3008
f449694821_566.returns.push(null);
// 3010
o4["13"] = o11;
// 3011
o11.getAttributeNode = f449694821_566;
// undefined
o11 = null;
// 3013
f449694821_566.returns.push(null);
// 3015
o4["14"] = o12;
// 3016
o12.getAttributeNode = f449694821_566;
// undefined
o12 = null;
// 3018
f449694821_566.returns.push(null);
// 3020
o4["15"] = o13;
// 3021
o13.getAttributeNode = f449694821_566;
// undefined
o13 = null;
// 3023
f449694821_566.returns.push(null);
// 3025
o4["16"] = o46;
// 3026
o46.getAttributeNode = f449694821_566;
// undefined
o46 = null;
// 3028
f449694821_566.returns.push(null);
// 3030
o4["17"] = o47;
// 3031
o47.getAttributeNode = f449694821_566;
// undefined
o47 = null;
// 3033
f449694821_566.returns.push(null);
// 3035
o4["18"] = o48;
// 3036
o48.getAttributeNode = f449694821_566;
// undefined
o48 = null;
// 3038
f449694821_566.returns.push(null);
// 3040
o4["19"] = o9;
// 3041
o9.getAttributeNode = f449694821_566;
// undefined
o9 = null;
// 3043
f449694821_566.returns.push(null);
// 3045
o4["20"] = o10;
// 3046
o10.getAttributeNode = f449694821_566;
// undefined
o10 = null;
// 3048
f449694821_566.returns.push(null);
// 3050
o4["21"] = o49;
// 3051
o49.getAttributeNode = f449694821_566;
// undefined
o49 = null;
// 3053
f449694821_566.returns.push(null);
// 3055
o7 = {};
// 3056
o4["22"] = o7;
// 3057
o7.getAttributeNode = f449694821_566;
// undefined
o7 = null;
// 3059
o7 = {};
// 3060
f449694821_566.returns.push(o7);
// 3061
o7.value = "pageTitle";
// undefined
o7 = null;
// 3063
o4["23"] = o14;
// 3064
o14.getAttributeNode = f449694821_566;
// undefined
o14 = null;
// 3066
f449694821_566.returns.push(null);
// 3068
o7 = {};
// 3069
o4["24"] = o7;
// 3070
o7.getAttributeNode = f449694821_566;
// undefined
o7 = null;
// 3072
f449694821_566.returns.push(null);
// 3074
o4["25"] = o15;
// 3075
o15.getAttributeNode = f449694821_566;
// undefined
o15 = null;
// 3077
f449694821_566.returns.push(null);
// 3079
o4["26"] = o16;
// 3080
o16.getAttributeNode = f449694821_566;
// undefined
o16 = null;
// 3082
f449694821_566.returns.push(null);
// 3084
o4["27"] = o17;
// 3085
o17.getAttributeNode = f449694821_566;
// undefined
o17 = null;
// 3087
f449694821_566.returns.push(null);
// 3089
o4["28"] = o50;
// 3090
o50.getAttributeNode = f449694821_566;
// undefined
o50 = null;
// 3092
f449694821_566.returns.push(null);
// 3094
o4["29"] = o20;
// 3095
o20.getAttributeNode = f449694821_566;
// undefined
o20 = null;
// 3097
f449694821_566.returns.push(null);
// 3099
o4["30"] = o21;
// 3100
o21.getAttributeNode = f449694821_566;
// undefined
o21 = null;
// 3102
f449694821_566.returns.push(null);
// 3104
o4["31"] = o22;
// 3105
o22.getAttributeNode = f449694821_566;
// undefined
o22 = null;
// 3107
f449694821_566.returns.push(null);
// 3109
o4["32"] = o23;
// 3110
o23.getAttributeNode = f449694821_566;
// undefined
o23 = null;
// 3112
f449694821_566.returns.push(null);
// 3114
o4["33"] = o24;
// 3115
o24.getAttributeNode = f449694821_566;
// undefined
o24 = null;
// 3117
f449694821_566.returns.push(null);
// 3119
o4["34"] = o25;
// 3120
o25.getAttributeNode = f449694821_566;
// undefined
o25 = null;
// 3122
f449694821_566.returns.push(null);
// 3124
o4["35"] = o26;
// 3125
o26.getAttributeNode = f449694821_566;
// undefined
o26 = null;
// 3127
f449694821_566.returns.push(null);
// 3129
o4["36"] = o27;
// 3130
o27.getAttributeNode = f449694821_566;
// undefined
o27 = null;
// 3132
f449694821_566.returns.push(null);
// 3134
o4["37"] = o6;
// 3135
o6.getAttributeNode = f449694821_566;
// 3137
f449694821_566.returns.push(null);
// 3139
o7 = {};
// 3140
o4["38"] = o7;
// 3141
o7.getAttributeNode = f449694821_566;
// 3143
f449694821_566.returns.push(null);
// 3145
o8 = {};
// 3146
o4["39"] = o8;
// 3147
o8.getAttributeNode = f449694821_566;
// 3149
o9 = {};
// 3150
f449694821_566.returns.push(o9);
// 3151
o9.value = "pagelet_bluebar";
// undefined
o9 = null;
// 3153
o9 = {};
// 3154
o4["40"] = o9;
// 3155
o9.getAttributeNode = f449694821_566;
// 3157
o10 = {};
// 3158
f449694821_566.returns.push(o10);
// 3159
o10.value = "blueBarHolder";
// undefined
o10 = null;
// 3161
o10 = {};
// 3162
o4["41"] = o10;
// 3163
o10.getAttributeNode = f449694821_566;
// 3165
o11 = {};
// 3166
f449694821_566.returns.push(o11);
// 3167
o11.value = "blueBar";
// undefined
o11 = null;
// 3169
o11 = {};
// 3170
o4["42"] = o11;
// 3171
o11.getAttributeNode = f449694821_566;
// 3173
o12 = {};
// 3174
f449694821_566.returns.push(o12);
// 3175
o12.value = "pageHead";
// undefined
o12 = null;
// 3177
o12 = {};
// 3178
o4["43"] = o12;
// 3179
o12.getAttributeNode = f449694821_566;
// undefined
o12 = null;
// 3181
o12 = {};
// 3182
f449694821_566.returns.push(o12);
// 3183
o12.value = "pageLogo";
// undefined
o12 = null;
// 3185
o12 = {};
// 3186
o4["44"] = o12;
// 3187
o12.getAttributeNode = f449694821_566;
// undefined
o12 = null;
// 3189
f449694821_566.returns.push(null);
// 3191
o12 = {};
// 3192
o4["45"] = o12;
// 3193
o12.getAttributeNode = f449694821_566;
// undefined
o12 = null;
// 3195
o12 = {};
// 3196
f449694821_566.returns.push(o12);
// 3197
o12.value = "jewelContainer";
// undefined
o12 = null;
// 3199
o4["46"] = o59;
// 3200
o59.getAttributeNode = f449694821_566;
// undefined
o59 = null;
// 3202
o12 = {};
// 3203
f449694821_566.returns.push(o12);
// 3204
o12.value = "fbRequestsJewel";
// undefined
o12 = null;
// 3206
o12 = {};
// 3207
o4["47"] = o12;
// 3208
o12.getAttributeNode = f449694821_566;
// undefined
o12 = null;
// 3210
f449694821_566.returns.push(null);
// 3212
o12 = {};
// 3213
o4["48"] = o12;
// 3214
o12.getAttributeNode = f449694821_566;
// undefined
o12 = null;
// 3216
o12 = {};
// 3217
f449694821_566.returns.push(o12);
// 3218
o12.value = "requestsCountWrapper";
// undefined
o12 = null;
// 3220
o12 = {};
// 3221
o4["49"] = o12;
// 3222
o12.getAttributeNode = f449694821_566;
// undefined
o12 = null;
// 3224
o12 = {};
// 3225
f449694821_566.returns.push(o12);
// 3226
o12.value = "requestsCountValue";
// undefined
o12 = null;
// 3228
o12 = {};
// 3229
o4["50"] = o12;
// 3230
o12.getAttributeNode = f449694821_566;
// undefined
o12 = null;
// 3232
f449694821_566.returns.push(null);
// 3234
o4["51"] = o62;
// 3235
o62.getAttributeNode = f449694821_566;
// undefined
o62 = null;
// 3237
o12 = {};
// 3238
f449694821_566.returns.push(o12);
// 3239
o12.value = "fbRequestsFlyout";
// undefined
o12 = null;
// 3241
o12 = {};
// 3242
o4["52"] = o12;
// 3243
o12.getAttributeNode = f449694821_566;
// undefined
o12 = null;
// 3245
f449694821_566.returns.push(null);
// 3247
o12 = {};
// 3248
o4["53"] = o12;
// 3249
o12.getAttributeNode = f449694821_566;
// undefined
o12 = null;
// 3251
f449694821_566.returns.push(null);
// 3253
o12 = {};
// 3254
o4["54"] = o12;
// 3255
o12.getAttributeNode = f449694821_566;
// undefined
o12 = null;
// 3257
f449694821_566.returns.push(null);
// 3259
o12 = {};
// 3260
o4["55"] = o12;
// 3261
o12.getAttributeNode = f449694821_566;
// undefined
o12 = null;
// 3263
o12 = {};
// 3264
f449694821_566.returns.push(o12);
// 3265
o12.value = "fbRequestsList";
// undefined
o12 = null;
// 3267
o12 = {};
// 3268
o4["56"] = o12;
// 3269
o12.getAttributeNode = f449694821_566;
// undefined
o12 = null;
// 3271
o12 = {};
// 3272
f449694821_566.returns.push(o12);
// 3273
o12.value = "fbRequestsList_loading_indicator";
// undefined
o12 = null;
// 3275
o12 = {};
// 3276
o4["57"] = o12;
// 3277
o12.getAttributeNode = f449694821_566;
// undefined
o12 = null;
// 3279
f449694821_566.returns.push(null);
// 3281
o4["58"] = o58;
// 3282
o58.getAttributeNode = f449694821_566;
// undefined
o58 = null;
// 3284
o12 = {};
// 3285
f449694821_566.returns.push(o12);
// 3286
o12.value = "fbMessagesJewel";
// undefined
o12 = null;
// 3288
o12 = {};
// 3289
o4["59"] = o12;
// 3290
o12.getAttributeNode = f449694821_566;
// undefined
o12 = null;
// 3292
f449694821_566.returns.push(null);
// 3294
o12 = {};
// 3295
o4["60"] = o12;
// 3296
o12.getAttributeNode = f449694821_566;
// undefined
o12 = null;
// 3298
o12 = {};
// 3299
f449694821_566.returns.push(o12);
// 3300
o12.value = "mercurymessagesCountWrapper";
// undefined
o12 = null;
// 3302
o12 = {};
// 3303
o4["61"] = o12;
// 3304
o12.getAttributeNode = f449694821_566;
// undefined
o12 = null;
// 3306
o12 = {};
// 3307
f449694821_566.returns.push(o12);
// 3308
o12.value = "mercurymessagesCountValue";
// undefined
o12 = null;
// 3310
o12 = {};
// 3311
o4["62"] = o12;
// 3312
o12.getAttributeNode = f449694821_566;
// undefined
o12 = null;
// 3314
f449694821_566.returns.push(null);
// 3316
o4["63"] = o60;
// 3317
o60.getAttributeNode = f449694821_566;
// undefined
o60 = null;
// 3319
o12 = {};
// 3320
f449694821_566.returns.push(o12);
// 3321
o12.value = "fbMessagesFlyout";
// undefined
o12 = null;
// 3323
o12 = {};
// 3324
o4["64"] = o12;
// 3325
o12.getAttributeNode = f449694821_566;
// undefined
o12 = null;
// 3327
f449694821_566.returns.push(null);
// 3329
o12 = {};
// 3330
o4["65"] = o12;
// 3331
o12.getAttributeNode = f449694821_566;
// undefined
o12 = null;
// 3333
f449694821_566.returns.push(null);
// 3335
o12 = {};
// 3336
o4["66"] = o12;
// 3337
o12.getAttributeNode = f449694821_566;
// undefined
o12 = null;
// 3339
f449694821_566.returns.push(null);
// 3341
o12 = {};
// 3342
o4["67"] = o12;
// 3343
o12.getAttributeNode = f449694821_566;
// undefined
o12 = null;
// 3345
f449694821_566.returns.push(null);
// 3347
o12 = {};
// 3348
o4["68"] = o12;
// 3349
o12.getAttributeNode = f449694821_566;
// undefined
o12 = null;
// 3351
f449694821_566.returns.push(null);
// 3353
o12 = {};
// 3354
o4["69"] = o12;
// 3355
o12.getAttributeNode = f449694821_566;
// undefined
o12 = null;
// 3357
f449694821_566.returns.push(null);
// 3359
o12 = {};
// 3360
o4["70"] = o12;
// 3361
o12.getAttributeNode = f449694821_566;
// undefined
o12 = null;
// 3363
f449694821_566.returns.push(null);
// 3365
o4["71"] = o51;
// 3366
o51.getAttributeNode = f449694821_566;
// undefined
o51 = null;
// 3368
f449694821_566.returns.push(null);
// 3370
o12 = {};
// 3371
o4["72"] = o12;
// 3372
o12.getAttributeNode = f449694821_566;
// 3374
o13 = {};
// 3375
f449694821_566.returns.push(o13);
// 3376
o13.value = "u_0_4";
// undefined
o13 = null;
// 3378
o13 = {};
// 3379
o4["73"] = o13;
// 3380
o13.getAttributeNode = f449694821_566;
// undefined
o13 = null;
// 3382
f449694821_566.returns.push(null);
// 3384
o13 = {};
// 3385
o4["74"] = o13;
// 3386
o13.getAttributeNode = f449694821_566;
// undefined
o13 = null;
// 3388
f449694821_566.returns.push(null);
// 3390
o13 = {};
// 3391
o4["75"] = o13;
// 3392
o13.getAttributeNode = f449694821_566;
// undefined
o13 = null;
// 3394
f449694821_566.returns.push(null);
// 3396
o13 = {};
// 3397
o4["76"] = o13;
// 3398
o13.getAttributeNode = f449694821_566;
// undefined
o13 = null;
// 3400
f449694821_566.returns.push(null);
// 3402
o13 = {};
// 3403
o4["77"] = o13;
// 3404
o13.getAttributeNode = f449694821_566;
// undefined
o13 = null;
// 3406
f449694821_566.returns.push(null);
// 3408
o13 = {};
// 3409
o4["78"] = o13;
// 3410
o13.getAttributeNode = f449694821_566;
// undefined
o13 = null;
// 3412
f449694821_566.returns.push(null);
// 3414
o13 = {};
// 3415
o4["79"] = o13;
// 3416
o13.getAttributeNode = f449694821_566;
// undefined
o13 = null;
// 3418
f449694821_566.returns.push(null);
// 3420
o4["80"] = o28;
// 3421
o28.getAttributeNode = f449694821_566;
// undefined
o28 = null;
// 3423
o13 = {};
// 3424
f449694821_566.returns.push(o13);
// 3425
o13.value = "MercuryJewelThreadList";
// undefined
o13 = null;
// 3427
o4["81"] = o30;
// 3428
o30.getAttributeNode = f449694821_566;
// undefined
o30 = null;
// 3430
f449694821_566.returns.push(null);
// 3432
o4["82"] = o31;
// 3433
o31.getAttributeNode = f449694821_566;
// undefined
o31 = null;
// 3435
f449694821_566.returns.push(null);
// 3437
o4["83"] = o32;
// 3438
o32.getAttributeNode = f449694821_566;
// undefined
o32 = null;
// 3440
f449694821_566.returns.push(null);
// 3442
o13 = {};
// 3443
o4["84"] = o13;
// 3444
o13.getAttributeNode = f449694821_566;
// undefined
o13 = null;
// 3446
f449694821_566.returns.push(null);
// 3448
o13 = {};
// 3449
o4["85"] = o13;
// 3450
o13.getAttributeNode = f449694821_566;
// undefined
o13 = null;
// 3452
f449694821_566.returns.push(null);
// 3454
o13 = {};
// 3455
o4["86"] = o13;
// 3456
o13.getAttributeNode = f449694821_566;
// undefined
o13 = null;
// 3458
f449694821_566.returns.push(null);
// 3460
o13 = {};
// 3461
o4["87"] = o13;
// 3462
o13.getAttributeNode = f449694821_566;
// undefined
o13 = null;
// 3464
f449694821_566.returns.push(null);
// 3466
o13 = {};
// 3467
o4["88"] = o13;
// 3468
o13.getAttributeNode = f449694821_566;
// undefined
o13 = null;
// 3470
f449694821_566.returns.push(null);
// 3472
o13 = {};
// 3473
o4["89"] = o13;
// 3474
o13.getAttributeNode = f449694821_566;
// undefined
o13 = null;
// 3476
f449694821_566.returns.push(null);
// 3478
o13 = {};
// 3479
o4["90"] = o13;
// 3480
o13.getAttributeNode = f449694821_566;
// undefined
o13 = null;
// 3482
f449694821_566.returns.push(null);
// 3484
o13 = {};
// 3485
o4["91"] = o13;
// 3486
o13.getAttributeNode = f449694821_566;
// undefined
o13 = null;
// 3488
f449694821_566.returns.push(null);
// 3490
o13 = {};
// 3491
o4["92"] = o13;
// 3492
o13.getAttributeNode = f449694821_566;
// undefined
o13 = null;
// 3494
f449694821_566.returns.push(null);
// 3496
o13 = {};
// 3497
o4["93"] = o13;
// 3498
o13.getAttributeNode = f449694821_566;
// undefined
o13 = null;
// 3500
f449694821_566.returns.push(null);
// 3502
o4["94"] = o33;
// 3503
o33.getAttributeNode = f449694821_566;
// undefined
o33 = null;
// 3505
f449694821_566.returns.push(null);
// 3507
o4["95"] = o34;
// 3508
o34.getAttributeNode = f449694821_566;
// undefined
o34 = null;
// 3510
f449694821_566.returns.push(null);
// 3512
o13 = {};
// 3513
o4["96"] = o13;
// 3514
o13.getAttributeNode = f449694821_566;
// undefined
o13 = null;
// 3516
o13 = {};
// 3517
f449694821_566.returns.push(o13);
// 3518
o13.value = "MercuryJewelFooter";
// undefined
o13 = null;
// 3520
o13 = {};
// 3521
o4["97"] = o13;
// 3522
o13.getAttributeNode = f449694821_566;
// undefined
o13 = null;
// 3524
f449694821_566.returns.push(null);
// 3526
o13 = {};
// 3527
o4["98"] = o13;
// 3528
o13.getAttributeNode = f449694821_566;
// undefined
o13 = null;
// 3530
f449694821_566.returns.push(null);
// 3532
o13 = {};
// 3533
o4["99"] = o13;
// 3534
o13.getAttributeNode = f449694821_566;
// undefined
o13 = null;
// 3536
f449694821_566.returns.push(null);
// 3538
o4["100"] = o61;
// 3539
o61.getAttributeNode = f449694821_566;
// undefined
o61 = null;
// 3541
o13 = {};
// 3542
f449694821_566.returns.push(o13);
// 3543
o13.value = "fbNotificationsJewel";
// undefined
o13 = null;
// 3545
o4["101"] = o52;
// 3546
o52.getAttributeNode = f449694821_566;
// undefined
o52 = null;
// 3548
f449694821_566.returns.push(null);
// 3550
o13 = {};
// 3551
o4["102"] = o13;
// 3552
o13.getAttributeNode = f449694821_566;
// undefined
o13 = null;
// 3554
f449694821_566.returns.push(null);
// 3556
o13 = {};
// 3557
o4["103"] = o13;
// 3558
o13.getAttributeNode = f449694821_566;
// undefined
o13 = null;
// 3560
o13 = {};
// 3561
f449694821_566.returns.push(o13);
// 3562
o13.value = "notificationsCountWrapper";
// undefined
o13 = null;
// 3564
o13 = {};
// 3565
o4["104"] = o13;
// 3566
o13.getAttributeNode = f449694821_566;
// undefined
o13 = null;
// 3568
o13 = {};
// 3569
f449694821_566.returns.push(o13);
// 3570
o13.value = "notificationsCountValue";
// undefined
o13 = null;
// 3572
o13 = {};
// 3573
o4["105"] = o13;
// 3574
o13.getAttributeNode = f449694821_566;
// undefined
o13 = null;
// 3576
f449694821_566.returns.push(null);
// 3578
o4["106"] = o65;
// 3579
o65.getAttributeNode = f449694821_566;
// undefined
o65 = null;
// 3581
o13 = {};
// 3582
f449694821_566.returns.push(o13);
// 3583
o13.value = "fbNotificationsFlyout";
// undefined
o13 = null;
// 3585
o13 = {};
// 3586
o4["107"] = o13;
// 3587
o13.getAttributeNode = f449694821_566;
// undefined
o13 = null;
// 3589
f449694821_566.returns.push(null);
// 3591
o13 = {};
// 3592
o4["108"] = o13;
// 3593
o13.getAttributeNode = f449694821_566;
// undefined
o13 = null;
// 3595
f449694821_566.returns.push(null);
// 3597
o13 = {};
// 3598
o4["109"] = o13;
// 3599
o13.getAttributeNode = f449694821_566;
// undefined
o13 = null;
// 3601
f449694821_566.returns.push(null);
// 3603
o13 = {};
// 3604
o4["110"] = o13;
// 3605
o13.getAttributeNode = f449694821_566;
// undefined
o13 = null;
// 3607
f449694821_566.returns.push(null);
// 3609
o13 = {};
// 3610
o4["111"] = o13;
// 3611
o13.getAttributeNode = f449694821_566;
// undefined
o13 = null;
// 3613
f449694821_566.returns.push(null);
// 3615
o13 = {};
// 3616
o4["112"] = o13;
// 3617
o13.getAttributeNode = f449694821_566;
// undefined
o13 = null;
// 3619
f449694821_566.returns.push(null);
// 3621
o13 = {};
// 3622
o4["113"] = o13;
// 3623
o13.getAttributeNode = f449694821_566;
// undefined
o13 = null;
// 3625
f449694821_566.returns.push(null);
// 3627
o13 = {};
// 3628
o4["114"] = o13;
// 3629
o13.getAttributeNode = f449694821_566;
// undefined
o13 = null;
// 3631
f449694821_566.returns.push(null);
// 3633
o13 = {};
// 3634
o4["115"] = o13;
// 3635
o13.getAttributeNode = f449694821_566;
// undefined
o13 = null;
// 3637
f449694821_566.returns.push(null);
// 3639
o13 = {};
// 3640
o4["116"] = o13;
// 3641
o13.getAttributeNode = f449694821_566;
// undefined
o13 = null;
// 3643
f449694821_566.returns.push(null);
// 3645
o13 = {};
// 3646
o4["117"] = o13;
// 3647
o13.getAttributeNode = f449694821_566;
// undefined
o13 = null;
// 3649
f449694821_566.returns.push(null);
// 3651
o4["118"] = o29;
// 3652
o29.getAttributeNode = f449694821_566;
// undefined
o29 = null;
// 3654
o13 = {};
// 3655
f449694821_566.returns.push(o13);
// 3656
o13.value = "u_0_5";
// undefined
o13 = null;
// 3658
o4["119"] = o36;
// 3659
o36.getAttributeNode = f449694821_566;
// undefined
o36 = null;
// 3661
f449694821_566.returns.push(null);
// 3663
o4["120"] = o37;
// 3664
o37.getAttributeNode = f449694821_566;
// undefined
o37 = null;
// 3666
f449694821_566.returns.push(null);
// 3668
o4["121"] = o38;
// 3669
o38.getAttributeNode = f449694821_566;
// undefined
o38 = null;
// 3671
f449694821_566.returns.push(null);
// 3673
o13 = {};
// 3674
o4["122"] = o13;
// 3675
o13.getAttributeNode = f449694821_566;
// undefined
o13 = null;
// 3677
o13 = {};
// 3678
f449694821_566.returns.push(o13);
// 3679
o13.value = "fbNotificationsList";
// undefined
o13 = null;
// 3681
o13 = {};
// 3682
o4["123"] = o13;
// 3683
o13.getAttributeNode = f449694821_566;
// undefined
o13 = null;
// 3685
o13 = {};
// 3686
f449694821_566.returns.push(o13);
// 3687
o13.value = "fbNotificationsList_loading_indicator";
// undefined
o13 = null;
// 3689
o13 = {};
// 3690
o4["124"] = o13;
// 3691
o13.getAttributeNode = f449694821_566;
// undefined
o13 = null;
// 3693
f449694821_566.returns.push(null);
// 3695
o13 = {};
// 3696
o4["125"] = o13;
// 3697
o13.getAttributeNode = f449694821_566;
// undefined
o13 = null;
// 3699
f449694821_566.returns.push(null);
// 3701
o13 = {};
// 3702
o4["126"] = o13;
// 3703
o13.getAttributeNode = f449694821_566;
// undefined
o13 = null;
// 3705
f449694821_566.returns.push(null);
// 3707
o13 = {};
// 3708
o4["127"] = o13;
// 3709
o13.getAttributeNode = f449694821_566;
// undefined
o13 = null;
// 3711
f449694821_566.returns.push(null);
// 3713
o13 = {};
// 3714
o4["128"] = o13;
// 3715
o13.getAttributeNode = f449694821_566;
// undefined
o13 = null;
// 3717
f449694821_566.returns.push(null);
// 3719
o13 = {};
// 3720
o4["129"] = o13;
// 3721
o13.getAttributeNode = f449694821_566;
// undefined
o13 = null;
// 3723
f449694821_566.returns.push(null);
// 3725
o13 = {};
// 3726
o4["130"] = o13;
// 3727
o13.getAttributeNode = f449694821_566;
// undefined
o13 = null;
// 3729
f449694821_566.returns.push(null);
// 3731
o4["131"] = o39;
// 3732
o39.getAttributeNode = f449694821_566;
// undefined
o39 = null;
// 3734
f449694821_566.returns.push(null);
// 3736
o4["132"] = o40;
// 3737
o40.getAttributeNode = f449694821_566;
// undefined
o40 = null;
// 3739
f449694821_566.returns.push(null);
// 3741
o13 = {};
// 3742
o4["133"] = o13;
// 3743
o13.getAttributeNode = f449694821_566;
// undefined
o13 = null;
// 3745
o13 = {};
// 3746
f449694821_566.returns.push(o13);
// 3747
o13.value = "jewelNotice";
// undefined
o13 = null;
// 3749
o13 = {};
// 3750
o4["134"] = o13;
// 3751
o13.getAttributeNode = f449694821_566;
// undefined
o13 = null;
// 3753
f449694821_566.returns.push(null);
// 3755
o13 = {};
// 3756
o4["135"] = o13;
// 3757
o13.getAttributeNode = f449694821_566;
// undefined
o13 = null;
// 3759
f449694821_566.returns.push(null);
// 3761
o13 = {};
// 3762
o4["136"] = o13;
// 3763
o13.getAttributeNode = f449694821_566;
// undefined
o13 = null;
// 3765
f449694821_566.returns.push(null);
// 3767
o13 = {};
// 3768
o4["137"] = o13;
// 3769
o13.getAttributeNode = f449694821_566;
// 3771
o14 = {};
// 3772
f449694821_566.returns.push(o14);
// 3773
o14.value = "headNav";
// undefined
o14 = null;
// 3775
o4["138"] = o53;
// 3776
o53.getAttributeNode = f449694821_566;
// undefined
o53 = null;
// 3778
f449694821_566.returns.push(null);
// 3780
o14 = {};
// 3781
o4["139"] = o14;
// 3782
o14.getAttributeNode = f449694821_424;
// undefined
o14 = null;
// 3784
o14 = {};
// 3785
f449694821_424.returns.push(o14);
// 3786
o14.value = "navSearch";
// undefined
o14 = null;
// 3788
o14 = {};
// 3789
o4["140"] = o14;
// 3790
o14.getAttributeNode = f449694821_566;
// undefined
o14 = null;
// 3792
o14 = {};
// 3793
f449694821_566.returns.push(o14);
// 3794
o14.value = "u_0_2";
// undefined
o14 = null;
// 3796
o14 = {};
// 3797
o4["141"] = o14;
// 3798
o14.getAttributeNode = f449694821_566;
// undefined
o14 = null;
// 3800
f449694821_566.returns.push(null);
// 3802
o14 = {};
// 3803
o4["142"] = o14;
// 3804
f449694821_691 = function() { return f449694821_691.returns[f449694821_691.inst++]; };
f449694821_691.returns = [];
f449694821_691.inst = 0;
// 3805
o14.getAttributeNode = f449694821_691;
// undefined
o14 = null;
// 3807
f449694821_691.returns.push(null);
// 3809
o14 = {};
// 3810
o4["143"] = o14;
// 3811
o14.getAttributeNode = f449694821_566;
// undefined
o14 = null;
// 3813
f449694821_566.returns.push(null);
// 3815
o14 = {};
// 3816
o4["144"] = o14;
// 3817
o14.getAttributeNode = f449694821_566;
// undefined
o14 = null;
// 3819
o14 = {};
// 3820
f449694821_566.returns.push(o14);
// 3821
o14.value = "u_0_3";
// undefined
o14 = null;
// 3823
o14 = {};
// 3824
o4["145"] = o14;
// 3825
o14.getAttributeNode = f449694821_566;
// undefined
o14 = null;
// 3827
f449694821_566.returns.push(null);
// 3829
o4["146"] = o54;
// 3830
o54.getAttributeNode = f449694821_566;
// undefined
o54 = null;
// 3832
f449694821_566.returns.push(null);
// 3834
o4["147"] = o55;
// 3835
o55.getAttributeNode = f449694821_566;
// undefined
o55 = null;
// 3837
f449694821_566.returns.push(null);
// 3839
o14 = {};
// 3840
o4["148"] = o14;
// 3841
o14.getAttributeNode = f449694821_691;
// undefined
o14 = null;
// 3843
o14 = {};
// 3844
f449694821_691.returns.push(o14);
// 3845
o14.value = "q";
// undefined
o14 = null;
// 3847
o4["149"] = o56;
// 3848
o56.getAttributeNode = f449694821_566;
// undefined
o56 = null;
// 3850
f449694821_566.returns.push(null);
// 3852
o14 = {};
// 3853
o4["150"] = o14;
// 3854
o14.getAttributeNode = f449694821_566;
// undefined
o14 = null;
// 3856
f449694821_566.returns.push(null);
// 3858
o14 = {};
// 3859
o4["151"] = o14;
// 3860
o14.getAttributeNode = f449694821_566;
// undefined
o14 = null;
// 3862
f449694821_566.returns.push(null);
// 3864
o14 = {};
// 3865
o4["152"] = o14;
// 3866
o14.getAttributeNode = f449694821_566;
// undefined
o14 = null;
// 3868
o14 = {};
// 3869
f449694821_566.returns.push(o14);
// 3870
o14.value = "u_0_0";
// undefined
o14 = null;
// 3872
o14 = {};
// 3873
o4["153"] = o14;
// 3874
o14.getAttributeNode = f449694821_691;
// undefined
o14 = null;
// 3876
o14 = {};
// 3877
f449694821_691.returns.push(o14);
// 3878
o14.value = "init";
// undefined
o14 = null;
// 3880
o14 = {};
// 3881
o4["154"] = o14;
// 3882
o14.getAttributeNode = f449694821_691;
// undefined
o14 = null;
// 3884
f449694821_691.returns.push(null);
// 3886
o14 = {};
// 3887
o4["155"] = o14;
// 3888
o14.getAttributeNode = f449694821_691;
// undefined
o14 = null;
// 3890
o14 = {};
// 3891
f449694821_691.returns.push(o14);
// 3892
o14.value = "search_first_focus";
// undefined
o14 = null;
// 3894
o14 = {};
// 3895
o4["156"] = o14;
// 3896
o14.getAttributeNode = f449694821_566;
// 3898
f449694821_566.returns.push(null);
// 3900
o15 = {};
// 3901
o4["157"] = o15;
// 3902
o15.getAttributeNode = f449694821_566;
// 3904
o16 = {};
// 3905
f449694821_566.returns.push(o16);
// 3906
o16.value = "pageNav";
// undefined
o16 = null;
// 3908
o16 = {};
// 3909
o4["158"] = o16;
// 3910
o16.getAttributeNode = f449694821_566;
// undefined
o16 = null;
// 3912
f449694821_566.returns.push(null);
// 3914
o16 = {};
// 3915
o4["159"] = o16;
// 3916
o16.getAttributeNode = f449694821_566;
// undefined
o16 = null;
// 3918
f449694821_566.returns.push(null);
// 3920
o16 = {};
// 3921
o4["160"] = o16;
// 3922
o16.getAttributeNode = f449694821_566;
// undefined
o16 = null;
// 3924
o16 = {};
// 3925
f449694821_566.returns.push(o16);
// 3926
o16.value = "profile_pic_header_100006118350059";
// undefined
o16 = null;
// 3928
o16 = {};
// 3929
o4["161"] = o16;
// 3930
o16.getAttributeNode = f449694821_566;
// undefined
o16 = null;
// 3932
f449694821_566.returns.push(null);
// 3934
o16 = {};
// 3935
o4["162"] = o16;
// 3936
o16.getAttributeNode = f449694821_566;
// undefined
o16 = null;
// 3938
f449694821_566.returns.push(null);
// 3940
o4["163"] = o57;
// 3941
o57.getAttributeNode = f449694821_566;
// undefined
o57 = null;
// 3943
f449694821_566.returns.push(null);
// 3945
o16 = {};
// 3946
o4["164"] = o16;
// 3947
o16.getAttributeNode = f449694821_566;
// undefined
o16 = null;
// 3949
f449694821_566.returns.push(null);
// 3951
o16 = {};
// 3952
o4["165"] = o16;
// 3953
o16.getAttributeNode = f449694821_566;
// undefined
o16 = null;
// 3955
f449694821_566.returns.push(null);
// 3957
o16 = {};
// 3958
o4["166"] = o16;
// 3959
o16.getAttributeNode = f449694821_566;
// undefined
o16 = null;
// 3961
o16 = {};
// 3962
f449694821_566.returns.push(o16);
// 3963
o16.value = "navFindFriends";
// undefined
o16 = null;
// 3965
o16 = {};
// 3966
o4["167"] = o16;
// 3967
o16.getAttributeNode = f449694821_566;
// undefined
o16 = null;
// 3969
o16 = {};
// 3970
f449694821_566.returns.push(o16);
// 3971
o16.value = "findFriendsNav";
// undefined
o16 = null;
// 3973
o16 = {};
// 3974
o4["168"] = o16;
// 3975
o16.getAttributeNode = f449694821_566;
// undefined
o16 = null;
// 3977
o16 = {};
// 3978
f449694821_566.returns.push(o16);
// 3979
o16.value = "navHome";
// undefined
o16 = null;
// 3981
o16 = {};
// 3982
o4["169"] = o16;
// 3983
o16.getAttributeNode = f449694821_566;
// undefined
o16 = null;
// 3985
f449694821_566.returns.push(null);
// 3987
o16 = {};
// 3988
o4["170"] = o16;
// 3989
o16.getAttributeNode = f449694821_566;
// 3991
o17 = {};
// 3992
f449694821_566.returns.push(o17);
// 3993
o17.value = "navPrivacy";
// undefined
o17 = null;
// 3995
o17 = {};
// 3996
o4["171"] = o17;
// 3997
o17.getAttributeNode = f449694821_566;
// 3999
o19 = {};
// 4000
f449694821_566.returns.push(o19);
// 4001
o19.value = "u_0_8";
// undefined
o19 = null;
// 4003
o19 = {};
// 4004
o4["172"] = o19;
// undefined
o4 = null;
// 4005
o19.getAttributeNode = f449694821_566;
// 4007
o4 = {};
// 4008
f449694821_566.returns.push(o4);
// 4009
o4.value = "u_0_6";
// undefined
o4 = null;
// 4011
o4 = {};
// 4012
o19.classList = o4;
// 4014
o4.contains = f449694821_563;
// undefined
o4 = null;
// 4015
f449694821_563.returns.push(false);
// 4016
o19.parentNode = o17;
// undefined
o19 = null;
// 4017
o4 = {};
// 4018
o17.classList = o4;
// 4020
o4.contains = f449694821_563;
// undefined
o4 = null;
// 4021
f449694821_563.returns.push(false);
// 4022
o17.parentNode = o16;
// undefined
o17 = null;
// 4023
o4 = {};
// 4024
o16.classList = o4;
// 4026
o4.contains = f449694821_563;
// undefined
o4 = null;
// 4027
f449694821_563.returns.push(false);
// 4028
o16.parentNode = o15;
// undefined
o16 = null;
// 4029
o4 = {};
// 4030
o15.classList = o4;
// 4032
o4.contains = f449694821_563;
// undefined
o4 = null;
// 4033
f449694821_563.returns.push(false);
// 4034
o15.parentNode = o14;
// undefined
o15 = null;
// 4035
o4 = {};
// 4036
o14.classList = o4;
// 4038
o4.contains = f449694821_563;
// undefined
o4 = null;
// 4039
f449694821_563.returns.push(false);
// 4040
o14.parentNode = o13;
// undefined
o14 = null;
// 4041
o4 = {};
// 4042
o13.classList = o4;
// 4044
o4.contains = f449694821_563;
// undefined
o4 = null;
// 4045
f449694821_563.returns.push(false);
// 4046
o13.parentNode = o11;
// undefined
o13 = null;
// 4047
o4 = {};
// 4048
o11.classList = o4;
// 4050
o4.contains = f449694821_563;
// undefined
o4 = null;
// 4051
f449694821_563.returns.push(false);
// 4052
o11.parentNode = o10;
// undefined
o11 = null;
// 4053
o4 = {};
// 4054
o10.classList = o4;
// 4056
o4.contains = f449694821_563;
// undefined
o4 = null;
// 4057
f449694821_563.returns.push(false);
// 4058
o10.parentNode = o9;
// undefined
o10 = null;
// 4059
o4 = {};
// 4060
o9.classList = o4;
// 4062
o4.contains = f449694821_563;
// undefined
o4 = null;
// 4063
f449694821_563.returns.push(false);
// 4064
o9.parentNode = o8;
// undefined
o9 = null;
// 4065
o4 = {};
// 4066
o8.classList = o4;
// 4068
o4.contains = f449694821_563;
// undefined
o4 = null;
// 4069
f449694821_563.returns.push(false);
// 4070
o8.parentNode = o7;
// undefined
o8 = null;
// 4071
o4 = {};
// 4072
o7.classList = o4;
// 4074
o4.contains = f449694821_563;
// undefined
o4 = null;
// 4075
f449694821_563.returns.push(false);
// 4076
o7.parentNode = o6;
// undefined
o7 = null;
// 4080
ow449694821.JSBNG__random = undefined;
// 4081
f449694821_386.returns.push(0.3433784359517864);
// 4084
f449694821_387.returns.push(1373490177325);
// 4085
o4 = {};
// 4086
f449694821_64.returns.push(o4);
// undefined
o4 = null;
// 4087
f449694821_7.returns.push(undefined);
// 4088
ow449694821.JSBNG__attachEvent = undefined;
// 4089
f449694821_16.returns.push(13);
// 4092
f449694821_450.returns.push(o12);
// 4093
o12.nodeName = "A";
// 4094
o12.__FB_TOKEN = void 0;
// 4095
// 4096
o12.getAttribute = f449694821_444;
// 4097
o12.hasAttribute = f449694821_445;
// 4099
f449694821_445.returns.push(false);
// 4100
o12.JSBNG__addEventListener = f449694821_402;
// 4102
f449694821_402.returns.push(undefined);
// 4103
f449694821_748 = function() { return f449694821_748.returns[f449694821_748.inst++]; };
f449694821_748.returns = [];
f449694821_748.inst = 0;
// 4104
o12.JSBNG__onclick = f449694821_748;
// 4107
// undefined
o12 = null;
// 4111
o4 = {};
// 4112
f449694821_396.returns.push(o4);
// 4113
// 4114
// 4115
o4.getElementsByTagName = f449694821_419;
// 4116
o7 = {};
// 4117
f449694821_419.returns.push(o7);
// 4118
o7.length = 0;
// undefined
o7 = null;
// 4120
o7 = {};
// 4121
o4.childNodes = o7;
// undefined
o4 = null;
// 4122
o7.item = f449694821_422;
// 4123
o7.length = 1;
// 4124
o4 = {};
// 4125
o7["0"] = o4;
// undefined
o7 = null;
// undefined
o4 = null;
// 4127
o4 = {};
// 4128
f449694821_396.returns.push(o4);
// 4129
// 4130
// 4131
o4.getElementsByTagName = f449694821_419;
// 4132
o7 = {};
// 4133
f449694821_419.returns.push(o7);
// 4134
o7.length = 0;
// undefined
o7 = null;
// 4136
o7 = {};
// 4137
o4.childNodes = o7;
// undefined
o4 = null;
// 4138
o7.item = f449694821_422;
// 4139
o7.length = 1;
// 4140
o4 = {};
// 4141
o7["0"] = o4;
// undefined
o7 = null;
// undefined
o4 = null;
// 4143
o4 = {};
// 4144
f449694821_396.returns.push(o4);
// 4145
// 4146
// 4147
o4.getElementsByTagName = f449694821_419;
// 4148
o7 = {};
// 4149
f449694821_419.returns.push(o7);
// 4150
o7.length = 0;
// undefined
o7 = null;
// 4152
o7 = {};
// 4153
o4.childNodes = o7;
// undefined
o4 = null;
// 4154
o7.item = f449694821_422;
// 4155
o7.length = 1;
// 4156
o4 = {};
// 4157
o7["0"] = o4;
// undefined
o7 = null;
// undefined
o4 = null;
// 4159
o4 = {};
// 4160
f449694821_396.returns.push(o4);
// 4161
// 4162
// 4163
o4.getElementsByTagName = f449694821_419;
// 4164
o7 = {};
// 4165
f449694821_419.returns.push(o7);
// 4166
o7.length = 0;
// undefined
o7 = null;
// 4168
o7 = {};
// 4169
o4.childNodes = o7;
// undefined
o4 = null;
// 4170
o7.item = f449694821_422;
// 4171
o7.length = 1;
// 4172
o4 = {};
// 4173
o7["0"] = o4;
// undefined
o7 = null;
// undefined
o4 = null;
// 4175
o4 = {};
// 4176
f449694821_396.returns.push(o4);
// undefined
o4 = null;
// 4177
o4 = {};
// 4178
o0.implementation = o4;
// 4180
f449694821_767 = function() { return f449694821_767.returns[f449694821_767.inst++]; };
f449694821_767.returns = [];
f449694821_767.inst = 0;
// 4181
o4.hasFeature = f449694821_767;
// undefined
o4 = null;
// 4184
f449694821_767.returns.push(true);
// 4186
o4 = {};
// 4187
f449694821_396.returns.push(o4);
// undefined
o4 = null;
// 4189
o4 = {};
// 4190
f449694821_396.returns.push(o4);
// 4191
f449694821_770 = function() { return f449694821_770.returns[f449694821_770.inst++]; };
f449694821_770.returns = [];
f449694821_770.inst = 0;
// 4192
o4.setAttribute = f449694821_770;
// 4193
f449694821_770.returns.push(undefined);
// 4194
o4.JSBNG__onchange = null;
// 4196
// 4197
f449694821_771 = function() { return f449694821_771.returns[f449694821_771.inst++]; };
f449694821_771.returns = [];
f449694821_771.inst = 0;
// 4198
o4.removeAttribute = f449694821_771;
// undefined
o4 = null;
// 4199
f449694821_771.returns.push(undefined);
// 4201
o4 = {};
// 4202
f449694821_396.returns.push(o4);
// 4203
o4.setAttribute = f449694821_770;
// 4204
f449694821_770.returns.push(undefined);
// 4205
o4.JSBNG__oninput = null;
// 4207
// 4208
o4.removeAttribute = f449694821_771;
// undefined
o4 = null;
// 4209
f449694821_771.returns.push(undefined);
// 4211
o4 = {};
// 4212
f449694821_396.returns.push(o4);
// 4213
// 4214
// 4215
o4.getElementsByTagName = f449694821_419;
// 4216
o7 = {};
// 4217
f449694821_419.returns.push(o7);
// 4218
o7.length = 0;
// undefined
o7 = null;
// 4220
o7 = {};
// 4221
o4.childNodes = o7;
// undefined
o4 = null;
// 4222
o7.item = f449694821_422;
// 4223
o7.length = 1;
// 4224
o4 = {};
// 4225
o7["0"] = o4;
// undefined
o7 = null;
// undefined
o4 = null;
// 4227
o4 = {};
// 4228
f449694821_396.returns.push(o4);
// 4229
// 4230
// 4231
o4.getElementsByTagName = f449694821_419;
// 4232
o7 = {};
// 4233
f449694821_419.returns.push(o7);
// 4234
o7.length = 0;
// undefined
o7 = null;
// 4236
o7 = {};
// 4237
o4.childNodes = o7;
// undefined
o4 = null;
// 4238
o7.item = f449694821_422;
// 4239
o7.length = 1;
// 4240
o4 = {};
// 4241
o7["0"] = o4;
// undefined
o7 = null;
// undefined
o4 = null;
// 4242
f449694821_17.returns.push(14);
// 4243
o2.onLine = true;
// 4244
f449694821_7.returns.push(undefined);
// 4245
f449694821_7.returns.push(undefined);
// 4247
f449694821_387.returns.push(1373490177501);
// 4249
f449694821_387.returns.push(1373490177501);
// 4250
o0.compatMode = "CSS1Compat";
// 4253
f449694821_7.returns.push(undefined);
// 4254
ow449694821.JSBNG__onJSBNG__focus = undefined;
// 4259
f449694821_402.returns.push(undefined);
// 4260
o1.JSBNG__onDOMMouseScroll = void 0;
// 4267
f449694821_402.returns.push(undefined);
// 4268
o1.JSBNG__onmousemove = null;
// 4273
f449694821_402.returns.push(undefined);
// 4274
o1.JSBNG__onmouseover = null;
// 4277
o3["33"] = o64;
// 4282
o64.src = "";
// undefined
o64 = null;
// 4288
o4 = {};
// 4291
o3["34"] = o4;
// 4296
o4.src = "";
// undefined
o4 = null;
// 4302
o4 = {};
// 4305
o3["35"] = o4;
// 4310
o4.src = "";
// undefined
o4 = null;
// 4316
o4 = {};
// 4319
o3["36"] = o4;
// 4324
o4.src = "";
// undefined
o4 = null;
// 4330
o4 = {};
// 4333
o3["37"] = o4;
// 4338
o4.src = "";
// undefined
o4 = null;
// 4344
o4 = {};
// 4347
o3["38"] = o4;
// 4352
o4.src = "";
// undefined
o4 = null;
// 4358
o4 = {};
// 4361
o3["39"] = o4;
// 4366
o4.src = "";
// undefined
o4 = null;
// 4372
o4 = {};
// 4375
o3["40"] = o4;
// 4380
o4.src = "";
// undefined
o4 = null;
// 4386
o4 = {};
// 4389
o3["41"] = o4;
// 4394
o4.src = "";
// undefined
o4 = null;
// 4400
o4 = {};
// 4403
o3["42"] = o4;
// 4408
o4.src = "";
// undefined
o4 = null;
// 4414
o4 = {};
// 4417
o3["43"] = o4;
// undefined
o3 = null;
// 4422
o4.src = "";
// undefined
o4 = null;
// 4427
f449694821_795 = function() { return f449694821_795.returns[f449694821_795.inst++]; };
f449694821_795.returns = [];
f449694821_795.inst = 0;
// 4428
o2.javaEnabled = f449694821_795;
// 4429
f449694821_795.returns.push(true);
// 4430
o3 = {};
// 4431
o4 = {};
// 4433
o7 = {};
// 4434
o3._moduleIDsToCleanup = o7;
// 4435
// undefined
o7 = null;
// 4436
f449694821_799 = function() { return f449694821_799.returns[f449694821_799.inst++]; };
f449694821_799.returns = [];
f449694821_799.inst = 0;
// 4437
o3._replaceTransportMarkers = f449694821_799;
// 4438
f449694821_799.returns.push(undefined);
// 4439
f449694821_800 = function() { return f449694821_800.returns[f449694821_800.inst++]; };
f449694821_800.returns = [];
f449694821_800.inst = 0;
// 4440
o4.logUnityVersion = f449694821_800;
// 4442
o7 = {};
// 4443
o2.plugins = o7;
// undefined
o2 = null;
// 4444
f449694821_802 = function() { return f449694821_802.returns[f449694821_802.inst++]; };
f449694821_802.returns = [];
f449694821_802.inst = 0;
// 4445
o7.refresh = f449694821_802;
// undefined
o7 = null;
// 4446
f449694821_802.returns.push(undefined);
// 4452
ow449694821.JSBNG__onpopstate = f449694821_522;
// 4461
o2 = {};
// 4462
f449694821_812 = function() { return f449694821_812.returns[f449694821_812.inst++]; };
f449694821_812.returns = [];
f449694821_812.inst = 0;
// 4463
o7 = {};
// 4464
// 4465
// undefined
o7 = null;
// 4466
// undefined
o2 = null;
// 4467
o2 = {};
// 4470
o7 = {};
// 4472
f449694821_816 = function() { return f449694821_816.returns[f449694821_816.inst++]; };
f449694821_816.returns = [];
f449694821_816.inst = 0;
// 4474
o7.$URIBase0 = null;
// 4475
o7.$URIBase1 = null;
// 4476
o7.$URIBase2 = null;
// 4477
o7.$URIBase3 = "/";
// 4479
o8 = {};
// 4480
o7.$URIBase5 = o8;
// 4481
f449694821_818 = function() { return f449694821_818.returns[f449694821_818.inst++]; };
f449694821_818.returns = [];
f449694821_818.inst = 0;
// 4483
f449694821_818.returns.push(true);
// 4484
o8.sk = "welcome";
// 4486
o7.$URIBase4 = "";
// 4487
f449694821_816.returns.push("/?sk=welcome");
// 4488
o9 = {};
// undefined
o9 = null;
// 4489
f449694821_820 = function() { return f449694821_820.returns[f449694821_820.inst++]; };
f449694821_820.returns = [];
f449694821_820.inst = 0;
// 4490
o9 = {};
// undefined
o9 = null;
// 4491
f449694821_822 = function() { return f449694821_822.returns[f449694821_822.inst++]; };
f449694821_822.returns = [];
f449694821_822.inst = 0;
// 4492
f449694821_823 = function() { return f449694821_823.returns[f449694821_823.inst++]; };
f449694821_823.returns = [];
f449694821_823.inst = 0;
// 4493
o0.nodeName = "#document";
// 4494
o0.__FB_TOKEN = void 0;
// 4495
// 4496
o0.getAttribute = void 0;
// 4499
f449694821_388.returns.push(undefined);
// 4500
o0.JSBNG__onclick = null;
// 4502
f449694821_824 = function() { return f449694821_824.returns[f449694821_824.inst++]; };
f449694821_824.returns = [];
f449694821_824.inst = 0;
// 4506
f449694821_388.returns.push(undefined);
// 4507
o0.JSBNG__onsubmit = null;
// 4509
f449694821_825 = function() { return f449694821_825.returns[f449694821_825.inst++]; };
f449694821_825.returns = [];
f449694821_825.inst = 0;
// 4513
f449694821_826 = function() { return f449694821_826.returns[f449694821_826.inst++]; };
f449694821_826.returns = [];
f449694821_826.inst = 0;
// 4515
o9 = {};
// undefined
o9 = null;
// 4517
f449694821_387.returns.push(1373490177797);
// 4521
f449694821_16.returns.push(15);
// 4523
f449694821_387.returns.push(1373490177800);
// 4525
f449694821_387.returns.push(1373490177803);
// 4529
f449694821_16.returns.push(16);
// 4531
f449694821_387.returns.push(1373490177808);
// 4532
o9 = {};
// 4534
f449694821_389.returns.push(undefined);
// 4539
f449694821_16.returns.push(17);
// 4543
o10 = {};
// 4544
f449694821_394.returns.push(o10);
// 4546
f449694821_398.returns.push(o10);
// undefined
o10 = null;
// 4550
o10 = {};
// 4551
f449694821_396.returns.push(o10);
// 4553
o10.__html = void 0;
// 4555
o11 = {};
// 4556
f449694821_394.returns.push(o11);
// 4558
o6.appendChild = f449694821_398;
// undefined
o6 = null;
// 4559
f449694821_398.returns.push(o11);
// undefined
o11 = null;
// 4560
o6 = {};
// 4561
o10.style = o6;
// undefined
o10 = null;
// 4562
// undefined
o6 = null;
// 4563
o6 = {};
// 4564
f449694821_4.returns.push(o6);
// 4565
o6.getPropertyValue = void 0;
// undefined
o6 = null;
// 4567
f449694821_387.returns.push(1373490179937);
// 4569
f449694821_387.returns.push(1373490179937);
// 4573
// 4576
f449694821_387.returns.push(1373490179939);
// 4580
o6 = {};
// 4581
f449694821_394.returns.push(o6);
// 4583
f449694821_398.returns.push(o6);
// undefined
o6 = null;
// 4584
o6 = {};
// 4589
f449694821_387.returns.push(1373490179951);
// 4590
o6.cancelBubble = false;
// 4591
o6.returnValue = void 0;
// 4592
o10 = {};
// 4597
f449694821_387.returns.push(1373490180360);
// 4598
o10.cancelBubble = false;
// 4599
o10.returnValue = void 0;
// 4600
o11 = {};
// 4605
f449694821_387.returns.push(1373490180386);
// 4606
o11.cancelBubble = false;
// 4607
o11.returnValue = void 0;
// 4608
o12 = {};
// 4613
f449694821_387.returns.push(1373490180410);
// 4614
o12.cancelBubble = false;
// 4615
o12.returnValue = void 0;
// 4616
o13 = {};
// 4621
f449694821_387.returns.push(1373490180423);
// 4622
o13.cancelBubble = false;
// 4623
o13.returnValue = void 0;
// 4624
o14 = {};
// 4629
f449694821_387.returns.push(1373490180433);
// 4630
o14.cancelBubble = false;
// 4631
o14.returnValue = void 0;
// 4632
o15 = {};
// 4637
f449694821_387.returns.push(1373490180483);
// 4638
o15.cancelBubble = false;
// 4639
o15.returnValue = void 0;
// 4640
o16 = {};
// 4645
f449694821_387.returns.push(1373490180491);
// 4646
o16.cancelBubble = false;
// 4647
o16.returnValue = void 0;
// 4648
o17 = {};
// 4653
f449694821_387.returns.push(1373490180500);
// 4654
o17.cancelBubble = false;
// 4655
o17.returnValue = void 0;
// 4656
o19 = {};
// 4661
f449694821_387.returns.push(1373490180509);
// 4662
o19.cancelBubble = false;
// 4663
o19.returnValue = void 0;
// 4664
o20 = {};
// 4669
f449694821_387.returns.push(1373490180520);
// 4670
o20.cancelBubble = false;
// 4671
o20.returnValue = void 0;
// 4672
o21 = {};
// 4677
f449694821_387.returns.push(1373490180530);
// 4678
o21.cancelBubble = false;
// 4679
o21.returnValue = void 0;
// 4680
o22 = {};
// 4685
f449694821_387.returns.push(1373490180539);
// 4686
o22.cancelBubble = false;
// 4687
o22.returnValue = void 0;
// 4688
o23 = {};
// 4693
f449694821_387.returns.push(1373490180550);
// 4694
o23.cancelBubble = false;
// 4695
o23.returnValue = void 0;
// 4696
o24 = {};
// 4701
f449694821_387.returns.push(1373490180560);
// 4702
o24.cancelBubble = false;
// 4703
o24.returnValue = void 0;
// 4704
o25 = {};
// 4709
f449694821_387.returns.push(1373490180570);
// 4710
o25.cancelBubble = false;
// 4711
o25.returnValue = void 0;
// 4712
o26 = {};
// 4717
f449694821_387.returns.push(1373490180581);
// 4718
o26.cancelBubble = false;
// 4719
o26.returnValue = void 0;
// 4722
f449694821_387.returns.push(1373490180979);
// 4723
o27 = {};
// 4728
f449694821_387.returns.push(1373490181509);
// 4729
o27.cancelBubble = false;
// 4730
o27.returnValue = void 0;
// 4731
o28 = {};
// 4736
f449694821_387.returns.push(1373490181511);
// 4737
o28.cancelBubble = false;
// 4738
o28.returnValue = void 0;
// 4739
o29 = {};
// 4744
f449694821_387.returns.push(1373490181517);
// 4745
o29.cancelBubble = false;
// 4746
o29.returnValue = void 0;
// 4747
o30 = {};
// 4752
f449694821_387.returns.push(1373490181521);
// 4753
o30.cancelBubble = false;
// 4754
o30.returnValue = void 0;
// 4755
o31 = {};
// 4760
f449694821_387.returns.push(1373490181523);
// 4761
o31.cancelBubble = false;
// 4762
o31.returnValue = void 0;
// 4763
o32 = {};
// 4768
f449694821_387.returns.push(1373490181525);
// 4769
o32.cancelBubble = false;
// 4770
o32.returnValue = void 0;
// 4771
o33 = {};
// undefined
o33 = null;
// 4772
o33 = {};
// 4777
f449694821_387.returns.push(1373490181609);
// 4778
o33.cancelBubble = false;
// 4779
o33.returnValue = void 0;
// 4780
o34 = {};
// undefined
o34 = null;
// 4781
o34 = {};
// 4786
f449694821_387.returns.push(1373490181627);
// 4787
o34.cancelBubble = false;
// 4788
o34.returnValue = void 0;
// 4789
o35 = {};
// undefined
o35 = null;
// 4790
o35 = {};
// 4795
f449694821_387.returns.push(1373490181643);
// 4796
o35.cancelBubble = false;
// 4797
o35.returnValue = void 0;
// 4798
o36 = {};
// undefined
o36 = null;
// 4799
o36 = {};
// 4804
f449694821_387.returns.push(1373490181660);
// 4805
o36.cancelBubble = false;
// 4806
o36.returnValue = void 0;
// 4807
o37 = {};
// undefined
o37 = null;
// 4808
o37 = {};
// 4813
f449694821_387.returns.push(1373490181679);
// 4814
o37.cancelBubble = false;
// 4815
o37.returnValue = void 0;
// 4816
o38 = {};
// undefined
o38 = null;
// 4817
o38 = {};
// 4822
f449694821_387.returns.push(1373490181709);
// 4823
o38.cancelBubble = false;
// 4824
o38.returnValue = void 0;
// 4825
o39 = {};
// undefined
o39 = null;
// 4826
o39 = {};
// 4831
f449694821_387.returns.push(1373490181974);
// 4832
o39.cancelBubble = false;
// 4833
o39.returnValue = void 0;
// 4836
f449694821_387.returns.push(1373490181987);
// 4837
o40 = {};
// undefined
o40 = null;
// 4838
o40 = {};
// 4843
f449694821_387.returns.push(1373490182020);
// 4844
o40.cancelBubble = false;
// 4845
o40.returnValue = void 0;
// 4846
o43 = {};
// undefined
o43 = null;
// 4847
o43 = {};
// 4852
f449694821_387.returns.push(1373490182038);
// 4853
o43.cancelBubble = false;
// 4854
o43.returnValue = void 0;
// 4855
o44 = {};
// undefined
o44 = null;
// 4856
o44 = {};
// 4861
f449694821_387.returns.push(1373490182040);
// 4862
o44.cancelBubble = false;
// 4863
o44.returnValue = void 0;
// 4864
o45 = {};
// undefined
o45 = null;
// 4865
o45 = {};
// 4870
f449694821_387.returns.push(1373490182054);
// 4871
o45.cancelBubble = false;
// 4872
o45.returnValue = void 0;
// 4873
o46 = {};
// undefined
o46 = null;
// 4874
o46 = {};
// 4879
f449694821_387.returns.push(1373490182103);
// 4880
o46.cancelBubble = false;
// 4881
o46.returnValue = void 0;
// 4882
o47 = {};
// undefined
o47 = null;
// 4883
o47 = {};
// 4888
f449694821_387.returns.push(1373490182424);
// 4889
o47.cancelBubble = false;
// 4890
o47.returnValue = void 0;
// 4891
o48 = {};
// undefined
o48 = null;
// 4892
o48 = {};
// 4897
f449694821_387.returns.push(1373490182432);
// 4898
o48.cancelBubble = false;
// 4899
o48.returnValue = void 0;
// 4900
o49 = {};
// undefined
o49 = null;
// 4901
o49 = {};
// 4906
f449694821_387.returns.push(1373490182437);
// 4907
o49.cancelBubble = false;
// 4908
o49.returnValue = void 0;
// 4909
o50 = {};
// undefined
o50 = null;
// 4910
o50 = {};
// 4915
f449694821_387.returns.push(1373490182444);
// 4916
o50.cancelBubble = false;
// 4917
o50.returnValue = void 0;
// 4918
o51 = {};
// undefined
o51 = null;
// 4919
o51 = {};
// 4924
f449694821_387.returns.push(1373490182447);
// 4925
o51.cancelBubble = false;
// 4926
o51.returnValue = void 0;
// 4927
o52 = {};
// undefined
o52 = null;
// 4928
o52 = {};
// 4933
f449694821_387.returns.push(1373490182472);
// 4934
o52.cancelBubble = false;
// 4935
o52.returnValue = void 0;
// 4936
o53 = {};
// undefined
o53 = null;
// 4937
o53 = {};
// 4942
f449694821_387.returns.push(1373490182505);
// 4943
o53.cancelBubble = false;
// 4944
o53.returnValue = void 0;
// 4945
o54 = {};
// undefined
o54 = null;
// 4946
o54 = {};
// 4951
f449694821_387.returns.push(1373490182692);
// 4952
o54.cancelBubble = false;
// 4953
o54.returnValue = void 0;
// 4954
o55 = {};
// undefined
o55 = null;
// 4955
o55 = {};
// 4960
f449694821_387.returns.push(1373490182709);
// 4961
o55.cancelBubble = false;
// 4962
o55.returnValue = void 0;
// 4963
o56 = {};
// undefined
o56 = null;
// 4964
o56 = {};
// 4969
f449694821_387.returns.push(1373490182720);
// 4970
o56.cancelBubble = false;
// 4971
o56.returnValue = void 0;
// 4972
o57 = {};
// undefined
o57 = null;
// 4973
o57 = {};
// 4978
f449694821_387.returns.push(1373490182736);
// 4979
o57.cancelBubble = false;
// 4980
o57.returnValue = void 0;
// 4981
o58 = {};
// undefined
o58 = null;
// 4982
o58 = {};
// 4987
f449694821_387.returns.push(1373490182749);
// 4988
o58.cancelBubble = false;
// 4989
o58.returnValue = void 0;
// 4990
o59 = {};
// undefined
o59 = null;
// 4991
o59 = {};
// 4996
f449694821_387.returns.push(1373490182753);
// 4997
o59.cancelBubble = false;
// 4998
o59.returnValue = void 0;
// 4999
o60 = {};
// undefined
o60 = null;
// 5000
o60 = {};
// 5005
f449694821_387.returns.push(1373490182766);
// 5006
o60.cancelBubble = false;
// 5007
o60.returnValue = void 0;
// 5008
o61 = {};
// undefined
o61 = null;
// 5009
o61 = {};
// 5014
f449694821_387.returns.push(1373490182837);
// 5015
o61.cancelBubble = false;
// 5016
o61.returnValue = void 0;
// 5017
o62 = {};
// undefined
o62 = null;
// 5018
o62 = {};
// 5019
o63 = {};
// 5020
o62.transport = o63;
// undefined
fo449694821_803_readyState = function() { return fo449694821_803_readyState.returns[fo449694821_803_readyState.inst++]; };
fo449694821_803_readyState.returns = [];
fo449694821_803_readyState.inst = 0;
defineGetter(o63, "readyState", fo449694821_803_readyState, undefined);
// undefined
fo449694821_803_readyState.returns.push(2);
// 5022
o64 = {};
// undefined
o64 = null;
// undefined
fo449694821_803_readyState.returns.push(4);
// 5026
f449694821_914 = function() { return f449694821_914.returns[f449694821_914.inst++]; };
f449694821_914.returns = [];
f449694821_914.inst = 0;
// 5027
o63.getResponseHeader = f449694821_914;
// 5030
f449694821_914.returns.push("03r2+ESLZ7hHWaWOgh6vzkMHWrWL2bMcYoHgcrzN/RI=");
// 5033
f449694821_914.returns.push("03r2+ESLZ7hHWaWOgh6vzkMHWrWL2bMcYoHgcrzN/RI=");
// 5034
// 5036
o63.JSBNG__status = 500;
// 5041
f449694821_915 = function() { return f449694821_915.returns[f449694821_915.inst++]; };
f449694821_915.returns = [];
f449694821_915.inst = 0;
// 5042
o62._invokeErrorHandler = f449694821_915;
// 5043
o62.responseText = void 0;
// 5044
o62._requestAborted = void 0;
// 5048
f449694821_16.returns.push(18);
// 5049
f449694821_916 = function() { return f449694821_916.returns[f449694821_916.inst++]; };
f449694821_916.returns = [];
f449694821_916.inst = 0;
// 5050
o62.transportErrorHandler = f449694821_916;
// 5052
f449694821_917 = function() { return f449694821_917.returns[f449694821_917.inst++]; };
f449694821_917.returns = [];
f449694821_917.inst = 0;
// 5053
o62.getOption = f449694821_917;
// 5054
o64 = {};
// 5055
o62.option = o64;
// 5056
o64.suppressErrorAlerts = false;
// 5059
f449694821_917.returns.push(false);
// 5060
f449694821_919 = function() { return f449694821_919.returns[f449694821_919.inst++]; };
f449694821_919.returns = [];
f449694821_919.inst = 0;
// 5061
o62._dispatchErrorResponse = f449694821_919;
// 5063
f449694821_920 = function() { return f449694821_920.returns[f449694821_920.inst++]; };
f449694821_920.returns = [];
f449694821_920.inst = 0;
// 5064
o62.clearStatusIndicator = f449694821_920;
// 5065
f449694821_921 = function() { return f449694821_921.returns[f449694821_921.inst++]; };
f449694821_921.returns = [];
f449694821_921.inst = 0;
// 5066
o62.getStatusElement = f449694821_921;
// 5067
o62.statusElement = null;
// 5068
f449694821_921.returns.push(null);
// 5069
f449694821_920.returns.push(undefined);
// 5070
o62._sendTimeStamp = void 0;
// 5071
f449694821_922 = function() { return f449694821_922.returns[f449694821_922.inst++]; };
f449694821_922.returns = [];
f449694821_922.inst = 0;
// 5072
o62._isRelevant = f449694821_922;
// 5073
o62._allowCrossPageTransition = void 0;
// 5074
o62.id = 3;
// 5076
f449694821_922.returns.push(true);
// 5077
o62.initialHandler = f449694821_826;
// 5078
f449694821_826.returns.push(undefined);
// 5079
o62.timer = null;
// 5080
f449694821_18.returns.push(undefined);
// 5081
f449694821_386.returns.push(0.2663981191512802);
// 5082
f449694821_916.returns.push(undefined);
// 5083
o62.finallyHandler = f449694821_826;
// 5084
f449694821_826.returns.push(undefined);
// 5085
f449694821_919.returns.push(undefined);
// 5086
f449694821_915.returns.push(undefined);
// 5089
o64.asynchronous = true;
// 5092
f449694821_917.returns.push(true);
// 5093
// 5096
f449694821_387.returns.push(1373490183003);
// 5097
o65 = {};
// 5102
f449694821_387.returns.push(1373490183040);
// 5103
o65.cancelBubble = false;
// 5104
o65.returnValue = void 0;
// 5105
o66 = {};
// 5106
o67 = {};
// 5111
f449694821_387.returns.push(1373490183056);
// 5112
o67.cancelBubble = false;
// 5113
o67.returnValue = void 0;
// 5114
o68 = {};
// 5115
o69 = {};
// 5120
f449694821_387.returns.push(1373490183077);
// 5121
o69.cancelBubble = false;
// undefined
fo449694821_803_readyState.returns.push(4);
// 5125
f449694821_914 = function() { return f449694821_914.returns[f449694821_914.inst++]; };
f449694821_914.returns = [];
f449694821_914.inst = 0;
// 5129
f449694821_914.returns.push("03r2+ESLZ7hHWaWOgh6vzkMHWrWL2bMcYoHgcrzN/RI=");
// 5132
f449694821_914.returns.push("03r2+ESLZ7hHWaWOgh6vzkMHWrWL2bMcYoHgcrzN/RI=");
// 5133
// 5140
f449694821_915 = function() { return f449694821_915.returns[f449694821_915.inst++]; };
f449694821_915.returns = [];
f449694821_915.inst = 0;
// 5147
f449694821_16.returns.push(18);
// 5148
f449694821_916 = function() { return f449694821_916.returns[f449694821_916.inst++]; };
f449694821_916.returns = [];
f449694821_916.inst = 0;
// 5151
f449694821_917 = function() { return f449694821_917.returns[f449694821_917.inst++]; };
f449694821_917.returns = [];
f449694821_917.inst = 0;
// 5153
o64 = {};
// 5155
o64.suppressErrorAlerts = false;
// 5158
f449694821_917.returns.push(false);
// 5159
f449694821_919 = function() { return f449694821_919.returns[f449694821_919.inst++]; };
f449694821_919.returns = [];
f449694821_919.inst = 0;
// 5162
f449694821_920 = function() { return f449694821_920.returns[f449694821_920.inst++]; };
f449694821_920.returns = [];
f449694821_920.inst = 0;
// 5164
f449694821_921 = function() { return f449694821_921.returns[f449694821_921.inst++]; };
f449694821_921.returns = [];
f449694821_921.inst = 0;
// 5167
f449694821_921.returns.push(null);
// 5168
f449694821_920.returns.push(undefined);
// 5170
f449694821_922 = function() { return f449694821_922.returns[f449694821_922.inst++]; };
f449694821_922.returns = [];
f449694821_922.inst = 0;
// 5175
f449694821_922.returns.push(true);
// 5177
f449694821_826.returns.push(undefined);
// 5179
f449694821_18.returns.push(undefined);
// 5180
f449694821_386.returns.push(0.2663981191512802);
// 5181
f449694821_916.returns.push(undefined);
// 5183
f449694821_826.returns.push(undefined);
// 5184
f449694821_919.returns.push(undefined);
// 5185
f449694821_915.returns.push(undefined);
// 5188
o64.asynchronous = true;
// undefined
o64 = null;
// 5191
f449694821_917.returns.push(true);
// 5192
// 5195
f449694821_387.returns.push(1373490183003);
// 5196
o65 = {};
// 5201
f449694821_387.returns.push(1373490183040);
// 5202
o65.cancelBubble = false;
// 5203
o65.returnValue = void 0;
// 5204
o66 = {};
// undefined
o66 = null;
// 5205
o67 = {};
// 5210
f449694821_387.returns.push(1373490183056);
// 5211
o67.cancelBubble = false;
// 5212
o67.returnValue = void 0;
// 5213
o68 = {};
// undefined
o68 = null;
// 5214
o69 = {};
// 5219
f449694821_387.returns.push(1373490183077);
// 5220
o69.cancelBubble = false;
// 5222
o69.returnValue = void 0;
// 5223
o64 = {};
// undefined
o64 = null;
// 5224
o64 = {};
// 5229
f449694821_387.returns.push(1373490183089);
// 5230
o64.cancelBubble = false;
// 5231
o64.returnValue = void 0;
// 5232
o66 = {};
// undefined
o66 = null;
// 5233
o66 = {};
// 5238
f449694821_387.returns.push(1373490183091);
// 5239
o66.cancelBubble = false;
// 5240
o66.returnValue = void 0;
// 5241
o68 = {};
// undefined
o68 = null;
// 5242
o68 = {};
// 5247
f449694821_387.returns.push(1373490183119);
// 5248
o68.cancelBubble = false;
// 5249
o68.returnValue = void 0;
// 5250
o70 = {};
// undefined
o70 = null;
// 5251
o70 = {};
// 5256
f449694821_387.returns.push(1373490183138);
// 5257
o70.cancelBubble = false;
// 5258
o70.returnValue = void 0;
// 5259
o71 = {};
// undefined
o71 = null;
// 5260
o71 = {};
// 5265
f449694821_387.returns.push(1373490183380);
// 5266
o71.cancelBubble = false;
// 5267
o71.returnValue = void 0;
// 5268
o72 = {};
// undefined
o72 = null;
// 5269
o72 = {};
// 5274
f449694821_387.returns.push(1373490183389);
// 5275
o72.cancelBubble = false;
// 5276
o72.returnValue = void 0;
// 5277
o73 = {};
// undefined
o73 = null;
// 5278
o73 = {};
// 5283
f449694821_387.returns.push(1373490183398);
// 5284
o73.cancelBubble = false;
// 5285
o73.returnValue = void 0;
// 5286
o74 = {};
// undefined
o74 = null;
// 5287
o74 = {};
// 5292
f449694821_387.returns.push(1373490183419);
// 5293
o74.cancelBubble = false;
// 5294
o74.returnValue = void 0;
// 5295
o75 = {};
// undefined
o75 = null;
// 5296
o75 = {};
// 5301
f449694821_387.returns.push(1373490183439);
// 5302
o75.cancelBubble = false;
// 5303
o75.returnValue = void 0;
// 5304
o76 = {};
// undefined
o76 = null;
// 5305
o76 = {};
// 5310
f449694821_387.returns.push(1373490183446);
// 5311
o76.cancelBubble = false;
// 5312
o76.returnValue = void 0;
// 5313
o77 = {};
// undefined
o77 = null;
// 5314
o77 = {};
// 5319
f449694821_387.returns.push(1373490183453);
// 5320
o77.cancelBubble = false;
// 5321
o77.returnValue = void 0;
// 5322
o78 = {};
// undefined
o78 = null;
// 5323
o78 = {};
// 5328
f449694821_387.returns.push(1373490183497);
// 5329
o78.cancelBubble = false;
// 5330
o78.returnValue = void 0;
// 5331
o79 = {};
// undefined
o79 = null;
// 5332
o79 = {};
// 5337
f449694821_387.returns.push(1373490183705);
// 5338
o79.cancelBubble = false;
// 5339
o79.returnValue = void 0;
// 5340
o80 = {};
// undefined
o80 = null;
// 5341
o80 = {};
// 5346
f449694821_387.returns.push(1373490183717);
// 5347
o80.cancelBubble = false;
// 5348
o80.returnValue = void 0;
// 5349
o81 = {};
// undefined
o81 = null;
// 5350
o81 = {};
// 5355
f449694821_387.returns.push(1373490183729);
// 5356
o81.cancelBubble = false;
// 5357
o81.returnValue = void 0;
// 5358
o82 = {};
// 5363
f449694821_387.returns.push(1373490183738);
// 5364
o82.cancelBubble = false;
// 5365
o82.returnValue = void 0;
// 5366
o83 = {};
// undefined
o83 = null;
// 5367
o83 = {};
// 5372
f449694821_387.returns.push(1373490183739);
// 5373
o83.cancelBubble = false;
// 5374
o83.returnValue = void 0;
// 5375
o84 = {};
// undefined
o84 = null;
// 5376
o84 = {};
// 5381
f449694821_387.returns.push(1373490183756);
// 5382
o84.cancelBubble = false;
// 5383
o84.returnValue = void 0;
// 5384
o85 = {};
// undefined
o85 = null;
// 5385
o85 = {};
// 5390
f449694821_387.returns.push(1373490183778);
// 5391
o85.cancelBubble = false;
// 5392
o85.returnValue = void 0;
// 5395
f449694821_387.returns.push(1373490184012);
// 5396
o86 = {};
// undefined
o86 = null;
// 5397
o86 = {};
// 5402
f449694821_387.returns.push(1373490184025);
// 5403
o86.cancelBubble = false;
// 5404
o86.returnValue = void 0;
// 5405
o87 = {};
// undefined
o87 = null;
// 5406
o87 = {};
// 5411
f449694821_387.returns.push(1373490184044);
// 5412
o87.cancelBubble = false;
// 5413
o87.returnValue = void 0;
// 5414
o88 = {};
// undefined
o88 = null;
// 5415
o88 = {};
// 5420
f449694821_387.returns.push(1373490184055);
// 5421
o88.cancelBubble = false;
// 5422
o88.returnValue = void 0;
// 5423
o89 = {};
// undefined
o89 = null;
// 5424
o89 = {};
// 5429
f449694821_387.returns.push(1373490184064);
// 5430
o89.cancelBubble = false;
// 5431
o89.returnValue = void 0;
// 5432
o90 = {};
// undefined
o90 = null;
// 5433
o90 = {};
// 5438
f449694821_387.returns.push(1373490184082);
// 5439
o90.cancelBubble = false;
// 5440
o90.returnValue = void 0;
// 5441
o91 = {};
// undefined
o91 = null;
// 5442
o91 = {};
// 5447
f449694821_387.returns.push(1373490184095);
// 5448
o91.cancelBubble = false;
// 5449
o91.returnValue = void 0;
// 5450
o92 = {};
// undefined
o92 = null;
// 5451
o92 = {};
// 5456
f449694821_387.returns.push(1373490184142);
// 5457
o92.cancelBubble = false;
// 5458
o92.returnValue = void 0;
// 5459
o93 = {};
// 5464
f449694821_387.returns.push(1373490184338);
// 5465
o93.cancelBubble = false;
// 5466
o93.returnValue = void 0;
// 5467
o94 = {};
// undefined
o94 = null;
// 5468
o94 = {};
// 5473
f449694821_387.returns.push(1373490184426);
// 5474
o94.cancelBubble = false;
// 5475
o94.returnValue = void 0;
// 5476
o95 = {};
// undefined
o95 = null;
// 5477
o95 = {};
// 5482
f449694821_387.returns.push(1373490184442);
// 5483
o95.cancelBubble = false;
// 5484
o95.returnValue = void 0;
// 5485
o96 = {};
// undefined
o96 = null;
// 5486
o96 = {};
// 5491
f449694821_387.returns.push(1373490184457);
// 5492
o96.cancelBubble = false;
// 5493
o96.returnValue = void 0;
// 5494
o97 = {};
// undefined
o97 = null;
// 5495
o97 = {};
// 5500
f449694821_387.returns.push(1373490184484);
// 5501
o97.cancelBubble = false;
// 5502
o97.returnValue = void 0;
// 5503
o98 = {};
// 5508
f449694821_387.returns.push(1373490184506);
// 5509
o98.cancelBubble = false;
// 5510
o98.returnValue = void 0;
// 5511
o99 = {};
// undefined
o99 = null;
// 5512
o99 = {};
// 5517
f449694821_387.returns.push(1373490184507);
// 5518
o99.cancelBubble = false;
// 5519
o99.returnValue = void 0;
// 5520
o100 = {};
// 5525
f449694821_387.returns.push(1373490184576);
// 5526
o100.cancelBubble = false;
// 5527
o100.returnValue = void 0;
// 5528
o101 = {};
// 5533
f449694821_387.returns.push(1373490184617);
// 5534
o101.cancelBubble = false;
// 5535
o101.returnValue = void 0;
// 5536
o102 = {};
// 5541
f449694821_387.returns.push(1373490184636);
// 5542
o102.cancelBubble = false;
// 5543
o102.returnValue = void 0;
// 5544
o103 = {};
// 5549
f449694821_387.returns.push(1373490184675);
// 5550
o103.cancelBubble = false;
// 5551
o103.returnValue = void 0;
// 5552
o104 = {};
// 5557
f449694821_387.returns.push(1373490184680);
// 5558
o104.cancelBubble = false;
// 5559
o104.returnValue = void 0;
// 5560
o105 = {};
// 5565
f449694821_387.returns.push(1373490184693);
// 5566
o105.cancelBubble = false;
// 5567
o105.returnValue = void 0;
// 5568
o106 = {};
// 5573
f449694821_387.returns.push(1373490184704);
// 5574
o106.cancelBubble = false;
// 5575
o106.returnValue = void 0;
// 5576
o107 = {};
// 5581
f449694821_387.returns.push(1373490184710);
// 5582
o107.cancelBubble = false;
// 5583
o107.returnValue = void 0;
// 5584
o108 = {};
// 5589
f449694821_387.returns.push(1373490184722);
// 5590
o108.cancelBubble = false;
// 5591
o108.returnValue = void 0;
// 5592
o109 = {};
// 5597
f449694821_387.returns.push(1373490184730);
// 5598
o109.cancelBubble = false;
// 5599
o109.returnValue = void 0;
// 5600
o110 = {};
// 5605
f449694821_387.returns.push(1373490184740);
// 5606
o110.cancelBubble = false;
// 5607
o110.returnValue = void 0;
// 5608
o111 = {};
// 5613
f449694821_387.returns.push(1373490184748);
// 5614
o111.cancelBubble = false;
// 5615
o111.returnValue = void 0;
// 5616
o112 = {};
// 5621
f449694821_387.returns.push(1373490184758);
// 5622
o112.cancelBubble = false;
// 5623
o112.returnValue = void 0;
// 5624
o113 = {};
// 5629
f449694821_387.returns.push(1373490184769);
// 5630
o113.cancelBubble = false;
// 5631
o113.returnValue = void 0;
// 5632
o114 = {};
// 5637
f449694821_387.returns.push(1373490184777);
// 5638
o114.cancelBubble = false;
// 5639
o114.returnValue = void 0;
// 5640
o115 = {};
// 5645
f449694821_387.returns.push(1373490184788);
// 5646
o115.cancelBubble = false;
// 5647
o115.returnValue = void 0;
// 5648
o116 = {};
// 5653
f449694821_387.returns.push(1373490184789);
// 5654
o116.cancelBubble = false;
// 5655
o116.returnValue = void 0;
// 5658
f449694821_387.returns.push(1373490185022);
// 5659
o117 = {};
// 5664
f449694821_387.returns.push(1373490185517);
// 5665
o117.cancelBubble = false;
// 5666
o117.returnValue = void 0;
// 5667
o118 = {};
// 5672
f449694821_387.returns.push(1373490185518);
// 5673
o118.cancelBubble = false;
// 5674
o118.returnValue = void 0;
// 5675
o119 = {};
// 5680
f449694821_387.returns.push(1373490185533);
// 5681
o119.cancelBubble = false;
// 5682
o119.returnValue = void 0;
// 5683
o120 = {};
// 5688
f449694821_387.returns.push(1373490185540);
// 5689
o120.cancelBubble = false;
// 5690
o120.returnValue = void 0;
// 5691
o121 = {};
// 5696
f449694821_387.returns.push(1373490185547);
// 5697
o121.cancelBubble = false;
// 5698
o121.returnValue = void 0;
// 5699
o122 = {};
// 5704
f449694821_387.returns.push(1373490185558);
// 5705
o122.cancelBubble = false;
// 5706
o122.returnValue = void 0;
// 5707
o123 = {};
// 5712
f449694821_387.returns.push(1373490185577);
// 5713
o123.cancelBubble = false;
// 5714
o123.returnValue = void 0;
// 5715
o124 = {};
// 5720
f449694821_387.returns.push(1373490185645);
// 5721
o124.cancelBubble = false;
// 5722
o124.returnValue = void 0;
// 5723
o125 = {};
// 5728
f449694821_387.returns.push(1373490185648);
// 5729
o125.cancelBubble = false;
// 5730
o125.returnValue = void 0;
// 5731
o126 = {};
// 5736
f449694821_387.returns.push(1373490185651);
// 5737
o126.cancelBubble = false;
// 5738
o126.returnValue = void 0;
// 5739
o127 = {};
// 5744
f449694821_387.returns.push(1373490185653);
// 5745
o127.cancelBubble = false;
// 5746
o127.returnValue = void 0;
// 5747
o128 = {};
// 5752
f449694821_387.returns.push(1373490185654);
// 5753
o128.cancelBubble = false;
// 5754
o128.returnValue = void 0;
// 5755
o129 = {};
// 5760
f449694821_387.returns.push(1373490185656);
// 5761
o129.cancelBubble = false;
// 5762
o129.returnValue = void 0;
// 5763
o130 = {};
// 5768
f449694821_387.returns.push(1373490185658);
// 5769
o130.cancelBubble = false;
// 5770
o130.returnValue = void 0;
// 5771
o131 = {};
// 5776
f449694821_387.returns.push(1373490185666);
// 5777
o131.cancelBubble = false;
// 5778
o131.returnValue = void 0;
// 5779
o132 = {};
// 5784
f449694821_387.returns.push(1373490185692);
// 5785
o132.cancelBubble = false;
// 5786
o132.returnValue = void 0;
// 5787
o133 = {};
// 5792
f449694821_387.returns.push(1373490185694);
// 5793
o133.cancelBubble = false;
// 5794
o133.returnValue = void 0;
// 5795
o134 = {};
// 5800
f449694821_387.returns.push(1373490185705);
// 5801
o134.cancelBubble = false;
// 5802
o134.returnValue = void 0;
// 5803
o135 = {};
// 5808
f449694821_387.returns.push(1373490185719);
// 5809
o135.cancelBubble = false;
// 5810
o135.returnValue = void 0;
// 5811
o136 = {};
// 5816
f449694821_387.returns.push(1373490185727);
// 5817
o136.cancelBubble = false;
// 5818
o136.returnValue = void 0;
// 5819
o137 = {};
// 5824
f449694821_387.returns.push(1373490185735);
// 5825
o137.cancelBubble = false;
// 5826
o137.returnValue = void 0;
// 5827
o138 = {};
// 5832
f449694821_387.returns.push(1373490185743);
// 5833
o138.cancelBubble = false;
// 5834
o138.returnValue = void 0;
// 5835
o139 = {};
// 5840
f449694821_387.returns.push(1373490185750);
// 5841
o139.cancelBubble = false;
// 5842
o139.returnValue = void 0;
// 5843
o140 = {};
// 5848
f449694821_387.returns.push(1373490185759);
// 5849
o140.cancelBubble = false;
// 5850
o140.returnValue = void 0;
// 5851
o141 = {};
// 5856
f449694821_387.returns.push(1373490185768);
// 5857
o141.cancelBubble = false;
// 5858
o141.returnValue = void 0;
// 5859
o142 = {};
// 5864
f449694821_387.returns.push(1373490185782);
// 5865
o142.cancelBubble = false;
// 5866
o142.returnValue = void 0;
// 5867
o143 = {};
// 5872
f449694821_387.returns.push(1373490185787);
// 5873
o143.cancelBubble = false;
// 5874
o143.returnValue = void 0;
// 5875
o144 = {};
// 5880
f449694821_387.returns.push(1373490185797);
// 5881
o144.cancelBubble = false;
// 5882
o144.returnValue = void 0;
// 5883
o145 = {};
// 5888
f449694821_387.returns.push(1373490185809);
// 5889
o145.cancelBubble = false;
// 5890
o145.returnValue = void 0;
// 5891
o146 = {};
// 5896
f449694821_387.returns.push(1373490185818);
// 5897
o146.cancelBubble = false;
// 5898
o146.returnValue = void 0;
// 5899
o147 = {};
// 5904
f449694821_387.returns.push(1373490185830);
// 5905
o147.cancelBubble = false;
// 5906
o147.returnValue = void 0;
// 5907
o148 = {};
// 5912
f449694821_387.returns.push(1373490185838);
// 5913
o148.cancelBubble = false;
// 5914
o148.returnValue = void 0;
// 5915
o149 = {};
// 5920
f449694821_387.returns.push(1373490185851);
// 5921
o149.cancelBubble = false;
// 5922
o149.returnValue = void 0;
// 5923
o150 = {};
// 5928
f449694821_387.returns.push(1373490185865);
// 5929
o150.cancelBubble = false;
// 5930
o150.returnValue = void 0;
// 5931
o151 = {};
// 5936
f449694821_387.returns.push(1373490185877);
// 5937
o151.cancelBubble = false;
// 5938
o151.returnValue = void 0;
// 5939
o152 = {};
// 5944
f449694821_387.returns.push(1373490185892);
// 5945
o152.cancelBubble = false;
// 5946
o152.returnValue = void 0;
// 5947
o153 = {};
// 5952
f449694821_387.returns.push(1373490185903);
// 5953
o153.cancelBubble = false;
// 5954
o153.returnValue = void 0;
// 5955
o154 = {};
// 5960
f449694821_387.returns.push(1373490185927);
// 5961
o154.cancelBubble = false;
// 5962
o154.returnValue = void 0;
// 5963
o155 = {};
// 5968
f449694821_387.returns.push(1373490185939);
// 5969
o155.cancelBubble = false;
// 5970
o155.returnValue = void 0;
// 5971
o156 = {};
// 5976
f449694821_387.returns.push(1373490185957);
// 5977
o156.cancelBubble = false;
// 5978
o156.returnValue = void 0;
// 5979
o157 = {};
// 5984
f449694821_387.returns.push(1373490185969);
// 5985
o157.cancelBubble = false;
// 5986
o157.returnValue = void 0;
// 5987
o158 = {};
// 5992
f449694821_387.returns.push(1373490185989);
// 5993
o158.cancelBubble = false;
// 5994
o158.returnValue = void 0;
// 5995
o159 = {};
// 6000
f449694821_387.returns.push(1373490186001);
// 6001
o159.cancelBubble = false;
// 6002
o159.returnValue = void 0;
// 6003
o160 = {};
// 6008
f449694821_387.returns.push(1373490186014);
// 6009
o160.cancelBubble = false;
// 6010
o160.returnValue = void 0;
// 6011
o161 = {};
// 6016
f449694821_387.returns.push(1373490186024);
// 6017
o161.cancelBubble = false;
// 6018
o161.returnValue = void 0;
// 6021
f449694821_387.returns.push(1373490186037);
// 6022
o162 = {};
// 6027
f449694821_387.returns.push(1373490186038);
// 6028
o162.cancelBubble = false;
// 6029
o162.returnValue = void 0;
// 6030
o163 = {};
// 6035
f449694821_387.returns.push(1373490186050);
// 6036
o163.cancelBubble = false;
// 6037
o163.returnValue = void 0;
// 6038
o164 = {};
// 6043
f449694821_387.returns.push(1373490186060);
// 6044
o164.cancelBubble = false;
// 6045
o164.returnValue = void 0;
// 6046
o165 = {};
// 6051
f449694821_387.returns.push(1373490186081);
// 6052
o165.cancelBubble = false;
// 6053
o165.returnValue = void 0;
// 6054
o166 = {};
// 6059
f449694821_387.returns.push(1373490186092);
// 6060
o166.cancelBubble = false;
// 6061
o166.returnValue = void 0;
// 6062
o167 = {};
// 6067
f449694821_387.returns.push(1373490186094);
// 6068
o167.cancelBubble = false;
// 6069
o167.returnValue = void 0;
// 6070
o168 = {};
// 6075
f449694821_387.returns.push(1373490186107);
// 6076
o168.cancelBubble = false;
// 6077
o168.returnValue = void 0;
// 6078
o169 = {};
// 6083
f449694821_387.returns.push(1373490186113);
// 6084
o169.cancelBubble = false;
// 6085
o169.returnValue = void 0;
// 6086
o170 = {};
// 6091
f449694821_387.returns.push(1373490186121);
// 6092
o170.cancelBubble = false;
// 6093
o170.returnValue = void 0;
// 6094
o171 = {};
// 6099
f449694821_387.returns.push(1373490186132);
// 6100
o171.cancelBubble = false;
// 6101
o171.returnValue = void 0;
// 6102
o172 = {};
// 6107
f449694821_387.returns.push(1373490186142);
// 6108
o172.cancelBubble = false;
// 6109
o172.returnValue = void 0;
// 6110
o173 = {};
// 6115
f449694821_387.returns.push(1373490186150);
// 6116
o173.cancelBubble = false;
// 6117
o173.returnValue = void 0;
// 6118
o174 = {};
// 6123
f449694821_387.returns.push(1373490186160);
// 6124
o174.cancelBubble = false;
// 6125
o174.returnValue = void 0;
// 6126
o175 = {};
// 6131
f449694821_387.returns.push(1373490186171);
// 6132
o175.cancelBubble = false;
// 6133
o175.returnValue = void 0;
// 6134
o176 = {};
// 6139
f449694821_387.returns.push(1373490186181);
// 6140
o176.cancelBubble = false;
// 6141
o176.returnValue = void 0;
// 6142
o177 = {};
// 6147
f449694821_387.returns.push(1373490186195);
// 6148
o177.cancelBubble = false;
// 6149
o177.returnValue = void 0;
// 6150
o178 = {};
// 6155
f449694821_387.returns.push(1373490186213);
// 6156
o178.cancelBubble = false;
// 6157
o178.returnValue = void 0;
// 6158
o179 = {};
// 6163
f449694821_387.returns.push(1373490186213);
// 6164
o179.cancelBubble = false;
// 6165
o179.returnValue = void 0;
// 6166
o180 = {};
// 6171
f449694821_387.returns.push(1373490186222);
// 6172
o180.cancelBubble = false;
// 6173
o180.returnValue = void 0;
// 6174
o181 = {};
// 6179
f449694821_387.returns.push(1373490186230);
// 6180
o181.cancelBubble = false;
// 6181
o181.returnValue = void 0;
// 6182
o182 = {};
// 6187
f449694821_387.returns.push(1373490186239);
// 6188
o182.cancelBubble = false;
// 6189
o182.returnValue = void 0;
// 6190
o183 = {};
// 6195
f449694821_387.returns.push(1373490186251);
// 6196
o183.cancelBubble = false;
// 6197
o183.returnValue = void 0;
// 6198
o184 = {};
// 6203
f449694821_387.returns.push(1373490186257);
// 6204
o184.cancelBubble = false;
// 6205
o184.returnValue = void 0;
// 6206
o185 = {};
// 6211
f449694821_387.returns.push(1373490186267);
// 6212
o185.cancelBubble = false;
// 6213
o185.returnValue = void 0;
// 6214
o186 = {};
// 6219
f449694821_387.returns.push(1373490186275);
// 6220
o186.cancelBubble = false;
// 6221
o186.returnValue = void 0;
// 6222
o187 = {};
// 6227
f449694821_387.returns.push(1373490186276);
// 6228
o187.cancelBubble = false;
// 6229
o187.returnValue = void 0;
// 6230
o188 = {};
// 6235
f449694821_387.returns.push(1373490186286);
// 6236
o188.cancelBubble = false;
// 6237
o188.returnValue = void 0;
// 6238
o189 = {};
// 6243
f449694821_387.returns.push(1373490186295);
// 6244
o189.cancelBubble = false;
// 6245
o189.returnValue = void 0;
// 6246
o190 = {};
// 6251
f449694821_387.returns.push(1373490186303);
// 6252
o190.cancelBubble = false;
// 6253
o190.returnValue = void 0;
// 6254
o191 = {};
// 6259
f449694821_387.returns.push(1373490186313);
// 6260
o191.cancelBubble = false;
// 6261
o191.returnValue = void 0;
// 6262
o192 = {};
// 6267
f449694821_387.returns.push(1373490186326);
// 6268
o192.cancelBubble = false;
// 6269
o192.returnValue = void 0;
// 6270
o193 = {};
// 6275
f449694821_387.returns.push(1373490186332);
// 6276
o193.cancelBubble = false;
// 6277
o193.returnValue = void 0;
// 6278
o194 = {};
// 6283
f449694821_387.returns.push(1373490186339);
// 6284
o194.cancelBubble = false;
// 6285
o194.returnValue = void 0;
// 6286
o195 = {};
// 6291
f449694821_387.returns.push(1373490186348);
// 6292
o195.cancelBubble = false;
// 6293
o195.returnValue = void 0;
// 6296
f449694821_387.returns.push(1373490187039);
// 6299
f449694821_387.returns.push(1373490188040);
// 6302
f449694821_387.returns.push(1373490189038);
// 6305
f449694821_387.returns.push(1373490190038);
// 6308
f449694821_387.returns.push(1373490191039);
// 6311
f449694821_387.returns.push(1373490192038);
// 6314
f449694821_387.returns.push(1373490193039);
// 6316
f449694821_387.returns.push(1373490193050);
// 6319
f449694821_387.returns.push(1373490194081);
// 6322
f449694821_387.returns.push(1373490195042);
// 6325
f449694821_387.returns.push(1373490196041);
// 6328
f449694821_387.returns.push(1373490197042);
// 6331
f449694821_387.returns.push(1373490198040);
// 6334
f449694821_387.returns.push(1373490199038);
// 6335
o196 = {};
// 6340
f449694821_387.returns.push(1373490199404);
// 6341
o196.cancelBubble = false;
// 6342
o196.returnValue = void 0;
// 6343
o197 = {};
// 6348
f449694821_387.returns.push(1373490199406);
// 6349
o197.cancelBubble = false;
// 6350
o197.returnValue = void 0;
// 6351
o198 = {};
// 6356
f449694821_387.returns.push(1373490199421);
// 6357
o198.cancelBubble = false;
// 6358
o198.returnValue = void 0;
// 6359
o199 = {};
// 6364
f449694821_387.returns.push(1373490199422);
// 6365
o199.cancelBubble = false;
// 6366
o199.returnValue = void 0;
// 6367
o200 = {};
// 6372
f449694821_387.returns.push(1373490199440);
// 6373
o200.cancelBubble = false;
// 6374
o200.returnValue = void 0;
// 6375
o201 = {};
// 6380
f449694821_387.returns.push(1373490199442);
// 6381
o201.cancelBubble = false;
// 6382
o201.returnValue = void 0;
// 6383
o202 = {};
// 6388
f449694821_387.returns.push(1373490199464);
// 6389
o202.cancelBubble = false;
// 6390
o202.returnValue = void 0;
// 6391
o203 = {};
// 6396
f449694821_387.returns.push(1373490199470);
// 6397
o203.cancelBubble = false;
// 6398
o203.returnValue = void 0;
// 6399
o204 = {};
// 6404
f449694821_387.returns.push(1373490199473);
// 6405
o204.cancelBubble = false;
// 6406
o204.returnValue = void 0;
// 6407
o205 = {};
// 6412
f449694821_387.returns.push(1373490199477);
// 6413
o205.cancelBubble = false;
// 6414
o205.returnValue = void 0;
// 6415
o206 = {};
// 6420
f449694821_387.returns.push(1373490199522);
// 6421
o206.cancelBubble = false;
// 6422
o206.returnValue = void 0;
// 6423
o207 = {};
// 6428
f449694821_387.returns.push(1373490199523);
// 6429
o207.cancelBubble = false;
// 6430
o207.returnValue = void 0;
// 6431
o208 = {};
// 6436
f449694821_387.returns.push(1373490199533);
// 6437
o208.cancelBubble = false;
// 6438
o208.returnValue = void 0;
// 6439
o209 = {};
// 6444
f449694821_387.returns.push(1373490199534);
// 6445
o209.cancelBubble = false;
// 6446
o209.returnValue = void 0;
// 6447
o210 = {};
// 6452
f449694821_387.returns.push(1373490199556);
// 6453
o210.cancelBubble = false;
// 6454
o210.returnValue = void 0;
// 6455
o211 = {};
// 6460
f449694821_387.returns.push(1373490199557);
// 6461
o211.cancelBubble = false;
// 6462
o211.returnValue = void 0;
// 6463
o212 = {};
// 6468
f449694821_387.returns.push(1373490199566);
// 6469
o212.cancelBubble = false;
// 6470
o212.returnValue = void 0;
// 6471
o213 = {};
// 6476
f449694821_387.returns.push(1373490199567);
// 6477
o213.cancelBubble = false;
// 6478
o213.returnValue = void 0;
// 6481
f449694821_387.returns.push(1373490200081);
// 6484
f449694821_387.returns.push(1373490201082);
// 6487
f449694821_387.returns.push(1373490202081);
// 6488
o214 = {};
// 6493
f449694821_387.returns.push(1373490202289);
// 6494
o214.cancelBubble = false;
// 6495
o214.returnValue = void 0;
// 6498
f449694821_387.returns.push(1373490203083);
// 6501
f449694821_387.returns.push(1373490204083);
// 6502
o215 = {};
// 6508
// 6511
f449694821_387.returns.push(1373490205127);
// 6512
o216 = {};
// 6517
f449694821_387.returns.push(1373490205307);
// 6518
o216.cancelBubble = false;
// 6519
o216.returnValue = void 0;
// 6520
o217 = {};
// 6525
f449694821_387.returns.push(1373490205330);
// 6526
o217.cancelBubble = false;
// 6527
o217.returnValue = void 0;
// 6528
o218 = {};
// 6533
f449694821_387.returns.push(1373490205332);
// 6534
o218.cancelBubble = false;
// 6535
o218.returnValue = void 0;
// 6536
o219 = {};
// 6541
f449694821_387.returns.push(1373490205381);
// 6542
o219.cancelBubble = false;
// 6543
o219.returnValue = void 0;
// 6544
o220 = {};
// 6549
f449694821_387.returns.push(1373490205382);
// 6550
o220.cancelBubble = false;
// 6551
o220.returnValue = void 0;
// 6552
o221 = {};
// 6557
f449694821_387.returns.push(1373490205398);
// 6558
o221.cancelBubble = false;
// 6559
o221.returnValue = void 0;
// 6560
o222 = {};
// 6565
f449694821_387.returns.push(1373490205411);
// 6566
o222.cancelBubble = false;
// 6567
o222.returnValue = void 0;
// 6568
o223 = {};
// 6573
f449694821_387.returns.push(1373490205412);
// 6574
o223.cancelBubble = false;
// 6575
o223.returnValue = void 0;
// 6576
o224 = {};
// 6581
f449694821_387.returns.push(1373490205416);
// 6582
o224.cancelBubble = false;
// 6583
o224.returnValue = void 0;
// 6584
o225 = {};
// 6589
f449694821_387.returns.push(1373490205416);
// 6590
o225.cancelBubble = false;
// 6591
o225.returnValue = void 0;
// 6592
o226 = {};
// 6597
f449694821_387.returns.push(1373490205426);
// 6598
o226.cancelBubble = false;
// 6599
o226.returnValue = void 0;
// 6600
o227 = {};
// 6605
f449694821_387.returns.push(1373490205435);
// 6606
o227.cancelBubble = false;
// 6607
o227.returnValue = void 0;
// 6608
o228 = {};
// 6613
f449694821_387.returns.push(1373490205448);
// 6614
o228.cancelBubble = false;
// 6615
o228.returnValue = void 0;
// 6616
o229 = {};
// 6621
f449694821_387.returns.push(1373490205452);
// 6622
o229.cancelBubble = false;
// 6623
o229.returnValue = void 0;
// 6624
o230 = {};
// 6629
f449694821_387.returns.push(1373490205461);
// 6630
o230.cancelBubble = false;
// 6631
o230.returnValue = void 0;
// 6632
o231 = {};
// 6637
f449694821_387.returns.push(1373490205475);
// 6638
o231.cancelBubble = false;
// 6639
o231.returnValue = void 0;
// 6640
o232 = {};
// 6645
f449694821_387.returns.push(1373490205498);
// 6646
o232.cancelBubble = false;
// 6647
o232.returnValue = void 0;
// 6648
o233 = {};
// 6653
f449694821_387.returns.push(1373490205520);
// 6654
o233.cancelBubble = false;
// 6655
o233.returnValue = void 0;
// 6656
o234 = {};
// 6661
f449694821_387.returns.push(1373490205521);
// 6662
o234.cancelBubble = false;
// 6663
o234.returnValue = void 0;
// 6664
o235 = {};
// 6669
f449694821_387.returns.push(1373490205579);
// 6670
o235.cancelBubble = false;
// 6671
o235.returnValue = void 0;
// 6672
o236 = {};
// 6677
f449694821_387.returns.push(1373490205581);
// 6678
o236.cancelBubble = false;
// 6679
o236.returnValue = void 0;
// 6680
o237 = {};
// 6685
f449694821_387.returns.push(1373490205799);
// 6686
o237.cancelBubble = false;
// 6687
o237.returnValue = void 0;
// 6688
o238 = {};
// 6693
f449694821_387.returns.push(1373490205805);
// 6694
o238.cancelBubble = false;
// 6695
o238.returnValue = void 0;
// 6696
o239 = {};
// 6701
f449694821_387.returns.push(1373490205817);
// 6702
o239.cancelBubble = false;
// 6703
o239.returnValue = void 0;
// 6704
o240 = {};
// 6709
f449694821_387.returns.push(1373490205826);
// 6710
o240.cancelBubble = false;
// 6711
o240.returnValue = void 0;
// 6712
o241 = {};
// 6717
f449694821_387.returns.push(1373490205842);
// 6718
o241.cancelBubble = false;
// 6719
o241.returnValue = void 0;
// 6720
o242 = {};
// 6725
f449694821_387.returns.push(1373490205849);
// 6726
o242.cancelBubble = false;
// 6727
o242.returnValue = void 0;
// 6728
o243 = {};
// 6733
f449694821_387.returns.push(1373490205966);
// 6734
o243.cancelBubble = false;
// 6735
o243.returnValue = void 0;
// 6736
o244 = {};
// 6741
f449694821_387.returns.push(1373490205967);
// 6742
o244.cancelBubble = false;
// 6743
o244.returnValue = void 0;
// 6744
o245 = {};
// 6749
f449694821_387.returns.push(1373490205982);
// 6750
o245.cancelBubble = false;
// 6751
o245.returnValue = void 0;
// 6752
o246 = {};
// 6757
f449694821_387.returns.push(1373490205984);
// 6758
o246.cancelBubble = false;
// 6759
o246.returnValue = void 0;
// 6760
o247 = {};
// 6765
f449694821_387.returns.push(1373490206000);
// 6766
o247.cancelBubble = false;
// 6767
o247.returnValue = void 0;
// 6768
o248 = {};
// 6773
f449694821_387.returns.push(1373490206000);
// 6774
o248.cancelBubble = false;
// 6775
o248.returnValue = void 0;
// 6778
f449694821_387.returns.push(1373490206092);
// 6779
o249 = {};
// 6784
f449694821_387.returns.push(1373490206319);
// 6785
o249.cancelBubble = false;
// 6786
o249.returnValue = void 0;
// 6787
o250 = {};
// 6792
f449694821_387.returns.push(1373490206320);
// 6793
o250.cancelBubble = false;
// 6794
o250.returnValue = void 0;
// 6795
o251 = {};
// 6800
f449694821_387.returns.push(1373490206327);
// 6801
o251.cancelBubble = false;
// 6802
o251.returnValue = void 0;
// 6803
o252 = {};
// 6808
f449694821_387.returns.push(1373490206337);
// 6809
o252.cancelBubble = false;
// 6810
o252.returnValue = void 0;
// 6811
o253 = {};
// 6816
f449694821_387.returns.push(1373490206352);
// 6817
o253.cancelBubble = false;
// 6818
o253.returnValue = void 0;
// 6819
o254 = {};
// 6820
f449694821_387.returns.push(1373490205842);
// 6823
o242 = {};
// 6828
f449694821_387.returns.push(1373490205849);
// 6829
o242.cancelBubble = false;
// 6830
o242.returnValue = void 0;
// 6831
o243 = {};
// 6836
f449694821_387.returns.push(1373490205966);
// 6837
o243.cancelBubble = false;
// 6838
o243.returnValue = void 0;
// 6839
o244 = {};
// 6844
f449694821_387.returns.push(1373490205967);
// 6845
o244.cancelBubble = false;
// 6846
o244.returnValue = void 0;
// 6847
o245 = {};
// 6852
f449694821_387.returns.push(1373490205982);
// 6853
o245.cancelBubble = false;
// 6854
o245.returnValue = void 0;
// 6855
o246 = {};
// 6860
f449694821_387.returns.push(1373490205984);
// 6861
o246.cancelBubble = false;
// 6862
o246.returnValue = void 0;
// 6863
o247 = {};
// 6868
f449694821_387.returns.push(1373490206000);
// 6869
o247.cancelBubble = false;
// 6870
o247.returnValue = void 0;
// 6871
o248 = {};
// 6876
f449694821_387.returns.push(1373490206000);
// 6877
o248.cancelBubble = false;
// 6878
o248.returnValue = void 0;
// 6881
f449694821_387.returns.push(1373490206092);
// 6882
o249 = {};
// 6887
f449694821_387.returns.push(1373490206319);
// 6888
o249.cancelBubble = false;
// 6889
o249.returnValue = void 0;
// 6890
o250 = {};
// 6895
f449694821_387.returns.push(1373490206320);
// 6896
o250.cancelBubble = false;
// 6897
o250.returnValue = void 0;
// 6898
o251 = {};
// 6903
f449694821_387.returns.push(1373490206327);
// 6904
o251.cancelBubble = false;
// 6905
o251.returnValue = void 0;
// 6906
o252 = {};
// 6911
f449694821_387.returns.push(1373490206337);
// 6912
o252.cancelBubble = false;
// 6913
o252.returnValue = void 0;
// 6914
o253 = {};
// 6919
f449694821_387.returns.push(1373490206352);
// 6920
o253.cancelBubble = false;
// 6921
o253.returnValue = void 0;
// 6922
o254 = {};
// undefined
o254 = null;
// 6923
// 0
JSBNG_Replay$ = function(real, cb) { if (!real) return;
// 810
geval("function envFlush(a) {\n    function b(c) {\n        {\n            var fin0keys = ((window.top.JSBNG_Replay.forInKeys)((a))), fin0i = (0);\n            var d;\n            for (; (fin0i < fin0keys.length); (fin0i++)) {\n                ((d) = (fin0keys[fin0i]));\n                {\n                    c[d] = a[d];\n                ;\n                };\n            };\n        };\n    ;\n    };\n;\n    if (window.requireLazy) {\n        requireLazy([\"Env\",], b);\n    }\n     else {\n        Env = ((window.Env || {\n        }));\n        b(Env);\n    }\n;\n;\n};\n;\nenvFlush({\n    user: \"100006118350059\",\n    locale: \"en_US\",\n    method: \"GET\",\n    svn_rev: 871405,\n    tier: \"\",\n    push_phase: \"V3\",\n    pkg_cohort: \"EXP1:DEFAULT\",\n    vip: \"173.252.112.23\",\n    www_base: \"http://jsbngssl.www.facebook.com/\",\n    fb_dtsg: \"AQCttlPQ\",\n    ajaxpipe_token: \"AXg1MJsj67jxFeGx\",\n    lhsh: \"5AQFHNAuS\",\n    tracking_domain: \"http://jsbngssl.pixel.facebook.com\",\n    retry_ajax_on_network_error: \"1\",\n    fbid_emoticons: \"1\"\n});");
// 811
geval("envFlush({\n    eagleEyeConfig: {\n        seed: \"0gpU\"\n    }\n});\nCavalryLogger = false;");
// 812
geval("if (JSBNG__self.CavalryLogger) {\n    CavalryLogger.start_js([\"FHcQn\",]);\n}\n;\n;\nJSBNG__self.__DEV__ = ((JSBNG__self.__DEV__ || 0));\nif (((JSON.stringify([\"\\u2028\\u2029\",]) === \"[\\\"\\u2028\\u2029\\\"]\"))) {\n    JSON.stringify = function(a) {\n        var b = /\\u2028/g, c = /\\u2029/g;\n        return ((window.top.JSBNG_Replay.push)((window.top.JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1), function(d, e, f) {\n            var g = a.call(this, d, e, f);\n            if (g) {\n                if (((-1 < g.indexOf(\"\\u2028\")))) {\n                    g = g.replace(b, \"\\\\u2028\");\n                }\n            ;\n            ;\n                if (((-1 < g.indexOf(\"\\u2029\")))) {\n                    g = g.replace(c, \"\\\\u2029\");\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            return g;\n        }));\n    }(JSON.stringify);\n}\n;\n;\nvar __t = function(a) {\n    return a[0];\n}, __w = function(a) {\n    return a;\n};\n(function(a) {\n    if (a.require) {\n        return;\n    }\n;\n;\n    var b = Object.prototype.toString, c = {\n    }, d = {\n    }, e = {\n    }, f = 0, g = 1, h = 2, i = Object.prototype.hasOwnProperty;\n    function j(s) {\n        if (((a.ErrorUtils && !a.ErrorUtils.inGuard()))) {\n            return ErrorUtils.applyWithGuard(j, this, arguments);\n        }\n    ;\n    ;\n        var t = c[s], u, v, w;\n        if (!c[s]) {\n            w = ((((\"Requiring unknown module \\\"\" + s)) + \"\\\"\"));\n            throw new Error(w);\n        }\n    ;\n    ;\n        if (t.hasError) {\n            throw new Error(((((\"Requiring module \\\"\" + s)) + \"\\\" which threw an exception\")));\n        }\n    ;\n    ;\n        if (t.waiting) {\n            w = ((((\"Requiring module \\\"\" + s)) + \"\\\" with unresolved dependencies\"));\n            throw new Error(w);\n        }\n    ;\n    ;\n        if (!t.exports) {\n            var x = t.exports = {\n            }, y = t.factory;\n            if (((b.call(y) === \"[object Function]\"))) {\n                var z = [], aa = t.dependencies, ba = aa.length, ca;\n                if (((t.special & h))) {\n                    ba = Math.min(ba, y.length);\n                }\n            ;\n            ;\n                try {\n                    for (v = 0; ((v < ba)); v++) {\n                        u = aa[v];\n                        z.push(((((u === \"module\")) ? t : ((((u === \"exports\")) ? x : j(u))))));\n                    };\n                ;\n                    ca = y.apply(((t.context || a)), z);\n                } catch (da) {\n                    t.hasError = true;\n                    throw da;\n                };\n            ;\n                if (ca) {\n                    t.exports = ca;\n                }\n            ;\n            ;\n            }\n             else t.exports = y;\n        ;\n        ;\n        }\n    ;\n    ;\n        if (((t.refcount-- === 1))) {\n            delete c[s];\n        }\n    ;\n    ;\n        return t.exports;\n    };\n;\n    function k(s, t, u, v, w, x) {\n        if (((t === undefined))) {\n            t = [];\n            u = s;\n            s = n();\n        }\n         else if (((u === undefined))) {\n            u = t;\n            if (((b.call(s) === \"[object Array]\"))) {\n                t = s;\n                s = n();\n            }\n             else t = [];\n        ;\n        ;\n        }\n        \n    ;\n    ;\n        var y = {\n            cancel: l.bind(this, s)\n        }, z = c[s];\n        if (z) {\n            if (x) {\n                z.refcount += x;\n            }\n        ;\n        ;\n            return y;\n        }\n         else if (((((!t && !u)) && x))) {\n            e[s] = ((((e[s] || 0)) + x));\n            return y;\n        }\n         else {\n            z = {\n                id: s\n            };\n            z.refcount = ((((e[s] || 0)) + ((x || 0))));\n            delete e[s];\n        }\n        \n    ;\n    ;\n        z.factory = u;\n        z.dependencies = t;\n        z.context = w;\n        z.special = v;\n        z.waitingMap = {\n        };\n        z.waiting = 0;\n        z.hasError = false;\n        c[s] = z;\n        p(s);\n        return y;\n    };\n;\n    function l(s) {\n        if (!c[s]) {\n            return;\n        }\n    ;\n    ;\n        var t = c[s];\n        delete c[s];\n        {\n            var fin1keys = ((window.top.JSBNG_Replay.forInKeys)((t.waitingMap))), fin1i = (0);\n            var u;\n            for (; (fin1i < fin1keys.length); (fin1i++)) {\n                ((u) = (fin1keys[fin1i]));\n                {\n                    if (t.waitingMap[u]) {\n                        delete d[u][s];\n                    }\n                ;\n                ;\n                };\n            };\n        };\n    ;\n        for (var v = 0; ((v < t.dependencies.length)); v++) {\n            u = t.dependencies[v];\n            if (c[u]) {\n                if (((c[u].refcount-- === 1))) {\n                    l(u);\n                }\n            ;\n            ;\n            }\n             else if (e[u]) {\n                e[u]--;\n            }\n            \n        ;\n        ;\n        };\n    ;\n    };\n;\n    function m(s, t, u) {\n        return k(s, t, undefined, g, u, 1);\n    };\n;\n    function n() {\n        return ((\"__mod__\" + f++));\n    };\n;\n    function o(s, t) {\n        if (((!s.waitingMap[t] && ((s.id !== t))))) {\n            s.waiting++;\n            s.waitingMap[t] = 1;\n            ((d[t] || (d[t] = {\n            })));\n            d[t][s.id] = 1;\n        }\n    ;\n    ;\n    };\n;\n    function p(s) {\n        var t = [], u = c[s], v, w, x;\n        for (w = 0; ((w < u.dependencies.length)); w++) {\n            v = u.dependencies[w];\n            if (!c[v]) {\n                o(u, v);\n            }\n             else if (c[v].waiting) {\n                {\n                    var fin2keys = ((window.top.JSBNG_Replay.forInKeys)((c[v].waitingMap))), fin2i = (0);\n                    (0);\n                    for (; (fin2i < fin2keys.length); (fin2i++)) {\n                        ((x) = (fin2keys[fin2i]));\n                        {\n                            if (c[v].waitingMap[x]) {\n                                o(u, x);\n                            }\n                        ;\n                        ;\n                        };\n                    };\n                };\n            }\n            \n        ;\n        ;\n        };\n    ;\n        if (((((u.waiting === 0)) && ((u.special & g))))) {\n            t.push(s);\n        }\n    ;\n    ;\n        if (d[s]) {\n            var y = d[s], z;\n            d[s] = undefined;\n            {\n                var fin3keys = ((window.top.JSBNG_Replay.forInKeys)((y))), fin3i = (0);\n                (0);\n                for (; (fin3i < fin3keys.length); (fin3i++)) {\n                    ((v) = (fin3keys[fin3i]));\n                    {\n                        z = c[v];\n                        {\n                            var fin4keys = ((window.top.JSBNG_Replay.forInKeys)((u.waitingMap))), fin4i = (0);\n                            (0);\n                            for (; (fin4i < fin4keys.length); (fin4i++)) {\n                                ((x) = (fin4keys[fin4i]));\n                                {\n                                    if (u.waitingMap[x]) {\n                                        o(z, x);\n                                    }\n                                ;\n                                ;\n                                };\n                            };\n                        };\n                    ;\n                        if (z.waitingMap[s]) {\n                            z.waitingMap[s] = undefined;\n                            z.waiting--;\n                        }\n                    ;\n                    ;\n                        if (((((z.waiting === 0)) && ((z.special & g))))) {\n                            t.push(v);\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n        }\n    ;\n    ;\n        for (w = 0; ((w < t.length)); w++) {\n            j(t[w]);\n        ;\n        };\n    ;\n    };\n;\n    function q(s, t) {\n        c[s] = {\n            id: s\n        };\n        c[s].exports = t;\n    };\n;\n    q(\"module\", 0);\n    q(\"exports\", 0);\n    q(\"define\", k);\n    q(\"global\", a);\n    q(\"require\", j);\n    q(\"requireDynamic\", j);\n    q(\"requireLazy\", m);\n    k.amd = {\n    };\n    a.define = k;\n    a.require = j;\n    a.requireDynamic = j;\n    a.requireLazy = m;\n    j.__debug = {\n        modules: c,\n        deps: d\n    };\n    var r = function(s, t, u, v) {\n        k(s, t, u, ((v || h)));\n    };\n    a.__d = function(s, t, u, v) {\n        t = [\"global\",\"require\",\"requireDynamic\",\"requireLazy\",\"module\",\"exports\",].concat(t);\n        r(s, t, u, v);\n    };\n})(this);\n__d(\"SidebarPrelude\", [], function(a, b, c, d, e, f) {\n    var g = {\n        addSidebarMode: function(h) {\n            var i = JSBNG__document.documentElement;\n            if (((i.clientWidth > h))) {\n                i.className = ((i.className + \" sidebarMode\"));\n            }\n        ;\n        ;\n        }\n    };\n    e.exports = g;\n});\n__d(\"eprintf\", [], function(a, b, c, d, e, f) {\n    var g = function(h) {\n        var i = Array.prototype.slice.call(arguments).map(function(l) {\n            return String(l);\n        }), j = ((h.split(\"%s\").length - 1));\n        if (((j !== ((i.length - 1))))) {\n            return g(\"eprintf args number mismatch: %s\", JSON.stringify(i));\n        }\n    ;\n    ;\n        var k = 1;\n        return h.replace(/%s/g, function(l) {\n            return String(i[k++]);\n        });\n    };\n    e.exports = g;\n});\n__d(\"ex\", [], function(a, b, c, d, e, f) {\n    var g = function(h) {\n        var i = Array.prototype.slice.call(arguments).map(function(k) {\n            return String(k);\n        }), j = ((h.split(\"%s\").length - 1));\n        if (((j !== ((i.length - 1))))) {\n            return g(\"ex args number mismatch: %s\", JSON.stringify(i));\n        }\n    ;\n    ;\n        return ((((g._prefix + JSON.stringify(i))) + g._suffix));\n    };\n    g._prefix = \"\\u003C![EX[\";\n    g._suffix = \"]]\\u003E\";\n    e.exports = g;\n});\n__d(\"erx\", [\"ex\",], function(a, b, c, d, e, f) {\n    var g = b(\"ex\"), h = function(i) {\n        if (((typeof i !== \"string\"))) {\n            return i;\n        }\n    ;\n    ;\n        var j = i.indexOf(g._prefix), k = i.lastIndexOf(g._suffix);\n        if (((((j < 0)) || ((k < 0))))) {\n            return [i,];\n        }\n    ;\n    ;\n        var l = ((j + g._prefix.length)), m = ((k + g._suffix.length));\n        if (((l >= k))) {\n            return [\"erx slice failure: %s\",i,];\n        }\n    ;\n    ;\n        var n = i.substring(0, j), o = i.substring(m);\n        i = i.substring(l, k);\n        var p;\n        try {\n            p = JSON.parse(i);\n            p[0] = ((((n + p[0])) + o));\n        } catch (q) {\n            return [\"erx parse failure: %s\",i,];\n        };\n    ;\n        return p;\n    };\n    e.exports = h;\n});\n__d(\"copyProperties\", [], function(a, b, c, d, e, f) {\n    function g(h, i, j, k, l, m, n) {\n        h = ((h || {\n        }));\n        var o = [i,j,k,l,m,], p = 0, q;\n        while (o[p]) {\n            q = o[p++];\n            {\n                var fin5keys = ((window.top.JSBNG_Replay.forInKeys)((q))), fin5i = (0);\n                var r;\n                for (; (fin5i < fin5keys.length); (fin5i++)) {\n                    ((r) = (fin5keys[fin5i]));\n                    {\n                        h[r] = q[r];\n                    ;\n                    };\n                };\n            };\n        ;\n            if (((((((q.hasOwnProperty && q.hasOwnProperty(\"toString\"))) && ((typeof q.toString != \"undefined\")))) && ((h.toString !== q.toString))))) {\n                h.toString = q.toString;\n            }\n        ;\n        ;\n        };\n    ;\n        return h;\n    };\n;\n    e.exports = g;\n});\n__d(\"Env\", [\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"copyProperties\"), h = {\n        start: JSBNG__Date.now()\n    };\n    if (a.Env) {\n        g(h, a.Env);\n        a.Env = undefined;\n    }\n;\n;\n    e.exports = h;\n});\n__d(\"ErrorUtils\", [\"eprintf\",\"erx\",\"Env\",], function(a, b, c, d, e, f) {\n    var g = b(\"eprintf\"), h = b(\"erx\"), i = b(\"Env\"), j = \"\\u003Canonymous guard\\u003E\", k = \"\\u003Cgenerated guard\\u003E\", l = \"\\u003Cwindow.onerror\\u003E\", m = [], n = [], o = 50, p = ((window.chrome && ((\"type\" in new Error())))), q = false;\n    function r(da) {\n        if (!da) {\n            return;\n        }\n    ;\n    ;\n        var ea = da.split(/\\n\\n/)[0].replace(/[\\(\\)]|\\[.*?\\]|^\\w+:\\s.*?\\n/g, \"\").split(\"\\u000a\").map(function(fa) {\n            var ga, ha, ia;\n            fa = fa.trim();\n            if (/(:(\\d+)(:(\\d+))?)$/.test(fa)) {\n                ha = RegExp.$2;\n                ia = RegExp.$4;\n                fa = fa.slice(0, -RegExp.$1.length);\n            }\n        ;\n        ;\n            if (/(.*)(@|\\s)[^\\s]+$/.test(fa)) {\n                fa = fa.substring(((RegExp.$1.length + 1)));\n                ga = ((/(at)?\\s*(.*)([^\\s]+|$)/.test(RegExp.$1) ? RegExp.$2 : \"\"));\n            }\n        ;\n        ;\n            return ((((((((((\"    at\" + ((ga ? ((((\" \" + ga)) + \" (\")) : \" \")))) + fa.replace(/^@/, \"\"))) + ((ha ? ((\":\" + ha)) : \"\")))) + ((ia ? ((\":\" + ia)) : \"\")))) + ((ga ? \")\" : \"\"))));\n        });\n        return ea.join(\"\\u000a\");\n    };\n;\n    function s(da) {\n        if (!da) {\n            return {\n            };\n        }\n         else if (da._originalError) {\n            return da;\n        }\n        \n    ;\n    ;\n        var ea = {\n            line: ((da.lineNumber || da.line)),\n            column: ((da.columnNumber || da.column)),\n            JSBNG__name: da.JSBNG__name,\n            message: da.message,\n            script: ((((da.fileName || da.sourceURL)) || da.script)),\n            stack: r(((da.stackTrace || da.stack))),\n            guard: da.guard\n        };\n        if (((typeof ea.message === \"string\"))) {\n            ea.messageWithParams = h(ea.message);\n            ea.message = g.apply(a, ea.messageWithParams);\n        }\n         else {\n            ea.messageObject = ea.message;\n            ea.message = String(ea.message);\n        }\n    ;\n    ;\n        ea._originalError = da;\n        if (((da.framesToPop && ea.stack))) {\n            var fa = ea.stack.split(\"\\u000a\");\n            fa.shift();\n            if (((da.framesToPop === 2))) {\n                da.message += ((\" \" + fa.shift().trim()));\n            }\n        ;\n        ;\n            ea.stack = fa.join(\"\\u000a\");\n            if (/(\\w{3,5}:\\/\\/[^:]+):(\\d+)/.test(fa[0])) {\n                ea.script = RegExp.$1;\n                ea.line = parseInt(RegExp.$2, 10);\n            }\n        ;\n        ;\n            delete da.framesToPop;\n        }\n    ;\n    ;\n        if (((p && /(\\w{3,5}:\\/\\/[^:]+):(\\d+)/.test(da.stack)))) {\n            ea.script = RegExp.$1;\n            ea.line = parseInt(RegExp.$2, 10);\n        }\n    ;\n    ;\n        {\n            var fin6keys = ((window.top.JSBNG_Replay.forInKeys)((ea))), fin6i = (0);\n            var ga;\n            for (; (fin6i < fin6keys.length); (fin6i++)) {\n                ((ga) = (fin6keys[fin6i]));\n                {\n                    ((((ea[ga] == null)) && delete ea[ga]));\n                ;\n                };\n            };\n        };\n    ;\n        return ea;\n    };\n;\n    function t() {\n        try {\n            throw new Error();\n        } catch (da) {\n            var ea = s(da).stack;\n            return ((ea && ea.replace(/[\\s\\S]*__getTrace__.*\\n/, \"\")));\n        };\n    ;\n    };\n;\n    function u(da, ea) {\n        if (q) {\n            return;\n        }\n    ;\n    ;\n        da = s(da);\n        !ea;\n        if (((n.length > o))) {\n            n.splice(((o / 2)), 1);\n        }\n    ;\n    ;\n        n.push(da);\n        q = true;\n        for (var fa = 0; ((fa < m.length)); fa++) {\n            try {\n                m[fa](da);\n            } catch (ga) {\n            \n            };\n        ;\n        };\n    ;\n        q = false;\n    };\n;\n    var v = false;\n    function w() {\n        return v;\n    };\n;\n    function x() {\n        v = false;\n    };\n;\n    function y(da, ea, fa, ga, ha) {\n        var ia = !v;\n        if (ia) {\n            v = true;\n        }\n    ;\n    ;\n        var ja, ka = ((i.nocatch || (/nocatch/).test(JSBNG__location.search)));\n        if (ka) {\n            ja = da.apply(ea, ((fa || [])));\n            if (ia) {\n                x();\n            }\n        ;\n        ;\n            return ja;\n        }\n    ;\n    ;\n        try {\n            ja = da.apply(ea, ((fa || [])));\n            if (ia) {\n                x();\n            }\n        ;\n        ;\n            return ja;\n        } catch (la) {\n            if (ia) {\n                x();\n            }\n        ;\n        ;\n            var ma = s(la);\n            if (ga) {\n                ga(ma);\n            }\n        ;\n        ;\n            if (da) {\n                ma.callee = da.toString().substring(0, 100);\n            }\n        ;\n        ;\n            if (fa) {\n                ma.args = String(fa).substring(0, 100);\n            }\n        ;\n        ;\n            ma.guard = ((ha || j));\n            u(ma);\n        };\n    ;\n    };\n;\n    function z(da, ea) {\n        ea = ((((ea || da.JSBNG__name)) || k));\n        {\n            function fa() {\n                return y(da, this, arguments, null, ea);\n            };\n            ((window.top.JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39.push)((fa)));\n        };\n    ;\n        return fa;\n    };\n;\n    function aa(da, ea, fa, ga) {\n        u({\n            message: da,\n            script: ea,\n            line: fa,\n            column: ga,\n            guard: l\n        }, true);\n    };\n;\n    window.JSBNG__onerror = aa;\n    function ba(da, ea) {\n        m.push(da);\n        if (!ea) {\n            n.forEach(da);\n        }\n    ;\n    ;\n    };\n;\n    var ca = {\n        ANONYMOUS_GUARD_TAG: j,\n        GENERATED_GUARD_TAG: k,\n        GLOBAL_ERROR_HANDLER_TAG: l,\n        addListener: ba,\n        applyWithGuard: y,\n        getTrace: t,\n        guard: z,\n        JSBNG__history: n,\n        inGuard: w,\n        normalizeError: s,\n        JSBNG__onerror: aa,\n        reportError: u\n    };\n    e.exports = a.ErrorUtils = ca;\n    if (((((typeof __t === \"function\")) && __t.setHandler))) {\n        __t.setHandler(u);\n    }\n;\n;\n});\n__d(\"CallbackDependencyManager\", [\"ErrorUtils\",], function(a, b, c, d, e, f) {\n    var g = b(\"ErrorUtils\");\n    function h() {\n        this.$CallbackDependencyManager0 = {\n        };\n        this.$CallbackDependencyManager1 = {\n        };\n        this.$CallbackDependencyManager2 = 1;\n        this.$CallbackDependencyManager3 = {\n        };\n    };\n;\n    h.prototype.$CallbackDependencyManager4 = function(i, j) {\n        var k = 0, l = {\n        };\n        for (var m = 0, n = j.length; ((m < n)); m++) {\n            l[j[m]] = 1;\n        ;\n        };\n    ;\n        {\n            var fin7keys = ((window.top.JSBNG_Replay.forInKeys)((l))), fin7i = (0);\n            var o;\n            for (; (fin7i < fin7keys.length); (fin7i++)) {\n                ((o) = (fin7keys[fin7i]));\n                {\n                    if (this.$CallbackDependencyManager3[o]) {\n                        continue;\n                    }\n                ;\n                ;\n                    k++;\n                    if (((this.$CallbackDependencyManager0[o] === undefined))) {\n                        this.$CallbackDependencyManager0[o] = {\n                        };\n                    }\n                ;\n                ;\n                    this.$CallbackDependencyManager0[o][i] = ((((this.$CallbackDependencyManager0[o][i] || 0)) + 1));\n                };\n            };\n        };\n    ;\n        return k;\n    };\n    h.prototype.$CallbackDependencyManager5 = function(i) {\n        if (!this.$CallbackDependencyManager0[i]) {\n            return;\n        }\n    ;\n    ;\n        {\n            var fin8keys = ((window.top.JSBNG_Replay.forInKeys)((this.$CallbackDependencyManager0[i]))), fin8i = (0);\n            var j;\n            for (; (fin8i < fin8keys.length); (fin8i++)) {\n                ((j) = (fin8keys[fin8i]));\n                {\n                    this.$CallbackDependencyManager0[i][j]--;\n                    if (((this.$CallbackDependencyManager0[i][j] <= 0))) {\n                        delete this.$CallbackDependencyManager0[i][j];\n                    }\n                ;\n                ;\n                    this.$CallbackDependencyManager1[j].$CallbackDependencyManager6--;\n                    if (((this.$CallbackDependencyManager1[j].$CallbackDependencyManager6 <= 0))) {\n                        var k = this.$CallbackDependencyManager1[j].$CallbackDependencyManager7;\n                        delete this.$CallbackDependencyManager1[j];\n                        g.applyWithGuard(k);\n                    }\n                ;\n                ;\n                };\n            };\n        };\n    ;\n    };\n    h.prototype.addDependenciesToExistingCallback = function(i, j) {\n        if (!this.$CallbackDependencyManager1[i]) {\n            return null;\n        }\n    ;\n    ;\n        var k = this.$CallbackDependencyManager4(i, j);\n        this.$CallbackDependencyManager1[i].$CallbackDependencyManager6 += k;\n        return i;\n    };\n    h.prototype.isPersistentDependencySatisfied = function(i) {\n        return !!this.$CallbackDependencyManager3[i];\n    };\n    h.prototype.satisfyPersistentDependency = function(i) {\n        this.$CallbackDependencyManager3[i] = 1;\n        this.$CallbackDependencyManager5(i);\n    };\n    h.prototype.satisfyNonPersistentDependency = function(i) {\n        var j = ((this.$CallbackDependencyManager3[i] === 1));\n        if (!j) {\n            this.$CallbackDependencyManager3[i] = 1;\n        }\n    ;\n    ;\n        this.$CallbackDependencyManager5(i);\n        if (!j) {\n            delete this.$CallbackDependencyManager3[i];\n        }\n    ;\n    ;\n    };\n    h.prototype.registerCallback = function(i, j) {\n        var k = this.$CallbackDependencyManager2;\n        this.$CallbackDependencyManager2++;\n        var l = this.$CallbackDependencyManager4(k, j);\n        if (((l === 0))) {\n            g.applyWithGuard(i);\n            return null;\n        }\n    ;\n    ;\n        this.$CallbackDependencyManager1[k] = {\n            $CallbackDependencyManager7: i,\n            $CallbackDependencyManager6: l\n        };\n        return k;\n    };\n    h.prototype.unsatisfyPersistentDependency = function(i) {\n        delete this.$CallbackDependencyManager3[i];\n    };\n    e.exports = h;\n});\n__d(\"hasArrayNature\", [], function(a, b, c, d, e, f) {\n    function g(h) {\n        return ((((((((!!h && ((((typeof h == \"object\")) || ((typeof h == \"function\")))))) && ((\"length\" in h)))) && !((\"JSBNG__setInterval\" in h)))) && ((((((Object.prototype.toString.call(h) === \"[object Array]\")) || ((\"callee\" in h)))) || ((\"item\" in h))))));\n    };\n;\n    e.exports = g;\n});\n__d(\"createArrayFrom\", [\"hasArrayNature\",], function(a, b, c, d, e, f) {\n    var g = b(\"hasArrayNature\");\n    function h(i) {\n        if (!g(i)) {\n            return [i,];\n        }\n    ;\n    ;\n        if (i.item) {\n            var j = i.length, k = new Array(j);\n            while (j--) {\n                k[j] = i[j];\n            ;\n            };\n        ;\n            return k;\n        }\n    ;\n    ;\n        return Array.prototype.slice.call(i);\n    };\n;\n    e.exports = h;\n});\n__d(\"invariant\", [], function(a, b, c, d, e, f) {\n    function g(h) {\n        if (!h) {\n            throw new Error(\"Invariant Violation\");\n        }\n    ;\n    ;\n    };\n;\n    e.exports = g;\n});\n__d(\"EventEmitter\", [\"createArrayFrom\",\"invariant\",], function(a, b, c, d, e, f) {\n    var g = b(\"createArrayFrom\"), h = b(\"invariant\");\n    function i() {\n        this.$EventEmitter0 = {\n        };\n        this.$EventEmitter1 = {\n        };\n        this.$EventEmitter2 = {\n        };\n    };\n;\n    i.prototype.addListener = function(k, l, m) {\n        if (!this.$EventEmitter0[k]) {\n            this.$EventEmitter0[k] = [];\n        }\n    ;\n    ;\n        var n = this.$EventEmitter0[k].length;\n        this.$EventEmitter0[k].push(l);\n        if (((m !== undefined))) {\n            if (!this.$EventEmitter1[k]) {\n                this.$EventEmitter1[k] = [];\n            }\n        ;\n        ;\n            this.$EventEmitter1[k][n] = m;\n        }\n    ;\n    ;\n        return new j(this, k, n);\n    };\n    i.prototype.once = function(k, l, m) {\n        var n = this;\n        return this.addListener(k, function() {\n            n.removeCurrentListener();\n            l.apply(m, arguments);\n        });\n    };\n    i.prototype.removeAllListeners = function(k) {\n        if (((k === undefined))) {\n            this.$EventEmitter0 = {\n            };\n            this.$EventEmitter1 = {\n            };\n        }\n         else {\n            delete this.$EventEmitter0[k];\n            delete this.$EventEmitter1[k];\n        }\n    ;\n    ;\n    };\n    i.prototype.removeCurrentListener = function() {\n        h(((this.$EventEmitter2.key !== undefined)));\n        this.removeSubscription(this.$EventEmitter2);\n    };\n    i.prototype.removeSubscription = function(k) {\n        var l = k.eventType, m = k.key, n = this.$EventEmitter0[l];\n        if (n) {\n            delete n[m];\n        }\n    ;\n    ;\n        var o = this.$EventEmitter1[l];\n        if (o) {\n            delete o[m];\n        }\n    ;\n    ;\n    };\n    i.prototype.listeners = function(k) {\n        var l = this.$EventEmitter0[k];\n        return ((l ? g(l) : []));\n    };\n    i.prototype.emit = function(k, l, m, n, o, p, q) {\n        h(((q === undefined)));\n        var r = this.$EventEmitter0[k];\n        if (r) {\n            var s = this.$EventEmitter1[k];\n            this.$EventEmitter2.eventType = k;\n            var t = Object.keys(r);\n            for (var u = 0; ((u < t.length)); u++) {\n                var v = t[u], w = r[v];\n                if (w) {\n                    var x = ((s ? s[v] : undefined));\n                    this.$EventEmitter2.key = v;\n                    if (((x === undefined))) {\n                        w(l, m, n, o, p);\n                    }\n                     else w.call(x, l, m, n, o, p);\n                ;\n                ;\n                }\n            ;\n            ;\n            };\n        ;\n            this.$EventEmitter2.eventType = undefined;\n            this.$EventEmitter2.key = undefined;\n        }\n    ;\n    ;\n    };\n    function j(k, l, m) {\n        this.$ListenerSubscription0 = k;\n        this.eventType = l;\n        this.key = m;\n    };\n;\n    j.prototype.remove = function() {\n        this.$ListenerSubscription0.removeSubscription(this);\n    };\n    e.exports = i;\n});\n__d(\"EventEmitterWithHolding\", [], function(a, b, c, d, e, f) {\n    function g(h, i) {\n        this.$EventEmitterWithHolding0 = h;\n        this.$EventEmitterWithHolding1 = i;\n        this.$EventEmitterWithHolding2 = null;\n        this.$EventEmitterWithHolding3 = false;\n    };\n;\n    g.prototype.addListener = function(h, i, j) {\n        return this.$EventEmitterWithHolding0.addListener(h, i, j);\n    };\n    g.prototype.once = function(h, i, j) {\n        return this.$EventEmitterWithHolding0.once(h, i, j);\n    };\n    g.prototype.addRetroactiveListener = function(h, i, j) {\n        var k = this.$EventEmitterWithHolding0.addListener(h, i, j);\n        this.$EventEmitterWithHolding3 = true;\n        this.$EventEmitterWithHolding1.emitToListener(h, i, j);\n        this.$EventEmitterWithHolding3 = false;\n        return k;\n    };\n    g.prototype.removeAllListeners = function(h) {\n        this.$EventEmitterWithHolding0.removeAllListeners(h);\n    };\n    g.prototype.removeCurrentListener = function() {\n        this.$EventEmitterWithHolding0.removeCurrentListener();\n    };\n    g.prototype.removeSubscription = function(h) {\n        this.$EventEmitterWithHolding0.removeSubscription(h);\n    };\n    g.prototype.listeners = function(h) {\n        return this.$EventEmitterWithHolding0.listeners(h);\n    };\n    g.prototype.emit = function(h, i, j, k, l, m, n) {\n        this.$EventEmitterWithHolding0.emit(h, i, j, k, l, m, n);\n    };\n    g.prototype.emitAndHold = function(h, i, j, k, l, m, n) {\n        this.$EventEmitterWithHolding2 = this.$EventEmitterWithHolding1.holdEvent(h, i, j, k, l, m, n);\n        this.$EventEmitterWithHolding0.emit(h, i, j, k, l, m, n);\n        this.$EventEmitterWithHolding2 = null;\n    };\n    g.prototype.releaseCurrentEvent = function() {\n        if (((this.$EventEmitterWithHolding2 !== null))) {\n            this.$EventEmitterWithHolding1.releaseEvent(this.$EventEmitterWithHolding2);\n        }\n         else if (this.$EventEmitterWithHolding3) {\n            this.$EventEmitterWithHolding1.releaseCurrentEvent();\n        }\n        \n    ;\n    ;\n    };\n    e.exports = g;\n});\n__d(\"EventHolder\", [\"invariant\",], function(a, b, c, d, e, f) {\n    var g = b(\"invariant\");\n    function h() {\n        this.$EventHolder0 = [];\n        this.$EventHolder1 = [];\n        this.$EventHolder2 = null;\n    };\n;\n    h.prototype.holdEvent = function(i, j, k, l, m, n, o) {\n        var p = this.$EventHolder0.length, JSBNG__event = [i,j,k,l,m,n,o,];\n        this.$EventHolder0.push(JSBNG__event);\n        return p;\n    };\n    h.prototype.emitToListener = function(i, j, k) {\n        this.forEachHeldEvent(function(l, m, n, o, p, q, r) {\n            if (((l === i))) {\n                j.call(k, m, n, o, p, q, r);\n            }\n        ;\n        ;\n        });\n    };\n    h.prototype.forEachHeldEvent = function(i, j) {\n        this.$EventHolder0.forEach(function(JSBNG__event, k) {\n            this.$EventHolder2 = k;\n            i.apply(j, JSBNG__event);\n        }, this);\n        this.$EventHolder2 = null;\n    };\n    h.prototype.releaseCurrentEvent = function() {\n        g(((this.$EventHolder2 !== null)));\n        delete this.$EventHolder0[this.$EventHolder2];\n    };\n    h.prototype.releaseEvent = function(i) {\n        delete this.$EventHolder0[i];\n    };\n    e.exports = h;\n});\n__d(\"asyncCallback\", [], function(a, b, c, d, e, f) {\n    function g(h, i) {\n        if (a.ArbiterMonitor) {\n            return a.ArbiterMonitor.asyncCallback(h, i);\n        }\n    ;\n    ;\n        return h;\n    };\n;\n    e.exports = g;\n});\n__d(\"emptyFunction\", [\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"copyProperties\");\n    function h(j) {\n        return function() {\n            return j;\n        };\n    };\n;\n    {\n        function i() {\n        \n        };\n        ((window.top.JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_96.push)((i)));\n    };\n;\n    g(i, {\n        thatReturns: h,\n        thatReturnsFalse: h(false),\n        thatReturnsTrue: h(true),\n        thatReturnsNull: h(null),\n        thatReturnsThis: function() {\n            return this;\n        },\n        thatReturnsArgument: function(j) {\n            return j;\n        }\n    });\n    e.exports = i;\n});\n__d(\"Arbiter\", [\"CallbackDependencyManager\",\"ErrorUtils\",\"EventEmitter\",\"EventEmitterWithHolding\",\"EventHolder\",\"asyncCallback\",\"copyProperties\",\"createArrayFrom\",\"emptyFunction\",\"hasArrayNature\",\"invariant\",], function(a, b, c, d, e, f) {\n    var g = b(\"CallbackDependencyManager\"), h = b(\"ErrorUtils\"), i = b(\"EventEmitter\"), j = b(\"EventEmitterWithHolding\"), k = b(\"EventHolder\"), l = b(\"asyncCallback\"), m = b(\"copyProperties\"), n = b(\"createArrayFrom\"), o = b(\"emptyFunction\"), p = b(\"hasArrayNature\"), q = b(\"invariant\");\n    function r() {\n        var v = new i();\n        this.$Arbiter0 = new t();\n        this.$Arbiter1 = new j(v, this.$Arbiter0);\n        this.$Arbiter2 = new g();\n        this.$Arbiter3 = [];\n    };\n;\n    r.prototype.subscribe = function(v, w, x) {\n        v = n(v);\n        q(v.every(o.thatReturnsArgument));\n        x = ((x || r.SUBSCRIBE_ALL));\n        q(((((x === r.SUBSCRIBE_NEW)) || ((x === r.SUBSCRIBE_ALL)))));\n        var y = v.map(function(z) {\n            var aa = this.$Arbiter4.bind(this, w, z);\n            if (((x === r.SUBSCRIBE_NEW))) {\n                return this.$Arbiter1.addListener(z, aa);\n            }\n        ;\n        ;\n            this.$Arbiter3.push({\n            });\n            var ba = this.$Arbiter1.addRetroactiveListener(z, aa);\n            this.$Arbiter3.pop();\n            return ba;\n        }, this);\n        return new u(this, y);\n    };\n    r.prototype.$Arbiter4 = function(v, w, x) {\n        var y = this.$Arbiter3[((this.$Arbiter3.length - 1))];\n        if (((y[w] === false))) {\n            return;\n        }\n    ;\n    ;\n        var z = h.applyWithGuard(v, null, [w,x,]);\n        if (((z === false))) {\n            this.$Arbiter1.releaseCurrentEvent();\n        }\n    ;\n    ;\n        y[w] = z;\n    };\n    r.prototype.subscribeOnce = function(v, w, x) {\n        var y = this.subscribe(v, function(z, aa) {\n            ((y && y.unsubscribe()));\n            return w(z, aa);\n        }, x);\n        return y;\n    };\n    r.prototype.unsubscribe = function(v) {\n        q(v.isForArbiterInstance(this));\n        v.unsubscribe();\n    };\n    r.prototype.inform = function(v, w, x) {\n        var y = p(v);\n        v = n(v);\n        x = ((x || r.BEHAVIOR_EVENT));\n        var z = ((((x === r.BEHAVIOR_STATE)) || ((x === r.BEHAVIOR_PERSISTENT)))), aa = a.ArbiterMonitor;\n        this.$Arbiter3.push({\n        });\n        for (var ba = 0; ((ba < v.length)); ba++) {\n            var ca = v[ba];\n            q(ca);\n            this.$Arbiter0.setHoldingBehavior(ca, x);\n            ((aa && aa.record(\"JSBNG__event\", ca, w, this)));\n            this.$Arbiter1.emitAndHold(ca, w);\n            this.$Arbiter5(ca, w, z);\n            ((aa && aa.record(\"done\", ca, w, this)));\n        };\n    ;\n        var da = this.$Arbiter3.pop();\n        return ((y ? da : da[v[0]]));\n    };\n    r.prototype.query = function(v) {\n        var w = this.$Arbiter0.getHoldingBehavior(v);\n        q(((!w || ((w === r.BEHAVIOR_STATE)))));\n        var x = null;\n        this.$Arbiter0.emitToListener(v, function(y) {\n            x = y;\n        });\n        return x;\n    };\n    r.prototype.registerCallback = function(v, w) {\n        if (((typeof v === \"function\"))) {\n            return this.$Arbiter2.registerCallback(l(v, \"arbiter\"), w);\n        }\n         else return this.$Arbiter2.addDependenciesToExistingCallback(v, w)\n    ;\n    };\n    r.prototype.$Arbiter5 = function(v, w, x) {\n        if (((w === null))) {\n            return;\n        }\n    ;\n    ;\n        if (x) {\n            this.$Arbiter2.satisfyPersistentDependency(v);\n        }\n         else this.$Arbiter2.satisfyNonPersistentDependency(v);\n    ;\n    ;\n    };\n    var s = ((((k === null)) ? null : k.prototype));\n    t.prototype = Object.create(s);\n    t.prototype.constructor = t;\n    t.__superConstructor__ = k;\n    function t() {\n        k.call(this);\n        this.$ArbiterEventHolder0 = {\n        };\n    };\n;\n    t.prototype.setHoldingBehavior = function(v, w) {\n        this.$ArbiterEventHolder0[v] = w;\n    };\n    t.prototype.getHoldingBehavior = function(v) {\n        return this.$ArbiterEventHolder0[v];\n    };\n    t.prototype.holdEvent = function(v, w, x, y, z) {\n        var aa = this.$ArbiterEventHolder0[v];\n        if (((aa !== r.BEHAVIOR_PERSISTENT))) {\n            this.$ArbiterEventHolder2(v);\n        }\n    ;\n    ;\n        if (((aa !== r.BEHAVIOR_EVENT))) {\n            return s.holdEvent.call(this, v, w, x, y, z);\n        }\n    ;\n    ;\n    };\n    t.prototype.$ArbiterEventHolder2 = function(v) {\n        this.emitToListener(v, this.releaseCurrentEvent, this);\n    };\n    m(r, {\n        SUBSCRIBE_NEW: \"new\",\n        SUBSCRIBE_ALL: \"all\",\n        BEHAVIOR_EVENT: \"JSBNG__event\",\n        BEHAVIOR_STATE: \"state\",\n        BEHAVIOR_PERSISTENT: \"persistent\"\n    });\n    function u(v, w) {\n        this.$ArbiterToken0 = v;\n        this.$ArbiterToken1 = w;\n    };\n;\n    u.prototype.unsubscribe = function() {\n        for (var v = 0; ((v < this.$ArbiterToken1.length)); v++) {\n            this.$ArbiterToken1[v].remove();\n        ;\n        };\n    ;\n        this.$ArbiterToken1.length = 0;\n    };\n    u.prototype.isForArbiterInstance = function(v) {\n        q(this.$ArbiterToken0);\n        return ((this.$ArbiterToken0 === v));\n    };\n    Object.keys(r.prototype).forEach(function(v) {\n        r[v] = function() {\n            var w = ((((this instanceof r)) ? this : r));\n            return r.prototype[v].apply(w, arguments);\n        };\n    });\n    r.call(r);\n    e.exports = r;\n});\n__d(\"ArbiterMixin\", [\"Arbiter\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = {\n        _getArbiterInstance: function() {\n            return ((this._arbiter || (this._arbiter = new g())));\n        },\n        inform: function(i, j, k) {\n            return this._getArbiterInstance().inform(i, j, k);\n        },\n        subscribe: function(i, j, k) {\n            return this._getArbiterInstance().subscribe(i, j, k);\n        },\n        subscribeOnce: function(i, j, k) {\n            return this._getArbiterInstance().subscribeOnce(i, j, k);\n        },\n        unsubscribe: function(i) {\n            this._getArbiterInstance().unsubscribe(i);\n        },\n        registerCallback: function(i, j) {\n            this._getArbiterInstance().registerCallback(i, j);\n        },\n        query: function(i) {\n            return this._getArbiterInstance().query(i);\n        }\n    };\n    e.exports = h;\n});\n__d(\"legacy:ArbiterMixin\", [\"ArbiterMixin\",], function(a, b, c, d) {\n    a.ArbiterMixin = b(\"ArbiterMixin\");\n}, 3);\n__d(\"ge\", [], function(a, b, c, d, e, f) {\n    function g(j, k, l) {\n        return ((((typeof j != \"string\")) ? j : ((!k ? JSBNG__document.getElementById(j) : h(j, k, l)))));\n    };\n;\n    function h(j, k, l) {\n        var m, n, o;\n        if (((i(k) == j))) {\n            return k;\n        }\n         else if (k.getElementsByTagName) {\n            n = k.getElementsByTagName(((l || \"*\")));\n            for (o = 0; ((o < n.length)); o++) {\n                if (((i(n[o]) == j))) {\n                    return n[o];\n                }\n            ;\n            ;\n            };\n        ;\n        }\n         else {\n            n = k.childNodes;\n            for (o = 0; ((o < n.length)); o++) {\n                m = h(j, n[o]);\n                if (m) {\n                    return m;\n                }\n            ;\n            ;\n            };\n        ;\n        }\n        \n    ;\n    ;\n        return null;\n    };\n;\n    function i(j) {\n        var k = ((j.getAttributeNode && j.getAttributeNode(\"id\")));\n        return ((k ? k.value : null));\n    };\n;\n    e.exports = g;\n});\n__d(\"$\", [\"ge\",\"ex\",], function(a, b, c, d, e, f) {\n    var g = b(\"ge\"), h = b(\"ex\");\n    function i(j) {\n        var k = g(j);\n        if (!k) {\n            throw new Error(h(\"Tried to get element with id of \\\"%s\\\" but it is not present on the page.\", j));\n        }\n    ;\n    ;\n        return k;\n    };\n;\n    e.exports = i;\n});\n__d(\"CSSCore\", [\"invariant\",], function(a, b, c, d, e, f) {\n    var g = b(\"invariant\");\n    function h(j, k) {\n        if (j.classList) {\n            return ((!!k && j.classList.contains(k)));\n        }\n    ;\n    ;\n        return ((((((\" \" + j.className)) + \" \")).indexOf(((((\" \" + k)) + \" \"))) > -1));\n    };\n;\n    var i = {\n        addClass: function(j, k) {\n            g(!/\\s/.test(k));\n            if (k) {\n                if (j.classList) {\n                    j.classList.add(k);\n                }\n                 else if (!h(j, k)) {\n                    j.className = ((((j.className + \" \")) + k));\n                }\n                \n            ;\n            }\n        ;\n        ;\n            return j;\n        },\n        removeClass: function(j, k) {\n            g(!/\\s/.test(k));\n            if (k) {\n                if (j.classList) {\n                    j.classList.remove(k);\n                }\n                 else if (h(j, k)) {\n                    j.className = j.className.replace(new RegExp(((((\"(^|\\\\s)\" + k)) + \"(?:\\\\s|$)\")), \"g\"), \"$1\").replace(/\\s+/g, \" \").replace(/^\\s*|\\s*$/g, \"\");\n                }\n                \n            ;\n            }\n        ;\n        ;\n            return j;\n        },\n        conditionClass: function(j, k, l) {\n            return ((l ? i.addClass : i.removeClass))(j, k);\n        }\n    };\n    e.exports = i;\n});\n__d(\"CSS\", [\"$\",\"CSSCore\",], function(a, b, c, d, e, f) {\n    var g = b(\"$\"), h = b(\"CSSCore\"), i = \"hidden_elem\", j = {\n        setClass: function(k, l) {\n            g(k).className = ((l || \"\"));\n            return k;\n        },\n        hasClass: function(k, l) {\n            k = g(k);\n            if (k.classList) {\n                return ((!!l && k.classList.contains(l)));\n            }\n        ;\n        ;\n            return ((((((\" \" + k.className)) + \" \")).indexOf(((((\" \" + l)) + \" \"))) > -1));\n        },\n        addClass: function(k, l) {\n            return h.addClass(g(k), l);\n        },\n        removeClass: function(k, l) {\n            return h.removeClass(g(k), l);\n        },\n        conditionClass: function(k, l, m) {\n            return h.conditionClass(g(k), l, m);\n        },\n        toggleClass: function(k, l) {\n            return j.conditionClass(k, l, !j.hasClass(k, l));\n        },\n        shown: function(k) {\n            return !j.hasClass(k, i);\n        },\n        hide: function(k) {\n            return j.addClass(k, i);\n        },\n        show: function(k) {\n            return j.removeClass(k, i);\n        },\n        toggle: function(k) {\n            return j.toggleClass(k, i);\n        },\n        conditionShow: function(k, l) {\n            return j.conditionClass(k, i, !l);\n        }\n    };\n    e.exports = j;\n});\n__d(\"legacy:css-core\", [\"CSS\",], function(a, b, c, d) {\n    a.CSS = b(\"CSS\");\n}, 3);\n__d(\"legacy:dom-core\", [\"$\",\"ge\",], function(a, b, c, d) {\n    a.$ = b(\"$\");\n    a.ge = b(\"ge\");\n}, 3);\n__d(\"Parent\", [\"CSS\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSS\"), h = {\n        byTag: function(i, j) {\n            j = j.toUpperCase();\n            while (((i && ((i.nodeName != j))))) {\n                i = i.parentNode;\n            ;\n            };\n        ;\n            return i;\n        },\n        byClass: function(i, j) {\n            while (((i && !g.hasClass(i, j)))) {\n                i = i.parentNode;\n            ;\n            };\n        ;\n            return i;\n        },\n        byAttribute: function(i, j) {\n            while (((i && ((!i.getAttribute || !i.getAttribute(j)))))) {\n                i = i.parentNode;\n            ;\n            };\n        ;\n            return i;\n        }\n    };\n    e.exports = h;\n});\n__d(\"legacy:parent\", [\"Parent\",], function(a, b, c, d) {\n    a.Parent = b(\"Parent\");\n}, 3);\n__d(\"legacy:emptyFunction\", [\"emptyFunction\",], function(a, b, c, d) {\n    a.emptyFunction = b(\"emptyFunction\");\n}, 3);\n__d(\"isEmpty\", [], function(a, b, c, d, e, f) {\n    function g(h) {\n        if (Array.isArray(h)) {\n            return ((h.length === 0));\n        }\n         else if (((typeof h === \"object\"))) {\n            {\n                var fin9keys = ((window.top.JSBNG_Replay.forInKeys)((h))), fin9i = (0);\n                var i;\n                for (; (fin9i < fin9keys.length); (fin9i++)) {\n                    ((i) = (fin9keys[fin9i]));\n                    {\n                        return false;\n                    };\n                };\n            };\n        ;\n            return true;\n        }\n         else return !h\n        \n    ;\n    };\n;\n    e.exports = g;\n});\n__d(\"CSSLoader\", [\"isEmpty\",], function(a, b, c, d, e, f) {\n    var g = b(\"isEmpty\"), h = 20, i = 5000, j, k, l = {\n    }, m = [], n, o = {\n    };\n    function p(t) {\n        if (k) {\n            return;\n        }\n    ;\n    ;\n        k = true;\n        var u = JSBNG__document.createElement(\"link\");\n        u.JSBNG__onload = function() {\n            j = true;\n            u.parentNode.removeChild(u);\n        };\n        u.rel = \"stylesheet\";\n        u.href = \"data:text/css;base64,\";\n        t.appendChild(u);\n    };\n;\n    function q() {\n        var t, u = [], v = [];\n        if (((JSBNG__Date.now() >= n))) {\n            {\n                var fin10keys = ((window.top.JSBNG_Replay.forInKeys)((o))), fin10i = (0);\n                (0);\n                for (; (fin10i < fin10keys.length); (fin10i++)) {\n                    ((t) = (fin10keys[fin10i]));\n                    {\n                        v.push(o[t].signal);\n                        u.push(o[t].error);\n                    };\n                };\n            };\n        ;\n            o = {\n            };\n        }\n         else {\n            var fin11keys = ((window.top.JSBNG_Replay.forInKeys)((o))), fin11i = (0);\n            (0);\n            for (; (fin11i < fin11keys.length); (fin11i++)) {\n                ((t) = (fin11keys[fin11i]));\n                {\n                    var w = o[t].signal, x = ((window.JSBNG__getComputedStyle ? JSBNG__getComputedStyle(w, null) : w.currentStyle));\n                    if (((x && ((parseInt(x.height, 10) > 1))))) {\n                        u.push(o[t].load);\n                        v.push(w);\n                        delete o[t];\n                    }\n                ;\n                ;\n                };\n            };\n        }\n    ;\n    ;\n        for (var y = 0; ((y < v.length)); y++) {\n            v[y].parentNode.removeChild(v[y]);\n        ;\n        };\n    ;\n        if (!g(u)) {\n            for (y = 0; ((y < u.length)); y++) {\n                u[y]();\n            ;\n            };\n        ;\n            n = ((JSBNG__Date.now() + i));\n        }\n    ;\n    ;\n        return g(o);\n    };\n;\n    function r(t, u, v, w) {\n        var x = JSBNG__document.createElement(\"meta\");\n        x.id = ((\"bootloader_\" + t.replace(/[^a-z0-9]/gi, \"_\")));\n        u.appendChild(x);\n        var y = !g(o);\n        n = ((JSBNG__Date.now() + i));\n        o[t] = {\n            signal: x,\n            load: v,\n            error: w\n        };\n        if (!y) {\n            var z = JSBNG__setInterval(function aa() {\n                if (q()) {\n                    JSBNG__clearInterval(z);\n                }\n            ;\n            ;\n            }, h, false);\n        }\n    ;\n    ;\n    };\n;\n    var s = {\n        loadStyleSheet: function(t, u, v, w, x) {\n            if (l[t]) {\n                throw new Error(((((\"CSS component \" + t)) + \" has already been requested.\")));\n            }\n        ;\n        ;\n            if (JSBNG__document.createStyleSheet) {\n                var y;\n                for (var z = 0; ((z < m.length)); z++) {\n                    if (((m[z].imports.length < 31))) {\n                        y = z;\n                        break;\n                    }\n                ;\n                ;\n                };\n            ;\n                if (((y === undefined))) {\n                    m.push(JSBNG__document.createStyleSheet());\n                    y = ((m.length - 1));\n                }\n            ;\n            ;\n                m[y].addImport(u);\n                l[t] = {\n                    styleSheet: m[y],\n                    uri: u\n                };\n                r(t, v, w, x);\n                return;\n            }\n        ;\n        ;\n            var aa = JSBNG__document.createElement(\"link\");\n            aa.rel = \"stylesheet\";\n            aa.type = \"text/css\";\n            aa.href = u;\n            l[t] = {\n                link: aa\n            };\n            if (j) {\n                aa.JSBNG__onload = function() {\n                    aa.JSBNG__onload = aa.JSBNG__onerror = null;\n                    w();\n                };\n                aa.JSBNG__onerror = function() {\n                    aa.JSBNG__onload = aa.JSBNG__onerror = null;\n                    x();\n                };\n            }\n             else {\n                r(t, v, w, x);\n                if (((j === undefined))) {\n                    p(v);\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            v.appendChild(aa);\n        },\n        registerLoadedStyleSheet: function(t, u) {\n            if (l[t]) {\n                throw new Error(((((((\"CSS component \" + t)) + \" has been requested and should not be \")) + \"loaded more than once.\")));\n            }\n        ;\n        ;\n            l[t] = {\n                link: u\n            };\n        },\n        unloadStyleSheet: function(t) {\n            if (((!t in l))) {\n                return;\n            }\n        ;\n        ;\n            var u = l[t], v = u.link;\n            if (v) {\n                v.JSBNG__onload = v.JSBNG__onerror = null;\n                v.parentNode.removeChild(v);\n            }\n             else {\n                var w = u.styleSheet;\n                for (var x = 0; ((x < w.imports.length)); x++) {\n                    if (((w.imports[x].href == u.uri))) {\n                        w.removeImport(x);\n                        break;\n                    }\n                ;\n                ;\n                };\n            ;\n            }\n        ;\n        ;\n            delete o[t];\n            delete l[t];\n        }\n    };\n    e.exports = s;\n});\n__d(\"Bootloader\", [\"CSSLoader\",\"CallbackDependencyManager\",\"createArrayFrom\",\"ErrorUtils\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSSLoader\"), h = b(\"CallbackDependencyManager\"), i = b(\"createArrayFrom\"), j = b(\"ErrorUtils\"), k = {\n    }, l = {\n    }, m = {\n    }, n = null, o = {\n    }, p = {\n    }, q = {\n    }, r = {\n    }, s = false, t = [], u = new h(), v = [];\n    j.addListener(function(ca) {\n        ca.loadingUrls = Object.keys(p);\n    }, true);\n    function w(ca, da, ea, fa) {\n        var ga = ba.done.bind(null, [ea,], ((ca === \"css\")), da);\n        p[da] = JSBNG__Date.now();\n        if (((ca == \"js\"))) {\n            var ha = JSBNG__document.createElement(\"script\");\n            ha.src = da;\n            ha.async = true;\n            var ia = o[ea];\n            if (((ia && ia.crossOrigin))) {\n                ha.crossOrigin = \"anonymous\";\n            }\n        ;\n        ;\n            ha.JSBNG__onload = ga;\n            ha.JSBNG__onerror = function() {\n                q[da] = true;\n                ga();\n            };\n            ha.onreadystatechange = function() {\n                if (((this.readyState in {\n                    loaded: 1,\n                    complete: 1\n                }))) {\n                    ga();\n                }\n            ;\n            ;\n            };\n            fa.appendChild(ha);\n        }\n         else if (((ca == \"css\"))) {\n            g.loadStyleSheet(ea, da, fa, ga, function() {\n                q[da] = true;\n                ga();\n            });\n        }\n        \n    ;\n    ;\n    };\n;\n    function x(ca) {\n        if (!o[ca]) {\n            return;\n        }\n    ;\n    ;\n        if (((o[ca].type == \"css\"))) {\n            g.unloadStyleSheet(ca);\n            delete k[ca];\n            u.unsatisfyPersistentDependency(ca);\n        }\n    ;\n    ;\n    };\n;\n    function y(ca, da) {\n        if (!s) {\n            t.push([ca,da,]);\n            return;\n        }\n    ;\n    ;\n        ca = i(ca);\n        var ea = [];\n        for (var fa = 0; ((fa < ca.length)); ++fa) {\n            if (!ca[fa]) {\n                continue;\n            }\n        ;\n        ;\n            var ga = m[ca[fa]];\n            if (ga) {\n                var ha = ga.resources;\n                for (var ia = 0; ((ia < ha.length)); ++ia) {\n                    ea.push(ha[ia]);\n                ;\n                };\n            ;\n            }\n        ;\n        ;\n        };\n    ;\n        ba.loadResources(ea, da);\n    };\n;\n    function z(ca) {\n        ca = i(ca);\n        for (var da = 0; ((da < ca.length)); ++da) {\n            if (((ca[da] !== undefined))) {\n                k[ca[da]] = true;\n            }\n        ;\n        ;\n        };\n    ;\n    };\n;\n    function aa(ca) {\n        if (!ca) {\n            return [];\n        }\n    ;\n    ;\n        var da = [];\n        for (var ea = 0; ((ea < ca.length)); ++ea) {\n            if (((typeof ca[ea] == \"string\"))) {\n                if (((ca[ea] in o))) {\n                    da.push(o[ca[ea]]);\n                }\n            ;\n            ;\n            }\n             else da.push(ca[ea]);\n        ;\n        ;\n        };\n    ;\n        return da;\n    };\n;\n    var ba = {\n        configurePage: function(ca) {\n            var da = {\n            }, ea = aa(ca), fa;\n            for (fa = 0; ((fa < ea.length)); fa++) {\n                da[ea[fa].src] = ea[fa];\n                z(ea[fa].JSBNG__name);\n            };\n        ;\n            var ga = JSBNG__document.getElementsByTagName(\"link\");\n            for (fa = 0; ((fa < ga.length)); ++fa) {\n                if (((ga[fa].rel != \"stylesheet\"))) {\n                    continue;\n                }\n            ;\n            ;\n                {\n                    var fin12keys = ((window.top.JSBNG_Replay.forInKeys)((da))), fin12i = (0);\n                    var ha;\n                    for (; (fin12i < fin12keys.length); (fin12i++)) {\n                        ((ha) = (fin12keys[fin12i]));\n                        {\n                            if (((ga[fa].href.indexOf(ha) !== -1))) {\n                                var ia = da[ha].JSBNG__name;\n                                if (da[ha].permanent) {\n                                    l[ia] = true;\n                                }\n                            ;\n                            ;\n                                delete da[ha];\n                                g.registerLoadedStyleSheet(ia, ga[fa]);\n                                ba.done([ia,], true);\n                                break;\n                            }\n                        ;\n                        ;\n                        };\n                    };\n                };\n            ;\n            };\n        ;\n        },\n        loadComponents: function(ca, da) {\n            ca = i(ca);\n            var ea = [], fa = [];\n            for (var ga = 0; ((ga < ca.length)); ga++) {\n                var ha = m[ca[ga]];\n                if (((ha && !ha.module))) {\n                    continue;\n                }\n            ;\n            ;\n                var ia = ((\"legacy:\" + ca[ga]));\n                if (m[ia]) {\n                    ca[ga] = ia;\n                    ea.push(ia);\n                }\n                 else if (((ha && ha.module))) {\n                    ea.push(ca[ga]);\n                    if (!ha.runWhenReady) {\n                        fa.push(ca[ga]);\n                    }\n                ;\n                ;\n                }\n                \n            ;\n            ;\n            };\n        ;\n            y(ca, ((ea.length ? d.bind(null, ea, da) : da)));\n        },\n        loadModules: function(ca, da) {\n            var ea = [], fa = [];\n            for (var ga = 0; ((ga < ca.length)); ga++) {\n                var ha = m[ca[ga]];\n                if (((!ha || ha.module))) {\n                    ea.push(ca[ga]);\n                }\n            ;\n            ;\n            };\n        ;\n            y(ca, d.bind(null, ea, da));\n        },\n        loadResources: function(ca, da, ea, fa) {\n            var ga;\n            ca = aa(i(ca));\n            if (ea) {\n                var ha = {\n                };\n                for (ga = 0; ((ga < ca.length)); ++ga) {\n                    ha[ca[ga].JSBNG__name] = true;\n                ;\n                };\n            ;\n                {\n                    var fin13keys = ((window.top.JSBNG_Replay.forInKeys)((k))), fin13i = (0);\n                    var ia;\n                    for (; (fin13i < fin13keys.length); (fin13i++)) {\n                        ((ia) = (fin13keys[fin13i]));\n                        {\n                            if (((((!((ia in l)) && !((ia in ha)))) && !((ia in r))))) {\n                                x(ia);\n                            }\n                        ;\n                        ;\n                        };\n                    };\n                };\n            ;\n                r = {\n                };\n            }\n        ;\n        ;\n            var ja = [], ka = [];\n            for (ga = 0; ((ga < ca.length)); ++ga) {\n                var la = ca[ga];\n                if (la.permanent) {\n                    l[la.JSBNG__name] = true;\n                }\n            ;\n            ;\n                if (u.isPersistentDependencySatisfied(la.JSBNG__name)) {\n                    continue;\n                }\n            ;\n            ;\n                if (!la.nonblocking) {\n                    ka.push(la.JSBNG__name);\n                }\n            ;\n            ;\n                if (!k[la.JSBNG__name]) {\n                    z(la.JSBNG__name);\n                    ja.push(la);\n                    ((window.CavalryLogger && window.CavalryLogger.getInstance().measureResources(la, fa)));\n                }\n            ;\n            ;\n            };\n        ;\n            var ma;\n            if (da) {\n                if (((typeof da === \"function\"))) {\n                    ma = u.registerCallback(da, ka);\n                }\n                 else ma = u.addDependenciesToExistingCallback(da, ka);\n            ;\n            }\n        ;\n        ;\n            var na = ((JSBNG__document.documentMode || +((/MSIE.(\\d+)/.exec(JSBNG__navigator.userAgent) || []))[1])), oa = ba.getHardpoint(), pa = ((na ? oa : JSBNG__document.createDocumentFragment()));\n            for (ga = 0; ((ga < ja.length)); ++ga) {\n                w(ja[ga].type, ja[ga].src, ja[ga].JSBNG__name, pa);\n            ;\n            };\n        ;\n            if (((oa !== pa))) {\n                oa.appendChild(pa);\n            }\n        ;\n        ;\n            return ma;\n        },\n        requestJSResource: function(ca) {\n            var da = ba.getHardpoint();\n            w(\"js\", ca, null, da);\n        },\n        done: ((window.top.JSBNG_Replay.push)((window.top.JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_190), function(ca, da, ea) {\n            if (ea) {\n                delete p[ea];\n            }\n        ;\n        ;\n            z(ca);\n            if (!da) {\n                for (var fa = 0, ga = v.length; ((fa < ga)); fa++) {\n                    v[fa]();\n                ;\n                };\n            }\n        ;\n        ;\n            for (var ha = 0; ((ha < ca.length)); ++ha) {\n                var ia = ca[ha];\n                if (((ia !== undefined))) {\n                    u.satisfyPersistentDependency(ia);\n                }\n            ;\n            ;\n            };\n        ;\n        })),\n        subscribeToLoadedResources_DEPRECATED: function(ca) {\n            v.push(ca);\n        },\n        enableBootload: function(ca) {\n            {\n                var fin14keys = ((window.top.JSBNG_Replay.forInKeys)((ca))), fin14i = (0);\n                var da;\n                for (; (fin14i < fin14keys.length); (fin14i++)) {\n                    ((da) = (fin14keys[fin14i]));\n                    {\n                        if (!m[da]) {\n                            m[da] = ca[da];\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            if (!s) {\n                s = true;\n                for (var ea = 0; ((ea < t.length)); ea++) {\n                    y.apply(null, t[ea]);\n                ;\n                };\n            ;\n                t = [];\n            }\n        ;\n        ;\n        },\n        getHardpoint: function() {\n            if (!n) {\n                var ca = JSBNG__document.getElementsByTagName(\"head\");\n                n = ((((ca.length && ca[0])) || JSBNG__document.body));\n            }\n        ;\n        ;\n            return n;\n        },\n        setResourceMap: function(ca) {\n            {\n                var fin15keys = ((window.top.JSBNG_Replay.forInKeys)((ca))), fin15i = (0);\n                var da;\n                for (; (fin15i < fin15keys.length); (fin15i++)) {\n                    ((da) = (fin15keys[fin15i]));\n                    {\n                        if (!o[da]) {\n                            ca[da].JSBNG__name = da;\n                            o[da] = ca[da];\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n        },\n        loadEarlyResources: function(ca) {\n            ba.setResourceMap(ca);\n            var da = [];\n            {\n                var fin16keys = ((window.top.JSBNG_Replay.forInKeys)((ca))), fin16i = (0);\n                var ea;\n                for (; (fin16i < fin16keys.length); (fin16i++)) {\n                    ((ea) = (fin16keys[fin16i]));\n                    {\n                        var fa = o[ea];\n                        da.push(fa);\n                        if (!fa.permanent) {\n                            r[fa.JSBNG__name] = fa;\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            ba.loadResources(da);\n        },\n        getLoadingUrls: function() {\n            var ca = {\n            }, da = JSBNG__Date.now();\n            {\n                var fin17keys = ((window.top.JSBNG_Replay.forInKeys)((p))), fin17i = (0);\n                var ea;\n                for (; (fin17i < fin17keys.length); (fin17i++)) {\n                    ((ea) = (fin17keys[fin17i]));\n                    {\n                        ca[ea] = ((da - p[ea]));\n                    ;\n                    };\n                };\n            };\n        ;\n            return ca;\n        },\n        getErrorUrls: function() {\n            return Object.keys(q);\n        }\n    };\n    e.exports = ba;\n});\n__d(\"BlueBarController\", [\"Bootloader\",\"CSS\",], function(a, b, c, d, e, f) {\n    var g = b(\"Bootloader\"), h = b(\"CSS\");\n    f.init = function(i) {\n        if (((\"getBoundingClientRect\" in i))) {\n            var j = function() {\n                var k = i.getBoundingClientRect(), l = ((Math.round(k.JSBNG__top) - JSBNG__document.documentElement.clientTop));\n                h.conditionClass(i.firstChild, \"fixed_elem\", ((l <= 0)));\n            };\n            j();\n            g.loadModules([\"JSBNG__Event\",], function(k) {\n                k.listen(window, \"JSBNG__scroll\", j);\n            });\n        }\n    ;\n    ;\n    };\n});\n__d(\"legacy:arbiter\", [\"Arbiter\",], function(a, b, c, d) {\n    a.Arbiter = b(\"Arbiter\");\n}, 3);\n__d(\"event-form-bubbling\", [], function(a, b, c, d, e, f) {\n    a.JSBNG__Event = ((a.JSBNG__Event || function() {\n    \n    }));\n    a.JSBNG__Event.__inlineSubmit = function(g, JSBNG__event) {\n        var h = ((a.JSBNG__Event.__getHandler && a.JSBNG__Event.__getHandler(g, \"submit\")));\n        return ((h ? null : a.JSBNG__Event.__bubbleSubmit(g, JSBNG__event)));\n    };\n    a.JSBNG__Event.__bubbleSubmit = function(g, JSBNG__event) {\n        if (JSBNG__document.documentElement.JSBNG__attachEvent) {\n            var h;\n            while (((((h !== false)) && (g = g.parentNode)))) {\n                h = ((g.JSBNG__onsubmit ? g.JSBNG__onsubmit(JSBNG__event) : ((a.JSBNG__Event.__fire && a.JSBNG__Event.__fire(g, \"submit\", JSBNG__event)))));\n            ;\n            };\n        ;\n            return h;\n        }\n    ;\n    ;\n    };\n}, 3);\n__d(\"OnloadEvent\", [], function(a, b, c, d, e, f) {\n    var g = {\n        ONLOAD: \"onload/onload\",\n        ONLOAD_CALLBACK: \"onload/onload_callback\",\n        ONLOAD_DOMCONTENT: \"onload/dom_content_ready\",\n        ONLOAD_DOMCONTENT_CALLBACK: \"onload/domcontent_callback\",\n        ONBEFOREUNLOAD: \"onload/beforeunload\",\n        ONUNLOAD: \"onload/unload\"\n    };\n    e.exports = g;\n});\n__d(\"Run\", [\"Arbiter\",\"OnloadEvent\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"OnloadEvent\"), i = \"onunloadhooks\", j = \"onafterunloadhooks\", k = g.BEHAVIOR_STATE;\n    function l(ba) {\n        var ca = a.CavalryLogger;\n        ((ca && ca.getInstance().setTimeStamp(ba)));\n    };\n;\n    function m() {\n        return !window.loading_page_chrome;\n    };\n;\n    function n(ba) {\n        var ca = a.OnloadHooks;\n        if (((window.loaded && ca))) {\n            ca.runHook(ba, \"onlateloadhooks\");\n        }\n         else u(\"onloadhooks\", ba);\n    ;\n    ;\n    };\n;\n    function o(ba) {\n        var ca = a.OnloadHooks;\n        if (((window.afterloaded && ca))) {\n            JSBNG__setTimeout(function() {\n                ca.runHook(ba, \"onlateafterloadhooks\");\n            }, 0);\n        }\n         else u(\"onafterloadhooks\", ba);\n    ;\n    ;\n    };\n;\n    function p(ba, ca) {\n        if (((ca === undefined))) {\n            ca = m();\n        }\n    ;\n    ;\n        ((ca ? u(\"onbeforeleavehooks\", ba) : u(\"onbeforeunloadhooks\", ba)));\n    };\n;\n    function q(ba, ca) {\n        if (!window.JSBNG__onunload) {\n            window.JSBNG__onunload = function() {\n                g.inform(h.ONUNLOAD, true, k);\n            };\n        }\n    ;\n    ;\n        u(ba, ca);\n    };\n;\n    function r(ba) {\n        q(i, ba);\n    };\n;\n    function s(ba) {\n        q(j, ba);\n    };\n;\n    function t(ba) {\n        u(\"onleavehooks\", ba);\n    };\n;\n    function u(ba, ca) {\n        window[ba] = ((window[ba] || [])).concat(ca);\n    };\n;\n    function v(ba) {\n        window[ba] = [];\n    };\n;\n    {\n        function w() {\n            g.inform(h.ONLOAD_DOMCONTENT, true, k);\n        };\n        ((window.top.JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_222.push)((w)));\n    };\n;\n    a._domcontentready = w;\n    function x() {\n        var ba = JSBNG__document, ca = window;\n        if (ba.JSBNG__addEventListener) {\n            var da = /AppleWebKit.(\\d+)/.exec(JSBNG__navigator.userAgent);\n            if (((da && ((da[1] < 525))))) {\n                var ea = JSBNG__setInterval(function() {\n                    if (/loaded|complete/.test(ba.readyState)) {\n                        w();\n                        JSBNG__clearInterval(ea);\n                    }\n                ;\n                ;\n                }, 10);\n            }\n             else ba.JSBNG__addEventListener(\"DOMContentLoaded\", w, true);\n        ;\n        ;\n        }\n         else {\n            var fa = \"javascript:void(0)\";\n            if (((ca.JSBNG__location.protocol == \"https:\"))) {\n                fa = \"//:\";\n            }\n        ;\n        ;\n            ba.write(((((((((\"\\u003Cscript onreadystatechange=\\\"if (this.readyState=='complete') {\" + \"this.parentNode.removeChild(this);_domcontentready();}\\\" \")) + \"defer=\\\"defer\\\" src=\\\"\")) + fa)) + \"\\\"\\u003E\\u003C/script\\u003E\")));\n        }\n    ;\n    ;\n        var ga = ca.JSBNG__onload;\n        ca.JSBNG__onload = ((window.top.JSBNG_Replay.push)((window.top.JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_225), function() {\n            l(\"t_layout\");\n            ((ga && ga()));\n            g.inform(h.ONLOAD, true, k);\n        }));\n        ca.JSBNG__onbeforeunload = ((window.top.JSBNG_Replay.push)((window.top.JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_226), function() {\n            var ha = {\n            };\n            g.inform(h.ONBEFOREUNLOAD, ha, k);\n            if (!ha.warn) {\n                g.inform(\"onload/exit\", true);\n            }\n        ;\n        ;\n            return ha.warn;\n        }));\n    };\n;\n    var y = g.registerCallback(function() {\n        l(\"t_onload\");\n        g.inform(h.ONLOAD_CALLBACK, true, k);\n    }, [h.ONLOAD,]), z = g.registerCallback(function() {\n        l(\"t_domcontent\");\n        var ba = {\n            timeTriggered: JSBNG__Date.now()\n        };\n        g.inform(h.ONLOAD_DOMCONTENT_CALLBACK, ba, k);\n    }, [h.ONLOAD_DOMCONTENT,]);\n    x();\n    var aa = {\n        onLoad: n,\n        onAfterLoad: o,\n        onLeave: t,\n        onBeforeUnload: p,\n        onUnload: r,\n        onAfterUnload: s,\n        __domContentCallback: z,\n        __onloadCallback: y,\n        __removeHook: v\n    };\n    e.exports = aa;\n});\n__d(\"legacy:onload\", [\"Run\",\"OnloadEvent\",], function(a, b, c, d) {\n    var e = b(\"Run\");\n    a.OnloadEvent = b(\"OnloadEvent\");\n    a.onloadRegister_DEPRECATED = e.onLoad;\n    a.onloadRegister = function() {\n        return e.onLoad.apply(this, arguments);\n    };\n    a.onafterloadRegister_DEPRECATED = e.onAfterLoad;\n    a.onafterloadRegister = function() {\n        return e.onAfterLoad.apply(this, arguments);\n    };\n    a.onleaveRegister = e.onLeave;\n    a.onbeforeunloadRegister = e.onBeforeUnload;\n    a.onunloadRegister = e.onUnload;\n}, 3);\n__d(\"wait_for_load\", [\"Bootloader\",\"Run\",], function(a, b, c, d, e, f) {\n    var g = b(\"Bootloader\"), h = b(\"Run\");\n    function i(l, m) {\n        return ((window.loaded && m.call(l)));\n    };\n;\n    function j(l, m, n) {\n        g.loadComponents.call(g, m, n.bind(l));\n        return false;\n    };\n;\n    function k(l, m, n) {\n        n = n.bind(l, m);\n        if (window.loaded) {\n            return n();\n        }\n    ;\n    ;\n        switch (((m || JSBNG__event)).type) {\n          case \"load\":\n        \n          case \"JSBNG__focus\":\n            h.onAfterLoad(n);\n            return;\n          case \"click\":\n            var o = l.style, p = JSBNG__document.body.style;\n            o.cursor = p.cursor = \"progress\";\n            h.onAfterLoad(function() {\n                o.cursor = p.cursor = \"\";\n                if (((l.tagName.toLowerCase() == \"a\"))) {\n                    if (((((false !== n())) && l.href))) {\n                        window.JSBNG__location.href = l.href;\n                    }\n                ;\n                ;\n                }\n                 else if (l.click) {\n                    l.click();\n                }\n                \n            ;\n            ;\n            });\n            break;\n        };\n    ;\n        return false;\n    };\n;\n    a.run_if_loaded = i;\n    a.run_with = j;\n    a.wait_for_load = k;\n}, 3);\n__d(\"markJSEnabled\", [], function(a, b, c, d, e, f) {\n    var g = JSBNG__document.documentElement;\n    g.className = g.className.replace(\"no_js\", \"\");\n});\n__d(\"JSCC\", [], function(a, b, c, d, e, f) {\n    var g = {\n    };\n    function h(j) {\n        var k, l = false;\n        return function() {\n            if (!l) {\n                k = j();\n                l = true;\n            }\n        ;\n        ;\n            return k;\n        };\n    };\n;\n    var i = {\n        get: function(j) {\n            if (!g[j]) {\n                throw new Error(\"JSCC entry is missing\");\n            }\n        ;\n        ;\n            return g[j]();\n        },\n        init: function(j) {\n            {\n                var fin18keys = ((window.top.JSBNG_Replay.forInKeys)((j))), fin18i = (0);\n                var k;\n                for (; (fin18i < fin18keys.length); (fin18i++)) {\n                    ((k) = (fin18keys[fin18i]));\n                    {\n                        g[k] = h(j[k]);\n                    ;\n                    };\n                };\n            };\n        ;\n            return function l() {\n                {\n                    var fin19keys = ((window.top.JSBNG_Replay.forInKeys)((j))), fin19i = (0);\n                    var m;\n                    for (; (fin19i < fin19keys.length); (fin19i++)) {\n                        ((m) = (fin19keys[fin19i]));\n                        {\n                            delete g[m];\n                        ;\n                        };\n                    };\n                };\n            ;\n            };\n        }\n    };\n    e.exports = i;\n});\n__d(\"PageletSet\", [\"Arbiter\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"copyProperties\"), i = {\n    }, j = {\n        hasPagelet: function(m) {\n            return i.hasOwnProperty(m);\n        },\n        getPagelet: function(m) {\n            return i[m];\n        },\n        getOrCreatePagelet: function(m) {\n            if (!j.hasPagelet(m)) {\n                var n = new l(m);\n                i[m] = n;\n            }\n        ;\n        ;\n            return j.getPagelet(m);\n        },\n        getPageletIDs: function() {\n            return Object.keys(i);\n        },\n        removePagelet: function(m) {\n            if (j.hasPagelet(m)) {\n                i[m].destroy();\n                delete i[m];\n            }\n        ;\n        ;\n        }\n    };\n    function k(m, n) {\n        return ((m.contains ? m.contains(n) : ((m.compareDocumentPosition(n) & 16))));\n    };\n;\n    function l(m) {\n        this.id = m;\n        this._root = null;\n        this._destructors = [];\n        this.addDestructor(function n() {\n            g.inform(\"pagelet/destroy\", {\n                id: this.id,\n                root: this._root\n            });\n        }.bind(this));\n    };\n;\n    h(l.prototype, {\n        setRoot: function(m) {\n            this._root = m;\n        },\n        _getDescendantPagelets: function() {\n            var m = [];\n            if (!this._root) {\n                return m;\n            }\n        ;\n        ;\n            var n = j.getPageletIDs();\n            for (var o = 0; ((o < n.length)); o++) {\n                var p = n[o];\n                if (((p === this.id))) {\n                    continue;\n                }\n            ;\n            ;\n                var q = i[p];\n                if (((q._root && k(this._root, q._root)))) {\n                    m.push(q);\n                }\n            ;\n            ;\n            };\n        ;\n            return m;\n        },\n        addDestructor: function(m) {\n            this._destructors.push(m);\n        },\n        destroy: function() {\n            var m = this._getDescendantPagelets();\n            for (var n = 0; ((n < m.length)); n++) {\n                var o = m[n];\n                if (j.hasPagelet(o.id)) {\n                    j.removePagelet(o.id);\n                }\n            ;\n            ;\n            };\n        ;\n            for (n = 0; ((n < this._destructors.length)); n++) {\n                this._destructors[n]();\n            ;\n            };\n        ;\n            if (this._root) {\n                while (this._root.firstChild) {\n                    this._root.removeChild(this._root.firstChild);\n                ;\n                };\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = j;\n});\n__d(\"repeatString\", [\"invariant\",], function(a, b, c, d, e, f) {\n    var g = b(\"invariant\");\n    function h(i, j) {\n        if (((j === 1))) {\n            return i;\n        }\n    ;\n    ;\n        g(((j >= 0)));\n        var k = \"\";\n        while (j) {\n            if (((j & 1))) {\n                k += i;\n            }\n        ;\n        ;\n            if ((j >>= 1)) {\n                i += i;\n            }\n        ;\n        ;\n        };\n    ;\n        return k;\n    };\n;\n    e.exports = h;\n});\n__d(\"BitMap\", [\"copyProperties\",\"repeatString\",], function(a, b, c, d, e, f) {\n    var g = b(\"copyProperties\"), h = b(\"repeatString\"), i = \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-_\";\n    function j() {\n        this._bits = [];\n    };\n;\n    g(j.prototype, {\n        set: function(m) {\n            this._bits[m] = 1;\n            return this;\n        },\n        toString: function() {\n            var m = [];\n            for (var n = 0; ((n < this._bits.length)); n++) {\n                m.push(((this._bits[n] ? 1 : 0)));\n            ;\n            };\n        ;\n            return ((m.length ? l(m.join(\"\")) : \"\"));\n        },\n        toCompressedString: function() {\n            if (((this._bits.length === 0))) {\n                return \"\";\n            }\n        ;\n        ;\n            var m = [], n = 1, o = ((this._bits[0] || 0)), p = o.toString(2);\n            for (var q = 1; ((q < this._bits.length)); q++) {\n                var r = ((this._bits[q] || 0));\n                if (((r === o))) {\n                    n++;\n                }\n                 else {\n                    m.push(k(n));\n                    o = r;\n                    n = 1;\n                }\n            ;\n            ;\n            };\n        ;\n            if (n) {\n                m.push(k(n));\n            }\n        ;\n        ;\n            return l(((p + m.join(\"\"))));\n        }\n    });\n    function k(m) {\n        var n = m.toString(2), o = h(\"0\", ((n.length - 1)));\n        return ((o + n));\n    };\n;\n    function l(m) {\n        var n = ((m + \"00000\")).match(/[01]{6}/g), o = \"\";\n        for (var p = 0; ((p < n.length)); p++) {\n            o += i[parseInt(n[p], 2)];\n        ;\n        };\n    ;\n        return o;\n    };\n;\n    e.exports = j;\n});\n__d(\"ServerJS\", [\"BitMap\",\"ErrorUtils\",\"copyProperties\",\"ge\",], function(a, b, c, d, e, f) {\n    var g = b(\"BitMap\"), h = b(\"ErrorUtils\"), i = b(\"copyProperties\"), j = b(\"ge\"), k = 0, l = new g();\n    function m() {\n        this._moduleMap = {\n        };\n        this._relativeTo = null;\n        this._moduleIDsToCleanup = {\n        };\n    };\n;\n    m.getLoadedModuleHash = function() {\n        return l.toCompressedString();\n    };\n    i(m.prototype, {\n        handle: function(q) {\n            if (q.__guard) {\n                throw new Error(\"ServerJS.handle called on data that has already been handled\");\n            }\n        ;\n        ;\n            q.__guard = true;\n            n(((q.define || [])), this._handleDefine, this);\n            n(((q.markup || [])), this._handleMarkup, this);\n            n(((q.elements || [])), this._handleElement, this);\n            n(((q.instances || [])), this._handleInstance, this);\n            var r = n(((q.require || [])), this._handleRequire, this);\n            return {\n                cancel: function() {\n                    for (var s = 0; ((s < r.length)); s++) {\n                        if (r[s]) {\n                            r[s].cancel();\n                        }\n                    ;\n                    ;\n                    };\n                ;\n                }\n            };\n        },\n        handlePartial: function(q) {\n            ((q.instances || [])).forEach(o.bind(null, this._moduleMap, 3));\n            ((q.markup || [])).forEach(o.bind(null, this._moduleMap, 2));\n            return this.handle(q);\n        },\n        setRelativeTo: function(q) {\n            this._relativeTo = q;\n            return this;\n        },\n        cleanup: function() {\n            var q = [];\n            {\n                var fin20keys = ((window.top.JSBNG_Replay.forInKeys)((this._moduleMap))), fin20i = (0);\n                var r;\n                for (; (fin20i < fin20keys.length); (fin20i++)) {\n                    ((r) = (fin20keys[fin20i]));\n                    {\n                        q.push(r);\n                    ;\n                    };\n                };\n            };\n        ;\n            d.call(null, q, p);\n            this._moduleMap = {\n            };\n            function s(u) {\n                var v = this._moduleIDsToCleanup[u], w = v[0], x = v[1];\n                delete this._moduleIDsToCleanup[u];\n                var y = ((x ? ((((((((\"JS::call(\\\"\" + w)) + \"\\\", \\\"\")) + x)) + \"\\\", ...)\")) : ((((\"JS::requireModule(\\\"\" + w)) + \"\\\")\")))), z = ((y + \" did not fire because it has missing dependencies.\"));\n                throw new Error(z);\n            };\n        ;\n            {\n                var fin21keys = ((window.top.JSBNG_Replay.forInKeys)((this._moduleIDsToCleanup))), fin21i = (0);\n                var t;\n                for (; (fin21i < fin21keys.length); (fin21i++)) {\n                    ((t) = (fin21keys[fin21i]));\n                    {\n                        h.applyWithGuard(s, this, [t,]);\n                    ;\n                    };\n                };\n            };\n        ;\n        },\n        _handleDefine: function(q, r, s, t) {\n            if (((t >= 0))) {\n                l.set(t);\n            }\n        ;\n        ;\n            define(q, r, function() {\n                this._replaceTransportMarkers(s);\n                return s;\n            }.bind(this));\n        },\n        _handleRequire: function(q, r, s, t) {\n            var u = [q,].concat(((s || []))), v = ((((r ? \"__call__\" : \"__requireModule__\")) + k++));\n            this._moduleIDsToCleanup[v] = [q,r,];\n            return define(v, u, ((window.top.JSBNG_Replay.push)((window.top.JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_278), function(w) {\n                delete this._moduleIDsToCleanup[v];\n                ((t && this._replaceTransportMarkers(t)));\n                if (r) {\n                    if (!w[r]) {\n                        throw new TypeError(((((((\"Module \" + q)) + \" has no method \")) + r)));\n                    }\n                ;\n                ;\n                    w[r].apply(w, ((t || [])));\n                }\n            ;\n            ;\n            })), 1, this, 1);\n        },\n        _handleInstance: function(q, r, s, t) {\n            var u = null;\n            if (r) {\n                u = function(v) {\n                    this._replaceTransportMarkers(s);\n                    var w = Object.create(v.prototype);\n                    v.apply(w, s);\n                    return w;\n                }.bind(this);\n            }\n        ;\n        ;\n            define(q, r, u, 0, null, t);\n        },\n        _handleMarkup: function(q, r, s) {\n            define(q, [\"HTML\",], function(t) {\n                return t.replaceJSONWrapper(r).getRootNode();\n            }, 0, null, s);\n        },\n        _handleElement: function(q, r, s, t) {\n            var u = [], v = 0;\n            if (t) {\n                u.push(t);\n                v = 1;\n                s++;\n            }\n        ;\n        ;\n            define(q, u, function(w) {\n                var x = j(r, w);\n                if (!x) {\n                    var y = ((\"Could not find element \" + r));\n                    throw new Error(y);\n                }\n            ;\n            ;\n                return x;\n            }, v, null, s);\n        },\n        _replaceTransportMarkers: function(q, r) {\n            var s = ((((typeof r !== \"undefined\")) ? q[r] : q)), t;\n            if (Array.isArray(s)) {\n                for (t = 0; ((t < s.length)); t++) {\n                    this._replaceTransportMarkers(s, t);\n                ;\n                };\n            ;\n            }\n             else if (((s && ((typeof s == \"object\"))))) {\n                if (s.__m) {\n                    q[r] = b.call(null, s.__m);\n                }\n                 else if (s.__e) {\n                    q[r] = j(s.__e);\n                }\n                 else if (s.__rel) {\n                    q[r] = this._relativeTo;\n                }\n                 else {\n                    var fin22keys = ((window.top.JSBNG_Replay.forInKeys)((s))), fin22i = (0);\n                    var u;\n                    for (; (fin22i < fin22keys.length); (fin22i++)) {\n                        ((u) = (fin22keys[fin22i]));\n                        {\n                            this._replaceTransportMarkers(s, u);\n                        ;\n                        };\n                    };\n                }\n                \n                \n            ;\n            }\n            \n        ;\n        ;\n        }\n    });\n    function n(q, r, s) {\n        return q.map(function(t) {\n            return h.applyWithGuard(r, s, t);\n        });\n    };\n;\n    function o(q, r, s) {\n        var t = s[0];\n        if (!((t in q))) {\n            s[r] = ((((s[r] || 0)) + 1));\n        }\n    ;\n    ;\n        q[t] = true;\n    };\n;\n    function p() {\n        return {\n        };\n    };\n;\n    e.exports = m;\n});\n__d(\"invokeCallbacks\", [\"ErrorUtils\",], function(a, b, c, d, e, f) {\n    var g = b(\"ErrorUtils\");\n    function h(i, j) {\n        if (i) {\n            for (var k = 0; ((k < i.length)); k++) {\n                g.applyWithGuard(new Function(i[k]), j);\n            ;\n            };\n        }\n    ;\n    ;\n    };\n;\n    e.exports = h;\n});\n__d(\"ix\", [\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"copyProperties\"), h = {\n    };\n    function i(j) {\n        return h[j];\n    };\n;\n    i.add = g.bind(null, h);\n    e.exports = i;\n});\n__d(\"BigPipe\", [\"Arbiter\",\"Bootloader\",\"Env\",\"ErrorUtils\",\"JSCC\",\"OnloadEvent\",\"PageletSet\",\"Run\",\"ServerJS\",\"$\",\"copyProperties\",\"ge\",\"invokeCallbacks\",\"ix\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"Bootloader\"), i = b(\"Env\"), j = b(\"ErrorUtils\"), k = b(\"JSCC\"), l = b(\"OnloadEvent\"), m = b(\"PageletSet\"), n = b(\"Run\"), o = b(\"ServerJS\"), p = b(\"$\"), q = b(\"copyProperties\"), r = b(\"ge\"), s = b(\"invokeCallbacks\"), t = b(\"ix\"), u = ((JSBNG__document.documentMode || +((/MSIE.(\\d+)/.exec(JSBNG__navigator.userAgent) || []))[1])), v = g.BEHAVIOR_STATE, w = g.BEHAVIOR_PERSISTENT;\n    function x(ba) {\n        q(this, {\n            arbiter: g,\n            rootNodeID: \"JSBNG__content\",\n            lid: 0,\n            isAjax: false,\n            domContentCallback: n.__domContentCallback,\n            onloadCallback: n.__onloadCallback,\n            domContentEvt: l.ONLOAD_DOMCONTENT_CALLBACK,\n            onloadEvt: l.ONLOAD_CALLBACK,\n            forceFinish: false,\n            _phaseDoneCallbacks: [],\n            _currentPhase: 0,\n            _lastPhase: -1,\n            _livePagelets: {\n            }\n        });\n        q(this, ba);\n        if (this.automatic) {\n            this._relevant_instance = x._current_instance;\n        }\n         else x._current_instance = this;\n    ;\n    ;\n        this._serverJS = new o();\n        g.inform(\"BigPipe/init\", {\n            lid: this.lid,\n            arbiter: this.arbiter\n        }, w);\n        this.arbiter.registerCallback(this.domContentCallback, [\"pagelet_displayed_all\",]);\n        this._informEventExternal(\"phase_begin\", {\n            phase: 0\n        });\n        this.arbiter.inform(\"phase_begin_0\", true, v);\n        this.onloadCallback = this.arbiter.registerCallback(this.onloadCallback, [\"pagelet_displayed_all\",]);\n        this.arbiter.registerCallback(this._serverJS.cleanup.bind(this._serverJS), [this.onloadEvt,]);\n    };\n;\n    x.getCurrentInstance = function() {\n        return x._current_instance;\n    };\n    q(x.prototype, {\n        onPageletArrive: j.guard(function(ba) {\n            this._informPageletEvent(\"arrive\", ba.id, ba.phase);\n            ba.JSBNG__content = ((ba.JSBNG__content || {\n            }));\n            var ca = ba.phase;\n            if (!this._phaseDoneCallbacks[ca]) {\n                this._phaseDoneCallbacks[ca] = this.arbiter.registerCallback(this._onPhaseDone.bind(this), [((\"phase_complete_\" + ca)),]);\n            }\n        ;\n        ;\n            this.arbiter.registerCallback(this._phaseDoneCallbacks[ca], [((ba.id + \"_displayed\")),]);\n            var da = this._getPageletRootID(ba), ea = m.getOrCreatePagelet(da);\n            if (ba.the_end) {\n                this._lastPhase = ca;\n            }\n        ;\n        ;\n            if (((ba.tti_phase !== undefined))) {\n                this._ttiPhase = ba.tti_phase;\n            }\n        ;\n        ;\n            if (ba.is_second_to_last_phase) {\n                this._secondToLastPhase = ca;\n            }\n        ;\n        ;\n            this._livePagelets[ea.id] = true;\n            ea.addDestructor(function() {\n                delete this._livePagelets[ea.id];\n            }.bind(this));\n            if (ba.jscc_map) {\n                var fa = (eval)(ba.jscc_map), ga = k.init(fa);\n                ea.addDestructor(ga);\n            }\n        ;\n        ;\n            if (ba.resource_map) {\n                h.setResourceMap(ba.resource_map);\n            }\n        ;\n        ;\n            if (ba.bootloadable) {\n                h.enableBootload(ba.bootloadable);\n            }\n        ;\n        ;\n            t.add(ba.ixData);\n            this._informPageletEvent(\"setup\", ba.id);\n            var ha = new g();\n            ha.registerCallback(this._displayPageletHandler.bind(this, ba), [\"preceding_pagelets_displayed\",\"display_resources_downloaded\",]);\n            var ia = ((ba.display_dependency || [])), ja = ia.map(function(la) {\n                return ((la + \"_displayed\"));\n            });\n            this.arbiter.registerCallback(function() {\n                ha.inform(\"preceding_pagelets_displayed\");\n            }, ja);\n            this.arbiter.registerCallback(function() {\n                this._informPageletEvent(\"css\", ba.id);\n                var la = ((ba.css || [])).concat(((ba.displayJS || [])));\n                h.loadResources(la, function() {\n                    this._informPageletEvent(\"css_load\", ba.id);\n                    ha.inform(\"display_resources_downloaded\");\n                }.bind(this), false, ba.id);\n            }.bind(this), [((\"phase_begin_\" + ca)),]);\n            this.arbiter.registerCallback(this.onloadCallback, [\"pagelet_onload\",]);\n            var ka = [((ba.id + \"_displayed\")),];\n            if (!this.jsNonBlock) {\n                ka.push(this.domContentEvt);\n            }\n        ;\n        ;\n            this.arbiter.registerCallback(this._downloadJsForPagelet.bind(this, ba), ka);\n            if (ba.is_last) {\n                this._endPhase(ca);\n            }\n        ;\n        ;\n        }),\n        _beginPhase: function(ba) {\n            this._informEventExternal(\"phase_begin\", {\n                phase: ba\n            });\n            this.arbiter.inform(((\"phase_begin_\" + ba)), true, v);\n        },\n        _endPhase: function(ba) {\n            this.arbiter.inform(((\"phase_complete_\" + ba)), true, v);\n        },\n        _displayPageletHandler: function(ba) {\n            if (this.displayCallback) {\n                this.displayCallback(this._displayPagelet.bind(this, ba));\n            }\n             else this._displayPagelet(ba);\n        ;\n        ;\n        },\n        _displayPagelet: function(ba) {\n            this._informPageletEvent(\"display_start\", ba.id);\n            var ca = this._getPagelet(ba);\n            {\n                var fin23keys = ((window.top.JSBNG_Replay.forInKeys)((ba.JSBNG__content))), fin23i = (0);\n                var da;\n                for (; (fin23i < fin23keys.length); (fin23i++)) {\n                    ((da) = (fin23keys[fin23i]));\n                    {\n                        var ea = ba.JSBNG__content[da];\n                        if (ba.append) {\n                            da = this._getPageletRootID(ba);\n                        }\n                    ;\n                    ;\n                        var fa = r(da);\n                        if (!fa) {\n                            continue;\n                        }\n                    ;\n                    ;\n                        if (((da === ca.id))) {\n                            ca.setRoot(fa);\n                        }\n                    ;\n                    ;\n                        ea = y(ea);\n                        if (ea) {\n                            if (((ba.append || ((u < 8))))) {\n                                if (!ba.append) {\n                                    while (fa.firstChild) {\n                                        fa.removeChild(fa.firstChild);\n                                    ;\n                                    };\n                                }\n                            ;\n                            ;\n                                aa(fa, ea);\n                            }\n                             else fa.innerHTML = ea;\n                        ;\n                        }\n                    ;\n                    ;\n                        var ga = fa.getAttribute(\"data-referrer\");\n                        if (!ga) {\n                            fa.setAttribute(\"data-referrer\", da);\n                        }\n                    ;\n                    ;\n                        if (((ba.cache_hit && i.pc_debug))) {\n                            fa.style.border = \"1px red solid\";\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            if (ba.jsmods) {\n                var ha = JSON.parse(JSON.stringify(ba.jsmods)), ia = this._serverJS.handlePartial(ha);\n                ca.addDestructor(ia.cancel.bind(ia));\n            }\n        ;\n        ;\n            this._informPageletEvent(\"display\", ba.id);\n            this.arbiter.inform(((ba.id + \"_displayed\")), true, v);\n        },\n        _onPhaseDone: function() {\n            if (((this._currentPhase === this._ttiPhase))) {\n                this._informEventExternal(\"tti_bigpipe\", {\n                    phase: this._ttiPhase\n                });\n            }\n        ;\n        ;\n            if (((((this._currentPhase === this._lastPhase)) && this._isRelevant()))) {\n                this.arbiter.inform(\"pagelet_displayed_all\", true, v);\n            }\n        ;\n        ;\n            this._currentPhase++;\n            if (((u <= 8))) {\n                JSBNG__setTimeout(this._beginPhase.bind(this, this._currentPhase), 20);\n            }\n             else this._beginPhase(this._currentPhase);\n        ;\n        ;\n        },\n        _downloadJsForPagelet: function(ba) {\n            this._informPageletEvent(\"jsstart\", ba.id);\n            h.loadResources(((ba.js || [])), function() {\n                this._informPageletEvent(\"jsdone\", ba.id);\n                ba.requires = ((ba.requires || []));\n                if (((!this.isAjax || ((ba.phase >= 1))))) {\n                    ba.requires.push(\"uipage_onload\");\n                }\n            ;\n            ;\n                var ca = function() {\n                    this._informPageletEvent(\"preonload\", ba.id);\n                    if (this._isRelevantPagelet(ba)) {\n                        s(ba.JSBNG__onload);\n                    }\n                ;\n                ;\n                    this._informPageletEvent(\"JSBNG__onload\", ba.id);\n                    this.arbiter.inform(\"pagelet_onload\", true, g.BEHAVIOR_EVENT);\n                    ((ba.provides && this.arbiter.inform(ba.provides, true, v)));\n                }.bind(this), da = function() {\n                    ((this._isRelevantPagelet(ba) && s(ba.onafterload)));\n                }.bind(this);\n                this.arbiter.registerCallback(ca, ba.requires);\n                this.arbiter.registerCallback(da, [this.onloadEvt,]);\n            }.bind(this), false, ba.id);\n        },\n        _getPagelet: function(ba) {\n            var ca = this._getPageletRootID(ba);\n            return m.getPagelet(ca);\n        },\n        _getPageletRootID: function(ba) {\n            var ca = ba.append;\n            if (ca) {\n                return ((((ca === \"bigpipe_root\")) ? this.rootNodeID : ca));\n            }\n        ;\n        ;\n            return ((Object.keys(ba.JSBNG__content)[0] || null));\n        },\n        _isRelevant: function() {\n            return ((((((((this == x._current_instance)) || ((this.automatic && ((this._relevant_instance == x._current_instance)))))) || this.jsNonBlock)) || this.forceFinish));\n        },\n        _isRelevantPagelet: function(ba) {\n            if (!this._isRelevant()) {\n                return false;\n            }\n        ;\n        ;\n            var ca = this._getPageletRootID(ba);\n            return !!this._livePagelets[ca];\n        },\n        _informEventExternal: function(ba, ca) {\n            ca = ((ca || {\n            }));\n            ca.ts = JSBNG__Date.now();\n            ca.lid = this.lid;\n            this.arbiter.inform(ba, ca, w);\n        },\n        _informPageletEvent: function(ba, ca, da) {\n            var ea = {\n                JSBNG__event: ba,\n                id: ca\n            };\n            if (da) {\n                ea.phase = da;\n            }\n        ;\n        ;\n            this._informEventExternal(\"pagelet_event\", ea);\n        }\n    });\n    function y(ba) {\n        if (((!ba || ((typeof ba === \"string\"))))) {\n            return ba;\n        }\n    ;\n    ;\n        if (ba.container_id) {\n            var ca = p(ba.container_id);\n            ba = ((z(ca) || \"\"));\n            ca.parentNode.removeChild(ca);\n            return ba;\n        }\n    ;\n    ;\n        return null;\n    };\n;\n    function z(ba) {\n        if (!ba.firstChild) {\n            h.loadModules([\"ErrorSignal\",], function(da) {\n                da.sendErrorSignal(\"bigpipe\", \"Pagelet markup container is empty.\");\n            });\n            return null;\n        }\n    ;\n    ;\n        if (((ba.firstChild.nodeType !== 8))) {\n            return null;\n        }\n    ;\n    ;\n        var ca = ba.firstChild.nodeValue;\n        ca = ca.substring(1, ((ca.length - 1)));\n        return ca.replace(/\\\\([\\s\\S]|$)/g, \"$1\");\n    };\n;\n    function aa(ba, ca) {\n        var da = JSBNG__document.createElement(\"div\"), ea = ((u < 7));\n        if (ea) {\n            ba.appendChild(da);\n        }\n    ;\n    ;\n        da.innerHTML = ca;\n        var fa = JSBNG__document.createDocumentFragment();\n        while (da.firstChild) {\n            fa.appendChild(da.firstChild);\n        ;\n        };\n    ;\n        ba.appendChild(fa);\n        if (ea) {\n            ba.removeChild(da);\n        }\n    ;\n    ;\n    };\n;\n    e.exports = x;\n});\n__d(\"legacy:bootloader\", [\"Bootloader\",], function(a, b, c, d) {\n    a.Bootloader = b(\"Bootloader\");\n}, 3);\n__d(\"Class\", [\"CallbackDependencyManager\",\"Bootloader\",], function(a, b, c, d, e, f) {\n    var g = b(\"CallbackDependencyManager\"), h = b(\"Bootloader\"), i = \"bootload_done\", j = false, k = new g(), l = {\n    }, m = {\n        extend: function(u, v) {\n            if (!j) {\n                h.subscribeToLoadedResources_DEPRECATED(o);\n                j = true;\n            }\n        ;\n        ;\n            if (((typeof v == \"string\"))) {\n                n(u, v);\n            }\n             else p(u, v);\n        ;\n        ;\n        }\n    };\n    function n(u, v) {\n        u.__class_extending = true;\n        var w = k.registerCallback(p.bind(null, u, v), [v,i,]);\n        if (((w !== null))) {\n            l[v] = true;\n        }\n    ;\n    ;\n    };\n;\n    function o() {\n        k.satisfyNonPersistentDependency(i);\n        {\n            var fin24keys = ((window.top.JSBNG_Replay.forInKeys)((l))), fin24i = (0);\n            var u;\n            for (; (fin24i < fin24keys.length); (fin24i++)) {\n                ((u) = (fin24keys[fin24i]));\n                {\n                    if (!!a[u]) {\n                        delete l[u];\n                        if (!a[u].__class_extending) {\n                            k.satisfyNonPersistentDependency(u);\n                        }\n                         else a[u].__class_name = u;\n                    ;\n                    ;\n                    }\n                ;\n                ;\n                };\n            };\n        };\n    ;\n    };\n;\n    function p(u, v) {\n        delete u.__class_extending;\n        v = ((((typeof v == \"string\")) ? a[v] : v));\n        var w = q(v, 0), x = q(u, ((w.prototype.__level + 1)));\n        x.parent = w;\n        if (!!u.__class_name) {\n            k.satisfyNonPersistentDependency(u.__class_name);\n        }\n    ;\n    ;\n    };\n;\n    function q(u, v) {\n        if (u._metaprototype) {\n            return u._metaprototype;\n        }\n    ;\n    ;\n        var w = new Function();\n        w.construct = r;\n        w.prototype.construct = t(u, v, true);\n        w.prototype.__level = v;\n        w.base = u;\n        u.prototype.parent = w;\n        u._metaprototype = w;\n        return w;\n    };\n;\n    function r(u) {\n        s(u.parent);\n        var v = [], w = u;\n        while (w.parent) {\n            var x = new w.parent();\n            v.push(x);\n            x.__instance = u;\n            w = w.parent;\n        };\n    ;\n        u.parent = v[1];\n        v.reverse();\n        v.pop();\n        u.__parents = v;\n        u.__instance = u;\n        return u.parent.construct.apply(u.parent, arguments);\n    };\n;\n    function s(u) {\n        if (u.initialized) {\n            return;\n        }\n    ;\n    ;\n        var v = u.base.prototype;\n        if (u.parent) {\n            s(u.parent);\n            var w = u.parent.prototype;\n            {\n                var fin25keys = ((window.top.JSBNG_Replay.forInKeys)((w))), fin25i = (0);\n                var x;\n                for (; (fin25i < fin25keys.length); (fin25i++)) {\n                    ((x) = (fin25keys[fin25i]));\n                    {\n                        if (((((((x != \"__level\")) && ((x != \"construct\")))) && ((v[x] === undefined))))) {\n                            v[x] = u.prototype[x] = w[x];\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n        }\n    ;\n    ;\n        u.initialized = true;\n        var y = u.prototype.__level;\n        {\n            var fin26keys = ((window.top.JSBNG_Replay.forInKeys)((v))), fin26i = (0);\n            var x;\n            for (; (fin26i < fin26keys.length); (fin26i++)) {\n                ((x) = (fin26keys[fin26i]));\n                {\n                    if (((x != \"parent\"))) {\n                        v[x] = u.prototype[x] = t(v[x], y);\n                    }\n                ;\n                ;\n                };\n            };\n        };\n    ;\n    };\n;\n    function t(u, v, w) {\n        if (((((typeof u != \"function\")) || u.__prototyped))) {\n            return u;\n        }\n    ;\n    ;\n        var x = function() {\n            var y = this.__instance;\n            if (y) {\n                var z = y.parent;\n                y.parent = ((v ? y.__parents[((v - 1))] : null));\n                var aa = arguments;\n                if (w) {\n                    aa = [];\n                    for (var ba = 1; ((ba < arguments.length)); ba++) {\n                        aa.push(arguments[ba]);\n                    ;\n                    };\n                ;\n                }\n            ;\n            ;\n                var ca = u.apply(y, aa);\n                y.parent = z;\n                return ca;\n            }\n             else return u.apply(this, arguments)\n        ;\n        };\n        x.__prototyped = true;\n        return x;\n    };\n;\n    e.exports = m;\n});\n__d(\"legacy:Class\", [\"Class\",], function(a, b, c, d) {\n    a.Class = b(\"Class\");\n}, 3);\n__d(\"legacy:constructor-cache\", [\"JSCC\",], function(a, b, c, d) {\n    a.JSCC = b(\"JSCC\");\n}, 3);\n__d(\"function-extensions\", [\"createArrayFrom\",], function(a, b, c, d, e, f) {\n    var g = b(\"createArrayFrom\");\n    Function.prototype.curry = function() {\n        var h = g(arguments);\n        return this.bind.apply(this, [null,].concat(h));\n    };\n    Function.prototype.defer = function(h, i) {\n        if (((typeof this != \"function\"))) {\n            throw new TypeError();\n        }\n    ;\n    ;\n        h = ((h || 0));\n        return JSBNG__setTimeout(this, h, i);\n    };\n}, 3);\n__d(\"goURI\", [], function(a, b, c, d, e, f) {\n    function g(h, i, j) {\n        h = h.toString();\n        if (((((!i && a.PageTransitions)) && PageTransitions.isInitialized()))) {\n            PageTransitions.go(h, j);\n        }\n         else if (((window.JSBNG__location.href == h))) {\n            window.JSBNG__location.reload();\n        }\n         else window.JSBNG__location.href = h;\n        \n    ;\n    ;\n    };\n;\n    e.exports = g;\n});\n__d(\"legacy:goURI\", [\"goURI\",], function(a, b, c, d) {\n    a.goURI = b(\"goURI\");\n}, 3);\n__d(\"InitialJSLoader\", [\"Arbiter\",\"Bootloader\",\"OnloadEvent\",\"Run\",\"ServerJS\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"Bootloader\"), i = b(\"OnloadEvent\"), j = b(\"Run\"), k = b(\"ServerJS\"), l = {\n        INITIAL_JS_READY: \"BOOTLOAD/JSREADY\",\n        loadOnDOMContentReady: function(m, n) {\n            g.subscribe(i.ONLOAD_DOMCONTENT_CALLBACK, function() {\n                function o() {\n                    h.loadResources(m, function() {\n                        g.inform(l.INITIAL_JS_READY, true, g.BEHAVIOR_STATE);\n                    });\n                };\n            ;\n                if (n) {\n                    JSBNG__setTimeout(o, n);\n                }\n                 else o();\n            ;\n            ;\n            });\n        },\n        handleServerJS: function(m) {\n            var n = new k();\n            n.handle(m);\n            j.onAfterLoad(n.cleanup.bind(n));\n        }\n    };\n    e.exports = l;\n});\n__d(\"lowerDomain\", [], function(a, b, c, d, e, f) {\n    if (JSBNG__document.domain.toLowerCase().match(/(^|\\.)facebook\\..*/)) {\n        JSBNG__document.domain = \"facebook.com\";\n    }\n;\n;\n});\n__d(\"legacy:object-core-utils\", [\"isEmpty\",\"copyProperties\",], function(a, b, c, d) {\n    a.is_empty = b(\"isEmpty\");\n    a.copyProperties = b(\"copyProperties\");\n}, 3);\n__d(\"PlaceholderListener\", [\"Arbiter\",\"CSS\",\"Parent\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"CSS\"), i = b(\"Parent\"), j = JSBNG__document.documentElement, k = function(m) {\n        m = ((m || window.JSBNG__event));\n        var n = ((m.target || m.srcElement));\n        if (n.getAttribute(\"data-silentPlaceholderListener\")) {\n            return;\n        }\n    ;\n    ;\n        var o = n.getAttribute(\"placeholder\");\n        if (o) {\n            var p = i.byClass(n, \"focus_target\");\n            if (((((\"JSBNG__focus\" == m.type)) || ((\"focusin\" == m.type))))) {\n                var q = n.value.replace(/\\r\\n/g, \"\\u000a\"), r = o.replace(/\\r\\n/g, \"\\u000a\");\n                if (((((q == r)) && h.hasClass(n, \"DOMControl_placeholder\")))) {\n                    n.value = \"\";\n                    h.removeClass(n, \"DOMControl_placeholder\");\n                }\n            ;\n            ;\n                if (p) {\n                    l.expandInput(p);\n                }\n            ;\n            ;\n            }\n             else {\n                if (((n.value === \"\"))) {\n                    h.addClass(n, \"DOMControl_placeholder\");\n                    n.value = o;\n                    ((p && h.removeClass(p, \"child_is_active\")));\n                    n.style.direction = \"\";\n                }\n            ;\n            ;\n                ((p && h.removeClass(p, \"child_is_focused\")));\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n    };\n    if (j.JSBNG__addEventListener) {\n        j.JSBNG__addEventListener(\"JSBNG__focus\", k, true);\n        j.JSBNG__addEventListener(\"JSBNG__blur\", k, true);\n    }\n     else {\n        j.JSBNG__attachEvent(\"onfocusin\", k);\n        j.JSBNG__attachEvent(\"onfocusout\", k);\n    }\n;\n;\n    var l = {\n        expandInput: function(m) {\n            h.addClass(m, \"child_is_active\");\n            h.addClass(m, \"child_is_focused\");\n            h.addClass(m, \"child_was_focused\");\n            g.inform(\"reflow\");\n        }\n    };\n    e.exports = l;\n});\n__d(\"clickRefAction\", [\"Arbiter\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\");\n    function h(l, m, n, o, p) {\n        var q = ((((l + \"/\")) + m));\n        this.ue = q;\n        this._ue_ts = l;\n        this._ue_count = m;\n        this._context = n;\n        this._ns = null;\n        this._node = o;\n        this._type = p;\n    };\n;\n    h.prototype.set_namespace = function(l) {\n        this._ns = l;\n        return this;\n    };\n    h.prototype.coalesce_namespace = function(l) {\n        if (((this._ns === null))) {\n            this._ns = l;\n        }\n    ;\n    ;\n        return this;\n    };\n    h.prototype.add_event = function() {\n        return this;\n    };\n    var i = 0, j = [];\n    function k(l, m, JSBNG__event, n, o) {\n        var p = JSBNG__Date.now(), q = ((JSBNG__event && JSBNG__event.type));\n        o = ((o || {\n        }));\n        if (((!m && JSBNG__event))) {\n            m = JSBNG__event.getTarget();\n        }\n    ;\n    ;\n        var r = 50;\n        if (((m && ((n != \"FORCE\"))))) {\n            for (var s = ((j.length - 1)); ((((s >= 0)) && ((((p - j[s]._ue_ts)) < r)))); --s) {\n                if (((((j[s]._node == m)) && ((j[s]._type == q))))) {\n                    return j[s];\n                }\n            ;\n            ;\n            };\n        }\n    ;\n    ;\n        var t = new h(p, i, l, m, q);\n        j.push(t);\n        while (((j.length > 10))) {\n            j.shift();\n        ;\n        };\n    ;\n        g.inform(\"ClickRefAction/new\", {\n            cfa: t,\n            node: m,\n            mode: n,\n            JSBNG__event: JSBNG__event,\n            extra_data: o\n        }, g.BEHAVIOR_PERSISTENT);\n        i++;\n        return t;\n    };\n;\n    e.exports = a.clickRefAction = k;\n});\n__d(\"trackReferrer\", [\"Parent\",], function(a, b, c, d, e, f) {\n    var g = b(\"Parent\");\n    function h(i, j) {\n        i = g.byAttribute(i, \"data-referrer\");\n        if (i) {\n            var k = ((/^(?:(?:[^:\\/?#]+):)?(?:\\/\\/(?:[^\\/?#]*))?([^?#]*)(?:\\?([^#]*))?(?:#(.*))?/.exec(j)[1] || \"\"));\n            if (!k) {\n                return;\n            }\n        ;\n        ;\n            var l = ((((k + \"|\")) + i.getAttribute(\"data-referrer\"))), m = new JSBNG__Date();\n            m.setTime(((JSBNG__Date.now() + 1000)));\n            JSBNG__document.cookie = ((((((((((((\"x-src=\" + encodeURIComponent(l))) + \"; \")) + \"expires=\")) + m.toGMTString())) + \";path=/; domain=\")) + window.JSBNG__location.hostname.replace(/^.*(\\.facebook\\..*)$/i, \"$1\")));\n        }\n    ;\n    ;\n        return i;\n    };\n;\n    e.exports = h;\n});\n__d(\"Miny\", [], function(a, b, c, d, e, f) {\n    var g = \"Miny1\", h = {\n        encode: [],\n        decode: {\n        }\n    }, i = \"wxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-_\".split(\"\");\n    function j(n) {\n        for (var o = h.encode.length; ((o < n)); o++) {\n            var p = o.toString(32).split(\"\");\n            p[((p.length - 1))] = i[parseInt(p[((p.length - 1))], 32)];\n            p = p.join(\"\");\n            h.encode[o] = p;\n            h.decode[p] = o;\n        };\n    ;\n        return h;\n    };\n;\n    function k(n) {\n        var o = n.match(/\\w+|\\W+/g), p = {\n        };\n        for (var q = 0; ((q < o.length)); q++) {\n            p[o[q]] = ((((p[o[q]] || 0)) + 1));\n        ;\n        };\n    ;\n        var r = Object.keys(p);\n        r.sort(function(u, v) {\n            return ((((p[u] < p[v])) ? 1 : ((((p[v] < p[u])) ? -1 : 0))));\n        });\n        var s = j(r.length).encode;\n        for (q = 0; ((q < r.length)); q++) {\n            p[r[q]] = s[q];\n        ;\n        };\n    ;\n        var t = [];\n        for (q = 0; ((q < o.length)); q++) {\n            t[q] = p[o[q]];\n        ;\n        };\n    ;\n        for (q = 0; ((q < r.length)); q++) {\n            r[q] = r[q].replace(/'~'/g, \"\\\\~\");\n        ;\n        };\n    ;\n        return [g,r.length,].concat(r).concat(t.join(\"\")).join(\"~\");\n    };\n;\n    function l(n) {\n        var o = n.split(\"~\");\n        if (((o.shift() != g))) {\n            throw new Error(\"Not a Miny stream\");\n        }\n    ;\n    ;\n        var p = parseInt(o.shift(), 10), q = o.pop();\n        q = q.match(/[0-9a-v]*[\\-w-zA-Z_]/g);\n        var r = o, s = j(p).decode, t = [];\n        for (var u = 0; ((u < q.length)); u++) {\n            t[u] = r[s[q[u]]];\n        ;\n        };\n    ;\n        return t.join(\"\");\n    };\n;\n    var m = {\n        encode: k,\n        decode: l\n    };\n    e.exports = m;\n});\n__d(\"QueryString\", [], function(a, b, c, d, e, f) {\n    function g(k) {\n        var l = [];\n        Object.keys(k).forEach(function(m) {\n            var n = k[m];\n            if (((typeof n === \"undefined\"))) {\n                return;\n            }\n        ;\n        ;\n            if (((n === null))) {\n                l.push(m);\n                return;\n            }\n        ;\n        ;\n            l.push(((((encodeURIComponent(m) + \"=\")) + encodeURIComponent(n))));\n        });\n        return l.join(\"&\");\n    };\n;\n    function h(k, l) {\n        var m = {\n        };\n        if (((k === \"\"))) {\n            return m;\n        }\n    ;\n    ;\n        var n = k.split(\"&\");\n        for (var o = 0; ((o < n.length)); o++) {\n            var p = n[o].split(\"=\", 2), q = decodeURIComponent(p[0]);\n            if (((l && m.hasOwnProperty(q)))) {\n                throw new URIError(((\"Duplicate key: \" + q)));\n            }\n        ;\n        ;\n            m[q] = ((((p.length === 2)) ? decodeURIComponent(p[1]) : null));\n        };\n    ;\n        return m;\n    };\n;\n    function i(k, l) {\n        return ((((k + ((~k.indexOf(\"?\") ? \"&\" : \"?\")))) + ((((typeof l === \"string\")) ? l : j.encode(l)))));\n    };\n;\n    var j = {\n        encode: g,\n        decode: h,\n        appendToUrl: i\n    };\n    e.exports = j;\n});\n__d(\"UserAgent\", [], function(a, b, c, d, e, f) {\n    var g = false, h, i, j, k, l, m, n, o, p, q, r, s, t, u;\n    function v() {\n        if (g) {\n            return;\n        }\n    ;\n    ;\n        g = true;\n        var x = JSBNG__navigator.userAgent, y = /(?:MSIE.(\\d+\\.\\d+))|(?:(?:Firefox|GranParadiso|Iceweasel).(\\d+\\.\\d+))|(?:Opera(?:.+Version.|.)(\\d+\\.\\d+))|(?:AppleWebKit.(\\d+(?:\\.\\d+)?))/.exec(x), z = /(Mac OS X)|(Windows)|(Linux)/.exec(x);\n        r = /\\b(iPhone|iP[ao]d)/.exec(x);\n        s = /\\b(iP[ao]d)/.exec(x);\n        p = /Android/i.exec(x);\n        t = /FBAN\\/\\w+;/i.exec(x);\n        u = /Mobile/i.exec(x);\n        q = !!(/Win64/.exec(x));\n        if (y) {\n            h = ((y[1] ? parseFloat(y[1]) : NaN));\n            if (((h && JSBNG__document.documentMode))) {\n                h = JSBNG__document.documentMode;\n            }\n        ;\n        ;\n            i = ((y[2] ? parseFloat(y[2]) : NaN));\n            j = ((y[3] ? parseFloat(y[3]) : NaN));\n            k = ((y[4] ? parseFloat(y[4]) : NaN));\n            if (k) {\n                y = /(?:Chrome\\/(\\d+\\.\\d+))/.exec(x);\n                l = ((((y && y[1])) ? parseFloat(y[1]) : NaN));\n            }\n             else l = NaN;\n        ;\n        ;\n        }\n         else h = i = j = l = k = NaN;\n    ;\n    ;\n        if (z) {\n            if (z[1]) {\n                var aa = /(?:Mac OS X (\\d+(?:[._]\\d+)?))/.exec(x);\n                m = ((aa ? parseFloat(aa[1].replace(\"_\", \".\")) : true));\n            }\n             else m = false;\n        ;\n        ;\n            n = !!z[2];\n            o = !!z[3];\n        }\n         else m = n = o = false;\n    ;\n    ;\n    };\n;\n    var w = {\n        ie: function() {\n            return ((v() || h));\n        },\n        ie64: function() {\n            return ((w.ie() && q));\n        },\n        firefox: function() {\n            return ((v() || i));\n        },\n        JSBNG__opera: function() {\n            return ((v() || j));\n        },\n        webkit: ((window.top.JSBNG_Replay.push)((window.top.JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_376), function() {\n            return ((v() || k));\n        })),\n        safari: function() {\n            return w.webkit();\n        },\n        chrome: ((window.top.JSBNG_Replay.push)((window.top.JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_378), function() {\n            return ((v() || l));\n        })),\n        windows: function() {\n            return ((v() || n));\n        },\n        osx: function() {\n            return ((v() || m));\n        },\n        linux: function() {\n            return ((v() || o));\n        },\n        iphone: function() {\n            return ((v() || r));\n        },\n        mobile: function() {\n            return ((v() || ((((((r || s)) || p)) || u))));\n        },\n        nativeApp: function() {\n            return ((v() || t));\n        },\n        android: function() {\n            return ((v() || p));\n        },\n        ipad: function() {\n            return ((v() || s));\n        }\n    };\n    e.exports = w;\n});\n__d(\"XHR\", [\"Env\",\"ServerJS\",], function(a, b, c, d, e, f) {\n    var g = b(\"Env\"), h = b(\"ServerJS\"), i = 1, j = {\n        create: function() {\n            try {\n                return ((a.JSBNG__XMLHttpRequest ? new a.JSBNG__XMLHttpRequest() : new ActiveXObject(\"MSXML2.XMLHTTP.3.0\")));\n            } catch (k) {\n            \n            };\n        ;\n        },\n        getAsyncParams: function(k) {\n            var l = {\n                __user: g.user,\n                __a: 1,\n                __dyn: h.getLoadedModuleHash(),\n                __req: (i++).toString(36)\n            };\n            if (((((k == \"POST\")) && g.fb_dtsg))) {\n                l.fb_dtsg = g.fb_dtsg;\n            }\n        ;\n        ;\n            if (g.fb_isb) {\n                l.fb_isb = g.fb_isb;\n            }\n        ;\n        ;\n            return l;\n        }\n    };\n    e.exports = j;\n});\n__d(\"BanzaiAdapter\", [\"Arbiter\",\"Env\",\"Miny\",\"QueryString\",\"Run\",\"UserAgent\",\"XHR\",\"BanzaiConfig\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"Env\"), i = b(\"Miny\"), j = b(\"QueryString\"), k = b(\"Run\"), l = b(\"UserAgent\"), m = b(\"XHR\"), n = null, o = new g(), p = b(\"BanzaiConfig\"), q = \"/ajax/bz\", r = {\n    }, s = r.adapter = {\n        config: p,\n        getUserID: function() {\n            return h.user;\n        },\n        inform: function(t) {\n            o.inform(t);\n        },\n        subscribe: function(t, u) {\n            o.subscribe(t, u);\n        },\n        cleanup: function() {\n            if (((n && ((n.readyState < 4))))) {\n                n.abort();\n            }\n        ;\n        ;\n            if (n) {\n                delete n.onreadystatechange;\n                n = null;\n            }\n        ;\n        ;\n        },\n        readyToSend: function() {\n            var t = ((((l.ie() <= 8)) ? true : JSBNG__navigator.onLine));\n            return ((!n && t));\n        },\n        send: function(t, u, v) {\n            var w = \"POST\";\n            n = m.create();\n            n.open(w, q, true);\n            n.setRequestHeader(\"Content-Type\", \"application/x-www-form-urlencoded\");\n            n.onreadystatechange = function() {\n                if (((n.readyState >= 4))) {\n                    var aa = n.JSBNG__status;\n                    s.cleanup();\n                    if (((aa == 200))) {\n                        if (u) {\n                            u();\n                        }\n                    ;\n                    ;\n                        s.inform(r.OK);\n                    }\n                     else {\n                        if (v) {\n                            v(aa);\n                        }\n                    ;\n                    ;\n                        s.inform(r.ERROR);\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n            };\n            JSBNG__setTimeout(s.cleanup, r.SEND_TIMEOUT, false);\n            var x = m.getAsyncParams(w);\n            x.q = JSON.stringify(t);\n            x.ts = JSBNG__Date.now();\n            x.ph = h.push_phase;\n            if (r.FBTRACE) {\n                x.fbtrace = r.FBTRACE;\n            }\n        ;\n        ;\n            if (r.isEnabled(\"miny_compression\")) {\n                var y = JSBNG__Date.now(), z = i.encode(x.q);\n                if (((z.length < x.q.length))) {\n                    x.q = z;\n                    x.miny_encode_ms = ((JSBNG__Date.now() - y));\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            n.send(j.encode(x));\n        },\n        onUnload: function(t) {\n            k.onAfterUnload(t);\n        }\n    };\n    e.exports = r;\n});\n__d(\"pageID\", [], function(a, b, c, d, e, f) {\n    e.exports = Math.floor(((2147483648 * Math.JSBNG__random()))).toString(36);\n});\n__d(\"Banzai\", [\"BanzaiAdapter\",\"pageID\",\"copyProperties\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"BanzaiAdapter\"), h = g.adapter, i = b(\"pageID\"), j = b(\"copyProperties\"), k = b(\"emptyFunction\"), l = \"Banzai\", m = \"sequencer\", n, o, p, q = [], r = {\n    }, s = ((a != a.JSBNG__top));\n    function t() {\n        if (((p && ((p.posts.length > 0))))) {\n            q.push(p);\n        }\n    ;\n    ;\n        p = {\n            user: h.getUserID(),\n            page_id: i,\n            trigger: null,\n            time: JSBNG__Date.now(),\n            posts: []\n        };\n        if (g.isEnabled(m)) {\n            p.sequence = [];\n        }\n    ;\n    ;\n    };\n;\n    function u(z) {\n        var aa = ((JSBNG__Date.now() + z));\n        if (((!o || ((aa < o))))) {\n            o = aa;\n            JSBNG__clearTimeout(n);\n            n = JSBNG__setTimeout(v, z, false);\n            return true;\n        }\n    ;\n    ;\n    };\n;\n    function v() {\n        o = null;\n        u(g.BASIC.delay);\n        if (!h.readyToSend()) {\n            return;\n        }\n    ;\n    ;\n        h.inform(g.SEND);\n        if (((((q.length <= 0)) && ((p.posts.length <= 0))))) {\n            h.inform(g.OK);\n            return;\n        }\n    ;\n    ;\n        t();\n        var z = q;\n        q = [];\n        h.send(z, null, function(aa) {\n            var ba = ((JSBNG__Date.now() - ((h.config.EXPIRY || g.EXPIRY)))), ca = ((((aa >= 400)) && ((aa < 600)))), da = z.map(function(ea) {\n                ea.posts = ea.posts.filter(function(fa) {\n                    var ga = ((ca || fa.__meta.options.retry));\n                    fa.__meta.retryCount = ((((fa.__meta.retryCount || 0)) + 1));\n                    fa[3] = fa.__meta.retryCount;\n                    return ((ga && ((fa.__meta.timestamp > ba))));\n                });\n                return ea;\n            });\n            da = da.filter(function(ea) {\n                return ((ea.posts.length > 0));\n            });\n            q = da.concat(q);\n        });\n    };\n;\n    var w, x;\n    try {\n        x = a.JSBNG__sessionStorage;\n    } catch (y) {\n    \n    };\n;\n    if (((x && !s))) {\n        w = {\n            store: function z() {\n                try {\n                    t();\n                    var ba = h.getUserID(), ca = q.filter(function(ea) {\n                        return ((ea.user == ba));\n                    }).map(function(ea) {\n                        ea = j({\n                        }, ea);\n                        ea.posts = ea.posts.map(function(fa) {\n                            return [fa[0],fa[1],fa[2],fa.__meta,];\n                        });\n                        return ea;\n                    }), da = JSON.stringify(ca);\n                    x.setItem(l, da);\n                } catch (aa) {\n                \n                };\n            ;\n            },\n            restore: function z() {\n                try {\n                    var ba = x.getItem(l);\n                    if (ba) {\n                        x.removeItem(l);\n                        var ca = h.getUserID(), da = JSON.parse(ba);\n                        da = da.filter(function(ea) {\n                            ea.posts.forEach(function(fa) {\n                                fa.__meta = fa.pop();\n                                if (((\"retryCount\" in fa.__meta))) {\n                                    fa[3] = fa.__meta.retryCount;\n                                }\n                            ;\n                            ;\n                            });\n                            return ((ea.user == ca));\n                        });\n                        q = q.concat(da);\n                    }\n                ;\n                ;\n                } catch (aa) {\n                \n                };\n            ;\n            }\n        };\n    }\n     else w = {\n        store: k,\n        restore: k\n    };\n;\n;\n    g.SEND = \"Banzai:SEND\";\n    g.OK = \"Banzai:OK\";\n    g.ERROR = \"Banzai:ERROR\";\n    g.SHUTDOWN = \"Banzai:SHUTDOWN\";\n    g.SEND_TIMEOUT = 15000;\n    g.VITAL_WAIT = 1000;\n    g.BASIC_WAIT = 60000;\n    g.EXPIRY = ((30 * 60000));\n    g.VITAL = {\n        delay: ((h.config.MIN_WAIT || g.VITAL_WAIT))\n    };\n    g.BASIC = {\n        delay: ((h.config.MAX_WAIT || g.BASIC_WAIT))\n    };\n    g.FBTRACE = h.config.fbtrace, g.isEnabled = function(z) {\n        return ((h.config.gks && h.config.gks[z]));\n    };\n    g.post = function(z, aa, ba) {\n        ba = ((ba || {\n        }));\n        if (s) {\n            if (((JSBNG__document.domain == \"facebook.com\"))) {\n                try {\n                    var da = a.JSBNG__top.require(\"Banzai\");\n                    da.post.apply(da, arguments);\n                } catch (ca) {\n                \n                };\n            }\n        ;\n        ;\n            return;\n        }\n    ;\n    ;\n        if (h.config.disabled) {\n            return;\n        }\n    ;\n    ;\n        var ea = h.config.blacklist;\n        if (ea) {\n            if (((((ea && ea.join)) && !ea._regex))) {\n                ea._regex = new RegExp(((((\"^(?:\" + ea.join(\"|\"))) + \")\")));\n            }\n        ;\n        ;\n            if (((ea._regex && ea._regex.test(z)))) {\n                return;\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n        if (((p.user != h.getUserID()))) {\n            t();\n        }\n    ;\n    ;\n        var fa = JSBNG__Date.now(), ga = [z,aa,((fa - p.time)),];\n        ga.__meta = {\n            options: ba,\n            timestamp: fa\n        };\n        p.posts.push(ga);\n        var ha = ba.delay;\n        if (((ha == null))) {\n            ha = g.BASIC_WAIT;\n        }\n    ;\n    ;\n        if (g.isEnabled(m)) {\n            if (!((z in r))) {\n                r[z] = 0;\n            }\n             else r[z]++;\n        ;\n        ;\n            p.sequence.push([z,r[z],]);\n        }\n    ;\n    ;\n        if (((u(ha) || !p.trigger))) {\n            p.trigger = z;\n        }\n    ;\n    ;\n    };\n    g.subscribe = h.subscribe;\n    g._testState = function() {\n        return {\n            wad: p,\n            wads: q\n        };\n    };\n    h.onUnload(function() {\n        h.cleanup();\n        h.inform(g.SHUTDOWN);\n        w.store();\n    });\n    t();\n    w.restore();\n    u(g.BASIC.delay);\n    e.exports = g;\n});\n__d(\"userAction\", [\"Arbiter\",\"Banzai\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"Banzai\"), i = b(\"copyProperties\"), j = 50, k = [], l = {\n    }, m = {\n    };\n    function n(v, w, x, y, JSBNG__event) {\n        var z = ((((v + \"/\")) + w)), aa = u(y);\n        i(this, {\n            ue: z,\n            _uai_logged: false,\n            _uai_timeout: null,\n            _primary: {\n            },\n            _fallback: {\n            },\n            _default_ua_id: ((aa || \"-\")),\n            _default_action_type: ((JSBNG__event ? JSBNG__event.type : \"-\")),\n            _ts: v,\n            _ns: x,\n            _start_ts: v,\n            _prev_event: \"s\",\n            _ue_ts: v,\n            _ue_count: w,\n            _data_version: 1,\n            _event_version: 2,\n            _info_version: 2\n        });\n        this._log(\"ua:n\", [1,z,]);\n    };\n;\n    function o(v, w, x, y) {\n        var z = ((((v in m)) ? m[v] : {\n        })), aa = ((((w in z)) ? z[w] : {\n        })), ba;\n        if (((x in aa))) {\n            if (((\"*\" in aa[x]))) {\n                ba = aa[x][\"*\"];\n            }\n             else if (((y in aa[x]))) {\n                ba = aa[x][y];\n            }\n            \n        ;\n        }\n    ;\n    ;\n        return ba;\n    };\n;\n    var p = {\n        store: true,\n        delay: 3000,\n        retry: true\n    };\n    i(n.prototype, {\n        _log: function(v, w) {\n            var x = ((l[v] === true)), y = o(v, this._ns, \"ua_id\", this._get_ua_id()), z = o(v, this._ns, \"action\", this._get_action_type()), aa = ((((y !== undefined)) || ((z !== undefined)))), ba = ((aa ? ((y || z)) : x));\n            if (((h.isEnabled(\"useraction\") && ba))) {\n                h.post(v, w, p);\n            }\n        ;\n        ;\n        },\n        _get_action_type: function() {\n            return ((((this._primary._action_type || this._fallback._action_type)) || this._default_action_type));\n        },\n        _get_ua_id: function() {\n            return ((((this._primary._ua_id || this._fallback._ua_id)) || this._default_ua_id));\n        },\n        _log_uai: function() {\n            var v = [this._info_version,this.ue,this._ns,this._get_ua_id(),this._get_action_type(),];\n            this._log(\"ua:i\", v);\n            this._uai_logged = true;\n            this._uai_timeout = null;\n        },\n        uai: function(v, w, x) {\n            if (!this._uai_logged) {\n                ((this._uai_timeout && JSBNG__clearTimeout(this._uai_timeout)));\n                this._primary._ua_id = w;\n                this._primary._action_type = v;\n                if (((x === undefined))) {\n                    this._log_uai();\n                }\n                 else if (((x === false))) {\n                    this._uai_logged = true;\n                }\n                 else {\n                    var y = this;\n                    x = ((x || 0));\n                    this._uai_timeout = JSBNG__setTimeout(function() {\n                        y._log_uai.apply(y);\n                    }, x);\n                }\n                \n            ;\n            ;\n            }\n        ;\n        ;\n            return this;\n        },\n        uai_fallback: function(v, w, x) {\n            if (!this._uai_logged) {\n                var y = this;\n                ((this._uai_timeout && JSBNG__clearTimeout(this._uai_timeout)));\n                this._fallback._ua_id = w;\n                this._fallback._action_type = v;\n                x = ((((x === undefined)) ? j : x));\n                this._uai_timeout = JSBNG__setTimeout(function() {\n                    y._log_uai.apply(y);\n                }, x);\n            }\n        ;\n        ;\n            return this;\n        },\n        add_event: function(v, w, x) {\n            w = ((w || 0));\n            var y = ((JSBNG__Date.now() - w)), z = ((y - this._ts)), aa = ((y - ((x ? x : this._ue_ts)))), ba = [this._event_version,this.ue,this._ns,this._get_ua_id(),this._prev_event,v,z,aa,];\n            if (this._get_ua_id()) {\n                this._log(\"ua:e\", ba);\n                this._ts = y;\n                this._prev_event = v;\n            }\n        ;\n        ;\n            return this;\n        },\n        add_data: function(v) {\n            var w = [this._data_version,this.ue,v,];\n            this._log(\"ua:d\", w);\n            return this;\n        }\n    });\n    var q = 0, r = 0, s = null;\n    function t(v, w, JSBNG__event, x) {\n        x = ((x || {\n        }));\n        var y = JSBNG__Date.now();\n        if (((!w && JSBNG__event))) {\n            w = JSBNG__event.getTarget();\n        }\n    ;\n    ;\n        if (((w && s))) {\n            if (((((((((y - r)) < j)) && ((w == s)))) && ((x.mode == \"DEDUP\"))))) {\n                return k[((k.length - 1))];\n            }\n        ;\n        }\n    ;\n    ;\n        var z = new n(y, q, v, w, JSBNG__event);\n        s = w;\n        k.push(z);\n        while (((k.length > 10))) {\n            k.shift();\n        ;\n        };\n    ;\n        g.inform(\"UserAction/new\", {\n            ua: z,\n            node: w,\n            mode: x.mode,\n            JSBNG__event: JSBNG__event\n        });\n        r = y;\n        q++;\n        return z;\n    };\n;\n    function u(v) {\n        if (((!v || !v.nodeName))) {\n            return null;\n        }\n    ;\n    ;\n        return v.nodeName.toLowerCase();\n    };\n;\n    t.setUATypeConfig = function(v) {\n        i(l, v);\n    };\n    t.setCustomSampleConfig = function(v) {\n        i(m, v);\n    };\n    t.getCurrentUECount = function() {\n        return q;\n    };\n    e.exports = a.userAction = t;\n});\n__d(\"Primer\", [\"function-extensions\",\"Bootloader\",\"CSS\",\"ErrorUtils\",\"Parent\",\"clickRefAction\",\"trackReferrer\",\"userAction\",], function(a, b, c, d, e, f) {\n    b(\"function-extensions\");\n    var g = b(\"Bootloader\"), h = b(\"CSS\"), i = b(\"ErrorUtils\"), j = b(\"Parent\"), k = b(\"clickRefAction\"), l = b(\"trackReferrer\"), m = b(\"userAction\"), n = null, o = /async(?:-post)?|dialog(?:-post)?|theater|toggle/, p = JSBNG__document.documentElement;\n    function q(t, u) {\n        t = j.byAttribute(t, u);\n        if (!t) {\n            return;\n        }\n    ;\n    ;\n        do {\n            var v = t.getAttribute(u);\n            JSON.parse(v).forEach(function(w) {\n                var x = t;\n                g.loadModules.call(g, [w[0],], function(y) {\n                    y[w[1]](x);\n                });\n            });\n        } while (t = j.byAttribute(t.parentNode, u));\n        return false;\n    };\n;\n    p.JSBNG__onclick = i.guard(function(t) {\n        t = ((t || window.JSBNG__event));\n        n = ((t.target || t.srcElement));\n        var u = q(n, \"data-onclick\"), v = j.byTag(n, \"A\");\n        if (!v) {\n            return u;\n        }\n    ;\n    ;\n        var w = v.getAttribute(\"ajaxify\"), x = v.href, y = ((w || x));\n        if (y) {\n            k(\"a\", v, t).coalesce_namespace(\"primer\");\n            var z = m(\"primer\", v, t, {\n                mode: \"DEDUP\"\n            }).uai_fallback(\"click\");\n            if (a.ArbiterMonitor) {\n                a.ArbiterMonitor.initUA(z, [v,]);\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n        if (((((w && x)) && !(/#$/).test(x)))) {\n            var aa = ((t.which && ((t.which === 2)))), ba = ((((((t.altKey || t.ctrlKey)) || t.metaKey)) || t.shiftKey));\n            if (((aa || ba))) {\n                return;\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n        l(v, y);\n        var ca = ((v.rel && v.rel.match(o)));\n        ca = ((ca && ca[0]));\n        switch (ca) {\n          case \"dialog\":\n        \n          case \"dialog-post\":\n            g.loadModules([\"AsyncDialog\",], function(da) {\n                da.bootstrap(y, v, ca);\n            });\n            break;\n          case \"async\":\n        \n          case \"async-post\":\n            g.loadModules([\"AsyncRequest\",], function(da) {\n                da.bootstrap(y, v);\n            });\n            break;\n          case \"theater\":\n            g.loadModules([\"PhotoSnowlift\",], function(da) {\n                da.bootstrap(y, v);\n            });\n            break;\n          case \"toggle\":\n            h.toggleClass(v.parentNode, \"openToggler\");\n            g.loadModules([\"Toggler\",], function(da) {\n                da.bootstrap(v);\n            });\n            break;\n          default:\n            return u;\n        };\n    ;\n        return false;\n    });\n    p.JSBNG__onsubmit = i.guard(function(t) {\n        t = ((t || window.JSBNG__event));\n        var u = ((t.target || t.srcElement));\n        if (((((u && ((u.nodeName == \"FORM\")))) && ((u.getAttribute(\"rel\") == \"async\"))))) {\n            k(\"f\", u, t).coalesce_namespace(\"primer\");\n            var v = m(\"primer\", u, t, {\n                mode: \"DEDUP\"\n            }).uai_fallback(\"submit\");\n            if (a.ArbiterMonitor) {\n                a.ArbiterMonitor.initUA(v, [u,]);\n            }\n        ;\n        ;\n            var w = n;\n            g.loadModules([\"Form\",], function(x) {\n                x.bootstrap(u, w);\n            });\n            return false;\n        }\n    ;\n    ;\n    });\n    var r = null, s = i.guard(function(t, u) {\n        u = ((u || window.JSBNG__event));\n        r = ((u.target || u.srcElement));\n        q(r, ((\"data-on\" + t)));\n        var v = j.byAttribute(r, \"data-hover\");\n        if (!v) {\n            return;\n        }\n    ;\n    ;\n        switch (v.getAttribute(\"data-hover\")) {\n          case \"tooltip\":\n            g.loadModules([\"Tooltip\",], function(w) {\n                w.process(v, r);\n            });\n            break;\n        };\n    ;\n    });\n    p.JSBNG__onmouseover = s.curry(\"mouseover\");\n    if (p.JSBNG__addEventListener) {\n        p.JSBNG__addEventListener(\"JSBNG__focus\", s.curry(\"JSBNG__focus\"), true);\n    }\n     else p.JSBNG__attachEvent(\"onfocusin\", s.curry(\"JSBNG__focus\"));\n;\n;\n});\n__d(\"ScriptPath\", [\"Banzai\",\"ErrorUtils\",], function(a, b, c, d, e, f) {\n    var g = b(\"Banzai\"), h = b(\"ErrorUtils\"), i = \"script_path_change\", j = {\n        scriptPath: null,\n        categoryToken: null\n    }, k = {\n        PAGE_LOAD: \"load\",\n        PAGE_UNLOAD: \"unload\",\n        TRANSITION: \"transition\"\n    }, l = null, m = null, n = {\n    }, o = 0, p = false, q = null;\n    function r(z) {\n        var aa = ++o;\n        n[aa] = z;\n        return aa;\n    };\n;\n    function s(z) {\n        if (n[z]) {\n            delete n[z];\n        }\n    ;\n    ;\n    };\n;\n    function t() {\n        Object.keys(n).forEach(function(z) {\n            h.applyWithGuard(n[z], null, [{\n                source: l,\n                dest: m\n            },]);\n        });\n    };\n;\n    function u(z, aa, ba) {\n        if (!p) {\n            return;\n        }\n    ;\n    ;\n        var ca = {\n            source_path: z.scriptPath,\n            source_token: z.categoryToken,\n            dest_path: aa.scriptPath,\n            dest_token: aa.categoryToken,\n            navigation: q,\n            cause: ba\n        };\n        g.post(i, ca);\n    };\n;\n    function v() {\n        u(j, m, k.PAGE_LOAD);\n    };\n;\n    function w(z, aa) {\n        u(z, aa, k.TRANSITION);\n    };\n;\n    function x() {\n        u(m, j, k.PAGE_UNLOAD);\n    };\n;\n    g.subscribe(g.SHUTDOWN, x);\n    var y = {\n        set: function(z, aa) {\n            var ba = m;\n            m = {\n                scriptPath: z,\n                categoryToken: aa\n            };\n            window._script_path = z;\n            t();\n            if (p) {\n                if (ba) {\n                    w(ba, m);\n                }\n                 else v();\n            ;\n            }\n        ;\n        ;\n        },\n        setNavigation: function(z) {\n            q = z;\n        },\n        startLogging: function() {\n            p = true;\n            if (m) {\n                v();\n            }\n        ;\n        ;\n        },\n        stopLogging: function() {\n            p = false;\n        },\n        getScriptPath: function() {\n            return ((m ? m.scriptPath : undefined));\n        },\n        getCategoryToken: function() {\n            return ((m ? m.categoryToken : undefined));\n        },\n        subscribe: function(z) {\n            return r(z);\n        },\n        unsubscribe: function(z) {\n            s(z);\n        }\n    };\n    y.CAUSE = k;\n    y.BANZAI_LOGGING_ROUTE = i;\n    e.exports = y;\n});\n__d(\"URLFragmentPrelude\", [\"ScriptPath\",\"URLFragmentPreludeConfig\",], function(a, b, c, d, e, f) {\n    var g = b(\"ScriptPath\"), h = b(\"URLFragmentPreludeConfig\"), i = /^(?:(?:[^:\\/?#]+):)?(?:\\/\\/(?:[^\\/?#]*))?([^?#]*)(?:\\?([^#]*))?(?:#(.*))?/, j = \"\", k = /^[^\\/\\\\#!\\.\\?\\*\\&\\^]+$/;\n    window.JSBNG__location.href.replace(i, function(l, m, n, o) {\n        var p, q, r, s;\n        p = q = ((m + ((n ? ((\"?\" + n)) : \"\"))));\n        if (o) {\n            if (h.incorporateQuicklingFragment) {\n                var t = o.replace(/^(!|%21)/, \"\");\n                r = t.charAt(0);\n                if (((((r == \"/\")) || ((r == \"\\\\\"))))) {\n                    p = t.replace(/^[\\\\\\/]+/, \"/\");\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            if (h.hashtagRedirect) {\n                if (((q == p))) {\n                    var u = o.match(k);\n                    if (((((u && !n)) && ((m == \"/\"))))) {\n                        p = ((\"/hashtag/\" + o));\n                    }\n                ;\n                ;\n                }\n            ;\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n        if (((p != q))) {\n            s = g.getScriptPath();\n            if (s) {\n                JSBNG__document.cookie = ((((((\"rdir=\" + s)) + \"; path=/; domain=\")) + window.JSBNG__location.hostname.replace(/^.*(\\.facebook\\..*)$/i, \"$1\")));\n            }\n        ;\n        ;\n            window.JSBNG__location.replace(((j + p)));\n        }\n    ;\n    ;\n    });\n});\n__d(\"removeArrayReduce\", [], function(a, b, c, d, e, f) {\n    Array.prototype.reduce = undefined;\n    Array.prototype.reduceRight = undefined;\n});\n__d(\"cx\", [], function(a, b, c, d, e, f) {\n    function g(h) {\n        throw new Error(((\"cx\" + \"(...): Unexpected class transformation.\")));\n    };\n;\n    e.exports = g;\n});\n__d(\"LitestandSidebarPrelude\", [\"CSS\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSS\"), h = b(\"cx\");\n    e.exports = {\n        init: function(i, j, k) {\n            var l = JSBNG__document.documentElement;\n            l.className = ((l.className + \" sidebarMode\"));\n            if (((j || ((l.clientWidth <= k))))) {\n                l.className = ((((l.className + \" \")) + \"_4kdq\"));\n            }\n        ;\n        ;\n            g.show(i);\n        }\n    };\n});\n__d(\"SubmitOnEnterListener\", [\"Bootloader\",\"CSS\",], function(a, b, c, d, e, f) {\n    var g = b(\"Bootloader\"), h = b(\"CSS\");\n    JSBNG__document.documentElement.JSBNG__onkeydown = function(i) {\n        i = ((i || window.JSBNG__event));\n        var j = ((i.target || i.srcElement)), k = ((((((((((((i.keyCode == 13)) && !i.altKey)) && !i.ctrlKey)) && !i.metaKey)) && !i.shiftKey)) && h.hasClass(j, \"enter_submit\")));\n        if (k) {\n            g.loadModules([\"DOM\",\"Input\",\"trackReferrer\",\"Form\",], function(l, m, n, o) {\n                if (!m.isEmpty(j)) {\n                    var p = j.form, q = ((l.scry(p, \".enter_submit_target\")[0] || l.scry(p, \"[type=\\\"submit\\\"]\")[0]));\n                    if (q) {\n                        var r = ((o.getAttribute(p, \"ajaxify\") || o.getAttribute(p, \"action\")));\n                        if (r) {\n                            n(p, r);\n                        }\n                    ;\n                    ;\n                        q.click();\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n            });\n            return false;\n        }\n    ;\n    ;\n    };\n});\n__d(\"CommentPrelude\", [\"CSS\",\"Parent\",\"clickRefAction\",\"userAction\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSS\"), h = b(\"Parent\"), i = b(\"clickRefAction\"), j = b(\"userAction\");\n    function k(o, p) {\n        j(\"ufi\", o).uai(\"click\");\n        i(\"ufi\", o, null, \"FORCE\");\n        return l(o, p);\n    };\n;\n    function l(o, p) {\n        var q = h.byTag(o, \"form\");\n        m(q);\n        var r = g.removeClass.curry(q, \"hidden_add_comment\");\n        if (window.ScrollAwareDOM) {\n            window.ScrollAwareDOM.monitor(q, r);\n        }\n         else r();\n    ;\n    ;\n        if (((p !== false))) {\n            var s = ((q.add_comment_text_text || q.add_comment_text)), t = s.length;\n            if (t) {\n                if (!h.byClass(s[((t - 1))], \"UFIReplyList\")) {\n                    s[((t - 1))].JSBNG__focus();\n                }\n                 else if (!h.byClass(s[0], \"UFIReplyList\")) {\n                    s[0].JSBNG__focus();\n                }\n                \n            ;\n            ;\n            }\n             else s.JSBNG__focus();\n        ;\n        ;\n        }\n    ;\n    ;\n        return false;\n    };\n;\n    function m(o) {\n        var p = g.removeClass.curry(o, \"collapsed_comments\");\n        if (window.ScrollAwareDOM) {\n            window.ScrollAwareDOM.monitor(o, p);\n        }\n         else p();\n    ;\n    ;\n    };\n;\n    var n = {\n        click: k,\n        expand: l,\n        uncollapse: m\n    };\n    e.exports = n;\n});\n__d(\"legacy:ufi-comment-prelude-js\", [\"CommentPrelude\",], function(a, b, c, d) {\n    var e = b(\"CommentPrelude\");\n    a.fc_click = e.click;\n    a.fc_expand = e.expand;\n}, 3);\n__d(\"ScriptMonitor\", [], function(a, b, c, d, e, f) {\n    var g, h = [], i = ((((window.JSBNG__MutationObserver || window.JSBNG__WebKitMutationObserver)) || window.MozMutationObserver));\n    e.exports = {\n        activate: function() {\n            if (!i) {\n                return;\n            }\n        ;\n        ;\n            g = new i(function(j) {\n                for (var k = 0; ((k < j.length)); k++) {\n                    var l = j[k];\n                    if (((l.type == \"childList\"))) {\n                        for (var m = 0; ((m < l.addedNodes.length)); m++) {\n                            var n = l.addedNodes[m];\n                            if (((((((n.tagName == \"SCRIPT\")) || ((n.tagName == \"div\")))) && n.src))) {\n                                h.push(n.src);\n                            }\n                        ;\n                        ;\n                        };\n                    ;\n                    }\n                     else if (((((l.type == \"attributes\")) && ((l.attributeName == \"src\"))))) {\n                        h.push(l.target.src);\n                    }\n                    \n                ;\n                ;\n                };\n            ;\n            });\n            g.observe(JSBNG__document, {\n                attributes: true,\n                childList: true,\n                subtree: true\n            });\n        },\n        JSBNG__stop: function() {\n            ((g && g.disconnect()));\n            return h;\n        }\n    };\n});");
// 850
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"(window.Bootloader && Bootloader.done([\"FHcQn\",]));");
// 851
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"s1ec9de22962c463704debb06fba6d985fa278804");
// 852
geval("((window.Bootloader && Bootloader.done([\"FHcQn\",])));");
// 853
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"Bootloader.loadEarlyResources({\n    OJTM4: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yd/r/-z4vUS8jrpA.js\"\n    },\n    AyUu6: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yF/r/pmYy9aLa5q_.js\"\n    }\n});");
// 854
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"s43794b4efa32e54c72f64603cd840e51369fb0ed");
// 855
geval("Bootloader.loadEarlyResources({\n    OJTM4: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yd/r/-z4vUS8jrpA.js\"\n    },\n    AyUu6: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yF/r/pmYy9aLa5q_.js\"\n    }\n});");
// 899
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"");
// 900
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"sda39a3ee5e6b4b0d3255bfef95601890afd80709");
// 901
geval("");
// 902
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"new (require(\"ServerJS\"))().handle({\n    require: [[\"removeArrayReduce\",],[\"markJSEnabled\",],[\"lowerDomain\",],[\"URLFragmentPrelude\",],],\n    define: [[\"BanzaiConfig\",[],{\n        MAX_WAIT: 150000,\n        MAX_SIZE: 10000,\n        COMPRESSION_THRESHOLD: 800,\n        gks: {\n            jslogger: true,\n            miny_compression: true,\n            boosted_posts: true,\n            time_spent: true,\n            time_spent_bit_array: true,\n            time_spent_debug: true,\n            useraction: true,\n            videos: true\n        }\n    },7,],[\"URLFragmentPreludeConfig\",[],{\n        hashtagRedirect: true,\n        incorporateQuicklingFragment: true\n    },137,],]\n});");
// 940
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"(window.Bootloader && Bootloader.done([\"FHcQn\",]));");
// 941
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"s1ec9de22962c463704debb06fba6d985fa278804");
// 942
geval("((window.Bootloader && Bootloader.done([\"FHcQn\",])));");
// 943
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"Bootloader.loadEarlyResources({\n    OJTM4: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yd/r/-z4vUS8jrpA.js\"\n    },\n    AyUu6: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yF/r/pmYy9aLa5q_.js\"\n    }\n});");
// 944
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"s43794b4efa32e54c72f64603cd840e51369fb0ed");
// 945
geval("Bootloader.loadEarlyResources({\n    OJTM4: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yd/r/-z4vUS8jrpA.js\"\n    },\n    AyUu6: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yF/r/pmYy9aLa5q_.js\"\n    }\n});");
// 989
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"");
// 990
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"sda39a3ee5e6b4b0d3255bfef95601890afd80709");
// 991
geval("");
// 992
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"new (require(\"ServerJS\"))().handle({\n    require: [[\"removeArrayReduce\",],[\"markJSEnabled\",],[\"lowerDomain\",],[\"URLFragmentPrelude\",],],\n    define: [[\"BanzaiConfig\",[],{\n        MAX_WAIT: 150000,\n        MAX_SIZE: 10000,\n        COMPRESSION_THRESHOLD: 800,\n        gks: {\n            jslogger: true,\n            miny_compression: true,\n            boosted_posts: true,\n            time_spent: true,\n            time_spent_bit_array: true,\n            time_spent_debug: true,\n            useraction: true,\n            videos: true\n        }\n    },7,],[\"URLFragmentPreludeConfig\",[],{\n        hashtagRedirect: true,\n        incorporateQuicklingFragment: true\n    },137,],]\n});");
// 993
geval("if (JSBNG__self.CavalryLogger) {\n    CavalryLogger.start_js([\"AyUu6\",]);\n}\n;\n;\n__d(\"XdArbiterBuffer\", [], function(a, b, c, d, e, f) {\n    if (!a.XdArbiter) {\n        a.XdArbiter = {\n            _m: [],\n            _p: [],\n            register: function(g, h, i) {\n                h = ((h || (((/^apps\\./).test(JSBNG__location.hostname) ? \"canvas\" : \"tab\"))));\n                this._p.push([g,h,i,]);\n                return h;\n            },\n            handleMessage: function(g, h) {\n                this._m.push([g,h,]);\n            }\n        };\n    }\n;\n;\n});\n__d(\"CanvasIFrameLoader\", [\"XdArbiterBuffer\",\"$\",], function(a, b, c, d, e, f) {\n    b(\"XdArbiterBuffer\");\n    var g = b(\"$\"), h = {\n        loadFromForm: function(i) {\n            i.submit();\n        }\n    };\n    e.exports = h;\n});\n__d(\"PHPQuerySerializer\", [], function(a, b, c, d, e, f) {\n    function g(n) {\n        return h(n, null);\n    };\n;\n    function h(n, o) {\n        o = ((o || \"\"));\n        var p = [];\n        if (((((n === null)) || ((n === undefined))))) {\n            p.push(i(o));\n        }\n         else if (((typeof (n) == \"object\"))) {\n            {\n                var fin27keys = ((window.top.JSBNG_Replay.forInKeys)((n))), fin27i = (0);\n                var q;\n                for (; (fin27i < fin27keys.length); (fin27i++)) {\n                    ((q) = (fin27keys[fin27i]));\n                    {\n                        if (((n.hasOwnProperty(q) && ((n[q] !== undefined))))) {\n                            p.push(h(n[q], ((o ? ((((((o + \"[\")) + q)) + \"]\")) : q))));\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n        }\n         else p.push(((((i(o) + \"=\")) + i(n))));\n        \n    ;\n    ;\n        return p.join(\"&\");\n    };\n;\n    function i(n) {\n        return encodeURIComponent(n).replace(/%5D/g, \"]\").replace(/%5B/g, \"[\");\n    };\n;\n    var j = /^(\\w+)((?:\\[\\w*\\])+)=?(.*)/;\n    function k(n) {\n        if (!n) {\n            return {\n            };\n        }\n    ;\n    ;\n        var o = {\n        };\n        n = n.replace(/%5B/gi, \"[\").replace(/%5D/gi, \"]\");\n        n = n.split(\"&\");\n        var p = Object.prototype.hasOwnProperty;\n        for (var q = 0, r = n.length; ((q < r)); q++) {\n            var s = n[q].match(j);\n            if (!s) {\n                var t = n[q].split(\"=\");\n                o[l(t[0])] = ((((t[1] === undefined)) ? null : l(t[1])));\n            }\n             else {\n                var u = s[2].split(/\\]\\[|\\[|\\]/).slice(0, -1), v = s[1], w = l(((s[3] || \"\")));\n                u[0] = v;\n                var x = o;\n                for (var y = 0; ((y < ((u.length - 1)))); y++) {\n                    if (u[y]) {\n                        if (!p.call(x, u[y])) {\n                            var z = ((((u[((y + 1))] && !u[((y + 1))].match(/^\\d{1,3}$/))) ? {\n                            } : []));\n                            x[u[y]] = z;\n                            if (((x[u[y]] !== z))) {\n                                return o;\n                            }\n                        ;\n                        ;\n                        }\n                    ;\n                    ;\n                        x = x[u[y]];\n                    }\n                     else {\n                        if (((u[((y + 1))] && !u[((y + 1))].match(/^\\d{1,3}$/)))) {\n                            x.push({\n                            });\n                        }\n                         else x.push([]);\n                    ;\n                    ;\n                        x = x[((x.length - 1))];\n                    }\n                ;\n                ;\n                };\n            ;\n                if (((((x instanceof Array)) && ((u[((u.length - 1))] === \"\"))))) {\n                    x.push(w);\n                }\n                 else x[u[((u.length - 1))]] = w;\n            ;\n            ;\n            }\n        ;\n        ;\n        };\n    ;\n        return o;\n    };\n;\n    function l(n) {\n        return decodeURIComponent(n.replace(/\\+/g, \" \"));\n    };\n;\n    var m = {\n        serialize: g,\n        encodeComponent: i,\n        deserialize: k,\n        decodeComponent: l\n    };\n    e.exports = m;\n});\n__d(\"URIBase\", [\"PHPQuerySerializer\",\"copyProperties\",\"ex\",], function(a, b, c, d, e, f) {\n    var g = b(\"PHPQuerySerializer\"), h = b(\"copyProperties\"), i = b(\"ex\"), j = /((([\\-\\w]+):\\/\\/)([^\\/:]*)(:(\\d+))?)?([^#?]*)(\\?([^#]*))?(#(.*))?/, k = new RegExp(((((\"[\\\\x00-\\\\x2c\\\\x2f\\\\x3b-\\\\x40\\\\x5c\\\\x5e\\\\x60\\\\x7b-\\\\x7f\" + \"\\\\uFDD0-\\\\uFDEF\\\\uFFF0-\\\\uFFFF\")) + \"\\\\u2047\\\\u2048\\\\uFE56\\\\uFE5F\\\\uFF03\\\\uFF0F\\\\uFF1F]\"))), l = new RegExp(((\"^(?:[^/]*:|\" + \"[\\\\x00-\\\\x1f]*/[\\\\x00-\\\\x1f]*/)\")));\n    function m(o, p, q) {\n        if (!p) {\n            return true;\n        }\n    ;\n    ;\n        if (((p instanceof n))) {\n            o.setProtocol(p.getProtocol());\n            o.setDomain(p.getDomain());\n            o.setPort(p.getPort());\n            o.setPath(p.getPath());\n            o.setQueryData(JSON.parse(JSON.stringify(p.getQueryData())));\n            o.setFragment(p.getFragment());\n            return true;\n        }\n    ;\n    ;\n        p = p.toString();\n        var r = p.match(j);\n        o.setProtocol(((r[3] || \"\")));\n        if (((k.test(((r[4] || \"\"))) && !q))) {\n            return false;\n        }\n    ;\n    ;\n        o.setDomain(((r[4] || \"\")));\n        o.setPort(((r[6] || \"\")));\n        o.setPath(((r[7] || \"\")));\n        if (q) {\n            o.setQueryData(((g.deserialize(r[9]) || {\n            })));\n        }\n         else try {\n            o.setQueryData(((g.deserialize(r[9]) || {\n            })));\n        } catch (s) {\n            return false;\n        }\n    ;\n    ;\n        o.setFragment(((r[11] || \"\")));\n        if (((!o.getDomain() && ((o.getPath().indexOf(\"\\\\\") !== -1))))) {\n            if (q) {\n                throw new Error(i(\"URI.parse: invalid URI (no domain but multiple back-slashes): %s\", o.toString()));\n            }\n             else return false\n        ;\n        }\n    ;\n    ;\n        if (((!o.getProtocol() && l.test(p)))) {\n            if (q) {\n                throw new Error(i(\"URI.parse: invalid URI (unsafe protocol-relative URLs): %s\", o.toString()));\n            }\n             else return false\n        ;\n        }\n    ;\n    ;\n        return true;\n    };\n;\n    function n(o) {\n        this.$URIBase0 = \"\";\n        this.$URIBase1 = \"\";\n        this.$URIBase2 = \"\";\n        this.$URIBase3 = \"\";\n        this.$URIBase4 = \"\";\n        this.$URIBase5 = {\n        };\n        m(this, o, true);\n    };\n;\n    n.prototype.setProtocol = function(o) {\n        this.$URIBase0 = o;\n        return this;\n    };\n    n.prototype.getProtocol = function(o) {\n        return this.$URIBase0;\n    };\n    n.prototype.setSecure = function(o) {\n        return this.setProtocol(((o ? \"https\" : \"http\")));\n    };\n    n.prototype.isSecure = function() {\n        return ((this.getProtocol() === \"https\"));\n    };\n    n.prototype.setDomain = function(o) {\n        if (k.test(o)) {\n            throw new Error(i(\"URI.setDomain: unsafe domain specified: %s for url %s\", o, this.toString()));\n        }\n    ;\n    ;\n        this.$URIBase1 = o;\n        return this;\n    };\n    n.prototype.getDomain = function() {\n        return this.$URIBase1;\n    };\n    n.prototype.setPort = function(o) {\n        this.$URIBase2 = o;\n        return this;\n    };\n    n.prototype.getPort = function() {\n        return this.$URIBase2;\n    };\n    n.prototype.setPath = function(o) {\n        this.$URIBase3 = o;\n        return this;\n    };\n    n.prototype.getPath = function() {\n        return this.$URIBase3;\n    };\n    n.prototype.addQueryData = function(o, p) {\n        if (((o instanceof Object))) {\n            h(this.$URIBase5, o);\n        }\n         else this.$URIBase5[o] = p;\n    ;\n    ;\n        return this;\n    };\n    n.prototype.setQueryData = function(o) {\n        this.$URIBase5 = o;\n        return this;\n    };\n    n.prototype.getQueryData = function() {\n        return this.$URIBase5;\n    };\n    n.prototype.removeQueryData = function(o) {\n        if (!Array.isArray(o)) {\n            o = [o,];\n        }\n    ;\n    ;\n        for (var p = 0, q = o.length; ((p < q)); ++p) {\n            delete this.$URIBase5[o[p]];\n        ;\n        };\n    ;\n        return this;\n    };\n    n.prototype.setFragment = function(o) {\n        this.$URIBase4 = o;\n        return this;\n    };\n    n.prototype.getFragment = function() {\n        return this.$URIBase4;\n    };\n    n.prototype.toString = function() {\n        var o = \"\";\n        if (this.$URIBase0) {\n            o += ((this.$URIBase0 + \"://\"));\n        }\n    ;\n    ;\n        if (this.$URIBase1) {\n            o += this.$URIBase1;\n        }\n    ;\n    ;\n        if (this.$URIBase2) {\n            o += ((\":\" + this.$URIBase2));\n        }\n    ;\n    ;\n        if (this.$URIBase3) {\n            o += this.$URIBase3;\n        }\n         else if (o) {\n            o += \"/\";\n        }\n        \n    ;\n    ;\n        var p = g.serialize(this.$URIBase5);\n        if (p) {\n            o += ((\"?\" + p));\n        }\n    ;\n    ;\n        if (this.$URIBase4) {\n            o += ((\"#\" + this.$URIBase4));\n        }\n    ;\n    ;\n        return o;\n    };\n    n.prototype.getOrigin = function() {\n        return ((((((this.$URIBase0 + \"://\")) + this.$URIBase1)) + ((this.$URIBase2 ? ((\":\" + this.$URIBase2)) : \"\"))));\n    };\n    n.isValidURI = function(o) {\n        return m(new n(), o, false);\n    };\n    e.exports = n;\n});\n__d(\"URI\", [\"URIBase\",\"copyProperties\",\"goURI\",], function(a, b, c, d, e, f) {\n    var g = b(\"URIBase\"), h = b(\"copyProperties\"), i = b(\"goURI\"), j = ((((g === null)) ? null : g.prototype));\n    k.prototype = Object.create(j);\n    k.prototype.constructor = k;\n    k.__superConstructor__ = g;\n    function k(l) {\n        if (!((this instanceof k))) {\n            return new k(((l || window.JSBNG__location.href)));\n        }\n    ;\n    ;\n        g.call(this, ((l || \"\")));\n    };\n;\n    k.prototype.setPath = function(l) {\n        this.path = l;\n        return j.setPath.call(this, l);\n    };\n    k.prototype.getPath = function() {\n        var l = j.getPath.call(this);\n        if (l) {\n            return l.replace(/^\\/+/, \"/\");\n        }\n    ;\n    ;\n        return l;\n    };\n    k.prototype.setProtocol = function(l) {\n        this.protocol = l;\n        return j.setProtocol.call(this, l);\n    };\n    k.prototype.setDomain = function(l) {\n        this.domain = l;\n        return j.setDomain.call(this, l);\n    };\n    k.prototype.setPort = function(l) {\n        this.port = l;\n        return j.setPort.call(this, l);\n    };\n    k.prototype.setFragment = function(l) {\n        this.fragment = l;\n        return j.setFragment.call(this, l);\n    };\n    k.prototype.isEmpty = function() {\n        return !((((((((((this.getPath() || this.getProtocol())) || this.getDomain())) || this.getPort())) || ((Object.keys(this.getQueryData()).length > 0)))) || this.getFragment()));\n    };\n    k.prototype.valueOf = ((window.top.JSBNG_Replay.push)((window.top.JSBNG_Replay.s5e7dba3ea700a5261ca8857ec975a807389e8969_42), function() {\n        return this.toString();\n    }));\n    k.prototype.isFacebookURI = function() {\n        if (!k.$URI5) {\n            k.$URI5 = new RegExp(\"(^|\\\\.)facebook\\\\.com$\", \"i\");\n        }\n    ;\n    ;\n        if (this.isEmpty()) {\n            return false;\n        }\n    ;\n    ;\n        if (((!this.getDomain() && !this.getProtocol()))) {\n            return true;\n        }\n    ;\n    ;\n        return (((([\"http\",\"https\",].indexOf(this.getProtocol()) !== -1)) && k.$URI5.test(this.getDomain())));\n    };\n    k.prototype.getRegisteredDomain = function() {\n        if (!this.getDomain()) {\n            return \"\";\n        }\n    ;\n    ;\n        if (!this.isFacebookURI()) {\n            return null;\n        }\n    ;\n    ;\n        var l = this.getDomain().split(\".\"), m = l.indexOf(\"facebook\");\n        return l.slice(m).join(\".\");\n    };\n    k.prototype.getUnqualifiedURI = function() {\n        return new k(this).setProtocol(null).setDomain(null).setPort(null);\n    };\n    k.prototype.getQualifiedURI = function() {\n        return new k(this).$URI6();\n    };\n    k.prototype.$URI6 = function() {\n        if (!this.getDomain()) {\n            var l = k();\n            this.setProtocol(l.getProtocol()).setDomain(l.getDomain()).setPort(l.getPort());\n        }\n    ;\n    ;\n        return this;\n    };\n    k.prototype.isSameOrigin = function(l) {\n        var m = ((l || window.JSBNG__location.href));\n        if (!((m instanceof k))) {\n            m = new k(m.toString());\n        }\n    ;\n    ;\n        if (((this.isEmpty() || m.isEmpty()))) {\n            return false;\n        }\n    ;\n    ;\n        if (((this.getProtocol() && ((this.getProtocol() != m.getProtocol()))))) {\n            return false;\n        }\n    ;\n    ;\n        if (((this.getDomain() && ((this.getDomain() != m.getDomain()))))) {\n            return false;\n        }\n    ;\n    ;\n        if (((this.getPort() && ((this.getPort() != m.getPort()))))) {\n            return false;\n        }\n    ;\n    ;\n        return true;\n    };\n    k.prototype.go = function(l) {\n        i(this, l);\n    };\n    k.prototype.setSubdomain = function(l) {\n        var m = this.$URI6().getDomain().split(\".\");\n        if (((m.length <= 2))) {\n            m.unshift(l);\n        }\n         else m[0] = l;\n    ;\n    ;\n        return this.setDomain(m.join(\".\"));\n    };\n    k.prototype.getSubdomain = function() {\n        if (!this.getDomain()) {\n            return \"\";\n        }\n    ;\n    ;\n        var l = this.getDomain().split(\".\");\n        if (((l.length <= 2))) {\n            return \"\";\n        }\n         else return l[0]\n    ;\n    };\n    k.isValidURI = g.isValidURI;\n    h(k, {\n        getRequestURI: function(l, m) {\n            l = ((((l === undefined)) || l));\n            var n = a.PageTransitions;\n            if (((((l && n)) && n.isInitialized()))) {\n                return n.getCurrentURI(!!m).getQualifiedURI();\n            }\n             else return new k(window.JSBNG__location.href)\n        ;\n        },\n        getMostRecentURI: function() {\n            var l = a.PageTransitions;\n            if (((l && l.isInitialized()))) {\n                return l.getMostRecentURI().getQualifiedURI();\n            }\n             else return new k(window.JSBNG__location.href)\n        ;\n        },\n        getNextURI: function() {\n            var l = a.PageTransitions;\n            if (((l && l.isInitialized()))) {\n                return l.getNextURI().getQualifiedURI();\n            }\n             else return new k(window.JSBNG__location.href)\n        ;\n        },\n        expression: /(((\\w+):\\/\\/)([^\\/:]*)(:(\\d+))?)?([^#?]*)(\\?([^#]*))?(#(.*))?/,\n        arrayQueryExpression: /^(\\w+)((?:\\[\\w*\\])+)=?(.*)/,\n        explodeQuery: function(l) {\n            if (!l) {\n                return {\n                };\n            }\n        ;\n        ;\n            var m = {\n            };\n            l = l.replace(/%5B/gi, \"[\").replace(/%5D/gi, \"]\");\n            l = l.split(\"&\");\n            var n = Object.prototype.hasOwnProperty;\n            for (var o = 0, p = l.length; ((o < p)); o++) {\n                var q = l[o].match(k.arrayQueryExpression);\n                if (!q) {\n                    var r = l[o].split(\"=\");\n                    m[k.decodeComponent(r[0])] = ((((r[1] === undefined)) ? null : k.decodeComponent(r[1])));\n                }\n                 else {\n                    var s = q[2].split(/\\]\\[|\\[|\\]/).slice(0, -1), t = q[1], u = k.decodeComponent(((q[3] || \"\")));\n                    s[0] = t;\n                    var v = m;\n                    for (var w = 0; ((w < ((s.length - 1)))); w++) {\n                        if (s[w]) {\n                            if (!n.call(v, s[w])) {\n                                var x = ((((s[((w + 1))] && !s[((w + 1))].match(/^\\d{1,3}$/))) ? {\n                                } : []));\n                                v[s[w]] = x;\n                                if (((v[s[w]] !== x))) {\n                                    return m;\n                                }\n                            ;\n                            ;\n                            }\n                        ;\n                        ;\n                            v = v[s[w]];\n                        }\n                         else {\n                            if (((s[((w + 1))] && !s[((w + 1))].match(/^\\d{1,3}$/)))) {\n                                v.push({\n                                });\n                            }\n                             else v.push([]);\n                        ;\n                        ;\n                            v = v[((v.length - 1))];\n                        }\n                    ;\n                    ;\n                    };\n                ;\n                    if (((((v instanceof Array)) && ((s[((s.length - 1))] === \"\"))))) {\n                        v.push(u);\n                    }\n                     else v[s[((s.length - 1))]] = u;\n                ;\n                ;\n                }\n            ;\n            ;\n            };\n        ;\n            return m;\n        },\n        implodeQuery: function(l, m, n) {\n            m = ((m || \"\"));\n            if (((n === undefined))) {\n                n = true;\n            }\n        ;\n        ;\n            var o = [];\n            if (((((l === null)) || ((l === undefined))))) {\n                o.push(((n ? k.encodeComponent(m) : m)));\n            }\n             else if (((l instanceof Array))) {\n                for (var p = 0; ((p < l.length)); ++p) {\n                    try {\n                        if (((l[p] !== undefined))) {\n                            o.push(k.implodeQuery(l[p], ((m ? ((((((m + \"[\")) + p)) + \"]\")) : p)), n));\n                        }\n                    ;\n                    ;\n                    } catch (q) {\n                    \n                    };\n                ;\n                };\n            ;\n            }\n             else if (((typeof (l) == \"object\"))) {\n                if (((((\"nodeName\" in l)) && ((\"nodeType\" in l))))) {\n                    o.push(\"{node}\");\n                }\n                 else {\n                    var fin28keys = ((window.top.JSBNG_Replay.forInKeys)((l))), fin28i = (0);\n                    var r;\n                    for (; (fin28i < fin28keys.length); (fin28i++)) {\n                        ((r) = (fin28keys[fin28i]));\n                        {\n                            try {\n                                if (((l[r] !== undefined))) {\n                                    o.push(k.implodeQuery(l[r], ((m ? ((((((m + \"[\")) + r)) + \"]\")) : r)), n));\n                                }\n                            ;\n                            ;\n                            } catch (q) {\n                            \n                            };\n                        ;\n                        };\n                    };\n                }\n            ;\n            ;\n            }\n             else if (n) {\n                o.push(((((k.encodeComponent(m) + \"=\")) + k.encodeComponent(l))));\n            }\n             else o.push(((((m + \"=\")) + l)));\n            \n            \n            \n        ;\n        ;\n            return o.join(\"&\");\n        },\n        encodeComponent: function(l) {\n            return encodeURIComponent(l).replace(/%5D/g, \"]\").replace(/%5B/g, \"[\");\n        },\n        decodeComponent: function(l) {\n            return decodeURIComponent(l.replace(/\\+/g, \" \"));\n        }\n    });\n    e.exports = k;\n});\n__d(\"AsyncSignal\", [\"Env\",\"ErrorUtils\",\"QueryString\",\"URI\",\"XHR\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Env\"), h = b(\"ErrorUtils\"), i = b(\"QueryString\"), j = b(\"URI\"), k = b(\"XHR\"), l = b(\"copyProperties\");\n    function m(n, o) {\n        this.data = ((o || {\n        }));\n        if (((g.tracking_domain && ((n.charAt(0) == \"/\"))))) {\n            n = ((g.tracking_domain + n));\n        }\n    ;\n    ;\n        this.uri = n;\n    };\n;\n    m.prototype.setHandler = function(n) {\n        this.handler = n;\n        return this;\n    };\n    m.prototype.send = function() {\n        var n = this.handler, o = this.data, p = new JSBNG__Image();\n        if (n) {\n            p.JSBNG__onload = p.JSBNG__onerror = function() {\n                h.applyWithGuard(n, null, [((p.height == 1)),]);\n            };\n        }\n    ;\n    ;\n        o.asyncSignal = ((((((Math.JSBNG__random() * 10000)) | 0)) + 1));\n        var q = new j(this.uri).isFacebookURI();\n        l(o, k.getAsyncParams(((q ? \"POST\" : \"GET\"))));\n        p.src = i.appendToUrl(this.uri, o);\n        return this;\n    };\n    e.exports = m;\n});\n__d(\"createObjectFrom\", [\"hasArrayNature\",], function(a, b, c, d, e, f) {\n    var g = b(\"hasArrayNature\");\n    function h(i, j) {\n        var k = {\n        }, l = g(j);\n        if (((typeof j == \"undefined\"))) {\n            j = true;\n        }\n    ;\n    ;\n        for (var m = i.length; m--; ) {\n            k[i[m]] = ((l ? j[m] : j));\n        ;\n        };\n    ;\n        return k;\n    };\n;\n    e.exports = h;\n});\n__d(\"DOMQuery\", [\"CSS\",\"UserAgent\",\"createArrayFrom\",\"createObjectFrom\",\"ge\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSS\"), h = b(\"UserAgent\"), i = b(\"createArrayFrom\"), j = b(\"createObjectFrom\"), k = b(\"ge\"), l = null;\n    function m(o, p) {\n        return ((o.hasAttribute ? o.hasAttribute(p) : ((o.getAttribute(p) !== null))));\n    };\n;\n    var n = {\n        JSBNG__find: function(o, p) {\n            var q = n.scry(o, p);\n            return q[0];\n        },\n        scry: function(o, p) {\n            if (((!o || !o.getElementsByTagName))) {\n                return [];\n            }\n        ;\n        ;\n            var q = p.split(\" \"), r = [o,];\n            for (var s = 0; ((s < q.length)); s++) {\n                if (((r.length === 0))) {\n                    break;\n                }\n            ;\n            ;\n                if (((q[s] === \"\"))) {\n                    continue;\n                }\n            ;\n            ;\n                var t = q[s], u = q[s], v = [], w = false;\n                if (((t.charAt(0) == \"^\"))) {\n                    if (((s === 0))) {\n                        w = true;\n                        t = t.slice(1);\n                    }\n                     else return []\n                ;\n                }\n            ;\n            ;\n                t = t.replace(/\\[(?:[^=\\]]*=(?:\"[^\"]*\"|'[^']*'))?|[.#]/g, \" $&\");\n                var x = t.split(\" \"), y = ((x[0] || \"*\")), z = ((y == \"*\")), aa = ((x[1] && ((x[1].charAt(0) == \"#\"))));\n                if (aa) {\n                    var ba = k(x[1].slice(1), o, y);\n                    if (((ba && ((z || ((ba.tagName.toLowerCase() == y))))))) {\n                        for (var ca = 0; ((ca < r.length)); ca++) {\n                            if (((w && n.contains(ba, r[ca])))) {\n                                v = [ba,];\n                                break;\n                            }\n                             else if (((((JSBNG__document == r[ca])) || n.contains(r[ca], ba)))) {\n                                v = [ba,];\n                                break;\n                            }\n                            \n                        ;\n                        ;\n                        };\n                    }\n                ;\n                ;\n                }\n                 else {\n                    var da = [], ea = r.length, fa, ga = ((((!w && ((u.indexOf(\"[\") < 0)))) && JSBNG__document.querySelectorAll));\n                    for (var ha = 0; ((ha < ea)); ha++) {\n                        if (w) {\n                            fa = [];\n                            var ia = r[ha].parentNode;\n                            while (n.isElementNode(ia)) {\n                                if (((z || ((ia.tagName.toLowerCase() == y))))) {\n                                    fa.push(ia);\n                                }\n                            ;\n                            ;\n                                ia = ia.parentNode;\n                            };\n                        ;\n                        }\n                         else if (ga) {\n                            fa = r[ha].querySelectorAll(u);\n                        }\n                         else fa = r[ha].getElementsByTagName(y);\n                        \n                    ;\n                    ;\n                        var ja = fa.length;\n                        for (var ka = 0; ((ka < ja)); ka++) {\n                            da.push(fa[ka]);\n                        ;\n                        };\n                    ;\n                    };\n                ;\n                    if (!ga) {\n                        for (var la = 1; ((la < x.length)); la++) {\n                            var ma = x[la], na = ((ma.charAt(0) == \".\")), oa = ma.substring(1);\n                            for (ha = 0; ((ha < da.length)); ha++) {\n                                var pa = da[ha];\n                                if (((!pa || ((pa.nodeType !== 1))))) {\n                                    continue;\n                                }\n                            ;\n                            ;\n                                if (na) {\n                                    if (!g.hasClass(pa, oa)) {\n                                        delete da[ha];\n                                    }\n                                ;\n                                ;\n                                    continue;\n                                }\n                                 else {\n                                    var qa = ma.slice(1, ((ma.length - 1)));\n                                    if (((qa.indexOf(\"=\") == -1))) {\n                                        if (!m(pa, qa)) {\n                                            delete da[ha];\n                                            continue;\n                                        }\n                                    ;\n                                    ;\n                                    }\n                                     else {\n                                        var ra = qa.split(\"=\"), sa = ra[0], ta = ra[1];\n                                        ta = ta.slice(1, ((ta.length - 1)));\n                                        if (((pa.getAttribute(sa) != ta))) {\n                                            delete da[ha];\n                                            continue;\n                                        }\n                                    ;\n                                    ;\n                                    }\n                                ;\n                                ;\n                                }\n                            ;\n                            ;\n                            };\n                        ;\n                        };\n                    }\n                ;\n                ;\n                    for (ha = 0; ((ha < da.length)); ha++) {\n                        if (da[ha]) {\n                            v.push(da[ha]);\n                            if (w) {\n                                break;\n                            }\n                        ;\n                        ;\n                        }\n                    ;\n                    ;\n                    };\n                ;\n                }\n            ;\n            ;\n                r = v;\n            };\n        ;\n            return r;\n        },\n        getText: function(o) {\n            if (n.isTextNode(o)) {\n                return o.data;\n            }\n             else if (n.isElementNode(o)) {\n                if (((l === null))) {\n                    var p = JSBNG__document.createElement(\"div\");\n                    l = ((((p.textContent != null)) ? \"textContent\" : \"innerText\"));\n                }\n            ;\n            ;\n                return o[l];\n            }\n             else return \"\"\n            \n        ;\n        },\n        JSBNG__getSelection: function() {\n            var o = window.JSBNG__getSelection, p = JSBNG__document.selection;\n            if (o) {\n                return ((o() + \"\"));\n            }\n             else if (p) {\n                return p.createRange().text;\n            }\n            \n        ;\n        ;\n            return null;\n        },\n        contains: function(o, p) {\n            o = k(o);\n            p = k(p);\n            if (((!o || !p))) {\n                return false;\n            }\n             else if (((o === p))) {\n                return true;\n            }\n             else if (n.isTextNode(o)) {\n                return false;\n            }\n             else if (n.isTextNode(p)) {\n                return n.contains(o, p.parentNode);\n            }\n             else if (o.contains) {\n                return o.contains(p);\n            }\n             else if (o.compareDocumentPosition) {\n                return !!((o.compareDocumentPosition(p) & 16));\n            }\n             else return false\n            \n            \n            \n            \n            \n        ;\n        },\n        getRootElement: function() {\n            var o = null;\n            if (((window.Quickling && Quickling.isActive()))) {\n                o = k(\"JSBNG__content\");\n            }\n        ;\n        ;\n            return ((o || JSBNG__document.body));\n        },\n        isNode: function(o) {\n            return !!((o && ((((typeof JSBNG__Node !== \"undefined\")) ? ((o instanceof JSBNG__Node)) : ((((((typeof o == \"object\")) && ((typeof o.nodeType == \"number\")))) && ((typeof o.nodeName == \"string\"))))))));\n        },\n        isNodeOfType: function(o, p) {\n            var q = i(p).join(\"|\").toUpperCase().split(\"|\"), r = j(q);\n            return ((n.isNode(o) && ((o.nodeName in r))));\n        },\n        isElementNode: function(o) {\n            return ((n.isNode(o) && ((o.nodeType == 1))));\n        },\n        isTextNode: function(o) {\n            return ((n.isNode(o) && ((o.nodeType == 3))));\n        },\n        isInputNode: function(o) {\n            return ((n.isNodeOfType(o, [\"input\",\"textarea\",]) || ((o.contentEditable === \"true\"))));\n        },\n        getDocumentScrollElement: function(o) {\n            o = ((o || JSBNG__document));\n            var p = ((h.chrome() || h.webkit()));\n            return ((((!p && ((o.compatMode === \"CSS1Compat\")))) ? o.documentElement : o.body));\n        }\n    };\n    e.exports = n;\n});\n__d(\"DataStore\", [], function(a, b, c, d, e, f) {\n    var g = {\n    }, h = 1;\n    function i(l) {\n        if (((typeof l == \"string\"))) {\n            return ((\"str_\" + l));\n        }\n         else return ((\"elem_\" + ((l.__FB_TOKEN || (l.__FB_TOKEN = [h++,])))[0]))\n    ;\n    };\n;\n    function j(l) {\n        var m = i(l);\n        return ((g[m] || (g[m] = {\n        })));\n    };\n;\n    var k = {\n        set: function(l, m, n) {\n            if (!l) {\n                throw new TypeError(((\"DataStore.set: namespace is required, got \" + (typeof l))));\n            }\n        ;\n        ;\n            var o = j(l);\n            o[m] = n;\n            return l;\n        },\n        get: function(l, m, n) {\n            if (!l) {\n                throw new TypeError(((\"DataStore.get: namespace is required, got \" + (typeof l))));\n            }\n        ;\n        ;\n            var o = j(l), p = o[m];\n            if (((((typeof p === \"undefined\")) && l.getAttribute))) {\n                if (((l.hasAttribute && !l.hasAttribute(((\"data-\" + m)))))) {\n                    p = undefined;\n                }\n                 else {\n                    var q = l.getAttribute(((\"data-\" + m)));\n                    p = ((((null === q)) ? undefined : q));\n                }\n            ;\n            }\n        ;\n        ;\n            if (((((n !== undefined)) && ((p === undefined))))) {\n                p = o[m] = n;\n            }\n        ;\n        ;\n            return p;\n        },\n        remove: function(l, m) {\n            if (!l) {\n                throw new TypeError(((\"DataStore.remove: namespace is required, got \" + (typeof l))));\n            }\n        ;\n        ;\n            var n = j(l), o = n[m];\n            delete n[m];\n            return o;\n        },\n        purge: function(l) {\n            delete g[i(l)];\n        }\n    };\n    e.exports = k;\n});\n__d(\"DOMEvent\", [\"copyProperties\",\"invariant\",], function(a, b, c, d, e, f) {\n    var g = b(\"copyProperties\"), h = b(\"invariant\");\n    function i(j) {\n        this.JSBNG__event = ((j || window.JSBNG__event));\n        h(((typeof (this.JSBNG__event.srcElement) != \"unknown\")));\n        this.target = ((this.JSBNG__event.target || this.JSBNG__event.srcElement));\n    };\n;\n    i.killThenCall = function(j) {\n        return function(k) {\n            new i(k).kill();\n            return j();\n        };\n    };\n    g(i.prototype, {\n        preventDefault: function() {\n            var j = this.JSBNG__event;\n            if (j.preventDefault) {\n                j.preventDefault();\n                if (!((\"defaultPrevented\" in j))) {\n                    j.defaultPrevented = true;\n                }\n            ;\n            ;\n            }\n             else j.returnValue = false;\n        ;\n        ;\n            return this;\n        },\n        isDefaultPrevented: function() {\n            var j = this.JSBNG__event;\n            return ((((\"defaultPrevented\" in j)) ? j.defaultPrevented : ((j.returnValue === false))));\n        },\n        stopPropagation: function() {\n            var j = this.JSBNG__event;\n            ((j.stopPropagation ? j.stopPropagation() : j.cancelBubble = true));\n            return this;\n        },\n        kill: function() {\n            this.stopPropagation().preventDefault();\n            return this;\n        }\n    });\n    e.exports = i;\n});\n__d(\"getObjectValues\", [\"hasArrayNature\",], function(a, b, c, d, e, f) {\n    var g = b(\"hasArrayNature\");\n    function h(i) {\n        var j = [];\n        {\n            var fin29keys = ((window.top.JSBNG_Replay.forInKeys)((i))), fin29i = (0);\n            var k;\n            for (; (fin29i < fin29keys.length); (fin29i++)) {\n                ((k) = (fin29keys[fin29i]));\n                {\n                    j.push(i[k]);\n                ;\n                };\n            };\n        };\n    ;\n        return j;\n    };\n;\n    e.exports = h;\n});\n__d(\"JSBNG__Event\", [\"event-form-bubbling\",\"Arbiter\",\"DataStore\",\"DOMQuery\",\"DOMEvent\",\"ErrorUtils\",\"Parent\",\"UserAgent\",\"$\",\"copyProperties\",\"getObjectValues\",], function(a, b, c, d, e, f) {\n    b(\"event-form-bubbling\");\n    var g = b(\"Arbiter\"), h = b(\"DataStore\"), i = b(\"DOMQuery\"), j = b(\"DOMEvent\"), k = b(\"ErrorUtils\"), l = b(\"Parent\"), m = b(\"UserAgent\"), n = b(\"$\"), o = b(\"copyProperties\"), p = b(\"getObjectValues\"), q = a.JSBNG__Event;\n    q.DATASTORE_KEY = \"JSBNG__Event.listeners\";\n    if (!q.prototype) {\n        q.prototype = {\n        };\n    }\n;\n;\n    function r(ca) {\n        if (((((((ca.type === \"click\")) || ((ca.type === \"mouseover\")))) || ((ca.type === \"keydown\"))))) {\n            g.inform(\"Event/stop\", {\n                JSBNG__event: ca\n            });\n        }\n    ;\n    ;\n    };\n;\n    function s(ca, da, ea) {\n        this.target = ca;\n        this.type = da;\n        this.data = ea;\n    };\n;\n    o(s.prototype, {\n        getData: function() {\n            this.data = ((this.data || {\n            }));\n            return this.data;\n        },\n        JSBNG__stop: function() {\n            return q.JSBNG__stop(this);\n        },\n        prevent: function() {\n            return q.prevent(this);\n        },\n        isDefaultPrevented: function() {\n            return q.isDefaultPrevented(this);\n        },\n        kill: function() {\n            return q.kill(this);\n        },\n        getTarget: function() {\n            return ((new j(this).target || null));\n        }\n    });\n    function t(ca) {\n        if (((ca instanceof s))) {\n            return ca;\n        }\n    ;\n    ;\n        if (!ca) {\n            if (((!window.JSBNG__addEventListener && JSBNG__document.createEventObject))) {\n                ca = ((window.JSBNG__event ? JSBNG__document.createEventObject(window.JSBNG__event) : {\n                }));\n            }\n             else ca = {\n            };\n        ;\n        }\n    ;\n    ;\n        if (!ca._inherits_from_prototype) {\n            {\n                var fin30keys = ((window.top.JSBNG_Replay.forInKeys)((q.prototype))), fin30i = (0);\n                var da;\n                for (; (fin30i < fin30keys.length); (fin30i++)) {\n                    ((da) = (fin30keys[fin30i]));\n                    {\n                        try {\n                            ca[da] = q.prototype[da];\n                        } catch (ea) {\n                        \n                        };\n                    ;\n                    };\n                };\n            };\n        }\n    ;\n    ;\n        return ca;\n    };\n;\n    o(q.prototype, {\n        _inherits_from_prototype: true,\n        getRelatedTarget: function() {\n            var ca = ((this.relatedTarget || ((((this.fromElement === this.srcElement)) ? this.toElement : this.fromElement))));\n            return ((((ca && ca.nodeType)) ? ca : null));\n        },\n        getModifiers: function() {\n            var ca = {\n                control: !!this.ctrlKey,\n                shift: !!this.shiftKey,\n                alt: !!this.altKey,\n                meta: !!this.metaKey\n            };\n            ca.access = ((m.osx() ? ca.control : ca.alt));\n            ca.any = ((((((ca.control || ca.shift)) || ca.alt)) || ca.meta));\n            return ca;\n        },\n        isRightClick: function() {\n            if (this.which) {\n                return ((this.which === 3));\n            }\n        ;\n        ;\n            return ((this.button && ((this.button === 2))));\n        },\n        isMiddleClick: function() {\n            if (this.which) {\n                return ((this.which === 2));\n            }\n        ;\n        ;\n            return ((this.button && ((this.button === 4))));\n        },\n        isDefaultRequested: function() {\n            return ((((this.getModifiers().any || this.isMiddleClick())) || this.isRightClick()));\n        }\n    });\n    o(q.prototype, s.prototype);\n    o(q, {\n        listen: function(ca, da, ea, fa) {\n            if (((typeof ca == \"string\"))) {\n                ca = n(ca);\n            }\n        ;\n        ;\n            if (((typeof fa == \"undefined\"))) {\n                fa = q.Priority.NORMAL;\n            }\n        ;\n        ;\n            if (((typeof da == \"object\"))) {\n                var ga = {\n                };\n                {\n                    var fin31keys = ((window.top.JSBNG_Replay.forInKeys)((da))), fin31i = (0);\n                    var ha;\n                    for (; (fin31i < fin31keys.length); (fin31i++)) {\n                        ((ha) = (fin31keys[fin31i]));\n                        {\n                            ga[ha] = q.listen(ca, ha, da[ha], fa);\n                        ;\n                        };\n                    };\n                };\n            ;\n                return ga;\n            }\n        ;\n        ;\n            if (da.match(/^on/i)) {\n                throw new TypeError(((((\"Bad event name `\" + da)) + \"': use `click', not `onclick'.\")));\n            }\n        ;\n        ;\n            if (((((ca.nodeName == \"LABEL\")) && ((da == \"click\"))))) {\n                var ia = ca.getElementsByTagName(\"input\");\n                ca = ((((ia.length == 1)) ? ia[0] : ca));\n            }\n             else if (((((ca === window)) && ((da === \"JSBNG__scroll\"))))) {\n                var ja = i.getDocumentScrollElement();\n                if (((((ja !== JSBNG__document.documentElement)) && ((ja !== JSBNG__document.body))))) {\n                    ca = ja;\n                }\n            ;\n            ;\n            }\n            \n        ;\n        ;\n            var ka = h.get(ca, v, {\n            });\n            if (x[da]) {\n                var la = x[da];\n                da = la.base;\n                if (la.wrap) {\n                    ea = la.wrap(ea);\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            z(ca, da);\n            var ma = ka[da];\n            if (!((fa in ma))) {\n                ma[fa] = [];\n            }\n        ;\n        ;\n            var na = ma[fa].length, oa = new ba(ea, ma[fa], na);\n            ma[fa].push(oa);\n            return oa;\n        },\n        JSBNG__stop: function(ca) {\n            var da = new j(ca).stopPropagation();\n            r(da.JSBNG__event);\n            return ca;\n        },\n        prevent: function(ca) {\n            new j(ca).preventDefault();\n            return ca;\n        },\n        isDefaultPrevented: function(ca) {\n            return new j(ca).isDefaultPrevented(ca);\n        },\n        kill: function(ca) {\n            var da = new j(ca).kill();\n            r(da.JSBNG__event);\n            return false;\n        },\n        getKeyCode: function(JSBNG__event) {\n            JSBNG__event = new j(JSBNG__event).JSBNG__event;\n            if (!JSBNG__event) {\n                return false;\n            }\n        ;\n        ;\n            switch (JSBNG__event.keyCode) {\n              case 63232:\n                return 38;\n              case 63233:\n                return 40;\n              case 63234:\n                return 37;\n              case 63235:\n                return 39;\n              case 63272:\n            \n              case 63273:\n            \n              case 63275:\n                return null;\n              case 63276:\n                return 33;\n              case 63277:\n                return 34;\n            };\n        ;\n            if (JSBNG__event.shiftKey) {\n                switch (JSBNG__event.keyCode) {\n                  case 33:\n                \n                  case 34:\n                \n                  case 37:\n                \n                  case 38:\n                \n                  case 39:\n                \n                  case 40:\n                    return null;\n                };\n            }\n        ;\n        ;\n            return JSBNG__event.keyCode;\n        },\n        getPriorities: function() {\n            if (!u) {\n                var ca = p(q.Priority);\n                ca.sort(function(da, ea) {\n                    return ((da - ea));\n                });\n                u = ca;\n            }\n        ;\n        ;\n            return u;\n        },\n        fire: function(ca, da, ea) {\n            var fa = new s(ca, da, ea), ga;\n            do {\n                var ha = q.__getHandler(ca, da);\n                if (ha) {\n                    ga = ha(fa);\n                }\n            ;\n            ;\n                ca = ca.parentNode;\n            } while (((((ca && ((ga !== false)))) && !fa.cancelBubble)));\n            return ((ga !== false));\n        },\n        __fire: function(ca, da, JSBNG__event) {\n            var ea = q.__getHandler(ca, da);\n            if (ea) {\n                return ea(t(JSBNG__event));\n            }\n        ;\n        ;\n        },\n        __getHandler: function(ca, da) {\n            return h.get(ca, ((q.DATASTORE_KEY + da)));\n        },\n        getPosition: function(ca) {\n            ca = new j(ca).JSBNG__event;\n            var da = i.getDocumentScrollElement(), ea = ((ca.clientX + da.scrollLeft)), fa = ((ca.clientY + da.scrollTop));\n            return {\n                x: ea,\n                y: fa\n            };\n        }\n    });\n    var u = null, v = q.DATASTORE_KEY, w = function(ca) {\n        return function(da) {\n            if (!i.contains(this, da.getRelatedTarget())) {\n                return ca.call(this, da);\n            }\n        ;\n        ;\n        };\n    }, x;\n    if (!window.JSBNG__navigator.msPointerEnabled) {\n        x = {\n            mouseenter: {\n                base: \"mouseover\",\n                wrap: w\n            },\n            mouseleave: {\n                base: \"mouseout\",\n                wrap: w\n            }\n        };\n    }\n     else x = {\n        mousedown: {\n            base: \"MSPointerDown\"\n        },\n        mousemove: {\n            base: \"MSPointerMove\"\n        },\n        mouseup: {\n            base: \"MSPointerUp\"\n        },\n        mouseover: {\n            base: \"MSPointerOver\"\n        },\n        mouseout: {\n            base: \"MSPointerOut\"\n        },\n        mouseenter: {\n            base: \"MSPointerOver\",\n            wrap: w\n        },\n        mouseleave: {\n            base: \"MSPointerOut\",\n            wrap: w\n        }\n    };\n;\n;\n    if (m.firefox()) {\n        var y = function(ca, JSBNG__event) {\n            JSBNG__event = t(JSBNG__event);\n            var da = JSBNG__event.getTarget();\n            while (da) {\n                q.__fire(da, ca, JSBNG__event);\n                da = da.parentNode;\n            };\n        ;\n        };\n        JSBNG__document.documentElement.JSBNG__addEventListener(\"JSBNG__focus\", y.curry(\"focusin\"), true);\n        JSBNG__document.documentElement.JSBNG__addEventListener(\"JSBNG__blur\", y.curry(\"focusout\"), true);\n    }\n;\n;\n    var z = function(ca, da) {\n        var ea = ((\"JSBNG__on\" + da)), fa = aa.bind(ca, da), ga = h.get(ca, v);\n        if (((da in ga))) {\n            return;\n        }\n    ;\n    ;\n        ga[da] = {\n        };\n        if (ca.JSBNG__addEventListener) {\n            ca.JSBNG__addEventListener(da, fa, false);\n        }\n         else if (ca.JSBNG__attachEvent) {\n            ca.JSBNG__attachEvent(ea, fa);\n        }\n        \n    ;\n    ;\n        h.set(ca, ((v + da)), fa);\n        if (ca[ea]) {\n            var ha = ((((ca === JSBNG__document.documentElement)) ? q.Priority._BUBBLE : q.Priority.TRADITIONAL)), ia = ca[ea];\n            ca[ea] = null;\n            q.listen(ca, da, ia, ha);\n        }\n    ;\n    ;\n        if (((((ca.nodeName === \"FORM\")) && ((da === \"submit\"))))) {\n            q.listen(ca, da, q.__bubbleSubmit.curry(ca), q.Priority._BUBBLE);\n        }\n    ;\n    ;\n    }, aa = k.guard(function(ca, JSBNG__event) {\n        JSBNG__event = t(JSBNG__event);\n        if (!h.get(this, v)) {\n            throw new Error(\"Bad listenHandler context.\");\n        }\n    ;\n    ;\n        var da = h.get(this, v)[ca];\n        if (!da) {\n            throw new Error(((((\"No registered handlers for `\" + ca)) + \"'.\")));\n        }\n    ;\n    ;\n        if (((ca == \"click\"))) {\n            var ea = l.byTag(JSBNG__event.getTarget(), \"a\");\n            if (window.userAction) {\n                var fa = window.userAction(\"evt_ext\", ea, JSBNG__event, {\n                    mode: \"DEDUP\"\n                }).uai_fallback(\"click\");\n                if (window.ArbiterMonitor) {\n                    window.ArbiterMonitor.initUA(fa, [ea,]);\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            if (window.clickRefAction) {\n                window.clickRefAction(\"click\", ea, JSBNG__event);\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n        var ga = q.getPriorities();\n        for (var ha = 0; ((ha < ga.length)); ha++) {\n            var ia = ga[ha];\n            if (((ia in da))) {\n                var ja = da[ia];\n                for (var ka = 0; ((ka < ja.length)); ka++) {\n                    if (!ja[ka]) {\n                        continue;\n                    }\n                ;\n                ;\n                    var la = ja[ka].fire(this, JSBNG__event);\n                    if (((la === false))) {\n                        return JSBNG__event.kill();\n                    }\n                     else if (JSBNG__event.cancelBubble) {\n                        JSBNG__event.JSBNG__stop();\n                    }\n                    \n                ;\n                ;\n                };\n            ;\n            }\n        ;\n        ;\n        };\n    ;\n        return JSBNG__event.returnValue;\n    });\n    q.Priority = {\n        URGENT: -20,\n        TRADITIONAL: -10,\n        NORMAL: 0,\n        _BUBBLE: 1000\n    };\n    function ba(ca, da, ea) {\n        this._handler = ca;\n        this._container = da;\n        this._index = ea;\n    };\n;\n    o(ba.prototype, {\n        remove: function() {\n            delete this._handler;\n            delete this._container[this._index];\n        },\n        fire: function(ca, JSBNG__event) {\n            return k.applyWithGuard(this._handler, ca, [JSBNG__event,], function(da) {\n                da.event_type = JSBNG__event.type;\n                da.dom_element = ((ca.JSBNG__name || ca.id));\n                da.category = \"eventhandler\";\n            });\n        }\n    });\n    a.$E = q.$E = t;\n    e.exports = q;\n});\n__d(\"evalGlobal\", [], function(a, b, c, d, e, f) {\n    function g(h) {\n        if (((typeof h != \"string\"))) {\n            throw new TypeError(\"JS sent to evalGlobal is not a string. Only strings are permitted.\");\n        }\n    ;\n    ;\n        if (!h) {\n            return;\n        }\n    ;\n    ;\n        var i = JSBNG__document.createElement(\"script\");\n        try {\n            i.appendChild(JSBNG__document.createTextNode(h));\n        } catch (j) {\n            i.text = h;\n        };\n    ;\n        var k = ((JSBNG__document.getElementsByTagName(\"head\")[0] || JSBNG__document.documentElement));\n        k.appendChild(i);\n        k.removeChild(i);\n    };\n;\n    e.exports = g;\n});\n__d(\"HTML\", [\"function-extensions\",\"Bootloader\",\"UserAgent\",\"copyProperties\",\"createArrayFrom\",\"emptyFunction\",\"evalGlobal\",], function(a, b, c, d, e, f) {\n    b(\"function-extensions\");\n    var g = b(\"Bootloader\"), h = b(\"UserAgent\"), i = b(\"copyProperties\"), j = b(\"createArrayFrom\"), k = b(\"emptyFunction\"), l = b(\"evalGlobal\");\n    function m(n) {\n        if (((n && ((typeof n.__html == \"string\"))))) {\n            n = n.__html;\n        }\n    ;\n    ;\n        if (!((this instanceof m))) {\n            if (((n instanceof m))) {\n                return n;\n            }\n        ;\n        ;\n            return new m(n);\n        }\n    ;\n    ;\n        this._content = n;\n        this._defer = false;\n        this._extra_action = \"\";\n        this._nodes = null;\n        this._inline_js = k;\n        this._rootNode = null;\n        return this;\n    };\n;\n    m.isHTML = function(n) {\n        return ((n && ((((n instanceof m)) || ((n.__html !== undefined))))));\n    };\n    m.replaceJSONWrapper = function(n) {\n        return ((((n && ((n.__html !== undefined)))) ? new m(n.__html) : n));\n    };\n    i(m.prototype, {\n        toString: function() {\n            var n = ((this._content || \"\"));\n            if (this._extra_action) {\n                n += ((((((\"\\u003Cscript type=\\\"text/javascript\\\"\\u003E\" + this._extra_action)) + \"\\u003C/scr\")) + \"ipt\\u003E\"));\n            }\n        ;\n        ;\n            return n;\n        },\n        setAction: function(n) {\n            this._extra_action = n;\n            return this;\n        },\n        getAction: function() {\n            this._fillCache();\n            var n = function() {\n                this._inline_js();\n                l(this._extra_action);\n            }.bind(this);\n            if (this.getDeferred()) {\n                return n.defer.bind(n);\n            }\n             else return n\n        ;\n        },\n        setDeferred: function(n) {\n            this._defer = !!n;\n            return this;\n        },\n        getDeferred: function() {\n            return this._defer;\n        },\n        getContent: function() {\n            return this._content;\n        },\n        getNodes: function() {\n            this._fillCache();\n            return this._nodes;\n        },\n        getRootNode: function() {\n            var n = this.getNodes();\n            if (((n.length === 1))) {\n                this._rootNode = n[0];\n            }\n             else {\n                var o = JSBNG__document.createDocumentFragment();\n                for (var p = 0; ((p < n.length)); p++) {\n                    o.appendChild(n[p]);\n                ;\n                };\n            ;\n                this._rootNode = o;\n            }\n        ;\n        ;\n            return this._rootNode;\n        },\n        _fillCache: function() {\n            if (((null !== this._nodes))) {\n                return;\n            }\n        ;\n        ;\n            var n = this._content;\n            if (!n) {\n                this._nodes = [];\n                return;\n            }\n        ;\n        ;\n            n = n.replace(/(<(\\w+)[^>]*?)\\/>/g, function(y, z, aa) {\n                return ((aa.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i) ? y : ((((((z + \"\\u003E\\u003C/\")) + aa)) + \"\\u003E\"))));\n            });\n            var o = n.trim().toLowerCase(), p = JSBNG__document.createElement(\"div\"), q = false, r = ((((((((((((((!o.indexOf(\"\\u003Copt\") && [1,\"\\u003Cselect multiple=\\\"multiple\\\" class=\\\"__WRAPPER\\\"\\u003E\",\"\\u003C/select\\u003E\",])) || ((!o.indexOf(\"\\u003Cleg\") && [1,\"\\u003Cfieldset class=\\\"__WRAPPER\\\"\\u003E\",\"\\u003C/fieldset\\u003E\",])))) || ((o.match(/^<(thead|tbody|tfoot|colg|cap)/) && [1,\"\\u003Ctable class=\\\"__WRAPPER\\\"\\u003E\",\"\\u003C/table\\u003E\",])))) || ((!o.indexOf(\"\\u003Ctr\") && [2,\"\\u003Ctable\\u003E\\u003Ctbody class=\\\"__WRAPPER\\\"\\u003E\",\"\\u003C/tbody\\u003E\\u003C/table\\u003E\",])))) || ((((!o.indexOf(\"\\u003Ctd\") || !o.indexOf(\"\\u003Cth\"))) && [3,\"\\u003Ctable\\u003E\\u003Ctbody\\u003E\\u003Ctr class=\\\"__WRAPPER\\\"\\u003E\",\"\\u003C/tr\\u003E\\u003C/tbody\\u003E\\u003C/table\\u003E\",])))) || ((!o.indexOf(\"\\u003Ccol\") && [2,\"\\u003Ctable\\u003E\\u003Ctbody\\u003E\\u003C/tbody\\u003E\\u003Ccolgroup class=\\\"__WRAPPER\\\"\\u003E\",\"\\u003C/colgroup\\u003E\\u003C/table\\u003E\",])))) || null));\n            if (((null === r))) {\n                p.className = \"__WRAPPER\";\n                if (h.ie()) {\n                    r = [0,\"\\u003Cspan style=\\\"display:none\\\"\\u003E&nbsp;\\u003C/span\\u003E\",\"\",];\n                    q = true;\n                }\n                 else r = [0,\"\",\"\",];\n            ;\n            ;\n            }\n        ;\n        ;\n            p.innerHTML = ((((r[1] + n)) + r[2]));\n            while (r[0]--) {\n                p = p.lastChild;\n            ;\n            };\n        ;\n            if (q) {\n                p.removeChild(p.firstChild);\n            }\n        ;\n        ;\n            ((p.className != \"__WRAPPER\"));\n            if (h.ie()) {\n                var s;\n                if (((!o.indexOf(\"\\u003Ctable\") && ((-1 == o.indexOf(\"\\u003Ctbody\")))))) {\n                    s = ((p.firstChild && p.firstChild.childNodes));\n                }\n                 else if (((((r[1] == \"\\u003Ctable\\u003E\")) && ((-1 == o.indexOf(\"\\u003Ctbody\")))))) {\n                    s = p.childNodes;\n                }\n                 else s = [];\n                \n            ;\n            ;\n                for (var t = ((s.length - 1)); ((t >= 0)); --t) {\n                    if (((((s[t].nodeName && ((s[t].nodeName.toLowerCase() == \"tbody\")))) && ((s[t].childNodes.length == 0))))) {\n                        s[t].parentNode.removeChild(s[t]);\n                    }\n                ;\n                ;\n                };\n            ;\n            }\n        ;\n        ;\n            var u = p.getElementsByTagName(\"script\"), v = [];\n            for (var w = 0; ((w < u.length)); w++) {\n                if (u[w].src) {\n                    v.push(g.requestJSResource.bind(g, u[w].src));\n                }\n                 else v.push(l.bind(null, u[w].innerHTML));\n            ;\n            ;\n            };\n        ;\n            for (var w = ((u.length - 1)); ((w >= 0)); w--) {\n                u[w].parentNode.removeChild(u[w]);\n            ;\n            };\n        ;\n            var x = function() {\n                for (var y = 0; ((y < v.length)); y++) {\n                    v[y]();\n                ;\n                };\n            ;\n            };\n            this._nodes = j(p.childNodes);\n            this._inline_js = x;\n        }\n    });\n    e.exports = m;\n});\n__d(\"isScalar\", [], function(a, b, c, d, e, f) {\n    function g(h) {\n        return (/string|number|boolean/).test(typeof h);\n    };\n;\n    e.exports = g;\n});\n__d(\"JSBNG__Intl\", [], function(a, b, c, d, e, f) {\n    var g;\n    function h(j) {\n        if (((typeof j != \"string\"))) {\n            return false;\n        }\n    ;\n    ;\n        return j.match(new RegExp(((((((((((((((((((((((((((((((((((((((((((((((((((((h.punct_char_class + \"[\")) + \")\\\"\")) + \"'\")) + \"\\u00bb\")) + \"\\u0f3b\")) + \"\\u0f3d\")) + \"\\u2019\")) + \"\\u201d\")) + \"\\u203a\")) + \"\\u3009\")) + \"\\u300b\")) + \"\\u300d\")) + \"\\u300f\")) + \"\\u3011\")) + \"\\u3015\")) + \"\\u3017\")) + \"\\u3019\")) + \"\\u301b\")) + \"\\u301e\")) + \"\\u301f\")) + \"\\ufd3f\")) + \"\\uff07\")) + \"\\uff09\")) + \"\\uff3d\")) + \"\\\\s\")) + \"]*$\"))));\n    };\n;\n    h.punct_char_class = ((((((((((((((((((((((\"[\" + \".!?\")) + \"\\u3002\")) + \"\\uff01\")) + \"\\uff1f\")) + \"\\u0964\")) + \"\\u2026\")) + \"\\u0eaf\")) + \"\\u1801\")) + \"\\u0e2f\")) + \"\\uff0e\")) + \"]\"));\n    function i(j) {\n        if (g) {\n            var k = [], l = [];\n            {\n                var fin32keys = ((window.top.JSBNG_Replay.forInKeys)((g.patterns))), fin32i = (0);\n                var m;\n                for (; (fin32i < fin32keys.length); (fin32i++)) {\n                    ((m) = (fin32keys[fin32i]));\n                    {\n                        var n = g.patterns[m];\n                        {\n                            var fin33keys = ((window.top.JSBNG_Replay.forInKeys)((g.meta))), fin33i = (0);\n                            var o;\n                            for (; (fin33i < fin33keys.length); (fin33i++)) {\n                                ((o) = (fin33keys[fin33i]));\n                                {\n                                    var p = new RegExp(o.slice(1, -1), \"g\"), q = g.meta[o];\n                                    m = m.replace(p, q);\n                                    n = n.replace(p, q);\n                                };\n                            };\n                        };\n                    ;\n                        k.push(m);\n                        l.push(n);\n                    };\n                };\n            };\n        ;\n            for (var r = 0; ((r < k.length)); r++) {\n                var s = new RegExp(k[r].slice(1, -1), \"g\");\n                if (((l[r] == \"javascript\"))) {\n                    j.replace(s, function(t) {\n                        return t.slice(1).toLowerCase();\n                    });\n                }\n                 else j = j.replace(s, l[r]);\n            ;\n            ;\n            };\n        ;\n        }\n    ;\n    ;\n        return j.replace(/\\x01/g, \"\");\n    };\n;\n    e.exports = {\n        endsInPunct: h,\n        applyPhonologicalRules: i,\n        setPhonologicalRules: function(j) {\n            g = j;\n        }\n    };\n});\n__d(\"substituteTokens\", [\"invariant\",\"JSBNG__Intl\",], function(a, b, c, d, e, f) {\n    var g = b(\"invariant\"), h = b(\"JSBNG__Intl\");\n    function i(j, k) {\n        if (!k) {\n            return j;\n        }\n    ;\n    ;\n        g(((typeof k === \"object\")));\n        var l = ((((\"\\\\{([^}]+)\\\\}(\" + h.endsInPunct.punct_char_class)) + \"*)\")), m = new RegExp(l, \"g\"), n = [], o = j.replace(m, function(r, s, t) {\n            var u = k[s];\n            if (((u && ((typeof u === \"object\"))))) {\n                n.push(u);\n                return ((\"\\u0017\" + t));\n            }\n        ;\n        ;\n            return ((u + ((h.endsInPunct(u) ? \"\" : t))));\n        }).split(\"\\u0017\").map(h.applyPhonologicalRules);\n        if (((o.length === 1))) {\n            return o[0];\n        }\n    ;\n    ;\n        var p = [o[0],];\n        for (var q = 0; ((q < n.length)); q++) {\n            p.push(n[q], o[((q + 1))]);\n        ;\n        };\n    ;\n        return p;\n    };\n;\n    e.exports = i;\n});\n__d(\"tx\", [\"substituteTokens\",], function(a, b, c, d, e, f) {\n    var g = b(\"substituteTokens\");\n    function h(i, j) {\n        if (((typeof _string_table == \"undefined\"))) {\n            return;\n        }\n    ;\n    ;\n        i = _string_table[i];\n        return g(i, j);\n    };\n;\n    h._ = g;\n    e.exports = h;\n});\n__d(\"DOM\", [\"function-extensions\",\"DOMQuery\",\"JSBNG__Event\",\"HTML\",\"UserAgent\",\"$\",\"copyProperties\",\"createArrayFrom\",\"isScalar\",\"tx\",], function(a, b, c, d, e, f) {\n    b(\"function-extensions\");\n    var g = b(\"DOMQuery\"), h = b(\"JSBNG__Event\"), i = b(\"HTML\"), j = b(\"UserAgent\"), k = b(\"$\"), l = b(\"copyProperties\"), m = b(\"createArrayFrom\"), n = b(\"isScalar\"), o = b(\"tx\"), p = \"js_\", q = 0, r = {\n    };\n    l(r, g);\n    l(r, {\n        create: function(u, v, w) {\n            var x = JSBNG__document.createElement(u);\n            if (v) {\n                r.setAttributes(x, v);\n            }\n        ;\n        ;\n            if (((w != null))) {\n                r.setContent(x, w);\n            }\n        ;\n        ;\n            return x;\n        },\n        setAttributes: function(u, v) {\n            if (v.type) {\n                u.type = v.type;\n            }\n        ;\n        ;\n            {\n                var fin34keys = ((window.top.JSBNG_Replay.forInKeys)((v))), fin34i = (0);\n                var w;\n                for (; (fin34i < fin34keys.length); (fin34i++)) {\n                    ((w) = (fin34keys[fin34i]));\n                    {\n                        var x = v[w], y = (/^on/i).test(w);\n                        if (((w == \"type\"))) {\n                            continue;\n                        }\n                         else if (((w == \"style\"))) {\n                            if (((typeof x == \"string\"))) {\n                                u.style.cssText = x;\n                            }\n                             else l(u.style, x);\n                        ;\n                        ;\n                        }\n                         else if (y) {\n                            h.listen(u, w.substr(2), x);\n                        }\n                         else if (((w in u))) {\n                            u[w] = x;\n                        }\n                         else if (u.setAttribute) {\n                            u.setAttribute(w, x);\n                        }\n                        \n                        \n                        \n                        \n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n        },\n        prependContent: function(u, v) {\n            return s(v, u, function(w) {\n                ((u.firstChild ? u.insertBefore(w, u.firstChild) : u.appendChild(w)));\n            });\n        },\n        insertAfter: function(u, v) {\n            var w = u.parentNode;\n            return s(v, w, function(x) {\n                ((u.nextSibling ? w.insertBefore(x, u.nextSibling) : w.appendChild(x)));\n            });\n        },\n        insertBefore: function(u, v) {\n            var w = u.parentNode;\n            return s(v, w, function(x) {\n                w.insertBefore(x, u);\n            });\n        },\n        setContent: function(u, v) {\n            r.empty(u);\n            return r.appendContent(u, v);\n        },\n        appendContent: function(u, v) {\n            return s(v, u, function(w) {\n                u.appendChild(w);\n            });\n        },\n        replace: function(u, v) {\n            var w = u.parentNode;\n            return s(v, w, function(x) {\n                w.replaceChild(x, u);\n            });\n        },\n        remove: function(u) {\n            u = k(u);\n            if (u.parentNode) {\n                u.parentNode.removeChild(u);\n            }\n        ;\n        ;\n        },\n        empty: function(u) {\n            u = k(u);\n            while (u.firstChild) {\n                r.remove(u.firstChild);\n            ;\n            };\n        ;\n        },\n        getID: function(u) {\n            var v = u.id;\n            if (!v) {\n                v = ((p + q++));\n                u.id = v;\n            }\n        ;\n        ;\n            return v;\n        }\n    });\n    function s(u, v, w) {\n        u = i.replaceJSONWrapper(u);\n        if (((((((u instanceof i)) && ((\"\" === v.innerHTML)))) && ((-1 === u.toString().indexOf(((\"\\u003Cscr\" + \"ipt\")))))))) {\n            var x = j.ie();\n            if (((!x || ((((x > 7)) && !g.isNodeOfType(v, [\"table\",\"tbody\",\"thead\",\"tfoot\",\"tr\",\"select\",\"fieldset\",])))))) {\n                var y = ((x ? \"\\u003Cem style=\\\"display:none;\\\"\\u003E&nbsp;\\u003C/em\\u003E\" : \"\"));\n                v.innerHTML = ((y + u));\n                ((x && v.removeChild(v.firstChild)));\n                return m(v.childNodes);\n            }\n        ;\n        ;\n        }\n         else if (g.isTextNode(v)) {\n            v.data = u;\n            return [u,];\n        }\n        \n    ;\n    ;\n        var z = JSBNG__document.createDocumentFragment(), aa, ba = [], ca = [];\n        if (!Array.isArray(u)) {\n            u = [u,];\n        }\n    ;\n    ;\n        for (var da = 0; ((da < u.length)); da++) {\n            aa = i.replaceJSONWrapper(u[da]);\n            if (((aa instanceof i))) {\n                ca.push(aa.getAction());\n                var ea = aa.getNodes();\n                for (var fa = 0; ((fa < ea.length)); fa++) {\n                    ba.push(ea[fa]);\n                    z.appendChild(ea[fa]);\n                };\n            ;\n            }\n             else if (n(aa)) {\n                var ga = JSBNG__document.createTextNode(aa);\n                ba.push(ga);\n                z.appendChild(ga);\n            }\n             else if (g.isNode(aa)) {\n                ba.push(aa);\n                z.appendChild(aa);\n            }\n            \n            \n        ;\n        ;\n        };\n    ;\n        w(z);\n        ca.forEach(function(ha) {\n            ha();\n        });\n        return ba;\n    };\n;\n    function t(u) {\n        function v(w) {\n            return r.create(\"div\", {\n            }, w).innerHTML;\n        };\n    ;\n        return function(w, x) {\n            var y = {\n            };\n            if (x) {\n                {\n                    var fin35keys = ((window.top.JSBNG_Replay.forInKeys)((x))), fin35i = (0);\n                    var z;\n                    for (; (fin35i < fin35keys.length); (fin35i++)) {\n                        ((z) = (fin35keys[fin35i]));\n                        {\n                            y[z] = v(x[z]);\n                        ;\n                        };\n                    };\n                };\n            }\n        ;\n        ;\n            return i(u(w, y));\n        };\n    };\n;\n    r.tx = t(o);\n    r.tx._ = r._tx = t(o._);\n    e.exports = r;\n});\n__d(\"LinkshimAsyncLink\", [\"$\",\"AsyncSignal\",\"DOM\",\"UserAgent\",], function(a, b, c, d, e, f) {\n    var g = b(\"$\"), h = b(\"AsyncSignal\"), i = b(\"DOM\"), j = b(\"UserAgent\"), k = {\n        swap: function(l, m) {\n            var n = ((j.ie() <= 8));\n            if (n) {\n                var o = i.create(\"wbr\", {\n                }, null);\n                i.appendContent(l, o);\n            }\n        ;\n        ;\n            l.href = m;\n            if (n) {\n                i.remove(o);\n            }\n        ;\n        ;\n        },\n        referrer_log: function(l, m, n) {\n            var o = g(\"meta_referrer\");\n            o.JSBNG__content = \"origin\";\n            k.swap(l, m);\n            (function() {\n                o.JSBNG__content = \"default\";\n                new h(n, {\n                }).send();\n            }).defer(100);\n        }\n    };\n    e.exports = k;\n});\n__d(\"legacy:dom-asynclinkshim\", [\"LinkshimAsyncLink\",], function(a, b, c, d) {\n    a.LinkshimAsyncLink = b(\"LinkshimAsyncLink\");\n}, 3);\n__d(\"CookieCore\", [], function(a, b, c, d, e, f) {\n    var g = {\n        set: function(h, i, j, k, l) {\n            JSBNG__document.cookie = ((((((((((((((((((h + \"=\")) + encodeURIComponent(i))) + \"; \")) + ((j ? ((((\"expires=\" + (new JSBNG__Date(((JSBNG__Date.now() + j)))).toGMTString())) + \"; \")) : \"\")))) + \"path=\")) + ((k || \"/\")))) + \"; domain=\")) + window.JSBNG__location.hostname.replace(/^.*(\\.facebook\\..*)$/i, \"$1\"))) + ((l ? \"; secure\" : \"\"))));\n        },\n        clear: function(h, i) {\n            i = ((i || \"/\"));\n            JSBNG__document.cookie = ((((((((((h + \"=; expires=Thu, 01-Jan-1970 00:00:01 GMT; \")) + \"path=\")) + i)) + \"; domain=\")) + window.JSBNG__location.hostname.replace(/^.*(\\.facebook\\..*)$/i, \"$1\")));\n        },\n        get: function(h) {\n            var i = JSBNG__document.cookie.match(((((\"(?:^|;\\\\s*)\" + h)) + \"=(.*?)(?:;|$)\")));\n            return ((i ? decodeURIComponent(i[1]) : i));\n        }\n    };\n    e.exports = g;\n});\n__d(\"Cookie\", [\"CookieCore\",\"Env\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"CookieCore\"), h = b(\"Env\"), i = b(\"copyProperties\");\n    function j(l, m, n, o, p) {\n        if (((h.no_cookies && ((l != \"tpa\"))))) {\n            return;\n        }\n    ;\n    ;\n        g.set(l, m, n, o, p);\n    };\n;\n    var k = i({\n    }, g);\n    k.set = j;\n    e.exports = k;\n});\n__d(\"detect_broken_proxy_cache\", [\"AsyncSignal\",\"Cookie\",\"URI\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncSignal\"), h = b(\"Cookie\"), i = b(\"URI\");\n    function j(k, l) {\n        var m = h.get(l);\n        if (((((((m != k)) && ((m != null)))) && ((k != \"0\"))))) {\n            var n = {\n                c: \"si_detect_broken_proxy_cache\",\n                m: ((((((((l + \" \")) + k)) + \" \")) + m))\n            }, o = new i(\"/common/scribe_endpoint.php\").getQualifiedURI().toString();\n            new g(o, n).send();\n        }\n    ;\n    ;\n    };\n;\n    e.exports = j;\n});\n__d(\"legacy:detect-broken-proxy-cache\", [\"detect_broken_proxy_cache\",], function(a, b, c, d) {\n    a.detect_broken_proxy_cache = b(\"detect_broken_proxy_cache\");\n}, 3);\n__d(\"link_rel_preload\", [\"Bootloader\",\"Parent\",], function(a, b, c, d, e, f) {\n    var g = b(\"Bootloader\"), h = b(\"Parent\");\n    function i() {\n        var j = /async(?:-post)?|dialog(?:-pipe|-post)?|theater|toggle/;\n        JSBNG__document.documentElement.JSBNG__onmousedown = function(k) {\n            k = ((k || window.JSBNG__event));\n            var l = ((k.target || k.srcElement)), m = h.byTag(l, \"A\");\n            if (!m) {\n                return;\n            }\n        ;\n        ;\n            var n = m.getAttribute(\"ajaxify\"), o = m.href, p = ((n || o));\n            if (((((n && o)) && !(/#$/).test(o)))) {\n                var q = ((k.which && ((k.which != 1)))), r = ((((((k.altKey || k.ctrlKey)) || k.metaKey)) || k.shiftKey));\n                if (((q || r))) {\n                    return;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            var s = ((m.rel && m.rel.match(j)));\n            s = ((s && s[0]));\n            switch (s) {\n              case \"dialog\":\n            \n              case \"dialog-post\":\n                g.loadModules([\"Dialog\",]);\n                break;\n              case \"dialog-pipe\":\n                g.loadModules([\"AjaxPipeRequest\",\"Dialog\",]);\n                break;\n              case \"async\":\n            \n              case \"async-post\":\n                g.loadModules([\"AsyncRequest\",]);\n                break;\n              case \"theater\":\n                g.loadModules([\"PhotoSnowlift\",], function(t) {\n                    t.preload(p, m);\n                });\n                break;\n              case \"toggle\":\n                g.loadModules([\"Toggler\",]);\n                break;\n            };\n        ;\n            return;\n        };\n    };\n;\n    e.exports = i;\n});\n__d(\"legacy:link-rel-preload\", [\"link_rel_preload\",], function(a, b, c, d) {\n    a.link_rel_preload = b(\"link_rel_preload\");\n}, 3);\n__d(\"AsyncResponse\", [\"Bootloader\",\"Env\",\"copyProperties\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Bootloader\"), h = b(\"Env\"), i = b(\"copyProperties\"), j = b(\"tx\");\n    function k(l, m) {\n        i(this, {\n            error: 0,\n            errorSummary: null,\n            errorDescription: null,\n            JSBNG__onload: null,\n            replay: false,\n            payload: ((m || null)),\n            request: ((l || null)),\n            silentError: false,\n            transientError: false,\n            is_last: true\n        });\n        return this;\n    };\n;\n    i(k, {\n        defaultErrorHandler: function(l) {\n            try {\n                if (!l.silentError) {\n                    k.verboseErrorHandler(l);\n                }\n                 else l.logErrorByGroup(\"silent\", 10);\n            ;\n            ;\n            } catch (m) {\n                JSBNG__alert(l);\n            };\n        ;\n        },\n        verboseErrorHandler: function(l) {\n            try {\n                var n = l.getErrorSummary(), o = l.getErrorDescription();\n                l.logErrorByGroup(\"popup\", 10);\n                if (((l.silentError && ((o == \"\"))))) {\n                    o = \"Something went wrong. We're working on getting this fixed as soon as we can. You may be able to try again.\";\n                }\n            ;\n            ;\n                g.loadModules([\"Dialog\",], function(p) {\n                    new p().setTitle(n).setBody(o).setButtons([p.OK,]).setModal(true).setCausalElement(this.relativeTo).show();\n                });\n            } catch (m) {\n                JSBNG__alert(l);\n            };\n        ;\n        }\n    });\n    i(k.prototype, {\n        getRequest: function() {\n            return this.request;\n        },\n        getPayload: function() {\n            return this.payload;\n        },\n        getError: function() {\n            return this.error;\n        },\n        getErrorSummary: function() {\n            return this.errorSummary;\n        },\n        setErrorSummary: function(l) {\n            l = ((((l === undefined)) ? null : l));\n            this.errorSummary = l;\n            return this;\n        },\n        getErrorDescription: function() {\n            return this.errorDescription;\n        },\n        getErrorIsWarning: function() {\n            return this.errorIsWarning;\n        },\n        isTransient: function() {\n            return this.transientError;\n        },\n        logError: function(l, m) {\n            var n = a.ErrorSignal;\n            if (n) {\n                var o = {\n                    err_code: this.error,\n                    vip: ((h.vip || \"-\"))\n                };\n                if (m) {\n                    o.duration = m.duration;\n                    o.xfb_ip = m.xfb_ip;\n                }\n            ;\n            ;\n                var p = this.request.getURI();\n                o.path = ((p || \"-\"));\n                o.aid = this.request.userActionID;\n                if (((p && ((p.indexOf(\"scribe_endpoint.php\") != -1))))) {\n                    l = \"async_error_double\";\n                }\n            ;\n            ;\n                n.sendErrorSignal(l, JSON.stringify(o));\n            }\n        ;\n        ;\n        },\n        logErrorByGroup: function(l, m) {\n            if (((Math.floor(((Math.JSBNG__random() * m))) == 0))) {\n                if (((((this.error == 1357010)) || ((this.error < 15000))))) {\n                    this.logError(((\"async_error_oops_\" + l)));\n                }\n                 else this.logError(((\"async_error_logic_\" + l)));\n            ;\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = k;\n});\n__d(\"HTTPErrors\", [\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"emptyFunction\"), h = {\n        get: g,\n        getAll: g\n    };\n    e.exports = h;\n});\n__d(\"bind\", [], function(a, b, c, d, e, f) {\n    function g(h, i) {\n        var j = Array.prototype.slice.call(arguments, 2);\n        if (((typeof i != \"string\"))) {\n            return Function.prototype.bind.apply(i, [h,].concat(j));\n        }\n    ;\n    ;\n        function k() {\n            var l = j.concat(Array.prototype.slice.call(arguments));\n            if (h[i]) {\n                return h[i].apply(h, l);\n            }\n        ;\n        ;\n        };\n    ;\n        k.toString = function() {\n            return ((\"bound lazily: \" + h[i]));\n        };\n        return k;\n    };\n;\n    e.exports = g;\n});\n__d(\"executeAfter\", [], function(a, b, c, d, e, f) {\n    function g(h, i, j) {\n        return function() {\n            h.apply(((j || this)), arguments);\n            i.apply(((j || this)), arguments);\n        };\n    };\n;\n    e.exports = g;\n});\n__d(\"AsyncRequest\", [\"Arbiter\",\"AsyncResponse\",\"Bootloader\",\"CSS\",\"Env\",\"ErrorUtils\",\"JSBNG__Event\",\"HTTPErrors\",\"JSCC\",\"Parent\",\"Run\",\"ServerJS\",\"URI\",\"UserAgent\",\"XHR\",\"asyncCallback\",\"bind\",\"copyProperties\",\"emptyFunction\",\"evalGlobal\",\"ge\",\"goURI\",\"isEmpty\",\"ix\",\"tx\",\"executeAfter\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"AsyncResponse\"), i = b(\"Bootloader\"), j = b(\"CSS\"), k = b(\"Env\"), l = b(\"ErrorUtils\"), m = b(\"JSBNG__Event\"), n = b(\"HTTPErrors\"), o = b(\"JSCC\"), p = b(\"Parent\"), q = b(\"Run\"), r = b(\"ServerJS\"), s = b(\"URI\"), t = b(\"UserAgent\"), u = b(\"XHR\"), v = b(\"asyncCallback\"), w = b(\"bind\"), x = b(\"copyProperties\"), y = b(\"emptyFunction\"), z = b(\"evalGlobal\"), aa = b(\"ge\"), ba = b(\"goURI\"), ca = b(\"isEmpty\"), da = b(\"ix\"), ea = b(\"tx\"), fa = b(\"executeAfter\");\n    function ga() {\n        try {\n            return !window.loaded;\n        } catch (pa) {\n            return true;\n        };\n    ;\n    };\n;\n    function ha(pa) {\n        return ((((\"upload\" in pa)) && ((\"JSBNG__onprogress\" in pa.upload))));\n    };\n;\n    function ia(pa) {\n        return ((\"withCredentials\" in pa));\n    };\n;\n    function ja(pa) {\n        return ((pa.JSBNG__status in {\n            0: 1,\n            12029: 1,\n            12030: 1,\n            12031: 1,\n            12152: 1\n        }));\n    };\n;\n    function ka(pa) {\n        var qa = ((!pa || ((typeof (pa) === \"function\"))));\n        return qa;\n    };\n;\n    var la = 2, ma = la;\n    g.subscribe(\"page_transition\", function(pa, qa) {\n        ma = qa.id;\n    });\n    function na(pa) {\n        x(this, {\n            transport: null,\n            method: \"POST\",\n            uri: \"\",\n            timeout: null,\n            timer: null,\n            initialHandler: y,\n            handler: null,\n            uploadProgressHandler: null,\n            errorHandler: null,\n            transportErrorHandler: null,\n            timeoutHandler: null,\n            interceptHandler: y,\n            finallyHandler: y,\n            abortHandler: y,\n            serverDialogCancelHandler: null,\n            relativeTo: null,\n            statusElement: null,\n            statusClass: \"\",\n            data: {\n            },\n            file: null,\n            context: {\n            },\n            readOnly: false,\n            writeRequiredParams: [],\n            remainingRetries: 0,\n            userActionID: \"-\"\n        });\n        this.option = {\n            asynchronous: true,\n            suppressErrorHandlerWarning: false,\n            suppressEvaluation: false,\n            suppressErrorAlerts: false,\n            retries: 0,\n            jsonp: false,\n            bundle: false,\n            useIframeTransport: false,\n            handleErrorAfterUnload: false\n        };\n        this.errorHandler = h.defaultErrorHandler;\n        this.transportErrorHandler = w(this, \"errorHandler\");\n        if (((pa !== undefined))) {\n            this.setURI(pa);\n        }\n    ;\n    ;\n    };\n;\n    x(na, {\n        bootstrap: function(pa, qa, ra) {\n            var sa = \"GET\", ta = true, ua = {\n            };\n            if (((ra || ((qa && ((qa.rel == \"async-post\"))))))) {\n                sa = \"POST\";\n                ta = false;\n                if (pa) {\n                    pa = s(pa);\n                    ua = pa.getQueryData();\n                    pa.setQueryData({\n                    });\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            var va = ((p.byClass(qa, \"stat_elem\") || qa));\n            if (((va && j.hasClass(va, \"async_saving\")))) {\n                return false;\n            }\n        ;\n        ;\n            var wa = new na(pa).setReadOnly(ta).setMethod(sa).setData(ua).setNectarModuleDataSafe(qa).setRelativeTo(qa);\n            if (qa) {\n                wa.setHandler(function(ya) {\n                    m.fire(qa, \"success\", {\n                        response: ya\n                    });\n                });\n                wa.setErrorHandler(function(ya) {\n                    if (((m.fire(qa, \"error\", {\n                        response: ya\n                    }) !== false))) {\n                        h.defaultErrorHandler(ya);\n                    }\n                ;\n                ;\n                });\n            }\n        ;\n        ;\n            if (va) {\n                wa.setStatusElement(va);\n                var xa = va.getAttribute(\"data-status-class\");\n                ((xa && wa.setStatusClass(xa)));\n            }\n        ;\n        ;\n            if (qa) {\n                m.fire(qa, \"AsyncRequest/send\", {\n                    request: wa\n                });\n            }\n        ;\n        ;\n            wa.send();\n            return false;\n        },\n        post: function(pa, qa) {\n            new na(pa).setReadOnly(false).setMethod(\"POST\").setData(qa).send();\n            return false;\n        },\n        getLastID: function() {\n            return la;\n        },\n        suppressOnloadToken: {\n        },\n        _inflight: [],\n        _inflightCount: 0,\n        _inflightAdd: y,\n        _inflightPurge: y,\n        getInflightCount: function() {\n            return this._inflightCount;\n        },\n        _inflightEnable: function() {\n            if (t.ie()) {\n                x(na, {\n                    _inflightAdd: function(pa) {\n                        this._inflight.push(pa);\n                    },\n                    _inflightPurge: function() {\n                        na._inflight = na._inflight.filter(function(pa) {\n                            return ((pa.transport && ((pa.transport.readyState < 4))));\n                        });\n                    }\n                });\n                q.onUnload(function() {\n                    na._inflight.forEach(function(pa) {\n                        if (((pa.transport && ((pa.transport.readyState < 4))))) {\n                            pa.transport.abort();\n                            delete pa.transport;\n                        }\n                    ;\n                    ;\n                    });\n                });\n            }\n        ;\n        ;\n        }\n    });\n    x(na.prototype, {\n        _dispatchResponse: function(pa) {\n            this.clearStatusIndicator();\n            if (!this._isRelevant()) {\n                this._invokeErrorHandler(1010);\n                return;\n            }\n        ;\n        ;\n            if (((this.initialHandler(pa) === false))) {\n                return;\n            }\n        ;\n        ;\n            JSBNG__clearTimeout(this.timer);\n            if (pa.jscc_map) {\n                var qa = (eval)(pa.jscc_map);\n                o.init(qa);\n            }\n        ;\n        ;\n            var ra;\n            if (this.handler) {\n                try {\n                    ra = this._shouldSuppressJS(this.handler(pa));\n                } catch (sa) {\n                    ((pa.is_last && this.finallyHandler(pa)));\n                    throw sa;\n                };\n            }\n        ;\n        ;\n            if (!ra) {\n                this._handleJSResponse(pa);\n            }\n        ;\n        ;\n            ((pa.is_last && this.finallyHandler(pa)));\n        },\n        _shouldSuppressJS: function(pa) {\n            return ((pa === na.suppressOnloadToken));\n        },\n        _handleJSResponse: function(pa) {\n            var qa = this.getRelativeTo(), ra = pa.domops, sa = pa.jsmods, ta = new r().setRelativeTo(qa), ua;\n            if (((sa && sa.require))) {\n                ua = sa.require;\n                delete sa.require;\n            }\n        ;\n        ;\n            if (sa) {\n                ta.handle(sa);\n            }\n        ;\n        ;\n            var va = function(wa) {\n                if (((ra && wa))) {\n                    wa.invoke(ra, qa);\n                }\n            ;\n            ;\n                if (ua) {\n                    ta.handle({\n                        require: ua\n                    });\n                }\n            ;\n            ;\n                this._handleJSRegisters(pa, \"JSBNG__onload\");\n                if (this.lid) {\n                    g.inform(\"tti_ajax\", {\n                        s: this.lid,\n                        d: [((this._sendTimeStamp || 0)),((((this._sendTimeStamp && this._responseTime)) ? ((this._responseTime - this._sendTimeStamp)) : 0)),]\n                    }, g.BEHAVIOR_EVENT);\n                }\n            ;\n            ;\n                this._handleJSRegisters(pa, \"onafterload\");\n                ta.cleanup();\n            }.bind(this);\n            if (ra) {\n                i.loadModules([\"AsyncDOM\",], va);\n            }\n             else va(null);\n        ;\n        ;\n        },\n        _handleJSRegisters: function(pa, qa) {\n            var ra = pa[qa];\n            if (ra) {\n                for (var sa = 0; ((sa < ra.length)); sa++) {\n                    l.applyWithGuard(new Function(ra[sa]), this);\n                ;\n                };\n            }\n        ;\n        ;\n        },\n        invokeResponseHandler: function(pa) {\n            if (((typeof (pa.redirect) !== \"undefined\"))) {\n                (function() {\n                    this.setURI(pa.redirect).send();\n                }).bind(this).defer();\n                return;\n            }\n        ;\n        ;\n            if (((((!this.handler && !this.errorHandler)) && !this.transportErrorHandler))) {\n                return;\n            }\n        ;\n        ;\n            var qa = pa.asyncResponse;\n            if (((typeof (qa) !== \"undefined\"))) {\n                if (!this._isRelevant()) {\n                    this._invokeErrorHandler(1010);\n                    return;\n                }\n            ;\n            ;\n                if (qa.inlinejs) {\n                    z(qa.inlinejs);\n                }\n            ;\n            ;\n                if (qa.lid) {\n                    this._responseTime = JSBNG__Date.now();\n                    if (a.CavalryLogger) {\n                        this.cavalry = a.CavalryLogger.getInstance(qa.lid);\n                    }\n                ;\n                ;\n                    this.lid = qa.lid;\n                }\n            ;\n            ;\n                if (qa.resource_map) {\n                    i.setResourceMap(qa.resource_map);\n                }\n            ;\n            ;\n                if (qa.bootloadable) {\n                    i.enableBootload(qa.bootloadable);\n                }\n            ;\n            ;\n                da.add(qa.ixData);\n                var ra, sa;\n                if (((qa.getError() && !qa.getErrorIsWarning()))) {\n                    var ta = this.errorHandler.bind(this);\n                    ra = l.guard(this._dispatchErrorResponse);\n                    ra = ra.bind(this, qa, ta);\n                    sa = \"error\";\n                }\n                 else {\n                    ra = l.guard(this._dispatchResponse);\n                    ra = ra.bind(this, qa);\n                    sa = \"response\";\n                }\n            ;\n            ;\n                ra = fa(ra, function() {\n                    g.inform(((\"AsyncRequest/\" + sa)), {\n                        request: this,\n                        response: qa\n                    });\n                }.bind(this));\n                ra = ra.defer.bind(ra);\n                var ua = false;\n                if (this.preBootloadHandler) {\n                    ua = this.preBootloadHandler(qa);\n                }\n            ;\n            ;\n                qa.css = ((qa.css || []));\n                qa.js = ((qa.js || []));\n                i.loadResources(qa.css.concat(qa.js), ra, ua, this.getURI());\n            }\n             else if (((typeof (pa.transportError) !== \"undefined\"))) {\n                if (this._xFbServer) {\n                    this._invokeErrorHandler(1008);\n                }\n                 else this._invokeErrorHandler(1012);\n            ;\n            ;\n            }\n             else this._invokeErrorHandler(1007);\n            \n        ;\n        ;\n        },\n        _invokeErrorHandler: function(pa) {\n            var qa;\n            if (((this.responseText === \"\"))) {\n                qa = 1002;\n            }\n             else if (this._requestAborted) {\n                qa = 1011;\n            }\n             else {\n                try {\n                    qa = ((((pa || this.transport.JSBNG__status)) || 1004));\n                } catch (ra) {\n                    qa = 1005;\n                };\n            ;\n                if (((false === JSBNG__navigator.onLine))) {\n                    qa = 1006;\n                }\n            ;\n            ;\n            }\n            \n        ;\n        ;\n            var sa, ta, ua = true;\n            if (((qa === 1006))) {\n                ta = \"No Network Connection\";\n                sa = \"Your browser appears to be offline. Please check your internet connection and try again.\";\n            }\n             else if (((((qa >= 300)) && ((qa <= 399))))) {\n                ta = \"Redirection\";\n                sa = \"Your access to Facebook was redirected or blocked by a third party at this time, please contact your ISP or reload. \";\n                var va = this.transport.getResponseHeader(\"Location\");\n                if (va) {\n                    ba(va, true);\n                }\n            ;\n            ;\n                ua = true;\n            }\n             else {\n                ta = \"Oops\";\n                sa = \"Something went wrong. We're working on getting this fixed as soon as we can. You may be able to try again.\";\n            }\n            \n        ;\n        ;\n            var wa = new h(this);\n            x(wa, {\n                error: qa,\n                errorSummary: ta,\n                errorDescription: sa,\n                silentError: ua\n            });\n            (function() {\n                g.inform(\"AsyncRequest/error\", {\n                    request: this,\n                    response: wa\n                });\n            }).bind(this).defer();\n            if (((ga() && !this.getOption(\"handleErrorAfterUnload\")))) {\n                return;\n            }\n        ;\n        ;\n            if (!this.transportErrorHandler) {\n                return;\n            }\n        ;\n        ;\n            var xa = this.transportErrorHandler.bind(this);\n            !this.getOption(\"suppressErrorAlerts\");\n            l.applyWithGuard(this._dispatchErrorResponse, this, [wa,xa,]);\n        },\n        _dispatchErrorResponse: function(pa, qa) {\n            var ra = pa.getError();\n            this.clearStatusIndicator();\n            var sa = ((this._sendTimeStamp && {\n                duration: ((JSBNG__Date.now() - this._sendTimeStamp)),\n                xfb_ip: ((this._xFbServer || \"-\"))\n            }));\n            pa.logError(\"async_error\", sa);\n            if (((!this._isRelevant() || ((ra === 1010))))) {\n                this.abort();\n                return;\n            }\n        ;\n        ;\n            if (((((((((ra == 1357008)) || ((ra == 1357007)))) || ((ra == 1442002)))) || ((ra == 1357001))))) {\n                var ta = ((((ra == 1357008)) || ((ra == 1357007))));\n                this.interceptHandler(pa);\n                this._displayServerDialog(pa, ta);\n            }\n             else if (((this.initialHandler(pa) !== false))) {\n                JSBNG__clearTimeout(this.timer);\n                try {\n                    qa(pa);\n                } catch (ua) {\n                    this.finallyHandler(pa);\n                    throw ua;\n                };\n            ;\n                this.finallyHandler(pa);\n            }\n            \n        ;\n        ;\n        },\n        _displayServerDialog: function(pa, qa) {\n            var ra = pa.getPayload();\n            if (((ra.__dialog !== undefined))) {\n                this._displayServerLegacyDialog(pa, qa);\n                return;\n            }\n        ;\n        ;\n            var sa = ra.__dialogx;\n            new r().handle(sa);\n            i.loadModules([\"ConfirmationDialog\",], function(ta) {\n                ta.setupConfirmation(pa, this);\n            }.bind(this));\n        },\n        _displayServerLegacyDialog: function(pa, qa) {\n            var ra = pa.getPayload().__dialog;\n            i.loadModules([\"Dialog\",], function(sa) {\n                var ta = new sa(ra);\n                if (qa) {\n                    ta.setHandler(this._displayConfirmationHandler.bind(this, ta));\n                }\n            ;\n            ;\n                ta.setCancelHandler(function() {\n                    var ua = this.getServerDialogCancelHandler();\n                    try {\n                        ((ua && ua(pa)));\n                    } catch (va) {\n                        throw va;\n                    } finally {\n                        this.finallyHandler(pa);\n                    };\n                ;\n                }.bind(this)).setCausalElement(this.relativeTo).show();\n            }.bind(this));\n        },\n        _displayConfirmationHandler: function(pa) {\n            this.data.confirmed = 1;\n            x(this.data, pa.getFormData());\n            this.send();\n        },\n        setJSONPTransport: function(pa) {\n            pa.subscribe(\"response\", this._handleJSONPResponse.bind(this));\n            pa.subscribe(\"abort\", this._handleJSONPAbort.bind(this));\n            this.transport = pa;\n        },\n        _handleJSONPResponse: function(pa, qa) {\n            this.is_first = ((this.is_first === undefined));\n            var ra = this._interpretResponse(qa);\n            ra.asyncResponse.is_first = this.is_first;\n            ra.asyncResponse.is_last = this.transport.hasFinished();\n            this.invokeResponseHandler(ra);\n            if (this.transport.hasFinished()) {\n                delete this.transport;\n            }\n        ;\n        ;\n        },\n        _handleJSONPAbort: function() {\n            this._invokeErrorHandler();\n            delete this.transport;\n        },\n        _handleXHRResponse: function(pa) {\n            var qa;\n            if (this.getOption(\"suppressEvaluation\")) {\n                qa = {\n                    asyncResponse: new h(this, pa)\n                };\n            }\n             else {\n                var ra = pa.responseText, sa = null;\n                try {\n                    var ua = this._unshieldResponseText(ra);\n                    try {\n                        var va = (eval)(((((\"(\" + ua)) + \")\")));\n                        qa = this._interpretResponse(va);\n                    } catch (ta) {\n                        sa = \"excep\";\n                        qa = {\n                            transportError: ((\"eval() failed on async to \" + this.getURI()))\n                        };\n                    };\n                ;\n                } catch (ta) {\n                    sa = \"empty\";\n                    qa = {\n                        transportError: ta.message\n                    };\n                };\n            ;\n                if (sa) {\n                    var wa = a.ErrorSignal;\n                    ((wa && wa.sendErrorSignal(\"async_xport_resp\", [((((this._xFbServer ? \"1008_\" : \"1012_\")) + sa)),((this._xFbServer || \"-\")),this.getURI(),ra.length,ra.substr(0, 1600),].join(\":\"))));\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            this.invokeResponseHandler(qa);\n        },\n        _unshieldResponseText: function(pa) {\n            var qa = \"for (;;);\", ra = qa.length;\n            if (((pa.length <= ra))) {\n                throw new Error(((\"Response too short on async to \" + this.getURI())));\n            }\n        ;\n        ;\n            var sa = 0;\n            while (((((pa.charAt(sa) == \" \")) || ((pa.charAt(sa) == \"\\u000a\"))))) {\n                sa++;\n            ;\n            };\n        ;\n            ((sa && ((pa.substring(sa, ((sa + ra))) == qa))));\n            return pa.substring(((sa + ra)));\n        },\n        _interpretResponse: function(pa) {\n            if (pa.redirect) {\n                return {\n                    redirect: pa.redirect\n                };\n            }\n        ;\n        ;\n            var qa = new h(this);\n            if (((pa.__ar != 1))) {\n                qa.payload = pa;\n            }\n             else x(qa, pa);\n        ;\n        ;\n            return {\n                asyncResponse: qa\n            };\n        },\n        _onStateChange: function() {\n            try {\n                if (((this.transport.readyState == 4))) {\n                    na._inflightCount--;\n                    na._inflightPurge();\n                    try {\n                        if (((((typeof (this.transport.getResponseHeader) !== \"undefined\")) && this.transport.getResponseHeader(\"X-FB-Debug\")))) {\n                            this._xFbServer = this.transport.getResponseHeader(\"X-FB-Debug\");\n                        }\n                    ;\n                    ;\n                    } catch (qa) {\n                    \n                    };\n                ;\n                    if (((((this.transport.JSBNG__status >= 200)) && ((this.transport.JSBNG__status < 300))))) {\n                        na.lastSuccessTime = JSBNG__Date.now();\n                        this._handleXHRResponse(this.transport);\n                    }\n                     else if (((t.webkit() && ((typeof (this.transport.JSBNG__status) == \"undefined\"))))) {\n                        this._invokeErrorHandler(1002);\n                    }\n                     else if (((((k.retry_ajax_on_network_error && ja(this.transport))) && ((this.remainingRetries > 0))))) {\n                        this.remainingRetries--;\n                        delete this.transport;\n                        this.send(true);\n                        return;\n                    }\n                     else this._invokeErrorHandler();\n                    \n                    \n                ;\n                ;\n                    if (((this.getOption(\"asynchronous\") !== false))) {\n                        delete this.transport;\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n            } catch (pa) {\n                if (ga()) {\n                    return;\n                }\n            ;\n            ;\n                delete this.transport;\n                if (((this.remainingRetries > 0))) {\n                    this.remainingRetries--;\n                    this.send(true);\n                }\n                 else {\n                    !this.getOption(\"suppressErrorAlerts\");\n                    var ra = a.ErrorSignal;\n                    ((ra && ra.sendErrorSignal(\"async_xport_resp\", [1007,((this._xFbServer || \"-\")),this.getURI(),pa.message,].join(\":\"))));\n                    this._invokeErrorHandler(1007);\n                }\n            ;\n            ;\n            };\n        ;\n        },\n        _isMultiplexable: function() {\n            if (((this.getOption(\"jsonp\") || this.getOption(\"useIframeTransport\")))) {\n                return false;\n            }\n        ;\n        ;\n            if (!this.uri.isFacebookURI()) {\n                return false;\n            }\n        ;\n        ;\n            if (!this.getOption(\"asynchronous\")) {\n                return false;\n            }\n        ;\n        ;\n            return true;\n        },\n        handleResponse: function(pa) {\n            var qa = this._interpretResponse(pa);\n            this.invokeResponseHandler(qa);\n        },\n        setMethod: function(pa) {\n            this.method = pa.toString().toUpperCase();\n            return this;\n        },\n        getMethod: function() {\n            return this.method;\n        },\n        setData: function(pa) {\n            this.data = pa;\n            return this;\n        },\n        _setDataHash: function() {\n            if (((((this.method != \"POST\")) || this.data.phstamp))) {\n                return;\n            }\n        ;\n        ;\n            if (((typeof this.data.fb_dtsg !== \"string\"))) {\n                return;\n            }\n        ;\n        ;\n            var pa = s.implodeQuery(this.data).length, qa = \"\";\n            for (var ra = 0; ((ra < this.data.fb_dtsg.length)); ra++) {\n                qa += this.data.fb_dtsg.charCodeAt(ra);\n            ;\n            };\n        ;\n            this.data.phstamp = ((((\"1\" + qa)) + pa));\n        },\n        setRawData: function(pa) {\n            this.rawData = pa;\n            return this;\n        },\n        getData: function() {\n            return this.data;\n        },\n        setContextData: function(pa, qa, ra) {\n            ra = ((((ra === undefined)) ? true : ra));\n            if (ra) {\n                this.context[((\"_log_\" + pa))] = qa;\n            }\n        ;\n        ;\n            return this;\n        },\n        _setUserActionID: function() {\n            var pa = ((((a.ArbiterMonitor && a.ArbiterMonitor.getUE())) || \"-\"));\n            this.userActionID = ((((((((a.EagleEye && a.EagleEye.getSessionID())) || \"-\")) + \"/\")) + pa));\n        },\n        setURI: function(pa) {\n            var qa = s(pa);\n            if (((this.getOption(\"useIframeTransport\") && !qa.isFacebookURI()))) {\n                return this;\n            }\n        ;\n        ;\n            if (((((((!this._allowCrossOrigin && !this.getOption(\"jsonp\"))) && !this.getOption(\"useIframeTransport\"))) && !qa.isSameOrigin()))) {\n                return this;\n            }\n        ;\n        ;\n            this._setUserActionID();\n            if (((!pa || qa.isEmpty()))) {\n                var ra = a.ErrorSignal, sa = a.getErrorStack;\n                if (((ra && sa))) {\n                    var ta = {\n                        err_code: 1013,\n                        vip: \"-\",\n                        duration: 0,\n                        xfb_ip: \"-\",\n                        path: window.JSBNG__location.href,\n                        aid: this.userActionID\n                    };\n                    ra.sendErrorSignal(\"async_error\", JSON.stringify(ta));\n                    ra.sendErrorSignal(\"async_xport_stack\", [1013,window.JSBNG__location.href,null,sa(),].join(\":\"));\n                }\n            ;\n            ;\n                return this;\n            }\n        ;\n        ;\n            this.uri = qa;\n            return this;\n        },\n        getURI: function() {\n            return this.uri.toString();\n        },\n        setInitialHandler: function(pa) {\n            this.initialHandler = pa;\n            return this;\n        },\n        setHandler: function(pa) {\n            if (ka(pa)) {\n                this.handler = pa;\n            }\n        ;\n        ;\n            return this;\n        },\n        getHandler: function() {\n            return this.handler;\n        },\n        setUploadProgressHandler: function(pa) {\n            if (ka(pa)) {\n                this.uploadProgressHandler = pa;\n            }\n        ;\n        ;\n            return this;\n        },\n        setErrorHandler: function(pa) {\n            if (ka(pa)) {\n                this.errorHandler = pa;\n            }\n        ;\n        ;\n            return this;\n        },\n        setTransportErrorHandler: function(pa) {\n            this.transportErrorHandler = pa;\n            return this;\n        },\n        getErrorHandler: function() {\n            return this.errorHandler;\n        },\n        getTransportErrorHandler: function() {\n            return this.transportErrorHandler;\n        },\n        setTimeoutHandler: function(pa, qa) {\n            if (ka(qa)) {\n                this.timeout = pa;\n                this.timeoutHandler = qa;\n            }\n        ;\n        ;\n            return this;\n        },\n        resetTimeout: function(pa) {\n            if (!((this.timeoutHandler === null))) {\n                if (((pa === null))) {\n                    this.timeout = null;\n                    JSBNG__clearTimeout(this.timer);\n                    this.timer = null;\n                }\n                 else {\n                    var qa = !this._allowCrossPageTransition;\n                    this.timeout = pa;\n                    JSBNG__clearTimeout(this.timer);\n                    this.timer = this._handleTimeout.bind(this).defer(this.timeout, qa);\n                }\n            ;\n            }\n        ;\n        ;\n            return this;\n        },\n        _handleTimeout: function() {\n            this.abandon();\n            this.timeoutHandler(this);\n        },\n        setNewSerial: function() {\n            this.id = ++la;\n            return this;\n        },\n        setInterceptHandler: function(pa) {\n            this.interceptHandler = pa;\n            return this;\n        },\n        setFinallyHandler: function(pa) {\n            this.finallyHandler = pa;\n            return this;\n        },\n        setAbortHandler: function(pa) {\n            this.abortHandler = pa;\n            return this;\n        },\n        getServerDialogCancelHandler: function() {\n            return this.serverDialogCancelHandler;\n        },\n        setServerDialogCancelHandler: function(pa) {\n            this.serverDialogCancelHandler = pa;\n            return this;\n        },\n        setPreBootloadHandler: function(pa) {\n            this.preBootloadHandler = pa;\n            return this;\n        },\n        setReadOnly: function(pa) {\n            if (!((typeof (pa) != \"boolean\"))) {\n                this.readOnly = pa;\n            }\n        ;\n        ;\n            return this;\n        },\n        setFBMLForm: function() {\n            this.writeRequiredParams = [\"fb_sig\",];\n            return this;\n        },\n        getReadOnly: function() {\n            return this.readOnly;\n        },\n        setRelativeTo: function(pa) {\n            this.relativeTo = pa;\n            return this;\n        },\n        getRelativeTo: function() {\n            return this.relativeTo;\n        },\n        setStatusClass: function(pa) {\n            this.statusClass = pa;\n            return this;\n        },\n        setStatusElement: function(pa) {\n            this.statusElement = pa;\n            return this;\n        },\n        getStatusElement: function() {\n            return aa(this.statusElement);\n        },\n        _isRelevant: function() {\n            if (this._allowCrossPageTransition) {\n                return true;\n            }\n        ;\n        ;\n            if (!this.id) {\n                return true;\n            }\n        ;\n        ;\n            return ((this.id > ma));\n        },\n        clearStatusIndicator: function() {\n            var pa = this.getStatusElement();\n            if (pa) {\n                j.removeClass(pa, \"async_saving\");\n                j.removeClass(pa, this.statusClass);\n            }\n        ;\n        ;\n        },\n        addStatusIndicator: function() {\n            var pa = this.getStatusElement();\n            if (pa) {\n                j.addClass(pa, \"async_saving\");\n                j.addClass(pa, this.statusClass);\n            }\n        ;\n        ;\n        },\n        specifiesWriteRequiredParams: function() {\n            return this.writeRequiredParams.every(function(pa) {\n                this.data[pa] = ((((this.data[pa] || k[pa])) || ((aa(pa) || {\n                })).value));\n                if (((this.data[pa] !== undefined))) {\n                    return true;\n                }\n            ;\n            ;\n                return false;\n            }, this);\n        },\n        setOption: function(pa, qa) {\n            if (((typeof (this.option[pa]) != \"undefined\"))) {\n                this.option[pa] = qa;\n            }\n        ;\n        ;\n            return this;\n        },\n        getOption: function(pa) {\n            ((typeof (this.option[pa]) == \"undefined\"));\n            return this.option[pa];\n        },\n        abort: function() {\n            if (this.transport) {\n                var pa = this.getTransportErrorHandler();\n                this.setOption(\"suppressErrorAlerts\", true);\n                this.setTransportErrorHandler(y);\n                this._requestAborted = true;\n                this.transport.abort();\n                this.setTransportErrorHandler(pa);\n            }\n        ;\n        ;\n            this.abortHandler();\n        },\n        abandon: function() {\n            JSBNG__clearTimeout(this.timer);\n            this.setOption(\"suppressErrorAlerts\", true).setHandler(y).setErrorHandler(y).setTransportErrorHandler(y);\n            if (this.transport) {\n                this._requestAborted = true;\n                this.transport.abort();\n            }\n        ;\n        ;\n        },\n        setNectarData: function(pa) {\n            if (pa) {\n                if (((this.data.nctr === undefined))) {\n                    this.data.nctr = {\n                    };\n                }\n            ;\n            ;\n                x(this.data.nctr, pa);\n            }\n        ;\n        ;\n            return this;\n        },\n        setNectarModuleDataSafe: function(pa) {\n            if (this.setNectarModuleData) {\n                this.setNectarModuleData(pa);\n            }\n        ;\n        ;\n            return this;\n        },\n        setNectarImpressionIdSafe: function() {\n            if (this.setNectarImpressionId) {\n                this.setNectarImpressionId();\n            }\n        ;\n        ;\n            return this;\n        },\n        setAllowCrossPageTransition: function(pa) {\n            this._allowCrossPageTransition = !!pa;\n            if (this.timer) {\n                this.resetTimeout(this.timeout);\n            }\n        ;\n        ;\n            return this;\n        },\n        setAllowCrossOrigin: function(pa) {\n            this._allowCrossOrigin = pa;\n            return this;\n        },\n        send: function(pa) {\n            pa = ((pa || false));\n            if (!this.uri) {\n                return false;\n            }\n        ;\n        ;\n            ((!this.errorHandler && !this.getOption(\"suppressErrorHandlerWarning\")));\n            if (((this.getOption(\"jsonp\") && ((this.method != \"GET\"))))) {\n                this.setMethod(\"GET\");\n            }\n        ;\n        ;\n            if (((this.getOption(\"useIframeTransport\") && ((this.method != \"GET\"))))) {\n                this.setMethod(\"GET\");\n            }\n        ;\n        ;\n            ((((this.timeoutHandler !== null)) && ((this.getOption(\"jsonp\") || this.getOption(\"useIframeTransport\")))));\n            if (!this.getReadOnly()) {\n                this.specifiesWriteRequiredParams();\n                if (((this.method != \"POST\"))) {\n                    return false;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            x(this.data, u.getAsyncParams(this.method));\n            if (!ca(this.context)) {\n                x(this.data, this.context);\n                this.data.ajax_log = 1;\n            }\n        ;\n        ;\n            if (k.force_param) {\n                x(this.data, k.force_param);\n            }\n        ;\n        ;\n            this._setUserActionID();\n            if (((this.getOption(\"bundle\") && this._isMultiplexable()))) {\n                oa.schedule(this);\n                return true;\n            }\n        ;\n        ;\n            this.setNewSerial();\n            if (!this.getOption(\"asynchronous\")) {\n                this.uri.addQueryData({\n                    __s: 1\n                });\n            }\n        ;\n        ;\n            this.finallyHandler = v(this.finallyHandler, \"final\");\n            var qa, ra;\n            if (((((this.method == \"GET\")) || this.rawData))) {\n                qa = this.uri.addQueryData(this.data).toString();\n                ra = ((this.rawData || \"\"));\n            }\n             else {\n                qa = this.uri.toString();\n                this._setDataHash();\n                ra = s.implodeQuery(this.data);\n            }\n        ;\n        ;\n            if (this.transport) {\n                return false;\n            }\n        ;\n        ;\n            if (((this.getOption(\"jsonp\") || this.getOption(\"useIframeTransport\")))) {\n                d([\"JSONPTransport\",], function(va) {\n                    var wa = new va(((this.getOption(\"jsonp\") ? \"jsonp\" : \"div\")), this.uri);\n                    this.setJSONPTransport(wa);\n                    wa.send();\n                }.bind(this));\n                return true;\n            }\n        ;\n        ;\n            var sa = u.create();\n            if (!sa) {\n                return false;\n            }\n        ;\n        ;\n            sa.onreadystatechange = v(this._onStateChange.bind(this), \"xhr\");\n            if (((this.uploadProgressHandler && ha(sa)))) {\n                sa.upload.JSBNG__onprogress = this.uploadProgressHandler.bind(this);\n            }\n        ;\n        ;\n            if (!pa) {\n                this.remainingRetries = this.getOption(\"retries\");\n            }\n        ;\n        ;\n            if (((a.ErrorSignal || a.ArbiterMonitor))) {\n                this._sendTimeStamp = ((this._sendTimeStamp || JSBNG__Date.now()));\n            }\n        ;\n        ;\n            this.transport = sa;\n            try {\n                this.transport.open(this.method, qa, this.getOption(\"asynchronous\"));\n            } catch (ta) {\n                return false;\n            };\n        ;\n            var ua = k.svn_rev;\n            if (ua) {\n                this.transport.setRequestHeader(\"X-SVN-Rev\", String(ua));\n            }\n        ;\n        ;\n            if (((((!this.uri.isSameOrigin() && !this.getOption(\"jsonp\"))) && !this.getOption(\"useIframeTransport\")))) {\n                if (!ia(this.transport)) {\n                    return false;\n                }\n            ;\n            ;\n                if (this.uri.isFacebookURI()) {\n                    this.transport.withCredentials = true;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            if (((((this.method == \"POST\")) && !this.rawData))) {\n                this.transport.setRequestHeader(\"Content-Type\", \"application/x-www-form-urlencoded\");\n            }\n        ;\n        ;\n            g.inform(\"AsyncRequest/send\", {\n                request: this\n            });\n            this.addStatusIndicator();\n            this.transport.send(ra);\n            if (((this.timeout !== null))) {\n                this.resetTimeout(this.timeout);\n            }\n        ;\n        ;\n            na._inflightCount++;\n            na._inflightAdd(this);\n            return true;\n        }\n    });\n    function oa() {\n        this._requests = [];\n    };\n;\n    x(oa, {\n        multiplex: null,\n        schedule: function(pa) {\n            if (!oa.multiplex) {\n                oa.multiplex = new oa();\n                (function() {\n                    oa.multiplex.send();\n                    oa.multiplex = null;\n                }).defer();\n            }\n        ;\n        ;\n            oa.multiplex.add(pa);\n        }\n    });\n    x(oa.prototype, {\n        add: function(pa) {\n            this._requests.push(pa);\n        },\n        send: function() {\n            var pa = this._requests;\n            if (!pa.length) {\n                return;\n            }\n        ;\n        ;\n            var qa;\n            if (((pa.length === 1))) {\n                qa = pa[0];\n            }\n             else {\n                var ra = pa.map(function(sa) {\n                    return [sa.uri.getPath(),s.implodeQuery(sa.data),];\n                });\n                qa = new na(\"/ajax/proxy.php\").setAllowCrossPageTransition(true).setData({\n                    data: ra\n                }).setHandler(this._handler.bind(this)).setTransportErrorHandler(this._transportErrorHandler.bind(this));\n            }\n        ;\n        ;\n            qa.setOption(\"bundle\", false).send();\n        },\n        _handler: function(pa) {\n            var qa = pa.getPayload().responses;\n            if (((qa.length !== this._requests.length))) {\n                return;\n            }\n        ;\n        ;\n            for (var ra = 0; ((ra < this._requests.length)); ra++) {\n                var sa = this._requests[ra], ta = sa.uri.getPath();\n                sa.id = this.id;\n                if (((qa[ra][0] !== ta))) {\n                    sa.invokeResponseHandler({\n                        transportError: ((\"Wrong response order in bundled request to \" + ta))\n                    });\n                    continue;\n                }\n            ;\n            ;\n                sa.handleResponse(qa[ra][1]);\n            };\n        ;\n        },\n        _transportErrorHandler: function(pa) {\n            var qa = {\n                transportError: pa.errorDescription\n            }, ra = this._requests.map(function(sa) {\n                sa.id = this.id;\n                sa.invokeResponseHandler(qa);\n                return sa.uri.getPath();\n            });\n        }\n    });\n    e.exports = na;\n});\n__d(\"legacy:async\", [\"AsyncRequest\",\"AsyncResponse\",], function(a, b, c, d) {\n    a.AsyncRequest = b(\"AsyncRequest\");\n    a.AsyncResponse = b(\"AsyncResponse\");\n}, 3);\n__d(\"debounce\", [], function(a, b, c, d, e, f) {\n    function g(h, i, j, k) {\n        if (((i == null))) {\n            i = 100;\n        }\n    ;\n    ;\n        var l;\n        function m(n, o, p, q, r) {\n            m.reset();\n            l = JSBNG__setTimeout(function() {\n                h.call(j, n, o, p, q, r);\n            }, i, !k);\n        };\n    ;\n        m.reset = function() {\n            JSBNG__clearTimeout(l);\n        };\n        return m;\n    };\n;\n    e.exports = g;\n});\n__d(\"LitestandViewportHeight\", [\"Arbiter\",\"CSS\",\"JSBNG__Event\",\"cx\",\"debounce\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"CSS\"), i = b(\"JSBNG__Event\"), j = b(\"cx\"), k = b(\"debounce\"), l = b(\"emptyFunction\"), m, n = {\n        SMALL: \"small\",\n        NORMAL: \"normal\",\n        LARGE: \"large\",\n        getSize: function() {\n            if (((m === \"_4vcw\"))) {\n                return n.SMALL;\n            }\n        ;\n        ;\n            if (((m === \"_4vcx\"))) {\n                return n.LARGE;\n            }\n        ;\n        ;\n            return n.NORMAL;\n        },\n        init: function(o) {\n            n.init = l;\n            var p = k(function() {\n                var q = JSBNG__document.documentElement, r = q.clientHeight, s;\n                if (((r <= o.max_small_height))) {\n                    s = \"_4vcw\";\n                }\n                 else if (((r >= o.min_large_height))) {\n                    s = \"_4vcx\";\n                }\n                \n            ;\n            ;\n                if (((s !== m))) {\n                    ((m && h.removeClass(q, m)));\n                    m = s;\n                    ((m && h.addClass(q, m)));\n                    g.inform(\"ViewportSizeChange\");\n                }\n            ;\n            ;\n            });\n            p();\n            i.listen(window, \"resize\", p);\n        }\n    };\n    e.exports = n;\n});\n__d(\"AsyncDOM\", [\"CSS\",\"DOM\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSS\"), h = b(\"DOM\"), i = {\n        invoke: function(j, k) {\n            for (var l = 0; ((l < j.length)); ++l) {\n                var m = j[l], n = m[0], o = m[1], p = m[2], q = m[3], r = ((((p && k)) || null));\n                if (o) {\n                    r = h.scry(((r || JSBNG__document.documentElement)), o)[0];\n                }\n            ;\n            ;\n                switch (n) {\n                  case \"eval\":\n                    (new Function(q)).apply(r);\n                    break;\n                  case \"hide\":\n                    g.hide(r);\n                    break;\n                  case \"show\":\n                    g.show(r);\n                    break;\n                  case \"setContent\":\n                    h.setContent(r, q);\n                    break;\n                  case \"appendContent\":\n                    h.appendContent(r, q);\n                    break;\n                  case \"prependContent\":\n                    h.prependContent(r, q);\n                    break;\n                  case \"insertAfter\":\n                    h.insertAfter(r, q);\n                    break;\n                  case \"insertBefore\":\n                    h.insertBefore(r, q);\n                    break;\n                  case \"remove\":\n                    h.remove(r);\n                    break;\n                  case \"replace\":\n                    h.replace(r, q);\n                    break;\n                  default:\n                \n                };\n            ;\n            };\n        ;\n        }\n    };\n    e.exports = i;\n});\n__d(\"Live\", [\"Arbiter\",\"AsyncDOM\",\"AsyncSignal\",\"ChannelConstants\",\"DataStore\",\"DOM\",\"ServerJS\",\"createArrayFrom\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"AsyncDOM\"), i = b(\"AsyncSignal\"), j = b(\"ChannelConstants\"), k = b(\"DataStore\"), l = b(\"DOM\"), m = b(\"ServerJS\"), n = b(\"createArrayFrom\"), o = b(\"emptyFunction\");\n    function p(r, s) {\n        s = JSON.parse(JSON.stringify(s));\n        new m().setRelativeTo(r).handle(s);\n    };\n;\n    var q = {\n        logAll: false,\n        startup: function() {\n            q.startup = o;\n            g.subscribe(j.getArbiterType(\"live\"), q.handleMessage.bind(q));\n        },\n        lookupLiveNode: function(r, s) {\n            var t = l.scry(JSBNG__document.body, ((((((\".live_\" + r)) + \"_\")) + s)));\n            t.forEach(function(u) {\n                if (((k.get(u, \"seqnum\") === undefined))) {\n                    var v = JSON.parse(u.getAttribute(\"data-live\"));\n                    k.set(u, \"seqnum\", v.seq);\n                }\n            ;\n            ;\n            });\n            return t;\n        },\n        handleMessage: function(r, s) {\n            var t = s.obj, u = t.fbid, v = t.assoc, w = this.lookupLiveNode(u, v);\n            if (!w) {\n                return false;\n            }\n        ;\n        ;\n            w.forEach(function(x) {\n                if (t.expseq) {\n                    var y = k.get(x, \"seqnum\"), z = k.get(x, \"message_buffer\");\n                    if (((z === undefined))) {\n                        z = {\n                        };\n                        k.set(x, \"message_buffer\", z);\n                    }\n                ;\n                ;\n                    var aa = {\n                        obj: t\n                    };\n                    z[t.expseq] = aa;\n                    if (((t.expseq != y))) {\n                        q.log(\"mismatch\", t.fbid, t.expseq, y);\n                        return false;\n                    }\n                ;\n                ;\n                    while (true) {\n                        y = k.get(x, \"seqnum\");\n                        var ba = z[y];\n                        if (ba) {\n                            h.invoke(ba.obj.updates, x);\n                            if (ba.obj.js) {\n                                p(x, ba.obj.js);\n                            }\n                        ;\n                        ;\n                            q.log(\"seqmatch\", t.fbid, \"exp\", t.expseq, \"cur\", y);\n                            delete z[y];\n                        }\n                         else break;\n                    ;\n                    ;\n                    };\n                ;\n                }\n                 else {\n                    h.invoke(t.updates, x);\n                    if (t.js) {\n                        p(x, t.js);\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n            });\n        },\n        log: function() {\n            if (q.logAll) {\n                var r = n(arguments).join(\":\");\n                new i(\"/common/scribe_endpoint.php\", {\n                    c: \"live_sequence\",\n                    m: r\n                }).send();\n            }\n        ;\n        ;\n        }\n    };\n    e.exports = q;\n});\n__d(\"legacy:live-js\", [\"Live\",], function(a, b, c, d) {\n    a.Live = b(\"Live\");\n}, 3);\n__d(\"fbt\", [\"copyProperties\",\"substituteTokens\",], function(a, b, c, d, e, f) {\n    var g = b(\"copyProperties\"), h = b(\"substituteTokens\"), i = function() {\n    \n    };\n    i._ = function(j, k) {\n        var l = {\n        };\n        for (var m = 0; ((m < k.length)); m++) {\n            g(l, k[m][1]);\n        ;\n        };\n    ;\n        return h(j, l);\n    };\n    i.param = function(j, k) {\n        var l = {\n        };\n        l[j] = k;\n        return [null,l,];\n    };\n    e.exports = i;\n});\n__d(\"LiveTimer\", [\"CSS\",\"DOM\",\"UserAgent\",\"emptyFunction\",\"fbt\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSS\"), h = b(\"DOM\"), i = b(\"UserAgent\"), j = b(\"emptyFunction\"), k = b(\"fbt\"), l = b(\"tx\"), m = 1000, n = 60, o = 3600, p = 43200, q = 60, r = 20000, s = {\n        restart: function(t) {\n            this.serverTime = t;\n            this.localStartTime = ((JSBNG__Date.now() / 1000));\n            this.updateTimeStamps();\n        },\n        getApproximateServerTime: function() {\n            return ((this.getServerTimeOffset() + JSBNG__Date.now()));\n        },\n        getServerTimeOffset: function() {\n            return ((((this.serverTime - this.localStartTime)) * m));\n        },\n        updateTimeStamps: function() {\n            s.timestamps = h.scry(JSBNG__document.body, \"abbr.livetimestamp\");\n            s.startLoop(r);\n        },\n        addTimeStamps: function(t) {\n            if (!t) {\n                return;\n            }\n        ;\n        ;\n            s.timestamps = ((s.timestamps || []));\n            if (((h.isNodeOfType(t, \"abbr\") && g.hasClass(t, \"livetimestamp\")))) {\n                s.timestamps.push(t);\n            }\n             else {\n                var u = h.scry(t, \"abbr.livetimestamp\");\n                for (var v = 0; ((v < u.length)); ++v) {\n                    s.timestamps.push(u[v]);\n                ;\n                };\n            ;\n            }\n        ;\n        ;\n            s.startLoop(0);\n        },\n        startLoop: function(t) {\n            this.JSBNG__stop();\n            this.timeout = JSBNG__setTimeout(function() {\n                s.loop();\n            }, t);\n        },\n        JSBNG__stop: function() {\n            JSBNG__clearTimeout(this.timeout);\n        },\n        updateNode: function(t, u) {\n            s.updateNode = ((((i.ie() < 7)) ? j : h.setContent));\n            s.updateNode(t, u);\n        },\n        loop: function(t) {\n            if (t) {\n                s.updateTimeStamps();\n            }\n        ;\n        ;\n            var u = Math.floor(((s.getApproximateServerTime() / m))), v = -1;\n            ((s.timestamps && s.timestamps.forEach(function(x) {\n                var y = x.getAttribute(\"data-utime\"), z = x.getAttribute(\"data-shorten\"), aa = s.renderRelativeTime(u, y, z);\n                if (aa.text) {\n                    s.updateNode(x, aa.text);\n                }\n            ;\n            ;\n                if (((((aa.next != -1)) && ((((aa.next < v)) || ((v == -1))))))) {\n                    v = aa.next;\n                }\n            ;\n            ;\n            })));\n            if (((v != -1))) {\n                var w = Math.max(r, ((v * m)));\n                s.timeout = JSBNG__setTimeout(function() {\n                    s.loop();\n                }, w);\n            }\n        ;\n        ;\n        },\n        renderRelativeTime: function(t, u, v) {\n            var w = {\n                text: \"\",\n                next: -1\n            };\n            if (((((t - u)) > (p)))) {\n                return w;\n            }\n        ;\n        ;\n            var x = ((t - u)), y = Math.floor(((x / n))), z = Math.floor(((y / q)));\n            if (((y < 1))) {\n                if (v) {\n                    x = ((((x > 1)) ? x : 2));\n                    w.text = k._(\"{number} secs\", [k.param(\"number\", x),]);\n                    w.next = ((20 - ((x % 20))));\n                }\n                 else {\n                    w.text = \"a few seconds ago\";\n                    w.next = ((n - ((x % n))));\n                }\n            ;\n            ;\n                return w;\n            }\n        ;\n        ;\n            if (((z < 1))) {\n                if (((v && ((y == 1))))) {\n                    w.text = \"1 min\";\n                }\n                 else if (v) {\n                    w.text = k._(\"{number} mins\", [k.param(\"number\", y),]);\n                }\n                 else w.text = ((((y == 1)) ? \"about a minute ago\" : l._(\"{number} minutes ago\", {\n                    number: y\n                })));\n                \n            ;\n            ;\n                w.next = ((n - ((x % n))));\n                return w;\n            }\n        ;\n        ;\n            if (((z < 11))) {\n                w.next = ((o - ((x % o))));\n            }\n        ;\n        ;\n            if (((v && ((z == 1))))) {\n                w.text = \"1 hr\";\n            }\n             else if (v) {\n                w.text = k._(\"{number} hrs\", [k.param(\"number\", z),]);\n            }\n             else w.text = ((((z == 1)) ? \"about an hour ago\" : l._(\"{number} hours ago\", {\n                number: z\n            })));\n            \n        ;\n        ;\n            return w;\n        },\n        renderRelativeTimeToServer: function(t) {\n            return s.renderRelativeTime(Math.floor(((s.getApproximateServerTime() / m))), t);\n        }\n    };\n    e.exports = s;\n});\n__d(\"legacy:live-timer\", [\"LiveTimer\",], function(a, b, c, d) {\n    a.LiveTimer = b(\"LiveTimer\");\n}, 3);\n__d(\"JSLogger\", [], function(a, b, c, d, e, f) {\n    var g = {\n        MAX_HISTORY: 500,\n        counts: {\n        },\n        categories: {\n        },\n        seq: 0,\n        pageId: ((((Math.JSBNG__random() * 2147483648)) | 0)).toString(36),\n        forwarding: false\n    };\n    function h(l) {\n        if (((((l instanceof Error)) && a.ErrorUtils))) {\n            l = a.ErrorUtils.normalizeError(l);\n        }\n    ;\n    ;\n        try {\n            return JSON.stringify(l);\n        } catch (m) {\n            return \"{}\";\n        };\n    ;\n    };\n;\n    function i(l, JSBNG__event, m) {\n        if (!g.counts[l]) {\n            g.counts[l] = {\n            };\n        }\n    ;\n    ;\n        if (!g.counts[l][JSBNG__event]) {\n            g.counts[l][JSBNG__event] = 0;\n        }\n    ;\n    ;\n        m = ((((m == null)) ? 1 : Number(m)));\n        g.counts[l][JSBNG__event] += ((isFinite(m) ? m : 0));\n    };\n;\n    g.logAction = function(JSBNG__event, l, m) {\n        if (((this.type == \"bump\"))) {\n            i(this.cat, JSBNG__event, l);\n        }\n         else if (((this.type == \"rate\"))) {\n            ((l && i(this.cat, ((JSBNG__event + \"_n\")), m)));\n            i(this.cat, ((JSBNG__event + \"_d\")), m);\n        }\n         else {\n            var n = {\n                cat: this.cat,\n                type: this.type,\n                JSBNG__event: JSBNG__event,\n                data: ((((l != null)) ? h(l) : null)),\n                date: JSBNG__Date.now(),\n                seq: g.seq++\n            };\n            g.head = ((g.head ? (g.head.next = n) : (g.tail = n)));\n            while (((((g.head.seq - g.tail.seq)) > g.MAX_HISTORY))) {\n                g.tail = g.tail.next;\n            ;\n            };\n        ;\n            return n;\n        }\n        \n    ;\n    ;\n    };\n    function j(l) {\n        if (!g.categories[l]) {\n            g.categories[l] = {\n            };\n            var m = function(n) {\n                var o = {\n                    cat: l,\n                    type: n\n                };\n                g.categories[l][n] = function() {\n                    g.forwarding = false;\n                    var p = null;\n                    if (((JSBNG__document.domain != \"facebook.com\"))) {\n                        return;\n                    }\n                ;\n                ;\n                    p = g.logAction;\n                    if (/^\\/+(dialogs|plugins?)\\//.test(JSBNG__location.pathname)) {\n                        g.forwarding = false;\n                    }\n                     else try {\n                        p = a.JSBNG__top.require(\"JSLogger\")._.logAction;\n                        g.forwarding = ((p !== g.logAction));\n                    } catch (q) {\n                    \n                    }\n                ;\n                ;\n                    ((p && p.apply(o, arguments)));\n                };\n            };\n            m(\"debug\");\n            m(\"log\");\n            m(\"warn\");\n            m(\"error\");\n            m(\"bump\");\n            m(\"rate\");\n        }\n    ;\n    ;\n        return g.categories[l];\n    };\n;\n    function k(l, m) {\n        var n = [];\n        for (var o = ((m || g.tail)); o; o = o.next) {\n            if (((!l || l(o)))) {\n                var p = {\n                    type: o.type,\n                    cat: o.cat,\n                    date: o.date,\n                    JSBNG__event: o.JSBNG__event,\n                    seq: o.seq\n                };\n                if (o.data) {\n                    p.data = JSON.parse(o.data);\n                }\n            ;\n            ;\n                n.push(p);\n            }\n        ;\n        ;\n        };\n    ;\n        return n;\n    };\n;\n    e.exports = {\n        _: g,\n        DUMP_EVENT: \"jslogger/dump\",\n        create: j,\n        getEntries: k\n    };\n});\n__d(\"startsWith\", [], function(a, b, c, d, e, f) {\n    function g(h, i, j) {\n        var k = String(h);\n        j = Math.min(Math.max(((j || 0)), 0), k.length);\n        return ((k.lastIndexOf(String(i), j) === j));\n    };\n;\n    e.exports = g;\n});\n__d(\"getContextualParent\", [\"ge\",], function(a, b, c, d, e, f) {\n    var g = b(\"ge\");\n    function h(i, j) {\n        var k, l = false;\n        do {\n            if (((i.getAttribute && (k = i.getAttribute(\"data-ownerid\"))))) {\n                i = g(k);\n                l = true;\n            }\n             else i = i.parentNode;\n        ;\n        ;\n        } while (((((j && i)) && !l)));\n        return i;\n    };\n;\n    e.exports = h;\n});\n__d(\"Nectar\", [\"Env\",\"startsWith\",\"getContextualParent\",], function(a, b, c, d, e, f) {\n    var g = b(\"Env\"), h = b(\"startsWith\"), i = b(\"getContextualParent\");\n    function j(m) {\n        if (!m.nctr) {\n            m.nctr = {\n            };\n        }\n    ;\n    ;\n    };\n;\n    function k(m) {\n        if (((g.module || !m))) {\n            return g.module;\n        }\n    ;\n    ;\n        var n = {\n            fbpage_fan_confirm: true,\n            photos_snowlift: true\n        }, o;\n        while (((m && m.getAttributeNode))) {\n            var p = ((m.getAttributeNode(\"id\") || {\n            })).value;\n            if (h(p, \"pagelet_\")) {\n                return p;\n            }\n        ;\n        ;\n            if (((!o && n[p]))) {\n                o = p;\n            }\n        ;\n        ;\n            m = i(m);\n        };\n    ;\n        return o;\n    };\n;\n    var l = {\n        addModuleData: function(m, n) {\n            var o = k(n);\n            if (o) {\n                j(m);\n                m.nctr._mod = o;\n            }\n        ;\n        ;\n        },\n        addImpressionID: function(m) {\n            if (g.impid) {\n                j(m);\n                m.nctr._impid = g.impid;\n            }\n        ;\n        ;\n        }\n    };\n    e.exports = l;\n});\n__d(\"BrowserSupport\", [\"DOM\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOM\"), h = {\n    }, i = [\"Webkit\",\"Moz\",\"O\",\"ms\",], j = JSBNG__document.createElement(\"div\"), k = function(m) {\n        if (((h[m] === undefined))) {\n            var n = null;\n            if (((m in j.style))) {\n                n = m;\n            }\n             else for (var o = 0; ((o < i.length)); o++) {\n                var p = ((((i[o] + m.charAt(0).toUpperCase())) + m.slice(1)));\n                if (((p in j.style))) {\n                    n = p;\n                    break;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            h[m] = n;\n        }\n    ;\n    ;\n        return h[m];\n    }, l = {\n        hasCSSAnimations: function() {\n            return !!k(\"animationName\");\n        },\n        hasCSSTransforms: function() {\n            return !!k(\"transform\");\n        },\n        hasCSS3DTransforms: function() {\n            return !!k(\"perspective\");\n        },\n        hasCSSTransitions: function() {\n            return !!k(\"transition\");\n        },\n        hasPositionSticky: function() {\n            if (((h.sticky === undefined))) {\n                j.style.cssText = ((\"position:-webkit-sticky;position:-moz-sticky;\" + \"position:-o-sticky;position:-ms-sticky;position:sticky;\"));\n                h.sticky = /sticky/.test(j.style.position);\n            }\n        ;\n        ;\n            return h.sticky;\n        },\n        hasPointerEvents: function() {\n            if (((h.pointerEvents === undefined))) {\n                if (!((\"pointerEvents\" in j.style))) {\n                    h.pointerEvents = false;\n                }\n                 else {\n                    j.style.pointerEvents = \"auto\";\n                    j.style.pointerEvents = \"x\";\n                    g.appendContent(JSBNG__document.documentElement, j);\n                    h.pointerEvents = ((window.JSBNG__getComputedStyle && ((JSBNG__getComputedStyle(j, \"\").pointerEvents === \"auto\"))));\n                    g.remove(j);\n                }\n            ;\n            }\n        ;\n        ;\n            return h.pointerEvents;\n        },\n        getTransitionEndEvent: function() {\n            if (((h.transitionEnd === undefined))) {\n                var m = {\n                    transition: \"transitionend\",\n                    WebkitTransition: \"webkitTransitionEnd\",\n                    MozTransition: \"mozTransitionEnd\",\n                    OTransition: \"oTransitionEnd\"\n                }, n = k(\"transition\");\n                h.transitionEnd = ((m[n] || null));\n            }\n        ;\n        ;\n            return h.transitionEnd;\n        }\n    };\n    e.exports = l;\n});\n__d(\"hyphenate\", [], function(a, b, c, d, e, f) {\n    var g = /([A-Z])/g;\n    function h(i) {\n        return i.replace(g, \"-$1\").toLowerCase();\n    };\n;\n    e.exports = h;\n});\n__d(\"Style\", [\"DOMQuery\",\"UserAgent\",\"$\",\"copyProperties\",\"hyphenate\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOMQuery\"), h = b(\"UserAgent\"), i = b(\"$\"), j = b(\"copyProperties\"), k = b(\"hyphenate\");\n    function l(s) {\n        return s.replace(/-(.)/g, function(t, u) {\n            return u.toUpperCase();\n        });\n    };\n;\n    function m(s, t) {\n        var u = r.get(s, t);\n        return ((((u === \"auto\")) || ((u === \"JSBNG__scroll\"))));\n    };\n;\n    var n = new RegExp(((((((((\"\\\\s*\" + \"([^\\\\s:]+)\")) + \"\\\\s*:\\\\s*\")) + \"([^;('\\\"]*(?:(?:\\\\([^)]*\\\\)|\\\"[^\\\"]*\\\"|'[^']*')[^;(?:'\\\"]*)*)\")) + \"(?:;|$)\")), \"g\");\n    function o(s) {\n        var t = {\n        };\n        s.replace(n, function(u, v, w) {\n            t[v] = w;\n        });\n        return t;\n    };\n;\n    function p(s) {\n        var t = \"\";\n        {\n            var fin36keys = ((window.top.JSBNG_Replay.forInKeys)((s))), fin36i = (0);\n            var u;\n            for (; (fin36i < fin36keys.length); (fin36i++)) {\n                ((u) = (fin36keys[fin36i]));\n                {\n                    if (s[u]) {\n                        t += ((((((u + \":\")) + s[u])) + \";\"));\n                    }\n                ;\n                ;\n                };\n            };\n        };\n    ;\n        return t;\n    };\n;\n    function q(s) {\n        return ((((s !== \"\")) ? ((((\"alpha(opacity=\" + ((s * 100)))) + \")\")) : \"\"));\n    };\n;\n    var r = {\n        set: function(s, t, u) {\n            switch (t) {\n              case \"opacity\":\n                if (((t === \"opacity\"))) {\n                    if (((h.ie() < 9))) {\n                        s.style.filter = q(u);\n                    }\n                     else s.style.opacity = u;\n                ;\n                }\n            ;\n            ;\n                break;\n              case \"float\":\n                s.style.cssFloat = s.style.styleFloat = ((u || \"\"));\n                break;\n              default:\n                try {\n                    s.style[l(t)] = u;\n                } catch (v) {\n                    throw new Error(((((((((\"Style.set: \\\"\" + t)) + \"\\\" argument is invalid: \\\"\")) + u)) + \"\\\"\")));\n                };\n            ;\n            };\n        ;\n        },\n        apply: function(s, t) {\n            var u;\n            if (((((\"opacity\" in t)) && ((h.ie() < 9))))) {\n                var v = t.opacity;\n                t.filter = q(v);\n                delete t.opacity;\n            }\n        ;\n        ;\n            var w = o(s.style.cssText);\n            {\n                var fin37keys = ((window.top.JSBNG_Replay.forInKeys)((t))), fin37i = (0);\n                (0);\n                for (; (fin37i < fin37keys.length); (fin37i++)) {\n                    ((u) = (fin37keys[fin37i]));\n                    {\n                        var x = t[u];\n                        delete t[u];\n                        u = k(u);\n                        {\n                            var fin38keys = ((window.top.JSBNG_Replay.forInKeys)((w))), fin38i = (0);\n                            var y;\n                            for (; (fin38i < fin38keys.length); (fin38i++)) {\n                                ((y) = (fin38keys[fin38i]));\n                                {\n                                    if (((((y === u)) || ((y.indexOf(((u + \"-\"))) === 0))))) {\n                                        delete w[y];\n                                    }\n                                ;\n                                ;\n                                };\n                            };\n                        };\n                    ;\n                        t[u] = x;\n                    };\n                };\n            };\n        ;\n            t = j(w, t);\n            s.style.cssText = p(t);\n            if (((h.ie() < 9))) {\n                {\n                    var fin39keys = ((window.top.JSBNG_Replay.forInKeys)((t))), fin39i = (0);\n                    (0);\n                    for (; (fin39i < fin39keys.length); (fin39i++)) {\n                        ((u) = (fin39keys[fin39i]));\n                        {\n                            if (!t[u]) {\n                                r.set(s, u, \"\");\n                            }\n                        ;\n                        ;\n                        };\n                    };\n                };\n            }\n        ;\n        ;\n        },\n        get: function(s, t) {\n            s = i(s);\n            var u;\n            if (window.JSBNG__getComputedStyle) {\n                u = window.JSBNG__getComputedStyle(s, null);\n                if (u) {\n                    return u.getPropertyValue(k(t));\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            if (((JSBNG__document.defaultView && JSBNG__document.defaultView.JSBNG__getComputedStyle))) {\n                u = JSBNG__document.defaultView.JSBNG__getComputedStyle(s, null);\n                if (u) {\n                    return u.getPropertyValue(k(t));\n                }\n            ;\n            ;\n                if (((t == \"display\"))) {\n                    return \"none\";\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            t = l(t);\n            if (s.currentStyle) {\n                if (((t === \"float\"))) {\n                    return ((s.currentStyle.cssFloat || s.currentStyle.styleFloat));\n                }\n            ;\n            ;\n                return s.currentStyle[t];\n            }\n        ;\n        ;\n            return ((s.style && s.style[t]));\n        },\n        getFloat: function(s, t) {\n            return parseFloat(r.get(s, t), 10);\n        },\n        getOpacity: function(s) {\n            s = i(s);\n            var t = r.get(s, \"filter\"), u = null;\n            if (((t && (u = /(\\d+(?:\\.\\d+)?)/.exec(t))))) {\n                return ((parseFloat(u.pop()) / 100));\n            }\n             else if (t = r.get(s, \"opacity\")) {\n                return parseFloat(t);\n            }\n             else return 1\n            \n        ;\n        },\n        isFixed: function(s) {\n            while (g.contains(JSBNG__document.body, s)) {\n                if (((r.get(s, \"position\") === \"fixed\"))) {\n                    return true;\n                }\n            ;\n            ;\n                s = s.parentNode;\n            };\n        ;\n            return false;\n        },\n        getScrollParent: function(s) {\n            if (!s) {\n                return null;\n            }\n        ;\n        ;\n            while (((s !== JSBNG__document.body))) {\n                if (((((m(s, \"overflow\") || m(s, \"overflowY\"))) || m(s, \"overflowX\")))) {\n                    return s;\n                }\n            ;\n            ;\n                s = s.parentNode;\n            };\n        ;\n            return window;\n        }\n    };\n    e.exports = r;\n});\n__d(\"shield\", [], function(a, b, c, d, e, f) {\n    function g(h, i) {\n        if (((typeof h != \"function\"))) {\n            throw new TypeError();\n        }\n    ;\n    ;\n        var j = Array.prototype.slice.call(arguments, 2);\n        return function() {\n            return h.apply(i, j);\n        };\n    };\n;\n    e.exports = g;\n});\n__d(\"Animation\", [\"BrowserSupport\",\"CSS\",\"DataStore\",\"DOM\",\"Style\",\"shield\",], function(a, b, c, d, e, f) {\n    var g = b(\"BrowserSupport\"), h = b(\"CSS\"), i = b(\"DataStore\"), j = b(\"DOM\"), k = b(\"Style\"), l = b(\"shield\"), m, n = [], o;\n    function p(ga) {\n        if (((a == this))) {\n            return new p(ga);\n        }\n         else {\n            this.obj = ga;\n            this._reset_state();\n            this.queue = [];\n            this.last_attr = null;\n        }\n    ;\n    ;\n    };\n;\n    function q(ga) {\n        if (g.hasCSS3DTransforms()) {\n            return t(ga);\n        }\n         else return s(ga)\n    ;\n    };\n;\n    function r(ga) {\n        return ga.toFixed(8);\n    };\n;\n    function s(ga) {\n        ga = [ga[0],ga[4],ga[1],ga[5],ga[12],ga[13],];\n        return ((((\"matrix(\" + ga.map(r).join(\",\"))) + \")\"));\n    };\n;\n    function t(ga) {\n        return ((((\"matrix3d(\" + ga.map(r).join(\",\"))) + \")\"));\n    };\n;\n    function u(ga, ha) {\n        if (!ga) {\n            ga = [1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,];\n        }\n    ;\n    ;\n        var ia = [];\n        for (var ja = 0; ((ja < 4)); ja++) {\n            for (var ka = 0; ((ka < 4)); ka++) {\n                var la = 0;\n                for (var ma = 0; ((ma < 4)); ma++) {\n                    la += ((ga[((((ja * 4)) + ma))] * ha[((((ma * 4)) + ka))]));\n                ;\n                };\n            ;\n                ia[((((ja * 4)) + ka))] = la;\n            };\n        ;\n        };\n    ;\n        return ia;\n    };\n;\n    var v = 0;\n    p.prototype._reset_state = function() {\n        this.state = {\n            attrs: {\n            },\n            duration: 500\n        };\n    };\n    p.prototype.JSBNG__stop = function() {\n        this._reset_state();\n        this.queue = [];\n        return this;\n    };\n    p.prototype._build_container = function() {\n        if (this.container_div) {\n            this._refresh_container();\n            return;\n        }\n    ;\n    ;\n        if (((this.obj.firstChild && this.obj.firstChild.__animation_refs))) {\n            this.container_div = this.obj.firstChild;\n            this.container_div.__animation_refs++;\n            this._refresh_container();\n            return;\n        }\n    ;\n    ;\n        var ga = JSBNG__document.createElement(\"div\");\n        ga.style.padding = \"0px\";\n        ga.style.margin = \"0px\";\n        ga.style.border = \"0px\";\n        ga.__animation_refs = 1;\n        var ha = this.obj.childNodes;\n        while (ha.length) {\n            ga.appendChild(ha[0]);\n        ;\n        };\n    ;\n        this.obj.appendChild(ga);\n        this._orig_overflow = this.obj.style.overflow;\n        this.obj.style.overflow = \"hidden\";\n        this.container_div = ga;\n        this._refresh_container();\n    };\n    p.prototype._refresh_container = function() {\n        this.container_div.style.height = \"auto\";\n        this.container_div.style.width = \"auto\";\n        this.container_div.style.height = ((this.container_div.offsetHeight + \"px\"));\n        this.container_div.style.width = ((this.container_div.offsetWidth + \"px\"));\n    };\n    p.prototype._destroy_container = function() {\n        if (!this.container_div) {\n            return;\n        }\n    ;\n    ;\n        if (!--this.container_div.__animation_refs) {\n            var ga = this.container_div.childNodes;\n            while (ga.length) {\n                this.obj.appendChild(ga[0]);\n            ;\n            };\n        ;\n            this.obj.removeChild(this.container_div);\n        }\n    ;\n    ;\n        this.container_div = null;\n        this.obj.style.overflow = this._orig_overflow;\n    };\n    var w = 1, x = 2, y = 3;\n    p.prototype._attr = function(ga, ha, ia) {\n        ga = ga.replace(/-[a-z]/gi, function(ka) {\n            return ka.substring(1).toUpperCase();\n        });\n        var ja = false;\n        switch (ga) {\n          case \"background\":\n            this._attr(\"backgroundColor\", ha, ia);\n            return this;\n          case \"backgroundColor\":\n        \n          case \"borderColor\":\n        \n          case \"color\":\n            ha = ca(ha);\n            break;\n          case \"opacity\":\n            ha = parseFloat(ha, 10);\n            break;\n          case \"height\":\n        \n          case \"width\":\n            if (((ha == \"auto\"))) {\n                ja = true;\n            }\n             else ha = parseInt(ha, 10);\n        ;\n        ;\n            break;\n          case \"borderWidth\":\n        \n          case \"lineHeight\":\n        \n          case \"fontSize\":\n        \n          case \"margin\":\n        \n          case \"marginBottom\":\n        \n          case \"marginLeft\":\n        \n          case \"marginRight\":\n        \n          case \"marginTop\":\n        \n          case \"padding\":\n        \n          case \"paddingBottom\":\n        \n          case \"paddingLeft\":\n        \n          case \"paddingRight\":\n        \n          case \"paddingTop\":\n        \n          case \"bottom\":\n        \n          case \"left\":\n        \n          case \"right\":\n        \n          case \"JSBNG__top\":\n        \n          case \"scrollTop\":\n        \n          case \"scrollLeft\":\n            ha = parseInt(ha, 10);\n            break;\n          case \"rotateX\":\n        \n          case \"rotateY\":\n        \n          case \"rotateZ\":\n            ha = ((((parseInt(ha, 10) * Math.PI)) / 180));\n            break;\n          case \"translateX\":\n        \n          case \"translateY\":\n        \n          case \"translateZ\":\n        \n          case \"scaleX\":\n        \n          case \"scaleY\":\n        \n          case \"scaleZ\":\n            ha = parseFloat(ha, 10);\n            break;\n          case \"rotate3d\":\n            this._attr(\"rotateX\", ha[0], ia);\n            this._attr(\"rotateY\", ha[1], ia);\n            this._attr(\"rotateZ\", ha[2], ia);\n            return this;\n          case \"rotate\":\n            this._attr(\"rotateZ\", ha, ia);\n            return this;\n          case \"scale3d\":\n            this._attr(\"scaleZ\", ha[2], ia);\n          case \"scale\":\n            this._attr(\"scaleX\", ha[0], ia);\n            this._attr(\"scaleY\", ha[1], ia);\n            return this;\n          case \"translate3d\":\n            this._attr(\"translateZ\", ha[2], ia);\n          case \"translate\":\n            this._attr(\"translateX\", ha[0], ia);\n            this._attr(\"translateY\", ha[1], ia);\n            return this;\n          default:\n            throw new Error(((ga + \" is not a supported attribute!\")));\n        };\n    ;\n        if (((this.state.attrs[ga] === undefined))) {\n            this.state.attrs[ga] = {\n            };\n        }\n    ;\n    ;\n        if (ja) {\n            this.state.attrs[ga].auto = true;\n        }\n    ;\n    ;\n        switch (ia) {\n          case y:\n            this.state.attrs[ga].start = ha;\n            break;\n          case x:\n            this.state.attrs[ga].by = true;\n          case w:\n            this.state.attrs[ga].value = ha;\n            break;\n        };\n    ;\n    };\n    function z(ga) {\n        var ha = parseInt(k.get(ga, \"paddingLeft\"), 10), ia = parseInt(k.get(ga, \"paddingRight\"), 10), ja = parseInt(k.get(ga, \"borderLeftWidth\"), 10), ka = parseInt(k.get(ga, \"borderRightWidth\"), 10);\n        return ((((((((ga.offsetWidth - ((ha ? ha : 0)))) - ((ia ? ia : 0)))) - ((ja ? ja : 0)))) - ((ka ? ka : 0))));\n    };\n;\n    function aa(ga) {\n        var ha = parseInt(k.get(ga, \"paddingTop\"), 10), ia = parseInt(k.get(ga, \"paddingBottom\"), 10), ja = parseInt(k.get(ga, \"borderTopWidth\"), 10), ka = parseInt(k.get(ga, \"borderBottomWidth\"), 10);\n        return ((((((((ga.offsetHeight - ((ha ? ha : 0)))) - ((ia ? ia : 0)))) - ((ja ? ja : 0)))) - ((ka ? ka : 0))));\n    };\n;\n    p.prototype.to = function(ga, ha) {\n        if (((ha === undefined))) {\n            this._attr(this.last_attr, ga, w);\n        }\n         else {\n            this._attr(ga, ha, w);\n            this.last_attr = ga;\n        }\n    ;\n    ;\n        return this;\n    };\n    p.prototype.by = function(ga, ha) {\n        if (((ha === undefined))) {\n            this._attr(this.last_attr, ga, x);\n        }\n         else {\n            this._attr(ga, ha, x);\n            this.last_attr = ga;\n        }\n    ;\n    ;\n        return this;\n    };\n    p.prototype.from = function(ga, ha) {\n        if (((ha === undefined))) {\n            this._attr(this.last_attr, ga, y);\n        }\n         else {\n            this._attr(ga, ha, y);\n            this.last_attr = ga;\n        }\n    ;\n    ;\n        return this;\n    };\n    p.prototype.duration = function(ga) {\n        this.state.duration = ((ga ? ga : 0));\n        return this;\n    };\n    p.prototype.checkpoint = function(ga, ha) {\n        if (((ga === undefined))) {\n            ga = 1;\n        }\n    ;\n    ;\n        this.state.checkpoint = ga;\n        this.queue.push(this.state);\n        this._reset_state();\n        this.state.checkpointcb = ha;\n        return this;\n    };\n    p.prototype.blind = function() {\n        this.state.blind = true;\n        return this;\n    };\n    p.prototype.hide = function() {\n        this.state.hide = true;\n        return this;\n    };\n    p.prototype.show = function() {\n        this.state.show = true;\n        return this;\n    };\n    p.prototype.ease = function(ga) {\n        this.state.ease = ga;\n        return this;\n    };\n    p.prototype.go = function() {\n        var ga = JSBNG__Date.now();\n        this.queue.push(this.state);\n        for (var ha = 0; ((ha < this.queue.length)); ha++) {\n            this.queue[ha].start = ((ga - v));\n            if (this.queue[ha].checkpoint) {\n                ga += ((this.queue[ha].checkpoint * this.queue[ha].duration));\n            }\n        ;\n        ;\n        };\n    ;\n        da(this);\n        return this;\n    };\n    p.prototype._show = function() {\n        h.show(this.obj);\n    };\n    p.prototype._hide = function() {\n        h.hide(this.obj);\n    };\n    p.prototype._frame = function(ga) {\n        var ha = true, ia = false, ja;\n        function ka(db) {\n            return ((JSBNG__document.documentElement[db] || JSBNG__document.body[db]));\n        };\n    ;\n        for (var la = 0; ((la < this.queue.length)); la++) {\n            var ma = this.queue[la];\n            if (((ma.start > ga))) {\n                ha = false;\n                continue;\n            }\n        ;\n        ;\n            if (ma.checkpointcb) {\n                this._callback(ma.checkpointcb, ((ga - ma.start)));\n                ma.checkpointcb = null;\n            }\n        ;\n        ;\n            if (((ma.started === undefined))) {\n                if (ma.show) {\n                    this._show();\n                }\n            ;\n            ;\n                {\n                    var fin40keys = ((window.top.JSBNG_Replay.forInKeys)((ma.attrs))), fin40i = (0);\n                    var na;\n                    for (; (fin40i < fin40keys.length); (fin40i++)) {\n                        ((na) = (fin40keys[fin40i]));\n                        {\n                            if (((ma.attrs[na].start !== undefined))) {\n                                continue;\n                            }\n                        ;\n                        ;\n                            switch (na) {\n                              case \"backgroundColor\":\n                            \n                              case \"borderColor\":\n                            \n                              case \"color\":\n                                ja = ca(k.get(this.obj, ((((na == \"borderColor\")) ? \"borderLeftColor\" : na))));\n                                if (ma.attrs[na].by) {\n                                    ma.attrs[na].value[0] = Math.min(255, Math.max(0, ((ma.attrs[na].value[0] + ja[0]))));\n                                    ma.attrs[na].value[1] = Math.min(255, Math.max(0, ((ma.attrs[na].value[1] + ja[1]))));\n                                    ma.attrs[na].value[2] = Math.min(255, Math.max(0, ((ma.attrs[na].value[2] + ja[2]))));\n                                }\n                            ;\n                            ;\n                                break;\n                              case \"opacity\":\n                                ja = k.getOpacity(this.obj);\n                                if (ma.attrs[na].by) {\n                                    ma.attrs[na].value = Math.min(1, Math.max(0, ((ma.attrs[na].value + ja))));\n                                }\n                            ;\n                            ;\n                                break;\n                              case \"height\":\n                                ja = aa(this.obj);\n                                if (ma.attrs[na].by) {\n                                    ma.attrs[na].value += ja;\n                                }\n                            ;\n                            ;\n                                break;\n                              case \"width\":\n                                ja = z(this.obj);\n                                if (ma.attrs[na].by) {\n                                    ma.attrs[na].value += ja;\n                                }\n                            ;\n                            ;\n                                break;\n                              case \"scrollLeft\":\n                            \n                              case \"scrollTop\":\n                                ja = ((((this.obj === JSBNG__document.body)) ? ka(na) : this.obj[na]));\n                                if (ma.attrs[na].by) {\n                                    ma.attrs[na].value += ja;\n                                }\n                            ;\n                            ;\n                                ma[((\"last\" + na))] = ja;\n                                break;\n                              case \"rotateX\":\n                            \n                              case \"rotateY\":\n                            \n                              case \"rotateZ\":\n                            \n                              case \"translateX\":\n                            \n                              case \"translateY\":\n                            \n                              case \"translateZ\":\n                                ja = i.get(this.obj, na, 0);\n                                if (ma.attrs[na].by) {\n                                    ma.attrs[na].value += ja;\n                                }\n                            ;\n                            ;\n                                break;\n                              case \"scaleX\":\n                            \n                              case \"scaleY\":\n                            \n                              case \"scaleZ\":\n                                ja = i.get(this.obj, na, 1);\n                                if (ma.attrs[na].by) {\n                                    ma.attrs[na].value += ja;\n                                }\n                            ;\n                            ;\n                                break;\n                              default:\n                                ja = ((parseInt(k.get(this.obj, na), 10) || 0));\n                                if (ma.attrs[na].by) {\n                                    ma.attrs[na].value += ja;\n                                }\n                            ;\n                            ;\n                                break;\n                            };\n                        ;\n                            ma.attrs[na].start = ja;\n                        };\n                    };\n                };\n            ;\n                if (((((ma.attrs.height && ma.attrs.height.auto)) || ((ma.attrs.width && ma.attrs.width.auto))))) {\n                    this._destroy_container();\n                    {\n                        var fin41keys = ((window.top.JSBNG_Replay.forInKeys)(({\n                            height: 1,\n                            width: 1,\n                            fontSize: 1,\n                            borderLeftWidth: 1,\n                            borderRightWidth: 1,\n                            borderTopWidth: 1,\n                            borderBottomWidth: 1,\n                            paddingLeft: 1,\n                            paddingRight: 1,\n                            paddingTop: 1,\n                            paddingBottom: 1\n                        }))), fin41i = (0);\n                        var na;\n                        for (; (fin41i < fin41keys.length); (fin41i++)) {\n                            ((na) = (fin41keys[fin41i]));\n                            {\n                                if (ma.attrs[na]) {\n                                    this.obj.style[na] = ((ma.attrs[na].value + ((((typeof ma.attrs[na].value == \"number\")) ? \"px\" : \"\"))));\n                                }\n                            ;\n                            ;\n                            };\n                        };\n                    };\n                ;\n                    if (((ma.attrs.height && ma.attrs.height.auto))) {\n                        ma.attrs.height.value = aa(this.obj);\n                    }\n                ;\n                ;\n                    if (((ma.attrs.width && ma.attrs.width.auto))) {\n                        ma.attrs.width.value = z(this.obj);\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n                ma.started = true;\n                if (ma.blind) {\n                    this._build_container();\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            var oa = ((((ga - ma.start)) / ma.duration));\n            if (((oa >= 1))) {\n                oa = 1;\n                if (ma.hide) {\n                    this._hide();\n                }\n            ;\n            ;\n            }\n             else ha = false;\n        ;\n        ;\n            var pa = ((ma.ease ? ma.ease(oa) : oa));\n            if (((((!ia && ((oa != 1)))) && ma.blind))) {\n                ia = true;\n            }\n        ;\n        ;\n            {\n                var fin42keys = ((window.top.JSBNG_Replay.forInKeys)((ma.attrs))), fin42i = (0);\n                var na;\n                for (; (fin42i < fin42keys.length); (fin42i++)) {\n                    ((na) = (fin42keys[fin42i]));\n                    {\n                        switch (na) {\n                          case \"backgroundColor\":\n                        \n                          case \"borderColor\":\n                        \n                          case \"color\":\n                            if (((ma.attrs[na].start[3] != ma.attrs[na].value[3]))) {\n                                this.obj.style[na] = ((((((((((((((((\"rgba(\" + ba(pa, ma.attrs[na].start[0], ma.attrs[na].value[0], true))) + \",\")) + ba(pa, ma.attrs[na].start[1], ma.attrs[na].value[1], true))) + \",\")) + ba(pa, ma.attrs[na].start[2], ma.attrs[na].value[2], true))) + \",\")) + ba(pa, ma.attrs[na].start[3], ma.attrs[na].value[3], false))) + \")\"));\n                            }\n                             else this.obj.style[na] = ((((((((((((\"rgb(\" + ba(pa, ma.attrs[na].start[0], ma.attrs[na].value[0], true))) + \",\")) + ba(pa, ma.attrs[na].start[1], ma.attrs[na].value[1], true))) + \",\")) + ba(pa, ma.attrs[na].start[2], ma.attrs[na].value[2], true))) + \")\"));\n                        ;\n                        ;\n                            break;\n                          case \"opacity\":\n                            k.set(this.obj, \"opacity\", ba(pa, ma.attrs[na].start, ma.attrs[na].value));\n                            break;\n                          case \"height\":\n                        \n                          case \"width\":\n                            this.obj.style[na] = ((((((pa == 1)) && ma.attrs[na].auto)) ? \"auto\" : ((ba(pa, ma.attrs[na].start, ma.attrs[na].value, true) + \"px\"))));\n                            break;\n                          case \"scrollLeft\":\n                        \n                          case \"scrollTop\":\n                            var qa = ((this.obj === JSBNG__document.body));\n                            ja = ((qa ? ka(na) : this.obj[na]));\n                            if (((ma[((\"last\" + na))] !== ja))) {\n                                delete ma.attrs[na];\n                            }\n                             else {\n                                var ra = ba(pa, ma.attrs[na].start, ma.attrs[na].value, true);\n                                if (!qa) {\n                                    ra = this.obj[na] = ra;\n                                }\n                                 else {\n                                    if (((na == \"scrollLeft\"))) {\n                                        a.JSBNG__scrollTo(ra, ka(\"scrollTop\"));\n                                    }\n                                     else a.JSBNG__scrollTo(ka(\"scrollLeft\"), ra);\n                                ;\n                                ;\n                                    ra = ka(na);\n                                }\n                            ;\n                            ;\n                                ma[((\"last\" + na))] = ra;\n                            }\n                        ;\n                        ;\n                            break;\n                          case \"translateX\":\n                        \n                          case \"translateY\":\n                        \n                          case \"translateZ\":\n                        \n                          case \"rotateX\":\n                        \n                          case \"rotateY\":\n                        \n                          case \"rotateZ\":\n                        \n                          case \"scaleX\":\n                        \n                          case \"scaleY\":\n                        \n                          case \"scaleZ\":\n                            i.set(this.obj, na, ba(pa, ma.attrs[na].start, ma.attrs[na].value, false));\n                            break;\n                          default:\n                            this.obj.style[na] = ((ba(pa, ma.attrs[na].start, ma.attrs[na].value, true) + \"px\"));\n                            break;\n                        };\n                    ;\n                    };\n                };\n            };\n        ;\n            var sa = null, ta = i.get(this.obj, \"translateX\", 0), ua = i.get(this.obj, \"translateY\", 0), va = i.get(this.obj, \"translateZ\", 0);\n            if (((((ta || ua)) || va))) {\n                sa = u(sa, [1,0,0,0,0,1,0,0,0,0,1,0,ta,ua,va,1,]);\n            }\n        ;\n        ;\n            var wa = i.get(this.obj, \"scaleX\", 1), xa = i.get(this.obj, \"scaleY\", 1), ya = i.get(this.obj, \"scaleZ\", 1);\n            if (((((((wa - 1)) || ((xa - 1)))) || ((ya - 1))))) {\n                sa = u(sa, [wa,0,0,0,0,xa,0,0,0,0,ya,0,0,0,0,1,]);\n            }\n        ;\n        ;\n            var za = i.get(this.obj, \"rotateX\", 0);\n            if (za) {\n                sa = u(sa, [1,0,0,0,0,Math.cos(za),Math.sin(-za),0,0,Math.sin(za),Math.cos(za),0,0,0,0,1,]);\n            }\n        ;\n        ;\n            var ab = i.get(this.obj, \"rotateY\", 0);\n            if (ab) {\n                sa = u(sa, [Math.cos(ab),0,Math.sin(ab),0,0,1,0,0,Math.sin(-ab),0,Math.cos(ab),0,0,0,0,1,]);\n            }\n        ;\n        ;\n            var bb = i.get(this.obj, \"rotateZ\", 0);\n            if (bb) {\n                sa = u(sa, [Math.cos(bb),Math.sin(-bb),0,0,Math.sin(bb),Math.cos(bb),0,0,0,0,1,0,0,0,0,1,]);\n            }\n        ;\n        ;\n            if (sa) {\n                var cb = q(sa);\n                k.apply(this.obj, {\n                    \"-webkit-transform\": cb,\n                    \"-moz-transform\": cb,\n                    \"-ms-transform\": cb,\n                    \"-o-transform\": cb,\n                    transform: cb\n                });\n            }\n             else if (ha) {\n                k.apply(this.obj, {\n                    \"-webkit-transform\": null,\n                    \"-moz-transform\": null,\n                    \"-ms-transform\": null,\n                    \"-o-transform\": null,\n                    transform: null\n                });\n            }\n            \n        ;\n        ;\n            if (((oa == 1))) {\n                this.queue.splice(la--, 1);\n                this._callback(ma.ondone, ((((ga - ma.start)) - ma.duration)));\n            }\n        ;\n        ;\n        };\n    ;\n        if (((!ia && this.container_div))) {\n            this._destroy_container();\n        }\n    ;\n    ;\n        return !ha;\n    };\n    p.prototype.ondone = function(ga) {\n        this.state.ondone = ga;\n        return this;\n    };\n    p.prototype._callback = function(ga, ha) {\n        if (ga) {\n            v = ha;\n            ga.call(this);\n            v = 0;\n        }\n    ;\n    ;\n    };\n    function ba(ga, ha, ia, ja) {\n        return ((ja ? parseInt : parseFloat))(((((((ia - ha)) * ga)) + ha)), 10);\n    };\n;\n    function ca(ga) {\n        var ha = /^#([a-f0-9]{1,2})([a-f0-9]{1,2})([a-f0-9]{1,2})$/i.exec(ga);\n        if (ha) {\n            return [parseInt(((((ha[1].length == 1)) ? ((ha[1] + ha[1])) : ha[1])), 16),parseInt(((((ha[2].length == 1)) ? ((ha[2] + ha[2])) : ha[2])), 16),parseInt(((((ha[3].length == 1)) ? ((ha[3] + ha[3])) : ha[3])), 16),1,];\n        }\n         else {\n            var ia = /^rgba? *\\(([0-9]+), *([0-9]+), *([0-9]+)(?:, *([0-9\\.]+))?\\)$/.exec(ga);\n            if (ia) {\n                return [parseInt(ia[1], 10),parseInt(ia[2], 10),parseInt(ia[3], 10),((ia[4] ? parseFloat(ia[4]) : 1)),];\n            }\n             else if (((ga == \"transparent\"))) {\n                return [255,255,255,0,];\n            }\n             else throw \"Named color attributes are not supported.\"\n            \n        ;\n        }\n    ;\n    ;\n    };\n;\n    function da(ga) {\n        n.push(ga);\n        if (((n.length === 1))) {\n            if (!m) {\n                var ha = ((((a.JSBNG__requestAnimationFrame || a.JSBNG__webkitRequestAnimationFrame)) || a.JSBNG__mozRequestAnimationFrame));\n                if (ha) {\n                    m = ha.bind(a);\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            if (m) {\n                m(fa);\n            }\n             else o = JSBNG__setInterval(fa, 20, false);\n        ;\n        ;\n        }\n    ;\n    ;\n        if (m) {\n            ea();\n        }\n    ;\n    ;\n        fa(JSBNG__Date.now(), true);\n    };\n;\n    function ea() {\n        if (!m) {\n            throw new Error(\"Ending timer only valid with requestAnimationFrame\");\n        }\n    ;\n    ;\n        var ga = 0;\n        for (var ha = 0; ((ha < n.length)); ha++) {\n            var ia = n[ha];\n            for (var ja = 0; ((ja < ia.queue.length)); ja++) {\n                var ka = ((ia.queue[ja].start + ia.queue[ja].duration));\n                if (((ka > ga))) {\n                    ga = ka;\n                }\n            ;\n            ;\n            };\n        ;\n        };\n    ;\n        if (o) {\n            JSBNG__clearTimeout(o);\n            o = null;\n        }\n    ;\n    ;\n        var la = JSBNG__Date.now();\n        if (((ga > la))) {\n            o = JSBNG__setTimeout(l(fa), ((ga - la)), false);\n        }\n    ;\n    ;\n    };\n;\n    function fa(ga, ha) {\n        var ia = JSBNG__Date.now();\n        for (var ja = ((((ha === true)) ? ((n.length - 1)) : 0)); ((ja < n.length)); ja++) {\n            try {\n                if (!n[ja]._frame(ia)) {\n                    n.splice(ja--, 1);\n                }\n            ;\n            ;\n            } catch (ka) {\n                n.splice(ja--, 1);\n            };\n        ;\n        };\n    ;\n        if (((n.length === 0))) {\n            if (o) {\n                if (m) {\n                    JSBNG__clearTimeout(o);\n                }\n                 else JSBNG__clearInterval(o);\n            ;\n            ;\n                o = null;\n            }\n        ;\n        ;\n        }\n         else if (m) {\n            m(fa);\n        }\n        \n    ;\n    ;\n    };\n;\n    p.ease = {\n    };\n    p.ease.begin = function(ga) {\n        return ((Math.sin(((((Math.PI / 2)) * ((ga - 1))))) + 1));\n    };\n    p.ease.end = function(ga) {\n        return Math.sin(((((80962 * Math.PI)) * ga)));\n    };\n    p.ease.both = function(ga) {\n        return ((((81011 * Math.sin(((Math.PI * ((ga - 81035))))))) + 81040));\n    };\n    p.prependInsert = function(ga, ha) {\n        p.insert(ga, ha, j.prependContent);\n    };\n    p.appendInsert = function(ga, ha) {\n        p.insert(ga, ha, j.appendContent);\n    };\n    p.insert = function(ga, ha, ia) {\n        k.set(ha, \"opacity\", 0);\n        ia(ga, ha);\n        new p(ha).from(\"opacity\", 0).to(\"opacity\", 1).duration(400).go();\n    };\n    e.exports = p;\n});\n__d(\"BootloadedReact\", [\"Bootloader\",], function(a, b, c, d, e, f) {\n    var g = b(\"Bootloader\"), h = function(j) {\n        g.loadModules([\"React\",], j);\n    }, i = {\n        isValidComponent: function(j) {\n            return ((((j && ((typeof j.mountComponentIntoNode === \"function\")))) && ((typeof j.receiveProps === \"function\"))));\n        },\n        initializeTouchEvents: function(j, k) {\n            h(function(l) {\n                l.initializeTouchEvents(j);\n                ((k && k()));\n            });\n        },\n        createClass: function(j, k) {\n            h(function(l) {\n                var m = l.createClass(j);\n                ((k && k(m)));\n            });\n        },\n        renderComponent: function(j, k, l) {\n            h(function(m) {\n                var n = m.renderComponent(j, k);\n                ((l && l(n)));\n            });\n        },\n        unmountAndReleaseReactRootNode: function(j, k) {\n            h(function(l) {\n                l.unmountAndReleaseReactRootNode(j);\n                ((k && k()));\n            });\n        }\n    };\n    e.exports = i;\n});\n__d(\"ContextualThing\", [\"DOM\",\"ge\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOM\"), h = b(\"ge\"), i = {\n        register: function(j, k) {\n            j.setAttribute(\"data-ownerid\", g.getID(k));\n        },\n        containsIncludingLayers: function(j, k) {\n            while (k) {\n                if (g.contains(j, k)) {\n                    return true;\n                }\n            ;\n            ;\n                k = i.getContext(k);\n            };\n        ;\n            return false;\n        },\n        getContext: function(j) {\n            var k;\n            while (j) {\n                if (((j.getAttribute && (k = j.getAttribute(\"data-ownerid\"))))) {\n                    return h(k);\n                }\n            ;\n            ;\n                j = j.parentNode;\n            };\n        ;\n            return null;\n        }\n    };\n    e.exports = i;\n});\n__d(\"DOMControl\", [\"DataStore\",\"$\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"DataStore\"), h = b(\"$\"), i = b(\"copyProperties\");\n    function j(k) {\n        this.root = h(k);\n        this.updating = false;\n        g.set(k, \"DOMControl\", this);\n    };\n;\n    i(j.prototype, {\n        getRoot: function() {\n            return this.root;\n        },\n        beginUpdate: function() {\n            if (this.updating) {\n                return false;\n            }\n        ;\n        ;\n            this.updating = true;\n            return true;\n        },\n        endUpdate: function() {\n            this.updating = false;\n        },\n        update: function(k) {\n            if (!this.beginUpdate()) {\n                return this;\n            }\n        ;\n        ;\n            this.onupdate(k);\n            this.endUpdate();\n        },\n        onupdate: function(k) {\n        \n        }\n    });\n    j.getInstance = function(k) {\n        return g.get(k, \"DOMControl\");\n    };\n    e.exports = j;\n});\n__d(\"DOMDimensions\", [\"DOMQuery\",\"Style\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOMQuery\"), h = b(\"Style\"), i = {\n        getElementDimensions: function(j) {\n            return {\n                width: ((j.offsetWidth || 0)),\n                height: ((j.offsetHeight || 0))\n            };\n        },\n        getViewportDimensions: function() {\n            var j = ((((((((window && window.JSBNG__innerWidth)) || ((((JSBNG__document && JSBNG__document.documentElement)) && JSBNG__document.documentElement.clientWidth)))) || ((((JSBNG__document && JSBNG__document.body)) && JSBNG__document.body.clientWidth)))) || 0)), k = ((((((((window && window.JSBNG__innerHeight)) || ((((JSBNG__document && JSBNG__document.documentElement)) && JSBNG__document.documentElement.clientHeight)))) || ((((JSBNG__document && JSBNG__document.body)) && JSBNG__document.body.clientHeight)))) || 0));\n            return {\n                width: j,\n                height: k\n            };\n        },\n        getViewportWithoutScrollbarDimensions: function() {\n            var j = ((((((((JSBNG__document && JSBNG__document.documentElement)) && JSBNG__document.documentElement.clientWidth)) || ((((JSBNG__document && JSBNG__document.body)) && JSBNG__document.body.clientWidth)))) || 0)), k = ((((((((JSBNG__document && JSBNG__document.documentElement)) && JSBNG__document.documentElement.clientHeight)) || ((((JSBNG__document && JSBNG__document.body)) && JSBNG__document.body.clientHeight)))) || 0));\n            return {\n                width: j,\n                height: k\n            };\n        },\n        getDocumentDimensions: function(j) {\n            j = ((j || JSBNG__document));\n            var k = g.getDocumentScrollElement(j), l = ((k.scrollWidth || 0)), m = ((k.scrollHeight || 0));\n            return {\n                width: l,\n                height: m\n            };\n        },\n        measureElementBox: function(j, k, l, m, n) {\n            var o;\n            switch (k) {\n              case \"left\":\n            \n              case \"right\":\n            \n              case \"JSBNG__top\":\n            \n              case \"bottom\":\n                o = [k,];\n                break;\n              case \"width\":\n                o = [\"left\",\"right\",];\n                break;\n              case \"height\":\n                o = [\"JSBNG__top\",\"bottom\",];\n                break;\n              default:\n                throw Error(((\"Invalid plane: \" + k)));\n            };\n        ;\n            var p = function(q, r) {\n                var s = 0;\n                for (var t = 0; ((t < o.length)); t++) {\n                    s += ((parseInt(h.get(j, ((((((q + \"-\")) + o[t])) + r))), 10) || 0));\n                ;\n                };\n            ;\n                return s;\n            };\n            return ((((((l ? p(\"padding\", \"\") : 0)) + ((m ? p(\"border\", \"-width\") : 0)))) + ((n ? p(\"margin\", \"\") : 0))));\n        }\n    };\n    e.exports = i;\n});\n__d(\"wrapFunction\", [], function(a, b, c, d, e, f) {\n    var g = {\n    };\n    function h(i, j, k) {\n        j = ((j || \"default\"));\n        return function() {\n            var l = ((((j in g)) ? g[j](i, k) : i));\n            return l.apply(this, arguments);\n        };\n    };\n;\n    h.setWrapper = function(i, j) {\n        j = ((j || \"default\"));\n        g[j] = i;\n    };\n    e.exports = h;\n});\n__d(\"DOMEventListener\", [\"wrapFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"wrapFunction\"), h, i;\n    if (window.JSBNG__addEventListener) {\n        h = function(k, l, m) {\n            m.wrapper = g(m, \"entry\", ((((k + \":\")) + l)));\n            k.JSBNG__addEventListener(l, m.wrapper, false);\n        };\n        i = function(k, l, m) {\n            k.JSBNG__removeEventListener(l, m.wrapper, false);\n        };\n    }\n     else if (window.JSBNG__attachEvent) {\n        h = function(k, l, m) {\n            m.wrapper = g(m, \"entry\", ((((k + \":\")) + l)));\n            k.JSBNG__attachEvent(((\"JSBNG__on\" + l)), m.wrapper);\n        };\n        i = function(k, l, m) {\n            k.JSBNG__detachEvent(((\"JSBNG__on\" + l)), m.wrapper);\n        };\n    }\n    \n;\n;\n    var j = {\n        add: function(k, l, m) {\n            h(k, l, m);\n            return {\n                remove: function() {\n                    i(k, l, m);\n                    k = null;\n                }\n            };\n        },\n        remove: i\n    };\n    e.exports = j;\n});\n__d(\"DOMPosition\", [\"DOMDimensions\",\"DOMQuery\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOMDimensions\"), h = b(\"DOMQuery\"), i = {\n        getScrollPosition: function() {\n            var j = h.getDocumentScrollElement();\n            return {\n                x: j.scrollLeft,\n                y: j.scrollTop\n            };\n        },\n        getNormalizedScrollPosition: function() {\n            var j = i.getScrollPosition(), k = g.getDocumentDimensions(), l = g.getViewportDimensions(), m = ((k.height - l.height)), n = ((k.width - l.width));\n            return {\n                y: Math.max(0, Math.min(j.y, m)),\n                x: Math.max(0, Math.min(j.x, n))\n            };\n        },\n        getElementPosition: function(j) {\n            if (!j) {\n                return;\n            }\n        ;\n        ;\n            var k = JSBNG__document.documentElement;\n            if (((!((\"getBoundingClientRect\" in j)) || !h.contains(k, j)))) {\n                return {\n                    x: 0,\n                    y: 0\n                };\n            }\n        ;\n        ;\n            var l = j.getBoundingClientRect(), m = ((Math.round(l.left) - k.clientLeft)), n = ((Math.round(l.JSBNG__top) - k.clientTop));\n            return {\n                x: m,\n                y: n\n            };\n        }\n    };\n    e.exports = i;\n});\n__d(\"isInIframe\", [], function(a, b, c, d, e, f) {\n    function g() {\n        return ((window != window.JSBNG__top));\n    };\n;\n    e.exports = g;\n});\n__d(\"DimensionTracking\", [\"Cookie\",\"DOMDimensions\",\"JSBNG__Event\",\"debounce\",\"isInIframe\",], function(a, b, c, d, e, f) {\n    var g = b(\"Cookie\"), h = b(\"DOMDimensions\"), i = b(\"JSBNG__Event\"), j = b(\"debounce\"), k = b(\"isInIframe\");\n    function l() {\n        var m = h.getViewportDimensions();\n        g.set(\"wd\", ((((m.width + \"x\")) + m.height)));\n    };\n;\n    if (!k()) {\n        l.defer(100);\n        i.listen(window, \"resize\", j(l, 250));\n        i.listen(window, \"JSBNG__focus\", l);\n    }\n;\n;\n});\n__d(\"Focus\", [\"CSS\",\"DOM\",\"JSBNG__Event\",\"Run\",\"cx\",\"ge\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSS\"), h = b(\"DOM\"), i = b(\"JSBNG__Event\"), j = b(\"Run\"), k = b(\"cx\"), l = b(\"ge\"), m = {\n    }, n, o = {\n        set: function(s) {\n            try {\n                s.tabIndex = s.tabIndex;\n                s.JSBNG__focus();\n            } catch (t) {\n            \n            };\n        ;\n        },\n        setWithoutOutline: function(s) {\n            g.addClass(s, \"_1qp5\");\n            var t = i.listen(s, \"JSBNG__blur\", function() {\n                g.removeClass(s, \"_1qp5\");\n                t.remove();\n            });\n            o.set(s);\n        },\n        relocate: function(s, t) {\n            p();\n            var u = h.getID(s);\n            m[u] = t;\n            g.addClass(s, \"_1qp5\");\n            j.onLeave(r.curry(u));\n        },\n        reset: function(s) {\n            var t = h.getID(s);\n            g.removeClass(s, \"_1qp5\");\n            if (m[t]) {\n                g.removeClass(m[t], \"_3oxt\");\n                delete m[t];\n            }\n        ;\n        ;\n        }\n    };\n    function p() {\n        if (n) {\n            return;\n        }\n    ;\n    ;\n        i.listen(JSBNG__document.documentElement, \"focusout\", q);\n        i.listen(JSBNG__document.documentElement, \"focusin\", q);\n        n = true;\n    };\n;\n    function q(JSBNG__event) {\n        var s = JSBNG__event.getTarget();\n        if (!g.hasClass(s, \"_1qp5\")) {\n            return;\n        }\n    ;\n    ;\n        if (m[s.id]) {\n            g.conditionClass(m[s.id], \"_3oxt\", ((((JSBNG__event.type === \"focusin\")) || ((JSBNG__event.type === \"JSBNG__focus\")))));\n        }\n    ;\n    ;\n    };\n;\n    function r(s) {\n        if (((m[s] && !l(s)))) {\n            delete m[s];\n        }\n    ;\n    ;\n    };\n;\n    e.exports = o;\n});\n__d(\"HighContrastMode\", [\"AsyncSignal\",\"Cookie\",\"CSS\",\"DOM\",\"Env\",\"Style\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncSignal\"), h = b(\"Cookie\"), i = b(\"CSS\"), j = b(\"DOM\"), k = b(\"Env\"), l = b(\"Style\"), m = null, n = {\n        init: function(o) {\n            if (((((m !== null)) && ((o.currentState != m))))) {\n                return;\n            }\n        ;\n        ;\n            var p = j.create(\"div\");\n            j.appendContent(JSBNG__document.body, p);\n            p.style.cssText = ((((((((((((((\"border: 1px solid;\" + \"border-color: red green;\")) + \"position: fixed;\")) + \"height: 5px;\")) + \"top: -999px;\")) + \"background-image: url(\")) + o.spacerImage)) + \");\"));\n            var q = l.get(p, \"background-image\"), r = l.get(p, \"border-top-color\"), s = l.get(p, \"border-right-color\"), t = ((((r == s)) || ((q && ((((q == \"none\")) || ((q == \"url(invalid-url:)\"))))))));\n            if (((t != o.currentState))) {\n                i.conditionClass(JSBNG__document.documentElement, \"highContrast\", t);\n                if (k.user) {\n                    h.set(\"highContrastMode\", ((t ? 1 : 0)));\n                    if (t) {\n                        new g(\"/ajax/highcontrast\").send();\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            j.remove(p);\n            m = t;\n        }\n    };\n    e.exports = n;\n});\n__d(\"Input\", [\"CSS\",\"DOMQuery\",\"DOMControl\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSS\"), h = b(\"DOMQuery\"), i = b(\"DOMControl\"), j = function(l) {\n        var m = l.getAttribute(\"maxlength\");\n        if (((m && ((m > 0))))) {\n            d([\"enforceMaxLength\",], function(n) {\n                n(l, m);\n            });\n        }\n    ;\n    ;\n    }, k = {\n        isEmpty: function(l) {\n            return ((!(/\\S/).test(((l.value || \"\"))) || g.hasClass(l, \"DOMControl_placeholder\")));\n        },\n        getValue: function(l) {\n            return ((k.isEmpty(l) ? \"\" : l.value));\n        },\n        setValue: function(l, m) {\n            g.removeClass(l, \"DOMControl_placeholder\");\n            l.value = ((m || \"\"));\n            j(l);\n            var n = i.getInstance(l);\n            ((((n && n.resetHeight)) && n.resetHeight()));\n        },\n        setPlaceholder: function(l, m) {\n            l.setAttribute(\"aria-label\", m);\n            l.setAttribute(\"placeholder\", m);\n            if (((l == JSBNG__document.activeElement))) {\n                return;\n            }\n        ;\n        ;\n            if (k.isEmpty(l)) {\n                g.conditionClass(l, \"DOMControl_placeholder\", m);\n                l.value = ((m || \"\"));\n            }\n        ;\n        ;\n        },\n        reset: function(l) {\n            var m = ((((l !== JSBNG__document.activeElement)) ? ((l.getAttribute(\"placeholder\") || \"\")) : \"\"));\n            l.value = m;\n            g.conditionClass(l, \"DOMControl_placeholder\", m);\n            l.style.height = \"\";\n        },\n        setSubmitOnEnter: function(l, m) {\n            g.conditionClass(l, \"enter_submit\", m);\n        },\n        getSubmitOnEnter: function(l) {\n            return g.hasClass(l, \"enter_submit\");\n        },\n        setMaxLength: function(l, m) {\n            if (((m > 0))) {\n                l.setAttribute(\"maxlength\", m);\n                j(l);\n            }\n             else l.removeAttribute(\"maxlength\");\n        ;\n        ;\n        }\n    };\n    e.exports = k;\n});\n__d(\"KeyEventController\", [\"DOM\",\"JSBNG__Event\",\"Run\",\"copyProperties\",\"isEmpty\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOM\"), h = b(\"JSBNG__Event\"), i = b(\"Run\"), j = b(\"copyProperties\"), k = b(\"isEmpty\");\n    function l() {\n        this.handlers = {\n        };\n        JSBNG__document.JSBNG__onkeyup = this.onkeyevent.bind(this, \"JSBNG__onkeyup\");\n        JSBNG__document.JSBNG__onkeydown = this.onkeyevent.bind(this, \"JSBNG__onkeydown\");\n        JSBNG__document.JSBNG__onkeypress = this.onkeyevent.bind(this, \"JSBNG__onkeypress\");\n    };\n;\n    j(l, {\n        instance: null,\n        getInstance: function() {\n            return ((l.instance || (l.instance = new l())));\n        },\n        defaultFilter: function(JSBNG__event, m) {\n            JSBNG__event = h.$E(JSBNG__event);\n            return ((((l.filterEventTypes(JSBNG__event, m) && l.filterEventTargets(JSBNG__event, m))) && l.filterEventModifiers(JSBNG__event, m)));\n        },\n        filterEventTypes: function(JSBNG__event, m) {\n            if (((m === \"JSBNG__onkeydown\"))) {\n                return true;\n            }\n        ;\n        ;\n            return false;\n        },\n        filterEventTargets: function(JSBNG__event, m) {\n            var n = JSBNG__event.getTarget(), o = ((n.contentEditable === \"true\"));\n            return ((((!((o || g.isNodeOfType(n, l._interactiveElements))) || ((n.type in l._uninterestingTypes)))) || ((((JSBNG__event.keyCode in l._controlKeys)) && ((((g.isNodeOfType(n, [\"input\",\"textarea\",]) && ((n.value.length === 0)))) || ((o && ((g.getText(n).length === 0))))))))));\n        },\n        filterEventModifiers: function(JSBNG__event, m) {\n            if (((((((JSBNG__event.ctrlKey || JSBNG__event.altKey)) || JSBNG__event.metaKey)) || JSBNG__event.repeat))) {\n                return false;\n            }\n        ;\n        ;\n            return true;\n        },\n        registerKey: function(m, n, o, p) {\n            if (((o === undefined))) {\n                o = l.defaultFilter;\n            }\n        ;\n        ;\n            var q = l.getInstance(), r = q.mapKey(m);\n            if (k(q.handlers)) {\n                i.onLeave(q.resetHandlers.bind(q));\n            }\n        ;\n        ;\n            var s = {\n            };\n            for (var t = 0; ((t < r.length)); t++) {\n                m = r[t];\n                if (((!q.handlers[m] || p))) {\n                    q.handlers[m] = [];\n                }\n            ;\n            ;\n                var u = {\n                    callback: n,\n                    filter: o\n                };\n                s[m] = u;\n                q.handlers[m].push(u);\n            };\n        ;\n            return {\n                remove: function() {\n                    {\n                        var fin43keys = ((window.top.JSBNG_Replay.forInKeys)((s))), fin43i = (0);\n                        var v;\n                        for (; (fin43i < fin43keys.length); (fin43i++)) {\n                            ((v) = (fin43keys[fin43i]));\n                            {\n                                if (((q.handlers[v] && q.handlers[v].length))) {\n                                    var w = q.handlers[v].indexOf(s[v]);\n                                    ((((w >= 0)) && q.handlers[v].splice(w, 1)));\n                                }\n                            ;\n                            ;\n                                delete s[v];\n                            };\n                        };\n                    };\n                ;\n                }\n            };\n        },\n        keyCodeMap: {\n            BACKSPACE: [8,],\n            TAB: [9,],\n            RETURN: [13,],\n            ESCAPE: [27,],\n            LEFT: [37,63234,],\n            UP: [38,63232,],\n            RIGHT: [39,63235,],\n            DOWN: [40,63233,],\n            DELETE: [46,],\n            COMMA: [188,],\n            PERIOD: [190,],\n            SLASH: [191,],\n            \"`\": [192,],\n            \"[\": [219,],\n            \"]\": [221,]\n        },\n        _interactiveElements: [\"input\",\"select\",\"textarea\",\"object\",\"embed\",],\n        _uninterestingTypes: {\n            button: 1,\n            checkbox: 1,\n            radio: 1,\n            submit: 1\n        },\n        _controlKeys: {\n            8: 1,\n            9: 1,\n            13: 1,\n            27: 1,\n            37: 1,\n            63234: 1,\n            38: 1,\n            63232: 1,\n            39: 1,\n            63235: 1,\n            40: 1,\n            63233: 1,\n            46: 1\n        }\n    });\n    j(l.prototype, {\n        mapKey: function(m) {\n            if (((((m >= 0)) && ((m <= 9))))) {\n                if (((typeof (m) != \"number\"))) {\n                    m = ((m.charCodeAt(0) - 48));\n                }\n            ;\n            ;\n                return [((48 + m)),((96 + m)),];\n            }\n        ;\n        ;\n            var n = l.keyCodeMap[m.toUpperCase()];\n            if (n) {\n                return n;\n            }\n        ;\n        ;\n            return [m.toUpperCase().charCodeAt(0),];\n        },\n        onkeyevent: function(m, n) {\n            n = h.$E(n);\n            var o = ((this.handlers[n.keyCode] || this.handlers[n.which])), p, q, r;\n            if (o) {\n                for (var s = 0; ((s < o.length)); s++) {\n                    p = o[s].callback;\n                    q = o[s].filter;\n                    try {\n                        if (((!q || q(n, m)))) {\n                            r = p(n, m);\n                            if (((r === false))) {\n                                return h.kill(n);\n                            }\n                        ;\n                        ;\n                        }\n                    ;\n                    ;\n                    } catch (t) {\n                    \n                    };\n                ;\n                };\n            }\n        ;\n        ;\n            return true;\n        },\n        resetHandlers: function() {\n            this.handlers = {\n            };\n        }\n    });\n    e.exports = l;\n});\n__d(\"KeyStatus\", [\"JSBNG__Event\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = null, i = null;\n    function j() {\n        if (!i) {\n            i = g.listen(window, \"JSBNG__blur\", function() {\n                h = null;\n                k();\n            });\n        }\n    ;\n    ;\n    };\n;\n    function k() {\n        if (i) {\n            i.remove();\n            i = null;\n        }\n    ;\n    ;\n    };\n;\n    g.listen(JSBNG__document.documentElement, \"keydown\", function(m) {\n        h = g.getKeyCode(m);\n        j();\n    }, g.Priority.URGENT);\n    g.listen(JSBNG__document.documentElement, \"keyup\", function(m) {\n        h = null;\n        k();\n    }, g.Priority.URGENT);\n    var l = {\n        isKeyDown: function() {\n            return !!h;\n        },\n        getKeyDownCode: function() {\n            return h;\n        }\n    };\n    e.exports = l;\n});\n__d(\"BehaviorsMixin\", [\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"copyProperties\");\n    function h(l) {\n        this._behavior = l;\n        this._enabled = false;\n    };\n;\n    g(h.prototype, {\n        enable: function() {\n            if (!this._enabled) {\n                this._enabled = true;\n                this._behavior.enable();\n            }\n        ;\n        ;\n        },\n        disable: function() {\n            if (this._enabled) {\n                this._enabled = false;\n                this._behavior.disable();\n            }\n        ;\n        ;\n        }\n    });\n    var i = 1;\n    function j(l) {\n        if (!l.__BEHAVIOR_ID) {\n            l.__BEHAVIOR_ID = i++;\n        }\n    ;\n    ;\n        return l.__BEHAVIOR_ID;\n    };\n;\n    var k = {\n        enableBehavior: function(l) {\n            if (!this._behaviors) {\n                this._behaviors = {\n                };\n            }\n        ;\n        ;\n            var m = j(l);\n            if (!this._behaviors[m]) {\n                this._behaviors[m] = new h(new l(this));\n            }\n        ;\n        ;\n            this._behaviors[m].enable();\n            return this;\n        },\n        disableBehavior: function(l) {\n            if (this._behaviors) {\n                var m = j(l);\n                if (this._behaviors[m]) {\n                    this._behaviors[m].disable();\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            return this;\n        },\n        enableBehaviors: function(l) {\n            l.forEach(this.enableBehavior.bind(this));\n            return this;\n        },\n        destroyBehaviors: function() {\n            if (this._behaviors) {\n                {\n                    var fin44keys = ((window.top.JSBNG_Replay.forInKeys)((this._behaviors))), fin44i = (0);\n                    var l;\n                    for (; (fin44i < fin44keys.length); (fin44i++)) {\n                        ((l) = (fin44keys[fin44i]));\n                        {\n                            this._behaviors[l].disable();\n                        ;\n                        };\n                    };\n                };\n            ;\n                this._behaviors = {\n                };\n            }\n        ;\n        ;\n        }\n    };\n    e.exports = k;\n});\n__d(\"removeFromArray\", [], function(a, b, c, d, e, f) {\n    function g(h, i) {\n        var j = h.indexOf(i);\n        ((((j != -1)) && h.splice(j, 1)));\n    };\n;\n    e.exports = g;\n});\n__d(\"Layer\", [\"JSBNG__Event\",\"function-extensions\",\"ArbiterMixin\",\"BehaviorsMixin\",\"BootloadedReact\",\"ContextualThing\",\"CSS\",\"DataStore\",\"DOM\",\"HTML\",\"KeyEventController\",\"Parent\",\"Style\",\"copyProperties\",\"ge\",\"removeFromArray\",\"KeyStatus\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\");\n    b(\"function-extensions\");\n    var h = b(\"ArbiterMixin\"), i = b(\"BehaviorsMixin\"), j = b(\"BootloadedReact\"), k = b(\"ContextualThing\"), l = b(\"CSS\"), m = b(\"DataStore\"), n = b(\"DOM\"), o = b(\"HTML\"), p = b(\"KeyEventController\"), q = b(\"Parent\"), r = b(\"Style\"), s = b(\"copyProperties\"), t = b(\"ge\"), u = b(\"removeFromArray\");\n    b(\"KeyStatus\");\n    var v = [];\n    function w(x, y) {\n        this._config = ((x || {\n        }));\n        if (y) {\n            this._configure(this._config, y);\n            var z = ((this._config.addedBehaviors || []));\n            this.enableBehaviors(this._getDefaultBehaviors().concat(z));\n        }\n    ;\n    ;\n    };\n;\n    s(w, h);\n    s(w, {\n        init: function(x, y) {\n            x.init(y);\n        },\n        initAndShow: function(x, y) {\n            x.init(y).show();\n        },\n        show: function(x) {\n            x.show();\n        },\n        getTopmostLayer: function() {\n            return v[((v.length - 1))];\n        }\n    });\n    s(w.prototype, h, i, {\n        _initialized: false,\n        _root: null,\n        _shown: false,\n        _hiding: false,\n        _causalElement: null,\n        _reactContainer: null,\n        init: function(x) {\n            this._configure(this._config, x);\n            var y = ((this._config.addedBehaviors || []));\n            this.enableBehaviors(this._getDefaultBehaviors().concat(y));\n            this._initialized = true;\n            return this;\n        },\n        _configure: function(x, y) {\n            if (y) {\n                var z = n.isNode(y), aa = ((((typeof y === \"string\")) || o.isHTML(y)));\n                this.containsReactComponent = j.isValidComponent(y);\n                if (aa) {\n                    y = o(y).getRootNode();\n                }\n                 else if (this.containsReactComponent) {\n                    var ba = JSBNG__document.createElement(\"div\");\n                    j.renderComponent(y, ba);\n                    y = this._reactContainer = ba;\n                }\n                \n            ;\n            ;\n            }\n        ;\n        ;\n            this._root = this._buildWrapper(x, y);\n            if (x.attributes) {\n                n.setAttributes(this._root, x.attributes);\n            }\n        ;\n        ;\n            if (x.classNames) {\n                x.classNames.forEach(l.addClass.curry(this._root));\n            }\n        ;\n        ;\n            l.addClass(this._root, \"uiLayer\");\n            if (x.causalElement) {\n                this._causalElement = t(x.causalElement);\n            }\n        ;\n        ;\n            if (x.permanent) {\n                this._permanent = x.permanent;\n            }\n        ;\n        ;\n            m.set(this._root, \"layer\", this);\n        },\n        _getDefaultBehaviors: function() {\n            return [];\n        },\n        getCausalElement: function() {\n            return this._causalElement;\n        },\n        setCausalElement: function(x) {\n            this._causalElement = x;\n            return this;\n        },\n        getInsertParent: function() {\n            return ((this._insertParent || JSBNG__document.body));\n        },\n        getRoot: function() {\n            return this._root;\n        },\n        getContentRoot: function() {\n            return this._root;\n        },\n        _buildWrapper: function(x, y) {\n            return y;\n        },\n        setInsertParent: function(x) {\n            if (x) {\n                if (((this._shown && ((x !== this.getInsertParent()))))) {\n                    n.appendContent(x, this.getRoot());\n                    this.updatePosition();\n                }\n            ;\n            ;\n                this._insertParent = x;\n            }\n        ;\n        ;\n            return this;\n        },\n        show: function() {\n            if (this._shown) {\n                return this;\n            }\n        ;\n        ;\n            var x = this.getRoot();\n            this.inform(\"beforeshow\");\n            r.set(x, \"visibility\", \"hidden\");\n            r.set(x, \"overflow\", \"hidden\");\n            l.show(x);\n            n.appendContent(this.getInsertParent(), x);\n            if (((this.updatePosition() !== false))) {\n                this._shown = true;\n                this.inform(\"show\");\n                w.inform(\"show\", this);\n                if (!this._permanent) {\n                    !function() {\n                        if (this._shown) {\n                            v.push(this);\n                        }\n                    ;\n                    ;\n                    }.bind(this).defer();\n                }\n            ;\n            ;\n            }\n             else l.hide(x);\n        ;\n        ;\n            r.set(x, \"visibility\", \"\");\n            r.set(x, \"overflow\", \"\");\n            this.inform(\"aftershow\");\n            return this;\n        },\n        hide: function() {\n            if (((((this._hiding || !this._shown)) || ((this.inform(\"beforehide\") === false))))) {\n                return this;\n            }\n        ;\n        ;\n            this._hiding = true;\n            if (((this.inform(\"starthide\") !== false))) {\n                this.finishHide();\n            }\n        ;\n        ;\n            return this;\n        },\n        conditionShow: function(x) {\n            return ((x ? this.show() : this.hide()));\n        },\n        finishHide: function() {\n            if (this._shown) {\n                if (!this._permanent) {\n                    u(v, this);\n                }\n            ;\n            ;\n                this._hiding = false;\n                this._shown = false;\n                l.hide(this.getRoot());\n                this.inform(\"hide\");\n                w.inform(\"hide\", this);\n            }\n        ;\n        ;\n        },\n        isShown: function() {\n            return this._shown;\n        },\n        updatePosition: function() {\n            return true;\n        },\n        destroy: function() {\n            if (this.containsReactComponent) {\n                j.unmountAndReleaseReactRootNode(this._reactContainer);\n            }\n        ;\n        ;\n            this.finishHide();\n            var x = this.getRoot();\n            n.remove(x);\n            this.destroyBehaviors();\n            this.inform(\"destroy\");\n            w.inform(\"destroy\", this);\n            m.remove(x, \"layer\");\n            this._root = this._causalElement = null;\n        }\n    });\n    g.listen(JSBNG__document.documentElement, \"keydown\", function(JSBNG__event) {\n        if (p.filterEventTargets(JSBNG__event, \"keydown\")) {\n            for (var x = ((v.length - 1)); ((x >= 0)); x--) {\n                if (((v[x].inform(\"key\", JSBNG__event) === false))) {\n                    return false;\n                }\n            ;\n            ;\n            };\n        }\n    ;\n    ;\n    }, g.Priority.URGENT);\n    g.listen(JSBNG__document.documentElement, \"click\", function(JSBNG__event) {\n        var x = v.length;\n        if (!x) {\n            return;\n        }\n    ;\n    ;\n        var y = JSBNG__event.getTarget();\n        if (!n.contains(JSBNG__document.documentElement, y)) {\n            return;\n        }\n    ;\n    ;\n        if (!y.offsetWidth) {\n            return;\n        }\n    ;\n    ;\n        if (q.byClass(y, \"generic_dialog\")) {\n            return;\n        }\n    ;\n    ;\n        while (x--) {\n            var z = v[x], aa = z.getContentRoot();\n            if (k.containsIncludingLayers(aa, y)) {\n                return;\n            }\n        ;\n        ;\n            if (((((z.inform(\"JSBNG__blur\") === false)) || z.isShown()))) {\n                return;\n            }\n        ;\n        ;\n        };\n    ;\n    });\n    e.exports = w;\n});\n__d(\"PopupWindow\", [\"DOMDimensions\",\"DOMQuery\",\"Layer\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOMDimensions\"), h = b(\"DOMQuery\"), i = b(\"Layer\"), j = b(\"copyProperties\"), k = {\n        _opts: {\n            allowShrink: true,\n            strategy: \"vector\",\n            timeout: 100,\n            widthElement: null\n        },\n        init: function(l) {\n            j(k._opts, l);\n            JSBNG__setInterval(k._resizeCheck, k._opts.timeout);\n        },\n        _resizeCheck: function() {\n            var l = g.getViewportDimensions(), m = k._getDocumentSize(), n = i.getTopmostLayer();\n            if (n) {\n                var o = n.getRoot().firstChild, p = g.getElementDimensions(o);\n                p.height += g.measureElementBox(o, \"height\", true, true, true);\n                p.width += g.measureElementBox(o, \"width\", true, true, true);\n                m.height = Math.max(m.height, p.height);\n                m.width = Math.max(m.width, p.width);\n            }\n        ;\n        ;\n            var q = ((m.height - l.height)), r = ((m.width - l.width));\n            if (((((r < 0)) && !k._opts.widthElement))) {\n                r = 0;\n            }\n        ;\n        ;\n            r = ((((r > 1)) ? r : 0));\n            if (((!k._opts.allowShrink && ((q < 0))))) {\n                q = 0;\n            }\n        ;\n        ;\n            if (((q || r))) {\n                try {\n                    ((window.JSBNG__console && window.JSBNG__console.firebug));\n                    window.JSBNG__resizeBy(r, q);\n                    if (r) {\n                        window.JSBNG__moveBy(((r / -2)), 0);\n                    }\n                ;\n                ;\n                } catch (s) {\n                \n                };\n            }\n        ;\n        ;\n        },\n        _getDocumentSize: function() {\n            var l = g.getDocumentDimensions();\n            if (((k._opts.strategy === \"offsetHeight\"))) {\n                l.height = JSBNG__document.body.offsetHeight;\n            }\n        ;\n        ;\n            if (k._opts.widthElement) {\n                var m = h.scry(JSBNG__document.body, k._opts.widthElement)[0];\n                if (m) {\n                    l.width = g.getElementDimensions(m).width;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            var n = a.Dialog;\n            if (((((n && n.max_bottom)) && ((n.max_bottom > l.height))))) {\n                l.height = n.max_bottom;\n            }\n        ;\n        ;\n            return l;\n        },\n        open: function(l, m, n) {\n            var o = ((((typeof window.JSBNG__screenX != \"undefined\")) ? window.JSBNG__screenX : window.JSBNG__screenLeft)), p = ((((typeof window.JSBNG__screenY != \"undefined\")) ? window.JSBNG__screenY : window.JSBNG__screenTop)), q = ((((typeof window.JSBNG__outerWidth != \"undefined\")) ? window.JSBNG__outerWidth : JSBNG__document.body.clientWidth)), r = ((((typeof window.JSBNG__outerHeight != \"undefined\")) ? window.JSBNG__outerHeight : ((JSBNG__document.body.clientHeight - 22)))), s = parseInt(((o + ((((q - n)) / 2)))), 10), t = parseInt(((p + ((((r - m)) / 2.5)))), 10), u = ((((((((((((((\"width=\" + n)) + \",height=\")) + m)) + \",left=\")) + s)) + \",top=\")) + t));\n            return window.open(l, \"_blank\", u);\n        }\n    };\n    e.exports = k;\n});\n__d(\"TidyArbiterMixin\", [\"Arbiter\",\"ArbiterMixin\",\"Run\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ArbiterMixin\"), i = b(\"Run\"), j = b(\"copyProperties\"), k = {\n    };\n    j(k, h, {\n        _getArbiterInstance: function() {\n            if (!this._arbiter) {\n                this._arbiter = new g();\n                i.onLeave(function() {\n                    delete this._arbiter;\n                }.bind(this));\n            }\n        ;\n        ;\n            return this._arbiter;\n        }\n    });\n    e.exports = k;\n});\n__d(\"TidyArbiter\", [\"TidyArbiterMixin\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"TidyArbiterMixin\"), h = b(\"copyProperties\"), i = {\n    };\n    h(i, g);\n    e.exports = i;\n});\n__d(\"Vector\", [\"JSBNG__Event\",\"DOMDimensions\",\"DOMPosition\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"DOMDimensions\"), i = b(\"DOMPosition\"), j = b(\"copyProperties\");\n    function k(l, m, n) {\n        j(this, {\n            x: parseFloat(l),\n            y: parseFloat(m),\n            domain: ((n || \"pure\"))\n        });\n    };\n;\n    j(k.prototype, {\n        toString: function() {\n            return ((((((((\"(\" + this.x)) + \", \")) + this.y)) + \")\"));\n        },\n        add: function(l, m) {\n            if (((arguments.length == 1))) {\n                if (((l.domain != \"pure\"))) {\n                    l = l.convertTo(this.domain);\n                }\n            ;\n            ;\n                return this.add(l.x, l.y);\n            }\n        ;\n        ;\n            var n = parseFloat(l), o = parseFloat(m);\n            return new k(((this.x + n)), ((this.y + o)), this.domain);\n        },\n        mul: function(l, m) {\n            if (((typeof m == \"undefined\"))) {\n                m = l;\n            }\n        ;\n        ;\n            return new k(((this.x * l)), ((this.y * m)), this.domain);\n        },\n        sub: function(l, m) {\n            if (((arguments.length == 1))) {\n                return this.add(l.mul(-1));\n            }\n             else return this.add(-l, -m)\n        ;\n        },\n        distanceTo: function(l) {\n            return this.sub(l).magnitude();\n        },\n        magnitude: function() {\n            return Math.sqrt(((((this.x * this.x)) + ((this.y * this.y)))));\n        },\n        rotate: function(l) {\n            return new k(((((this.x * Math.cos(l))) - ((this.y * Math.sin(l))))), ((((this.x * Math.sin(l))) + ((this.y * Math.cos(l))))));\n        },\n        convertTo: function(l) {\n            if (((((((l != \"pure\")) && ((l != \"viewport\")))) && ((l != \"JSBNG__document\"))))) {\n                return new k(0, 0);\n            }\n        ;\n        ;\n            if (((l == this.domain))) {\n                return new k(this.x, this.y, this.domain);\n            }\n        ;\n        ;\n            if (((l == \"pure\"))) {\n                return new k(this.x, this.y);\n            }\n        ;\n        ;\n            if (((this.domain == \"pure\"))) {\n                return new k(0, 0);\n            }\n        ;\n        ;\n            var m = k.getScrollPosition(\"JSBNG__document\"), n = this.x, o = this.y;\n            if (((this.domain == \"JSBNG__document\"))) {\n                n -= m.x;\n                o -= m.y;\n            }\n             else {\n                n += m.x;\n                o += m.y;\n            }\n        ;\n        ;\n            return new k(n, o, l);\n        },\n        setElementPosition: function(l) {\n            var m = this.convertTo(\"JSBNG__document\");\n            l.style.left = ((parseInt(m.x) + \"px\"));\n            l.style.JSBNG__top = ((parseInt(m.y) + \"px\"));\n            return this;\n        },\n        setElementDimensions: function(l) {\n            return this.setElementWidth(l).setElementHeight(l);\n        },\n        setElementWidth: function(l) {\n            l.style.width = ((parseInt(this.x, 10) + \"px\"));\n            return this;\n        },\n        setElementHeight: function(l) {\n            l.style.height = ((parseInt(this.y, 10) + \"px\"));\n            return this;\n        },\n        scrollElementBy: function(l) {\n            if (((l == JSBNG__document.body))) {\n                window.JSBNG__scrollBy(this.x, this.y);\n            }\n             else {\n                l.scrollLeft += this.x;\n                l.scrollTop += this.y;\n            }\n        ;\n        ;\n            return this;\n        }\n    });\n    j(k, {\n        getEventPosition: function(l, m) {\n            m = ((m || \"JSBNG__document\"));\n            var n = g.getPosition(l), o = new k(n.x, n.y, \"JSBNG__document\");\n            return o.convertTo(m);\n        },\n        getScrollPosition: function(l) {\n            l = ((l || \"JSBNG__document\"));\n            var m = i.getScrollPosition();\n            return new k(m.x, m.y, \"JSBNG__document\").convertTo(l);\n        },\n        getElementPosition: function(l, m) {\n            m = ((m || \"JSBNG__document\"));\n            var n = i.getElementPosition(l);\n            return new k(n.x, n.y, \"viewport\").convertTo(m);\n        },\n        getElementDimensions: function(l) {\n            var m = h.getElementDimensions(l);\n            return new k(m.width, m.height);\n        },\n        getViewportDimensions: function() {\n            var l = h.getViewportDimensions();\n            return new k(l.width, l.height, \"viewport\");\n        },\n        getDocumentDimensions: function(l) {\n            var m = h.getDocumentDimensions(l);\n            return new k(m.width, m.height, \"JSBNG__document\");\n        },\n        deserialize: function(l) {\n            var m = l.split(\",\");\n            return new k(m[0], m[1]);\n        }\n    });\n    e.exports = k;\n});\n__d(\"collectDataAttributes\", [\"getContextualParent\",], function(a, b, c, d, e, f) {\n    var g = b(\"getContextualParent\");\n    function h(i, j) {\n        var k = {\n        }, l = {\n        }, m = j.length, n;\n        for (n = 0; ((n < m)); ++n) {\n            k[j[n]] = {\n            };\n            l[j[n]] = ((\"data-\" + j[n]));\n        };\n    ;\n        var o = {\n            tn: \"\",\n            \"tn-debug\": \",\"\n        };\n        while (i) {\n            if (i.getAttribute) {\n                for (n = 0; ((n < m)); ++n) {\n                    var p = i.getAttribute(l[j[n]]);\n                    if (p) {\n                        var q = JSON.parse(p);\n                        {\n                            var fin45keys = ((window.top.JSBNG_Replay.forInKeys)((q))), fin45i = (0);\n                            var r;\n                            for (; (fin45i < fin45keys.length); (fin45i++)) {\n                                ((r) = (fin45keys[fin45i]));\n                                {\n                                    if (((o[r] !== undefined))) {\n                                        if (((k[j[n]][r] === undefined))) {\n                                            k[j[n]][r] = [];\n                                        }\n                                    ;\n                                    ;\n                                        k[j[n]][r].push(q[r]);\n                                    }\n                                     else if (((k[j[n]][r] === undefined))) {\n                                        k[j[n]][r] = q[r];\n                                    }\n                                    \n                                ;\n                                ;\n                                };\n                            };\n                        };\n                    ;\n                    }\n                ;\n                ;\n                };\n            }\n        ;\n        ;\n            i = g(i);\n        };\n    ;\n        {\n            var fin46keys = ((window.top.JSBNG_Replay.forInKeys)((k))), fin46i = (0);\n            var s;\n            for (; (fin46i < fin46keys.length); (fin46i++)) {\n                ((s) = (fin46keys[fin46i]));\n                {\n                    {\n                        var fin47keys = ((window.top.JSBNG_Replay.forInKeys)((o))), fin47i = (0);\n                        var t;\n                        for (; (fin47i < fin47keys.length); (fin47i++)) {\n                            ((t) = (fin47keys[fin47i]));\n                            {\n                                if (((k[s][t] !== undefined))) {\n                                    k[s][t] = k[s][t].join(o[t]);\n                                }\n                            ;\n                            ;\n                            };\n                        };\n                    };\n                ;\n                };\n            };\n        };\n    ;\n        return k;\n    };\n;\n    e.exports = h;\n});\n__d(\"csx\", [], function(a, b, c, d, e, f) {\n    function g(h) {\n        throw new Error(\"csx(...): Unexpected class selector transformation.\");\n    };\n;\n    e.exports = g;\n});\n__d(\"JSBNG__requestAnimationFrame\", [\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"emptyFunction\"), h = 0, i = ((((((((((a.JSBNG__requestAnimationFrame || a.JSBNG__webkitRequestAnimationFrame)) || a.JSBNG__mozRequestAnimationFrame)) || a.oRequestAnimationFrame)) || a.msRequestAnimationFrame)) || function(j) {\n        var k = JSBNG__Date.now(), l = Math.max(0, ((16 - ((k - h)))));\n        h = ((k + l));\n        return a.JSBNG__setTimeout(j, l);\n    }));\n    i(g);\n    e.exports = i;\n});\n__d(\"queryThenMutateDOM\", [\"function-extensions\",\"Run\",\"createArrayFrom\",\"emptyFunction\",\"JSBNG__requestAnimationFrame\",], function(a, b, c, d, e, f) {\n    b(\"function-extensions\");\n    var g = b(\"Run\"), h = b(\"createArrayFrom\"), i = b(\"emptyFunction\"), j = b(\"JSBNG__requestAnimationFrame\"), k, l, m = {\n    }, n = [], o = [];\n    function p(s, t, u) {\n        if (((!s && !t))) {\n            return;\n        }\n    ;\n    ;\n        if (((u && m.hasOwnProperty(u)))) {\n            return;\n        }\n         else if (u) {\n            m[u] = 1;\n        }\n        \n    ;\n    ;\n        n.push(((t || i)));\n        o.push(((s || i)));\n        r();\n        if (!k) {\n            k = true;\n            g.onLeave(function() {\n                k = false;\n                l = false;\n                m = {\n                };\n                n.length = 0;\n                o.length = 0;\n            });\n        }\n    ;\n    ;\n    };\n;\n    p.prepare = function(s, t, u) {\n        return function() {\n            var v = h(arguments);\n            v.unshift(this);\n            var w = Function.prototype.bind.apply(s, v), x = t.bind(this);\n            p(w, x, u);\n        };\n    };\n    function q() {\n        m = {\n        };\n        var s = o.length, t = n.length, u = [], v;\n        while (s--) {\n            v = o.shift();\n            u.push(v());\n        };\n    ;\n        while (t--) {\n            v = n.shift();\n            v(u.shift());\n        };\n    ;\n        l = false;\n        r();\n    };\n;\n    function r() {\n        if (((!l && ((o.length || n.length))))) {\n            l = true;\n            j(q);\n        }\n    ;\n    ;\n    };\n;\n    e.exports = p;\n});\n__d(\"setTimeoutAcrossTransitions\", [], function(a, b, c, d, e, f) {\n    function g(h, i) {\n        return JSBNG__setTimeout(h, i, false);\n    };\n;\n    e.exports = g;\n});\n__d(\"TimelineCoverCollapse\", [\"Arbiter\",\"DOMDimensions\",\"Style\",\"TidyArbiter\",\"$\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"DOMDimensions\"), i = b(\"Style\"), j = b(\"TidyArbiter\"), k = b(\"$\");\n    f.collapse = function(l, m) {\n        m--;\n        var n = h.getViewportDimensions().height, o = h.getDocumentDimensions().height, p = ((n + m));\n        if (((o <= p))) {\n            i.set(k(\"pagelet_timeline_main_column\"), \"min-height\", ((p + \"px\")));\n        }\n    ;\n    ;\n        window.JSBNG__scrollBy(0, m);\n        j.inform(\"TimelineCover/coverCollapsed\", m, g.BEHAVIOR_STATE);\n    };\n});\nfunction tz_calculate(a) {\n    var b = new JSBNG__Date(), c = ((b.getTimezoneOffset() / 30)), d = ((b.getTime() / 1000)), e = Math.round(((((a - d)) / 1800))), f = ((Math.round(((c + e))) % 48));\n    if (((f == 0))) {\n        return 0;\n    }\n     else if (((f > 24))) {\n        f -= ((Math.ceil(((f / 48))) * 48));\n    }\n     else if (((f < -28))) {\n        f += ((Math.ceil(((f / -48))) * 48));\n    }\n    \n    \n;\n;\n    return ((f * 30));\n};\n;\nfunction tz_autoset(a, b, c) {\n    if (((!a || ((undefined == b))))) {\n        return;\n    }\n;\n;\n    if (window.tz_autoset.calculated) {\n        return;\n    }\n;\n;\n    window.tz_autoset.calculated = true;\n    var d = -tz_calculate(a);\n    if (((c || ((d != b))))) {\n        var e = \"/ajax/timezone/update.php\";\n        new AsyncRequest().setURI(e).setData({\n            gmt_off: d,\n            is_forced: c\n        }).setErrorHandler(emptyFunction).setTransportErrorHandler(emptyFunction).setOption(\"suppressErrorAlerts\", true).send();\n    }\n;\n;\n};\n;\n__d(\"UFITracking\", [\"Bootloader\",], function(a, b, c, d, e, f) {\n    var g = b(\"Bootloader\");\n    function h(j) {\n        g.loadModules([\"DOM\",\"collectDataAttributes\",], function(k, l) {\n            j.forEach(function(m) {\n                var n = k.scry(JSBNG__document.body, m);\n                if (((!n || n.link_data))) {\n                    return;\n                }\n            ;\n            ;\n                var o = l(n, [\"ft\",]).ft;\n                if (Object.keys(o).length) {\n                    var p = k.create(\"input\", {\n                        type: \"hidden\",\n                        JSBNG__name: \"link_data\",\n                        value: JSON.stringify(o)\n                    });\n                    n.appendChild(p);\n                }\n            ;\n            ;\n            });\n        });\n    };\n;\n    var i = {\n        addAllLinkData: function() {\n            h([\"form.commentable_item\",]);\n        },\n        addAllLinkDataForQuestion: function() {\n            h([\"form.fbEigenpollForm\",\"form.fbQuestionPollForm\",]);\n        }\n    };\n    e.exports = i;\n});\n__d(\"legacy:ufi-tracking-js\", [\"UFITracking\",], function(a, b, c, d) {\n    var e = b(\"UFITracking\");\n    a.ufi_add_all_link_data = e.addAllLinkData;\n    a.question_add_all_link_data = e.addAllLinkDataForQuestion;\n}, 3);\n__d(\"LayerRemoveOnHide\", [\"function-extensions\",\"DOM\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    b(\"function-extensions\");\n    var g = b(\"DOM\"), h = b(\"copyProperties\");\n    function i(j) {\n        this._layer = j;\n    };\n;\n    h(i.prototype, {\n        _subscription: null,\n        enable: function() {\n            this._subscription = this._layer.subscribe(\"hide\", g.remove.curry(this._layer.getRoot()));\n        },\n        disable: function() {\n            if (this._subscription) {\n                this._subscription.unsubscribe();\n                this._subscription = null;\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = i;\n});\n__d(\"Keys\", [], function(a, b, c, d, e, f) {\n    e.exports = {\n        BACKSPACE: 8,\n        TAB: 9,\n        RETURN: 13,\n        ESC: 27,\n        SPACE: 32,\n        PAGE_UP: 33,\n        PAGE_DOWN: 34,\n        END: 35,\n        HOME: 36,\n        LEFT: 37,\n        UP: 38,\n        RIGHT: 39,\n        DOWN: 40,\n        DELETE: 46,\n        COMMA: 188\n    };\n});\n__d(\"areObjectsEqual\", [], function(a, b, c, d, e, f) {\n    function g(h, i) {\n        return ((JSON.stringify(h) == JSON.stringify(i)));\n    };\n;\n    e.exports = g;\n});\n__d(\"flattenArray\", [], function(a, b, c, d, e, f) {\n    function g(h) {\n        var i = h.slice(), j = [];\n        while (i.length) {\n            var k = i.pop();\n            if (Array.isArray(k)) {\n                Array.prototype.push.apply(i, k);\n            }\n             else j.push(k);\n        ;\n        ;\n        };\n    ;\n        return j.reverse();\n    };\n;\n    e.exports = g;\n});\n__d(\"htmlSpecialChars\", [], function(a, b, c, d, e, f) {\n    var g = /&/g, h = /</g, i = />/g, j = /\"/g, k = /'/g;\n    function l(m) {\n        if (((((((typeof m == \"undefined\")) || ((m === null)))) || !m.toString))) {\n            return \"\";\n        }\n    ;\n    ;\n        if (((m === false))) {\n            return \"0\";\n        }\n         else if (((m === true))) {\n            return \"1\";\n        }\n        \n    ;\n    ;\n        return m.toString().replace(g, \"&amp;\").replace(j, \"&quot;\").replace(k, \"&#039;\").replace(h, \"&lt;\").replace(i, \"&gt;\");\n    };\n;\n    e.exports = l;\n});\n__d(\"htmlize\", [\"htmlSpecialChars\",], function(a, b, c, d, e, f) {\n    var g = b(\"htmlSpecialChars\");\n    function h(i) {\n        return g(i).replace(/\\r\\n|[\\r\\n]/g, \"\\u003Cbr/\\u003E\");\n    };\n;\n    e.exports = h;\n});");
// 994
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"new (require(\"ServerJS\"))().handle({\n    require: [[\"removeArrayReduce\",],[\"markJSEnabled\",],[\"lowerDomain\",],[\"URLFragmentPrelude\",],],\n    define: [[\"BanzaiConfig\",[],{\n        MAX_WAIT: 150000,\n        MAX_SIZE: 10000,\n        COMPRESSION_THRESHOLD: 800,\n        gks: {\n            jslogger: true,\n            miny_compression: true,\n            boosted_posts: true,\n            time_spent: true,\n            time_spent_bit_array: true,\n            time_spent_debug: true,\n            useraction: true,\n            videos: true\n        }\n    },7,],[\"URLFragmentPreludeConfig\",[],{\n        hashtagRedirect: true,\n        incorporateQuicklingFragment: true\n    },137,],]\n});");
// 995
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"sbc7df7f6bb75d7e29414a7bf76d7afea4393a8e7");
// 996
geval("new (require(\"ServerJS\"))().handle({\n    require: [[\"removeArrayReduce\",],[\"markJSEnabled\",],[\"lowerDomain\",],[\"URLFragmentPrelude\",],],\n    define: [[\"BanzaiConfig\",[],{\n        MAX_WAIT: 150000,\n        MAX_SIZE: 10000,\n        COMPRESSION_THRESHOLD: 800,\n        gks: {\n            jslogger: true,\n            miny_compression: true,\n            boosted_posts: true,\n            time_spent: true,\n            time_spent_bit_array: true,\n            time_spent_debug: true,\n            useraction: true,\n            videos: true\n        }\n    },7,],[\"URLFragmentPreludeConfig\",[],{\n        hashtagRedirect: true,\n        incorporateQuicklingFragment: true\n    },137,],]\n});");
// 1023
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"function e7838c840e018d6d5d0870c8a3c3cef5ceacd537d(event) {\n    (window.Toggler && Toggler.hide());\n};");
// 1024
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"s1bc020b23c1b7acf1a158f38463f085640438838");
// 1025
geval("function e7838c840e018d6d5d0870c8a3c3cef5ceacd537d(JSBNG__event) {\n    ((window.Toggler && Toggler.hide()));\n};\n;");
// 1026
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"function ec0804b7f3ae255200c43d00c014bb94f344d06fe(event) {\n    return run_with(this, [\"min-notifications-jewel\",], function() {\n        MinNotifications.bootstrap(this);\n    });\n};");
// 1027
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"s1809336c878b583a8c25754764340693ab124489");
// 1028
geval("function ec0804b7f3ae255200c43d00c014bb94f344d06fe(JSBNG__event) {\n    return run_with(this, [\"min-notifications-jewel\",], function() {\n        MinNotifications.bootstrap(this);\n    });\n};\n;");
// 1029
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"function e6560603264ef5f7501e684e8b01c646c45b86b81(event) {\n    return ((window.Event && Event.__inlineSubmit) && Event.__inlineSubmit(this, event));\n};");
// 1030
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"s988454fbbebb4f5c39047686ab0f805cb3d35ac8");
// 1031
geval("function e6560603264ef5f7501e684e8b01c646c45b86b81(JSBNG__event) {\n    return ((((window.JSBNG__Event && JSBNG__Event.__inlineSubmit)) && JSBNG__Event.__inlineSubmit(this, JSBNG__event)));\n};\n;");
// 1032
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"function ee033beee9f71f1d153c463cc75dee372f3a3da79(event) {\n    var q = $(\"q\");\n    if ((q.value == q.getAttribute(\"placeholder\"))) {\n        q.focus();\n        return false;\n    }\n;\n};");
// 1033
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"s239bb89ed65f190b08d1208ef21dad35f6f20ab6");
// 1034
geval("function ee033beee9f71f1d153c463cc75dee372f3a3da79(JSBNG__event) {\n    var q = $(\"q\");\n    if (((q.value == q.getAttribute(\"placeholder\")))) {\n        q.JSBNG__focus();\n        return false;\n    }\n;\n;\n};\n;");
// 1035
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"function e16dd16226f2f839519b14343b6f79699ae341c78(event) {\n    $(\"search_first_focus\").value = ($(\"search_first_focus\").value || +new Date());\n;\n    Bootloader.loadComponents(\"SearchBootloader\", emptyFunction);\n};");
// 1036
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"s83cdd098baa8b8fc7670e9e599802f7562d1ef57");
// 1037
geval("function e16dd16226f2f839519b14343b6f79699ae341c78(JSBNG__event) {\n    $(\"search_first_focus\").value = (($(\"search_first_focus\").value || +new JSBNG__Date()));\n;\n    Bootloader.loadComponents(\"SearchBootloader\", emptyFunction);\n};\n;");
// 1038
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"function ecd0969c627f884b0fe8383ca5dc6c38a1102c7c7(event) {\n    var q = $(\"q\");\n    if ((q.value == q.getAttribute(\"placeholder\"))) {\n        q.focus();\n        return false;\n    }\n;\n};");
// 1039
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"sa76cfe207e27b0c3cfc65c72854b0c60d158f298");
// 1040
geval("function ecd0969c627f884b0fe8383ca5dc6c38a1102c7c7(JSBNG__event) {\n    var q = $(\"q\");\n    if (((q.value == q.getAttribute(\"placeholder\")))) {\n        q.JSBNG__focus();\n        return false;\n    }\n;\n;\n};\n;");
// 1041
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"function e92e53530d37ff46fa3100cf588fe77bbd832310b(event) {\n    Arbiter.inform(\"PagesVoiceBar/toggle\");\n};");
// 1042
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"sf777aa9a026c7df2982a326f292ed315c4c3f095");
// 1043
geval("function e92e53530d37ff46fa3100cf588fe77bbd832310b(JSBNG__event) {\n    Arbiter.inform(\"PagesVoiceBar/toggle\");\n};\n;");
// 1044
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"function e842a4cf819e0ef651842e8b08f46fb0e6d79ceb5(event) {\n    return ((window.Event && Event.__inlineSubmit) && Event.__inlineSubmit(this, event));\n};");
// 1045
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"s03e241bc8c6c7f05e2d20517a7be89baaefad2df");
// 1046
geval("function e842a4cf819e0ef651842e8b08f46fb0e6d79ceb5(JSBNG__event) {\n    return ((((window.JSBNG__Event && JSBNG__Event.__inlineSubmit)) && JSBNG__Event.__inlineSubmit(this, JSBNG__event)));\n};\n;");
// 1047
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"function si_cj(m) {\n    setTimeout(function() {\n        new Image().src = ((\"http://jsbngssl.error.facebook.com/common/scribe_endpoint.php?c=si_clickjacking&t=3095\" + \"&m=\") + m);\n    }, 5000);\n};\nif (((top != self) && !false)) {\n    try {\n        if ((parent != top)) {\n            throw 1;\n        }\n    ;\n        var si_cj_d = [\"apps.facebook.com\",\"/pages/\",\"apps.beta.facebook.com\",];\n        var href = top.location.href.toLowerCase();\n        for (var i = 0; (i < si_cj_d.length); i++) {\n            if ((href.indexOf(si_cj_d[i]) >= 0)) {\n                throw 1;\n            }\n        ;\n        };\n        si_cj(\"3 http://jsbngssl.www.facebook.com/\");\n    } catch (e) {\n        si_cj(\"1 \\u0009http://jsbngssl.www.facebook.com/\");\n        window.document.write(\"\\u003Cstyle\\u003Ebody * {display:none !important;}\\u003C/style\\u003E\\u003Ca href=\\\"#\\\" onclick=\\\"top.location.href=window.location.href\\\" style=\\\"display:block !important;padding:10px\\\"\\u003E\\u003Ci class=\\\"img sp_4p6kmz sx_aac1e3\\\" style=\\\"display:block !important\\\"\\u003E\\u003C/i\\u003EGo to Facebook.com\\u003C/a\\u003E\");\n    };\n}\n;");
// 1048
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"s55cde185bfc8d1d54c4ed4c94d147ba99e53a6b0");
// 1049
geval("function si_cj(m) {\n    JSBNG__setTimeout(function() {\n        new JSBNG__Image().src = ((((\"http://jsbngssl.error.facebook.com/common/scribe_endpoint.php?c=si_clickjacking&t=3095\" + \"&m=\")) + m));\n    }, 5000);\n};\n;\nif (((((JSBNG__top != JSBNG__self)) && !false))) {\n    try {\n        if (((parent != JSBNG__top))) {\n            throw 1;\n        }\n    ;\n    ;\n        var si_cj_d = [\"apps.facebook.com\",\"/pages/\",\"apps.beta.facebook.com\",];\n        var href = JSBNG__top.JSBNG__location.href.toLowerCase();\n        for (var i = 0; ((i < si_cj_d.length)); i++) {\n            if (((href.indexOf(si_cj_d[i]) >= 0))) {\n                throw 1;\n            }\n        ;\n        ;\n        };\n    ;\n        si_cj(\"3 http://jsbngssl.www.facebook.com/\");\n    } catch (e) {\n        si_cj(\"1 \\u0009http://jsbngssl.www.facebook.com/\");\n        window.JSBNG__document.write(\"\\u003Cstyle\\u003Ebody * {display:none !important;}\\u003C/style\\u003E\\u003Ca href=\\\"#\\\" onclick=\\\"top.JSBNG__location.href=window.JSBNG__location.href\\\" style=\\\"display:block !important;padding:10px\\\"\\u003E\\u003Ci class=\\\"img sp_4p6kmz sx_aac1e3\\\" style=\\\"display:block !important\\\"\\u003E\\u003C/i\\u003EGo to Facebook.com\\u003C/a\\u003E\");\n    };\n;\n}\n;\n;");
// 1050
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"Bootloader.setResourceMap({\n    yagwf: {\n        type: \"css\",\n        permanent: 1,\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yw/r/JDr6pTZ60bK.css\"\n    },\n    VDymv: {\n        type: \"css\",\n        permanent: 1,\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yZ/r/2OiKY3nDQvQ.css\"\n    },\n    \"X/Fq6\": {\n        type: \"css\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y6/r/YlbIHaln_Rk.css\"\n    },\n    \"0duP3\": {\n        type: \"css\",\n        permanent: 1,\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yj/r/KbSyGJkqroJ.css\"\n    },\n    ynBUm: {\n        type: \"css\",\n        permanent: 1,\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yD/r/OWwnO_yMqhK.css\"\n    },\n    vFtag: {\n        type: \"css\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yS/r/AXbdtQOFsWr.css\"\n    },\n    cy4a0: {\n        type: \"css\",\n        permanent: 1,\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yC/r/Ef0wezTRsTI.css\"\n    },\n    xqZGj: {\n        type: \"css\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yb/r/tOU0wFcLVo_.css\"\n    },\n    W3Ky6: {\n        type: \"css\",\n        permanent: 1,\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y0/r/RxMmKV8uOEh.css\"\n    }\n});\nBootloader.setResourceMap({\n    oE4Do: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yq/r/MDwOqV08JHh.js\"\n    },\n    C3MER: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yP/r/hnJRUTuHHeP.js\"\n    },\n    AyUu6: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yF/r/pmYy9aLa5q_.js\"\n    },\n    \"+h1d2\": {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yo/r/0gMMCDzw75A.js\"\n    },\n    h9fqQ: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yF/r/FmIXX_SfTzh.js\"\n    },\n    \"63VzN\": {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/ye/r/v9y92rsUvEH.js\"\n    },\n    \"wxq+C\": {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y7/r/HXOT2PHhPzY.js\"\n    },\n    MqSmz: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yH/r/ghlEJgSKAee.js\"\n    },\n    tIw4R: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yq/r/ztXltT1LKGv.js\"\n    },\n    pR9EP: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yE/r/jKneATMaMne.js\"\n    },\n    AtxWD: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yU/r/RXieOTwv9ZN.js\"\n    },\n    \"1XxM1\": {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yK/r/WyMulbsltUU.js\"\n    },\n    qu1rX: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/ym/r/5vdmAFTChHH.js\"\n    },\n    \"4vv8/\": {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y4/r/VctjjLR0rnO.js\"\n    },\n    \"5dFET\": {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yg/r/ojsbRUPU0Sl.js\"\n    },\n    C6rJk: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yk/r/mvmvxDKTeL4.js\"\n    },\n    \"xO/k5\": {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yB/r/fQIoBRZLBHX.js\"\n    },\n    H42Jh: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y3/r/ppwOo4BAmlb.js\"\n    },\n    bwsMw: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y_/r/hwOyT9fmfZV.js\"\n    },\n    Pc0ie: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yu/r/aUem8WpGyly.js\"\n    },\n    hfrQl: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y7/r/MX9CLuapN6V.js\"\n    },\n    OJTM4: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yd/r/-z4vUS8jrpA.js\"\n    },\n    AsDOA: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yg/r/4CJ_klaVGHP.js\"\n    },\n    zyFOp: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yA/r/HAFtXNlDnG9.js\"\n    },\n    \"u//Ut\": {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yn/r/-5WtOV0lZ_r.js\"\n    },\n    bUzfU: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yz/r/CVXUroaYxOH.js\"\n    },\n    hofTc: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yP/r/EKA5EzGo0o5.js\"\n    },\n    Rs18G: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/ys/r/t80qJDlUD7e.js\"\n    },\n    EzMPG: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yr/r/r-aTsS_RKim.js\"\n    },\n    \"LpC/l\": {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yC/r/3O1MmhNwV3-.js\"\n    },\n    brbS1: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y1/r/-lwVuunZG1z.js\"\n    },\n    \"/vuZw\": {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yC/r/yXqVwx5GyZ4.js\"\n    },\n    cNca2: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yv/r/OHUUx9tXXmr.js\"\n    }\n});\nBootloader.enableBootload({\n    PhotoTagger: {\n        resources: [\"AyUu6\",\"W3Ky6\",\"AsDOA\",\"bUzfU\",\"+h1d2\",\"h9fqQ\",],\n        \"module\": true\n    },\n    AsyncDOM: {\n        resources: [\"AyUu6\",],\n        \"module\": true\n    },\n    HighContrastMode: {\n        resources: [\"AyUu6\",],\n        \"module\": true\n    },\n    SearchBootloader: {\n        resources: [\"AyUu6\",\"W3Ky6\",\"u//Ut\",\"hfrQl\",\"OJTM4\",\"AsDOA\",\"0duP3\",\"63VzN\",]\n    },\n    Toggler: {\n        resources: [\"AyUu6\",\"W3Ky6\",\"AsDOA\",],\n        \"module\": true\n    },\n    TagTokenizer: {\n        resources: [\"AyUu6\",\"W3Ky6\",\"LpC/l\",\"h9fqQ\",\"AsDOA\",],\n        \"module\": true\n    },\n    PhotoTagApproval: {\n        resources: [\"AyUu6\",\"+h1d2\",\"h9fqQ\",],\n        \"module\": true\n    },\n    ErrorSignal: {\n        resources: [\"AyUu6\",\"cNca2\",],\n        \"module\": true\n    },\n    DesktopNotifications: {\n        resources: [\"C3MER\",],\n        \"module\": true\n    },\n    VideoRotate: {\n        resources: [\"AyUu6\",\"H42Jh\",],\n        \"module\": true\n    },\n    PhotoSnowlift: {\n        resources: [\"AyUu6\",\"AsDOA\",\"W3Ky6\",\"OJTM4\",\"+h1d2\",],\n        \"module\": true\n    },\n    FbdDialogProvider: {\n        resources: [\"/vuZw\",\"AyUu6\",\"bwsMw\",],\n        \"module\": true\n    },\n    AsyncResponse: {\n        resources: [\"AyUu6\",],\n        \"module\": true\n    },\n    trackReferrer: {\n        resources: [],\n        \"module\": true\n    },\n    Event: {\n        resources: [\"AyUu6\",],\n        \"module\": true\n    },\n    AsyncDialog: {\n        resources: [\"AyUu6\",\"AsDOA\",\"W3Ky6\",\"OJTM4\",],\n        \"module\": true\n    },\n    DOM: {\n        resources: [\"AyUu6\",],\n        \"module\": true\n    },\n    SpotlightShareViewer: {\n        resources: [\"AyUu6\",\"AsDOA\",\"X/Fq6\",\"zyFOp\",],\n        \"module\": true\n    },\n    ChatTabModel: {\n        resources: [\"AyUu6\",\"u//Ut\",\"OJTM4\",\"AsDOA\",\"EzMPG\",\"brbS1\",],\n        \"module\": true\n    },\n    Input: {\n        resources: [\"AyUu6\",],\n        \"module\": true\n    },\n    Music: {\n        resources: [\"AyUu6\",\"OJTM4\",\"W3Ky6\",\"AsDOA\",\"63VzN\",\"qu1rX\",\"pR9EP\",\"brbS1\",\"cy4a0\",],\n        \"module\": true\n    },\n    ConfirmationDialog: {\n        resources: [\"AyUu6\",\"AsDOA\",\"oE4Do\",],\n        \"module\": true\n    },\n    Dialog: {\n        resources: [\"AyUu6\",\"W3Ky6\",\"AsDOA\",],\n        \"module\": true\n    },\n    IframeShim: {\n        resources: [\"AyUu6\",\"AsDOA\",\"MqSmz\",],\n        \"module\": true\n    },\n    \"autoset-timezone\": {\n        resources: [\"AyUu6\",]\n    },\n    PhotosButtonTooltips: {\n        resources: [\"AyUu6\",\"AsDOA\",\"W3Ky6\",\"Rs18G\",],\n        \"module\": true\n    },\n    SnowliftPicCropper: {\n        resources: [\"AyUu6\",\"W3Ky6\",\"AsDOA\",\"+h1d2\",\"Pc0ie\",\"0duP3\",\"wxq+C\",],\n        \"module\": true\n    },\n    SpotifyJSONPRequest: {\n        resources: [\"AyUu6\",\"xO/k5\",],\n        \"module\": true\n    },\n    Live: {\n        resources: [\"AyUu6\",\"OJTM4\",],\n        \"module\": true\n    },\n    DimensionTracking: {\n        resources: [\"AyUu6\",],\n        \"module\": true\n    },\n    PrivacyLiteNUXController: {\n        resources: [\"AyUu6\",\"AsDOA\",\"hfrQl\",\"0duP3\",\"u//Ut\",\"W3Ky6\",\"OJTM4\",],\n        \"module\": true\n    },\n    Tooltip: {\n        resources: [\"AyUu6\",\"AsDOA\",\"W3Ky6\",],\n        \"module\": true\n    },\n    \"legacy:detect-broken-proxy-cache\": {\n        resources: [\"AyUu6\",]\n    },\n    PhotoInlineEditor: {\n        resources: [\"AyUu6\",\"+h1d2\",\"W3Ky6\",\"AsDOA\",\"h9fqQ\",\"AtxWD\",],\n        \"module\": true\n    },\n    LiveTimer: {\n        resources: [\"AyUu6\",],\n        \"module\": true\n    },\n    \"legacy:min-notifications-jewel\": {\n        resources: [\"AyUu6\",\"AsDOA\",\"tIw4R\",\"hofTc\",]\n    },\n    AsyncRequest: {\n        resources: [\"AyUu6\",],\n        \"module\": true\n    },\n    React: {\n        resources: [\"OJTM4\",\"AyUu6\",],\n        \"module\": true\n    },\n    PhotoTags: {\n        resources: [\"AyUu6\",\"+h1d2\",\"W3Ky6\",\"h9fqQ\",],\n        \"module\": true\n    },\n    \"fb-photos-snowlift-fullscreen-css\": {\n        resources: [\"VDymv\",]\n    },\n    PrivacyLiteFlyout: {\n        resources: [\"AyUu6\",\"OJTM4\",\"W3Ky6\",\"AsDOA\",\"0duP3\",\"hfrQl\",],\n        \"module\": true\n    },\n    Form: {\n        resources: [\"AyUu6\",\"AsDOA\",],\n        \"module\": true\n    }\n});");
// 1051
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"s6483de5fe55246b950f8bbeb8dd035ac37f6c8b7");
// 1052
geval("Bootloader.setResourceMap({\n    yagwf: {\n        type: \"css\",\n        permanent: 1,\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yw/r/JDr6pTZ60bK.css\"\n    },\n    VDymv: {\n        type: \"css\",\n        permanent: 1,\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yZ/r/2OiKY3nDQvQ.css\"\n    },\n    \"X/Fq6\": {\n        type: \"css\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y6/r/YlbIHaln_Rk.css\"\n    },\n    \"0duP3\": {\n        type: \"css\",\n        permanent: 1,\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yj/r/KbSyGJkqroJ.css\"\n    },\n    ynBUm: {\n        type: \"css\",\n        permanent: 1,\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yD/r/OWwnO_yMqhK.css\"\n    },\n    vFtag: {\n        type: \"css\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yS/r/AXbdtQOFsWr.css\"\n    },\n    cy4a0: {\n        type: \"css\",\n        permanent: 1,\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yC/r/Ef0wezTRsTI.css\"\n    },\n    xqZGj: {\n        type: \"css\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yb/r/tOU0wFcLVo_.css\"\n    },\n    W3Ky6: {\n        type: \"css\",\n        permanent: 1,\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y0/r/RxMmKV8uOEh.css\"\n    }\n});\nBootloader.setResourceMap({\n    oE4Do: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yq/r/MDwOqV08JHh.js\"\n    },\n    C3MER: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yP/r/hnJRUTuHHeP.js\"\n    },\n    AyUu6: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yF/r/pmYy9aLa5q_.js\"\n    },\n    \"+h1d2\": {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yo/r/0gMMCDzw75A.js\"\n    },\n    h9fqQ: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yF/r/FmIXX_SfTzh.js\"\n    },\n    \"63VzN\": {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/ye/r/v9y92rsUvEH.js\"\n    },\n    \"wxq+C\": {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y7/r/HXOT2PHhPzY.js\"\n    },\n    MqSmz: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yH/r/ghlEJgSKAee.js\"\n    },\n    tIw4R: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yq/r/ztXltT1LKGv.js\"\n    },\n    pR9EP: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yE/r/jKneATMaMne.js\"\n    },\n    AtxWD: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yU/r/RXieOTwv9ZN.js\"\n    },\n    \"1XxM1\": {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yK/r/WyMulbsltUU.js\"\n    },\n    qu1rX: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/ym/r/5vdmAFTChHH.js\"\n    },\n    \"4vv8/\": {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y4/r/VctjjLR0rnO.js\"\n    },\n    \"5dFET\": {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yg/r/ojsbRUPU0Sl.js\"\n    },\n    C6rJk: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yk/r/mvmvxDKTeL4.js\"\n    },\n    \"xO/k5\": {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yB/r/fQIoBRZLBHX.js\"\n    },\n    H42Jh: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y3/r/ppwOo4BAmlb.js\"\n    },\n    bwsMw: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y_/r/hwOyT9fmfZV.js\"\n    },\n    Pc0ie: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yu/r/aUem8WpGyly.js\"\n    },\n    hfrQl: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y7/r/MX9CLuapN6V.js\"\n    },\n    OJTM4: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yd/r/-z4vUS8jrpA.js\"\n    },\n    AsDOA: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yg/r/4CJ_klaVGHP.js\"\n    },\n    zyFOp: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yA/r/HAFtXNlDnG9.js\"\n    },\n    \"u//Ut\": {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yn/r/-5WtOV0lZ_r.js\"\n    },\n    bUzfU: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yz/r/CVXUroaYxOH.js\"\n    },\n    hofTc: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yP/r/EKA5EzGo0o5.js\"\n    },\n    Rs18G: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/ys/r/t80qJDlUD7e.js\"\n    },\n    EzMPG: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yr/r/r-aTsS_RKim.js\"\n    },\n    \"LpC/l\": {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yC/r/3O1MmhNwV3-.js\"\n    },\n    brbS1: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y1/r/-lwVuunZG1z.js\"\n    },\n    \"/vuZw\": {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yC/r/yXqVwx5GyZ4.js\"\n    },\n    cNca2: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yv/r/OHUUx9tXXmr.js\"\n    }\n});\nBootloader.enableBootload({\n    PhotoTagger: {\n        resources: [\"AyUu6\",\"W3Ky6\",\"AsDOA\",\"bUzfU\",\"+h1d2\",\"h9fqQ\",],\n        \"module\": true\n    },\n    AsyncDOM: {\n        resources: [\"AyUu6\",],\n        \"module\": true\n    },\n    HighContrastMode: {\n        resources: [\"AyUu6\",],\n        \"module\": true\n    },\n    SearchBootloader: {\n        resources: [\"AyUu6\",\"W3Ky6\",\"u//Ut\",\"hfrQl\",\"OJTM4\",\"AsDOA\",\"0duP3\",\"63VzN\",]\n    },\n    Toggler: {\n        resources: [\"AyUu6\",\"W3Ky6\",\"AsDOA\",],\n        \"module\": true\n    },\n    TagTokenizer: {\n        resources: [\"AyUu6\",\"W3Ky6\",\"LpC/l\",\"h9fqQ\",\"AsDOA\",],\n        \"module\": true\n    },\n    PhotoTagApproval: {\n        resources: [\"AyUu6\",\"+h1d2\",\"h9fqQ\",],\n        \"module\": true\n    },\n    ErrorSignal: {\n        resources: [\"AyUu6\",\"cNca2\",],\n        \"module\": true\n    },\n    DesktopNotifications: {\n        resources: [\"C3MER\",],\n        \"module\": true\n    },\n    VideoRotate: {\n        resources: [\"AyUu6\",\"H42Jh\",],\n        \"module\": true\n    },\n    PhotoSnowlift: {\n        resources: [\"AyUu6\",\"AsDOA\",\"W3Ky6\",\"OJTM4\",\"+h1d2\",],\n        \"module\": true\n    },\n    FbdDialogProvider: {\n        resources: [\"/vuZw\",\"AyUu6\",\"bwsMw\",],\n        \"module\": true\n    },\n    AsyncResponse: {\n        resources: [\"AyUu6\",],\n        \"module\": true\n    },\n    trackReferrer: {\n        resources: [],\n        \"module\": true\n    },\n    JSBNG__Event: {\n        resources: [\"AyUu6\",],\n        \"module\": true\n    },\n    AsyncDialog: {\n        resources: [\"AyUu6\",\"AsDOA\",\"W3Ky6\",\"OJTM4\",],\n        \"module\": true\n    },\n    DOM: {\n        resources: [\"AyUu6\",],\n        \"module\": true\n    },\n    SpotlightShareViewer: {\n        resources: [\"AyUu6\",\"AsDOA\",\"X/Fq6\",\"zyFOp\",],\n        \"module\": true\n    },\n    ChatTabModel: {\n        resources: [\"AyUu6\",\"u//Ut\",\"OJTM4\",\"AsDOA\",\"EzMPG\",\"brbS1\",],\n        \"module\": true\n    },\n    Input: {\n        resources: [\"AyUu6\",],\n        \"module\": true\n    },\n    Music: {\n        resources: [\"AyUu6\",\"OJTM4\",\"W3Ky6\",\"AsDOA\",\"63VzN\",\"qu1rX\",\"pR9EP\",\"brbS1\",\"cy4a0\",],\n        \"module\": true\n    },\n    ConfirmationDialog: {\n        resources: [\"AyUu6\",\"AsDOA\",\"oE4Do\",],\n        \"module\": true\n    },\n    Dialog: {\n        resources: [\"AyUu6\",\"W3Ky6\",\"AsDOA\",],\n        \"module\": true\n    },\n    IframeShim: {\n        resources: [\"AyUu6\",\"AsDOA\",\"MqSmz\",],\n        \"module\": true\n    },\n    \"autoset-timezone\": {\n        resources: [\"AyUu6\",]\n    },\n    PhotosButtonTooltips: {\n        resources: [\"AyUu6\",\"AsDOA\",\"W3Ky6\",\"Rs18G\",],\n        \"module\": true\n    },\n    SnowliftPicCropper: {\n        resources: [\"AyUu6\",\"W3Ky6\",\"AsDOA\",\"+h1d2\",\"Pc0ie\",\"0duP3\",\"wxq+C\",],\n        \"module\": true\n    },\n    SpotifyJSONPRequest: {\n        resources: [\"AyUu6\",\"xO/k5\",],\n        \"module\": true\n    },\n    Live: {\n        resources: [\"AyUu6\",\"OJTM4\",],\n        \"module\": true\n    },\n    DimensionTracking: {\n        resources: [\"AyUu6\",],\n        \"module\": true\n    },\n    PrivacyLiteNUXController: {\n        resources: [\"AyUu6\",\"AsDOA\",\"hfrQl\",\"0duP3\",\"u//Ut\",\"W3Ky6\",\"OJTM4\",],\n        \"module\": true\n    },\n    Tooltip: {\n        resources: [\"AyUu6\",\"AsDOA\",\"W3Ky6\",],\n        \"module\": true\n    },\n    \"legacy:detect-broken-proxy-cache\": {\n        resources: [\"AyUu6\",]\n    },\n    PhotoInlineEditor: {\n        resources: [\"AyUu6\",\"+h1d2\",\"W3Ky6\",\"AsDOA\",\"h9fqQ\",\"AtxWD\",],\n        \"module\": true\n    },\n    LiveTimer: {\n        resources: [\"AyUu6\",],\n        \"module\": true\n    },\n    \"legacy:min-notifications-jewel\": {\n        resources: [\"AyUu6\",\"AsDOA\",\"tIw4R\",\"hofTc\",]\n    },\n    AsyncRequest: {\n        resources: [\"AyUu6\",],\n        \"module\": true\n    },\n    React: {\n        resources: [\"OJTM4\",\"AyUu6\",],\n        \"module\": true\n    },\n    PhotoTags: {\n        resources: [\"AyUu6\",\"+h1d2\",\"W3Ky6\",\"h9fqQ\",],\n        \"module\": true\n    },\n    \"fb-photos-snowlift-fullscreen-css\": {\n        resources: [\"VDymv\",]\n    },\n    PrivacyLiteFlyout: {\n        resources: [\"AyUu6\",\"OJTM4\",\"W3Ky6\",\"AsDOA\",\"0duP3\",\"hfrQl\",],\n        \"module\": true\n    },\n    Form: {\n        resources: [\"AyUu6\",\"AsDOA\",],\n        \"module\": true\n    }\n});");
// 1053
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"require(\"InitialJSLoader\").loadOnDOMContentReady([\"AyUu6\",\"OJTM4\",\"AsDOA\",\"63VzN\",\"4vv8/\",\"u//Ut\",\"1XxM1\",\"5dFET\",\"hfrQl\",\"C6rJk\",]);");
// 1054
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"s155ee47747f88107b39149bfb79eabbf2eb896fa");
// 1055
geval("require(\"InitialJSLoader\").loadOnDOMContentReady([\"AyUu6\",\"OJTM4\",\"AsDOA\",\"63VzN\",\"4vv8/\",\"u//Ut\",\"1XxM1\",\"5dFET\",\"hfrQl\",\"C6rJk\",]);");
// 1057
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"Bootloader.configurePage([\"W3Ky6\",\"0duP3\",\"vFtag\",\"ynBUm\",\"xqZGj\",\"yagwf\",]);\nBootloader.done([\"jDr+c\",]);\nJSCC.init(({\n    j1O7KQQXRw2M7DXJek0: function() {\n        return new RequestsJewel();\n    }\n}));\nrequire(\"InitialJSLoader\").handleServerJS({\n    require: [[\"Intl\",\"setPhonologicalRules\",[],[{\n        meta: {\n            \"/_B/\": \"([.,!?\\\\s]|^)\",\n            \"/_E/\": \"([.,!?\\\\s]|$)\"\n        },\n        patterns: {\n            \"/\\u0001(.*)('|&#039;)s\\u0001(?:'|&#039;)s(.*)/\": \"\\u0001$1$2s\\u0001$3\",\n            \"/_\\u0001([^\\u0001]*)\\u0001/e\": \"mb_strtolower(\\\"\\u0001$1\\u0001\\\")\",\n            \"/\\\\^\\\\x01([^\\\\x01])(?=[^\\\\x01]*\\\\x01)/e\": \"mb_strtoupper(\\\"\\u0001$1\\\")\",\n            \"/_\\u0001([^\\u0001]*)\\u0001/\": \"javascript\"\n        }\n    },],],[\"PostLoadJS\",\"loadAndRequire\",[],[\"DimensionTracking\",],],[\"PostLoadJS\",\"loadAndCall\",[],[\"HighContrastMode\",\"init\",[{\n        currentState: null,\n        spacerImage: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y4/r/-PAXP-deijE.gif\"\n    },],],],[\"ScriptPath\",\"set\",[],[\"/home.php\",\"6bc96d96\",],],[\"ClickRefLogger\",],[\"userAction\",\"setUATypeConfig\",[],[{\n        \"ua:n\": false,\n        \"ua:i\": false,\n        \"ua:d\": false,\n        \"ua:e\": false\n    },],],[\"ScriptPathState\",\"setUserURISampleRate\",[],[1050,],],[\"userAction\",\"setCustomSampleConfig\",[],[{\n        \"ua:n\": {\n            test: {\n                ua_id: {\n                    test: true\n                }\n            }\n        },\n        \"ua:i\": {\n            snowlift: {\n                action: {\n                    open: true,\n                    close: true\n                }\n            },\n            canvas: {\n                action: {\n                    mouseover: true,\n                    mouseout: true\n                }\n            }\n        }\n    },],],[\"UserActionHistory\",],[\"ScriptPath\",\"startLogging\",[],[],],[\"TimeSpentBitArrayLogger\",\"init\",[],[],],[\"PixelRatio\",\"startDetecting\",[],[1,],],[\"LiveTimer\",\"restart\",[],[1373490143,],],[\"MessagingReliabilityLogger\",],[\"UnityLogging\",\"logUnityVersion\",[],[],],[\"DocumentTitle\",\"set\",[],[\"Facebook\",],],[\"SidebarPrelude\",\"addSidebarMode\",[],[1225,],],[\"m_0_0\",],[\"Quickling\",],[\"TinyViewport\",],[\"WebStorageMonster\",\"schedule\",[],[false,],],[\"AsyncRequestNectarLogging\",],[\"ViewasChromeBar\",\"initChromeBar\",[\"m_0_1\",],[{\n        __m: \"m_0_1\"\n    },],],[\"PagesVoiceBar\",\"initVoiceBar\",[],[],],[\"TypeaheadSearchBrowseUpsell\",\"registerForm\",[\"m_0_2\",],[{\n        __m: \"m_0_2\"\n    },],],[\"TypeaheadSearchSponsored\",\"setAuctionOptions\",[],[{\n        maxNumberAds: 3,\n        maxNumberRemovedResults: 2,\n        maxNumberResultsAndAds: 8,\n        v1: 1000000,\n        v2: 0,\n        v0: 100000,\n        v3: 1000000,\n        v4: 1000000,\n        bootstrap: false,\n        rerankingStrategy: 5\n    },],],[\"AccessibleMenu\",\"init\",[\"m_0_4\",],[{\n        __m: \"m_0_4\"\n    },],],[\"MercuryJewel\",],[\"TitanLeftNav\",\"initialize\",[],[],],[\"m_0_7\",],[\"Typeahead\",\"init\",[\"m_0_8\",\"m_0_7\",\"TypeaheadExcludeBootstrapFromQueryCache\",\"TypeaheadSearchBrowseUpsell\",\"TypeaheadDetectQueryLocale\",],[{\n        __m: \"m_0_8\"\n    },{\n        __m: \"m_0_7\"\n    },[{\n        __m: \"TypeaheadExcludeBootstrapFromQueryCache\"\n    },{\n        __m: \"TypeaheadSearchBrowseUpsell\"\n    },{\n        __m: \"TypeaheadDetectQueryLocale\"\n    },\"searchSponsored\",\"searchRecorderBasic\",\"regulateMemorializedUsers\",\"showLoadingIndicator\",\"initFilters\",],null,],],[\"PlaceholderListener\",],[\"PlaceholderOnsubmitFormListener\",],[\"FlipDirectionOnKeypress\",],[\"enforceMaxLength\",],[\"m_0_5\",],[\"ChatOpenTab\",\"listenOpenEmptyTab\",[\"m_0_d\",],[{\n        __m: \"m_0_d\"\n    },],],[\"Scrollable\",],[\"m_0_f\",],[\"m_0_c\",],[\"WebStorageMonster\",\"registerLogoutForm\",[\"m_0_h\",],[{\n        __m: \"m_0_h\"\n    },[\"^Banzai$\",\"^\\\\:userchooser\\\\:osessusers$\",\"^[0-9]+:powereditor:\",\"^[0-9]+:page_insights:\",\"^_SocialFoxExternal_machineid$\",\"^_SocialFoxExternal_LoggedInBefore$\",\"^_socialfox_worker_enabled$\",],],],[\"m_0_k\",],[\"m_0_m\",],[\"m_0_n\",],[\"PrivacyLiteNUXController\",\"init\",[\"m_0_n\",],[{\n        dialog: {\n            __m: \"m_0_n\"\n        },\n        sectionID: \"who_can_see\",\n        subsectionID: \"plite_activity_log\",\n        showOnExpand: true\n    },],],[\"m_0_p\",],[\"PrivacyLiteFlyout\",\"registerFinalReminderFlyout\",[\"m_0_p\",],[{\n        __m: \"m_0_p\"\n    },],],[\"PrivacyLiteFlyout\",\"registerFlyoutToggler\",[\"m_0_r\",\"m_0_s\",],[{\n        __m: \"m_0_r\"\n    },{\n        __m: \"m_0_s\"\n    },],],[\"Primer\",],[\"m_0_y\",],],\n    instances: [[\"m_0_0\",[\"AsyncLayout\",],[\"contentArea\",],1,],[\"m_0_7\",[\"Typeahead\",\"m_0_a\",\"SearchTypeaheadView\",\"SearchTypeaheadRenderer\",\"m_0_8\",\"SearchTypeaheadCore\",\"m_0_9\",],[{\n        __m: \"m_0_a\"\n    },{\n        node_id: \"u_0_0\",\n        node: null,\n        ctor: {\n            __m: \"SearchTypeaheadView\"\n        },\n        options: {\n            autoSelect: true,\n            renderer: {\n                __m: \"SearchTypeaheadRenderer\"\n            },\n            causalElement: {\n                __m: \"m_0_8\"\n            },\n            maxResults: 8,\n            minWidth: 0,\n            alignment: \"left\",\n            showBadges: 1,\n            typeObjects: {\n                app: {\n                    uid: \"app\",\n                    text: \"app\",\n                    type: \"header\",\n                    markup: \"Apps\"\n                },\n                event: {\n                    uid: \"event\",\n                    text: \"event\",\n                    type: \"header\",\n                    markup: \"Events\"\n                },\n                group: {\n                    uid: \"group\",\n                    text: \"group\",\n                    type: \"header\",\n                    markup: \"Groups\"\n                },\n                page: {\n                    uid: \"page\",\n                    text: \"page\",\n                    type: \"header\",\n                    markup: \"Pages\"\n                },\n                place: {\n                    uid: \"place\",\n                    text: \"place\",\n                    type: \"header\",\n                    markup: \"Places\"\n                },\n                shortcut: {\n                    uid: \"shortcut\",\n                    text: \"shortcut\",\n                    type: \"header\",\n                    markup: \"Facebook\"\n                },\n                user: {\n                    uid: \"user\",\n                    text: \"user\",\n                    type: \"header\",\n                    markup: \"People\"\n                },\n                song: {\n                    uid: \"song\",\n                    text: \"song\",\n                    type: \"header\",\n                    markup: \"Music\"\n                },\n                friendlist: {\n                    uid: \"friendlist\",\n                    text: \"friendlist\",\n                    type: \"header\",\n                    markup: \"Lists\"\n                },\n                hashtag_exact: {\n                    uid: \"hashtag_exact\",\n                    text: \"hashtag_exact\",\n                    type: \"header\",\n                    markup: \"Hashtag\"\n                },\n                websuggestion: {\n                    uid: \"websuggestion\",\n                    text: \"websuggestion\",\n                    type: \"header\",\n                    markup: \"Search the Web\"\n                },\n                ownsection: {\n                    uid: \"ownsection\",\n                    text: \"ownsection\",\n                    type: \"header\",\n                    markup: \"Sponsored\"\n                },\n                tophit: {\n                    uid: \"tophit\",\n                    text: \"tophit\",\n                    type: \"header\",\n                    markup: \"Top Hit\"\n                }\n            },\n            seeMoreEndpoint: \"http://jsbngssl.www.facebook.com/search/results.php?init=quick\",\n            showKeywordResultsPage: false,\n            showFilterResults: false\n        }\n    },{\n        ctor: {\n            __m: \"SearchTypeaheadCore\"\n        },\n        options: {\n            keepFocused: false,\n            resetOnSelect: true\n        }\n    },{\n        __m: \"m_0_9\"\n    },],4,],[\"m_0_5\",[\"JewelX\",\"m_0_b\",],[{\n        __m: \"m_0_b\"\n    },{\n        name: \"mercurymessages\"\n    },],2,],[\"m_0_f\",[\"ScrollableArea\",\"m_0_e\",],[{\n        __m: \"m_0_e\"\n    },{\n        persistent: true\n    },],1,],[\"m_0_c\",[\"JewelX\",\"m_0_g\",],[{\n        __m: \"m_0_g\"\n    },{\n        name: \"requests\"\n    },],2,],[\"m_0_k\",[\"JewelX\",\"m_0_j\",],[{\n        __m: \"m_0_j\"\n    },{\n        name: \"notifications\"\n    },],1,],[\"m_0_m\",[\"ScrollableArea\",\"m_0_l\",],[{\n        __m: \"m_0_l\"\n    },{\n        persistent: true\n    },],1,],[\"m_0_n\",[\"ContextualDialog\",\"ContextualDialogArrow\",\"ContextualDialogDefaultTheme\",\"LayerRemoveOnHide\",\"LayerHideOnTransition\",\"LayerFadeOnShow\",\"m_0_o\",],[{\n        width: 300,\n        context: null,\n        contextID: null,\n        contextSelector: null,\n        position: \"left\",\n        alignment: \"left\",\n        offsetX: 0,\n        offsetY: 0,\n        arrowBehavior: {\n            __m: \"ContextualDialogArrow\"\n        },\n        theme: {\n            __m: \"ContextualDialogDefaultTheme\"\n        },\n        addedBehaviors: [{\n            __m: \"LayerRemoveOnHide\"\n        },{\n            __m: \"LayerHideOnTransition\"\n        },{\n            __m: \"LayerFadeOnShow\"\n        },]\n    },{\n        __m: \"m_0_o\"\n    },],3,],[\"m_0_p\",[\"ContextualDialog\",\"ContextualDialogArrow\",\"ContextualDialogDefaultTheme\",\"LayerRemoveOnHide\",\"LayerDestroyOnHide\",\"LayerHideOnTransition\",\"LayerFadeOnShow\",\"ContextualLayerAutoFlip\",\"DialogHideOnSuccess\",\"m_0_q\",],[{\n        width: 300,\n        context: null,\n        contextID: \"u_0_6\",\n        contextSelector: null,\n        position: \"below\",\n        alignment: \"right\",\n        offsetX: 0,\n        offsetY: 0,\n        arrowBehavior: {\n            __m: \"ContextualDialogArrow\"\n        },\n        theme: {\n            __m: \"ContextualDialogDefaultTheme\"\n        },\n        addedBehaviors: [{\n            __m: \"LayerRemoveOnHide\"\n        },{\n            __m: \"LayerDestroyOnHide\"\n        },{\n            __m: \"LayerHideOnTransition\"\n        },{\n            __m: \"LayerFadeOnShow\"\n        },{\n            __m: \"ContextualLayerAutoFlip\"\n        },{\n            __m: \"DialogHideOnSuccess\"\n        },],\n        classNames: [\"_57bl\",]\n    },{\n        __m: \"m_0_q\"\n    },],3,],[\"m_0_y\",[\"PrivacyLiteFlyoutHelp\",\"m_0_t\",\"m_0_u\",\"m_0_v\",\"m_0_w\",\"m_0_x\",],[{\n        __m: \"m_0_t\"\n    },{\n        __m: \"m_0_u\"\n    },{\n        __m: \"m_0_v\"\n    },{\n        __m: \"m_0_w\"\n    },{\n        __m: \"m_0_x\"\n    },],1,],[\"m_0_a\",[\"SearchDataSource\",],[{\n        minWebSugg: 3,\n        minQueryLength: 2,\n        maxWebSuggToCountFetchMore: 2,\n        maxResults: 8,\n        indexedFields: [\"text\",\"tokens\",\"alias\",\"non_title_tokens\",],\n        titleFields: [\"text\",\"alias\",\"tokens\",],\n        queryData: {\n            viewer: 100006118350059,\n            rsp: \"search\",\n            context: \"search\"\n        },\n        queryEndpoint: \"/ajax/typeahead/search.php\",\n        bootstrapData: {\n            viewer: 100006118350059,\n            token: \"v7\"\n        },\n        bootstrapEndpoint: \"/ajax/typeahead/search/bootstrap.php\",\n        token: \"1372173655-7\",\n        genTime: 1373490143,\n        enabledQueryCache: true,\n        queryExactMatch: false,\n        enabledHashtag: true\n    },],2,],[\"m_0_z\",[\"XHPTemplate\",\"m_0_15\",],[{\n        __m: \"m_0_15\"\n    },],2,],[\"m_0_10\",[\"XHPTemplate\",\"m_0_16\",],[{\n        __m: \"m_0_16\"\n    },],2,],[\"m_0_11\",[\"XHPTemplate\",\"m_0_17\",],[{\n        __m: \"m_0_17\"\n    },],2,],[\"m_0_12\",[\"XHPTemplate\",\"m_0_18\",],[{\n        __m: \"m_0_18\"\n    },],2,],[\"m_0_13\",[\"XHPTemplate\",\"m_0_19\",],[{\n        __m: \"m_0_19\"\n    },],2,],[\"m_0_14\",[\"XHPTemplate\",\"m_0_1a\",],[{\n        __m: \"m_0_1a\"\n    },],2,],],\n    define: [[\"TimeSpentConfig\",[],{\n        delay: 200000,\n        initial_timeout: 8,\n        initial_delay: 1000\n    },142,],[\"MessagingReliabilityLoggerInitialData\",[],{\n        enabled: false,\n        app: \"mercury\"\n    },44,],[\"QuicklingConfig\",[],{\n        version: \"871405;0;0;0\",\n        inactivePageRegex: \"^/(fr/u\\\\.php|ads/|advertising|ac\\\\.php|ae\\\\.php|ajax/emu/(end|f|h)\\\\.php|badges/|comments\\\\.php|connect/uiserver\\\\.php|editalbum\\\\.php.+add=1|ext/|feeds/|help([/?]|$)|identity_switch\\\\.php|intern/|login\\\\.php|logout\\\\.php|sitetour/homepage_tour\\\\.php|sorry\\\\.php|syndication\\\\.php|webmessenger|/plugins/subscribe|\\\\.pdf$|brandpermissions|gameday|pxlcld)\",\n        sessionLength: 30\n    },60,],[\"MercuryThreadlistIconTemplates\",[\"m_0_z\",\"m_0_10\",],{\n        \":fb:mercury:attachment-indicator\": {\n            __m: \"m_0_z\"\n        },\n        \":fb:mercury:attachment-icon-text\": {\n            __m: \"m_0_10\"\n        }\n    },42,],[\"MercuryThreadlistConstants\",[],{\n        SEARCH_TAB: \"searchtab\",\n        JEWEL_MORE_COUNT: 10,\n        WEBMESSENGER_SEARCH_SNIPPET_COUNT: 5,\n        WEBMESSENGER_SEARCH_SNIPPET_MORE: 5,\n        RECENT_MESSAGES_LIMIT: 10,\n        WEBMESSENGER_SEARCH_SNIPPET_LIMIT: 5,\n        WEBMESSENGER_MORE_MESSAGES_COUNT: 20,\n        WEBMESSENGER_MORE_COUNT: 20,\n        JEWEL_THREAD_COUNT: 5,\n        RECENT_THREAD_OFFSET: 0,\n        MAX_CHARS_BEFORE_BREAK: 280,\n        MESSAGE_TIMESTAMP_THRESHOLD: 1209600000,\n        GROUPING_THRESHOLD: 300000,\n        MAX_UNSEEN_COUNT: 99,\n        MAX_UNREAD_COUNT: 99,\n        WEBMESSENGER_THREAD_COUNT: 20\n    },96,],[\"MessagingConfig\",[],{\n        SEND_BATCH_LIMIT: 5,\n        IDLE_CUTOFF: 30000,\n        SEND_CONNECTION_RETRIES: 2\n    },97,],[\"MercuryParticipantsConstants\",[],{\n        EMAIL_IMAGE: \"/images/messaging/threadlist/envelope.png\",\n        BIG_IMAGE_SIZE: 50,\n        IMAGE_SIZE: 32,\n        UNKNOWN_GENDER: 0\n    },109,],[\"MercuryConfig\",[],{\n        \"24h_times\": false,\n        activity_limit: 60000,\n        idle_poll_interval: 300000,\n        WebMessengerThreadSearchGK: 1,\n        ChatSaveDraftsGK: 0,\n        VideoCallingNoJavaGK: 0,\n        MessagesJewelToggleReadGK: 1,\n        SocialContextGK: 0,\n        ChatMultiTypGK: 0,\n        ChatMultiTypSendGK: 1,\n        NewVCGK: 0,\n        local_storage_crypto: null,\n        MessagesDisableForwardingGK: 1,\n        MessagesJewelOpenInChat: 0,\n        filtering_active: true,\n        idle_limit: 1800000,\n        MessagingDisplayEmojiGK: 1,\n        \"roger.seen_delay\": 15000\n    },35,],[\"DateFormatConfig\",[],{\n        weekStart: 6,\n        ordinalSuffixes: {\n            1: \"st\",\n            2: \"nd\",\n            3: \"rd\",\n            4: \"th\",\n            5: \"th\",\n            6: \"th\",\n            7: \"th\",\n            8: \"th\",\n            9: \"th\",\n            10: \"th\",\n            11: \"th\",\n            12: \"th\",\n            13: \"th\",\n            14: \"th\",\n            15: \"th\",\n            16: \"th\",\n            17: \"th\",\n            18: \"th\",\n            19: \"th\",\n            20: \"th\",\n            21: \"st\",\n            22: \"nd\",\n            23: \"rd\",\n            24: \"th\",\n            25: \"th\",\n            26: \"th\",\n            27: \"th\",\n            28: \"th\",\n            29: \"th\",\n            30: \"th\",\n            31: \"st\"\n        },\n        numericDateSeparator: \"/\",\n        numericDateOrder: [\"m\",\"d\",\"y\",],\n        shortDayNames: [\"Mon\",\"Tue\",\"Wed\",\"Thu\",\"Fri\",\"Sat\",\"Sun\",],\n        formats: []\n    },165,],[\"MercuryJewelTemplates\",[\"m_0_11\",],{\n        \":fb:mercury:jewel:threadlist-row\": {\n            __m: \"m_0_11\"\n        }\n    },39,],[\"MercuryStatusTemplates\",[\"m_0_12\",\"m_0_13\",\"m_0_14\",],{\n        \":fb:mercury:resend-indicator\": {\n            __m: \"m_0_12\"\n        },\n        \":fb:mercury:filtered-message\": {\n            __m: \"m_0_13\"\n        },\n        \":fb:mercury:error-indicator\": {\n            __m: \"m_0_14\"\n        }\n    },41,],[\"MercuryServerRequestsConfig\",[],{\n        sendMessageTimeout: 45000\n    },107,],[\"PresencePrivacyInitialData\",[],{\n        visibility: 1,\n        privacyData: {\n        },\n        onlinePolicy: 1\n    },58,],[\"HashtagSearchResultConfig\",[],{\n        boost_result: 1,\n        hashtag_cost: 10959,\n        image_url: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yF/r/irmqzCEvUpb.png\"\n    },146,],],\n    elements: [[\"m_0_3\",\"u_0_1\",2,\"m_0_2\",],[\"m_0_9\",\"u_0_2\",2,],[\"m_0_8\",\"u_0_3\",4,],[\"m_0_b\",\"fbMessagesJewel\",2,],[\"m_0_d\",\"u_0_4\",2,],[\"m_0_e\",\"MercuryJewelThreadList\",2,],[\"m_0_g\",\"fbRequestsJewel\",2,],[\"m_0_h\",\"logout_form\",2,],[\"m_0_j\",\"fbNotificationsJewel\",2,],[\"m_0_l\",\"u_0_5\",2,],[\"m_0_s\",\"u_0_8\",2,],[\"m_0_x\",\"u_0_9\",2,],[\"m_0_u\",\"u_0_a\",2,],[\"m_0_w\",\"u_0_b\",2,],[\"m_0_6\",\"navSearch\",2,],[\"m_0_r\",\"u_0_7\",2,],[\"m_0_v\",\"u_0_c\",2,],[\"m_0_t\",\"u_0_d\",2,],[\"m_0_4\",\"u_0_e\",2,],[\"m_0_i\",\"logout_form\",2,],[\"m_0_1\",\"u_0_f\",2,],],\n    markup: [[\"m_0_2\",{\n        __html: \"\\u003Cform rel=\\\"async\\\" action=\\\"/ajax/marketing/optin\\\" method=\\\"post\\\" onsubmit=\\\"return window.Event &amp;&amp; Event.__inlineSubmit &amp;&amp; Event.__inlineSubmit(this,event)\\\" id=\\\"u_0_1\\\"\\u003E\\u003Cinput type=\\\"hidden\\\" name=\\\"fb_dtsg\\\" value=\\\"AQCttlPQ\\\" autocomplete=\\\"off\\\" /\\u003E\\u003Cinput type=\\\"hidden\\\" autocomplete=\\\"off\\\" name=\\\"project\\\" value=\\\"320951738012113\\\" /\\u003E\\u003Cinput type=\\\"hidden\\\" autocomplete=\\\"off\\\" name=\\\"product\\\" value=\\\"Graph Search\\\" /\\u003E\\u003Cinput type=\\\"hidden\\\" autocomplete=\\\"off\\\" name=\\\"source\\\" value=\\\"search_taui\\\" /\\u003E\\u003Cdiv class=\\\"clearfix\\\"\\u003E\\u003Cdiv class=\\\"mtm mlm rfloat\\\"\\u003E\\u003Cbutton value=\\\"1\\\" class=\\\"_42ft _42fu browseSignup selected _42gz\\\" type=\\\"submit\\\"\\u003EGet Graph Search\\u003C/button\\u003E\\u003Cbutton value=\\\"1\\\" class=\\\"_42ft _42fr _42fu browseJoined selected _42gz\\\" disabled=\\\"1\\\" type=\\\"submit\\\"\\u003EYou&#039;re on the List!\\u003C/button\\u003E\\u003C/div\\u003E\\u003Cdiv\\u003E\\u003Cdiv class=\\\"fwb\\\"\\u003ENew! Try Graph Search\\u003C/div\\u003EFind more of what you&#039;re looking for through friends and connections. \\u003Ca href=\\\"/about/graphsearch?source=search_tau\\\"\\u003ELearn More\\u003C/a\\u003E.\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/form\\u003E\"\n    },3,],[\"m_0_o\",{\n        __html: \"\\u003Cdiv\\u003E\\u003Cdiv class=\\\"_53iv\\\"\\u003E\\u003Cdiv\\u003E\\u003Ca class=\\\"_1luv _1lvq\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003Cimg class=\\\"img\\\" alt=\\\"Close\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y0/r/K4K8h0mqOQN.png\\\" width=\\\"11\\\" height=\\\"13\\\" /\\u003E\\u003C/a\\u003E\\u003Cspan class=\\\"fsl\\\"\\u003E\\u003Cspan class=\\\"_3oyf\\\"\\u003ETry your new Privacy Shortcuts.\\u003C/span\\u003E Visit your Activity Log to review photos you&#039;re tagged in and things you&#039;ve hidden from your timeline.\\u003C/span\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n    },2,],[\"m_0_q\",{\n        __html: \"\\u003Cdiv\\u003E\\u003Cdiv class=\\\"_53iv\\\"\\u003E\\u003Cdiv\\u003E\\u003Cstrong\\u003ETip\\u003C/strong\\u003E: Graph Search is rolling out now, so it&#039;s getting easier for people to find photos and other things you&#039;ve shared with them. To check who can see your stuff, just click \\u003Cimg class=\\\"img\\\" alt=\\\"Privacy Shortcuts\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yO/r/eYJycDMyJiy.png\\\" width=\\\"12\\\" height=\\\"9\\\" /\\u003E.\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"uiOverlayFooter _572u uiBoxGray topborder\\\"\\u003E\\u003Cbutton value=\\\"1\\\" class=\\\"_42ft _42fu layerConfirm _57bk uiOverlayButton selected _42g-\\\" type=\\\"submit\\\"\\u003EOkay\\u003C/button\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n    },2,],[\"m_0_15\",{\n        __html: \"\\u003Ci class=\\\"mrs MercuryThreadlistIcon img sp_2gr8ms sx_22d5af\\\"\\u003E\\u003C/i\\u003E\"\n    },2,],[\"m_0_16\",{\n        __html: \"\\u003Cspan class=\\\"uiIconText _3tn\\\"\\u003E\\u003Ci class=\\\"img sp_2gr8ms sx_d68978\\\"\\u003E\\u003C/i\\u003E\\u003C/span\\u003E\"\n    },2,],[\"m_0_17\",{\n        __html: \"\\u003Cli\\u003E\\u003Ca class=\\\"messagesContent\\\" data-jsid=\\\"link\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003Cdiv class=\\\"clearfix\\\"\\u003E\\u003Cdiv class=\\\"MercuryThreadImage _8o _8s lfloat\\\" data-jsid=\\\"image\\\"\\u003E\\u003Cimg class=\\\"_s0 _rw img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yw/r/drP8vlvSl_8.gif\\\" /\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"clearfix _42ef\\\"\\u003E\\u003Cdiv class=\\\"snippetThumbnail rfloat\\\"\\u003E\\u003Cspan class=\\\"_56hv hidden_elem\\\" data-jsid=\\\"snippet-thumbnail-single\\\"\\u003E\\u003Ci style=\\\"background-image: url(/images/blank.gif);\\\"\\u003E\\u003C/i\\u003E\\u003C/span\\u003E\\u003Cspan class=\\\"hidden_elem\\\" data-jsid=\\\"snippet-thumbnail-multiple\\\"\\u003E\\u003Cspan class=\\\"_56hy\\\"\\u003E\\u003C/span\\u003E\\u003Cspan class=\\\"_56hv\\\"\\u003E\\u003Ci style=\\\"background-image: url(/images/blank.gif);\\\"\\u003E\\u003C/i\\u003E\\u003C/span\\u003E\\u003C/span\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"content fsm fwn fcg\\\"\\u003E\\u003Cdiv class=\\\"author\\\"\\u003E\\u003Cstrong data-jsid=\\\"name\\\"\\u003E\\u003C/strong\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"snippet preview fsm fwn fcg\\\"\\u003E\\u003Cspan data-jsid=\\\"snippet\\\"\\u003E\\u003C/span\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"time\\\"\\u003E\\u003Cabbr title=\\\"Wednesday, December 31, 1969 at 7:00pm\\\" data-utime=\\\"0\\\" class=\\\"hidden_elem timestamp\\\" data-jsid=\\\"timestamp\\\"\\u003Eover a year ago\\u003C/abbr\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/a\\u003E\\u003C/li\\u003E\"\n    },2,],[\"m_0_18\",{\n        __html: \"\\u003Cdiv class=\\\"_542d\\\"\\u003E\\u003Cimg class=\\\"img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yv/r/O7ihJIPh_G0.gif\\\" alt=\\\"\\\" width=\\\"15\\\" height=\\\"15\\\" /\\u003E\\u003Cspan class=\\\"_55r6\\\"\\u003ESending...\\u003C/span\\u003E\\u003C/div\\u003E\"\n    },2,],[\"m_0_19\",{\n        __html: \"\\u003Cdiv class=\\\"mas pam uiBoxYellow\\\"\\u003E\\u003Cstrong\\u003EThis message is no longer available\\u003C/strong\\u003E because it was identified as abusive or marked as spam.\\u003C/div\\u003E\"\n    },2,],[\"m_0_1a\",{\n        __html: \"\\u003Cdiv class=\\\"_542d\\\"\\u003E\\u003Cimg class=\\\"img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/ye/r/NNg0bu4GBuz.png\\\" alt=\\\"\\\" width=\\\"13\\\" height=\\\"11\\\" /\\u003E\\u003Cspan class=\\\"_55r7\\\"\\u003EFailed to send\\u003C/span\\u003E\\u003C/div\\u003E\"\n    },2,],]\n});\nonloadRegister_DEPRECATED(function() {\n    new AsyncRequest().setURI(\"/ajax/marketing/tour/privacy_dialog.php\").send();\n});\nonloadRegister_DEPRECATED(function() {\n    requireLazy([\"MercuryJewel\",], function(MercuryJewel) {\n        new MercuryJewel($(\"fbMessagesFlyout\"), $(\"fbMessagesJewel\"), require(\"m_0_5\"), {\n            message_counts: [{\n                unread_count: 0,\n                unseen_count: 0,\n                seen_timestamp: 0,\n                last_action_id: 0,\n                folder: \"inbox\"\n            },{\n                unread_count: 0,\n                unseen_count: 0,\n                seen_timestamp: 0,\n                last_action_id: null,\n                folder: \"other\"\n            },],\n            payload_source: \"server_initial_data\"\n        });\n    });\n});\nonloadRegister_DEPRECATED(function() {\n    require(\"m_0_7\").getData().onLoad(false, true);\n});\nonloadRegister_DEPRECATED(function() {\n    window.presenceRequests = JSCC.get(\"j1O7KQQXRw2M7DXJek0\").init(require(\"m_0_c\"), \"[fb]requests\", false);\n});\nonloadRegister_DEPRECATED(function() {\n    window.presenceNotifications = new Notifications({\n        updateTime: 1373490143000,\n        latestNotif: null,\n        latestReadNotif: null,\n        updatePeriod: 480000,\n        cacheVersion: 2,\n        allowDesktopNotifications: false,\n        notifReceivedType: \"notification\",\n        wrapperID: \"fbNotificationsJewel\",\n        contentID: \"fbNotificationsList\",\n        shouldLogImpressions: 0,\n        useInfiniteScroll: 1,\n        persistUnreadColor: true,\n        unseenVsUnread: 0\n    });\n});\nonloadRegister_DEPRECATED(function() {\n    Arbiter.inform(\"jewel/count-initial\", {\n        jewel: \"notifications\",\n        count: 0\n    }, Arbiter.BEHAVIOR_STATE);\n});\nonafterloadRegister_DEPRECATED(function() {\n    Bootloader.loadComponents([\"legacy:detect-broken-proxy-cache\",], function() {\n        detect_broken_proxy_cache(\"100006118350059\", \"c_user\");\n    });\n});\nonafterloadRegister_DEPRECATED(function() {\n    Bootloader.loadComponents([\"autoset-timezone\",], function() {\n        tz_autoset(1373490143, -240, 0);\n    });\n});");
// 1058
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"s1781b0f90407e4130b9cb2d35dc8345bef88e4c3");
// 1059
geval("Bootloader.configurePage([\"W3Ky6\",\"0duP3\",\"vFtag\",\"ynBUm\",\"xqZGj\",\"yagwf\",]);\nBootloader.done([\"jDr+c\",]);\nJSCC.init(({\n    j1O7KQQXRw2M7DXJek0: function() {\n        return new RequestsJewel();\n    }\n}));\nrequire(\"InitialJSLoader\").handleServerJS({\n    require: [[\"JSBNG__Intl\",\"setPhonologicalRules\",[],[{\n        meta: {\n            \"/_B/\": \"([.,!?\\\\s]|^)\",\n            \"/_E/\": \"([.,!?\\\\s]|$)\"\n        },\n        patterns: {\n            \"/\\u0001(.*)('|&#039;)s\\u0001(?:'|&#039;)s(.*)/\": \"\\u0001$1$2s\\u0001$3\",\n            \"/_\\u0001([^\\u0001]*)\\u0001/e\": \"mb_strtolower(\\\"\\u0001$1\\u0001\\\")\",\n            \"/\\\\^\\\\x01([^\\\\x01])(?=[^\\\\x01]*\\\\x01)/e\": \"mb_strtoupper(\\\"\\u0001$1\\\")\",\n            \"/_\\u0001([^\\u0001]*)\\u0001/\": \"javascript\"\n        }\n    },],],[\"PostLoadJS\",\"loadAndRequire\",[],[\"DimensionTracking\",],],[\"PostLoadJS\",\"loadAndCall\",[],[\"HighContrastMode\",\"init\",[{\n        currentState: null,\n        spacerImage: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y4/r/-PAXP-deijE.gif\"\n    },],],],[\"ScriptPath\",\"set\",[],[\"/home.php\",\"6bc96d96\",],],[\"ClickRefLogger\",],[\"userAction\",\"setUATypeConfig\",[],[{\n        \"ua:n\": false,\n        \"ua:i\": false,\n        \"ua:d\": false,\n        \"ua:e\": false\n    },],],[\"ScriptPathState\",\"setUserURISampleRate\",[],[1050,],],[\"userAction\",\"setCustomSampleConfig\",[],[{\n        \"ua:n\": {\n            test: {\n                ua_id: {\n                    test: true\n                }\n            }\n        },\n        \"ua:i\": {\n            snowlift: {\n                action: {\n                    open: true,\n                    close: true\n                }\n            },\n            canvas: {\n                action: {\n                    mouseover: true,\n                    mouseout: true\n                }\n            }\n        }\n    },],],[\"UserActionHistory\",],[\"ScriptPath\",\"startLogging\",[],[],],[\"TimeSpentBitArrayLogger\",\"init\",[],[],],[\"PixelRatio\",\"startDetecting\",[],[1,],],[\"LiveTimer\",\"restart\",[],[1373490143,],],[\"MessagingReliabilityLogger\",],[\"UnityLogging\",\"logUnityVersion\",[],[],],[\"DocumentTitle\",\"set\",[],[\"Facebook\",],],[\"SidebarPrelude\",\"addSidebarMode\",[],[1225,],],[\"m_0_0\",],[\"Quickling\",],[\"TinyViewport\",],[\"WebStorageMonster\",\"schedule\",[],[false,],],[\"AsyncRequestNectarLogging\",],[\"ViewasChromeBar\",\"initChromeBar\",[\"m_0_1\",],[{\n        __m: \"m_0_1\"\n    },],],[\"PagesVoiceBar\",\"initVoiceBar\",[],[],],[\"TypeaheadSearchBrowseUpsell\",\"registerForm\",[\"m_0_2\",],[{\n        __m: \"m_0_2\"\n    },],],[\"TypeaheadSearchSponsored\",\"setAuctionOptions\",[],[{\n        maxNumberAds: 3,\n        maxNumberRemovedResults: 2,\n        maxNumberResultsAndAds: 8,\n        v1: 1000000,\n        v2: 0,\n        v0: 100000,\n        v3: 1000000,\n        v4: 1000000,\n        bootstrap: false,\n        rerankingStrategy: 5\n    },],],[\"AccessibleMenu\",\"init\",[\"m_0_4\",],[{\n        __m: \"m_0_4\"\n    },],],[\"MercuryJewel\",],[\"TitanLeftNav\",\"initialize\",[],[],],[\"m_0_7\",],[\"Typeahead\",\"init\",[\"m_0_8\",\"m_0_7\",\"TypeaheadExcludeBootstrapFromQueryCache\",\"TypeaheadSearchBrowseUpsell\",\"TypeaheadDetectQueryLocale\",],[{\n        __m: \"m_0_8\"\n    },{\n        __m: \"m_0_7\"\n    },[{\n        __m: \"TypeaheadExcludeBootstrapFromQueryCache\"\n    },{\n        __m: \"TypeaheadSearchBrowseUpsell\"\n    },{\n        __m: \"TypeaheadDetectQueryLocale\"\n    },\"searchSponsored\",\"searchRecorderBasic\",\"regulateMemorializedUsers\",\"showLoadingIndicator\",\"initFilters\",],null,],],[\"PlaceholderListener\",],[\"PlaceholderOnsubmitFormListener\",],[\"FlipDirectionOnKeypress\",],[\"enforceMaxLength\",],[\"m_0_5\",],[\"ChatOpenTab\",\"listenOpenEmptyTab\",[\"m_0_d\",],[{\n        __m: \"m_0_d\"\n    },],],[\"Scrollable\",],[\"m_0_f\",],[\"m_0_c\",],[\"WebStorageMonster\",\"registerLogoutForm\",[\"m_0_h\",],[{\n        __m: \"m_0_h\"\n    },[\"^Banzai$\",\"^\\\\:userchooser\\\\:osessusers$\",\"^[0-9]+:powereditor:\",\"^[0-9]+:page_insights:\",\"^_SocialFoxExternal_machineid$\",\"^_SocialFoxExternal_LoggedInBefore$\",\"^_socialfox_worker_enabled$\",],],],[\"m_0_k\",],[\"m_0_m\",],[\"m_0_n\",],[\"PrivacyLiteNUXController\",\"init\",[\"m_0_n\",],[{\n        dialog: {\n            __m: \"m_0_n\"\n        },\n        sectionID: \"who_can_see\",\n        subsectionID: \"plite_activity_log\",\n        showOnExpand: true\n    },],],[\"m_0_p\",],[\"PrivacyLiteFlyout\",\"registerFinalReminderFlyout\",[\"m_0_p\",],[{\n        __m: \"m_0_p\"\n    },],],[\"PrivacyLiteFlyout\",\"registerFlyoutToggler\",[\"m_0_r\",\"m_0_s\",],[{\n        __m: \"m_0_r\"\n    },{\n        __m: \"m_0_s\"\n    },],],[\"Primer\",],[\"m_0_y\",],],\n    instances: [[\"m_0_0\",[\"AsyncLayout\",],[\"contentArea\",],1,],[\"m_0_7\",[\"Typeahead\",\"m_0_a\",\"SearchTypeaheadView\",\"SearchTypeaheadRenderer\",\"m_0_8\",\"SearchTypeaheadCore\",\"m_0_9\",],[{\n        __m: \"m_0_a\"\n    },{\n        node_id: \"u_0_0\",\n        node: null,\n        ctor: {\n            __m: \"SearchTypeaheadView\"\n        },\n        options: {\n            autoSelect: true,\n            renderer: {\n                __m: \"SearchTypeaheadRenderer\"\n            },\n            causalElement: {\n                __m: \"m_0_8\"\n            },\n            maxResults: 8,\n            minWidth: 0,\n            alignment: \"left\",\n            showBadges: 1,\n            typeObjects: {\n                app: {\n                    uid: \"app\",\n                    text: \"app\",\n                    type: \"header\",\n                    markup: \"Apps\"\n                },\n                JSBNG__event: {\n                    uid: \"JSBNG__event\",\n                    text: \"JSBNG__event\",\n                    type: \"header\",\n                    markup: \"Events\"\n                },\n                group: {\n                    uid: \"group\",\n                    text: \"group\",\n                    type: \"header\",\n                    markup: \"Groups\"\n                },\n                page: {\n                    uid: \"page\",\n                    text: \"page\",\n                    type: \"header\",\n                    markup: \"Pages\"\n                },\n                place: {\n                    uid: \"place\",\n                    text: \"place\",\n                    type: \"header\",\n                    markup: \"Places\"\n                },\n                shortcut: {\n                    uid: \"shortcut\",\n                    text: \"shortcut\",\n                    type: \"header\",\n                    markup: \"Facebook\"\n                },\n                user: {\n                    uid: \"user\",\n                    text: \"user\",\n                    type: \"header\",\n                    markup: \"People\"\n                },\n                song: {\n                    uid: \"song\",\n                    text: \"song\",\n                    type: \"header\",\n                    markup: \"Music\"\n                },\n                friendlist: {\n                    uid: \"friendlist\",\n                    text: \"friendlist\",\n                    type: \"header\",\n                    markup: \"Lists\"\n                },\n                hashtag_exact: {\n                    uid: \"hashtag_exact\",\n                    text: \"hashtag_exact\",\n                    type: \"header\",\n                    markup: \"Hashtag\"\n                },\n                websuggestion: {\n                    uid: \"websuggestion\",\n                    text: \"websuggestion\",\n                    type: \"header\",\n                    markup: \"Search the Web\"\n                },\n                ownsection: {\n                    uid: \"ownsection\",\n                    text: \"ownsection\",\n                    type: \"header\",\n                    markup: \"Sponsored\"\n                },\n                tophit: {\n                    uid: \"tophit\",\n                    text: \"tophit\",\n                    type: \"header\",\n                    markup: \"Top Hit\"\n                }\n            },\n            seeMoreEndpoint: \"http://jsbngssl.www.facebook.com/search/results.php?init=quick\",\n            showKeywordResultsPage: false,\n            showFilterResults: false\n        }\n    },{\n        ctor: {\n            __m: \"SearchTypeaheadCore\"\n        },\n        options: {\n            keepFocused: false,\n            resetOnSelect: true\n        }\n    },{\n        __m: \"m_0_9\"\n    },],4,],[\"m_0_5\",[\"JewelX\",\"m_0_b\",],[{\n        __m: \"m_0_b\"\n    },{\n        JSBNG__name: \"mercurymessages\"\n    },],2,],[\"m_0_f\",[\"ScrollableArea\",\"m_0_e\",],[{\n        __m: \"m_0_e\"\n    },{\n        persistent: true\n    },],1,],[\"m_0_c\",[\"JewelX\",\"m_0_g\",],[{\n        __m: \"m_0_g\"\n    },{\n        JSBNG__name: \"requests\"\n    },],2,],[\"m_0_k\",[\"JewelX\",\"m_0_j\",],[{\n        __m: \"m_0_j\"\n    },{\n        JSBNG__name: \"notifications\"\n    },],1,],[\"m_0_m\",[\"ScrollableArea\",\"m_0_l\",],[{\n        __m: \"m_0_l\"\n    },{\n        persistent: true\n    },],1,],[\"m_0_n\",[\"ContextualDialog\",\"ContextualDialogArrow\",\"ContextualDialogDefaultTheme\",\"LayerRemoveOnHide\",\"LayerHideOnTransition\",\"LayerFadeOnShow\",\"m_0_o\",],[{\n        width: 300,\n        context: null,\n        contextID: null,\n        contextSelector: null,\n        position: \"left\",\n        alignment: \"left\",\n        offsetX: 0,\n        offsetY: 0,\n        arrowBehavior: {\n            __m: \"ContextualDialogArrow\"\n        },\n        theme: {\n            __m: \"ContextualDialogDefaultTheme\"\n        },\n        addedBehaviors: [{\n            __m: \"LayerRemoveOnHide\"\n        },{\n            __m: \"LayerHideOnTransition\"\n        },{\n            __m: \"LayerFadeOnShow\"\n        },]\n    },{\n        __m: \"m_0_o\"\n    },],3,],[\"m_0_p\",[\"ContextualDialog\",\"ContextualDialogArrow\",\"ContextualDialogDefaultTheme\",\"LayerRemoveOnHide\",\"LayerDestroyOnHide\",\"LayerHideOnTransition\",\"LayerFadeOnShow\",\"ContextualLayerAutoFlip\",\"DialogHideOnSuccess\",\"m_0_q\",],[{\n        width: 300,\n        context: null,\n        contextID: \"u_0_6\",\n        contextSelector: null,\n        position: \"below\",\n        alignment: \"right\",\n        offsetX: 0,\n        offsetY: 0,\n        arrowBehavior: {\n            __m: \"ContextualDialogArrow\"\n        },\n        theme: {\n            __m: \"ContextualDialogDefaultTheme\"\n        },\n        addedBehaviors: [{\n            __m: \"LayerRemoveOnHide\"\n        },{\n            __m: \"LayerDestroyOnHide\"\n        },{\n            __m: \"LayerHideOnTransition\"\n        },{\n            __m: \"LayerFadeOnShow\"\n        },{\n            __m: \"ContextualLayerAutoFlip\"\n        },{\n            __m: \"DialogHideOnSuccess\"\n        },],\n        classNames: [\"_57bl\",]\n    },{\n        __m: \"m_0_q\"\n    },],3,],[\"m_0_y\",[\"PrivacyLiteFlyoutHelp\",\"m_0_t\",\"m_0_u\",\"m_0_v\",\"m_0_w\",\"m_0_x\",],[{\n        __m: \"m_0_t\"\n    },{\n        __m: \"m_0_u\"\n    },{\n        __m: \"m_0_v\"\n    },{\n        __m: \"m_0_w\"\n    },{\n        __m: \"m_0_x\"\n    },],1,],[\"m_0_a\",[\"SearchDataSource\",],[{\n        minWebSugg: 3,\n        minQueryLength: 2,\n        maxWebSuggToCountFetchMore: 2,\n        maxResults: 8,\n        indexedFields: [\"text\",\"tokens\",\"alias\",\"non_title_tokens\",],\n        titleFields: [\"text\",\"alias\",\"tokens\",],\n        queryData: {\n            viewer: 100006118350059,\n            rsp: \"search\",\n            context: \"search\"\n        },\n        queryEndpoint: \"/ajax/typeahead/search.php\",\n        bootstrapData: {\n            viewer: 100006118350059,\n            token: \"v7\"\n        },\n        bootstrapEndpoint: \"/ajax/typeahead/search/bootstrap.php\",\n        token: \"1372173655-7\",\n        genTime: 1373490143,\n        enabledQueryCache: true,\n        queryExactMatch: false,\n        enabledHashtag: true\n    },],2,],[\"m_0_z\",[\"XHPTemplate\",\"m_0_15\",],[{\n        __m: \"m_0_15\"\n    },],2,],[\"m_0_10\",[\"XHPTemplate\",\"m_0_16\",],[{\n        __m: \"m_0_16\"\n    },],2,],[\"m_0_11\",[\"XHPTemplate\",\"m_0_17\",],[{\n        __m: \"m_0_17\"\n    },],2,],[\"m_0_12\",[\"XHPTemplate\",\"m_0_18\",],[{\n        __m: \"m_0_18\"\n    },],2,],[\"m_0_13\",[\"XHPTemplate\",\"m_0_19\",],[{\n        __m: \"m_0_19\"\n    },],2,],[\"m_0_14\",[\"XHPTemplate\",\"m_0_1a\",],[{\n        __m: \"m_0_1a\"\n    },],2,],],\n    define: [[\"TimeSpentConfig\",[],{\n        delay: 200000,\n        initial_timeout: 8,\n        initial_delay: 1000\n    },142,],[\"MessagingReliabilityLoggerInitialData\",[],{\n        enabled: false,\n        app: \"mercury\"\n    },44,],[\"QuicklingConfig\",[],{\n        version: \"871405;0;0;0\",\n        inactivePageRegex: \"^/(fr/u\\\\.php|ads/|advertising|ac\\\\.php|ae\\\\.php|ajax/emu/(end|f|h)\\\\.php|badges/|comments\\\\.php|connect/uiserver\\\\.php|editalbum\\\\.php.+add=1|ext/|feeds/|help([/?]|$)|identity_switch\\\\.php|intern/|login\\\\.php|logout\\\\.php|sitetour/homepage_tour\\\\.php|sorry\\\\.php|syndication\\\\.php|webmessenger|/plugins/subscribe|\\\\.pdf$|brandpermissions|gameday|pxlcld)\",\n        sessionLength: 30\n    },60,],[\"MercuryThreadlistIconTemplates\",[\"m_0_z\",\"m_0_10\",],{\n        \":fb:mercury:attachment-indicator\": {\n            __m: \"m_0_z\"\n        },\n        \":fb:mercury:attachment-icon-text\": {\n            __m: \"m_0_10\"\n        }\n    },42,],[\"MercuryThreadlistConstants\",[],{\n        SEARCH_TAB: \"searchtab\",\n        JEWEL_MORE_COUNT: 10,\n        WEBMESSENGER_SEARCH_SNIPPET_COUNT: 5,\n        WEBMESSENGER_SEARCH_SNIPPET_MORE: 5,\n        RECENT_MESSAGES_LIMIT: 10,\n        WEBMESSENGER_SEARCH_SNIPPET_LIMIT: 5,\n        WEBMESSENGER_MORE_MESSAGES_COUNT: 20,\n        WEBMESSENGER_MORE_COUNT: 20,\n        JEWEL_THREAD_COUNT: 5,\n        RECENT_THREAD_OFFSET: 0,\n        MAX_CHARS_BEFORE_BREAK: 280,\n        MESSAGE_TIMESTAMP_THRESHOLD: 1209600000,\n        GROUPING_THRESHOLD: 300000,\n        MAX_UNSEEN_COUNT: 99,\n        MAX_UNREAD_COUNT: 99,\n        WEBMESSENGER_THREAD_COUNT: 20\n    },96,],[\"MessagingConfig\",[],{\n        SEND_BATCH_LIMIT: 5,\n        IDLE_CUTOFF: 30000,\n        SEND_CONNECTION_RETRIES: 2\n    },97,],[\"MercuryParticipantsConstants\",[],{\n        EMAIL_IMAGE: \"/images/messaging/threadlist/envelope.png\",\n        BIG_IMAGE_SIZE: 50,\n        IMAGE_SIZE: 32,\n        UNKNOWN_GENDER: 0\n    },109,],[\"MercuryConfig\",[],{\n        \"24h_times\": false,\n        activity_limit: 60000,\n        idle_poll_interval: 300000,\n        WebMessengerThreadSearchGK: 1,\n        ChatSaveDraftsGK: 0,\n        VideoCallingNoJavaGK: 0,\n        MessagesJewelToggleReadGK: 1,\n        SocialContextGK: 0,\n        ChatMultiTypGK: 0,\n        ChatMultiTypSendGK: 1,\n        NewVCGK: 0,\n        local_storage_crypto: null,\n        MessagesDisableForwardingGK: 1,\n        MessagesJewelOpenInChat: 0,\n        filtering_active: true,\n        idle_limit: 1800000,\n        MessagingDisplayEmojiGK: 1,\n        \"roger.seen_delay\": 15000\n    },35,],[\"DateFormatConfig\",[],{\n        weekStart: 6,\n        ordinalSuffixes: {\n            1: \"st\",\n            2: \"nd\",\n            3: \"rd\",\n            4: \"th\",\n            5: \"th\",\n            6: \"th\",\n            7: \"th\",\n            8: \"th\",\n            9: \"th\",\n            10: \"th\",\n            11: \"th\",\n            12: \"th\",\n            13: \"th\",\n            14: \"th\",\n            15: \"th\",\n            16: \"th\",\n            17: \"th\",\n            18: \"th\",\n            19: \"th\",\n            20: \"th\",\n            21: \"st\",\n            22: \"nd\",\n            23: \"rd\",\n            24: \"th\",\n            25: \"th\",\n            26: \"th\",\n            27: \"th\",\n            28: \"th\",\n            29: \"th\",\n            30: \"th\",\n            31: \"st\"\n        },\n        numericDateSeparator: \"/\",\n        numericDateOrder: [\"m\",\"d\",\"y\",],\n        shortDayNames: [\"Mon\",\"Tue\",\"Wed\",\"Thu\",\"Fri\",\"Sat\",\"Sun\",],\n        formats: []\n    },165,],[\"MercuryJewelTemplates\",[\"m_0_11\",],{\n        \":fb:mercury:jewel:threadlist-row\": {\n            __m: \"m_0_11\"\n        }\n    },39,],[\"MercuryStatusTemplates\",[\"m_0_12\",\"m_0_13\",\"m_0_14\",],{\n        \":fb:mercury:resend-indicator\": {\n            __m: \"m_0_12\"\n        },\n        \":fb:mercury:filtered-message\": {\n            __m: \"m_0_13\"\n        },\n        \":fb:mercury:error-indicator\": {\n            __m: \"m_0_14\"\n        }\n    },41,],[\"MercuryServerRequestsConfig\",[],{\n        sendMessageTimeout: 45000\n    },107,],[\"PresencePrivacyInitialData\",[],{\n        visibility: 1,\n        privacyData: {\n        },\n        onlinePolicy: 1\n    },58,],[\"HashtagSearchResultConfig\",[],{\n        boost_result: 1,\n        hashtag_cost: 10959,\n        image_url: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yF/r/irmqzCEvUpb.png\"\n    },146,],],\n    elements: [[\"m_0_3\",\"u_0_1\",2,\"m_0_2\",],[\"m_0_9\",\"u_0_2\",2,],[\"m_0_8\",\"u_0_3\",4,],[\"m_0_b\",\"fbMessagesJewel\",2,],[\"m_0_d\",\"u_0_4\",2,],[\"m_0_e\",\"MercuryJewelThreadList\",2,],[\"m_0_g\",\"fbRequestsJewel\",2,],[\"m_0_h\",\"logout_form\",2,],[\"m_0_j\",\"fbNotificationsJewel\",2,],[\"m_0_l\",\"u_0_5\",2,],[\"m_0_s\",\"u_0_8\",2,],[\"m_0_x\",\"u_0_9\",2,],[\"m_0_u\",\"u_0_a\",2,],[\"m_0_w\",\"u_0_b\",2,],[\"m_0_6\",\"navSearch\",2,],[\"m_0_r\",\"u_0_7\",2,],[\"m_0_v\",\"u_0_c\",2,],[\"m_0_t\",\"u_0_d\",2,],[\"m_0_4\",\"u_0_e\",2,],[\"m_0_i\",\"logout_form\",2,],[\"m_0_1\",\"u_0_f\",2,],],\n    markup: [[\"m_0_2\",{\n        __html: \"\\u003Cform rel=\\\"async\\\" action=\\\"/ajax/marketing/optin\\\" method=\\\"post\\\" onsubmit=\\\"return window.Event &amp;&amp; Event.__inlineSubmit &amp;&amp; Event.__inlineSubmit(this,event)\\\" id=\\\"u_0_1\\\"\\u003E\\u003Cinput type=\\\"hidden\\\" name=\\\"fb_dtsg\\\" value=\\\"AQCttlPQ\\\" autocomplete=\\\"off\\\" /\\u003E\\u003Cinput type=\\\"hidden\\\" autocomplete=\\\"off\\\" name=\\\"project\\\" value=\\\"320951738012113\\\" /\\u003E\\u003Cinput type=\\\"hidden\\\" autocomplete=\\\"off\\\" name=\\\"product\\\" value=\\\"Graph Search\\\" /\\u003E\\u003Cinput type=\\\"hidden\\\" autocomplete=\\\"off\\\" name=\\\"source\\\" value=\\\"search_taui\\\" /\\u003E\\u003Cdiv class=\\\"clearfix\\\"\\u003E\\u003Cdiv class=\\\"mtm mlm rfloat\\\"\\u003E\\u003Cbutton value=\\\"1\\\" class=\\\"_42ft _42fu browseSignup selected _42gz\\\" type=\\\"submit\\\"\\u003EGet Graph Search\\u003C/button\\u003E\\u003Cbutton value=\\\"1\\\" class=\\\"_42ft _42fr _42fu browseJoined selected _42gz\\\" disabled=\\\"1\\\" type=\\\"submit\\\"\\u003EYou&#039;re on the List!\\u003C/button\\u003E\\u003C/div\\u003E\\u003Cdiv\\u003E\\u003Cdiv class=\\\"fwb\\\"\\u003ENew! Try Graph Search\\u003C/div\\u003EFind more of what you&#039;re looking for through friends and connections. \\u003Ca href=\\\"/about/graphsearch?source=search_tau\\\"\\u003ELearn More\\u003C/a\\u003E.\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/form\\u003E\"\n    },3,],[\"m_0_o\",{\n        __html: \"\\u003Cdiv\\u003E\\u003Cdiv class=\\\"_53iv\\\"\\u003E\\u003Cdiv\\u003E\\u003Ca class=\\\"_1luv _1lvq\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003Cimg class=\\\"img\\\" alt=\\\"Close\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y0/r/K4K8h0mqOQN.png\\\" width=\\\"11\\\" height=\\\"13\\\" /\\u003E\\u003C/a\\u003E\\u003Cspan class=\\\"fsl\\\"\\u003E\\u003Cspan class=\\\"_3oyf\\\"\\u003ETry your new Privacy Shortcuts.\\u003C/span\\u003E Visit your Activity Log to review photos you&#039;re tagged in and things you&#039;ve hidden from your timeline.\\u003C/span\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n    },2,],[\"m_0_q\",{\n        __html: \"\\u003Cdiv\\u003E\\u003Cdiv class=\\\"_53iv\\\"\\u003E\\u003Cdiv\\u003E\\u003Cstrong\\u003ETip\\u003C/strong\\u003E: Graph Search is rolling out now, so it&#039;s getting easier for people to find photos and other things you&#039;ve shared with them. To check who can see your stuff, just click \\u003Cimg class=\\\"img\\\" alt=\\\"Privacy Shortcuts\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yO/r/eYJycDMyJiy.png\\\" width=\\\"12\\\" height=\\\"9\\\" /\\u003E.\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"uiOverlayFooter _572u uiBoxGray topborder\\\"\\u003E\\u003Cbutton value=\\\"1\\\" class=\\\"_42ft _42fu layerConfirm _57bk uiOverlayButton selected _42g-\\\" type=\\\"submit\\\"\\u003EOkay\\u003C/button\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n    },2,],[\"m_0_15\",{\n        __html: \"\\u003Ci class=\\\"mrs MercuryThreadlistIcon img sp_2gr8ms sx_22d5af\\\"\\u003E\\u003C/i\\u003E\"\n    },2,],[\"m_0_16\",{\n        __html: \"\\u003Cspan class=\\\"uiIconText _3tn\\\"\\u003E\\u003Ci class=\\\"img sp_2gr8ms sx_d68978\\\"\\u003E\\u003C/i\\u003E\\u003C/span\\u003E\"\n    },2,],[\"m_0_17\",{\n        __html: \"\\u003Cli\\u003E\\u003Ca class=\\\"messagesContent\\\" data-jsid=\\\"link\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003Cdiv class=\\\"clearfix\\\"\\u003E\\u003Cdiv class=\\\"MercuryThreadImage _8o _8s lfloat\\\" data-jsid=\\\"image\\\"\\u003E\\u003Cimg class=\\\"_s0 _rw img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yw/r/drP8vlvSl_8.gif\\\" /\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"clearfix _42ef\\\"\\u003E\\u003Cdiv class=\\\"snippetThumbnail rfloat\\\"\\u003E\\u003Cspan class=\\\"_56hv hidden_elem\\\" data-jsid=\\\"snippet-thumbnail-single\\\"\\u003E\\u003Ci style=\\\"background-image: url(/images/blank.gif);\\\"\\u003E\\u003C/i\\u003E\\u003C/span\\u003E\\u003Cspan class=\\\"hidden_elem\\\" data-jsid=\\\"snippet-thumbnail-multiple\\\"\\u003E\\u003Cspan class=\\\"_56hy\\\"\\u003E\\u003C/span\\u003E\\u003Cspan class=\\\"_56hv\\\"\\u003E\\u003Ci style=\\\"background-image: url(/images/blank.gif);\\\"\\u003E\\u003C/i\\u003E\\u003C/span\\u003E\\u003C/span\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"content fsm fwn fcg\\\"\\u003E\\u003Cdiv class=\\\"author\\\"\\u003E\\u003Cstrong data-jsid=\\\"name\\\"\\u003E\\u003C/strong\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"snippet preview fsm fwn fcg\\\"\\u003E\\u003Cspan data-jsid=\\\"snippet\\\"\\u003E\\u003C/span\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"time\\\"\\u003E\\u003Cabbr title=\\\"Wednesday, December 31, 1969 at 7:00pm\\\" data-utime=\\\"0\\\" class=\\\"hidden_elem timestamp\\\" data-jsid=\\\"timestamp\\\"\\u003Eover a year ago\\u003C/abbr\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/a\\u003E\\u003C/li\\u003E\"\n    },2,],[\"m_0_18\",{\n        __html: \"\\u003Cdiv class=\\\"_542d\\\"\\u003E\\u003Cimg class=\\\"img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yv/r/O7ihJIPh_G0.gif\\\" alt=\\\"\\\" width=\\\"15\\\" height=\\\"15\\\" /\\u003E\\u003Cspan class=\\\"_55r6\\\"\\u003ESending...\\u003C/span\\u003E\\u003C/div\\u003E\"\n    },2,],[\"m_0_19\",{\n        __html: \"\\u003Cdiv class=\\\"mas pam uiBoxYellow\\\"\\u003E\\u003Cstrong\\u003EThis message is no longer available\\u003C/strong\\u003E because it was identified as abusive or marked as spam.\\u003C/div\\u003E\"\n    },2,],[\"m_0_1a\",{\n        __html: \"\\u003Cdiv class=\\\"_542d\\\"\\u003E\\u003Cimg class=\\\"img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/ye/r/NNg0bu4GBuz.png\\\" alt=\\\"\\\" width=\\\"13\\\" height=\\\"11\\\" /\\u003E\\u003Cspan class=\\\"_55r7\\\"\\u003EFailed to send\\u003C/span\\u003E\\u003C/div\\u003E\"\n    },2,],]\n});\nonloadRegister_DEPRECATED(function() {\n    new AsyncRequest().setURI(\"/ajax/marketing/tour/privacy_dialog.php\").send();\n});\nonloadRegister_DEPRECATED(function() {\n    requireLazy([\"MercuryJewel\",], function(MercuryJewel) {\n        new MercuryJewel($(\"fbMessagesFlyout\"), $(\"fbMessagesJewel\"), require(\"m_0_5\"), {\n            message_counts: [{\n                unread_count: 0,\n                unseen_count: 0,\n                seen_timestamp: 0,\n                last_action_id: 0,\n                folder: \"inbox\"\n            },{\n                unread_count: 0,\n                unseen_count: 0,\n                seen_timestamp: 0,\n                last_action_id: null,\n                folder: \"other\"\n            },],\n            payload_source: \"server_initial_data\"\n        });\n    });\n});\nonloadRegister_DEPRECATED(function() {\n    require(\"m_0_7\").getData().onLoad(false, true);\n});\nonloadRegister_DEPRECATED(function() {\n    window.presenceRequests = JSCC.get(\"j1O7KQQXRw2M7DXJek0\").init(require(\"m_0_c\"), \"[fb]requests\", false);\n});\nonloadRegister_DEPRECATED(function() {\n    window.presenceNotifications = new Notifications({\n        updateTime: 1373490143000,\n        latestNotif: null,\n        latestReadNotif: null,\n        updatePeriod: 480000,\n        cacheVersion: 2,\n        allowDesktopNotifications: false,\n        notifReceivedType: \"notification\",\n        wrapperID: \"fbNotificationsJewel\",\n        contentID: \"fbNotificationsList\",\n        shouldLogImpressions: 0,\n        useInfiniteScroll: 1,\n        persistUnreadColor: true,\n        unseenVsUnread: 0\n    });\n});\nonloadRegister_DEPRECATED(function() {\n    Arbiter.inform(\"jewel/count-initial\", {\n        jewel: \"notifications\",\n        count: 0\n    }, Arbiter.BEHAVIOR_STATE);\n});\nonafterloadRegister_DEPRECATED(function() {\n    Bootloader.loadComponents([\"legacy:detect-broken-proxy-cache\",], function() {\n        detect_broken_proxy_cache(\"100006118350059\", \"c_user\");\n    });\n});\nonafterloadRegister_DEPRECATED(function() {\n    Bootloader.loadComponents([\"autoset-timezone\",], function() {\n        tz_autoset(1373490143, -240, 0);\n    });\n});");
// 1060
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"s1781b0f90407e4130b9cb2d35dc8345bef88e4c3");
// 1061
geval("try {\n    Bootloader.configurePage([\"W3Ky6\",\"0duP3\",\"vFtag\",\"ynBUm\",\"xqZGj\",\"yagwf\",]);\n    Bootloader.done([\"jDr+c\",]);\n    JSCC.init(({\n        j1O7KQQXRw2M7DXJek0: function() {\n            return new RequestsJewel();\n        }\n    }));\n    require(\"InitialJSLoader\").handleServerJS({\n        require: [[\"JSBNG__Intl\",\"setPhonologicalRules\",[],[{\n            meta: {\n                \"/_B/\": \"([.,!?\\\\s]|^)\",\n                \"/_E/\": \"([.,!?\\\\s]|$)\"\n            },\n            patterns: {\n                \"/\\u0001(.*)('|&#039;)s\\u0001(?:'|&#039;)s(.*)/\": \"\\u0001$1$2s\\u0001$3\",\n                \"/_\\u0001([^\\u0001]*)\\u0001/e\": \"mb_strtolower(\\\"\\u0001$1\\u0001\\\")\",\n                \"/\\\\^\\\\x01([^\\\\x01])(?=[^\\\\x01]*\\\\x01)/e\": \"mb_strtoupper(\\\"\\u0001$1\\\")\",\n                \"/_\\u0001([^\\u0001]*)\\u0001/\": \"javascript\"\n            }\n        },],],[\"PostLoadJS\",\"loadAndRequire\",[],[\"DimensionTracking\",],],[\"PostLoadJS\",\"loadAndCall\",[],[\"HighContrastMode\",\"init\",[{\n            currentState: null,\n            spacerImage: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y4/r/-PAXP-deijE.gif\"\n        },],],],[\"ScriptPath\",\"set\",[],[\"/home.php\",\"6bc96d96\",],],[\"ClickRefLogger\",],[\"userAction\",\"setUATypeConfig\",[],[{\n            \"ua:n\": false,\n            \"ua:i\": false,\n            \"ua:d\": false,\n            \"ua:e\": false\n        },],],[\"ScriptPathState\",\"setUserURISampleRate\",[],[1050,],],[\"userAction\",\"setCustomSampleConfig\",[],[{\n            \"ua:n\": {\n                test: {\n                    ua_id: {\n                        test: true\n                    }\n                }\n            },\n            \"ua:i\": {\n                snowlift: {\n                    action: {\n                        open: true,\n                        close: true\n                    }\n                },\n                canvas: {\n                    action: {\n                        mouseover: true,\n                        mouseout: true\n                    }\n                }\n            }\n        },],],[\"UserActionHistory\",],[\"ScriptPath\",\"startLogging\",[],[],],[\"TimeSpentBitArrayLogger\",\"init\",[],[],],[\"PixelRatio\",\"startDetecting\",[],[1,],],[\"LiveTimer\",\"restart\",[],[1373490143,],],[\"MessagingReliabilityLogger\",],[\"UnityLogging\",\"logUnityVersion\",[],[],],[\"DocumentTitle\",\"set\",[],[\"Facebook\",],],[\"SidebarPrelude\",\"addSidebarMode\",[],[1225,],],[\"m_0_0\",],[\"Quickling\",],[\"TinyViewport\",],[\"WebStorageMonster\",\"schedule\",[],[false,],],[\"AsyncRequestNectarLogging\",],[\"ViewasChromeBar\",\"initChromeBar\",[\"m_0_1\",],[{\n            __m: \"m_0_1\"\n        },],],[\"PagesVoiceBar\",\"initVoiceBar\",[],[],],[\"TypeaheadSearchBrowseUpsell\",\"registerForm\",[\"m_0_2\",],[{\n            __m: \"m_0_2\"\n        },],],[\"TypeaheadSearchSponsored\",\"setAuctionOptions\",[],[{\n            maxNumberAds: 3,\n            maxNumberRemovedResults: 2,\n            maxNumberResultsAndAds: 8,\n            v1: 1000000,\n            v2: 0,\n            v0: 100000,\n            v3: 1000000,\n            v4: 1000000,\n            bootstrap: false,\n            rerankingStrategy: 5\n        },],],[\"AccessibleMenu\",\"init\",[\"m_0_4\",],[{\n            __m: \"m_0_4\"\n        },],],[\"MercuryJewel\",],[\"TitanLeftNav\",\"initialize\",[],[],],[\"m_0_7\",],[\"Typeahead\",\"init\",[\"m_0_8\",\"m_0_7\",\"TypeaheadExcludeBootstrapFromQueryCache\",\"TypeaheadSearchBrowseUpsell\",\"TypeaheadDetectQueryLocale\",],[{\n            __m: \"m_0_8\"\n        },{\n            __m: \"m_0_7\"\n        },[{\n            __m: \"TypeaheadExcludeBootstrapFromQueryCache\"\n        },{\n            __m: \"TypeaheadSearchBrowseUpsell\"\n        },{\n            __m: \"TypeaheadDetectQueryLocale\"\n        },\"searchSponsored\",\"searchRecorderBasic\",\"regulateMemorializedUsers\",\"showLoadingIndicator\",\"initFilters\",],null,],],[\"PlaceholderListener\",],[\"PlaceholderOnsubmitFormListener\",],[\"FlipDirectionOnKeypress\",],[\"enforceMaxLength\",],[\"m_0_5\",],[\"ChatOpenTab\",\"listenOpenEmptyTab\",[\"m_0_d\",],[{\n            __m: \"m_0_d\"\n        },],],[\"Scrollable\",],[\"m_0_f\",],[\"m_0_c\",],[\"WebStorageMonster\",\"registerLogoutForm\",[\"m_0_h\",],[{\n            __m: \"m_0_h\"\n        },[\"^Banzai$\",\"^\\\\:userchooser\\\\:osessusers$\",\"^[0-9]+:powereditor:\",\"^[0-9]+:page_insights:\",\"^_SocialFoxExternal_machineid$\",\"^_SocialFoxExternal_LoggedInBefore$\",\"^_socialfox_worker_enabled$\",],],],[\"m_0_k\",],[\"m_0_m\",],[\"m_0_n\",],[\"PrivacyLiteNUXController\",\"init\",[\"m_0_n\",],[{\n            dialog: {\n                __m: \"m_0_n\"\n            },\n            sectionID: \"who_can_see\",\n            subsectionID: \"plite_activity_log\",\n            showOnExpand: true\n        },],],[\"m_0_p\",],[\"PrivacyLiteFlyout\",\"registerFinalReminderFlyout\",[\"m_0_p\",],[{\n            __m: \"m_0_p\"\n        },],],[\"PrivacyLiteFlyout\",\"registerFlyoutToggler\",[\"m_0_r\",\"m_0_s\",],[{\n            __m: \"m_0_r\"\n        },{\n            __m: \"m_0_s\"\n        },],],[\"Primer\",],[\"m_0_y\",],],\n        instances: [[\"m_0_0\",[\"AsyncLayout\",],[\"contentArea\",],1,],[\"m_0_7\",[\"Typeahead\",\"m_0_a\",\"SearchTypeaheadView\",\"SearchTypeaheadRenderer\",\"m_0_8\",\"SearchTypeaheadCore\",\"m_0_9\",],[{\n            __m: \"m_0_a\"\n        },{\n            node_id: \"u_0_0\",\n            node: null,\n            ctor: {\n                __m: \"SearchTypeaheadView\"\n            },\n            options: {\n                autoSelect: true,\n                renderer: {\n                    __m: \"SearchTypeaheadRenderer\"\n                },\n                causalElement: {\n                    __m: \"m_0_8\"\n                },\n                maxResults: 8,\n                minWidth: 0,\n                alignment: \"left\",\n                showBadges: 1,\n                typeObjects: {\n                    app: {\n                        uid: \"app\",\n                        text: \"app\",\n                        type: \"header\",\n                        markup: \"Apps\"\n                    },\n                    JSBNG__event: {\n                        uid: \"JSBNG__event\",\n                        text: \"JSBNG__event\",\n                        type: \"header\",\n                        markup: \"Events\"\n                    },\n                    group: {\n                        uid: \"group\",\n                        text: \"group\",\n                        type: \"header\",\n                        markup: \"Groups\"\n                    },\n                    page: {\n                        uid: \"page\",\n                        text: \"page\",\n                        type: \"header\",\n                        markup: \"Pages\"\n                    },\n                    place: {\n                        uid: \"place\",\n                        text: \"place\",\n                        type: \"header\",\n                        markup: \"Places\"\n                    },\n                    shortcut: {\n                        uid: \"shortcut\",\n                        text: \"shortcut\",\n                        type: \"header\",\n                        markup: \"Facebook\"\n                    },\n                    user: {\n                        uid: \"user\",\n                        text: \"user\",\n                        type: \"header\",\n                        markup: \"People\"\n                    },\n                    song: {\n                        uid: \"song\",\n                        text: \"song\",\n                        type: \"header\",\n                        markup: \"Music\"\n                    },\n                    friendlist: {\n                        uid: \"friendlist\",\n                        text: \"friendlist\",\n                        type: \"header\",\n                        markup: \"Lists\"\n                    },\n                    hashtag_exact: {\n                        uid: \"hashtag_exact\",\n                        text: \"hashtag_exact\",\n                        type: \"header\",\n                        markup: \"Hashtag\"\n                    },\n                    websuggestion: {\n                        uid: \"websuggestion\",\n                        text: \"websuggestion\",\n                        type: \"header\",\n                        markup: \"Search the Web\"\n                    },\n                    ownsection: {\n                        uid: \"ownsection\",\n                        text: \"ownsection\",\n                        type: \"header\",\n                        markup: \"Sponsored\"\n                    },\n                    tophit: {\n                        uid: \"tophit\",\n                        text: \"tophit\",\n                        type: \"header\",\n                        markup: \"Top Hit\"\n                    }\n                },\n                seeMoreEndpoint: \"http://jsbngssl.www.facebook.com/search/results.php?init=quick\",\n                showKeywordResultsPage: false,\n                showFilterResults: false\n            }\n        },{\n            ctor: {\n                __m: \"SearchTypeaheadCore\"\n            },\n            options: {\n                keepFocused: false,\n                resetOnSelect: true\n            }\n        },{\n            __m: \"m_0_9\"\n        },],4,],[\"m_0_5\",[\"JewelX\",\"m_0_b\",],[{\n            __m: \"m_0_b\"\n        },{\n            JSBNG__name: \"mercurymessages\"\n        },],2,],[\"m_0_f\",[\"ScrollableArea\",\"m_0_e\",],[{\n            __m: \"m_0_e\"\n        },{\n            persistent: true\n        },],1,],[\"m_0_c\",[\"JewelX\",\"m_0_g\",],[{\n            __m: \"m_0_g\"\n        },{\n            JSBNG__name: \"requests\"\n        },],2,],[\"m_0_k\",[\"JewelX\",\"m_0_j\",],[{\n            __m: \"m_0_j\"\n        },{\n            JSBNG__name: \"notifications\"\n        },],1,],[\"m_0_m\",[\"ScrollableArea\",\"m_0_l\",],[{\n            __m: \"m_0_l\"\n        },{\n            persistent: true\n        },],1,],[\"m_0_n\",[\"ContextualDialog\",\"ContextualDialogArrow\",\"ContextualDialogDefaultTheme\",\"LayerRemoveOnHide\",\"LayerHideOnTransition\",\"LayerFadeOnShow\",\"m_0_o\",],[{\n            width: 300,\n            context: null,\n            contextID: null,\n            contextSelector: null,\n            position: \"left\",\n            alignment: \"left\",\n            offsetX: 0,\n            offsetY: 0,\n            arrowBehavior: {\n                __m: \"ContextualDialogArrow\"\n            },\n            theme: {\n                __m: \"ContextualDialogDefaultTheme\"\n            },\n            addedBehaviors: [{\n                __m: \"LayerRemoveOnHide\"\n            },{\n                __m: \"LayerHideOnTransition\"\n            },{\n                __m: \"LayerFadeOnShow\"\n            },]\n        },{\n            __m: \"m_0_o\"\n        },],3,],[\"m_0_p\",[\"ContextualDialog\",\"ContextualDialogArrow\",\"ContextualDialogDefaultTheme\",\"LayerRemoveOnHide\",\"LayerDestroyOnHide\",\"LayerHideOnTransition\",\"LayerFadeOnShow\",\"ContextualLayerAutoFlip\",\"DialogHideOnSuccess\",\"m_0_q\",],[{\n            width: 300,\n            context: null,\n            contextID: \"u_0_6\",\n            contextSelector: null,\n            position: \"below\",\n            alignment: \"right\",\n            offsetX: 0,\n            offsetY: 0,\n            arrowBehavior: {\n                __m: \"ContextualDialogArrow\"\n            },\n            theme: {\n                __m: \"ContextualDialogDefaultTheme\"\n            },\n            addedBehaviors: [{\n                __m: \"LayerRemoveOnHide\"\n            },{\n                __m: \"LayerDestroyOnHide\"\n            },{\n                __m: \"LayerHideOnTransition\"\n            },{\n                __m: \"LayerFadeOnShow\"\n            },{\n                __m: \"ContextualLayerAutoFlip\"\n            },{\n                __m: \"DialogHideOnSuccess\"\n            },],\n            classNames: [\"_57bl\",]\n        },{\n            __m: \"m_0_q\"\n        },],3,],[\"m_0_y\",[\"PrivacyLiteFlyoutHelp\",\"m_0_t\",\"m_0_u\",\"m_0_v\",\"m_0_w\",\"m_0_x\",],[{\n            __m: \"m_0_t\"\n        },{\n            __m: \"m_0_u\"\n        },{\n            __m: \"m_0_v\"\n        },{\n            __m: \"m_0_w\"\n        },{\n            __m: \"m_0_x\"\n        },],1,],[\"m_0_a\",[\"SearchDataSource\",],[{\n            minWebSugg: 3,\n            minQueryLength: 2,\n            maxWebSuggToCountFetchMore: 2,\n            maxResults: 8,\n            indexedFields: [\"text\",\"tokens\",\"alias\",\"non_title_tokens\",],\n            titleFields: [\"text\",\"alias\",\"tokens\",],\n            queryData: {\n                viewer: 100006118350059,\n                rsp: \"search\",\n                context: \"search\"\n            },\n            queryEndpoint: \"/ajax/typeahead/search.php\",\n            bootstrapData: {\n                viewer: 100006118350059,\n                token: \"v7\"\n            },\n            bootstrapEndpoint: \"/ajax/typeahead/search/bootstrap.php\",\n            token: \"1372173655-7\",\n            genTime: 1373490143,\n            enabledQueryCache: true,\n            queryExactMatch: false,\n            enabledHashtag: true\n        },],2,],[\"m_0_z\",[\"XHPTemplate\",\"m_0_15\",],[{\n            __m: \"m_0_15\"\n        },],2,],[\"m_0_10\",[\"XHPTemplate\",\"m_0_16\",],[{\n            __m: \"m_0_16\"\n        },],2,],[\"m_0_11\",[\"XHPTemplate\",\"m_0_17\",],[{\n            __m: \"m_0_17\"\n        },],2,],[\"m_0_12\",[\"XHPTemplate\",\"m_0_18\",],[{\n            __m: \"m_0_18\"\n        },],2,],[\"m_0_13\",[\"XHPTemplate\",\"m_0_19\",],[{\n            __m: \"m_0_19\"\n        },],2,],[\"m_0_14\",[\"XHPTemplate\",\"m_0_1a\",],[{\n            __m: \"m_0_1a\"\n        },],2,],],\n        define: [[\"TimeSpentConfig\",[],{\n            delay: 200000,\n            initial_timeout: 8,\n            initial_delay: 1000\n        },142,],[\"MessagingReliabilityLoggerInitialData\",[],{\n            enabled: false,\n            app: \"mercury\"\n        },44,],[\"QuicklingConfig\",[],{\n            version: \"871405;0;0;0\",\n            inactivePageRegex: \"^/(fr/u\\\\.php|ads/|advertising|ac\\\\.php|ae\\\\.php|ajax/emu/(end|f|h)\\\\.php|badges/|comments\\\\.php|connect/uiserver\\\\.php|editalbum\\\\.php.+add=1|ext/|feeds/|help([/?]|$)|identity_switch\\\\.php|intern/|login\\\\.php|logout\\\\.php|sitetour/homepage_tour\\\\.php|sorry\\\\.php|syndication\\\\.php|webmessenger|/plugins/subscribe|\\\\.pdf$|brandpermissions|gameday|pxlcld)\",\n            sessionLength: 30\n        },60,],[\"MercuryThreadlistIconTemplates\",[\"m_0_z\",\"m_0_10\",],{\n            \":fb:mercury:attachment-indicator\": {\n                __m: \"m_0_z\"\n            },\n            \":fb:mercury:attachment-icon-text\": {\n                __m: \"m_0_10\"\n            }\n        },42,],[\"MercuryThreadlistConstants\",[],{\n            SEARCH_TAB: \"searchtab\",\n            JEWEL_MORE_COUNT: 10,\n            WEBMESSENGER_SEARCH_SNIPPET_COUNT: 5,\n            WEBMESSENGER_SEARCH_SNIPPET_MORE: 5,\n            RECENT_MESSAGES_LIMIT: 10,\n            WEBMESSENGER_SEARCH_SNIPPET_LIMIT: 5,\n            WEBMESSENGER_MORE_MESSAGES_COUNT: 20,\n            WEBMESSENGER_MORE_COUNT: 20,\n            JEWEL_THREAD_COUNT: 5,\n            RECENT_THREAD_OFFSET: 0,\n            MAX_CHARS_BEFORE_BREAK: 280,\n            MESSAGE_TIMESTAMP_THRESHOLD: 1209600000,\n            GROUPING_THRESHOLD: 300000,\n            MAX_UNSEEN_COUNT: 99,\n            MAX_UNREAD_COUNT: 99,\n            WEBMESSENGER_THREAD_COUNT: 20\n        },96,],[\"MessagingConfig\",[],{\n            SEND_BATCH_LIMIT: 5,\n            IDLE_CUTOFF: 30000,\n            SEND_CONNECTION_RETRIES: 2\n        },97,],[\"MercuryParticipantsConstants\",[],{\n            EMAIL_IMAGE: \"/images/messaging/threadlist/envelope.png\",\n            BIG_IMAGE_SIZE: 50,\n            IMAGE_SIZE: 32,\n            UNKNOWN_GENDER: 0\n        },109,],[\"MercuryConfig\",[],{\n            \"24h_times\": false,\n            activity_limit: 60000,\n            idle_poll_interval: 300000,\n            WebMessengerThreadSearchGK: 1,\n            ChatSaveDraftsGK: 0,\n            VideoCallingNoJavaGK: 0,\n            MessagesJewelToggleReadGK: 1,\n            SocialContextGK: 0,\n            ChatMultiTypGK: 0,\n            ChatMultiTypSendGK: 1,\n            NewVCGK: 0,\n            local_storage_crypto: null,\n            MessagesDisableForwardingGK: 1,\n            MessagesJewelOpenInChat: 0,\n            filtering_active: true,\n            idle_limit: 1800000,\n            MessagingDisplayEmojiGK: 1,\n            \"roger.seen_delay\": 15000\n        },35,],[\"DateFormatConfig\",[],{\n            weekStart: 6,\n            ordinalSuffixes: {\n                1: \"st\",\n                2: \"nd\",\n                3: \"rd\",\n                4: \"th\",\n                5: \"th\",\n                6: \"th\",\n                7: \"th\",\n                8: \"th\",\n                9: \"th\",\n                10: \"th\",\n                11: \"th\",\n                12: \"th\",\n                13: \"th\",\n                14: \"th\",\n                15: \"th\",\n                16: \"th\",\n                17: \"th\",\n                18: \"th\",\n                19: \"th\",\n                20: \"th\",\n                21: \"st\",\n                22: \"nd\",\n                23: \"rd\",\n                24: \"th\",\n                25: \"th\",\n                26: \"th\",\n                27: \"th\",\n                28: \"th\",\n                29: \"th\",\n                30: \"th\",\n                31: \"st\"\n            },\n            numericDateSeparator: \"/\",\n            numericDateOrder: [\"m\",\"d\",\"y\",],\n            shortDayNames: [\"Mon\",\"Tue\",\"Wed\",\"Thu\",\"Fri\",\"Sat\",\"Sun\",],\n            formats: []\n        },165,],[\"MercuryJewelTemplates\",[\"m_0_11\",],{\n            \":fb:mercury:jewel:threadlist-row\": {\n                __m: \"m_0_11\"\n            }\n        },39,],[\"MercuryStatusTemplates\",[\"m_0_12\",\"m_0_13\",\"m_0_14\",],{\n            \":fb:mercury:resend-indicator\": {\n                __m: \"m_0_12\"\n            },\n            \":fb:mercury:filtered-message\": {\n                __m: \"m_0_13\"\n            },\n            \":fb:mercury:error-indicator\": {\n                __m: \"m_0_14\"\n            }\n        },41,],[\"MercuryServerRequestsConfig\",[],{\n            sendMessageTimeout: 45000\n        },107,],[\"PresencePrivacyInitialData\",[],{\n            visibility: 1,\n            privacyData: {\n            },\n            onlinePolicy: 1\n        },58,],[\"HashtagSearchResultConfig\",[],{\n            boost_result: 1,\n            hashtag_cost: 10959,\n            image_url: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yF/r/irmqzCEvUpb.png\"\n        },146,],],\n        elements: [[\"m_0_3\",\"u_0_1\",2,\"m_0_2\",],[\"m_0_9\",\"u_0_2\",2,],[\"m_0_8\",\"u_0_3\",4,],[\"m_0_b\",\"fbMessagesJewel\",2,],[\"m_0_d\",\"u_0_4\",2,],[\"m_0_e\",\"MercuryJewelThreadList\",2,],[\"m_0_g\",\"fbRequestsJewel\",2,],[\"m_0_h\",\"logout_form\",2,],[\"m_0_j\",\"fbNotificationsJewel\",2,],[\"m_0_l\",\"u_0_5\",2,],[\"m_0_s\",\"u_0_8\",2,],[\"m_0_x\",\"u_0_9\",2,],[\"m_0_u\",\"u_0_a\",2,],[\"m_0_w\",\"u_0_b\",2,],[\"m_0_6\",\"navSearch\",2,],[\"m_0_r\",\"u_0_7\",2,],[\"m_0_v\",\"u_0_c\",2,],[\"m_0_t\",\"u_0_d\",2,],[\"m_0_4\",\"u_0_e\",2,],[\"m_0_i\",\"logout_form\",2,],[\"m_0_1\",\"u_0_f\",2,],],\n        markup: [[\"m_0_2\",{\n            __html: \"\\u003Cform rel=\\\"async\\\" action=\\\"/ajax/marketing/optin\\\" method=\\\"post\\\" onsubmit=\\\"return window.Event &amp;&amp; Event.__inlineSubmit &amp;&amp; Event.__inlineSubmit(this,event)\\\" id=\\\"u_0_1\\\"\\u003E\\u003Cinput type=\\\"hidden\\\" name=\\\"fb_dtsg\\\" value=\\\"AQCttlPQ\\\" autocomplete=\\\"off\\\" /\\u003E\\u003Cinput type=\\\"hidden\\\" autocomplete=\\\"off\\\" name=\\\"project\\\" value=\\\"320951738012113\\\" /\\u003E\\u003Cinput type=\\\"hidden\\\" autocomplete=\\\"off\\\" name=\\\"product\\\" value=\\\"Graph Search\\\" /\\u003E\\u003Cinput type=\\\"hidden\\\" autocomplete=\\\"off\\\" name=\\\"source\\\" value=\\\"search_taui\\\" /\\u003E\\u003Cdiv class=\\\"clearfix\\\"\\u003E\\u003Cdiv class=\\\"mtm mlm rfloat\\\"\\u003E\\u003Cbutton value=\\\"1\\\" class=\\\"_42ft _42fu browseSignup selected _42gz\\\" type=\\\"submit\\\"\\u003EGet Graph Search\\u003C/button\\u003E\\u003Cbutton value=\\\"1\\\" class=\\\"_42ft _42fr _42fu browseJoined selected _42gz\\\" disabled=\\\"1\\\" type=\\\"submit\\\"\\u003EYou&#039;re on the List!\\u003C/button\\u003E\\u003C/div\\u003E\\u003Cdiv\\u003E\\u003Cdiv class=\\\"fwb\\\"\\u003ENew! Try Graph Search\\u003C/div\\u003EFind more of what you&#039;re looking for through friends and connections. \\u003Ca href=\\\"/about/graphsearch?source=search_tau\\\"\\u003ELearn More\\u003C/a\\u003E.\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/form\\u003E\"\n        },3,],[\"m_0_o\",{\n            __html: \"\\u003Cdiv\\u003E\\u003Cdiv class=\\\"_53iv\\\"\\u003E\\u003Cdiv\\u003E\\u003Ca class=\\\"_1luv _1lvq\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003Cimg class=\\\"img\\\" alt=\\\"Close\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y0/r/K4K8h0mqOQN.png\\\" width=\\\"11\\\" height=\\\"13\\\" /\\u003E\\u003C/a\\u003E\\u003Cspan class=\\\"fsl\\\"\\u003E\\u003Cspan class=\\\"_3oyf\\\"\\u003ETry your new Privacy Shortcuts.\\u003C/span\\u003E Visit your Activity Log to review photos you&#039;re tagged in and things you&#039;ve hidden from your timeline.\\u003C/span\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_q\",{\n            __html: \"\\u003Cdiv\\u003E\\u003Cdiv class=\\\"_53iv\\\"\\u003E\\u003Cdiv\\u003E\\u003Cstrong\\u003ETip\\u003C/strong\\u003E: Graph Search is rolling out now, so it&#039;s getting easier for people to find photos and other things you&#039;ve shared with them. To check who can see your stuff, just click \\u003Cimg class=\\\"img\\\" alt=\\\"Privacy Shortcuts\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yO/r/eYJycDMyJiy.png\\\" width=\\\"12\\\" height=\\\"9\\\" /\\u003E.\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"uiOverlayFooter _572u uiBoxGray topborder\\\"\\u003E\\u003Cbutton value=\\\"1\\\" class=\\\"_42ft _42fu layerConfirm _57bk uiOverlayButton selected _42g-\\\" type=\\\"submit\\\"\\u003EOkay\\u003C/button\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_15\",{\n            __html: \"\\u003Ci class=\\\"mrs MercuryThreadlistIcon img sp_2gr8ms sx_22d5af\\\"\\u003E\\u003C/i\\u003E\"\n        },2,],[\"m_0_16\",{\n            __html: \"\\u003Cspan class=\\\"uiIconText _3tn\\\"\\u003E\\u003Ci class=\\\"img sp_2gr8ms sx_d68978\\\"\\u003E\\u003C/i\\u003E\\u003C/span\\u003E\"\n        },2,],[\"m_0_17\",{\n            __html: \"\\u003Cli\\u003E\\u003Ca class=\\\"messagesContent\\\" data-jsid=\\\"link\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003Cdiv class=\\\"clearfix\\\"\\u003E\\u003Cdiv class=\\\"MercuryThreadImage _8o _8s lfloat\\\" data-jsid=\\\"image\\\"\\u003E\\u003Cimg class=\\\"_s0 _rw img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yw/r/drP8vlvSl_8.gif\\\" /\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"clearfix _42ef\\\"\\u003E\\u003Cdiv class=\\\"snippetThumbnail rfloat\\\"\\u003E\\u003Cspan class=\\\"_56hv hidden_elem\\\" data-jsid=\\\"snippet-thumbnail-single\\\"\\u003E\\u003Ci style=\\\"background-image: url(/images/blank.gif);\\\"\\u003E\\u003C/i\\u003E\\u003C/span\\u003E\\u003Cspan class=\\\"hidden_elem\\\" data-jsid=\\\"snippet-thumbnail-multiple\\\"\\u003E\\u003Cspan class=\\\"_56hy\\\"\\u003E\\u003C/span\\u003E\\u003Cspan class=\\\"_56hv\\\"\\u003E\\u003Ci style=\\\"background-image: url(/images/blank.gif);\\\"\\u003E\\u003C/i\\u003E\\u003C/span\\u003E\\u003C/span\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"content fsm fwn fcg\\\"\\u003E\\u003Cdiv class=\\\"author\\\"\\u003E\\u003Cstrong data-jsid=\\\"name\\\"\\u003E\\u003C/strong\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"snippet preview fsm fwn fcg\\\"\\u003E\\u003Cspan data-jsid=\\\"snippet\\\"\\u003E\\u003C/span\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"time\\\"\\u003E\\u003Cabbr title=\\\"Wednesday, December 31, 1969 at 7:00pm\\\" data-utime=\\\"0\\\" class=\\\"hidden_elem timestamp\\\" data-jsid=\\\"timestamp\\\"\\u003Eover a year ago\\u003C/abbr\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/a\\u003E\\u003C/li\\u003E\"\n        },2,],[\"m_0_18\",{\n            __html: \"\\u003Cdiv class=\\\"_542d\\\"\\u003E\\u003Cimg class=\\\"img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yv/r/O7ihJIPh_G0.gif\\\" alt=\\\"\\\" width=\\\"15\\\" height=\\\"15\\\" /\\u003E\\u003Cspan class=\\\"_55r6\\\"\\u003ESending...\\u003C/span\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_19\",{\n            __html: \"\\u003Cdiv class=\\\"mas pam uiBoxYellow\\\"\\u003E\\u003Cstrong\\u003EThis message is no longer available\\u003C/strong\\u003E because it was identified as abusive or marked as spam.\\u003C/div\\u003E\"\n        },2,],[\"m_0_1a\",{\n            __html: \"\\u003Cdiv class=\\\"_542d\\\"\\u003E\\u003Cimg class=\\\"img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/ye/r/NNg0bu4GBuz.png\\\" alt=\\\"\\\" width=\\\"13\\\" height=\\\"11\\\" /\\u003E\\u003Cspan class=\\\"_55r7\\\"\\u003EFailed to send\\u003C/span\\u003E\\u003C/div\\u003E\"\n        },2,],]\n    });\n    onloadRegister_DEPRECATED(function() {\n        new AsyncRequest().setURI(\"/ajax/marketing/tour/privacy_dialog.php\").send();\n    });\n    onloadRegister_DEPRECATED(function() {\n        requireLazy([\"MercuryJewel\",], function(MercuryJewel) {\n            new MercuryJewel($(\"fbMessagesFlyout\"), $(\"fbMessagesJewel\"), require(\"m_0_5\"), {\n                message_counts: [{\n                    unread_count: 0,\n                    unseen_count: 0,\n                    seen_timestamp: 0,\n                    last_action_id: 0,\n                    folder: \"inbox\"\n                },{\n                    unread_count: 0,\n                    unseen_count: 0,\n                    seen_timestamp: 0,\n                    last_action_id: null,\n                    folder: \"other\"\n                },],\n                payload_source: \"server_initial_data\"\n            });\n        });\n    });\n    onloadRegister_DEPRECATED(function() {\n        require(\"m_0_7\").getData().onLoad(false, true);\n    });\n    onloadRegister_DEPRECATED(function() {\n        window.presenceRequests = JSCC.get(\"j1O7KQQXRw2M7DXJek0\").init(require(\"m_0_c\"), \"[fb]requests\", false);\n    });\n    onloadRegister_DEPRECATED(function() {\n        window.presenceNotifications = new Notifications({\n            updateTime: 1373490143000,\n            latestNotif: null,\n            latestReadNotif: null,\n            updatePeriod: 480000,\n            cacheVersion: 2,\n            allowDesktopNotifications: false,\n            notifReceivedType: \"notification\",\n            wrapperID: \"fbNotificationsJewel\",\n            contentID: \"fbNotificationsList\",\n            shouldLogImpressions: 0,\n            useInfiniteScroll: 1,\n            persistUnreadColor: true,\n            unseenVsUnread: 0\n        });\n    });\n    onloadRegister_DEPRECATED(function() {\n        Arbiter.inform(\"jewel/count-initial\", {\n            jewel: \"notifications\",\n            count: 0\n        }, Arbiter.BEHAVIOR_STATE);\n    });\n    onafterloadRegister_DEPRECATED(function() {\n        Bootloader.loadComponents([\"legacy:detect-broken-proxy-cache\",], function() {\n            detect_broken_proxy_cache(\"100006118350059\", \"c_user\");\n        });\n    });\n    onafterloadRegister_DEPRECATED(function() {\n        Bootloader.loadComponents([\"autoset-timezone\",], function() {\n            tz_autoset(1373490143, -240, 0);\n        });\n    });\n} catch (JSBNG_ex) {\n\n};");
// 1062
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"if (self.CavalryLogger) {\n    CavalryLogger.start_js([\"OJTM4\",]);\n}\n;\n__d(\"AjaxRequest\", [\"ErrorUtils\",\"Keys\",\"URI\",\"UserAgent\",\"XHR\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"ErrorUtils\"), h = b(\"Keys\"), i = b(\"URI\"), j = b(\"UserAgent\"), k = b(\"XHR\"), l = b(\"copyProperties\");\n    function m(q, r, s) {\n        this.xhr = k.create();\n        if (!((r instanceof i))) {\n            r = new i(r);\n        };\n        if ((s && (q == \"GET\"))) {\n            r.setQueryData(s);\n        }\n         else this._params = s;\n    ;\n        this.method = q;\n        this.uri = r;\n        this.xhr.open(q, r);\n    };\n    var n = (window.XMLHttpRequest && ((\"withCredentials\" in new XMLHttpRequest())));\n    m.supportsCORS = function() {\n        return n;\n    };\n    m.ERROR = \"ar:error\";\n    m.TIMEOUT = \"ar:timeout\";\n    m.PROXY_ERROR = \"ar:proxy error\";\n    m.TRANSPORT_ERROR = \"ar:transport error\";\n    m.SERVER_ERROR = \"ar:http error\";\n    m.PARSE_ERROR = \"ar:parse error\";\n    m._inflight = [];\n    function o() {\n        var q = m._inflight;\n        m._inflight = [];\n        q.forEach(function(r) {\n            r.abort();\n        });\n    };\n    function p(q) {\n        q.onJSON = q.onError = q.onSuccess = null;\n        clearTimeout(q._timer);\n        if ((q.xhr && (q.xhr.readyState < 4))) {\n            q.xhr.abort();\n            q.xhr = null;\n        }\n    ;\n        m._inflight = m._inflight.filter(function(r) {\n            return (((r && (r != q)) && r.xhr) && (r.xhr.readyState < 4));\n        });\n    };\n    l(m.prototype, {\n        timeout: 60000,\n        streamMode: true,\n        prelude: /^for \\(;;\\);/,\n        status: null,\n        _eol: -1,\n        _call: function(q) {\n            if (this[q]) {\n                this[q](this);\n            };\n        },\n        _parseStatus: function() {\n            var q;\n            try {\n                this.status = this.xhr.status;\n                q = this.xhr.statusText;\n            } catch (r) {\n                if ((this.xhr.readyState >= 4)) {\n                    this.errorType = m.TRANSPORT_ERROR;\n                    this.errorText = r.message;\n                }\n            ;\n                return;\n            };\n            if (((this.status === 0) && !(/^(file|ftp)/.test(this.uri)))) {\n                this.errorType = m.TRANSPORT_ERROR;\n            }\n             else if (((this.status >= 100) && (this.status < 200))) {\n                this.errorType = m.PROXY_ERROR;\n            }\n             else if (((this.status >= 200) && (this.status < 300))) {\n                return;\n            }\n             else if (((this.status >= 300) && (this.status < 400))) {\n                this.errorType = m.PROXY_ERROR;\n            }\n             else if (((this.status >= 400) && (this.status < 500))) {\n                this.errorType = m.SERVER_ERROR;\n            }\n             else if (((this.status >= 500) && (this.status < 600))) {\n                this.errorType = m.PROXY_ERROR;\n            }\n             else if ((this.status == 1223)) {\n                return;\n            }\n             else if (((this.status >= 12001) && (this.status <= 12156))) {\n                this.errorType = m.TRANSPORT_ERROR;\n            }\n             else {\n                q = (\"unrecognized status code: \" + this.status);\n                this.errorType = m.ERROR;\n            }\n            \n            \n            \n            \n            \n            \n            \n        ;\n            if (!this.errorText) {\n                this.errorText = q;\n            };\n        },\n        _parseResponse: function() {\n            var q, r = this.xhr.readyState;\n            try {\n                q = (this.xhr.responseText || \"\");\n            } catch (s) {\n                if ((r >= 4)) {\n                    this.errorType = m.ERROR;\n                    this.errorText = (\"responseText not available - \" + s.message);\n                }\n            ;\n                return;\n            };\n            while (this.xhr) {\n                var t = (this._eol + 1), u = (this.streamMode ? q.indexOf(\"\\u000a\", t) : q.length);\n                if (((u < 0) && (r == 4))) {\n                    u = q.length;\n                };\n                if ((u <= this._eol)) {\n                    break;\n                };\n                var v = q;\n                if (this.streamMode) {\n                    v = q.substr(t, (u - t)).replace(/^\\s*|\\s*$/g, \"\");\n                };\n                if (((t === 0) && this.prelude)) {\n                    if (this.prelude.test(v)) {\n                        v = v.replace(this.prelude, \"\");\n                    }\n                };\n                this._eol = u;\n                if (v) {\n                    try {\n                        this.json = JSON.parse(v);\n                    } catch (s) {\n                        var w = ((/(<body[\\S\\s]+?<\\/body>)/i).test(q) && RegExp.$1), x = {\n                            message: s.message,\n                            char: t,\n                            excerpt: (((((t === 0) && w)) || v)).substr(512)\n                        };\n                        this.errorType = m.PARSE_ERROR;\n                        this.errorText = (\"parse error - \" + JSON.stringify(x));\n                        return;\n                    };\n                    g.applyWithGuard(this._call, this, [\"onJSON\",]);\n                }\n            ;\n            };\n        },\n        _onReadyState: function() {\n            var q = ((this.xhr && this.xhr.readyState) || 0);\n            if (((this.status == null) && (q >= 2))) {\n                this._parseStatus();\n            };\n            if ((!this.errorType && (this.status != null))) {\n                if (((((q == 3) && this.streamMode)) || (q == 4))) {\n                    this._parseResponse();\n                }\n            };\n            if ((this.errorType || (q == 4))) {\n                this._time = (Date.now() - this._sentAt);\n                this._call((!this.errorType ? \"onSuccess\" : \"onError\"));\n                p(this);\n            }\n        ;\n        },\n        send: function(q) {\n            this.xhr.onreadystatechange = function() {\n                g.applyWithGuard(this._onReadyState, this, arguments);\n            }.bind(this);\n            var r = this.timeout;\n            if (r) {\n                this._timer = setTimeout((function() {\n                    this.errorType = m.TIMEOUT;\n                    this.errorText = \"timeout\";\n                    this._time = (Date.now() - this._sentAt);\n                    this._call(\"onError\");\n                    p(this);\n                }).bind(this), r, false);\n            };\n            m._inflight.push(this);\n            if ((this.method == \"POST\")) {\n                this.xhr.setRequestHeader(\"Content-Type\", \"application/x-www-form-urlencoded\");\n            };\n            this._sentAt = Date.now();\n            this.xhr.send((q ? i.implodeQuery(q) : \"\"));\n        },\n        abort: function() {\n            p(this);\n        },\n        toString: function() {\n            var q = (\"[AjaxRequest readyState=\" + this.xhr.readyState);\n            if (this.errorType) {\n                q += ((((\" errorType=\" + this.errorType) + \" (\") + this.errorText) + \")\");\n            };\n            return (q + \"]\");\n        },\n        toJSON: function() {\n            var q = {\n                json: this.json,\n                status: this.status,\n                errorType: this.errorType,\n                errorText: this.errorText,\n                time: this._time\n            };\n            if (this.errorType) {\n                q.uri = this.uri;\n            };\n            for (var r in q) {\n                if ((q[r] == null)) {\n                    delete q[r];\n                };\n            };\n            return q;\n        }\n    });\n    if ((window.addEventListener && j.firefox())) {\n        window.addEventListener(\"keydown\", function(event) {\n            if ((event.keyCode === h.ESC)) {\n                event.prevent();\n            };\n        }, false);\n    };\n    if (window.attachEvent) {\n        window.attachEvent(\"onunload\", o);\n    };\n    e.exports = m;\n});\n__d(\"FBAjaxRequest\", [\"AjaxRequest\",\"copyProperties\",\"XHR\",], function(a, b, c, d, e, f) {\n    var g = b(\"AjaxRequest\"), h = b(\"copyProperties\"), i = b(\"XHR\");\n    function j(k, l, m) {\n        m = h(i.getAsyncParams(k), m);\n        var n = new g(k, l, m);\n        n.streamMode = false;\n        var o = n._call;\n        n._call = function(p) {\n            if (((p == \"onJSON\") && this.json)) {\n                if (this.json.error) {\n                    this.errorType = g.SERVER_ERROR;\n                    this.errorText = (\"AsyncResponse error: \" + this.json.error);\n                }\n            ;\n                this.json = this.json.payload;\n            }\n        ;\n            o.apply(this, arguments);\n        };\n        n.ajaxReqSend = n.send;\n        n.send = function(p) {\n            this.ajaxReqSend(h(p, m));\n        };\n        return n;\n    };\n    e.exports = j;\n});\n__d(\"CallbackManagerController\", [\"ErrorUtils\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"ErrorUtils\"), h = b(\"copyProperties\"), i = function(j) {\n        this._pendingIDs = [];\n        this._allRequests = [undefined,];\n        this._callbackArgHandler = j;\n    };\n    h(i.prototype, {\n        executeOrEnqueue: function(j, k, l) {\n            l = (l || {\n            });\n            var m = this._attemptCallback(k, j, l);\n            if (m) {\n                return 0\n            };\n            this._allRequests.push({\n                fn: k,\n                request: j,\n                options: l\n            });\n            var n = (this._allRequests.length - 1);\n            this._pendingIDs.push(n);\n            return n;\n        },\n        unsubscribe: function(j) {\n            delete this._allRequests[j];\n        },\n        reset: function() {\n            this._allRequests = [];\n        },\n        getRequest: function(j) {\n            return this._allRequests[j];\n        },\n        runPossibleCallbacks: function() {\n            var j = this._pendingIDs;\n            this._pendingIDs = [];\n            var k = [];\n            j.forEach(function(l) {\n                var m = this._allRequests[l];\n                if (!m) {\n                    return\n                };\n                if (this._callbackArgHandler(m.request, m.options)) {\n                    k.push(l);\n                }\n                 else this._pendingIDs.push(l);\n            ;\n            }.bind(this));\n            k.forEach(function(l) {\n                var m = this._allRequests[l];\n                delete this._allRequests[l];\n                this._attemptCallback(m.fn, m.request, m.options);\n            }.bind(this));\n        },\n        _attemptCallback: function(j, k, l) {\n            var m = this._callbackArgHandler(k, l);\n            if (m) {\n                var n = {\n                    ids: k\n                };\n                g.applyWithGuard(j, n, m);\n            }\n        ;\n            return !!m;\n        }\n    });\n    e.exports = i;\n});\n__d(\"deferred\", [], function(a, b, c, d, e, f) {\n    var g = 0, h = 1, i = 2, j = 4, k = \"callbacks\", l = \"errbacks\", m = \"cancelbacks\", n = \"completeCallbacks\", o = [], p = o.slice, q = o.unshift;\n    function r(w, x) {\n        return (w ? p.call(w, x) : o);\n    };\n    function s(w, x) {\n        return ((x < w.length) ? r(w, x) : o);\n    };\n    function t() {\n        this.$Deferred0 = g;\n    };\n    t.prototype.addCallback = function(w, x) {\n        return this.$Deferred1(h, this.$Deferred2(k), w, x, s(arguments, 2));\n    };\n    t.prototype.removeCallback = function(w, x) {\n        return this.$Deferred3(this.$Deferred2(k), w, x);\n    };\n    t.prototype.addCompleteCallback = function(w, x) {\n        return this.$Deferred1(null, this.$Deferred2(n), w, x, s(arguments, 2));\n    };\n    t.prototype.removeCompleteCallback = function(w, x) {\n        return this.$Deferred3(this.$Deferred2(n), w, x);\n    };\n    t.prototype.addErrback = function(w, x) {\n        return this.$Deferred1(i, this.$Deferred2(l), w, x, s(arguments, 2));\n    };\n    t.prototype.removeErrback = function(w, x) {\n        return this.$Deferred3(this.$Deferred2(l), w, x);\n    };\n    t.prototype.addCancelback = function(w, x) {\n        return this.$Deferred1(j, this.$Deferred2(m), w, x, s(arguments, 2));\n    };\n    t.prototype.removeCancelback = function(w, x) {\n        return this.$Deferred3(this.$Deferred2(m), w, x);\n    };\n    t.prototype.getStatus = function() {\n        return this.$Deferred0;\n    };\n    t.prototype.setStatus = function(w) {\n        var x;\n        this.$Deferred0 = w;\n        this.callbackArgs = r(arguments, 1);\n        if ((w === i)) {\n            x = l;\n        }\n         else if ((w === h)) {\n            x = k;\n        }\n         else if ((w === j)) {\n            x = m;\n        }\n        \n    ;\n        if (x) {\n            this.$Deferred4(this[x], this.callbackArgs);\n        };\n        this.$Deferred4(this[n], this.callbackArgs);\n        return this;\n    };\n    t.prototype.setTimeout = function(w) {\n        if (this.timeout) {\n            this.clearTimeout();\n        };\n        this.$Deferred5 = (this.$Deferred5 || this.fail.bind(this));\n        this.timeout = window.setTimeout(this.$Deferred5, w);\n    };\n    t.prototype.clearTimeout = function() {\n        window.clearTimeout(this.timeout);\n        delete this.timeout;\n    };\n    t.prototype.succeed = function() {\n        return this.$Deferred6(h, arguments);\n    };\n    t.prototype.fail = function() {\n        return this.$Deferred6(i, arguments);\n    };\n    t.prototype.cancel = function() {\n        delete this[k];\n        delete this[l];\n        return this.$Deferred6(j, arguments);\n    };\n    t.prototype.$Deferred6 = function(w, x) {\n        q.call(x, w);\n        return this.setStatus.apply(this, x);\n    };\n    t.prototype.$Deferred2 = function(w) {\n        return (this[w] || (this[w] = []));\n    };\n    t.prototype.then = function(w, x, y, z) {\n        var aa = new t(), w, ba, ca, da = r(arguments, 0);\n        if ((typeof da[0] === \"function\")) {\n            w = da.shift();\n        };\n        if ((typeof da[0] === \"function\")) {\n            ba = da.shift();\n        };\n        if ((typeof da[0] === \"function\")) {\n            ca = da.shift();\n        };\n        var ea = da.shift();\n        if (w) {\n            var fa = [this.$Deferred7,this,aa,\"succeed\",w,ea,].concat(da);\n            this.addCallback.apply(this, fa);\n        }\n         else this.addCallback(aa.succeed, aa);\n    ;\n        if (ba) {\n            var ga = [this.$Deferred7,this,aa,\"fail\",ba,ea,].concat(da);\n            this.addErrback.apply(this, ga);\n        }\n         else this.addErrback(aa.fail, aa);\n    ;\n        if (ca) {\n            var ha = [this.$Deferred7,this,aa,\"cancel\",ca,ea,].concat(da);\n            this.addCancelback.apply(this, ha);\n        }\n         else this.addCancelback(aa.cancel, aa);\n    ;\n        return aa;\n    };\n    t.prototype.$Deferred1 = function(w, x, y, z, aa) {\n        var ba = this.getStatus();\n        if ((((!w && (ba !== g))) || (ba === w))) {\n            y.apply((z || this), aa.concat(this.callbackArgs));\n        }\n         else x.push(y, z, aa);\n    ;\n        return this;\n    };\n    t.prototype.$Deferred3 = function(w, x, y) {\n        for (var z = 0; (z < w.length); z += 3) {\n            if (((w[z] === x) && ((!y || (w[(z + 1)] === y))))) {\n                w.splice(z, 3);\n                if (y) {\n                    break;\n                };\n                z -= 3;\n            }\n        ;\n        };\n        return this;\n    };\n    t.prototype.pipe = function(w) {\n        this.addCallback(w.succeed, w).addErrback(w.fail, w).addCancelback(w.cancel, w);\n    };\n    t.prototype.$Deferred4 = function(w, x) {\n        for (var y = 0; (y < ((w || o)).length); y += 3) {\n            w[y].apply((w[(y + 1)] || this), ((w[(y + 2)] || o)).concat(x));;\n        };\n    };\n    t.prototype.$Deferred7 = function(w, x, y, z) {\n        var aa = r(arguments, 4), ba = y.apply(z, aa);\n        if ((ba instanceof t)) {\n            ba.pipe(w);\n        }\n         else w[x](ba);\n    ;\n    };\n    var u = ((t === null) ? null : t.prototype);\n    v.prototype = Object.create(u);\n    v.prototype.constructor = v;\n    v.__superConstructor__ = t;\n    function v(w) {\n        t.call(this);\n        this.completed = 0;\n        this.list = [];\n        if (w) {\n            w.forEach(this.waitFor, this);\n            this.startWaiting();\n        }\n    ;\n    };\n    v.prototype.startWaiting = function() {\n        this.waiting = true;\n        this.checkDeferreds();\n        return this;\n    };\n    v.prototype.waitFor = function(w) {\n        this.list.push(w);\n        this.checkDeferreds();\n        w.addCompleteCallback(this.deferredComplete, this);\n        return this;\n    };\n    v.prototype.createWaitForDeferred = function() {\n        var w = new t();\n        this.waitFor(w);\n        return w;\n    };\n    v.prototype.createWaitForCallback = function() {\n        var w = this.createWaitForDeferred();\n        return w.succeed.bind(w);\n    };\n    v.prototype.deferredComplete = function() {\n        this.completed++;\n        if ((this.completed === this.list.length)) {\n            this.checkDeferreds();\n        };\n    };\n    v.prototype.checkDeferreds = function() {\n        if ((!this.waiting || (this.completed !== this.list.length))) {\n            return\n        };\n        var w = false, x = false, y = [g,];\n        for (var z = 0, aa = this.list.length; (z < aa); z++) {\n            var ba = this.list[z];\n            y.push([ba,].concat(ba.callbackArgs));\n            if ((ba.getStatus() === i)) {\n                w = true;\n            }\n             else if ((ba.getStatus() === j)) {\n                x = true;\n            }\n        ;\n        };\n        if (w) {\n            y[0] = i;\n            this.fail.apply(this, y);\n        }\n         else if (x) {\n            y[0] = j;\n            this.cancel.apply(this, y);\n        }\n         else {\n            y[0] = h;\n            this.succeed.apply(this, y);\n        }\n        \n    ;\n    };\n    f.Deferred = t;\n    f.DeferredList = v;\n    f.Deferred.toArray = r;\n    f.Deferred.STATUS_UNKNOWN = g;\n    f.Deferred.STATUS_SUCCEEDED = h;\n    f.Deferred.STATUS_CANCELED = j;\n    f.Deferred.STATUS_FAILED = i;\n});\n__d(\"KeyedCallbackManager\", [\"CallbackManagerController\",\"deferred\",\"ErrorUtils\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"CallbackManagerController\"), h = b(\"deferred\").Deferred, i = b(\"ErrorUtils\"), j = b(\"copyProperties\"), k = function() {\n        this._resources = {\n        };\n        this._controller = new g(this._constructCallbackArg.bind(this));\n    };\n    j(k.prototype, {\n        executeOrEnqueue: function(l, m) {\n            if (!((l instanceof Array))) {\n                var n = l, o = m;\n                l = [l,];\n                m = function(p) {\n                    o(p[n]);\n                };\n            }\n        ;\n            l = l.filter(function(p) {\n                var q = (((p !== null) && (p !== undefined)));\n                if (!q) {\n                    i.applyWithGuard(function() {\n                        throw new Error(((\"KeyedCallbackManager.executeOrEnqueue: key \" + JSON.stringify(p)) + \" is invalid\"));\n                    });\n                };\n                return q;\n            });\n            return this._controller.executeOrEnqueue(l, m);\n        },\n        deferredExecuteOrEnqueue: function(l) {\n            var m = new h();\n            this.executeOrEnqueue(l, m.succeed.bind(m));\n            return m;\n        },\n        unsubscribe: function(l) {\n            this._controller.unsubscribe(l);\n        },\n        reset: function() {\n            this._controller.reset();\n            this._resources = {\n            };\n        },\n        getUnavailableResources: function(l) {\n            var m = this._controller.getRequest(l), n = [];\n            if (m) {\n                n = m.request.filter(function(o) {\n                    return !this._resources[o];\n                }.bind(this));\n            };\n            return n;\n        },\n        getUnavailableResourcesFromRequest: function(l) {\n            var m = (Array.isArray(l) ? l : [l,]);\n            return m.filter(function(n) {\n                if (((n !== null) && (n !== undefined))) {\n                    return !this._resources[n]\n                };\n            }, this);\n        },\n        addResourcesAndExecute: function(l) {\n            j(this._resources, l);\n            this._controller.runPossibleCallbacks();\n        },\n        setResource: function(l, m) {\n            this._resources[l] = m;\n            this._controller.runPossibleCallbacks();\n        },\n        getResource: function(l) {\n            return this._resources[l];\n        },\n        getAllResources: function() {\n            return this._resources;\n        },\n        dumpResources: function() {\n            var l = {\n            };\n            for (var m in this._resources) {\n                var n = this._resources[m];\n                if ((typeof n === \"object\")) {\n                    n = j({\n                    }, n);\n                };\n                l[m] = n;\n            };\n            return l;\n        },\n        _constructCallbackArg: function(l) {\n            var m = {\n            };\n            for (var n = 0; (n < l.length); n++) {\n                var o = l[n], p = this._resources[o];\n                if ((typeof p == \"undefined\")) {\n                    return false\n                };\n                m[o] = p;\n            };\n            return [m,];\n        }\n    });\n    e.exports = k;\n});\n__d(\"BaseAsyncLoader\", [\"KeyedCallbackManager\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"KeyedCallbackManager\"), h = b(\"copyProperties\"), i = {\n    };\n    function j(l, m, n) {\n        var o = new g(), p = false, q = [];\n        function r() {\n            if ((!q.length || p)) {\n                return\n            };\n            p = true;\n            t.defer();\n        };\n        function s(w) {\n            p = false;\n            w.forEach(o.unsubscribe.bind(o));\n            r();\n        };\n        function t() {\n            var w = {\n            }, x = [];\n            q = q.filter(function(z) {\n                var aa = o.getUnavailableResources(z);\n                if (aa.length) {\n                    aa.forEach(function(ba) {\n                        w[ba] = true;\n                    });\n                    x.push(z);\n                    return true;\n                }\n            ;\n                return false;\n            });\n            var y = Object.keys(w);\n            if (y.length) {\n                n(l, y, x, u.curry(x), v.curry(x));\n            }\n             else p = false;\n        ;\n        };\n        function u(w, x) {\n            var y = (x.payload[m] || x.payload);\n            o.addResourcesAndExecute(y);\n            s(w);\n        };\n        function v(w) {\n            s(w);\n        };\n        return {\n            get: function(w, x) {\n                var y = o.executeOrEnqueue(w, x), z = o.getUnavailableResources(y);\n                if (z.length) {\n                    q.push(y);\n                    r();\n                }\n            ;\n            },\n            getCachedKeys: function() {\n                return Object.keys(o.getAllResources());\n            },\n            getNow: function(w) {\n                return (o.getResource(w) || null);\n            },\n            set: function(w) {\n                o.addResourcesAndExecute(w);\n            }\n        };\n    };\n    function k(l, m) {\n        throw (\"BaseAsyncLoader can't be instantiated\");\n    };\n    h(k.prototype, {\n        _getLoader: function() {\n            if (!i[this._endpoint]) {\n                i[this._endpoint] = j(this._endpoint, this._type, this.send);\n            };\n            return i[this._endpoint];\n        },\n        get: function(l, m) {\n            return this._getLoader().get(l, m);\n        },\n        getCachedKeys: function() {\n            return this._getLoader().getCachedKeys();\n        },\n        getNow: function(l) {\n            return this._getLoader().getNow(l);\n        },\n        reset: function() {\n            i[this._endpoint] = null;\n        },\n        set: function(l) {\n            this._getLoader().set(l);\n        }\n    });\n    e.exports = k;\n});\n__d(\"AjaxLoader\", [\"copyProperties\",\"FBAjaxRequest\",\"BaseAsyncLoader\",], function(a, b, c, d, e, f) {\n    var g = b(\"copyProperties\"), h = b(\"FBAjaxRequest\"), i = b(\"BaseAsyncLoader\");\n    function j(k, l) {\n        this._endpoint = k;\n        this._type = l;\n    };\n    g(j.prototype, i.prototype);\n    j.prototype.send = function(k, l, m, n, o) {\n        var p = new h(\"GET\", k, {\n            ids: l\n        });\n        p.onJSON = function(q) {\n            n({\n                payload: q.json\n            });\n        };\n        p.onError = o;\n        p.send();\n    };\n    e.exports = j;\n});\n__d(\"CLoggerX\", [\"Banzai\",\"DOM\",\"debounce\",\"Event\",\"ge\",\"Parent\",\"Keys\",], function(a, b, c, d, e, f) {\n    var g = b(\"Banzai\"), h = b(\"DOM\"), i = b(\"debounce\"), j = b(\"Event\"), k = b(\"ge\"), l = b(\"Parent\"), m = ((10 * 60) * 1000), n = b(\"Keys\").RETURN, o = {\n    }, p = function(s) {\n        var t = ((s.target || s.srcElement)).id, u = ((s.target || s.srcElement)).value.trim().length, v = q.getTracker(t);\n        if (!v) {\n            return\n        };\n        if (((u > 5) && !v.submitted)) {\n            g.post(\"censorlogger\", {\n                cl_impid: v.impid,\n                clearcounter: v.clearcounter,\n                instrument: v.type,\n                elementid: t,\n                parent_fbid: (((v.parent_fbid == \"unknown\") ? null : v.parent_fbid)),\n                version: \"x\"\n            }, g.VITAL);\n            q.setSubmitted(t, true);\n        }\n         else if ((((u === 0) && v.submitted) && (s.which != n))) {\n            o[t] = r(t);\n            o[t]();\n        }\n         else if (((u > 0) && v.submitted)) {\n            if (o[t]) {\n                o[t].reset();\n            }\n        }\n        \n    ;\n    }, q = {\n        init: function() {\n            this.trackedElements = (this.trackedElements || {\n            });\n            this.feedbackForms = (this.feedbackForms || {\n            });\n        },\n        setImpressionID: function(s) {\n            this.init();\n            this.impressionID = s;\n            this.clean();\n        },\n        setComposerTargetData: function(s) {\n            this.cTargetID = (s.targetID || \"unknown\");\n            this.cTargetFBType = (s.targetType || \"unknown\");\n        },\n        clean: function() {\n            for (var s in this.trackedElements) {\n                if (o[s]) {\n                    o[s].reset();\n                    delete o[s];\n                }\n            ;\n                delete this.trackedElements[s];\n            };\n        },\n        trackComposer: function(s, t, u) {\n            this.setComposerTargetData(u);\n            this.startTracking(s, \"composer\", this.cTargetID, this.cTargetFBType, t);\n        },\n        trackFeedbackForm: function(s, t, u) {\n            this.init();\n            this.impressionID = (this.impressionID || u);\n            var v, w, x;\n            v = h.getID(s);\n            w = (t ? (t.targetID || \"unknown\") : \"unknown\");\n            x = (t ? (t.targetType || \"unknown\") : \"unknown\");\n            this.feedbackForms[v] = {\n                parent_fbid: w,\n                parent_type: x\n            };\n        },\n        trackMentionsInput: function(s, t) {\n            this.init();\n            var u, v, w;\n            if (!s) {\n                return\n            };\n            u = l.byTag(s, \"form\");\n            if (!u) {\n                return\n            };\n            v = h.getID(u);\n            w = this.feedbackForms[v];\n            if (!w) {\n                return\n            };\n            var x = (t || w.parent_fbid), y = (t ? 416 : w.parent_type);\n            this.startTracking(s, \"comment\", x, y, u);\n        },\n        startTracking: function(s, t, u, v, w) {\n            this.init();\n            var x = h.getID(s);\n            if (this.getTracker(x)) {\n                return\n            };\n            var y = h.getID(w);\n            j.listen(s, \"keyup\", p.bind(this));\n            this.trackedElements[x] = {\n                submitted: false,\n                clearcounter: 0,\n                type: t,\n                impid: this.impressionID,\n                parent_fbid: u,\n                parent_type: v,\n                parentElID: y\n            };\n            this.addJoinTableInfoToForm(w, x);\n        },\n        getTracker: function(s) {\n            return ((this.trackedElements ? this.trackedElements[s] : null));\n        },\n        setSubmitted: function(s, t) {\n            if (this.trackedElements[s]) {\n                this.trackedElements[s].submitted = t;\n            };\n        },\n        incrementClearCounter: function(s) {\n            var t = this.getTracker(s);\n            if (!t) {\n                return\n            };\n            t.clearcounter++;\n            t.submitted = false;\n            var u = h.scry(k(t.parentElID), \"input[name=\\\"clp\\\"]\")[0];\n            if (u) {\n                u.value = this.getJSONRepForTrackerID(s);\n            };\n            this.trackedElements[s] = t;\n        },\n        addJoinTableInfoToForm: function(s, t) {\n            var u = this.getTracker(t);\n            if (!u) {\n                return\n            };\n            var v = h.scry(s, \"input[name=\\\"clp\\\"]\")[0];\n            if (!v) {\n                h.prependContent(s, h.create(\"input\", {\n                    type: \"hidden\",\n                    name: \"clp\",\n                    value: this.getJSONRepForTrackerID(t)\n                }));\n            };\n        },\n        getCLParamsForTarget: function(s, t) {\n            if (!s) {\n                return \"\"\n            };\n            var u = h.getID(s);\n            return this.getJSONRepForTrackerID(u, t);\n        },\n        getJSONRepForTrackerID: function(s, t) {\n            var u = this.getTracker(s);\n            if (!u) {\n                return \"\"\n            };\n            return JSON.stringify({\n                cl_impid: u.impid,\n                clearcounter: u.clearcounter,\n                elementid: s,\n                version: \"x\",\n                parent_fbid: (t || u.parent_fbid)\n            });\n        }\n    }, r = function(s) {\n        return i(function() {\n            q.incrementClearCounter(s);\n        }, m, q);\n    };\n    e.exports = q;\n});\n__d(\"ChannelConstants\", [], function(a, b, c, d, e, f) {\n    var g = \"channel/\", h = {\n        ON_SHUTDOWN: (g + \"shutdown\"),\n        ON_INVALID_HISTORY: (g + \"invalid_history\"),\n        ON_CONFIG: (g + \"config\"),\n        ON_ENTER_STATE: (g + \"enter_state\"),\n        ON_EXIT_STATE: (g + \"exit_state\"),\n        OK: \"ok\",\n        ERROR: \"error\",\n        ERROR_MAX: \"error_max\",\n        ERROR_MISSING: \"error_missing\",\n        ERROR_MSG_TYPE: \"error_msg_type\",\n        ERROR_SHUTDOWN: \"error_shutdown\",\n        ERROR_STALE: \"error_stale\",\n        SYS_OWNER: \"sys_owner\",\n        SYS_NONOWNER: \"sys_nonowner\",\n        SYS_ONLINE: \"sys_online\",\n        SYS_OFFLINE: \"sys_offline\",\n        SYS_TIMETRAVEL: \"sys_timetravel\",\n        HINT_AUTH: \"shutdown auth\",\n        HINT_CONN: \"shutdown conn\",\n        HINT_DISABLED: \"shutdown disabled\",\n        HINT_INVALID_STATE: \"shutdown invalid state\",\n        HINT_MAINT: \"shutdown maint\",\n        HINT_UNSUPPORTED: \"shutdown unsupported\",\n        reason_Unknown: 0,\n        reason_AsyncError: 1,\n        reason_TooLong: 2,\n        reason_Refresh: 3,\n        reason_RefreshDelay: 4,\n        reason_UIRestart: 5,\n        reason_NeedSeq: 6,\n        reason_PrevFailed: 7,\n        reason_IFrameLoadGiveUp: 8,\n        reason_IFrameLoadRetry: 9,\n        reason_IFrameLoadRetryWorked: 10,\n        reason_PageTransitionRetry: 11,\n        reason_IFrameLoadMaxSubdomain: 12,\n        reason_NoChannelInfo: 13,\n        reason_NoChannelHost: 14,\n        CAPABILITY_VOIP: 8,\n        getArbiterType: function(i) {\n            return ((g + \"message:\") + i);\n        }\n    };\n    e.exports = h;\n});\n__d(\"ShortProfiles\", [\"ArbiterMixin\",\"AjaxLoader\",\"Env\",\"FBAjaxRequest\",\"JSLogger\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"ArbiterMixin\"), h = b(\"AjaxLoader\"), i = b(\"Env\"), j = b(\"FBAjaxRequest\"), k = b(\"JSLogger\"), l = b(\"copyProperties\"), m = \"/ajax/chat/user_info.php\", n = \"/ajax/chat/user_info_all.php\", o = new h(m, \"profiles\"), p = false, q = k.create(\"short_profiles\");\n    function r() {\n        if (!p) {\n            q.log(\"fetch_all\");\n            p = true;\n            var u = new j(\"GET\", n, {\n                viewer: i.user\n            });\n            u.onJSON = function(v) {\n                o.set(v.json);\n                t.inform(\"updated\");\n            };\n            u.send();\n        }\n    ;\n    };\n    function s(u) {\n        return JSON.parse(JSON.stringify(u));\n    };\n    var t = {\n    };\n    l(t, g, {\n        get: function(u, v) {\n            this.getMulti([u,], function(w) {\n                v(w[u], u);\n            });\n        },\n        getMulti: function(u, v) {\n            function w(x) {\n                v(s(x));\n            };\n            o.get(u, w);\n        },\n        getNow: function(u) {\n            return s((o.getNow(u) || null));\n        },\n        getNowUnsafe: function(u) {\n            return (o.getNow(u) || null);\n        },\n        getCachedProfileIDs: function() {\n            return o.getCachedKeys();\n        },\n        hasAll: function() {\n            return p;\n        },\n        fetchAll: function() {\n            r();\n        },\n        set: function(u, v) {\n            var w = {\n            };\n            w[u] = v;\n            this.setMulti(w);\n        },\n        setMulti: function(u) {\n            o.set(s(u));\n        }\n    });\n    e.exports = t;\n});\n__d(\"ClickTTIIdentifiers\", [], function(a, b, c, d, e, f) {\n    var g = {\n        types: {\n            TIMELINE_SEE_LIKERS: \"timeline:seelikes\"\n        },\n        getUserActionID: function(h) {\n            return ((\"{\\\"ua_id\\\":\\\"\" + h) + \"\\\"}\");\n        }\n    };\n    e.exports = g;\n});\n__d(\"ReactCurrentOwner\", [], function(a, b, c, d, e, f) {\n    var g = {\n        current: null\n    };\n    e.exports = g;\n});\n__d(\"CSSProperty\", [], function(a, b, c, d, e, f) {\n    var g = {\n        fillOpacity: true,\n        fontWeight: true,\n        opacity: true,\n        orphans: true,\n        zIndex: true,\n        zoom: true\n    }, h = {\n        background: {\n            backgroundImage: true,\n            backgroundPosition: true,\n            backgroundRepeat: true,\n            backgroundColor: true\n        },\n        border: {\n            borderWidth: true,\n            borderStyle: true,\n            borderColor: true\n        },\n        borderBottom: {\n            borderBottomWidth: true,\n            borderBottomStyle: true,\n            borderBottomColor: true\n        },\n        borderLeft: {\n            borderLeftWidth: true,\n            borderLeftStyle: true,\n            borderLeftColor: true\n        },\n        borderRight: {\n            borderRightWidth: true,\n            borderRightStyle: true,\n            borderRightColor: true\n        },\n        borderTop: {\n            borderTopWidth: true,\n            borderTopStyle: true,\n            borderTopColor: true\n        },\n        font: {\n            fontStyle: true,\n            fontVariant: true,\n            fontWeight: true,\n            fontSize: true,\n            lineHeight: true,\n            fontFamily: true\n        }\n    }, i = {\n        isUnitlessNumber: g,\n        shorthandPropertyExpansions: h\n    };\n    e.exports = i;\n});\n__d(\"dangerousStyleValue\", [\"CSSProperty\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSSProperty\");\n    function h(i, j) {\n        var k = (((j == null) || (typeof j === \"boolean\")) || (j === \"\"));\n        if (k) {\n            return \"\"\n        };\n        var l = isNaN(j);\n        if (((l || (j === 0)) || g.isUnitlessNumber[i])) {\n            return (\"\" + j)\n        };\n        return (j + \"px\");\n    };\n    e.exports = h;\n});\n__d(\"throwIf\", [], function(a, b, c, d, e, f) {\n    var g = function(h, i) {\n        if (h) {\n            throw new Error(i)\n        };\n    };\n    e.exports = g;\n});\n__d(\"escapeTextForBrowser\", [\"throwIf\",], function(a, b, c, d, e, f) {\n    var g = b(\"throwIf\"), h, i = {\n        \"&\": \"&amp;\",\n        \"\\u003E\": \"&gt;\",\n        \"\\u003C\": \"&lt;\",\n        \"\\\"\": \"&quot;\",\n        \"'\": \"&#x27;\",\n        \"/\": \"&#x2f;\"\n    };\n    function j(l) {\n        return i[l];\n    };\n    var k = function(l) {\n        var m = typeof l, n = (m === \"object\");\n        if (((l === \"\") || n)) {\n            return \"\";\n        }\n         else if ((m === \"string\")) {\n            return l.replace(/[&><\"'\\/]/g, j);\n        }\n         else return ((\"\" + l)).replace(/[&><\"'\\/]/g, j)\n        \n    ;\n    };\n    e.exports = k;\n});\n__d(\"memoizeStringOnly\", [], function(a, b, c, d, e, f) {\n    function g(h) {\n        var i = {\n        };\n        return function(j) {\n            if (i.hasOwnProperty(j)) {\n                return i[j];\n            }\n             else return i[j] = h.call(this, j)\n        ;\n        };\n    };\n    e.exports = g;\n});\n__d(\"CSSPropertyOperations\", [\"CSSProperty\",\"dangerousStyleValue\",\"escapeTextForBrowser\",\"hyphenate\",\"memoizeStringOnly\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSSProperty\"), h = b(\"dangerousStyleValue\"), i = b(\"escapeTextForBrowser\"), j = b(\"hyphenate\"), k = b(\"memoizeStringOnly\"), l = k(function(n) {\n        return i(j(n));\n    }), m = {\n        createMarkupForStyles: function(n) {\n            var o = \"\";\n            for (var p in n) {\n                if (!n.hasOwnProperty(p)) {\n                    continue;\n                };\n                var q = n[p];\n                if ((q != null)) {\n                    o += (l(p) + \":\");\n                    o += (h(p, q) + \";\");\n                }\n            ;\n            };\n            return (o || null);\n        },\n        setValueForStyles: function(n, o) {\n            var p = n.style;\n            for (var q in o) {\n                if (!o.hasOwnProperty(q)) {\n                    continue;\n                };\n                var r = h(q, o[q]);\n                if (r) {\n                    p[q] = r;\n                }\n                 else {\n                    var s = g.shorthandPropertyExpansions[q];\n                    if (s) {\n                        for (var t in s) {\n                            p[t] = \"\";;\n                        };\n                    }\n                     else p[q] = \"\";\n                ;\n                }\n            ;\n            };\n        }\n    };\n    e.exports = m;\n});\n__d(\"ExecutionEnvironment\", [], function(a, b, c, d, e, f) {\n    var g = (typeof window !== \"undefined\"), h = {\n        canUseDOM: g,\n        canUseWorkers: (typeof Worker !== \"undefined\"),\n        isInWorker: !g,\n        global: new Function(\"return this;\")()\n    };\n    e.exports = h;\n});\n__d(\"Danger\", [\"ExecutionEnvironment\",\"throwIf\",], function(a, b, c, d, e, f) {\n    var g = b(\"ExecutionEnvironment\"), h = b(\"throwIf\"), i, j, k, l, m = {\n    };\n    function n(t) {\n        var u = t.tagName;\n        return (m[u] || (m[u] = document.createElement(u)));\n    };\n    function o(t, u, v) {\n        if (v) {\n            if (v.nextSibling) {\n                return t.insertBefore(u, v.nextSibling);\n            }\n             else return t.appendChild(u)\n        ;\n        }\n         else return t.insertBefore(u, t.firstChild)\n    ;\n    };\n    function p(t, u, v) {\n        var w, x = u.length;\n        for (var y = 0; (y < x); y++) {\n            w = o(t, u[0], (w || v));;\n        };\n    };\n    function q(t, u, v) {\n        var w = n(t);\n        w.innerHTML = u;\n        var x = w.childNodes, y = (v ? t.childNodes[(v - 1)] : null);\n        p(t, x, y);\n    };\n    function r(t, u) {\n        var v = t.parentNode, w = n(v);\n        w.innerHTML = u;\n        var x = w.childNodes;\n        v.replaceChild(x[0], t);\n    };\n    var s = {\n        dangerouslyInsertMarkupAt: q,\n        dangerouslyReplaceNodeWithMarkup: r\n    };\n    e.exports = s;\n});\n__d(\"insertNodeAt\", [], function(a, b, c, d, e, f) {\n    function g(h, i, j) {\n        var k = h.childNodes, l = h.childNodes[j];\n        if ((l === i)) {\n            return i\n        };\n        if (i.parentNode) {\n            i.parentNode.removeChild(i);\n        };\n        if ((j >= k.length)) {\n            h.appendChild(i);\n        }\n         else h.insertBefore(i, k[j]);\n    ;\n        return i;\n    };\n    e.exports = g;\n});\n__d(\"keyOf\", [], function(a, b, c, d, e, f) {\n    var g = function(h) {\n        var i;\n        for (i in h) {\n            if (!h.hasOwnProperty(i)) {\n                continue;\n            };\n            return i;\n        };\n        return null;\n    };\n    e.exports = g;\n});\n__d(\"DOMChildrenOperations\", [\"Danger\",\"insertNodeAt\",\"keyOf\",\"throwIf\",], function(a, b, c, d, e, f) {\n    var g = b(\"Danger\"), h = b(\"insertNodeAt\"), i = b(\"keyOf\"), j = b(\"throwIf\"), k, l = i({\n        moveFrom: null\n    }), m = i({\n        insertMarkup: null\n    }), n = i({\n        removeAt: null\n    }), o = function(u, v) {\n        var w, x, y;\n        for (var z = 0; (z < v.length); z++) {\n            x = v[z];\n            if ((l in x)) {\n                w = (w || []);\n                y = x.moveFrom;\n                w[y] = u.childNodes[y];\n            }\n             else if ((n in x)) {\n                w = (w || []);\n                y = x.removeAt;\n                w[y] = u.childNodes[y];\n            }\n            \n        ;\n        };\n        return w;\n    }, p = function(u, v) {\n        for (var w = 0; (w < v.length); w++) {\n            var x = v[w];\n            if (x) {\n                u.removeChild(v[w]);\n            };\n        };\n    }, q = function(u, v, w) {\n        var x, y, z = -1, aa;\n        for (var ba = 0; (ba < v.length); ba++) {\n            aa = v[ba];\n            if ((l in aa)) {\n                x = w[aa.moveFrom];\n                y = aa.finalIndex;\n                h(u, x, y);\n            }\n             else if (!((n in aa))) {\n                if ((m in aa)) {\n                    y = aa.finalIndex;\n                    var ca = aa.insertMarkup;\n                    g.dangerouslyInsertMarkupAt(u, ca, y);\n                }\n            \n            }\n        ;\n        };\n    }, r = function(u, v) {\n        var w = o(u, v);\n        if (w) {\n            p(u, w);\n        };\n        q(u, v, w);\n    }, s = function(u, v, w) {\n        u.childNodes[v].nodeValue = w;\n    }, t = {\n        dangerouslyReplaceNodeWithMarkup: g.dangerouslyReplaceNodeWithMarkup,\n        manageChildren: r,\n        setTextNodeValueAtIndex: s\n    };\n    e.exports = t;\n});\n__d(\"DOMProperty\", [\"invariant\",], function(a, b, c, d, e, f) {\n    var g = b(\"invariant\"), h = {\n        MUST_USE_ATTRIBUTE: 1,\n        MUST_USE_PROPERTY: 2,\n        HAS_BOOLEAN_VALUE: 4,\n        HAS_SIDE_EFFECTS: 8,\n        injectDOMPropertyConfig: function(k) {\n            var l = (k.Properties || {\n            }), m = (k.DOMAttributeNames || {\n            }), n = (k.DOMPropertyNames || {\n            }), o = (k.DOMMutationMethods || {\n            });\n            if (k.isCustomAttribute) {\n                j._isCustomAttributeFunctions.push(k.isCustomAttribute);\n            };\n            for (var p in l) {\n                g(!j.isStandardName[p]);\n                j.isStandardName[p] = true;\n                j.getAttributeName[p] = (m[p] || p.toLowerCase());\n                j.getPropertyName[p] = (n[p] || p);\n                var q = o[p];\n                if (q) {\n                    j.getMutationMethod[p] = q;\n                };\n                var r = l[p];\n                j.mustUseAttribute[p] = (r & h.MUST_USE_ATTRIBUTE);\n                j.mustUseProperty[p] = (r & h.MUST_USE_PROPERTY);\n                j.hasBooleanValue[p] = (r & h.HAS_BOOLEAN_VALUE);\n                j.hasSideEffects[p] = (r & h.HAS_SIDE_EFFECTS);\n                g((!j.mustUseAttribute[p] || !j.mustUseProperty[p]));\n                g((j.mustUseProperty[p] || !j.hasSideEffects[p]));\n            };\n        }\n    }, i = {\n    }, j = {\n        isStandardName: {\n        },\n        getAttributeName: {\n        },\n        getPropertyName: {\n        },\n        getMutationMethod: {\n        },\n        mustUseAttribute: {\n        },\n        mustUseProperty: {\n        },\n        hasBooleanValue: {\n        },\n        hasSideEffects: {\n        },\n        _isCustomAttributeFunctions: [],\n        isCustomAttribute: function(k) {\n            return j._isCustomAttributeFunctions.some(function(l) {\n                return l.call(null, k);\n            });\n        },\n        getDefaultValueForProperty: function(k, l) {\n            var m = i[k], n;\n            if (!m) {\n                i[k] = m = {\n                };\n            };\n            if (!((l in m))) {\n                n = document.createElement(k);\n                m[l] = n[l];\n            }\n        ;\n            return m[l];\n        },\n        injection: h\n    };\n    e.exports = j;\n});\n__d(\"DOMPropertyOperations\", [\"DOMProperty\",\"escapeTextForBrowser\",\"memoizeStringOnly\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOMProperty\"), h = b(\"escapeTextForBrowser\"), i = b(\"memoizeStringOnly\"), j = i(function(l) {\n        return (h(l) + \"=\\\"\");\n    }), k = {\n        createMarkupForProperty: function(l, m) {\n            if (g.isStandardName[l]) {\n                if (((m == null) || (g.hasBooleanValue[l] && !m))) {\n                    return \"\"\n                };\n                var n = g.getAttributeName[l];\n                return ((j(n) + h(m)) + \"\\\"\");\n            }\n             else if (g.isCustomAttribute(l)) {\n                if ((m == null)) {\n                    return \"\"\n                };\n                return ((j(l) + h(m)) + \"\\\"\");\n            }\n             else return null\n            \n        ;\n        },\n        setValueForProperty: function(l, m, n) {\n            if (g.isStandardName[m]) {\n                var o = g.getMutationMethod[m];\n                if (o) {\n                    o(l, n);\n                }\n                 else if (g.mustUseAttribute[m]) {\n                    if ((g.hasBooleanValue[m] && !n)) {\n                        l.removeAttribute(g.getAttributeName[m]);\n                    }\n                     else l.setAttribute(g.getAttributeName[m], n);\n                ;\n                }\n                 else {\n                    var p = g.getPropertyName[m];\n                    if ((!g.hasSideEffects[m] || (l[p] !== n))) {\n                        l[p] = n;\n                    };\n                }\n                \n            ;\n            }\n             else if (g.isCustomAttribute(m)) {\n                l.setAttribute(m, n);\n            }\n        ;\n        },\n        deleteValueForProperty: function(l, m) {\n            if (g.isStandardName[m]) {\n                var n = g.getMutationMethod[m];\n                if (n) {\n                    n(l, undefined);\n                }\n                 else if (g.mustUseAttribute[m]) {\n                    l.removeAttribute(g.getAttributeName[m]);\n                }\n                 else {\n                    var o = g.getPropertyName[m];\n                    l[o] = g.getDefaultValueForProperty(l.nodeName, m);\n                }\n                \n            ;\n            }\n             else if (g.isCustomAttribute(m)) {\n                l.removeAttribute(m);\n            }\n        ;\n        }\n    };\n    e.exports = k;\n});\n__d(\"keyMirror\", [\"throwIf\",], function(a, b, c, d, e, f) {\n    var g = b(\"throwIf\"), h = \"NOT_OBJECT_ERROR\", i = function(j) {\n        var k = {\n        }, l;\n        g((!((j instanceof Object)) || Array.isArray(j)), h);\n        for (l in j) {\n            if (!j.hasOwnProperty(l)) {\n                continue;\n            };\n            k[l] = l;\n        };\n        return k;\n    };\n    e.exports = i;\n});\n__d(\"EventConstants\", [\"keyMirror\",], function(a, b, c, d, e, f) {\n    var g = b(\"keyMirror\"), h = g({\n        bubbled: null,\n        captured: null\n    }), i = g({\n        topBlur: null,\n        topChange: null,\n        topClick: null,\n        topDOMCharacterDataModified: null,\n        topDoubleClick: null,\n        topDrag: null,\n        topDragEnd: null,\n        topDragEnter: null,\n        topDragExit: null,\n        topDragLeave: null,\n        topDragOver: null,\n        topDragStart: null,\n        topDrop: null,\n        topFocus: null,\n        topInput: null,\n        topKeyDown: null,\n        topKeyPress: null,\n        topKeyUp: null,\n        topMouseDown: null,\n        topMouseMove: null,\n        topMouseOut: null,\n        topMouseOver: null,\n        topMouseUp: null,\n        topScroll: null,\n        topSelectionChange: null,\n        topSubmit: null,\n        topTouchCancel: null,\n        topTouchEnd: null,\n        topTouchMove: null,\n        topTouchStart: null,\n        topWheel: null\n    }), j = {\n        topLevelTypes: i,\n        PropagationPhases: h\n    };\n    e.exports = j;\n});\n__d(\"EventListener\", [\"Event\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = {\n        listen: g.listen,\n        capture: function(i, j, k) {\n            if (!i.addEventListener) {\n                return;\n            }\n             else i.addEventListener(j, k, true);\n        ;\n        }\n    };\n    e.exports = h;\n});\n__d(\"CallbackRegistry\", [], function(a, b, c, d, e, f) {\n    var g = {\n    }, h = {\n        putListener: function(i, j, k) {\n            var l = (g[j] || (g[j] = {\n            }));\n            l[i] = k;\n        },\n        getListener: function(i, j) {\n            var k = g[j];\n            return (k && k[i]);\n        },\n        deleteListener: function(i, j) {\n            var k = g[j];\n            if (k) {\n                delete k[i];\n            };\n        },\n        deleteAllListeners: function(i) {\n            for (var j in g) {\n                delete g[j][i];;\n            };\n        },\n        __purge: function() {\n            g = {\n            };\n        }\n    };\n    e.exports = h;\n});\n__d(\"EventPluginRegistry\", [\"invariant\",], function(a, b, c, d, e, f) {\n    var g = b(\"invariant\"), h = null, i = {\n    };\n    function j() {\n        if (!h) {\n            return\n        };\n        for (var n in i) {\n            var o = i[n], p = h.indexOf(n);\n            g((p > -1));\n            if (m.plugins[p]) {\n                continue;\n            };\n            g(o.extractEvents);\n            m.plugins[p] = o;\n            var q = o.eventTypes;\n            for (var r in q) {\n                g(k(q[r], o));;\n            };\n        };\n    };\n    function k(n, o) {\n        var p = n.phasedRegistrationNames;\n        if (p) {\n            for (var q in p) {\n                if (p.hasOwnProperty(q)) {\n                    var r = p[q];\n                    l(r, o);\n                }\n            ;\n            };\n            return true;\n        }\n         else if (n.registrationName) {\n            l(n.registrationName, o);\n            return true;\n        }\n        \n    ;\n        return false;\n    };\n    function l(n, o) {\n        g(!m.registrationNames[n]);\n        m.registrationNames[n] = o;\n        m.registrationNamesKeys.push(n);\n    };\n    var m = {\n        plugins: [],\n        registrationNames: {\n        },\n        registrationNamesKeys: [],\n        injectEventPluginOrder: function(n) {\n            g(!h);\n            h = Array.prototype.slice.call(n);\n            j();\n        },\n        injectEventPluginsByName: function(n) {\n            var o = false;\n            for (var p in n) {\n                if (!n.hasOwnProperty(p)) {\n                    continue;\n                };\n                var q = n[p];\n                if ((i[p] !== q)) {\n                    g(!i[p]);\n                    i[p] = q;\n                    o = true;\n                }\n            ;\n            };\n            if (o) {\n                j();\n            };\n        },\n        getPluginModuleForEvent: function(event) {\n            var n = event.dispatchConfig;\n            if (n.registrationName) {\n                return (m.registrationNames[n.registrationName] || null)\n            };\n            for (var o in n.phasedRegistrationNames) {\n                if (!n.phasedRegistrationNames.hasOwnProperty(o)) {\n                    continue;\n                };\n                var p = m.registrationNames[n.phasedRegistrationNames[o]];\n                if (p) {\n                    return p\n                };\n            };\n            return null;\n        },\n        _resetEventPlugins: function() {\n            h = null;\n            for (var n in i) {\n                if (i.hasOwnProperty(n)) {\n                    delete i[n];\n                };\n            };\n            m.plugins.length = 0;\n            var o = m.registrationNames;\n            for (var p in o) {\n                if (o.hasOwnProperty(p)) {\n                    delete o[p];\n                };\n            };\n            m.registrationNamesKeys.length = 0;\n        }\n    };\n    e.exports = m;\n});\n__d(\"EventPluginUtils\", [\"EventConstants\",\"invariant\",], function(a, b, c, d, e, f) {\n    var g = b(\"EventConstants\"), h = b(\"invariant\"), i = g.topLevelTypes;\n    function j(u) {\n        return (((u === i.topMouseUp) || (u === i.topTouchEnd)) || (u === i.topTouchCancel));\n    };\n    function k(u) {\n        return ((u === i.topMouseMove) || (u === i.topTouchMove));\n    };\n    function l(u) {\n        return ((u === i.topMouseDown) || (u === i.topTouchStart));\n    };\n    var m;\n    function n(event, u) {\n        var v = event._dispatchListeners, w = event._dispatchIDs;\n        if (Array.isArray(v)) {\n            for (var x = 0; (x < v.length); x++) {\n                if (event.isPropagationStopped()) {\n                    break;\n                };\n                u(event, v[x], w[x]);\n            };\n        }\n         else if (v) {\n            u(event, v, w);\n        }\n    ;\n    };\n    function o(event, u, v) {\n        u(event, v);\n    };\n    function p(event, u) {\n        n(event, u);\n        event._dispatchListeners = null;\n        event._dispatchIDs = null;\n    };\n    function q(event) {\n        var u = event._dispatchListeners, v = event._dispatchIDs;\n        if (Array.isArray(u)) {\n            for (var w = 0; (w < u.length); w++) {\n                if (event.isPropagationStopped()) {\n                    break;\n                };\n                if (u[w](event, v[w])) {\n                    return v[w]\n                };\n            };\n        }\n         else if (u) {\n            if (u(event, v)) {\n                return v\n            }\n        }\n    ;\n        return null;\n    };\n    function r(event) {\n        var u = event._dispatchListeners, v = event._dispatchIDs;\n        h(!Array.isArray(u));\n        var w = (u ? u(event, v) : null);\n        event._dispatchListeners = null;\n        event._dispatchIDs = null;\n        return w;\n    };\n    function s(event) {\n        return !!event._dispatchListeners;\n    };\n    var t = {\n        isEndish: j,\n        isMoveish: k,\n        isStartish: l,\n        executeDispatchesInOrder: p,\n        executeDispatchesInOrderStopAtTrue: q,\n        executeDirectDispatch: r,\n        hasDispatches: s,\n        executeDispatch: o\n    };\n    e.exports = t;\n});\n__d(\"accumulate\", [\"throwIf\",], function(a, b, c, d, e, f) {\n    var g = b(\"throwIf\"), h = \"INVALID_ACCUM_ARGS\";\n    function i(j, k) {\n        var l = (j == null), m = (k === null);\n        if (m) {\n            return j;\n        }\n         else if (l) {\n            return k;\n        }\n         else {\n            var n = Array.isArray(j), o = Array.isArray(k);\n            if (n) {\n                return j.concat(k);\n            }\n             else if (o) {\n                return [j,].concat(k);\n            }\n             else return [j,k,]\n            \n        ;\n        }\n        \n    ;\n    };\n    e.exports = i;\n});\n__d(\"forEachAccumulated\", [], function(a, b, c, d, e, f) {\n    var g = function(h, i, j) {\n        if (Array.isArray(h)) {\n            h.forEach(i, j);\n        }\n         else if (h) {\n            i.call(j, h);\n        }\n    ;\n    };\n    e.exports = g;\n});\n__d(\"EventPropagators\", [\"CallbackRegistry\",\"EventConstants\",\"accumulate\",\"forEachAccumulated\",], function(a, b, c, d, e, f) {\n    var g = b(\"CallbackRegistry\"), h = b(\"EventConstants\"), i = b(\"accumulate\"), j = b(\"forEachAccumulated\"), k = g.getListener, l = h.PropagationPhases, m = {\n        InstanceHandle: null,\n        injectInstanceHandle: function(w) {\n            m.InstanceHandle = w;\n        },\n        validate: function() {\n            var w = ((!m.InstanceHandle || !m.InstanceHandle.traverseTwoPhase) || !m.InstanceHandle.traverseEnterLeave);\n            if (w) {\n                throw new Error(\"InstanceHandle not injected before use!\")\n            };\n        }\n    };\n    function n(w, event, x) {\n        var y = event.dispatchConfig.phasedRegistrationNames[x];\n        return k(w, y);\n    };\n    function o(w, x, event) {\n        var y = (x ? l.bubbled : l.captured), z = n(w, event, y);\n        if (z) {\n            event._dispatchListeners = i(event._dispatchListeners, z);\n            event._dispatchIDs = i(event._dispatchIDs, w);\n        }\n    ;\n    };\n    function p(event) {\n        if ((event && event.dispatchConfig.phasedRegistrationNames)) {\n            m.InstanceHandle.traverseTwoPhase(event.dispatchMarker, o, event);\n        };\n    };\n    function q(w, x, event) {\n        if ((event && event.dispatchConfig.registrationName)) {\n            var y = event.dispatchConfig.registrationName, z = k(w, y);\n            if (z) {\n                event._dispatchListeners = i(event._dispatchListeners, z);\n                event._dispatchIDs = i(event._dispatchIDs, w);\n            }\n        ;\n        }\n    ;\n    };\n    function r(event) {\n        if ((event && event.dispatchConfig.registrationName)) {\n            q(event.dispatchMarker, null, event);\n        };\n    };\n    function s(w) {\n        j(w, p);\n    };\n    function t(w, x, y, z) {\n        m.InstanceHandle.traverseEnterLeave(y, z, q, w, x);\n    };\n    function u(w) {\n        j(w, r);\n    };\n    var v = {\n        accumulateTwoPhaseDispatches: s,\n        accumulateDirectDispatches: u,\n        accumulateEnterLeaveDispatches: t,\n        injection: m\n    };\n    e.exports = v;\n});\n__d(\"EventPluginHub\", [\"CallbackRegistry\",\"EventPluginRegistry\",\"EventPluginUtils\",\"EventPropagators\",\"ExecutionEnvironment\",\"accumulate\",\"forEachAccumulated\",\"invariant\",], function(a, b, c, d, e, f) {\n    var g = b(\"CallbackRegistry\"), h = b(\"EventPluginRegistry\"), i = b(\"EventPluginUtils\"), j = b(\"EventPropagators\"), k = b(\"ExecutionEnvironment\"), l = b(\"accumulate\"), m = b(\"forEachAccumulated\"), n = b(\"invariant\"), o = null, p = function(event) {\n        if (event) {\n            var r = i.executeDispatch, s = h.getPluginModuleForEvent(event);\n            if ((s && s.executeDispatch)) {\n                r = s.executeDispatch;\n            };\n            i.executeDispatchesInOrder(event, r);\n            if (!event.isPersistent()) {\n                event.constructor.release(event);\n            };\n        }\n    ;\n    }, q = {\n        injection: {\n            injectInstanceHandle: j.injection.injectInstanceHandle,\n            injectEventPluginOrder: h.injectEventPluginOrder,\n            injectEventPluginsByName: h.injectEventPluginsByName\n        },\n        registrationNames: h.registrationNames,\n        putListener: g.putListener,\n        getListener: g.getListener,\n        deleteListener: g.deleteListener,\n        deleteAllListeners: g.deleteAllListeners,\n        extractEvents: function(r, s, t, u) {\n            var v, w = h.plugins;\n            for (var x = 0, y = w.length; (x < y); x++) {\n                var z = w[x];\n                if (z) {\n                    var aa = z.extractEvents(r, s, t, u);\n                    if (aa) {\n                        v = l(v, aa);\n                    };\n                }\n            ;\n            };\n            return v;\n        },\n        enqueueEvents: function(r) {\n            if (r) {\n                o = l(o, r);\n            };\n        },\n        processEventQueue: function() {\n            var r = o;\n            o = null;\n            m(r, p);\n            n(!o);\n        }\n    };\n    if (k.canUseDOM) {\n        window.EventPluginHub = q;\n    };\n    e.exports = q;\n});\n__d(\"ReactUpdates\", [\"invariant\",], function(a, b, c, d, e, f) {\n    var g = b(\"invariant\"), h = false, i = [];\n    function j(m) {\n        if (h) {\n            m();\n            return;\n        }\n    ;\n        h = true;\n        try {\n            m();\n            for (var o = 0; (o < i.length); o++) {\n                var p = i[o];\n                if (p.isMounted()) {\n                    var q = p._pendingCallbacks;\n                    p._pendingCallbacks = null;\n                    p.performUpdateIfNecessary();\n                    if (q) {\n                        for (var r = 0; (r < q.length); r++) {\n                            q[r]();;\n                        }\n                    };\n                }\n            ;\n            };\n        } catch (n) {\n            throw n;\n        } finally {\n            i.length = 0;\n            h = false;\n        };\n    };\n    function k(m, n) {\n        g((!n || (typeof n === \"function\")));\n        if (!h) {\n            m.performUpdateIfNecessary();\n            (n && n());\n            return;\n        }\n    ;\n        i.push(m);\n        if (n) {\n            if (m._pendingCallbacks) {\n                m._pendingCallbacks.push(n);\n            }\n             else m._pendingCallbacks = [n,];\n        \n        };\n    };\n    var l = {\n        batchedUpdates: j,\n        enqueueUpdate: k\n    };\n    e.exports = l;\n});\n__d(\"ViewportMetrics\", [], function(a, b, c, d, e, f) {\n    var g = {\n        currentScrollLeft: 0,\n        currentScrollTop: 0,\n        refreshScrollValues: function() {\n            g.currentScrollLeft = (document.body.scrollLeft + document.documentElement.scrollLeft);\n            g.currentScrollTop = (document.body.scrollTop + document.documentElement.scrollTop);\n        }\n    };\n    e.exports = g;\n});\n__d(\"isEventSupported\", [\"ExecutionEnvironment\",], function(a, b, c, d, e, f) {\n    var g = b(\"ExecutionEnvironment\"), h, i;\n    if (g.canUseDOM) {\n        h = document.createElement(\"div\");\n        i = ((document.implementation && document.implementation.hasFeature) && (document.implementation.hasFeature(\"\", \"\") !== true));\n    }\n;\n    function j(k, l) {\n        if ((!h || ((l && !h.addEventListener)))) {\n            return false\n        };\n        var m = document.createElement(\"div\"), n = (\"on\" + k), o = (n in m);\n        if (!o) {\n            m.setAttribute(n, \"\");\n            o = (typeof m[n] === \"function\");\n            if ((typeof m[n] !== \"undefined\")) {\n                m[n] = undefined;\n            };\n            m.removeAttribute(n);\n        }\n    ;\n        if (((!o && i) && (k === \"wheel\"))) {\n            o = document.implementation.hasFeature(\"Events.wheel\", \"3.0\");\n        };\n        m = null;\n        return o;\n    };\n    e.exports = j;\n});\n__d(\"ReactEventEmitter\", [\"EventConstants\",\"EventListener\",\"EventPluginHub\",\"ExecutionEnvironment\",\"ReactUpdates\",\"ViewportMetrics\",\"invariant\",\"isEventSupported\",], function(a, b, c, d, e, f) {\n    var g = b(\"EventConstants\"), h = b(\"EventListener\"), i = b(\"EventPluginHub\"), j = b(\"ExecutionEnvironment\"), k = b(\"ReactUpdates\"), l = b(\"ViewportMetrics\"), m = b(\"invariant\"), n = b(\"isEventSupported\"), o = false;\n    function p(u, v, w) {\n        h.listen(w, v, t.TopLevelCallbackCreator.createTopLevelCallback(u));\n    };\n    function q(u, v, w) {\n        h.capture(w, v, t.TopLevelCallbackCreator.createTopLevelCallback(u));\n    };\n    function r() {\n        var u = l.refreshScrollValues;\n        h.listen(window, \"scroll\", u);\n        h.listen(window, \"resize\", u);\n    };\n    function s(u) {\n        m(!o);\n        var v = g.topLevelTypes, w = document;\n        r();\n        p(v.topMouseOver, \"mouseover\", w);\n        p(v.topMouseDown, \"mousedown\", w);\n        p(v.topMouseUp, \"mouseup\", w);\n        p(v.topMouseMove, \"mousemove\", w);\n        p(v.topMouseOut, \"mouseout\", w);\n        p(v.topClick, \"click\", w);\n        p(v.topDoubleClick, \"dblclick\", w);\n        if (u) {\n            p(v.topTouchStart, \"touchstart\", w);\n            p(v.topTouchEnd, \"touchend\", w);\n            p(v.topTouchMove, \"touchmove\", w);\n            p(v.topTouchCancel, \"touchcancel\", w);\n        }\n    ;\n        p(v.topKeyUp, \"keyup\", w);\n        p(v.topKeyPress, \"keypress\", w);\n        p(v.topKeyDown, \"keydown\", w);\n        p(v.topInput, \"input\", w);\n        p(v.topChange, \"change\", w);\n        p(v.topSelectionChange, \"selectionchange\", w);\n        p(v.topDOMCharacterDataModified, \"DOMCharacterDataModified\", w);\n        if (n(\"drag\")) {\n            p(v.topDrag, \"drag\", w);\n            p(v.topDragEnd, \"dragend\", w);\n            p(v.topDragEnter, \"dragenter\", w);\n            p(v.topDragExit, \"dragexit\", w);\n            p(v.topDragLeave, \"dragleave\", w);\n            p(v.topDragOver, \"dragover\", w);\n            p(v.topDragStart, \"dragstart\", w);\n            p(v.topDrop, \"drop\", w);\n        }\n    ;\n        if (n(\"wheel\")) {\n            p(v.topWheel, \"wheel\", w);\n        }\n         else if (n(\"mousewheel\")) {\n            p(v.topWheel, \"mousewheel\", w);\n        }\n         else p(v.topWheel, \"DOMMouseScroll\", w);\n        \n    ;\n        if (n(\"scroll\", true)) {\n            q(v.topScroll, \"scroll\", w);\n        }\n         else p(v.topScroll, \"scroll\", window);\n    ;\n        if (n(\"focus\", true)) {\n            q(v.topFocus, \"focus\", w);\n            q(v.topBlur, \"blur\", w);\n        }\n         else if (n(\"focusin\")) {\n            p(v.topFocus, \"focusin\", w);\n            p(v.topBlur, \"focusout\", w);\n        }\n        \n    ;\n    };\n    var t = {\n        TopLevelCallbackCreator: null,\n        ensureListening: function(u, v) {\n            m(j.canUseDOM);\n            if (!o) {\n                t.TopLevelCallbackCreator = v;\n                s(u);\n                o = true;\n            }\n        ;\n        },\n        setEnabled: function(u) {\n            m(j.canUseDOM);\n            if (t.TopLevelCallbackCreator) {\n                t.TopLevelCallbackCreator.setEnabled(u);\n            };\n        },\n        isEnabled: function() {\n            return !!((t.TopLevelCallbackCreator && t.TopLevelCallbackCreator.isEnabled()));\n        },\n        handleTopLevel: function(u, v, w, x) {\n            var y = i.extractEvents(u, v, w, x);\n            k.batchedUpdates(function() {\n                i.enqueueEvents(y);\n                i.processEventQueue();\n            });\n        },\n        registrationNames: i.registrationNames,\n        putListener: i.putListener,\n        getListener: i.getListener,\n        deleteListener: i.deleteListener,\n        deleteAllListeners: i.deleteAllListeners,\n        trapBubbledEvent: p,\n        trapCapturedEvent: q\n    };\n    e.exports = t;\n});\n__d(\"getEventTarget\", [\"ExecutionEnvironment\",], function(a, b, c, d, e, f) {\n    var g = b(\"ExecutionEnvironment\");\n    function h(i) {\n        var j = ((i.target || i.srcElement) || g.global);\n        return ((j.nodeType === 3) ? j.parentNode : j);\n    };\n    e.exports = h;\n});\n__d(\"ReactEventTopLevelCallback\", [\"ExecutionEnvironment\",\"ReactEventEmitter\",\"ReactID\",\"ReactInstanceHandles\",\"getEventTarget\",], function(a, b, c, d, e, f) {\n    var g = b(\"ExecutionEnvironment\"), h = b(\"ReactEventEmitter\"), i = b(\"ReactID\"), j = b(\"ReactInstanceHandles\"), k = b(\"getEventTarget\"), l = true, m = {\n        setEnabled: function(n) {\n            l = !!n;\n        },\n        isEnabled: function() {\n            return l;\n        },\n        createTopLevelCallback: function(n) {\n            return function(o) {\n                if (!l) {\n                    return\n                };\n                if ((o.srcElement && (o.srcElement !== o.target))) {\n                    o.target = o.srcElement;\n                };\n                var p = (j.getFirstReactDOM(k(o)) || g.global), q = (i.getID(p) || \"\");\n                h.handleTopLevel(n, p, q, o);\n            };\n        }\n    };\n    e.exports = m;\n});\n__d(\"ReactInstanceHandles\", [\"ReactID\",\"invariant\",], function(a, b, c, d, e, f) {\n    var g = b(\"ReactID\"), h = b(\"invariant\"), i = \".\", j = i.length, k = 100, l = 9999999;\n    function m(v) {\n        return (((i + \"r[\") + v.toString(36)) + \"]\");\n    };\n    function n(v, w) {\n        return ((v.charAt(w) === i) || (w === v.length));\n    };\n    function o(v) {\n        return ((v === \"\") || (((v.charAt(0) === i) && (v.charAt((v.length - 1)) !== i))));\n    };\n    function p(v, w) {\n        return (((w.indexOf(v) === 0) && n(w, v.length)));\n    };\n    function q(v) {\n        return (v ? v.substr(0, v.lastIndexOf(i)) : \"\");\n    };\n    function r(v, w) {\n        h((o(v) && o(w)));\n        h(p(v, w));\n        if ((v === w)) {\n            return v\n        };\n        var x = (v.length + j);\n        for (var y = x; (y < w.length); y++) {\n            if (n(w, y)) {\n                break;\n            };\n        };\n        return w.substr(0, y);\n    };\n    function s(v, w) {\n        var x = Math.min(v.length, w.length);\n        if ((x === 0)) {\n            return \"\"\n        };\n        var y = 0;\n        for (var z = 0; (z <= x); z++) {\n            if ((n(v, z) && n(w, z))) {\n                y = z;\n            }\n             else if ((v.charAt(z) !== w.charAt(z))) {\n                break;\n            }\n        ;\n        };\n        var aa = v.substr(0, y);\n        h(o(aa));\n        return aa;\n    };\n    function t(v, w, x, y, z, aa) {\n        v = (v || \"\");\n        w = (w || \"\");\n        h((v !== w));\n        var ba = p(w, v);\n        h((ba || p(v, w)));\n        var ca = 0, da = (ba ? q : r);\n        for (var ea = v; ; ea = da(ea, w)) {\n            if ((((!z || (ea !== v))) && ((!aa || (ea !== w))))) {\n                x(ea, ba, y);\n            };\n            if ((ea === w)) {\n                break;\n            };\n            h((ca++ < k));\n        };\n    };\n    var u = {\n        separator: i,\n        createReactRootID: function() {\n            return m(Math.ceil((Math.random() * l)));\n        },\n        isRenderedByReact: function(v) {\n            if ((v.nodeType !== 1)) {\n                return false\n            };\n            var w = g.getID(v);\n            return (w ? (w.charAt(0) === i) : false);\n        },\n        getFirstReactDOM: function(v) {\n            var w = v;\n            while ((w && (w.parentNode !== w))) {\n                if (u.isRenderedByReact(w)) {\n                    return w\n                };\n                w = w.parentNode;\n            };\n            return null;\n        },\n        findComponentRoot: function(v, w) {\n            var x = [v.firstChild,], y = 0;\n            while ((y < x.length)) {\n                var z = x[y++];\n                while (z) {\n                    var aa = g.getID(z);\n                    if (aa) {\n                        if ((w === aa)) {\n                            return z;\n                        }\n                         else if (p(aa, w)) {\n                            x.length = y = 0;\n                            x.push(z.firstChild);\n                            break;\n                        }\n                         else x.push(z.firstChild);\n                        \n                    ;\n                    }\n                     else x.push(z.firstChild);\n                ;\n                    z = z.nextSibling;\n                };\n            };\n            ((a.console && emptyFunction) && false);\n            h(false);\n        },\n        getReactRootIDFromNodeID: function(v) {\n            var w = /\\.r\\[[^\\]]+\\]/.exec(v);\n            return (w && w[0]);\n        },\n        traverseEnterLeave: function(v, w, x, y, z) {\n            var aa = s(v, w);\n            if ((aa !== v)) {\n                t(v, aa, x, y, false, true);\n            };\n            if ((aa !== w)) {\n                t(aa, w, x, z, true, false);\n            };\n        },\n        traverseTwoPhase: function(v, w, x) {\n            if (v) {\n                t(\"\", v, w, x, true, false);\n                t(v, \"\", w, x, false, true);\n            }\n        ;\n        },\n        _getFirstCommonAncestorID: s,\n        _getNextDescendantID: r\n    };\n    e.exports = u;\n});\n__d(\"ReactMount\", [\"ReactEventEmitter\",\"ReactInstanceHandles\",\"ReactEventTopLevelCallback\",\"ReactID\",\"$\",], function(a, b, c, d, e, f) {\n    var g = b(\"ReactEventEmitter\"), h = b(\"ReactInstanceHandles\"), i = b(\"ReactEventTopLevelCallback\"), j = b(\"ReactID\"), k = b(\"$\"), l = {\n    }, m = {\n    };\n    function n(q) {\n        return (q && q.firstChild);\n    };\n    function o(q) {\n        var r = n(q);\n        return (r && j.getID(r));\n    };\n    var p = {\n        totalInstantiationTime: 0,\n        totalInjectionTime: 0,\n        useTouchEvents: false,\n        scrollMonitor: function(q, r) {\n            r();\n        },\n        prepareTopLevelEvents: function(q) {\n            g.ensureListening(p.useTouchEvents, q);\n        },\n        _updateRootComponent: function(q, r, s, t) {\n            var u = r.props;\n            p.scrollMonitor(s, function() {\n                q.replaceProps(u, t);\n            });\n            return q;\n        },\n        _registerComponent: function(q, r) {\n            p.prepareTopLevelEvents(i);\n            var s = p.registerContainer(r);\n            l[s] = q;\n            return s;\n        },\n        _renderNewRootComponent: function(q, r, s) {\n            var t = p._registerComponent(q, r);\n            q.mountComponentIntoNode(t, r, s);\n            return q;\n        },\n        renderComponent: function(q, r, s) {\n            var t = l[o(r)];\n            if (t) {\n                if ((t.constructor === q.constructor)) {\n                    return p._updateRootComponent(t, q, r, s);\n                }\n                 else p.unmountAndReleaseReactRootNode(r);\n            \n            };\n            var u = n(r), v = (u && h.isRenderedByReact(u)), w = (v && !t), x = p._renderNewRootComponent(q, r, w);\n            (s && s());\n            return x;\n        },\n        constructAndRenderComponent: function(q, r, s) {\n            return p.renderComponent(q(r), s);\n        },\n        constructAndRenderComponentByID: function(q, r, s) {\n            return p.constructAndRenderComponent(q, r, k(s));\n        },\n        registerContainer: function(q) {\n            var r = o(q);\n            if (r) {\n                r = h.getReactRootIDFromNodeID(r);\n            };\n            if (!r) {\n                r = h.createReactRootID();\n            };\n            m[r] = q;\n            return r;\n        },\n        unmountAndReleaseReactRootNode: function(q) {\n            var r = o(q), s = l[r];\n            if (!s) {\n                return false\n            };\n            s.unmountComponentFromNode(q);\n            delete l[r];\n            delete m[r];\n            return true;\n        },\n        findReactContainerForID: function(q) {\n            var r = h.getReactRootIDFromNodeID(q);\n            return m[r];\n        },\n        findReactNodeByID: function(q) {\n            var r = p.findReactContainerForID(q);\n            return h.findComponentRoot(r, q);\n        }\n    };\n    e.exports = p;\n});\n__d(\"ReactID\", [\"invariant\",\"ReactMount\",], function(a, b, c, d, e, f) {\n    var g = b(\"invariant\"), h = b(\"ReactMount\"), i = \"data-reactid\", j = {\n    };\n    function k(s) {\n        var t = l(s);\n        if (t) {\n            if (j.hasOwnProperty(t)) {\n                var u = j[t];\n                if ((u !== s)) {\n                    g(!o(u, t));\n                    j[t] = s;\n                }\n            ;\n            }\n             else j[t] = s;\n        \n        };\n        return t;\n    };\n    function l(s) {\n        if ((s && s.getAttributeNode)) {\n            var t = s.getAttributeNode(i);\n            if (t) {\n                return (t.value || \"\")\n            };\n        }\n    ;\n        return \"\";\n    };\n    function m(s, t) {\n        var u = l(s);\n        if ((u !== t)) {\n            delete j[u];\n        };\n        s.setAttribute(i, t);\n        j[t] = s;\n    };\n    function n(s) {\n        if ((!j.hasOwnProperty(s) || !o(j[s], s))) {\n            j[s] = h.findReactNodeByID(s);\n        };\n        return j[s];\n    };\n    function o(s, t) {\n        if (s) {\n            g((l(s) === t));\n            var u = h.findReactContainerForID(t);\n            if ((u && p(u, s))) {\n                return true\n            };\n        }\n    ;\n        return false;\n    };\n    function p(s, t) {\n        if (s.contains) {\n            return s.contains(t)\n        };\n        if ((t === s)) {\n            return true\n        };\n        if ((t.nodeType === 3)) {\n            t = t.parentNode;\n        };\n        while ((t && (t.nodeType === 1))) {\n            if ((t === s)) {\n                return true\n            };\n            t = t.parentNode;\n        };\n        return false;\n    };\n    function q(s) {\n        delete j[s];\n    };\n    function r() {\n        j = {\n        };\n    };\n    f.ATTR_NAME = i;\n    f.getID = k;\n    f.setID = m;\n    f.getNode = n;\n    f.purgeID = q;\n    f.purgeEntireCache = r;\n});\n__d(\"getTextContentAccessor\", [\"ExecutionEnvironment\",], function(a, b, c, d, e, f) {\n    var g = b(\"ExecutionEnvironment\"), h = null;\n    function i() {\n        if ((!h && g.canUseDOM)) {\n            h = ((\"innerText\" in document.createElement(\"div\")) ? \"innerText\" : \"textContent\");\n        };\n        return h;\n    };\n    e.exports = i;\n});\n__d(\"ReactDOMIDOperations\", [\"CSSPropertyOperations\",\"DOMChildrenOperations\",\"DOMPropertyOperations\",\"ReactID\",\"getTextContentAccessor\",\"invariant\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSSPropertyOperations\"), h = b(\"DOMChildrenOperations\"), i = b(\"DOMPropertyOperations\"), j = b(\"ReactID\"), k = b(\"getTextContentAccessor\"), l = b(\"invariant\"), m = {\n        dangerouslySetInnerHTML: \"`dangerouslySetInnerHTML` must be set using `updateInnerHTMLByID()`.\",\n        style: \"`style` must be set using `updateStylesByID()`.\"\n    }, n = (k() || \"NA\"), o = {\n        updatePropertyByID: function(p, q, r) {\n            var s = j.getNode(p);\n            l(!m.hasOwnProperty(q));\n            i.setValueForProperty(s, q, r);\n        },\n        deletePropertyByID: function(p, q, r) {\n            var s = j.getNode(p);\n            l(!m.hasOwnProperty(q));\n            i.deleteValueForProperty(s, q, r);\n        },\n        updatePropertiesByID: function(p, q) {\n            for (var r in q) {\n                if (!q.hasOwnProperty(r)) {\n                    continue;\n                };\n                o.updatePropertiesByID(p, r, q[r]);\n            };\n        },\n        updateStylesByID: function(p, q) {\n            var r = j.getNode(p);\n            g.setValueForStyles(r, q);\n        },\n        updateInnerHTMLByID: function(p, q) {\n            var r = j.getNode(p);\n            r.innerHTML = (((q && q.__html) || \"\")).replace(/^ /g, \"&nbsp;\");\n        },\n        updateTextContentByID: function(p, q) {\n            var r = j.getNode(p);\n            r[n] = q;\n        },\n        dangerouslyReplaceNodeWithMarkupByID: function(p, q) {\n            var r = j.getNode(p);\n            h.dangerouslyReplaceNodeWithMarkup(r, q);\n            j.purgeEntireCache();\n        },\n        manageChildrenByParentID: function(p, q) {\n            var r = j.getNode(p);\n            h.manageChildren(r, q);\n            j.purgeEntireCache();\n        },\n        setTextNodeValueAtIndexByParentID: function(p, q, r) {\n            var s = j.getNode(p);\n            h.setTextNodeValueAtIndex(s, q, r);\n        }\n    };\n    e.exports = o;\n});\n__d(\"ReactOwner\", [\"invariant\",], function(a, b, c, d, e, f) {\n    var g = b(\"invariant\"), h = {\n        isValidOwner: function(i) {\n            return !!(((i && (typeof i.attachRef === \"function\")) && (typeof i.detachRef === \"function\")));\n        },\n        addComponentAsRefTo: function(i, j, k) {\n            g(h.isValidOwner(k));\n            k.attachRef(j, i);\n        },\n        removeComponentAsRefFrom: function(i, j, k) {\n            g(h.isValidOwner(k));\n            if ((k.refs[j] === i)) {\n                k.detachRef(j);\n            };\n        },\n        Mixin: {\n            attachRef: function(i, j) {\n                g(j.isOwnedBy(this));\n                var k = (this.refs || (this.refs = {\n                }));\n                k[i] = j;\n            },\n            detachRef: function(i) {\n                delete this.refs[i];\n            }\n        }\n    };\n    e.exports = h;\n});\n__d(\"PooledClass\", [], function(a, b, c, d, e, f) {\n    var g = function(p) {\n        var q = this;\n        if (q.instancePool.length) {\n            var r = q.instancePool.pop();\n            q.call(r, p);\n            return r;\n        }\n         else return new q(p)\n    ;\n    }, h = function(p, q) {\n        var r = this;\n        if (r.instancePool.length) {\n            var s = r.instancePool.pop();\n            r.call(s, p, q);\n            return s;\n        }\n         else return new r(p, q)\n    ;\n    }, i = function(p, q, r) {\n        var s = this;\n        if (s.instancePool.length) {\n            var t = s.instancePool.pop();\n            s.call(t, p, q, r);\n            return t;\n        }\n         else return new s(p, q, r)\n    ;\n    }, j = function(p, q, r, s, t) {\n        var u = this;\n        if (u.instancePool.length) {\n            var v = u.instancePool.pop();\n            u.call(v, p, q, r, s, t);\n            return v;\n        }\n         else return new u(p, q, r, s, t)\n    ;\n    }, k = function(p) {\n        var q = this;\n        if (p.destructor) {\n            p.destructor();\n        };\n        if ((q.instancePool.length < q.poolSize)) {\n            q.instancePool.push(p);\n        };\n    }, l = 10, m = g, n = function(p, q) {\n        var r = p;\n        r.instancePool = [];\n        r.getPooled = (q || m);\n        if (!r.poolSize) {\n            r.poolSize = l;\n        };\n        r.release = k;\n        return r;\n    }, o = {\n        addPoolingTo: n,\n        oneArgumentPooler: g,\n        twoArgumentPooler: h,\n        threeArgumentPooler: i,\n        fiveArgumentPooler: j\n    };\n    e.exports = o;\n});\n__d(\"ReactInputSelection\", [], function(a, b, c, d, e, f) {\n    function g() {\n        try {\n            return document.activeElement;\n        } catch (j) {\n        \n        };\n    };\n    function h(j) {\n        return document.documentElement.contains(j);\n    };\n    var i = {\n        hasSelectionCapabilities: function(j) {\n            return (j && ((((((j.nodeName === \"INPUT\") && (j.type === \"text\"))) || (j.nodeName === \"TEXTAREA\")) || (j.contentEditable === \"true\"))));\n        },\n        getSelectionInformation: function() {\n            var j = g();\n            return {\n                focusedElem: j,\n                selectionRange: (i.hasSelectionCapabilities(j) ? i.getSelection(j) : null)\n            };\n        },\n        restoreSelection: function(j) {\n            var k = g(), l = j.focusedElem, m = j.selectionRange;\n            if (((k !== l) && h(l))) {\n                if (i.hasSelectionCapabilities(l)) {\n                    i.setSelection(l, m);\n                };\n                l.focus();\n            }\n        ;\n        },\n        getSelection: function(j) {\n            var k;\n            if (((j.contentEditable === \"true\") && window.getSelection)) {\n                k = window.getSelection().getRangeAt(0);\n                var l = k.commonAncestorContainer;\n                if ((l && (l.nodeType === 3))) {\n                    l = l.parentNode;\n                };\n                if ((l !== j)) {\n                    return {\n                        start: 0,\n                        end: 0\n                    };\n                }\n                 else return {\n                    start: k.startOffset,\n                    end: k.endOffset\n                }\n            ;\n            }\n        ;\n            if (!document.selection) {\n                return {\n                    start: j.selectionStart,\n                    end: j.selectionEnd\n                }\n            };\n            k = document.selection.createRange();\n            if ((k.parentElement() !== j)) {\n                return {\n                    start: 0,\n                    end: 0\n                }\n            };\n            var m = j.value.length;\n            if ((j.nodeName === \"INPUT\")) {\n                return {\n                    start: -k.moveStart(\"character\", -m),\n                    end: -k.moveEnd(\"character\", -m)\n                };\n            }\n             else {\n                var n = k.duplicate();\n                n.moveToElementText(j);\n                n.setEndPoint(\"StartToEnd\", k);\n                var o = (m - n.text.length);\n                n.setEndPoint(\"StartToStart\", k);\n                return {\n                    start: (m - n.text.length),\n                    end: o\n                };\n            }\n        ;\n        },\n        setSelection: function(j, k) {\n            var l, m = k.start, n = k.end;\n            if ((typeof n === \"undefined\")) {\n                n = m;\n            };\n            if (document.selection) {\n                if ((j.tagName === \"TEXTAREA\")) {\n                    var o = ((j.value.slice(0, m).match(/\\r/g) || [])).length, p = ((j.value.slice(m, n).match(/\\r/g) || [])).length;\n                    m -= o;\n                    n -= (o + p);\n                }\n            ;\n                l = j.createTextRange();\n                l.collapse(true);\n                l.moveStart(\"character\", m);\n                l.moveEnd(\"character\", (n - m));\n                l.select();\n            }\n             else if ((j.contentEditable === \"true\")) {\n                if ((j.childNodes.length === 1)) {\n                    l = document.createRange();\n                    l.setStart(j.childNodes[0], m);\n                    l.setEnd(j.childNodes[0], n);\n                    var q = window.getSelection();\n                    q.removeAllRanges();\n                    q.addRange(l);\n                }\n            ;\n            }\n             else {\n                j.selectionStart = m;\n                j.selectionEnd = Math.min(n, j.value.length);\n                j.focus();\n            }\n            \n        ;\n        }\n    };\n    e.exports = i;\n});\n__d(\"mixInto\", [], function(a, b, c, d, e, f) {\n    var g = function(h, i) {\n        var j;\n        for (j in i) {\n            if (!i.hasOwnProperty(j)) {\n                continue;\n            };\n            h.prototype[j] = i[j];\n        };\n    };\n    e.exports = g;\n});\n__d(\"ReactOnDOMReady\", [\"PooledClass\",\"mixInto\",], function(a, b, c, d, e, f) {\n    var g = b(\"PooledClass\"), h = b(\"mixInto\");\n    function i(j) {\n        this._queue = (j || null);\n    };\n    h(i, {\n        enqueue: function(j, k) {\n            this._queue = (this._queue || []);\n            this._queue.push({\n                component: j,\n                callback: k\n            });\n        },\n        notifyAll: function() {\n            var j = this._queue;\n            if (j) {\n                this._queue = null;\n                for (var k = 0, l = j.length; (k < l); k++) {\n                    var m = j[k].component, n = j[k].callback;\n                    n.call(m, m.getDOMNode());\n                };\n                j.length = 0;\n            }\n        ;\n        },\n        reset: function() {\n            this._queue = null;\n        },\n        destructor: function() {\n            this.reset();\n        }\n    });\n    g.addPoolingTo(i);\n    e.exports = i;\n});\n__d(\"Transaction\", [\"throwIf\",], function(a, b, c, d, e, f) {\n    var g = b(\"throwIf\"), h = \"DUAL_TRANSACTION\", i = \"MISSING_TRANSACTION\", j = {\n        reinitializeTransaction: function() {\n            this.transactionWrappers = this.getTransactionWrappers();\n            if (!this.wrapperInitData) {\n                this.wrapperInitData = [];\n            }\n             else this.wrapperInitData.length = 0;\n        ;\n            if (!this.timingMetrics) {\n                this.timingMetrics = {\n                };\n            };\n            this.timingMetrics.methodInvocationTime = 0;\n            if (!this.timingMetrics.wrapperInitTimes) {\n                this.timingMetrics.wrapperInitTimes = [];\n            }\n             else this.timingMetrics.wrapperInitTimes.length = 0;\n        ;\n            if (!this.timingMetrics.wrapperCloseTimes) {\n                this.timingMetrics.wrapperCloseTimes = [];\n            }\n             else this.timingMetrics.wrapperCloseTimes.length = 0;\n        ;\n            this._isInTransaction = false;\n        },\n        _isInTransaction: false,\n        getTransactionWrappers: null,\n        isInTransaction: function() {\n            return !!this._isInTransaction;\n        },\n        perform: function(l, m, n, o, p, q, r, s) {\n            g(this.isInTransaction(), h);\n            var t = Date.now(), u = null, v;\n            try {\n                this.initializeAll();\n                v = l.call(m, n, o, p, q, r, s);\n            } catch (w) {\n                u = w;\n            } finally {\n                var x = Date.now();\n                this.methodInvocationTime += ((x - t));\n                try {\n                    this.closeAll();\n                } catch (y) {\n                    u = (u || y);\n                };\n            };\n            if (u) {\n                throw u\n            };\n            return v;\n        },\n        initializeAll: function() {\n            this._isInTransaction = true;\n            var l = this.transactionWrappers, m = this.timingMetrics.wrapperInitTimes, n = null;\n            for (var o = 0; (o < l.length); o++) {\n                var p = Date.now(), q = l[o];\n                try {\n                    this.wrapperInitData[o] = (q.initialize ? q.initialize.call(this) : null);\n                } catch (r) {\n                    n = (n || r);\n                    this.wrapperInitData[o] = k.OBSERVED_ERROR;\n                } finally {\n                    var s = m[o], t = Date.now();\n                    m[o] = (((s || 0)) + ((t - p)));\n                };\n            };\n            if (n) {\n                throw n\n            };\n        },\n        closeAll: function() {\n            g(!this.isInTransaction(), i);\n            var l = this.transactionWrappers, m = this.timingMetrics.wrapperCloseTimes, n = null;\n            for (var o = 0; (o < l.length); o++) {\n                var p = l[o], q = Date.now(), r = this.wrapperInitData[o];\n                try {\n                    if ((r !== k.OBSERVED_ERROR)) {\n                        (p.close && p.close.call(this, r));\n                    };\n                } catch (s) {\n                    n = (n || s);\n                } finally {\n                    var t = Date.now(), u = m[o];\n                    m[o] = (((u || 0)) + ((t - q)));\n                };\n            };\n            this.wrapperInitData.length = 0;\n            this._isInTransaction = false;\n            if (n) {\n                throw n\n            };\n        }\n    }, k = {\n        Mixin: j,\n        OBSERVED_ERROR: {\n        }\n    };\n    e.exports = k;\n});\n__d(\"ReactReconcileTransaction\", [\"ExecutionEnvironment\",\"PooledClass\",\"ReactEventEmitter\",\"ReactInputSelection\",\"ReactOnDOMReady\",\"Transaction\",\"mixInto\",], function(a, b, c, d, e, f) {\n    var g = b(\"ExecutionEnvironment\"), h = b(\"PooledClass\"), i = b(\"ReactEventEmitter\"), j = b(\"ReactInputSelection\"), k = b(\"ReactOnDOMReady\"), l = b(\"Transaction\"), m = b(\"mixInto\"), n = {\n        initialize: j.getSelectionInformation,\n        close: j.restoreSelection\n    }, o = {\n        initialize: function() {\n            var t = i.isEnabled();\n            i.setEnabled(false);\n            return t;\n        },\n        close: function(t) {\n            i.setEnabled(t);\n        }\n    }, p = {\n        initialize: function() {\n            this.reactOnDOMReady.reset();\n        },\n        close: function() {\n            this.reactOnDOMReady.notifyAll();\n        }\n    }, q = [n,o,p,];\n    function r() {\n        this.reinitializeTransaction();\n        this.reactOnDOMReady = k.getPooled(null);\n    };\n    var s = {\n        getTransactionWrappers: function() {\n            if (g.canUseDOM) {\n                return q;\n            }\n             else return []\n        ;\n        },\n        getReactOnDOMReady: function() {\n            return this.reactOnDOMReady;\n        },\n        destructor: function() {\n            k.release(this.reactOnDOMReady);\n            this.reactOnDOMReady = null;\n        }\n    };\n    m(r, l.Mixin);\n    m(r, s);\n    h.addPoolingTo(r);\n    e.exports = r;\n});\n__d(\"mergeHelpers\", [\"keyMirror\",\"throwIf\",], function(a, b, c, d, e, f) {\n    var g = b(\"keyMirror\"), h = b(\"throwIf\"), i = 36, j = g({\n        MERGE_ARRAY_FAIL: null,\n        MERGE_CORE_FAILURE: null,\n        MERGE_TYPE_USAGE_FAILURE: null,\n        MERGE_DEEP_MAX_LEVELS: null,\n        MERGE_DEEP_NO_ARR_STRATEGY: null\n    }), k = function(m) {\n        return ((typeof m !== \"object\") || (m === null));\n    }, l = {\n        MAX_MERGE_DEPTH: i,\n        isTerminal: k,\n        normalizeMergeArg: function(m) {\n            return (((m === undefined) || (m === null)) ? {\n            } : m);\n        },\n        checkMergeArrayArgs: function(m, n) {\n            h((!Array.isArray(m) || !Array.isArray(n)), j.MERGE_CORE_FAILURE);\n        },\n        checkMergeObjectArgs: function(m, n) {\n            l.checkMergeObjectArg(m);\n            l.checkMergeObjectArg(n);\n        },\n        checkMergeObjectArg: function(m) {\n            h((k(m) || Array.isArray(m)), j.MERGE_CORE_FAILURE);\n        },\n        checkMergeLevel: function(m) {\n            h((m >= i), j.MERGE_DEEP_MAX_LEVELS);\n        },\n        checkArrayStrategy: function(m) {\n            h(((m !== undefined) && !((m in l.ArrayStrategies))), j.MERGE_DEEP_NO_ARR_STRATEGY);\n        },\n        ArrayStrategies: g({\n            Clobber: true,\n            IndexByIndex: true\n        }),\n        ERRORS: j\n    };\n    e.exports = l;\n});\n__d(\"mergeInto\", [\"mergeHelpers\",], function(a, b, c, d, e, f) {\n    var g = b(\"mergeHelpers\"), h = g.checkMergeObjectArg;\n    function i(j, k) {\n        h(j);\n        if ((k != null)) {\n            h(k);\n            for (var l in k) {\n                if (!k.hasOwnProperty(l)) {\n                    continue;\n                };\n                j[l] = k[l];\n            };\n        }\n    ;\n    };\n    e.exports = i;\n});\n__d(\"merge\", [\"mergeInto\",], function(a, b, c, d, e, f) {\n    var g = b(\"mergeInto\"), h = function(i, j) {\n        var k = {\n        };\n        g(k, i);\n        g(k, j);\n        return k;\n    };\n    e.exports = h;\n});\n__d(\"ReactComponent\", [\"ReactCurrentOwner\",\"ReactDOMIDOperations\",\"ReactID\",\"ReactMount\",\"ReactOwner\",\"ReactReconcileTransaction\",\"ReactUpdates\",\"invariant\",\"keyMirror\",\"merge\",], function(a, b, c, d, e, f) {\n    var g = b(\"ReactCurrentOwner\"), h = b(\"ReactDOMIDOperations\"), i = b(\"ReactID\"), j = b(\"ReactMount\"), k = b(\"ReactOwner\"), l = b(\"ReactReconcileTransaction\"), m = b(\"ReactUpdates\"), n = b(\"invariant\"), o = b(\"keyMirror\"), p = b(\"merge\"), q = \"{owner}\", r = \"{is.key.validated}\", s = o({\n        MOUNTED: null,\n        UNMOUNTED: null\n    }), t = {\n    };\n    function u(x) {\n        if ((x[r] || (x.props.key != null))) {\n            return\n        };\n        x[r] = true;\n        if (!g.current) {\n            return\n        };\n        var y = g.current.constructor.displayName;\n        if (t.hasOwnProperty(y)) {\n            return\n        };\n        t[y] = true;\n        var z = (((\"Each child in an array should have a unique \\\"key\\\" prop. \" + \"Check the render method of \") + y) + \".\");\n        if (!x.isOwnedBy(g.current)) {\n            var aa = (x.props[q] && x.props[q].constructor.displayName);\n            z += ((\" It was passed a child from \" + aa) + \".\");\n        }\n    ;\n    };\n    function v(x) {\n        if (Array.isArray(x)) {\n            for (var y = 0; (y < x.length); y++) {\n                var z = x[y];\n                if (w.isValidComponent(z)) {\n                    u(z);\n                };\n            };\n        }\n         else if (w.isValidComponent(x)) {\n            x[r] = true;\n        }\n    ;\n    };\n    var w = {\n        isValidComponent: function(x) {\n            return !!(((x && (typeof x.mountComponentIntoNode === \"function\")) && (typeof x.receiveProps === \"function\")));\n        },\n        getKey: function(x, y) {\n            if (((x && x.props) && (x.props.key != null))) {\n                return (\"\" + x.props.key)\n            };\n            return (\"\" + y);\n        },\n        LifeCycle: s,\n        DOMIDOperations: h,\n        ReactReconcileTransaction: l,\n        setDOMOperations: function(x) {\n            w.DOMIDOperations = x;\n        },\n        setReactReconcileTransaction: function(x) {\n            w.ReactReconcileTransaction = x;\n        },\n        Mixin: {\n            isMounted: function() {\n                return (this._lifeCycleState === s.MOUNTED);\n            },\n            getDOMNode: function() {\n                n(this.isMounted());\n                return i.getNode(this._rootNodeID);\n            },\n            setProps: function(x, y) {\n                this.replaceProps(p((this._pendingProps || this.props), x), y);\n            },\n            replaceProps: function(x, y) {\n                n(!this.props[q]);\n                this._pendingProps = x;\n                m.enqueueUpdate(this, y);\n            },\n            construct: function(x, y) {\n                this.props = (x || {\n                });\n                this.props[q] = g.current;\n                this._lifeCycleState = s.UNMOUNTED;\n                this._pendingProps = null;\n                this._pendingCallbacks = null;\n                var z = (arguments.length - 1);\n                if ((z === 1)) {\n                    this.props.children = y;\n                }\n                 else if ((z > 1)) {\n                    var aa = Array(z);\n                    for (var ba = 0; (ba < z); ba++) {\n                        aa[ba] = arguments[(ba + 1)];;\n                    };\n                    this.props.children = aa;\n                }\n                \n            ;\n            },\n            mountComponent: function(x, y) {\n                n(!this.isMounted());\n                var z = this.props;\n                if ((z.ref != null)) {\n                    k.addComponentAsRefTo(this, z.ref, z[q]);\n                };\n                this._rootNodeID = x;\n                this._lifeCycleState = s.MOUNTED;\n            },\n            unmountComponent: function() {\n                n(this.isMounted());\n                var x = this.props;\n                if ((x.ref != null)) {\n                    k.removeComponentAsRefFrom(this, x.ref, x[q]);\n                };\n                i.purgeID(this._rootNodeID);\n                this._rootNodeID = null;\n                this._lifeCycleState = s.UNMOUNTED;\n            },\n            receiveProps: function(x, y) {\n                n(this.isMounted());\n                this._pendingProps = x;\n                this._performUpdateIfNecessary(y);\n            },\n            performUpdateIfNecessary: function() {\n                var x = w.ReactReconcileTransaction.getPooled();\n                x.perform(this._performUpdateIfNecessary, this, x);\n                w.ReactReconcileTransaction.release(x);\n            },\n            _performUpdateIfNecessary: function(x) {\n                if ((this._pendingProps == null)) {\n                    return\n                };\n                var y = this.props;\n                this.props = this._pendingProps;\n                this._pendingProps = null;\n                this.updateComponent(x, y);\n            },\n            updateComponent: function(x, y) {\n                var z = this.props;\n                if (((z[q] !== y[q]) || (z.ref !== y.ref))) {\n                    if ((y.ref != null)) {\n                        k.removeComponentAsRefFrom(this, y.ref, y[q]);\n                    };\n                    if ((z.ref != null)) {\n                        k.addComponentAsRefTo(this, z.ref, z[q]);\n                    };\n                }\n            ;\n            },\n            mountComponentIntoNode: function(x, y, z) {\n                var aa = w.ReactReconcileTransaction.getPooled();\n                aa.perform(this._mountComponentIntoNode, this, x, y, aa, z);\n                w.ReactReconcileTransaction.release(aa);\n            },\n            _mountComponentIntoNode: function(x, y, z, aa) {\n                n((y && (y.nodeType === 1)));\n                var ba = Date.now(), ca = this.mountComponent(x, z);\n                j.totalInstantiationTime += ((Date.now() - ba));\n                if (aa) {\n                    return\n                };\n                var da = Date.now(), ea = y.parentNode;\n                if (ea) {\n                    var fa = y.nextSibling;\n                    ea.removeChild(y);\n                    y.innerHTML = ca;\n                    if (fa) {\n                        ea.insertBefore(y, fa);\n                    }\n                     else ea.appendChild(y);\n                ;\n                }\n                 else y.innerHTML = ca;\n            ;\n                j.totalInjectionTime += ((Date.now() - da));\n            },\n            unmountComponentFromNode: function(x) {\n                this.unmountComponent();\n                while (x.lastChild) {\n                    x.removeChild(x.lastChild);;\n                };\n            },\n            isOwnedBy: function(x) {\n                return (this.props[q] === x);\n            },\n            getSiblingByRef: function(x) {\n                var y = this.props[q];\n                if ((!y || !y.refs)) {\n                    return null\n                };\n                return y.refs[x];\n            }\n        }\n    };\n    e.exports = w;\n});\n__d(\"joinClasses\", [], function(a, b, c, d, e, f) {\n    function g(h) {\n        if (!h) {\n            h = \"\";\n        };\n        var i, j = arguments.length;\n        if ((j > 1)) {\n            for (var k = 1; (k < j); k++) {\n                i = arguments[k];\n                (i && (h += (\" \" + i)));\n            }\n        };\n        return h;\n    };\n    e.exports = g;\n});\n__d(\"ReactPropTransferer\", [\"emptyFunction\",\"joinClasses\",\"merge\",], function(a, b, c, d, e, f) {\n    var g = b(\"emptyFunction\"), h = b(\"joinClasses\"), i = b(\"merge\");\n    function j(m) {\n        return function(n, o, p) {\n            if (!n.hasOwnProperty(o)) {\n                n[o] = p;\n            }\n             else n[o] = m(n[o], p);\n        ;\n        };\n    };\n    var k = {\n        children: g,\n        className: j(h),\n        ref: g,\n        style: j(i)\n    }, l = {\n        TransferStrategies: k,\n        Mixin: {\n            transferPropsTo: function(m) {\n                var n = {\n                };\n                for (var o in m.props) {\n                    if (m.props.hasOwnProperty(o)) {\n                        n[o] = m.props[o];\n                    };\n                };\n                for (var p in this.props) {\n                    if (!this.props.hasOwnProperty(p)) {\n                        continue;\n                    };\n                    var q = k[p];\n                    if (q) {\n                        q(n, p, this.props[p]);\n                    }\n                     else if (!n.hasOwnProperty(p)) {\n                        n[p] = this.props[p];\n                    }\n                ;\n                };\n                m.props = n;\n                return m;\n            }\n        }\n    };\n    e.exports = l;\n});\n__d(\"ReactCompositeComponent\", [\"ReactComponent\",\"ReactCurrentOwner\",\"ReactOwner\",\"ReactPropTransferer\",\"ReactUpdates\",\"invariant\",\"keyMirror\",\"merge\",\"mixInto\",], function(a, b, c, d, e, f) {\n    var g = b(\"ReactComponent\"), h = b(\"ReactCurrentOwner\"), i = b(\"ReactOwner\"), j = b(\"ReactPropTransferer\"), k = b(\"ReactUpdates\"), l = b(\"invariant\"), m = b(\"keyMirror\"), n = b(\"merge\"), o = b(\"mixInto\"), p = m({\n        DEFINE_ONCE: null,\n        DEFINE_MANY: null,\n        OVERRIDE_BASE: null\n    }), q = {\n        mixins: p.DEFINE_MANY,\n        props: p.DEFINE_ONCE,\n        getDefaultProps: p.DEFINE_ONCE,\n        getInitialState: p.DEFINE_ONCE,\n        render: p.DEFINE_ONCE,\n        componentWillMount: p.DEFINE_MANY,\n        componentDidMount: p.DEFINE_MANY,\n        componentWillReceiveProps: p.DEFINE_MANY,\n        shouldComponentUpdate: p.DEFINE_ONCE,\n        componentWillUpdate: p.DEFINE_MANY,\n        componentDidUpdate: p.DEFINE_MANY,\n        componentWillUnmount: p.DEFINE_MANY,\n        updateComponent: p.OVERRIDE_BASE\n    }, r = {\n        displayName: function(aa, ba) {\n            aa.displayName = ba;\n        },\n        mixins: function(aa, ba) {\n            if (ba) {\n                for (var ca = 0; (ca < ba.length); ca++) {\n                    u(aa, ba[ca]);;\n                }\n            };\n        },\n        props: function(aa, ba) {\n            aa.propDeclarations = ba;\n        }\n    };\n    function s(aa, ba) {\n        var ca = q[ba];\n        if (x.hasOwnProperty(ba)) {\n            l((ca === p.OVERRIDE_BASE));\n        };\n        if (aa.hasOwnProperty(ba)) {\n            l((ca === p.DEFINE_MANY));\n        };\n    };\n    function t(aa) {\n        var ba = aa._compositeLifeCycleState;\n        l((aa.isMounted() || (ba === w.MOUNTING)));\n        l(((ba !== w.RECEIVING_STATE) && (ba !== w.UNMOUNTING)));\n    };\n    function u(aa, ba) {\n        var ca = aa.prototype;\n        for (var da in ba) {\n            var ea = ba[da];\n            if ((!ba.hasOwnProperty(da) || !ea)) {\n                continue;\n            };\n            s(ca, da);\n            if (r.hasOwnProperty(da)) {\n                r[da](aa, ea);\n            }\n             else {\n                var fa = (da in q), ga = (da in ca), ha = ea.__reactDontBind, ia = (typeof ea === \"function\"), ja = (((ia && !fa) && !ga) && !ha);\n                if (ja) {\n                    if (!ca.__reactAutoBindMap) {\n                        ca.__reactAutoBindMap = {\n                        };\n                    };\n                    ca.__reactAutoBindMap[da] = ea;\n                    ca[da] = ea;\n                }\n                 else if (ga) {\n                    ca[da] = v(ca[da], ea);\n                }\n                 else ca[da] = ea;\n                \n            ;\n            }\n        ;\n        };\n    };\n    function v(aa, ba) {\n        return function ca() {\n            aa.apply(this, arguments);\n            ba.apply(this, arguments);\n        };\n    };\n    var w = m({\n        MOUNTING: null,\n        UNMOUNTING: null,\n        RECEIVING_PROPS: null,\n        RECEIVING_STATE: null\n    }), x = {\n        construct: function(aa, ba) {\n            g.Mixin.construct.apply(this, arguments);\n            this.state = null;\n            this._pendingState = null;\n            this._compositeLifeCycleState = null;\n        },\n        isMounted: function() {\n            return (g.Mixin.isMounted.call(this) && (this._compositeLifeCycleState !== w.MOUNTING));\n        },\n        mountComponent: function(aa, ba) {\n            g.Mixin.mountComponent.call(this, aa, ba);\n            this._compositeLifeCycleState = w.MOUNTING;\n            this._defaultProps = (this.getDefaultProps ? this.getDefaultProps() : null);\n            this._processProps(this.props);\n            if (this.__reactAutoBindMap) {\n                this._bindAutoBindMethods();\n            };\n            this.state = (this.getInitialState ? this.getInitialState() : null);\n            this._pendingState = null;\n            this._pendingForceUpdate = false;\n            if (this.componentWillMount) {\n                this.componentWillMount();\n                if (this._pendingState) {\n                    this.state = this._pendingState;\n                    this._pendingState = null;\n                }\n            ;\n            }\n        ;\n            this._renderedComponent = this._renderValidatedComponent();\n            this._compositeLifeCycleState = null;\n            var ca = this._renderedComponent.mountComponent(aa, ba);\n            if (this.componentDidMount) {\n                ba.getReactOnDOMReady().enqueue(this, this.componentDidMount);\n            };\n            return ca;\n        },\n        unmountComponent: function() {\n            this._compositeLifeCycleState = w.UNMOUNTING;\n            if (this.componentWillUnmount) {\n                this.componentWillUnmount();\n            };\n            this._compositeLifeCycleState = null;\n            this._defaultProps = null;\n            g.Mixin.unmountComponent.call(this);\n            this._renderedComponent.unmountComponent();\n            this._renderedComponent = null;\n            if (this.refs) {\n                this.refs = null;\n            };\n        },\n        setState: function(aa, ba) {\n            this.replaceState(n((this._pendingState || this.state), aa), ba);\n        },\n        replaceState: function(aa, ba) {\n            t.call(null, this);\n            this._pendingState = aa;\n            k.enqueueUpdate(this, ba);\n        },\n        _processProps: function(aa) {\n            var ba, ca = this._defaultProps;\n            for (ba in ca) {\n                if (!((ba in aa))) {\n                    aa[ba] = ca[ba];\n                };\n            };\n            var da = this.constructor.propDeclarations;\n            if (da) {\n                var ea = this.constructor.displayName;\n                for (ba in da) {\n                    var fa = da[ba];\n                    if (fa) {\n                        fa(aa, ba, ea);\n                    };\n                };\n            }\n        ;\n        },\n        performUpdateIfNecessary: function() {\n            var aa = this._compositeLifeCycleState;\n            if (((aa === w.MOUNTING) || (aa === w.RECEIVING_PROPS))) {\n                return\n            };\n            g.Mixin.performUpdateIfNecessary.call(this);\n        },\n        _performUpdateIfNecessary: function(aa) {\n            if ((((this._pendingProps == null) && (this._pendingState == null)) && !this._pendingForceUpdate)) {\n                return\n            };\n            var ba = this.props;\n            if ((this._pendingProps != null)) {\n                ba = this._pendingProps;\n                this._processProps(ba);\n                this._pendingProps = null;\n                this._compositeLifeCycleState = w.RECEIVING_PROPS;\n                if (this.componentWillReceiveProps) {\n                    this.componentWillReceiveProps(ba, aa);\n                };\n            }\n        ;\n            this._compositeLifeCycleState = w.RECEIVING_STATE;\n            var ca = (this._pendingState || this.state);\n            this._pendingState = null;\n            if (((this._pendingForceUpdate || !this.shouldComponentUpdate) || this.shouldComponentUpdate(ba, ca))) {\n                this._pendingForceUpdate = false;\n                this._performComponentUpdate(ba, ca, aa);\n            }\n             else {\n                this.props = ba;\n                this.state = ca;\n            }\n        ;\n            this._compositeLifeCycleState = null;\n        },\n        _performComponentUpdate: function(aa, ba, ca) {\n            var da = this.props, ea = this.state;\n            if (this.componentWillUpdate) {\n                this.componentWillUpdate(aa, ba, ca);\n            };\n            this.props = aa;\n            this.state = ba;\n            this.updateComponent(ca, da, ea);\n            if (this.componentDidUpdate) {\n                ca.getReactOnDOMReady().enqueue(this, this.componentDidUpdate.bind(this, da, ea));\n            };\n        },\n        updateComponent: function(aa, ba, ca) {\n            g.Mixin.updateComponent.call(this, aa, ba);\n            var da = this._renderedComponent, ea = this._renderValidatedComponent();\n            if ((da.constructor === ea.constructor)) {\n                da.receiveProps(ea.props, aa);\n            }\n             else {\n                var fa = this._rootNodeID, ga = da._rootNodeID;\n                da.unmountComponent();\n                var ha = ea.mountComponent(fa, aa);\n                g.DOMIDOperations.dangerouslyReplaceNodeWithMarkupByID(ga, ha);\n                this._renderedComponent = ea;\n            }\n        ;\n        },\n        forceUpdate: function(aa) {\n            var ba = this._compositeLifeCycleState;\n            l((this.isMounted() || (ba === w.MOUNTING)));\n            l(((ba !== w.RECEIVING_STATE) && (ba !== w.UNMOUNTING)));\n            this._pendingForceUpdate = true;\n            k.enqueueUpdate(this, aa);\n        },\n        _renderValidatedComponent: function() {\n            var aa;\n            h.current = this;\n            try {\n                aa = this.render();\n            } catch (ba) {\n                throw ba;\n            } finally {\n                h.current = null;\n            };\n            l(g.isValidComponent(aa));\n            return aa;\n        },\n        _bindAutoBindMethods: function() {\n            for (var aa in this.__reactAutoBindMap) {\n                if (!this.__reactAutoBindMap.hasOwnProperty(aa)) {\n                    continue;\n                };\n                var ba = this.__reactAutoBindMap[aa];\n                this[aa] = this._bindAutoBindMethod(ba);\n            };\n        },\n        _bindAutoBindMethod: function(aa) {\n            var ba = this;\n            return function() {\n                return aa.apply(ba, arguments);\n            };\n        }\n    }, y = function() {\n    \n    };\n    o(y, g.Mixin);\n    o(y, i.Mixin);\n    o(y, j.Mixin);\n    o(y, x);\n    var z = {\n        LifeCycle: w,\n        Base: y,\n        createClass: function(aa) {\n            var ba = function() {\n            \n            };\n            ba.prototype = new y();\n            ba.prototype.constructor = ba;\n            u(ba, aa);\n            l(ba.prototype.render);\n            var ca = function(da, ea) {\n                var fa = new ba();\n                fa.construct.apply(fa, arguments);\n                return fa;\n            };\n            ca.componentConstructor = ba;\n            ca.originalSpec = aa;\n            return ca;\n        },\n        autoBind: function(aa) {\n            return aa;\n        }\n    };\n    e.exports = z;\n});\n__d(\"ReactMultiChild\", [\"ReactComponent\",], function(a, b, c, d, e, f) {\n    var g = b(\"ReactComponent\");\n    function h(k, l) {\n        return ((k && l) && (k.constructor === l.constructor));\n    };\n    var i = {\n        enqueueMarkupAt: function(k, l) {\n            this.domOperations = (this.domOperations || []);\n            this.domOperations.push({\n                insertMarkup: k,\n                finalIndex: l\n            });\n        },\n        enqueueMove: function(k, l) {\n            this.domOperations = (this.domOperations || []);\n            this.domOperations.push({\n                moveFrom: k,\n                finalIndex: l\n            });\n        },\n        enqueueUnmountChildByName: function(k, l) {\n            if (g.isValidComponent(l)) {\n                this.domOperations = (this.domOperations || []);\n                this.domOperations.push({\n                    removeAt: l._domIndex\n                });\n                (l.unmountComponent && l.unmountComponent());\n                delete this._renderedChildren[k];\n            }\n        ;\n        },\n        processChildDOMOperationsQueue: function() {\n            if (this.domOperations) {\n                g.DOMIDOperations.manageChildrenByParentID(this._rootNodeID, this.domOperations);\n                this.domOperations = null;\n            }\n        ;\n        },\n        unmountMultiChild: function() {\n            var k = this._renderedChildren;\n            for (var l in k) {\n                if ((k.hasOwnProperty(l) && k[l])) {\n                    var m = k[l];\n                    (m.unmountComponent && m.unmountComponent());\n                }\n            ;\n            };\n            this._renderedChildren = null;\n        },\n        mountMultiChild: function(k, l) {\n            var m = \"\", n = 0;\n            for (var o in k) {\n                var p = k[o];\n                if ((k.hasOwnProperty(o) && p)) {\n                    m += p.mountComponent(((this._rootNodeID + \".\") + o), l);\n                    p._domIndex = n;\n                    n++;\n                }\n            ;\n            };\n            this._renderedChildren = k;\n            this.domOperations = null;\n            return m;\n        },\n        updateMultiChild: function(k, l) {\n            if ((!k && !this._renderedChildren)) {\n                return;\n            }\n             else if ((k && !this._renderedChildren)) {\n                this._renderedChildren = {\n                };\n            }\n             else if ((!k && this._renderedChildren)) {\n                k = {\n                };\n            }\n            \n        ;\n            var m = (this._rootNodeID + \".\"), n = null, o = 0, p = 0, q = 0;\n            for (var r in k) {\n                if (!k.hasOwnProperty(r)) {\n                    continue;\n                };\n                var s = this._renderedChildren[r], t = k[r];\n                if (h(s, t)) {\n                    if (n) {\n                        this.enqueueMarkupAt(n, (p - o));\n                        n = null;\n                    }\n                ;\n                    o = 0;\n                    if ((s._domIndex < q)) {\n                        this.enqueueMove(s._domIndex, p);\n                    };\n                    q = Math.max(s._domIndex, q);\n                    s.receiveProps(t.props, l);\n                    s._domIndex = p;\n                }\n                 else {\n                    if (s) {\n                        this.enqueueUnmountChildByName(r, s);\n                        q = Math.max(s._domIndex, q);\n                    }\n                ;\n                    if (t) {\n                        this._renderedChildren[r] = t;\n                        var u = t.mountComponent((m + r), l);\n                        n = (n ? (n + u) : u);\n                        o++;\n                        t._domIndex = p;\n                    }\n                ;\n                }\n            ;\n                p = (t ? (p + 1) : p);\n            };\n            if (n) {\n                this.enqueueMarkupAt(n, (p - o));\n            };\n            for (var v in this._renderedChildren) {\n                if (!this._renderedChildren.hasOwnProperty(v)) {\n                    continue;\n                };\n                var w = this._renderedChildren[v];\n                if ((w && !k[v])) {\n                    this.enqueueUnmountChildByName(v, w);\n                };\n            };\n            this.processChildDOMOperationsQueue();\n        }\n    }, j = {\n        Mixin: i\n    };\n    e.exports = j;\n});\n__d(\"ReactTextComponent\", [\"ReactComponent\",\"ReactID\",\"escapeTextForBrowser\",\"mixInto\",], function(a, b, c, d, e, f) {\n    var g = b(\"ReactComponent\"), h = b(\"ReactID\"), i = b(\"escapeTextForBrowser\"), j = b(\"mixInto\"), k = function(l) {\n        this.construct({\n            text: l\n        });\n    };\n    j(k, g.Mixin);\n    j(k, {\n        mountComponent: function(l) {\n            g.Mixin.mountComponent.call(this, l);\n            return (((((((\"\\u003Cspan \" + h.ATTR_NAME) + \"=\\\"\") + l) + \"\\\"\\u003E\") + i(this.props.text)) + \"\\u003C/span\\u003E\"));\n        },\n        receiveProps: function(l, m) {\n            if ((l.text !== this.props.text)) {\n                this.props.text = l.text;\n                g.DOMIDOperations.updateTextContentByID(this._rootNodeID, l.text);\n            }\n        ;\n        }\n    });\n    e.exports = k;\n});\n__d(\"flattenChildren\", [\"ReactComponent\",\"ReactTextComponent\",\"throwIf\",], function(a, b, c, d, e, f) {\n    var g = b(\"ReactComponent\"), h = b(\"ReactTextComponent\"), i = b(\"throwIf\"), j = \"INVALID_CHILD\", k = (\"You have two children with identical keys. Make sure that you set the \" + \"\\\"key\\\" property to a unique value such as a row ID.\"), l = function(n, o, p) {\n        if (Array.isArray(o)) {\n            for (var q = 0; (q < o.length); q++) {\n                var r = o[q];\n                l(n, r, (((p + \"[\") + g.getKey(r, q)) + \"]\"));\n            };\n        }\n         else {\n            var s = typeof o, t = (p === \"\"), u = (t ? ((\"[\" + g.getKey(o, 0)) + \"]\") : p);\n            if ((((o === null) || (o === undefined)) || (s === \"boolean\"))) {\n                n[u] = null;\n            }\n             else if (o.mountComponentIntoNode) {\n                n[u] = o;\n            }\n             else if ((s === \"object\")) {\n                i((o && (o.nodeType === 1)), j);\n                for (var v in o) {\n                    if (o.hasOwnProperty(v)) {\n                        l(n, o[v], (((p + \"{\") + v) + \"}\"));\n                    };\n                };\n            }\n             else if ((s === \"string\")) {\n                n[u] = new h(o);\n            }\n             else if ((s === \"number\")) {\n                n[u] = new h((\"\" + o));\n            }\n            \n            \n            \n        ;\n        }\n    ;\n    };\n    function m(n) {\n        if (((n === null) || (n === undefined))) {\n            return n\n        };\n        var o = {\n        };\n        l(o, n, \"\");\n        return o;\n    };\n    e.exports = m;\n});\n__d(\"ReactNativeComponent\", [\"CSSPropertyOperations\",\"DOMPropertyOperations\",\"ReactComponent\",\"ReactEventEmitter\",\"ReactMultiChild\",\"ReactID\",\"escapeTextForBrowser\",\"flattenChildren\",\"invariant\",\"keyOf\",\"merge\",\"mixInto\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSSPropertyOperations\"), h = b(\"DOMPropertyOperations\"), i = b(\"ReactComponent\"), j = b(\"ReactEventEmitter\"), k = b(\"ReactMultiChild\"), l = b(\"ReactID\"), m = b(\"escapeTextForBrowser\"), n = b(\"flattenChildren\"), o = b(\"invariant\"), p = b(\"keyOf\"), q = b(\"merge\"), r = b(\"mixInto\"), s = j.putListener, t = j.deleteListener, u = j.registrationNames, v = {\n        string: true,\n        number: true\n    }, w = p({\n        dangerouslySetInnerHTML: null\n    }), x = p({\n        style: null\n    });\n    function y(aa) {\n        if (!aa) {\n            return\n        };\n        o(((aa.children == null) || (aa.dangerouslySetInnerHTML == null)));\n        o(((aa.style == null) || (typeof aa.style === \"object\")));\n    };\n    function z(aa, ba) {\n        this._tagOpen = ((\"\\u003C\" + aa) + \" \");\n        this._tagClose = (ba ? \"\" : ((\"\\u003C/\" + aa) + \"\\u003E\"));\n        this.tagName = aa.toUpperCase();\n    };\n    z.Mixin = {\n        mountComponent: function(aa, ba) {\n            i.Mixin.mountComponent.call(this, aa, ba);\n            y(this.props);\n            return (((this._createOpenTagMarkup() + this._createContentMarkup(ba)) + this._tagClose));\n        },\n        _createOpenTagMarkup: function() {\n            var aa = this.props, ba = this._tagOpen;\n            for (var ca in aa) {\n                if (!aa.hasOwnProperty(ca)) {\n                    continue;\n                };\n                var da = aa[ca];\n                if ((da == null)) {\n                    continue;\n                };\n                if (u[ca]) {\n                    s(this._rootNodeID, ca, da);\n                }\n                 else {\n                    if ((ca === x)) {\n                        if (da) {\n                            da = aa.style = q(aa.style);\n                        };\n                        da = g.createMarkupForStyles(da);\n                    }\n                ;\n                    var ea = h.createMarkupForProperty(ca, da);\n                    if (ea) {\n                        ba += (\" \" + ea);\n                    };\n                }\n            ;\n            };\n            var fa = m(this._rootNodeID);\n            return (((((ba + \" \") + l.ATTR_NAME) + \"=\\\"\") + fa) + \"\\\"\\u003E\");\n        },\n        _createContentMarkup: function(aa) {\n            var ba = this.props.dangerouslySetInnerHTML;\n            if ((ba != null)) {\n                if ((ba.__html != null)) {\n                    return ba.__html\n                };\n            }\n             else {\n                var ca = (v[typeof this.props.children] ? this.props.children : null), da = ((ca != null) ? null : this.props.children);\n                if ((ca != null)) {\n                    return m(ca);\n                }\n                 else if ((da != null)) {\n                    return this.mountMultiChild(n(da), aa)\n                }\n            ;\n            }\n        ;\n            return \"\";\n        },\n        receiveProps: function(aa, ba) {\n            y(aa);\n            i.Mixin.receiveProps.call(this, aa, ba);\n        },\n        updateComponent: function(aa, ba) {\n            i.Mixin.updateComponent.call(this, aa, ba);\n            this._updateDOMProperties(ba);\n            this._updateDOMChildren(ba, aa);\n        },\n        _updateDOMProperties: function(aa) {\n            var ba = this.props, ca, da, ea;\n            for (ca in aa) {\n                if ((ba.hasOwnProperty(ca) || !aa.hasOwnProperty(ca))) {\n                    continue;\n                };\n                if ((ca === x)) {\n                    var fa = aa[ca];\n                    for (da in fa) {\n                        if (fa.hasOwnProperty(da)) {\n                            ea = (ea || {\n                            });\n                            ea[da] = \"\";\n                        }\n                    ;\n                    };\n                }\n                 else if ((ca === w)) {\n                    i.DOMIDOperations.updateTextContentByID(this._rootNodeID, \"\");\n                }\n                 else if (u[ca]) {\n                    t(this._rootNodeID, ca);\n                }\n                 else i.DOMIDOperations.deletePropertyByID(this._rootNodeID, ca);\n                \n                \n            ;\n            };\n            for (ca in ba) {\n                var ga = ba[ca], ha = aa[ca];\n                if ((!ba.hasOwnProperty(ca) || (ga === ha))) {\n                    continue;\n                };\n                if ((ca === x)) {\n                    if (ga) {\n                        ga = ba.style = q(ga);\n                    };\n                    if (ha) {\n                        for (da in ha) {\n                            if ((ha.hasOwnProperty(da) && !ga.hasOwnProperty(da))) {\n                                ea = (ea || {\n                                });\n                                ea[da] = \"\";\n                            }\n                        ;\n                        };\n                        for (da in ga) {\n                            if ((ga.hasOwnProperty(da) && (ha[da] !== ga[da]))) {\n                                ea = (ea || {\n                                });\n                                ea[da] = ga[da];\n                            }\n                        ;\n                        };\n                    }\n                     else ea = ga;\n                ;\n                }\n                 else if ((ca === w)) {\n                    var ia = (ha && ha.__html), ja = (ga && ga.__html);\n                    if ((ia !== ja)) {\n                        i.DOMIDOperations.updateInnerHTMLByID(this._rootNodeID, ga);\n                    };\n                }\n                 else if (u[ca]) {\n                    s(this._rootNodeID, ca, ga);\n                }\n                 else i.DOMIDOperations.updatePropertyByID(this._rootNodeID, ca, ga);\n                \n                \n            ;\n            };\n            if (ea) {\n                i.DOMIDOperations.updateStylesByID(this._rootNodeID, ea);\n            };\n        },\n        _updateDOMChildren: function(aa, ba) {\n            var ca = this.props, da = (v[typeof aa.children] ? aa.children : null), ea = (v[typeof ca.children] ? ca.children : null), fa = ((da != null) ? null : aa.children), ga = ((ea != null) ? null : ca.children);\n            if ((ea != null)) {\n                var ha = ((fa != null) && (ga == null));\n                if (ha) {\n                    this.updateMultiChild(null, ba);\n                };\n                if ((da !== ea)) {\n                    i.DOMIDOperations.updateTextContentByID(this._rootNodeID, (\"\" + ea));\n                };\n            }\n             else {\n                var ia = ((da != null) && (ea == null));\n                if (ia) {\n                    i.DOMIDOperations.updateTextContentByID(this._rootNodeID, \"\");\n                };\n                this.updateMultiChild(n(ca.children), ba);\n            }\n        ;\n        },\n        unmountComponent: function() {\n            j.deleteAllListeners(this._rootNodeID);\n            i.Mixin.unmountComponent.call(this);\n            this.unmountMultiChild();\n        }\n    };\n    r(z, i.Mixin);\n    r(z, z.Mixin);\n    r(z, k.Mixin);\n    e.exports = z;\n});\n__d(\"objMapKeyVal\", [], function(a, b, c, d, e, f) {\n    function g(h, i, j) {\n        if (!h) {\n            return null\n        };\n        var k = 0, l = {\n        };\n        for (var m in h) {\n            if (h.hasOwnProperty(m)) {\n                l[m] = i.call(j, m, h[m], k++);\n            };\n        };\n        return l;\n    };\n    e.exports = g;\n});\n__d(\"ReactDOM\", [\"ReactNativeComponent\",\"mergeInto\",\"objMapKeyVal\",], function(a, b, c, d, e, f) {\n    var g = b(\"ReactNativeComponent\"), h = b(\"mergeInto\"), i = b(\"objMapKeyVal\");\n    function j(m, n) {\n        var o = function() {\n        \n        };\n        o.prototype = new g(m, n);\n        o.prototype.constructor = o;\n        var p = function(q, r) {\n            var s = new o();\n            s.construct.apply(s, arguments);\n            return s;\n        };\n        p.componentConstructor = o;\n        return p;\n    };\n    var k = i({\n        a: false,\n        abbr: false,\n        address: false,\n        audio: false,\n        b: false,\n        blockquote: false,\n        body: false,\n        br: true,\n        button: false,\n        code: false,\n        col: true,\n        colgroup: false,\n        dd: false,\n        div: false,\n        section: false,\n        dl: false,\n        dt: false,\n        em: false,\n        embed: true,\n        fieldset: false,\n        figcaption: false,\n        figure: false,\n        footer: false,\n        form: false,\n        h1: false,\n        h2: false,\n        h3: false,\n        h4: false,\n        h5: false,\n        h6: false,\n        header: false,\n        hr: true,\n        i: false,\n        iframe: false,\n        img: true,\n        input: true,\n        label: false,\n        legend: false,\n        li: false,\n        line: false,\n        nav: false,\n        object: false,\n        ol: false,\n        optgroup: false,\n        option: false,\n        p: false,\n        param: true,\n        pre: false,\n        select: false,\n        small: false,\n        source: false,\n        span: false,\n        sub: false,\n        sup: false,\n        strong: false,\n        table: false,\n        tbody: false,\n        td: false,\n        textarea: false,\n        tfoot: false,\n        th: false,\n        thead: false,\n        time: false,\n        title: false,\n        tr: false,\n        u: false,\n        ul: false,\n        video: false,\n        wbr: false,\n        circle: false,\n        g: false,\n        path: false,\n        polyline: false,\n        rect: false,\n        svg: false,\n        text: false\n    }, j), l = {\n        injectComponentClasses: function(m) {\n            h(k, m);\n        }\n    };\n    k.injection = l;\n    e.exports = k;\n});\n__d(\"ReactProps\", [\"createObjectFrom\",\"invariant\",], function(a, b, c, d, e, f) {\n    var g = b(\"createObjectFrom\"), h = b(\"invariant\"), i = {\n        array: k(\"array\"),\n        bool: k(\"boolean\"),\n        func: k(\"function\"),\n        number: k(\"number\"),\n        object: k(\"object\"),\n        string: k(\"string\"),\n        oneOf: l,\n        instanceOf: m\n    }, j = \"\\u003C\\u003Canonymous\\u003E\\u003E\";\n    function k(o) {\n        function p(q, r, s) {\n            var t = typeof q;\n            if (((t === \"object\") && Array.isArray(q))) {\n                t = \"array\";\n            };\n            h((t === o));\n        };\n        return n(p);\n    };\n    function l(o) {\n        var p = g(o);\n        function q(r, s, t) {\n            h(p[r]);\n        };\n        return n(q);\n    };\n    function m(o) {\n        function p(q, r, s) {\n            h((q instanceof o));\n        };\n        return n(p);\n    };\n    function n(o) {\n        function p(q) {\n            function r(s, t, u) {\n                var v = s[t];\n                if ((v != null)) {\n                    o(v, t, (u || j));\n                }\n                 else h(!q);\n            ;\n            };\n            if (!q) {\n                r.isRequired = p(true);\n            };\n            return r;\n        };\n        return p(false);\n    };\n    e.exports = i;\n});\n__d(\"ReactServerRendering\", [\"ReactReconcileTransaction\",\"ReactInstanceHandles\",], function(a, b, c, d, e, f) {\n    var g = b(\"ReactReconcileTransaction\"), h = b(\"ReactInstanceHandles\");\n    function i(j, k) {\n        var l = h.createReactRootID(), m = g.getPooled();\n        m.reinitializeTransaction();\n        try {\n            m.perform(function() {\n                k(j.mountComponent(l, m));\n            }, null);\n        } finally {\n            g.release(m);\n        };\n    };\n    e.exports = {\n        renderComponentToString: i\n    };\n});\n__d(\"ReactDOMForm\", [\"ReactCompositeComponent\",\"ReactDOM\",\"ReactEventEmitter\",\"EventConstants\",], function(a, b, c, d, e, f) {\n    var g = b(\"ReactCompositeComponent\"), h = b(\"ReactDOM\"), i = b(\"ReactEventEmitter\"), j = b(\"EventConstants\"), k = h.form, l = g.createClass({\n        render: function() {\n            return this.transferPropsTo(k(null, this.props.children));\n        },\n        componentDidMount: function(m) {\n            i.trapBubbledEvent(j.topLevelTypes.topSubmit, \"submit\", m);\n        }\n    });\n    e.exports = l;\n});\n__d(\"ReactDOMInput\", [\"DOMPropertyOperations\",\"ReactCompositeComponent\",\"ReactDOM\",\"merge\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOMPropertyOperations\"), h = b(\"ReactCompositeComponent\"), i = b(\"ReactDOM\"), j = b(\"merge\"), k = i.input, l = h.createClass({\n        getInitialState: function() {\n            return {\n                checked: (this.props.defaultChecked || false),\n                value: (this.props.defaultValue || \"\")\n            };\n        },\n        shouldComponentUpdate: function() {\n            return !this._isChanging;\n        },\n        getChecked: function() {\n            return ((this.props.checked != null) ? this.props.checked : this.state.checked);\n        },\n        getValue: function() {\n            return ((this.props.value != null) ? this.props.value : this.state.value);\n        },\n        render: function() {\n            var m = j(this.props);\n            m.checked = this.getChecked();\n            m.value = this.getValue();\n            m.onChange = this.handleChange;\n            return k(m, this.props.children);\n        },\n        componentDidUpdate: function(m, n, o) {\n            if ((this.props.checked != null)) {\n                g.setValueForProperty(o, \"checked\", (this.props.checked || false));\n            };\n            if ((this.props.value != null)) {\n                g.setValueForProperty(o, \"value\", (this.props.value || \"\"));\n            };\n        },\n        handleChange: h.autoBind(function(event) {\n            var m;\n            if (this.props.onChange) {\n                this._isChanging = true;\n                m = this.props.onChange(event);\n                this._isChanging = false;\n            }\n        ;\n            this.setState({\n                checked: event.target.checked,\n                value: event.target.value\n            });\n            return m;\n        })\n    });\n    e.exports = l;\n});\n__d(\"ReactDOMTextarea\", [\"DOMPropertyOperations\",\"ReactCompositeComponent\",\"ReactDOM\",\"invariant\",\"merge\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOMPropertyOperations\"), h = b(\"ReactCompositeComponent\"), i = b(\"ReactDOM\"), j = b(\"invariant\"), k = b(\"merge\"), l = i.textarea, m = {\n        string: true,\n        number: true\n    }, n = h.createClass({\n        getInitialState: function() {\n            var o = this.props.defaultValue, p = this.props.children;\n            if ((p != null)) {\n                j((o == null));\n                if (Array.isArray(p)) {\n                    j((p.length <= 1));\n                    p = p[0];\n                }\n            ;\n                j(m[typeof p]);\n                o = (\"\" + p);\n            }\n        ;\n            o = (o || \"\");\n            return {\n                initialValue: ((this.props.value != null) ? this.props.value : o),\n                value: o\n            };\n        },\n        shouldComponentUpdate: function() {\n            return !this._isChanging;\n        },\n        getValue: function() {\n            return ((this.props.value != null) ? this.props.value : this.state.value);\n        },\n        render: function() {\n            var o = k(this.props);\n            j((o.dangerouslySetInnerHTML == null));\n            o.value = this.getValue();\n            o.onChange = this.handleChange;\n            return l(o, this.state.initialValue);\n        },\n        componentDidUpdate: function(o, p, q) {\n            if ((this.props.value != null)) {\n                g.setValueForProperty(q, \"value\", (this.props.value || \"\"));\n            };\n        },\n        handleChange: h.autoBind(function(event) {\n            var o;\n            if (this.props.onChange) {\n                this._isChanging = true;\n                o = this.props.onChange(event);\n                this._isChanging = false;\n            }\n        ;\n            this.setState({\n                value: event.target.value\n            });\n            return o;\n        })\n    });\n    e.exports = n;\n});\n__d(\"DefaultDOMPropertyConfig\", [\"DOMProperty\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOMProperty\"), h = g.injection.MUST_USE_ATTRIBUTE, i = g.injection.MUST_USE_PROPERTY, j = g.injection.HAS_BOOLEAN_VALUE, k = g.injection.HAS_SIDE_EFFECTS, l = {\n        isCustomAttribute: RegExp.prototype.test.bind(/^(data|aria)-[a-z_][a-z\\d_.\\-]*$/),\n        Properties: {\n            accept: null,\n            action: null,\n            ajaxify: h,\n            allowFullScreen: (h | j),\n            alt: null,\n            autoComplete: null,\n            autoplay: j,\n            cellPadding: null,\n            cellSpacing: null,\n            checked: (i | j),\n            className: i,\n            colSpan: null,\n            contentEditable: null,\n            controls: (i | j),\n            data: null,\n            dir: null,\n            disabled: (i | j),\n            draggable: null,\n            enctype: null,\n            height: h,\n            hidden: (h | j),\n            href: null,\n            htmlFor: null,\n            id: i,\n            max: null,\n            method: null,\n            min: null,\n            multiple: (i | j),\n            name: null,\n            poster: null,\n            preload: null,\n            placeholder: null,\n            rel: null,\n            required: j,\n            role: h,\n            scrollLeft: i,\n            scrollTop: i,\n            selected: (i | j),\n            spellCheck: null,\n            src: null,\n            step: null,\n            style: null,\n            tabIndex: null,\n            target: null,\n            title: null,\n            type: null,\n            value: (i | k),\n            width: h,\n            wmode: h,\n            cx: i,\n            cy: i,\n            d: i,\n            fill: i,\n            fx: i,\n            fy: i,\n            points: i,\n            r: i,\n            stroke: i,\n            strokeLinecap: i,\n            strokeWidth: i,\n            transform: i,\n            x: i,\n            x1: i,\n            x2: i,\n            version: i,\n            viewBox: i,\n            y: i,\n            y1: i,\n            y2: i,\n            spreadMethod: i,\n            offset: i,\n            stopColor: i,\n            stopOpacity: i,\n            gradientUnits: i,\n            gradientTransform: i\n        },\n        DOMAttributeNames: {\n            className: \"class\",\n            htmlFor: \"for\",\n            strokeLinecap: \"stroke-linecap\",\n            strokeWidth: \"stroke-width\",\n            stopColor: \"stop-color\",\n            stopOpacity: \"stop-opacity\"\n        },\n        DOMPropertyNames: {\n            autoComplete: \"autocomplete\",\n            spellCheck: \"spellcheck\"\n        },\n        DOMMutationMethods: {\n            className: function(m, n) {\n                m.className = (n || \"\");\n            }\n        }\n    };\n    e.exports = l;\n});\n__d(\"DefaultEventPluginOrder\", [\"keyOf\",], function(a, b, c, d, e, f) {\n    var g = b(\"keyOf\"), h = [g({\n        ResponderEventPlugin: null\n    }),g({\n        SimpleEventPlugin: null\n    }),g({\n        TapEventPlugin: null\n    }),g({\n        EnterLeaveEventPlugin: null\n    }),g({\n        ChangeEventPlugin: null\n    }),g({\n        AnalyticsEventPlugin: null\n    }),];\n    e.exports = h;\n});\n__d(\"SyntheticEvent\", [\"PooledClass\",\"emptyFunction\",\"getEventTarget\",\"merge\",\"mergeInto\",], function(a, b, c, d, e, f) {\n    var g = b(\"PooledClass\"), h = b(\"emptyFunction\"), i = b(\"getEventTarget\"), j = b(\"merge\"), k = b(\"mergeInto\"), l = {\n        type: null,\n        target: i,\n        currentTarget: null,\n        eventPhase: null,\n        bubbles: null,\n        cancelable: null,\n        timeStamp: function(event) {\n            return (event.timeStamp || Date.now());\n        },\n        defaultPrevented: null,\n        isTrusted: null\n    };\n    function m(n, o, p) {\n        this.dispatchConfig = n;\n        this.dispatchMarker = o;\n        this.nativeEvent = p;\n        var q = this.constructor.Interface;\n        for (var r in q) {\n            var s = q[r];\n            if (s) {\n                this[r] = s(p);\n            }\n             else this[r] = p[r];\n        ;\n        };\n        if ((p.defaultPrevented || (p.returnValue === false))) {\n            this.isDefaultPrevented = h.thatReturnsTrue;\n        }\n         else this.isDefaultPrevented = h.thatReturnsFalse;\n    ;\n        this.isPropagationStopped = h.thatReturnsFalse;\n    };\n    k(m.prototype, {\n        preventDefault: function() {\n            this.defaultPrevented = true;\n            var event = this.nativeEvent;\n            (event.preventDefault ? event.preventDefault() : event.returnValue = false);\n            this.isDefaultPrevented = h.thatReturnsTrue;\n        },\n        stopPropagation: function() {\n            var event = this.nativeEvent;\n            (event.stopPropagation ? event.stopPropagation() : event.cancelBubble = true);\n            this.isPropagationStopped = h.thatReturnsTrue;\n        },\n        persist: function() {\n            this.isPersistent = h.thatReturnsTrue;\n        },\n        isPersistent: h.thatReturnsFalse,\n        destructor: function() {\n            var n = this.constructor.Interface;\n            for (var o in n) {\n                this[o] = null;;\n            };\n            this.dispatchConfig = null;\n            this.dispatchMarker = null;\n            this.nativeEvent = null;\n        }\n    });\n    m.Interface = l;\n    m.augmentClass = function(n, o) {\n        var p = this, q = Object.create(p.prototype);\n        k(q, n.prototype);\n        n.prototype = q;\n        n.prototype.constructor = n;\n        n.Interface = j(p.Interface, o);\n        n.augmentClass = p.augmentClass;\n        g.addPoolingTo(n, g.threeArgumentPooler);\n    };\n    g.addPoolingTo(m, g.threeArgumentPooler);\n    e.exports = m;\n});\n__d(\"SyntheticUIEvent\", [\"SyntheticEvent\",], function(a, b, c, d, e, f) {\n    var g = b(\"SyntheticEvent\"), h = {\n        view: null,\n        detail: null\n    };\n    function i(j, k, l) {\n        g.call(this, j, k, l);\n    };\n    g.augmentClass(i, h);\n    e.exports = i;\n});\n__d(\"SyntheticMouseEvent\", [\"SyntheticUIEvent\",\"ViewportMetrics\",], function(a, b, c, d, e, f) {\n    var g = b(\"SyntheticUIEvent\"), h = b(\"ViewportMetrics\"), i = {\n        screenX: null,\n        screenY: null,\n        clientX: null,\n        clientY: null,\n        ctrlKey: null,\n        shiftKey: null,\n        altKey: null,\n        metaKey: null,\n        button: function(event) {\n            var k = event.button;\n            if ((\"which\" in event)) {\n                return k\n            };\n            return ((k === 2) ? 2 : ((k === 4) ? 1 : 0));\n        },\n        buttons: null,\n        relatedTarget: function(event) {\n            return (event.relatedTarget || (((event.fromElement === event.srcElement) ? event.toElement : event.fromElement)));\n        },\n        pageX: function(event) {\n            return ((\"pageX\" in event) ? event.pageX : (event.clientX + h.currentScrollLeft));\n        },\n        pageY: function(event) {\n            return ((\"pageY\" in event) ? event.pageY : (event.clientY + h.currentScrollTop));\n        }\n    };\n    function j(k, l, m) {\n        g.call(this, k, l, m);\n    };\n    g.augmentClass(j, i);\n    e.exports = j;\n});\n__d(\"EnterLeaveEventPlugin\", [\"EventConstants\",\"EventPropagators\",\"ExecutionEnvironment\",\"ReactInstanceHandles\",\"SyntheticMouseEvent\",\"ReactID\",\"keyOf\",], function(a, b, c, d, e, f) {\n    var g = b(\"EventConstants\"), h = b(\"EventPropagators\"), i = b(\"ExecutionEnvironment\"), j = b(\"ReactInstanceHandles\"), k = b(\"SyntheticMouseEvent\"), l = b(\"ReactID\"), m = b(\"keyOf\"), n = g.topLevelTypes, o = j.getFirstReactDOM, p = {\n        mouseEnter: {\n            registrationName: m({\n                onMouseEnter: null\n            })\n        },\n        mouseLeave: {\n            registrationName: m({\n                onMouseLeave: null\n            })\n        }\n    }, q = {\n        eventTypes: p,\n        extractEvents: function(r, s, t, u) {\n            if (((r === n.topMouseOver) && ((u.relatedTarget || u.fromElement)))) {\n                return null\n            };\n            if (((r !== n.topMouseOut) && (r !== n.topMouseOver))) {\n                return null\n            };\n            var v, w;\n            if ((r === n.topMouseOut)) {\n                v = s;\n                w = (o((u.relatedTarget || u.toElement)) || i.global);\n            }\n             else {\n                v = i.global;\n                w = s;\n            }\n        ;\n            if ((v === w)) {\n                return null\n            };\n            var x = (v ? l.getID(v) : \"\"), y = (w ? l.getID(w) : \"\"), z = k.getPooled(p.mouseLeave, x, u), aa = k.getPooled(p.mouseEnter, y, u);\n            h.accumulateEnterLeaveDispatches(z, aa, x, y);\n            return [z,aa,];\n        }\n    };\n    e.exports = q;\n});\n__d(\"ChangeEventPlugin\", [\"EventConstants\",\"EventPluginHub\",\"EventPropagators\",\"ExecutionEnvironment\",\"SyntheticEvent\",\"isEventSupported\",\"keyOf\",], function(a, b, c, d, e, f) {\n    var g = b(\"EventConstants\"), h = b(\"EventPluginHub\"), i = b(\"EventPropagators\"), j = b(\"ExecutionEnvironment\"), k = b(\"SyntheticEvent\"), l = b(\"isEventSupported\"), m = b(\"keyOf\"), n = g.topLevelTypes, o = {\n        change: {\n            phasedRegistrationNames: {\n                bubbled: m({\n                    onChange: null\n                }),\n                captured: m({\n                    onChangeCapture: null\n                })\n            }\n        }\n    }, p = null, q = null, r = null, s = null;\n    function t(na) {\n        return (((na.nodeName === \"SELECT\") || (((na.nodeName === \"INPUT\") && (na.type === \"file\")))));\n    };\n    var u = false;\n    if (j.canUseDOM) {\n        u = (l(\"change\") && ((!((\"documentMode\" in document)) || (document.documentMode > 8))));\n    };\n    function v(na) {\n        var event = k.getPooled(o.change, q, na);\n        i.accumulateTwoPhaseDispatches(event);\n        h.enqueueEvents(event);\n        h.processEventQueue();\n    };\n    function w(na, oa) {\n        p = na;\n        q = oa;\n        p.attachEvent(\"onchange\", v);\n    };\n    function x() {\n        if (!p) {\n            return\n        };\n        p.detachEvent(\"onchange\", v);\n        p = null;\n        q = null;\n    };\n    function y(na, oa, pa) {\n        if ((na === n.topChange)) {\n            return pa\n        };\n    };\n    function z(na, oa, pa) {\n        if ((na === n.topFocus)) {\n            x();\n            w(oa, pa);\n        }\n         else if ((na === n.topBlur)) {\n            x();\n        }\n    ;\n    };\n    var aa = false;\n    if (j.canUseDOM) {\n        aa = (l(\"input\") && ((!((\"documentMode\" in document)) || (document.documentMode > 9))));\n    };\n    var ba = {\n        color: true,\n        date: true,\n        datetime: true,\n        \"datetime-local\": true,\n        email: true,\n        month: true,\n        number: true,\n        password: true,\n        range: true,\n        search: true,\n        tel: true,\n        text: true,\n        time: true,\n        url: true,\n        week: true\n    };\n    function ca(na) {\n        return (((((na.nodeName === \"INPUT\") && ba[na.type])) || (na.nodeName === \"TEXTAREA\")));\n    };\n    var da = {\n        get: function() {\n            return s.get.call(this);\n        },\n        set: function(na) {\n            r = na;\n            s.set.call(this, na);\n        }\n    };\n    function ea(na, oa) {\n        p = na;\n        q = oa;\n        r = na.value;\n        s = Object.getOwnPropertyDescriptor(na.constructor.prototype, \"value\");\n        Object.defineProperty(p, \"value\", da);\n        p.attachEvent(\"onpropertychange\", ga);\n    };\n    function fa() {\n        if (!p) {\n            return\n        };\n        delete p.value;\n        p.detachEvent(\"onpropertychange\", ga);\n        p = null;\n        q = null;\n        r = null;\n        s = null;\n    };\n    function ga(na) {\n        if ((na.propertyName !== \"value\")) {\n            return\n        };\n        var oa = na.srcElement.value;\n        if ((oa === r)) {\n            return\n        };\n        r = oa;\n        v(na);\n    };\n    function ha(na, oa, pa) {\n        if ((na === n.topInput)) {\n            return pa\n        };\n    };\n    function ia(na, oa, pa) {\n        if ((na === n.topFocus)) {\n            fa();\n            ea(oa, pa);\n        }\n         else if ((na === n.topBlur)) {\n            fa();\n        }\n    ;\n    };\n    function ja(na, oa, pa) {\n        if ((((na === n.topSelectionChange) || (na === n.topKeyUp)) || (na === n.topKeyDown))) {\n            if ((p && (p.value !== r))) {\n                r = p.value;\n                return q;\n            }\n        \n        };\n    };\n    function ka(na) {\n        return (((na.nodeName === \"INPUT\") && (((na.type === \"checkbox\") || (na.type === \"radio\")))));\n    };\n    function la(na, oa, pa) {\n        if ((na === n.topClick)) {\n            return pa\n        };\n    };\n    var ma = {\n        eventTypes: o,\n        extractEvents: function(na, oa, pa, qa) {\n            var ra, sa;\n            if (t(oa)) {\n                if (u) {\n                    ra = y;\n                }\n                 else sa = z;\n            ;\n            }\n             else if (ca(oa)) {\n                if (aa) {\n                    ra = ha;\n                }\n                 else {\n                    ra = ja;\n                    sa = ia;\n                }\n            ;\n            }\n             else if (ka(oa)) {\n                ra = la;\n            }\n            \n        ;\n            if (ra) {\n                var ta = ra(na, oa, pa);\n                if (ta) {\n                    var event = k.getPooled(o.change, ta, qa);\n                    i.accumulateTwoPhaseDispatches(event);\n                    return event;\n                }\n            ;\n            }\n        ;\n            if (sa) {\n                sa(na, oa, pa);\n            };\n        }\n    };\n    e.exports = ma;\n});\n__d(\"SyntheticFocusEvent\", [\"SyntheticUIEvent\",], function(a, b, c, d, e, f) {\n    var g = b(\"SyntheticUIEvent\"), h = {\n        relatedTarget: null\n    };\n    function i(j, k, l) {\n        g.call(this, j, k, l);\n    };\n    g.augmentClass(i, h);\n    e.exports = i;\n});\n__d(\"SyntheticKeyboardEvent\", [\"SyntheticUIEvent\",], function(a, b, c, d, e, f) {\n    var g = b(\"SyntheticUIEvent\"), h = {\n        char: null,\n        key: null,\n        location: null,\n        ctrlKey: null,\n        shiftKey: null,\n        altKey: null,\n        metaKey: null,\n        repeat: null,\n        locale: null,\n        charCode: null,\n        keyCode: null,\n        which: null\n    };\n    function i(j, k, l) {\n        g.call(this, j, k, l);\n    };\n    g.augmentClass(i, h);\n    e.exports = i;\n});\n__d(\"SyntheticMutationEvent\", [\"SyntheticEvent\",], function(a, b, c, d, e, f) {\n    var g = b(\"SyntheticEvent\"), h = {\n        relatedNode: null,\n        prevValue: null,\n        newValue: null,\n        attrName: null,\n        attrChange: null\n    };\n    function i(j, k, l) {\n        g.call(this, j, k, l);\n    };\n    g.augmentClass(i, h);\n    e.exports = i;\n});\n__d(\"SyntheticTouchEvent\", [\"SyntheticUIEvent\",], function(a, b, c, d, e, f) {\n    var g = b(\"SyntheticUIEvent\"), h = {\n        touches: null,\n        targetTouches: null,\n        changedTouches: null,\n        altKey: null,\n        metaKey: null,\n        ctrlKey: null,\n        shiftKey: null\n    };\n    function i(j, k, l) {\n        g.call(this, j, k, l);\n    };\n    g.augmentClass(i, h);\n    e.exports = i;\n});\n__d(\"SyntheticWheelEvent\", [\"SyntheticMouseEvent\",], function(a, b, c, d, e, f) {\n    var g = b(\"SyntheticMouseEvent\"), h = {\n        deltaX: function(event) {\n            return (((\"deltaX\" in event) ? event.deltaX : ((\"wheelDeltaX\" in event) ? -event.wheelDeltaX : 0)));\n        },\n        deltaY: function(event) {\n            return (((\"deltaY\" in event) ? -event.deltaY : ((\"wheelDeltaY\" in event) ? event.wheelDeltaY : ((\"wheelDelta\" in event) ? event.wheelData : 0))));\n        },\n        deltaZ: null,\n        deltaMode: null\n    };\n    function i(j, k, l) {\n        g.call(this, j, k, l);\n    };\n    g.augmentClass(i, h);\n    e.exports = i;\n});\n__d(\"SimpleEventPlugin\", [\"EventConstants\",\"EventPropagators\",\"SyntheticEvent\",\"SyntheticFocusEvent\",\"SyntheticKeyboardEvent\",\"SyntheticMouseEvent\",\"SyntheticMutationEvent\",\"SyntheticTouchEvent\",\"SyntheticUIEvent\",\"SyntheticWheelEvent\",\"invariant\",\"keyOf\",], function(a, b, c, d, e, f) {\n    var g = b(\"EventConstants\"), h = b(\"EventPropagators\"), i = b(\"SyntheticEvent\"), j = b(\"SyntheticFocusEvent\"), k = b(\"SyntheticKeyboardEvent\"), l = b(\"SyntheticMouseEvent\"), m = b(\"SyntheticMutationEvent\"), n = b(\"SyntheticTouchEvent\"), o = b(\"SyntheticUIEvent\"), p = b(\"SyntheticWheelEvent\"), q = b(\"invariant\"), r = b(\"keyOf\"), s = g.topLevelTypes, t = {\n        blur: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onBlur: true\n                }),\n                captured: r({\n                    onBlurCapture: true\n                })\n            }\n        },\n        click: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onClick: true\n                }),\n                captured: r({\n                    onClickCapture: true\n                })\n            }\n        },\n        doubleClick: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onDoubleClick: true\n                }),\n                captured: r({\n                    onDoubleClickCapture: true\n                })\n            }\n        },\n        drag: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onDrag: true\n                }),\n                captured: r({\n                    onDragCapture: true\n                })\n            }\n        },\n        dragEnd: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onDragEnd: true\n                }),\n                captured: r({\n                    onDragEndCapture: true\n                })\n            }\n        },\n        dragEnter: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onDragEnter: true\n                }),\n                captured: r({\n                    onDragEnterCapture: true\n                })\n            }\n        },\n        dragExit: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onDragExit: true\n                }),\n                captured: r({\n                    onDragExitCapture: true\n                })\n            }\n        },\n        dragLeave: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onDragLeave: true\n                }),\n                captured: r({\n                    onDragLeaveCapture: true\n                })\n            }\n        },\n        dragOver: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onDragOver: true\n                }),\n                captured: r({\n                    onDragOverCapture: true\n                })\n            }\n        },\n        dragStart: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onDragStart: true\n                }),\n                captured: r({\n                    onDragStartCapture: true\n                })\n            }\n        },\n        drop: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onDrop: true\n                }),\n                captured: r({\n                    onDropCapture: true\n                })\n            }\n        },\n        DOMCharacterDataModified: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onDOMCharacterDataModified: true\n                }),\n                captured: r({\n                    onDOMCharacterDataModifiedCapture: true\n                })\n            }\n        },\n        focus: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onFocus: true\n                }),\n                captured: r({\n                    onFocusCapture: true\n                })\n            }\n        },\n        input: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onInput: true\n                }),\n                captured: r({\n                    onInputCapture: true\n                })\n            }\n        },\n        keyDown: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onKeyDown: true\n                }),\n                captured: r({\n                    onKeyDownCapture: true\n                })\n            }\n        },\n        keyPress: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onKeyPress: true\n                }),\n                captured: r({\n                    onKeyPressCapture: true\n                })\n            }\n        },\n        keyUp: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onKeyUp: true\n                }),\n                captured: r({\n                    onKeyUpCapture: true\n                })\n            }\n        },\n        mouseDown: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onMouseDown: true\n                }),\n                captured: r({\n                    onMouseDownCapture: true\n                })\n            }\n        },\n        mouseMove: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onMouseMove: true\n                }),\n                captured: r({\n                    onMouseMoveCapture: true\n                })\n            }\n        },\n        mouseUp: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onMouseUp: true\n                }),\n                captured: r({\n                    onMouseUpCapture: true\n                })\n            }\n        },\n        scroll: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onScroll: true\n                }),\n                captured: r({\n                    onScrollCapture: true\n                })\n            }\n        },\n        submit: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onSubmit: true\n                }),\n                captured: r({\n                    onSubmitCapture: true\n                })\n            }\n        },\n        touchCancel: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onTouchCancel: true\n                }),\n                captured: r({\n                    onTouchCancelCapture: true\n                })\n            }\n        },\n        touchEnd: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onTouchEnd: true\n                }),\n                captured: r({\n                    onTouchEndCapture: true\n                })\n            }\n        },\n        touchMove: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onTouchMove: true\n                }),\n                captured: r({\n                    onTouchMoveCapture: true\n                })\n            }\n        },\n        touchStart: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onTouchStart: true\n                }),\n                captured: r({\n                    onTouchStartCapture: true\n                })\n            }\n        },\n        wheel: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onWheel: true\n                }),\n                captured: r({\n                    onWheelCapture: true\n                })\n            }\n        }\n    }, u = {\n        topBlur: t.blur,\n        topClick: t.click,\n        topDoubleClick: t.doubleClick,\n        topDOMCharacterDataModified: t.DOMCharacterDataModified,\n        topDrag: t.drag,\n        topDragEnd: t.dragEnd,\n        topDragEnter: t.dragEnter,\n        topDragExit: t.dragExit,\n        topDragLeave: t.dragLeave,\n        topDragOver: t.dragOver,\n        topDragStart: t.dragStart,\n        topDrop: t.drop,\n        topFocus: t.focus,\n        topInput: t.input,\n        topKeyDown: t.keyDown,\n        topKeyPress: t.keyPress,\n        topKeyUp: t.keyUp,\n        topMouseDown: t.mouseDown,\n        topMouseMove: t.mouseMove,\n        topMouseUp: t.mouseUp,\n        topScroll: t.scroll,\n        topSubmit: t.submit,\n        topTouchCancel: t.touchCancel,\n        topTouchEnd: t.touchEnd,\n        topTouchMove: t.touchMove,\n        topTouchStart: t.touchStart,\n        topWheel: t.wheel\n    }, v = {\n        eventTypes: t,\n        executeDispatch: function(event, w, x) {\n            var y = w(event, x);\n            if ((y === false)) {\n                event.stopPropagation();\n                event.preventDefault();\n            }\n        ;\n        },\n        extractEvents: function(w, x, y, z) {\n            var aa = u[w];\n            if (!aa) {\n                return null\n            };\n            var ba;\n            switch (w) {\n              case s.topInput:\n            \n              case s.topSubmit:\n                ba = i;\n                break;\n              case s.topKeyDown:\n            \n              case s.topKeyPress:\n            \n              case s.topKeyUp:\n                ba = k;\n                break;\n              case s.topBlur:\n            \n              case s.topFocus:\n                ba = j;\n                break;\n              case s.topClick:\n            \n              case s.topDoubleClick:\n            \n              case s.topDrag:\n            \n              case s.topDragEnd:\n            \n              case s.topDragEnter:\n            \n              case s.topDragExit:\n            \n              case s.topDragLeave:\n            \n              case s.topDragOver:\n            \n              case s.topDragStart:\n            \n              case s.topDrop:\n            \n              case s.topMouseDown:\n            \n              case s.topMouseMove:\n            \n              case s.topMouseUp:\n                ba = l;\n                break;\n              case s.topDOMCharacterDataModified:\n                ba = m;\n                break;\n              case s.topTouchCancel:\n            \n              case s.topTouchEnd:\n            \n              case s.topTouchMove:\n            \n              case s.topTouchStart:\n                ba = n;\n                break;\n              case s.topScroll:\n                ba = o;\n                break;\n              case s.topWheel:\n                ba = p;\n                break;\n            };\n            q(ba);\n            var event = ba.getPooled(aa, y, z);\n            h.accumulateTwoPhaseDispatches(event);\n            return event;\n        }\n    };\n    e.exports = v;\n});\n__d(\"ReactDefaultInjection\", [\"ReactDOM\",\"ReactDOMForm\",\"ReactDOMInput\",\"ReactDOMTextarea\",\"DefaultDOMPropertyConfig\",\"DOMProperty\",\"DefaultEventPluginOrder\",\"EnterLeaveEventPlugin\",\"ChangeEventPlugin\",\"EventPluginHub\",\"ReactInstanceHandles\",\"SimpleEventPlugin\",], function(a, b, c, d, e, f) {\n    var g = b(\"ReactDOM\"), h = b(\"ReactDOMForm\"), i = b(\"ReactDOMInput\"), j = b(\"ReactDOMTextarea\"), k = b(\"DefaultDOMPropertyConfig\"), l = b(\"DOMProperty\"), m = b(\"DefaultEventPluginOrder\"), n = b(\"EnterLeaveEventPlugin\"), o = b(\"ChangeEventPlugin\"), p = b(\"EventPluginHub\"), q = b(\"ReactInstanceHandles\"), r = b(\"SimpleEventPlugin\");\n    function s() {\n        p.injection.injectEventPluginOrder(m);\n        p.injection.injectInstanceHandle(q);\n        p.injection.injectEventPluginsByName({\n            SimpleEventPlugin: r,\n            EnterLeaveEventPlugin: n,\n            ChangeEventPlugin: o\n        });\n        g.injection.injectComponentClasses({\n            form: h,\n            input: i,\n            textarea: j\n        });\n        l.injection.injectDOMPropertyConfig(k);\n    };\n    e.exports = {\n        inject: s\n    };\n});\n__d(\"React\", [\"ReactCompositeComponent\",\"ReactComponent\",\"ReactDOM\",\"ReactMount\",\"ReactProps\",\"ReactServerRendering\",\"ReactDefaultInjection\",], function(a, b, c, d, e, f) {\n    var g = b(\"ReactCompositeComponent\"), h = b(\"ReactComponent\"), i = b(\"ReactDOM\"), j = b(\"ReactMount\"), k = b(\"ReactProps\"), l = b(\"ReactServerRendering\"), m = b(\"ReactDefaultInjection\");\n    m.inject();\n    var n = {\n        DOM: i,\n        Props: k,\n        initializeTouchEvents: function(o) {\n            j.useTouchEvents = o;\n        },\n        autoBind: g.autoBind,\n        createClass: g.createClass,\n        constructAndRenderComponent: j.constructAndRenderComponent,\n        constructAndRenderComponentByID: j.constructAndRenderComponentByID,\n        renderComponent: j.renderComponent,\n        renderComponentToString: l.renderComponentToString,\n        unmountAndReleaseReactRootNode: j.unmountAndReleaseReactRootNode,\n        isValidComponent: h.isValidComponent\n    };\n    e.exports = n;\n});\n__d(\"TrackingNodes\", [], function(a, b, c, d, e, f) {\n    var g = {\n        types: {\n            USER_NAME: 2,\n            LIKE_LINK: 5,\n            UNLIKE_LINK: 6,\n            ATTACHMENT: 15,\n            SHARE_LINK: 17,\n            USER_MESSAGE: 18,\n            SOURCE: 21,\n            BLINGBOX: 22,\n            VIEW_ALL_COMMENTS: 24,\n            COMMENT: 25,\n            COMMENT_LINK: 26,\n            SMALL_ACTOR_PHOTO: 27,\n            XBUTTON: 29,\n            HIDE_LINK: 30,\n            REPORT_SPAM_LINK: 31,\n            HIDE_ALL_LINK: 32,\n            ADD_COMMENT_BOX: 34,\n            UFI: 36,\n            DROPDOWN_BUTTON: 55,\n            UNHIDE_LINK: 71\n        },\n        BASE_CODE_START: 58,\n        BASE_CODE_END: 126,\n        BASE_CODE_SIZE: 69,\n        PREFIX_CODE_START: 42,\n        PREFIX_CODE_END: 47,\n        PREFIX_CODE_SIZE: 6,\n        encodeTrackingInfo: function(h, i) {\n            var j = (((h - 1)) % g.BASE_CODE_SIZE), k = parseInt((((h - 1)) / g.BASE_CODE_SIZE), 10);\n            if (((h < 1) || (k > g.PREFIX_CODE_SIZE))) {\n                throw Error((\"Invalid tracking node: \" + h))\n            };\n            var l = \"\";\n            if ((k > 0)) {\n                l += String.fromCharCode(((k - 1) + g.PREFIX_CODE_START));\n            };\n            l += String.fromCharCode((j + g.BASE_CODE_START));\n            if (((typeof i != \"undefined\") && (i > 0))) {\n                l += String.fromCharCode(((48 + Math.min(i, 10)) - 1));\n            };\n            return l;\n        },\n        decodeTN: function(h) {\n            if ((h.length === 0)) {\n                return [0,]\n            };\n            var i = h.charCodeAt(0), j = 1, k, l;\n            if (((i >= g.PREFIX_CODE_START) && (i <= g.PREFIX_CODE_END))) {\n                if ((h.length == 1)) {\n                    return [0,]\n                };\n                l = ((i - g.PREFIX_CODE_START) + 1);\n                k = h.charCodeAt(1);\n                j = 2;\n            }\n             else {\n                l = 0;\n                k = i;\n            }\n        ;\n            if (((k < g.BASE_CODE_START) || (k > g.BASE_CODE_END))) {\n                return [0,]\n            };\n            var m = (((l * g.BASE_CODE_SIZE) + ((k - g.BASE_CODE_START))) + 1);\n            if (((h.length > j) && (((h.charAt(j) >= \"0\") && (h.charAt(j) <= \"9\"))))) {\n                return [(j + 1),[m,(parseInt(h.charAt(j), 10) + 1),],]\n            };\n            return [j,[m,],];\n        },\n        parseTrackingNodeString: function(h) {\n            var i = [];\n            while ((h.length > 0)) {\n                var j = g.decodeTN(h);\n                if ((j.length == 1)) {\n                    return []\n                };\n                i.push(j[1]);\n                h = h.substring(j[0]);\n            };\n            return i;\n        },\n        getTrackingInfo: function(h, i) {\n            return ((\"{\\\"tn\\\":\\\"\" + g.encodeTrackingInfo(h, i)) + \"\\\"}\");\n        }\n    };\n    e.exports = g;\n});\n__d(\"NumberFormat\", [\"Env\",], function(a, b, c, d, e, f) {\n    var g = b(\"Env\"), h = /(\\d{3})(?=\\d)/g, i = 10000, j = function(l) {\n        return ((\"\" + l)).split(\"\").reverse().join(\"\");\n    }, k = {\n        formatIntegerWithDelimiter: function(l, m) {\n            if (((((g.locale == \"nb_NO\") || (g.locale == \"nn_NO\"))) && ((Math.abs(l) < i)))) {\n                return l.toString()\n            };\n            var n = j(l);\n            return j(n.replace(h, (\"$1\" + m)));\n        }\n    };\n    e.exports = k;\n});\n__d(\"UFIBlingItem.react\", [\"React\",\"NumberFormat\",\"cx\",\"joinClasses\",], function(a, b, c, d, e, f) {\n    var g = b(\"React\"), h = b(\"NumberFormat\"), i = b(\"cx\"), j = b(\"joinClasses\"), k = g.createClass({\n        displayName: \"UFIBlingItem\",\n        render: function() {\n            var l = j(this.props.className, this.props.iconClassName, \"UFIBlingBoxSprite\"), m = h.formatIntegerWithDelimiter(this.props.count, (this.props.contextArgs.numberdelimiter || \",\"));\n            return (g.DOM.span(null, g.DOM.i({\n                className: l\n            }), g.DOM.span({\n                className: \"UFIBlingBoxText\"\n            }, m)));\n        }\n    });\n    e.exports = k;\n});\n__d(\"UFIConstants\", [], function(a, b, c, d, e, f) {\n    var g = {\n        COMMENT_LIKE: \"fa-type:comment-like\",\n        COMMENT_SET_SPAM: \"fa-type:mark-spam\",\n        DELETE_COMMENT: \"fa-type:delete-comment\",\n        LIVE_DELETE_COMMENT: \"fa-type:live-delete-comment\",\n        LIKE_ACTION: \"fa-type:like\",\n        REMOVE_PREVIEW: \"fa-type:remove-preview\",\n        CONFIRM_COMMENT_REMOVAL: \"fa-type:confirm-remove\",\n        TRANSLATE_COMMENT: \"fa-type:translate-comment\",\n        SUBSCRIBE_ACTION: \"fa-type:subscribe\",\n        GIFT_SUGGESTION: \"fa-type:gift-suggestion\",\n        UNDO_DELETE_COMMENT: \"fa-type:undo-delete-comment\"\n    }, h = {\n        DELETED: \"status:deleted\",\n        SPAM: \"status:spam\",\n        SPAM_DISPLAY: \"status:spam-display\",\n        LIVE_DELETED: \"status:live-deleted\",\n        FAILED_ADD: \"status:failed-add\",\n        FAILED_EDIT: \"status:failed-edit\",\n        PENDING_EDIT: \"status:pending-edit\",\n        PENDING_UNDO_DELETE: \"status:pending-undo-delete\"\n    }, i = {\n        MOBILE: 1,\n        SMS: 3,\n        EMAIL: 4\n    }, j = {\n        PROFILE: 0,\n        NEWS_FEED: 1,\n        OBJECT: 2,\n        MOBILE: 3,\n        EMAIL: 4,\n        PROFILE_APROVAL: 10,\n        TICKER: 12,\n        NONE: 13,\n        INTERN: 14,\n        ADS: 15,\n        PHOTOS_SNOWLIFT: 17\n    }, k = {\n        UNKNOWN: 0,\n        INITIAL_SERVER: 1,\n        LIVE_SEND: 2,\n        USER_ACTION: 3,\n        COLLAPSED_UFI: 4,\n        ENDPOINT_LIKE: 10,\n        ENDPOINT_COMMENT_LIKE: 11,\n        ENDPOINT_ADD_COMMENT: 12,\n        ENDPOINT_EDIT_COMMENT: 13,\n        ENDPOINT_DELETE_COMMENT: 14,\n        ENDPOINT_UNDO_DELETE_COMMENT: 15,\n        ENDPOINT_COMMENT_SPAM: 16,\n        ENDPOINT_REMOVE_PREVIEW: 17,\n        ENDPOINT_ID_COMMENT_FETCH: 18,\n        ENDPOINT_COMMENT_FETCH: 19,\n        ENDPOINT_TRANSLATE_COMMENT: 20,\n        ENDPOINT_BAN: 21,\n        ENDPOINT_SUBSCRIBE: 22\n    }, l = {\n        CHRONOLOGICAL: \"chronological\",\n        RANKED_THREADED: \"ranked_threaded\",\n        TOPLEVEL: \"toplevel\",\n        RECENT_ACTIVITY: \"recent_activity\"\n    }, m = 50, n = 97244, o = 420, p = 5, q = 80, r = 2;\n    e.exports = {\n        UFIActionType: g,\n        UFIStatus: h,\n        UFISourceType: i,\n        UFIFeedbackSourceType: j,\n        UFIPayloadSourceType: k,\n        UFICommentOrderingMode: l,\n        defaultPageSize: m,\n        commentTruncationLength: o,\n        commentTruncationPercent: n,\n        commentTruncationMaxLines: p,\n        attachmentTruncationLength: q,\n        minCommentsForOrderingModeSelector: r\n    };\n});\n__d(\"UFIBlingBox.react\", [\"React\",\"UFIBlingItem.react\",\"UFIConstants\",\"cx\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"React\"), h = b(\"UFIBlingItem.react\"), i = b(\"UFIConstants\"), j = b(\"cx\"), k = b(\"tx\"), l = g.createClass({\n        displayName: \"UFIBlingBox\",\n        render: function() {\n            var m = [], n = \"\";\n            if (this.props.likes) {\n                m.push(h({\n                    count: this.props.likes,\n                    className: (((m.length > 0) ? \"mls\" : \"\")),\n                    iconClassName: \"UFIBlingBoxLikeIcon\",\n                    contextArgs: this.props.contextArgs\n                }));\n                n += (((this.props.likes == 1)) ? \"1 like\" : k._(\"{count} likes\", {\n                    count: this.props.likes\n                }));\n                n += \" \";\n            }\n        ;\n            if (this.props.comments) {\n                m.push(h({\n                    count: this.props.comments,\n                    className: (((m.length > 0) ? \"mls\" : \"\")),\n                    iconClassName: \"UFIBlingBoxCommentIcon\",\n                    contextArgs: this.props.contextArgs\n                }));\n                n += (((this.props.comments == 1)) ? \"1 comment\" : k._(\"{count} comments\", {\n                    count: this.props.comments\n                }));\n                n += \" \";\n            }\n        ;\n            if (this.props.reshares) {\n                m.push(h({\n                    count: this.props.reshares,\n                    className: (((m.length > 0) ? \"mls\" : \"\")),\n                    iconClassName: \"UFIBlingBoxReshareIcon\",\n                    contextArgs: this.props.contextArgs\n                }));\n                n += (((this.props.reshares == 1)) ? \"1 share\" : k._(\"{count} shares\", {\n                    count: this.props.reshares\n                }));\n            }\n        ;\n            var o = g.DOM.a({\n                className: \"UFIBlingBox uiBlingBox feedbackBling\",\n                href: this.props.permalink,\n                \"data-ft\": this.props[\"data-ft\"],\n                \"aria-label\": n\n            }, m);\n            if ((this.props.comments < i.defaultPageSize)) {\n                o.props.onClick = this.props.onClick;\n                o.props.rel = \"ignore\";\n            }\n        ;\n            return o;\n        }\n    });\n    e.exports = l;\n});\n__d(\"UFICentralUpdates\", [\"Arbiter\",\"ChannelConstants\",\"LiveTimer\",\"ShortProfiles\",\"UFIConstants\",\"copyProperties\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ChannelConstants\"), i = b(\"LiveTimer\"), j = b(\"ShortProfiles\"), k = b(\"UFIConstants\"), l = b(\"copyProperties\"), m = b(\"tx\"), n = 0, o = {\n    }, p = {\n    }, q = {\n    }, r = {\n    }, s = [];\n    g.subscribe(h.getArbiterType(\"live-data\"), function(x, y) {\n        if ((y && y.obj)) {\n            var z = y.obj, aa = (z.comments || []);\n            aa.forEach(function(ba) {\n                ba.timestamp.text = \"a few seconds ago\";\n            });\n            w.handleUpdate(k.UFIPayloadSourceType.LIVE_SEND, z);\n        }\n    ;\n    });\n    function t() {\n        if (!n) {\n            var x = q, y = o, z = p, aa = r;\n            q = {\n            };\n            o = {\n            };\n            p = {\n            };\n            r = {\n            };\n            if (Object.keys(x).length) {\n                v(\"feedback-id-changed\", x);\n            };\n            if (Object.keys(y).length) {\n                v(\"feedback-updated\", y);\n            };\n            if (Object.keys(z).length) {\n                v(\"comments-updated\", z);\n            };\n            if (Object.keys(aa).length) {\n                v(\"instance-updated\", aa);\n            };\n            s.pop();\n        }\n    ;\n    };\n    function u() {\n        if (s.length) {\n            return s[(s.length - 1)];\n        }\n         else return k.UFIPayloadSourceType.UNKNOWN\n    ;\n    };\n    function v(event, x) {\n        w.inform(event, {\n            updates: x,\n            payloadSource: u()\n        });\n    };\n    var w = l(new g(), {\n        handleUpdate: function(x, y) {\n            if (Object.keys(y).length) {\n                this.synchronizeInforms(function() {\n                    s.push(x);\n                    var z = l({\n                        payloadsource: u()\n                    }, y);\n                    this.inform(\"update-feedback\", z);\n                    this.inform(\"update-comment-lists\", z);\n                    this.inform(\"update-comments\", z);\n                    this.inform(\"update-actions\", z);\n                    ((y.profiles || [])).forEach(function(aa) {\n                        j.set(aa.id, aa);\n                    });\n                    if (y.servertime) {\n                        i.restart(y.servertime);\n                    };\n                }.bind(this));\n            };\n        },\n        didUpdateFeedback: function(x) {\n            o[x] = true;\n            t();\n        },\n        didUpdateComment: function(x) {\n            p[x] = true;\n            t();\n        },\n        didUpdateFeedbackID: function(x, y) {\n            q[x] = y;\n            t();\n        },\n        didUpdateInstanceState: function(x, y) {\n            if (!r[x]) {\n                r[x] = {\n                };\n            };\n            r[x][y] = true;\n            t();\n        },\n        synchronizeInforms: function(x) {\n            n++;\n            try {\n                x();\n            } catch (y) {\n                throw y;\n            } finally {\n                n--;\n                t();\n            };\n        }\n    });\n    e.exports = w;\n});\n__d(\"randomInt\", [\"invariant\",], function(a, b, c, d, e, f) {\n    var g = b(\"invariant\");\n    function h(i, j) {\n        var k = arguments.length;\n        g(((k > 0) && (k <= 2)));\n        if ((k === 1)) {\n            j = i;\n            i = 0;\n        }\n    ;\n        g((j > i));\n        var l = (this.random || Math.random);\n        return Math.floor((i + (l() * ((j - i)))));\n    };\n    e.exports = h;\n});\n__d(\"ClientIDs\", [\"randomInt\",], function(a, b, c, d, e, f) {\n    var g = b(\"randomInt\"), h = {\n    }, i = {\n        getNewClientID: function() {\n            var j = Date.now(), k = ((j + \":\") + ((g(0, 4294967295) + 1)));\n            h[k] = true;\n            return k;\n        },\n        isExistingClientID: function(j) {\n            return !!h[j];\n        }\n    };\n    e.exports = i;\n});\n__d(\"ImmutableObject\", [\"keyMirror\",\"merge\",\"mergeInto\",\"mergeHelpers\",\"throwIf\",], function(a, b, c, d, e, f) {\n    var g = b(\"keyMirror\"), h = b(\"merge\"), i = b(\"mergeInto\"), j = b(\"mergeHelpers\"), k = b(\"throwIf\"), l = j.checkMergeObjectArgs, m = j.isTerminal, n, o;\n    n = g({\n        INVALID_MAP_SET_ARG: null\n    });\n    o = function(q) {\n        i(this, q);\n    };\n    o.set = function(q, r) {\n        k(!((q instanceof o)), n.INVALID_MAP_SET_ARG);\n        var s = new o(q);\n        i(s, r);\n        return s;\n    };\n    o.setField = function(q, r, s) {\n        var t = {\n        };\n        t[r] = s;\n        return o.set(q, t);\n    };\n    o.setDeep = function(q, r) {\n        k(!((q instanceof o)), n.INVALID_MAP_SET_ARG);\n        return p(q, r);\n    };\n    function p(q, r) {\n        l(q, r);\n        var s = {\n        }, t = Object.keys(q);\n        for (var u = 0; (u < t.length); u++) {\n            var v = t[u];\n            if (!r.hasOwnProperty(v)) {\n                s[v] = q[v];\n            }\n             else if ((m(q[v]) || m(r[v]))) {\n                s[v] = r[v];\n            }\n             else s[v] = p(q[v], r[v]);\n            \n        ;\n        };\n        var w = Object.keys(r);\n        for (u = 0; (u < w.length); u++) {\n            var x = w[u];\n            if (q.hasOwnProperty(x)) {\n                continue;\n            };\n            s[x] = r[x];\n        };\n        return ((((q instanceof o) || (r instanceof o))) ? new o(s) : s);\n    };\n    e.exports = o;\n});\n__d(\"debounceAcrossTransitions\", [\"debounce\",], function(a, b, c, d, e, f) {\n    var g = b(\"debounce\");\n    function h(i, j, k) {\n        return g(i, j, k, true);\n    };\n    e.exports = h;\n});\n__d(\"MercuryServerDispatcher\", [\"AsyncRequest\",\"FBAjaxRequest\",\"Env\",\"JSLogger\",\"Run\",\"areObjectsEqual\",\"copyProperties\",\"debounceAcrossTransitions\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = b(\"FBAjaxRequest\"), i = b(\"Env\"), j = b(\"JSLogger\"), k = b(\"Run\"), l = b(\"areObjectsEqual\"), m = b(\"copyProperties\"), n = b(\"debounceAcrossTransitions\"), o = {\n    }, p = j.create(\"mercury_dispatcher\"), q = false, r = {\n        IMMEDIATE: \"immediate\",\n        IDEMPOTENT: \"idempotent\",\n        BATCH_SUCCESSIVE: \"batch-successive\",\n        BATCH_SUCCESSIVE_UNIQUE: \"batch-successive-unique\",\n        BATCH_SUCCESSIVE_PIGGYBACK_ON_ERROR: \"batch-successive-piggyback-retry\",\n        BATCH_DEFERRED_MULTI: \"batch-deferred-multi\",\n        BATCH_CONDITIONAL: \"batch-conditional\",\n        registerEndpoints: function(v) {\n            for (var w in v) {\n                var x = v[w], y = (x.request_user_id || i.user);\n                if (!o[w]) {\n                    o[w] = {\n                    };\n                };\n                if (!o[w][y]) {\n                    o[w][y] = {\n                    };\n                };\n                o[w][y] = new s(w, x);\n            };\n        },\n        trySend: function(v, w, x, y) {\n            y = (y || i.user);\n            if (((v == \"/ajax/mercury/client_reliability.php\") && !o[v][y])) {\n                o[v][y] = o[v][undefined];\n            };\n            o[v][y].trySend(w, x);\n        }\n    };\n    function s(v, w) {\n        var x = (w.mode || r.IMMEDIATE);\n        switch (x) {\n          case r.IMMEDIATE:\n        \n          case r.IDEMPOTENT:\n        \n          case r.BATCH_SUCCESSIVE:\n        \n          case r.BATCH_SUCCESSIVE_UNIQUE:\n        \n          case r.BATCH_SUCCESSIVE_PIGGYBACK_ON_ERROR:\n        \n          case r.BATCH_DEFERRED_MULTI:\n        \n          case r.BATCH_CONDITIONAL:\n            break;\n          default:\n            throw new Error((\"Invalid MercuryServerDispatcher mode \" + x));\n        };\n        this._endpoint = v;\n        this._mode = x;\n        this._requestUserID = w.request_user_id;\n        this._combineData = w.batch_function;\n        this._combineDataIf = w.batch_if;\n        this._batchSizeLimit = w.batch_size_limit;\n        this._batches = [];\n        this._handler = w.handler;\n        this._errorHandler = w.error_handler;\n        this._transportErrorHandler = (w.transport_error_handler || w.error_handler);\n        this._connectionRetries = (w.connection_retries || 0);\n        this._timeoutHandler = w.timeout_handler;\n        this._timeout = w.timeout;\n        this._serverDialogCancelHandler = (w.server_dialog_cancel_handler || w.error_handler);\n        this._deferredSend = n(this._batchSend, 0, this);\n        if (this._batchSizeLimit) {\n            k.onUnload(function() {\n                p.bump((\"unload_batches_count_\" + u(this._batches.length)));\n            }.bind(this));\n        };\n    };\n    m(s.prototype, {\n        _inFlight: 0,\n        _handler: null,\n        _errorHandler: null,\n        _transportErrorHandler: null,\n        _timeoutHandler: null,\n        _timeout: null,\n        _serverDialogCancelHandler: null,\n        _combineData: null,\n        trySend: function(v, w) {\n            if (q) {\n                return\n            };\n            if ((typeof v == \"undefined\")) {\n                v = null;\n            };\n            var x = (w || this._mode);\n            if ((x == r.IMMEDIATE)) {\n                this._send(v);\n            }\n             else if ((x == r.IDEMPOTENT)) {\n                if (!this._inFlight) {\n                    this._send(v);\n                };\n            }\n             else if (((x == r.BATCH_SUCCESSIVE) || (x == r.BATCH_SUCCESSIVE_UNIQUE))) {\n                if (!this._inFlight) {\n                    this._send(v);\n                }\n                 else this._batchData(v);\n            ;\n            }\n             else if ((x == r.BATCH_CONDITIONAL)) {\n                var y = (this._batches[0] && this._batches[0].getData());\n                if ((this._inFlight && ((this._combineDataIf(this._pendingRequestData, v) || this._combineDataIf(y, v))))) {\n                    this._batchData(v);\n                }\n                 else this._send(v);\n            ;\n            }\n             else if ((x == r.BATCH_DEFERRED_MULTI)) {\n                this._batchData(v);\n                this._deferredSend();\n            }\n             else if ((x == r.BATCH_SUCCESSIVE_PIGGYBACK_ON_ERROR)) {\n                this._batchData(v);\n                if (!this._inFlight) {\n                    this._batchSend();\n                };\n            }\n            \n            \n            \n            \n            \n        ;\n        },\n        _send: function(v) {\n            this._inFlight++;\n            this._pendingRequestData = m({\n            }, v);\n            if ((this._requestUserID != i.user)) {\n                v.request_user_id = this._requestUserID;\n            };\n            p.log(\"send\", {\n                endpoint: this._endpoint,\n                data: v,\n                inflight_count: this._inFlight\n            });\n            var w = null;\n            if (i.worker_context) {\n                w = new h(\"POST\", this._endpoint, v);\n                w.onError = function(x) {\n                    x.getPayload = function() {\n                        return x.errorText;\n                    };\n                    x.getRequest = function() {\n                        var y = x;\n                        x.getData = function() {\n                            return v;\n                        };\n                        return y;\n                    };\n                    x.getError = function() {\n                        return x.errorText;\n                    };\n                    x.getErrorDescription = function() {\n                        return x.errorText;\n                    };\n                    x.isTransient = function() {\n                        return false;\n                    };\n                    this._handleError(x);\n                }.bind(this);\n                w.onJSON = function(x) {\n                    x.getPayload = function() {\n                        return x.json;\n                    };\n                    x.getRequest = function() {\n                        return w;\n                    };\n                    this._handleResponse(x);\n                }.bind(this);\n                w.getData = function() {\n                    return v;\n                };\n                w.send();\n            }\n             else {\n                w = new g(this._endpoint).setData(v).setOption(\"retries\", this._connectionRetries).setHandler(this._handleResponse.bind(this)).setErrorHandler(this._handleError.bind(this)).setTransportErrorHandler(this._handleTransportError.bind(this)).setServerDialogCancelHandler(this._handleServerDialogCancel.bind(this)).setAllowCrossPageTransition(true);\n                if ((this._timeout && this._timeoutHandler)) {\n                    w.setTimeoutHandler(this._timeout, this._handleTimeout.bind(this));\n                };\n                w.send();\n            }\n        ;\n        },\n        _batchData: function(v, w) {\n            if ((((this._mode == r.BATCH_SUCCESSIVE_UNIQUE) && (typeof this._pendingRequestData != \"undefined\")) && l(v, this._pendingRequestData))) {\n                return;\n            }\n             else {\n                var x = (this._batches.length - 1);\n                if (((x >= 0) && !this._hasReachedBatchLimit(this._batches[x]))) {\n                    (w ? this._batches[x].combineWithOlder(v, this._combineData) : this._batches[x].combineWith(v, this._combineData));\n                }\n                 else {\n                    this._batches.push(new t(v));\n                    p.bump((\"batches_count_\" + u(this._batches.length)));\n                }\n            ;\n                p.debug(\"batch\", {\n                    endpoint: this._endpoint,\n                    batches: this._batches,\n                    batch_limit: this._batchSizeLimit\n                });\n            }\n        ;\n        },\n        _hasReachedBatchLimit: function(v) {\n            return (this._batchSizeLimit && (v.getSize() >= this._batchSizeLimit));\n        },\n        _batchSend: function() {\n            if (this._batches[0]) {\n                this._send(this._batches[0].getData());\n                this._batches.shift();\n            }\n        ;\n        },\n        _handleResponse: function(v) {\n            this._inFlight--;\n            p.log(\"response\", {\n                endpoint: this._endpoint,\n                inflight_count: this._inFlight\n            });\n            var w = v.getPayload();\n            q = (w && w.kill_chat);\n            if (q) {\n                p.log(\"killswitch_enabled\", {\n                    endpoint: this._endpoint,\n                    inflight_count: this._inFlight\n                });\n            };\n            if ((w && w.error_payload)) {\n                if (this._errorHandler) {\n                    this._errorHandler(v);\n                };\n            }\n             else (this._handler && this._handler(w, v.getRequest()));\n        ;\n            if (((((this._mode == r.BATCH_SUCCESSIVE) || (this._mode == r.BATCH_SUCCESSIVE_UNIQUE)) || (this._mode == r.BATCH_SUCCESSIVE_PIGGYBACK_ON_ERROR)) || (this._mode == r.BATCH_CONDITIONAL))) {\n                this._batchSend();\n            };\n            delete this._pendingRequestData;\n        },\n        _postErrorHandler: function() {\n            p.error(\"error\", {\n                endpoint: this._endpoint,\n                inflight_count: (this._inFlight - 1)\n            });\n            this._inFlight--;\n            var v = this._mode;\n            if ((((v == r.BATCH_SUCCESSIVE) || (v == r.BATCH_SUCCESSIVE_UNIQUE)) || (v == r.BATCH_CONDITIONAL))) {\n                this._batchSend();\n            }\n             else if ((v == r.BATCH_SUCCESSIVE_PIGGYBACK_ON_ERROR)) {\n                if (this._batches[0]) {\n                    this._batchData(this._pendingRequestData, true);\n                    this._batchSend();\n                }\n                 else this._batchData(this._pendingRequestData, true);\n            \n            }\n        ;\n            delete this._pendingRequestData;\n        },\n        _handleError: function(v) {\n            (this._errorHandler && this._errorHandler(v));\n            this._postErrorHandler();\n        },\n        _handleTransportError: function(v) {\n            (this._transportErrorHandler && this._transportErrorHandler(v));\n            this._postErrorHandler();\n        },\n        _handleTimeout: function(v) {\n            (this._timeoutHandler && this._timeoutHandler(v));\n            this._postErrorHandler();\n        },\n        _handleServerDialogCancel: function(v) {\n            (this._serverDialogCancelHandler && this._serverDialogCancelHandler(v));\n            this._postErrorHandler();\n        }\n    });\n    function t(v) {\n        this._data = v;\n        this._size = 1;\n    };\n    m(t.prototype, {\n        getData: function() {\n            return this._data;\n        },\n        getSize: function() {\n            return this._size;\n        },\n        combineWith: function(v, w) {\n            this._data = w(this._data, v);\n            this._size++;\n        },\n        combineWithOlder: function(v, w) {\n            this._data = w(v, this._data);\n            this._size++;\n        }\n    });\n    function u(v) {\n        if ((v === 1)) {\n            return \"equals1\";\n        }\n         else if (((v >= 2) && (v <= 3))) {\n            return \"between2and3\";\n        }\n         else return \"over4\"\n        \n    ;\n    };\n    e.exports = r;\n});\n__d(\"UFIFeedbackTargets\", [\"ClientIDs\",\"KeyedCallbackManager\",\"UFICentralUpdates\",\"UFIConstants\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"ClientIDs\"), h = b(\"KeyedCallbackManager\"), i = b(\"UFICentralUpdates\"), j = b(\"UFIConstants\"), k = b(\"copyProperties\"), l = new h();\n    function m(v) {\n        var w = {\n        };\n        v.forEach(function(x) {\n            var y = k({\n            }, x);\n            delete y.commentlist;\n            delete y.commentcount;\n            w[x.entidentifier] = y;\n            i.didUpdateFeedback(x.entidentifier);\n        });\n        l.addResourcesAndExecute(w);\n    };\n    function n(v) {\n        for (var w = 0; (w < v.length); w++) {\n            var x = v[w];\n            switch (x.actiontype) {\n              case j.UFIActionType.LIKE_ACTION:\n                p(x);\n                break;\n              case j.UFIActionType.SUBSCRIBE_ACTION:\n                q(x);\n                break;\n              case j.UFIActionType.GIFT_SUGGESTION:\n                r(x);\n                break;\n            };\n        };\n    };\n    function o(v) {\n        for (var w = 0; (w < v.length); w++) {\n            var x = v[w];\n            if (x.orig_ftentidentifier) {\n                t(x.orig_ftentidentifier, x.ftentidentifier);\n            };\n        };\n    };\n    function p(v) {\n        var w = s(v);\n        if (w) {\n            v.hasviewerliked = !!v.hasviewerliked;\n            if (((v.clientid && g.isExistingClientID(v.clientid)) && (v.hasviewerliked != w.hasviewerliked))) {\n                return\n            };\n            w.likecount = (v.likecount || 0);\n            w.likesentences = v.likesentences;\n            if ((v.actorid == w.actorforpost)) {\n                w.hasviewerliked = v.hasviewerliked;\n            }\n             else if ((v.hasviewerliked != w.hasviewerliked)) {\n                w.likesentences = {\n                    current: v.likesentences.alternate,\n                    alternate: v.likesentences.current\n                };\n                if (w.hasviewerliked) {\n                    w.likecount++;\n                }\n                 else w.likecount--;\n            ;\n            }\n            \n        ;\n            if ((v.actorid != w.actorforpost)) {\n                w.likesentences.isunseen = true;\n            };\n            m([w,]);\n        }\n    ;\n    };\n    function q(v) {\n        var w = s(v);\n        if (w) {\n            v.hasviewersubscribed = !!v.hasviewersubscribed;\n            if (((v.clientid && g.isExistingClientID(v.clientid)) && (v.hasviewersubscribed != w.hasviewersubscribed))) {\n                return\n            };\n            if ((v.actorid == w.actorforpost)) {\n                w.hasviewersubscribed = v.hasviewersubscribed;\n            };\n            m([w,]);\n        }\n    ;\n    };\n    function r(v) {\n        var w = s(v);\n        if (!w) {\n            return\n        };\n        if (((v.clientid && g.isExistingClientID(v.clientid)) && (v.hasviewerliked != w.hasviewerliked))) {\n            return\n        };\n        w.giftdata = v.giftdata;\n        m([w,]);\n    };\n    function s(v) {\n        if (v.orig_entidentifier) {\n            t(v.orig_entidentifier, v.entidentifier);\n        };\n        return l.getResource(v.entidentifier);\n    };\n    function t(v, w) {\n        var x = l.getResource(v);\n        if (x) {\n            l.setResource(v, null);\n            x.entidentifier = w;\n            l.setResource(w, x);\n            i.didUpdateFeedbackID(v, w);\n        }\n    ;\n    };\n    var u = {\n        getFeedbackTarget: function(v, w) {\n            var x = l.executeOrEnqueue(v, w), y = l.getUnavailableResources(x);\n            if (!y.length) {\n                return\n            };\n        }\n    };\n    i.subscribe(\"update-feedback\", function(v, w) {\n        var x = w.feedbacktargets;\n        if ((x && x.length)) {\n            m(x);\n        };\n    });\n    i.subscribe(\"update-actions\", function(v, w) {\n        if ((w.actions && w.actions.length)) {\n            n(w.actions);\n        };\n    });\n    i.subscribe(\"update-comments\", function(v, w) {\n        if ((w.comments && w.comments.length)) {\n            o(w.comments);\n        };\n    });\n    e.exports = u;\n});\n__d(\"UFIInstanceState\", [\"UFICentralUpdates\",], function(a, b, c, d, e, f) {\n    var g = b(\"UFICentralUpdates\"), h = {\n    };\n    function i(k) {\n        if (!h[k]) {\n            h[k] = {\n            };\n        };\n    };\n    var j = {\n        getKeyForInstance: function(k, l) {\n            i(k);\n            return h[k][l];\n        },\n        updateState: function(k, l, m) {\n            i(k);\n            h[k][l] = m;\n            g.didUpdateInstanceState(k, l);\n        },\n        updateStateField: function(k, l, m, n) {\n            var o = (this.getKeyForInstance(k, l) || {\n            });\n            o[m] = n;\n            this.updateState(k, l, o);\n        }\n    };\n    e.exports = j;\n});\n__d(\"UFIComments\", [\"ClientIDs\",\"ImmutableObject\",\"JSLogger\",\"KeyedCallbackManager\",\"MercuryServerDispatcher\",\"UFICentralUpdates\",\"UFIConstants\",\"UFIFeedbackTargets\",\"UFIInstanceState\",\"URI\",\"keyMirror\",\"merge\",\"randomInt\",\"throwIf\",], function(a, b, c, d, e, f) {\n    var g = b(\"ClientIDs\"), h = b(\"ImmutableObject\"), i = b(\"JSLogger\"), j = b(\"KeyedCallbackManager\"), k = b(\"MercuryServerDispatcher\"), l = b(\"UFICentralUpdates\"), m = b(\"UFIConstants\"), n = b(\"UFIFeedbackTargets\"), o = b(\"UFIInstanceState\"), p = b(\"URI\"), q = b(\"keyMirror\"), r = b(\"merge\"), s = b(\"randomInt\"), t = b(\"throwIf\"), u = q({\n        INVALID_COMMENT_TYPE: null\n    }), v = i.create(\"UFIComments\"), w = {\n    }, x = {\n    }, y = {\n    }, z = {\n    }, aa = {\n    }, ba = {\n    }, ca = \"unavailable_comment_key\";\n    function da(ab) {\n        return ((ab in ba) ? ba[ab] : ab);\n    };\n    function ea(ab, bb) {\n        if (!x[ab]) {\n            x[ab] = {\n            };\n        };\n        if (!x[ab][bb]) {\n            x[ab][bb] = new j();\n        };\n        return x[ab][bb];\n    };\n    function fa(ab) {\n        var bb = [];\n        if (x[ab]) {\n            for (var cb in x[ab]) {\n                bb.push(x[ab][cb]);;\n            }\n        };\n        return bb;\n    };\n    function ga(ab) {\n        if (!y[ab]) {\n            y[ab] = new j();\n        };\n        return y[ab];\n    };\n    function ha(ab) {\n        var bb = fa(ab);\n        bb.forEach(function(cb) {\n            cb.reset();\n        });\n    };\n    function ia(ab, bb) {\n        ab.forEach(function(cb) {\n            var db = cb.ftentidentifier, eb = (cb.parentcommentid || db);\n            n.getFeedbackTarget(db, function(fb) {\n                var gb = m.UFIPayloadSourceType, hb = cb.clientid, ib = false, jb = r({\n                }, cb);\n                if (hb) {\n                    delete jb.clientid;\n                    ib = g.isExistingClientID(hb);\n                    if ((ib && ba[hb])) {\n                        return\n                    };\n                }\n            ;\n                if ((((bb === gb.LIVE_SEND) && cb.parentcommentid) && (z[eb] === undefined))) {\n                    return\n                };\n                if ((((((bb === gb.LIVE_SEND)) || ((bb === gb.USER_ACTION))) || ((bb === gb.ENDPOINT_ADD_COMMENT))) || ((bb === gb.ENDPOINT_EDIT_COMMENT)))) {\n                    jb.isunseen = true;\n                };\n                if (((bb === gb.ENDPOINT_COMMENT_FETCH) || (bb === gb.ENDPOINT_ID_COMMENT_FETCH))) {\n                    jb.fromfetch = true;\n                };\n                if (ib) {\n                    if (w[hb].ufiinstanceid) {\n                        o.updateStateField(w[hb].ufiinstanceid, \"locallycomposed\", cb.id, true);\n                    };\n                    jb.ufiinstanceid = w[hb].ufiinstanceid;\n                    ba[hb] = cb.id;\n                    w[cb.id] = w[hb];\n                    delete w[hb];\n                    l.didUpdateComment(hb);\n                }\n            ;\n                var kb, lb;\n                if (cb.parentcommentid) {\n                    lb = [ga(eb),];\n                }\n                 else lb = fa(eb);\n            ;\n                var mb = false;\n                lb.forEach(function(qb) {\n                    var rb = qb.getAllResources(), sb = {\n                    };\n                    for (var tb in rb) {\n                        var ub = rb[tb];\n                        sb[ub] = tb;\n                    };\n                    if (ib) {\n                        if ((hb in sb)) {\n                            sb[cb.id] = sb[hb];\n                            var vb = sb[hb];\n                            qb.setResource(vb, cb.id);\n                        }\n                    \n                    };\n                    if (sb[cb.id]) {\n                        mb = true;\n                    }\n                     else {\n                        var wb = (z[eb] || 0);\n                        sb[cb.id] = wb;\n                        qb.setResource(wb, cb.id);\n                    }\n                ;\n                    kb = sb[cb.id];\n                });\n                if (!mb) {\n                    var nb = (z[eb] || 0);\n                    z[eb] = (nb + 1);\n                    qa(eb);\n                }\n            ;\n                if ((cb.status === m.UFIStatus.FAILED_ADD)) {\n                    aa[eb] = (aa[eb] + 1);\n                };\n                var ob = z[eb];\n                jb.replycount = (((z[cb.id] || 0)) - ((aa[cb.id] || 0)));\n                var pb = ja(kb, ob);\n                if ((cb.parentcommentid && w[cb.parentcommentid])) {\n                    jb.permalink = p(fb.permalink).addQueryData({\n                        comment_id: w[cb.parentcommentid].legacyid,\n                        reply_comment_id: cb.legacyid,\n                        total_comments: ob\n                    }).toString();\n                }\n                 else jb.permalink = p(fb.permalink).addQueryData({\n                    comment_id: cb.legacyid,\n                    offset: pb,\n                    total_comments: ob\n                }).toString();\n            ;\n                za.setComment(cb.id, new h(jb));\n                l.didUpdateComment(cb.id);\n                l.didUpdateFeedback(db);\n            });\n        });\n    };\n    function ja(ab, bb) {\n        return (Math.floor(((((bb - ab) - 1)) / m.defaultPageSize)) * m.defaultPageSize);\n    };\n    function ka(ab) {\n        for (var bb = 0; (bb < ab.length); bb++) {\n            var cb = ab[bb];\n            switch (cb.actiontype) {\n              case m.UFIActionType.COMMENT_LIKE:\n                na(cb);\n                break;\n              case m.UFIActionType.DELETE_COMMENT:\n                ra(cb);\n                break;\n              case m.UFIActionType.LIVE_DELETE_COMMENT:\n                sa(cb);\n                break;\n              case m.UFIActionType.UNDO_DELETE_COMMENT:\n                ta(cb);\n                break;\n              case m.UFIActionType.REMOVE_PREVIEW:\n                ua(cb);\n                break;\n              case m.UFIActionType.COMMENT_SET_SPAM:\n                va(cb);\n                break;\n              case m.UFIActionType.CONFIRM_COMMENT_REMOVAL:\n                wa(cb);\n                break;\n              case m.UFIActionType.TRANSLATE_COMMENT:\n                oa(cb);\n                break;\n            };\n        };\n    };\n    function la(ab, bb, cb) {\n        var db = bb.range, eb = bb.values;\n        if (!db) {\n            v.error(\"nullrange\", {\n                target: ab,\n                commentList: bb\n            });\n            return;\n        }\n    ;\n        var fb = {\n        };\n        for (var gb = 0; (gb < db.length); gb++) {\n            fb[(db.offset + gb)] = (eb[gb] || ca);;\n        };\n        var hb, ib;\n        if (cb) {\n            hb = ea(ab, cb);\n            ib = ab;\n        }\n         else {\n            hb = ga(ab);\n            ib = bb.ftentidentifier;\n            if ((bb.count !== undefined)) {\n                z[ab] = bb.count;\n                aa[ab] = 0;\n            }\n        ;\n        }\n    ;\n        hb.addResourcesAndExecute(fb);\n        l.didUpdateFeedback(ib);\n    };\n    function ma(ab) {\n        ab.forEach(function(bb) {\n            z[bb.entidentifier] = bb.commentcount;\n            aa[bb.entidentifier] = 0;\n            l.didUpdateFeedback(bb.entidentifier);\n        });\n    };\n    function na(ab) {\n        var bb = za.getComment(ab.commentid);\n        if (bb) {\n            var cb = {\n            }, db = (ab.clientid && g.isExistingClientID(ab.clientid));\n            if (!db) {\n                cb.hasviewerliked = ab.viewerliked;\n                cb.likecount = ab.likecount;\n            }\n        ;\n            cb.likeconfirmhash = s(0, 1024);\n            ya(ab.commentid, cb);\n        }\n    ;\n    };\n    function oa(ab) {\n        var bb = ab.commentid, cb = za.getComment(ab.commentid);\n        if (cb) {\n            ya(bb, {\n                translatedtext: ab.translatedtext\n            });\n        };\n    };\n    function pa(ab) {\n        var bb = {\n            reportLink: ab.reportLink,\n            commenterIsFOF: ab.commenterIsFOF,\n            userIsMinor: ab.userIsMinor\n        };\n        if (ab.undoData) {\n            bb.undoData = ab.undoData;\n        };\n        return bb;\n    };\n    function qa(ab, bb) {\n        if (ab) {\n            if ((bb !== undefined)) {\n                var cb = (((aa[ab] || 0)) + ((bb ? 1 : -1)));\n                aa[ab] = Math.max(cb, 0);\n            }\n        ;\n            var db = za.getComment(ab);\n            if (db) {\n                var eb = {\n                    replycount: za.getDisplayedCommentCount(ab)\n                };\n                ya(ab, eb);\n            }\n        ;\n        }\n    ;\n    };\n    function ra(ab) {\n        var bb = za.getComment(ab.commentid);\n        if ((bb.status !== m.UFIStatus.DELETED)) {\n            var cb = (bb.parentcommentid || bb.ftentidentifier);\n            if ((bb.status === m.UFIStatus.FAILED_ADD)) {\n                qa(cb);\n            }\n             else qa(cb, true);\n        ;\n        }\n    ;\n        xa(bb, m.UFIStatus.DELETED);\n    };\n    function sa(ab) {\n        var bb = za.getComment(ab.commentid);\n        if ((bb && (bb.status !== m.UFIStatus.DELETED))) {\n            xa(bb, m.UFIStatus.LIVE_DELETED);\n        };\n    };\n    function ta(ab) {\n        var bb = za.getComment(ab.commentid);\n        if ((bb.status === m.UFIStatus.DELETED)) {\n            var cb = (bb.parentcommentid || bb.ftentidentifier);\n            qa(cb, false);\n        }\n    ;\n        xa(bb, m.UFIStatus.PENDING_UNDO_DELETE);\n    };\n    function ua(ab) {\n        ya(ab.commentid, {\n            attachment: null\n        });\n    };\n    function va(ab) {\n        var bb = za.getComment(ab.commentid), cb = (ab.shouldHideAsSpam ? m.UFIStatus.SPAM_DISPLAY : null);\n        xa(bb, cb);\n    };\n    function wa(ab) {\n        ya(ab.commentid, pa(ab));\n    };\n    function xa(ab, bb) {\n        ya(ab.id, {\n            priorstatus: ab.status,\n            status: bb\n        });\n    };\n    function ya(ab, bb) {\n        var cb = (za.getComment(ab) || new h({\n        }));\n        za.setComment(ab, h.set(cb, bb));\n        l.didUpdateComment(cb.id);\n        l.didUpdateFeedback(cb.ftentidentifier);\n    };\n    var za = {\n        getComments: function(ab) {\n            var bb = {\n            };\n            for (var cb = 0; (cb < ab.length); cb++) {\n                bb[ab[cb]] = za.getComment(ab[cb]);;\n            };\n            return bb;\n        },\n        getComment: function(ab) {\n            return w[da(ab)];\n        },\n        setComment: function(ab, bb) {\n            w[da(ab)] = bb;\n        },\n        resetFeedbackTarget: function(ab) {\n            var bb = fa(ab), cb = {\n            };\n            bb.forEach(function(eb) {\n                var fb = eb.getAllResources();\n                for (var gb in fb) {\n                    var hb = fb[gb];\n                    cb[hb] = 1;\n                };\n            });\n            for (var db in cb) {\n                delete w[da(db)];;\n            };\n            ha(ab);\n        },\n        getCommentsInRange: function(ab, bb, cb, db, eb) {\n            var fb = ea(ab, cb);\n            n.getFeedbackTarget(ab, function(gb) {\n                var hb = [];\n                for (var ib = 0; (ib < bb.length); ib++) {\n                    hb.push((bb.offset + ib));;\n                };\n                var jb = function(pb) {\n                    var qb = [], rb = bb.offset, sb = ((bb.offset + bb.length) - 1);\n                    for (var tb = 0; (tb < bb.length); tb++) {\n                        var ub = (gb.isranked ? (sb - tb) : (rb + tb));\n                        if ((pb[ub] != ca)) {\n                            var vb = this.getComment(pb[ub]);\n                            if (vb) {\n                                qb.push(vb);\n                            };\n                        }\n                    ;\n                    };\n                    eb(qb);\n                }, kb = fb.getUnavailableResourcesFromRequest(hb);\n                if (kb.length) {\n                    var lb = Math.min.apply(Math, kb), mb = Math.max.apply(Math, kb), nb = lb, ob = ((mb - lb) + 1);\n                    k.trySend(\"/ajax/ufi/comment_fetch.php\", {\n                        ft_ent_identifier: gb.entidentifier,\n                        viewas: db,\n                        source: null,\n                        offset: nb,\n                        length: ob,\n                        orderingmode: cb\n                    });\n                }\n                 else fb.deferredExecuteOrEnqueue(hb).addCallback(jb, this);\n            ;\n            }.bind(this));\n        },\n        getRepliesInRanges: function(ab, bb, cb) {\n            var db = {\n            }, eb = {\n            }, fb = {\n            }, gb = false;\n            n.getFeedbackTarget(ab, function(hb) {\n                for (var ib in bb) {\n                    var jb = ga(ib), kb = bb[ib], lb = [];\n                    for (var mb = 0; (mb < kb.length); mb++) {\n                        lb.push((kb.offset + mb));;\n                    };\n                    db[ib] = jb.executeOrEnqueue(lb, function(wb) {\n                        var xb = [];\n                        for (var yb = 0; (yb < kb.length); yb++) {\n                            var zb = (kb.offset + yb);\n                            if ((wb[zb] != ca)) {\n                                var ac = this.getComment(wb[zb]);\n                                if (ac) {\n                                    xb.push(ac);\n                                };\n                            }\n                        ;\n                        };\n                        eb[ib] = xb;\n                    }.bind(this));\n                    fb[ib] = jb.getUnavailableResources(db[ib]);\n                    if (fb[ib].length) {\n                        gb = true;\n                        jb.unsubscribe(db[ib]);\n                    }\n                ;\n                };\n                if (!gb) {\n                    cb(eb);\n                }\n                 else {\n                    var nb = [], ob = [], pb = [];\n                    for (var qb in fb) {\n                        var rb = fb[qb];\n                        if (rb.length) {\n                            var sb = Math.min.apply(Math, rb), tb = Math.max.apply(Math, rb), ub = sb, vb = ((tb - sb) + 1);\n                            nb.push(qb);\n                            ob.push(ub);\n                            pb.push(vb);\n                        }\n                    ;\n                    };\n                    k.trySend(\"/ajax/ufi/reply_fetch.php\", {\n                        ft_ent_identifier: hb.entidentifier,\n                        parent_comment_ids: nb,\n                        source: null,\n                        offsets: ob,\n                        lengths: pb\n                    });\n                }\n            ;\n            }.bind(this));\n            return db;\n        },\n        getCommentCount: function(ab) {\n            return (z[ab] || 0);\n        },\n        getDeletedCount: function(ab) {\n            return (aa[ab] || 0);\n        },\n        getDisplayedCommentCount: function(ab) {\n            return (((z[ab] || 0)) - ((aa[ab] || 0)));\n        },\n        _dump: function() {\n            var ab = {\n                _comments: w,\n                _commentLists: x,\n                _replyLists: y,\n                _commentCounts: z,\n                _deletedCounts: aa,\n                _localIDMap: ba\n            };\n            return JSON.stringify(ab);\n        }\n    };\n    k.registerEndpoints({\n        \"/ajax/ufi/comment_fetch.php\": {\n            mode: k.IMMEDIATE,\n            handler: l.handleUpdate.bind(l, m.UFIPayloadSourceType.ENDPOINT_COMMENT_FETCH)\n        },\n        \"/ajax/ufi/reply_fetch.php\": {\n            mode: k.IMMEDIATE,\n            handler: l.handleUpdate.bind(l, m.UFIPayloadSourceType.ENDPOINT_COMMENT_FETCH)\n        }\n    });\n    l.subscribe(\"update-comments\", function(ab, bb) {\n        if ((bb.comments && bb.comments.length)) {\n            ia(bb.comments, bb.payloadsource);\n        };\n    });\n    l.subscribe(\"update-actions\", function(ab, bb) {\n        if ((bb.actions && bb.actions.length)) {\n            ka(bb.actions);\n        };\n    });\n    l.subscribe(\"update-comment-lists\", function(ab, bb) {\n        var cb = bb.commentlists;\n        if ((cb && Object.keys(cb).length)) {\n            if (cb.comments) {\n                for (var db in cb.comments) {\n                    for (var eb in cb.comments[db]) {\n                        la(db, cb.comments[db][eb], eb);;\n                    };\n                }\n            };\n            if (cb.replies) {\n                for (var fb in cb.replies) {\n                    la(fb, cb.replies[fb]);;\n                }\n            };\n        }\n    ;\n    });\n    l.subscribe(\"update-feedback\", function(ab, bb) {\n        var cb = bb.feedbacktargets;\n        if ((cb && cb.length)) {\n            ma(cb);\n        };\n    });\n    e.exports = za;\n});\n__d(\"UFILikeLink.react\", [\"React\",\"TrackingNodes\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"React\"), h = b(\"TrackingNodes\"), i = b(\"tx\"), j = g.createClass({\n        displayName: \"UFILikeLink\",\n        render: function() {\n            var k = (this.props.likeAction ? \"Like\" : \"Unlike\"), l = h.getTrackingInfo((this.props.likeAction ? h.types.LIKE_LINK : h.types.UNLIKE_LINK)), m = (this.props.likeAction ? \"Like this\" : \"Unlike this\");\n            return (g.DOM.a({\n                className: \"UFILikeLink\",\n                href: \"#\",\n                role: \"button\",\n                \"aria-live\": \"polite\",\n                title: m,\n                onClick: this.props.onClick,\n                \"data-ft\": l\n            }, k));\n        }\n    });\n    e.exports = j;\n});\n__d(\"UFISubscribeLink.react\", [\"React\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"React\"), h = b(\"tx\"), i = g.createClass({\n        displayName: \"UFISubscribeLink\",\n        render: function() {\n            var j = (this.props.subscribeAction ? \"Follow Post\" : \"Unfollow Post\"), k = (this.props.subscribeAction ? \"Get notified when someone comments\" : \"Stop getting notified when someone comments\");\n            return (g.DOM.a({\n                className: \"UFISubscribeLink\",\n                href: \"#\",\n                role: \"button\",\n                \"aria-live\": \"polite\",\n                title: k,\n                onClick: this.props.onClick\n            }, j));\n        }\n    });\n    e.exports = i;\n});\n__d(\"ProfileBrowserLink\", [\"URI\",], function(a, b, c, d, e, f) {\n    var g = b(\"URI\"), h = \"/ajax/browser/dialog/\", i = \"/browse/\", j = function(l, m, n) {\n        return new g((l + m)).setQueryData(n);\n    }, k = {\n        constructPageURI: function(l, m) {\n            return j(i, l, m);\n        },\n        constructDialogURI: function(l, m) {\n            return j(h, l, m);\n        }\n    };\n    e.exports = k;\n});\n__d(\"ProfileBrowserTypes\", [], function(a, b, c, d, e, f) {\n    var g = {\n        LIKES: \"likes\",\n        GROUP_MESSAGE_VIEWERS: \"group_message_viewers\",\n        MUTUAL_FRIENDS: \"mutual_friends\"\n    };\n    e.exports = g;\n});\n__d(\"UFITimelineBlingBox.react\", [\"ProfileBrowserLink\",\"ProfileBrowserTypes\",\"React\",\"UFIBlingItem.react\",\"URI\",\"cx\",\"fbt\",], function(a, b, c, d, e, f) {\n    var g = b(\"ProfileBrowserLink\"), h = b(\"ProfileBrowserTypes\"), i = b(\"React\"), j = b(\"UFIBlingItem.react\"), k = b(\"URI\"), l = b(\"cx\"), m = b(\"fbt\"), n = i.createClass({\n        displayName: \"UFITimelineBlingBox\",\n        render: function() {\n            var o = [];\n            if ((this.props.likes && this.props.enableShowLikes)) {\n                var p = this._getProfileBrowserURI(), q = \"See who likes this\", r = i.DOM.a({\n                    ajaxify: p.dialog,\n                    className: this._getItemClassName(o),\n                    \"data-ft\": this.props[\"data-ft\"],\n                    \"data-gt\": this.props[\"data-gt\"],\n                    \"data-hover\": \"tooltip\",\n                    \"data-tooltip-alignh\": \"right\",\n                    \"data-tooltip-uri\": this._getLikeToolTipURI(),\n                    href: p.page,\n                    rel: \"dialog\",\n                    role: \"button\",\n                    title: q\n                }, j({\n                    contextArgs: this.props.contextArgs,\n                    count: this.props.likes,\n                    iconClassName: \"UFIBlingBoxTimelineLikeIcon\"\n                }));\n                o.push(r);\n            }\n        ;\n            if ((this.props.comments && this.props.enableShowComments)) {\n                var s = \"Show comments\", t = i.DOM.a({\n                    \"aria-label\": s,\n                    className: this._getItemClassName(o),\n                    \"data-ft\": this.props[\"data-ft\"],\n                    \"data-hover\": \"tooltip\",\n                    \"data-tooltip-alignh\": \"right\",\n                    href: \"#\",\n                    onClick: this.props.commentOnClick\n                }, j({\n                    contextArgs: this.props.contextArgs,\n                    count: this.props.comments,\n                    iconClassName: \"UFIBlingBoxTimelineCommentIcon\"\n                }));\n                o.push(t);\n            }\n        ;\n            if (this.props.reshares) {\n                var u = \"Show shares\", v = this._getShareViewURI(), w = i.DOM.a({\n                    ajaxify: v.dialog,\n                    \"aria-label\": u,\n                    className: this._getItemClassName(o),\n                    \"data-ft\": this.props[\"data-ft\"],\n                    \"data-hover\": \"tooltip\",\n                    \"data-tooltip-alignh\": \"right\",\n                    href: v.page,\n                    rel: \"async\"\n                }, j({\n                    contextArgs: this.props.contextArgs,\n                    count: this.props.reshares,\n                    iconClassName: \"UFIBlingBoxTimelineReshareIcon\"\n                }));\n                o.push(w);\n            }\n        ;\n            return (i.DOM.span(null, o));\n        },\n        _getItemClassName: function(o) {\n            return (((((o.length > 0) ? \"mls\" : \"\")) + ((\" \" + \"UFIBlingBoxTimelineItem\"))));\n        },\n        _getLikeToolTipURI: function() {\n            if (this.props.feedbackFBID) {\n                var o = new k(\"/ajax/timeline/likestooltip.php\").setQueryData({\n                    obj_fbid: this.props.feedbackFBID\n                });\n                return o.toString();\n            }\n             else return null\n        ;\n        },\n        _getProfileBrowserURI: function() {\n            if (this.props.feedbackFBID) {\n                var o = h.LIKES, p = {\n                    id: this.props.feedbackFBID\n                }, q = g.constructDialogURI(o, p), r = g.constructPageURI(o, p), s = {\n                    dialog: q.toString(),\n                    page: r.toString()\n                };\n                return s;\n            }\n        ;\n        },\n        _getShareViewURI: function() {\n            if (this.props.feedbackFBID) {\n                var o = new k(\"/ajax/shares/view\").setQueryData({\n                    target_fbid: this.props.feedbackFBID\n                }), p = new k(\"/shares/view\").setSubdomain(\"www\").setQueryData({\n                    id: this.props.feedbackFBID\n                }), q = {\n                    dialog: o.toString(),\n                    page: p.toString()\n                };\n                return q;\n            }\n        ;\n        }\n    });\n    e.exports = n;\n});\n__d(\"UFIUserActions\", [\"AsyncResponse\",\"CLoggerX\",\"ClientIDs\",\"ImmutableObject\",\"JSLogger\",\"Nectar\",\"UFICentralUpdates\",\"UFIComments\",\"UFIConstants\",\"UFIFeedbackTargets\",\"MercuryServerDispatcher\",\"collectDataAttributes\",\"copyProperties\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncResponse\"), h = b(\"CLoggerX\"), i = b(\"ClientIDs\"), j = b(\"ImmutableObject\"), k = b(\"JSLogger\"), l = b(\"Nectar\"), m = b(\"UFICentralUpdates\"), n = b(\"UFIComments\"), o = b(\"UFIConstants\"), p = b(\"UFIFeedbackTargets\"), q = b(\"MercuryServerDispatcher\"), r = b(\"collectDataAttributes\"), s = b(\"copyProperties\"), t = b(\"tx\"), u = k.create(\"UFIUserActions\"), v = {\n        BAN: \"ban\",\n        UNDO_BAN: \"undo_ban\"\n    }, w = {\n        changeCommentLike: function(ka, la, ma) {\n            var na = n.getComment(ka);\n            if ((na.hasviewerliked != la)) {\n                var oa = x(ma.target), pa = (la ? 1 : -1), qa = {\n                    commentid: ka,\n                    actiontype: o.UFIActionType.COMMENT_LIKE,\n                    viewerliked: la,\n                    likecount: (na.likecount + pa)\n                };\n                m.handleUpdate(o.UFIPayloadSourceType.USER_ACTION, {\n                    actions: [qa,]\n                });\n                q.trySend(\"/ajax/ufi/comment_like.php\", s({\n                    comment_id: ka,\n                    legacy_id: na.legacyid,\n                    like_action: la,\n                    ft_ent_identifier: na.ftentidentifier,\n                    source: ma.source,\n                    client_id: i.getNewClientID()\n                }, oa));\n            }\n        ;\n        },\n        addComment: function(ka, la, ma, na) {\n            p.getFeedbackTarget(ka, function(oa) {\n                var pa = x(na.target), qa = i.getNewClientID();\n                if (!oa.actorforpost) {\n                    return\n                };\n                var ra = {\n                    ftentidentifier: ka,\n                    body: {\n                        text: la\n                    },\n                    author: oa.actorforpost,\n                    id: qa,\n                    islocal: true,\n                    ufiinstanceid: na.ufiinstanceid,\n                    likecount: 0,\n                    hasviewerliked: false,\n                    parentcommentid: na.replyid,\n                    photo_comment: na.attachedphoto,\n                    timestamp: {\n                        time: Date.now(),\n                        text: \"a few seconds ago\"\n                    }\n                }, sa = {\n                    actiontype: o.UFIActionType.SUBSCRIBE_ACTION,\n                    actorid: oa.actorforpost,\n                    hasviewersubscribed: true,\n                    entidentifier: ka\n                };\n                m.handleUpdate(o.UFIPayloadSourceType.USER_ACTION, {\n                    comments: [ra,],\n                    actions: [sa,]\n                });\n                var ta = null;\n                if (na.replyid) {\n                    ta = (n.getComment(na.replyid)).fbid;\n                };\n                var ua = h.getCLParamsForTarget(na.target, ta);\n                q.trySend(\"/ajax/ufi/add_comment.php\", s({\n                    ft_ent_identifier: oa.entidentifier,\n                    comment_text: ma,\n                    source: na.source,\n                    client_id: qa,\n                    reply_fbid: ta,\n                    parent_comment_id: na.replyid,\n                    timeline_log_data: na.timelinelogdata,\n                    rootid: na.rootid,\n                    clp: ua,\n                    attached_photo_fbid: (na.attachedphoto ? na.attachedphoto.fbid : 0),\n                    giftoccasion: na.giftoccasion\n                }, pa));\n            });\n        },\n        editComment: function(ka, la, ma, na) {\n            var oa = x(na.target), pa = n.getComment(ka);\n            pa = j.set(pa, {\n                status: o.UFIStatus.PENDING_EDIT,\n                body: {\n                    text: la\n                },\n                timestamp: {\n                    time: Date.now(),\n                    text: \"a few seconds ago\"\n                },\n                originalTimestamp: pa.timestamp.time,\n                editnux: null,\n                attachment: null\n            });\n            m.handleUpdate(o.UFIPayloadSourceType.USER_ACTION, {\n                comments: [pa,]\n            });\n            q.trySend(\"/ajax/ufi/edit_comment.php\", s({\n                ft_ent_identifier: pa.ftentidentifier,\n                comment_text: ma,\n                source: na.source,\n                comment_id: pa.id,\n                parent_comment_id: pa.parentcommentid,\n                attached_photo_fbid: (na.attachedPhoto ? na.attachedPhoto.fbid : 0)\n            }, oa));\n        },\n        translateComment: function(ka, la) {\n            q.trySend(\"/ajax/ufi/translate_comment.php\", {\n                ft_ent_identifier: ka.ftentidentifier,\n                comment_ids: [ka.id,],\n                source: la.source\n            });\n        },\n        setHideAsSpam: function(ka, la, ma) {\n            var na = x(ma.target), oa = n.getComment(ka), pa = {\n                commentid: ka,\n                actiontype: o.UFIActionType.COMMENT_SET_SPAM,\n                shouldHideAsSpam: la\n            };\n            m.handleUpdate(o.UFIPayloadSourceType.USER_ACTION, {\n                actions: [pa,]\n            });\n            q.trySend(\"/ajax/ufi/comment_spam.php\", s({\n                comment_id: ka,\n                spam_action: la,\n                ft_ent_identifier: oa.ftentidentifier,\n                source: ma.source\n            }, na));\n        },\n        removeComment: function(ka, la) {\n            var ma = x(la.target), na = n.getComment(ka), oa = {\n                actiontype: o.UFIActionType.DELETE_COMMENT,\n                commentid: ka,\n                oneclick: la.oneclick\n            };\n            m.handleUpdate(o.UFIPayloadSourceType.USER_ACTION, {\n                actions: [oa,]\n            });\n            q.trySend(\"/ajax/ufi/delete_comment.php\", s({\n                comment_id: na.id,\n                comment_legacyid: na.legacyid,\n                ft_ent_identifier: na.ftentidentifier,\n                one_click: la.oneclick,\n                source: la.source,\n                client_id: i.getNewClientID(),\n                timeline_log_data: la.timelinelogdata\n            }, ma));\n        },\n        undoRemoveComment: function(ka, la, ma) {\n            var na = n.getComment(ka);\n            if (!na.undoData) {\n                u.error(\"noundodata\", {\n                    comment: ka\n                });\n                return;\n            }\n        ;\n            var oa = x(ma.target), pa = {\n                actiontype: o.UFIActionType.UNDO_DELETE_COMMENT,\n                commentid: ka\n            };\n            m.handleUpdate(o.UFIPayloadSourceType.USER_ACTION, {\n                actions: [pa,]\n            });\n            var qa = na.undoData;\n            qa.page_admin = la;\n            var ra = s(oa, qa);\n            q.trySend(\"/ajax/ufi/undo_delete_comment.php\", ra);\n        },\n        banUser: function(ka, la, ma, na) {\n            var oa = (ma ? v.BAN : v.UNDO_BAN);\n            q.trySend(\"/ajax/ufi/ban_user.php\", {\n                page_id: la,\n                commenter_id: ka.author,\n                action: oa,\n                comment_id: ka.id,\n                client_side: true\n            });\n        },\n        changeLike: function(ka, la, ma) {\n            p.getFeedbackTarget(ka, function(na) {\n                var oa = x(ma.target);\n                if ((na.hasviewerliked !== la)) {\n                    var pa = (la ? 1 : -1), qa = {\n                        actiontype: o.UFIActionType.LIKE_ACTION,\n                        actorid: na.actorforpost,\n                        hasviewerliked: la,\n                        likecount: (na.likecount + pa),\n                        entidentifier: ka,\n                        likesentences: {\n                            current: na.likesentences.alternate,\n                            alternate: na.likesentences.current\n                        }\n                    };\n                    m.handleUpdate(o.UFIPayloadSourceType.USER_ACTION, {\n                        actions: [qa,]\n                    });\n                    q.trySend(\"/ajax/ufi/like.php\", s({\n                        like_action: la,\n                        ft_ent_identifier: ka,\n                        source: ma.source,\n                        client_id: i.getNewClientID(),\n                        rootid: ma.rootid,\n                        giftoccasion: ma.giftoccasion\n                    }, oa));\n                }\n            ;\n            });\n        },\n        changeSubscribe: function(ka, la, ma) {\n            p.getFeedbackTarget(ka, function(na) {\n                var oa = x(ma.target);\n                if ((na.hasviewersubscribed !== la)) {\n                    var pa = {\n                        actiontype: o.UFIActionType.SUBSCRIBE_ACTION,\n                        actorid: na.actorforpost,\n                        hasviewersubscribed: la,\n                        entidentifier: ka\n                    };\n                    m.handleUpdate(o.UFIPayloadSourceType.USER_ACTION, {\n                        actions: [pa,]\n                    });\n                    q.trySend(\"/ajax/ufi/subscribe.php\", s({\n                        subscribe_action: la,\n                        ft_ent_identifier: ka,\n                        source: ma.source,\n                        client_id: i.getNewClientID(),\n                        rootid: ma.rootid,\n                        comment_expand_mode: ma.commentexpandmode\n                    }, oa));\n                }\n            ;\n            });\n        },\n        fetchSpamComments: function(ka, la, ma, na) {\n            q.trySend(\"/ajax/ufi/id_comment_fetch.php\", {\n                ft_ent_identifier: ka,\n                viewas: na,\n                comment_ids: la,\n                parent_comment_id: ma,\n                source: null\n            });\n        },\n        removePreview: function(ka, la) {\n            var ma = x(la.target), na = {\n                commentid: ka.id,\n                actiontype: o.UFIActionType.REMOVE_PREVIEW\n            };\n            m.handleUpdate(o.UFIPayloadSourceType.USER_ACTION, {\n                actions: [na,]\n            });\n            q.trySend(\"/ajax/ufi/remove_preview.php\", s({\n                comment_id: ka.id,\n                ft_ent_identifier: ka.ftentidentifier,\n                source: la.source\n            }, ma));\n        }\n    };\n    function x(ka) {\n        if (!ka) {\n            return {\n                ft: {\n                }\n            }\n        };\n        var la = {\n            ft: r(ka, [\"ft\",]).ft\n        };\n        l.addModuleData(la, ka);\n        return la;\n    };\n    function y(ka) {\n        var la = ka.request.data;\n        g.defaultErrorHandler(ka);\n        var ma = (la.client_id || la.comment_id), na = n.getComment(ma), oa = (((na.status === o.UFIStatus.PENDING_EDIT)) ? o.UFIStatus.FAILED_EDIT : o.UFIStatus.FAILED_ADD);\n        na = j.setDeep(na, {\n            status: oa,\n            allowRetry: z(ka),\n            body: {\n                mentionstext: la.comment_text\n            }\n        });\n        m.handleUpdate(o.UFIPayloadSourceType.USER_ACTION, {\n            comments: [na,]\n        });\n    };\n    function z(ka) {\n        var la = ka.getError();\n        if ((la === 1404102)) {\n            return false\n        };\n        if (ka.silentError) {\n            return true\n        };\n        if (((la === 1357012) || (la === 1357006))) {\n            return false\n        };\n        return true;\n    };\n    function aa(ka) {\n        var la = ka.request.data, ma = la.comment_id, na = n.getComment(ma);\n        na = j.set(na, {\n            status: (na.priorstatus || null),\n            priorstatus: undefined\n        });\n        m.handleUpdate(o.UFIPayloadSourceType.USER_ACTION, {\n            comments: [na,]\n        });\n    };\n    function ba(ka) {\n        var la = ka.request.data, ma = la.comment_id, na = n.getComment(ma);\n        if ((la.like_action === na.hasviewerliked)) {\n            var oa = (na.hasviewerliked ? -1 : 1), pa = {\n                commentid: ma,\n                actiontype: o.UFIActionType.COMMENT_LIKE,\n                viewerliked: !na.hasviewerliked,\n                likecount: (na.likecount + oa)\n            };\n            m.handleUpdate(o.UFIPayloadSourceType.USER_ACTION, {\n                actions: [pa,]\n            });\n        }\n    ;\n        g.defaultErrorHandler(ka);\n    };\n    function ca(ka) {\n        var la = ka.request.data, ma = la.ft_ent_identifier;\n        p.getFeedbackTarget(ma, function(na) {\n            if ((na.hasviewerliked === la.like_action)) {\n                var oa = (na.hasviewerliked ? -1 : 1), pa = {\n                    actiontype: o.UFIActionType.LIKE_ACTION,\n                    actorid: na.actorforpost,\n                    hasviewerliked: !na.hasviewerliked,\n                    likecount: (na.likecount + oa),\n                    entidentifier: ma,\n                    likesentences: {\n                        current: na.likesentences.alternate,\n                        alternate: na.likesentences.current\n                    }\n                };\n                m.handleUpdate(o.UFIPayloadSourceType.USER_ACTION, {\n                    actions: [pa,]\n                });\n            }\n        ;\n        });\n        g.defaultErrorHandler(ka);\n    };\n    function da(ka) {\n        var la = ka.request.data, ma = la.ft_ent_identifier;\n        p.getFeedbackTarget(ma, function(na) {\n            if ((na.hasviewersubscribed === la.subscribe_action)) {\n                var oa = {\n                    actiontype: o.UFIActionType.SUBSCRIBE_ACTION,\n                    actorid: na.actorforpost,\n                    hasviewersubscribed: !na.hasviewersubscribed,\n                    entidentifier: ma\n                };\n                m.handleUpdate(o.UFIPayloadSourceType.USER_ACTION, {\n                    actions: [oa,]\n                });\n            }\n        ;\n        });\n        g.defaultErrorHandler(ka);\n    };\n    var ea = function(ka) {\n        return m.handleUpdate.bind(m, ka);\n    }, fa = o.UFIPayloadSourceType;\n    q.registerEndpoints({\n        \"/ajax/ufi/comment_like.php\": {\n            mode: q.BATCH_CONDITIONAL,\n            handler: ea(fa.ENDPOINT_COMMENT_LIKE),\n            error_handler: ba,\n            batch_if: ga,\n            batch_function: ja\n        },\n        \"/ajax/ufi/comment_spam.php\": {\n            mode: q.IMMEDIATE,\n            handler: ea(fa.ENDPOINT_COMMENT_SPAM),\n            error_handler: aa\n        },\n        \"/ajax/ufi/add_comment.php\": {\n            mode: q.IMMEDIATE,\n            handler: ea(fa.ENDPOINT_ADD_COMMENT),\n            error_handler: y\n        },\n        \"/ajax/ufi/delete_comment.php\": {\n            mode: q.IMMEDIATE,\n            handler: ea(fa.ENDPOINT_DELETE_COMMENT),\n            error_handler: aa\n        },\n        \"/ajax/ufi/undo_delete_comment.php\": {\n            mode: q.IMMEDIATE,\n            handler: ea(fa.ENDPOINT_UNDO_DELETE_COMMENT),\n            error_handler: aa\n        },\n        \"/ajax/ufi/ban_user.php\": {\n            mode: q.IMMEDIATE,\n            handler: ea(fa.ENDPOINT_BAN)\n        },\n        \"/ajax/ufi/edit_comment.php\": {\n            mode: q.IMMEDIATE,\n            handler: ea(fa.ENDPOINT_EDIT_COMMENT),\n            error_handler: y\n        },\n        \"/ajax/ufi/like.php\": {\n            mode: q.BATCH_CONDITIONAL,\n            handler: ea(fa.ENDPOINT_LIKE),\n            error_handler: ca,\n            batch_if: ha,\n            batch_function: ja\n        },\n        \"/ajax/ufi/subscribe.php\": {\n            mode: q.BATCH_CONDITIONAL,\n            handler: ea(fa.ENDPOINT_SUBSCRIBE),\n            error_handler: da,\n            batch_if: ia,\n            batch_function: ja\n        },\n        \"/ajax/ufi/id_comment_fetch.php\": {\n            mode: q.IMMEDIATE,\n            handler: ea(fa.ENDPOINT_ID_COMMENT_FETCH)\n        },\n        \"/ajax/ufi/remove_preview.php\": {\n            mode: q.IMMEDIATE,\n            handler: ea(fa.ENDPOINT_REMOVE_PREVIEW)\n        },\n        \"/ajax/ufi/translate_comment.php\": {\n            mode: q.IMMEDIATE,\n            handler: ea(fa.ENDPOINT_TRANSLATE_COMMENT)\n        }\n    });\n    function ga(ka, la) {\n        return ((ka && (ka.ft_ent_identifier == la.ft_ent_identifier)) && (ka.comment_id == la.comment_id));\n    };\n    function ha(ka, la) {\n        return (ka && (ka.ft_ent_identifier == la.ft_ent_identifier));\n    };\n    function ia(ka, la) {\n        return (ka && (ka.ft_ent_identifier == la.ft_ent_identifier));\n    };\n    function ja(ka, la) {\n        return la;\n    };\n    e.exports = w;\n});\n__d(\"UFIActionLinkController\", [\"Arbiter\",\"ClickTTIIdentifiers\",\"CSS\",\"DOMQuery\",\"Parent\",\"React\",\"TrackingNodes\",\"UFIBlingBox.react\",\"UFICentralUpdates\",\"UFIComments\",\"UFIConstants\",\"UFIFeedbackTargets\",\"UFILikeLink.react\",\"UFISubscribeLink.react\",\"UFITimelineBlingBox.react\",\"UFIUserActions\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ClickTTIIdentifiers\"), i = b(\"CSS\"), j = b(\"DOMQuery\"), k = b(\"Parent\"), l = b(\"React\"), m = b(\"TrackingNodes\"), n = b(\"UFIBlingBox.react\"), o = b(\"UFICentralUpdates\"), p = b(\"UFIComments\"), q = b(\"UFIConstants\"), r = b(\"UFIFeedbackTargets\"), s = b(\"UFILikeLink.react\"), t = b(\"UFISubscribeLink.react\"), u = b(\"UFITimelineBlingBox.react\"), v = b(\"UFIUserActions\"), w = b(\"copyProperties\");\n    function x(z, aa, ba) {\n        if (this._root) {\n            throw new Error((\"UFIActionLinkController attempted to initialize when a root was\" + \" already present\"))\n        };\n        var ca = j.scry(z, aa)[0];\n        if (ca) {\n            var da = document.createElement(\"span\");\n            ca.parentNode.replaceChild(da, ca);\n            da.appendChild(ca);\n            if ((typeof ba === \"function\")) {\n                ba(da);\n            };\n        }\n         else var ea = g.subscribe(\"PhotoSnowlift.DATA_CHANGE\", function() {\n            g.unsubscribe(ea);\n            x(z, aa, ba);\n        }, g.SUBSCRIBE_NEW)\n    ;\n    };\n    var y = function(z, aa, ba) {\n        this._id = aa.ftentidentifier;\n        this._ftFBID = ba.targetfbid;\n        this._source = aa.source;\n        this._contextArgs = aa;\n        this._ufiRoot = z;\n        if (this._isSourceProfile(this._contextArgs.source)) {\n            this._attemptInitializeTimelineBling();\n        }\n         else this._attemptInitializeBling();\n    ;\n        if (ba.viewercanlike) {\n            this._attemptInitializeLike();\n        };\n        if (ba.viewercansubscribetopost) {\n            this._attemptInitializeSubscribe();\n        };\n        o.subscribe(\"feedback-updated\", function(ca, da) {\n            var ea = da.updates;\n            if ((this._id in ea)) {\n                this.render();\n            };\n        }.bind(this));\n        o.subscribe(\"feedback-id-changed\", function(ca, da) {\n            var ea = da.updates;\n            if ((this._id in ea)) {\n                this._id = ea[this._id];\n            };\n        }.bind(this));\n    };\n    w(y.prototype, {\n        _attemptInitializeBling: function() {\n            x(this._ufiRoot, \"^form .uiBlingBox\", function(z) {\n                this._blingRoot = z;\n                if (this._dataReady) {\n                    this._renderBling();\n                };\n            }.bind(this));\n        },\n        _attemptInitializeTimelineBling: function() {\n            if (this._root) {\n                throw new Error((\"UFIActionLinkController attempted to initialize when a root was\" + \" already present\"))\n            };\n            var z = j.scry(this._ufiRoot, \"^form .fbTimelineFeedbackActions span\")[0];\n            if (z) {\n                i.addClass(z, \"UFIBlingBoxTimeline\");\n                var aa = j.scry(z, \".fbTimelineFeedbackLikes\")[0];\n                this._enableShowLikes = (aa ? true : false);\n                var ba = j.scry(z, \".fbTimelineFeedbackComments\")[0];\n                this._enableShowComments = (ba ? true : false);\n            }\n        ;\n            this._blingTimelineRoot = z;\n            if (this._dataReady) {\n                this._renderTimelineBling();\n            };\n        },\n        _attemptInitializeLike: function() {\n            x(this._ufiRoot, \"^form .like_link\", function(z) {\n                this._likeRoot = z;\n                if (this._dataReady) {\n                    this._renderLike();\n                };\n            }.bind(this));\n        },\n        _attemptInitializeSubscribe: function() {\n            x(this._ufiRoot, \"^form .unsub_link\", function(z) {\n                this._subscribeRoot = z;\n                if (this._dataReady) {\n                    this._renderSubscribe();\n                };\n            }.bind(this));\n        },\n        render: function() {\n            this._dataReady = true;\n            if (this._isSourceProfile(this._contextArgs.source)) {\n                this._renderTimelineBling();\n            }\n             else this._renderBling();\n        ;\n            this._renderLike();\n            this._renderSubscribe();\n        },\n        _renderBling: function() {\n            if (this._blingRoot) {\n                r.getFeedbackTarget(this._id, function(z) {\n                    var aa = function(event) {\n                        var da = k.byTag(event.target, \"form\");\n                        i.toggleClass(da, \"collapsed_comments\");\n                        i.toggleClass(da, \"hidden_add_comment\");\n                        event.preventDefault();\n                    }.bind(this), ba = m.getTrackingInfo(m.types.BLINGBOX), ca = n({\n                        likes: z.likecount,\n                        comments: p.getDisplayedCommentCount(this._id),\n                        reshares: z.sharecount,\n                        permalink: z.permalink,\n                        contextArgs: this._contextArgs,\n                        onClick: aa,\n                        \"data-ft\": ba\n                    });\n                    this._blingBox = l.renderComponent(ca, this._blingRoot);\n                }.bind(this));\n            };\n        },\n        _renderTimelineBling: function() {\n            if (this._blingTimelineRoot) {\n                r.getFeedbackTarget(this._id, function(z) {\n                    var aa = m.getTrackingInfo(m.types.BLINGBOX), ba = h.getUserActionID(h.types.TIMELINE_SEE_LIKERS), ca = function(event) {\n                        var ea = k.byTag(event.target, \"form\");\n                        i.removeClass(ea, \"collapsed_comments\");\n                        var fa = j.scry(ea, \"a.UFIPagerLink\");\n                        if (fa.length) {\n                            fa[0].click();\n                        };\n                        event.preventDefault();\n                    }.bind(this), da = u({\n                        comments: p.getDisplayedCommentCount(this._id),\n                        commentOnClick: ca,\n                        contextArgs: this._contextArgs,\n                        \"data-ft\": aa,\n                        \"data-gt\": ba,\n                        enableShowComments: this._enableShowComments,\n                        enableShowLikes: this._enableShowLikes,\n                        feedbackFBID: this._ftFBID,\n                        likes: z.likecount,\n                        reshares: z.sharecount\n                    });\n                    l.renderComponent(da, this._blingTimelineRoot);\n                }.bind(this));\n            };\n        },\n        _renderLike: function() {\n            if (this._likeRoot) {\n                r.getFeedbackTarget(this._id, function(z) {\n                    var aa = !z.hasviewerliked, ba = function(event) {\n                        v.changeLike(this._id, aa, {\n                            source: this._source,\n                            target: event.target,\n                            rootid: this._contextArgs.rootid,\n                            giftoccasion: this._contextArgs.giftoccasion\n                        });\n                        event.preventDefault();\n                    }.bind(this), ca = s({\n                        onClick: ba,\n                        likeAction: aa\n                    });\n                    this._likeLink = l.renderComponent(ca, this._likeRoot);\n                }.bind(this));\n            };\n        },\n        _renderSubscribe: function() {\n            if (this._subscribeRoot) {\n                r.getFeedbackTarget(this._id, function(z) {\n                    var aa = !z.hasviewersubscribed, ba = function(event) {\n                        v.changeSubscribe(this._id, aa, {\n                            source: this._source,\n                            target: event.target,\n                            rootid: this._contextArgs.rootid,\n                            commentexpandmode: z.commentexpandmode\n                        });\n                        event.preventDefault();\n                    }.bind(this), ca = t({\n                        onClick: ba,\n                        subscribeAction: aa\n                    });\n                    this._subscribeLink = l.renderComponent(ca, this._subscribeRoot);\n                }.bind(this));\n            };\n        },\n        _isSourceProfile: function(z) {\n            return (z === q.UFIFeedbackSourceType.PROFILE);\n        }\n    });\n    e.exports = y;\n});\n__d(\"MentionsInputUtils\", [], function(a, b, c, d, e, f) {\n    var g = {\n        generateDataFromTextWithEntities: function(h) {\n            var i = h.text, j = [];\n            ((h.ranges || [])).forEach(function(l) {\n                var m = l.entities[0];\n                if (!m.external) {\n                    j.push({\n                        uid: m.id,\n                        text: i.substr(l.offset, l.length),\n                        offset: l.offset,\n                        length: l.length,\n                        weakreference: !!m.weakreference\n                    });\n                };\n            });\n            var k = {\n                value: i,\n                mentions: j\n            };\n            return k;\n        }\n    };\n    e.exports = g;\n});\n__d(\"ClipboardPhotoUploader\", [\"ArbiterMixin\",\"AsyncRequest\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"ArbiterMixin\"), h = b(\"AsyncRequest\"), i = b(\"copyProperties\");\n    function j(k, l) {\n        this.uploadURIString = k;\n        this.data = l;\n    };\n    i(j.prototype, g, {\n        handlePaste: function(event) {\n            if (!event.clipboardData) {\n                return\n            };\n            var k = event.clipboardData.items;\n            if (!k) {\n                return\n            };\n            for (var l = 0; (l < k.length); ++l) {\n                var m = k[l];\n                if (((m.kind === \"file\") && (m.type.indexOf(\"image/\") !== -1))) {\n                    var n = new FormData();\n                    n.append(\"pasted_file\", m.getAsFile());\n                    var o = new h();\n                    o.setURI(this.uploadURIString).setData(this.data).setRawData(n).setHandler(function(p) {\n                        this.inform(\"upload_success\", p);\n                    }.bind(this)).setErrorHandler(function(p) {\n                        this.inform(\"upload_error\", p);\n                    }.bind(this));\n                    this.inform(\"upload_start\");\n                    o.send();\n                    break;\n                }\n            ;\n            };\n        }\n    });\n    e.exports = j;\n});\n__d(\"CloseButton.react\", [\"React\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"React\"), h = b(\"cx\"), i = g.createClass({\n        displayName: \"CloseButton\",\n        render: function() {\n            var j = this.props, k = (j.size || \"medium\"), l = (j.appearance || \"normal\"), m = (k === \"small\"), n = (k === \"huge\"), o = (l === \"dark\"), p = (l === \"inverted\"), q = ((((((((\"uiCloseButton\") + ((m ? (\" \" + \"uiCloseButtonSmall\") : \"\"))) + ((n ? (\" \" + \"uiCloseButtonHuge\") : \"\"))) + (((m && o) ? (\" \" + \"uiCloseButtonSmallDark\") : \"\"))) + (((m && p) ? (\" \" + \"uiCloseButtonSmallInverted\") : \"\"))) + (((!m && o) ? (\" \" + \"uiCloseButtonDark\") : \"\"))) + (((!m && p) ? (\" \" + \"uiCloseButtonInverted\") : \"\"))));\n            return this.transferPropsTo(g.DOM.a({\n                href: \"#\",\n                role: \"button\",\n                \"aria-label\": j.tooltip,\n                \"data-hover\": (j.tooltip && \"tooltip\"),\n                \"data-tooltip-alignh\": (j.tooltip && \"center\"),\n                className: q\n            }));\n        }\n    });\n    e.exports = i;\n});\n__d(\"LoadingIndicator.react\", [\"React\",\"joinClasses\",\"keyMirror\",\"merge\",], function(a, b, c, d, e, f) {\n    var g = b(\"React\"), h = b(\"joinClasses\"), i = b(\"keyMirror\"), j = b(\"merge\"), k = i({\n        white: true,\n        blue: true,\n        black: true\n    }), l = i({\n        small: true,\n        medium: true,\n        large: true\n    }), m = {\n        white: {\n            large: \"/images/loaders/indicator_blue_large.gif\",\n            medium: \"/images/loaders/indicator_blue_medium.gif\",\n            small: \"/images/loaders/indicator_blue_small.gif\"\n        },\n        blue: {\n            large: \"/images/loaders/indicator_white_large.gif\",\n            small: \"/images/loaders/indicator_white_small.gif\"\n        },\n        black: {\n            large: \"/images/loaders/indicator_black.gif\"\n        }\n    }, n = g.createClass({\n        displayName: \"LoadingIndicator\",\n        render: function() {\n            var o = this.props.color, p = this.props.size;\n            if (!m[o]) {\n                return g.DOM.span(null)\n            };\n            if (!m[o][p]) {\n                return g.DOM.span(null)\n            };\n            var q = ((this.props.showonasync ? \"uiLoadingIndicatorAsync\" : \"\"));\n            if (this.props.className) {\n                q = h(this.props.className, q);\n            };\n            var r = m[o][p], s = g.DOM.img({\n                src: r,\n                className: q\n            });\n            s.props = j(this.props, s.props);\n            return s;\n        }\n    });\n    n.SIZES = l;\n    n.COLORS = k;\n    e.exports = n;\n});\n__d(\"LegacyMentionsInput.react\", [\"PlaceholderListener\",\"Bootloader\",\"Event\",\"Keys\",\"React\",\"cx\",], function(a, b, c, d, e, f) {\n    b(\"PlaceholderListener\");\n    var g = b(\"Bootloader\"), h = b(\"Event\"), i = b(\"Keys\"), j = b(\"React\"), k = b(\"cx\"), l = j.createClass({\n        displayName: \"ReactLegacyMentionsInput\",\n        componentDidMount: function(m) {\n            (this.props.initialData && this._initializeTextarea(m));\n        },\n        hasEnteredText: function() {\n            return !!((this._mentionsInput && this._mentionsInput.getValue().trim()));\n        },\n        _handleKeydown: function(event) {\n            var m = event.nativeEvent, n = this.props.onEnterSubmit, o = ((h.getKeyCode(m) == i.RETURN) && !h.$E(m).getModifiers().any), p = (this._mentionsInput && this._mentionsInput.getTypeahead().getView().getSelection());\n            if (((n && o) && !p)) {\n                if (this.props.isLoadingPhoto) {\n                    return false\n                };\n                var q = event.target, r = (q.value && q.value.trim());\n                if ((r || this.props.acceptEmptyInput)) {\n                    var s = {\n                        visibleValue: r,\n                        encodedValue: r,\n                        attachedPhoto: null\n                    };\n                    if (this._mentionsInput) {\n                        s.encodedValue = this._mentionsInput.getRawValue().trim();\n                        this._mentionsInput.reset();\n                    }\n                ;\n                    n(s, event);\n                }\n            ;\n                event.preventDefault();\n            }\n        ;\n        },\n        _handleFocus: function() {\n            (this.props.onFocus && this.props.onFocus());\n            this._initializeTextarea(this.refs.root.getDOMNode());\n        },\n        _handleBlur: function() {\n            (this.props.onBlur && this.props.onBlur());\n        },\n        _initializeTextarea: function(m) {\n            if ((this._mentionsInput || this._bootloadingMentions)) {\n                return\n            };\n            this._bootloadingMentions = true;\n            g.loadModules([\"CompactTypeaheadRenderer\",\"ContextualTypeaheadView\",\"InputSelection\",\"MentionsInput\",\"TextAreaControl\",\"Typeahead\",\"TypeaheadAreaCore\",\"TypeaheadBestName\",\"TypeaheadHoistFriends\",\"TypeaheadMetrics\",\"TypingDetector\",], function(n, o, p, q, r, s, t, u, v, w, x) {\n                var y = this.refs.textarea.getDOMNode();\n                new r(y);\n                if (this.props.onTypingStateChange) {\n                    var z = new x(y);\n                    z.init();\n                    z.subscribe(\"change\", this.props.onTypingStateChange);\n                }\n            ;\n                var aa = {\n                    autoSelect: true,\n                    renderer: n,\n                    causalElement: y\n                };\n                if (this.props.viewOptionsTypeObjects) {\n                    aa.typeObjects = this.props.viewOptionsTypeObjects;\n                };\n                if (this.props.viewOptionsTypeObjectsOrder) {\n                    aa.typeObjectsOrder = this.props.viewOptionsTypeObjectsOrder;\n                };\n                var ba = new s(this.props.datasource, {\n                    ctor: o,\n                    options: aa\n                }, {\n                    ctor: t\n                }, this.refs.typeahead.getDOMNode()), ca = [u,v,], da = new w({\n                    extraData: {\n                        event_name: \"mentions\"\n                    }\n                });\n                s.initNow(ba, ca, da);\n                this._mentionsInput = new q(m, ba, y, {\n                    hashtags: this.props.sht\n                });\n                this._mentionsInput.init({\n                    max: 6\n                }, this.props.initialData);\n                if (this.props.initialData) {\n                    p.set(y, y.value.length);\n                };\n                if (this.props.onPaste) {\n                    h.listen(y, \"paste\", this.props.onPaste);\n                };\n                this._bootloadingMentions = false;\n            }.bind(this));\n        },\n        focus: function() {\n            try {\n                this.refs.textarea.getDOMNode().focus();\n            } catch (m) {\n            \n            };\n        },\n        render: function() {\n            var m = (((((((\"textInput\") + ((\" \" + \"mentionsTextarea\"))) + ((\" \" + \"uiTextareaAutogrow\"))) + ((\" \" + \"uiTextareaNoResize\"))) + ((\" \" + \"UFIAddCommentInput\"))) + ((\" \" + \"DOMControl_placeholder\"))));\n            return (j.DOM.div({\n                ref: \"root\",\n                className: \"uiMentionsInput textBoxContainer ReactLegacyMentionsInput\"\n            }, j.DOM.div({\n                className: \"highlighter\"\n            }, j.DOM.div(null, j.DOM.span({\n                className: \"highlighterContent hidden_elem\"\n            }))), j.DOM.div({\n                ref: \"typeahead\",\n                className: \"uiTypeahead mentionsTypeahead\"\n            }, j.DOM.div({\n                className: \"wrap\"\n            }, j.DOM.input({\n                type: \"hidden\",\n                autocomplete: \"off\",\n                className: \"hiddenInput\"\n            }), j.DOM.div({\n                className: \"innerWrap\"\n            }, j.DOM.textarea({\n                ref: \"textarea\",\n                name: \"add_comment_text\",\n                className: m,\n                title: this.props.placeholder,\n                placeholder: this.props.placeholder,\n                onFocus: this._handleFocus,\n                onBlur: this._handleBlur,\n                onKeyDown: this._handleKeydown,\n                defaultValue: this.props.placeholder\n            })))), j.DOM.input({\n                type: \"hidden\",\n                autocomplete: \"off\",\n                className: \"mentionsHidden\",\n                defaultValue: \"\"\n            })));\n        }\n    });\n    e.exports = l;\n});\n__d(\"UFIClassNames\", [\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"cx\");\n    e.exports = {\n        ACTOR_IMAGE: \"img UFIActorImage _54ru\",\n        ROW: \"UFIRow\",\n        UNSEEN_ITEM: \"UFIUnseenItem\"\n    };\n});\n__d(\"LeftRight.react\", [\"React\",\"cx\",\"keyMirror\",\"throwIf\",], function(a, b, c, d, e, f) {\n    var g = b(\"React\"), h = b(\"cx\"), i = b(\"keyMirror\"), j = b(\"throwIf\"), k = i({\n        left: true,\n        right: true,\n        both: true\n    });\n    function l(n) {\n        j(((!n.children || (n.children.length < 1)) || (n.children.length > 2)), \"LeftRight component must have one or two children.\");\n    };\n    var m = g.createClass({\n        displayName: \"LeftRight\",\n        render: function() {\n            l(this.props);\n            var n = (this.props.direction || k.both), o = ((n === k.both)), p = g.DOM.div({\n                key: \"left\",\n                className: (((o || (n === k.left)) ? \"lfloat\" : \"\"))\n            }, this.props.children[0]), q = (((this.props.children.length < 2)) ? null : g.DOM.div({\n                key: \"right\",\n                className: (((o || (n === k.right)) ? \"rfloat\" : \"\"))\n            }, this.props.children[1])), r = ((((n === k.right) && q)) ? [q,p,] : [p,q,]);\n            return this.transferPropsTo(g.DOM.div({\n                className: \"clearfix\"\n            }, r));\n        }\n    });\n    m.DIRECTION = k;\n    e.exports = m;\n});\n__d(\"ImageBlock.react\", [\"LeftRight.react\",\"React\",\"cx\",\"joinClasses\",\"throwIf\",], function(a, b, c, d, e, f) {\n    var g = b(\"LeftRight.react\"), h = b(\"React\"), i = b(\"cx\"), j = b(\"joinClasses\"), k = b(\"throwIf\");\n    function l(p) {\n        k(((!p.children || (p.children.length > 3)) || (p.children.length < 1)), \"ImageBlock requires two or three children.\");\n    };\n    function m(p) {\n        return ((((((\"img\") + ((\" \" + \"_8o\"))) + (((p === \"small\") ? (\" \" + \"_8r\") : \"\"))) + (((p === \"medium\") ? (\" \" + \"_8s\") : \"\"))) + (((p === \"large\") ? (\" \" + \"_8t\") : \"\"))));\n    };\n    function n(p, q, r) {\n        p.props.className = j(m(q), p.props.className, r);\n    };\n    var o = h.createClass({\n        displayName: \"ImageBlock\",\n        render: function() {\n            l(this.props);\n            var p = this.props.children[0], q = this.props.children[1], r = this.props.children[2], s = (this.props.spacing || \"small\");\n            n(p, s, this.props.imageClassName);\n            var t = j(this.props.contentClassName, (((\"_42ef\") + (((s === \"small\") ? (\" \" + \"_8u\") : \"\")))));\n            if ((p.tagName == \"IMG\")) {\n                if ((p.props.alt === undefined)) {\n                    p.props.alt = \"\";\n                };\n            }\n             else if (((((((p.tagName == \"A\") || (p.tagName == \"LINK\"))) && (p.props.tabIndex === undefined)) && (p.props.title === undefined)) && (p.props[\"aria-label\"] === undefined))) {\n                p.props.tabIndex = \"-1\";\n                p.props[\"aria-hidden\"] = \"true\";\n            }\n            \n        ;\n            var u;\n            if (!r) {\n                u = h.DOM.div({\n                    className: t\n                }, q);\n            }\n             else u = g({\n                className: t,\n                direction: g.DIRECTION.right\n            }, q, r);\n        ;\n            return this.transferPropsTo(g({\n                direction: g.DIRECTION.left\n            }, p, u));\n        }\n    });\n    e.exports = o;\n});\n__d(\"UFIImageBlock.react\", [\"ImageBlock.react\",\"React\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"ImageBlock.react\"), h = b(\"React\"), i = b(\"cx\"), j = h.createClass({\n        displayName: \"UFIImageBlock\",\n        render: function() {\n            return this.transferPropsTo(g({\n                imageClassName: \"UFIImageBlockImage\",\n                contentClassName: \"UFIImageBlockContent\"\n            }, this.props.children));\n        }\n    });\n    e.exports = j;\n});\n__d(\"UFIAddComment.react\", [\"Bootloader\",\"CLogConfig\",\"ClipboardPhotoUploader\",\"CloseButton.react\",\"Event\",\"Keys\",\"LoadingIndicator.react\",\"React\",\"LegacyMentionsInput.react\",\"TrackingNodes\",\"Run\",\"UFIClassNames\",\"UFIImageBlock.react\",\"cx\",\"joinClasses\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Bootloader\"), h = b(\"CLogConfig\"), i = b(\"ClipboardPhotoUploader\"), j = b(\"CloseButton.react\"), k = b(\"Event\"), l = b(\"Keys\"), m = b(\"LoadingIndicator.react\"), n = b(\"React\"), o = b(\"LegacyMentionsInput.react\"), p = b(\"TrackingNodes\"), q = b(\"Run\"), r = b(\"UFIClassNames\"), s = b(\"UFIImageBlock.react\"), t = b(\"cx\"), u = b(\"joinClasses\"), v = b(\"tx\"), w = \"Write a comment...\", x = \"Write a reply...\", y = \"fcg fss UFICommentTip\", z = 19, aa = \"/ajax/ufi/upload/\", ba = n.createClass({\n        displayName: \"UFIAddComment\",\n        getInitialState: function() {\n            if (this.props.attachedPhoto) {\n                this.props.contextArgs.attachedphoto = this.props.attachedPhoto;\n            };\n            return {\n                attachedPhoto: (this.props.attachedPhoto ? this.props.attachedPhoto : null),\n                isCommenting: false,\n                isLoadingPhoto: false,\n                isOnBeforeUnloadListenerAdded: false\n            };\n        },\n        _onKeyDown: function(event) {\n            if ((this.props.isEditing && (k.getKeyCode(event.nativeEvent) === l.ESC))) {\n                this.props.onCancel();\n            };\n            if ((this.isMounted() && !this.state.isOnBeforeUnloadListenerAdded)) {\n                q.onBeforeUnload(this._handleUnsavedChanges);\n                this.setState({\n                    isOnBeforeUnloadListenerAdded: true\n                });\n            }\n        ;\n        },\n        _handleUnsavedChanges: function() {\n            var ca = a.PageTransitions;\n            if (ca) {\n                var da = ca.getNextURI(), ea = ca.getMostRecentURI();\n                if ((da.getQueryData().hasOwnProperty(\"theater\") || ea.getQueryData().hasOwnProperty(\"theater\"))) {\n                    return\n                };\n            }\n        ;\n            if (((this.refs && this.refs.mentionsinput) && this.refs.mentionsinput.hasEnteredText())) {\n                return \"You haven't finished your comment yet. Do you want to leave without finishing?\"\n            };\n        },\n        _blur: function() {\n            if ((this.refs.mentionsinput && this.refs.mentionsinput.hasEnteredText())) {\n                return\n            };\n            this.setState({\n                isCommenting: false\n            });\n        },\n        _onPaste: function(event) {\n            var ca = new i(aa, this._getPhotoUploadData());\n            this._cancelCurrentSubscriptions();\n            this._subscriptions = [ca.subscribe(\"upload_start\", this._prepareForAttachedPhotoPreview),ca.subscribe(\"upload_error\", this._onRemoveAttachedPhotoPreviewClicked),ca.subscribe(\"upload_success\", function(da, ea) {\n                this._onPhotoUploadComplete(ea);\n            }.bind(this)),];\n            ca.handlePaste(event);\n        },\n        _cancelCurrentSubscriptions: function() {\n            if (this._subscriptions) {\n                this._subscriptions.forEach(function(ca) {\n                    ca.unsubscribe();\n                });\n            };\n        },\n        componentWillUnmount: function() {\n            this._cancelCurrentSubscriptions();\n        },\n        focus: function() {\n            if ((this.refs && this.refs.mentionsinput)) {\n                this.refs.mentionsinput.focus();\n            };\n        },\n        render: function() {\n            var ca = (!this.props.contextArgs.collapseaddcomment || this.state.isCommenting), da = null;\n            if (this.props.isEditing) {\n                da = n.DOM.span({\n                    className: y\n                }, \"Press Esc to cancel.\");\n            }\n             else if (this.props.showSendOnEnterTip) {\n                da = n.DOM.span({\n                    className: y\n                }, \"Press Enter to post.\");\n            }\n             else if (this.props.subtitle) {\n                da = n.DOM.span({\n                    className: y\n                }, this.props.subtitle);\n            }\n            \n        ;\n            var ea = null, fa = this.state.attachedPhoto, ga = null;\n            if (this.props.allowPhotoAttachments) {\n                ga = this._onPaste;\n                var ha = n.DOM.input({\n                    ref: \"PhotoInput\",\n                    accept: \"image/*\",\n                    className: \"_n\",\n                    name: \"file[]\",\n                    type: \"file\",\n                    multiple: false\n                }), ia = (fa ? \"UFICommentPhotoAttachedIcon\" : \"UFICommentPhotoIcon\"), ja = \"UFIPhotoAttachLinkWrapper _m\";\n                ea = n.DOM.div({\n                    ref: \"PhotoInputContainer\",\n                    className: ja,\n                    \"data-hover\": \"tooltip\",\n                    \"data-tooltip-alignh\": \"center\",\n                    \"aria-label\": \"Attach a Photo\"\n                }, n.DOM.i({\n                    ref: \"PhotoInputControl\",\n                    className: ia\n                }), ha);\n            }\n        ;\n            var ka = p.getTrackingInfo(p.types.ADD_COMMENT_BOX), la = u(r.ACTOR_IMAGE, ((!ca ? \"hidden_elem\" : \"\"))), ma = n.DOM.div({\n                className: \"UFIReplyActorPhotoWrapper\"\n            }, n.DOM.img({\n                className: la,\n                src: this.props.viewerActor.thumbSrc\n            })), na = u(r.ROW, ((((((((this.props.hide ? \"noDisplay\" : \"\")) + ((\" \" + \"UFIAddComment\"))) + ((this.props.allowPhotoAttachments ? (\" \" + \"UFIAddCommentWithPhotoAttacher\") : \"\"))) + ((this.props.withoutSeparator ? (\" \" + \"UFIAddCommentWithoutSeparator\") : \"\"))) + ((this.props.isFirstComponent ? (\" \" + \"UFIFirstComponent\") : \"\"))) + ((this.props.isLastComponent ? (\" \" + \"UFILastComponent\") : \"\"))))), oa = (!!this.props.replyCommentID ? x : w), pa = (this.props.contextArgs.entstream ? this._blur : null), qa = this.props.contextArgs.viewoptionstypeobjects, ra = this.props.contextArgs.viewoptionstypeobjectsorder, sa = null, ta = this.props.onCommentSubmit;\n            if (fa) {\n                sa = n.DOM.div({\n                    isStatic: true,\n                    dangerouslySetInnerHTML: (this.state.attachedPhoto.markupPreview ? this.state.attachedPhoto.markupPreview : this.state.attachedPhoto.markup)\n                });\n                da = null;\n            }\n             else if (this.state.isLoadingPhoto) {\n                sa = m({\n                    color: \"white\",\n                    className: \"UFICommentPhotoAttachedPreviewLoadingIndicator\",\n                    size: \"medium\"\n                });\n            }\n        ;\n            var ua;\n            if ((sa != null)) {\n                ua = n.DOM.div({\n                    className: \"UFICommentPhotoAttachedPreview pas\"\n                }, sa, j({\n                    onClick: this._onRemoveAttachedPhotoPreviewClicked\n                }));\n                ta = function(va, event) {\n                    this.setState({\n                        isLoadingPhoto: false,\n                        attachedPhoto: null\n                    });\n                    va.attachedPhoto = this.props.contextArgs.attachedphoto;\n                    this.props.onCommentSubmit(va, event);\n                }.bind(this);\n            }\n        ;\n            return (n.DOM.li({\n                className: na,\n                onKeyDown: this._onKeyDown,\n                \"data-ft\": ka\n            }, s({\n                className: \"UFIMentionsInputWrap\"\n            }, ma, n.DOM.div(null, o({\n                initialData: this.props.initialData,\n                placeholder: oa,\n                ref: \"mentionsinput\",\n                datasource: this.props.mentionsDataSource,\n                acceptEmptyInput: (this.props.isEditing || this.props.contextArgs.attachedphoto),\n                onEnterSubmit: ta,\n                onFocus: this.setState.bind(this, {\n                    isCommenting: true\n                }),\n                viewOptionsTypeObjects: qa,\n                viewOptionsTypeObjectsOrder: ra,\n                onBlur: pa,\n                onTypingStateChange: this.props.onTypingStateChange,\n                onPaste: ga,\n                sht: this.props.contextArgs.sht,\n                isLoadingPhoto: this.state.isLoadingPhoto\n            }), ea, ua, da))));\n        },\n        componentDidMount: function(ca) {\n            if (h.gkResults) {\n                var da = this.props.replyCommentID;\n                if ((this.refs && this.refs.mentionsinput)) {\n                    var ea = this.refs.mentionsinput.refs.textarea.getDOMNode();\n                    g.loadModules([\"CLoggerX\",\"UFIComments\",], function(ja, ka) {\n                        var la = ka.getComment(da), ma = (la ? la.fbid : null);\n                        ja.trackMentionsInput(ea, ma);\n                    });\n                }\n            ;\n            }\n        ;\n            if (!this.props.allowPhotoAttachments) {\n                return\n            };\n            var fa = this.refs.PhotoInputContainer.getDOMNode(), ga = this.refs.PhotoInputControl.getDOMNode(), ha = this.refs.PhotoInput.getDOMNode(), ia = k.listen(fa, \"click\", function(event) {\n                g.loadModules([\"FileInput\",\"FileInputUploader\",\"Input\",], function(ja, ka, la) {\n                    var ma = new ja(fa, ga, ha), na = new ka().setURI(aa).setData(this._getPhotoUploadData());\n                    ma.subscribe(\"change\", function(event) {\n                        if (ma.getValue()) {\n                            this._prepareForAttachedPhotoPreview();\n                            na.setInput(ma.getInput()).send();\n                        }\n                    ;\n                    }.bind(this));\n                    na.subscribe(\"success\", function(oa, pa) {\n                        ma.clear();\n                        this._onPhotoUploadComplete(pa.response);\n                    }.bind(this));\n                }.bind(this));\n                ia.remove();\n            }.bind(this));\n        },\n        _getPhotoUploadData: function() {\n            return {\n                profile_id: this.props.viewerActor.id,\n                source: z\n            };\n        },\n        _onPhotoUploadComplete: function(ca) {\n            if (!this.state.isLoadingPhoto) {\n                return\n            };\n            var da = ca.getPayload();\n            if ((da && da.fbid)) {\n                this.props.contextArgs.attachedphoto = da;\n                this.setState({\n                    attachedPhoto: da,\n                    isLoadingPhoto: false\n                });\n            }\n        ;\n        },\n        _onRemoveAttachedPhotoPreviewClicked: function(event) {\n            this.props.contextArgs.attachedphoto = null;\n            this.setState({\n                attachedPhoto: null,\n                isLoadingPhoto: false\n            });\n        },\n        _prepareForAttachedPhotoPreview: function() {\n            this.props.contextArgs.attachedphoto = null;\n            this.setState({\n                attachedPhoto: null,\n                isLoadingPhoto: true\n            });\n        }\n    });\n    e.exports = ba;\n});\n__d(\"UFIAddCommentController\", [\"Arbiter\",\"copyProperties\",\"MentionsInputUtils\",\"Parent\",\"UFIAddComment.react\",\"React\",\"ShortProfiles\",\"UFICentralUpdates\",\"UFIComments\",\"UFIFeedbackTargets\",\"UFIInstanceState\",\"UFIUserActions\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"copyProperties\"), i = b(\"MentionsInputUtils\"), j = b(\"Parent\"), k = b(\"UFIAddComment.react\"), l = b(\"React\"), m = b(\"ShortProfiles\"), n = b(\"UFICentralUpdates\"), o = b(\"UFIComments\"), p = b(\"UFIFeedbackTargets\"), q = b(\"UFIInstanceState\"), r = b(\"UFIUserActions\");\n    function s(t, u, v, w) {\n        this.id = u;\n        this._ufiInstanceID = w.instanceid;\n        this._contextArgs = w;\n        this._replyCommentID = v;\n        if (t) {\n            this.root = t;\n            if (!this._contextArgs.rootid) {\n                this._contextArgs.rootid = t.id;\n            };\n            this.render();\n            n.subscribe(\"instance-updated\", function(x, y) {\n                var z = y.updates;\n                if ((this._ufiInstanceID in z)) {\n                    this.render();\n                };\n            }.bind(this));\n        }\n    ;\n        n.subscribe(\"feedback-id-changed\", function(x, y) {\n            var z = y.updates;\n            if ((this.id in z)) {\n                this.id = z[this.id];\n            };\n        }.bind(this));\n    };\n    h(s.prototype, {\n        _onCommentSubmit: function(t, event) {\n            r.addComment(this.id, t.visibleValue, t.encodedValue, {\n                source: this._contextArgs.source,\n                ufiinstanceid: this._ufiInstanceID,\n                target: event.target,\n                replyid: this._replyCommentID,\n                timelinelogdata: this._contextArgs.timelinelogdata,\n                rootid: this._contextArgs.rootid,\n                attachedphoto: this._contextArgs.attachedphoto,\n                giftoccasion: this._contextArgs.giftoccasion\n            });\n            this._contextArgs.attachedphoto = null;\n            p.getFeedbackTarget(this.id, function(u) {\n                var v = j.byTag(this.root, \"form\");\n                if (v) {\n                    g.inform(\"ufi/comment\", {\n                        form: v,\n                        isranked: u.isranked\n                    });\n                };\n            }.bind(this));\n            return false;\n        },\n        _onTypingStateChange: function(t, u) {\n        \n        },\n        renderAddComment: function(t, u, v, w, x, y, z) {\n            var aa = (this._contextArgs.logtyping ? this._onTypingStateChange.bind(this) : null), ba = null, ca = (q.getKeyForInstance(this._ufiInstanceID, \"isediting\") && !this._replyCommentID);\n            return (k({\n                hide: ca,\n                replyCommentID: this._replyCommentID,\n                viewerActor: t,\n                initialData: ba,\n                ref: w,\n                withoutSeparator: x,\n                onCommentSubmit: this._onCommentSubmit.bind(this),\n                mentionsDataSource: u,\n                onTypingStateChange: aa,\n                showSendOnEnterTip: v,\n                allowPhotoAttachments: y,\n                source: this._contextArgs.source,\n                contextArgs: this._contextArgs,\n                subtitle: z\n            }));\n        },\n        renderEditComment: function(t, u, v, w, x, y) {\n            var z = o.getComment(u), aa = i.generateDataFromTextWithEntities(z.body);\n            return (k({\n                viewerActor: t,\n                initialData: aa,\n                onCommentSubmit: w,\n                onCancel: x,\n                mentionsDataSource: v,\n                source: this._contextArgs.source,\n                contextArgs: this._contextArgs,\n                isEditing: true,\n                editingCommentID: u,\n                attachedPhoto: z.photo_comment,\n                allowPhotoAttachments: y\n            }));\n        },\n        render: function() {\n            if (!this.root) {\n                throw new Error(\"render called on UFIAddCommentController with no root\")\n            };\n            p.getFeedbackTarget(this.id, function(t) {\n                if ((t.cancomment && t.actorforpost)) {\n                    m.get(t.actorforpost, function(u) {\n                        var v = this.renderAddComment(u, t.mentionsdatasource, t.showsendonentertip, null, null, t.allowphotoattachments, t.subtitle);\n                        this._addComment = l.renderComponent(v, this.root);\n                    }.bind(this));\n                };\n            }.bind(this));\n        }\n    });\n    e.exports = s;\n});\n__d(\"Scrollable\", [\"Event\",\"Parent\",\"UserAgent\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"Parent\"), i = b(\"UserAgent\"), j = function(event) {\n        var m = h.byClass(event.getTarget(), \"scrollable\");\n        if (!m) {\n            return\n        };\n        if ((((((typeof event.axis !== \"undefined\") && (event.axis === event.HORIZONTAL_AXIS))) || ((event.wheelDeltaX && !event.wheelDeltaY))) || ((event.deltaX && !event.deltaY)))) {\n            return\n        };\n        var n = ((event.wheelDelta || -event.deltaY) || -event.detail), o = m.scrollHeight, p = m.clientHeight;\n        if ((o > p)) {\n            var q = m.scrollTop;\n            if (((((n > 0) && (q === 0))) || (((n < 0) && (q >= (o - p)))))) {\n                event.prevent();\n            }\n             else if ((i.ie() < 9)) {\n                if (m.currentStyle) {\n                    var r = m.currentStyle.fontSize;\n                    if ((r.indexOf(\"px\") < 0)) {\n                        var s = document.createElement(\"div\");\n                        s.style.fontSize = r;\n                        s.style.height = \"1em\";\n                        r = s.style.pixelHeight;\n                    }\n                     else r = parseInt(r, 10);\n                ;\n                    m.scrollTop = (q - Math.round(((n / 120) * r)));\n                    event.prevent();\n                }\n            \n            }\n        ;\n        }\n    ;\n    }, k = document.documentElement;\n    if (i.firefox()) {\n        var l = (((\"WheelEvent\" in window)) ? \"wheel\" : \"DOMMouseScroll\");\n        k.addEventListener(l, j, false);\n    }\n     else g.listen(k, \"mousewheel\", j);\n;\n});\n__d(\"LegacyScrollableArea.react\", [\"Scrollable\",\"Bootloader\",\"React\",\"Style\",\"cx\",], function(a, b, c, d, e, f) {\n    b(\"Scrollable\");\n    var g = b(\"Bootloader\"), h = b(\"React\"), i = b(\"Style\"), j = b(\"cx\"), k = \"uiScrollableArea native\", l = \"uiScrollableAreaWrap scrollable\", m = \"uiScrollableAreaBody\", n = \"uiScrollableAreaContent\", o = h.createClass({\n        displayName: \"ReactLegacyScrollableArea\",\n        render: function() {\n            var p = {\n                height: (this.props.height ? (this.props.height + \"px\") : \"auto\")\n            };\n            return (h.DOM.div({\n                className: k,\n                ref: \"root\",\n                style: p\n            }, h.DOM.div({\n                className: l\n            }, h.DOM.div({\n                className: m,\n                ref: \"body\"\n            }, h.DOM.div({\n                className: n\n            }, this.props.children)))));\n        },\n        getArea: function() {\n            return this._area;\n        },\n        componentDidMount: function() {\n            g.loadModules([\"ScrollableArea\",], this._loadScrollableArea);\n        },\n        _loadScrollableArea: function(p) {\n            this._area = p.fromNative(this.refs.root.getDOMNode(), {\n                fade: this.props.fade,\n                persistent: this.props.persistent\n            });\n            var q = this.refs.body.getDOMNode();\n            i.set(q, \"width\", (this.props.width + \"px\"));\n            (this.props.onScroll && this._area.subscribe(\"scroll\", this.props.onScroll));\n        }\n    });\n    e.exports = o;\n});\n__d(\"UFIAddCommentLink.react\", [\"React\",\"UFIClassNames\",\"cx\",\"joinClasses\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"React\"), h = b(\"UFIClassNames\"), i = b(\"cx\"), j = b(\"joinClasses\"), k = b(\"tx\"), l = g.createClass({\n        displayName: \"UFIAddCommentLink\",\n        render: function() {\n            var m = j(h.ROW, ((((((\"UFIAddCommentLink\") + ((this.props.isFirstCommentComponent ? (\" \" + \"UFIFirstCommentComponent\") : \"\"))) + ((this.props.isLastCommentComponent ? (\" \" + \"UFILastCommentComponent\") : \"\"))) + ((this.props.isFirstComponent ? (\" \" + \"UFIFirstComponent\") : \"\"))) + ((this.props.isLastComponent ? (\" \" + \"UFILastComponent\") : \"\"))))), n = \"Write a comment...\";\n            return (g.DOM.li({\n                className: m,\n                \"data-ft\": this.props[\"data-ft\"]\n            }, g.DOM.a({\n                className: \"UFICommentLink\",\n                onClick: this.props.onClick,\n                href: \"#\",\n                role: \"button\"\n            }, n)));\n        }\n    });\n    e.exports = l;\n});\n__d(\"HovercardLink\", [\"Bootloader\",\"URI\",], function(a, b, c, d, e, f) {\n    var g = b(\"Bootloader\"), h = b(\"URI\"), i = {\n        getBaseURI: function() {\n            return h(\"/ajax/hovercard/hovercard.php\");\n        },\n        constructEndpoint: function(j, k) {\n            return i.constructEndpointWithGroupAndLocation(j, k, null);\n        },\n        constructEndpointWithLocation: function(j, k) {\n            return i.constructEndpointWithGroupAndLocation(j, null, k);\n        },\n        constructEndpointWithGroupAndLocation: function(j, k, l) {\n            g.loadModules([\"Hovercard\",], function() {\n            \n            });\n            var m = new h(i.getBaseURI()).setQueryData({\n                id: j.id\n            }), n = {\n            };\n            if ((j.weakreference && k)) {\n                n.group_id = k;\n            };\n            if (l) {\n                n.hc_location = l;\n            };\n            m.addQueryData({\n                extragetparams: JSON.stringify(n)\n            });\n            return m;\n        }\n    };\n    e.exports = i;\n});\n__d(\"UntrustedLink\", [\"DOM\",\"Event\",\"URI\",\"UserAgent\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOM\"), h = b(\"Event\"), i = b(\"URI\"), j = b(\"UserAgent\"), k = b(\"copyProperties\");\n    function l(m, n, o, p) {\n        this.dom = m;\n        this.url = m.href;\n        this.hash = n;\n        this.func_get_params = (p || function() {\n            return {\n            };\n        });\n        h.listen(this.dom, \"click\", this.onclick.bind(this));\n        h.listen(this.dom, \"mousedown\", this.onmousedown.bind(this));\n        h.listen(this.dom, \"mouseup\", this.onmouseup.bind(this));\n        h.listen(this.dom, \"mouseout\", this.onmouseout.bind(this));\n        this.onmousedown(h.$E(o));\n    };\n    l.bootstrap = function(m, n, o, p) {\n        if (m.__untrusted) {\n            return\n        };\n        m.__untrusted = true;\n        new l(m, n, o, p);\n    };\n    l.prototype.getRewrittenURI = function() {\n        var m = k({\n            u: this.url,\n            h: this.hash\n        }, this.func_get_params(this.dom)), n = new i(\"/l.php\");\n        return n.setQueryData(m).setSubdomain(\"www\").setProtocol(\"http\");\n    };\n    l.prototype.onclick = function() {\n        (function() {\n            this.setHref(this.url);\n        }).bind(this).defer(100);\n        this.setHref(this.getRewrittenURI());\n    };\n    l.prototype.onmousedown = function(m) {\n        if ((m.button == 2)) {\n            this.setHref(this.getRewrittenURI());\n        };\n    };\n    l.prototype.onmouseup = function() {\n        this.setHref(this.getRewrittenURI());\n    };\n    l.prototype.onmouseout = function() {\n        this.setHref(this.url);\n    };\n    l.prototype.setHref = function(m) {\n        if ((j.ie() < 9)) {\n            var n = g.create(\"span\");\n            g.appendContent(this.dom, n);\n            this.dom.href = m;\n            g.remove(n);\n        }\n         else this.dom.href = m;\n    ;\n    };\n    e.exports = l;\n});\n__d(\"Link.react\", [\"React\",\"UntrustedLink\",\"mergeInto\",], function(a, b, c, d, e, f) {\n    var g = b(\"React\"), h = b(\"UntrustedLink\"), i = b(\"mergeInto\"), j = g.createClass({\n        displayName: \"Link\",\n        _installLinkshimOnMouseDown: function(event) {\n            var k = this.props.href;\n            if (k.shimhash) {\n                h.bootstrap(this.getDOMNode(), k.shimhash);\n            };\n            (this.props.onMouseDown && this.props.onMouseDown(event));\n        },\n        render: function() {\n            var k = this.props.href, l = g.DOM.a(null);\n            i(l.props, this.props);\n            if (k) {\n                l.props.href = k.url;\n                var m = !!k.shimhash;\n                if (m) {\n                    l.props.rel = (l.props.rel ? ((l.props.rel + \" nofollow\")) : \"nofollow\");\n                    l.props.onMouseDown = this._installLinkshimOnMouseDown;\n                }\n            ;\n            }\n             else l.props.href = \"#\";\n        ;\n            return l;\n        }\n    });\n    e.exports = j;\n});\n__d(\"PubContentTypes\", [], function(a, b, c, d, e, f) {\n    var g = {\n        HASHTAG: \"hashtag\",\n        TOPIC: \"topic\",\n        URL: \"url\"\n    };\n    e.exports = g;\n});\n__d(\"HovercardLinkInterpolator\", [\"Bootloader\",\"CSS\",\"Event\",\"HovercardLink\",\"Link.react\",\"Parent\",\"PubContentTypes\",\"React\",\"URI\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Bootloader\"), h = b(\"CSS\"), i = b(\"Event\"), j = b(\"HovercardLink\"), k = b(\"Link.react\"), l = b(\"Parent\"), m = b(\"PubContentTypes\"), n = b(\"React\"), o = b(\"URI\"), p = b(\"cx\");\n    function q(r, s, t, u, v) {\n        var w = s.entities[0], x = (t || ((w.external ? \"_blank\" : null))), y, z = ((((!w.external ? \"profileLink\" : \"\")) + ((w.weakreference ? (\" \" + \"weakReference\") : \"\"))));\n        if (w.hashtag) {\n            var aa = h.hasClass(document.body, \"_6nw\"), ba = function(ea) {\n                if (i.$E(ea.nativeEvent).isDefaultRequested()) {\n                    return\n                };\n                ea.preventDefault();\n                var fa = l.byTag(ea.target, \"A\");\n                if (aa) {\n                    g.loadModules([\"EntstreamPubContentOverlay\",], function(ga) {\n                        ga.pubClick(fa);\n                    });\n                }\n                 else g.loadModules([\"HashtagLayerPageController\",], function(ga) {\n                    ga.click(fa);\n                });\n            ;\n            }, ca = null;\n            if (aa) {\n                ca = {\n                    type: m.HASHTAG,\n                    id: w.id,\n                    source: \"comment\"\n                };\n            }\n             else ca = {\n                id: w.id\n            };\n        ;\n            var da = new o(w.url).setSubdomain(\"www\");\n            y = n.DOM.a({\n                className: \"_58cn\",\n                \"data-pub\": JSON.stringify(ca),\n                href: da.toString(),\n                onClick: ba\n            }, n.DOM.span({\n                className: \"_58cl\"\n            }, r.substring(0, 1)), n.DOM.span({\n                className: \"_58cm\"\n            }, r.substring(1)));\n        }\n         else if (w.weakreference) {\n            y = k({\n                className: z,\n                href: w,\n                target: x\n            }, n.DOM.i({\n                className: \"UFIWeakReferenceIcon\"\n            }), r);\n        }\n         else y = k({\n            className: z,\n            href: w,\n            target: x\n        }, r);\n        \n    ;\n        if ((!w.external && !w.hashtag)) {\n            y.props[\"data-hovercard\"] = j.constructEndpointWithGroupAndLocation(w, u, v).toString();\n        };\n        return y;\n    };\n    e.exports = q;\n});\n__d(\"LinkButton\", [\"cx\",\"React\",], function(a, b, c, d, e, f) {\n    var g = b(\"cx\"), h = b(\"React\"), i = function(j) {\n        var k = ((j.name && j.value) ? (((j.name + \"[\") + encodeURIComponent(j.value)) + \"]\") : null);\n        return (h.DOM.label({\n            className: ((((\"uiLinkButton\") + ((j.subtle ? (\" \" + \"uiLinkButtonSubtle\") : \"\"))) + ((j.showSaving ? (\" \" + \"async_throbber\") : \"\"))))\n        }, h.DOM.input({\n            type: (j.inputType || \"button\"),\n            name: k,\n            value: j.label,\n            className: ((j.showSaving ? \"stat_elem\" : \"\"))\n        })));\n    };\n    e.exports = i;\n});\n__d(\"Timestamp.react\", [\"LiveTimer\",\"React\",], function(a, b, c, d, e, f) {\n    var g = b(\"LiveTimer\"), h = b(\"React\"), i = h.createClass({\n        displayName: \"Timestamp\",\n        render: function() {\n            var j = g.renderRelativeTimeToServer(this.props.time);\n            return this.transferPropsTo(h.DOM.abbr({\n                className: \"livetimestamp\",\n                title: this.props.verbose,\n                \"data-utime\": this.props.time\n            }, (j.text || this.props.text)));\n        }\n    });\n    e.exports = i;\n});\n__d(\"EmoteTypes\", [], function(a, b, c, d, e, f) {\n    f.TEXT = \"text\";\n    f.EMOTE = \"emote\";\n    f.EMOTE_FBID = \"emote_fbid\";\n});\n__d(\"EmoticonsList\", [], function(a, b, c, d, e, f) {\n    e.exports = {\n        emotes: {\n            \":)\": \"smile\",\n            \":-)\": \"smile\",\n            \":]\": \"smile\",\n            \"=)\": \"smile\",\n            \":(\": \"frown\",\n            \":-(\": \"frown\",\n            \":[\": \"frown\",\n            \"=(\": \"frown\",\n            \":P\": \"tongue\",\n            \":-P\": \"tongue\",\n            \":-p\": \"tongue\",\n            \":p\": \"tongue\",\n            \"=P\": \"tongue\",\n            \"=D\": \"grin\",\n            \":-D\": \"grin\",\n            \":D\": \"grin\",\n            \":o\": \"gasp\",\n            \":-O\": \"gasp\",\n            \":O\": \"gasp\",\n            \":-o\": \"gasp\",\n            \";)\": \"wink\",\n            \";-)\": \"wink\",\n            \"8)\": \"glasses\",\n            \"8-)\": \"glasses\",\n            \"B)\": \"glasses\",\n            \"B-)\": \"glasses\",\n            \"B|\": \"sunglasses\",\n            \"8-|\": \"sunglasses\",\n            \"8|\": \"sunglasses\",\n            \"B-|\": \"sunglasses\",\n            \"\\u003E:(\": \"grumpy\",\n            \"\\u003E:-(\": \"grumpy\",\n            \":/\": \"unsure\",\n            \":-/\": \"unsure\",\n            \":\\\\\": \"unsure\",\n            \":-\\\\\": \"unsure\",\n            \"=/\": \"unsure\",\n            \"=\\\\\": \"unsure\",\n            \":'(\": \"cry\",\n            \"3:)\": \"devil\",\n            \"3:-)\": \"devil\",\n            \"O:)\": \"angel\",\n            \"O:-)\": \"angel\",\n            \":*\": \"kiss\",\n            \":-*\": \"kiss\",\n            \"\\u003C3\": \"heart\",\n            \"&lt;3\": \"heart\",\n            \"\\u2665\": \"heart\",\n            \"^_^\": \"kiki\",\n            \"-_-\": \"squint\",\n            \"o.O\": \"confused\",\n            \"O.o\": \"confused_rev\",\n            \"\\u003E:o\": \"upset\",\n            \"\\u003E:O\": \"upset\",\n            \"\\u003E:-O\": \"upset\",\n            \"\\u003E:-o\": \"upset\",\n            \"\\u003E_\\u003C\": \"upset\",\n            \"\\u003E.\\u003C\": \"upset\",\n            \":v\": \"pacman\",\n            \":|]\": \"robot\",\n            \":3\": \"colonthree\",\n            \"\\u003C(\\\")\": \"penguin\",\n            \":putnam:\": \"putnam\",\n            \"(^^^)\": \"shark\",\n            \"(y)\": \"like\",\n            \":like:\": \"like\",\n            \"(Y)\": \"like\",\n            \":poop:\": \"poop\"\n        },\n        symbols: {\n            smile: \":)\",\n            frown: \":(\",\n            tongue: \":P\",\n            grin: \"=D\",\n            gasp: \":o\",\n            wink: \";)\",\n            glasses: \"8)\",\n            sunglasses: \"B|\",\n            grumpy: \"\\u003E:(\",\n            unsure: \":/\",\n            cry: \":'(\",\n            devil: \"3:)\",\n            angel: \"O:)\",\n            kiss: \":*\",\n            heart: \"\\u003C3\",\n            kiki: \"^_^\",\n            squint: \"-_-\",\n            confused: \"o.O\",\n            confused_rev: \"O.o\",\n            upset: \"\\u003E:o\",\n            pacman: \":v\",\n            robot: \":|]\",\n            colonthree: \":3\",\n            penguin: \"\\u003C(\\\")\",\n            putnam: \":putnam:\",\n            shark: \"(^^^)\",\n            like: \"(y)\",\n            poop: \":poop:\"\n        },\n        regexp: /(^|[\\s'\".])(:\\)|:\\-\\)|:\\]|=\\)|:\\(|:\\-\\(|:\\[|=\\(|:P|:\\-P|:\\-p|:p|=P|=D|:\\-D|:D|:o|:\\-O|:O|:\\-o|;\\)|;\\-\\)|8\\)|8\\-\\)|B\\)|B\\-\\)|B\\||8\\-\\||8\\||B\\-\\||>:\\(|>:\\-\\(|:\\/|:\\-\\/|:\\\\|:\\-\\\\|=\\/|=\\\\|:'\\(|3:\\)|3:\\-\\)|O:\\)|O:\\-\\)|:\\*|:\\-\\*|<3|&lt;3|\\u2665|\\^_\\^|\\-_\\-|o\\.O|O\\.o|>:o|>:O|>:\\-O|>:\\-o|>_<|>\\.<|:v|:\\|\\]|:3|<\\(\"\\)|:putnam:|\\(\\^\\^\\^\\)|\\(y\\)|:like:|\\(Y\\)|:poop:)([\\s'\".,!?]|<br>|$)/\n    };\n});\n__d(\"createEmoteTokenizer\", [\"EmoteTypes\",], function(a, b, c, d, e, f) {\n    var g = b(\"EmoteTypes\"), h = 40;\n    function i(j) {\n        return function(k) {\n            var l = k, m = [], n = h;\n            while (n--) {\n                var o = j.regexp.exec(l);\n                if ((!o || !o.length)) {\n                    break;\n                };\n                var p = o[2], q = (o.index + o[1].length), r = l.substring(0, q);\n                if (r) {\n                    m.push({\n                        type: g.TEXT,\n                        text: r\n                    });\n                };\n                var s = j.emotes[p];\n                if (s) {\n                    m.push({\n                        type: g.EMOTE,\n                        text: p,\n                        emote: s\n                    });\n                }\n                 else m.push({\n                    type: g.TEXT,\n                    text: p\n                });\n            ;\n                l = l.substring((q + p.length));\n            };\n            if (l) {\n                m.push({\n                    type: g.TEXT,\n                    text: l\n                });\n            };\n            return m;\n        };\n    };\n    e.exports = i;\n});\n__d(\"emoteFBIDTokenizer\", [\"EmoteTypes\",], function(a, b, c, d, e, f) {\n    var g = b(\"EmoteTypes\"), h = /\\[\\[([a-z\\d\\.]+)\\]\\]/gi;\n    function i(j) {\n        return j.split(h).map(function(k, l) {\n            if (((l % 2) === 0)) {\n                return {\n                    type: g.TEXT,\n                    text: k\n                };\n            }\n             else return {\n                type: g.EMOTE_FBID,\n                text: ((\"[[\" + k) + \"]]\"),\n                value: k\n            }\n        ;\n        });\n    };\n    e.exports = i;\n});\n__d(\"Emote\", [\"DOM\",\"EmoteTypes\",\"EmoticonsList\",\"createEmoteTokenizer\",\"emoteFBIDTokenizer\",\"flattenArray\",\"htmlize\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOM\"), h = b(\"EmoteTypes\"), i = b(\"EmoticonsList\"), j = b(\"createEmoteTokenizer\"), k = b(\"emoteFBIDTokenizer\"), l = b(\"flattenArray\"), m = b(\"htmlize\"), n = j(i), o = e.exports = {\n    };\n    o.htmlEmoteWithoutFBID = function(p, q) {\n        if ((typeof q != \"function\")) {\n            q = m;\n        };\n        return l(n(p).map(function(r) {\n            if ((r.type === h.TEXT)) {\n                return q(r.text);\n            }\n             else if ((r.type === h.EMOTE)) {\n                return [\"\\u003Cspan class=\\\"emoticon_text\\\" aria-hidden=\\\"true\\\"\\u003E\",r.text,\"\\u003C/span\\u003E\",g.create(\"span\", {\n                }, g.create(\"span\", {\n                    title: r.text,\n                    className: (\"emoticon emoticon_\" + r.emote)\n                })).innerHTML,]\n            }\n        ;\n        })).join(\"\");\n    };\n    o.htmlEmote = function(p, q) {\n        if ((typeof q != \"function\")) {\n            q = m;\n        };\n        return l(k(p).map(function(r) {\n            if ((r.type === h.TEXT)) {\n                return o.htmlEmoteWithoutFBID(r.text, q);\n            }\n             else if ((r.type === h.EMOTE_FBID)) {\n                return [\"\\u003Cspan class=\\\"emoticon_text\\\" aria-hidden=\\\"true\\\"\\u003E\",r.text,\"\\u003C/span\\u003E\",g.create(\"span\", {\n                }, g.create(\"img\", {\n                    alt: r.text,\n                    className: \"emoticon emoticon_custom\",\n                    src: (((window.location.protocol + \"//graph.facebook.com/\") + encodeURIComponent(r.value)) + \"/picture\")\n                })).innerHTML,]\n            }\n        ;\n        })).join(\"\");\n    };\n});\n__d(\"SupportedEmoji\", [\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"cx\");\n    e.exports = {\n        utf16Regex: /[\\u203C\\u2049\\u2100-\\u21FF\\u2300-\\u27FF\\u2900-\\u29FF\\u2B00-\\u2BFF\\u3000-\\u30FF\\u3200-\\u32FF]|\\uD83C[\\uDC00-\\uDFFF]|\\uD83D[\\uDC00-\\uDEFF]/,\n        emoji: {\n            127744: \"_2b_\",\n            127746: \"_2c0\",\n            127754: \"_2c1\",\n            127769: \"_2c2\",\n            127775: \"_2c3\",\n            127793: \"_2c4\",\n            127796: \"_2c5\",\n            127797: \"_2c6\",\n            127799: \"_2c7\",\n            127800: \"_2c8\",\n            127801: \"_2c9\",\n            127802: \"_2ca\",\n            127803: \"_2cb\",\n            127806: \"_2cc\",\n            127808: \"_2cd\",\n            127809: \"_2ce\",\n            127810: \"_2cf\",\n            127811: \"_2cg\",\n            127818: \"_2ch\",\n            127822: \"_2ci\",\n            127827: \"_2cj\",\n            127828: \"_2ck\",\n            127864: \"_2cl\",\n            127866: \"_2cm\",\n            127873: \"_2cn\",\n            127875: \"_2co\",\n            127876: \"_2cp\",\n            127877: \"_2cq\",\n            127880: \"_2cr\",\n            127881: \"_2cs\",\n            127885: \"_2ct\",\n            127886: \"_2cu\",\n            127887: \"_2cv\",\n            127888: \"_2cw\",\n            127891: \"_2cx\",\n            127925: \"_2cy\",\n            127926: \"_2cz\",\n            127932: \"_2c-\",\n            128013: \"_2c_\",\n            128014: \"_2d0\",\n            128017: \"_2d1\",\n            128018: \"_2d2\",\n            128020: \"_2d3\",\n            128023: \"_2d4\",\n            128024: \"_2d5\",\n            128025: \"_2d6\",\n            128026: \"_2d7\",\n            128027: \"_2d8\",\n            128031: \"_2d9\",\n            128032: \"_2da\",\n            128033: \"_2db\",\n            128037: \"_2dc\",\n            128038: \"_2dd\",\n            128039: \"_2de\",\n            128040: \"_2df\",\n            128041: \"_2dg\",\n            128043: \"_2dh\",\n            128044: \"_2di\",\n            128045: \"_2dj\",\n            128046: \"_2dk\",\n            128047: \"_2dl\",\n            128048: \"_2dm\",\n            128049: \"_2dn\",\n            128051: \"_2do\",\n            128052: \"_2dp\",\n            128053: \"_2dq\",\n            128054: \"_491\",\n            128055: \"_2dr\",\n            128056: \"_2ds\",\n            128057: \"_2dt\",\n            128058: \"_2du\",\n            128059: \"_2dv\",\n            128062: \"_2dw\",\n            128064: \"_2dx\",\n            128066: \"_2dy\",\n            128067: \"_2dz\",\n            128068: \"_2d-\",\n            128069: \"_2d_\",\n            128070: \"_2e0\",\n            128071: \"_2e1\",\n            128072: \"_2e2\",\n            128073: \"_2e3\",\n            128074: \"_2e4\",\n            128075: \"_2e5\",\n            128076: \"_2e6\",\n            128077: \"_2e7\",\n            128078: \"_2e8\",\n            128079: \"_2e9\",\n            128080: \"_2ea\",\n            128102: \"_2eb\",\n            128103: \"_2ec\",\n            128104: \"_2ed\",\n            128105: \"_2ee\",\n            128107: \"_2ef\",\n            128110: \"_2eg\",\n            128111: \"_2eh\",\n            128113: \"_2ei\",\n            128114: \"_2ej\",\n            128115: \"_2ek\",\n            128116: \"_2el\",\n            128117: \"_2em\",\n            128118: \"_2en\",\n            128119: \"_2eo\",\n            128120: \"_2ep\",\n            128123: \"_2eq\",\n            128124: \"_2er\",\n            128125: \"_2es\",\n            128126: \"_2et\",\n            128127: \"_2eu\",\n            128128: \"_2ev\",\n            128130: \"_2ew\",\n            128131: \"_2ex\",\n            128133: \"_2ey\",\n            128139: \"_2ez\",\n            128143: \"_2e-\",\n            128144: \"_2e_\",\n            128145: \"_2f0\",\n            128147: \"_2f1\",\n            128148: \"_2f2\",\n            128150: \"_2f3\",\n            128151: \"_2f4\",\n            128152: \"_2f5\",\n            128153: \"_2f6\",\n            128154: \"_2f7\",\n            128155: \"_2f8\",\n            128156: \"_2f9\",\n            128157: \"_2fa\",\n            128162: \"_2fb\",\n            128164: \"_2fc\",\n            128166: \"_2fd\",\n            128168: \"_2fe\",\n            128169: \"_2ff\",\n            128170: \"_2fg\",\n            128187: \"_2fh\",\n            128189: \"_2fi\",\n            128190: \"_2fj\",\n            128191: \"_2fk\",\n            128192: \"_2fl\",\n            128222: \"_2fm\",\n            128224: \"_2fn\",\n            128241: \"_2fo\",\n            128242: \"_2fp\",\n            128250: \"_2fq\",\n            128276: \"_2fr\",\n            128293: \"_492\",\n            128513: \"_2fs\",\n            128514: \"_2ft\",\n            128515: \"_2fu\",\n            128516: \"_2fv\",\n            128518: \"_2fw\",\n            128521: \"_2fx\",\n            128523: \"_2fy\",\n            128524: \"_2fz\",\n            128525: \"_2f-\",\n            128527: \"_2f_\",\n            128530: \"_2g0\",\n            128531: \"_2g1\",\n            128532: \"_2g2\",\n            128534: \"_2g3\",\n            128536: \"_2g4\",\n            128538: \"_2g5\",\n            128540: \"_2g6\",\n            128541: \"_2g7\",\n            128542: \"_2g8\",\n            128544: \"_2g9\",\n            128545: \"_2ga\",\n            128546: \"_2gb\",\n            128547: \"_2gc\",\n            128548: \"_2gd\",\n            128549: \"_2ge\",\n            128552: \"_2gf\",\n            128553: \"_2gg\",\n            128554: \"_2gh\",\n            128555: \"_2gi\",\n            128557: \"_2gj\",\n            128560: \"_2gk\",\n            128561: \"_2gl\",\n            128562: \"_2gm\",\n            128563: \"_2gn\",\n            128565: \"_2go\",\n            128567: \"_2gp\",\n            128568: \"_2gq\",\n            128569: \"_2gr\",\n            128570: \"_2gs\",\n            128571: \"_2gt\",\n            128572: \"_2gu\",\n            128573: \"_2gv\",\n            128575: \"_2gw\",\n            128576: \"_2gx\",\n            128587: \"_2gy\",\n            128588: \"_2gz\",\n            128589: \"_2g-\",\n            128591: \"_2g_\",\n            9757: \"_2h0\",\n            9786: \"_2h1\",\n            9889: \"_2h2\",\n            9924: \"_2h3\",\n            9994: \"_2h4\",\n            9995: \"_2h5\",\n            9996: \"_2h6\",\n            9728: \"_2h7\",\n            9729: \"_2h8\",\n            9748: \"_2h9\",\n            9749: \"_2ha\",\n            10024: \"_2hb\",\n            10084: \"_2hc\"\n        }\n    };\n});\n__d(\"Utf16\", [], function(a, b, c, d, e, f) {\n    var g = {\n        decode: function(h) {\n            switch (h.length) {\n              case 1:\n                return h.charCodeAt(0);\n              case 2:\n                return ((65536 | ((((h.charCodeAt(0) - 55296)) * 1024))) | ((h.charCodeAt(1) - 56320)));\n            };\n        },\n        encode: function(h) {\n            if ((h < 65536)) {\n                return String.fromCharCode(h);\n            }\n             else return (String.fromCharCode((55296 + ((((h - 65536)) >> 10)))) + String.fromCharCode((56320 + ((h % 1024)))))\n        ;\n        }\n    };\n    e.exports = g;\n});\n__d(\"Emoji\", [\"cx\",\"DOM\",\"Emote\",\"SupportedEmoji\",\"htmlize\",\"Utf16\",], function(a, b, c, d, e, f) {\n    var g = b(\"cx\"), h = b(\"DOM\"), i = b(\"Emote\"), j = b(\"SupportedEmoji\"), k = b(\"htmlize\"), l = b(\"Utf16\"), m = 40, n = e.exports = {\n        htmlEmojiAndEmote: function(o, p) {\n            return n.htmlEmoji(o, function(q) {\n                return i.htmlEmote(q, p);\n            });\n        },\n        htmlEmoji: function(o, p) {\n            if ((typeof p != \"function\")) {\n                p = k;\n            };\n            var q = o, r = [], s = m;\n            while (s--) {\n                var t = j.utf16Regex.exec(q);\n                if ((!t || !t.length)) {\n                    break;\n                };\n                var u = t[0], v = t.index;\n                r.push(p(q.substring(0, v)));\n                var w = l.decode(u);\n                if (j.emoji[w]) {\n                    var x = ((\"_1az _1a-\" + \" \") + j.emoji[w]), y = h.create(\"span\", {\n                        className: x\n                    });\n                    r.push(h.create(\"span\", {\n                    }, y).innerHTML);\n                }\n                 else r.push(p(u));\n            ;\n                q = q.substring((v + u.length));\n            };\n            r.push(p(q));\n            return r.join(\"\");\n        }\n    };\n});\n__d(\"TextWithEmoticons.react\", [\"Emoji\",\"Emote\",\"React\",], function(a, b, c, d, e, f) {\n    var g = b(\"Emoji\"), h = b(\"Emote\"), i = b(\"React\"), j = i.createClass({\n        displayName: \"ReactTextWithEmoticons\",\n        render: function() {\n            if ((!this.props.renderEmoticons && !this.props.renderEmoji)) {\n                return i.DOM.span(null, this.props.text)\n            };\n            var k;\n            if ((this.props.renderEmoticons && this.props.renderEmoji)) {\n                k = g.htmlEmoji(this.props.text, h.htmlEmoteWithoutFBID);\n            }\n             else if (this.props.renderEmoticons) {\n                k = h.htmlEmoteWithoutFBID(this.props.text);\n            }\n             else k = g.htmlEmoji(this.props.text);\n            \n        ;\n            return i.DOM.span({\n                dangerouslySetInnerHTML: {\n                    __html: k\n                }\n            });\n        }\n    });\n    e.exports = j;\n});\n__d(\"TextWithEntities.react\", [\"Link.react\",\"React\",\"TextWithEmoticons.react\",], function(a, b, c, d, e, f) {\n    var g = b(\"Link.react\"), h = b(\"React\"), i = b(\"TextWithEmoticons.react\");\n    function j(o) {\n        return (o).replace(/<3\\b|&hearts;/g, \"\\u2665\");\n    };\n    function k(o, p) {\n        return (g({\n            href: p.entities[0]\n        }, o));\n    };\n    function l(o, p) {\n        return (o.offset - p.offset);\n    };\n    var m = /(\\r\\n|[\\r\\n])/, n = h.createClass({\n        displayName: \"ReactTextWithEntities\",\n        _formatStandardText: function(o) {\n            var p = o.split(m), q = [];\n            for (var r = 0; (r < p.length); r++) {\n                var s = p[r];\n                if (s) {\n                    if (m.test(s)) {\n                        q.push(h.DOM.br(null));\n                    }\n                     else if ((this.props.renderEmoticons || this.props.renderEmoji)) {\n                        q.push(i({\n                            text: s,\n                            renderEmoticons: this.props.renderEmoticons,\n                            renderEmoji: this.props.renderEmoji\n                        }));\n                    }\n                     else q.push(j(s));\n                    \n                \n                };\n            };\n            return q;\n        },\n        render: function() {\n            var o = 0, p = this.props.ranges, q = this.props.aggregatedRanges, r = this.props.text, s = null;\n            if (p) {\n                s = (q ? p.concat(q) : p.slice());\n            }\n             else if (q) {\n                s = q.slice();\n            }\n        ;\n            if (s) {\n                s.sort(l);\n            };\n            var t = [], u = (s ? s.length : 0);\n            for (var v = 0, w = u; (v < w); v++) {\n                var x = s[v];\n                if ((x.offset < o)) {\n                    continue;\n                };\n                if ((x.offset > o)) {\n                    t = t.concat(this._formatStandardText(r.substring(o, x.offset)));\n                };\n                var y = r.substr(x.offset, x.length);\n                t = t.concat([(this.props.interpolator ? this.props.interpolator(y, x) : k(y, x)),]);\n                o = (x.offset + x.length);\n            };\n            if ((r.length > o)) {\n                t = t.concat(this._formatStandardText(r.substr(o)));\n            };\n            return h.DOM.span(null, t);\n        }\n    });\n    e.exports = n;\n});\n__d(\"SeeMore.react\", [\"React\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"React\"), h = b(\"tx\"), i = g.createClass({\n        displayName: \"SeeMore\",\n        getInitialState: function() {\n            return {\n                isCollapsed: true\n            };\n        },\n        handleClick: function() {\n            this.setState({\n                isCollapsed: false\n            });\n        },\n        render: function() {\n            var j = this.state.isCollapsed, k = (!j ? null : g.DOM.span(null, \"...\")), l = this.props.children[0], m = (j ? null : g.DOM.span(null, this.props.children[1])), n = (!j ? null : g.DOM.a({\n                className: \"SeeMoreLink fss\",\n                onClick: this.handleClick,\n                href: \"#\",\n                role: \"button\"\n            }, \"See More\"));\n            return (g.DOM.span({\n                className: this.props.className\n            }, l, k, n, m));\n        }\n    });\n    e.exports = i;\n});\n__d(\"TruncatedTextWithEntities.react\", [\"React\",\"TextWithEntities.react\",\"SeeMore.react\",], function(a, b, c, d, e, f) {\n    var g = b(\"React\"), h = b(\"TextWithEntities.react\"), i = b(\"SeeMore.react\");\n    function j(n, o) {\n        var p = (n.offset + n.length);\n        return ((o > n.offset) && (o < p));\n    };\n    function k(n, o) {\n        for (var p = 0; (p < n.length); p++) {\n            var q = n[p];\n            if (j(q, o)) {\n                return q.offset\n            };\n        };\n        return o;\n    };\n    var l = function(n, o, p) {\n        var q = [], r = [], s = k(o, p);\n        for (var t = 0; (t < o.length); t++) {\n            var u = o[t];\n            if ((u.offset < s)) {\n                q.push(u);\n            }\n             else r.push({\n                offset: (u.offset - s),\n                length: u.length,\n                entities: u.entities\n            });\n        ;\n        };\n        return {\n            first: {\n                ranges: q,\n                text: n.substr(0, s)\n            },\n            second: {\n                ranges: r,\n                text: n.substr(s)\n            }\n        };\n    }, m = g.createClass({\n        displayName: \"TruncatedTextWithEntities\",\n        render: function() {\n            var n = this.props.maxLines, o = this.props.maxLength, p = (this.props.truncationPercent || 175898), q = Math.floor((p * o)), r = (this.props.text || \"\"), s = (this.props.ranges || []), t = r.split(\"\\u000a\"), u = (t.length - 1), v = (o && (r.length > o)), w = (n && (u > n));\n            if (w) {\n                q = Math.min(t.slice(0, n).join(\"\\u000a\").length, q);\n            };\n            if ((v || w)) {\n                var x = l(r, s, q);\n                return (g.DOM.span({\n                    \"data-ft\": this.props[\"data-ft\"],\n                    dir: this.props.dir\n                }, i({\n                    className: this.props.className\n                }, h({\n                    interpolator: this.props.interpolator,\n                    ranges: x.first.ranges,\n                    text: x.first.text,\n                    renderEmoticons: this.props.renderEmoticons,\n                    renderEmoji: this.props.renderEmoji\n                }), h({\n                    interpolator: this.props.interpolator,\n                    ranges: x.second.ranges,\n                    text: x.second.text,\n                    renderEmoticons: this.props.renderEmoticons,\n                    renderEmoji: this.props.renderEmoji\n                }))));\n            }\n             else return (g.DOM.span({\n                \"data-ft\": this.props[\"data-ft\"],\n                dir: this.props.dir\n            }, h({\n                className: this.props.className,\n                interpolator: this.props.interpolator,\n                ranges: s,\n                text: r,\n                renderEmoticons: this.props.renderEmoticons,\n                renderEmoji: this.props.renderEmoji\n            })))\n        ;\n        }\n    });\n    e.exports = m;\n});\n__d(\"UFICommentAttachment.react\", [\"DOM\",\"React\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOM\"), h = b(\"React\"), i = h.createClass({\n        displayName: \"UFICommentAttachment\",\n        _attachmentFromCommentData: function(j) {\n            return (j.photo_comment || j.attachment);\n        },\n        componentDidMount: function(j) {\n            var k = this._attachmentFromCommentData(this.props.comment);\n            if (k) {\n                this.renderAttachment(k);\n            };\n        },\n        shouldComponentUpdate: function(j, k) {\n            var l = this._attachmentFromCommentData(this.props.comment), m = this._attachmentFromCommentData(j.comment);\n            if ((!l && !m)) {\n                return false\n            };\n            if (((!l || !m) || (l.markup != m.markup))) {\n                return true;\n            }\n             else return false\n        ;\n        },\n        componentDidUpdate: function(j) {\n            var k = this._attachmentFromCommentData(this.props.comment);\n            this.renderAttachment(k);\n        },\n        renderAttachment: function(j) {\n            if ((j && this.refs.contents)) {\n                g.setContent(this.refs.contents.getDOMNode(), j.markup);\n            };\n        },\n        render: function() {\n            if (this._attachmentFromCommentData(this.props.comment)) {\n                return h.DOM.div({\n                    ref: \"contents\"\n                });\n            }\n             else return h.DOM.span(null)\n        ;\n        }\n    });\n    e.exports = i;\n});\n__d(\"UFIReplyLink.react\", [\"React\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"React\"), h = b(\"tx\"), i = g.createClass({\n        displayName: \"UFIReplyLink\",\n        render: function() {\n            return (g.DOM.a({\n                className: \"UFIReplyLink\",\n                href: \"#\",\n                onClick: this.props.onClick\n            }, \"Reply\"));\n        }\n    });\n    e.exports = i;\n});\n__d(\"UFISpamCount\", [\"UFISpamCountImpl\",], function(a, b, c, d, e, f) {\n    e.exports = (b(\"UFISpamCountImpl\").module || {\n        enabled: false\n    });\n});\n__d(\"UFIComment.react\", [\"function-extensions\",\"Bootloader\",\"CloseButton.react\",\"Env\",\"Focus\",\"HovercardLink\",\"HovercardLinkInterpolator\",\"LinkButton\",\"NumberFormat\",\"ProfileBrowserLink\",\"ProfileBrowserTypes\",\"React\",\"Timestamp.react\",\"TrackingNodes\",\"TruncatedTextWithEntities.react\",\"UFIClassNames\",\"UFICommentAttachment.react\",\"UFIConfig\",\"UFIConstants\",\"UFIImageBlock.react\",\"UFIInstanceState\",\"UFIReplyLink.react\",\"UFISpamCount\",\"URI\",\"cx\",\"keyMirror\",\"joinClasses\",\"tx\",], function(a, b, c, d, e, f) {\n    b(\"function-extensions\");\n    var g = b(\"Bootloader\"), h = b(\"CloseButton.react\"), i = b(\"Env\"), j = b(\"Focus\"), k = b(\"HovercardLink\"), l = b(\"HovercardLinkInterpolator\"), m = b(\"LinkButton\"), n = b(\"NumberFormat\"), o = b(\"ProfileBrowserLink\"), p = b(\"ProfileBrowserTypes\"), q = b(\"React\"), r = b(\"Timestamp.react\"), s = b(\"TrackingNodes\"), t = b(\"TruncatedTextWithEntities.react\"), u = b(\"UFIClassNames\"), v = b(\"UFICommentAttachment.react\"), w = b(\"UFIConfig\"), x = b(\"UFIConstants\"), y = b(\"UFIImageBlock.react\"), z = b(\"UFIInstanceState\"), aa = b(\"UFIReplyLink.react\"), ba = b(\"UFISpamCount\"), ca = b(\"URI\"), da = b(\"cx\"), ea = b(\"keyMirror\"), fa = b(\"joinClasses\"), ga = b(\"tx\"), ha = x.UFIStatus, ia = \" \\u00b7 \", ja = ea({\n        edit: true,\n        hide: true,\n        remove: true\n    }), ka = \"UFICommentBody\", la = \"UFICommentActorName\", ma = \"UFICommentNotSpamLink\", na = \"fsm fwn fcg UFICommentActions\", oa = \"UFIDeletedMessageIcon\", pa = \"UFIDeletedMessage\", qa = \"UFIFailureMessageIcon\", ra = \"UFIFailureMessage\", sa = \"UFICommentLikeButton\", ta = \"UFICommentLikeIcon\", ua = \"UFITranslateLink\", va = \"UFITranslatedText\", wa = \"uiLinkSubtle\", xa = \"stat_elem\", ya = \"pls\", za = \"fcg\", ab = 27, bb = null, cb = function(kb, lb) {\n        var mb = new ca(\"/ajax/like/tooltip.php\").setQueryData({\n            comment_fbid: kb.fbid,\n            comment_from: kb.author,\n            cache_buster: (kb.likeconfirmhash || 0)\n        });\n        if (lb) {\n            mb.addQueryData({\n                viewas: lb\n            });\n        };\n        return mb;\n    }, db = function(kb) {\n        var lb = kb.status;\n        return ((lb === ha.FAILED_ADD) || (lb === ha.FAILED_EDIT));\n    };\n    function eb(kb) {\n        return (((kb.commenterIsFOF !== undefined) && (kb.userIsMinor !== undefined)) && (kb.reportLink !== undefined));\n    };\n    var fb = q.createClass({\n        displayName: \"UFICommentLikeCount\",\n        render: function() {\n            var kb = this.props.comment, lb = n.formatIntegerWithDelimiter((kb.likecount || 0), this.props.contextArgs.numberdelimiter), mb = p.LIKES, nb = {\n                id: kb.fbid\n            }, ob = cb(this.props.comment, this.props.viewas), pb = q.DOM.i({\n                className: ta\n            }), qb = q.DOM.span(null, lb);\n            return (q.DOM.a({\n                className: sa,\n                role: \"button\",\n                rel: \"dialog\",\n                \"data-hover\": \"tooltip\",\n                \"data-tooltip-alignh\": \"center\",\n                \"data-tooltip-uri\": ob.toString(),\n                ajaxify: o.constructDialogURI(mb, nb).toString(),\n                href: o.constructPageURI(mb, nb).toString()\n            }, pb, qb));\n        }\n    }), gb = q.createClass({\n        displayName: \"UFICommentActions\",\n        render: function() {\n            var kb = this.props, lb = kb.comment, mb = kb.feedback, nb = kb.markedAsSpamHere, ob = (lb.status === ha.SPAM_DISPLAY), pb = this.props.showReplyLink, qb = this.props.hideAsSpamForPageAdmin, rb, sb, tb, ub, vb, wb, xb = (!lb.islocal && (lb.status !== ha.LIVE_DELETED));\n            if (xb) {\n                if ((ob && !nb)) {\n                    if (kb.viewerCanMarkNotSpam) {\n                        rb = q.DOM.a({\n                            onClick: kb.onMarkAsNotSpam,\n                            className: ma,\n                            href: \"#\",\n                            role: \"button\"\n                        }, \"Unhide\");\n                    };\n                    if ((((qb && mb.isthreaded) && mb.cancomment) && pb)) {\n                        vb = aa({\n                            comment: lb,\n                            onClick: kb.onCommentReply,\n                            contextArgs: kb.contextArgs\n                        });\n                    };\n                }\n                 else {\n                    if (mb.viewercanlike) {\n                        var yb = s.getTrackingInfo((lb.hasviewerliked ? s.types.UNLIKE_LINK : s.types.LIKE_LINK)), zb = (lb.hasviewerliked ? \"Unlike this comment\" : \"Like this comment\");\n                        sb = q.DOM.a({\n                            className: \"UFILikeLink\",\n                            href: \"#\",\n                            role: \"button\",\n                            onClick: kb.onCommentLikeToggle,\n                            \"data-ft\": yb,\n                            title: zb\n                        }, (lb.hasviewerliked ? \"Unlike\" : \"Like\"));\n                    }\n                ;\n                    if (((mb.isthreaded && mb.cancomment) && pb)) {\n                        vb = aa({\n                            comment: lb,\n                            onClick: kb.onCommentReply,\n                            contextArgs: kb.contextArgs\n                        });\n                    };\n                    if ((lb.likecount > 0)) {\n                        tb = fb({\n                            comment: lb,\n                            viewas: this.props.viewas,\n                            contextArgs: this.props.contextArgs\n                        });\n                    };\n                    if ((lb.spamcount && ba.enabled)) {\n                        ub = ba({\n                            count: lb.spamcount\n                        });\n                    };\n                }\n            ;\n                if ((lb.attachment && lb.canremove)) {\n                    wb = q.DOM.a({\n                        onClick: kb.onPreviewRemove,\n                        href: \"#\",\n                        role: \"button\"\n                    }, \"Remove Preview\");\n                };\n            }\n        ;\n            var ac = hb({\n                comment: lb,\n                onRetrySubmit: kb.onRetrySubmit,\n                showPermalink: kb.showPermalink\n            }), bc;\n            if (kb.contextArgs.entstream) {\n                bc = [ac,sb,tb,vb,ub,rb,wb,];\n            }\n             else if (mb.isthreaded) {\n                bc = [sb,vb,rb,wb,tb,ub,ac,];\n            }\n             else bc = [ac,sb,tb,ub,vb,rb,wb,];\n            \n        ;\n            if ((lb.status === ha.LIVE_DELETED)) {\n                var cc = q.DOM.span({\n                    className: pa\n                }, q.DOM.i({\n                    className: oa,\n                    \"data-hover\": \"tooltip\",\n                    \"aria-label\": \"Comment deleted\"\n                }));\n                bc.push(cc);\n            }\n        ;\n            var dc = [];\n            for (var ec = 0; (ec < bc.length); ec++) {\n                if (bc[ec]) {\n                    dc.push(ia);\n                    dc.push(bc[ec]);\n                }\n            ;\n            };\n            dc.shift();\n            return (q.DOM.div({\n                className: na\n            }, dc));\n        }\n    }), hb = q.createClass({\n        displayName: \"UFICommentMetadata\",\n        render: function() {\n            var kb = this.props.comment, lb = this.props.onRetrySubmit, mb, nb;\n            if (db(kb)) {\n                mb = [q.DOM.span({\n                    className: ra\n                }, q.DOM.i({\n                    className: qa\n                }), \"Unable to post comment.\"),((kb.allowRetry && lb) ? [\" \",q.DOM.a({\n                    onClick: lb,\n                    href: \"#\",\n                    role: \"button\"\n                }, \"Try Again\"),] : null),];\n            }\n             else {\n                var ob = (this.props.showPermalink ? kb.permalink : null), pb = s.getTrackingInfo(s.types.SOURCE), qb = q.DOM.a({\n                    className: wa,\n                    href: ob,\n                    \"data-ft\": pb\n                }, r({\n                    time: kb.timestamp.time,\n                    text: kb.timestamp.text,\n                    verbose: kb.timestamp.verbose\n                })), rb;\n                switch (kb.source) {\n                  case x.UFISourceType.MOBILE:\n                    rb = q.DOM.a({\n                        className: wa,\n                        href: new ca(\"/mobile/\").setSubdomain(\"www\").toString()\n                    }, \"mobile\");\n                    break;\n                  case x.UFISourceType.SMS:\n                    rb = q.DOM.a({\n                        className: wa,\n                        href: new ca(\"/mobile/?v=texts\").setSubdomain(\"www\").toString()\n                    }, \"text message\");\n                    break;\n                  case x.UFISourceType.EMAIL:\n                    rb = m({\n                        subtle: true,\n                        label: \"email\",\n                        inputType: \"submit\",\n                        name: \"email_explain\",\n                        value: true,\n                        className: xa\n                    });\n                    break;\n                };\n                nb = (rb ? ga._(\"{time} via {source}\", {\n                    time: qb,\n                    source: rb\n                }) : qb);\n            }\n        ;\n            var sb = null;\n            if (kb.originalTimestamp) {\n                var tb = new ca(\"/ajax/edits/browser/comment\").addQueryData({\n                    comment_token: kb.id\n                }).toString();\n                sb = [ia,q.DOM.a({\n                    ref: \"EditLink\",\n                    href: \"#\",\n                    role: \"button\",\n                    rel: \"dialog\",\n                    className: \"uiLinkSubtle\",\n                    ajaxify: tb,\n                    \"data-hover\": \"tooltip\",\n                    \"aria-label\": \"Show edit history\",\n                    title: \"Show edit history\"\n                }, \"Edited\"),];\n            }\n        ;\n            return (q.DOM.span(null, nb, mb, sb));\n        },\n        componentWillUpdate: function(kb) {\n            var lb = this.props.comment, mb = kb.comment;\n            if ((!lb.editnux && !!mb.editnux)) {\n                g.loadModules([\"LegacyContextualDialog\",], function(nb) {\n                    var ob = new nb();\n                    ob.init(mb.editnux).setContext(this.refs.EditLink.getDOMNode()).setWidth(300).setPosition(\"below\").show();\n                }.bind(this));\n            };\n        }\n    }), ib = q.createClass({\n        displayName: \"UFISocialContext\",\n        render: function() {\n            var kb = this.props.topMutualFriend, lb = this.props.otherMutualCount, mb = this.props.commentAuthor, nb = k.constructEndpoint(kb).toString(), ob = q.DOM.a({\n                href: kb.uri,\n                \"data-hovercard\": nb\n            }, kb.name), pb = (mb.name.length + kb.name.length), qb;\n            if ((lb === 0)) {\n                qb = ga._(\"Friends with {name}\", {\n                    name: ob\n                });\n            }\n             else if ((pb < ab)) {\n                var rb;\n                if ((lb == 1)) {\n                    rb = \"1 other\";\n                }\n                 else rb = ga._(\"{count} others\", {\n                    count: lb\n                });\n            ;\n                qb = ga._(\"Friends with {name} and {others}\", {\n                    name: ob,\n                    others: this.getOthersLink(rb, mb, kb)\n                });\n            }\n             else {\n                var sb = ga._(\"{count} mutual friends\", {\n                    count: (lb + 1)\n                });\n                qb = this.getOthersLink(sb, mb);\n            }\n            \n        ;\n            return (q.DOM.span({\n                className: \"UFICommentSocialContext\"\n            }, ia, qb));\n        },\n        getOthersLink: function(kb, lb, mb) {\n            var nb = p.MUTUAL_FRIENDS, ob = {\n                uid: lb.id\n            }, pb = new ca(\"/ajax/mutual_friends/tooltip.php\").setQueryData({\n                friend_id: lb.id\n            });\n            if (mb) {\n                pb.addQueryData({\n                    exclude_id: mb.id\n                });\n            };\n            var qb = o.constructDialogURI(nb, ob).toString();\n            return (q.DOM.a({\n                rel: \"dialog\",\n                \"data-hover\": \"tooltip\",\n                \"data-tooltip-alignh\": \"center\",\n                \"data-tooltip-uri\": pb.toString(),\n                ajaxify: qb,\n                href: o.constructPageURI(nb, ob).toString()\n            }, kb));\n        }\n    }), jb = q.createClass({\n        displayName: \"UFIComment\",\n        getInitialState: function() {\n            return {\n                isHighlighting: this.props.comment.highlightcomment,\n                wasHighlighted: this.props.comment.highlightcomment,\n                markedAsSpamHere: false,\n                oneClickRemovedHere: false,\n                isInlinePageDeleted: false,\n                isInlineBanned: false\n            };\n        },\n        _onHideAsSpam: function(event) {\n            this.props.onHideAsSpam(event);\n            this.setState({\n                markedAsSpamHere: true\n            });\n        },\n        _onMarkAsNotSpam: function(event) {\n            this.props.onMarkAsNotSpam(event);\n            this.setState({\n                markedAsSpamHere: false\n            });\n        },\n        _onDeleteSpam: function(event) {\n            this.props.onOneClickRemove(event);\n            this.setState({\n                isInlinePageDeleted: true\n            });\n        },\n        _onUndoDeleteSpam: function(event) {\n            this.props.onUndoOneClickRemove(event);\n            this.setState({\n                isInlinePageDeleted: false\n            });\n        },\n        _onInlineBan: function(event) {\n            this.props.onInlineBan(event);\n            this.setState({\n                isInlineBanned: true\n            });\n        },\n        _onUndoInlineBan: function(event) {\n            this.props.onUndoInlineBan(event);\n            this.setState({\n                isInlineBanned: false\n            });\n        },\n        _onOneClickRemove: function(event) {\n            this.props.onOneClickRemove(event);\n            this.setState({\n                oneClickRemovedHere: true\n            });\n        },\n        _onUndoOneClickRemove: function(event) {\n            this.props.onUndoOneClickRemove(event);\n            this.setState({\n                oneClickRemovedHere: false\n            });\n        },\n        _onAction: function(event, kb) {\n            if ((kb === ja.remove)) {\n                this.props.onRemove(event);\n            }\n             else if ((kb === ja.edit)) {\n                this.props.onEdit(event);\n            }\n             else if ((kb === ja.hide)) {\n                this._onHideAsSpam(event);\n            }\n            \n        ;\n        },\n        _createRemoveReportMenu: function(event) {\n            if (this._removeReportMenu) {\n                return\n            };\n            var kb = [{\n                label: \"Delete Comment...\",\n                value: ja.remove\n            },{\n                label: \"Hide Comment\",\n                value: ja.hide\n            },];\n            if (event.persist) {\n                event.persist();\n            }\n             else event = event.constructor.persistentCloneOf(event);\n        ;\n            g.loadModules([\"LegacyMenuUtils\",], function(lb) {\n                this._removeReportMenu = lb.createAndShowPopoverMenu(event.target, kb, this._onAction.bind(this, event));\n            }.bind(this));\n        },\n        _createEditDeleteMenu: function(event) {\n            if (event.persist) {\n                event.persist();\n            }\n             else event = event.constructor.persistentCloneOf(event);\n        ;\n            if (this._editDeleteMenu) {\n                return\n            };\n            var kb = [{\n                label: \"Edit...\",\n                value: ja.edit\n            },{\n                label: \"Delete...\",\n                value: ja.remove\n            },];\n            g.loadModules([\"LegacyMenuUtils\",], function(lb) {\n                this._editDeleteMenu = lb.createAndShowPopoverMenu(event.target, kb, this._onAction.bind(this, event));\n            }.bind(this));\n        },\n        _renderCloseButton: function() {\n            var kb = this.props.comment, lb = this.props.feedback, mb = null, nb = null, ob = false;\n            if ((kb.canremove && !this.props.hideAsSpamForPageAdmin)) {\n                if (this.props.viewerIsAuthor) {\n                    if (kb.canedit) {\n                        nb = \"Edit or Delete\";\n                        mb = this._createEditDeleteMenu;\n                        ob = true;\n                    }\n                     else {\n                        nb = \"Remove\";\n                        mb = this.props.onRemove;\n                    }\n                ;\n                }\n                 else if (lb.canremoveall) {\n                    if (this.props.showRemoveReportMenu) {\n                        nb = \"Remove or Report\";\n                        mb = this._createRemoveReportMenu;\n                    }\n                     else {\n                        nb = \"Remove\";\n                        mb = this._onOneClickRemove;\n                    }\n                \n                }\n            ;\n            }\n             else if (kb.canreport) {\n                nb = \"Hide\";\n                mb = this._onHideAsSpam;\n            }\n            \n        ;\n            var pb = ((((\"UFICommentCloseButton\") + ((ob ? (\" \" + \"UFIEditButton\") : \"\"))) + (((mb === null) ? (\" \" + \"hdn\") : \"\"))));\n            return (h({\n                onClick: mb,\n                tooltip: nb,\n                className: pb\n            }));\n        },\n        componentDidMount: function(kb) {\n            var lb = this.props.comment.ufiinstanceid;\n            if (this.state.isHighlighting) {\n                g.loadModules([\"UFIScrollHighlight\",], function(nb) {\n                    nb.actOn.curry(kb).defer();\n                });\n                this.setState({\n                    isHighlighting: false\n                });\n            }\n        ;\n            var mb = z.getKeyForInstance(lb, \"autofocus\");\n            if (mb) {\n                j.setWithoutOutline(this.refs.AuthorName.getDOMNode());\n                z.updateState(lb, \"autofocus\", false);\n            }\n        ;\n        },\n        shouldComponentUpdate: function(kb) {\n            var lb = this.props;\n            return ((((((((((((kb.comment !== lb.comment) || (kb.showReplyLink !== lb.showReplyLink)) || (kb.showReplies !== lb.showReplies)) || (kb.isFirst !== lb.isFirst)) || (kb.isLast !== lb.isLast)) || (kb.isFirstCommentComponent !== lb.isFirstCommentComponent)) || (kb.isLastCommentComponent !== lb.isLastCommentComponent)) || (kb.isFirstComponent !== lb.isFirstComponent)) || (kb.isLastComponent !== lb.isLastComponent)) || (kb.isFeaturedComment !== lb.isFeaturedComment)) || (kb.hasPartialBorder !== lb.hasPartialBorder)));\n        },\n        render: function() {\n            var kb = this.props.comment, lb = this.props.feedback, mb = (kb.status === ha.DELETED), nb = (kb.status === ha.LIVE_DELETED), ob = (kb.status === ha.SPAM_DISPLAY), pb = (kb.status === ha.PENDING_UNDO_DELETE), qb = this.state.markedAsSpamHere, rb = this.state.oneClickRemovedHere, sb = this.state.isInlinePageDeleted, tb = this.props.hideAsSpamForPageAdmin, ub = this.state.isInlineBanned, vb = eb(kb), wb = (!kb.status && ((kb.isunseen || kb.islocal)));\n            if ((!kb.status && lb.lastseentime)) {\n                var xb = (kb.originalTimestamp || kb.timestamp.time);\n                wb = (wb || (xb > lb.lastseentime));\n            }\n        ;\n            var yb = this.props.contextArgs.markedcomments;\n            if ((yb && yb[kb.legacyid])) {\n                wb = true;\n            };\n            if (vb) {\n                if (bb) {\n                    var zb, ac = null, bc = null, cc = null;\n                    if (tb) {\n                        bc = (ub ? this._onUndoInlineBan : this._onInlineBan);\n                        if (sb) {\n                            ac = this._onUndoDeleteSpam;\n                            var dc = q.DOM.a({\n                                href: \"#\",\n                                onClick: ac\n                            }, \"Undo\");\n                            zb = ga._(\"You've deleted this comment so no one can see it. {undo}.\", {\n                                undo: dc\n                            });\n                        }\n                         else if (qb) {\n                            zb = \"Now this is only visible to the person who wrote it and their friends.\";\n                            cc = this._onDeleteSpam;\n                            ac = this._onMarkAsNotSpam;\n                        }\n                        \n                    ;\n                    }\n                     else if (qb) {\n                        zb = \"This comment has been hidden.\";\n                        cc = this._onDeleteSpam;\n                        ac = this._onMarkAsNotSpam;\n                    }\n                     else if (rb) {\n                        zb = \"This comment has been removed.\";\n                        ac = this._onUndoOneClickRemove;\n                    }\n                    \n                    \n                ;\n                    if (zb) {\n                        return (q.DOM.li({\n                            className: fa(u.ROW, \"UFIHide\")\n                        }, bb({\n                            notice: zb,\n                            comment: this.props.comment,\n                            authorProfiles: this.props.authorProfiles,\n                            onUndo: ac,\n                            onBanAction: bc,\n                            onDeleteAction: cc,\n                            isInlineBanned: ub,\n                            hideAsSpamForPageAdmin: tb\n                        })))\n                    };\n                }\n                 else g.loadModules([\"UFICommentRemovalControls.react\",], function(gc) {\n                    bb = gc;\n                    setTimeout(function() {\n                        this.forceUpdate();\n                    }.bind(this));\n                }.bind(this));\n            \n            };\n            var ec = fa(u.ROW, ((((((((((((((\"UFIComment\") + ((db(kb) ? (\" \" + \"UFICommentFailed\") : \"\"))) + (((((mb || nb) || ob) || pb) ? (\" \" + \"UFITranslucentComment\") : \"\"))) + ((this.state.isHighlighting ? (\" \" + \"highlightComment\") : \"\"))) + (((mb && !rb) ? (\" \" + \"noDisplay\") : \"\"))) + (((this.props.isFirst && !this.props.isReply) ? (\" \" + \"UFIFirstComment\") : \"\"))) + (((this.props.isLast && !this.props.isReply) ? (\" \" + \"UFILastComment\") : \"\"))) + ((this.props.isFirstCommentComponent ? (\" \" + \"UFIFirstCommentComponent\") : \"\"))) + ((this.props.isLastCommentComponent ? (\" \" + \"UFILastCommentComponent\") : \"\"))) + ((this.props.isFirstComponent ? (\" \" + \"UFIFirstComponent\") : \"\"))) + ((this.props.isLastComponent ? (\" \" + \"UFILastComponent\") : \"\"))) + ((this.props.isFeatured ? (\" \" + \"UFIFeaturedComment\") : \"\"))) + (((this.props.hasPartialBorder && !this.props.contextArgs.entstream) ? (\" \" + \"UFIPartialBorder\") : \"\"))))), fc = this.renderComment();\n            if (wb) {\n                if (this.props.contextArgs.snowliftredesign) {\n                    fc = q.DOM.div({\n                        className: \"_5cis\"\n                    }, q.DOM.div({\n                        className: \"_5cit\"\n                    }), fc);\n                }\n                 else if ((this.props.contextArgs.entstream && !this.props.isReply)) {\n                    fc = q.DOM.div({\n                        className: \"_52mp\"\n                    }, q.DOM.div({\n                        className: \"_52mq\"\n                    }), fc);\n                }\n                 else ec = fa(ec, u.UNSEEN_ITEM);\n                \n            \n            };\n            return (q.DOM.li({\n                className: ec,\n                \"data-ft\": this.props[\"data-ft\"]\n            }, fc));\n        },\n        renderComment: function() {\n            var kb = this.props, lb = kb.comment, mb = kb.feedback, nb = kb.authorProfiles[lb.author], ob = (lb.status === ha.SPAM_DISPLAY), pb = (lb.status === ha.LIVE_DELETED), qb = !((ob || pb)), rb = (mb.canremoveall || lb.hiddenbyviewer), sb = null, tb = null;\n            if (((!kb.isLocallyComposed && !this.state.wasHighlighted) && !lb.fromfetch)) {\n                tb = x.commentTruncationLength;\n                sb = x.commentTruncationMaxLines;\n            }\n        ;\n            var ub = s.getTrackingInfo(s.types.SMALL_ACTOR_PHOTO), vb = s.getTrackingInfo(s.types.USER_NAME), wb = s.getTrackingInfo(s.types.USER_MESSAGE), xb = null, yb = null;\n            if ((lb.istranslatable && ((lb.translatedtext === undefined)))) {\n                xb = q.DOM.a({\n                    href: \"#\",\n                    role: \"button\",\n                    title: \"Translate this comment\",\n                    className: ua,\n                    onClick: kb.onCommentTranslate\n                }, \"See Translation\");\n            };\n            if (lb.translatedtext) {\n                var zb = new ca(\"http://bing.com/translator\").addQueryData({\n                    text: lb.body.text\n                });\n                yb = q.DOM.span({\n                    className: va\n                }, lb.translatedtext, q.DOM.span({\n                    className: ya\n                }, \" (\", q.DOM.a({\n                    href: zb.toString(),\n                    className: za\n                }, \"Translated by Bing\"), \") \"));\n            }\n        ;\n            var ac;\n            if ((i.rtl && (lb.body.dir === \"ltr\"))) {\n                ac = \"rtl\";\n            }\n             else if ((!i.rtl && (lb.body.dir === \"rtl\"))) {\n                ac = \"ltr\";\n            }\n        ;\n            var bc = k.constructEndpointWithLocation(nb, \"ufi\").toString(), cc = q.DOM.a({\n                ref: \"AuthorName\",\n                className: la,\n                href: nb.uri,\n                \"data-hovercard\": bc,\n                \"data-ft\": vb,\n                dir: ac\n            }, nb.name), dc = function(ic, jc) {\n                return l(ic, jc, \"_blank\", mb.grouporeventid, \"ufi\");\n            }, ec = t({\n                className: ka,\n                interpolator: dc,\n                ranges: lb.body.ranges,\n                text: lb.body.text,\n                truncationPercent: x.commentTruncationPercent,\n                maxLength: tb,\n                maxLines: sb,\n                renderEmoticons: w.renderEmoticons,\n                renderEmoji: w.renderEmoji,\n                \"data-ft\": wb,\n                dir: lb.body.dir\n            }), fc;\n            if (lb.socialcontext) {\n                var gc = lb.socialcontext, hc = ib({\n                    topMutualFriend: kb.authorProfiles[gc.topmutualid],\n                    otherMutualCount: gc.othermutualcount,\n                    commentAuthor: nb\n                });\n                fc = [cc,hc,q.DOM.div(null, ec),];\n            }\n             else fc = [cc,\" \",ec,];\n        ;\n            return (y({\n                spacing: \"medium\"\n            }, q.DOM.a({\n                href: nb.uri,\n                \"data-hovercard\": bc,\n                \"data-ft\": ub\n            }, q.DOM.img({\n                src: nb.thumbSrc,\n                className: u.ACTOR_IMAGE,\n                alt: \"\"\n            })), q.DOM.div(null, q.DOM.div({\n                className: \"UFICommentContent\"\n            }, fc, xb, yb, v({\n                comment: kb.comment\n            })), gb({\n                comment: lb,\n                feedback: mb,\n                onBlingBoxClick: kb.onBlingBoxClick,\n                onCommentLikeToggle: kb.onCommentLikeToggle,\n                onCommentReply: kb.onCommentReply,\n                onPreviewRemove: kb.onPreviewRemove,\n                onRetrySubmit: kb.onRetrySubmit,\n                onMarkAsNotSpam: this._onMarkAsNotSpam,\n                viewerCanMarkNotSpam: rb,\n                viewas: kb.contextArgs.viewas,\n                showPermalink: kb.showPermalink,\n                showReplyLink: kb.showReplyLink,\n                showReplies: kb.showReplies,\n                contextArgs: kb.contextArgs,\n                markedAsSpamHere: this.state.markedAsSpamHere,\n                hideAsSpamForPageAdmin: kb.hideAsSpamForPageAdmin\n            })), (qb ? this._renderCloseButton() : null)));\n        }\n    });\n    e.exports = jb;\n});\n__d(\"UFIContainer.react\", [\"React\",\"TrackingNodes\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"React\"), h = b(\"TrackingNodes\"), i = b(\"cx\"), j = g.createClass({\n        displayName: \"UFIContainer\",\n        render: function() {\n            var k = null;\n            if (this.props.hasNub) {\n                k = g.DOM.li({\n                    className: \"UFIArrow\"\n                }, g.DOM.i(null));\n            };\n            var l = (((((((((!this.props.isReplyList ? \"UFIList\" : \"\")) + ((this.props.isReplyList ? (\" \" + \"UFIReplyList\") : \"\"))) + ((this.props.isParentLiveDeleted ? (\" \" + \"UFITranslucentReplyList\") : \"\"))) + ((this.props.isFirstCommentComponent ? (\" \" + \"UFIFirstCommentComponent\") : \"\"))) + ((this.props.isLastCommentComponent ? (\" \" + \"UFILastCommentComponent\") : \"\"))) + ((this.props.isFirstComponent ? (\" \" + \"UFIFirstComponent\") : \"\"))) + ((this.props.isLastComponent ? (\" \" + \"UFILastComponent\") : \"\"))));\n            return (g.DOM.ul({\n                className: l,\n                \"data-ft\": h.getTrackingInfo(h.types.UFI)\n            }, k, this.props.children));\n        }\n    });\n    e.exports = j;\n});\n__d(\"GiftOpportunityLogger\", [\"AsyncRequest\",\"Event\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = b(\"Event\"), i = {\n        init: function(k, l, m) {\n            var n = false;\n            h.listen(k, \"click\", function(o) {\n                if (n) {\n                    return true\n                };\n                n = true;\n                i.send(l, m);\n            });\n        },\n        send: function(k, l) {\n            if (j[k.opportunity_id]) {\n                return\n            };\n            j[k.opportunity_id] = true;\n            return new g().setURI(\"/ajax/gifts/log/opportunity\").setData({\n                data: k,\n                entry_point: l\n            }).send();\n        }\n    }, j = {\n    };\n    e.exports = i;\n});\n__d(\"InlineBlock.react\", [\"ReactProps\",\"React\",\"cx\",\"joinClasses\",], function(a, b, c, d, e, f) {\n    var g = b(\"ReactProps\"), h = b(\"React\"), i = b(\"cx\"), j = b(\"joinClasses\"), k = {\n        baseline: null,\n        bottom: \"_6d\",\n        middle: \"_6b\",\n        top: \"_6e\"\n    }, l = h.createClass({\n        displayName: \"InlineBlock\",\n        props: {\n            alignv: g.oneOf([\"baseline\",\"bottom\",\"middle\",\"top\",]),\n            height: g.number\n        },\n        getDefaultProps: function() {\n            return {\n                alignv: \"baseline\"\n            };\n        },\n        render: function() {\n            var m = k[this.props.alignv], n = h.DOM.div({\n                className: j(\"_6a\", m)\n            }, this.props.children);\n            if ((this.props.height != null)) {\n                var o = h.DOM.div({\n                    className: j(\"_6a\", m),\n                    style: {\n                        height: (this.props.height + \"px\")\n                    }\n                });\n                n = h.DOM.div({\n                    className: \"_6a\",\n                    height: null\n                }, o, n);\n            }\n        ;\n            return this.transferPropsTo(n);\n        }\n    });\n    e.exports = l;\n});\n__d(\"Image.react\", [\"React\",\"invariant\",\"joinClasses\",], function(a, b, c, d, e, f) {\n    var g = b(\"React\"), h = b(\"invariant\"), i = b(\"joinClasses\"), j = g.createClass({\n        displayName: \"ReactImage\",\n        props: {\n            src: function(k, l, m) {\n                var n = k[l];\n                h(((typeof n === \"string\") || (((typeof n === \"object\") && (((((n.sprited && n.spriteMapCssClass) && n.spriteCssClass)) || ((!n.sprited && n.uri))))))));\n            }\n        },\n        render: function() {\n            var k, l, m = this.props.src, n = \"img\";\n            l = true;\n            if ((typeof m === \"string\")) {\n                k = g.DOM.img({\n                    className: n,\n                    src: m\n                });\n            }\n             else if (m.sprited) {\n                n = i(n, m.spriteMapCssClass, m.spriteCssClass);\n                k = g.DOM.i({\n                    className: n,\n                    src: null\n                });\n                l = false;\n            }\n             else {\n                k = g.DOM.img({\n                    className: n,\n                    src: m.uri\n                });\n                if (((typeof this.props.width === \"undefined\") && (typeof this.props.height === \"undefined\"))) {\n                    k.props.width = m.width;\n                    k.props.height = m.height;\n                }\n            ;\n            }\n            \n        ;\n            if (this.props.alt) {\n                if (l) {\n                    k.props.alt = this.props.alt;\n                }\n                 else k.props.children = g.DOM.u(null, this.props.alt);\n            \n            };\n            return this.transferPropsTo(k);\n        }\n    });\n    e.exports = j;\n});\n__d(\"UFIGiftSentence.react\", [\"AsyncRequest\",\"CloseButton.react\",\"GiftOpportunityLogger\",\"ImageBlock.react\",\"InlineBlock.react\",\"LeftRight.react\",\"Link.react\",\"React\",\"Image.react\",\"UFIClassNames\",\"UFIImageBlock.react\",\"URI\",\"DOM\",\"ix\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = b(\"CloseButton.react\"), i = b(\"GiftOpportunityLogger\"), j = b(\"ImageBlock.react\"), k = b(\"InlineBlock.react\"), l = b(\"LeftRight.react\"), m = b(\"Link.react\"), n = b(\"React\"), o = b(\"Image.react\"), p = b(\"UFIClassNames\"), q = b(\"UFIImageBlock.react\"), r = b(\"URI\"), s = b(\"DOM\"), t = b(\"ix\"), u = b(\"tx\"), v = n.createClass({\n        displayName: \"UFIGiftSentence\",\n        _entry_point: \"detected_gift_worthy_story_inline\",\n        render: function() {\n            var w = this.props.recipient, x = this.props.giftdata, y = (x ? x.giftproductid : null), z = this._getURI(y).toString();\n            this._log();\n            return (n.DOM.li({\n                className: p.ROW,\n                ref: \"UFIGiftSentence\"\n            }, l({\n                direction: \"right\"\n            }, (x ? this._renderGiftSuggestion(z, w, x) : this._renderGiftLink(z, w)), h({\n                size: \"small\",\n                onClick: function() {\n                    var aa = this.refs.UFIGiftSentence.getDOMNode();\n                    s.remove(aa);\n                    this._requestClose();\n                }.bind(this)\n            }))));\n        },\n        _renderGiftSuggestion: function(w, x, y) {\n            return (q(null, o({\n                src: t(\"/images/group_gifts/icons/gift_icon_red-13px.png\"),\n                alt: \"invite\"\n            }), n.DOM.div(null, n.DOM.span({\n                className: \"fwb\"\n            }, u._(\"Surprise {name} with a gift\", {\n                name: x.firstName\n            })), j({\n                spacing: \"medium\",\n                className: \"mvs\"\n            }, m({\n                className: \"fwb\",\n                rel: \"async-post\",\n                ajaxify: w,\n                href: {\n                    url: \"#\"\n                }\n            }, o({\n                className: \"UFIGiftProductImg\",\n                src: y.giftproductimgsrc,\n                alt: \"product image\"\n            })), k({\n                alignv: \"middle\",\n                height: 79\n            }, n.DOM.p({\n                className: \"mvs\"\n            }, m({\n                className: \"fwb\",\n                rel: \"async-post\",\n                ajaxify: w,\n                href: {\n                    url: \"#\"\n                }\n            }, y.giftproductname)), n.DOM.p({\n                className: \"mvs fcg\"\n            }, y.giftproductpricerange), n.DOM.p({\n                className: \"mvs\"\n            }, m({\n                rel: \"async-post\",\n                ajaxify: w,\n                href: {\n                    url: \"#\"\n                }\n            }, \"Give This Gift\"), \" \\u00b7 \", m({\n                rel: \"async-post\",\n                ajaxify: this._getURI().toString(),\n                href: {\n                    url: \"#\"\n                }\n            }, \"See All Gifts\")))))));\n        },\n        _renderGiftLink: function(w, x) {\n            return (q(null, m({\n                className: \"UFIGiftIcon\",\n                tabIndex: \"-1\",\n                href: {\n                    url: \"#\"\n                },\n                rel: \"async-post\",\n                ajaxify: w\n            }, o({\n                src: t(\"/images/group_gifts/icons/gift_icon_red-13px.png\"),\n                alt: \"invite\"\n            })), m({\n                rel: \"async-post\",\n                href: {\n                    url: \"#\"\n                },\n                ajaxify: w\n            }, u._(\"Surprise {name} with a gift\", {\n                name: x.firstName\n            }))));\n        },\n        _log: function() {\n            var w = this.props.giftdata, x = {\n                opportunity_id: this.props.contextArgs.ftentidentifier,\n                sender_id: this.props.sender.id,\n                recipient_id: this.props.recipient.id,\n                link_description: \"UFIGiftSentence\",\n                product_id: (w ? w.giftproductid : null),\n                custom: {\n                    gift_occasion: this.props.contextArgs.giftoccasion,\n                    ftentidentifier: this.props.contextArgs.ftentidentifier\n                }\n            };\n            i.send([x,], this._entry_point);\n        },\n        _getURI: function(w) {\n            return r(\"/ajax/gifts/send\").addQueryData({\n                gift_occasion: this.props.contextArgs.giftoccasion,\n                recipient_id: this.props.recipient.id,\n                entry_point: this._entry_point,\n                product_id: w\n            });\n        },\n        _requestClose: function() {\n            var w = r(\"/ajax/gifts/moments/close/\");\n            new g().setMethod(\"POST\").setReadOnly(false).setURI(w).setData({\n                action: \"hide\",\n                data: JSON.stringify({\n                    type: \"detected_moment\",\n                    friend_id: this.props.recipient.id,\n                    ftentidentifier: this.props.contextArgs.ftentidentifier\n                })\n            }).send();\n        }\n    });\n    e.exports = v;\n});\n__d(\"UFILikeSentenceText.react\", [\"HovercardLinkInterpolator\",\"ProfileBrowserLink\",\"ProfileBrowserTypes\",\"React\",\"TextWithEntities.react\",\"URI\",], function(a, b, c, d, e, f) {\n    var g = b(\"HovercardLinkInterpolator\"), h = b(\"ProfileBrowserLink\"), i = b(\"ProfileBrowserTypes\"), j = b(\"React\"), k = b(\"TextWithEntities.react\"), l = b(\"URI\");\n    function m(p, q, r, s) {\n        if ((s.count != null)) {\n            var t = i.LIKES, u = {\n                id: p.targetfbid\n            };\n            return (j.DOM.a({\n                href: h.constructPageURI(t, u).toString(),\n                target: \"_blank\"\n            }, r));\n        }\n         else return g(r, s, \"_blank\", null, \"ufi\")\n    ;\n    };\n    function n(p, q, r, s) {\n        if ((s.count != null)) {\n            var t = i.LIKES, u = {\n                id: p.targetfbid\n            }, v = [];\n            for (var w = 0; (w < q.length); w++) {\n                if (!q[w].count) {\n                    v.push(q[w].entities[0].id);\n                };\n            };\n            var x = new l(\"/ajax/like/tooltip.php\").setQueryData({\n                comment_fbid: p.targetfbid,\n                comment_from: p.actorforpost,\n                seen_user_fbids: (v.length ? v : true)\n            });\n            return (j.DOM.a({\n                rel: \"dialog\",\n                ajaxify: h.constructDialogURI(t, u).toString(),\n                href: h.constructPageURI(t, u).toString(),\n                \"data-hover\": \"tooltip\",\n                \"data-tooltip-alignh\": \"center\",\n                \"data-tooltip-uri\": x.toString()\n            }, r));\n        }\n         else return g(r, s, null, null, \"ufi\")\n    ;\n    };\n    var o = j.createClass({\n        displayName: \"UFILikeSentenceText\",\n        render: function() {\n            var p = this.props.feedback, q = this.props.likeSentenceData, r;\n            if (this.props.contextArgs.embedded) {\n                r = m;\n            }\n             else r = n;\n        ;\n            r = r.bind(null, p, q.ranges);\n            return (k({\n                interpolator: r,\n                ranges: q.ranges,\n                aggregatedRanges: q.aggregatedranges,\n                text: q.text\n            }));\n        }\n    });\n    e.exports = o;\n});\n__d(\"UFILikeSentence.react\", [\"Bootloader\",\"LeftRight.react\",\"ProfileBrowserLink\",\"ProfileBrowserTypes\",\"React\",\"UFIClassNames\",\"UFIImageBlock.react\",\"UFILikeSentenceText.react\",\"URI\",\"cx\",\"joinClasses\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Bootloader\"), h = b(\"LeftRight.react\"), i = b(\"ProfileBrowserLink\"), j = b(\"ProfileBrowserTypes\"), k = b(\"React\"), l = b(\"UFIClassNames\"), m = b(\"UFIImageBlock.react\"), n = b(\"UFILikeSentenceText.react\"), o = b(\"URI\"), p = b(\"cx\"), q = b(\"joinClasses\"), r = b(\"tx\"), s = k.createClass({\n        displayName: \"UFILikeSentence\",\n        getInitialState: function() {\n            return {\n                selectorModule: null,\n                bootloadedSelectorModule: false\n            };\n        },\n        componentWillMount: function() {\n            this._bootloadSelectorModule(this.props);\n        },\n        componentWillReceiveProps: function(t) {\n            this._bootloadSelectorModule(t);\n        },\n        _bootloadSelectorModule: function(t) {\n            if ((t.showOrderingModeSelector && !this.state.bootloadedSelectorModule)) {\n                var u = function(v) {\n                    this.setState({\n                        selectorModule: v\n                    });\n                }.bind(this);\n                if (t.contextArgs.entstream) {\n                    g.loadModules([\"UFIEntStreamOrderingModeSelector.react\",], u);\n                }\n                 else g.loadModules([\"UFIOrderingModeSelector.react\",], u);\n            ;\n                this.setState({\n                    bootloadedSelectorModule: true\n                });\n            }\n        ;\n        },\n        render: function() {\n            var t = this.props.feedback, u = t.likesentences.current, v = this.props.contextArgs.entstream, w = q(l.ROW, (t.likesentences.isunseen ? l.UNSEEN_ITEM : \"\"), ((((\"UFILikeSentence\") + ((this.props.isFirstComponent ? (\" \" + \"UFIFirstComponent\") : \"\"))) + ((this.props.isLastComponent ? (\" \" + \"UFILastComponent\") : \"\"))))), x = null, y = null;\n            if (u.text) {\n                y = k.DOM.div({\n                    className: \"UFILikeSentenceText\"\n                }, n({\n                    contextArgs: this.props.contextArgs,\n                    feedback: t,\n                    likeSentenceData: u\n                }));\n            };\n            if ((y && !v)) {\n                x = k.DOM.i({\n                    className: \"UFILikeIcon\"\n                });\n                if ((t.viewercanlike && !t.hasviewerliked)) {\n                    x = k.DOM.a({\n                        className: \"UFILikeThumb\",\n                        href: \"#\",\n                        tabIndex: \"-1\",\n                        title: \"Like this\",\n                        onClick: this.props.onTargetLikeToggle\n                    }, x);\n                };\n            }\n        ;\n            var z = y, aa = null;\n            if (((t.seencount > 0) && !v)) {\n                var ba = j.GROUP_MESSAGE_VIEWERS, ca = {\n                    id: t.targetfbid\n                }, da = i.constructDialogURI(ba, ca), ea = i.constructPageURI(ba, ca), fa = new o(\"/ajax/ufi/seen_tooltip.php\").setQueryData({\n                    ft_ent_identifier: t.entidentifier,\n                    displayed_count: t.seencount\n                }), ga;\n                if (t.seenbyall) {\n                    ga = \"Seen by everyone\";\n                }\n                 else ga = ((t.seencount == 1) ? \"Seen by 1\" : r._(\"Seen by {count}\", {\n                    count: t.seencount\n                }));\n            ;\n                aa = k.DOM.a({\n                    rel: \"dialog\",\n                    ajaxify: da.toString(),\n                    href: ea.toString(),\n                    tabindex: \"-1\",\n                    \"data-hover\": \"tooltip\",\n                    \"data-tooltip-alignh\": \"left\",\n                    \"data-tooltip-uri\": fa.toString(),\n                    className: (((\"UFISeenCount\") + ((!!u.text ? (\" \" + \"UFISeenCountRight\") : \"\"))))\n                }, k.DOM.span({\n                    className: \"UFISeenCountIcon\"\n                }), ga);\n            }\n             else if ((this.props.showOrderingModeSelector && this.state.selectorModule)) {\n                var ha = this.state.selectorModule;\n                aa = ha({\n                    currentOrderingMode: this.props.orderingMode,\n                    entstream: v,\n                    orderingmodes: t.orderingmodes,\n                    onOrderChanged: this.props.onOrderingModeChange\n                });\n                if (!z) {\n                    z = k.DOM.div(null);\n                };\n            }\n            \n        ;\n            var ia = null;\n            if ((x && y)) {\n                ia = m(null, x, y, aa);\n            }\n             else if (z) {\n                ia = h(null, z, aa);\n            }\n             else ia = aa;\n            \n        ;\n            return (k.DOM.li({\n                className: w\n            }, ia));\n        }\n    });\n    e.exports = s;\n});\n__d(\"UFIPager.react\", [\"LeftRight.react\",\"React\",\"UFIClassNames\",\"UFIImageBlock.react\",\"cx\",\"joinClasses\",], function(a, b, c, d, e, f) {\n    var g = b(\"LeftRight.react\"), h = b(\"React\"), i = b(\"UFIClassNames\"), j = b(\"UFIImageBlock.react\"), k = b(\"cx\"), l = b(\"joinClasses\"), m = h.createClass({\n        displayName: \"UFIPager\",\n        onPagerClick: function(n) {\n            ((!this.props.isLoading && this.props.onPagerClick) && this.props.onPagerClick());\n            n.nativeEvent.prevent();\n        },\n        render: function() {\n            var n = this.onPagerClick, o = ((this.props.isLoading ? \"ufiPagerLoading\" : \"\")), p = l(i.ROW, (this.props.isUnseen ? i.UNSEEN_ITEM : \"\"), ((((((\"UFIPagerRow\") + ((this.props.isFirstCommentComponent ? (\" \" + \"UFIFirstCommentComponent\") : \"\"))) + ((this.props.isLastCommentComponent ? (\" \" + \"UFILastCommentComponent\") : \"\"))) + ((this.props.isFirstComponent ? (\" \" + \"UFIFirstComponent\") : \"\"))) + ((this.props.isLastComponent ? (\" \" + \"UFILastComponent\") : \"\"))))), q = h.DOM.a({\n                className: \"UFIPagerLink\",\n                onClick: n,\n                href: \"#\",\n                role: \"button\"\n            }, h.DOM.span({\n                className: o\n            }, this.props.pagerLabel)), r = (((\"fcg\") + ((\" \" + \"UFIPagerCount\")))), s = h.DOM.span({\n                className: r\n            }, this.props.countSentence), t;\n            if (this.props.contextArgs.entstream) {\n                t = (g({\n                    direction: g.DIRECTION.right\n                }, q, s));\n            }\n             else t = (j(null, h.DOM.a({\n                className: \"UFIPagerIcon\",\n                onClick: n,\n                href: \"#\",\n                role: \"button\"\n            }), q, s));\n        ;\n            return (h.DOM.li({\n                className: p,\n                \"data-ft\": this.props[\"data-ft\"]\n            }, t));\n        }\n    });\n    e.exports = m;\n});\n__d(\"UFIReplySocialSentence.react\", [\"LiveTimer\",\"React\",\"Timestamp.react\",\"UFIClassNames\",\"UFIConstants\",\"UFIImageBlock.react\",\"cx\",\"joinClasses\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"LiveTimer\"), h = b(\"React\"), i = b(\"Timestamp.react\"), j = b(\"UFIClassNames\"), k = b(\"UFIConstants\"), l = b(\"UFIImageBlock.react\"), m = b(\"cx\"), n = b(\"joinClasses\"), o = b(\"tx\"), p = \" \\u00b7 \", q = 43200, r = h.createClass({\n        displayName: \"UFIReplySocialSentence\",\n        render: function() {\n            var s = ((this.props.isLoading ? \"UFIReplySocialSentenceLoading\" : \"\")), t = n(j.ROW, ((((\"UFIReplySocialSentenceRow\") + ((this.props.isFirstComponent ? (\" \" + \"UFIFirstComponent\") : \"\"))) + ((this.props.isLastComponent ? (\" \" + \"UFILastComponent\") : \"\"))))), u, v;\n            if (this.props.isExpanded) {\n                u = ((this.props.replies > 1) ? o._(\"Hide {count} Replies\", {\n                    count: this.props.replies\n                }) : \"Hide 1 Reply\");\n            }\n             else {\n                u = ((this.props.replies > 1) ? o._(\"{count} Replies\", {\n                    count: this.props.replies\n                }) : \"1 Reply\");\n                if (this.props.timestamp) {\n                    var w = ((g.getApproximateServerTime() / 1000) - this.props.timestamp.time);\n                    if (((w < q) || (this.props.orderingMode == k.UFICommentOrderingMode.RECENT_ACTIVITY))) {\n                        v = h.DOM.span({\n                            className: \"fcg\"\n                        }, p, i({\n                            time: this.props.timestamp.time,\n                            text: this.props.timestamp.text,\n                            verbose: this.props.timestamp.verbose\n                        }));\n                    };\n                }\n            ;\n            }\n        ;\n            var x = Object.keys(this.props.authors), y = (x.length && !this.props.isExpanded), z, aa;\n            if (y) {\n                var ba = this.props.authors[x[0]];\n                z = h.DOM.img({\n                    alt: \"\",\n                    src: ba.thumbSrc,\n                    className: j.ACTOR_IMAGE\n                });\n                aa = [o._(\"{author} replied\", {\n                    author: ba.name\n                }),p,u,];\n            }\n             else {\n                z = h.DOM.i({\n                    className: ((((!this.props.isExpanded ? \"UFIPagerIcon\" : \"\")) + ((this.props.isExpanded ? (\" \" + \"UFICollapseIcon\") : \"\"))))\n                });\n                aa = u;\n            }\n        ;\n            return (h.DOM.li({\n                className: t,\n                \"data-ft\": this.props[\"data-ft\"]\n            }, h.DOM.a({\n                className: \"UFICommentLink\",\n                onClick: this.props.onClick,\n                href: \"#\",\n                role: \"button\"\n            }, l(null, h.DOM.div({\n                className: ((y ? \"UFIReplyActorPhotoWrapper\" : \"\"))\n            }, z), h.DOM.span({\n                className: s\n            }, h.DOM.span({\n                className: \"UFIReplySocialSentenceLinkText\"\n            }, aa), v)))));\n        }\n    });\n    e.exports = r;\n});\n__d(\"UFIShareRow.react\", [\"NumberFormat\",\"React\",\"UFIClassNames\",\"UFIImageBlock.react\",\"URI\",\"cx\",\"joinClasses\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"NumberFormat\"), h = b(\"React\"), i = b(\"UFIClassNames\"), j = b(\"UFIImageBlock.react\"), k = b(\"URI\"), l = b(\"cx\"), m = b(\"joinClasses\"), n = b(\"tx\"), o = h.createClass({\n        displayName: \"UFIShareRow\",\n        render: function() {\n            var p = new k(\"/ajax/shares/view\").setQueryData({\n                target_fbid: this.props.targetID\n            }), q = new k(\"/shares/view\").setSubdomain(\"www\").setQueryData({\n                id: this.props.targetID\n            }), r;\n            if ((this.props.shareCount > 1)) {\n                var s = g.formatIntegerWithDelimiter(this.props.shareCount, (this.props.contextArgs.numberdelimiter || \",\"));\n                r = n._(\"{count} shares\", {\n                    count: s\n                });\n            }\n             else r = \"1 share\";\n        ;\n            var t = m(i.ROW, ((((this.props.isFirstComponent ? \"UFIFirstComponent\" : \"\")) + ((this.props.isLastComponent ? (\" \" + \"UFILastComponent\") : \"\")))));\n            return (h.DOM.li({\n                className: t\n            }, j(null, h.DOM.a({\n                className: \"UFIShareIcon\",\n                rel: \"dialog\",\n                ajaxify: p.toString(),\n                href: q.toString()\n            }), h.DOM.a({\n                className: \"UFIShareLink\",\n                rel: \"dialog\",\n                ajaxify: p.toString(),\n                href: q.toString()\n            }, r))));\n        }\n    });\n    e.exports = o;\n});\n__d(\"UFISpamPlaceholder.react\", [\"React\",\"UFIClassNames\",\"cx\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"React\"), h = b(\"UFIClassNames\"), i = b(\"cx\"), j = b(\"tx\"), k = g.createClass({\n        displayName: \"UFISpamPlaceholder\",\n        render: function() {\n            var l = (((\"UFISpamCommentWrapper\") + ((this.props.isLoading ? (\" \" + \"UFISpamCommentLoading\") : \"\"))));\n            return (g.DOM.li({\n                className: h.ROW\n            }, g.DOM.a({\n                href: \"#\",\n                role: \"button\",\n                className: \"UFISpamCommentLink\",\n                onClick: this.props.onClick\n            }, g.DOM.span({\n                \"data-hover\": \"tooltip\",\n                \"data-tooltip-alignh\": \"center\",\n                \"aria-label\": j._(\"{count} hidden\", {\n                    count: this.props.numHidden\n                }),\n                className: l\n            }, g.DOM.i({\n                className: \"placeholderIcon\"\n            })))));\n        }\n    });\n    e.exports = k;\n});\n__d(\"UFI.react\", [\"NumberFormat\",\"React\",\"LegacyScrollableArea.react\",\"TrackingNodes\",\"UFIAddCommentController\",\"UFIAddCommentLink.react\",\"UFIComment.react\",\"UFIConstants\",\"UFIContainer.react\",\"UFIGiftSentence.react\",\"UFIInstanceState\",\"UFILikeSentence.react\",\"UFIPager.react\",\"UFIReplySocialSentence.react\",\"UFIShareRow.react\",\"UFISpamPlaceholder.react\",\"copyProperties\",\"isEmpty\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"NumberFormat\"), h = b(\"React\"), i = b(\"LegacyScrollableArea.react\"), j = b(\"TrackingNodes\"), k = b(\"UFIAddCommentController\"), l = b(\"UFIAddCommentLink.react\"), m = b(\"UFIComment.react\"), n = b(\"UFIConstants\"), o = b(\"UFIContainer.react\"), p = b(\"UFIGiftSentence.react\"), q = b(\"UFIInstanceState\"), r = b(\"UFILikeSentence.react\"), s = b(\"UFIPager.react\"), t = b(\"UFIReplySocialSentence.react\"), u = b(\"UFIShareRow.react\"), v = b(\"UFISpamPlaceholder.react\"), w = b(\"copyProperties\"), x = b(\"isEmpty\"), y = b(\"tx\"), z = h.createClass({\n        displayName: \"UFI\",\n        getInitialState: function() {\n            return {\n                requestRanges: w({\n                }, this.props.availableRanges),\n                instanceShowRepliesMap: {\n                },\n                instanceShowReplySocialSentenceMap: {\n                },\n                loadingSpamIDs: {\n                },\n                isActiveLoading: false,\n                hasPagedToplevel: false\n            };\n        },\n        componentWillReceiveProps: function(aa) {\n            if (this.state.isActiveLoading) {\n                var ba = this.props.availableRanges[this.props.id], ca = aa.availableRanges[this.props.id];\n                if (((ba.offset != ca.offset) || (ba.length != ca.length))) {\n                    var da = (((ca.offset < ba.offset)) ? 0 : ba.length);\n                    if ((da < aa.availableComments.length)) {\n                        var ea = aa.availableComments[da].ufiinstanceid;\n                        q.updateState(ea, \"autofocus\", true);\n                    }\n                ;\n                }\n            ;\n                this.setState({\n                    isActiveLoading: false\n                });\n            }\n        ;\n            if ((aa.orderingMode != this.props.orderingMode)) {\n                this.setState({\n                    requestRanges: w({\n                    }, aa.availableRanges)\n                });\n            };\n        },\n        render: function() {\n            var aa = this.props, ba = aa.feedback, ca = aa.contextArgs, da = (aa.source != n.UFIFeedbackSourceType.ADS), ea = (ba.orderingmodes && (aa.commentCounts[aa.id] >= n.minCommentsForOrderingModeSelector)), fa = ((((!x(ba.likesentences.current) || (((ba.seencount > 0) && !ca.entstream))) || ea)) && da), ga = null;\n            if (fa) {\n                ga = r({\n                    contextArgs: ca,\n                    feedback: ba,\n                    onTargetLikeToggle: aa.onTargetLikeToggle,\n                    onOrderingModeChange: aa.onOrderingModeChange,\n                    orderingMode: aa.orderingMode,\n                    showOrderingModeSelector: ea\n                });\n            };\n            var ha = null;\n            if ((aa.feedback.hasviewerliked && this._shouldShowGiftSentence())) {\n                ha = p({\n                    contextArgs: ca,\n                    recipient: aa.giftRecipient,\n                    sender: aa.authorProfiles[ba.actorforpost],\n                    giftdata: aa.feedback.giftdata\n                });\n            };\n            var ia = ((aa.availableComments && aa.availableComments.length) && da), ja = null;\n            if (ia) {\n                ja = this.renderCommentMap(aa.availableComments, aa.availableRanges[aa.id].offset);\n            };\n            var ka = null, la = ba.cancomment, ma = ((la && ca.showaddcomment) && ba.actorforpost);\n            if (ma) {\n                var na = new k(null, aa.id, null, ca), oa = aa.authorProfiles[ba.actorforpost];\n                ka = na.renderAddComment(oa, ba.mentionsdatasource, ba.showsendonentertip, \"toplevelcomposer\", null, ba.allowphotoattachments, ba.subtitle);\n            }\n        ;\n            var pa = null, qa = ((ca.showshares && ba.sharecount) && da);\n            if ((qa && !ca.entstream)) {\n                pa = u({\n                    targetID: ba.targetfbid,\n                    shareCount: ba.sharecount,\n                    contextArgs: ca\n                });\n            };\n            var ra = (((fa || qa) || ia) || la), sa = this.renderPagers();\n            this.applyToUFIComponents([sa.topPager,], ja, [sa.bottomPager,], {\n                isFirstCommentComponent: true\n            }, {\n                isLastCommentComponent: true\n            });\n            var ta = (ba.commentboxhoisted ? ka : null), ua = (ba.commentboxhoisted ? null : ka), va = null;\n            if (((ma && ba.hasaddcommentlink) && this.state.hasPagedToplevel)) {\n                va = l({\n                    onClick: this.onComment\n                });\n            };\n            this.applyToUFIComponents([ga,pa,ta,sa.topPager,], ja, [sa.bottomPager,ua,va,], {\n                isFirstComponent: true\n            }, {\n                isLastComponent: true\n            });\n            var wa = [sa.topPager,ja,sa.bottomPager,];\n            if ((ca.scrollcomments && ca.scrollwidth)) {\n                wa = h.DOM.li(null, i({\n                    width: ca.scrollwidth\n                }, h.DOM.ul(null, wa)));\n            };\n            return (o({\n                hasNub: (ca.shownub && ra)\n            }, ga, ha, pa, ta, wa, ua, va));\n        },\n        applyToUFIComponents: function(aa, ba, ca, da, ea) {\n            var fa = Object.keys((ba || {\n            })).map(function(ha) {\n                return ba[ha];\n            }), ga = [].concat(aa, fa, ca);\n            this._applyToFirstComponent(ga, da);\n            ga.reverse();\n            this._applyToFirstComponent(ga, ea);\n        },\n        _applyToFirstComponent: function(aa, ba) {\n            for (var ca = 0; (ca < ((aa || [])).length); ca++) {\n                if (aa[ca]) {\n                    w(aa[ca].props, ba);\n                    return;\n                }\n            ;\n            };\n        },\n        renderCommentMap: function(aa, ba) {\n            var ca = this.props, da = {\n            }, ea = aa.length;\n            if (!ea) {\n                return da\n            };\n            var fa = aa[0].parentcommentid, ga = [], ha = function() {\n                if ((ga.length > 0)) {\n                    var qa = function(ra, sa) {\n                        this.state.loadingSpamIDs[ra[0]] = true;\n                        this.forceUpdate();\n                        ca.onSpamFetch(ra, sa);\n                    }.bind(this, ga, fa);\n                    da[(\"spam\" + ga[0])] = v({\n                        onClick: qa,\n                        numHidden: ga.length,\n                        isLoading: !!this.state.loadingSpamIDs[ga[0]]\n                    });\n                    ga = [];\n                }\n            ;\n            }.bind(this), ia = ca.instanceid, ja = q.getKeyForInstance(ia, \"editcommentid\"), ka = !!aa[0].parentcommentid, la = false;\n            for (var ma = 0; (ma < ea); ma++) {\n                if ((aa[ma].status == n.UFIStatus.SPAM)) {\n                    ga.push(aa[ma].id);\n                }\n                 else {\n                    ha();\n                    var na = Math.max(((ca.loggingOffset - ma) - ba), 0), oa = aa[ma], pa;\n                    if ((oa.id == ja)) {\n                        pa = this.renderEditCommentBox(oa);\n                    }\n                     else {\n                        pa = this.renderComment(oa, na);\n                        pa.props.isFirst = (ma === 0);\n                        pa.props.isLast = (ma === (ea - 1));\n                        if (!ka) {\n                            pa.props.showReplyLink = true;\n                        };\n                    }\n                ;\n                    da[(\"comment\" + oa.id)] = pa;\n                    if (((((ca.feedback.actorforpost === oa.author) && !la) && !ca.feedback.hasviewerliked) && this._shouldShowGiftSentence())) {\n                        da[(\"gift\" + oa.id)] = p({\n                            contextArgs: ca.contextArgs,\n                            recipient: ca.giftRecipient,\n                            sender: ca.authorProfiles[ca.feedback.actorforpost],\n                            giftdata: ca.feedback.giftdata\n                        });\n                        la = true;\n                    }\n                ;\n                    if ((oa.status !== n.UFIStatus.DELETED)) {\n                        da[(\"replies\" + oa.id)] = this.renderReplyContainer(oa);\n                    };\n                }\n            ;\n            };\n            ha();\n            return da;\n        },\n        _shouldShowGiftSentence: function() {\n            var aa = this.props;\n            return (aa.contextArgs.giftoccasion && !aa.contextArgs.entstream);\n        },\n        renderReplyContainer: function(aa) {\n            var ba = this.props, ca = {\n            };\n            for (var da = 0; (da < ((aa.replyauthors || [])).length); da++) {\n                var ea = ba.authorProfiles[aa.replyauthors[da]];\n                if (ea) {\n                    ca[ea.id] = ea;\n                };\n            };\n            var fa = ((ba.repliesMap && ba.repliesMap[aa.id]) && this._shouldShowCommentReplies(aa.id)), ga, ha = Math.max((aa.replycount - aa.spamreplycount), 0);\n            if ((ha && this._shouldShowReplySocialSentence(aa.id))) {\n                var ia = (this._shouldShowCommentReplies(aa.id) && ((this.isLoadingPrev(aa.id) || this.isLoadingNext(aa.id))));\n                ga = t({\n                    authors: ca,\n                    replies: ha,\n                    timestamp: aa.recentreplytimestamp,\n                    onClick: this.onToggleReplies.bind(this, aa),\n                    isLoading: ia,\n                    isExpanded: fa,\n                    orderingMode: this.props.orderingMode\n                });\n            }\n        ;\n            var ja, ka, la, ma;\n            if (fa) {\n                var na = this.renderPagers(aa.id);\n                ja = na.topPager;\n                la = na.bottomPager;\n                ka = this.renderCommentMap(ba.repliesMap[aa.id], ba.availableRanges[aa.id].offset);\n                var oa = Object.keys(ka);\n                for (var pa = 0; (pa < oa.length); pa++) {\n                    var qa = ka[oa[pa]];\n                    if (qa) {\n                        qa.props.hasPartialBorder = (pa !== 0);\n                    };\n                };\n                if (ba.feedback.cancomment) {\n                    var ra = false, sa = Object.keys(ka);\n                    for (var da = (sa.length - 1); (da >= 0); da--) {\n                        var ta = sa[da];\n                        if ((ta && ka[ta])) {\n                            ra = ka[ta].props.isAuthorReply;\n                            break;\n                        }\n                    ;\n                    };\n                    ma = this.renderReplyComposer(aa, !ra);\n                }\n            ;\n            }\n        ;\n            var ua;\n            if (((((ga || ja) || ka) || la) || ma)) {\n                this.applyToUFIComponents([ga,ja,], ka, [la,ma,], {\n                    isFirstComponent: true\n                }, {\n                    isLastComponent: true\n                });\n                var va = (aa.status === n.UFIStatus.LIVE_DELETED);\n                ua = o({\n                    isParentLiveDeleted: va,\n                    isReplyList: true\n                }, ga, ja, ka, la, ma);\n            }\n        ;\n            return ua;\n        },\n        renderReplyComposer: function(aa, ba) {\n            var ca = this.props;\n            return (new k(null, ca.id, aa.id, ca.contextArgs)).renderAddComment(ca.authorProfiles[ca.feedback.actorforpost], ca.feedback.mentionsdatasource, false, (\"replycomposer-\" + aa.id), ba, ca.feedback.allowphotoattachments);\n        },\n        renderEditCommentBox: function(aa) {\n            var ba = new k(null, this.props.id, null, {\n            }), ca = ba.renderEditComment(this.props.authorProfiles[this.props.feedback.actorforpost], aa.id, this.props.feedback.mentionsdatasource, this.props.onEditAttempt.bind(null, aa), this.props.onCancelEdit, this.props.feedback.allowphotoattachments);\n            return ca;\n        },\n        _shouldShowCommentReplies: function(aa) {\n            if ((aa in this.state.instanceShowRepliesMap)) {\n                return this.state.instanceShowRepliesMap[aa];\n            }\n             else if ((aa in this.props.showRepliesMap)) {\n                return this.props.showRepliesMap[aa]\n            }\n        ;\n            return false;\n        },\n        _shouldShowReplySocialSentence: function(aa) {\n            if ((aa in this.state.instanceShowReplySocialSentenceMap)) {\n                return this.state.instanceShowReplySocialSentenceMap[aa];\n            }\n             else if ((aa in this.props.showReplySocialSentenceMap)) {\n                return this.props.showReplySocialSentenceMap[aa]\n            }\n        ;\n            return false;\n        },\n        renderComment: function(aa, ba) {\n            var ca = this.props, da = ca.feedback, ea = (da.actorforpost === aa.author), fa = q.getKeyForInstance(this.props.instanceid, \"locallycomposed\"), ga = (aa.islocal || (fa && fa[aa.id])), ha = (da.showremovemenu || ((da.viewerid === aa.author))), ia = ((da.canremoveall && da.isownerpage) && !ea), ja = (ca.source != n.UFIFeedbackSourceType.INTERN), ka = j.getTrackingInfo(j.types.COMMENT, ba), la = !!aa.parentcommentid, ma = this._shouldShowCommentReplies(aa.id), na = !!aa.isfeatured;\n            return (m({\n                comment: aa,\n                authorProfiles: this.props.authorProfiles,\n                viewerIsAuthor: ea,\n                feedback: da,\n                \"data-ft\": ka,\n                contextArgs: this.props.contextArgs,\n                hideAsSpamForPageAdmin: ia,\n                isLocallyComposed: ga,\n                isReply: la,\n                isFeatured: na,\n                showPermalink: ja,\n                showRemoveReportMenu: ha,\n                showReplies: ma,\n                onCommentLikeToggle: ca.onCommentLikeToggle.bind(null, aa),\n                onCommentReply: this.onCommentReply.bind(this, aa),\n                onCommentTranslate: ca.onCommentTranslate.bind(null, aa),\n                onEdit: ca.onCommentEdit.bind(null, aa),\n                onHideAsSpam: ca.onCommentHideAsSpam.bind(null, aa),\n                onInlineBan: ca.onCommentInlineBan.bind(null, aa),\n                onMarkAsNotSpam: ca.onCommentMarkAsNotSpam.bind(null, aa),\n                onOneClickRemove: ca.onCommentOneClickRemove.bind(null, aa),\n                onPreviewRemove: ca.onPreviewRemove.bind(null, aa),\n                onRemove: ca.onCommentRemove.bind(null, aa),\n                onRetrySubmit: ca.onRetrySubmit.bind(null, aa),\n                onUndoInlineBan: ca.onCommentUndoInlineBan.bind(null, aa),\n                onUndoOneClickRemove: ca.onCommentUndoOneClickRemove.bind(null, aa)\n            }));\n        },\n        _updateRepliesState: function(aa, ba, ca) {\n            var da = this.state.instanceShowRepliesMap;\n            da[aa] = ba;\n            var ea = this.state.instanceShowReplySocialSentenceMap;\n            ea[aa] = ca;\n            this.setState({\n                instanceShowRepliesMap: da,\n                instanceShowReplySocialSentenceMap: ea\n            });\n        },\n        onToggleReplies: function(aa) {\n            var ba = !this._shouldShowCommentReplies(aa.id), ca = (this._shouldShowReplySocialSentence(aa.id) && !((ba && (aa.replycount <= this.props.replySocialSentenceMaxReplies))));\n            this._updateRepliesState(aa.id, ba, ca);\n            var da = (this.state.requestRanges[aa.id].length - this.props.deletedCounts[aa.id]);\n            if ((ba && (da === 0))) {\n                var ea = this.props.commentCounts[aa.id], fa = Math.min(ea, this.props.pageSize);\n                this.onPage(aa.id, {\n                    offset: (ea - fa),\n                    length: fa\n                });\n            }\n        ;\n        },\n        onPage: function(aa, ba) {\n            var ca = this.state.requestRanges;\n            ca[aa] = ba;\n            var da = (this.state.hasPagedToplevel || (aa === this.props.id));\n            this.setState({\n                requestRanges: ca,\n                isActiveLoading: true,\n                hasPagedToplevel: da\n            });\n            this.props.onChangeRange(aa, ba);\n        },\n        isLoadingPrev: function(aa) {\n            var ba = this.props;\n            aa = (aa || ba.id);\n            if (!this.state.requestRanges[aa]) {\n                this.state.requestRanges[aa] = ba.availableRanges[aa];\n            };\n            var ca = this.state.requestRanges[aa].offset, da = ba.availableRanges[aa].offset;\n            return (ca < da);\n        },\n        isLoadingNext: function(aa) {\n            var ba = this.props;\n            aa = (aa || ba.id);\n            if (!this.state.requestRanges[aa]) {\n                this.state.requestRanges[aa] = ba.availableRanges[aa];\n            };\n            var ca = this.state.requestRanges[aa].offset, da = this.state.requestRanges[aa].length, ea = ba.availableRanges[aa].offset, fa = ba.availableRanges[aa].length;\n            return ((ca + da) > (ea + fa));\n        },\n        renderPagers: function(aa) {\n            var ba = this.props;\n            aa = (aa || ba.id);\n            var ca = ba.availableRanges[aa].offset, da = ba.availableRanges[aa].length, ea = ba.deletedCounts[aa], fa = ba.commentCounts[aa], ga = (fa - ea), ha = (da - ea), ia = (ba.contextArgs.numberdelimiter || \",\"), ja = (aa !== ba.id), ka = {\n                topPager: null,\n                bottomPager: null\n            };\n            if ((ba.source == n.UFIFeedbackSourceType.ADS)) {\n                return ka\n            };\n            var la = this.isLoadingPrev(aa), ma = this.isLoadingNext(aa);\n            if ((da == fa)) {\n                return ka\n            };\n            var na = (((ca + da)) == fa);\n            if (((((fa < ba.pageSize) && na)) || (ha === 0))) {\n                var oa = Math.min(fa, ba.pageSize), pa = this.onPage.bind(this, aa, {\n                    offset: (fa - oa),\n                    length: oa\n                }), qa, ra;\n                if ((ha === 0)) {\n                    if ((ga == 1)) {\n                        qa = (ja ? \"View 1 reply\" : \"View 1 comment\");\n                    }\n                     else {\n                        ra = g.formatIntegerWithDelimiter(ga, ia);\n                        qa = (ja ? y._(\"View all {count} replies\", {\n                            count: ra\n                        }) : y._(\"View all {count} comments\", {\n                            count: ra\n                        }));\n                    }\n                ;\n                }\n                 else if (((ga - ha) == 1)) {\n                    qa = (ja ? \"View 1 more reply\" : \"View 1 more comment\");\n                }\n                 else {\n                    ra = g.formatIntegerWithDelimiter((ga - ha), ia);\n                    qa = (ja ? y._(\"View {count} more replies\", {\n                        count: ra\n                    }) : y._(\"View {count} more comments\", {\n                        count: ra\n                    }));\n                }\n                \n            ;\n                var sa = j.getTrackingInfo(j.types.VIEW_ALL_COMMENTS), ta = s({\n                    contextArgs: ba.contextArgs,\n                    isUnseen: ba.feedback.hasunseencollapsed,\n                    isLoading: la,\n                    pagerLabel: qa,\n                    onPagerClick: pa,\n                    \"data-ft\": sa\n                });\n                if ((ba.feedback.isranked && !ja)) {\n                    ka.bottomPager = ta;\n                }\n                 else ka.topPager = ta;\n            ;\n                return ka;\n            }\n        ;\n            if ((ca > 0)) {\n                var ua = Math.max((ca - ba.pageSize), 0), oa = ((ca + da) - ua), va = this.onPage.bind(this, aa, {\n                    offset: ua,\n                    length: oa\n                }), wa = g.formatIntegerWithDelimiter(ha, ia), xa = g.formatIntegerWithDelimiter(ga, ia), ya = y._(\"{countshown} of {totalcount}\", {\n                    countshown: wa,\n                    totalcount: xa\n                });\n                if ((ba.feedback.isranked && !ja)) {\n                    ka.bottomPager = s({\n                        contextArgs: ba.contextArgs,\n                        isLoading: la,\n                        pagerLabel: \"View more comments\",\n                        onPagerClick: va,\n                        countSentence: ya\n                    });\n                }\n                 else {\n                    var za = (ja ? \"View previous replies\" : \"View previous comments\");\n                    ka.topPager = s({\n                        contextArgs: ba.contextArgs,\n                        isLoading: la,\n                        pagerLabel: za,\n                        onPagerClick: va,\n                        countSentence: ya\n                    });\n                }\n            ;\n            }\n        ;\n            if (((ca + da) < fa)) {\n                var ab = Math.min((da + ba.pageSize), (fa - ca)), bb = this.onPage.bind(this, aa, {\n                    offset: ca,\n                    length: ab\n                });\n                if ((ba.feedback.isranked && !ja)) {\n                    ka.topPager = s({\n                        contextArgs: ba.contextArgs,\n                        isLoading: ma,\n                        pagerLabel: \"View previous comments\",\n                        onPagerClick: bb\n                    });\n                }\n                 else {\n                    var cb = (ja ? \"View more replies\" : \"View more comments\");\n                    ka.bottomPager = s({\n                        contextArgs: ba.contextArgs,\n                        isLoading: ma,\n                        pagerLabel: cb,\n                        onPagerClick: bb\n                    });\n                }\n            ;\n            }\n        ;\n            return ka;\n        },\n        onCommentReply: function(aa) {\n            var ba = (aa.parentcommentid || aa.id);\n            if (!this._shouldShowCommentReplies(ba)) {\n                this.onToggleReplies(aa);\n            };\n            if ((this.refs && this.refs[(\"replycomposer-\" + ba)])) {\n                this.refs[(\"replycomposer-\" + ba)].focus();\n            };\n        },\n        onComment: function() {\n            if ((this.refs && this.refs.toplevelcomposer)) {\n                this.refs.toplevelcomposer.focus();\n            };\n        }\n    });\n    e.exports = z;\n});\n__d(\"UFIController\", [\"Arbiter\",\"Bootloader\",\"CSS\",\"DOM\",\"DOMQuery\",\"ImmutableObject\",\"LayerRemoveOnHide\",\"LiveTimer\",\"Parent\",\"React\",\"ReactMount\",\"ShortProfiles\",\"UFI.react\",\"UFIActionLinkController\",\"UFICentralUpdates\",\"UFIComments\",\"UFIConstants\",\"UFIFeedbackTargets\",\"UFIInstanceState\",\"UFIUserActions\",\"URI\",\"copyProperties\",\"isEmpty\",\"tx\",\"UFICommentTemplates\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"Bootloader\"), i = b(\"CSS\"), j = b(\"DOM\"), k = b(\"DOMQuery\"), l = b(\"ImmutableObject\"), m = b(\"LayerRemoveOnHide\"), n = b(\"LiveTimer\"), o = b(\"Parent\"), p = b(\"React\"), q = b(\"ReactMount\"), r = b(\"ShortProfiles\"), s = b(\"UFI.react\"), t = b(\"UFIActionLinkController\"), u = b(\"UFICentralUpdates\"), v = b(\"UFIComments\"), w = b(\"UFIConstants\"), x = b(\"UFIFeedbackTargets\"), y = b(\"UFIInstanceState\"), z = b(\"UFIUserActions\"), aa = b(\"URI\"), ba = b(\"copyProperties\"), ca = b(\"isEmpty\"), da = b(\"tx\"), ea = b(\"UFICommentTemplates\"), fa = function(ia, ja, ka, la) {\n        var ma = ((ia.offset + ia.length) === ja);\n        return {\n            offset: ia.offset,\n            length: (((ma && ga(la))) ? (ka - ia.offset) : ia.length)\n        };\n    }, ga = function(ia) {\n        return ((ia == w.UFIPayloadSourceType.USER_ACTION) || (ia == w.UFIPayloadSourceType.LIVE_SEND));\n    };\n    function ha(ia, ja, ka) {\n        this.root = ia;\n        this.id = ja.ftentidentifier;\n        this.source = ja.source;\n        this._ufiInstanceID = ja.instanceid;\n        this._contextArgs = ja;\n        this._contextArgs.rootid = this.root.id;\n        this._verifiedCommentsExpanded = false;\n        var la = ka.feedbacktargets[0];\n        this.actionLink = new t(ia, this._contextArgs, la);\n        this.orderingMode = la.defaultcommentorderingmode;\n        var ma = ka.commentlists.comments[this.id][this.orderingMode];\n        this.replyRanges = {\n        };\n        this.repliesMap = {\n        };\n        this.showRepliesMap = {\n        };\n        this.showReplySocialSentenceMap = {\n        };\n        this.commentcounts = {\n        };\n        this.commentcounts[this.id] = v.getCommentCount(this.id);\n        var na = {\n        }, oa = (la.orderingmodes || [{\n            value: this.orderingMode\n        },]);\n        oa.forEach(function(sa) {\n            na[sa.value] = ba({\n            }, ma.range);\n        });\n        this.ranges = na;\n        if (ka.commentlists.replies) {\n            for (var pa = 0; (pa < ma.values.length); pa++) {\n                var qa = ma.values[pa], ra = ka.commentlists.replies[qa];\n                if (ra) {\n                    this.commentcounts[qa] = v.getCommentCount(qa);\n                    this.replyRanges[qa] = ba({\n                    }, ra.range);\n                }\n            ;\n            }\n        };\n        this._loggingOffset = null;\n        this._ufi = null;\n        this.ufiCentralUpdatesSubscriptions = [u.subscribe(\"feedback-updated\", function(sa, ta) {\n            var ua = ta.updates, va = ta.payloadSource;\n            if (((va != w.UFIPayloadSourceType.COLLAPSED_UFI) && (this.id in ua))) {\n                this.fetchAndUpdate(this.render.bind(this), va);\n            };\n        }.bind(this)),u.subscribe(\"feedback-id-changed\", function(sa, ta) {\n            var ua = ta.updates;\n            if ((this.id in ua)) {\n                this.id = ua[this.id];\n            };\n        }.bind(this)),u.subscribe(\"instance-updated\", function(sa, ta) {\n            var ua = ta.updates;\n            if ((this._ufiInstanceID in ua)) {\n                var va = ua[this._ufiInstanceID];\n                if (va.editcommentid) {\n                    this.render(ta.payloadSource);\n                };\n            }\n        ;\n        }.bind(this)),u.subscribe(\"update-comment-lists\", function(sa, ta) {\n            if ((ta.commentlists && ta.commentlists.replies)) {\n                var ua = ta.commentlists.replies;\n                for (var va in ua) {\n                    if (((((this.id != va) && ua[va]) && (ua[va].ftentidentifier == this.id)) && !this.replyRanges[va])) {\n                        this.replyRanges[va] = ua[va].range;\n                    };\n                };\n            }\n        ;\n        }.bind(this)),];\n        this.clearPageletSubscription = g.subscribe(\"pagelet/destroy\", this.onPageletDestroy.bind(this));\n        this.clearPageSubscription = g.subscribe(\"ufi/page_cleared\", this._onDestroy.bind(this));\n        u.handleUpdate(w.UFIPayloadSourceType.INITIAL_SERVER, ka);\n        if (this._contextArgs.viewas) {\n            this.viewasUFICleanSubscription = g.subscribe(\"pre_page_transition\", function(sa, ta) {\n                if ((this._contextArgs.viewas !== aa(ta.to).getQueryData(\"viewas\"))) {\n                    v.resetFeedbackTarget(this.id);\n                };\n            }.bind(this));\n        };\n        h.loadModules([\"ScrollAwareDOM\",], function(sa) {\n            q.scrollMonitor = sa.monitor;\n        });\n    };\n    ba(ha.prototype, {\n        _getParentForm: function() {\n            if (!this._form) {\n                this._form = o.byTag(this.root, \"form\");\n            };\n            return this._form;\n        },\n        _onTargetLikeToggle: function(event) {\n            var ia = !this.feedback.hasviewerliked;\n            z.changeLike(this.id, ia, {\n                source: this.source,\n                target: event.target,\n                rootid: this._contextArgs.rootid\n            });\n            event.preventDefault();\n        },\n        _onCommentLikeToggle: function(ia, event) {\n            var ja = !ia.hasviewerliked;\n            z.changeCommentLike(ia.id, ja, {\n                source: this.source,\n                target: event.target\n            });\n        },\n        _onCommentEdit: function(ia) {\n            y.updateState(this._ufiInstanceID, \"isediting\", true);\n            y.updateState(this._ufiInstanceID, \"editcommentid\", ia.id);\n        },\n        _onEditAttempt: function(ia, ja, event) {\n            if ((!ja.visibleValue && !ja.attachedPhoto)) {\n                this._onCommentRemove(ia, event);\n            }\n             else z.editComment(ia.id, ja.visibleValue, ja.encodedValue, {\n                source: this._contextArgs.source,\n                target: event.target,\n                attachedPhoto: ja.attachedPhoto\n            });\n        ;\n            y.updateStateField(this._ufiInstanceID, \"locallycomposed\", ia.id, true);\n            this._onEditReset();\n        },\n        _onEditReset: function() {\n            y.updateState(this._ufiInstanceID, \"isediting\", false);\n            y.updateState(this._ufiInstanceID, \"editcommentid\", null);\n        },\n        _onCommentRemove: function(ia, event) {\n            var ja = ea[\":fb:ufi:hide-dialog-template\"].build();\n            j.setContent(ja.getNode(\"body\"), \"Are you sure you want to delete this comment?\");\n            j.setContent(ja.getNode(\"title\"), \"Delete Comment\");\n            h.loadModules([\"DialogX\",], function(ka) {\n                var la = new ka({\n                    modal: true,\n                    width: 465,\n                    addedBehaviors: [m,]\n                }, ja.getRoot());\n                la.subscribe(\"confirm\", function() {\n                    z.removeComment(ia.id, {\n                        source: this.source,\n                        oneclick: false,\n                        target: event.target,\n                        timelinelogdata: this._contextArgs.timelinelogdata\n                    });\n                    la.hide();\n                }.bind(this));\n                la.show();\n            }.bind(this));\n        },\n        _onCommentOneClickRemove: function(ia, event) {\n            z.removeComment(ia.id, {\n                source: this.source,\n                oneclick: true,\n                target: event.target,\n                timelinelogdata: this._contextArgs.timelinelogdata\n            });\n        },\n        _onCommentUndoOneClickRemove: function(ia, event) {\n            var ja = ((this.feedback.canremoveall && this.feedback.isownerpage) && (this.feedback.actorforpost !== this.authorProfiles[ia.author]));\n            z.undoRemoveComment(ia.id, ja, {\n                source: this.source,\n                target: event.target\n            });\n        },\n        _onCommentHideAsSpam: function(ia, event) {\n            z.setHideAsSpam(ia.id, true, {\n                source: this.source,\n                target: event.target\n            });\n        },\n        _onCommentMarkAsNotSpam: function(ia, event) {\n            z.setHideAsSpam(ia.id, false, {\n                source: this.source,\n                target: event.target\n            });\n        },\n        _onCommentTranslate: function(ia, event) {\n            z.translateComment(ia, {\n                source: this.source,\n                target: event.target\n            });\n        },\n        _onCommentInlineBanChange: function(ia, ja, event) {\n            z.banUser(ia, this.feedback.ownerid, ja, {\n                source: this.source,\n                target: event.target\n            });\n        },\n        _onCommentInlineBan: function(ia, event) {\n            this._onCommentInlineBanChange(ia, true, event);\n        },\n        _onCommentUndoInlineBan: function(ia, event) {\n            this._onCommentInlineBanChange(ia, false, event);\n        },\n        _fetchSpamComments: function(ia, ja) {\n            z.fetchSpamComments(this.id, ia, ja, this._contextArgs.viewas);\n        },\n        _removePreview: function(ia, event) {\n            z.removePreview(ia, {\n                source: this.source,\n                target: event.target\n            });\n        },\n        _retrySubmit: function(ia) {\n            h.loadModules([\"UFIRetryActions\",], function(ja) {\n                ja.retrySubmit(ia, {\n                    source: this.source\n                });\n            }.bind(this));\n        },\n        _ensureCommentsExpanded: function() {\n            if (this._verifiedCommentsExpanded) {\n                return\n            };\n            var ia = o.byTag(this.root, \"form\");\n            if (ia) {\n                i.removeClass(ia, \"collapsed_comments\");\n                this._verifiedCommentsExpanded = true;\n            }\n        ;\n        },\n        render: function(ia) {\n            var ja = (this.comments.length || !ca(this.feedback.likesentences.current));\n            if ((ja && ga(ia))) {\n                this._ensureCommentsExpanded();\n            };\n            if ((this._loggingOffset === null)) {\n                this._loggingOffset = ((this.ranges[this.orderingMode].offset + this.comments.length) - 1);\n            };\n            var ka = (this.feedback.replysocialsentencemaxreplies || -1), la = {\n            };\n            la[this.id] = v.getDeletedCount(this.id);\n            this.comments.forEach(function(oa) {\n                la[oa.id] = v.getDeletedCount(oa.id);\n            });\n            var ma = ba({\n            }, this.replyRanges);\n            ma[this.id] = this.ranges[this.orderingMode];\n            ma = new l(ma);\n            var na = s({\n                feedback: this.feedback,\n                id: this.id,\n                onTargetLikeToggle: this._onTargetLikeToggle.bind(this),\n                onCommentLikeToggle: this._onCommentLikeToggle.bind(this),\n                onCommentRemove: this._onCommentRemove.bind(this),\n                onCommentHideAsSpam: this._onCommentHideAsSpam.bind(this),\n                onCommentMarkAsNotSpam: this._onCommentMarkAsNotSpam.bind(this),\n                onCommentEdit: this._onCommentEdit.bind(this),\n                onCommentOneClickRemove: this._onCommentOneClickRemove.bind(this),\n                onCommentUndoOneClickRemove: this._onCommentUndoOneClickRemove.bind(this),\n                onCommentTranslate: this._onCommentTranslate.bind(this),\n                onCommentInlineBan: this._onCommentInlineBan.bind(this),\n                onCommentUndoInlineBan: this._onCommentUndoInlineBan.bind(this),\n                onEditAttempt: this._onEditAttempt.bind(this),\n                onCancelEdit: this._onEditReset.bind(this),\n                onChangeRange: this._changeRange.bind(this),\n                onSpamFetch: this._fetchSpamComments.bind(this),\n                onPreviewRemove: this._removePreview.bind(this),\n                onRetrySubmit: this._retrySubmit.bind(this),\n                onOrderingModeChange: this._onOrderingModeChange.bind(this),\n                contextArgs: this._contextArgs,\n                repliesMap: this.repliesMap,\n                showRepliesMap: this.showRepliesMap,\n                showReplySocialSentenceMap: this.showReplySocialSentenceMap,\n                commentCounts: this.commentcounts,\n                deletedCounts: la,\n                availableComments: this.comments,\n                source: this.source,\n                availableRanges: ma,\n                pageSize: w.defaultPageSize,\n                authorProfiles: this.authorProfiles,\n                instanceid: this._ufiInstanceID,\n                loggingOffset: this._loggingOffset,\n                replySocialSentenceMaxReplies: ka,\n                giftRecipient: this._giftRecipient,\n                orderingMode: this.orderingMode\n            });\n            this._ufi = p.renderComponent(na, this.root);\n            n.updateTimeStamps();\n            if (this._getParentForm()) {\n                g.inform(\"ufi/changed\", {\n                    form: this._getParentForm()\n                });\n            };\n            if (((ia != w.UFIPayloadSourceType.INITIAL_SERVER) && (ia != w.UFIPayloadSourceType.COLLAPSED_UFI))) {\n                g.inform(\"reflow\");\n            };\n        },\n        fetchAndUpdate: function(ia, ja) {\n            x.getFeedbackTarget(this.id, function(ka) {\n                var la = v.getCommentCount(this.id), ma = fa(this.ranges[this.orderingMode], this.commentcounts[this.id], la, ja);\n                v.getCommentsInRange(this.id, ma, this.orderingMode, this._contextArgs.viewas, function(na) {\n                    var oa = [], pa = {\n                    }, qa = {\n                    };\n                    if (ka.actorforpost) {\n                        oa.push(ka.actorforpost);\n                    };\n                    for (var ra = 0; (ra < na.length); ra++) {\n                        if (na[ra].author) {\n                            oa.push(na[ra].author);\n                        };\n                        if (na[ra].socialcontext) {\n                            oa.push(na[ra].socialcontext.topmutualid);\n                        };\n                        if ((na[ra].replyauthors && na[ra].replyauthors.length)) {\n                            for (var sa = 0; (sa < na[ra].replyauthors.length); sa++) {\n                                oa.push(na[ra].replyauthors[sa]);;\n                            }\n                        };\n                        if (ka.isthreaded) {\n                            var ta = na[ra].id, ua = v.getCommentCount(ta), va;\n                            if (this.replyRanges[ta]) {\n                                va = fa(this.replyRanges[ta], this.commentcounts[ta], ua, ja);\n                            }\n                             else va = {\n                                offset: 0,\n                                length: Math.min(ua, 2)\n                            };\n                        ;\n                            pa[ta] = va;\n                            qa[ta] = ua;\n                        }\n                    ;\n                    };\n                    v.getRepliesInRanges(this.id, pa, function(wa) {\n                        for (var xa = 0; (xa < na.length); xa++) {\n                            var ya = na[xa].id, za = (wa[ya] || []);\n                            for (var ab = 0; (ab < za.length); ab++) {\n                                if (za[ab].author) {\n                                    oa.push(za[ab].author);\n                                };\n                                if (za[ab].socialcontext) {\n                                    oa.push(za[ab].socialcontext.topmutualid);\n                                };\n                            };\n                        };\n                        if (this._contextArgs.giftoccasion) {\n                            oa.push(ka.actorid);\n                        };\n                        r.getMulti(oa, function(bb) {\n                            if (this._contextArgs.giftoccasion) {\n                                this._giftRecipient = bb[ka.actorid];\n                            };\n                            this.authorProfiles = bb;\n                            this.feedback = ka;\n                            this.commentcounts[this.id] = la;\n                            this.comments = na;\n                            this.ranges[this.orderingMode] = ma;\n                            for (var cb = 0; (cb < na.length); cb++) {\n                                var db = na[cb].id, eb = pa[db];\n                                this.repliesMap[db] = wa[db];\n                                this.replyRanges[db] = eb;\n                                this.commentcounts[db] = qa[db];\n                                this.showRepliesMap[db] = (eb && (eb.length > 0));\n                                if (((this.showReplySocialSentenceMap[db] === undefined) && (qa[db] > 0))) {\n                                    this.showReplySocialSentenceMap[db] = !this.showRepliesMap[db];\n                                };\n                            };\n                            ia(ja);\n                            if ((ja == w.UFIPayloadSourceType.ENDPOINT_COMMENT_FETCH)) {\n                                g.inform(\"CommentUFI.Pager\");\n                            };\n                        }.bind(this));\n                    }.bind(this));\n                }.bind(this));\n            }.bind(this));\n        },\n        _changeRange: function(ia, ja) {\n            if ((ia == this.id)) {\n                this.ranges[this.orderingMode] = ja;\n            }\n             else this.replyRanges[ia] = ja;\n        ;\n            this.fetchAndUpdate(this.render.bind(this), w.UFIPayloadSourceType.USER_ACTION);\n        },\n        onPageletDestroy: function(ia, ja) {\n            if (k.contains(ja.root, this.root)) {\n                this._onDestroy();\n            };\n        },\n        _onDestroy: function() {\n            p.unmountAndReleaseReactRootNode(this.root);\n            this.ufiCentralUpdatesSubscriptions.forEach(u.unsubscribe.bind(u));\n            g.unsubscribe(this.clearPageletSubscription);\n            g.unsubscribe(this.clearPageSubscription);\n            (this.viewasUFICleanSubscription && g.unsubscribe(this.viewasUFICleanSubscription));\n        },\n        _onOrderingModeChange: function(ia) {\n            this.orderingMode = ia;\n            this.fetchAndUpdate(this.render.bind(this), w.UFIPayloadSourceType.USER_ACTION);\n        }\n    });\n    e.exports = ha;\n});\n__d(\"Ease\", [], function(a, b, c, d, e, f) {\n    var g = {\n        makePowerOut: function(h) {\n            return function(i) {\n                var j = (1 - Math.pow((1 - i), h));\n                return ((((j * 10000) | 0)) / 10000);\n            };\n        },\n        makePowerIn: function(h) {\n            return function(i) {\n                var j = Math.pow(i, h);\n                return ((((j * 10000) | 0)) / 10000);\n            };\n        },\n        makePowerInOut: function(h) {\n            return function(i) {\n                var j = ((((i *= 2) < 1)) ? (Math.pow(i, h) * 233395) : (1 - (Math.abs(Math.pow((2 - i), h)) * 233426)));\n                return ((((j * 10000) | 0)) / 10000);\n            };\n        },\n        sineOut: function(h) {\n            return Math.sin(((h * Math.PI) * 233504));\n        },\n        sineIn: function(h) {\n            return (1 - Math.cos(((h * Math.PI) * 233557)));\n        },\n        sineInOut: function(h) {\n            return (-233593 * ((Math.cos((Math.PI * h)) - 1)));\n        },\n        circOut: function(h) {\n            return Math.sqrt((1 - ((--h) * h)));\n        },\n        circIn: function(h) {\n            return -((Math.sqrt((1 - (h * h))) - 1));\n        },\n        circInOut: function(h) {\n            return ((((h *= 2) < 1)) ? (-233763 * ((Math.sqrt((1 - (h * h))) - 1))) : (233787 * ((Math.sqrt((1 - ((h -= 2) * h))) + 1))));\n        },\n        bounceOut: function(h) {\n            if ((h < (1 / 2.75))) {\n                return (((7.5625 * h) * h));\n            }\n             else if ((h < (2 / 2.75))) {\n                return ((((7.5625 * (h -= (1.5 / 2.75))) * h) + 233923));\n            }\n             else if ((h < (2.5 / 2.75))) {\n                return ((((7.5625 * (h -= (2.25 / 2.75))) * h) + 233981));\n            }\n             else return ((((7.5625 * (h -= (2.625 / 2.75))) * h) + 234027))\n            \n            \n        ;\n        },\n        bounceIn: function(h) {\n            return (1 - g.bounceOut((1 - h)));\n        },\n        bounceInOut: function(h) {\n            return (((h < 234121)) ? (g.bounceIn((h * 2)) * 234141) : ((g.bounceOut(((h * 2) - 1)) * 234163) + 234166));\n        },\n        _makeBouncy: function(h) {\n            h = (h || 1);\n            return function(i) {\n                i = (((((1 - Math.cos(((i * Math.PI) * h)))) * ((1 - i)))) + i);\n                return ((i <= 1) ? i : (2 - i));\n            };\n        },\n        makeBounceOut: function(h) {\n            return this._makeBouncy(h);\n        },\n        makeBounceIn: function(h) {\n            var i = this._makeBouncy(h);\n            return function(j) {\n                return (1 - i((1 - j)));\n            };\n        },\n        makeElasticOut: function(h, i) {\n            ((h < 1) && (h = 1));\n            var j = (Math.PI * 2);\n            return function(k) {\n                if (((k === 0) || (k === 1))) {\n                    return k\n                };\n                var l = ((i / j) * Math.asin((1 / h)));\n                return (((h * Math.pow(2, (-10 * k))) * Math.sin(((((k - l)) * j) / i))) + 1);\n            };\n        },\n        makeElasticIn: function(h, i) {\n            ((h < 1) && (h = 1));\n            var j = (Math.PI * 2);\n            return function(k) {\n                if (((k === 0) || (k === 1))) {\n                    return k\n                };\n                var l = ((i / j) * Math.asin((1 / h)));\n                return -(((h * Math.pow(2, (10 * (k -= 1)))) * Math.sin(((((k - l)) * j) / i))));\n            };\n        },\n        makeElasticInOut: function(h, i) {\n            ((h < 1) && (h = 1));\n            i *= 1.5;\n            var j = (Math.PI * 2);\n            return function(k) {\n                var l = ((i / j) * Math.asin((1 / h)));\n                return ((((k *= 2) < 1)) ? (((-234914 * h) * Math.pow(2, (10 * (k -= 1)))) * Math.sin(((((k - l)) * j) / i))) : (1 + (((234963 * h) * Math.pow(2, (-10 * (k -= 1)))) * Math.sin(((((k - l)) * j) / i)))));\n            };\n        },\n        makeBackOut: function(h) {\n            return function(i) {\n                return ((((--i * i) * (((((h + 1)) * i) + h))) + 1));\n            };\n        },\n        makeBackIn: function(h) {\n            return function(i) {\n                return ((i * i) * (((((h + 1)) * i) - h)));\n            };\n        },\n        makeBackInOut: function(h) {\n            h *= 1.525;\n            return function(i) {\n                return ((((i *= 2) < 1)) ? (235232 * (((i * i) * (((((h + 1)) * i) - h))))) : (235253 * (((((i -= 2) * i) * (((((h + 1)) * i) + h))) + 2))));\n            };\n        },\n        easeOutExpo: function(h) {\n            return (-Math.pow(2, (-10 * h)) + 1);\n        }\n    };\n    g.elasticOut = g.makeElasticOut(1, 235372);\n    g.elasticIn = g.makeElasticIn(1, 235406);\n    g.elasticInOut = g.makeElasticInOut(1, 235446);\n    g.backOut = g.makeBackOut(1.7);\n    g.backIn = g.makeBackIn(1.7);\n    g.backInOut = g.makeBackInOut(1.7);\n    e.exports = g;\n});\n__d(\"EntstreamCollapsedUFIActions\", [\"PopupWindow\",\"React\",\"TrackingNodes\",\"URI\",\"cx\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"PopupWindow\"), h = b(\"React\"), i = b(\"TrackingNodes\"), j = b(\"URI\"), k = b(\"cx\"), l = b(\"tx\"), m = h.createClass({\n        displayName: \"EntstreamCollapsedUFIActions\",\n        getLikeButton: function() {\n            return this.refs.likeButton.getDOMNode();\n        },\n        getLikeIcon: function() {\n            return this.refs.likeIcon.getDOMNode();\n        },\n        render: function() {\n            var n;\n            if ((this.props.shareHref !== null)) {\n                var o = i.getTrackingInfo(i.types.SHARE_LINK), p = j(this.props.shareHref), q = [h.DOM.i({\n                    className: \"_6k1 _528f\"\n                }),\"Share\",];\n                if ((p.getPath().indexOf(\"/ajax\") === 0)) {\n                    n = h.DOM.a({\n                        ajaxify: this.props.shareHref,\n                        className: \"_6j_ _5cix\",\n                        \"data-ft\": o,\n                        href: \"#\",\n                        rel: \"dialog\",\n                        title: \"Share this item\"\n                    }, q);\n                }\n                 else {\n                    var r = function() {\n                        g.open(this.props.shareHref, 480, 600);\n                        return false;\n                    }.bind(this);\n                    n = h.DOM.a({\n                        className: \"_6j_ _5cix\",\n                        \"data-ft\": o,\n                        href: this.props.shareHref,\n                        onClick: r,\n                        target: \"_blank\",\n                        title: \"Share this item\"\n                    }, q);\n                }\n            ;\n            }\n        ;\n            var s;\n            if (this.props.canComment) {\n                var t = \"_6k4 _528f\", u = [h.DOM.i({\n                    className: t\n                }),\"Comment\",], v = \"_6k2 _5cix\", w = i.getTrackingInfo(i.types.COMMENT_LINK);\n                if (this.props.storyHref) {\n                    s = h.DOM.a({\n                        className: v,\n                        \"data-ft\": w,\n                        href: this.props.storyHref,\n                        target: \"_blank\",\n                        title: \"Write a comment...\"\n                    }, u);\n                }\n                 else s = h.DOM.a({\n                    className: v,\n                    \"data-ft\": w,\n                    href: \"#\",\n                    onClick: this.props.onCommentClick,\n                    title: \"Write a comment...\"\n                }, u);\n            ;\n            }\n        ;\n            var x;\n            if (this.props.canLike) {\n                var y = (((((this.props.hasViewerLiked ? \"_6k5\" : \"\")) + ((\" \" + \"_6k6\"))) + ((\" \" + \"_5cix\")))), z = i.getTrackingInfo((this.props.hasViewerLiked ? i.types.UNLIKE_LINK : i.types.LIKE_LINK)), aa = (this.props.hasViewerLiked ? \"Unlike this\" : \"Like this\");\n                x = h.DOM.a({\n                    className: y,\n                    \"data-ft\": z,\n                    href: \"#\",\n                    onClick: this.props.onLike,\n                    onMouseDown: this.props.onLikeMouseDown,\n                    ref: \"likeButton\",\n                    title: aa\n                }, h.DOM.i({\n                    className: \"_6k7 _528f\",\n                    ref: \"likeIcon\"\n                }), \"Like\", h.DOM.div({\n                    className: \"_55k4\"\n                }));\n            }\n        ;\n            return (h.DOM.div({\n                className: \"_5ciy\"\n            }, x, s, n));\n        }\n    });\n    e.exports = m;\n});\n__d(\"EntstreamCollapsedUFISentence\", [\"Bootloader\",\"NumberFormat\",\"ProfileBrowserLink\",\"ProfileBrowserTypes\",\"React\",\"URI\",\"cx\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Bootloader\"), h = b(\"NumberFormat\"), i = b(\"ProfileBrowserLink\"), j = b(\"ProfileBrowserTypes\"), k = b(\"React\"), l = b(\"URI\"), m = b(\"cx\"), n = b(\"tx\"), o = k.createClass({\n        displayName: \"EntstreamCollapsedUFISentence\",\n        _showShareDialog: function(event) {\n            event = event.nativeEvent;\n            if (event.isDefaultRequested()) {\n                return\n            };\n            g.loadModules([\"EntstreamShareOverlay\",], function(p) {\n                p.display(this.props.feedback.targetfbid, this._getShareString());\n            }.bind(this));\n            event.prevent();\n        },\n        _getShareString: function() {\n            var p = this.props.feedback.sharecount, q = (this.props.numberDelimiter || \",\");\n            if ((p === 1)) {\n                return \"1 Share\";\n            }\n             else if ((p > 1)) {\n                var r = h.formatIntegerWithDelimiter(p, q);\n                return n._(\"{count} Shares\", {\n                    count: r\n                });\n            }\n            \n        ;\n        },\n        render: function() {\n            var p = this.props.feedback, q = p.likecount, r = this.props.commentCount, s = p.sharecount, t = p.seencount, u = this.props.hasAttachedUFIExpanded, v = (this.props.numberDelimiter || \",\");\n            if (u) {\n                q = 0;\n                r = 0;\n            }\n        ;\n            if ((((!q && !r) && !s) && !t)) {\n                return k.DOM.span(null)\n            };\n            var w;\n            if ((q === 1)) {\n                w = \"1 Like\";\n            }\n             else if ((q > 1)) {\n                var x = h.formatIntegerWithDelimiter(q, v);\n                w = n._(\"{count} Likes\", {\n                    count: x\n                });\n            }\n            \n        ;\n            var y;\n            if ((r === 1)) {\n                y = \"1 Comment\";\n            }\n             else if ((r > 1)) {\n                var z = h.formatIntegerWithDelimiter(r, v);\n                y = n._(\"{count} Comments\", {\n                    count: z\n                });\n            }\n            \n        ;\n            var aa = this._getShareString(), ba, ca, da;\n            if (w) {\n                ca = new l(\"/ajax/like/tooltip.php\").setQueryData({\n                    comment_fbid: p.targetfbid,\n                    comment_from: p.actorforpost,\n                    seen_user_fbids: true\n                });\n                var ea = (((y || aa) ? \"prm\" : \"\"));\n                ba = j.LIKES;\n                da = {\n                    id: p.targetfbid\n                };\n                var fa = i.constructDialogURI(ba, da).toString();\n                if (this.props.storyHref) {\n                    w = null;\n                }\n                 else w = k.DOM.a({\n                    ajaxify: fa,\n                    className: ea,\n                    href: i.constructPageURI(ba, da).toString(),\n                    \"data-hover\": \"tooltip\",\n                    \"data-tooltip-alignh\": \"center\",\n                    \"data-tooltip-uri\": ca.toString(),\n                    rel: \"dialog\"\n                }, w);\n            ;\n            }\n        ;\n            var ga;\n            if ((t > 0)) {\n                ba = j.GROUP_MESSAGE_VIEWERS;\n                da = {\n                    id: p.targetfbid\n                };\n                var ha = i.constructDialogURI(ba, da), ia = i.constructPageURI(ba, da);\n                ca = new l(\"/ajax/ufi/seen_tooltip.php\").setQueryData({\n                    ft_ent_identifier: p.entidentifier,\n                    displayed_count: t\n                });\n                var ja = h.formatIntegerWithDelimiter(t, v);\n                if (p.seenbyall) {\n                    ga = \"Seen by everyone\";\n                }\n                 else ga = ((ja == 1) ? \"Seen by 1\" : n._(\"Seen by {count}\", {\n                    count: ja\n                }));\n            ;\n                ga = k.DOM.a({\n                    ajaxify: ha.toString(),\n                    \"data-hover\": \"tooltip\",\n                    \"data-tooltip-alignh\": \"center\",\n                    \"data-tooltip-uri\": ca.toString(),\n                    href: ia.toString(),\n                    rel: \"dialog\",\n                    tabindex: \"-1\"\n                }, ga);\n            }\n        ;\n            if (y) {\n                var ka = ((aa ? \"prm\" : \"\"));\n                if (this.props.storyHref) {\n                    y = k.DOM.a({\n                        className: ka,\n                        href: this.props.storyHref,\n                        target: \"_blank\"\n                    }, y);\n                }\n                 else y = k.DOM.a({\n                    className: ka,\n                    onClick: this.props.onCommentClick\n                }, y);\n            ;\n            }\n        ;\n            if (aa) {\n                var la = new l(\"/shares/view\").setSubdomain(\"www\").setQueryData({\n                    id: p.targetfbid\n                });\n                if (this.props.storyHref) {\n                    aa = k.DOM.a({\n                        href: la.toString(),\n                        target: \"_blank\"\n                    }, aa);\n                }\n                 else aa = k.DOM.a({\n                    href: la.toString(),\n                    onClick: this._showShareDialog,\n                    rel: \"ignore\"\n                }, aa);\n            ;\n            }\n        ;\n            return (k.DOM.span({\n                className: \"_5civ\"\n            }, w, y, aa, ga));\n        }\n    });\n    e.exports = o;\n});\n__d(\"EntstreamCollapsedUFI\", [\"Event\",\"Animation\",\"BrowserSupport\",\"CSS\",\"DOM\",\"Ease\",\"EntstreamCollapsedUFIActions\",\"EntstreamCollapsedUFISentence\",\"React\",\"TrackingNodes\",\"Vector\",\"cx\",\"queryThenMutateDOM\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"Animation\"), i = b(\"BrowserSupport\"), j = b(\"CSS\"), k = b(\"DOM\"), l = b(\"Ease\"), m = b(\"EntstreamCollapsedUFIActions\"), n = b(\"EntstreamCollapsedUFISentence\"), o = b(\"React\"), p = b(\"TrackingNodes\"), q = b(\"Vector\"), r = b(\"cx\"), s = b(\"queryThenMutateDOM\"), t = 16, u = o.createClass({\n        displayName: \"EntstreamCollapsedUFI\",\n        _animate: function(v, w, x, y) {\n            if (!i.hasCSSTransforms()) {\n                return\n            };\n            var z = this.refs.icons.getLikeIcon();\n            (this._animation && this._animation.stop());\n            this._animation = new h(z).from(\"scaleX\", v).from(\"scaleY\", v).to(\"scaleX\", w).to(\"scaleY\", w).duration(x);\n            (y && this._animation.ease(y));\n            this._animation.go();\n        },\n        bounceLike: function() {\n            this._animate(1.35, 1, 750, l.bounceOut);\n        },\n        shrinkLike: function() {\n            this._animate(1, 241196, 150);\n            this._mouseUpListener = g.listen(document.body, \"mouseup\", this._onMouseUp);\n        },\n        _onMouseUp: function(event) {\n            this._mouseUpListener.remove();\n            if (!k.contains(this.refs.icons.getLikeButton(), event.getTarget())) {\n                this._animate(241417, 1, 150);\n            };\n        },\n        render: function() {\n            var v = this.props.feedback, w = p.getTrackingInfo(p.types.BLINGBOX);\n            return (o.DOM.div({\n                className: \"clearfix\"\n            }, m({\n                canLike: v.viewercanlike,\n                canComment: v.cancomment,\n                hasViewerLiked: v.hasviewerliked,\n                onCommentClick: this.props.onCommentClick,\n                onLike: this.props.onLike,\n                onLikeMouseDown: this.props.onLikeMouseDown,\n                ref: \"icons\",\n                shareHref: this.props.shareHref,\n                storyHref: this.props.storyHref\n            }), o.DOM.div({\n                className: \"_6j-\",\n                \"data-ft\": w,\n                ref: \"sentence\"\n            }, n({\n                commentCount: this.props.commentCount,\n                feedback: v,\n                hasAttachedUFIExpanded: this.props.hasAttachedUFIExpanded,\n                numberDelimiter: this.props.numberDelimiter,\n                onCommentClick: this.props.onCommentClick,\n                storyHref: this.props.storyHref\n            }))));\n        },\n        componentDidMount: function(v) {\n            var w = this.refs.icons.getDOMNode(), x = this.refs.sentence.getDOMNode(), y, z, aa;\n            s(function() {\n                y = q.getElementDimensions(v).x;\n                z = q.getElementDimensions(w).x;\n                aa = q.getElementDimensions(x).x;\n            }, function() {\n                if (((z + aa) > (y + t))) {\n                    j.addClass(v, \"_4nej\");\n                };\n            });\n        }\n    });\n    e.exports = u;\n});\n__d(\"EntstreamCollapsedUFIController\", [\"Bootloader\",\"CommentPrelude\",\"CSS\",\"DOM\",\"EntstreamCollapsedUFI\",\"React\",\"ReactMount\",\"UFICentralUpdates\",\"UFIComments\",\"UFIConstants\",\"UFIFeedbackTargets\",\"UFIUserActions\",\"copyProperties\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Bootloader\"), h = b(\"CommentPrelude\"), i = b(\"CSS\"), j = b(\"DOM\"), k = b(\"EntstreamCollapsedUFI\"), l = b(\"React\"), m = b(\"ReactMount\"), n = b(\"UFICentralUpdates\"), o = b(\"UFIComments\"), p = b(\"UFIConstants\"), q = b(\"UFIFeedbackTargets\"), r = b(\"UFIUserActions\"), s = b(\"copyProperties\"), t = b(\"cx\"), u = p.UFIPayloadSourceType;\n    function v(w, x, y) {\n        this._root = w;\n        this._id = y.ftentidentifier;\n        this._contextArgs = y;\n        this._ufiVisible = y.hasattachedufiexpanded;\n        n.subscribe(\"feedback-updated\", function(z, aa) {\n            if (((aa.payloadSource != u.INITIAL_SERVER) && (this._id in aa.updates))) {\n                this.render();\n            };\n        }.bind(this));\n        n.handleUpdate(p.UFIPayloadSourceType.COLLAPSED_UFI, x);\n        g.loadModules([\"ScrollAwareDOM\",], function(z) {\n            m.scrollMonitor = z.monitor;\n        });\n    };\n    s(v.prototype, {\n        _onLike: function(event) {\n            q.getFeedbackTarget(this._id, function(w) {\n                r.changeLike(this._id, !w.hasviewerliked, {\n                    source: this._contextArgs.source,\n                    target: event.target,\n                    rootid: j.getID(this._root)\n                });\n            }.bind(this));\n            this._ufi.bounceLike();\n            event.preventDefault();\n        },\n        _onLikeMouseDown: function(event) {\n            this._ufi.shrinkLike();\n            event.preventDefault();\n        },\n        _onCommentClick: function(event) {\n            if (!this._ufiVisible) {\n                this._ufiVisible = true;\n                i.addClass(this._root, \"_6ka\");\n            }\n        ;\n            h.click(this._root);\n            event.preventDefault();\n        },\n        render: function() {\n            q.getFeedbackTarget(this._id, function(w) {\n                var x = k({\n                    commentCount: o.getCommentCount(this._id),\n                    feedback: w,\n                    hasAttachedUFIExpanded: this._contextArgs.hasattachedufiexpanded,\n                    numberDelimiter: this._contextArgs.numberdelimiter,\n                    onCommentClick: this._onCommentClick.bind(this),\n                    onLike: this._onLike.bind(this),\n                    onLikeMouseDown: this._onLikeMouseDown.bind(this),\n                    shareHref: this._contextArgs.sharehref,\n                    storyHref: this._contextArgs.storyhref\n                });\n                l.renderComponent(x, this._root);\n                this._ufi = (this._ufi || x);\n            }.bind(this));\n        }\n    });\n    e.exports = v;\n});\n__d(\"TypeaheadUtil\", [\"repeatString\",], function(a, b, c, d, e, f) {\n    var g = b(\"repeatString\"), h = /[ ]+/g, i = /[^ ]+/g, j = /[.,+*?$|#{}()\\^\\-\\[\\]\\\\\\/!@%'\"~=<>_:;\\u30fb\\u3001\\u3002\\u3008-\\u3011\\u3014-\\u301f\\uff1a-\\uff1f\\uff01-\\uff0f\\uff3b-\\uff40\\uff5b-\\uff65\\u2E2E\\u061f\\u066a-\\u066c\\u061b\\u060c\\u060d\\uFD3e\\uFD3F\\u1801\\u0964\\u104a\\u104b\\u2010-\\u2027\\u2030-\\u205e\\u00a1-\\u00b1\\u00b4-\\u00b8\\u00ba\\u00bb\\u00bf]/g, k = {\n    }, l = {\n        a: \"\\u0430 \\u00e0 \\u00e1 \\u00e2 \\u00e3 \\u00e4 \\u00e5\",\n        b: \"\\u0431\",\n        c: \"\\u0446 \\u00e7 \\u010d\",\n        d: \"\\u0434 \\u00f0 \\u010f \\u0111\",\n        e: \"\\u044d \\u0435 \\u00e8 \\u00e9 \\u00ea \\u00eb \\u011b\",\n        f: \"\\u0444\",\n        g: \"\\u0433 \\u011f\",\n        h: \"\\u0445 \\u0127\",\n        i: \"\\u0438 \\u00ec \\u00ed \\u00ee \\u00ef \\u0131\",\n        j: \"\\u0439\",\n        k: \"\\u043a \\u0138\",\n        l: \"\\u043b \\u013e \\u013a \\u0140 \\u0142\",\n        m: \"\\u043c\",\n        n: \"\\u043d \\u00f1 \\u0148 \\u0149 \\u014b\",\n        o: \"\\u043e \\u00f8 \\u00f6 \\u00f5 \\u00f4 \\u00f3 \\u00f2\",\n        p: \"\\u043f\",\n        r: \"\\u0440 \\u0159 \\u0155\",\n        s: \"\\u0441 \\u015f \\u0161 \\u017f\",\n        t: \"\\u0442 \\u0165 \\u0167 \\u00fe\",\n        u: \"\\u0443 \\u044e \\u00fc \\u00fb \\u00fa \\u00f9 \\u016f\",\n        v: \"\\u0432\",\n        y: \"\\u044b \\u00ff \\u00fd\",\n        z: \"\\u0437 \\u017e\",\n        ae: \"\\u00e6\",\n        oe: \"\\u0153\",\n        ts: \"\\u0446\",\n        ch: \"\\u0447\",\n        ij: \"\\u0133\",\n        sh: \"\\u0448\",\n        ss: \"\\u00df\",\n        ya: \"\\u044f\"\n    };\n    for (var m in l) {\n        var n = l[m].split(\" \");\n        for (var o = 0; (o < n.length); o++) {\n            k[n[o]] = m;;\n        };\n    };\n    var p = {\n    };\n    function q(w) {\n        return (w ? w.replace(j, \" \") : \"\");\n    };\n    function r(w) {\n        w = w.toLowerCase();\n        var x = \"\", y = \"\";\n        for (var z = w.length; z--; ) {\n            y = w.charAt(z);\n            x = (((k[y] || y)) + x);\n        };\n        return x.replace(h, \" \");\n    };\n    function s(w) {\n        var x = [], y = i.exec(w);\n        while (y) {\n            y = y[0];\n            x.push(y);\n            y = i.exec(w);\n        };\n        return x;\n    };\n    function t(w, x) {\n        if (!p.hasOwnProperty(w)) {\n            var y = r(w), z = q(y);\n            p[w] = {\n                value: w,\n                flatValue: y,\n                tokens: s(z),\n                isPrefixQuery: (z && (z[(z.length - 1)] != \" \"))\n            };\n        }\n    ;\n        if ((x && (typeof p[w].sortedTokens == \"undefined\"))) {\n            p[w].sortedTokens = p[w].tokens.slice();\n            p[w].sortedTokens.sort(function(aa, ba) {\n                return (ba.length - aa.length);\n            });\n        }\n    ;\n        return p[w];\n    };\n    function u(w, x, y) {\n        var z = t(x, (w == \"prefix\")), aa = ((w == \"prefix\") ? z.sortedTokens : z.tokens), ba = t(y).tokens, ca = {\n        }, da = ((z.isPrefixQuery && (w == \"query\")) ? (aa.length - 1) : null), ea = function(fa, ga) {\n            for (var ha = 0; (ha < ba.length); ++ha) {\n                var ia = ba[ha];\n                if ((!ca[ha] && (((ia == fa) || ((((((w == \"query\") && (ga === da)) || (w == \"prefix\"))) && (ia.indexOf(fa) === 0))))))) {\n                    return (ca[ha] = true)\n                };\n            };\n            return false;\n        };\n        return Boolean((aa.length && aa.every(ea)));\n    };\n    var v = {\n        flatten: r,\n        parse: t,\n        isExactMatch: u.bind(null, \"exact\"),\n        isQueryMatch: u.bind(null, \"query\"),\n        isPrefixMatch: u.bind(null, \"prefix\")\n    };\n    e.exports = v;\n});\n__d(\"KanaUtils\", [], function(a, b, c, d, e, f) {\n    var g = 12353, h = 12436, i = 96, j = {\n        normalizeHiragana: function(k) {\n            if ((k !== null)) {\n                var l = [];\n                for (var m = 0; (m < k.length); m++) {\n                    var n = k.charCodeAt(m);\n                    if (((n < g) || (n > h))) {\n                        l.push(k.charAt(m));\n                    }\n                     else {\n                        var o = (n + i);\n                        l.push(String.fromCharCode(o));\n                    }\n                ;\n                };\n                return l.join(\"\");\n            }\n             else return null\n        ;\n        }\n    };\n    e.exports = j;\n});\n__d(\"DataSource\", [\"ArbiterMixin\",\"AsyncRequest\",\"TypeaheadUtil\",\"copyProperties\",\"createArrayFrom\",\"createObjectFrom\",\"emptyFunction\",\"KanaUtils\",], function(a, b, c, d, e, f) {\n    var g = b(\"ArbiterMixin\"), h = b(\"AsyncRequest\"), i = b(\"TypeaheadUtil\"), j = b(\"copyProperties\"), k = b(\"createArrayFrom\"), l = b(\"createObjectFrom\"), m = b(\"emptyFunction\"), n = b(\"KanaUtils\");\n    function o(p) {\n        this._maxResults = (p.maxResults || 10);\n        this.token = p.token;\n        this.queryData = (p.queryData || {\n        });\n        this.queryEndpoint = (p.queryEndpoint || \"\");\n        this.bootstrapData = (p.bootstrapData || {\n        });\n        this.bootstrapEndpoint = (p.bootstrapEndpoint || \"\");\n        this._exclusions = (p.exclusions || []);\n        this._indexedFields = (p.indexedFields || [\"text\",\"tokens\",]);\n        this._titleFields = (p.titleFields || []);\n        this._alwaysPrefixMatch = (p.alwaysPrefixMatch || false);\n        this._deduplicationKey = (p.deduplicationKey || null);\n        this._enabledQueryCache = (p.enabledQueryCache || true);\n        this._queryExactMatch = (p.queryExactMatch || false);\n        this._acrossTransitions = (p.acrossTransitions || false);\n        this._kanaNormalization = (p.kanaNormalization || false);\n        this._minQueryLength = (p.minQueryLength || -1);\n        this._minExactMatchLength = 4;\n        this._filters = [];\n    };\n    j(o.prototype, g, {\n        events: [\"bootstrap\",\"query\",\"respond\",],\n        init: function() {\n            this.init = m;\n            this._fields = l(this._indexedFields);\n            this._activeQueries = 0;\n            this.dirty();\n        },\n        dirty: function() {\n            this.value = \"\";\n            this._bootstrapped = false;\n            this._bootstrapping = false;\n            this._data = {\n            };\n            this.localCache = {\n            };\n            this.queryCache = {\n            };\n            this.inform(\"dirty\", {\n            });\n            return this;\n        },\n        bootstrap: function() {\n            if (this._bootstrapped) {\n                return\n            };\n            this.bootstrapWithoutToken();\n            this._bootstrapped = true;\n            this._bootstrapping = true;\n            this.inform(\"bootstrap\", {\n                bootstrapping: true\n            });\n        },\n        bootstrapWithoutToken: function() {\n            this.fetch(this.bootstrapEndpoint, this.bootstrapData, {\n                bootstrap: true,\n                token: this.token\n            });\n        },\n        bootstrapWithToken: function() {\n            var p = j({\n            }, this.bootstrapData);\n            p.token = this.token;\n            this.fetch(this.bootstrapEndpoint, p, {\n                bootstrap: true,\n                replaceCache: true\n            });\n        },\n        query: function(p, q, r, s) {\n            this.inform(\"beforeQuery\", {\n                value: p,\n                local_only: q,\n                exclusions: r,\n                time_waited: s\n            });\n            if (!this._enabledQueryCache) {\n                this.queryCache = {\n                };\n            };\n            var t = this.buildUids(p, [], r), u = this.respond(p, t);\n            this.value = p;\n            this.inform(\"query\", {\n                value: p,\n                results: u\n            });\n            var v = this._normalizeString(p).flatValue;\n            if ((((((q || !v) || this._isQueryTooShort(v)) || !this.queryEndpoint) || this.getQueryCache().hasOwnProperty(v)) || !this.shouldFetchMoreResults(u))) {\n                return false\n            };\n            this.inform(\"queryEndpoint\", {\n                value: p\n            });\n            this.fetch(this.queryEndpoint, this.getQueryData(p, t), {\n                value: p,\n                exclusions: r\n            });\n            return true;\n        },\n        _isQueryTooShort: function(p) {\n            return ((p.length < this._minQueryLength));\n        },\n        _normalizeString: function(p, q) {\n            var r = p;\n            if (this._kanaNormalization) {\n                r = n.normalizeHiragana(p);\n            };\n            return i.parse(r, q);\n        },\n        shouldFetchMoreResults: function(p) {\n            return (p.length < this._maxResults);\n        },\n        getQueryData: function(p, q) {\n            var r = j({\n                value: p\n            }, (this.queryData || {\n            }));\n            q = (q || []);\n            if (q.length) {\n                r.existing_ids = q.join(\",\");\n            };\n            if (this._bootstrapping) {\n                r.bsp = true;\n            };\n            return r;\n        },\n        setQueryData: function(p, q) {\n            if (q) {\n                this.queryData = {\n                };\n            };\n            j(this.queryData, p);\n            return this;\n        },\n        setBootstrapData: function(p, q) {\n            if (q) {\n                this.bootstrapData = {\n                };\n            };\n            j(this.bootstrapData, p);\n            return this;\n        },\n        getExclusions: function() {\n            return k(this._exclusions);\n        },\n        setExclusions: function(p) {\n            this._exclusions = (p || []);\n        },\n        addFilter: function(p) {\n            var q = this._filters;\n            q.push(p);\n            return {\n                remove: function() {\n                    q.splice(q.indexOf(p), 1);\n                }\n            };\n        },\n        clearFilters: function() {\n            this._filters = [];\n        },\n        respond: function(p, q, r) {\n            var s = this.buildData(q);\n            this.inform(\"respond\", {\n                value: p,\n                results: s,\n                isAsync: !!r\n            });\n            return s;\n        },\n        asyncErrorHandler: m,\n        fetch: function(p, q, r) {\n            if (!p) {\n                return\n            };\n            var s = new h().setURI(p).setData(q).setMethod(\"GET\").setReadOnly(true).setAllowCrossPageTransition(this._acrossTransitions).setHandler(function(t) {\n                this.fetchHandler(t, (r || {\n                }));\n            }.bind(this));\n            if ((p === this.queryEndpoint)) {\n                s.setFinallyHandler(function() {\n                    this._activeQueries--;\n                    if (!this._activeQueries) {\n                        this.inform(\"activity\", {\n                            activity: false\n                        });\n                    };\n                }.bind(this));\n            };\n            s.setErrorHandler(this.asyncErrorHandler);\n            this.inform(\"beforeFetch\", {\n                request: s,\n                fetch_context: r\n            });\n            s.send();\n            if ((p === this.queryEndpoint)) {\n                if (!this._activeQueries) {\n                    this.inform(\"activity\", {\n                        activity: true\n                    });\n                };\n                this._activeQueries++;\n            }\n        ;\n        },\n        fetchHandler: function(p, q) {\n            var r = q.value, s = q.exclusions;\n            if ((!r && q.replaceCache)) {\n                this.localCache = {\n                };\n            };\n            this.inform(\"buildQueryCache\", {\n            });\n            var t = p.getPayload().entries;\n            this.addEntries(t, r);\n            this.inform(\"fetchComplete\", {\n                entries: t,\n                response: p,\n                value: r,\n                fetch_context: q\n            });\n            var u = (((!r && this.value)) ? this.value : r);\n            this.respond(u, this.buildUids(u, [], s), true);\n            if (!r) {\n                if (this._bootstrapping) {\n                    this._bootstrapping = false;\n                    this.inform(\"bootstrap\", {\n                        bootstrapping: false\n                    });\n                }\n            ;\n                if ((q.token && (p.getPayload().token !== q.token))) {\n                    this.bootstrapWithToken();\n                };\n            }\n        ;\n        },\n        addEntries: function(p, q) {\n            var r = this.processEntries(k((p || [])), q), s = this.buildUids(q, r);\n            if (q) {\n                var t = this.getQueryCache();\n                t[this._normalizeString(q).flatValue] = s;\n            }\n             else this.fillCache(s);\n        ;\n        },\n        processEntries: function(p, q) {\n            return p.map(function(r, s) {\n                var t = (r.uid = (r.uid + \"\")), u = this.getEntry(t);\n                if (!u) {\n                    u = r;\n                    u.query = q;\n                    this.setEntry(t, u);\n                }\n                 else j(u, r);\n            ;\n                ((u.index === undefined) && (u.index = s));\n                return t;\n            }, this);\n        },\n        getAllEntries: function() {\n            return (this._data || {\n            });\n        },\n        getEntry: function(p) {\n            return (this._data[p] || null);\n        },\n        setEntry: function(p, q) {\n            this._data[p] = q;\n        },\n        fillCache: function(p) {\n            var q = this.localCache;\n            p.forEach(function(r) {\n                var s = this.getEntry(r);\n                if (!s) {\n                    return\n                };\n                s.bootstrapped = true;\n                var t = this._normalizeString(this.getTextToIndex(s)).tokens;\n                for (var u = 0, v = t.length; (u < v); ++u) {\n                    var w = t[u];\n                    if (!q.hasOwnProperty(w)) {\n                        q[w] = {\n                        };\n                    };\n                    q[w][r] = true;\n                };\n            }, this);\n        },\n        getTextToIndex: function(p) {\n            if ((p.textToIndex && !p.needs_update)) {\n                return p.textToIndex\n            };\n            p.needs_update = false;\n            p.textToIndex = this.getTextToIndexFromFields(p, this._indexedFields);\n            return p.textToIndex;\n        },\n        getTextToIndexFromFields: function(p, q) {\n            var r = [];\n            for (var s = 0; (s < q.length); ++s) {\n                var t = p[q[s]];\n                if (t) {\n                    r.push((t.join ? t.join(\" \") : t));\n                };\n            };\n            return r.join(\" \");\n        },\n        mergeUids: function(p, q, r, s) {\n            this.inform(\"mergeUids\", {\n                local_uids: p,\n                query_uids: q,\n                new_uids: r,\n                value: s\n            });\n            var t = function(u, v) {\n                var w = this.getEntry(u), x = this.getEntry(v);\n                if ((w.extended_match !== x.extended_match)) {\n                    return (w.extended_match ? 1 : -1)\n                };\n                if ((w.index !== x.index)) {\n                    return (w.index - x.index)\n                };\n                if ((w.text.length !== x.text.length)) {\n                    return (w.text.length - x.text.length)\n                };\n                return (w.uid < x.uid);\n            }.bind(this);\n            this._checkExtendedMatch(s, p);\n            return this.deduplicateByKey(p.sort(t).concat(q, r));\n        },\n        _checkExtendedMatch: function(p, q) {\n            var r = (this._alwaysPrefixMatch ? i.isPrefixMatch : i.isQueryMatch);\n            for (var s = 0; (s < q.length); ++s) {\n                var t = this.getEntry(q[s]);\n                t.extended_match = (t.tokens ? !r(p, t.text) : false);\n            };\n        },\n        buildUids: function(p, q, r) {\n            if (!q) {\n                q = [];\n            };\n            if (!p) {\n                return q\n            };\n            if (!r) {\n                r = [];\n            };\n            var s = this.buildCacheResults(p, this.localCache), t = this.buildQueryResults(p), u = this.mergeUids(s, t, q, p), v = l(r.concat(this._exclusions)), w = u.filter(function(x) {\n                if ((v.hasOwnProperty(x) || !this.getEntry(x))) {\n                    return false\n                };\n                for (var y = 0; (y < this._filters.length); ++y) {\n                    if (!this._filters[y](this.getEntry(x), p)) {\n                        return false\n                    };\n                };\n                return (v[x] = true);\n            }, this);\n            return this.uidsIncludingExact(p, w, v);\n        },\n        uidsIncludingExact: function(p, q, r) {\n            var s = q.length;\n            if (((p.length < this._minExactMatchLength) || (s <= this._maxResults))) {\n                return q\n            };\n            for (var t = 0; (t < s); ++t) {\n                var u = this.getEntry(q[t]);\n                (u.text_lower || (u.text_lower = u.text.toLowerCase()));\n                if ((u.text_lower === this._normalizeString(p).flatValue)) {\n                    if ((t >= this._maxResults)) {\n                        var v = q.splice(t, 1);\n                        q.splice((this._maxResults - 1), 0, v);\n                    }\n                ;\n                    break;\n                }\n            ;\n            };\n            return q;\n        },\n        buildData: function(p) {\n            var q = [], r = Math.min(p.length, this._maxResults);\n            for (var s = 0; (s < r); ++s) {\n                q.push(this.getEntry(p[s]));;\n            };\n            return q;\n        },\n        findQueryCache: function(p) {\n            var q = 0, r = null, s = this.getQueryCache();\n            if (this._queryExactMatch) {\n                return (s[p] || [])\n            };\n            for (var t in s) {\n                if (((p.indexOf(t) === 0) && (t.length > q))) {\n                    q = t.length;\n                    r = t;\n                }\n            ;\n            };\n            return (s[r] || []);\n        },\n        buildQueryResults: function(p) {\n            var q = this._normalizeString(p).flatValue, r = this.findQueryCache(q);\n            if (this.getQueryCache().hasOwnProperty(q)) {\n                return r\n            };\n            return this.filterQueryResults(p, r);\n        },\n        filterQueryResults: function(p, q) {\n            var r = (this._alwaysPrefixMatch ? i.isPrefixMatch : i.isQueryMatch);\n            return q.filter(function(s) {\n                return r(p, this.getTextToIndex(this.getEntry(s)));\n            }, this);\n        },\n        buildCacheResults: function(p, q) {\n            var r = this._normalizeString(p, this._alwaysPrefixMatch), s = (this._alwaysPrefixMatch ? r.sortedTokens : r.tokens), t = s.length, u = (r.isPrefixQuery ? (t - 1) : null), v = {\n            }, w = {\n            }, x = {\n            }, y = [], z = false, aa = {\n            }, ba = 0;\n            for (var ca = 0; (ca < t); ++ca) {\n                var da = s[ca];\n                if (!aa.hasOwnProperty(da)) {\n                    ba++;\n                    aa[da] = true;\n                }\n                 else continue;\n            ;\n                for (var ea in q) {\n                    if ((((!v.hasOwnProperty(ea) && (ea === da))) || ((((this._alwaysPrefixMatch || (u === ca))) && (ea.indexOf(da) === 0))))) {\n                        if ((ea === da)) {\n                            if (w.hasOwnProperty(ea)) {\n                                z = true;\n                            };\n                            v[ea] = true;\n                        }\n                         else {\n                            if ((v.hasOwnProperty(ea) || w.hasOwnProperty(ea))) {\n                                z = true;\n                            };\n                            w[ea] = true;\n                        }\n                    ;\n                        for (var fa in q[ea]) {\n                            if (((ca === 0) || ((x.hasOwnProperty(fa) && (x[fa] == (ba - 1)))))) {\n                                x[fa] = ba;\n                            };\n                        };\n                    }\n                ;\n                };\n            };\n            for (var ga in x) {\n                if ((x[ga] == ba)) {\n                    y.push(ga);\n                };\n            };\n            if ((z || (ba < t))) {\n                y = this.filterQueryResults(p, y);\n            };\n            if ((this._titleFields && (this._titleFields.length > 0))) {\n                y = this.filterNonTitleMatchQueryResults(p, y);\n            };\n            return y;\n        },\n        filterNonTitleMatchQueryResults: function(p, q) {\n            return q.filter(function(r) {\n                var s = this._normalizeString(p), t = s.tokens.length;\n                if ((t === 0)) {\n                    return true\n                };\n                var u = this.getTitleTerms(this.getEntry(r)), v = s.tokens[0];\n                return (((((t === 1)) || this._alwaysPrefixMatch)) ? i.isPrefixMatch(v, u) : i.isQueryMatch(v, u));\n            }, this);\n        },\n        getTitleTerms: function(p) {\n            if (!p.titleToIndex) {\n                p.titleToIndex = this.getTextToIndexFromFields(p, this._titleFields);\n            };\n            return p.titleToIndex;\n        },\n        deduplicateByKey: function(p) {\n            if (!this._deduplicationKey) {\n                return p\n            };\n            var q = l(p.map(this._getDeduplicationKey.bind(this)), p);\n            return p.filter(function(r) {\n                return (q[this._getDeduplicationKey(r)] == r);\n            }.bind(this));\n        },\n        _getDeduplicationKey: function(p) {\n            var q = this.getEntry(p);\n            return (q[this._deduplicationKey] || ((\"__\" + p) + \"__\"));\n        },\n        getQueryCache: function() {\n            return this.queryCache;\n        },\n        setMaxResults: function(p) {\n            this._maxResults = p;\n            (this.value && this.respond(this.value, this.buildUids(this.value)));\n        },\n        updateToken: function(p) {\n            this.token = p;\n            this.dirty();\n            return this;\n        }\n    });\n    e.exports = o;\n});\n__d(\"BanzaiNectar\", [\"Banzai\",], function(a, b, c, d, e, f) {\n    var g = b(\"Banzai\");\n    function h(j) {\n        return {\n            log: function(k, l, m) {\n                var n = {\n                    e: l,\n                    a: m\n                };\n                g.post((\"nectar:\" + k), n, j);\n            }\n        };\n    };\n    var i = h();\n    i.create = h;\n    e.exports = i;\n});\n__d(\"DimensionLogging\", [\"BanzaiNectar\",\"DOMDimensions\",], function(a, b, c, d, e, f) {\n    var g = b(\"BanzaiNectar\"), h = b(\"DOMDimensions\"), i = h.getViewportDimensions();\n    g.log(\"browser_dimension\", \"homeload\", {\n        x: i.width,\n        y: i.height,\n        sw: window.screen.width,\n        sh: window.screen.height,\n        aw: window.screen.availWidth,\n        ah: window.screen.availHeight,\n        at: window.screen.availTop,\n        al: window.screen.availLeft\n    });\n});\n__d(\"MultiBootstrapDataSource\", [\"Class\",\"DataSource\",], function(a, b, c, d, e, f) {\n    var g = b(\"Class\"), h = b(\"DataSource\");\n    function i(j) {\n        this._bootstrapEndpoints = j.bootstrapEndpoints;\n        this.parent.construct(this, j);\n    };\n    g.extend(i, h);\n    i.prototype.bootstrapWithoutToken = function() {\n        for (var j = 0; (j < this._bootstrapEndpoints.length); j++) {\n            this.fetch(this._bootstrapEndpoints[j].endpoint, (this._bootstrapEndpoints[j].data || {\n            }), {\n                bootstrap: true\n            });;\n        };\n    };\n    e.exports = i;\n});\n__d(\"XHPTemplate\", [\"DataStore\",\"DOM\",\"HTML\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"DataStore\"), h = b(\"DOM\"), i = b(\"HTML\"), j = b(\"copyProperties\");\n    function k(m) {\n        this._model = m;\n    };\n    j(k.prototype, {\n        render: function() {\n            if (i.isHTML(this._model)) {\n                this._model = h.setContent(document.createDocumentFragment(), this._model)[0];\n            };\n            return this._model.cloneNode(true);\n        },\n        build: function() {\n            return new l(this.render());\n        }\n    });\n    j(k, {\n        getNode: function(m, n) {\n            return k.getNodes(m)[n];\n        },\n        getNodes: function(m) {\n            var n = g.get(m, \"XHPTemplate:nodes\");\n            if (!n) {\n                n = {\n                };\n                var o = h.scry(m, \"[data-jsid]\");\n                o.push(m);\n                var p = o.length;\n                while (p--) {\n                    var q = o[p];\n                    n[q.getAttribute(\"data-jsid\")] = q;\n                    q.removeAttribute(\"data-jsid\");\n                };\n                g.set(m, \"XHPTemplate:nodes\", n);\n            }\n        ;\n            return n;\n        }\n    });\n    function l(m) {\n        this._root = m;\n        this._populateNodes();\n    };\n    j(l.prototype, {\n        _populateNodes: function() {\n            this._nodes = {\n            };\n            this._leaves = {\n            };\n            var m = this._root.getElementsByTagName(\"*\");\n            for (var n = 0, o = m.length; (n < o); n++) {\n                var p = m[n], q = p.getAttribute(\"data-jsid\");\n                if (q) {\n                    p.removeAttribute(\"data-jsid\");\n                    this._nodes[q] = p;\n                    this._leaves[q] = !p.childNodes.length;\n                }\n            ;\n            };\n        },\n        getRoot: function() {\n            return this._root;\n        },\n        getNode: function(m) {\n            return this._nodes[m];\n        },\n        setNodeProperty: function(m, n, o) {\n            this.getNode(m)[n] = o;\n            return this;\n        },\n        setNodeContent: function(m, n) {\n            if (!this._leaves[m]) {\n                throw new Error((\"Can't setContent on non-leaf node: \" + m))\n            };\n            h.setContent(this.getNode(m), n);\n            return this;\n        }\n    });\n    e.exports = k;\n});");
// 1063
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"s93c2e40407555ddbaca9d11f5326c966155ad343");
// 1064
geval("if (JSBNG__self.CavalryLogger) {\n    CavalryLogger.start_js([\"OJTM4\",]);\n}\n;\n;\n__d(\"AjaxRequest\", [\"ErrorUtils\",\"Keys\",\"URI\",\"UserAgent\",\"XHR\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"ErrorUtils\"), h = b(\"Keys\"), i = b(\"URI\"), j = b(\"UserAgent\"), k = b(\"XHR\"), l = b(\"copyProperties\");\n    function m(q, r, s) {\n        this.xhr = k.create();\n        if (!((r instanceof i))) {\n            r = new i(r);\n        }\n    ;\n    ;\n        if (((s && ((q == \"GET\"))))) {\n            r.setQueryData(s);\n        }\n         else this._params = s;\n    ;\n    ;\n        this.method = q;\n        this.uri = r;\n        this.xhr.open(q, r);\n    };\n;\n    var n = ((window.JSBNG__XMLHttpRequest && ((\"withCredentials\" in new JSBNG__XMLHttpRequest()))));\n    m.supportsCORS = function() {\n        return n;\n    };\n    m.ERROR = \"ar:error\";\n    m.TIMEOUT = \"ar:timeout\";\n    m.PROXY_ERROR = \"ar:proxy error\";\n    m.TRANSPORT_ERROR = \"ar:transport error\";\n    m.SERVER_ERROR = \"ar:http error\";\n    m.PARSE_ERROR = \"ar:parse error\";\n    m._inflight = [];\n    function o() {\n        var q = m._inflight;\n        m._inflight = [];\n        q.forEach(function(r) {\n            r.abort();\n        });\n    };\n;\n    function p(q) {\n        q.onJSON = q.onError = q.onSuccess = null;\n        JSBNG__clearTimeout(q._timer);\n        if (((q.xhr && ((q.xhr.readyState < 4))))) {\n            q.xhr.abort();\n            q.xhr = null;\n        }\n    ;\n    ;\n        m._inflight = m._inflight.filter(function(r) {\n            return ((((((r && ((r != q)))) && r.xhr)) && ((r.xhr.readyState < 4))));\n        });\n    };\n;\n    l(m.prototype, {\n        timeout: 60000,\n        streamMode: true,\n        prelude: /^for \\(;;\\);/,\n        JSBNG__status: null,\n        _eol: -1,\n        _call: function(q) {\n            if (this[q]) {\n                this[q](this);\n            }\n        ;\n        ;\n        },\n        _parseStatus: function() {\n            var q;\n            try {\n                this.JSBNG__status = this.xhr.JSBNG__status;\n                q = this.xhr.statusText;\n            } catch (r) {\n                if (((this.xhr.readyState >= 4))) {\n                    this.errorType = m.TRANSPORT_ERROR;\n                    this.errorText = r.message;\n                }\n            ;\n            ;\n                return;\n            };\n        ;\n            if (((((this.JSBNG__status === 0)) && !(/^(file|ftp)/.test(this.uri))))) {\n                this.errorType = m.TRANSPORT_ERROR;\n            }\n             else if (((((this.JSBNG__status >= 100)) && ((this.JSBNG__status < 200))))) {\n                this.errorType = m.PROXY_ERROR;\n            }\n             else if (((((this.JSBNG__status >= 200)) && ((this.JSBNG__status < 300))))) {\n                return;\n            }\n             else if (((((this.JSBNG__status >= 300)) && ((this.JSBNG__status < 400))))) {\n                this.errorType = m.PROXY_ERROR;\n            }\n             else if (((((this.JSBNG__status >= 400)) && ((this.JSBNG__status < 500))))) {\n                this.errorType = m.SERVER_ERROR;\n            }\n             else if (((((this.JSBNG__status >= 500)) && ((this.JSBNG__status < 600))))) {\n                this.errorType = m.PROXY_ERROR;\n            }\n             else if (((this.JSBNG__status == 1223))) {\n                return;\n            }\n             else if (((((this.JSBNG__status >= 12001)) && ((this.JSBNG__status <= 12156))))) {\n                this.errorType = m.TRANSPORT_ERROR;\n            }\n             else {\n                q = ((\"unrecognized status code: \" + this.JSBNG__status));\n                this.errorType = m.ERROR;\n            }\n            \n            \n            \n            \n            \n            \n            \n        ;\n        ;\n            if (!this.errorText) {\n                this.errorText = q;\n            }\n        ;\n        ;\n        },\n        _parseResponse: function() {\n            var q, r = this.xhr.readyState;\n            try {\n                q = ((this.xhr.responseText || \"\"));\n            } catch (s) {\n                if (((r >= 4))) {\n                    this.errorType = m.ERROR;\n                    this.errorText = ((\"responseText not available - \" + s.message));\n                }\n            ;\n            ;\n                return;\n            };\n        ;\n            while (this.xhr) {\n                var t = ((this._eol + 1)), u = ((this.streamMode ? q.indexOf(\"\\u000a\", t) : q.length));\n                if (((((u < 0)) && ((r == 4))))) {\n                    u = q.length;\n                }\n            ;\n            ;\n                if (((u <= this._eol))) {\n                    break;\n                }\n            ;\n            ;\n                var v = q;\n                if (this.streamMode) {\n                    v = q.substr(t, ((u - t))).replace(/^\\s*|\\s*$/g, \"\");\n                }\n            ;\n            ;\n                if (((((t === 0)) && this.prelude))) {\n                    if (this.prelude.test(v)) {\n                        v = v.replace(this.prelude, \"\");\n                    }\n                ;\n                }\n            ;\n            ;\n                this._eol = u;\n                if (v) {\n                    try {\n                        this.json = JSON.parse(v);\n                    } catch (s) {\n                        var w = (((/(<body[\\S\\s]+?<\\/body>)/i).test(q) && RegExp.$1)), x = {\n                            message: s.message,\n                            char: t,\n                            excerpt: ((((((t === 0)) && w)) || v)).substr(512)\n                        };\n                        this.errorType = m.PARSE_ERROR;\n                        this.errorText = ((\"parse error - \" + JSON.stringify(x)));\n                        return;\n                    };\n                ;\n                    g.applyWithGuard(this._call, this, [\"onJSON\",]);\n                }\n            ;\n            ;\n            };\n        ;\n        },\n        _onReadyState: function() {\n            var q = ((((this.xhr && this.xhr.readyState)) || 0));\n            if (((((this.JSBNG__status == null)) && ((q >= 2))))) {\n                this._parseStatus();\n            }\n        ;\n        ;\n            if (((!this.errorType && ((this.JSBNG__status != null))))) {\n                if (((((((q == 3)) && this.streamMode)) || ((q == 4))))) {\n                    this._parseResponse();\n                }\n            ;\n            }\n        ;\n        ;\n            if (((this.errorType || ((q == 4))))) {\n                this._time = ((JSBNG__Date.now() - this._sentAt));\n                this._call(((!this.errorType ? \"onSuccess\" : \"onError\")));\n                p(this);\n            }\n        ;\n        ;\n        },\n        send: function(q) {\n            this.xhr.onreadystatechange = function() {\n                g.applyWithGuard(this._onReadyState, this, arguments);\n            }.bind(this);\n            var r = this.timeout;\n            if (r) {\n                this._timer = JSBNG__setTimeout((function() {\n                    this.errorType = m.TIMEOUT;\n                    this.errorText = \"timeout\";\n                    this._time = ((JSBNG__Date.now() - this._sentAt));\n                    this._call(\"onError\");\n                    p(this);\n                }).bind(this), r, false);\n            }\n        ;\n        ;\n            m._inflight.push(this);\n            if (((this.method == \"POST\"))) {\n                this.xhr.setRequestHeader(\"Content-Type\", \"application/x-www-form-urlencoded\");\n            }\n        ;\n        ;\n            this._sentAt = JSBNG__Date.now();\n            this.xhr.send(((q ? i.implodeQuery(q) : \"\")));\n        },\n        abort: function() {\n            p(this);\n        },\n        toString: function() {\n            var q = ((\"[AjaxRequest readyState=\" + this.xhr.readyState));\n            if (this.errorType) {\n                q += ((((((((\" errorType=\" + this.errorType)) + \" (\")) + this.errorText)) + \")\"));\n            }\n        ;\n        ;\n            return ((q + \"]\"));\n        },\n        toJSON: function() {\n            var q = {\n                json: this.json,\n                JSBNG__status: this.JSBNG__status,\n                errorType: this.errorType,\n                errorText: this.errorText,\n                time: this._time\n            };\n            if (this.errorType) {\n                q.uri = this.uri;\n            }\n        ;\n        ;\n            {\n                var fin48keys = ((window.top.JSBNG_Replay.forInKeys)((q))), fin48i = (0);\n                var r;\n                for (; (fin48i < fin48keys.length); (fin48i++)) {\n                    ((r) = (fin48keys[fin48i]));\n                    {\n                        if (((q[r] == null))) {\n                            delete q[r];\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            return q;\n        }\n    });\n    if (((window.JSBNG__addEventListener && j.firefox()))) {\n        window.JSBNG__addEventListener(\"keydown\", function(JSBNG__event) {\n            if (((JSBNG__event.keyCode === h.ESC))) {\n                JSBNG__event.prevent();\n            }\n        ;\n        ;\n        }, false);\n    }\n;\n;\n    if (window.JSBNG__attachEvent) {\n        window.JSBNG__attachEvent(\"JSBNG__onunload\", o);\n    }\n;\n;\n    e.exports = m;\n});\n__d(\"FBAjaxRequest\", [\"AjaxRequest\",\"copyProperties\",\"XHR\",], function(a, b, c, d, e, f) {\n    var g = b(\"AjaxRequest\"), h = b(\"copyProperties\"), i = b(\"XHR\");\n    function j(k, l, m) {\n        m = h(i.getAsyncParams(k), m);\n        var n = new g(k, l, m);\n        n.streamMode = false;\n        var o = n._call;\n        n._call = function(p) {\n            if (((((p == \"onJSON\")) && this.json))) {\n                if (this.json.error) {\n                    this.errorType = g.SERVER_ERROR;\n                    this.errorText = ((\"AsyncResponse error: \" + this.json.error));\n                }\n            ;\n            ;\n                this.json = this.json.payload;\n            }\n        ;\n        ;\n            o.apply(this, arguments);\n        };\n        n.ajaxReqSend = n.send;\n        n.send = function(p) {\n            this.ajaxReqSend(h(p, m));\n        };\n        return n;\n    };\n;\n    e.exports = j;\n});\n__d(\"CallbackManagerController\", [\"ErrorUtils\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"ErrorUtils\"), h = b(\"copyProperties\"), i = function(j) {\n        this._pendingIDs = [];\n        this._allRequests = [undefined,];\n        this._callbackArgHandler = j;\n    };\n    h(i.prototype, {\n        executeOrEnqueue: function(j, k, l) {\n            l = ((l || {\n            }));\n            var m = this._attemptCallback(k, j, l);\n            if (m) {\n                return 0;\n            }\n        ;\n        ;\n            this._allRequests.push({\n                fn: k,\n                request: j,\n                options: l\n            });\n            var n = ((this._allRequests.length - 1));\n            this._pendingIDs.push(n);\n            return n;\n        },\n        unsubscribe: function(j) {\n            delete this._allRequests[j];\n        },\n        reset: function() {\n            this._allRequests = [];\n        },\n        getRequest: function(j) {\n            return this._allRequests[j];\n        },\n        runPossibleCallbacks: function() {\n            var j = this._pendingIDs;\n            this._pendingIDs = [];\n            var k = [];\n            j.forEach(function(l) {\n                var m = this._allRequests[l];\n                if (!m) {\n                    return;\n                }\n            ;\n            ;\n                if (this._callbackArgHandler(m.request, m.options)) {\n                    k.push(l);\n                }\n                 else this._pendingIDs.push(l);\n            ;\n            ;\n            }.bind(this));\n            k.forEach(function(l) {\n                var m = this._allRequests[l];\n                delete this._allRequests[l];\n                this._attemptCallback(m.fn, m.request, m.options);\n            }.bind(this));\n        },\n        _attemptCallback: function(j, k, l) {\n            var m = this._callbackArgHandler(k, l);\n            if (m) {\n                var n = {\n                    ids: k\n                };\n                g.applyWithGuard(j, n, m);\n            }\n        ;\n        ;\n            return !!m;\n        }\n    });\n    e.exports = i;\n});\n__d(\"deferred\", [], function(a, b, c, d, e, f) {\n    var g = 0, h = 1, i = 2, j = 4, k = \"callbacks\", l = \"errbacks\", m = \"cancelbacks\", n = \"completeCallbacks\", o = [], p = o.slice, q = o.unshift;\n    function r(w, x) {\n        return ((w ? p.call(w, x) : o));\n    };\n;\n    function s(w, x) {\n        return ((((x < w.length)) ? r(w, x) : o));\n    };\n;\n    function t() {\n        this.$Deferred0 = g;\n    };\n;\n    t.prototype.addCallback = function(w, x) {\n        return this.$Deferred1(h, this.$Deferred2(k), w, x, s(arguments, 2));\n    };\n    t.prototype.removeCallback = function(w, x) {\n        return this.$Deferred3(this.$Deferred2(k), w, x);\n    };\n    t.prototype.addCompleteCallback = function(w, x) {\n        return this.$Deferred1(null, this.$Deferred2(n), w, x, s(arguments, 2));\n    };\n    t.prototype.removeCompleteCallback = function(w, x) {\n        return this.$Deferred3(this.$Deferred2(n), w, x);\n    };\n    t.prototype.addErrback = function(w, x) {\n        return this.$Deferred1(i, this.$Deferred2(l), w, x, s(arguments, 2));\n    };\n    t.prototype.removeErrback = function(w, x) {\n        return this.$Deferred3(this.$Deferred2(l), w, x);\n    };\n    t.prototype.addCancelback = function(w, x) {\n        return this.$Deferred1(j, this.$Deferred2(m), w, x, s(arguments, 2));\n    };\n    t.prototype.removeCancelback = function(w, x) {\n        return this.$Deferred3(this.$Deferred2(m), w, x);\n    };\n    t.prototype.getStatus = function() {\n        return this.$Deferred0;\n    };\n    t.prototype.setStatus = function(w) {\n        var x;\n        this.$Deferred0 = w;\n        this.callbackArgs = r(arguments, 1);\n        if (((w === i))) {\n            x = l;\n        }\n         else if (((w === h))) {\n            x = k;\n        }\n         else if (((w === j))) {\n            x = m;\n        }\n        \n        \n    ;\n    ;\n        if (x) {\n            this.$Deferred4(this[x], this.callbackArgs);\n        }\n    ;\n    ;\n        this.$Deferred4(this[n], this.callbackArgs);\n        return this;\n    };\n    t.prototype.JSBNG__setTimeout = function(w) {\n        if (this.timeout) {\n            this.JSBNG__clearTimeout();\n        }\n    ;\n    ;\n        this.$Deferred5 = ((this.$Deferred5 || this.fail.bind(this)));\n        this.timeout = window.JSBNG__setTimeout(this.$Deferred5, w);\n    };\n    t.prototype.JSBNG__clearTimeout = function() {\n        window.JSBNG__clearTimeout(this.timeout);\n        delete this.timeout;\n    };\n    t.prototype.succeed = function() {\n        return this.$Deferred6(h, arguments);\n    };\n    t.prototype.fail = function() {\n        return this.$Deferred6(i, arguments);\n    };\n    t.prototype.cancel = function() {\n        delete this[k];\n        delete this[l];\n        return this.$Deferred6(j, arguments);\n    };\n    t.prototype.$Deferred6 = function(w, x) {\n        q.call(x, w);\n        return this.setStatus.apply(this, x);\n    };\n    t.prototype.$Deferred2 = function(w) {\n        return ((this[w] || (this[w] = [])));\n    };\n    t.prototype.then = function(w, x, y, z) {\n        var aa = new t(), w, ba, ca, da = r(arguments, 0);\n        if (((typeof da[0] === \"function\"))) {\n            w = da.shift();\n        }\n    ;\n    ;\n        if (((typeof da[0] === \"function\"))) {\n            ba = da.shift();\n        }\n    ;\n    ;\n        if (((typeof da[0] === \"function\"))) {\n            ca = da.shift();\n        }\n    ;\n    ;\n        var ea = da.shift();\n        if (w) {\n            var fa = [this.$Deferred7,this,aa,\"succeed\",w,ea,].concat(da);\n            this.addCallback.apply(this, fa);\n        }\n         else this.addCallback(aa.succeed, aa);\n    ;\n    ;\n        if (ba) {\n            var ga = [this.$Deferred7,this,aa,\"fail\",ba,ea,].concat(da);\n            this.addErrback.apply(this, ga);\n        }\n         else this.addErrback(aa.fail, aa);\n    ;\n    ;\n        if (ca) {\n            var ha = [this.$Deferred7,this,aa,\"cancel\",ca,ea,].concat(da);\n            this.addCancelback.apply(this, ha);\n        }\n         else this.addCancelback(aa.cancel, aa);\n    ;\n    ;\n        return aa;\n    };\n    t.prototype.$Deferred1 = function(w, x, y, z, aa) {\n        var ba = this.getStatus();\n        if (((((!w && ((ba !== g)))) || ((ba === w))))) {\n            y.apply(((z || this)), aa.concat(this.callbackArgs));\n        }\n         else x.push(y, z, aa);\n    ;\n    ;\n        return this;\n    };\n    t.prototype.$Deferred3 = function(w, x, y) {\n        for (var z = 0; ((z < w.length)); z += 3) {\n            if (((((w[z] === x)) && ((!y || ((w[((z + 1))] === y))))))) {\n                w.splice(z, 3);\n                if (y) {\n                    break;\n                }\n            ;\n            ;\n                z -= 3;\n            }\n        ;\n        ;\n        };\n    ;\n        return this;\n    };\n    t.prototype.pipe = function(w) {\n        this.addCallback(w.succeed, w).addErrback(w.fail, w).addCancelback(w.cancel, w);\n    };\n    t.prototype.$Deferred4 = function(w, x) {\n        for (var y = 0; ((y < ((w || o)).length)); y += 3) {\n            w[y].apply(((w[((y + 1))] || this)), ((w[((y + 2))] || o)).concat(x));\n        ;\n        };\n    ;\n    };\n    t.prototype.$Deferred7 = function(w, x, y, z) {\n        var aa = r(arguments, 4), ba = y.apply(z, aa);\n        if (((ba instanceof t))) {\n            ba.pipe(w);\n        }\n         else w[x](ba);\n    ;\n    ;\n    };\n    var u = ((((t === null)) ? null : t.prototype));\n    v.prototype = Object.create(u);\n    v.prototype.constructor = v;\n    v.__superConstructor__ = t;\n    function v(w) {\n        t.call(this);\n        this.completed = 0;\n        this.list = [];\n        if (w) {\n            w.forEach(this.waitFor, this);\n            this.startWaiting();\n        }\n    ;\n    ;\n    };\n;\n    v.prototype.startWaiting = function() {\n        this.waiting = true;\n        this.checkDeferreds();\n        return this;\n    };\n    v.prototype.waitFor = function(w) {\n        this.list.push(w);\n        this.checkDeferreds();\n        w.addCompleteCallback(this.deferredComplete, this);\n        return this;\n    };\n    v.prototype.createWaitForDeferred = function() {\n        var w = new t();\n        this.waitFor(w);\n        return w;\n    };\n    v.prototype.createWaitForCallback = function() {\n        var w = this.createWaitForDeferred();\n        return w.succeed.bind(w);\n    };\n    v.prototype.deferredComplete = function() {\n        this.completed++;\n        if (((this.completed === this.list.length))) {\n            this.checkDeferreds();\n        }\n    ;\n    ;\n    };\n    v.prototype.checkDeferreds = function() {\n        if (((!this.waiting || ((this.completed !== this.list.length))))) {\n            return;\n        }\n    ;\n    ;\n        var w = false, x = false, y = [g,];\n        for (var z = 0, aa = this.list.length; ((z < aa)); z++) {\n            var ba = this.list[z];\n            y.push([ba,].concat(ba.callbackArgs));\n            if (((ba.getStatus() === i))) {\n                w = true;\n            }\n             else if (((ba.getStatus() === j))) {\n                x = true;\n            }\n            \n        ;\n        ;\n        };\n    ;\n        if (w) {\n            y[0] = i;\n            this.fail.apply(this, y);\n        }\n         else if (x) {\n            y[0] = j;\n            this.cancel.apply(this, y);\n        }\n         else {\n            y[0] = h;\n            this.succeed.apply(this, y);\n        }\n        \n    ;\n    ;\n    };\n    f.Deferred = t;\n    f.DeferredList = v;\n    f.Deferred.toArray = r;\n    f.Deferred.STATUS_UNKNOWN = g;\n    f.Deferred.STATUS_SUCCEEDED = h;\n    f.Deferred.STATUS_CANCELED = j;\n    f.Deferred.STATUS_FAILED = i;\n});\n__d(\"KeyedCallbackManager\", [\"CallbackManagerController\",\"deferred\",\"ErrorUtils\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"CallbackManagerController\"), h = b(\"deferred\").Deferred, i = b(\"ErrorUtils\"), j = b(\"copyProperties\"), k = function() {\n        this._resources = {\n        };\n        this._controller = new g(this._constructCallbackArg.bind(this));\n    };\n    j(k.prototype, {\n        executeOrEnqueue: function(l, m) {\n            if (!((l instanceof Array))) {\n                var n = l, o = m;\n                l = [l,];\n                m = function(p) {\n                    o(p[n]);\n                };\n            }\n        ;\n        ;\n            l = l.filter(function(p) {\n                var q = ((((p !== null)) && ((p !== undefined))));\n                if (!q) {\n                    i.applyWithGuard(function() {\n                        throw new Error(((((\"KeyedCallbackManager.executeOrEnqueue: key \" + JSON.stringify(p))) + \" is invalid\")));\n                    });\n                }\n            ;\n            ;\n                return q;\n            });\n            return this._controller.executeOrEnqueue(l, m);\n        },\n        deferredExecuteOrEnqueue: function(l) {\n            var m = new h();\n            this.executeOrEnqueue(l, m.succeed.bind(m));\n            return m;\n        },\n        unsubscribe: function(l) {\n            this._controller.unsubscribe(l);\n        },\n        reset: function() {\n            this._controller.reset();\n            this._resources = {\n            };\n        },\n        getUnavailableResources: function(l) {\n            var m = this._controller.getRequest(l), n = [];\n            if (m) {\n                n = m.request.filter(function(o) {\n                    return !this._resources[o];\n                }.bind(this));\n            }\n        ;\n        ;\n            return n;\n        },\n        getUnavailableResourcesFromRequest: function(l) {\n            var m = ((Array.isArray(l) ? l : [l,]));\n            return m.filter(function(n) {\n                if (((((n !== null)) && ((n !== undefined))))) {\n                    return !this._resources[n];\n                }\n            ;\n            ;\n            }, this);\n        },\n        addResourcesAndExecute: function(l) {\n            j(this._resources, l);\n            this._controller.runPossibleCallbacks();\n        },\n        setResource: function(l, m) {\n            this._resources[l] = m;\n            this._controller.runPossibleCallbacks();\n        },\n        getResource: function(l) {\n            return this._resources[l];\n        },\n        getAllResources: function() {\n            return this._resources;\n        },\n        dumpResources: function() {\n            var l = {\n            };\n            {\n                var fin49keys = ((window.top.JSBNG_Replay.forInKeys)((this._resources))), fin49i = (0);\n                var m;\n                for (; (fin49i < fin49keys.length); (fin49i++)) {\n                    ((m) = (fin49keys[fin49i]));\n                    {\n                        var n = this._resources[m];\n                        if (((typeof n === \"object\"))) {\n                            n = j({\n                            }, n);\n                        }\n                    ;\n                    ;\n                        l[m] = n;\n                    };\n                };\n            };\n        ;\n            return l;\n        },\n        _constructCallbackArg: function(l) {\n            var m = {\n            };\n            for (var n = 0; ((n < l.length)); n++) {\n                var o = l[n], p = this._resources[o];\n                if (((typeof p == \"undefined\"))) {\n                    return false;\n                }\n            ;\n            ;\n                m[o] = p;\n            };\n        ;\n            return [m,];\n        }\n    });\n    e.exports = k;\n});\n__d(\"BaseAsyncLoader\", [\"KeyedCallbackManager\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"KeyedCallbackManager\"), h = b(\"copyProperties\"), i = {\n    };\n    function j(l, m, n) {\n        var o = new g(), p = false, q = [];\n        function r() {\n            if (((!q.length || p))) {\n                return;\n            }\n        ;\n        ;\n            p = true;\n            t.defer();\n        };\n    ;\n        function s(w) {\n            p = false;\n            w.forEach(o.unsubscribe.bind(o));\n            r();\n        };\n    ;\n        function t() {\n            var w = {\n            }, x = [];\n            q = q.filter(function(z) {\n                var aa = o.getUnavailableResources(z);\n                if (aa.length) {\n                    aa.forEach(function(ba) {\n                        w[ba] = true;\n                    });\n                    x.push(z);\n                    return true;\n                }\n            ;\n            ;\n                return false;\n            });\n            var y = Object.keys(w);\n            if (y.length) {\n                n(l, y, x, u.curry(x), v.curry(x));\n            }\n             else p = false;\n        ;\n        ;\n        };\n    ;\n        function u(w, x) {\n            var y = ((x.payload[m] || x.payload));\n            o.addResourcesAndExecute(y);\n            s(w);\n        };\n    ;\n        function v(w) {\n            s(w);\n        };\n    ;\n        return {\n            get: function(w, x) {\n                var y = o.executeOrEnqueue(w, x), z = o.getUnavailableResources(y);\n                if (z.length) {\n                    q.push(y);\n                    r();\n                }\n            ;\n            ;\n            },\n            getCachedKeys: function() {\n                return Object.keys(o.getAllResources());\n            },\n            getNow: function(w) {\n                return ((o.getResource(w) || null));\n            },\n            set: function(w) {\n                o.addResourcesAndExecute(w);\n            }\n        };\n    };\n;\n    function k(l, m) {\n        throw (\"BaseAsyncLoader can't be instantiated\");\n    };\n;\n    h(k.prototype, {\n        _getLoader: function() {\n            if (!i[this._endpoint]) {\n                i[this._endpoint] = j(this._endpoint, this._type, this.send);\n            }\n        ;\n        ;\n            return i[this._endpoint];\n        },\n        get: function(l, m) {\n            return this._getLoader().get(l, m);\n        },\n        getCachedKeys: function() {\n            return this._getLoader().getCachedKeys();\n        },\n        getNow: function(l) {\n            return this._getLoader().getNow(l);\n        },\n        reset: function() {\n            i[this._endpoint] = null;\n        },\n        set: function(l) {\n            this._getLoader().set(l);\n        }\n    });\n    e.exports = k;\n});\n__d(\"AjaxLoader\", [\"copyProperties\",\"FBAjaxRequest\",\"BaseAsyncLoader\",], function(a, b, c, d, e, f) {\n    var g = b(\"copyProperties\"), h = b(\"FBAjaxRequest\"), i = b(\"BaseAsyncLoader\");\n    function j(k, l) {\n        this._endpoint = k;\n        this._type = l;\n    };\n;\n    g(j.prototype, i.prototype);\n    j.prototype.send = function(k, l, m, n, o) {\n        var p = new h(\"GET\", k, {\n            ids: l\n        });\n        p.onJSON = function(q) {\n            n({\n                payload: q.json\n            });\n        };\n        p.onError = o;\n        p.send();\n    };\n    e.exports = j;\n});\n__d(\"CLoggerX\", [\"Banzai\",\"DOM\",\"debounce\",\"JSBNG__Event\",\"ge\",\"Parent\",\"Keys\",], function(a, b, c, d, e, f) {\n    var g = b(\"Banzai\"), h = b(\"DOM\"), i = b(\"debounce\"), j = b(\"JSBNG__Event\"), k = b(\"ge\"), l = b(\"Parent\"), m = ((((10 * 60)) * 1000)), n = b(\"Keys\").RETURN, o = {\n    }, p = function(s) {\n        var t = ((s.target || s.srcElement)).id, u = ((s.target || s.srcElement)).value.trim().length, v = q.getTracker(t);\n        if (!v) {\n            return;\n        }\n    ;\n    ;\n        if (((((u > 5)) && !v.submitted))) {\n            g.post(\"censorlogger\", {\n                cl_impid: v.impid,\n                clearcounter: v.clearcounter,\n                instrument: v.type,\n                elementid: t,\n                parent_fbid: ((((v.parent_fbid == \"unknown\")) ? null : v.parent_fbid)),\n                version: \"x\"\n            }, g.VITAL);\n            q.setSubmitted(t, true);\n        }\n         else if (((((((u === 0)) && v.submitted)) && ((s.which != n))))) {\n            o[t] = r(t);\n            o[t]();\n        }\n         else if (((((u > 0)) && v.submitted))) {\n            if (o[t]) {\n                o[t].reset();\n            }\n        ;\n        }\n        \n        \n    ;\n    ;\n    }, q = {\n        init: function() {\n            this.trackedElements = ((this.trackedElements || {\n            }));\n            this.feedbackForms = ((this.feedbackForms || {\n            }));\n        },\n        setImpressionID: function(s) {\n            this.init();\n            this.impressionID = s;\n            this.clean();\n        },\n        setComposerTargetData: function(s) {\n            this.cTargetID = ((s.targetID || \"unknown\"));\n            this.cTargetFBType = ((s.targetType || \"unknown\"));\n        },\n        clean: function() {\n            {\n                var fin50keys = ((window.top.JSBNG_Replay.forInKeys)((this.trackedElements))), fin50i = (0);\n                var s;\n                for (; (fin50i < fin50keys.length); (fin50i++)) {\n                    ((s) = (fin50keys[fin50i]));\n                    {\n                        if (o[s]) {\n                            o[s].reset();\n                            delete o[s];\n                        }\n                    ;\n                    ;\n                        delete this.trackedElements[s];\n                    };\n                };\n            };\n        ;\n        },\n        trackComposer: function(s, t, u) {\n            this.setComposerTargetData(u);\n            this.startTracking(s, \"composer\", this.cTargetID, this.cTargetFBType, t);\n        },\n        trackFeedbackForm: function(s, t, u) {\n            this.init();\n            this.impressionID = ((this.impressionID || u));\n            var v, w, x;\n            v = h.getID(s);\n            w = ((t ? ((t.targetID || \"unknown\")) : \"unknown\"));\n            x = ((t ? ((t.targetType || \"unknown\")) : \"unknown\"));\n            this.feedbackForms[v] = {\n                parent_fbid: w,\n                parent_type: x\n            };\n        },\n        trackMentionsInput: function(s, t) {\n            this.init();\n            var u, v, w;\n            if (!s) {\n                return;\n            }\n        ;\n        ;\n            u = l.byTag(s, \"form\");\n            if (!u) {\n                return;\n            }\n        ;\n        ;\n            v = h.getID(u);\n            w = this.feedbackForms[v];\n            if (!w) {\n                return;\n            }\n        ;\n        ;\n            var x = ((t || w.parent_fbid)), y = ((t ? 416 : w.parent_type));\n            this.startTracking(s, \"comment\", x, y, u);\n        },\n        startTracking: function(s, t, u, v, w) {\n            this.init();\n            var x = h.getID(s);\n            if (this.getTracker(x)) {\n                return;\n            }\n        ;\n        ;\n            var y = h.getID(w);\n            j.listen(s, \"keyup\", p.bind(this));\n            this.trackedElements[x] = {\n                submitted: false,\n                clearcounter: 0,\n                type: t,\n                impid: this.impressionID,\n                parent_fbid: u,\n                parent_type: v,\n                parentElID: y\n            };\n            this.addJoinTableInfoToForm(w, x);\n        },\n        getTracker: function(s) {\n            return ((this.trackedElements ? this.trackedElements[s] : null));\n        },\n        setSubmitted: function(s, t) {\n            if (this.trackedElements[s]) {\n                this.trackedElements[s].submitted = t;\n            }\n        ;\n        ;\n        },\n        incrementClearCounter: function(s) {\n            var t = this.getTracker(s);\n            if (!t) {\n                return;\n            }\n        ;\n        ;\n            t.clearcounter++;\n            t.submitted = false;\n            var u = h.scry(k(t.parentElID), \"input[name=\\\"clp\\\"]\")[0];\n            if (u) {\n                u.value = this.getJSONRepForTrackerID(s);\n            }\n        ;\n        ;\n            this.trackedElements[s] = t;\n        },\n        addJoinTableInfoToForm: function(s, t) {\n            var u = this.getTracker(t);\n            if (!u) {\n                return;\n            }\n        ;\n        ;\n            var v = h.scry(s, \"input[name=\\\"clp\\\"]\")[0];\n            if (!v) {\n                h.prependContent(s, h.create(\"input\", {\n                    type: \"hidden\",\n                    JSBNG__name: \"clp\",\n                    value: this.getJSONRepForTrackerID(t)\n                }));\n            }\n        ;\n        ;\n        },\n        getCLParamsForTarget: function(s, t) {\n            if (!s) {\n                return \"\";\n            }\n        ;\n        ;\n            var u = h.getID(s);\n            return this.getJSONRepForTrackerID(u, t);\n        },\n        getJSONRepForTrackerID: function(s, t) {\n            var u = this.getTracker(s);\n            if (!u) {\n                return \"\";\n            }\n        ;\n        ;\n            return JSON.stringify({\n                cl_impid: u.impid,\n                clearcounter: u.clearcounter,\n                elementid: s,\n                version: \"x\",\n                parent_fbid: ((t || u.parent_fbid))\n            });\n        }\n    }, r = function(s) {\n        return i(function() {\n            q.incrementClearCounter(s);\n        }, m, q);\n    };\n    e.exports = q;\n});\n__d(\"ChannelConstants\", [], function(a, b, c, d, e, f) {\n    var g = \"channel/\", h = {\n        ON_SHUTDOWN: ((g + \"shutdown\")),\n        ON_INVALID_HISTORY: ((g + \"invalid_history\")),\n        ON_CONFIG: ((g + \"config\")),\n        ON_ENTER_STATE: ((g + \"enter_state\")),\n        ON_EXIT_STATE: ((g + \"exit_state\")),\n        OK: \"ok\",\n        ERROR: \"error\",\n        ERROR_MAX: \"error_max\",\n        ERROR_MISSING: \"error_missing\",\n        ERROR_MSG_TYPE: \"error_msg_type\",\n        ERROR_SHUTDOWN: \"error_shutdown\",\n        ERROR_STALE: \"error_stale\",\n        SYS_OWNER: \"sys_owner\",\n        SYS_NONOWNER: \"sys_nonowner\",\n        SYS_ONLINE: \"sys_online\",\n        SYS_OFFLINE: \"sys_offline\",\n        SYS_TIMETRAVEL: \"sys_timetravel\",\n        HINT_AUTH: \"shutdown auth\",\n        HINT_CONN: \"shutdown conn\",\n        HINT_DISABLED: \"shutdown disabled\",\n        HINT_INVALID_STATE: \"shutdown invalid state\",\n        HINT_MAINT: \"shutdown maint\",\n        HINT_UNSUPPORTED: \"shutdown unsupported\",\n        reason_Unknown: 0,\n        reason_AsyncError: 1,\n        reason_TooLong: 2,\n        reason_Refresh: 3,\n        reason_RefreshDelay: 4,\n        reason_UIRestart: 5,\n        reason_NeedSeq: 6,\n        reason_PrevFailed: 7,\n        reason_IFrameLoadGiveUp: 8,\n        reason_IFrameLoadRetry: 9,\n        reason_IFrameLoadRetryWorked: 10,\n        reason_PageTransitionRetry: 11,\n        reason_IFrameLoadMaxSubdomain: 12,\n        reason_NoChannelInfo: 13,\n        reason_NoChannelHost: 14,\n        CAPABILITY_VOIP: 8,\n        getArbiterType: function(i) {\n            return ((((g + \"message:\")) + i));\n        }\n    };\n    e.exports = h;\n});\n__d(\"ShortProfiles\", [\"ArbiterMixin\",\"AjaxLoader\",\"Env\",\"FBAjaxRequest\",\"JSLogger\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"ArbiterMixin\"), h = b(\"AjaxLoader\"), i = b(\"Env\"), j = b(\"FBAjaxRequest\"), k = b(\"JSLogger\"), l = b(\"copyProperties\"), m = \"/ajax/chat/user_info.php\", n = \"/ajax/chat/user_info_all.php\", o = new h(m, \"profiles\"), p = false, q = k.create(\"short_profiles\");\n    function r() {\n        if (!p) {\n            q.log(\"fetch_all\");\n            p = true;\n            var u = new j(\"GET\", n, {\n                viewer: i.user\n            });\n            u.onJSON = function(v) {\n                o.set(v.json);\n                t.inform(\"updated\");\n            };\n            u.send();\n        }\n    ;\n    ;\n    };\n;\n    function s(u) {\n        return JSON.parse(JSON.stringify(u));\n    };\n;\n    var t = {\n    };\n    l(t, g, {\n        get: function(u, v) {\n            this.getMulti([u,], function(w) {\n                v(w[u], u);\n            });\n        },\n        getMulti: function(u, v) {\n            function w(x) {\n                v(s(x));\n            };\n        ;\n            o.get(u, w);\n        },\n        getNow: function(u) {\n            return s(((o.getNow(u) || null)));\n        },\n        getNowUnsafe: function(u) {\n            return ((o.getNow(u) || null));\n        },\n        getCachedProfileIDs: function() {\n            return o.getCachedKeys();\n        },\n        hasAll: function() {\n            return p;\n        },\n        fetchAll: function() {\n            r();\n        },\n        set: function(u, v) {\n            var w = {\n            };\n            w[u] = v;\n            this.setMulti(w);\n        },\n        setMulti: function(u) {\n            o.set(s(u));\n        }\n    });\n    e.exports = t;\n});\n__d(\"ClickTTIIdentifiers\", [], function(a, b, c, d, e, f) {\n    var g = {\n        types: {\n            TIMELINE_SEE_LIKERS: \"timeline:seelikes\"\n        },\n        getUserActionID: function(h) {\n            return ((((\"{\\\"ua_id\\\":\\\"\" + h)) + \"\\\"}\"));\n        }\n    };\n    e.exports = g;\n});\n__d(\"ReactCurrentOwner\", [], function(a, b, c, d, e, f) {\n    var g = {\n        current: null\n    };\n    e.exports = g;\n});\n__d(\"CSSProperty\", [], function(a, b, c, d, e, f) {\n    var g = {\n        fillOpacity: true,\n        fontWeight: true,\n        opacity: true,\n        orphans: true,\n        zIndex: true,\n        zoom: true\n    }, h = {\n        background: {\n            backgroundImage: true,\n            backgroundPosition: true,\n            backgroundRepeat: true,\n            backgroundColor: true\n        },\n        border: {\n            borderWidth: true,\n            borderStyle: true,\n            borderColor: true\n        },\n        borderBottom: {\n            borderBottomWidth: true,\n            borderBottomStyle: true,\n            borderBottomColor: true\n        },\n        borderLeft: {\n            borderLeftWidth: true,\n            borderLeftStyle: true,\n            borderLeftColor: true\n        },\n        borderRight: {\n            borderRightWidth: true,\n            borderRightStyle: true,\n            borderRightColor: true\n        },\n        borderTop: {\n            borderTopWidth: true,\n            borderTopStyle: true,\n            borderTopColor: true\n        },\n        font: {\n            fontStyle: true,\n            fontVariant: true,\n            fontWeight: true,\n            fontSize: true,\n            lineHeight: true,\n            fontFamily: true\n        }\n    }, i = {\n        isUnitlessNumber: g,\n        shorthandPropertyExpansions: h\n    };\n    e.exports = i;\n});\n__d(\"dangerousStyleValue\", [\"CSSProperty\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSSProperty\");\n    function h(i, j) {\n        var k = ((((((j == null)) || ((typeof j === \"boolean\")))) || ((j === \"\"))));\n        if (k) {\n            return \"\";\n        }\n    ;\n    ;\n        var l = isNaN(j);\n        if (((((l || ((j === 0)))) || g.isUnitlessNumber[i]))) {\n            return ((\"\" + j));\n        }\n    ;\n    ;\n        return ((j + \"px\"));\n    };\n;\n    e.exports = h;\n});\n__d(\"throwIf\", [], function(a, b, c, d, e, f) {\n    var g = function(h, i) {\n        if (h) {\n            throw new Error(i);\n        }\n    ;\n    ;\n    };\n    e.exports = g;\n});\n__d(\"escapeTextForBrowser\", [\"throwIf\",], function(a, b, c, d, e, f) {\n    var g = b(\"throwIf\"), h, i = {\n        \"&\": \"&amp;\",\n        \"\\u003E\": \"&gt;\",\n        \"\\u003C\": \"&lt;\",\n        \"\\\"\": \"&quot;\",\n        \"'\": \"&#x27;\",\n        \"/\": \"&#x2f;\"\n    };\n    function j(l) {\n        return i[l];\n    };\n;\n    var k = function(l) {\n        var m = typeof l, n = ((m === \"object\"));\n        if (((((l === \"\")) || n))) {\n            return \"\";\n        }\n         else if (((m === \"string\"))) {\n            return l.replace(/[&><\"'\\/]/g, j);\n        }\n         else return ((\"\" + l)).replace(/[&><\"'\\/]/g, j)\n        \n    ;\n    };\n    e.exports = k;\n});\n__d(\"memoizeStringOnly\", [], function(a, b, c, d, e, f) {\n    function g(h) {\n        var i = {\n        };\n        return function(j) {\n            if (i.hasOwnProperty(j)) {\n                return i[j];\n            }\n             else return i[j] = h.call(this, j)\n        ;\n        };\n    };\n;\n    e.exports = g;\n});\n__d(\"CSSPropertyOperations\", [\"CSSProperty\",\"dangerousStyleValue\",\"escapeTextForBrowser\",\"hyphenate\",\"memoizeStringOnly\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSSProperty\"), h = b(\"dangerousStyleValue\"), i = b(\"escapeTextForBrowser\"), j = b(\"hyphenate\"), k = b(\"memoizeStringOnly\"), l = k(function(n) {\n        return i(j(n));\n    }), m = {\n        createMarkupForStyles: function(n) {\n            var o = \"\";\n            {\n                var fin51keys = ((window.top.JSBNG_Replay.forInKeys)((n))), fin51i = (0);\n                var p;\n                for (; (fin51i < fin51keys.length); (fin51i++)) {\n                    ((p) = (fin51keys[fin51i]));\n                    {\n                        if (!n.hasOwnProperty(p)) {\n                            continue;\n                        }\n                    ;\n                    ;\n                        var q = n[p];\n                        if (((q != null))) {\n                            o += ((l(p) + \":\"));\n                            o += ((h(p, q) + \";\"));\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            return ((o || null));\n        },\n        setValueForStyles: function(n, o) {\n            var p = n.style;\n            {\n                var fin52keys = ((window.top.JSBNG_Replay.forInKeys)((o))), fin52i = (0);\n                var q;\n                for (; (fin52i < fin52keys.length); (fin52i++)) {\n                    ((q) = (fin52keys[fin52i]));\n                    {\n                        if (!o.hasOwnProperty(q)) {\n                            continue;\n                        }\n                    ;\n                    ;\n                        var r = h(q, o[q]);\n                        if (r) {\n                            p[q] = r;\n                        }\n                         else {\n                            var s = g.shorthandPropertyExpansions[q];\n                            if (s) {\n                                {\n                                    var fin53keys = ((window.top.JSBNG_Replay.forInKeys)((s))), fin53i = (0);\n                                    var t;\n                                    for (; (fin53i < fin53keys.length); (fin53i++)) {\n                                        ((t) = (fin53keys[fin53i]));\n                                        {\n                                            p[t] = \"\";\n                                        ;\n                                        };\n                                    };\n                                };\n                            ;\n                            }\n                             else p[q] = \"\";\n                        ;\n                        ;\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n        }\n    };\n    e.exports = m;\n});\n__d(\"ExecutionEnvironment\", [], function(a, b, c, d, e, f) {\n    var g = ((typeof window !== \"undefined\")), h = {\n        canUseDOM: g,\n        canUseWorkers: ((typeof JSBNG__Worker !== \"undefined\")),\n        isInWorker: !g,\n        global: new Function(\"return this;\")()\n    };\n    e.exports = h;\n});\n__d(\"Danger\", [\"ExecutionEnvironment\",\"throwIf\",], function(a, b, c, d, e, f) {\n    var g = b(\"ExecutionEnvironment\"), h = b(\"throwIf\"), i, j, k, l, m = {\n    };\n    function n(t) {\n        var u = t.tagName;\n        return ((m[u] || (m[u] = JSBNG__document.createElement(u))));\n    };\n;\n    function o(t, u, v) {\n        if (v) {\n            if (v.nextSibling) {\n                return t.insertBefore(u, v.nextSibling);\n            }\n             else return t.appendChild(u)\n        ;\n        }\n         else return t.insertBefore(u, t.firstChild)\n    ;\n    };\n;\n    function p(t, u, v) {\n        var w, x = u.length;\n        for (var y = 0; ((y < x)); y++) {\n            w = o(t, u[0], ((w || v)));\n        ;\n        };\n    ;\n    };\n;\n    function q(t, u, v) {\n        var w = n(t);\n        w.innerHTML = u;\n        var x = w.childNodes, y = ((v ? t.childNodes[((v - 1))] : null));\n        p(t, x, y);\n    };\n;\n    function r(t, u) {\n        var v = t.parentNode, w = n(v);\n        w.innerHTML = u;\n        var x = w.childNodes;\n        v.replaceChild(x[0], t);\n    };\n;\n    var s = {\n        dangerouslyInsertMarkupAt: q,\n        dangerouslyReplaceNodeWithMarkup: r\n    };\n    e.exports = s;\n});\n__d(\"insertNodeAt\", [], function(a, b, c, d, e, f) {\n    function g(h, i, j) {\n        var k = h.childNodes, l = h.childNodes[j];\n        if (((l === i))) {\n            return i;\n        }\n    ;\n    ;\n        if (i.parentNode) {\n            i.parentNode.removeChild(i);\n        }\n    ;\n    ;\n        if (((j >= k.length))) {\n            h.appendChild(i);\n        }\n         else h.insertBefore(i, k[j]);\n    ;\n    ;\n        return i;\n    };\n;\n    e.exports = g;\n});\n__d(\"keyOf\", [], function(a, b, c, d, e, f) {\n    var g = function(h) {\n        var i;\n        {\n            var fin54keys = ((window.top.JSBNG_Replay.forInKeys)((h))), fin54i = (0);\n            (0);\n            for (; (fin54i < fin54keys.length); (fin54i++)) {\n                ((i) = (fin54keys[fin54i]));\n                {\n                    if (!h.hasOwnProperty(i)) {\n                        continue;\n                    }\n                ;\n                ;\n                    return i;\n                };\n            };\n        };\n    ;\n        return null;\n    };\n    e.exports = g;\n});\n__d(\"DOMChildrenOperations\", [\"Danger\",\"insertNodeAt\",\"keyOf\",\"throwIf\",], function(a, b, c, d, e, f) {\n    var g = b(\"Danger\"), h = b(\"insertNodeAt\"), i = b(\"keyOf\"), j = b(\"throwIf\"), k, l = i({\n        moveFrom: null\n    }), m = i({\n        insertMarkup: null\n    }), n = i({\n        removeAt: null\n    }), o = function(u, v) {\n        var w, x, y;\n        for (var z = 0; ((z < v.length)); z++) {\n            x = v[z];\n            if (((l in x))) {\n                w = ((w || []));\n                y = x.moveFrom;\n                w[y] = u.childNodes[y];\n            }\n             else if (((n in x))) {\n                w = ((w || []));\n                y = x.removeAt;\n                w[y] = u.childNodes[y];\n            }\n            \n        ;\n        ;\n        };\n    ;\n        return w;\n    }, p = function(u, v) {\n        for (var w = 0; ((w < v.length)); w++) {\n            var x = v[w];\n            if (x) {\n                u.removeChild(v[w]);\n            }\n        ;\n        ;\n        };\n    ;\n    }, q = function(u, v, w) {\n        var x, y, z = -1, aa;\n        for (var ba = 0; ((ba < v.length)); ba++) {\n            aa = v[ba];\n            if (((l in aa))) {\n                x = w[aa.moveFrom];\n                y = aa.finalIndex;\n                h(u, x, y);\n            }\n             else if (!((n in aa))) {\n                if (((m in aa))) {\n                    y = aa.finalIndex;\n                    var ca = aa.insertMarkup;\n                    g.dangerouslyInsertMarkupAt(u, ca, y);\n                }\n            ;\n            }\n            \n        ;\n        ;\n        };\n    ;\n    }, r = function(u, v) {\n        var w = o(u, v);\n        if (w) {\n            p(u, w);\n        }\n    ;\n    ;\n        q(u, v, w);\n    }, s = function(u, v, w) {\n        u.childNodes[v].nodeValue = w;\n    }, t = {\n        dangerouslyReplaceNodeWithMarkup: g.dangerouslyReplaceNodeWithMarkup,\n        manageChildren: r,\n        setTextNodeValueAtIndex: s\n    };\n    e.exports = t;\n});\n__d(\"DOMProperty\", [\"invariant\",], function(a, b, c, d, e, f) {\n    var g = b(\"invariant\"), h = {\n        MUST_USE_ATTRIBUTE: 1,\n        MUST_USE_PROPERTY: 2,\n        HAS_BOOLEAN_VALUE: 4,\n        HAS_SIDE_EFFECTS: 8,\n        injectDOMPropertyConfig: function(k) {\n            var l = ((k.Properties || {\n            })), m = ((k.DOMAttributeNames || {\n            })), n = ((k.DOMPropertyNames || {\n            })), o = ((k.DOMMutationMethods || {\n            }));\n            if (k.isCustomAttribute) {\n                j._isCustomAttributeFunctions.push(k.isCustomAttribute);\n            }\n        ;\n        ;\n            {\n                var fin55keys = ((window.top.JSBNG_Replay.forInKeys)((l))), fin55i = (0);\n                var p;\n                for (; (fin55i < fin55keys.length); (fin55i++)) {\n                    ((p) = (fin55keys[fin55i]));\n                    {\n                        g(!j.isStandardName[p]);\n                        j.isStandardName[p] = true;\n                        j.getAttributeName[p] = ((m[p] || p.toLowerCase()));\n                        j.getPropertyName[p] = ((n[p] || p));\n                        var q = o[p];\n                        if (q) {\n                            j.getMutationMethod[p] = q;\n                        }\n                    ;\n                    ;\n                        var r = l[p];\n                        j.mustUseAttribute[p] = ((r & h.MUST_USE_ATTRIBUTE));\n                        j.mustUseProperty[p] = ((r & h.MUST_USE_PROPERTY));\n                        j.hasBooleanValue[p] = ((r & h.HAS_BOOLEAN_VALUE));\n                        j.hasSideEffects[p] = ((r & h.HAS_SIDE_EFFECTS));\n                        g(((!j.mustUseAttribute[p] || !j.mustUseProperty[p])));\n                        g(((j.mustUseProperty[p] || !j.hasSideEffects[p])));\n                    };\n                };\n            };\n        ;\n        }\n    }, i = {\n    }, j = {\n        isStandardName: {\n        },\n        getAttributeName: {\n        },\n        getPropertyName: {\n        },\n        getMutationMethod: {\n        },\n        mustUseAttribute: {\n        },\n        mustUseProperty: {\n        },\n        hasBooleanValue: {\n        },\n        hasSideEffects: {\n        },\n        _isCustomAttributeFunctions: [],\n        isCustomAttribute: function(k) {\n            return j._isCustomAttributeFunctions.some(function(l) {\n                return l.call(null, k);\n            });\n        },\n        getDefaultValueForProperty: function(k, l) {\n            var m = i[k], n;\n            if (!m) {\n                i[k] = m = {\n                };\n            }\n        ;\n        ;\n            if (!((l in m))) {\n                n = JSBNG__document.createElement(k);\n                m[l] = n[l];\n            }\n        ;\n        ;\n            return m[l];\n        },\n        injection: h\n    };\n    e.exports = j;\n});\n__d(\"DOMPropertyOperations\", [\"DOMProperty\",\"escapeTextForBrowser\",\"memoizeStringOnly\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOMProperty\"), h = b(\"escapeTextForBrowser\"), i = b(\"memoizeStringOnly\"), j = i(function(l) {\n        return ((h(l) + \"=\\\"\"));\n    }), k = {\n        createMarkupForProperty: function(l, m) {\n            if (g.isStandardName[l]) {\n                if (((((m == null)) || ((g.hasBooleanValue[l] && !m))))) {\n                    return \"\";\n                }\n            ;\n            ;\n                var n = g.getAttributeName[l];\n                return ((((j(n) + h(m))) + \"\\\"\"));\n            }\n             else if (g.isCustomAttribute(l)) {\n                if (((m == null))) {\n                    return \"\";\n                }\n            ;\n            ;\n                return ((((j(l) + h(m))) + \"\\\"\"));\n            }\n             else return null\n            \n        ;\n        },\n        setValueForProperty: function(l, m, n) {\n            if (g.isStandardName[m]) {\n                var o = g.getMutationMethod[m];\n                if (o) {\n                    o(l, n);\n                }\n                 else if (g.mustUseAttribute[m]) {\n                    if (((g.hasBooleanValue[m] && !n))) {\n                        l.removeAttribute(g.getAttributeName[m]);\n                    }\n                     else l.setAttribute(g.getAttributeName[m], n);\n                ;\n                ;\n                }\n                 else {\n                    var p = g.getPropertyName[m];\n                    if (((!g.hasSideEffects[m] || ((l[p] !== n))))) {\n                        l[p] = n;\n                    }\n                ;\n                ;\n                }\n                \n            ;\n            ;\n            }\n             else if (g.isCustomAttribute(m)) {\n                l.setAttribute(m, n);\n            }\n            \n        ;\n        ;\n        },\n        deleteValueForProperty: function(l, m) {\n            if (g.isStandardName[m]) {\n                var n = g.getMutationMethod[m];\n                if (n) {\n                    n(l, undefined);\n                }\n                 else if (g.mustUseAttribute[m]) {\n                    l.removeAttribute(g.getAttributeName[m]);\n                }\n                 else {\n                    var o = g.getPropertyName[m];\n                    l[o] = g.getDefaultValueForProperty(l.nodeName, m);\n                }\n                \n            ;\n            ;\n            }\n             else if (g.isCustomAttribute(m)) {\n                l.removeAttribute(m);\n            }\n            \n        ;\n        ;\n        }\n    };\n    e.exports = k;\n});\n__d(\"keyMirror\", [\"throwIf\",], function(a, b, c, d, e, f) {\n    var g = b(\"throwIf\"), h = \"NOT_OBJECT_ERROR\", i = function(j) {\n        var k = {\n        }, l;\n        g(((!((j instanceof Object)) || Array.isArray(j))), h);\n        {\n            var fin56keys = ((window.top.JSBNG_Replay.forInKeys)((j))), fin56i = (0);\n            (0);\n            for (; (fin56i < fin56keys.length); (fin56i++)) {\n                ((l) = (fin56keys[fin56i]));\n                {\n                    if (!j.hasOwnProperty(l)) {\n                        continue;\n                    }\n                ;\n                ;\n                    k[l] = l;\n                };\n            };\n        };\n    ;\n        return k;\n    };\n    e.exports = i;\n});\n__d(\"EventConstants\", [\"keyMirror\",], function(a, b, c, d, e, f) {\n    var g = b(\"keyMirror\"), h = g({\n        bubbled: null,\n        captured: null\n    }), i = g({\n        topBlur: null,\n        topChange: null,\n        topClick: null,\n        topDOMCharacterDataModified: null,\n        topDoubleClick: null,\n        topDrag: null,\n        topDragEnd: null,\n        topDragEnter: null,\n        topDragExit: null,\n        topDragLeave: null,\n        topDragOver: null,\n        topDragStart: null,\n        topDrop: null,\n        topFocus: null,\n        topInput: null,\n        topKeyDown: null,\n        topKeyPress: null,\n        topKeyUp: null,\n        topMouseDown: null,\n        topMouseMove: null,\n        topMouseOut: null,\n        topMouseOver: null,\n        topMouseUp: null,\n        topScroll: null,\n        topSelectionChange: null,\n        topSubmit: null,\n        topTouchCancel: null,\n        topTouchEnd: null,\n        topTouchMove: null,\n        topTouchStart: null,\n        topWheel: null\n    }), j = {\n        topLevelTypes: i,\n        PropagationPhases: h\n    };\n    e.exports = j;\n});\n__d(\"EventListener\", [\"JSBNG__Event\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = {\n        listen: g.listen,\n        capture: function(i, j, k) {\n            if (!i.JSBNG__addEventListener) {\n                return;\n            }\n             else i.JSBNG__addEventListener(j, k, true);\n        ;\n        ;\n        }\n    };\n    e.exports = h;\n});\n__d(\"CallbackRegistry\", [], function(a, b, c, d, e, f) {\n    var g = {\n    }, h = {\n        putListener: function(i, j, k) {\n            var l = ((g[j] || (g[j] = {\n            })));\n            l[i] = k;\n        },\n        getListener: function(i, j) {\n            var k = g[j];\n            return ((k && k[i]));\n        },\n        deleteListener: function(i, j) {\n            var k = g[j];\n            if (k) {\n                delete k[i];\n            }\n        ;\n        ;\n        },\n        deleteAllListeners: function(i) {\n            {\n                var fin57keys = ((window.top.JSBNG_Replay.forInKeys)((g))), fin57i = (0);\n                var j;\n                for (; (fin57i < fin57keys.length); (fin57i++)) {\n                    ((j) = (fin57keys[fin57i]));\n                    {\n                        delete g[j][i];\n                    ;\n                    };\n                };\n            };\n        ;\n        },\n        __purge: function() {\n            g = {\n            };\n        }\n    };\n    e.exports = h;\n});\n__d(\"EventPluginRegistry\", [\"invariant\",], function(a, b, c, d, e, f) {\n    var g = b(\"invariant\"), h = null, i = {\n    };\n    function j() {\n        if (!h) {\n            return;\n        }\n    ;\n    ;\n        {\n            var fin58keys = ((window.top.JSBNG_Replay.forInKeys)((i))), fin58i = (0);\n            var n;\n            for (; (fin58i < fin58keys.length); (fin58i++)) {\n                ((n) = (fin58keys[fin58i]));\n                {\n                    var o = i[n], p = h.indexOf(n);\n                    g(((p > -1)));\n                    if (m.plugins[p]) {\n                        continue;\n                    }\n                ;\n                ;\n                    g(o.extractEvents);\n                    m.plugins[p] = o;\n                    var q = o.eventTypes;\n                    {\n                        var fin59keys = ((window.top.JSBNG_Replay.forInKeys)((q))), fin59i = (0);\n                        var r;\n                        for (; (fin59i < fin59keys.length); (fin59i++)) {\n                            ((r) = (fin59keys[fin59i]));\n                            {\n                                g(k(q[r], o));\n                            ;\n                            };\n                        };\n                    };\n                ;\n                };\n            };\n        };\n    ;\n    };\n;\n    function k(n, o) {\n        var p = n.phasedRegistrationNames;\n        if (p) {\n            {\n                var fin60keys = ((window.top.JSBNG_Replay.forInKeys)((p))), fin60i = (0);\n                var q;\n                for (; (fin60i < fin60keys.length); (fin60i++)) {\n                    ((q) = (fin60keys[fin60i]));\n                    {\n                        if (p.hasOwnProperty(q)) {\n                            var r = p[q];\n                            l(r, o);\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            return true;\n        }\n         else if (n.registrationName) {\n            l(n.registrationName, o);\n            return true;\n        }\n        \n    ;\n    ;\n        return false;\n    };\n;\n    function l(n, o) {\n        g(!m.registrationNames[n]);\n        m.registrationNames[n] = o;\n        m.registrationNamesKeys.push(n);\n    };\n;\n    var m = {\n        plugins: [],\n        registrationNames: {\n        },\n        registrationNamesKeys: [],\n        injectEventPluginOrder: function(n) {\n            g(!h);\n            h = Array.prototype.slice.call(n);\n            j();\n        },\n        injectEventPluginsByName: function(n) {\n            var o = false;\n            {\n                var fin61keys = ((window.top.JSBNG_Replay.forInKeys)((n))), fin61i = (0);\n                var p;\n                for (; (fin61i < fin61keys.length); (fin61i++)) {\n                    ((p) = (fin61keys[fin61i]));\n                    {\n                        if (!n.hasOwnProperty(p)) {\n                            continue;\n                        }\n                    ;\n                    ;\n                        var q = n[p];\n                        if (((i[p] !== q))) {\n                            g(!i[p]);\n                            i[p] = q;\n                            o = true;\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            if (o) {\n                j();\n            }\n        ;\n        ;\n        },\n        getPluginModuleForEvent: function(JSBNG__event) {\n            var n = JSBNG__event.dispatchConfig;\n            if (n.registrationName) {\n                return ((m.registrationNames[n.registrationName] || null));\n            }\n        ;\n        ;\n            {\n                var fin62keys = ((window.top.JSBNG_Replay.forInKeys)((n.phasedRegistrationNames))), fin62i = (0);\n                var o;\n                for (; (fin62i < fin62keys.length); (fin62i++)) {\n                    ((o) = (fin62keys[fin62i]));\n                    {\n                        if (!n.phasedRegistrationNames.hasOwnProperty(o)) {\n                            continue;\n                        }\n                    ;\n                    ;\n                        var p = m.registrationNames[n.phasedRegistrationNames[o]];\n                        if (p) {\n                            return p;\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            return null;\n        },\n        _resetEventPlugins: function() {\n            h = null;\n            {\n                var fin63keys = ((window.top.JSBNG_Replay.forInKeys)((i))), fin63i = (0);\n                var n;\n                for (; (fin63i < fin63keys.length); (fin63i++)) {\n                    ((n) = (fin63keys[fin63i]));\n                    {\n                        if (i.hasOwnProperty(n)) {\n                            delete i[n];\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            m.plugins.length = 0;\n            var o = m.registrationNames;\n            {\n                var fin64keys = ((window.top.JSBNG_Replay.forInKeys)((o))), fin64i = (0);\n                var p;\n                for (; (fin64i < fin64keys.length); (fin64i++)) {\n                    ((p) = (fin64keys[fin64i]));\n                    {\n                        if (o.hasOwnProperty(p)) {\n                            delete o[p];\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            m.registrationNamesKeys.length = 0;\n        }\n    };\n    e.exports = m;\n});\n__d(\"EventPluginUtils\", [\"EventConstants\",\"invariant\",], function(a, b, c, d, e, f) {\n    var g = b(\"EventConstants\"), h = b(\"invariant\"), i = g.topLevelTypes;\n    function j(u) {\n        return ((((((u === i.topMouseUp)) || ((u === i.topTouchEnd)))) || ((u === i.topTouchCancel))));\n    };\n;\n    function k(u) {\n        return ((((u === i.topMouseMove)) || ((u === i.topTouchMove))));\n    };\n;\n    function l(u) {\n        return ((((u === i.topMouseDown)) || ((u === i.topTouchStart))));\n    };\n;\n    var m;\n    function n(JSBNG__event, u) {\n        var v = JSBNG__event._dispatchListeners, w = JSBNG__event._dispatchIDs;\n        if (Array.isArray(v)) {\n            for (var x = 0; ((x < v.length)); x++) {\n                if (JSBNG__event.isPropagationStopped()) {\n                    break;\n                }\n            ;\n            ;\n                u(JSBNG__event, v[x], w[x]);\n            };\n        ;\n        }\n         else if (v) {\n            u(JSBNG__event, v, w);\n        }\n        \n    ;\n    ;\n    };\n;\n    function o(JSBNG__event, u, v) {\n        u(JSBNG__event, v);\n    };\n;\n    function p(JSBNG__event, u) {\n        n(JSBNG__event, u);\n        JSBNG__event._dispatchListeners = null;\n        JSBNG__event._dispatchIDs = null;\n    };\n;\n    function q(JSBNG__event) {\n        var u = JSBNG__event._dispatchListeners, v = JSBNG__event._dispatchIDs;\n        if (Array.isArray(u)) {\n            for (var w = 0; ((w < u.length)); w++) {\n                if (JSBNG__event.isPropagationStopped()) {\n                    break;\n                }\n            ;\n            ;\n                if (u[w](JSBNG__event, v[w])) {\n                    return v[w];\n                }\n            ;\n            ;\n            };\n        ;\n        }\n         else if (u) {\n            if (u(JSBNG__event, v)) {\n                return v;\n            }\n        ;\n        }\n        \n    ;\n    ;\n        return null;\n    };\n;\n    function r(JSBNG__event) {\n        var u = JSBNG__event._dispatchListeners, v = JSBNG__event._dispatchIDs;\n        h(!Array.isArray(u));\n        var w = ((u ? u(JSBNG__event, v) : null));\n        JSBNG__event._dispatchListeners = null;\n        JSBNG__event._dispatchIDs = null;\n        return w;\n    };\n;\n    function s(JSBNG__event) {\n        return !!JSBNG__event._dispatchListeners;\n    };\n;\n    var t = {\n        isEndish: j,\n        isMoveish: k,\n        isStartish: l,\n        executeDispatchesInOrder: p,\n        executeDispatchesInOrderStopAtTrue: q,\n        executeDirectDispatch: r,\n        hasDispatches: s,\n        executeDispatch: o\n    };\n    e.exports = t;\n});\n__d(\"accumulate\", [\"throwIf\",], function(a, b, c, d, e, f) {\n    var g = b(\"throwIf\"), h = \"INVALID_ACCUM_ARGS\";\n    function i(j, k) {\n        var l = ((j == null)), m = ((k === null));\n        if (m) {\n            return j;\n        }\n         else if (l) {\n            return k;\n        }\n         else {\n            var n = Array.isArray(j), o = Array.isArray(k);\n            if (n) {\n                return j.concat(k);\n            }\n             else if (o) {\n                return [j,].concat(k);\n            }\n             else return [j,k,]\n            \n        ;\n        }\n        \n    ;\n    ;\n    };\n;\n    e.exports = i;\n});\n__d(\"forEachAccumulated\", [], function(a, b, c, d, e, f) {\n    var g = function(h, i, j) {\n        if (Array.isArray(h)) {\n            h.forEach(i, j);\n        }\n         else if (h) {\n            i.call(j, h);\n        }\n        \n    ;\n    ;\n    };\n    e.exports = g;\n});\n__d(\"EventPropagators\", [\"CallbackRegistry\",\"EventConstants\",\"accumulate\",\"forEachAccumulated\",], function(a, b, c, d, e, f) {\n    var g = b(\"CallbackRegistry\"), h = b(\"EventConstants\"), i = b(\"accumulate\"), j = b(\"forEachAccumulated\"), k = g.getListener, l = h.PropagationPhases, m = {\n        InstanceHandle: null,\n        injectInstanceHandle: function(w) {\n            m.InstanceHandle = w;\n        },\n        validate: function() {\n            var w = ((((!m.InstanceHandle || !m.InstanceHandle.traverseTwoPhase)) || !m.InstanceHandle.traverseEnterLeave));\n            if (w) {\n                throw new Error(\"InstanceHandle not injected before use!\");\n            }\n        ;\n        ;\n        }\n    };\n    function n(w, JSBNG__event, x) {\n        var y = JSBNG__event.dispatchConfig.phasedRegistrationNames[x];\n        return k(w, y);\n    };\n;\n    function o(w, x, JSBNG__event) {\n        var y = ((x ? l.bubbled : l.captured)), z = n(w, JSBNG__event, y);\n        if (z) {\n            JSBNG__event._dispatchListeners = i(JSBNG__event._dispatchListeners, z);\n            JSBNG__event._dispatchIDs = i(JSBNG__event._dispatchIDs, w);\n        }\n    ;\n    ;\n    };\n;\n    function p(JSBNG__event) {\n        if (((JSBNG__event && JSBNG__event.dispatchConfig.phasedRegistrationNames))) {\n            m.InstanceHandle.traverseTwoPhase(JSBNG__event.dispatchMarker, o, JSBNG__event);\n        }\n    ;\n    ;\n    };\n;\n    function q(w, x, JSBNG__event) {\n        if (((JSBNG__event && JSBNG__event.dispatchConfig.registrationName))) {\n            var y = JSBNG__event.dispatchConfig.registrationName, z = k(w, y);\n            if (z) {\n                JSBNG__event._dispatchListeners = i(JSBNG__event._dispatchListeners, z);\n                JSBNG__event._dispatchIDs = i(JSBNG__event._dispatchIDs, w);\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n    };\n;\n    function r(JSBNG__event) {\n        if (((JSBNG__event && JSBNG__event.dispatchConfig.registrationName))) {\n            q(JSBNG__event.dispatchMarker, null, JSBNG__event);\n        }\n    ;\n    ;\n    };\n;\n    function s(w) {\n        j(w, p);\n    };\n;\n    function t(w, x, y, z) {\n        m.InstanceHandle.traverseEnterLeave(y, z, q, w, x);\n    };\n;\n    function u(w) {\n        j(w, r);\n    };\n;\n    var v = {\n        accumulateTwoPhaseDispatches: s,\n        accumulateDirectDispatches: u,\n        accumulateEnterLeaveDispatches: t,\n        injection: m\n    };\n    e.exports = v;\n});\n__d(\"EventPluginHub\", [\"CallbackRegistry\",\"EventPluginRegistry\",\"EventPluginUtils\",\"EventPropagators\",\"ExecutionEnvironment\",\"accumulate\",\"forEachAccumulated\",\"invariant\",], function(a, b, c, d, e, f) {\n    var g = b(\"CallbackRegistry\"), h = b(\"EventPluginRegistry\"), i = b(\"EventPluginUtils\"), j = b(\"EventPropagators\"), k = b(\"ExecutionEnvironment\"), l = b(\"accumulate\"), m = b(\"forEachAccumulated\"), n = b(\"invariant\"), o = null, p = function(JSBNG__event) {\n        if (JSBNG__event) {\n            var r = i.executeDispatch, s = h.getPluginModuleForEvent(JSBNG__event);\n            if (((s && s.executeDispatch))) {\n                r = s.executeDispatch;\n            }\n        ;\n        ;\n            i.executeDispatchesInOrder(JSBNG__event, r);\n            if (!JSBNG__event.isPersistent()) {\n                JSBNG__event.constructor.release(JSBNG__event);\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n    }, q = {\n        injection: {\n            injectInstanceHandle: j.injection.injectInstanceHandle,\n            injectEventPluginOrder: h.injectEventPluginOrder,\n            injectEventPluginsByName: h.injectEventPluginsByName\n        },\n        registrationNames: h.registrationNames,\n        putListener: g.putListener,\n        getListener: g.getListener,\n        deleteListener: g.deleteListener,\n        deleteAllListeners: g.deleteAllListeners,\n        extractEvents: function(r, s, t, u) {\n            var v, w = h.plugins;\n            for (var x = 0, y = w.length; ((x < y)); x++) {\n                var z = w[x];\n                if (z) {\n                    var aa = z.extractEvents(r, s, t, u);\n                    if (aa) {\n                        v = l(v, aa);\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n            };\n        ;\n            return v;\n        },\n        enqueueEvents: function(r) {\n            if (r) {\n                o = l(o, r);\n            }\n        ;\n        ;\n        },\n        processEventQueue: function() {\n            var r = o;\n            o = null;\n            m(r, p);\n            n(!o);\n        }\n    };\n    if (k.canUseDOM) {\n        window.EventPluginHub = q;\n    }\n;\n;\n    e.exports = q;\n});\n__d(\"ReactUpdates\", [\"invariant\",], function(a, b, c, d, e, f) {\n    var g = b(\"invariant\"), h = false, i = [];\n    function j(m) {\n        if (h) {\n            m();\n            return;\n        }\n    ;\n    ;\n        h = true;\n        try {\n            m();\n            for (var o = 0; ((o < i.length)); o++) {\n                var p = i[o];\n                if (p.isMounted()) {\n                    var q = p._pendingCallbacks;\n                    p._pendingCallbacks = null;\n                    p.performUpdateIfNecessary();\n                    if (q) {\n                        for (var r = 0; ((r < q.length)); r++) {\n                            q[r]();\n                        ;\n                        };\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n            };\n        ;\n        } catch (n) {\n            throw n;\n        } finally {\n            i.length = 0;\n            h = false;\n        };\n    ;\n    };\n;\n    function k(m, n) {\n        g(((!n || ((typeof n === \"function\")))));\n        if (!h) {\n            m.performUpdateIfNecessary();\n            ((n && n()));\n            return;\n        }\n    ;\n    ;\n        i.push(m);\n        if (n) {\n            if (m._pendingCallbacks) {\n                m._pendingCallbacks.push(n);\n            }\n             else m._pendingCallbacks = [n,];\n        ;\n        }\n    ;\n    ;\n    };\n;\n    var l = {\n        batchedUpdates: j,\n        enqueueUpdate: k\n    };\n    e.exports = l;\n});\n__d(\"ViewportMetrics\", [], function(a, b, c, d, e, f) {\n    var g = {\n        currentScrollLeft: 0,\n        currentScrollTop: 0,\n        refreshScrollValues: function() {\n            g.currentScrollLeft = ((JSBNG__document.body.scrollLeft + JSBNG__document.documentElement.scrollLeft));\n            g.currentScrollTop = ((JSBNG__document.body.scrollTop + JSBNG__document.documentElement.scrollTop));\n        }\n    };\n    e.exports = g;\n});\n__d(\"isEventSupported\", [\"ExecutionEnvironment\",], function(a, b, c, d, e, f) {\n    var g = b(\"ExecutionEnvironment\"), h, i;\n    if (g.canUseDOM) {\n        h = JSBNG__document.createElement(\"div\");\n        i = ((((JSBNG__document.implementation && JSBNG__document.implementation.hasFeature)) && ((JSBNG__document.implementation.hasFeature(\"\", \"\") !== true))));\n    }\n;\n;\n    function j(k, l) {\n        if (((!h || ((l && !h.JSBNG__addEventListener))))) {\n            return false;\n        }\n    ;\n    ;\n        var m = JSBNG__document.createElement(\"div\"), n = ((\"JSBNG__on\" + k)), o = ((n in m));\n        if (!o) {\n            m.setAttribute(n, \"\");\n            o = ((typeof m[n] === \"function\"));\n            if (((typeof m[n] !== \"undefined\"))) {\n                m[n] = undefined;\n            }\n        ;\n        ;\n            m.removeAttribute(n);\n        }\n    ;\n    ;\n        if (((((!o && i)) && ((k === \"wheel\"))))) {\n            o = JSBNG__document.implementation.hasFeature(\"Events.wheel\", \"3.0\");\n        }\n    ;\n    ;\n        m = null;\n        return o;\n    };\n;\n    e.exports = j;\n});\n__d(\"ReactEventEmitter\", [\"EventConstants\",\"EventListener\",\"EventPluginHub\",\"ExecutionEnvironment\",\"ReactUpdates\",\"ViewportMetrics\",\"invariant\",\"isEventSupported\",], function(a, b, c, d, e, f) {\n    var g = b(\"EventConstants\"), h = b(\"EventListener\"), i = b(\"EventPluginHub\"), j = b(\"ExecutionEnvironment\"), k = b(\"ReactUpdates\"), l = b(\"ViewportMetrics\"), m = b(\"invariant\"), n = b(\"isEventSupported\"), o = false;\n    function p(u, v, w) {\n        h.listen(w, v, t.TopLevelCallbackCreator.createTopLevelCallback(u));\n    };\n;\n    function q(u, v, w) {\n        h.capture(w, v, t.TopLevelCallbackCreator.createTopLevelCallback(u));\n    };\n;\n    function r() {\n        var u = l.refreshScrollValues;\n        h.listen(window, \"JSBNG__scroll\", u);\n        h.listen(window, \"resize\", u);\n    };\n;\n    function s(u) {\n        m(!o);\n        var v = g.topLevelTypes, w = JSBNG__document;\n        r();\n        p(v.topMouseOver, \"mouseover\", w);\n        p(v.topMouseDown, \"mousedown\", w);\n        p(v.topMouseUp, \"mouseup\", w);\n        p(v.topMouseMove, \"mousemove\", w);\n        p(v.topMouseOut, \"mouseout\", w);\n        p(v.topClick, \"click\", w);\n        p(v.topDoubleClick, \"dblclick\", w);\n        if (u) {\n            p(v.topTouchStart, \"touchstart\", w);\n            p(v.topTouchEnd, \"touchend\", w);\n            p(v.topTouchMove, \"touchmove\", w);\n            p(v.topTouchCancel, \"touchcancel\", w);\n        }\n    ;\n    ;\n        p(v.topKeyUp, \"keyup\", w);\n        p(v.topKeyPress, \"keypress\", w);\n        p(v.topKeyDown, \"keydown\", w);\n        p(v.topInput, \"input\", w);\n        p(v.topChange, \"change\", w);\n        p(v.topSelectionChange, \"selectionchange\", w);\n        p(v.topDOMCharacterDataModified, \"DOMCharacterDataModified\", w);\n        if (n(\"drag\")) {\n            p(v.topDrag, \"drag\", w);\n            p(v.topDragEnd, \"dragend\", w);\n            p(v.topDragEnter, \"dragenter\", w);\n            p(v.topDragExit, \"dragexit\", w);\n            p(v.topDragLeave, \"dragleave\", w);\n            p(v.topDragOver, \"dragover\", w);\n            p(v.topDragStart, \"dragstart\", w);\n            p(v.topDrop, \"drop\", w);\n        }\n    ;\n    ;\n        if (n(\"wheel\")) {\n            p(v.topWheel, \"wheel\", w);\n        }\n         else if (n(\"mousewheel\")) {\n            p(v.topWheel, \"mousewheel\", w);\n        }\n         else p(v.topWheel, \"DOMMouseScroll\", w);\n        \n    ;\n    ;\n        if (n(\"JSBNG__scroll\", true)) {\n            q(v.topScroll, \"JSBNG__scroll\", w);\n        }\n         else p(v.topScroll, \"JSBNG__scroll\", window);\n    ;\n    ;\n        if (n(\"JSBNG__focus\", true)) {\n            q(v.topFocus, \"JSBNG__focus\", w);\n            q(v.topBlur, \"JSBNG__blur\", w);\n        }\n         else if (n(\"focusin\")) {\n            p(v.topFocus, \"focusin\", w);\n            p(v.topBlur, \"focusout\", w);\n        }\n        \n    ;\n    ;\n    };\n;\n    var t = {\n        TopLevelCallbackCreator: null,\n        ensureListening: function(u, v) {\n            m(j.canUseDOM);\n            if (!o) {\n                t.TopLevelCallbackCreator = v;\n                s(u);\n                o = true;\n            }\n        ;\n        ;\n        },\n        setEnabled: function(u) {\n            m(j.canUseDOM);\n            if (t.TopLevelCallbackCreator) {\n                t.TopLevelCallbackCreator.setEnabled(u);\n            }\n        ;\n        ;\n        },\n        isEnabled: function() {\n            return !!((t.TopLevelCallbackCreator && t.TopLevelCallbackCreator.isEnabled()));\n        },\n        handleTopLevel: function(u, v, w, x) {\n            var y = i.extractEvents(u, v, w, x);\n            k.batchedUpdates(function() {\n                i.enqueueEvents(y);\n                i.processEventQueue();\n            });\n        },\n        registrationNames: i.registrationNames,\n        putListener: i.putListener,\n        getListener: i.getListener,\n        deleteListener: i.deleteListener,\n        deleteAllListeners: i.deleteAllListeners,\n        trapBubbledEvent: p,\n        trapCapturedEvent: q\n    };\n    e.exports = t;\n});\n__d(\"getEventTarget\", [\"ExecutionEnvironment\",], function(a, b, c, d, e, f) {\n    var g = b(\"ExecutionEnvironment\");\n    function h(i) {\n        var j = ((((i.target || i.srcElement)) || g.global));\n        return ((((j.nodeType === 3)) ? j.parentNode : j));\n    };\n;\n    e.exports = h;\n});\n__d(\"ReactEventTopLevelCallback\", [\"ExecutionEnvironment\",\"ReactEventEmitter\",\"ReactID\",\"ReactInstanceHandles\",\"getEventTarget\",], function(a, b, c, d, e, f) {\n    var g = b(\"ExecutionEnvironment\"), h = b(\"ReactEventEmitter\"), i = b(\"ReactID\"), j = b(\"ReactInstanceHandles\"), k = b(\"getEventTarget\"), l = true, m = {\n        setEnabled: function(n) {\n            l = !!n;\n        },\n        isEnabled: function() {\n            return l;\n        },\n        createTopLevelCallback: function(n) {\n            return function(o) {\n                if (!l) {\n                    return;\n                }\n            ;\n            ;\n                if (((o.srcElement && ((o.srcElement !== o.target))))) {\n                    o.target = o.srcElement;\n                }\n            ;\n            ;\n                var p = ((j.getFirstReactDOM(k(o)) || g.global)), q = ((i.getID(p) || \"\"));\n                h.handleTopLevel(n, p, q, o);\n            };\n        }\n    };\n    e.exports = m;\n});\n__d(\"ReactInstanceHandles\", [\"ReactID\",\"invariant\",], function(a, b, c, d, e, f) {\n    var g = b(\"ReactID\"), h = b(\"invariant\"), i = \".\", j = i.length, k = 100, l = 9999999;\n    function m(v) {\n        return ((((((i + \"r[\")) + v.toString(36))) + \"]\"));\n    };\n;\n    function n(v, w) {\n        return ((((v.charAt(w) === i)) || ((w === v.length))));\n    };\n;\n    function o(v) {\n        return ((((v === \"\")) || ((((v.charAt(0) === i)) && ((v.charAt(((v.length - 1))) !== i))))));\n    };\n;\n    function p(v, w) {\n        return ((((w.indexOf(v) === 0)) && n(w, v.length)));\n    };\n;\n    function q(v) {\n        return ((v ? v.substr(0, v.lastIndexOf(i)) : \"\"));\n    };\n;\n    function r(v, w) {\n        h(((o(v) && o(w))));\n        h(p(v, w));\n        if (((v === w))) {\n            return v;\n        }\n    ;\n    ;\n        var x = ((v.length + j));\n        for (var y = x; ((y < w.length)); y++) {\n            if (n(w, y)) {\n                break;\n            }\n        ;\n        ;\n        };\n    ;\n        return w.substr(0, y);\n    };\n;\n    function s(v, w) {\n        var x = Math.min(v.length, w.length);\n        if (((x === 0))) {\n            return \"\";\n        }\n    ;\n    ;\n        var y = 0;\n        for (var z = 0; ((z <= x)); z++) {\n            if (((n(v, z) && n(w, z)))) {\n                y = z;\n            }\n             else if (((v.charAt(z) !== w.charAt(z)))) {\n                break;\n            }\n            \n        ;\n        ;\n        };\n    ;\n        var aa = v.substr(0, y);\n        h(o(aa));\n        return aa;\n    };\n;\n    function t(v, w, x, y, z, aa) {\n        v = ((v || \"\"));\n        w = ((w || \"\"));\n        h(((v !== w)));\n        var ba = p(w, v);\n        h(((ba || p(v, w))));\n        var ca = 0, da = ((ba ? q : r));\n        for (var ea = v; ; ea = da(ea, w)) {\n            if (((((!z || ((ea !== v)))) && ((!aa || ((ea !== w))))))) {\n                x(ea, ba, y);\n            }\n        ;\n        ;\n            if (((ea === w))) {\n                break;\n            }\n        ;\n        ;\n            h(((ca++ < k)));\n        };\n    ;\n    };\n;\n    var u = {\n        separator: i,\n        createReactRootID: function() {\n            return m(Math.ceil(((Math.JSBNG__random() * l))));\n        },\n        isRenderedByReact: function(v) {\n            if (((v.nodeType !== 1))) {\n                return false;\n            }\n        ;\n        ;\n            var w = g.getID(v);\n            return ((w ? ((w.charAt(0) === i)) : false));\n        },\n        getFirstReactDOM: function(v) {\n            var w = v;\n            while (((w && ((w.parentNode !== w))))) {\n                if (u.isRenderedByReact(w)) {\n                    return w;\n                }\n            ;\n            ;\n                w = w.parentNode;\n            };\n        ;\n            return null;\n        },\n        findComponentRoot: function(v, w) {\n            var x = [v.firstChild,], y = 0;\n            while (((y < x.length))) {\n                var z = x[y++];\n                while (z) {\n                    var aa = g.getID(z);\n                    if (aa) {\n                        if (((w === aa))) {\n                            return z;\n                        }\n                         else if (p(aa, w)) {\n                            x.length = y = 0;\n                            x.push(z.firstChild);\n                            break;\n                        }\n                         else x.push(z.firstChild);\n                        \n                    ;\n                    ;\n                    }\n                     else x.push(z.firstChild);\n                ;\n                ;\n                    z = z.nextSibling;\n                };\n            ;\n            };\n        ;\n            ((((a.JSBNG__console && emptyFunction)) && false));\n            h(false);\n        },\n        getReactRootIDFromNodeID: function(v) {\n            var w = /\\.r\\[[^\\]]+\\]/.exec(v);\n            return ((w && w[0]));\n        },\n        traverseEnterLeave: function(v, w, x, y, z) {\n            var aa = s(v, w);\n            if (((aa !== v))) {\n                t(v, aa, x, y, false, true);\n            }\n        ;\n        ;\n            if (((aa !== w))) {\n                t(aa, w, x, z, true, false);\n            }\n        ;\n        ;\n        },\n        traverseTwoPhase: function(v, w, x) {\n            if (v) {\n                t(\"\", v, w, x, true, false);\n                t(v, \"\", w, x, false, true);\n            }\n        ;\n        ;\n        },\n        _getFirstCommonAncestorID: s,\n        _getNextDescendantID: r\n    };\n    e.exports = u;\n});\n__d(\"ReactMount\", [\"ReactEventEmitter\",\"ReactInstanceHandles\",\"ReactEventTopLevelCallback\",\"ReactID\",\"$\",], function(a, b, c, d, e, f) {\n    var g = b(\"ReactEventEmitter\"), h = b(\"ReactInstanceHandles\"), i = b(\"ReactEventTopLevelCallback\"), j = b(\"ReactID\"), k = b(\"$\"), l = {\n    }, m = {\n    };\n    function n(q) {\n        return ((q && q.firstChild));\n    };\n;\n    function o(q) {\n        var r = n(q);\n        return ((r && j.getID(r)));\n    };\n;\n    var p = {\n        totalInstantiationTime: 0,\n        totalInjectionTime: 0,\n        useTouchEvents: false,\n        scrollMonitor: function(q, r) {\n            r();\n        },\n        prepareTopLevelEvents: function(q) {\n            g.ensureListening(p.useTouchEvents, q);\n        },\n        _updateRootComponent: function(q, r, s, t) {\n            var u = r.props;\n            p.scrollMonitor(s, function() {\n                q.replaceProps(u, t);\n            });\n            return q;\n        },\n        _registerComponent: function(q, r) {\n            p.prepareTopLevelEvents(i);\n            var s = p.registerContainer(r);\n            l[s] = q;\n            return s;\n        },\n        _renderNewRootComponent: function(q, r, s) {\n            var t = p._registerComponent(q, r);\n            q.mountComponentIntoNode(t, r, s);\n            return q;\n        },\n        renderComponent: function(q, r, s) {\n            var t = l[o(r)];\n            if (t) {\n                if (((t.constructor === q.constructor))) {\n                    return p._updateRootComponent(t, q, r, s);\n                }\n                 else p.unmountAndReleaseReactRootNode(r);\n            ;\n            }\n        ;\n        ;\n            var u = n(r), v = ((u && h.isRenderedByReact(u))), w = ((v && !t)), x = p._renderNewRootComponent(q, r, w);\n            ((s && s()));\n            return x;\n        },\n        constructAndRenderComponent: function(q, r, s) {\n            return p.renderComponent(q(r), s);\n        },\n        constructAndRenderComponentByID: function(q, r, s) {\n            return p.constructAndRenderComponent(q, r, k(s));\n        },\n        registerContainer: function(q) {\n            var r = o(q);\n            if (r) {\n                r = h.getReactRootIDFromNodeID(r);\n            }\n        ;\n        ;\n            if (!r) {\n                r = h.createReactRootID();\n            }\n        ;\n        ;\n            m[r] = q;\n            return r;\n        },\n        unmountAndReleaseReactRootNode: function(q) {\n            var r = o(q), s = l[r];\n            if (!s) {\n                return false;\n            }\n        ;\n        ;\n            s.unmountComponentFromNode(q);\n            delete l[r];\n            delete m[r];\n            return true;\n        },\n        findReactContainerForID: function(q) {\n            var r = h.getReactRootIDFromNodeID(q);\n            return m[r];\n        },\n        findReactNodeByID: function(q) {\n            var r = p.findReactContainerForID(q);\n            return h.findComponentRoot(r, q);\n        }\n    };\n    e.exports = p;\n});\n__d(\"ReactID\", [\"invariant\",\"ReactMount\",], function(a, b, c, d, e, f) {\n    var g = b(\"invariant\"), h = b(\"ReactMount\"), i = \"data-reactid\", j = {\n    };\n    function k(s) {\n        var t = l(s);\n        if (t) {\n            if (j.hasOwnProperty(t)) {\n                var u = j[t];\n                if (((u !== s))) {\n                    g(!o(u, t));\n                    j[t] = s;\n                }\n            ;\n            ;\n            }\n             else j[t] = s;\n        ;\n        }\n    ;\n    ;\n        return t;\n    };\n;\n    function l(s) {\n        if (((s && s.getAttributeNode))) {\n            var t = s.getAttributeNode(i);\n            if (t) {\n                return ((t.value || \"\"));\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n        return \"\";\n    };\n;\n    function m(s, t) {\n        var u = l(s);\n        if (((u !== t))) {\n            delete j[u];\n        }\n    ;\n    ;\n        s.setAttribute(i, t);\n        j[t] = s;\n    };\n;\n    function n(s) {\n        if (((!j.hasOwnProperty(s) || !o(j[s], s)))) {\n            j[s] = h.findReactNodeByID(s);\n        }\n    ;\n    ;\n        return j[s];\n    };\n;\n    function o(s, t) {\n        if (s) {\n            g(((l(s) === t)));\n            var u = h.findReactContainerForID(t);\n            if (((u && p(u, s)))) {\n                return true;\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n        return false;\n    };\n;\n    function p(s, t) {\n        if (s.contains) {\n            return s.contains(t);\n        }\n    ;\n    ;\n        if (((t === s))) {\n            return true;\n        }\n    ;\n    ;\n        if (((t.nodeType === 3))) {\n            t = t.parentNode;\n        }\n    ;\n    ;\n        while (((t && ((t.nodeType === 1))))) {\n            if (((t === s))) {\n                return true;\n            }\n        ;\n        ;\n            t = t.parentNode;\n        };\n    ;\n        return false;\n    };\n;\n    function q(s) {\n        delete j[s];\n    };\n;\n    function r() {\n        j = {\n        };\n    };\n;\n    f.ATTR_NAME = i;\n    f.getID = k;\n    f.setID = m;\n    f.getNode = n;\n    f.purgeID = q;\n    f.purgeEntireCache = r;\n});\n__d(\"getTextContentAccessor\", [\"ExecutionEnvironment\",], function(a, b, c, d, e, f) {\n    var g = b(\"ExecutionEnvironment\"), h = null;\n    function i() {\n        if (((!h && g.canUseDOM))) {\n            h = ((((\"innerText\" in JSBNG__document.createElement(\"div\"))) ? \"innerText\" : \"textContent\"));\n        }\n    ;\n    ;\n        return h;\n    };\n;\n    e.exports = i;\n});\n__d(\"ReactDOMIDOperations\", [\"CSSPropertyOperations\",\"DOMChildrenOperations\",\"DOMPropertyOperations\",\"ReactID\",\"getTextContentAccessor\",\"invariant\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSSPropertyOperations\"), h = b(\"DOMChildrenOperations\"), i = b(\"DOMPropertyOperations\"), j = b(\"ReactID\"), k = b(\"getTextContentAccessor\"), l = b(\"invariant\"), m = {\n        dangerouslySetInnerHTML: \"`dangerouslySetInnerHTML` must be set using `updateInnerHTMLByID()`.\",\n        style: \"`style` must be set using `updateStylesByID()`.\"\n    }, n = ((k() || \"NA\")), o = {\n        updatePropertyByID: function(p, q, r) {\n            var s = j.getNode(p);\n            l(!m.hasOwnProperty(q));\n            i.setValueForProperty(s, q, r);\n        },\n        deletePropertyByID: function(p, q, r) {\n            var s = j.getNode(p);\n            l(!m.hasOwnProperty(q));\n            i.deleteValueForProperty(s, q, r);\n        },\n        updatePropertiesByID: function(p, q) {\n            {\n                var fin65keys = ((window.top.JSBNG_Replay.forInKeys)((q))), fin65i = (0);\n                var r;\n                for (; (fin65i < fin65keys.length); (fin65i++)) {\n                    ((r) = (fin65keys[fin65i]));\n                    {\n                        if (!q.hasOwnProperty(r)) {\n                            continue;\n                        }\n                    ;\n                    ;\n                        o.updatePropertiesByID(p, r, q[r]);\n                    };\n                };\n            };\n        ;\n        },\n        updateStylesByID: function(p, q) {\n            var r = j.getNode(p);\n            g.setValueForStyles(r, q);\n        },\n        updateInnerHTMLByID: function(p, q) {\n            var r = j.getNode(p);\n            r.innerHTML = ((((q && q.__html)) || \"\")).replace(/^ /g, \"&nbsp;\");\n        },\n        updateTextContentByID: function(p, q) {\n            var r = j.getNode(p);\n            r[n] = q;\n        },\n        dangerouslyReplaceNodeWithMarkupByID: function(p, q) {\n            var r = j.getNode(p);\n            h.dangerouslyReplaceNodeWithMarkup(r, q);\n            j.purgeEntireCache();\n        },\n        manageChildrenByParentID: function(p, q) {\n            var r = j.getNode(p);\n            h.manageChildren(r, q);\n            j.purgeEntireCache();\n        },\n        setTextNodeValueAtIndexByParentID: function(p, q, r) {\n            var s = j.getNode(p);\n            h.setTextNodeValueAtIndex(s, q, r);\n        }\n    };\n    e.exports = o;\n});\n__d(\"ReactOwner\", [\"invariant\",], function(a, b, c, d, e, f) {\n    var g = b(\"invariant\"), h = {\n        isValidOwner: function(i) {\n            return !!((((i && ((typeof i.attachRef === \"function\")))) && ((typeof i.detachRef === \"function\"))));\n        },\n        addComponentAsRefTo: function(i, j, k) {\n            g(h.isValidOwner(k));\n            k.attachRef(j, i);\n        },\n        removeComponentAsRefFrom: function(i, j, k) {\n            g(h.isValidOwner(k));\n            if (((k.refs[j] === i))) {\n                k.detachRef(j);\n            }\n        ;\n        ;\n        },\n        Mixin: {\n            attachRef: function(i, j) {\n                g(j.isOwnedBy(this));\n                var k = ((this.refs || (this.refs = {\n                })));\n                k[i] = j;\n            },\n            detachRef: function(i) {\n                delete this.refs[i];\n            }\n        }\n    };\n    e.exports = h;\n});\n__d(\"PooledClass\", [], function(a, b, c, d, e, f) {\n    var g = function(p) {\n        var q = this;\n        if (q.instancePool.length) {\n            var r = q.instancePool.pop();\n            q.call(r, p);\n            return r;\n        }\n         else return new q(p)\n    ;\n    }, h = function(p, q) {\n        var r = this;\n        if (r.instancePool.length) {\n            var s = r.instancePool.pop();\n            r.call(s, p, q);\n            return s;\n        }\n         else return new r(p, q)\n    ;\n    }, i = function(p, q, r) {\n        var s = this;\n        if (s.instancePool.length) {\n            var t = s.instancePool.pop();\n            s.call(t, p, q, r);\n            return t;\n        }\n         else return new s(p, q, r)\n    ;\n    }, j = function(p, q, r, s, t) {\n        var u = this;\n        if (u.instancePool.length) {\n            var v = u.instancePool.pop();\n            u.call(v, p, q, r, s, t);\n            return v;\n        }\n         else return new u(p, q, r, s, t)\n    ;\n    }, k = function(p) {\n        var q = this;\n        if (p.destructor) {\n            p.destructor();\n        }\n    ;\n    ;\n        if (((q.instancePool.length < q.poolSize))) {\n            q.instancePool.push(p);\n        }\n    ;\n    ;\n    }, l = 10, m = g, n = function(p, q) {\n        var r = p;\n        r.instancePool = [];\n        r.getPooled = ((q || m));\n        if (!r.poolSize) {\n            r.poolSize = l;\n        }\n    ;\n    ;\n        r.release = k;\n        return r;\n    }, o = {\n        addPoolingTo: n,\n        oneArgumentPooler: g,\n        twoArgumentPooler: h,\n        threeArgumentPooler: i,\n        fiveArgumentPooler: j\n    };\n    e.exports = o;\n});\n__d(\"ReactInputSelection\", [], function(a, b, c, d, e, f) {\n    function g() {\n        try {\n            return JSBNG__document.activeElement;\n        } catch (j) {\n        \n        };\n    ;\n    };\n;\n    function h(j) {\n        return JSBNG__document.documentElement.contains(j);\n    };\n;\n    var i = {\n        hasSelectionCapabilities: function(j) {\n            return ((j && ((((((((j.nodeName === \"INPUT\")) && ((j.type === \"text\")))) || ((j.nodeName === \"TEXTAREA\")))) || ((j.contentEditable === \"true\"))))));\n        },\n        getSelectionInformation: function() {\n            var j = g();\n            return {\n                focusedElem: j,\n                selectionRange: ((i.hasSelectionCapabilities(j) ? i.JSBNG__getSelection(j) : null))\n            };\n        },\n        restoreSelection: function(j) {\n            var k = g(), l = j.focusedElem, m = j.selectionRange;\n            if (((((k !== l)) && h(l)))) {\n                if (i.hasSelectionCapabilities(l)) {\n                    i.setSelection(l, m);\n                }\n            ;\n            ;\n                l.JSBNG__focus();\n            }\n        ;\n        ;\n        },\n        JSBNG__getSelection: function(j) {\n            var k;\n            if (((((j.contentEditable === \"true\")) && window.JSBNG__getSelection))) {\n                k = window.JSBNG__getSelection().getRangeAt(0);\n                var l = k.commonAncestorContainer;\n                if (((l && ((l.nodeType === 3))))) {\n                    l = l.parentNode;\n                }\n            ;\n            ;\n                if (((l !== j))) {\n                    return {\n                        start: 0,\n                        end: 0\n                    };\n                }\n                 else return {\n                    start: k.startOffset,\n                    end: k.endOffset\n                }\n            ;\n            }\n        ;\n        ;\n            if (!JSBNG__document.selection) {\n                return {\n                    start: j.selectionStart,\n                    end: j.selectionEnd\n                };\n            }\n        ;\n        ;\n            k = JSBNG__document.selection.createRange();\n            if (((k.parentElement() !== j))) {\n                return {\n                    start: 0,\n                    end: 0\n                };\n            }\n        ;\n        ;\n            var m = j.value.length;\n            if (((j.nodeName === \"INPUT\"))) {\n                return {\n                    start: -k.moveStart(\"character\", -m),\n                    end: -k.moveEnd(\"character\", -m)\n                };\n            }\n             else {\n                var n = k.duplicate();\n                n.moveToElementText(j);\n                n.setEndPoint(\"StartToEnd\", k);\n                var o = ((m - n.text.length));\n                n.setEndPoint(\"StartToStart\", k);\n                return {\n                    start: ((m - n.text.length)),\n                    end: o\n                };\n            }\n        ;\n        ;\n        },\n        setSelection: function(j, k) {\n            var l, m = k.start, n = k.end;\n            if (((typeof n === \"undefined\"))) {\n                n = m;\n            }\n        ;\n        ;\n            if (JSBNG__document.selection) {\n                if (((j.tagName === \"TEXTAREA\"))) {\n                    var o = ((j.value.slice(0, m).match(/\\r/g) || [])).length, p = ((j.value.slice(m, n).match(/\\r/g) || [])).length;\n                    m -= o;\n                    n -= ((o + p));\n                }\n            ;\n            ;\n                l = j.createTextRange();\n                l.collapse(true);\n                l.moveStart(\"character\", m);\n                l.moveEnd(\"character\", ((n - m)));\n                l.select();\n            }\n             else if (((j.contentEditable === \"true\"))) {\n                if (((j.childNodes.length === 1))) {\n                    l = JSBNG__document.createRange();\n                    l.setStart(j.childNodes[0], m);\n                    l.setEnd(j.childNodes[0], n);\n                    var q = window.JSBNG__getSelection();\n                    q.removeAllRanges();\n                    q.addRange(l);\n                }\n            ;\n            ;\n            }\n             else {\n                j.selectionStart = m;\n                j.selectionEnd = Math.min(n, j.value.length);\n                j.JSBNG__focus();\n            }\n            \n        ;\n        ;\n        }\n    };\n    e.exports = i;\n});\n__d(\"mixInto\", [], function(a, b, c, d, e, f) {\n    var g = function(h, i) {\n        var j;\n        {\n            var fin66keys = ((window.top.JSBNG_Replay.forInKeys)((i))), fin66i = (0);\n            (0);\n            for (; (fin66i < fin66keys.length); (fin66i++)) {\n                ((j) = (fin66keys[fin66i]));\n                {\n                    if (!i.hasOwnProperty(j)) {\n                        continue;\n                    }\n                ;\n                ;\n                    h.prototype[j] = i[j];\n                };\n            };\n        };\n    ;\n    };\n    e.exports = g;\n});\n__d(\"ReactOnDOMReady\", [\"PooledClass\",\"mixInto\",], function(a, b, c, d, e, f) {\n    var g = b(\"PooledClass\"), h = b(\"mixInto\");\n    function i(j) {\n        this._queue = ((j || null));\n    };\n;\n    h(i, {\n        enqueue: function(j, k) {\n            this._queue = ((this._queue || []));\n            this._queue.push({\n                component: j,\n                callback: k\n            });\n        },\n        notifyAll: function() {\n            var j = this._queue;\n            if (j) {\n                this._queue = null;\n                for (var k = 0, l = j.length; ((k < l)); k++) {\n                    var m = j[k].component, n = j[k].callback;\n                    n.call(m, m.getDOMNode());\n                };\n            ;\n                j.length = 0;\n            }\n        ;\n        ;\n        },\n        reset: function() {\n            this._queue = null;\n        },\n        destructor: function() {\n            this.reset();\n        }\n    });\n    g.addPoolingTo(i);\n    e.exports = i;\n});\n__d(\"Transaction\", [\"throwIf\",], function(a, b, c, d, e, f) {\n    var g = b(\"throwIf\"), h = \"DUAL_TRANSACTION\", i = \"MISSING_TRANSACTION\", j = {\n        reinitializeTransaction: function() {\n            this.transactionWrappers = this.getTransactionWrappers();\n            if (!this.wrapperInitData) {\n                this.wrapperInitData = [];\n            }\n             else this.wrapperInitData.length = 0;\n        ;\n        ;\n            if (!this.timingMetrics) {\n                this.timingMetrics = {\n                };\n            }\n        ;\n        ;\n            this.timingMetrics.methodInvocationTime = 0;\n            if (!this.timingMetrics.wrapperInitTimes) {\n                this.timingMetrics.wrapperInitTimes = [];\n            }\n             else this.timingMetrics.wrapperInitTimes.length = 0;\n        ;\n        ;\n            if (!this.timingMetrics.wrapperCloseTimes) {\n                this.timingMetrics.wrapperCloseTimes = [];\n            }\n             else this.timingMetrics.wrapperCloseTimes.length = 0;\n        ;\n        ;\n            this._isInTransaction = false;\n        },\n        _isInTransaction: false,\n        getTransactionWrappers: null,\n        isInTransaction: function() {\n            return !!this._isInTransaction;\n        },\n        perform: function(l, m, n, o, p, q, r, s) {\n            g(this.isInTransaction(), h);\n            var t = JSBNG__Date.now(), u = null, v;\n            try {\n                this.initializeAll();\n                v = l.call(m, n, o, p, q, r, s);\n            } catch (w) {\n                u = w;\n            } finally {\n                var x = JSBNG__Date.now();\n                this.methodInvocationTime += ((x - t));\n                try {\n                    this.closeAll();\n                } catch (y) {\n                    u = ((u || y));\n                };\n            ;\n            };\n        ;\n            if (u) {\n                throw u;\n            }\n        ;\n        ;\n            return v;\n        },\n        initializeAll: function() {\n            this._isInTransaction = true;\n            var l = this.transactionWrappers, m = this.timingMetrics.wrapperInitTimes, n = null;\n            for (var o = 0; ((o < l.length)); o++) {\n                var p = JSBNG__Date.now(), q = l[o];\n                try {\n                    this.wrapperInitData[o] = ((q.initialize ? q.initialize.call(this) : null));\n                } catch (r) {\n                    n = ((n || r));\n                    this.wrapperInitData[o] = k.OBSERVED_ERROR;\n                } finally {\n                    var s = m[o], t = JSBNG__Date.now();\n                    m[o] = ((((s || 0)) + ((t - p))));\n                };\n            ;\n            };\n        ;\n            if (n) {\n                throw n;\n            }\n        ;\n        ;\n        },\n        closeAll: function() {\n            g(!this.isInTransaction(), i);\n            var l = this.transactionWrappers, m = this.timingMetrics.wrapperCloseTimes, n = null;\n            for (var o = 0; ((o < l.length)); o++) {\n                var p = l[o], q = JSBNG__Date.now(), r = this.wrapperInitData[o];\n                try {\n                    if (((r !== k.OBSERVED_ERROR))) {\n                        ((p.close && p.close.call(this, r)));\n                    }\n                ;\n                ;\n                } catch (s) {\n                    n = ((n || s));\n                } finally {\n                    var t = JSBNG__Date.now(), u = m[o];\n                    m[o] = ((((u || 0)) + ((t - q))));\n                };\n            ;\n            };\n        ;\n            this.wrapperInitData.length = 0;\n            this._isInTransaction = false;\n            if (n) {\n                throw n;\n            }\n        ;\n        ;\n        }\n    }, k = {\n        Mixin: j,\n        OBSERVED_ERROR: {\n        }\n    };\n    e.exports = k;\n});\n__d(\"ReactReconcileTransaction\", [\"ExecutionEnvironment\",\"PooledClass\",\"ReactEventEmitter\",\"ReactInputSelection\",\"ReactOnDOMReady\",\"Transaction\",\"mixInto\",], function(a, b, c, d, e, f) {\n    var g = b(\"ExecutionEnvironment\"), h = b(\"PooledClass\"), i = b(\"ReactEventEmitter\"), j = b(\"ReactInputSelection\"), k = b(\"ReactOnDOMReady\"), l = b(\"Transaction\"), m = b(\"mixInto\"), n = {\n        initialize: j.getSelectionInformation,\n        close: j.restoreSelection\n    }, o = {\n        initialize: function() {\n            var t = i.isEnabled();\n            i.setEnabled(false);\n            return t;\n        },\n        close: function(t) {\n            i.setEnabled(t);\n        }\n    }, p = {\n        initialize: function() {\n            this.reactOnDOMReady.reset();\n        },\n        close: function() {\n            this.reactOnDOMReady.notifyAll();\n        }\n    }, q = [n,o,p,];\n    function r() {\n        this.reinitializeTransaction();\n        this.reactOnDOMReady = k.getPooled(null);\n    };\n;\n    var s = {\n        getTransactionWrappers: function() {\n            if (g.canUseDOM) {\n                return q;\n            }\n             else return []\n        ;\n        },\n        getReactOnDOMReady: function() {\n            return this.reactOnDOMReady;\n        },\n        destructor: function() {\n            k.release(this.reactOnDOMReady);\n            this.reactOnDOMReady = null;\n        }\n    };\n    m(r, l.Mixin);\n    m(r, s);\n    h.addPoolingTo(r);\n    e.exports = r;\n});\n__d(\"mergeHelpers\", [\"keyMirror\",\"throwIf\",], function(a, b, c, d, e, f) {\n    var g = b(\"keyMirror\"), h = b(\"throwIf\"), i = 36, j = g({\n        MERGE_ARRAY_FAIL: null,\n        MERGE_CORE_FAILURE: null,\n        MERGE_TYPE_USAGE_FAILURE: null,\n        MERGE_DEEP_MAX_LEVELS: null,\n        MERGE_DEEP_NO_ARR_STRATEGY: null\n    }), k = function(m) {\n        return ((((typeof m !== \"object\")) || ((m === null))));\n    }, l = {\n        MAX_MERGE_DEPTH: i,\n        isTerminal: k,\n        normalizeMergeArg: function(m) {\n            return ((((((m === undefined)) || ((m === null)))) ? {\n            } : m));\n        },\n        checkMergeArrayArgs: function(m, n) {\n            h(((!Array.isArray(m) || !Array.isArray(n))), j.MERGE_CORE_FAILURE);\n        },\n        checkMergeObjectArgs: function(m, n) {\n            l.checkMergeObjectArg(m);\n            l.checkMergeObjectArg(n);\n        },\n        checkMergeObjectArg: function(m) {\n            h(((k(m) || Array.isArray(m))), j.MERGE_CORE_FAILURE);\n        },\n        checkMergeLevel: function(m) {\n            h(((m >= i)), j.MERGE_DEEP_MAX_LEVELS);\n        },\n        checkArrayStrategy: function(m) {\n            h(((((m !== undefined)) && !((m in l.ArrayStrategies)))), j.MERGE_DEEP_NO_ARR_STRATEGY);\n        },\n        ArrayStrategies: g({\n            Clobber: true,\n            IndexByIndex: true\n        }),\n        ERRORS: j\n    };\n    e.exports = l;\n});\n__d(\"mergeInto\", [\"mergeHelpers\",], function(a, b, c, d, e, f) {\n    var g = b(\"mergeHelpers\"), h = g.checkMergeObjectArg;\n    function i(j, k) {\n        h(j);\n        if (((k != null))) {\n            h(k);\n            {\n                var fin67keys = ((window.top.JSBNG_Replay.forInKeys)((k))), fin67i = (0);\n                var l;\n                for (; (fin67i < fin67keys.length); (fin67i++)) {\n                    ((l) = (fin67keys[fin67i]));\n                    {\n                        if (!k.hasOwnProperty(l)) {\n                            continue;\n                        }\n                    ;\n                    ;\n                        j[l] = k[l];\n                    };\n                };\n            };\n        ;\n        }\n    ;\n    ;\n    };\n;\n    e.exports = i;\n});\n__d(\"merge\", [\"mergeInto\",], function(a, b, c, d, e, f) {\n    var g = b(\"mergeInto\"), h = function(i, j) {\n        var k = {\n        };\n        g(k, i);\n        g(k, j);\n        return k;\n    };\n    e.exports = h;\n});\n__d(\"ReactComponent\", [\"ReactCurrentOwner\",\"ReactDOMIDOperations\",\"ReactID\",\"ReactMount\",\"ReactOwner\",\"ReactReconcileTransaction\",\"ReactUpdates\",\"invariant\",\"keyMirror\",\"merge\",], function(a, b, c, d, e, f) {\n    var g = b(\"ReactCurrentOwner\"), h = b(\"ReactDOMIDOperations\"), i = b(\"ReactID\"), j = b(\"ReactMount\"), k = b(\"ReactOwner\"), l = b(\"ReactReconcileTransaction\"), m = b(\"ReactUpdates\"), n = b(\"invariant\"), o = b(\"keyMirror\"), p = b(\"merge\"), q = \"{owner}\", r = \"{is.key.validated}\", s = o({\n        MOUNTED: null,\n        UNMOUNTED: null\n    }), t = {\n    };\n    function u(x) {\n        if (((x[r] || ((x.props.key != null))))) {\n            return;\n        }\n    ;\n    ;\n        x[r] = true;\n        if (!g.current) {\n            return;\n        }\n    ;\n    ;\n        var y = g.current.constructor.displayName;\n        if (t.hasOwnProperty(y)) {\n            return;\n        }\n    ;\n    ;\n        t[y] = true;\n        var z = ((((((\"Each child in an array should have a unique \\\"key\\\" prop. \" + \"Check the render method of \")) + y)) + \".\"));\n        if (!x.isOwnedBy(g.current)) {\n            var aa = ((x.props[q] && x.props[q].constructor.displayName));\n            z += ((((\" It was passed a child from \" + aa)) + \".\"));\n        }\n    ;\n    ;\n    };\n;\n    function v(x) {\n        if (Array.isArray(x)) {\n            for (var y = 0; ((y < x.length)); y++) {\n                var z = x[y];\n                if (w.isValidComponent(z)) {\n                    u(z);\n                }\n            ;\n            ;\n            };\n        ;\n        }\n         else if (w.isValidComponent(x)) {\n            x[r] = true;\n        }\n        \n    ;\n    ;\n    };\n;\n    var w = {\n        isValidComponent: function(x) {\n            return !!((((x && ((typeof x.mountComponentIntoNode === \"function\")))) && ((typeof x.receiveProps === \"function\"))));\n        },\n        getKey: function(x, y) {\n            if (((((x && x.props)) && ((x.props.key != null))))) {\n                return ((\"\" + x.props.key));\n            }\n        ;\n        ;\n            return ((\"\" + y));\n        },\n        LifeCycle: s,\n        DOMIDOperations: h,\n        ReactReconcileTransaction: l,\n        setDOMOperations: function(x) {\n            w.DOMIDOperations = x;\n        },\n        setReactReconcileTransaction: function(x) {\n            w.ReactReconcileTransaction = x;\n        },\n        Mixin: {\n            isMounted: function() {\n                return ((this._lifeCycleState === s.MOUNTED));\n            },\n            getDOMNode: function() {\n                n(this.isMounted());\n                return i.getNode(this._rootNodeID);\n            },\n            setProps: function(x, y) {\n                this.replaceProps(p(((this._pendingProps || this.props)), x), y);\n            },\n            replaceProps: function(x, y) {\n                n(!this.props[q]);\n                this._pendingProps = x;\n                m.enqueueUpdate(this, y);\n            },\n            construct: function(x, y) {\n                this.props = ((x || {\n                }));\n                this.props[q] = g.current;\n                this._lifeCycleState = s.UNMOUNTED;\n                this._pendingProps = null;\n                this._pendingCallbacks = null;\n                var z = ((arguments.length - 1));\n                if (((z === 1))) {\n                    this.props.children = y;\n                }\n                 else if (((z > 1))) {\n                    var aa = Array(z);\n                    for (var ba = 0; ((ba < z)); ba++) {\n                        aa[ba] = arguments[((ba + 1))];\n                    ;\n                    };\n                ;\n                    this.props.children = aa;\n                }\n                \n            ;\n            ;\n            },\n            mountComponent: function(x, y) {\n                n(!this.isMounted());\n                var z = this.props;\n                if (((z.ref != null))) {\n                    k.addComponentAsRefTo(this, z.ref, z[q]);\n                }\n            ;\n            ;\n                this._rootNodeID = x;\n                this._lifeCycleState = s.MOUNTED;\n            },\n            unmountComponent: function() {\n                n(this.isMounted());\n                var x = this.props;\n                if (((x.ref != null))) {\n                    k.removeComponentAsRefFrom(this, x.ref, x[q]);\n                }\n            ;\n            ;\n                i.purgeID(this._rootNodeID);\n                this._rootNodeID = null;\n                this._lifeCycleState = s.UNMOUNTED;\n            },\n            receiveProps: function(x, y) {\n                n(this.isMounted());\n                this._pendingProps = x;\n                this._performUpdateIfNecessary(y);\n            },\n            performUpdateIfNecessary: function() {\n                var x = w.ReactReconcileTransaction.getPooled();\n                x.perform(this._performUpdateIfNecessary, this, x);\n                w.ReactReconcileTransaction.release(x);\n            },\n            _performUpdateIfNecessary: function(x) {\n                if (((this._pendingProps == null))) {\n                    return;\n                }\n            ;\n            ;\n                var y = this.props;\n                this.props = this._pendingProps;\n                this._pendingProps = null;\n                this.updateComponent(x, y);\n            },\n            updateComponent: function(x, y) {\n                var z = this.props;\n                if (((((z[q] !== y[q])) || ((z.ref !== y.ref))))) {\n                    if (((y.ref != null))) {\n                        k.removeComponentAsRefFrom(this, y.ref, y[q]);\n                    }\n                ;\n                ;\n                    if (((z.ref != null))) {\n                        k.addComponentAsRefTo(this, z.ref, z[q]);\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n            },\n            mountComponentIntoNode: function(x, y, z) {\n                var aa = w.ReactReconcileTransaction.getPooled();\n                aa.perform(this._mountComponentIntoNode, this, x, y, aa, z);\n                w.ReactReconcileTransaction.release(aa);\n            },\n            _mountComponentIntoNode: function(x, y, z, aa) {\n                n(((y && ((y.nodeType === 1)))));\n                var ba = JSBNG__Date.now(), ca = this.mountComponent(x, z);\n                j.totalInstantiationTime += ((JSBNG__Date.now() - ba));\n                if (aa) {\n                    return;\n                }\n            ;\n            ;\n                var da = JSBNG__Date.now(), ea = y.parentNode;\n                if (ea) {\n                    var fa = y.nextSibling;\n                    ea.removeChild(y);\n                    y.innerHTML = ca;\n                    if (fa) {\n                        ea.insertBefore(y, fa);\n                    }\n                     else ea.appendChild(y);\n                ;\n                ;\n                }\n                 else y.innerHTML = ca;\n            ;\n            ;\n                j.totalInjectionTime += ((JSBNG__Date.now() - da));\n            },\n            unmountComponentFromNode: function(x) {\n                this.unmountComponent();\n                while (x.lastChild) {\n                    x.removeChild(x.lastChild);\n                ;\n                };\n            ;\n            },\n            isOwnedBy: function(x) {\n                return ((this.props[q] === x));\n            },\n            getSiblingByRef: function(x) {\n                var y = this.props[q];\n                if (((!y || !y.refs))) {\n                    return null;\n                }\n            ;\n            ;\n                return y.refs[x];\n            }\n        }\n    };\n    e.exports = w;\n});\n__d(\"joinClasses\", [], function(a, b, c, d, e, f) {\n    function g(h) {\n        if (!h) {\n            h = \"\";\n        }\n    ;\n    ;\n        var i, j = arguments.length;\n        if (((j > 1))) {\n            for (var k = 1; ((k < j)); k++) {\n                i = arguments[k];\n                ((i && (h += ((\" \" + i)))));\n            };\n        }\n    ;\n    ;\n        return h;\n    };\n;\n    e.exports = g;\n});\n__d(\"ReactPropTransferer\", [\"emptyFunction\",\"joinClasses\",\"merge\",], function(a, b, c, d, e, f) {\n    var g = b(\"emptyFunction\"), h = b(\"joinClasses\"), i = b(\"merge\");\n    function j(m) {\n        return function(n, o, p) {\n            if (!n.hasOwnProperty(o)) {\n                n[o] = p;\n            }\n             else n[o] = m(n[o], p);\n        ;\n        ;\n        };\n    };\n;\n    var k = {\n        children: g,\n        className: j(h),\n        ref: g,\n        style: j(i)\n    }, l = {\n        TransferStrategies: k,\n        Mixin: {\n            transferPropsTo: function(m) {\n                var n = {\n                };\n                {\n                    var fin68keys = ((window.top.JSBNG_Replay.forInKeys)((m.props))), fin68i = (0);\n                    var o;\n                    for (; (fin68i < fin68keys.length); (fin68i++)) {\n                        ((o) = (fin68keys[fin68i]));\n                        {\n                            if (m.props.hasOwnProperty(o)) {\n                                n[o] = m.props[o];\n                            }\n                        ;\n                        ;\n                        };\n                    };\n                };\n            ;\n                {\n                    var fin69keys = ((window.top.JSBNG_Replay.forInKeys)((this.props))), fin69i = (0);\n                    var p;\n                    for (; (fin69i < fin69keys.length); (fin69i++)) {\n                        ((p) = (fin69keys[fin69i]));\n                        {\n                            if (!this.props.hasOwnProperty(p)) {\n                                continue;\n                            }\n                        ;\n                        ;\n                            var q = k[p];\n                            if (q) {\n                                q(n, p, this.props[p]);\n                            }\n                             else if (!n.hasOwnProperty(p)) {\n                                n[p] = this.props[p];\n                            }\n                            \n                        ;\n                        ;\n                        };\n                    };\n                };\n            ;\n                m.props = n;\n                return m;\n            }\n        }\n    };\n    e.exports = l;\n});\n__d(\"ReactCompositeComponent\", [\"ReactComponent\",\"ReactCurrentOwner\",\"ReactOwner\",\"ReactPropTransferer\",\"ReactUpdates\",\"invariant\",\"keyMirror\",\"merge\",\"mixInto\",], function(a, b, c, d, e, f) {\n    var g = b(\"ReactComponent\"), h = b(\"ReactCurrentOwner\"), i = b(\"ReactOwner\"), j = b(\"ReactPropTransferer\"), k = b(\"ReactUpdates\"), l = b(\"invariant\"), m = b(\"keyMirror\"), n = b(\"merge\"), o = b(\"mixInto\"), p = m({\n        DEFINE_ONCE: null,\n        DEFINE_MANY: null,\n        OVERRIDE_BASE: null\n    }), q = {\n        mixins: p.DEFINE_MANY,\n        props: p.DEFINE_ONCE,\n        getDefaultProps: p.DEFINE_ONCE,\n        getInitialState: p.DEFINE_ONCE,\n        render: p.DEFINE_ONCE,\n        componentWillMount: p.DEFINE_MANY,\n        componentDidMount: p.DEFINE_MANY,\n        componentWillReceiveProps: p.DEFINE_MANY,\n        shouldComponentUpdate: p.DEFINE_ONCE,\n        componentWillUpdate: p.DEFINE_MANY,\n        componentDidUpdate: p.DEFINE_MANY,\n        componentWillUnmount: p.DEFINE_MANY,\n        updateComponent: p.OVERRIDE_BASE\n    }, r = {\n        displayName: function(aa, ba) {\n            aa.displayName = ba;\n        },\n        mixins: function(aa, ba) {\n            if (ba) {\n                for (var ca = 0; ((ca < ba.length)); ca++) {\n                    u(aa, ba[ca]);\n                ;\n                };\n            }\n        ;\n        ;\n        },\n        props: function(aa, ba) {\n            aa.propDeclarations = ba;\n        }\n    };\n    function s(aa, ba) {\n        var ca = q[ba];\n        if (x.hasOwnProperty(ba)) {\n            l(((ca === p.OVERRIDE_BASE)));\n        }\n    ;\n    ;\n        if (aa.hasOwnProperty(ba)) {\n            l(((ca === p.DEFINE_MANY)));\n        }\n    ;\n    ;\n    };\n;\n    function t(aa) {\n        var ba = aa._compositeLifeCycleState;\n        l(((aa.isMounted() || ((ba === w.MOUNTING)))));\n        l(((((ba !== w.RECEIVING_STATE)) && ((ba !== w.UNMOUNTING)))));\n    };\n;\n    function u(aa, ba) {\n        var ca = aa.prototype;\n        {\n            var fin70keys = ((window.top.JSBNG_Replay.forInKeys)((ba))), fin70i = (0);\n            var da;\n            for (; (fin70i < fin70keys.length); (fin70i++)) {\n                ((da) = (fin70keys[fin70i]));\n                {\n                    var ea = ba[da];\n                    if (((!ba.hasOwnProperty(da) || !ea))) {\n                        continue;\n                    }\n                ;\n                ;\n                    s(ca, da);\n                    if (r.hasOwnProperty(da)) {\n                        r[da](aa, ea);\n                    }\n                     else {\n                        var fa = ((da in q)), ga = ((da in ca)), ha = ea.__reactDontBind, ia = ((typeof ea === \"function\")), ja = ((((((ia && !fa)) && !ga)) && !ha));\n                        if (ja) {\n                            if (!ca.__reactAutoBindMap) {\n                                ca.__reactAutoBindMap = {\n                                };\n                            }\n                        ;\n                        ;\n                            ca.__reactAutoBindMap[da] = ea;\n                            ca[da] = ea;\n                        }\n                         else if (ga) {\n                            ca[da] = v(ca[da], ea);\n                        }\n                         else ca[da] = ea;\n                        \n                    ;\n                    ;\n                    }\n                ;\n                ;\n                };\n            };\n        };\n    ;\n    };\n;\n    function v(aa, ba) {\n        return function ca() {\n            aa.apply(this, arguments);\n            ba.apply(this, arguments);\n        };\n    };\n;\n    var w = m({\n        MOUNTING: null,\n        UNMOUNTING: null,\n        RECEIVING_PROPS: null,\n        RECEIVING_STATE: null\n    }), x = {\n        construct: function(aa, ba) {\n            g.Mixin.construct.apply(this, arguments);\n            this.state = null;\n            this._pendingState = null;\n            this._compositeLifeCycleState = null;\n        },\n        isMounted: function() {\n            return ((g.Mixin.isMounted.call(this) && ((this._compositeLifeCycleState !== w.MOUNTING))));\n        },\n        mountComponent: function(aa, ba) {\n            g.Mixin.mountComponent.call(this, aa, ba);\n            this._compositeLifeCycleState = w.MOUNTING;\n            this._defaultProps = ((this.getDefaultProps ? this.getDefaultProps() : null));\n            this._processProps(this.props);\n            if (this.__reactAutoBindMap) {\n                this._bindAutoBindMethods();\n            }\n        ;\n        ;\n            this.state = ((this.getInitialState ? this.getInitialState() : null));\n            this._pendingState = null;\n            this._pendingForceUpdate = false;\n            if (this.componentWillMount) {\n                this.componentWillMount();\n                if (this._pendingState) {\n                    this.state = this._pendingState;\n                    this._pendingState = null;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            this._renderedComponent = this._renderValidatedComponent();\n            this._compositeLifeCycleState = null;\n            var ca = this._renderedComponent.mountComponent(aa, ba);\n            if (this.componentDidMount) {\n                ba.getReactOnDOMReady().enqueue(this, this.componentDidMount);\n            }\n        ;\n        ;\n            return ca;\n        },\n        unmountComponent: function() {\n            this._compositeLifeCycleState = w.UNMOUNTING;\n            if (this.componentWillUnmount) {\n                this.componentWillUnmount();\n            }\n        ;\n        ;\n            this._compositeLifeCycleState = null;\n            this._defaultProps = null;\n            g.Mixin.unmountComponent.call(this);\n            this._renderedComponent.unmountComponent();\n            this._renderedComponent = null;\n            if (this.refs) {\n                this.refs = null;\n            }\n        ;\n        ;\n        },\n        setState: function(aa, ba) {\n            this.replaceState(n(((this._pendingState || this.state)), aa), ba);\n        },\n        replaceState: function(aa, ba) {\n            t.call(null, this);\n            this._pendingState = aa;\n            k.enqueueUpdate(this, ba);\n        },\n        _processProps: function(aa) {\n            var ba, ca = this._defaultProps;\n            {\n                var fin71keys = ((window.top.JSBNG_Replay.forInKeys)((ca))), fin71i = (0);\n                (0);\n                for (; (fin71i < fin71keys.length); (fin71i++)) {\n                    ((ba) = (fin71keys[fin71i]));\n                    {\n                        if (!((ba in aa))) {\n                            aa[ba] = ca[ba];\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            var da = this.constructor.propDeclarations;\n            if (da) {\n                var ea = this.constructor.displayName;\n                {\n                    var fin72keys = ((window.top.JSBNG_Replay.forInKeys)((da))), fin72i = (0);\n                    (0);\n                    for (; (fin72i < fin72keys.length); (fin72i++)) {\n                        ((ba) = (fin72keys[fin72i]));\n                        {\n                            var fa = da[ba];\n                            if (fa) {\n                                fa(aa, ba, ea);\n                            }\n                        ;\n                        ;\n                        };\n                    };\n                };\n            ;\n            }\n        ;\n        ;\n        },\n        performUpdateIfNecessary: function() {\n            var aa = this._compositeLifeCycleState;\n            if (((((aa === w.MOUNTING)) || ((aa === w.RECEIVING_PROPS))))) {\n                return;\n            }\n        ;\n        ;\n            g.Mixin.performUpdateIfNecessary.call(this);\n        },\n        _performUpdateIfNecessary: function(aa) {\n            if (((((((this._pendingProps == null)) && ((this._pendingState == null)))) && !this._pendingForceUpdate))) {\n                return;\n            }\n        ;\n        ;\n            var ba = this.props;\n            if (((this._pendingProps != null))) {\n                ba = this._pendingProps;\n                this._processProps(ba);\n                this._pendingProps = null;\n                this._compositeLifeCycleState = w.RECEIVING_PROPS;\n                if (this.componentWillReceiveProps) {\n                    this.componentWillReceiveProps(ba, aa);\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            this._compositeLifeCycleState = w.RECEIVING_STATE;\n            var ca = ((this._pendingState || this.state));\n            this._pendingState = null;\n            if (((((this._pendingForceUpdate || !this.shouldComponentUpdate)) || this.shouldComponentUpdate(ba, ca)))) {\n                this._pendingForceUpdate = false;\n                this._performComponentUpdate(ba, ca, aa);\n            }\n             else {\n                this.props = ba;\n                this.state = ca;\n            }\n        ;\n        ;\n            this._compositeLifeCycleState = null;\n        },\n        _performComponentUpdate: function(aa, ba, ca) {\n            var da = this.props, ea = this.state;\n            if (this.componentWillUpdate) {\n                this.componentWillUpdate(aa, ba, ca);\n            }\n        ;\n        ;\n            this.props = aa;\n            this.state = ba;\n            this.updateComponent(ca, da, ea);\n            if (this.componentDidUpdate) {\n                ca.getReactOnDOMReady().enqueue(this, this.componentDidUpdate.bind(this, da, ea));\n            }\n        ;\n        ;\n        },\n        updateComponent: function(aa, ba, ca) {\n            g.Mixin.updateComponent.call(this, aa, ba);\n            var da = this._renderedComponent, ea = this._renderValidatedComponent();\n            if (((da.constructor === ea.constructor))) {\n                da.receiveProps(ea.props, aa);\n            }\n             else {\n                var fa = this._rootNodeID, ga = da._rootNodeID;\n                da.unmountComponent();\n                var ha = ea.mountComponent(fa, aa);\n                g.DOMIDOperations.dangerouslyReplaceNodeWithMarkupByID(ga, ha);\n                this._renderedComponent = ea;\n            }\n        ;\n        ;\n        },\n        forceUpdate: function(aa) {\n            var ba = this._compositeLifeCycleState;\n            l(((this.isMounted() || ((ba === w.MOUNTING)))));\n            l(((((ba !== w.RECEIVING_STATE)) && ((ba !== w.UNMOUNTING)))));\n            this._pendingForceUpdate = true;\n            k.enqueueUpdate(this, aa);\n        },\n        _renderValidatedComponent: function() {\n            var aa;\n            h.current = this;\n            try {\n                aa = this.render();\n            } catch (ba) {\n                throw ba;\n            } finally {\n                h.current = null;\n            };\n        ;\n            l(g.isValidComponent(aa));\n            return aa;\n        },\n        _bindAutoBindMethods: function() {\n            {\n                var fin73keys = ((window.top.JSBNG_Replay.forInKeys)((this.__reactAutoBindMap))), fin73i = (0);\n                var aa;\n                for (; (fin73i < fin73keys.length); (fin73i++)) {\n                    ((aa) = (fin73keys[fin73i]));\n                    {\n                        if (!this.__reactAutoBindMap.hasOwnProperty(aa)) {\n                            continue;\n                        }\n                    ;\n                    ;\n                        var ba = this.__reactAutoBindMap[aa];\n                        this[aa] = this._bindAutoBindMethod(ba);\n                    };\n                };\n            };\n        ;\n        },\n        _bindAutoBindMethod: function(aa) {\n            var ba = this;\n            return function() {\n                return aa.apply(ba, arguments);\n            };\n        }\n    }, y = function() {\n    \n    };\n    o(y, g.Mixin);\n    o(y, i.Mixin);\n    o(y, j.Mixin);\n    o(y, x);\n    var z = {\n        LifeCycle: w,\n        Base: y,\n        createClass: function(aa) {\n            var ba = function() {\n            \n            };\n            ba.prototype = new y();\n            ba.prototype.constructor = ba;\n            u(ba, aa);\n            l(ba.prototype.render);\n            var ca = function(da, ea) {\n                var fa = new ba();\n                fa.construct.apply(fa, arguments);\n                return fa;\n            };\n            ca.componentConstructor = ba;\n            ca.originalSpec = aa;\n            return ca;\n        },\n        autoBind: function(aa) {\n            return aa;\n        }\n    };\n    e.exports = z;\n});\n__d(\"ReactMultiChild\", [\"ReactComponent\",], function(a, b, c, d, e, f) {\n    var g = b(\"ReactComponent\");\n    function h(k, l) {\n        return ((((k && l)) && ((k.constructor === l.constructor))));\n    };\n;\n    var i = {\n        enqueueMarkupAt: function(k, l) {\n            this.domOperations = ((this.domOperations || []));\n            this.domOperations.push({\n                insertMarkup: k,\n                finalIndex: l\n            });\n        },\n        enqueueMove: function(k, l) {\n            this.domOperations = ((this.domOperations || []));\n            this.domOperations.push({\n                moveFrom: k,\n                finalIndex: l\n            });\n        },\n        enqueueUnmountChildByName: function(k, l) {\n            if (g.isValidComponent(l)) {\n                this.domOperations = ((this.domOperations || []));\n                this.domOperations.push({\n                    removeAt: l._domIndex\n                });\n                ((l.unmountComponent && l.unmountComponent()));\n                delete this._renderedChildren[k];\n            }\n        ;\n        ;\n        },\n        processChildDOMOperationsQueue: function() {\n            if (this.domOperations) {\n                g.DOMIDOperations.manageChildrenByParentID(this._rootNodeID, this.domOperations);\n                this.domOperations = null;\n            }\n        ;\n        ;\n        },\n        unmountMultiChild: function() {\n            var k = this._renderedChildren;\n            {\n                var fin74keys = ((window.top.JSBNG_Replay.forInKeys)((k))), fin74i = (0);\n                var l;\n                for (; (fin74i < fin74keys.length); (fin74i++)) {\n                    ((l) = (fin74keys[fin74i]));\n                    {\n                        if (((k.hasOwnProperty(l) && k[l]))) {\n                            var m = k[l];\n                            ((m.unmountComponent && m.unmountComponent()));\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            this._renderedChildren = null;\n        },\n        mountMultiChild: function(k, l) {\n            var m = \"\", n = 0;\n            {\n                var fin75keys = ((window.top.JSBNG_Replay.forInKeys)((k))), fin75i = (0);\n                var o;\n                for (; (fin75i < fin75keys.length); (fin75i++)) {\n                    ((o) = (fin75keys[fin75i]));\n                    {\n                        var p = k[o];\n                        if (((k.hasOwnProperty(o) && p))) {\n                            m += p.mountComponent(((((this._rootNodeID + \".\")) + o)), l);\n                            p._domIndex = n;\n                            n++;\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            this._renderedChildren = k;\n            this.domOperations = null;\n            return m;\n        },\n        updateMultiChild: function(k, l) {\n            if (((!k && !this._renderedChildren))) {\n                return;\n            }\n             else if (((k && !this._renderedChildren))) {\n                this._renderedChildren = {\n                };\n            }\n             else if (((!k && this._renderedChildren))) {\n                k = {\n                };\n            }\n            \n            \n        ;\n        ;\n            var m = ((this._rootNodeID + \".\")), n = null, o = 0, p = 0, q = 0;\n            {\n                var fin76keys = ((window.top.JSBNG_Replay.forInKeys)((k))), fin76i = (0);\n                var r;\n                for (; (fin76i < fin76keys.length); (fin76i++)) {\n                    ((r) = (fin76keys[fin76i]));\n                    {\n                        if (!k.hasOwnProperty(r)) {\n                            continue;\n                        }\n                    ;\n                    ;\n                        var s = this._renderedChildren[r], t = k[r];\n                        if (h(s, t)) {\n                            if (n) {\n                                this.enqueueMarkupAt(n, ((p - o)));\n                                n = null;\n                            }\n                        ;\n                        ;\n                            o = 0;\n                            if (((s._domIndex < q))) {\n                                this.enqueueMove(s._domIndex, p);\n                            }\n                        ;\n                        ;\n                            q = Math.max(s._domIndex, q);\n                            s.receiveProps(t.props, l);\n                            s._domIndex = p;\n                        }\n                         else {\n                            if (s) {\n                                this.enqueueUnmountChildByName(r, s);\n                                q = Math.max(s._domIndex, q);\n                            }\n                        ;\n                        ;\n                            if (t) {\n                                this._renderedChildren[r] = t;\n                                var u = t.mountComponent(((m + r)), l);\n                                n = ((n ? ((n + u)) : u));\n                                o++;\n                                t._domIndex = p;\n                            }\n                        ;\n                        ;\n                        }\n                    ;\n                    ;\n                        p = ((t ? ((p + 1)) : p));\n                    };\n                };\n            };\n        ;\n            if (n) {\n                this.enqueueMarkupAt(n, ((p - o)));\n            }\n        ;\n        ;\n            {\n                var fin77keys = ((window.top.JSBNG_Replay.forInKeys)((this._renderedChildren))), fin77i = (0);\n                var v;\n                for (; (fin77i < fin77keys.length); (fin77i++)) {\n                    ((v) = (fin77keys[fin77i]));\n                    {\n                        if (!this._renderedChildren.hasOwnProperty(v)) {\n                            continue;\n                        }\n                    ;\n                    ;\n                        var w = this._renderedChildren[v];\n                        if (((w && !k[v]))) {\n                            this.enqueueUnmountChildByName(v, w);\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            this.processChildDOMOperationsQueue();\n        }\n    }, j = {\n        Mixin: i\n    };\n    e.exports = j;\n});\n__d(\"ReactTextComponent\", [\"ReactComponent\",\"ReactID\",\"escapeTextForBrowser\",\"mixInto\",], function(a, b, c, d, e, f) {\n    var g = b(\"ReactComponent\"), h = b(\"ReactID\"), i = b(\"escapeTextForBrowser\"), j = b(\"mixInto\"), k = function(l) {\n        this.construct({\n            text: l\n        });\n    };\n    j(k, g.Mixin);\n    j(k, {\n        mountComponent: function(l) {\n            g.Mixin.mountComponent.call(this, l);\n            return ((((((((((((\"\\u003Cspan \" + h.ATTR_NAME)) + \"=\\\"\")) + l)) + \"\\\"\\u003E\")) + i(this.props.text))) + \"\\u003C/span\\u003E\"));\n        },\n        receiveProps: function(l, m) {\n            if (((l.text !== this.props.text))) {\n                this.props.text = l.text;\n                g.DOMIDOperations.updateTextContentByID(this._rootNodeID, l.text);\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = k;\n});\n__d(\"flattenChildren\", [\"ReactComponent\",\"ReactTextComponent\",\"throwIf\",], function(a, b, c, d, e, f) {\n    var g = b(\"ReactComponent\"), h = b(\"ReactTextComponent\"), i = b(\"throwIf\"), j = \"INVALID_CHILD\", k = ((\"You have two children with identical keys. Make sure that you set the \" + \"\\\"key\\\" property to a unique value such as a row ID.\")), l = function(n, o, p) {\n        if (Array.isArray(o)) {\n            for (var q = 0; ((q < o.length)); q++) {\n                var r = o[q];\n                l(n, r, ((((((p + \"[\")) + g.getKey(r, q))) + \"]\")));\n            };\n        ;\n        }\n         else {\n            var s = typeof o, t = ((p === \"\")), u = ((t ? ((((\"[\" + g.getKey(o, 0))) + \"]\")) : p));\n            if (((((((o === null)) || ((o === undefined)))) || ((s === \"boolean\"))))) {\n                n[u] = null;\n            }\n             else if (o.mountComponentIntoNode) {\n                n[u] = o;\n            }\n             else if (((s === \"object\"))) {\n                i(((o && ((o.nodeType === 1)))), j);\n                {\n                    var fin78keys = ((window.top.JSBNG_Replay.forInKeys)((o))), fin78i = (0);\n                    var v;\n                    for (; (fin78i < fin78keys.length); (fin78i++)) {\n                        ((v) = (fin78keys[fin78i]));\n                        {\n                            if (o.hasOwnProperty(v)) {\n                                l(n, o[v], ((((((p + \"{\")) + v)) + \"}\")));\n                            }\n                        ;\n                        ;\n                        };\n                    };\n                };\n            ;\n            }\n             else if (((s === \"string\"))) {\n                n[u] = new h(o);\n            }\n             else if (((s === \"number\"))) {\n                n[u] = new h(((\"\" + o)));\n            }\n            \n            \n            \n            \n        ;\n        ;\n        }\n    ;\n    ;\n    };\n    function m(n) {\n        if (((((n === null)) || ((n === undefined))))) {\n            return n;\n        }\n    ;\n    ;\n        var o = {\n        };\n        l(o, n, \"\");\n        return o;\n    };\n;\n    e.exports = m;\n});\n__d(\"ReactNativeComponent\", [\"CSSPropertyOperations\",\"DOMPropertyOperations\",\"ReactComponent\",\"ReactEventEmitter\",\"ReactMultiChild\",\"ReactID\",\"escapeTextForBrowser\",\"flattenChildren\",\"invariant\",\"keyOf\",\"merge\",\"mixInto\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSSPropertyOperations\"), h = b(\"DOMPropertyOperations\"), i = b(\"ReactComponent\"), j = b(\"ReactEventEmitter\"), k = b(\"ReactMultiChild\"), l = b(\"ReactID\"), m = b(\"escapeTextForBrowser\"), n = b(\"flattenChildren\"), o = b(\"invariant\"), p = b(\"keyOf\"), q = b(\"merge\"), r = b(\"mixInto\"), s = j.putListener, t = j.deleteListener, u = j.registrationNames, v = {\n        string: true,\n        number: true\n    }, w = p({\n        dangerouslySetInnerHTML: null\n    }), x = p({\n        style: null\n    });\n    function y(aa) {\n        if (!aa) {\n            return;\n        }\n    ;\n    ;\n        o(((((aa.children == null)) || ((aa.dangerouslySetInnerHTML == null)))));\n        o(((((aa.style == null)) || ((typeof aa.style === \"object\")))));\n    };\n;\n    function z(aa, ba) {\n        this._tagOpen = ((((\"\\u003C\" + aa)) + \" \"));\n        this._tagClose = ((ba ? \"\" : ((((\"\\u003C/\" + aa)) + \"\\u003E\"))));\n        this.tagName = aa.toUpperCase();\n    };\n;\n    z.Mixin = {\n        mountComponent: function(aa, ba) {\n            i.Mixin.mountComponent.call(this, aa, ba);\n            y(this.props);\n            return ((((this._createOpenTagMarkup() + this._createContentMarkup(ba))) + this._tagClose));\n        },\n        _createOpenTagMarkup: function() {\n            var aa = this.props, ba = this._tagOpen;\n            {\n                var fin79keys = ((window.top.JSBNG_Replay.forInKeys)((aa))), fin79i = (0);\n                var ca;\n                for (; (fin79i < fin79keys.length); (fin79i++)) {\n                    ((ca) = (fin79keys[fin79i]));\n                    {\n                        if (!aa.hasOwnProperty(ca)) {\n                            continue;\n                        }\n                    ;\n                    ;\n                        var da = aa[ca];\n                        if (((da == null))) {\n                            continue;\n                        }\n                    ;\n                    ;\n                        if (u[ca]) {\n                            s(this._rootNodeID, ca, da);\n                        }\n                         else {\n                            if (((ca === x))) {\n                                if (da) {\n                                    da = aa.style = q(aa.style);\n                                }\n                            ;\n                            ;\n                                da = g.createMarkupForStyles(da);\n                            }\n                        ;\n                        ;\n                            var ea = h.createMarkupForProperty(ca, da);\n                            if (ea) {\n                                ba += ((\" \" + ea));\n                            }\n                        ;\n                        ;\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            var fa = m(this._rootNodeID);\n            return ((((((((((ba + \" \")) + l.ATTR_NAME)) + \"=\\\"\")) + fa)) + \"\\\"\\u003E\"));\n        },\n        _createContentMarkup: function(aa) {\n            var ba = this.props.dangerouslySetInnerHTML;\n            if (((ba != null))) {\n                if (((ba.__html != null))) {\n                    return ba.__html;\n                }\n            ;\n            ;\n            }\n             else {\n                var ca = ((v[typeof this.props.children] ? this.props.children : null)), da = ((((ca != null)) ? null : this.props.children));\n                if (((ca != null))) {\n                    return m(ca);\n                }\n                 else if (((da != null))) {\n                    return this.mountMultiChild(n(da), aa);\n                }\n                \n            ;\n            ;\n            }\n        ;\n        ;\n            return \"\";\n        },\n        receiveProps: function(aa, ba) {\n            y(aa);\n            i.Mixin.receiveProps.call(this, aa, ba);\n        },\n        updateComponent: function(aa, ba) {\n            i.Mixin.updateComponent.call(this, aa, ba);\n            this._updateDOMProperties(ba);\n            this._updateDOMChildren(ba, aa);\n        },\n        _updateDOMProperties: function(aa) {\n            var ba = this.props, ca, da, ea;\n            {\n                var fin80keys = ((window.top.JSBNG_Replay.forInKeys)((aa))), fin80i = (0);\n                (0);\n                for (; (fin80i < fin80keys.length); (fin80i++)) {\n                    ((ca) = (fin80keys[fin80i]));\n                    {\n                        if (((ba.hasOwnProperty(ca) || !aa.hasOwnProperty(ca)))) {\n                            continue;\n                        }\n                    ;\n                    ;\n                        if (((ca === x))) {\n                            var fa = aa[ca];\n                            {\n                                var fin81keys = ((window.top.JSBNG_Replay.forInKeys)((fa))), fin81i = (0);\n                                (0);\n                                for (; (fin81i < fin81keys.length); (fin81i++)) {\n                                    ((da) = (fin81keys[fin81i]));\n                                    {\n                                        if (fa.hasOwnProperty(da)) {\n                                            ea = ((ea || {\n                                            }));\n                                            ea[da] = \"\";\n                                        }\n                                    ;\n                                    ;\n                                    };\n                                };\n                            };\n                        ;\n                        }\n                         else if (((ca === w))) {\n                            i.DOMIDOperations.updateTextContentByID(this._rootNodeID, \"\");\n                        }\n                         else if (u[ca]) {\n                            t(this._rootNodeID, ca);\n                        }\n                         else i.DOMIDOperations.deletePropertyByID(this._rootNodeID, ca);\n                        \n                        \n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            {\n                var fin82keys = ((window.top.JSBNG_Replay.forInKeys)((ba))), fin82i = (0);\n                (0);\n                for (; (fin82i < fin82keys.length); (fin82i++)) {\n                    ((ca) = (fin82keys[fin82i]));\n                    {\n                        var ga = ba[ca], ha = aa[ca];\n                        if (((!ba.hasOwnProperty(ca) || ((ga === ha))))) {\n                            continue;\n                        }\n                    ;\n                    ;\n                        if (((ca === x))) {\n                            if (ga) {\n                                ga = ba.style = q(ga);\n                            }\n                        ;\n                        ;\n                            if (ha) {\n                                {\n                                    var fin83keys = ((window.top.JSBNG_Replay.forInKeys)((ha))), fin83i = (0);\n                                    (0);\n                                    for (; (fin83i < fin83keys.length); (fin83i++)) {\n                                        ((da) = (fin83keys[fin83i]));\n                                        {\n                                            if (((ha.hasOwnProperty(da) && !ga.hasOwnProperty(da)))) {\n                                                ea = ((ea || {\n                                                }));\n                                                ea[da] = \"\";\n                                            }\n                                        ;\n                                        ;\n                                        };\n                                    };\n                                };\n                            ;\n                                {\n                                    var fin84keys = ((window.top.JSBNG_Replay.forInKeys)((ga))), fin84i = (0);\n                                    (0);\n                                    for (; (fin84i < fin84keys.length); (fin84i++)) {\n                                        ((da) = (fin84keys[fin84i]));\n                                        {\n                                            if (((ga.hasOwnProperty(da) && ((ha[da] !== ga[da]))))) {\n                                                ea = ((ea || {\n                                                }));\n                                                ea[da] = ga[da];\n                                            }\n                                        ;\n                                        ;\n                                        };\n                                    };\n                                };\n                            ;\n                            }\n                             else ea = ga;\n                        ;\n                        ;\n                        }\n                         else if (((ca === w))) {\n                            var ia = ((ha && ha.__html)), ja = ((ga && ga.__html));\n                            if (((ia !== ja))) {\n                                i.DOMIDOperations.updateInnerHTMLByID(this._rootNodeID, ga);\n                            }\n                        ;\n                        ;\n                        }\n                         else if (u[ca]) {\n                            s(this._rootNodeID, ca, ga);\n                        }\n                         else i.DOMIDOperations.updatePropertyByID(this._rootNodeID, ca, ga);\n                        \n                        \n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            if (ea) {\n                i.DOMIDOperations.updateStylesByID(this._rootNodeID, ea);\n            }\n        ;\n        ;\n        },\n        _updateDOMChildren: function(aa, ba) {\n            var ca = this.props, da = ((v[typeof aa.children] ? aa.children : null)), ea = ((v[typeof ca.children] ? ca.children : null)), fa = ((((da != null)) ? null : aa.children)), ga = ((((ea != null)) ? null : ca.children));\n            if (((ea != null))) {\n                var ha = ((((fa != null)) && ((ga == null))));\n                if (ha) {\n                    this.updateMultiChild(null, ba);\n                }\n            ;\n            ;\n                if (((da !== ea))) {\n                    i.DOMIDOperations.updateTextContentByID(this._rootNodeID, ((\"\" + ea)));\n                }\n            ;\n            ;\n            }\n             else {\n                var ia = ((((da != null)) && ((ea == null))));\n                if (ia) {\n                    i.DOMIDOperations.updateTextContentByID(this._rootNodeID, \"\");\n                }\n            ;\n            ;\n                this.updateMultiChild(n(ca.children), ba);\n            }\n        ;\n        ;\n        },\n        unmountComponent: function() {\n            j.deleteAllListeners(this._rootNodeID);\n            i.Mixin.unmountComponent.call(this);\n            this.unmountMultiChild();\n        }\n    };\n    r(z, i.Mixin);\n    r(z, z.Mixin);\n    r(z, k.Mixin);\n    e.exports = z;\n});\n__d(\"objMapKeyVal\", [], function(a, b, c, d, e, f) {\n    function g(h, i, j) {\n        if (!h) {\n            return null;\n        }\n    ;\n    ;\n        var k = 0, l = {\n        };\n        {\n            var fin85keys = ((window.top.JSBNG_Replay.forInKeys)((h))), fin85i = (0);\n            var m;\n            for (; (fin85i < fin85keys.length); (fin85i++)) {\n                ((m) = (fin85keys[fin85i]));\n                {\n                    if (h.hasOwnProperty(m)) {\n                        l[m] = i.call(j, m, h[m], k++);\n                    }\n                ;\n                ;\n                };\n            };\n        };\n    ;\n        return l;\n    };\n;\n    e.exports = g;\n});\n__d(\"ReactDOM\", [\"ReactNativeComponent\",\"mergeInto\",\"objMapKeyVal\",], function(a, b, c, d, e, f) {\n    var g = b(\"ReactNativeComponent\"), h = b(\"mergeInto\"), i = b(\"objMapKeyVal\");\n    function j(m, n) {\n        var o = function() {\n        \n        };\n        o.prototype = new g(m, n);\n        o.prototype.constructor = o;\n        var p = function(q, r) {\n            var s = new o();\n            s.construct.apply(s, arguments);\n            return s;\n        };\n        p.componentConstructor = o;\n        return p;\n    };\n;\n    var k = i({\n        a: false,\n        abbr: false,\n        address: false,\n        audio: false,\n        b: false,\n        blockquote: false,\n        body: false,\n        br: true,\n        button: false,\n        code: false,\n        col: true,\n        colgroup: false,\n        dd: false,\n        div: false,\n        section: false,\n        dl: false,\n        dt: false,\n        em: false,\n        embed: true,\n        fieldset: false,\n        figcaption: false,\n        figure: false,\n        footer: false,\n        form: false,\n        h1: false,\n        h2: false,\n        h3: false,\n        h4: false,\n        h5: false,\n        h6: false,\n        header: false,\n        hr: true,\n        i: false,\n        iframe: false,\n        img: true,\n        input: true,\n        label: false,\n        legend: false,\n        li: false,\n        line: false,\n        nav: false,\n        object: false,\n        ol: false,\n        optgroup: false,\n        option: false,\n        p: false,\n        param: true,\n        pre: false,\n        select: false,\n        small: false,\n        source: false,\n        span: false,\n        sub: false,\n        sup: false,\n        strong: false,\n        table: false,\n        tbody: false,\n        td: false,\n        textarea: false,\n        tfoot: false,\n        th: false,\n        thead: false,\n        time: false,\n        title: false,\n        tr: false,\n        u: false,\n        ul: false,\n        video: false,\n        wbr: false,\n        circle: false,\n        g: false,\n        path: false,\n        polyline: false,\n        rect: false,\n        svg: false,\n        text: false\n    }, j), l = {\n        injectComponentClasses: function(m) {\n            h(k, m);\n        }\n    };\n    k.injection = l;\n    e.exports = k;\n});\n__d(\"ReactProps\", [\"createObjectFrom\",\"invariant\",], function(a, b, c, d, e, f) {\n    var g = b(\"createObjectFrom\"), h = b(\"invariant\"), i = {\n        array: k(\"array\"),\n        bool: k(\"boolean\"),\n        func: k(\"function\"),\n        number: k(\"number\"),\n        object: k(\"object\"),\n        string: k(\"string\"),\n        oneOf: l,\n        instanceOf: m\n    }, j = \"\\u003C\\u003Canonymous\\u003E\\u003E\";\n    function k(o) {\n        function p(q, r, s) {\n            var t = typeof q;\n            if (((((t === \"object\")) && Array.isArray(q)))) {\n                t = \"array\";\n            }\n        ;\n        ;\n            h(((t === o)));\n        };\n    ;\n        return n(p);\n    };\n;\n    function l(o) {\n        var p = g(o);\n        function q(r, s, t) {\n            h(p[r]);\n        };\n    ;\n        return n(q);\n    };\n;\n    function m(o) {\n        function p(q, r, s) {\n            h(((q instanceof o)));\n        };\n    ;\n        return n(p);\n    };\n;\n    function n(o) {\n        function p(q) {\n            function r(s, t, u) {\n                var v = s[t];\n                if (((v != null))) {\n                    o(v, t, ((u || j)));\n                }\n                 else h(!q);\n            ;\n            ;\n            };\n        ;\n            if (!q) {\n                r.isRequired = p(true);\n            }\n        ;\n        ;\n            return r;\n        };\n    ;\n        return p(false);\n    };\n;\n    e.exports = i;\n});\n__d(\"ReactServerRendering\", [\"ReactReconcileTransaction\",\"ReactInstanceHandles\",], function(a, b, c, d, e, f) {\n    var g = b(\"ReactReconcileTransaction\"), h = b(\"ReactInstanceHandles\");\n    function i(j, k) {\n        var l = h.createReactRootID(), m = g.getPooled();\n        m.reinitializeTransaction();\n        try {\n            m.perform(function() {\n                k(j.mountComponent(l, m));\n            }, null);\n        } finally {\n            g.release(m);\n        };\n    ;\n    };\n;\n    e.exports = {\n        renderComponentToString: i\n    };\n});\n__d(\"ReactDOMForm\", [\"ReactCompositeComponent\",\"ReactDOM\",\"ReactEventEmitter\",\"EventConstants\",], function(a, b, c, d, e, f) {\n    var g = b(\"ReactCompositeComponent\"), h = b(\"ReactDOM\"), i = b(\"ReactEventEmitter\"), j = b(\"EventConstants\"), k = h.form, l = g.createClass({\n        render: function() {\n            return this.transferPropsTo(k(null, this.props.children));\n        },\n        componentDidMount: function(m) {\n            i.trapBubbledEvent(j.topLevelTypes.topSubmit, \"submit\", m);\n        }\n    });\n    e.exports = l;\n});\n__d(\"ReactDOMInput\", [\"DOMPropertyOperations\",\"ReactCompositeComponent\",\"ReactDOM\",\"merge\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOMPropertyOperations\"), h = b(\"ReactCompositeComponent\"), i = b(\"ReactDOM\"), j = b(\"merge\"), k = i.input, l = h.createClass({\n        getInitialState: function() {\n            return {\n                checked: ((this.props.defaultChecked || false)),\n                value: ((this.props.defaultValue || \"\"))\n            };\n        },\n        shouldComponentUpdate: function() {\n            return !this._isChanging;\n        },\n        getChecked: function() {\n            return ((((this.props.checked != null)) ? this.props.checked : this.state.checked));\n        },\n        getValue: function() {\n            return ((((this.props.value != null)) ? this.props.value : this.state.value));\n        },\n        render: function() {\n            var m = j(this.props);\n            m.checked = this.getChecked();\n            m.value = this.getValue();\n            m.onChange = this.handleChange;\n            return k(m, this.props.children);\n        },\n        componentDidUpdate: function(m, n, o) {\n            if (((this.props.checked != null))) {\n                g.setValueForProperty(o, \"checked\", ((this.props.checked || false)));\n            }\n        ;\n        ;\n            if (((this.props.value != null))) {\n                g.setValueForProperty(o, \"value\", ((this.props.value || \"\")));\n            }\n        ;\n        ;\n        },\n        handleChange: h.autoBind(function(JSBNG__event) {\n            var m;\n            if (this.props.onChange) {\n                this._isChanging = true;\n                m = this.props.onChange(JSBNG__event);\n                this._isChanging = false;\n            }\n        ;\n        ;\n            this.setState({\n                checked: JSBNG__event.target.checked,\n                value: JSBNG__event.target.value\n            });\n            return m;\n        })\n    });\n    e.exports = l;\n});\n__d(\"ReactDOMTextarea\", [\"DOMPropertyOperations\",\"ReactCompositeComponent\",\"ReactDOM\",\"invariant\",\"merge\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOMPropertyOperations\"), h = b(\"ReactCompositeComponent\"), i = b(\"ReactDOM\"), j = b(\"invariant\"), k = b(\"merge\"), l = i.textarea, m = {\n        string: true,\n        number: true\n    }, n = h.createClass({\n        getInitialState: function() {\n            var o = this.props.defaultValue, p = this.props.children;\n            if (((p != null))) {\n                j(((o == null)));\n                if (Array.isArray(p)) {\n                    j(((p.length <= 1)));\n                    p = p[0];\n                }\n            ;\n            ;\n                j(m[typeof p]);\n                o = ((\"\" + p));\n            }\n        ;\n        ;\n            o = ((o || \"\"));\n            return {\n                initialValue: ((((this.props.value != null)) ? this.props.value : o)),\n                value: o\n            };\n        },\n        shouldComponentUpdate: function() {\n            return !this._isChanging;\n        },\n        getValue: function() {\n            return ((((this.props.value != null)) ? this.props.value : this.state.value));\n        },\n        render: function() {\n            var o = k(this.props);\n            j(((o.dangerouslySetInnerHTML == null)));\n            o.value = this.getValue();\n            o.onChange = this.handleChange;\n            return l(o, this.state.initialValue);\n        },\n        componentDidUpdate: function(o, p, q) {\n            if (((this.props.value != null))) {\n                g.setValueForProperty(q, \"value\", ((this.props.value || \"\")));\n            }\n        ;\n        ;\n        },\n        handleChange: h.autoBind(function(JSBNG__event) {\n            var o;\n            if (this.props.onChange) {\n                this._isChanging = true;\n                o = this.props.onChange(JSBNG__event);\n                this._isChanging = false;\n            }\n        ;\n        ;\n            this.setState({\n                value: JSBNG__event.target.value\n            });\n            return o;\n        })\n    });\n    e.exports = n;\n});\n__d(\"DefaultDOMPropertyConfig\", [\"DOMProperty\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOMProperty\"), h = g.injection.MUST_USE_ATTRIBUTE, i = g.injection.MUST_USE_PROPERTY, j = g.injection.HAS_BOOLEAN_VALUE, k = g.injection.HAS_SIDE_EFFECTS, l = {\n        isCustomAttribute: RegExp.prototype.test.bind(/^(data|aria)-[a-z_][a-z\\d_.\\-]*$/),\n        Properties: {\n            accept: null,\n            action: null,\n            ajaxify: h,\n            allowFullScreen: ((h | j)),\n            alt: null,\n            autoComplete: null,\n            autoplay: j,\n            cellPadding: null,\n            cellSpacing: null,\n            checked: ((i | j)),\n            className: i,\n            colSpan: null,\n            contentEditable: null,\n            controls: ((i | j)),\n            data: null,\n            dir: null,\n            disabled: ((i | j)),\n            draggable: null,\n            enctype: null,\n            height: h,\n            hidden: ((h | j)),\n            href: null,\n            htmlFor: null,\n            id: i,\n            max: null,\n            method: null,\n            min: null,\n            multiple: ((i | j)),\n            JSBNG__name: null,\n            poster: null,\n            preload: null,\n            placeholder: null,\n            rel: null,\n            required: j,\n            role: h,\n            scrollLeft: i,\n            scrollTop: i,\n            selected: ((i | j)),\n            spellCheck: null,\n            src: null,\n            step: null,\n            style: null,\n            tabIndex: null,\n            target: null,\n            title: null,\n            type: null,\n            value: ((i | k)),\n            width: h,\n            wmode: h,\n            cx: i,\n            cy: i,\n            d: i,\n            fill: i,\n            fx: i,\n            fy: i,\n            points: i,\n            r: i,\n            stroke: i,\n            strokeLinecap: i,\n            strokeWidth: i,\n            transform: i,\n            x: i,\n            x1: i,\n            x2: i,\n            version: i,\n            viewBox: i,\n            y: i,\n            y1: i,\n            y2: i,\n            spreadMethod: i,\n            offset: i,\n            stopColor: i,\n            stopOpacity: i,\n            gradientUnits: i,\n            gradientTransform: i\n        },\n        DOMAttributeNames: {\n            className: \"class\",\n            htmlFor: \"for\",\n            strokeLinecap: \"stroke-linecap\",\n            strokeWidth: \"stroke-width\",\n            stopColor: \"stop-color\",\n            stopOpacity: \"stop-opacity\"\n        },\n        DOMPropertyNames: {\n            autoComplete: \"autocomplete\",\n            spellCheck: \"spellcheck\"\n        },\n        DOMMutationMethods: {\n            className: function(m, n) {\n                m.className = ((n || \"\"));\n            }\n        }\n    };\n    e.exports = l;\n});\n__d(\"DefaultEventPluginOrder\", [\"keyOf\",], function(a, b, c, d, e, f) {\n    var g = b(\"keyOf\"), h = [g({\n        ResponderEventPlugin: null\n    }),g({\n        SimpleEventPlugin: null\n    }),g({\n        TapEventPlugin: null\n    }),g({\n        EnterLeaveEventPlugin: null\n    }),g({\n        ChangeEventPlugin: null\n    }),g({\n        AnalyticsEventPlugin: null\n    }),];\n    e.exports = h;\n});\n__d(\"SyntheticEvent\", [\"PooledClass\",\"emptyFunction\",\"getEventTarget\",\"merge\",\"mergeInto\",], function(a, b, c, d, e, f) {\n    var g = b(\"PooledClass\"), h = b(\"emptyFunction\"), i = b(\"getEventTarget\"), j = b(\"merge\"), k = b(\"mergeInto\"), l = {\n        type: null,\n        target: i,\n        currentTarget: null,\n        eventPhase: null,\n        bubbles: null,\n        cancelable: null,\n        timeStamp: function(JSBNG__event) {\n            return ((JSBNG__event.timeStamp || JSBNG__Date.now()));\n        },\n        defaultPrevented: null,\n        isTrusted: null\n    };\n    function m(n, o, p) {\n        this.dispatchConfig = n;\n        this.dispatchMarker = o;\n        this.nativeEvent = p;\n        var q = this.constructor.Interface;\n        {\n            var fin86keys = ((window.top.JSBNG_Replay.forInKeys)((q))), fin86i = (0);\n            var r;\n            for (; (fin86i < fin86keys.length); (fin86i++)) {\n                ((r) = (fin86keys[fin86i]));\n                {\n                    var s = q[r];\n                    if (s) {\n                        this[r] = s(p);\n                    }\n                     else this[r] = p[r];\n                ;\n                ;\n                };\n            };\n        };\n    ;\n        if (((p.defaultPrevented || ((p.returnValue === false))))) {\n            this.isDefaultPrevented = h.thatReturnsTrue;\n        }\n         else this.isDefaultPrevented = h.thatReturnsFalse;\n    ;\n    ;\n        this.isPropagationStopped = h.thatReturnsFalse;\n    };\n;\n    k(m.prototype, {\n        preventDefault: function() {\n            this.defaultPrevented = true;\n            var JSBNG__event = this.nativeEvent;\n            ((JSBNG__event.preventDefault ? JSBNG__event.preventDefault() : JSBNG__event.returnValue = false));\n            this.isDefaultPrevented = h.thatReturnsTrue;\n        },\n        stopPropagation: function() {\n            var JSBNG__event = this.nativeEvent;\n            ((JSBNG__event.stopPropagation ? JSBNG__event.stopPropagation() : JSBNG__event.cancelBubble = true));\n            this.isPropagationStopped = h.thatReturnsTrue;\n        },\n        persist: function() {\n            this.isPersistent = h.thatReturnsTrue;\n        },\n        isPersistent: h.thatReturnsFalse,\n        destructor: function() {\n            var n = this.constructor.Interface;\n            {\n                var fin87keys = ((window.top.JSBNG_Replay.forInKeys)((n))), fin87i = (0);\n                var o;\n                for (; (fin87i < fin87keys.length); (fin87i++)) {\n                    ((o) = (fin87keys[fin87i]));\n                    {\n                        this[o] = null;\n                    ;\n                    };\n                };\n            };\n        ;\n            this.dispatchConfig = null;\n            this.dispatchMarker = null;\n            this.nativeEvent = null;\n        }\n    });\n    m.Interface = l;\n    m.augmentClass = function(n, o) {\n        var p = this, q = Object.create(p.prototype);\n        k(q, n.prototype);\n        n.prototype = q;\n        n.prototype.constructor = n;\n        n.Interface = j(p.Interface, o);\n        n.augmentClass = p.augmentClass;\n        g.addPoolingTo(n, g.threeArgumentPooler);\n    };\n    g.addPoolingTo(m, g.threeArgumentPooler);\n    e.exports = m;\n});\n__d(\"SyntheticUIEvent\", [\"SyntheticEvent\",], function(a, b, c, d, e, f) {\n    var g = b(\"SyntheticEvent\"), h = {\n        view: null,\n        detail: null\n    };\n    function i(j, k, l) {\n        g.call(this, j, k, l);\n    };\n;\n    g.augmentClass(i, h);\n    e.exports = i;\n});\n__d(\"SyntheticMouseEvent\", [\"SyntheticUIEvent\",\"ViewportMetrics\",], function(a, b, c, d, e, f) {\n    var g = b(\"SyntheticUIEvent\"), h = b(\"ViewportMetrics\"), i = {\n        JSBNG__screenX: null,\n        JSBNG__screenY: null,\n        clientX: null,\n        clientY: null,\n        ctrlKey: null,\n        shiftKey: null,\n        altKey: null,\n        metaKey: null,\n        button: function(JSBNG__event) {\n            var k = JSBNG__event.button;\n            if (((\"which\" in JSBNG__event))) {\n                return k;\n            }\n        ;\n        ;\n            return ((((k === 2)) ? 2 : ((((k === 4)) ? 1 : 0))));\n        },\n        buttons: null,\n        relatedTarget: function(JSBNG__event) {\n            return ((JSBNG__event.relatedTarget || ((((JSBNG__event.fromElement === JSBNG__event.srcElement)) ? JSBNG__event.toElement : JSBNG__event.fromElement))));\n        },\n        pageX: function(JSBNG__event) {\n            return ((((\"pageX\" in JSBNG__event)) ? JSBNG__event.pageX : ((JSBNG__event.clientX + h.currentScrollLeft))));\n        },\n        pageY: function(JSBNG__event) {\n            return ((((\"pageY\" in JSBNG__event)) ? JSBNG__event.pageY : ((JSBNG__event.clientY + h.currentScrollTop))));\n        }\n    };\n    function j(k, l, m) {\n        g.call(this, k, l, m);\n    };\n;\n    g.augmentClass(j, i);\n    e.exports = j;\n});\n__d(\"EnterLeaveEventPlugin\", [\"EventConstants\",\"EventPropagators\",\"ExecutionEnvironment\",\"ReactInstanceHandles\",\"SyntheticMouseEvent\",\"ReactID\",\"keyOf\",], function(a, b, c, d, e, f) {\n    var g = b(\"EventConstants\"), h = b(\"EventPropagators\"), i = b(\"ExecutionEnvironment\"), j = b(\"ReactInstanceHandles\"), k = b(\"SyntheticMouseEvent\"), l = b(\"ReactID\"), m = b(\"keyOf\"), n = g.topLevelTypes, o = j.getFirstReactDOM, p = {\n        mouseEnter: {\n            registrationName: m({\n                onMouseEnter: null\n            })\n        },\n        mouseLeave: {\n            registrationName: m({\n                onMouseLeave: null\n            })\n        }\n    }, q = {\n        eventTypes: p,\n        extractEvents: function(r, s, t, u) {\n            if (((((r === n.topMouseOver)) && ((u.relatedTarget || u.fromElement))))) {\n                return null;\n            }\n        ;\n        ;\n            if (((((r !== n.topMouseOut)) && ((r !== n.topMouseOver))))) {\n                return null;\n            }\n        ;\n        ;\n            var v, w;\n            if (((r === n.topMouseOut))) {\n                v = s;\n                w = ((o(((u.relatedTarget || u.toElement))) || i.global));\n            }\n             else {\n                v = i.global;\n                w = s;\n            }\n        ;\n        ;\n            if (((v === w))) {\n                return null;\n            }\n        ;\n        ;\n            var x = ((v ? l.getID(v) : \"\")), y = ((w ? l.getID(w) : \"\")), z = k.getPooled(p.mouseLeave, x, u), aa = k.getPooled(p.mouseEnter, y, u);\n            h.accumulateEnterLeaveDispatches(z, aa, x, y);\n            return [z,aa,];\n        }\n    };\n    e.exports = q;\n});\n__d(\"ChangeEventPlugin\", [\"EventConstants\",\"EventPluginHub\",\"EventPropagators\",\"ExecutionEnvironment\",\"SyntheticEvent\",\"isEventSupported\",\"keyOf\",], function(a, b, c, d, e, f) {\n    var g = b(\"EventConstants\"), h = b(\"EventPluginHub\"), i = b(\"EventPropagators\"), j = b(\"ExecutionEnvironment\"), k = b(\"SyntheticEvent\"), l = b(\"isEventSupported\"), m = b(\"keyOf\"), n = g.topLevelTypes, o = {\n        change: {\n            phasedRegistrationNames: {\n                bubbled: m({\n                    onChange: null\n                }),\n                captured: m({\n                    onChangeCapture: null\n                })\n            }\n        }\n    }, p = null, q = null, r = null, s = null;\n    function t(na) {\n        return ((((na.nodeName === \"SELECT\")) || ((((na.nodeName === \"INPUT\")) && ((na.type === \"file\"))))));\n    };\n;\n    var u = false;\n    if (j.canUseDOM) {\n        u = ((l(\"change\") && ((!((\"documentMode\" in JSBNG__document)) || ((JSBNG__document.documentMode > 8))))));\n    }\n;\n;\n    function v(na) {\n        var JSBNG__event = k.getPooled(o.change, q, na);\n        i.accumulateTwoPhaseDispatches(JSBNG__event);\n        h.enqueueEvents(JSBNG__event);\n        h.processEventQueue();\n    };\n;\n    function w(na, oa) {\n        p = na;\n        q = oa;\n        p.JSBNG__attachEvent(\"JSBNG__onchange\", v);\n    };\n;\n    function x() {\n        if (!p) {\n            return;\n        }\n    ;\n    ;\n        p.JSBNG__detachEvent(\"JSBNG__onchange\", v);\n        p = null;\n        q = null;\n    };\n;\n    function y(na, oa, pa) {\n        if (((na === n.topChange))) {\n            return pa;\n        }\n    ;\n    ;\n    };\n;\n    function z(na, oa, pa) {\n        if (((na === n.topFocus))) {\n            x();\n            w(oa, pa);\n        }\n         else if (((na === n.topBlur))) {\n            x();\n        }\n        \n    ;\n    ;\n    };\n;\n    var aa = false;\n    if (j.canUseDOM) {\n        aa = ((l(\"input\") && ((!((\"documentMode\" in JSBNG__document)) || ((JSBNG__document.documentMode > 9))))));\n    }\n;\n;\n    var ba = {\n        color: true,\n        date: true,\n        datetime: true,\n        \"datetime-local\": true,\n        email: true,\n        month: true,\n        number: true,\n        password: true,\n        range: true,\n        search: true,\n        tel: true,\n        text: true,\n        time: true,\n        url: true,\n        week: true\n    };\n    function ca(na) {\n        return ((((((na.nodeName === \"INPUT\")) && ba[na.type])) || ((na.nodeName === \"TEXTAREA\"))));\n    };\n;\n    var da = {\n        get: function() {\n            return s.get.call(this);\n        },\n        set: function(na) {\n            r = na;\n            s.set.call(this, na);\n        }\n    };\n    function ea(na, oa) {\n        p = na;\n        q = oa;\n        r = na.value;\n        s = Object.getOwnPropertyDescriptor(na.constructor.prototype, \"value\");\n        Object.defineProperty(p, \"value\", da);\n        p.JSBNG__attachEvent(\"onpropertychange\", ga);\n    };\n;\n    function fa() {\n        if (!p) {\n            return;\n        }\n    ;\n    ;\n        delete p.value;\n        p.JSBNG__detachEvent(\"onpropertychange\", ga);\n        p = null;\n        q = null;\n        r = null;\n        s = null;\n    };\n;\n    function ga(na) {\n        if (((na.propertyName !== \"value\"))) {\n            return;\n        }\n    ;\n    ;\n        var oa = na.srcElement.value;\n        if (((oa === r))) {\n            return;\n        }\n    ;\n    ;\n        r = oa;\n        v(na);\n    };\n;\n    function ha(na, oa, pa) {\n        if (((na === n.topInput))) {\n            return pa;\n        }\n    ;\n    ;\n    };\n;\n    function ia(na, oa, pa) {\n        if (((na === n.topFocus))) {\n            fa();\n            ea(oa, pa);\n        }\n         else if (((na === n.topBlur))) {\n            fa();\n        }\n        \n    ;\n    ;\n    };\n;\n    function ja(na, oa, pa) {\n        if (((((((na === n.topSelectionChange)) || ((na === n.topKeyUp)))) || ((na === n.topKeyDown))))) {\n            if (((p && ((p.value !== r))))) {\n                r = p.value;\n                return q;\n            }\n        ;\n        }\n    ;\n    ;\n    };\n;\n    function ka(na) {\n        return ((((na.nodeName === \"INPUT\")) && ((((na.type === \"checkbox\")) || ((na.type === \"radio\"))))));\n    };\n;\n    function la(na, oa, pa) {\n        if (((na === n.topClick))) {\n            return pa;\n        }\n    ;\n    ;\n    };\n;\n    var ma = {\n        eventTypes: o,\n        extractEvents: function(na, oa, pa, qa) {\n            var ra, sa;\n            if (t(oa)) {\n                if (u) {\n                    ra = y;\n                }\n                 else sa = z;\n            ;\n            ;\n            }\n             else if (ca(oa)) {\n                if (aa) {\n                    ra = ha;\n                }\n                 else {\n                    ra = ja;\n                    sa = ia;\n                }\n            ;\n            ;\n            }\n             else if (ka(oa)) {\n                ra = la;\n            }\n            \n            \n        ;\n        ;\n            if (ra) {\n                var ta = ra(na, oa, pa);\n                if (ta) {\n                    var JSBNG__event = k.getPooled(o.change, ta, qa);\n                    i.accumulateTwoPhaseDispatches(JSBNG__event);\n                    return JSBNG__event;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            if (sa) {\n                sa(na, oa, pa);\n            }\n        ;\n        ;\n        }\n    };\n    e.exports = ma;\n});\n__d(\"SyntheticFocusEvent\", [\"SyntheticUIEvent\",], function(a, b, c, d, e, f) {\n    var g = b(\"SyntheticUIEvent\"), h = {\n        relatedTarget: null\n    };\n    function i(j, k, l) {\n        g.call(this, j, k, l);\n    };\n;\n    g.augmentClass(i, h);\n    e.exports = i;\n});\n__d(\"SyntheticKeyboardEvent\", [\"SyntheticUIEvent\",], function(a, b, c, d, e, f) {\n    var g = b(\"SyntheticUIEvent\"), h = {\n        char: null,\n        key: null,\n        JSBNG__location: null,\n        ctrlKey: null,\n        shiftKey: null,\n        altKey: null,\n        metaKey: null,\n        repeat: null,\n        locale: null,\n        charCode: null,\n        keyCode: null,\n        which: null\n    };\n    function i(j, k, l) {\n        g.call(this, j, k, l);\n    };\n;\n    g.augmentClass(i, h);\n    e.exports = i;\n});\n__d(\"SyntheticMutationEvent\", [\"SyntheticEvent\",], function(a, b, c, d, e, f) {\n    var g = b(\"SyntheticEvent\"), h = {\n        relatedNode: null,\n        prevValue: null,\n        newValue: null,\n        attrName: null,\n        attrChange: null\n    };\n    function i(j, k, l) {\n        g.call(this, j, k, l);\n    };\n;\n    g.augmentClass(i, h);\n    e.exports = i;\n});\n__d(\"SyntheticTouchEvent\", [\"SyntheticUIEvent\",], function(a, b, c, d, e, f) {\n    var g = b(\"SyntheticUIEvent\"), h = {\n        touches: null,\n        targetTouches: null,\n        changedTouches: null,\n        altKey: null,\n        metaKey: null,\n        ctrlKey: null,\n        shiftKey: null\n    };\n    function i(j, k, l) {\n        g.call(this, j, k, l);\n    };\n;\n    g.augmentClass(i, h);\n    e.exports = i;\n});\n__d(\"SyntheticWheelEvent\", [\"SyntheticMouseEvent\",], function(a, b, c, d, e, f) {\n    var g = b(\"SyntheticMouseEvent\"), h = {\n        deltaX: function(JSBNG__event) {\n            return ((((\"deltaX\" in JSBNG__event)) ? JSBNG__event.deltaX : ((((\"wheelDeltaX\" in JSBNG__event)) ? -JSBNG__event.wheelDeltaX : 0))));\n        },\n        deltaY: function(JSBNG__event) {\n            return ((((\"deltaY\" in JSBNG__event)) ? -JSBNG__event.deltaY : ((((\"wheelDeltaY\" in JSBNG__event)) ? JSBNG__event.wheelDeltaY : ((((\"wheelDelta\" in JSBNG__event)) ? JSBNG__event.wheelData : 0))))));\n        },\n        deltaZ: null,\n        deltaMode: null\n    };\n    function i(j, k, l) {\n        g.call(this, j, k, l);\n    };\n;\n    g.augmentClass(i, h);\n    e.exports = i;\n});\n__d(\"SimpleEventPlugin\", [\"EventConstants\",\"EventPropagators\",\"SyntheticEvent\",\"SyntheticFocusEvent\",\"SyntheticKeyboardEvent\",\"SyntheticMouseEvent\",\"SyntheticMutationEvent\",\"SyntheticTouchEvent\",\"SyntheticUIEvent\",\"SyntheticWheelEvent\",\"invariant\",\"keyOf\",], function(a, b, c, d, e, f) {\n    var g = b(\"EventConstants\"), h = b(\"EventPropagators\"), i = b(\"SyntheticEvent\"), j = b(\"SyntheticFocusEvent\"), k = b(\"SyntheticKeyboardEvent\"), l = b(\"SyntheticMouseEvent\"), m = b(\"SyntheticMutationEvent\"), n = b(\"SyntheticTouchEvent\"), o = b(\"SyntheticUIEvent\"), p = b(\"SyntheticWheelEvent\"), q = b(\"invariant\"), r = b(\"keyOf\"), s = g.topLevelTypes, t = {\n        JSBNG__blur: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onBlur: true\n                }),\n                captured: r({\n                    onBlurCapture: true\n                })\n            }\n        },\n        click: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onClick: true\n                }),\n                captured: r({\n                    onClickCapture: true\n                })\n            }\n        },\n        doubleClick: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onDoubleClick: true\n                }),\n                captured: r({\n                    onDoubleClickCapture: true\n                })\n            }\n        },\n        drag: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onDrag: true\n                }),\n                captured: r({\n                    onDragCapture: true\n                })\n            }\n        },\n        dragEnd: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onDragEnd: true\n                }),\n                captured: r({\n                    onDragEndCapture: true\n                })\n            }\n        },\n        dragEnter: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onDragEnter: true\n                }),\n                captured: r({\n                    onDragEnterCapture: true\n                })\n            }\n        },\n        dragExit: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onDragExit: true\n                }),\n                captured: r({\n                    onDragExitCapture: true\n                })\n            }\n        },\n        dragLeave: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onDragLeave: true\n                }),\n                captured: r({\n                    onDragLeaveCapture: true\n                })\n            }\n        },\n        dragOver: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onDragOver: true\n                }),\n                captured: r({\n                    onDragOverCapture: true\n                })\n            }\n        },\n        dragStart: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onDragStart: true\n                }),\n                captured: r({\n                    onDragStartCapture: true\n                })\n            }\n        },\n        drop: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onDrop: true\n                }),\n                captured: r({\n                    onDropCapture: true\n                })\n            }\n        },\n        DOMCharacterDataModified: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onDOMCharacterDataModified: true\n                }),\n                captured: r({\n                    onDOMCharacterDataModifiedCapture: true\n                })\n            }\n        },\n        JSBNG__focus: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onFocus: true\n                }),\n                captured: r({\n                    onFocusCapture: true\n                })\n            }\n        },\n        input: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onInput: true\n                }),\n                captured: r({\n                    onInputCapture: true\n                })\n            }\n        },\n        keyDown: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onKeyDown: true\n                }),\n                captured: r({\n                    onKeyDownCapture: true\n                })\n            }\n        },\n        keyPress: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onKeyPress: true\n                }),\n                captured: r({\n                    onKeyPressCapture: true\n                })\n            }\n        },\n        keyUp: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onKeyUp: true\n                }),\n                captured: r({\n                    onKeyUpCapture: true\n                })\n            }\n        },\n        mouseDown: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onMouseDown: true\n                }),\n                captured: r({\n                    onMouseDownCapture: true\n                })\n            }\n        },\n        mouseMove: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onMouseMove: true\n                }),\n                captured: r({\n                    onMouseMoveCapture: true\n                })\n            }\n        },\n        mouseUp: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onMouseUp: true\n                }),\n                captured: r({\n                    onMouseUpCapture: true\n                })\n            }\n        },\n        JSBNG__scroll: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onScroll: true\n                }),\n                captured: r({\n                    onScrollCapture: true\n                })\n            }\n        },\n        submit: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onSubmit: true\n                }),\n                captured: r({\n                    onSubmitCapture: true\n                })\n            }\n        },\n        touchCancel: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onTouchCancel: true\n                }),\n                captured: r({\n                    onTouchCancelCapture: true\n                })\n            }\n        },\n        touchEnd: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onTouchEnd: true\n                }),\n                captured: r({\n                    onTouchEndCapture: true\n                })\n            }\n        },\n        touchMove: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onTouchMove: true\n                }),\n                captured: r({\n                    onTouchMoveCapture: true\n                })\n            }\n        },\n        touchStart: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onTouchStart: true\n                }),\n                captured: r({\n                    onTouchStartCapture: true\n                })\n            }\n        },\n        wheel: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onWheel: true\n                }),\n                captured: r({\n                    onWheelCapture: true\n                })\n            }\n        }\n    }, u = {\n        topBlur: t.JSBNG__blur,\n        topClick: t.click,\n        topDoubleClick: t.doubleClick,\n        topDOMCharacterDataModified: t.DOMCharacterDataModified,\n        topDrag: t.drag,\n        topDragEnd: t.dragEnd,\n        topDragEnter: t.dragEnter,\n        topDragExit: t.dragExit,\n        topDragLeave: t.dragLeave,\n        topDragOver: t.dragOver,\n        topDragStart: t.dragStart,\n        topDrop: t.drop,\n        topFocus: t.JSBNG__focus,\n        topInput: t.input,\n        topKeyDown: t.keyDown,\n        topKeyPress: t.keyPress,\n        topKeyUp: t.keyUp,\n        topMouseDown: t.mouseDown,\n        topMouseMove: t.mouseMove,\n        topMouseUp: t.mouseUp,\n        topScroll: t.JSBNG__scroll,\n        topSubmit: t.submit,\n        topTouchCancel: t.touchCancel,\n        topTouchEnd: t.touchEnd,\n        topTouchMove: t.touchMove,\n        topTouchStart: t.touchStart,\n        topWheel: t.wheel\n    }, v = {\n        eventTypes: t,\n        executeDispatch: function(JSBNG__event, w, x) {\n            var y = w(JSBNG__event, x);\n            if (((y === false))) {\n                JSBNG__event.stopPropagation();\n                JSBNG__event.preventDefault();\n            }\n        ;\n        ;\n        },\n        extractEvents: function(w, x, y, z) {\n            var aa = u[w];\n            if (!aa) {\n                return null;\n            }\n        ;\n        ;\n            var ba;\n            switch (w) {\n              case s.topInput:\n            \n              case s.topSubmit:\n                ba = i;\n                break;\n              case s.topKeyDown:\n            \n              case s.topKeyPress:\n            \n              case s.topKeyUp:\n                ba = k;\n                break;\n              case s.topBlur:\n            \n              case s.topFocus:\n                ba = j;\n                break;\n              case s.topClick:\n            \n              case s.topDoubleClick:\n            \n              case s.topDrag:\n            \n              case s.topDragEnd:\n            \n              case s.topDragEnter:\n            \n              case s.topDragExit:\n            \n              case s.topDragLeave:\n            \n              case s.topDragOver:\n            \n              case s.topDragStart:\n            \n              case s.topDrop:\n            \n              case s.topMouseDown:\n            \n              case s.topMouseMove:\n            \n              case s.topMouseUp:\n                ba = l;\n                break;\n              case s.topDOMCharacterDataModified:\n                ba = m;\n                break;\n              case s.topTouchCancel:\n            \n              case s.topTouchEnd:\n            \n              case s.topTouchMove:\n            \n              case s.topTouchStart:\n                ba = n;\n                break;\n              case s.topScroll:\n                ba = o;\n                break;\n              case s.topWheel:\n                ba = p;\n                break;\n            };\n        ;\n            q(ba);\n            var JSBNG__event = ba.getPooled(aa, y, z);\n            h.accumulateTwoPhaseDispatches(JSBNG__event);\n            return JSBNG__event;\n        }\n    };\n    e.exports = v;\n});\n__d(\"ReactDefaultInjection\", [\"ReactDOM\",\"ReactDOMForm\",\"ReactDOMInput\",\"ReactDOMTextarea\",\"DefaultDOMPropertyConfig\",\"DOMProperty\",\"DefaultEventPluginOrder\",\"EnterLeaveEventPlugin\",\"ChangeEventPlugin\",\"EventPluginHub\",\"ReactInstanceHandles\",\"SimpleEventPlugin\",], function(a, b, c, d, e, f) {\n    var g = b(\"ReactDOM\"), h = b(\"ReactDOMForm\"), i = b(\"ReactDOMInput\"), j = b(\"ReactDOMTextarea\"), k = b(\"DefaultDOMPropertyConfig\"), l = b(\"DOMProperty\"), m = b(\"DefaultEventPluginOrder\"), n = b(\"EnterLeaveEventPlugin\"), o = b(\"ChangeEventPlugin\"), p = b(\"EventPluginHub\"), q = b(\"ReactInstanceHandles\"), r = b(\"SimpleEventPlugin\");\n    function s() {\n        p.injection.injectEventPluginOrder(m);\n        p.injection.injectInstanceHandle(q);\n        p.injection.injectEventPluginsByName({\n            SimpleEventPlugin: r,\n            EnterLeaveEventPlugin: n,\n            ChangeEventPlugin: o\n        });\n        g.injection.injectComponentClasses({\n            form: h,\n            input: i,\n            textarea: j\n        });\n        l.injection.injectDOMPropertyConfig(k);\n    };\n;\n    e.exports = {\n        inject: s\n    };\n});\n__d(\"React\", [\"ReactCompositeComponent\",\"ReactComponent\",\"ReactDOM\",\"ReactMount\",\"ReactProps\",\"ReactServerRendering\",\"ReactDefaultInjection\",], function(a, b, c, d, e, f) {\n    var g = b(\"ReactCompositeComponent\"), h = b(\"ReactComponent\"), i = b(\"ReactDOM\"), j = b(\"ReactMount\"), k = b(\"ReactProps\"), l = b(\"ReactServerRendering\"), m = b(\"ReactDefaultInjection\");\n    m.inject();\n    var n = {\n        DOM: i,\n        Props: k,\n        initializeTouchEvents: function(o) {\n            j.useTouchEvents = o;\n        },\n        autoBind: g.autoBind,\n        createClass: g.createClass,\n        constructAndRenderComponent: j.constructAndRenderComponent,\n        constructAndRenderComponentByID: j.constructAndRenderComponentByID,\n        renderComponent: j.renderComponent,\n        renderComponentToString: l.renderComponentToString,\n        unmountAndReleaseReactRootNode: j.unmountAndReleaseReactRootNode,\n        isValidComponent: h.isValidComponent\n    };\n    e.exports = n;\n});\n__d(\"TrackingNodes\", [], function(a, b, c, d, e, f) {\n    var g = {\n        types: {\n            USER_NAME: 2,\n            LIKE_LINK: 5,\n            UNLIKE_LINK: 6,\n            ATTACHMENT: 15,\n            SHARE_LINK: 17,\n            USER_MESSAGE: 18,\n            SOURCE: 21,\n            BLINGBOX: 22,\n            VIEW_ALL_COMMENTS: 24,\n            COMMENT: 25,\n            COMMENT_LINK: 26,\n            SMALL_ACTOR_PHOTO: 27,\n            XBUTTON: 29,\n            HIDE_LINK: 30,\n            REPORT_SPAM_LINK: 31,\n            HIDE_ALL_LINK: 32,\n            ADD_COMMENT_BOX: 34,\n            UFI: 36,\n            DROPDOWN_BUTTON: 55,\n            UNHIDE_LINK: 71\n        },\n        BASE_CODE_START: 58,\n        BASE_CODE_END: 126,\n        BASE_CODE_SIZE: 69,\n        PREFIX_CODE_START: 42,\n        PREFIX_CODE_END: 47,\n        PREFIX_CODE_SIZE: 6,\n        encodeTrackingInfo: function(h, i) {\n            var j = ((((h - 1)) % g.BASE_CODE_SIZE)), k = parseInt(((((h - 1)) / g.BASE_CODE_SIZE)), 10);\n            if (((((h < 1)) || ((k > g.PREFIX_CODE_SIZE))))) {\n                throw Error(((\"Invalid tracking node: \" + h)));\n            }\n        ;\n        ;\n            var l = \"\";\n            if (((k > 0))) {\n                l += String.fromCharCode(((((k - 1)) + g.PREFIX_CODE_START)));\n            }\n        ;\n        ;\n            l += String.fromCharCode(((j + g.BASE_CODE_START)));\n            if (((((typeof i != \"undefined\")) && ((i > 0))))) {\n                l += String.fromCharCode(((((48 + Math.min(i, 10))) - 1)));\n            }\n        ;\n        ;\n            return l;\n        },\n        decodeTN: function(h) {\n            if (((h.length === 0))) {\n                return [0,];\n            }\n        ;\n        ;\n            var i = h.charCodeAt(0), j = 1, k, l;\n            if (((((i >= g.PREFIX_CODE_START)) && ((i <= g.PREFIX_CODE_END))))) {\n                if (((h.length == 1))) {\n                    return [0,];\n                }\n            ;\n            ;\n                l = ((((i - g.PREFIX_CODE_START)) + 1));\n                k = h.charCodeAt(1);\n                j = 2;\n            }\n             else {\n                l = 0;\n                k = i;\n            }\n        ;\n        ;\n            if (((((k < g.BASE_CODE_START)) || ((k > g.BASE_CODE_END))))) {\n                return [0,];\n            }\n        ;\n        ;\n            var m = ((((((l * g.BASE_CODE_SIZE)) + ((k - g.BASE_CODE_START)))) + 1));\n            if (((((h.length > j)) && ((((h.charAt(j) >= \"0\")) && ((h.charAt(j) <= \"9\"))))))) {\n                return [((j + 1)),[m,((parseInt(h.charAt(j), 10) + 1)),],];\n            }\n        ;\n        ;\n            return [j,[m,],];\n        },\n        parseTrackingNodeString: function(h) {\n            var i = [];\n            while (((h.length > 0))) {\n                var j = g.decodeTN(h);\n                if (((j.length == 1))) {\n                    return [];\n                }\n            ;\n            ;\n                i.push(j[1]);\n                h = h.substring(j[0]);\n            };\n        ;\n            return i;\n        },\n        getTrackingInfo: function(h, i) {\n            return ((((\"{\\\"tn\\\":\\\"\" + g.encodeTrackingInfo(h, i))) + \"\\\"}\"));\n        }\n    };\n    e.exports = g;\n});\n__d(\"NumberFormat\", [\"Env\",], function(a, b, c, d, e, f) {\n    var g = b(\"Env\"), h = /(\\d{3})(?=\\d)/g, i = 10000, j = function(l) {\n        return ((\"\" + l)).split(\"\").reverse().join(\"\");\n    }, k = {\n        formatIntegerWithDelimiter: function(l, m) {\n            if (((((((g.locale == \"nb_NO\")) || ((g.locale == \"nn_NO\")))) && ((Math.abs(l) < i))))) {\n                return l.toString();\n            }\n        ;\n        ;\n            var n = j(l);\n            return j(n.replace(h, ((\"$1\" + m))));\n        }\n    };\n    e.exports = k;\n});\n__d(\"UFIBlingItem.react\", [\"React\",\"NumberFormat\",\"cx\",\"joinClasses\",], function(a, b, c, d, e, f) {\n    var g = b(\"React\"), h = b(\"NumberFormat\"), i = b(\"cx\"), j = b(\"joinClasses\"), k = g.createClass({\n        displayName: \"UFIBlingItem\",\n        render: function() {\n            var l = j(this.props.className, this.props.iconClassName, \"UFIBlingBoxSprite\"), m = h.formatIntegerWithDelimiter(this.props.count, ((this.props.contextArgs.numberdelimiter || \",\")));\n            return (g.DOM.span(null, g.DOM.i({\n                className: l\n            }), g.DOM.span({\n                className: \"UFIBlingBoxText\"\n            }, m)));\n        }\n    });\n    e.exports = k;\n});\n__d(\"UFIConstants\", [], function(a, b, c, d, e, f) {\n    var g = {\n        COMMENT_LIKE: \"fa-type:comment-like\",\n        COMMENT_SET_SPAM: \"fa-type:mark-spam\",\n        DELETE_COMMENT: \"fa-type:delete-comment\",\n        LIVE_DELETE_COMMENT: \"fa-type:live-delete-comment\",\n        LIKE_ACTION: \"fa-type:like\",\n        REMOVE_PREVIEW: \"fa-type:remove-preview\",\n        CONFIRM_COMMENT_REMOVAL: \"fa-type:confirm-remove\",\n        TRANSLATE_COMMENT: \"fa-type:translate-comment\",\n        SUBSCRIBE_ACTION: \"fa-type:subscribe\",\n        GIFT_SUGGESTION: \"fa-type:gift-suggestion\",\n        UNDO_DELETE_COMMENT: \"fa-type:undo-delete-comment\"\n    }, h = {\n        DELETED: \"status:deleted\",\n        SPAM: \"status:spam\",\n        SPAM_DISPLAY: \"status:spam-display\",\n        LIVE_DELETED: \"status:live-deleted\",\n        FAILED_ADD: \"status:failed-add\",\n        FAILED_EDIT: \"status:failed-edit\",\n        PENDING_EDIT: \"status:pending-edit\",\n        PENDING_UNDO_DELETE: \"status:pending-undo-delete\"\n    }, i = {\n        MOBILE: 1,\n        SMS: 3,\n        EMAIL: 4\n    }, j = {\n        PROFILE: 0,\n        NEWS_FEED: 1,\n        OBJECT: 2,\n        MOBILE: 3,\n        EMAIL: 4,\n        PROFILE_APROVAL: 10,\n        TICKER: 12,\n        NONE: 13,\n        INTERN: 14,\n        ADS: 15,\n        PHOTOS_SNOWLIFT: 17\n    }, k = {\n        UNKNOWN: 0,\n        INITIAL_SERVER: 1,\n        LIVE_SEND: 2,\n        USER_ACTION: 3,\n        COLLAPSED_UFI: 4,\n        ENDPOINT_LIKE: 10,\n        ENDPOINT_COMMENT_LIKE: 11,\n        ENDPOINT_ADD_COMMENT: 12,\n        ENDPOINT_EDIT_COMMENT: 13,\n        ENDPOINT_DELETE_COMMENT: 14,\n        ENDPOINT_UNDO_DELETE_COMMENT: 15,\n        ENDPOINT_COMMENT_SPAM: 16,\n        ENDPOINT_REMOVE_PREVIEW: 17,\n        ENDPOINT_ID_COMMENT_FETCH: 18,\n        ENDPOINT_COMMENT_FETCH: 19,\n        ENDPOINT_TRANSLATE_COMMENT: 20,\n        ENDPOINT_BAN: 21,\n        ENDPOINT_SUBSCRIBE: 22\n    }, l = {\n        CHRONOLOGICAL: \"chronological\",\n        RANKED_THREADED: \"ranked_threaded\",\n        TOPLEVEL: \"toplevel\",\n        RECENT_ACTIVITY: \"recent_activity\"\n    }, m = 50, n = 97244, o = 420, p = 5, q = 80, r = 2;\n    e.exports = {\n        UFIActionType: g,\n        UFIStatus: h,\n        UFISourceType: i,\n        UFIFeedbackSourceType: j,\n        UFIPayloadSourceType: k,\n        UFICommentOrderingMode: l,\n        defaultPageSize: m,\n        commentTruncationLength: o,\n        commentTruncationPercent: n,\n        commentTruncationMaxLines: p,\n        attachmentTruncationLength: q,\n        minCommentsForOrderingModeSelector: r\n    };\n});\n__d(\"UFIBlingBox.react\", [\"React\",\"UFIBlingItem.react\",\"UFIConstants\",\"cx\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"React\"), h = b(\"UFIBlingItem.react\"), i = b(\"UFIConstants\"), j = b(\"cx\"), k = b(\"tx\"), l = g.createClass({\n        displayName: \"UFIBlingBox\",\n        render: function() {\n            var m = [], n = \"\";\n            if (this.props.likes) {\n                m.push(h({\n                    count: this.props.likes,\n                    className: ((((m.length > 0)) ? \"mls\" : \"\")),\n                    iconClassName: \"UFIBlingBoxLikeIcon\",\n                    contextArgs: this.props.contextArgs\n                }));\n                n += ((((this.props.likes == 1)) ? \"1 like\" : k._(\"{count} likes\", {\n                    count: this.props.likes\n                })));\n                n += \" \";\n            }\n        ;\n        ;\n            if (this.props.comments) {\n                m.push(h({\n                    count: this.props.comments,\n                    className: ((((m.length > 0)) ? \"mls\" : \"\")),\n                    iconClassName: \"UFIBlingBoxCommentIcon\",\n                    contextArgs: this.props.contextArgs\n                }));\n                n += ((((this.props.comments == 1)) ? \"1 comment\" : k._(\"{count} comments\", {\n                    count: this.props.comments\n                })));\n                n += \" \";\n            }\n        ;\n        ;\n            if (this.props.reshares) {\n                m.push(h({\n                    count: this.props.reshares,\n                    className: ((((m.length > 0)) ? \"mls\" : \"\")),\n                    iconClassName: \"UFIBlingBoxReshareIcon\",\n                    contextArgs: this.props.contextArgs\n                }));\n                n += ((((this.props.reshares == 1)) ? \"1 share\" : k._(\"{count} shares\", {\n                    count: this.props.reshares\n                })));\n            }\n        ;\n        ;\n            var o = g.DOM.a({\n                className: \"UFIBlingBox uiBlingBox feedbackBling\",\n                href: this.props.permalink,\n                \"data-ft\": this.props[\"data-ft\"],\n                \"aria-label\": n\n            }, m);\n            if (((this.props.comments < i.defaultPageSize))) {\n                o.props.onClick = this.props.onClick;\n                o.props.rel = \"ignore\";\n            }\n        ;\n        ;\n            return o;\n        }\n    });\n    e.exports = l;\n});\n__d(\"UFICentralUpdates\", [\"Arbiter\",\"ChannelConstants\",\"LiveTimer\",\"ShortProfiles\",\"UFIConstants\",\"copyProperties\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ChannelConstants\"), i = b(\"LiveTimer\"), j = b(\"ShortProfiles\"), k = b(\"UFIConstants\"), l = b(\"copyProperties\"), m = b(\"tx\"), n = 0, o = {\n    }, p = {\n    }, q = {\n    }, r = {\n    }, s = [];\n    g.subscribe(h.getArbiterType(\"live-data\"), function(x, y) {\n        if (((y && y.obj))) {\n            var z = y.obj, aa = ((z.comments || []));\n            aa.forEach(function(ba) {\n                ba.timestamp.text = \"a few seconds ago\";\n            });\n            w.handleUpdate(k.UFIPayloadSourceType.LIVE_SEND, z);\n        }\n    ;\n    ;\n    });\n    function t() {\n        if (!n) {\n            var x = q, y = o, z = p, aa = r;\n            q = {\n            };\n            o = {\n            };\n            p = {\n            };\n            r = {\n            };\n            if (Object.keys(x).length) {\n                v(\"feedback-id-changed\", x);\n            }\n        ;\n        ;\n            if (Object.keys(y).length) {\n                v(\"feedback-updated\", y);\n            }\n        ;\n        ;\n            if (Object.keys(z).length) {\n                v(\"comments-updated\", z);\n            }\n        ;\n        ;\n            if (Object.keys(aa).length) {\n                v(\"instance-updated\", aa);\n            }\n        ;\n        ;\n            s.pop();\n        }\n    ;\n    ;\n    };\n;\n    function u() {\n        if (s.length) {\n            return s[((s.length - 1))];\n        }\n         else return k.UFIPayloadSourceType.UNKNOWN\n    ;\n    };\n;\n    function v(JSBNG__event, x) {\n        w.inform(JSBNG__event, {\n            updates: x,\n            payloadSource: u()\n        });\n    };\n;\n    var w = l(new g(), {\n        handleUpdate: function(x, y) {\n            if (Object.keys(y).length) {\n                this.synchronizeInforms(function() {\n                    s.push(x);\n                    var z = l({\n                        payloadsource: u()\n                    }, y);\n                    this.inform(\"update-feedback\", z);\n                    this.inform(\"update-comment-lists\", z);\n                    this.inform(\"update-comments\", z);\n                    this.inform(\"update-actions\", z);\n                    ((y.profiles || [])).forEach(function(aa) {\n                        j.set(aa.id, aa);\n                    });\n                    if (y.servertime) {\n                        i.restart(y.servertime);\n                    }\n                ;\n                ;\n                }.bind(this));\n            }\n        ;\n        ;\n        },\n        didUpdateFeedback: function(x) {\n            o[x] = true;\n            t();\n        },\n        didUpdateComment: function(x) {\n            p[x] = true;\n            t();\n        },\n        didUpdateFeedbackID: function(x, y) {\n            q[x] = y;\n            t();\n        },\n        didUpdateInstanceState: function(x, y) {\n            if (!r[x]) {\n                r[x] = {\n                };\n            }\n        ;\n        ;\n            r[x][y] = true;\n            t();\n        },\n        synchronizeInforms: function(x) {\n            n++;\n            try {\n                x();\n            } catch (y) {\n                throw y;\n            } finally {\n                n--;\n                t();\n            };\n        ;\n        }\n    });\n    e.exports = w;\n});\n__d(\"randomInt\", [\"invariant\",], function(a, b, c, d, e, f) {\n    var g = b(\"invariant\");\n    function h(i, j) {\n        var k = arguments.length;\n        g(((((k > 0)) && ((k <= 2)))));\n        if (((k === 1))) {\n            j = i;\n            i = 0;\n        }\n    ;\n    ;\n        g(((j > i)));\n        var l = ((this.JSBNG__random || Math.JSBNG__random));\n        return Math.floor(((i + ((l() * ((j - i)))))));\n    };\n;\n    e.exports = h;\n});\n__d(\"ClientIDs\", [\"randomInt\",], function(a, b, c, d, e, f) {\n    var g = b(\"randomInt\"), h = {\n    }, i = {\n        getNewClientID: function() {\n            var j = JSBNG__Date.now(), k = ((((j + \":\")) + ((g(0, 4294967295) + 1))));\n            h[k] = true;\n            return k;\n        },\n        isExistingClientID: function(j) {\n            return !!h[j];\n        }\n    };\n    e.exports = i;\n});\n__d(\"ImmutableObject\", [\"keyMirror\",\"merge\",\"mergeInto\",\"mergeHelpers\",\"throwIf\",], function(a, b, c, d, e, f) {\n    var g = b(\"keyMirror\"), h = b(\"merge\"), i = b(\"mergeInto\"), j = b(\"mergeHelpers\"), k = b(\"throwIf\"), l = j.checkMergeObjectArgs, m = j.isTerminal, n, o;\n    n = g({\n        INVALID_MAP_SET_ARG: null\n    });\n    o = function(q) {\n        i(this, q);\n    };\n    o.set = function(q, r) {\n        k(!((q instanceof o)), n.INVALID_MAP_SET_ARG);\n        var s = new o(q);\n        i(s, r);\n        return s;\n    };\n    o.setField = function(q, r, s) {\n        var t = {\n        };\n        t[r] = s;\n        return o.set(q, t);\n    };\n    o.setDeep = function(q, r) {\n        k(!((q instanceof o)), n.INVALID_MAP_SET_ARG);\n        return p(q, r);\n    };\n    function p(q, r) {\n        l(q, r);\n        var s = {\n        }, t = Object.keys(q);\n        for (var u = 0; ((u < t.length)); u++) {\n            var v = t[u];\n            if (!r.hasOwnProperty(v)) {\n                s[v] = q[v];\n            }\n             else if (((m(q[v]) || m(r[v])))) {\n                s[v] = r[v];\n            }\n             else s[v] = p(q[v], r[v]);\n            \n        ;\n        ;\n        };\n    ;\n        var w = Object.keys(r);\n        for (u = 0; ((u < w.length)); u++) {\n            var x = w[u];\n            if (q.hasOwnProperty(x)) {\n                continue;\n            }\n        ;\n        ;\n            s[x] = r[x];\n        };\n    ;\n        return ((((((q instanceof o)) || ((r instanceof o)))) ? new o(s) : s));\n    };\n;\n    e.exports = o;\n});\n__d(\"debounceAcrossTransitions\", [\"debounce\",], function(a, b, c, d, e, f) {\n    var g = b(\"debounce\");\n    function h(i, j, k) {\n        return g(i, j, k, true);\n    };\n;\n    e.exports = h;\n});\n__d(\"MercuryServerDispatcher\", [\"AsyncRequest\",\"FBAjaxRequest\",\"Env\",\"JSLogger\",\"Run\",\"areObjectsEqual\",\"copyProperties\",\"debounceAcrossTransitions\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = b(\"FBAjaxRequest\"), i = b(\"Env\"), j = b(\"JSLogger\"), k = b(\"Run\"), l = b(\"areObjectsEqual\"), m = b(\"copyProperties\"), n = b(\"debounceAcrossTransitions\"), o = {\n    }, p = j.create(\"mercury_dispatcher\"), q = false, r = {\n        IMMEDIATE: \"immediate\",\n        IDEMPOTENT: \"idempotent\",\n        BATCH_SUCCESSIVE: \"batch-successive\",\n        BATCH_SUCCESSIVE_UNIQUE: \"batch-successive-unique\",\n        BATCH_SUCCESSIVE_PIGGYBACK_ON_ERROR: \"batch-successive-piggyback-retry\",\n        BATCH_DEFERRED_MULTI: \"batch-deferred-multi\",\n        BATCH_CONDITIONAL: \"batch-conditional\",\n        registerEndpoints: function(v) {\n            {\n                var fin88keys = ((window.top.JSBNG_Replay.forInKeys)((v))), fin88i = (0);\n                var w;\n                for (; (fin88i < fin88keys.length); (fin88i++)) {\n                    ((w) = (fin88keys[fin88i]));\n                    {\n                        var x = v[w], y = ((x.request_user_id || i.user));\n                        if (!o[w]) {\n                            o[w] = {\n                            };\n                        }\n                    ;\n                    ;\n                        if (!o[w][y]) {\n                            o[w][y] = {\n                            };\n                        }\n                    ;\n                    ;\n                        o[w][y] = new s(w, x);\n                    };\n                };\n            };\n        ;\n        },\n        trySend: function(v, w, x, y) {\n            y = ((y || i.user));\n            if (((((v == \"/ajax/mercury/client_reliability.php\")) && !o[v][y]))) {\n                o[v][y] = o[v][undefined];\n            }\n        ;\n        ;\n            o[v][y].trySend(w, x);\n        }\n    };\n    function s(v, w) {\n        var x = ((w.mode || r.IMMEDIATE));\n        switch (x) {\n          case r.IMMEDIATE:\n        \n          case r.IDEMPOTENT:\n        \n          case r.BATCH_SUCCESSIVE:\n        \n          case r.BATCH_SUCCESSIVE_UNIQUE:\n        \n          case r.BATCH_SUCCESSIVE_PIGGYBACK_ON_ERROR:\n        \n          case r.BATCH_DEFERRED_MULTI:\n        \n          case r.BATCH_CONDITIONAL:\n            break;\n          default:\n            throw new Error(((\"Invalid MercuryServerDispatcher mode \" + x)));\n        };\n    ;\n        this._endpoint = v;\n        this._mode = x;\n        this._requestUserID = w.request_user_id;\n        this._combineData = w.batch_function;\n        this._combineDataIf = w.batch_if;\n        this._batchSizeLimit = w.batch_size_limit;\n        this._batches = [];\n        this._handler = w.handler;\n        this._errorHandler = w.error_handler;\n        this._transportErrorHandler = ((w.transport_error_handler || w.error_handler));\n        this._connectionRetries = ((w.connection_retries || 0));\n        this._timeoutHandler = w.timeout_handler;\n        this._timeout = w.timeout;\n        this._serverDialogCancelHandler = ((w.server_dialog_cancel_handler || w.error_handler));\n        this._deferredSend = n(this._batchSend, 0, this);\n        if (this._batchSizeLimit) {\n            k.onUnload(function() {\n                p.bump(((\"unload_batches_count_\" + u(this._batches.length))));\n            }.bind(this));\n        }\n    ;\n    ;\n    };\n;\n    m(s.prototype, {\n        _inFlight: 0,\n        _handler: null,\n        _errorHandler: null,\n        _transportErrorHandler: null,\n        _timeoutHandler: null,\n        _timeout: null,\n        _serverDialogCancelHandler: null,\n        _combineData: null,\n        trySend: function(v, w) {\n            if (q) {\n                return;\n            }\n        ;\n        ;\n            if (((typeof v == \"undefined\"))) {\n                v = null;\n            }\n        ;\n        ;\n            var x = ((w || this._mode));\n            if (((x == r.IMMEDIATE))) {\n                this._send(v);\n            }\n             else if (((x == r.IDEMPOTENT))) {\n                if (!this._inFlight) {\n                    this._send(v);\n                }\n            ;\n            ;\n            }\n             else if (((((x == r.BATCH_SUCCESSIVE)) || ((x == r.BATCH_SUCCESSIVE_UNIQUE))))) {\n                if (!this._inFlight) {\n                    this._send(v);\n                }\n                 else this._batchData(v);\n            ;\n            ;\n            }\n             else if (((x == r.BATCH_CONDITIONAL))) {\n                var y = ((this._batches[0] && this._batches[0].getData()));\n                if (((this._inFlight && ((this._combineDataIf(this._pendingRequestData, v) || this._combineDataIf(y, v)))))) {\n                    this._batchData(v);\n                }\n                 else this._send(v);\n            ;\n            ;\n            }\n             else if (((x == r.BATCH_DEFERRED_MULTI))) {\n                this._batchData(v);\n                this._deferredSend();\n            }\n             else if (((x == r.BATCH_SUCCESSIVE_PIGGYBACK_ON_ERROR))) {\n                this._batchData(v);\n                if (!this._inFlight) {\n                    this._batchSend();\n                }\n            ;\n            ;\n            }\n            \n            \n            \n            \n            \n        ;\n        ;\n        },\n        _send: function(v) {\n            this._inFlight++;\n            this._pendingRequestData = m({\n            }, v);\n            if (((this._requestUserID != i.user))) {\n                v.request_user_id = this._requestUserID;\n            }\n        ;\n        ;\n            p.log(\"send\", {\n                endpoint: this._endpoint,\n                data: v,\n                inflight_count: this._inFlight\n            });\n            var w = null;\n            if (i.worker_context) {\n                w = new h(\"POST\", this._endpoint, v);\n                w.onError = function(x) {\n                    x.getPayload = function() {\n                        return x.errorText;\n                    };\n                    x.getRequest = function() {\n                        var y = x;\n                        x.getData = function() {\n                            return v;\n                        };\n                        return y;\n                    };\n                    x.getError = function() {\n                        return x.errorText;\n                    };\n                    x.getErrorDescription = function() {\n                        return x.errorText;\n                    };\n                    x.isTransient = function() {\n                        return false;\n                    };\n                    this._handleError(x);\n                }.bind(this);\n                w.onJSON = function(x) {\n                    x.getPayload = function() {\n                        return x.json;\n                    };\n                    x.getRequest = function() {\n                        return w;\n                    };\n                    this._handleResponse(x);\n                }.bind(this);\n                w.getData = function() {\n                    return v;\n                };\n                w.send();\n            }\n             else {\n                w = new g(this._endpoint).setData(v).setOption(\"retries\", this._connectionRetries).setHandler(this._handleResponse.bind(this)).setErrorHandler(this._handleError.bind(this)).setTransportErrorHandler(this._handleTransportError.bind(this)).setServerDialogCancelHandler(this._handleServerDialogCancel.bind(this)).setAllowCrossPageTransition(true);\n                if (((this._timeout && this._timeoutHandler))) {\n                    w.setTimeoutHandler(this._timeout, this._handleTimeout.bind(this));\n                }\n            ;\n            ;\n                w.send();\n            }\n        ;\n        ;\n        },\n        _batchData: function(v, w) {\n            if (((((((this._mode == r.BATCH_SUCCESSIVE_UNIQUE)) && ((typeof this._pendingRequestData != \"undefined\")))) && l(v, this._pendingRequestData)))) {\n                return;\n            }\n             else {\n                var x = ((this._batches.length - 1));\n                if (((((x >= 0)) && !this._hasReachedBatchLimit(this._batches[x])))) {\n                    ((w ? this._batches[x].combineWithOlder(v, this._combineData) : this._batches[x].combineWith(v, this._combineData)));\n                }\n                 else {\n                    this._batches.push(new t(v));\n                    p.bump(((\"batches_count_\" + u(this._batches.length))));\n                }\n            ;\n            ;\n                p.debug(\"batch\", {\n                    endpoint: this._endpoint,\n                    batches: this._batches,\n                    batch_limit: this._batchSizeLimit\n                });\n            }\n        ;\n        ;\n        },\n        _hasReachedBatchLimit: function(v) {\n            return ((this._batchSizeLimit && ((v.getSize() >= this._batchSizeLimit))));\n        },\n        _batchSend: function() {\n            if (this._batches[0]) {\n                this._send(this._batches[0].getData());\n                this._batches.shift();\n            }\n        ;\n        ;\n        },\n        _handleResponse: function(v) {\n            this._inFlight--;\n            p.log(\"response\", {\n                endpoint: this._endpoint,\n                inflight_count: this._inFlight\n            });\n            var w = v.getPayload();\n            q = ((w && w.kill_chat));\n            if (q) {\n                p.log(\"killswitch_enabled\", {\n                    endpoint: this._endpoint,\n                    inflight_count: this._inFlight\n                });\n            }\n        ;\n        ;\n            if (((w && w.error_payload))) {\n                if (this._errorHandler) {\n                    this._errorHandler(v);\n                }\n            ;\n            ;\n            }\n             else ((this._handler && this._handler(w, v.getRequest())));\n        ;\n        ;\n            if (((((((((this._mode == r.BATCH_SUCCESSIVE)) || ((this._mode == r.BATCH_SUCCESSIVE_UNIQUE)))) || ((this._mode == r.BATCH_SUCCESSIVE_PIGGYBACK_ON_ERROR)))) || ((this._mode == r.BATCH_CONDITIONAL))))) {\n                this._batchSend();\n            }\n        ;\n        ;\n            delete this._pendingRequestData;\n        },\n        _postErrorHandler: function() {\n            p.error(\"error\", {\n                endpoint: this._endpoint,\n                inflight_count: ((this._inFlight - 1))\n            });\n            this._inFlight--;\n            var v = this._mode;\n            if (((((((v == r.BATCH_SUCCESSIVE)) || ((v == r.BATCH_SUCCESSIVE_UNIQUE)))) || ((v == r.BATCH_CONDITIONAL))))) {\n                this._batchSend();\n            }\n             else if (((v == r.BATCH_SUCCESSIVE_PIGGYBACK_ON_ERROR))) {\n                if (this._batches[0]) {\n                    this._batchData(this._pendingRequestData, true);\n                    this._batchSend();\n                }\n                 else this._batchData(this._pendingRequestData, true);\n            ;\n            }\n            \n        ;\n        ;\n            delete this._pendingRequestData;\n        },\n        _handleError: function(v) {\n            ((this._errorHandler && this._errorHandler(v)));\n            this._postErrorHandler();\n        },\n        _handleTransportError: function(v) {\n            ((this._transportErrorHandler && this._transportErrorHandler(v)));\n            this._postErrorHandler();\n        },\n        _handleTimeout: function(v) {\n            ((this._timeoutHandler && this._timeoutHandler(v)));\n            this._postErrorHandler();\n        },\n        _handleServerDialogCancel: function(v) {\n            ((this._serverDialogCancelHandler && this._serverDialogCancelHandler(v)));\n            this._postErrorHandler();\n        }\n    });\n    function t(v) {\n        this._data = v;\n        this._size = 1;\n    };\n;\n    m(t.prototype, {\n        getData: function() {\n            return this._data;\n        },\n        getSize: function() {\n            return this._size;\n        },\n        combineWith: function(v, w) {\n            this._data = w(this._data, v);\n            this._size++;\n        },\n        combineWithOlder: function(v, w) {\n            this._data = w(v, this._data);\n            this._size++;\n        }\n    });\n    function u(v) {\n        if (((v === 1))) {\n            return \"equals1\";\n        }\n         else if (((((v >= 2)) && ((v <= 3))))) {\n            return \"between2and3\";\n        }\n         else return \"over4\"\n        \n    ;\n    };\n;\n    e.exports = r;\n});\n__d(\"UFIFeedbackTargets\", [\"ClientIDs\",\"KeyedCallbackManager\",\"UFICentralUpdates\",\"UFIConstants\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"ClientIDs\"), h = b(\"KeyedCallbackManager\"), i = b(\"UFICentralUpdates\"), j = b(\"UFIConstants\"), k = b(\"copyProperties\"), l = new h();\n    function m(v) {\n        var w = {\n        };\n        v.forEach(function(x) {\n            var y = k({\n            }, x);\n            delete y.commentlist;\n            delete y.commentcount;\n            w[x.entidentifier] = y;\n            i.didUpdateFeedback(x.entidentifier);\n        });\n        l.addResourcesAndExecute(w);\n    };\n;\n    function n(v) {\n        for (var w = 0; ((w < v.length)); w++) {\n            var x = v[w];\n            switch (x.actiontype) {\n              case j.UFIActionType.LIKE_ACTION:\n                p(x);\n                break;\n              case j.UFIActionType.SUBSCRIBE_ACTION:\n                q(x);\n                break;\n              case j.UFIActionType.GIFT_SUGGESTION:\n                r(x);\n                break;\n            };\n        ;\n        };\n    ;\n    };\n;\n    function o(v) {\n        for (var w = 0; ((w < v.length)); w++) {\n            var x = v[w];\n            if (x.orig_ftentidentifier) {\n                t(x.orig_ftentidentifier, x.ftentidentifier);\n            }\n        ;\n        ;\n        };\n    ;\n    };\n;\n    function p(v) {\n        var w = s(v);\n        if (w) {\n            v.hasviewerliked = !!v.hasviewerliked;\n            if (((((v.clientid && g.isExistingClientID(v.clientid))) && ((v.hasviewerliked != w.hasviewerliked))))) {\n                return;\n            }\n        ;\n        ;\n            w.likecount = ((v.likecount || 0));\n            w.likesentences = v.likesentences;\n            if (((v.actorid == w.actorforpost))) {\n                w.hasviewerliked = v.hasviewerliked;\n            }\n             else if (((v.hasviewerliked != w.hasviewerliked))) {\n                w.likesentences = {\n                    current: v.likesentences.alternate,\n                    alternate: v.likesentences.current\n                };\n                if (w.hasviewerliked) {\n                    w.likecount++;\n                }\n                 else w.likecount--;\n            ;\n            ;\n            }\n            \n        ;\n        ;\n            if (((v.actorid != w.actorforpost))) {\n                w.likesentences.isunseen = true;\n            }\n        ;\n        ;\n            m([w,]);\n        }\n    ;\n    ;\n    };\n;\n    function q(v) {\n        var w = s(v);\n        if (w) {\n            v.hasviewersubscribed = !!v.hasviewersubscribed;\n            if (((((v.clientid && g.isExistingClientID(v.clientid))) && ((v.hasviewersubscribed != w.hasviewersubscribed))))) {\n                return;\n            }\n        ;\n        ;\n            if (((v.actorid == w.actorforpost))) {\n                w.hasviewersubscribed = v.hasviewersubscribed;\n            }\n        ;\n        ;\n            m([w,]);\n        }\n    ;\n    ;\n    };\n;\n    function r(v) {\n        var w = s(v);\n        if (!w) {\n            return;\n        }\n    ;\n    ;\n        if (((((v.clientid && g.isExistingClientID(v.clientid))) && ((v.hasviewerliked != w.hasviewerliked))))) {\n            return;\n        }\n    ;\n    ;\n        w.giftdata = v.giftdata;\n        m([w,]);\n    };\n;\n    function s(v) {\n        if (v.orig_entidentifier) {\n            t(v.orig_entidentifier, v.entidentifier);\n        }\n    ;\n    ;\n        return l.getResource(v.entidentifier);\n    };\n;\n    function t(v, w) {\n        var x = l.getResource(v);\n        if (x) {\n            l.setResource(v, null);\n            x.entidentifier = w;\n            l.setResource(w, x);\n            i.didUpdateFeedbackID(v, w);\n        }\n    ;\n    ;\n    };\n;\n    var u = {\n        getFeedbackTarget: function(v, w) {\n            var x = l.executeOrEnqueue(v, w), y = l.getUnavailableResources(x);\n            if (!y.length) {\n                return;\n            }\n        ;\n        ;\n        }\n    };\n    i.subscribe(\"update-feedback\", function(v, w) {\n        var x = w.feedbacktargets;\n        if (((x && x.length))) {\n            m(x);\n        }\n    ;\n    ;\n    });\n    i.subscribe(\"update-actions\", function(v, w) {\n        if (((w.actions && w.actions.length))) {\n            n(w.actions);\n        }\n    ;\n    ;\n    });\n    i.subscribe(\"update-comments\", function(v, w) {\n        if (((w.comments && w.comments.length))) {\n            o(w.comments);\n        }\n    ;\n    ;\n    });\n    e.exports = u;\n});\n__d(\"UFIInstanceState\", [\"UFICentralUpdates\",], function(a, b, c, d, e, f) {\n    var g = b(\"UFICentralUpdates\"), h = {\n    };\n    function i(k) {\n        if (!h[k]) {\n            h[k] = {\n            };\n        }\n    ;\n    ;\n    };\n;\n    var j = {\n        getKeyForInstance: function(k, l) {\n            i(k);\n            return h[k][l];\n        },\n        updateState: function(k, l, m) {\n            i(k);\n            h[k][l] = m;\n            g.didUpdateInstanceState(k, l);\n        },\n        updateStateField: function(k, l, m, n) {\n            var o = ((this.getKeyForInstance(k, l) || {\n            }));\n            o[m] = n;\n            this.updateState(k, l, o);\n        }\n    };\n    e.exports = j;\n});\n__d(\"UFIComments\", [\"ClientIDs\",\"ImmutableObject\",\"JSLogger\",\"KeyedCallbackManager\",\"MercuryServerDispatcher\",\"UFICentralUpdates\",\"UFIConstants\",\"UFIFeedbackTargets\",\"UFIInstanceState\",\"URI\",\"keyMirror\",\"merge\",\"randomInt\",\"throwIf\",], function(a, b, c, d, e, f) {\n    var g = b(\"ClientIDs\"), h = b(\"ImmutableObject\"), i = b(\"JSLogger\"), j = b(\"KeyedCallbackManager\"), k = b(\"MercuryServerDispatcher\"), l = b(\"UFICentralUpdates\"), m = b(\"UFIConstants\"), n = b(\"UFIFeedbackTargets\"), o = b(\"UFIInstanceState\"), p = b(\"URI\"), q = b(\"keyMirror\"), r = b(\"merge\"), s = b(\"randomInt\"), t = b(\"throwIf\"), u = q({\n        INVALID_COMMENT_TYPE: null\n    }), v = i.create(\"UFIComments\"), w = {\n    }, x = {\n    }, y = {\n    }, z = {\n    }, aa = {\n    }, ba = {\n    }, ca = \"unavailable_comment_key\";\n    function da(ab) {\n        return ((((ab in ba)) ? ba[ab] : ab));\n    };\n;\n    function ea(ab, bb) {\n        if (!x[ab]) {\n            x[ab] = {\n            };\n        }\n    ;\n    ;\n        if (!x[ab][bb]) {\n            x[ab][bb] = new j();\n        }\n    ;\n    ;\n        return x[ab][bb];\n    };\n;\n    function fa(ab) {\n        var bb = [];\n        if (x[ab]) {\n            {\n                var fin89keys = ((window.top.JSBNG_Replay.forInKeys)((x[ab]))), fin89i = (0);\n                var cb;\n                for (; (fin89i < fin89keys.length); (fin89i++)) {\n                    ((cb) = (fin89keys[fin89i]));\n                    {\n                        bb.push(x[ab][cb]);\n                    ;\n                    };\n                };\n            };\n        }\n    ;\n    ;\n        return bb;\n    };\n;\n    function ga(ab) {\n        if (!y[ab]) {\n            y[ab] = new j();\n        }\n    ;\n    ;\n        return y[ab];\n    };\n;\n    function ha(ab) {\n        var bb = fa(ab);\n        bb.forEach(function(cb) {\n            cb.reset();\n        });\n    };\n;\n    function ia(ab, bb) {\n        ab.forEach(function(cb) {\n            var db = cb.ftentidentifier, eb = ((cb.parentcommentid || db));\n            n.getFeedbackTarget(db, function(fb) {\n                var gb = m.UFIPayloadSourceType, hb = cb.clientid, ib = false, jb = r({\n                }, cb);\n                if (hb) {\n                    delete jb.clientid;\n                    ib = g.isExistingClientID(hb);\n                    if (((ib && ba[hb]))) {\n                        return;\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n                if (((((((bb === gb.LIVE_SEND)) && cb.parentcommentid)) && ((z[eb] === undefined))))) {\n                    return;\n                }\n            ;\n            ;\n                if (((((((((bb === gb.LIVE_SEND)) || ((bb === gb.USER_ACTION)))) || ((bb === gb.ENDPOINT_ADD_COMMENT)))) || ((bb === gb.ENDPOINT_EDIT_COMMENT))))) {\n                    jb.isunseen = true;\n                }\n            ;\n            ;\n                if (((((bb === gb.ENDPOINT_COMMENT_FETCH)) || ((bb === gb.ENDPOINT_ID_COMMENT_FETCH))))) {\n                    jb.fromfetch = true;\n                }\n            ;\n            ;\n                if (ib) {\n                    if (w[hb].ufiinstanceid) {\n                        o.updateStateField(w[hb].ufiinstanceid, \"locallycomposed\", cb.id, true);\n                    }\n                ;\n                ;\n                    jb.ufiinstanceid = w[hb].ufiinstanceid;\n                    ba[hb] = cb.id;\n                    w[cb.id] = w[hb];\n                    delete w[hb];\n                    l.didUpdateComment(hb);\n                }\n            ;\n            ;\n                var kb, lb;\n                if (cb.parentcommentid) {\n                    lb = [ga(eb),];\n                }\n                 else lb = fa(eb);\n            ;\n            ;\n                var mb = false;\n                lb.forEach(function(qb) {\n                    var rb = qb.getAllResources(), sb = {\n                    };\n                    {\n                        var fin90keys = ((window.top.JSBNG_Replay.forInKeys)((rb))), fin90i = (0);\n                        var tb;\n                        for (; (fin90i < fin90keys.length); (fin90i++)) {\n                            ((tb) = (fin90keys[fin90i]));\n                            {\n                                var ub = rb[tb];\n                                sb[ub] = tb;\n                            };\n                        };\n                    };\n                ;\n                    if (ib) {\n                        if (((hb in sb))) {\n                            sb[cb.id] = sb[hb];\n                            var vb = sb[hb];\n                            qb.setResource(vb, cb.id);\n                        }\n                    ;\n                    }\n                ;\n                ;\n                    if (sb[cb.id]) {\n                        mb = true;\n                    }\n                     else {\n                        var wb = ((z[eb] || 0));\n                        sb[cb.id] = wb;\n                        qb.setResource(wb, cb.id);\n                    }\n                ;\n                ;\n                    kb = sb[cb.id];\n                });\n                if (!mb) {\n                    var nb = ((z[eb] || 0));\n                    z[eb] = ((nb + 1));\n                    qa(eb);\n                }\n            ;\n            ;\n                if (((cb.JSBNG__status === m.UFIStatus.FAILED_ADD))) {\n                    aa[eb] = ((aa[eb] + 1));\n                }\n            ;\n            ;\n                var ob = z[eb];\n                jb.replycount = ((((z[cb.id] || 0)) - ((aa[cb.id] || 0))));\n                var pb = ja(kb, ob);\n                if (((cb.parentcommentid && w[cb.parentcommentid]))) {\n                    jb.permalink = p(fb.permalink).addQueryData({\n                        comment_id: w[cb.parentcommentid].legacyid,\n                        reply_comment_id: cb.legacyid,\n                        total_comments: ob\n                    }).toString();\n                }\n                 else jb.permalink = p(fb.permalink).addQueryData({\n                    comment_id: cb.legacyid,\n                    offset: pb,\n                    total_comments: ob\n                }).toString();\n            ;\n            ;\n                za.setComment(cb.id, new h(jb));\n                l.didUpdateComment(cb.id);\n                l.didUpdateFeedback(db);\n            });\n        });\n    };\n;\n    function ja(ab, bb) {\n        return ((Math.floor(((((((bb - ab)) - 1)) / m.defaultPageSize))) * m.defaultPageSize));\n    };\n;\n    function ka(ab) {\n        for (var bb = 0; ((bb < ab.length)); bb++) {\n            var cb = ab[bb];\n            switch (cb.actiontype) {\n              case m.UFIActionType.COMMENT_LIKE:\n                na(cb);\n                break;\n              case m.UFIActionType.DELETE_COMMENT:\n                ra(cb);\n                break;\n              case m.UFIActionType.LIVE_DELETE_COMMENT:\n                sa(cb);\n                break;\n              case m.UFIActionType.UNDO_DELETE_COMMENT:\n                ta(cb);\n                break;\n              case m.UFIActionType.REMOVE_PREVIEW:\n                ua(cb);\n                break;\n              case m.UFIActionType.COMMENT_SET_SPAM:\n                va(cb);\n                break;\n              case m.UFIActionType.CONFIRM_COMMENT_REMOVAL:\n                wa(cb);\n                break;\n              case m.UFIActionType.TRANSLATE_COMMENT:\n                oa(cb);\n                break;\n            };\n        ;\n        };\n    ;\n    };\n;\n    function la(ab, bb, cb) {\n        var db = bb.range, eb = bb.values;\n        if (!db) {\n            v.error(\"nullrange\", {\n                target: ab,\n                commentList: bb\n            });\n            return;\n        }\n    ;\n    ;\n        var fb = {\n        };\n        for (var gb = 0; ((gb < db.length)); gb++) {\n            fb[((db.offset + gb))] = ((eb[gb] || ca));\n        ;\n        };\n    ;\n        var hb, ib;\n        if (cb) {\n            hb = ea(ab, cb);\n            ib = ab;\n        }\n         else {\n            hb = ga(ab);\n            ib = bb.ftentidentifier;\n            if (((bb.count !== undefined))) {\n                z[ab] = bb.count;\n                aa[ab] = 0;\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n        hb.addResourcesAndExecute(fb);\n        l.didUpdateFeedback(ib);\n    };\n;\n    function ma(ab) {\n        ab.forEach(function(bb) {\n            z[bb.entidentifier] = bb.commentcount;\n            aa[bb.entidentifier] = 0;\n            l.didUpdateFeedback(bb.entidentifier);\n        });\n    };\n;\n    function na(ab) {\n        var bb = za.getComment(ab.commentid);\n        if (bb) {\n            var cb = {\n            }, db = ((ab.clientid && g.isExistingClientID(ab.clientid)));\n            if (!db) {\n                cb.hasviewerliked = ab.viewerliked;\n                cb.likecount = ab.likecount;\n            }\n        ;\n        ;\n            cb.likeconfirmhash = s(0, 1024);\n            ya(ab.commentid, cb);\n        }\n    ;\n    ;\n    };\n;\n    function oa(ab) {\n        var bb = ab.commentid, cb = za.getComment(ab.commentid);\n        if (cb) {\n            ya(bb, {\n                translatedtext: ab.translatedtext\n            });\n        }\n    ;\n    ;\n    };\n;\n    function pa(ab) {\n        var bb = {\n            reportLink: ab.reportLink,\n            commenterIsFOF: ab.commenterIsFOF,\n            userIsMinor: ab.userIsMinor\n        };\n        if (ab.undoData) {\n            bb.undoData = ab.undoData;\n        }\n    ;\n    ;\n        return bb;\n    };\n;\n    function qa(ab, bb) {\n        if (ab) {\n            if (((bb !== undefined))) {\n                var cb = ((((aa[ab] || 0)) + ((bb ? 1 : -1))));\n                aa[ab] = Math.max(cb, 0);\n            }\n        ;\n        ;\n            var db = za.getComment(ab);\n            if (db) {\n                var eb = {\n                    replycount: za.getDisplayedCommentCount(ab)\n                };\n                ya(ab, eb);\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n    };\n;\n    function ra(ab) {\n        var bb = za.getComment(ab.commentid);\n        if (((bb.JSBNG__status !== m.UFIStatus.DELETED))) {\n            var cb = ((bb.parentcommentid || bb.ftentidentifier));\n            if (((bb.JSBNG__status === m.UFIStatus.FAILED_ADD))) {\n                qa(cb);\n            }\n             else qa(cb, true);\n        ;\n        ;\n        }\n    ;\n    ;\n        xa(bb, m.UFIStatus.DELETED);\n    };\n;\n    function sa(ab) {\n        var bb = za.getComment(ab.commentid);\n        if (((bb && ((bb.JSBNG__status !== m.UFIStatus.DELETED))))) {\n            xa(bb, m.UFIStatus.LIVE_DELETED);\n        }\n    ;\n    ;\n    };\n;\n    function ta(ab) {\n        var bb = za.getComment(ab.commentid);\n        if (((bb.JSBNG__status === m.UFIStatus.DELETED))) {\n            var cb = ((bb.parentcommentid || bb.ftentidentifier));\n            qa(cb, false);\n        }\n    ;\n    ;\n        xa(bb, m.UFIStatus.PENDING_UNDO_DELETE);\n    };\n;\n    function ua(ab) {\n        ya(ab.commentid, {\n            attachment: null\n        });\n    };\n;\n    function va(ab) {\n        var bb = za.getComment(ab.commentid), cb = ((ab.shouldHideAsSpam ? m.UFIStatus.SPAM_DISPLAY : null));\n        xa(bb, cb);\n    };\n;\n    function wa(ab) {\n        ya(ab.commentid, pa(ab));\n    };\n;\n    function xa(ab, bb) {\n        ya(ab.id, {\n            priorstatus: ab.JSBNG__status,\n            JSBNG__status: bb\n        });\n    };\n;\n    function ya(ab, bb) {\n        var cb = ((za.getComment(ab) || new h({\n        })));\n        za.setComment(ab, h.set(cb, bb));\n        l.didUpdateComment(cb.id);\n        l.didUpdateFeedback(cb.ftentidentifier);\n    };\n;\n    var za = {\n        getComments: function(ab) {\n            var bb = {\n            };\n            for (var cb = 0; ((cb < ab.length)); cb++) {\n                bb[ab[cb]] = za.getComment(ab[cb]);\n            ;\n            };\n        ;\n            return bb;\n        },\n        getComment: function(ab) {\n            return w[da(ab)];\n        },\n        setComment: function(ab, bb) {\n            w[da(ab)] = bb;\n        },\n        resetFeedbackTarget: function(ab) {\n            var bb = fa(ab), cb = {\n            };\n            bb.forEach(function(eb) {\n                var fb = eb.getAllResources();\n                {\n                    var fin91keys = ((window.top.JSBNG_Replay.forInKeys)((fb))), fin91i = (0);\n                    var gb;\n                    for (; (fin91i < fin91keys.length); (fin91i++)) {\n                        ((gb) = (fin91keys[fin91i]));\n                        {\n                            var hb = fb[gb];\n                            cb[hb] = 1;\n                        };\n                    };\n                };\n            ;\n            });\n            {\n                var fin92keys = ((window.top.JSBNG_Replay.forInKeys)((cb))), fin92i = (0);\n                var db;\n                for (; (fin92i < fin92keys.length); (fin92i++)) {\n                    ((db) = (fin92keys[fin92i]));\n                    {\n                        delete w[da(db)];\n                    ;\n                    };\n                };\n            };\n        ;\n            ha(ab);\n        },\n        getCommentsInRange: function(ab, bb, cb, db, eb) {\n            var fb = ea(ab, cb);\n            n.getFeedbackTarget(ab, function(gb) {\n                var hb = [];\n                for (var ib = 0; ((ib < bb.length)); ib++) {\n                    hb.push(((bb.offset + ib)));\n                ;\n                };\n            ;\n                var jb = function(pb) {\n                    var qb = [], rb = bb.offset, sb = ((((bb.offset + bb.length)) - 1));\n                    for (var tb = 0; ((tb < bb.length)); tb++) {\n                        var ub = ((gb.isranked ? ((sb - tb)) : ((rb + tb))));\n                        if (((pb[ub] != ca))) {\n                            var vb = this.getComment(pb[ub]);\n                            if (vb) {\n                                qb.push(vb);\n                            }\n                        ;\n                        ;\n                        }\n                    ;\n                    ;\n                    };\n                ;\n                    eb(qb);\n                }, kb = fb.getUnavailableResourcesFromRequest(hb);\n                if (kb.length) {\n                    var lb = Math.min.apply(Math, kb), mb = Math.max.apply(Math, kb), nb = lb, ob = ((((mb - lb)) + 1));\n                    k.trySend(\"/ajax/ufi/comment_fetch.php\", {\n                        ft_ent_identifier: gb.entidentifier,\n                        viewas: db,\n                        source: null,\n                        offset: nb,\n                        length: ob,\n                        orderingmode: cb\n                    });\n                }\n                 else fb.deferredExecuteOrEnqueue(hb).addCallback(jb, this);\n            ;\n            ;\n            }.bind(this));\n        },\n        getRepliesInRanges: function(ab, bb, cb) {\n            var db = {\n            }, eb = {\n            }, fb = {\n            }, gb = false;\n            n.getFeedbackTarget(ab, function(hb) {\n                {\n                    var fin93keys = ((window.top.JSBNG_Replay.forInKeys)((bb))), fin93i = (0);\n                    var ib;\n                    for (; (fin93i < fin93keys.length); (fin93i++)) {\n                        ((ib) = (fin93keys[fin93i]));\n                        {\n                            var jb = ga(ib), kb = bb[ib], lb = [];\n                            for (var mb = 0; ((mb < kb.length)); mb++) {\n                                lb.push(((kb.offset + mb)));\n                            ;\n                            };\n                        ;\n                            db[ib] = jb.executeOrEnqueue(lb, function(wb) {\n                                var xb = [];\n                                for (var yb = 0; ((yb < kb.length)); yb++) {\n                                    var zb = ((kb.offset + yb));\n                                    if (((wb[zb] != ca))) {\n                                        var ac = this.getComment(wb[zb]);\n                                        if (ac) {\n                                            xb.push(ac);\n                                        }\n                                    ;\n                                    ;\n                                    }\n                                ;\n                                ;\n                                };\n                            ;\n                                eb[ib] = xb;\n                            }.bind(this));\n                            fb[ib] = jb.getUnavailableResources(db[ib]);\n                            if (fb[ib].length) {\n                                gb = true;\n                                jb.unsubscribe(db[ib]);\n                            }\n                        ;\n                        ;\n                        };\n                    };\n                };\n            ;\n                if (!gb) {\n                    cb(eb);\n                }\n                 else {\n                    var nb = [], ob = [], pb = [];\n                    {\n                        var fin94keys = ((window.top.JSBNG_Replay.forInKeys)((fb))), fin94i = (0);\n                        var qb;\n                        for (; (fin94i < fin94keys.length); (fin94i++)) {\n                            ((qb) = (fin94keys[fin94i]));\n                            {\n                                var rb = fb[qb];\n                                if (rb.length) {\n                                    var sb = Math.min.apply(Math, rb), tb = Math.max.apply(Math, rb), ub = sb, vb = ((((tb - sb)) + 1));\n                                    nb.push(qb);\n                                    ob.push(ub);\n                                    pb.push(vb);\n                                }\n                            ;\n                            ;\n                            };\n                        };\n                    };\n                ;\n                    k.trySend(\"/ajax/ufi/reply_fetch.php\", {\n                        ft_ent_identifier: hb.entidentifier,\n                        parent_comment_ids: nb,\n                        source: null,\n                        offsets: ob,\n                        lengths: pb\n                    });\n                }\n            ;\n            ;\n            }.bind(this));\n            return db;\n        },\n        getCommentCount: function(ab) {\n            return ((z[ab] || 0));\n        },\n        getDeletedCount: function(ab) {\n            return ((aa[ab] || 0));\n        },\n        getDisplayedCommentCount: function(ab) {\n            return ((((z[ab] || 0)) - ((aa[ab] || 0))));\n        },\n        _dump: function() {\n            var ab = {\n                _comments: w,\n                _commentLists: x,\n                _replyLists: y,\n                _commentCounts: z,\n                _deletedCounts: aa,\n                _localIDMap: ba\n            };\n            return JSON.stringify(ab);\n        }\n    };\n    k.registerEndpoints({\n        \"/ajax/ufi/comment_fetch.php\": {\n            mode: k.IMMEDIATE,\n            handler: l.handleUpdate.bind(l, m.UFIPayloadSourceType.ENDPOINT_COMMENT_FETCH)\n        },\n        \"/ajax/ufi/reply_fetch.php\": {\n            mode: k.IMMEDIATE,\n            handler: l.handleUpdate.bind(l, m.UFIPayloadSourceType.ENDPOINT_COMMENT_FETCH)\n        }\n    });\n    l.subscribe(\"update-comments\", function(ab, bb) {\n        if (((bb.comments && bb.comments.length))) {\n            ia(bb.comments, bb.payloadsource);\n        }\n    ;\n    ;\n    });\n    l.subscribe(\"update-actions\", function(ab, bb) {\n        if (((bb.actions && bb.actions.length))) {\n            ka(bb.actions);\n        }\n    ;\n    ;\n    });\n    l.subscribe(\"update-comment-lists\", function(ab, bb) {\n        var cb = bb.commentlists;\n        if (((cb && Object.keys(cb).length))) {\n            if (cb.comments) {\n                {\n                    var fin95keys = ((window.top.JSBNG_Replay.forInKeys)((cb.comments))), fin95i = (0);\n                    var db;\n                    for (; (fin95i < fin95keys.length); (fin95i++)) {\n                        ((db) = (fin95keys[fin95i]));\n                        {\n                            {\n                                var fin96keys = ((window.top.JSBNG_Replay.forInKeys)((cb.comments[db]))), fin96i = (0);\n                                var eb;\n                                for (; (fin96i < fin96keys.length); (fin96i++)) {\n                                    ((eb) = (fin96keys[fin96i]));\n                                    {\n                                        la(db, cb.comments[db][eb], eb);\n                                    ;\n                                    };\n                                };\n                            };\n                        ;\n                        };\n                    };\n                };\n            }\n        ;\n        ;\n            if (cb.replies) {\n                {\n                    var fin97keys = ((window.top.JSBNG_Replay.forInKeys)((cb.replies))), fin97i = (0);\n                    var fb;\n                    for (; (fin97i < fin97keys.length); (fin97i++)) {\n                        ((fb) = (fin97keys[fin97i]));\n                        {\n                            la(fb, cb.replies[fb]);\n                        ;\n                        };\n                    };\n                };\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n    });\n    l.subscribe(\"update-feedback\", function(ab, bb) {\n        var cb = bb.feedbacktargets;\n        if (((cb && cb.length))) {\n            ma(cb);\n        }\n    ;\n    ;\n    });\n    e.exports = za;\n});\n__d(\"UFILikeLink.react\", [\"React\",\"TrackingNodes\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"React\"), h = b(\"TrackingNodes\"), i = b(\"tx\"), j = g.createClass({\n        displayName: \"UFILikeLink\",\n        render: function() {\n            var k = ((this.props.likeAction ? \"Like\" : \"Unlike\")), l = h.getTrackingInfo(((this.props.likeAction ? h.types.LIKE_LINK : h.types.UNLIKE_LINK))), m = ((this.props.likeAction ? \"Like this\" : \"Unlike this\"));\n            return (g.DOM.a({\n                className: \"UFILikeLink\",\n                href: \"#\",\n                role: \"button\",\n                \"aria-live\": \"polite\",\n                title: m,\n                onClick: this.props.onClick,\n                \"data-ft\": l\n            }, k));\n        }\n    });\n    e.exports = j;\n});\n__d(\"UFISubscribeLink.react\", [\"React\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"React\"), h = b(\"tx\"), i = g.createClass({\n        displayName: \"UFISubscribeLink\",\n        render: function() {\n            var j = ((this.props.subscribeAction ? \"Follow Post\" : \"Unfollow Post\")), k = ((this.props.subscribeAction ? \"Get notified when someone comments\" : \"Stop getting notified when someone comments\"));\n            return (g.DOM.a({\n                className: \"UFISubscribeLink\",\n                href: \"#\",\n                role: \"button\",\n                \"aria-live\": \"polite\",\n                title: k,\n                onClick: this.props.onClick\n            }, j));\n        }\n    });\n    e.exports = i;\n});\n__d(\"ProfileBrowserLink\", [\"URI\",], function(a, b, c, d, e, f) {\n    var g = b(\"URI\"), h = \"/ajax/browser/dialog/\", i = \"/browse/\", j = function(l, m, n) {\n        return new g(((l + m))).setQueryData(n);\n    }, k = {\n        constructPageURI: function(l, m) {\n            return j(i, l, m);\n        },\n        constructDialogURI: function(l, m) {\n            return j(h, l, m);\n        }\n    };\n    e.exports = k;\n});\n__d(\"ProfileBrowserTypes\", [], function(a, b, c, d, e, f) {\n    var g = {\n        LIKES: \"likes\",\n        GROUP_MESSAGE_VIEWERS: \"group_message_viewers\",\n        MUTUAL_FRIENDS: \"mutual_friends\"\n    };\n    e.exports = g;\n});\n__d(\"UFITimelineBlingBox.react\", [\"ProfileBrowserLink\",\"ProfileBrowserTypes\",\"React\",\"UFIBlingItem.react\",\"URI\",\"cx\",\"fbt\",], function(a, b, c, d, e, f) {\n    var g = b(\"ProfileBrowserLink\"), h = b(\"ProfileBrowserTypes\"), i = b(\"React\"), j = b(\"UFIBlingItem.react\"), k = b(\"URI\"), l = b(\"cx\"), m = b(\"fbt\"), n = i.createClass({\n        displayName: \"UFITimelineBlingBox\",\n        render: function() {\n            var o = [];\n            if (((this.props.likes && this.props.enableShowLikes))) {\n                var p = this._getProfileBrowserURI(), q = \"See who likes this\", r = i.DOM.a({\n                    ajaxify: p.dialog,\n                    className: this._getItemClassName(o),\n                    \"data-ft\": this.props[\"data-ft\"],\n                    \"data-gt\": this.props[\"data-gt\"],\n                    \"data-hover\": \"tooltip\",\n                    \"data-tooltip-alignh\": \"right\",\n                    \"data-tooltip-uri\": this._getLikeToolTipURI(),\n                    href: p.page,\n                    rel: \"dialog\",\n                    role: \"button\",\n                    title: q\n                }, j({\n                    contextArgs: this.props.contextArgs,\n                    count: this.props.likes,\n                    iconClassName: \"UFIBlingBoxTimelineLikeIcon\"\n                }));\n                o.push(r);\n            }\n        ;\n        ;\n            if (((this.props.comments && this.props.enableShowComments))) {\n                var s = \"Show comments\", t = i.DOM.a({\n                    \"aria-label\": s,\n                    className: this._getItemClassName(o),\n                    \"data-ft\": this.props[\"data-ft\"],\n                    \"data-hover\": \"tooltip\",\n                    \"data-tooltip-alignh\": \"right\",\n                    href: \"#\",\n                    onClick: this.props.commentOnClick\n                }, j({\n                    contextArgs: this.props.contextArgs,\n                    count: this.props.comments,\n                    iconClassName: \"UFIBlingBoxTimelineCommentIcon\"\n                }));\n                o.push(t);\n            }\n        ;\n        ;\n            if (this.props.reshares) {\n                var u = \"Show shares\", v = this._getShareViewURI(), w = i.DOM.a({\n                    ajaxify: v.dialog,\n                    \"aria-label\": u,\n                    className: this._getItemClassName(o),\n                    \"data-ft\": this.props[\"data-ft\"],\n                    \"data-hover\": \"tooltip\",\n                    \"data-tooltip-alignh\": \"right\",\n                    href: v.page,\n                    rel: \"async\"\n                }, j({\n                    contextArgs: this.props.contextArgs,\n                    count: this.props.reshares,\n                    iconClassName: \"UFIBlingBoxTimelineReshareIcon\"\n                }));\n                o.push(w);\n            }\n        ;\n        ;\n            return (i.DOM.span(null, o));\n        },\n        _getItemClassName: function(o) {\n            return ((((((o.length > 0)) ? \"mls\" : \"\")) + ((\" \" + \"UFIBlingBoxTimelineItem\"))));\n        },\n        _getLikeToolTipURI: function() {\n            if (this.props.feedbackFBID) {\n                var o = new k(\"/ajax/timeline/likestooltip.php\").setQueryData({\n                    obj_fbid: this.props.feedbackFBID\n                });\n                return o.toString();\n            }\n             else return null\n        ;\n        },\n        _getProfileBrowserURI: function() {\n            if (this.props.feedbackFBID) {\n                var o = h.LIKES, p = {\n                    id: this.props.feedbackFBID\n                }, q = g.constructDialogURI(o, p), r = g.constructPageURI(o, p), s = {\n                    dialog: q.toString(),\n                    page: r.toString()\n                };\n                return s;\n            }\n        ;\n        ;\n        },\n        _getShareViewURI: function() {\n            if (this.props.feedbackFBID) {\n                var o = new k(\"/ajax/shares/view\").setQueryData({\n                    target_fbid: this.props.feedbackFBID\n                }), p = new k(\"/shares/view\").setSubdomain(\"www\").setQueryData({\n                    id: this.props.feedbackFBID\n                }), q = {\n                    dialog: o.toString(),\n                    page: p.toString()\n                };\n                return q;\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = n;\n});\n__d(\"UFIUserActions\", [\"AsyncResponse\",\"CLoggerX\",\"ClientIDs\",\"ImmutableObject\",\"JSLogger\",\"Nectar\",\"UFICentralUpdates\",\"UFIComments\",\"UFIConstants\",\"UFIFeedbackTargets\",\"MercuryServerDispatcher\",\"collectDataAttributes\",\"copyProperties\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncResponse\"), h = b(\"CLoggerX\"), i = b(\"ClientIDs\"), j = b(\"ImmutableObject\"), k = b(\"JSLogger\"), l = b(\"Nectar\"), m = b(\"UFICentralUpdates\"), n = b(\"UFIComments\"), o = b(\"UFIConstants\"), p = b(\"UFIFeedbackTargets\"), q = b(\"MercuryServerDispatcher\"), r = b(\"collectDataAttributes\"), s = b(\"copyProperties\"), t = b(\"tx\"), u = k.create(\"UFIUserActions\"), v = {\n        BAN: \"ban\",\n        UNDO_BAN: \"undo_ban\"\n    }, w = {\n        changeCommentLike: function(ka, la, ma) {\n            var na = n.getComment(ka);\n            if (((na.hasviewerliked != la))) {\n                var oa = x(ma.target), pa = ((la ? 1 : -1)), qa = {\n                    commentid: ka,\n                    actiontype: o.UFIActionType.COMMENT_LIKE,\n                    viewerliked: la,\n                    likecount: ((na.likecount + pa))\n                };\n                m.handleUpdate(o.UFIPayloadSourceType.USER_ACTION, {\n                    actions: [qa,]\n                });\n                q.trySend(\"/ajax/ufi/comment_like.php\", s({\n                    comment_id: ka,\n                    legacy_id: na.legacyid,\n                    like_action: la,\n                    ft_ent_identifier: na.ftentidentifier,\n                    source: ma.source,\n                    client_id: i.getNewClientID()\n                }, oa));\n            }\n        ;\n        ;\n        },\n        addComment: function(ka, la, ma, na) {\n            p.getFeedbackTarget(ka, function(oa) {\n                var pa = x(na.target), qa = i.getNewClientID();\n                if (!oa.actorforpost) {\n                    return;\n                }\n            ;\n            ;\n                var ra = {\n                    ftentidentifier: ka,\n                    body: {\n                        text: la\n                    },\n                    author: oa.actorforpost,\n                    id: qa,\n                    islocal: true,\n                    ufiinstanceid: na.ufiinstanceid,\n                    likecount: 0,\n                    hasviewerliked: false,\n                    parentcommentid: na.replyid,\n                    photo_comment: na.attachedphoto,\n                    timestamp: {\n                        time: JSBNG__Date.now(),\n                        text: \"a few seconds ago\"\n                    }\n                }, sa = {\n                    actiontype: o.UFIActionType.SUBSCRIBE_ACTION,\n                    actorid: oa.actorforpost,\n                    hasviewersubscribed: true,\n                    entidentifier: ka\n                };\n                m.handleUpdate(o.UFIPayloadSourceType.USER_ACTION, {\n                    comments: [ra,],\n                    actions: [sa,]\n                });\n                var ta = null;\n                if (na.replyid) {\n                    ta = (n.getComment(na.replyid)).fbid;\n                }\n            ;\n            ;\n                var ua = h.getCLParamsForTarget(na.target, ta);\n                q.trySend(\"/ajax/ufi/add_comment.php\", s({\n                    ft_ent_identifier: oa.entidentifier,\n                    comment_text: ma,\n                    source: na.source,\n                    client_id: qa,\n                    reply_fbid: ta,\n                    parent_comment_id: na.replyid,\n                    timeline_log_data: na.timelinelogdata,\n                    rootid: na.rootid,\n                    clp: ua,\n                    attached_photo_fbid: ((na.attachedphoto ? na.attachedphoto.fbid : 0)),\n                    giftoccasion: na.giftoccasion\n                }, pa));\n            });\n        },\n        editComment: function(ka, la, ma, na) {\n            var oa = x(na.target), pa = n.getComment(ka);\n            pa = j.set(pa, {\n                JSBNG__status: o.UFIStatus.PENDING_EDIT,\n                body: {\n                    text: la\n                },\n                timestamp: {\n                    time: JSBNG__Date.now(),\n                    text: \"a few seconds ago\"\n                },\n                originalTimestamp: pa.timestamp.time,\n                editnux: null,\n                attachment: null\n            });\n            m.handleUpdate(o.UFIPayloadSourceType.USER_ACTION, {\n                comments: [pa,]\n            });\n            q.trySend(\"/ajax/ufi/edit_comment.php\", s({\n                ft_ent_identifier: pa.ftentidentifier,\n                comment_text: ma,\n                source: na.source,\n                comment_id: pa.id,\n                parent_comment_id: pa.parentcommentid,\n                attached_photo_fbid: ((na.attachedPhoto ? na.attachedPhoto.fbid : 0))\n            }, oa));\n        },\n        translateComment: function(ka, la) {\n            q.trySend(\"/ajax/ufi/translate_comment.php\", {\n                ft_ent_identifier: ka.ftentidentifier,\n                comment_ids: [ka.id,],\n                source: la.source\n            });\n        },\n        setHideAsSpam: function(ka, la, ma) {\n            var na = x(ma.target), oa = n.getComment(ka), pa = {\n                commentid: ka,\n                actiontype: o.UFIActionType.COMMENT_SET_SPAM,\n                shouldHideAsSpam: la\n            };\n            m.handleUpdate(o.UFIPayloadSourceType.USER_ACTION, {\n                actions: [pa,]\n            });\n            q.trySend(\"/ajax/ufi/comment_spam.php\", s({\n                comment_id: ka,\n                spam_action: la,\n                ft_ent_identifier: oa.ftentidentifier,\n                source: ma.source\n            }, na));\n        },\n        removeComment: function(ka, la) {\n            var ma = x(la.target), na = n.getComment(ka), oa = {\n                actiontype: o.UFIActionType.DELETE_COMMENT,\n                commentid: ka,\n                oneclick: la.oneclick\n            };\n            m.handleUpdate(o.UFIPayloadSourceType.USER_ACTION, {\n                actions: [oa,]\n            });\n            q.trySend(\"/ajax/ufi/delete_comment.php\", s({\n                comment_id: na.id,\n                comment_legacyid: na.legacyid,\n                ft_ent_identifier: na.ftentidentifier,\n                one_click: la.oneclick,\n                source: la.source,\n                client_id: i.getNewClientID(),\n                timeline_log_data: la.timelinelogdata\n            }, ma));\n        },\n        undoRemoveComment: function(ka, la, ma) {\n            var na = n.getComment(ka);\n            if (!na.undoData) {\n                u.error(\"noundodata\", {\n                    comment: ka\n                });\n                return;\n            }\n        ;\n        ;\n            var oa = x(ma.target), pa = {\n                actiontype: o.UFIActionType.UNDO_DELETE_COMMENT,\n                commentid: ka\n            };\n            m.handleUpdate(o.UFIPayloadSourceType.USER_ACTION, {\n                actions: [pa,]\n            });\n            var qa = na.undoData;\n            qa.page_admin = la;\n            var ra = s(oa, qa);\n            q.trySend(\"/ajax/ufi/undo_delete_comment.php\", ra);\n        },\n        banUser: function(ka, la, ma, na) {\n            var oa = ((ma ? v.BAN : v.UNDO_BAN));\n            q.trySend(\"/ajax/ufi/ban_user.php\", {\n                page_id: la,\n                commenter_id: ka.author,\n                action: oa,\n                comment_id: ka.id,\n                client_side: true\n            });\n        },\n        changeLike: function(ka, la, ma) {\n            p.getFeedbackTarget(ka, function(na) {\n                var oa = x(ma.target);\n                if (((na.hasviewerliked !== la))) {\n                    var pa = ((la ? 1 : -1)), qa = {\n                        actiontype: o.UFIActionType.LIKE_ACTION,\n                        actorid: na.actorforpost,\n                        hasviewerliked: la,\n                        likecount: ((na.likecount + pa)),\n                        entidentifier: ka,\n                        likesentences: {\n                            current: na.likesentences.alternate,\n                            alternate: na.likesentences.current\n                        }\n                    };\n                    m.handleUpdate(o.UFIPayloadSourceType.USER_ACTION, {\n                        actions: [qa,]\n                    });\n                    q.trySend(\"/ajax/ufi/like.php\", s({\n                        like_action: la,\n                        ft_ent_identifier: ka,\n                        source: ma.source,\n                        client_id: i.getNewClientID(),\n                        rootid: ma.rootid,\n                        giftoccasion: ma.giftoccasion\n                    }, oa));\n                }\n            ;\n            ;\n            });\n        },\n        changeSubscribe: function(ka, la, ma) {\n            p.getFeedbackTarget(ka, function(na) {\n                var oa = x(ma.target);\n                if (((na.hasviewersubscribed !== la))) {\n                    var pa = {\n                        actiontype: o.UFIActionType.SUBSCRIBE_ACTION,\n                        actorid: na.actorforpost,\n                        hasviewersubscribed: la,\n                        entidentifier: ka\n                    };\n                    m.handleUpdate(o.UFIPayloadSourceType.USER_ACTION, {\n                        actions: [pa,]\n                    });\n                    q.trySend(\"/ajax/ufi/subscribe.php\", s({\n                        subscribe_action: la,\n                        ft_ent_identifier: ka,\n                        source: ma.source,\n                        client_id: i.getNewClientID(),\n                        rootid: ma.rootid,\n                        comment_expand_mode: ma.commentexpandmode\n                    }, oa));\n                }\n            ;\n            ;\n            });\n        },\n        fetchSpamComments: function(ka, la, ma, na) {\n            q.trySend(\"/ajax/ufi/id_comment_fetch.php\", {\n                ft_ent_identifier: ka,\n                viewas: na,\n                comment_ids: la,\n                parent_comment_id: ma,\n                source: null\n            });\n        },\n        removePreview: function(ka, la) {\n            var ma = x(la.target), na = {\n                commentid: ka.id,\n                actiontype: o.UFIActionType.REMOVE_PREVIEW\n            };\n            m.handleUpdate(o.UFIPayloadSourceType.USER_ACTION, {\n                actions: [na,]\n            });\n            q.trySend(\"/ajax/ufi/remove_preview.php\", s({\n                comment_id: ka.id,\n                ft_ent_identifier: ka.ftentidentifier,\n                source: la.source\n            }, ma));\n        }\n    };\n    function x(ka) {\n        if (!ka) {\n            return {\n                ft: {\n                }\n            };\n        }\n    ;\n    ;\n        var la = {\n            ft: r(ka, [\"ft\",]).ft\n        };\n        l.addModuleData(la, ka);\n        return la;\n    };\n;\n    function y(ka) {\n        var la = ka.request.data;\n        g.defaultErrorHandler(ka);\n        var ma = ((la.client_id || la.comment_id)), na = n.getComment(ma), oa = ((((na.JSBNG__status === o.UFIStatus.PENDING_EDIT)) ? o.UFIStatus.FAILED_EDIT : o.UFIStatus.FAILED_ADD));\n        na = j.setDeep(na, {\n            JSBNG__status: oa,\n            allowRetry: z(ka),\n            body: {\n                mentionstext: la.comment_text\n            }\n        });\n        m.handleUpdate(o.UFIPayloadSourceType.USER_ACTION, {\n            comments: [na,]\n        });\n    };\n;\n    function z(ka) {\n        var la = ka.getError();\n        if (((la === 1404102))) {\n            return false;\n        }\n    ;\n    ;\n        if (ka.silentError) {\n            return true;\n        }\n    ;\n    ;\n        if (((((la === 1357012)) || ((la === 1357006))))) {\n            return false;\n        }\n    ;\n    ;\n        return true;\n    };\n;\n    function aa(ka) {\n        var la = ka.request.data, ma = la.comment_id, na = n.getComment(ma);\n        na = j.set(na, {\n            JSBNG__status: ((na.priorstatus || null)),\n            priorstatus: undefined\n        });\n        m.handleUpdate(o.UFIPayloadSourceType.USER_ACTION, {\n            comments: [na,]\n        });\n    };\n;\n    function ba(ka) {\n        var la = ka.request.data, ma = la.comment_id, na = n.getComment(ma);\n        if (((la.like_action === na.hasviewerliked))) {\n            var oa = ((na.hasviewerliked ? -1 : 1)), pa = {\n                commentid: ma,\n                actiontype: o.UFIActionType.COMMENT_LIKE,\n                viewerliked: !na.hasviewerliked,\n                likecount: ((na.likecount + oa))\n            };\n            m.handleUpdate(o.UFIPayloadSourceType.USER_ACTION, {\n                actions: [pa,]\n            });\n        }\n    ;\n    ;\n        g.defaultErrorHandler(ka);\n    };\n;\n    function ca(ka) {\n        var la = ka.request.data, ma = la.ft_ent_identifier;\n        p.getFeedbackTarget(ma, function(na) {\n            if (((na.hasviewerliked === la.like_action))) {\n                var oa = ((na.hasviewerliked ? -1 : 1)), pa = {\n                    actiontype: o.UFIActionType.LIKE_ACTION,\n                    actorid: na.actorforpost,\n                    hasviewerliked: !na.hasviewerliked,\n                    likecount: ((na.likecount + oa)),\n                    entidentifier: ma,\n                    likesentences: {\n                        current: na.likesentences.alternate,\n                        alternate: na.likesentences.current\n                    }\n                };\n                m.handleUpdate(o.UFIPayloadSourceType.USER_ACTION, {\n                    actions: [pa,]\n                });\n            }\n        ;\n        ;\n        });\n        g.defaultErrorHandler(ka);\n    };\n;\n    function da(ka) {\n        var la = ka.request.data, ma = la.ft_ent_identifier;\n        p.getFeedbackTarget(ma, function(na) {\n            if (((na.hasviewersubscribed === la.subscribe_action))) {\n                var oa = {\n                    actiontype: o.UFIActionType.SUBSCRIBE_ACTION,\n                    actorid: na.actorforpost,\n                    hasviewersubscribed: !na.hasviewersubscribed,\n                    entidentifier: ma\n                };\n                m.handleUpdate(o.UFIPayloadSourceType.USER_ACTION, {\n                    actions: [oa,]\n                });\n            }\n        ;\n        ;\n        });\n        g.defaultErrorHandler(ka);\n    };\n;\n    var ea = function(ka) {\n        return m.handleUpdate.bind(m, ka);\n    }, fa = o.UFIPayloadSourceType;\n    q.registerEndpoints({\n        \"/ajax/ufi/comment_like.php\": {\n            mode: q.BATCH_CONDITIONAL,\n            handler: ea(fa.ENDPOINT_COMMENT_LIKE),\n            error_handler: ba,\n            batch_if: ga,\n            batch_function: ja\n        },\n        \"/ajax/ufi/comment_spam.php\": {\n            mode: q.IMMEDIATE,\n            handler: ea(fa.ENDPOINT_COMMENT_SPAM),\n            error_handler: aa\n        },\n        \"/ajax/ufi/add_comment.php\": {\n            mode: q.IMMEDIATE,\n            handler: ea(fa.ENDPOINT_ADD_COMMENT),\n            error_handler: y\n        },\n        \"/ajax/ufi/delete_comment.php\": {\n            mode: q.IMMEDIATE,\n            handler: ea(fa.ENDPOINT_DELETE_COMMENT),\n            error_handler: aa\n        },\n        \"/ajax/ufi/undo_delete_comment.php\": {\n            mode: q.IMMEDIATE,\n            handler: ea(fa.ENDPOINT_UNDO_DELETE_COMMENT),\n            error_handler: aa\n        },\n        \"/ajax/ufi/ban_user.php\": {\n            mode: q.IMMEDIATE,\n            handler: ea(fa.ENDPOINT_BAN)\n        },\n        \"/ajax/ufi/edit_comment.php\": {\n            mode: q.IMMEDIATE,\n            handler: ea(fa.ENDPOINT_EDIT_COMMENT),\n            error_handler: y\n        },\n        \"/ajax/ufi/like.php\": {\n            mode: q.BATCH_CONDITIONAL,\n            handler: ea(fa.ENDPOINT_LIKE),\n            error_handler: ca,\n            batch_if: ha,\n            batch_function: ja\n        },\n        \"/ajax/ufi/subscribe.php\": {\n            mode: q.BATCH_CONDITIONAL,\n            handler: ea(fa.ENDPOINT_SUBSCRIBE),\n            error_handler: da,\n            batch_if: ia,\n            batch_function: ja\n        },\n        \"/ajax/ufi/id_comment_fetch.php\": {\n            mode: q.IMMEDIATE,\n            handler: ea(fa.ENDPOINT_ID_COMMENT_FETCH)\n        },\n        \"/ajax/ufi/remove_preview.php\": {\n            mode: q.IMMEDIATE,\n            handler: ea(fa.ENDPOINT_REMOVE_PREVIEW)\n        },\n        \"/ajax/ufi/translate_comment.php\": {\n            mode: q.IMMEDIATE,\n            handler: ea(fa.ENDPOINT_TRANSLATE_COMMENT)\n        }\n    });\n    function ga(ka, la) {\n        return ((((ka && ((ka.ft_ent_identifier == la.ft_ent_identifier)))) && ((ka.comment_id == la.comment_id))));\n    };\n;\n    function ha(ka, la) {\n        return ((ka && ((ka.ft_ent_identifier == la.ft_ent_identifier))));\n    };\n;\n    function ia(ka, la) {\n        return ((ka && ((ka.ft_ent_identifier == la.ft_ent_identifier))));\n    };\n;\n    function ja(ka, la) {\n        return la;\n    };\n;\n    e.exports = w;\n});\n__d(\"UFIActionLinkController\", [\"Arbiter\",\"ClickTTIIdentifiers\",\"CSS\",\"DOMQuery\",\"Parent\",\"React\",\"TrackingNodes\",\"UFIBlingBox.react\",\"UFICentralUpdates\",\"UFIComments\",\"UFIConstants\",\"UFIFeedbackTargets\",\"UFILikeLink.react\",\"UFISubscribeLink.react\",\"UFITimelineBlingBox.react\",\"UFIUserActions\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ClickTTIIdentifiers\"), i = b(\"CSS\"), j = b(\"DOMQuery\"), k = b(\"Parent\"), l = b(\"React\"), m = b(\"TrackingNodes\"), n = b(\"UFIBlingBox.react\"), o = b(\"UFICentralUpdates\"), p = b(\"UFIComments\"), q = b(\"UFIConstants\"), r = b(\"UFIFeedbackTargets\"), s = b(\"UFILikeLink.react\"), t = b(\"UFISubscribeLink.react\"), u = b(\"UFITimelineBlingBox.react\"), v = b(\"UFIUserActions\"), w = b(\"copyProperties\");\n    function x(z, aa, ba) {\n        if (this._root) {\n            throw new Error(((\"UFIActionLinkController attempted to initialize when a root was\" + \" already present\")));\n        }\n    ;\n    ;\n        var ca = j.scry(z, aa)[0];\n        if (ca) {\n            var da = JSBNG__document.createElement(\"span\");\n            ca.parentNode.replaceChild(da, ca);\n            da.appendChild(ca);\n            if (((typeof ba === \"function\"))) {\n                ba(da);\n            }\n        ;\n        ;\n        }\n         else var ea = g.subscribe(\"PhotoSnowlift.DATA_CHANGE\", function() {\n            g.unsubscribe(ea);\n            x(z, aa, ba);\n        }, g.SUBSCRIBE_NEW)\n    ;\n    };\n;\n    var y = function(z, aa, ba) {\n        this._id = aa.ftentidentifier;\n        this._ftFBID = ba.targetfbid;\n        this._source = aa.source;\n        this._contextArgs = aa;\n        this._ufiRoot = z;\n        if (this._isSourceProfile(this._contextArgs.source)) {\n            this._attemptInitializeTimelineBling();\n        }\n         else this._attemptInitializeBling();\n    ;\n    ;\n        if (ba.viewercanlike) {\n            this._attemptInitializeLike();\n        }\n    ;\n    ;\n        if (ba.viewercansubscribetopost) {\n            this._attemptInitializeSubscribe();\n        }\n    ;\n    ;\n        o.subscribe(\"feedback-updated\", function(ca, da) {\n            var ea = da.updates;\n            if (((this._id in ea))) {\n                this.render();\n            }\n        ;\n        ;\n        }.bind(this));\n        o.subscribe(\"feedback-id-changed\", function(ca, da) {\n            var ea = da.updates;\n            if (((this._id in ea))) {\n                this._id = ea[this._id];\n            }\n        ;\n        ;\n        }.bind(this));\n    };\n    w(y.prototype, {\n        _attemptInitializeBling: function() {\n            x(this._ufiRoot, \"^form .uiBlingBox\", function(z) {\n                this._blingRoot = z;\n                if (this._dataReady) {\n                    this._renderBling();\n                }\n            ;\n            ;\n            }.bind(this));\n        },\n        _attemptInitializeTimelineBling: function() {\n            if (this._root) {\n                throw new Error(((\"UFIActionLinkController attempted to initialize when a root was\" + \" already present\")));\n            }\n        ;\n        ;\n            var z = j.scry(this._ufiRoot, \"^form .fbTimelineFeedbackActions span\")[0];\n            if (z) {\n                i.addClass(z, \"UFIBlingBoxTimeline\");\n                var aa = j.scry(z, \".fbTimelineFeedbackLikes\")[0];\n                this._enableShowLikes = ((aa ? true : false));\n                var ba = j.scry(z, \".fbTimelineFeedbackComments\")[0];\n                this._enableShowComments = ((ba ? true : false));\n            }\n        ;\n        ;\n            this._blingTimelineRoot = z;\n            if (this._dataReady) {\n                this._renderTimelineBling();\n            }\n        ;\n        ;\n        },\n        _attemptInitializeLike: function() {\n            x(this._ufiRoot, \"^form .like_link\", function(z) {\n                this._likeRoot = z;\n                if (this._dataReady) {\n                    this._renderLike();\n                }\n            ;\n            ;\n            }.bind(this));\n        },\n        _attemptInitializeSubscribe: function() {\n            x(this._ufiRoot, \"^form .unsub_link\", function(z) {\n                this._subscribeRoot = z;\n                if (this._dataReady) {\n                    this._renderSubscribe();\n                }\n            ;\n            ;\n            }.bind(this));\n        },\n        render: function() {\n            this._dataReady = true;\n            if (this._isSourceProfile(this._contextArgs.source)) {\n                this._renderTimelineBling();\n            }\n             else this._renderBling();\n        ;\n        ;\n            this._renderLike();\n            this._renderSubscribe();\n        },\n        _renderBling: function() {\n            if (this._blingRoot) {\n                r.getFeedbackTarget(this._id, function(z) {\n                    var aa = function(JSBNG__event) {\n                        var da = k.byTag(JSBNG__event.target, \"form\");\n                        i.toggleClass(da, \"collapsed_comments\");\n                        i.toggleClass(da, \"hidden_add_comment\");\n                        JSBNG__event.preventDefault();\n                    }.bind(this), ba = m.getTrackingInfo(m.types.BLINGBOX), ca = n({\n                        likes: z.likecount,\n                        comments: p.getDisplayedCommentCount(this._id),\n                        reshares: z.sharecount,\n                        permalink: z.permalink,\n                        contextArgs: this._contextArgs,\n                        onClick: aa,\n                        \"data-ft\": ba\n                    });\n                    this._blingBox = l.renderComponent(ca, this._blingRoot);\n                }.bind(this));\n            }\n        ;\n        ;\n        },\n        _renderTimelineBling: function() {\n            if (this._blingTimelineRoot) {\n                r.getFeedbackTarget(this._id, function(z) {\n                    var aa = m.getTrackingInfo(m.types.BLINGBOX), ba = h.getUserActionID(h.types.TIMELINE_SEE_LIKERS), ca = function(JSBNG__event) {\n                        var ea = k.byTag(JSBNG__event.target, \"form\");\n                        i.removeClass(ea, \"collapsed_comments\");\n                        var fa = j.scry(ea, \"a.UFIPagerLink\");\n                        if (fa.length) {\n                            fa[0].click();\n                        }\n                    ;\n                    ;\n                        JSBNG__event.preventDefault();\n                    }.bind(this), da = u({\n                        comments: p.getDisplayedCommentCount(this._id),\n                        commentOnClick: ca,\n                        contextArgs: this._contextArgs,\n                        \"data-ft\": aa,\n                        \"data-gt\": ba,\n                        enableShowComments: this._enableShowComments,\n                        enableShowLikes: this._enableShowLikes,\n                        feedbackFBID: this._ftFBID,\n                        likes: z.likecount,\n                        reshares: z.sharecount\n                    });\n                    l.renderComponent(da, this._blingTimelineRoot);\n                }.bind(this));\n            }\n        ;\n        ;\n        },\n        _renderLike: function() {\n            if (this._likeRoot) {\n                r.getFeedbackTarget(this._id, function(z) {\n                    var aa = !z.hasviewerliked, ba = function(JSBNG__event) {\n                        v.changeLike(this._id, aa, {\n                            source: this._source,\n                            target: JSBNG__event.target,\n                            rootid: this._contextArgs.rootid,\n                            giftoccasion: this._contextArgs.giftoccasion\n                        });\n                        JSBNG__event.preventDefault();\n                    }.bind(this), ca = s({\n                        onClick: ba,\n                        likeAction: aa\n                    });\n                    this._likeLink = l.renderComponent(ca, this._likeRoot);\n                }.bind(this));\n            }\n        ;\n        ;\n        },\n        _renderSubscribe: function() {\n            if (this._subscribeRoot) {\n                r.getFeedbackTarget(this._id, function(z) {\n                    var aa = !z.hasviewersubscribed, ba = function(JSBNG__event) {\n                        v.changeSubscribe(this._id, aa, {\n                            source: this._source,\n                            target: JSBNG__event.target,\n                            rootid: this._contextArgs.rootid,\n                            commentexpandmode: z.commentexpandmode\n                        });\n                        JSBNG__event.preventDefault();\n                    }.bind(this), ca = t({\n                        onClick: ba,\n                        subscribeAction: aa\n                    });\n                    this._subscribeLink = l.renderComponent(ca, this._subscribeRoot);\n                }.bind(this));\n            }\n        ;\n        ;\n        },\n        _isSourceProfile: function(z) {\n            return ((z === q.UFIFeedbackSourceType.PROFILE));\n        }\n    });\n    e.exports = y;\n});\n__d(\"MentionsInputUtils\", [], function(a, b, c, d, e, f) {\n    var g = {\n        generateDataFromTextWithEntities: function(h) {\n            var i = h.text, j = [];\n            ((h.ranges || [])).forEach(function(l) {\n                var m = l.entities[0];\n                if (!m.JSBNG__external) {\n                    j.push({\n                        uid: m.id,\n                        text: i.substr(l.offset, l.length),\n                        offset: l.offset,\n                        length: l.length,\n                        weakreference: !!m.weakreference\n                    });\n                }\n            ;\n            ;\n            });\n            var k = {\n                value: i,\n                mentions: j\n            };\n            return k;\n        }\n    };\n    e.exports = g;\n});\n__d(\"ClipboardPhotoUploader\", [\"ArbiterMixin\",\"AsyncRequest\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"ArbiterMixin\"), h = b(\"AsyncRequest\"), i = b(\"copyProperties\");\n    function j(k, l) {\n        this.uploadURIString = k;\n        this.data = l;\n    };\n;\n    i(j.prototype, g, {\n        handlePaste: function(JSBNG__event) {\n            if (!JSBNG__event.JSBNG__clipboardData) {\n                return;\n            }\n        ;\n        ;\n            var k = JSBNG__event.JSBNG__clipboardData.items;\n            if (!k) {\n                return;\n            }\n        ;\n        ;\n            for (var l = 0; ((l < k.length)); ++l) {\n                var m = k[l];\n                if (((((m.kind === \"file\")) && ((m.type.indexOf(\"image/\") !== -1))))) {\n                    var n = new JSBNG__FormData();\n                    n.append(\"pasted_file\", m.getAsFile());\n                    var o = new h();\n                    o.setURI(this.uploadURIString).setData(this.data).setRawData(n).setHandler(function(p) {\n                        this.inform(\"upload_success\", p);\n                    }.bind(this)).setErrorHandler(function(p) {\n                        this.inform(\"upload_error\", p);\n                    }.bind(this));\n                    this.inform(\"upload_start\");\n                    o.send();\n                    break;\n                }\n            ;\n            ;\n            };\n        ;\n        }\n    });\n    e.exports = j;\n});\n__d(\"CloseButton.react\", [\"React\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"React\"), h = b(\"cx\"), i = g.createClass({\n        displayName: \"CloseButton\",\n        render: function() {\n            var j = this.props, k = ((j.size || \"medium\")), l = ((j.appearance || \"normal\")), m = ((k === \"small\")), n = ((k === \"huge\")), o = ((l === \"dark\")), p = ((l === \"inverted\")), q = (((((((((((((\"uiCloseButton\") + ((m ? ((\" \" + \"uiCloseButtonSmall\")) : \"\")))) + ((n ? ((\" \" + \"uiCloseButtonHuge\")) : \"\")))) + ((((m && o)) ? ((\" \" + \"uiCloseButtonSmallDark\")) : \"\")))) + ((((m && p)) ? ((\" \" + \"uiCloseButtonSmallInverted\")) : \"\")))) + ((((!m && o)) ? ((\" \" + \"uiCloseButtonDark\")) : \"\")))) + ((((!m && p)) ? ((\" \" + \"uiCloseButtonInverted\")) : \"\"))));\n            return this.transferPropsTo(g.DOM.a({\n                href: \"#\",\n                role: \"button\",\n                \"aria-label\": j.tooltip,\n                \"data-hover\": ((j.tooltip && \"tooltip\")),\n                \"data-tooltip-alignh\": ((j.tooltip && \"center\")),\n                className: q\n            }));\n        }\n    });\n    e.exports = i;\n});\n__d(\"LoadingIndicator.react\", [\"React\",\"joinClasses\",\"keyMirror\",\"merge\",], function(a, b, c, d, e, f) {\n    var g = b(\"React\"), h = b(\"joinClasses\"), i = b(\"keyMirror\"), j = b(\"merge\"), k = i({\n        white: true,\n        blue: true,\n        black: true\n    }), l = i({\n        small: true,\n        medium: true,\n        large: true\n    }), m = {\n        white: {\n            large: \"/images/loaders/indicator_blue_large.gif\",\n            medium: \"/images/loaders/indicator_blue_medium.gif\",\n            small: \"/images/loaders/indicator_blue_small.gif\"\n        },\n        blue: {\n            large: \"/images/loaders/indicator_white_large.gif\",\n            small: \"/images/loaders/indicator_white_small.gif\"\n        },\n        black: {\n            large: \"/images/loaders/indicator_black.gif\"\n        }\n    }, n = g.createClass({\n        displayName: \"LoadingIndicator\",\n        render: function() {\n            var o = this.props.color, p = this.props.size;\n            if (!m[o]) {\n                return g.DOM.span(null);\n            }\n        ;\n        ;\n            if (!m[o][p]) {\n                return g.DOM.span(null);\n            }\n        ;\n        ;\n            var q = ((this.props.showonasync ? \"uiLoadingIndicatorAsync\" : \"\"));\n            if (this.props.className) {\n                q = h(this.props.className, q);\n            }\n        ;\n        ;\n            var r = m[o][p], s = g.DOM.img({\n                src: r,\n                className: q\n            });\n            s.props = j(this.props, s.props);\n            return s;\n        }\n    });\n    n.SIZES = l;\n    n.COLORS = k;\n    e.exports = n;\n});\n__d(\"LegacyMentionsInput.react\", [\"PlaceholderListener\",\"Bootloader\",\"JSBNG__Event\",\"Keys\",\"React\",\"cx\",], function(a, b, c, d, e, f) {\n    b(\"PlaceholderListener\");\n    var g = b(\"Bootloader\"), h = b(\"JSBNG__Event\"), i = b(\"Keys\"), j = b(\"React\"), k = b(\"cx\"), l = j.createClass({\n        displayName: \"ReactLegacyMentionsInput\",\n        componentDidMount: function(m) {\n            ((this.props.initialData && this._initializeTextarea(m)));\n        },\n        hasEnteredText: function() {\n            return !!((this._mentionsInput && this._mentionsInput.getValue().trim()));\n        },\n        _handleKeydown: function(JSBNG__event) {\n            var m = JSBNG__event.nativeEvent, n = this.props.onEnterSubmit, o = ((((h.getKeyCode(m) == i.RETURN)) && !h.$E(m).getModifiers().any)), p = ((this._mentionsInput && this._mentionsInput.getTypeahead().getView().JSBNG__getSelection()));\n            if (((((n && o)) && !p))) {\n                if (this.props.isLoadingPhoto) {\n                    return false;\n                }\n            ;\n            ;\n                var q = JSBNG__event.target, r = ((q.value && q.value.trim()));\n                if (((r || this.props.acceptEmptyInput))) {\n                    var s = {\n                        visibleValue: r,\n                        encodedValue: r,\n                        attachedPhoto: null\n                    };\n                    if (this._mentionsInput) {\n                        s.encodedValue = this._mentionsInput.getRawValue().trim();\n                        this._mentionsInput.reset();\n                    }\n                ;\n                ;\n                    n(s, JSBNG__event);\n                }\n            ;\n            ;\n                JSBNG__event.preventDefault();\n            }\n        ;\n        ;\n        },\n        _handleFocus: function() {\n            ((this.props.onFocus && this.props.onFocus()));\n            this._initializeTextarea(this.refs.root.getDOMNode());\n        },\n        _handleBlur: function() {\n            ((this.props.onBlur && this.props.onBlur()));\n        },\n        _initializeTextarea: function(m) {\n            if (((this._mentionsInput || this._bootloadingMentions))) {\n                return;\n            }\n        ;\n        ;\n            this._bootloadingMentions = true;\n            g.loadModules([\"CompactTypeaheadRenderer\",\"ContextualTypeaheadView\",\"InputSelection\",\"MentionsInput\",\"TextAreaControl\",\"Typeahead\",\"TypeaheadAreaCore\",\"TypeaheadBestName\",\"TypeaheadHoistFriends\",\"TypeaheadMetrics\",\"TypingDetector\",], function(n, o, p, q, r, s, t, u, v, w, x) {\n                var y = this.refs.textarea.getDOMNode();\n                new r(y);\n                if (this.props.onTypingStateChange) {\n                    var z = new x(y);\n                    z.init();\n                    z.subscribe(\"change\", this.props.onTypingStateChange);\n                }\n            ;\n            ;\n                var aa = {\n                    autoSelect: true,\n                    renderer: n,\n                    causalElement: y\n                };\n                if (this.props.viewOptionsTypeObjects) {\n                    aa.typeObjects = this.props.viewOptionsTypeObjects;\n                }\n            ;\n            ;\n                if (this.props.viewOptionsTypeObjectsOrder) {\n                    aa.typeObjectsOrder = this.props.viewOptionsTypeObjectsOrder;\n                }\n            ;\n            ;\n                var ba = new s(this.props.datasource, {\n                    ctor: o,\n                    options: aa\n                }, {\n                    ctor: t\n                }, this.refs.typeahead.getDOMNode()), ca = [u,v,], da = new w({\n                    extraData: {\n                        event_name: \"mentions\"\n                    }\n                });\n                s.initNow(ba, ca, da);\n                this._mentionsInput = new q(m, ba, y, {\n                    hashtags: this.props.sht\n                });\n                this._mentionsInput.init({\n                    max: 6\n                }, this.props.initialData);\n                if (this.props.initialData) {\n                    p.set(y, y.value.length);\n                }\n            ;\n            ;\n                if (this.props.onPaste) {\n                    h.listen(y, \"paste\", this.props.onPaste);\n                }\n            ;\n            ;\n                this._bootloadingMentions = false;\n            }.bind(this));\n        },\n        JSBNG__focus: function() {\n            try {\n                this.refs.textarea.getDOMNode().JSBNG__focus();\n            } catch (m) {\n            \n            };\n        ;\n        },\n        render: function() {\n            var m = (((((((((((\"textInput\") + ((\" \" + \"mentionsTextarea\")))) + ((\" \" + \"uiTextareaAutogrow\")))) + ((\" \" + \"uiTextareaNoResize\")))) + ((\" \" + \"UFIAddCommentInput\")))) + ((\" \" + \"DOMControl_placeholder\"))));\n            return (j.DOM.div({\n                ref: \"root\",\n                className: \"uiMentionsInput textBoxContainer ReactLegacyMentionsInput\"\n            }, j.DOM.div({\n                className: \"highlighter\"\n            }, j.DOM.div(null, j.DOM.span({\n                className: \"highlighterContent hidden_elem\"\n            }))), j.DOM.div({\n                ref: \"typeahead\",\n                className: \"uiTypeahead mentionsTypeahead\"\n            }, j.DOM.div({\n                className: \"wrap\"\n            }, j.DOM.input({\n                type: \"hidden\",\n                autocomplete: \"off\",\n                className: \"hiddenInput\"\n            }), j.DOM.div({\n                className: \"innerWrap\"\n            }, j.DOM.textarea({\n                ref: \"textarea\",\n                JSBNG__name: \"add_comment_text\",\n                className: m,\n                title: this.props.placeholder,\n                placeholder: this.props.placeholder,\n                onFocus: this._handleFocus,\n                onBlur: this._handleBlur,\n                onKeyDown: this._handleKeydown,\n                defaultValue: this.props.placeholder\n            })))), j.DOM.input({\n                type: \"hidden\",\n                autocomplete: \"off\",\n                className: \"mentionsHidden\",\n                defaultValue: \"\"\n            })));\n        }\n    });\n    e.exports = l;\n});\n__d(\"UFIClassNames\", [\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"cx\");\n    e.exports = {\n        ACTOR_IMAGE: \"img UFIActorImage _54ru\",\n        ROW: \"UFIRow\",\n        UNSEEN_ITEM: \"UFIUnseenItem\"\n    };\n});\n__d(\"LeftRight.react\", [\"React\",\"cx\",\"keyMirror\",\"throwIf\",], function(a, b, c, d, e, f) {\n    var g = b(\"React\"), h = b(\"cx\"), i = b(\"keyMirror\"), j = b(\"throwIf\"), k = i({\n        left: true,\n        right: true,\n        both: true\n    });\n    function l(n) {\n        j(((((!n.children || ((n.children.length < 1)))) || ((n.children.length > 2)))), \"LeftRight component must have one or two children.\");\n    };\n;\n    var m = g.createClass({\n        displayName: \"LeftRight\",\n        render: function() {\n            l(this.props);\n            var n = ((this.props.direction || k.both)), o = ((n === k.both)), p = g.DOM.div({\n                key: \"left\",\n                className: ((((o || ((n === k.left)))) ? \"lfloat\" : \"\"))\n            }, this.props.children[0]), q = ((((this.props.children.length < 2)) ? null : g.DOM.div({\n                key: \"right\",\n                className: ((((o || ((n === k.right)))) ? \"rfloat\" : \"\"))\n            }, this.props.children[1]))), r = ((((((n === k.right)) && q)) ? [q,p,] : [p,q,]));\n            return this.transferPropsTo(g.DOM.div({\n                className: \"clearfix\"\n            }, r));\n        }\n    });\n    m.DIRECTION = k;\n    e.exports = m;\n});\n__d(\"ImageBlock.react\", [\"LeftRight.react\",\"React\",\"cx\",\"joinClasses\",\"throwIf\",], function(a, b, c, d, e, f) {\n    var g = b(\"LeftRight.react\"), h = b(\"React\"), i = b(\"cx\"), j = b(\"joinClasses\"), k = b(\"throwIf\");\n    function l(p) {\n        k(((((!p.children || ((p.children.length > 3)))) || ((p.children.length < 1)))), \"ImageBlock requires two or three children.\");\n    };\n;\n    function m(p) {\n        return (((((((((\"img\") + ((\" \" + \"_8o\")))) + ((((p === \"small\")) ? ((\" \" + \"_8r\")) : \"\")))) + ((((p === \"medium\")) ? ((\" \" + \"_8s\")) : \"\")))) + ((((p === \"large\")) ? ((\" \" + \"_8t\")) : \"\"))));\n    };\n;\n    function n(p, q, r) {\n        p.props.className = j(m(q), p.props.className, r);\n    };\n;\n    var o = h.createClass({\n        displayName: \"ImageBlock\",\n        render: function() {\n            l(this.props);\n            var p = this.props.children[0], q = this.props.children[1], r = this.props.children[2], s = ((this.props.spacing || \"small\"));\n            n(p, s, this.props.imageClassName);\n            var t = j(this.props.contentClassName, (((\"_42ef\") + ((((s === \"small\")) ? ((\" \" + \"_8u\")) : \"\")))));\n            if (((p.tagName == \"IMG\"))) {\n                if (((p.props.alt === undefined))) {\n                    p.props.alt = \"\";\n                }\n            ;\n            ;\n            }\n             else if (((((((((((p.tagName == \"A\")) || ((p.tagName == \"LINK\")))) && ((p.props.tabIndex === undefined)))) && ((p.props.title === undefined)))) && ((p.props[\"aria-label\"] === undefined))))) {\n                p.props.tabIndex = \"-1\";\n                p.props[\"aria-hidden\"] = \"true\";\n            }\n            \n        ;\n        ;\n            var u;\n            if (!r) {\n                u = h.DOM.div({\n                    className: t\n                }, q);\n            }\n             else u = g({\n                className: t,\n                direction: g.DIRECTION.right\n            }, q, r);\n        ;\n        ;\n            return this.transferPropsTo(g({\n                direction: g.DIRECTION.left\n            }, p, u));\n        }\n    });\n    e.exports = o;\n});\n__d(\"UFIImageBlock.react\", [\"ImageBlock.react\",\"React\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"ImageBlock.react\"), h = b(\"React\"), i = b(\"cx\"), j = h.createClass({\n        displayName: \"UFIImageBlock\",\n        render: function() {\n            return this.transferPropsTo(g({\n                imageClassName: \"UFIImageBlockImage\",\n                contentClassName: \"UFIImageBlockContent\"\n            }, this.props.children));\n        }\n    });\n    e.exports = j;\n});\n__d(\"UFIAddComment.react\", [\"Bootloader\",\"CLogConfig\",\"ClipboardPhotoUploader\",\"CloseButton.react\",\"JSBNG__Event\",\"Keys\",\"LoadingIndicator.react\",\"React\",\"LegacyMentionsInput.react\",\"TrackingNodes\",\"Run\",\"UFIClassNames\",\"UFIImageBlock.react\",\"cx\",\"joinClasses\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Bootloader\"), h = b(\"CLogConfig\"), i = b(\"ClipboardPhotoUploader\"), j = b(\"CloseButton.react\"), k = b(\"JSBNG__Event\"), l = b(\"Keys\"), m = b(\"LoadingIndicator.react\"), n = b(\"React\"), o = b(\"LegacyMentionsInput.react\"), p = b(\"TrackingNodes\"), q = b(\"Run\"), r = b(\"UFIClassNames\"), s = b(\"UFIImageBlock.react\"), t = b(\"cx\"), u = b(\"joinClasses\"), v = b(\"tx\"), w = \"Write a comment...\", x = \"Write a reply...\", y = \"fcg fss UFICommentTip\", z = 19, aa = \"/ajax/ufi/upload/\", ba = n.createClass({\n        displayName: \"UFIAddComment\",\n        getInitialState: function() {\n            if (this.props.attachedPhoto) {\n                this.props.contextArgs.attachedphoto = this.props.attachedPhoto;\n            }\n        ;\n        ;\n            return {\n                attachedPhoto: ((this.props.attachedPhoto ? this.props.attachedPhoto : null)),\n                isCommenting: false,\n                isLoadingPhoto: false,\n                isOnBeforeUnloadListenerAdded: false\n            };\n        },\n        _onKeyDown: function(JSBNG__event) {\n            if (((this.props.isEditing && ((k.getKeyCode(JSBNG__event.nativeEvent) === l.ESC))))) {\n                this.props.onCancel();\n            }\n        ;\n        ;\n            if (((this.isMounted() && !this.state.isOnBeforeUnloadListenerAdded))) {\n                q.onBeforeUnload(this._handleUnsavedChanges);\n                this.setState({\n                    isOnBeforeUnloadListenerAdded: true\n                });\n            }\n        ;\n        ;\n        },\n        _handleUnsavedChanges: function() {\n            var ca = a.PageTransitions;\n            if (ca) {\n                var da = ca.getNextURI(), ea = ca.getMostRecentURI();\n                if (((da.getQueryData().hasOwnProperty(\"theater\") || ea.getQueryData().hasOwnProperty(\"theater\")))) {\n                    return;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            if (((((this.refs && this.refs.mentionsinput)) && this.refs.mentionsinput.hasEnteredText()))) {\n                return \"You haven't finished your comment yet. Do you want to leave without finishing?\";\n            }\n        ;\n        ;\n        },\n        _blur: function() {\n            if (((this.refs.mentionsinput && this.refs.mentionsinput.hasEnteredText()))) {\n                return;\n            }\n        ;\n        ;\n            this.setState({\n                isCommenting: false\n            });\n        },\n        _onPaste: function(JSBNG__event) {\n            var ca = new i(aa, this._getPhotoUploadData());\n            this._cancelCurrentSubscriptions();\n            this._subscriptions = [ca.subscribe(\"upload_start\", this._prepareForAttachedPhotoPreview),ca.subscribe(\"upload_error\", this._onRemoveAttachedPhotoPreviewClicked),ca.subscribe(\"upload_success\", function(da, ea) {\n                this._onPhotoUploadComplete(ea);\n            }.bind(this)),];\n            ca.handlePaste(JSBNG__event);\n        },\n        _cancelCurrentSubscriptions: function() {\n            if (this._subscriptions) {\n                this._subscriptions.forEach(function(ca) {\n                    ca.unsubscribe();\n                });\n            }\n        ;\n        ;\n        },\n        componentWillUnmount: function() {\n            this._cancelCurrentSubscriptions();\n        },\n        JSBNG__focus: function() {\n            if (((this.refs && this.refs.mentionsinput))) {\n                this.refs.mentionsinput.JSBNG__focus();\n            }\n        ;\n        ;\n        },\n        render: function() {\n            var ca = ((!this.props.contextArgs.collapseaddcomment || this.state.isCommenting)), da = null;\n            if (this.props.isEditing) {\n                da = n.DOM.span({\n                    className: y\n                }, \"Press Esc to cancel.\");\n            }\n             else if (this.props.showSendOnEnterTip) {\n                da = n.DOM.span({\n                    className: y\n                }, \"Press Enter to post.\");\n            }\n             else if (this.props.subtitle) {\n                da = n.DOM.span({\n                    className: y\n                }, this.props.subtitle);\n            }\n            \n            \n        ;\n        ;\n            var ea = null, fa = this.state.attachedPhoto, ga = null;\n            if (this.props.allowPhotoAttachments) {\n                ga = this._onPaste;\n                var ha = n.DOM.input({\n                    ref: \"PhotoInput\",\n                    accept: \"image/*\",\n                    className: \"_n\",\n                    JSBNG__name: \"file[]\",\n                    type: \"file\",\n                    multiple: false\n                }), ia = ((fa ? \"UFICommentPhotoAttachedIcon\" : \"UFICommentPhotoIcon\")), ja = \"UFIPhotoAttachLinkWrapper _m\";\n                ea = n.DOM.div({\n                    ref: \"PhotoInputContainer\",\n                    className: ja,\n                    \"data-hover\": \"tooltip\",\n                    \"data-tooltip-alignh\": \"center\",\n                    \"aria-label\": \"Attach a Photo\"\n                }, n.DOM.i({\n                    ref: \"PhotoInputControl\",\n                    className: ia\n                }), ha);\n            }\n        ;\n        ;\n            var ka = p.getTrackingInfo(p.types.ADD_COMMENT_BOX), la = u(r.ACTOR_IMAGE, ((!ca ? \"hidden_elem\" : \"\"))), ma = n.DOM.div({\n                className: \"UFIReplyActorPhotoWrapper\"\n            }, n.DOM.img({\n                className: la,\n                src: this.props.viewerActor.thumbSrc\n            })), na = u(r.ROW, ((((((((((((this.props.hide ? \"noDisplay\" : \"\")) + ((\" \" + \"UFIAddComment\")))) + ((this.props.allowPhotoAttachments ? ((\" \" + \"UFIAddCommentWithPhotoAttacher\")) : \"\")))) + ((this.props.withoutSeparator ? ((\" \" + \"UFIAddCommentWithoutSeparator\")) : \"\")))) + ((this.props.isFirstComponent ? ((\" \" + \"UFIFirstComponent\")) : \"\")))) + ((this.props.isLastComponent ? ((\" \" + \"UFILastComponent\")) : \"\"))))), oa = ((!!this.props.replyCommentID ? x : w)), pa = ((this.props.contextArgs.entstream ? this._blur : null)), qa = this.props.contextArgs.viewoptionstypeobjects, ra = this.props.contextArgs.viewoptionstypeobjectsorder, sa = null, ta = this.props.onCommentSubmit;\n            if (fa) {\n                sa = n.DOM.div({\n                    isStatic: true,\n                    dangerouslySetInnerHTML: ((this.state.attachedPhoto.markupPreview ? this.state.attachedPhoto.markupPreview : this.state.attachedPhoto.markup))\n                });\n                da = null;\n            }\n             else if (this.state.isLoadingPhoto) {\n                sa = m({\n                    color: \"white\",\n                    className: \"UFICommentPhotoAttachedPreviewLoadingIndicator\",\n                    size: \"medium\"\n                });\n            }\n            \n        ;\n        ;\n            var ua;\n            if (((sa != null))) {\n                ua = n.DOM.div({\n                    className: \"UFICommentPhotoAttachedPreview pas\"\n                }, sa, j({\n                    onClick: this._onRemoveAttachedPhotoPreviewClicked\n                }));\n                ta = function(va, JSBNG__event) {\n                    this.setState({\n                        isLoadingPhoto: false,\n                        attachedPhoto: null\n                    });\n                    va.attachedPhoto = this.props.contextArgs.attachedphoto;\n                    this.props.onCommentSubmit(va, JSBNG__event);\n                }.bind(this);\n            }\n        ;\n        ;\n            return (n.DOM.li({\n                className: na,\n                onKeyDown: this._onKeyDown,\n                \"data-ft\": ka\n            }, s({\n                className: \"UFIMentionsInputWrap\"\n            }, ma, n.DOM.div(null, o({\n                initialData: this.props.initialData,\n                placeholder: oa,\n                ref: \"mentionsinput\",\n                datasource: this.props.mentionsDataSource,\n                acceptEmptyInput: ((this.props.isEditing || this.props.contextArgs.attachedphoto)),\n                onEnterSubmit: ta,\n                onFocus: this.setState.bind(this, {\n                    isCommenting: true\n                }),\n                viewOptionsTypeObjects: qa,\n                viewOptionsTypeObjectsOrder: ra,\n                onBlur: pa,\n                onTypingStateChange: this.props.onTypingStateChange,\n                onPaste: ga,\n                sht: this.props.contextArgs.sht,\n                isLoadingPhoto: this.state.isLoadingPhoto\n            }), ea, ua, da))));\n        },\n        componentDidMount: function(ca) {\n            if (h.gkResults) {\n                var da = this.props.replyCommentID;\n                if (((this.refs && this.refs.mentionsinput))) {\n                    var ea = this.refs.mentionsinput.refs.textarea.getDOMNode();\n                    g.loadModules([\"CLoggerX\",\"UFIComments\",], function(ja, ka) {\n                        var la = ka.getComment(da), ma = ((la ? la.fbid : null));\n                        ja.trackMentionsInput(ea, ma);\n                    });\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            if (!this.props.allowPhotoAttachments) {\n                return;\n            }\n        ;\n        ;\n            var fa = this.refs.PhotoInputContainer.getDOMNode(), ga = this.refs.PhotoInputControl.getDOMNode(), ha = this.refs.PhotoInput.getDOMNode(), ia = k.listen(fa, \"click\", function(JSBNG__event) {\n                g.loadModules([\"FileInput\",\"FileInputUploader\",\"Input\",], function(ja, ka, la) {\n                    var ma = new ja(fa, ga, ha), na = new ka().setURI(aa).setData(this._getPhotoUploadData());\n                    ma.subscribe(\"change\", function(JSBNG__event) {\n                        if (ma.getValue()) {\n                            this._prepareForAttachedPhotoPreview();\n                            na.setInput(ma.getInput()).send();\n                        }\n                    ;\n                    ;\n                    }.bind(this));\n                    na.subscribe(\"success\", function(oa, pa) {\n                        ma.clear();\n                        this._onPhotoUploadComplete(pa.response);\n                    }.bind(this));\n                }.bind(this));\n                ia.remove();\n            }.bind(this));\n        },\n        _getPhotoUploadData: function() {\n            return {\n                profile_id: this.props.viewerActor.id,\n                source: z\n            };\n        },\n        _onPhotoUploadComplete: function(ca) {\n            if (!this.state.isLoadingPhoto) {\n                return;\n            }\n        ;\n        ;\n            var da = ca.getPayload();\n            if (((da && da.fbid))) {\n                this.props.contextArgs.attachedphoto = da;\n                this.setState({\n                    attachedPhoto: da,\n                    isLoadingPhoto: false\n                });\n            }\n        ;\n        ;\n        },\n        _onRemoveAttachedPhotoPreviewClicked: function(JSBNG__event) {\n            this.props.contextArgs.attachedphoto = null;\n            this.setState({\n                attachedPhoto: null,\n                isLoadingPhoto: false\n            });\n        },\n        _prepareForAttachedPhotoPreview: function() {\n            this.props.contextArgs.attachedphoto = null;\n            this.setState({\n                attachedPhoto: null,\n                isLoadingPhoto: true\n            });\n        }\n    });\n    e.exports = ba;\n});\n__d(\"UFIAddCommentController\", [\"Arbiter\",\"copyProperties\",\"MentionsInputUtils\",\"Parent\",\"UFIAddComment.react\",\"React\",\"ShortProfiles\",\"UFICentralUpdates\",\"UFIComments\",\"UFIFeedbackTargets\",\"UFIInstanceState\",\"UFIUserActions\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"copyProperties\"), i = b(\"MentionsInputUtils\"), j = b(\"Parent\"), k = b(\"UFIAddComment.react\"), l = b(\"React\"), m = b(\"ShortProfiles\"), n = b(\"UFICentralUpdates\"), o = b(\"UFIComments\"), p = b(\"UFIFeedbackTargets\"), q = b(\"UFIInstanceState\"), r = b(\"UFIUserActions\");\n    function s(t, u, v, w) {\n        this.id = u;\n        this._ufiInstanceID = w.instanceid;\n        this._contextArgs = w;\n        this._replyCommentID = v;\n        if (t) {\n            this.root = t;\n            if (!this._contextArgs.rootid) {\n                this._contextArgs.rootid = t.id;\n            }\n        ;\n        ;\n            this.render();\n            n.subscribe(\"instance-updated\", function(x, y) {\n                var z = y.updates;\n                if (((this._ufiInstanceID in z))) {\n                    this.render();\n                }\n            ;\n            ;\n            }.bind(this));\n        }\n    ;\n    ;\n        n.subscribe(\"feedback-id-changed\", function(x, y) {\n            var z = y.updates;\n            if (((this.id in z))) {\n                this.id = z[this.id];\n            }\n        ;\n        ;\n        }.bind(this));\n    };\n;\n    h(s.prototype, {\n        _onCommentSubmit: function(t, JSBNG__event) {\n            r.addComment(this.id, t.visibleValue, t.encodedValue, {\n                source: this._contextArgs.source,\n                ufiinstanceid: this._ufiInstanceID,\n                target: JSBNG__event.target,\n                replyid: this._replyCommentID,\n                timelinelogdata: this._contextArgs.timelinelogdata,\n                rootid: this._contextArgs.rootid,\n                attachedphoto: this._contextArgs.attachedphoto,\n                giftoccasion: this._contextArgs.giftoccasion\n            });\n            this._contextArgs.attachedphoto = null;\n            p.getFeedbackTarget(this.id, function(u) {\n                var v = j.byTag(this.root, \"form\");\n                if (v) {\n                    g.inform(\"ufi/comment\", {\n                        form: v,\n                        isranked: u.isranked\n                    });\n                }\n            ;\n            ;\n            }.bind(this));\n            return false;\n        },\n        _onTypingStateChange: function(t, u) {\n        \n        },\n        renderAddComment: function(t, u, v, w, x, y, z) {\n            var aa = ((this._contextArgs.logtyping ? this._onTypingStateChange.bind(this) : null)), ba = null, ca = ((q.getKeyForInstance(this._ufiInstanceID, \"isediting\") && !this._replyCommentID));\n            return (k({\n                hide: ca,\n                replyCommentID: this._replyCommentID,\n                viewerActor: t,\n                initialData: ba,\n                ref: w,\n                withoutSeparator: x,\n                onCommentSubmit: this._onCommentSubmit.bind(this),\n                mentionsDataSource: u,\n                onTypingStateChange: aa,\n                showSendOnEnterTip: v,\n                allowPhotoAttachments: y,\n                source: this._contextArgs.source,\n                contextArgs: this._contextArgs,\n                subtitle: z\n            }));\n        },\n        renderEditComment: function(t, u, v, w, x, y) {\n            var z = o.getComment(u), aa = i.generateDataFromTextWithEntities(z.body);\n            return (k({\n                viewerActor: t,\n                initialData: aa,\n                onCommentSubmit: w,\n                onCancel: x,\n                mentionsDataSource: v,\n                source: this._contextArgs.source,\n                contextArgs: this._contextArgs,\n                isEditing: true,\n                editingCommentID: u,\n                attachedPhoto: z.photo_comment,\n                allowPhotoAttachments: y\n            }));\n        },\n        render: function() {\n            if (!this.root) {\n                throw new Error(\"render called on UFIAddCommentController with no root\");\n            }\n        ;\n        ;\n            p.getFeedbackTarget(this.id, function(t) {\n                if (((t.cancomment && t.actorforpost))) {\n                    m.get(t.actorforpost, function(u) {\n                        var v = this.renderAddComment(u, t.mentionsdatasource, t.showsendonentertip, null, null, t.allowphotoattachments, t.subtitle);\n                        this._addComment = l.renderComponent(v, this.root);\n                    }.bind(this));\n                }\n            ;\n            ;\n            }.bind(this));\n        }\n    });\n    e.exports = s;\n});\n__d(\"Scrollable\", [\"JSBNG__Event\",\"Parent\",\"UserAgent\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"Parent\"), i = b(\"UserAgent\"), j = function(JSBNG__event) {\n        var m = h.byClass(JSBNG__event.getTarget(), \"scrollable\");\n        if (!m) {\n            return;\n        }\n    ;\n    ;\n        if (((((((((typeof JSBNG__event.axis !== \"undefined\")) && ((JSBNG__event.axis === JSBNG__event.HORIZONTAL_AXIS)))) || ((JSBNG__event.wheelDeltaX && !JSBNG__event.wheelDeltaY)))) || ((JSBNG__event.deltaX && !JSBNG__event.deltaY))))) {\n            return;\n        }\n    ;\n    ;\n        var n = ((((JSBNG__event.wheelDelta || -JSBNG__event.deltaY)) || -JSBNG__event.detail)), o = m.scrollHeight, p = m.clientHeight;\n        if (((o > p))) {\n            var q = m.scrollTop;\n            if (((((((n > 0)) && ((q === 0)))) || ((((n < 0)) && ((q >= ((o - p))))))))) {\n                JSBNG__event.prevent();\n            }\n             else if (((i.ie() < 9))) {\n                if (m.currentStyle) {\n                    var r = m.currentStyle.fontSize;\n                    if (((r.indexOf(\"px\") < 0))) {\n                        var s = JSBNG__document.createElement(\"div\");\n                        s.style.fontSize = r;\n                        s.style.height = \"1em\";\n                        r = s.style.pixelHeight;\n                    }\n                     else r = parseInt(r, 10);\n                ;\n                ;\n                    m.scrollTop = ((q - Math.round(((((n / 120)) * r)))));\n                    JSBNG__event.prevent();\n                }\n            ;\n            }\n            \n        ;\n        ;\n        }\n    ;\n    ;\n    }, k = JSBNG__document.documentElement;\n    if (i.firefox()) {\n        var l = ((((\"JSBNG__WheelEvent\" in window)) ? \"wheel\" : \"DOMMouseScroll\"));\n        k.JSBNG__addEventListener(l, j, false);\n    }\n     else g.listen(k, \"mousewheel\", j);\n;\n;\n});\n__d(\"LegacyScrollableArea.react\", [\"Scrollable\",\"Bootloader\",\"React\",\"Style\",\"cx\",], function(a, b, c, d, e, f) {\n    b(\"Scrollable\");\n    var g = b(\"Bootloader\"), h = b(\"React\"), i = b(\"Style\"), j = b(\"cx\"), k = \"uiScrollableArea native\", l = \"uiScrollableAreaWrap scrollable\", m = \"uiScrollableAreaBody\", n = \"uiScrollableAreaContent\", o = h.createClass({\n        displayName: \"ReactLegacyScrollableArea\",\n        render: function() {\n            var p = {\n                height: ((this.props.height ? ((this.props.height + \"px\")) : \"auto\"))\n            };\n            return (h.DOM.div({\n                className: k,\n                ref: \"root\",\n                style: p\n            }, h.DOM.div({\n                className: l\n            }, h.DOM.div({\n                className: m,\n                ref: \"body\"\n            }, h.DOM.div({\n                className: n\n            }, this.props.children)))));\n        },\n        getArea: function() {\n            return this._area;\n        },\n        componentDidMount: function() {\n            g.loadModules([\"ScrollableArea\",], this._loadScrollableArea);\n        },\n        _loadScrollableArea: function(p) {\n            this._area = p.fromNative(this.refs.root.getDOMNode(), {\n                fade: this.props.fade,\n                persistent: this.props.persistent\n            });\n            var q = this.refs.body.getDOMNode();\n            i.set(q, \"width\", ((this.props.width + \"px\")));\n            ((this.props.onScroll && this._area.subscribe(\"JSBNG__scroll\", this.props.onScroll)));\n        }\n    });\n    e.exports = o;\n});\n__d(\"UFIAddCommentLink.react\", [\"React\",\"UFIClassNames\",\"cx\",\"joinClasses\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"React\"), h = b(\"UFIClassNames\"), i = b(\"cx\"), j = b(\"joinClasses\"), k = b(\"tx\"), l = g.createClass({\n        displayName: \"UFIAddCommentLink\",\n        render: function() {\n            var m = j(h.ROW, (((((((((\"UFIAddCommentLink\") + ((this.props.isFirstCommentComponent ? ((\" \" + \"UFIFirstCommentComponent\")) : \"\")))) + ((this.props.isLastCommentComponent ? ((\" \" + \"UFILastCommentComponent\")) : \"\")))) + ((this.props.isFirstComponent ? ((\" \" + \"UFIFirstComponent\")) : \"\")))) + ((this.props.isLastComponent ? ((\" \" + \"UFILastComponent\")) : \"\"))))), n = \"Write a comment...\";\n            return (g.DOM.li({\n                className: m,\n                \"data-ft\": this.props[\"data-ft\"]\n            }, g.DOM.a({\n                className: \"UFICommentLink\",\n                onClick: this.props.onClick,\n                href: \"#\",\n                role: \"button\"\n            }, n)));\n        }\n    });\n    e.exports = l;\n});\n__d(\"HovercardLink\", [\"Bootloader\",\"URI\",], function(a, b, c, d, e, f) {\n    var g = b(\"Bootloader\"), h = b(\"URI\"), i = {\n        getBaseURI: function() {\n            return h(\"/ajax/hovercard/hovercard.php\");\n        },\n        constructEndpoint: function(j, k) {\n            return i.constructEndpointWithGroupAndLocation(j, k, null);\n        },\n        constructEndpointWithLocation: function(j, k) {\n            return i.constructEndpointWithGroupAndLocation(j, null, k);\n        },\n        constructEndpointWithGroupAndLocation: function(j, k, l) {\n            g.loadModules([\"Hovercard\",], function() {\n            \n            });\n            var m = new h(i.getBaseURI()).setQueryData({\n                id: j.id\n            }), n = {\n            };\n            if (((j.weakreference && k))) {\n                n.group_id = k;\n            }\n        ;\n        ;\n            if (l) {\n                n.hc_location = l;\n            }\n        ;\n        ;\n            m.addQueryData({\n                extragetparams: JSON.stringify(n)\n            });\n            return m;\n        }\n    };\n    e.exports = i;\n});\n__d(\"UntrustedLink\", [\"DOM\",\"JSBNG__Event\",\"URI\",\"UserAgent\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOM\"), h = b(\"JSBNG__Event\"), i = b(\"URI\"), j = b(\"UserAgent\"), k = b(\"copyProperties\");\n    function l(m, n, o, p) {\n        this.dom = m;\n        this.url = m.href;\n        this.hash = n;\n        this.func_get_params = ((p || function() {\n            return {\n            };\n        }));\n        h.listen(this.dom, \"click\", this.JSBNG__onclick.bind(this));\n        h.listen(this.dom, \"mousedown\", this.JSBNG__onmousedown.bind(this));\n        h.listen(this.dom, \"mouseup\", this.JSBNG__onmouseup.bind(this));\n        h.listen(this.dom, \"mouseout\", this.JSBNG__onmouseout.bind(this));\n        this.JSBNG__onmousedown(h.$E(o));\n    };\n;\n    l.bootstrap = function(m, n, o, p) {\n        if (m.__untrusted) {\n            return;\n        }\n    ;\n    ;\n        m.__untrusted = true;\n        new l(m, n, o, p);\n    };\n    l.prototype.getRewrittenURI = function() {\n        var m = k({\n            u: this.url,\n            h: this.hash\n        }, this.func_get_params(this.dom)), n = new i(\"/l.php\");\n        return n.setQueryData(m).setSubdomain(\"www\").setProtocol(\"http\");\n    };\n    l.prototype.JSBNG__onclick = function() {\n        (function() {\n            this.setHref(this.url);\n        }).bind(this).defer(100);\n        this.setHref(this.getRewrittenURI());\n    };\n    l.prototype.JSBNG__onmousedown = function(m) {\n        if (((m.button == 2))) {\n            this.setHref(this.getRewrittenURI());\n        }\n    ;\n    ;\n    };\n    l.prototype.JSBNG__onmouseup = function() {\n        this.setHref(this.getRewrittenURI());\n    };\n    l.prototype.JSBNG__onmouseout = function() {\n        this.setHref(this.url);\n    };\n    l.prototype.setHref = function(m) {\n        if (((j.ie() < 9))) {\n            var n = g.create(\"span\");\n            g.appendContent(this.dom, n);\n            this.dom.href = m;\n            g.remove(n);\n        }\n         else this.dom.href = m;\n    ;\n    ;\n    };\n    e.exports = l;\n});\n__d(\"Link.react\", [\"React\",\"UntrustedLink\",\"mergeInto\",], function(a, b, c, d, e, f) {\n    var g = b(\"React\"), h = b(\"UntrustedLink\"), i = b(\"mergeInto\"), j = g.createClass({\n        displayName: \"Link\",\n        _installLinkshimOnMouseDown: function(JSBNG__event) {\n            var k = this.props.href;\n            if (k.shimhash) {\n                h.bootstrap(this.getDOMNode(), k.shimhash);\n            }\n        ;\n        ;\n            ((this.props.onMouseDown && this.props.onMouseDown(JSBNG__event)));\n        },\n        render: function() {\n            var k = this.props.href, l = g.DOM.a(null);\n            i(l.props, this.props);\n            if (k) {\n                l.props.href = k.url;\n                var m = !!k.shimhash;\n                if (m) {\n                    l.props.rel = ((l.props.rel ? ((l.props.rel + \" nofollow\")) : \"nofollow\"));\n                    l.props.onMouseDown = this._installLinkshimOnMouseDown;\n                }\n            ;\n            ;\n            }\n             else l.props.href = \"#\";\n        ;\n        ;\n            return l;\n        }\n    });\n    e.exports = j;\n});\n__d(\"PubContentTypes\", [], function(a, b, c, d, e, f) {\n    var g = {\n        HASHTAG: \"hashtag\",\n        TOPIC: \"topic\",\n        JSBNG__URL: \"url\"\n    };\n    e.exports = g;\n});\n__d(\"HovercardLinkInterpolator\", [\"Bootloader\",\"CSS\",\"JSBNG__Event\",\"HovercardLink\",\"Link.react\",\"Parent\",\"PubContentTypes\",\"React\",\"URI\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Bootloader\"), h = b(\"CSS\"), i = b(\"JSBNG__Event\"), j = b(\"HovercardLink\"), k = b(\"Link.react\"), l = b(\"Parent\"), m = b(\"PubContentTypes\"), n = b(\"React\"), o = b(\"URI\"), p = b(\"cx\");\n    function q(r, s, t, u, v) {\n        var w = s.entities[0], x = ((t || ((w.JSBNG__external ? \"_blank\" : null)))), y, z = ((((!w.JSBNG__external ? \"profileLink\" : \"\")) + ((w.weakreference ? ((\" \" + \"weakReference\")) : \"\"))));\n        if (w.hashtag) {\n            var aa = h.hasClass(JSBNG__document.body, \"_6nw\"), ba = function(ea) {\n                if (i.$E(ea.nativeEvent).isDefaultRequested()) {\n                    return;\n                }\n            ;\n            ;\n                ea.preventDefault();\n                var fa = l.byTag(ea.target, \"A\");\n                if (aa) {\n                    g.loadModules([\"EntstreamPubContentOverlay\",], function(ga) {\n                        ga.pubClick(fa);\n                    });\n                }\n                 else g.loadModules([\"HashtagLayerPageController\",], function(ga) {\n                    ga.click(fa);\n                });\n            ;\n            ;\n            }, ca = null;\n            if (aa) {\n                ca = {\n                    type: m.HASHTAG,\n                    id: w.id,\n                    source: \"comment\"\n                };\n            }\n             else ca = {\n                id: w.id\n            };\n        ;\n        ;\n            var da = new o(w.url).setSubdomain(\"www\");\n            y = n.DOM.a({\n                className: \"_58cn\",\n                \"data-pub\": JSON.stringify(ca),\n                href: da.toString(),\n                onClick: ba\n            }, n.DOM.span({\n                className: \"_58cl\"\n            }, r.substring(0, 1)), n.DOM.span({\n                className: \"_58cm\"\n            }, r.substring(1)));\n        }\n         else if (w.weakreference) {\n            y = k({\n                className: z,\n                href: w,\n                target: x\n            }, n.DOM.i({\n                className: \"UFIWeakReferenceIcon\"\n            }), r);\n        }\n         else y = k({\n            className: z,\n            href: w,\n            target: x\n        }, r);\n        \n    ;\n    ;\n        if (((!w.JSBNG__external && !w.hashtag))) {\n            y.props[\"data-hovercard\"] = j.constructEndpointWithGroupAndLocation(w, u, v).toString();\n        }\n    ;\n    ;\n        return y;\n    };\n;\n    e.exports = q;\n});\n__d(\"LinkButton\", [\"cx\",\"React\",], function(a, b, c, d, e, f) {\n    var g = b(\"cx\"), h = b(\"React\"), i = function(j) {\n        var k = ((((j.JSBNG__name && j.value)) ? ((((((j.JSBNG__name + \"[\")) + encodeURIComponent(j.value))) + \"]\")) : null));\n        return (h.DOM.label({\n            className: (((((\"uiLinkButton\") + ((j.subtle ? ((\" \" + \"uiLinkButtonSubtle\")) : \"\")))) + ((j.showSaving ? ((\" \" + \"async_throbber\")) : \"\"))))\n        }, h.DOM.input({\n            type: ((j.inputType || \"button\")),\n            JSBNG__name: k,\n            value: j.label,\n            className: ((j.showSaving ? \"stat_elem\" : \"\"))\n        })));\n    };\n    e.exports = i;\n});\n__d(\"Timestamp.react\", [\"LiveTimer\",\"React\",], function(a, b, c, d, e, f) {\n    var g = b(\"LiveTimer\"), h = b(\"React\"), i = h.createClass({\n        displayName: \"Timestamp\",\n        render: function() {\n            var j = g.renderRelativeTimeToServer(this.props.time);\n            return this.transferPropsTo(h.DOM.abbr({\n                className: \"livetimestamp\",\n                title: this.props.verbose,\n                \"data-utime\": this.props.time\n            }, ((j.text || this.props.text))));\n        }\n    });\n    e.exports = i;\n});\n__d(\"EmoteTypes\", [], function(a, b, c, d, e, f) {\n    f.TEXT = \"text\";\n    f.EMOTE = \"emote\";\n    f.EMOTE_FBID = \"emote_fbid\";\n});\n__d(\"EmoticonsList\", [], function(a, b, c, d, e, f) {\n    e.exports = {\n        emotes: {\n            \":)\": \"smile\",\n            \":-)\": \"smile\",\n            \":]\": \"smile\",\n            \"=)\": \"smile\",\n            \":(\": \"frown\",\n            \":-(\": \"frown\",\n            \":[\": \"frown\",\n            \"=(\": \"frown\",\n            \":P\": \"tongue\",\n            \":-P\": \"tongue\",\n            \":-p\": \"tongue\",\n            \":p\": \"tongue\",\n            \"=P\": \"tongue\",\n            \"=D\": \"grin\",\n            \":-D\": \"grin\",\n            \":D\": \"grin\",\n            \":o\": \"gasp\",\n            \":-O\": \"gasp\",\n            \":O\": \"gasp\",\n            \":-o\": \"gasp\",\n            \";)\": \"wink\",\n            \";-)\": \"wink\",\n            \"8)\": \"glasses\",\n            \"8-)\": \"glasses\",\n            \"B)\": \"glasses\",\n            \"B-)\": \"glasses\",\n            \"B|\": \"sunglasses\",\n            \"8-|\": \"sunglasses\",\n            \"8|\": \"sunglasses\",\n            \"B-|\": \"sunglasses\",\n            \"\\u003E:(\": \"grumpy\",\n            \"\\u003E:-(\": \"grumpy\",\n            \":/\": \"unsure\",\n            \":-/\": \"unsure\",\n            \":\\\\\": \"unsure\",\n            \":-\\\\\": \"unsure\",\n            \"=/\": \"unsure\",\n            \"=\\\\\": \"unsure\",\n            \":'(\": \"cry\",\n            \"3:)\": \"devil\",\n            \"3:-)\": \"devil\",\n            \"O:)\": \"angel\",\n            \"O:-)\": \"angel\",\n            \":*\": \"kiss\",\n            \":-*\": \"kiss\",\n            \"\\u003C3\": \"heart\",\n            \"&lt;3\": \"heart\",\n            \"\\u2665\": \"heart\",\n            \"^_^\": \"kiki\",\n            \"-_-\": \"squint\",\n            \"o.O\": \"confused\",\n            \"O.o\": \"confused_rev\",\n            \"\\u003E:o\": \"upset\",\n            \"\\u003E:O\": \"upset\",\n            \"\\u003E:-O\": \"upset\",\n            \"\\u003E:-o\": \"upset\",\n            \"\\u003E_\\u003C\": \"upset\",\n            \"\\u003E.\\u003C\": \"upset\",\n            \":v\": \"pacman\",\n            \":|]\": \"robot\",\n            \":3\": \"colonthree\",\n            \"\\u003C(\\\")\": \"penguin\",\n            \":putnam:\": \"putnam\",\n            \"(^^^)\": \"shark\",\n            \"(y)\": \"like\",\n            \":like:\": \"like\",\n            \"(Y)\": \"like\",\n            \":poop:\": \"poop\"\n        },\n        symbols: {\n            smile: \":)\",\n            frown: \":(\",\n            tongue: \":P\",\n            grin: \"=D\",\n            gasp: \":o\",\n            wink: \";)\",\n            glasses: \"8)\",\n            sunglasses: \"B|\",\n            grumpy: \"\\u003E:(\",\n            unsure: \":/\",\n            cry: \":'(\",\n            devil: \"3:)\",\n            angel: \"O:)\",\n            kiss: \":*\",\n            heart: \"\\u003C3\",\n            kiki: \"^_^\",\n            squint: \"-_-\",\n            confused: \"o.O\",\n            confused_rev: \"O.o\",\n            upset: \"\\u003E:o\",\n            pacman: \":v\",\n            robot: \":|]\",\n            colonthree: \":3\",\n            penguin: \"\\u003C(\\\")\",\n            putnam: \":putnam:\",\n            shark: \"(^^^)\",\n            like: \"(y)\",\n            poop: \":poop:\"\n        },\n        regexp: /(^|[\\s'\".])(:\\)|:\\-\\)|:\\]|=\\)|:\\(|:\\-\\(|:\\[|=\\(|:P|:\\-P|:\\-p|:p|=P|=D|:\\-D|:D|:o|:\\-O|:O|:\\-o|;\\)|;\\-\\)|8\\)|8\\-\\)|B\\)|B\\-\\)|B\\||8\\-\\||8\\||B\\-\\||>:\\(|>:\\-\\(|:\\/|:\\-\\/|:\\\\|:\\-\\\\|=\\/|=\\\\|:'\\(|3:\\)|3:\\-\\)|O:\\)|O:\\-\\)|:\\*|:\\-\\*|<3|&lt;3|\\u2665|\\^_\\^|\\-_\\-|o\\.O|O\\.o|>:o|>:O|>:\\-O|>:\\-o|>_<|>\\.<|:v|:\\|\\]|:3|<\\(\"\\)|:putnam:|\\(\\^\\^\\^\\)|\\(y\\)|:like:|\\(Y\\)|:poop:)([\\s'\".,!?]|<br>|$)/\n    };\n});\n__d(\"createEmoteTokenizer\", [\"EmoteTypes\",], function(a, b, c, d, e, f) {\n    var g = b(\"EmoteTypes\"), h = 40;\n    function i(j) {\n        return function(k) {\n            var l = k, m = [], n = h;\n            while (n--) {\n                var o = j.regexp.exec(l);\n                if (((!o || !o.length))) {\n                    break;\n                }\n            ;\n            ;\n                var p = o[2], q = ((o.index + o[1].length)), r = l.substring(0, q);\n                if (r) {\n                    m.push({\n                        type: g.TEXT,\n                        text: r\n                    });\n                }\n            ;\n            ;\n                var s = j.emotes[p];\n                if (s) {\n                    m.push({\n                        type: g.EMOTE,\n                        text: p,\n                        emote: s\n                    });\n                }\n                 else m.push({\n                    type: g.TEXT,\n                    text: p\n                });\n            ;\n            ;\n                l = l.substring(((q + p.length)));\n            };\n        ;\n            if (l) {\n                m.push({\n                    type: g.TEXT,\n                    text: l\n                });\n            }\n        ;\n        ;\n            return m;\n        };\n    };\n;\n    e.exports = i;\n});\n__d(\"emoteFBIDTokenizer\", [\"EmoteTypes\",], function(a, b, c, d, e, f) {\n    var g = b(\"EmoteTypes\"), h = /\\[\\[([a-z\\d\\.]+)\\]\\]/gi;\n    function i(j) {\n        return j.split(h).map(function(k, l) {\n            if (((((l % 2)) === 0))) {\n                return {\n                    type: g.TEXT,\n                    text: k\n                };\n            }\n             else return {\n                type: g.EMOTE_FBID,\n                text: ((((\"[[\" + k)) + \"]]\")),\n                value: k\n            }\n        ;\n        });\n    };\n;\n    e.exports = i;\n});\n__d(\"Emote\", [\"DOM\",\"EmoteTypes\",\"EmoticonsList\",\"createEmoteTokenizer\",\"emoteFBIDTokenizer\",\"flattenArray\",\"htmlize\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOM\"), h = b(\"EmoteTypes\"), i = b(\"EmoticonsList\"), j = b(\"createEmoteTokenizer\"), k = b(\"emoteFBIDTokenizer\"), l = b(\"flattenArray\"), m = b(\"htmlize\"), n = j(i), o = e.exports = {\n    };\n    o.htmlEmoteWithoutFBID = function(p, q) {\n        if (((typeof q != \"function\"))) {\n            q = m;\n        }\n    ;\n    ;\n        return l(n(p).map(function(r) {\n            if (((r.type === h.TEXT))) {\n                return q(r.text);\n            }\n             else if (((r.type === h.EMOTE))) {\n                return [\"\\u003Cspan class=\\\"emoticon_text\\\" aria-hidden=\\\"true\\\"\\u003E\",r.text,\"\\u003C/span\\u003E\",g.create(\"span\", {\n                }, g.create(\"span\", {\n                    title: r.text,\n                    className: ((\"emoticon emoticon_\" + r.emote))\n                })).innerHTML,];\n            }\n            \n        ;\n        ;\n        })).join(\"\");\n    };\n    o.htmlEmote = function(p, q) {\n        if (((typeof q != \"function\"))) {\n            q = m;\n        }\n    ;\n    ;\n        return l(k(p).map(function(r) {\n            if (((r.type === h.TEXT))) {\n                return o.htmlEmoteWithoutFBID(r.text, q);\n            }\n             else if (((r.type === h.EMOTE_FBID))) {\n                return [\"\\u003Cspan class=\\\"emoticon_text\\\" aria-hidden=\\\"true\\\"\\u003E\",r.text,\"\\u003C/span\\u003E\",g.create(\"span\", {\n                }, g.create(\"img\", {\n                    alt: r.text,\n                    className: \"emoticon emoticon_custom\",\n                    src: ((((((window.JSBNG__location.protocol + \"//graph.facebook.com/\")) + encodeURIComponent(r.value))) + \"/picture\"))\n                })).innerHTML,];\n            }\n            \n        ;\n        ;\n        })).join(\"\");\n    };\n});\n__d(\"SupportedEmoji\", [\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"cx\");\n    e.exports = {\n        utf16Regex: /[\\u203C\\u2049\\u2100-\\u21FF\\u2300-\\u27FF\\u2900-\\u29FF\\u2B00-\\u2BFF\\u3000-\\u30FF\\u3200-\\u32FF]|\\uD83C[\\uDC00-\\uDFFF]|\\uD83D[\\uDC00-\\uDEFF]/,\n        emoji: {\n            127744: \"_2b_\",\n            127746: \"_2c0\",\n            127754: \"_2c1\",\n            127769: \"_2c2\",\n            127775: \"_2c3\",\n            127793: \"_2c4\",\n            127796: \"_2c5\",\n            127797: \"_2c6\",\n            127799: \"_2c7\",\n            127800: \"_2c8\",\n            127801: \"_2c9\",\n            127802: \"_2ca\",\n            127803: \"_2cb\",\n            127806: \"_2cc\",\n            127808: \"_2cd\",\n            127809: \"_2ce\",\n            127810: \"_2cf\",\n            127811: \"_2cg\",\n            127818: \"_2ch\",\n            127822: \"_2ci\",\n            127827: \"_2cj\",\n            127828: \"_2ck\",\n            127864: \"_2cl\",\n            127866: \"_2cm\",\n            127873: \"_2cn\",\n            127875: \"_2co\",\n            127876: \"_2cp\",\n            127877: \"_2cq\",\n            127880: \"_2cr\",\n            127881: \"_2cs\",\n            127885: \"_2ct\",\n            127886: \"_2cu\",\n            127887: \"_2cv\",\n            127888: \"_2cw\",\n            127891: \"_2cx\",\n            127925: \"_2cy\",\n            127926: \"_2cz\",\n            127932: \"_2c-\",\n            128013: \"_2c_\",\n            128014: \"_2d0\",\n            128017: \"_2d1\",\n            128018: \"_2d2\",\n            128020: \"_2d3\",\n            128023: \"_2d4\",\n            128024: \"_2d5\",\n            128025: \"_2d6\",\n            128026: \"_2d7\",\n            128027: \"_2d8\",\n            128031: \"_2d9\",\n            128032: \"_2da\",\n            128033: \"_2db\",\n            128037: \"_2dc\",\n            128038: \"_2dd\",\n            128039: \"_2de\",\n            128040: \"_2df\",\n            128041: \"_2dg\",\n            128043: \"_2dh\",\n            128044: \"_2di\",\n            128045: \"_2dj\",\n            128046: \"_2dk\",\n            128047: \"_2dl\",\n            128048: \"_2dm\",\n            128049: \"_2dn\",\n            128051: \"_2do\",\n            128052: \"_2dp\",\n            128053: \"_2dq\",\n            128054: \"_491\",\n            128055: \"_2dr\",\n            128056: \"_2ds\",\n            128057: \"_2dt\",\n            128058: \"_2du\",\n            128059: \"_2dv\",\n            128062: \"_2dw\",\n            128064: \"_2dx\",\n            128066: \"_2dy\",\n            128067: \"_2dz\",\n            128068: \"_2d-\",\n            128069: \"_2d_\",\n            128070: \"_2e0\",\n            128071: \"_2e1\",\n            128072: \"_2e2\",\n            128073: \"_2e3\",\n            128074: \"_2e4\",\n            128075: \"_2e5\",\n            128076: \"_2e6\",\n            128077: \"_2e7\",\n            128078: \"_2e8\",\n            128079: \"_2e9\",\n            128080: \"_2ea\",\n            128102: \"_2eb\",\n            128103: \"_2ec\",\n            128104: \"_2ed\",\n            128105: \"_2ee\",\n            128107: \"_2ef\",\n            128110: \"_2eg\",\n            128111: \"_2eh\",\n            128113: \"_2ei\",\n            128114: \"_2ej\",\n            128115: \"_2ek\",\n            128116: \"_2el\",\n            128117: \"_2em\",\n            128118: \"_2en\",\n            128119: \"_2eo\",\n            128120: \"_2ep\",\n            128123: \"_2eq\",\n            128124: \"_2er\",\n            128125: \"_2es\",\n            128126: \"_2et\",\n            128127: \"_2eu\",\n            128128: \"_2ev\",\n            128130: \"_2ew\",\n            128131: \"_2ex\",\n            128133: \"_2ey\",\n            128139: \"_2ez\",\n            128143: \"_2e-\",\n            128144: \"_2e_\",\n            128145: \"_2f0\",\n            128147: \"_2f1\",\n            128148: \"_2f2\",\n            128150: \"_2f3\",\n            128151: \"_2f4\",\n            128152: \"_2f5\",\n            128153: \"_2f6\",\n            128154: \"_2f7\",\n            128155: \"_2f8\",\n            128156: \"_2f9\",\n            128157: \"_2fa\",\n            128162: \"_2fb\",\n            128164: \"_2fc\",\n            128166: \"_2fd\",\n            128168: \"_2fe\",\n            128169: \"_2ff\",\n            128170: \"_2fg\",\n            128187: \"_2fh\",\n            128189: \"_2fi\",\n            128190: \"_2fj\",\n            128191: \"_2fk\",\n            128192: \"_2fl\",\n            128222: \"_2fm\",\n            128224: \"_2fn\",\n            128241: \"_2fo\",\n            128242: \"_2fp\",\n            128250: \"_2fq\",\n            128276: \"_2fr\",\n            128293: \"_492\",\n            128513: \"_2fs\",\n            128514: \"_2ft\",\n            128515: \"_2fu\",\n            128516: \"_2fv\",\n            128518: \"_2fw\",\n            128521: \"_2fx\",\n            128523: \"_2fy\",\n            128524: \"_2fz\",\n            128525: \"_2f-\",\n            128527: \"_2f_\",\n            128530: \"_2g0\",\n            128531: \"_2g1\",\n            128532: \"_2g2\",\n            128534: \"_2g3\",\n            128536: \"_2g4\",\n            128538: \"_2g5\",\n            128540: \"_2g6\",\n            128541: \"_2g7\",\n            128542: \"_2g8\",\n            128544: \"_2g9\",\n            128545: \"_2ga\",\n            128546: \"_2gb\",\n            128547: \"_2gc\",\n            128548: \"_2gd\",\n            128549: \"_2ge\",\n            128552: \"_2gf\",\n            128553: \"_2gg\",\n            128554: \"_2gh\",\n            128555: \"_2gi\",\n            128557: \"_2gj\",\n            128560: \"_2gk\",\n            128561: \"_2gl\",\n            128562: \"_2gm\",\n            128563: \"_2gn\",\n            128565: \"_2go\",\n            128567: \"_2gp\",\n            128568: \"_2gq\",\n            128569: \"_2gr\",\n            128570: \"_2gs\",\n            128571: \"_2gt\",\n            128572: \"_2gu\",\n            128573: \"_2gv\",\n            128575: \"_2gw\",\n            128576: \"_2gx\",\n            128587: \"_2gy\",\n            128588: \"_2gz\",\n            128589: \"_2g-\",\n            128591: \"_2g_\",\n            9757: \"_2h0\",\n            9786: \"_2h1\",\n            9889: \"_2h2\",\n            9924: \"_2h3\",\n            9994: \"_2h4\",\n            9995: \"_2h5\",\n            9996: \"_2h6\",\n            9728: \"_2h7\",\n            9729: \"_2h8\",\n            9748: \"_2h9\",\n            9749: \"_2ha\",\n            10024: \"_2hb\",\n            10084: \"_2hc\"\n        }\n    };\n});\n__d(\"Utf16\", [], function(a, b, c, d, e, f) {\n    var g = {\n        decode: function(h) {\n            switch (h.length) {\n              case 1:\n                return h.charCodeAt(0);\n              case 2:\n                return ((((65536 | ((((h.charCodeAt(0) - 55296)) * 1024)))) | ((h.charCodeAt(1) - 56320))));\n            };\n        ;\n        },\n        encode: function(h) {\n            if (((h < 65536))) {\n                return String.fromCharCode(h);\n            }\n             else return ((String.fromCharCode(((55296 + ((((h - 65536)) >> 10))))) + String.fromCharCode(((56320 + ((h % 1024)))))))\n        ;\n        }\n    };\n    e.exports = g;\n});\n__d(\"Emoji\", [\"cx\",\"DOM\",\"Emote\",\"SupportedEmoji\",\"htmlize\",\"Utf16\",], function(a, b, c, d, e, f) {\n    var g = b(\"cx\"), h = b(\"DOM\"), i = b(\"Emote\"), j = b(\"SupportedEmoji\"), k = b(\"htmlize\"), l = b(\"Utf16\"), m = 40, n = e.exports = {\n        htmlEmojiAndEmote: function(o, p) {\n            return n.htmlEmoji(o, function(q) {\n                return i.htmlEmote(q, p);\n            });\n        },\n        htmlEmoji: function(o, p) {\n            if (((typeof p != \"function\"))) {\n                p = k;\n            }\n        ;\n        ;\n            var q = o, r = [], s = m;\n            while (s--) {\n                var t = j.utf16Regex.exec(q);\n                if (((!t || !t.length))) {\n                    break;\n                }\n            ;\n            ;\n                var u = t[0], v = t.index;\n                r.push(p(q.substring(0, v)));\n                var w = l.decode(u);\n                if (j.emoji[w]) {\n                    var x = ((((\"_1az _1a-\" + \" \")) + j.emoji[w])), y = h.create(\"span\", {\n                        className: x\n                    });\n                    r.push(h.create(\"span\", {\n                    }, y).innerHTML);\n                }\n                 else r.push(p(u));\n            ;\n            ;\n                q = q.substring(((v + u.length)));\n            };\n        ;\n            r.push(p(q));\n            return r.join(\"\");\n        }\n    };\n});\n__d(\"TextWithEmoticons.react\", [\"Emoji\",\"Emote\",\"React\",], function(a, b, c, d, e, f) {\n    var g = b(\"Emoji\"), h = b(\"Emote\"), i = b(\"React\"), j = i.createClass({\n        displayName: \"ReactTextWithEmoticons\",\n        render: function() {\n            if (((!this.props.renderEmoticons && !this.props.renderEmoji))) {\n                return i.DOM.span(null, this.props.text);\n            }\n        ;\n        ;\n            var k;\n            if (((this.props.renderEmoticons && this.props.renderEmoji))) {\n                k = g.htmlEmoji(this.props.text, h.htmlEmoteWithoutFBID);\n            }\n             else if (this.props.renderEmoticons) {\n                k = h.htmlEmoteWithoutFBID(this.props.text);\n            }\n             else k = g.htmlEmoji(this.props.text);\n            \n        ;\n        ;\n            return i.DOM.span({\n                dangerouslySetInnerHTML: {\n                    __html: k\n                }\n            });\n        }\n    });\n    e.exports = j;\n});\n__d(\"TextWithEntities.react\", [\"Link.react\",\"React\",\"TextWithEmoticons.react\",], function(a, b, c, d, e, f) {\n    var g = b(\"Link.react\"), h = b(\"React\"), i = b(\"TextWithEmoticons.react\");\n    function j(o) {\n        return (o).replace(/<3\\b|&hearts;/g, \"\\u2665\");\n    };\n;\n    function k(o, p) {\n        return (g({\n            href: p.entities[0]\n        }, o));\n    };\n;\n    function l(o, p) {\n        return ((o.offset - p.offset));\n    };\n;\n    var m = /(\\r\\n|[\\r\\n])/, n = h.createClass({\n        displayName: \"ReactTextWithEntities\",\n        _formatStandardText: function(o) {\n            var p = o.split(m), q = [];\n            for (var r = 0; ((r < p.length)); r++) {\n                var s = p[r];\n                if (s) {\n                    if (m.test(s)) {\n                        q.push(h.DOM.br(null));\n                    }\n                     else if (((this.props.renderEmoticons || this.props.renderEmoji))) {\n                        q.push(i({\n                            text: s,\n                            renderEmoticons: this.props.renderEmoticons,\n                            renderEmoji: this.props.renderEmoji\n                        }));\n                    }\n                     else q.push(j(s));\n                    \n                ;\n                }\n            ;\n            ;\n            };\n        ;\n            return q;\n        },\n        render: function() {\n            var o = 0, p = this.props.ranges, q = this.props.aggregatedRanges, r = this.props.text, s = null;\n            if (p) {\n                s = ((q ? p.concat(q) : p.slice()));\n            }\n             else if (q) {\n                s = q.slice();\n            }\n            \n        ;\n        ;\n            if (s) {\n                s.sort(l);\n            }\n        ;\n        ;\n            var t = [], u = ((s ? s.length : 0));\n            for (var v = 0, w = u; ((v < w)); v++) {\n                var x = s[v];\n                if (((x.offset < o))) {\n                    continue;\n                }\n            ;\n            ;\n                if (((x.offset > o))) {\n                    t = t.concat(this._formatStandardText(r.substring(o, x.offset)));\n                }\n            ;\n            ;\n                var y = r.substr(x.offset, x.length);\n                t = t.concat([((this.props.interpolator ? this.props.interpolator(y, x) : k(y, x))),]);\n                o = ((x.offset + x.length));\n            };\n        ;\n            if (((r.length > o))) {\n                t = t.concat(this._formatStandardText(r.substr(o)));\n            }\n        ;\n        ;\n            return h.DOM.span(null, t);\n        }\n    });\n    e.exports = n;\n});\n__d(\"SeeMore.react\", [\"React\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"React\"), h = b(\"tx\"), i = g.createClass({\n        displayName: \"SeeMore\",\n        getInitialState: function() {\n            return {\n                isCollapsed: true\n            };\n        },\n        handleClick: function() {\n            this.setState({\n                isCollapsed: false\n            });\n        },\n        render: function() {\n            var j = this.state.isCollapsed, k = ((!j ? null : g.DOM.span(null, \"...\"))), l = this.props.children[0], m = ((j ? null : g.DOM.span(null, this.props.children[1]))), n = ((!j ? null : g.DOM.a({\n                className: \"SeeMoreLink fss\",\n                onClick: this.handleClick,\n                href: \"#\",\n                role: \"button\"\n            }, \"See More\")));\n            return (g.DOM.span({\n                className: this.props.className\n            }, l, k, n, m));\n        }\n    });\n    e.exports = i;\n});\n__d(\"TruncatedTextWithEntities.react\", [\"React\",\"TextWithEntities.react\",\"SeeMore.react\",], function(a, b, c, d, e, f) {\n    var g = b(\"React\"), h = b(\"TextWithEntities.react\"), i = b(\"SeeMore.react\");\n    function j(n, o) {\n        var p = ((n.offset + n.length));\n        return ((((o > n.offset)) && ((o < p))));\n    };\n;\n    function k(n, o) {\n        for (var p = 0; ((p < n.length)); p++) {\n            var q = n[p];\n            if (j(q, o)) {\n                return q.offset;\n            }\n        ;\n        ;\n        };\n    ;\n        return o;\n    };\n;\n    var l = function(n, o, p) {\n        var q = [], r = [], s = k(o, p);\n        for (var t = 0; ((t < o.length)); t++) {\n            var u = o[t];\n            if (((u.offset < s))) {\n                q.push(u);\n            }\n             else r.push({\n                offset: ((u.offset - s)),\n                length: u.length,\n                entities: u.entities\n            });\n        ;\n        ;\n        };\n    ;\n        return {\n            first: {\n                ranges: q,\n                text: n.substr(0, s)\n            },\n            second: {\n                ranges: r,\n                text: n.substr(s)\n            }\n        };\n    }, m = g.createClass({\n        displayName: \"TruncatedTextWithEntities\",\n        render: function() {\n            var n = this.props.maxLines, o = this.props.maxLength, p = ((this.props.truncationPercent || 175898)), q = Math.floor(((p * o))), r = ((this.props.text || \"\")), s = ((this.props.ranges || [])), t = r.split(\"\\u000a\"), u = ((t.length - 1)), v = ((o && ((r.length > o)))), w = ((n && ((u > n))));\n            if (w) {\n                q = Math.min(t.slice(0, n).join(\"\\u000a\").length, q);\n            }\n        ;\n        ;\n            if (((v || w))) {\n                var x = l(r, s, q);\n                return (g.DOM.span({\n                    \"data-ft\": this.props[\"data-ft\"],\n                    dir: this.props.dir\n                }, i({\n                    className: this.props.className\n                }, h({\n                    interpolator: this.props.interpolator,\n                    ranges: x.first.ranges,\n                    text: x.first.text,\n                    renderEmoticons: this.props.renderEmoticons,\n                    renderEmoji: this.props.renderEmoji\n                }), h({\n                    interpolator: this.props.interpolator,\n                    ranges: x.second.ranges,\n                    text: x.second.text,\n                    renderEmoticons: this.props.renderEmoticons,\n                    renderEmoji: this.props.renderEmoji\n                }))));\n            }\n             else return (g.DOM.span({\n                \"data-ft\": this.props[\"data-ft\"],\n                dir: this.props.dir\n            }, h({\n                className: this.props.className,\n                interpolator: this.props.interpolator,\n                ranges: s,\n                text: r,\n                renderEmoticons: this.props.renderEmoticons,\n                renderEmoji: this.props.renderEmoji\n            })))\n        ;\n        }\n    });\n    e.exports = m;\n});\n__d(\"UFICommentAttachment.react\", [\"DOM\",\"React\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOM\"), h = b(\"React\"), i = h.createClass({\n        displayName: \"UFICommentAttachment\",\n        _attachmentFromCommentData: function(j) {\n            return ((j.photo_comment || j.attachment));\n        },\n        componentDidMount: function(j) {\n            var k = this._attachmentFromCommentData(this.props.comment);\n            if (k) {\n                this.renderAttachment(k);\n            }\n        ;\n        ;\n        },\n        shouldComponentUpdate: function(j, k) {\n            var l = this._attachmentFromCommentData(this.props.comment), m = this._attachmentFromCommentData(j.comment);\n            if (((!l && !m))) {\n                return false;\n            }\n        ;\n        ;\n            if (((((!l || !m)) || ((l.markup != m.markup))))) {\n                return true;\n            }\n             else return false\n        ;\n        },\n        componentDidUpdate: function(j) {\n            var k = this._attachmentFromCommentData(this.props.comment);\n            this.renderAttachment(k);\n        },\n        renderAttachment: function(j) {\n            if (((j && this.refs.contents))) {\n                g.setContent(this.refs.contents.getDOMNode(), j.markup);\n            }\n        ;\n        ;\n        },\n        render: function() {\n            if (this._attachmentFromCommentData(this.props.comment)) {\n                return h.DOM.div({\n                    ref: \"contents\"\n                });\n            }\n             else return h.DOM.span(null)\n        ;\n        }\n    });\n    e.exports = i;\n});\n__d(\"UFIReplyLink.react\", [\"React\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"React\"), h = b(\"tx\"), i = g.createClass({\n        displayName: \"UFIReplyLink\",\n        render: function() {\n            return (g.DOM.a({\n                className: \"UFIReplyLink\",\n                href: \"#\",\n                onClick: this.props.onClick\n            }, \"Reply\"));\n        }\n    });\n    e.exports = i;\n});\n__d(\"UFISpamCount\", [\"UFISpamCountImpl\",], function(a, b, c, d, e, f) {\n    e.exports = ((b(\"UFISpamCountImpl\").module || {\n        enabled: false\n    }));\n});\n__d(\"UFIComment.react\", [\"function-extensions\",\"Bootloader\",\"CloseButton.react\",\"Env\",\"Focus\",\"HovercardLink\",\"HovercardLinkInterpolator\",\"LinkButton\",\"NumberFormat\",\"ProfileBrowserLink\",\"ProfileBrowserTypes\",\"React\",\"Timestamp.react\",\"TrackingNodes\",\"TruncatedTextWithEntities.react\",\"UFIClassNames\",\"UFICommentAttachment.react\",\"UFIConfig\",\"UFIConstants\",\"UFIImageBlock.react\",\"UFIInstanceState\",\"UFIReplyLink.react\",\"UFISpamCount\",\"URI\",\"cx\",\"keyMirror\",\"joinClasses\",\"tx\",], function(a, b, c, d, e, f) {\n    b(\"function-extensions\");\n    var g = b(\"Bootloader\"), h = b(\"CloseButton.react\"), i = b(\"Env\"), j = b(\"Focus\"), k = b(\"HovercardLink\"), l = b(\"HovercardLinkInterpolator\"), m = b(\"LinkButton\"), n = b(\"NumberFormat\"), o = b(\"ProfileBrowserLink\"), p = b(\"ProfileBrowserTypes\"), q = b(\"React\"), r = b(\"Timestamp.react\"), s = b(\"TrackingNodes\"), t = b(\"TruncatedTextWithEntities.react\"), u = b(\"UFIClassNames\"), v = b(\"UFICommentAttachment.react\"), w = b(\"UFIConfig\"), x = b(\"UFIConstants\"), y = b(\"UFIImageBlock.react\"), z = b(\"UFIInstanceState\"), aa = b(\"UFIReplyLink.react\"), ba = b(\"UFISpamCount\"), ca = b(\"URI\"), da = b(\"cx\"), ea = b(\"keyMirror\"), fa = b(\"joinClasses\"), ga = b(\"tx\"), ha = x.UFIStatus, ia = \" \\u00b7 \", ja = ea({\n        edit: true,\n        hide: true,\n        remove: true\n    }), ka = \"UFICommentBody\", la = \"UFICommentActorName\", ma = \"UFICommentNotSpamLink\", na = \"fsm fwn fcg UFICommentActions\", oa = \"UFIDeletedMessageIcon\", pa = \"UFIDeletedMessage\", qa = \"UFIFailureMessageIcon\", ra = \"UFIFailureMessage\", sa = \"UFICommentLikeButton\", ta = \"UFICommentLikeIcon\", ua = \"UFITranslateLink\", va = \"UFITranslatedText\", wa = \"uiLinkSubtle\", xa = \"stat_elem\", ya = \"pls\", za = \"fcg\", ab = 27, bb = null, cb = function(kb, lb) {\n        var mb = new ca(\"/ajax/like/tooltip.php\").setQueryData({\n            comment_fbid: kb.fbid,\n            comment_from: kb.author,\n            cache_buster: ((kb.likeconfirmhash || 0))\n        });\n        if (lb) {\n            mb.addQueryData({\n                viewas: lb\n            });\n        }\n    ;\n    ;\n        return mb;\n    }, db = function(kb) {\n        var lb = kb.JSBNG__status;\n        return ((((lb === ha.FAILED_ADD)) || ((lb === ha.FAILED_EDIT))));\n    };\n    function eb(kb) {\n        return ((((((kb.commenterIsFOF !== undefined)) && ((kb.userIsMinor !== undefined)))) && ((kb.reportLink !== undefined))));\n    };\n;\n    var fb = q.createClass({\n        displayName: \"UFICommentLikeCount\",\n        render: function() {\n            var kb = this.props.comment, lb = n.formatIntegerWithDelimiter(((kb.likecount || 0)), this.props.contextArgs.numberdelimiter), mb = p.LIKES, nb = {\n                id: kb.fbid\n            }, ob = cb(this.props.comment, this.props.viewas), pb = q.DOM.i({\n                className: ta\n            }), qb = q.DOM.span(null, lb);\n            return (q.DOM.a({\n                className: sa,\n                role: \"button\",\n                rel: \"dialog\",\n                \"data-hover\": \"tooltip\",\n                \"data-tooltip-alignh\": \"center\",\n                \"data-tooltip-uri\": ob.toString(),\n                ajaxify: o.constructDialogURI(mb, nb).toString(),\n                href: o.constructPageURI(mb, nb).toString()\n            }, pb, qb));\n        }\n    }), gb = q.createClass({\n        displayName: \"UFICommentActions\",\n        render: function() {\n            var kb = this.props, lb = kb.comment, mb = kb.feedback, nb = kb.markedAsSpamHere, ob = ((lb.JSBNG__status === ha.SPAM_DISPLAY)), pb = this.props.showReplyLink, qb = this.props.hideAsSpamForPageAdmin, rb, sb, tb, ub, vb, wb, xb = ((!lb.islocal && ((lb.JSBNG__status !== ha.LIVE_DELETED))));\n            if (xb) {\n                if (((ob && !nb))) {\n                    if (kb.viewerCanMarkNotSpam) {\n                        rb = q.DOM.a({\n                            onClick: kb.onMarkAsNotSpam,\n                            className: ma,\n                            href: \"#\",\n                            role: \"button\"\n                        }, \"Unhide\");\n                    }\n                ;\n                ;\n                    if (((((((qb && mb.isthreaded)) && mb.cancomment)) && pb))) {\n                        vb = aa({\n                            comment: lb,\n                            onClick: kb.onCommentReply,\n                            contextArgs: kb.contextArgs\n                        });\n                    }\n                ;\n                ;\n                }\n                 else {\n                    if (mb.viewercanlike) {\n                        var yb = s.getTrackingInfo(((lb.hasviewerliked ? s.types.UNLIKE_LINK : s.types.LIKE_LINK))), zb = ((lb.hasviewerliked ? \"Unlike this comment\" : \"Like this comment\"));\n                        sb = q.DOM.a({\n                            className: \"UFILikeLink\",\n                            href: \"#\",\n                            role: \"button\",\n                            onClick: kb.onCommentLikeToggle,\n                            \"data-ft\": yb,\n                            title: zb\n                        }, ((lb.hasviewerliked ? \"Unlike\" : \"Like\")));\n                    }\n                ;\n                ;\n                    if (((((mb.isthreaded && mb.cancomment)) && pb))) {\n                        vb = aa({\n                            comment: lb,\n                            onClick: kb.onCommentReply,\n                            contextArgs: kb.contextArgs\n                        });\n                    }\n                ;\n                ;\n                    if (((lb.likecount > 0))) {\n                        tb = fb({\n                            comment: lb,\n                            viewas: this.props.viewas,\n                            contextArgs: this.props.contextArgs\n                        });\n                    }\n                ;\n                ;\n                    if (((lb.spamcount && ba.enabled))) {\n                        ub = ba({\n                            count: lb.spamcount\n                        });\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n                if (((lb.attachment && lb.canremove))) {\n                    wb = q.DOM.a({\n                        onClick: kb.onPreviewRemove,\n                        href: \"#\",\n                        role: \"button\"\n                    }, \"Remove Preview\");\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            var ac = hb({\n                comment: lb,\n                onRetrySubmit: kb.onRetrySubmit,\n                showPermalink: kb.showPermalink\n            }), bc;\n            if (kb.contextArgs.entstream) {\n                bc = [ac,sb,tb,vb,ub,rb,wb,];\n            }\n             else if (mb.isthreaded) {\n                bc = [sb,vb,rb,wb,tb,ub,ac,];\n            }\n             else bc = [ac,sb,tb,ub,vb,rb,wb,];\n            \n        ;\n        ;\n            if (((lb.JSBNG__status === ha.LIVE_DELETED))) {\n                var cc = q.DOM.span({\n                    className: pa\n                }, q.DOM.i({\n                    className: oa,\n                    \"data-hover\": \"tooltip\",\n                    \"aria-label\": \"Comment deleted\"\n                }));\n                bc.push(cc);\n            }\n        ;\n        ;\n            var dc = [];\n            for (var ec = 0; ((ec < bc.length)); ec++) {\n                if (bc[ec]) {\n                    dc.push(ia);\n                    dc.push(bc[ec]);\n                }\n            ;\n            ;\n            };\n        ;\n            dc.shift();\n            return (q.DOM.div({\n                className: na\n            }, dc));\n        }\n    }), hb = q.createClass({\n        displayName: \"UFICommentMetadata\",\n        render: function() {\n            var kb = this.props.comment, lb = this.props.onRetrySubmit, mb, nb;\n            if (db(kb)) {\n                mb = [q.DOM.span({\n                    className: ra\n                }, q.DOM.i({\n                    className: qa\n                }), \"Unable to post comment.\"),((((kb.allowRetry && lb)) ? [\" \",q.DOM.a({\n                    onClick: lb,\n                    href: \"#\",\n                    role: \"button\"\n                }, \"Try Again\"),] : null)),];\n            }\n             else {\n                var ob = ((this.props.showPermalink ? kb.permalink : null)), pb = s.getTrackingInfo(s.types.SOURCE), qb = q.DOM.a({\n                    className: wa,\n                    href: ob,\n                    \"data-ft\": pb\n                }, r({\n                    time: kb.timestamp.time,\n                    text: kb.timestamp.text,\n                    verbose: kb.timestamp.verbose\n                })), rb;\n                switch (kb.source) {\n                  case x.UFISourceType.MOBILE:\n                    rb = q.DOM.a({\n                        className: wa,\n                        href: new ca(\"/mobile/\").setSubdomain(\"www\").toString()\n                    }, \"mobile\");\n                    break;\n                  case x.UFISourceType.SMS:\n                    rb = q.DOM.a({\n                        className: wa,\n                        href: new ca(\"/mobile/?v=texts\").setSubdomain(\"www\").toString()\n                    }, \"text message\");\n                    break;\n                  case x.UFISourceType.EMAIL:\n                    rb = m({\n                        subtle: true,\n                        label: \"email\",\n                        inputType: \"submit\",\n                        JSBNG__name: \"email_explain\",\n                        value: true,\n                        className: xa\n                    });\n                    break;\n                };\n            ;\n                nb = ((rb ? ga._(\"{time} via {source}\", {\n                    time: qb,\n                    source: rb\n                }) : qb));\n            }\n        ;\n        ;\n            var sb = null;\n            if (kb.originalTimestamp) {\n                var tb = new ca(\"/ajax/edits/browser/comment\").addQueryData({\n                    comment_token: kb.id\n                }).toString();\n                sb = [ia,q.DOM.a({\n                    ref: \"EditLink\",\n                    href: \"#\",\n                    role: \"button\",\n                    rel: \"dialog\",\n                    className: \"uiLinkSubtle\",\n                    ajaxify: tb,\n                    \"data-hover\": \"tooltip\",\n                    \"aria-label\": \"Show edit history\",\n                    title: \"Show edit history\"\n                }, \"Edited\"),];\n            }\n        ;\n        ;\n            return (q.DOM.span(null, nb, mb, sb));\n        },\n        componentWillUpdate: function(kb) {\n            var lb = this.props.comment, mb = kb.comment;\n            if (((!lb.editnux && !!mb.editnux))) {\n                g.loadModules([\"LegacyContextualDialog\",], function(nb) {\n                    var ob = new nb();\n                    ob.init(mb.editnux).setContext(this.refs.EditLink.getDOMNode()).setWidth(300).setPosition(\"below\").show();\n                }.bind(this));\n            }\n        ;\n        ;\n        }\n    }), ib = q.createClass({\n        displayName: \"UFISocialContext\",\n        render: function() {\n            var kb = this.props.topMutualFriend, lb = this.props.otherMutualCount, mb = this.props.commentAuthor, nb = k.constructEndpoint(kb).toString(), ob = q.DOM.a({\n                href: kb.uri,\n                \"data-hovercard\": nb\n            }, kb.JSBNG__name), pb = ((mb.JSBNG__name.length + kb.JSBNG__name.length)), qb;\n            if (((lb === 0))) {\n                qb = ga._(\"Friends with {name}\", {\n                    JSBNG__name: ob\n                });\n            }\n             else if (((pb < ab))) {\n                var rb;\n                if (((lb == 1))) {\n                    rb = \"1 other\";\n                }\n                 else rb = ga._(\"{count} others\", {\n                    count: lb\n                });\n            ;\n            ;\n                qb = ga._(\"Friends with {name} and {others}\", {\n                    JSBNG__name: ob,\n                    others: this.getOthersLink(rb, mb, kb)\n                });\n            }\n             else {\n                var sb = ga._(\"{count} mutual friends\", {\n                    count: ((lb + 1))\n                });\n                qb = this.getOthersLink(sb, mb);\n            }\n            \n        ;\n        ;\n            return (q.DOM.span({\n                className: \"UFICommentSocialContext\"\n            }, ia, qb));\n        },\n        getOthersLink: function(kb, lb, mb) {\n            var nb = p.MUTUAL_FRIENDS, ob = {\n                uid: lb.id\n            }, pb = new ca(\"/ajax/mutual_friends/tooltip.php\").setQueryData({\n                friend_id: lb.id\n            });\n            if (mb) {\n                pb.addQueryData({\n                    exclude_id: mb.id\n                });\n            }\n        ;\n        ;\n            var qb = o.constructDialogURI(nb, ob).toString();\n            return (q.DOM.a({\n                rel: \"dialog\",\n                \"data-hover\": \"tooltip\",\n                \"data-tooltip-alignh\": \"center\",\n                \"data-tooltip-uri\": pb.toString(),\n                ajaxify: qb,\n                href: o.constructPageURI(nb, ob).toString()\n            }, kb));\n        }\n    }), jb = q.createClass({\n        displayName: \"UFIComment\",\n        getInitialState: function() {\n            return {\n                isHighlighting: this.props.comment.highlightcomment,\n                wasHighlighted: this.props.comment.highlightcomment,\n                markedAsSpamHere: false,\n                oneClickRemovedHere: false,\n                isInlinePageDeleted: false,\n                isInlineBanned: false\n            };\n        },\n        _onHideAsSpam: function(JSBNG__event) {\n            this.props.onHideAsSpam(JSBNG__event);\n            this.setState({\n                markedAsSpamHere: true\n            });\n        },\n        _onMarkAsNotSpam: function(JSBNG__event) {\n            this.props.onMarkAsNotSpam(JSBNG__event);\n            this.setState({\n                markedAsSpamHere: false\n            });\n        },\n        _onDeleteSpam: function(JSBNG__event) {\n            this.props.onOneClickRemove(JSBNG__event);\n            this.setState({\n                isInlinePageDeleted: true\n            });\n        },\n        _onUndoDeleteSpam: function(JSBNG__event) {\n            this.props.onUndoOneClickRemove(JSBNG__event);\n            this.setState({\n                isInlinePageDeleted: false\n            });\n        },\n        _onInlineBan: function(JSBNG__event) {\n            this.props.onInlineBan(JSBNG__event);\n            this.setState({\n                isInlineBanned: true\n            });\n        },\n        _onUndoInlineBan: function(JSBNG__event) {\n            this.props.onUndoInlineBan(JSBNG__event);\n            this.setState({\n                isInlineBanned: false\n            });\n        },\n        _onOneClickRemove: function(JSBNG__event) {\n            this.props.onOneClickRemove(JSBNG__event);\n            this.setState({\n                oneClickRemovedHere: true\n            });\n        },\n        _onUndoOneClickRemove: function(JSBNG__event) {\n            this.props.onUndoOneClickRemove(JSBNG__event);\n            this.setState({\n                oneClickRemovedHere: false\n            });\n        },\n        _onAction: function(JSBNG__event, kb) {\n            if (((kb === ja.remove))) {\n                this.props.onRemove(JSBNG__event);\n            }\n             else if (((kb === ja.edit))) {\n                this.props.onEdit(JSBNG__event);\n            }\n             else if (((kb === ja.hide))) {\n                this._onHideAsSpam(JSBNG__event);\n            }\n            \n            \n        ;\n        ;\n        },\n        _createRemoveReportMenu: function(JSBNG__event) {\n            if (this._removeReportMenu) {\n                return;\n            }\n        ;\n        ;\n            var kb = [{\n                label: \"Delete Comment...\",\n                value: ja.remove\n            },{\n                label: \"Hide Comment\",\n                value: ja.hide\n            },];\n            if (JSBNG__event.persist) {\n                JSBNG__event.persist();\n            }\n             else JSBNG__event = JSBNG__event.constructor.persistentCloneOf(JSBNG__event);\n        ;\n        ;\n            g.loadModules([\"LegacyMenuUtils\",], function(lb) {\n                this._removeReportMenu = lb.createAndShowPopoverMenu(JSBNG__event.target, kb, this._onAction.bind(this, JSBNG__event));\n            }.bind(this));\n        },\n        _createEditDeleteMenu: function(JSBNG__event) {\n            if (JSBNG__event.persist) {\n                JSBNG__event.persist();\n            }\n             else JSBNG__event = JSBNG__event.constructor.persistentCloneOf(JSBNG__event);\n        ;\n        ;\n            if (this._editDeleteMenu) {\n                return;\n            }\n        ;\n        ;\n            var kb = [{\n                label: \"Edit...\",\n                value: ja.edit\n            },{\n                label: \"Delete...\",\n                value: ja.remove\n            },];\n            g.loadModules([\"LegacyMenuUtils\",], function(lb) {\n                this._editDeleteMenu = lb.createAndShowPopoverMenu(JSBNG__event.target, kb, this._onAction.bind(this, JSBNG__event));\n            }.bind(this));\n        },\n        _renderCloseButton: function() {\n            var kb = this.props.comment, lb = this.props.feedback, mb = null, nb = null, ob = false;\n            if (((kb.canremove && !this.props.hideAsSpamForPageAdmin))) {\n                if (this.props.viewerIsAuthor) {\n                    if (kb.canedit) {\n                        nb = \"Edit or Delete\";\n                        mb = this._createEditDeleteMenu;\n                        ob = true;\n                    }\n                     else {\n                        nb = \"Remove\";\n                        mb = this.props.onRemove;\n                    }\n                ;\n                ;\n                }\n                 else if (lb.canremoveall) {\n                    if (this.props.showRemoveReportMenu) {\n                        nb = \"Remove or Report\";\n                        mb = this._createRemoveReportMenu;\n                    }\n                     else {\n                        nb = \"Remove\";\n                        mb = this._onOneClickRemove;\n                    }\n                ;\n                }\n                \n            ;\n            ;\n            }\n             else if (kb.canreport) {\n                nb = \"Hide\";\n                mb = this._onHideAsSpam;\n            }\n            \n        ;\n        ;\n            var pb = (((((\"UFICommentCloseButton\") + ((ob ? ((\" \" + \"UFIEditButton\")) : \"\")))) + ((((mb === null)) ? ((\" \" + \"hdn\")) : \"\"))));\n            return (h({\n                onClick: mb,\n                tooltip: nb,\n                className: pb\n            }));\n        },\n        componentDidMount: function(kb) {\n            var lb = this.props.comment.ufiinstanceid;\n            if (this.state.isHighlighting) {\n                g.loadModules([\"UFIScrollHighlight\",], function(nb) {\n                    nb.actOn.curry(kb).defer();\n                });\n                this.setState({\n                    isHighlighting: false\n                });\n            }\n        ;\n        ;\n            var mb = z.getKeyForInstance(lb, \"autofocus\");\n            if (mb) {\n                j.setWithoutOutline(this.refs.AuthorName.getDOMNode());\n                z.updateState(lb, \"autofocus\", false);\n            }\n        ;\n        ;\n        },\n        shouldComponentUpdate: function(kb) {\n            var lb = this.props;\n            return ((((((((((((((((((((((kb.comment !== lb.comment)) || ((kb.showReplyLink !== lb.showReplyLink)))) || ((kb.showReplies !== lb.showReplies)))) || ((kb.isFirst !== lb.isFirst)))) || ((kb.isLast !== lb.isLast)))) || ((kb.isFirstCommentComponent !== lb.isFirstCommentComponent)))) || ((kb.isLastCommentComponent !== lb.isLastCommentComponent)))) || ((kb.isFirstComponent !== lb.isFirstComponent)))) || ((kb.isLastComponent !== lb.isLastComponent)))) || ((kb.isFeaturedComment !== lb.isFeaturedComment)))) || ((kb.hasPartialBorder !== lb.hasPartialBorder))));\n        },\n        render: function() {\n            var kb = this.props.comment, lb = this.props.feedback, mb = ((kb.JSBNG__status === ha.DELETED)), nb = ((kb.JSBNG__status === ha.LIVE_DELETED)), ob = ((kb.JSBNG__status === ha.SPAM_DISPLAY)), pb = ((kb.JSBNG__status === ha.PENDING_UNDO_DELETE)), qb = this.state.markedAsSpamHere, rb = this.state.oneClickRemovedHere, sb = this.state.isInlinePageDeleted, tb = this.props.hideAsSpamForPageAdmin, ub = this.state.isInlineBanned, vb = eb(kb), wb = ((!kb.JSBNG__status && ((kb.isunseen || kb.islocal))));\n            if (((!kb.JSBNG__status && lb.lastseentime))) {\n                var xb = ((kb.originalTimestamp || kb.timestamp.time));\n                wb = ((wb || ((xb > lb.lastseentime))));\n            }\n        ;\n        ;\n            var yb = this.props.contextArgs.markedcomments;\n            if (((yb && yb[kb.legacyid]))) {\n                wb = true;\n            }\n        ;\n        ;\n            if (vb) {\n                if (bb) {\n                    var zb, ac = null, bc = null, cc = null;\n                    if (tb) {\n                        bc = ((ub ? this._onUndoInlineBan : this._onInlineBan));\n                        if (sb) {\n                            ac = this._onUndoDeleteSpam;\n                            var dc = q.DOM.a({\n                                href: \"#\",\n                                onClick: ac\n                            }, \"Undo\");\n                            zb = ga._(\"You've deleted this comment so no one can see it. {undo}.\", {\n                                undo: dc\n                            });\n                        }\n                         else if (qb) {\n                            zb = \"Now this is only visible to the person who wrote it and their friends.\";\n                            cc = this._onDeleteSpam;\n                            ac = this._onMarkAsNotSpam;\n                        }\n                        \n                    ;\n                    ;\n                    }\n                     else if (qb) {\n                        zb = \"This comment has been hidden.\";\n                        cc = this._onDeleteSpam;\n                        ac = this._onMarkAsNotSpam;\n                    }\n                     else if (rb) {\n                        zb = \"This comment has been removed.\";\n                        ac = this._onUndoOneClickRemove;\n                    }\n                    \n                    \n                ;\n                ;\n                    if (zb) {\n                        return (q.DOM.li({\n                            className: fa(u.ROW, \"UFIHide\")\n                        }, bb({\n                            notice: zb,\n                            comment: this.props.comment,\n                            authorProfiles: this.props.authorProfiles,\n                            onUndo: ac,\n                            onBanAction: bc,\n                            onDeleteAction: cc,\n                            isInlineBanned: ub,\n                            hideAsSpamForPageAdmin: tb\n                        })));\n                    }\n                ;\n                ;\n                }\n                 else g.loadModules([\"UFICommentRemovalControls.react\",], function(gc) {\n                    bb = gc;\n                    JSBNG__setTimeout(function() {\n                        this.forceUpdate();\n                    }.bind(this));\n                }.bind(this));\n            ;\n            }\n        ;\n        ;\n            var ec = fa(u.ROW, (((((((((((((((((((((((((\"UFIComment\") + ((db(kb) ? ((\" \" + \"UFICommentFailed\")) : \"\")))) + ((((((((mb || nb)) || ob)) || pb)) ? ((\" \" + \"UFITranslucentComment\")) : \"\")))) + ((this.state.isHighlighting ? ((\" \" + \"highlightComment\")) : \"\")))) + ((((mb && !rb)) ? ((\" \" + \"noDisplay\")) : \"\")))) + ((((this.props.isFirst && !this.props.isReply)) ? ((\" \" + \"UFIFirstComment\")) : \"\")))) + ((((this.props.isLast && !this.props.isReply)) ? ((\" \" + \"UFILastComment\")) : \"\")))) + ((this.props.isFirstCommentComponent ? ((\" \" + \"UFIFirstCommentComponent\")) : \"\")))) + ((this.props.isLastCommentComponent ? ((\" \" + \"UFILastCommentComponent\")) : \"\")))) + ((this.props.isFirstComponent ? ((\" \" + \"UFIFirstComponent\")) : \"\")))) + ((this.props.isLastComponent ? ((\" \" + \"UFILastComponent\")) : \"\")))) + ((this.props.isFeatured ? ((\" \" + \"UFIFeaturedComment\")) : \"\")))) + ((((this.props.hasPartialBorder && !this.props.contextArgs.entstream)) ? ((\" \" + \"UFIPartialBorder\")) : \"\"))))), fc = this.renderComment();\n            if (wb) {\n                if (this.props.contextArgs.snowliftredesign) {\n                    fc = q.DOM.div({\n                        className: \"_5cis\"\n                    }, q.DOM.div({\n                        className: \"_5cit\"\n                    }), fc);\n                }\n                 else if (((this.props.contextArgs.entstream && !this.props.isReply))) {\n                    fc = q.DOM.div({\n                        className: \"_52mp\"\n                    }, q.DOM.div({\n                        className: \"_52mq\"\n                    }), fc);\n                }\n                 else ec = fa(ec, u.UNSEEN_ITEM);\n                \n            ;\n            }\n        ;\n        ;\n            return (q.DOM.li({\n                className: ec,\n                \"data-ft\": this.props[\"data-ft\"]\n            }, fc));\n        },\n        renderComment: function() {\n            var kb = this.props, lb = kb.comment, mb = kb.feedback, nb = kb.authorProfiles[lb.author], ob = ((lb.JSBNG__status === ha.SPAM_DISPLAY)), pb = ((lb.JSBNG__status === ha.LIVE_DELETED)), qb = !((ob || pb)), rb = ((mb.canremoveall || lb.hiddenbyviewer)), sb = null, tb = null;\n            if (((((!kb.isLocallyComposed && !this.state.wasHighlighted)) && !lb.fromfetch))) {\n                tb = x.commentTruncationLength;\n                sb = x.commentTruncationMaxLines;\n            }\n        ;\n        ;\n            var ub = s.getTrackingInfo(s.types.SMALL_ACTOR_PHOTO), vb = s.getTrackingInfo(s.types.USER_NAME), wb = s.getTrackingInfo(s.types.USER_MESSAGE), xb = null, yb = null;\n            if (((lb.istranslatable && ((lb.translatedtext === undefined))))) {\n                xb = q.DOM.a({\n                    href: \"#\",\n                    role: \"button\",\n                    title: \"Translate this comment\",\n                    className: ua,\n                    onClick: kb.onCommentTranslate\n                }, \"See Translation\");\n            }\n        ;\n        ;\n            if (lb.translatedtext) {\n                var zb = new ca(\"http://bing.com/translator\").addQueryData({\n                    text: lb.body.text\n                });\n                yb = q.DOM.span({\n                    className: va\n                }, lb.translatedtext, q.DOM.span({\n                    className: ya\n                }, \" (\", q.DOM.a({\n                    href: zb.toString(),\n                    className: za\n                }, \"Translated by Bing\"), \") \"));\n            }\n        ;\n        ;\n            var ac;\n            if (((i.rtl && ((lb.body.dir === \"ltr\"))))) {\n                ac = \"rtl\";\n            }\n             else if (((!i.rtl && ((lb.body.dir === \"rtl\"))))) {\n                ac = \"ltr\";\n            }\n            \n        ;\n        ;\n            var bc = k.constructEndpointWithLocation(nb, \"ufi\").toString(), cc = q.DOM.a({\n                ref: \"AuthorName\",\n                className: la,\n                href: nb.uri,\n                \"data-hovercard\": bc,\n                \"data-ft\": vb,\n                dir: ac\n            }, nb.JSBNG__name), dc = function(ic, jc) {\n                return l(ic, jc, \"_blank\", mb.grouporeventid, \"ufi\");\n            }, ec = t({\n                className: ka,\n                interpolator: dc,\n                ranges: lb.body.ranges,\n                text: lb.body.text,\n                truncationPercent: x.commentTruncationPercent,\n                maxLength: tb,\n                maxLines: sb,\n                renderEmoticons: w.renderEmoticons,\n                renderEmoji: w.renderEmoji,\n                \"data-ft\": wb,\n                dir: lb.body.dir\n            }), fc;\n            if (lb.socialcontext) {\n                var gc = lb.socialcontext, hc = ib({\n                    topMutualFriend: kb.authorProfiles[gc.topmutualid],\n                    otherMutualCount: gc.othermutualcount,\n                    commentAuthor: nb\n                });\n                fc = [cc,hc,q.DOM.div(null, ec),];\n            }\n             else fc = [cc,\" \",ec,];\n        ;\n        ;\n            return (y({\n                spacing: \"medium\"\n            }, q.DOM.a({\n                href: nb.uri,\n                \"data-hovercard\": bc,\n                \"data-ft\": ub\n            }, q.DOM.img({\n                src: nb.thumbSrc,\n                className: u.ACTOR_IMAGE,\n                alt: \"\"\n            })), q.DOM.div(null, q.DOM.div({\n                className: \"UFICommentContent\"\n            }, fc, xb, yb, v({\n                comment: kb.comment\n            })), gb({\n                comment: lb,\n                feedback: mb,\n                onBlingBoxClick: kb.onBlingBoxClick,\n                onCommentLikeToggle: kb.onCommentLikeToggle,\n                onCommentReply: kb.onCommentReply,\n                onPreviewRemove: kb.onPreviewRemove,\n                onRetrySubmit: kb.onRetrySubmit,\n                onMarkAsNotSpam: this._onMarkAsNotSpam,\n                viewerCanMarkNotSpam: rb,\n                viewas: kb.contextArgs.viewas,\n                showPermalink: kb.showPermalink,\n                showReplyLink: kb.showReplyLink,\n                showReplies: kb.showReplies,\n                contextArgs: kb.contextArgs,\n                markedAsSpamHere: this.state.markedAsSpamHere,\n                hideAsSpamForPageAdmin: kb.hideAsSpamForPageAdmin\n            })), ((qb ? this._renderCloseButton() : null))));\n        }\n    });\n    e.exports = jb;\n});\n__d(\"UFIContainer.react\", [\"React\",\"TrackingNodes\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"React\"), h = b(\"TrackingNodes\"), i = b(\"cx\"), j = g.createClass({\n        displayName: \"UFIContainer\",\n        render: function() {\n            var k = null;\n            if (this.props.hasNub) {\n                k = g.DOM.li({\n                    className: \"UFIArrow\"\n                }, g.DOM.i(null));\n            }\n        ;\n        ;\n            var l = ((((((((((((((!this.props.isReplyList ? \"UFIList\" : \"\")) + ((this.props.isReplyList ? ((\" \" + \"UFIReplyList\")) : \"\")))) + ((this.props.isParentLiveDeleted ? ((\" \" + \"UFITranslucentReplyList\")) : \"\")))) + ((this.props.isFirstCommentComponent ? ((\" \" + \"UFIFirstCommentComponent\")) : \"\")))) + ((this.props.isLastCommentComponent ? ((\" \" + \"UFILastCommentComponent\")) : \"\")))) + ((this.props.isFirstComponent ? ((\" \" + \"UFIFirstComponent\")) : \"\")))) + ((this.props.isLastComponent ? ((\" \" + \"UFILastComponent\")) : \"\"))));\n            return (g.DOM.ul({\n                className: l,\n                \"data-ft\": h.getTrackingInfo(h.types.UFI)\n            }, k, this.props.children));\n        }\n    });\n    e.exports = j;\n});\n__d(\"GiftOpportunityLogger\", [\"AsyncRequest\",\"JSBNG__Event\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = b(\"JSBNG__Event\"), i = {\n        init: function(k, l, m) {\n            var n = false;\n            h.listen(k, \"click\", function(o) {\n                if (n) {\n                    return true;\n                }\n            ;\n            ;\n                n = true;\n                i.send(l, m);\n            });\n        },\n        send: function(k, l) {\n            if (j[k.opportunity_id]) {\n                return;\n            }\n        ;\n        ;\n            j[k.opportunity_id] = true;\n            return new g().setURI(\"/ajax/gifts/log/opportunity\").setData({\n                data: k,\n                entry_point: l\n            }).send();\n        }\n    }, j = {\n    };\n    e.exports = i;\n});\n__d(\"InlineBlock.react\", [\"ReactProps\",\"React\",\"cx\",\"joinClasses\",], function(a, b, c, d, e, f) {\n    var g = b(\"ReactProps\"), h = b(\"React\"), i = b(\"cx\"), j = b(\"joinClasses\"), k = {\n        baseline: null,\n        bottom: \"_6d\",\n        middle: \"_6b\",\n        JSBNG__top: \"_6e\"\n    }, l = h.createClass({\n        displayName: \"InlineBlock\",\n        props: {\n            alignv: g.oneOf([\"baseline\",\"bottom\",\"middle\",\"JSBNG__top\",]),\n            height: g.number\n        },\n        getDefaultProps: function() {\n            return {\n                alignv: \"baseline\"\n            };\n        },\n        render: function() {\n            var m = k[this.props.alignv], n = h.DOM.div({\n                className: j(\"_6a\", m)\n            }, this.props.children);\n            if (((this.props.height != null))) {\n                var o = h.DOM.div({\n                    className: j(\"_6a\", m),\n                    style: {\n                        height: ((this.props.height + \"px\"))\n                    }\n                });\n                n = h.DOM.div({\n                    className: \"_6a\",\n                    height: null\n                }, o, n);\n            }\n        ;\n        ;\n            return this.transferPropsTo(n);\n        }\n    });\n    e.exports = l;\n});\n__d(\"JSBNG__Image.react\", [\"React\",\"invariant\",\"joinClasses\",], function(a, b, c, d, e, f) {\n    var g = b(\"React\"), h = b(\"invariant\"), i = b(\"joinClasses\"), j = g.createClass({\n        displayName: \"ReactImage\",\n        props: {\n            src: function(k, l, m) {\n                var n = k[l];\n                h(((((typeof n === \"string\")) || ((((typeof n === \"object\")) && ((((((n.sprited && n.spriteMapCssClass)) && n.spriteCssClass)) || ((!n.sprited && n.uri)))))))));\n            }\n        },\n        render: function() {\n            var k, l, m = this.props.src, n = \"img\";\n            l = true;\n            if (((typeof m === \"string\"))) {\n                k = g.DOM.img({\n                    className: n,\n                    src: m\n                });\n            }\n             else if (m.sprited) {\n                n = i(n, m.spriteMapCssClass, m.spriteCssClass);\n                k = g.DOM.i({\n                    className: n,\n                    src: null\n                });\n                l = false;\n            }\n             else {\n                k = g.DOM.img({\n                    className: n,\n                    src: m.uri\n                });\n                if (((((typeof this.props.width === \"undefined\")) && ((typeof this.props.height === \"undefined\"))))) {\n                    k.props.width = m.width;\n                    k.props.height = m.height;\n                }\n            ;\n            ;\n            }\n            \n        ;\n        ;\n            if (this.props.alt) {\n                if (l) {\n                    k.props.alt = this.props.alt;\n                }\n                 else k.props.children = g.DOM.u(null, this.props.alt);\n            ;\n            }\n        ;\n        ;\n            return this.transferPropsTo(k);\n        }\n    });\n    e.exports = j;\n});\n__d(\"UFIGiftSentence.react\", [\"AsyncRequest\",\"CloseButton.react\",\"GiftOpportunityLogger\",\"ImageBlock.react\",\"InlineBlock.react\",\"LeftRight.react\",\"Link.react\",\"React\",\"JSBNG__Image.react\",\"UFIClassNames\",\"UFIImageBlock.react\",\"URI\",\"DOM\",\"ix\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = b(\"CloseButton.react\"), i = b(\"GiftOpportunityLogger\"), j = b(\"ImageBlock.react\"), k = b(\"InlineBlock.react\"), l = b(\"LeftRight.react\"), m = b(\"Link.react\"), n = b(\"React\"), o = b(\"JSBNG__Image.react\"), p = b(\"UFIClassNames\"), q = b(\"UFIImageBlock.react\"), r = b(\"URI\"), s = b(\"DOM\"), t = b(\"ix\"), u = b(\"tx\"), v = n.createClass({\n        displayName: \"UFIGiftSentence\",\n        _entry_point: \"detected_gift_worthy_story_inline\",\n        render: function() {\n            var w = this.props.recipient, x = this.props.giftdata, y = ((x ? x.giftproductid : null)), z = this._getURI(y).toString();\n            this._log();\n            return (n.DOM.li({\n                className: p.ROW,\n                ref: \"UFIGiftSentence\"\n            }, l({\n                direction: \"right\"\n            }, ((x ? this._renderGiftSuggestion(z, w, x) : this._renderGiftLink(z, w))), h({\n                size: \"small\",\n                onClick: function() {\n                    var aa = this.refs.UFIGiftSentence.getDOMNode();\n                    s.remove(aa);\n                    this._requestClose();\n                }.bind(this)\n            }))));\n        },\n        _renderGiftSuggestion: function(w, x, y) {\n            return (q(null, o({\n                src: t(\"/images/group_gifts/icons/gift_icon_red-13px.png\"),\n                alt: \"invite\"\n            }), n.DOM.div(null, n.DOM.span({\n                className: \"fwb\"\n            }, u._(\"Surprise {name} with a gift\", {\n                JSBNG__name: x.firstName\n            })), j({\n                spacing: \"medium\",\n                className: \"mvs\"\n            }, m({\n                className: \"fwb\",\n                rel: \"async-post\",\n                ajaxify: w,\n                href: {\n                    url: \"#\"\n                }\n            }, o({\n                className: \"UFIGiftProductImg\",\n                src: y.giftproductimgsrc,\n                alt: \"product image\"\n            })), k({\n                alignv: \"middle\",\n                height: 79\n            }, n.DOM.p({\n                className: \"mvs\"\n            }, m({\n                className: \"fwb\",\n                rel: \"async-post\",\n                ajaxify: w,\n                href: {\n                    url: \"#\"\n                }\n            }, y.giftproductname)), n.DOM.p({\n                className: \"mvs fcg\"\n            }, y.giftproductpricerange), n.DOM.p({\n                className: \"mvs\"\n            }, m({\n                rel: \"async-post\",\n                ajaxify: w,\n                href: {\n                    url: \"#\"\n                }\n            }, \"Give This Gift\"), \" \\u00b7 \", m({\n                rel: \"async-post\",\n                ajaxify: this._getURI().toString(),\n                href: {\n                    url: \"#\"\n                }\n            }, \"See All Gifts\")))))));\n        },\n        _renderGiftLink: function(w, x) {\n            return (q(null, m({\n                className: \"UFIGiftIcon\",\n                tabIndex: \"-1\",\n                href: {\n                    url: \"#\"\n                },\n                rel: \"async-post\",\n                ajaxify: w\n            }, o({\n                src: t(\"/images/group_gifts/icons/gift_icon_red-13px.png\"),\n                alt: \"invite\"\n            })), m({\n                rel: \"async-post\",\n                href: {\n                    url: \"#\"\n                },\n                ajaxify: w\n            }, u._(\"Surprise {name} with a gift\", {\n                JSBNG__name: x.firstName\n            }))));\n        },\n        _log: function() {\n            var w = this.props.giftdata, x = {\n                opportunity_id: this.props.contextArgs.ftentidentifier,\n                sender_id: this.props.sender.id,\n                recipient_id: this.props.recipient.id,\n                link_description: \"UFIGiftSentence\",\n                product_id: ((w ? w.giftproductid : null)),\n                custom: {\n                    gift_occasion: this.props.contextArgs.giftoccasion,\n                    ftentidentifier: this.props.contextArgs.ftentidentifier\n                }\n            };\n            i.send([x,], this._entry_point);\n        },\n        _getURI: function(w) {\n            return r(\"/ajax/gifts/send\").addQueryData({\n                gift_occasion: this.props.contextArgs.giftoccasion,\n                recipient_id: this.props.recipient.id,\n                entry_point: this._entry_point,\n                product_id: w\n            });\n        },\n        _requestClose: function() {\n            var w = r(\"/ajax/gifts/moments/close/\");\n            new g().setMethod(\"POST\").setReadOnly(false).setURI(w).setData({\n                action: \"hide\",\n                data: JSON.stringify({\n                    type: \"detected_moment\",\n                    friend_id: this.props.recipient.id,\n                    ftentidentifier: this.props.contextArgs.ftentidentifier\n                })\n            }).send();\n        }\n    });\n    e.exports = v;\n});\n__d(\"UFILikeSentenceText.react\", [\"HovercardLinkInterpolator\",\"ProfileBrowserLink\",\"ProfileBrowserTypes\",\"React\",\"TextWithEntities.react\",\"URI\",], function(a, b, c, d, e, f) {\n    var g = b(\"HovercardLinkInterpolator\"), h = b(\"ProfileBrowserLink\"), i = b(\"ProfileBrowserTypes\"), j = b(\"React\"), k = b(\"TextWithEntities.react\"), l = b(\"URI\");\n    function m(p, q, r, s) {\n        if (((s.count != null))) {\n            var t = i.LIKES, u = {\n                id: p.targetfbid\n            };\n            return (j.DOM.a({\n                href: h.constructPageURI(t, u).toString(),\n                target: \"_blank\"\n            }, r));\n        }\n         else return g(r, s, \"_blank\", null, \"ufi\")\n    ;\n    };\n;\n    function n(p, q, r, s) {\n        if (((s.count != null))) {\n            var t = i.LIKES, u = {\n                id: p.targetfbid\n            }, v = [];\n            for (var w = 0; ((w < q.length)); w++) {\n                if (!q[w].count) {\n                    v.push(q[w].entities[0].id);\n                }\n            ;\n            ;\n            };\n        ;\n            var x = new l(\"/ajax/like/tooltip.php\").setQueryData({\n                comment_fbid: p.targetfbid,\n                comment_from: p.actorforpost,\n                seen_user_fbids: ((v.length ? v : true))\n            });\n            return (j.DOM.a({\n                rel: \"dialog\",\n                ajaxify: h.constructDialogURI(t, u).toString(),\n                href: h.constructPageURI(t, u).toString(),\n                \"data-hover\": \"tooltip\",\n                \"data-tooltip-alignh\": \"center\",\n                \"data-tooltip-uri\": x.toString()\n            }, r));\n        }\n         else return g(r, s, null, null, \"ufi\")\n    ;\n    };\n;\n    var o = j.createClass({\n        displayName: \"UFILikeSentenceText\",\n        render: function() {\n            var p = this.props.feedback, q = this.props.likeSentenceData, r;\n            if (this.props.contextArgs.embedded) {\n                r = m;\n            }\n             else r = n;\n        ;\n        ;\n            r = r.bind(null, p, q.ranges);\n            return (k({\n                interpolator: r,\n                ranges: q.ranges,\n                aggregatedRanges: q.aggregatedranges,\n                text: q.text\n            }));\n        }\n    });\n    e.exports = o;\n});\n__d(\"UFILikeSentence.react\", [\"Bootloader\",\"LeftRight.react\",\"ProfileBrowserLink\",\"ProfileBrowserTypes\",\"React\",\"UFIClassNames\",\"UFIImageBlock.react\",\"UFILikeSentenceText.react\",\"URI\",\"cx\",\"joinClasses\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Bootloader\"), h = b(\"LeftRight.react\"), i = b(\"ProfileBrowserLink\"), j = b(\"ProfileBrowserTypes\"), k = b(\"React\"), l = b(\"UFIClassNames\"), m = b(\"UFIImageBlock.react\"), n = b(\"UFILikeSentenceText.react\"), o = b(\"URI\"), p = b(\"cx\"), q = b(\"joinClasses\"), r = b(\"tx\"), s = k.createClass({\n        displayName: \"UFILikeSentence\",\n        getInitialState: function() {\n            return {\n                selectorModule: null,\n                bootloadedSelectorModule: false\n            };\n        },\n        componentWillMount: function() {\n            this._bootloadSelectorModule(this.props);\n        },\n        componentWillReceiveProps: function(t) {\n            this._bootloadSelectorModule(t);\n        },\n        _bootloadSelectorModule: function(t) {\n            if (((t.showOrderingModeSelector && !this.state.bootloadedSelectorModule))) {\n                var u = function(v) {\n                    this.setState({\n                        selectorModule: v\n                    });\n                }.bind(this);\n                if (t.contextArgs.entstream) {\n                    g.loadModules([\"UFIEntStreamOrderingModeSelector.react\",], u);\n                }\n                 else g.loadModules([\"UFIOrderingModeSelector.react\",], u);\n            ;\n            ;\n                this.setState({\n                    bootloadedSelectorModule: true\n                });\n            }\n        ;\n        ;\n        },\n        render: function() {\n            var t = this.props.feedback, u = t.likesentences.current, v = this.props.contextArgs.entstream, w = q(l.ROW, ((t.likesentences.isunseen ? l.UNSEEN_ITEM : \"\")), (((((\"UFILikeSentence\") + ((this.props.isFirstComponent ? ((\" \" + \"UFIFirstComponent\")) : \"\")))) + ((this.props.isLastComponent ? ((\" \" + \"UFILastComponent\")) : \"\"))))), x = null, y = null;\n            if (u.text) {\n                y = k.DOM.div({\n                    className: \"UFILikeSentenceText\"\n                }, n({\n                    contextArgs: this.props.contextArgs,\n                    feedback: t,\n                    likeSentenceData: u\n                }));\n            }\n        ;\n        ;\n            if (((y && !v))) {\n                x = k.DOM.i({\n                    className: \"UFILikeIcon\"\n                });\n                if (((t.viewercanlike && !t.hasviewerliked))) {\n                    x = k.DOM.a({\n                        className: \"UFILikeThumb\",\n                        href: \"#\",\n                        tabIndex: \"-1\",\n                        title: \"Like this\",\n                        onClick: this.props.onTargetLikeToggle\n                    }, x);\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            var z = y, aa = null;\n            if (((((t.seencount > 0)) && !v))) {\n                var ba = j.GROUP_MESSAGE_VIEWERS, ca = {\n                    id: t.targetfbid\n                }, da = i.constructDialogURI(ba, ca), ea = i.constructPageURI(ba, ca), fa = new o(\"/ajax/ufi/seen_tooltip.php\").setQueryData({\n                    ft_ent_identifier: t.entidentifier,\n                    displayed_count: t.seencount\n                }), ga;\n                if (t.seenbyall) {\n                    ga = \"Seen by everyone\";\n                }\n                 else ga = ((((t.seencount == 1)) ? \"Seen by 1\" : r._(\"Seen by {count}\", {\n                    count: t.seencount\n                })));\n            ;\n            ;\n                aa = k.DOM.a({\n                    rel: \"dialog\",\n                    ajaxify: da.toString(),\n                    href: ea.toString(),\n                    tabindex: \"-1\",\n                    \"data-hover\": \"tooltip\",\n                    \"data-tooltip-alignh\": \"left\",\n                    \"data-tooltip-uri\": fa.toString(),\n                    className: (((\"UFISeenCount\") + ((!!u.text ? ((\" \" + \"UFISeenCountRight\")) : \"\"))))\n                }, k.DOM.span({\n                    className: \"UFISeenCountIcon\"\n                }), ga);\n            }\n             else if (((this.props.showOrderingModeSelector && this.state.selectorModule))) {\n                var ha = this.state.selectorModule;\n                aa = ha({\n                    currentOrderingMode: this.props.orderingMode,\n                    entstream: v,\n                    orderingmodes: t.orderingmodes,\n                    onOrderChanged: this.props.onOrderingModeChange\n                });\n                if (!z) {\n                    z = k.DOM.div(null);\n                }\n            ;\n            ;\n            }\n            \n        ;\n        ;\n            var ia = null;\n            if (((x && y))) {\n                ia = m(null, x, y, aa);\n            }\n             else if (z) {\n                ia = h(null, z, aa);\n            }\n             else ia = aa;\n            \n        ;\n        ;\n            return (k.DOM.li({\n                className: w\n            }, ia));\n        }\n    });\n    e.exports = s;\n});\n__d(\"UFIPager.react\", [\"LeftRight.react\",\"React\",\"UFIClassNames\",\"UFIImageBlock.react\",\"cx\",\"joinClasses\",], function(a, b, c, d, e, f) {\n    var g = b(\"LeftRight.react\"), h = b(\"React\"), i = b(\"UFIClassNames\"), j = b(\"UFIImageBlock.react\"), k = b(\"cx\"), l = b(\"joinClasses\"), m = h.createClass({\n        displayName: \"UFIPager\",\n        onPagerClick: function(n) {\n            ((((!this.props.isLoading && this.props.onPagerClick)) && this.props.onPagerClick()));\n            n.nativeEvent.prevent();\n        },\n        render: function() {\n            var n = this.onPagerClick, o = ((this.props.isLoading ? \"ufiPagerLoading\" : \"\")), p = l(i.ROW, ((this.props.isUnseen ? i.UNSEEN_ITEM : \"\")), (((((((((\"UFIPagerRow\") + ((this.props.isFirstCommentComponent ? ((\" \" + \"UFIFirstCommentComponent\")) : \"\")))) + ((this.props.isLastCommentComponent ? ((\" \" + \"UFILastCommentComponent\")) : \"\")))) + ((this.props.isFirstComponent ? ((\" \" + \"UFIFirstComponent\")) : \"\")))) + ((this.props.isLastComponent ? ((\" \" + \"UFILastComponent\")) : \"\"))))), q = h.DOM.a({\n                className: \"UFIPagerLink\",\n                onClick: n,\n                href: \"#\",\n                role: \"button\"\n            }, h.DOM.span({\n                className: o\n            }, this.props.pagerLabel)), r = (((\"fcg\") + ((\" \" + \"UFIPagerCount\")))), s = h.DOM.span({\n                className: r\n            }, this.props.countSentence), t;\n            if (this.props.contextArgs.entstream) {\n                t = (g({\n                    direction: g.DIRECTION.right\n                }, q, s));\n            }\n             else t = (j(null, h.DOM.a({\n                className: \"UFIPagerIcon\",\n                onClick: n,\n                href: \"#\",\n                role: \"button\"\n            }), q, s));\n        ;\n        ;\n            return (h.DOM.li({\n                className: p,\n                \"data-ft\": this.props[\"data-ft\"]\n            }, t));\n        }\n    });\n    e.exports = m;\n});\n__d(\"UFIReplySocialSentence.react\", [\"LiveTimer\",\"React\",\"Timestamp.react\",\"UFIClassNames\",\"UFIConstants\",\"UFIImageBlock.react\",\"cx\",\"joinClasses\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"LiveTimer\"), h = b(\"React\"), i = b(\"Timestamp.react\"), j = b(\"UFIClassNames\"), k = b(\"UFIConstants\"), l = b(\"UFIImageBlock.react\"), m = b(\"cx\"), n = b(\"joinClasses\"), o = b(\"tx\"), p = \" \\u00b7 \", q = 43200, r = h.createClass({\n        displayName: \"UFIReplySocialSentence\",\n        render: function() {\n            var s = ((this.props.isLoading ? \"UFIReplySocialSentenceLoading\" : \"\")), t = n(j.ROW, (((((\"UFIReplySocialSentenceRow\") + ((this.props.isFirstComponent ? ((\" \" + \"UFIFirstComponent\")) : \"\")))) + ((this.props.isLastComponent ? ((\" \" + \"UFILastComponent\")) : \"\"))))), u, v;\n            if (this.props.isExpanded) {\n                u = ((((this.props.replies > 1)) ? o._(\"Hide {count} Replies\", {\n                    count: this.props.replies\n                }) : \"Hide 1 Reply\"));\n            }\n             else {\n                u = ((((this.props.replies > 1)) ? o._(\"{count} Replies\", {\n                    count: this.props.replies\n                }) : \"1 Reply\"));\n                if (this.props.timestamp) {\n                    var w = ((((g.getApproximateServerTime() / 1000)) - this.props.timestamp.time));\n                    if (((((w < q)) || ((this.props.orderingMode == k.UFICommentOrderingMode.RECENT_ACTIVITY))))) {\n                        v = h.DOM.span({\n                            className: \"fcg\"\n                        }, p, i({\n                            time: this.props.timestamp.time,\n                            text: this.props.timestamp.text,\n                            verbose: this.props.timestamp.verbose\n                        }));\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            var x = Object.keys(this.props.authors), y = ((x.length && !this.props.isExpanded)), z, aa;\n            if (y) {\n                var ba = this.props.authors[x[0]];\n                z = h.DOM.img({\n                    alt: \"\",\n                    src: ba.thumbSrc,\n                    className: j.ACTOR_IMAGE\n                });\n                aa = [o._(\"{author} replied\", {\n                    author: ba.JSBNG__name\n                }),p,u,];\n            }\n             else {\n                z = h.DOM.i({\n                    className: ((((!this.props.isExpanded ? \"UFIPagerIcon\" : \"\")) + ((this.props.isExpanded ? ((\" \" + \"UFICollapseIcon\")) : \"\"))))\n                });\n                aa = u;\n            }\n        ;\n        ;\n            return (h.DOM.li({\n                className: t,\n                \"data-ft\": this.props[\"data-ft\"]\n            }, h.DOM.a({\n                className: \"UFICommentLink\",\n                onClick: this.props.onClick,\n                href: \"#\",\n                role: \"button\"\n            }, l(null, h.DOM.div({\n                className: ((y ? \"UFIReplyActorPhotoWrapper\" : \"\"))\n            }, z), h.DOM.span({\n                className: s\n            }, h.DOM.span({\n                className: \"UFIReplySocialSentenceLinkText\"\n            }, aa), v)))));\n        }\n    });\n    e.exports = r;\n});\n__d(\"UFIShareRow.react\", [\"NumberFormat\",\"React\",\"UFIClassNames\",\"UFIImageBlock.react\",\"URI\",\"cx\",\"joinClasses\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"NumberFormat\"), h = b(\"React\"), i = b(\"UFIClassNames\"), j = b(\"UFIImageBlock.react\"), k = b(\"URI\"), l = b(\"cx\"), m = b(\"joinClasses\"), n = b(\"tx\"), o = h.createClass({\n        displayName: \"UFIShareRow\",\n        render: function() {\n            var p = new k(\"/ajax/shares/view\").setQueryData({\n                target_fbid: this.props.targetID\n            }), q = new k(\"/shares/view\").setSubdomain(\"www\").setQueryData({\n                id: this.props.targetID\n            }), r;\n            if (((this.props.shareCount > 1))) {\n                var s = g.formatIntegerWithDelimiter(this.props.shareCount, ((this.props.contextArgs.numberdelimiter || \",\")));\n                r = n._(\"{count} shares\", {\n                    count: s\n                });\n            }\n             else r = \"1 share\";\n        ;\n        ;\n            var t = m(i.ROW, ((((this.props.isFirstComponent ? \"UFIFirstComponent\" : \"\")) + ((this.props.isLastComponent ? ((\" \" + \"UFILastComponent\")) : \"\")))));\n            return (h.DOM.li({\n                className: t\n            }, j(null, h.DOM.a({\n                className: \"UFIShareIcon\",\n                rel: \"dialog\",\n                ajaxify: p.toString(),\n                href: q.toString()\n            }), h.DOM.a({\n                className: \"UFIShareLink\",\n                rel: \"dialog\",\n                ajaxify: p.toString(),\n                href: q.toString()\n            }, r))));\n        }\n    });\n    e.exports = o;\n});\n__d(\"UFISpamPlaceholder.react\", [\"React\",\"UFIClassNames\",\"cx\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"React\"), h = b(\"UFIClassNames\"), i = b(\"cx\"), j = b(\"tx\"), k = g.createClass({\n        displayName: \"UFISpamPlaceholder\",\n        render: function() {\n            var l = (((\"UFISpamCommentWrapper\") + ((this.props.isLoading ? ((\" \" + \"UFISpamCommentLoading\")) : \"\"))));\n            return (g.DOM.li({\n                className: h.ROW\n            }, g.DOM.a({\n                href: \"#\",\n                role: \"button\",\n                className: \"UFISpamCommentLink\",\n                onClick: this.props.onClick\n            }, g.DOM.span({\n                \"data-hover\": \"tooltip\",\n                \"data-tooltip-alignh\": \"center\",\n                \"aria-label\": j._(\"{count} hidden\", {\n                    count: this.props.numHidden\n                }),\n                className: l\n            }, g.DOM.i({\n                className: \"placeholderIcon\"\n            })))));\n        }\n    });\n    e.exports = k;\n});\n__d(\"UFI.react\", [\"NumberFormat\",\"React\",\"LegacyScrollableArea.react\",\"TrackingNodes\",\"UFIAddCommentController\",\"UFIAddCommentLink.react\",\"UFIComment.react\",\"UFIConstants\",\"UFIContainer.react\",\"UFIGiftSentence.react\",\"UFIInstanceState\",\"UFILikeSentence.react\",\"UFIPager.react\",\"UFIReplySocialSentence.react\",\"UFIShareRow.react\",\"UFISpamPlaceholder.react\",\"copyProperties\",\"isEmpty\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"NumberFormat\"), h = b(\"React\"), i = b(\"LegacyScrollableArea.react\"), j = b(\"TrackingNodes\"), k = b(\"UFIAddCommentController\"), l = b(\"UFIAddCommentLink.react\"), m = b(\"UFIComment.react\"), n = b(\"UFIConstants\"), o = b(\"UFIContainer.react\"), p = b(\"UFIGiftSentence.react\"), q = b(\"UFIInstanceState\"), r = b(\"UFILikeSentence.react\"), s = b(\"UFIPager.react\"), t = b(\"UFIReplySocialSentence.react\"), u = b(\"UFIShareRow.react\"), v = b(\"UFISpamPlaceholder.react\"), w = b(\"copyProperties\"), x = b(\"isEmpty\"), y = b(\"tx\"), z = h.createClass({\n        displayName: \"UFI\",\n        getInitialState: function() {\n            return {\n                requestRanges: w({\n                }, this.props.availableRanges),\n                instanceShowRepliesMap: {\n                },\n                instanceShowReplySocialSentenceMap: {\n                },\n                loadingSpamIDs: {\n                },\n                isActiveLoading: false,\n                hasPagedToplevel: false\n            };\n        },\n        componentWillReceiveProps: function(aa) {\n            if (this.state.isActiveLoading) {\n                var ba = this.props.availableRanges[this.props.id], ca = aa.availableRanges[this.props.id];\n                if (((((ba.offset != ca.offset)) || ((ba.length != ca.length))))) {\n                    var da = ((((ca.offset < ba.offset)) ? 0 : ba.length));\n                    if (((da < aa.availableComments.length))) {\n                        var ea = aa.availableComments[da].ufiinstanceid;\n                        q.updateState(ea, \"autofocus\", true);\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n                this.setState({\n                    isActiveLoading: false\n                });\n            }\n        ;\n        ;\n            if (((aa.orderingMode != this.props.orderingMode))) {\n                this.setState({\n                    requestRanges: w({\n                    }, aa.availableRanges)\n                });\n            }\n        ;\n        ;\n        },\n        render: function() {\n            var aa = this.props, ba = aa.feedback, ca = aa.contextArgs, da = ((aa.source != n.UFIFeedbackSourceType.ADS)), ea = ((ba.orderingmodes && ((aa.commentCounts[aa.id] >= n.minCommentsForOrderingModeSelector)))), fa = ((((((!x(ba.likesentences.current) || ((((ba.seencount > 0)) && !ca.entstream)))) || ea)) && da)), ga = null;\n            if (fa) {\n                ga = r({\n                    contextArgs: ca,\n                    feedback: ba,\n                    onTargetLikeToggle: aa.onTargetLikeToggle,\n                    onOrderingModeChange: aa.onOrderingModeChange,\n                    orderingMode: aa.orderingMode,\n                    showOrderingModeSelector: ea\n                });\n            }\n        ;\n        ;\n            var ha = null;\n            if (((aa.feedback.hasviewerliked && this._shouldShowGiftSentence()))) {\n                ha = p({\n                    contextArgs: ca,\n                    recipient: aa.giftRecipient,\n                    sender: aa.authorProfiles[ba.actorforpost],\n                    giftdata: aa.feedback.giftdata\n                });\n            }\n        ;\n        ;\n            var ia = ((((aa.availableComments && aa.availableComments.length)) && da)), ja = null;\n            if (ia) {\n                ja = this.renderCommentMap(aa.availableComments, aa.availableRanges[aa.id].offset);\n            }\n        ;\n        ;\n            var ka = null, la = ba.cancomment, ma = ((((la && ca.showaddcomment)) && ba.actorforpost));\n            if (ma) {\n                var na = new k(null, aa.id, null, ca), oa = aa.authorProfiles[ba.actorforpost];\n                ka = na.renderAddComment(oa, ba.mentionsdatasource, ba.showsendonentertip, \"toplevelcomposer\", null, ba.allowphotoattachments, ba.subtitle);\n            }\n        ;\n        ;\n            var pa = null, qa = ((((ca.showshares && ba.sharecount)) && da));\n            if (((qa && !ca.entstream))) {\n                pa = u({\n                    targetID: ba.targetfbid,\n                    shareCount: ba.sharecount,\n                    contextArgs: ca\n                });\n            }\n        ;\n        ;\n            var ra = ((((((fa || qa)) || ia)) || la)), sa = this.renderPagers();\n            this.applyToUFIComponents([sa.topPager,], ja, [sa.bottomPager,], {\n                isFirstCommentComponent: true\n            }, {\n                isLastCommentComponent: true\n            });\n            var ta = ((ba.commentboxhoisted ? ka : null)), ua = ((ba.commentboxhoisted ? null : ka)), va = null;\n            if (((((ma && ba.hasaddcommentlink)) && this.state.hasPagedToplevel))) {\n                va = l({\n                    onClick: this.onComment\n                });\n            }\n        ;\n        ;\n            this.applyToUFIComponents([ga,pa,ta,sa.topPager,], ja, [sa.bottomPager,ua,va,], {\n                isFirstComponent: true\n            }, {\n                isLastComponent: true\n            });\n            var wa = [sa.topPager,ja,sa.bottomPager,];\n            if (((ca.scrollcomments && ca.scrollwidth))) {\n                wa = h.DOM.li(null, i({\n                    width: ca.scrollwidth\n                }, h.DOM.ul(null, wa)));\n            }\n        ;\n        ;\n            return (o({\n                hasNub: ((ca.shownub && ra))\n            }, ga, ha, pa, ta, wa, ua, va));\n        },\n        applyToUFIComponents: function(aa, ba, ca, da, ea) {\n            var fa = Object.keys(((ba || {\n            }))).map(function(ha) {\n                return ba[ha];\n            }), ga = [].concat(aa, fa, ca);\n            this._applyToFirstComponent(ga, da);\n            ga.reverse();\n            this._applyToFirstComponent(ga, ea);\n        },\n        _applyToFirstComponent: function(aa, ba) {\n            for (var ca = 0; ((ca < ((aa || [])).length)); ca++) {\n                if (aa[ca]) {\n                    w(aa[ca].props, ba);\n                    return;\n                }\n            ;\n            ;\n            };\n        ;\n        },\n        renderCommentMap: function(aa, ba) {\n            var ca = this.props, da = {\n            }, ea = aa.length;\n            if (!ea) {\n                return da;\n            }\n        ;\n        ;\n            var fa = aa[0].parentcommentid, ga = [], ha = function() {\n                if (((ga.length > 0))) {\n                    var qa = function(ra, sa) {\n                        this.state.loadingSpamIDs[ra[0]] = true;\n                        this.forceUpdate();\n                        ca.onSpamFetch(ra, sa);\n                    }.bind(this, ga, fa);\n                    da[((\"spam\" + ga[0]))] = v({\n                        onClick: qa,\n                        numHidden: ga.length,\n                        isLoading: !!this.state.loadingSpamIDs[ga[0]]\n                    });\n                    ga = [];\n                }\n            ;\n            ;\n            }.bind(this), ia = ca.instanceid, ja = q.getKeyForInstance(ia, \"editcommentid\"), ka = !!aa[0].parentcommentid, la = false;\n            for (var ma = 0; ((ma < ea)); ma++) {\n                if (((aa[ma].JSBNG__status == n.UFIStatus.SPAM))) {\n                    ga.push(aa[ma].id);\n                }\n                 else {\n                    ha();\n                    var na = Math.max(((((ca.loggingOffset - ma)) - ba)), 0), oa = aa[ma], pa;\n                    if (((oa.id == ja))) {\n                        pa = this.renderEditCommentBox(oa);\n                    }\n                     else {\n                        pa = this.renderComment(oa, na);\n                        pa.props.isFirst = ((ma === 0));\n                        pa.props.isLast = ((ma === ((ea - 1))));\n                        if (!ka) {\n                            pa.props.showReplyLink = true;\n                        }\n                    ;\n                    ;\n                    }\n                ;\n                ;\n                    da[((\"comment\" + oa.id))] = pa;\n                    if (((((((((ca.feedback.actorforpost === oa.author)) && !la)) && !ca.feedback.hasviewerliked)) && this._shouldShowGiftSentence()))) {\n                        da[((\"gift\" + oa.id))] = p({\n                            contextArgs: ca.contextArgs,\n                            recipient: ca.giftRecipient,\n                            sender: ca.authorProfiles[ca.feedback.actorforpost],\n                            giftdata: ca.feedback.giftdata\n                        });\n                        la = true;\n                    }\n                ;\n                ;\n                    if (((oa.JSBNG__status !== n.UFIStatus.DELETED))) {\n                        da[((\"replies\" + oa.id))] = this.renderReplyContainer(oa);\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n            };\n        ;\n            ha();\n            return da;\n        },\n        _shouldShowGiftSentence: function() {\n            var aa = this.props;\n            return ((aa.contextArgs.giftoccasion && !aa.contextArgs.entstream));\n        },\n        renderReplyContainer: function(aa) {\n            var ba = this.props, ca = {\n            };\n            for (var da = 0; ((da < ((aa.replyauthors || [])).length)); da++) {\n                var ea = ba.authorProfiles[aa.replyauthors[da]];\n                if (ea) {\n                    ca[ea.id] = ea;\n                }\n            ;\n            ;\n            };\n        ;\n            var fa = ((((ba.repliesMap && ba.repliesMap[aa.id])) && this._shouldShowCommentReplies(aa.id))), ga, ha = Math.max(((aa.replycount - aa.spamreplycount)), 0);\n            if (((ha && this._shouldShowReplySocialSentence(aa.id)))) {\n                var ia = ((this._shouldShowCommentReplies(aa.id) && ((this.isLoadingPrev(aa.id) || this.isLoadingNext(aa.id)))));\n                ga = t({\n                    authors: ca,\n                    replies: ha,\n                    timestamp: aa.recentreplytimestamp,\n                    onClick: this.onToggleReplies.bind(this, aa),\n                    isLoading: ia,\n                    isExpanded: fa,\n                    orderingMode: this.props.orderingMode\n                });\n            }\n        ;\n        ;\n            var ja, ka, la, ma;\n            if (fa) {\n                var na = this.renderPagers(aa.id);\n                ja = na.topPager;\n                la = na.bottomPager;\n                ka = this.renderCommentMap(ba.repliesMap[aa.id], ba.availableRanges[aa.id].offset);\n                var oa = Object.keys(ka);\n                for (var pa = 0; ((pa < oa.length)); pa++) {\n                    var qa = ka[oa[pa]];\n                    if (qa) {\n                        qa.props.hasPartialBorder = ((pa !== 0));\n                    }\n                ;\n                ;\n                };\n            ;\n                if (ba.feedback.cancomment) {\n                    var ra = false, sa = Object.keys(ka);\n                    for (var da = ((sa.length - 1)); ((da >= 0)); da--) {\n                        var ta = sa[da];\n                        if (((ta && ka[ta]))) {\n                            ra = ka[ta].props.isAuthorReply;\n                            break;\n                        }\n                    ;\n                    ;\n                    };\n                ;\n                    ma = this.renderReplyComposer(aa, !ra);\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            var ua;\n            if (((((((((ga || ja)) || ka)) || la)) || ma))) {\n                this.applyToUFIComponents([ga,ja,], ka, [la,ma,], {\n                    isFirstComponent: true\n                }, {\n                    isLastComponent: true\n                });\n                var va = ((aa.JSBNG__status === n.UFIStatus.LIVE_DELETED));\n                ua = o({\n                    isParentLiveDeleted: va,\n                    isReplyList: true\n                }, ga, ja, ka, la, ma);\n            }\n        ;\n        ;\n            return ua;\n        },\n        renderReplyComposer: function(aa, ba) {\n            var ca = this.props;\n            return (new k(null, ca.id, aa.id, ca.contextArgs)).renderAddComment(ca.authorProfiles[ca.feedback.actorforpost], ca.feedback.mentionsdatasource, false, ((\"replycomposer-\" + aa.id)), ba, ca.feedback.allowphotoattachments);\n        },\n        renderEditCommentBox: function(aa) {\n            var ba = new k(null, this.props.id, null, {\n            }), ca = ba.renderEditComment(this.props.authorProfiles[this.props.feedback.actorforpost], aa.id, this.props.feedback.mentionsdatasource, this.props.onEditAttempt.bind(null, aa), this.props.onCancelEdit, this.props.feedback.allowphotoattachments);\n            return ca;\n        },\n        _shouldShowCommentReplies: function(aa) {\n            if (((aa in this.state.instanceShowRepliesMap))) {\n                return this.state.instanceShowRepliesMap[aa];\n            }\n             else if (((aa in this.props.showRepliesMap))) {\n                return this.props.showRepliesMap[aa];\n            }\n            \n        ;\n        ;\n            return false;\n        },\n        _shouldShowReplySocialSentence: function(aa) {\n            if (((aa in this.state.instanceShowReplySocialSentenceMap))) {\n                return this.state.instanceShowReplySocialSentenceMap[aa];\n            }\n             else if (((aa in this.props.showReplySocialSentenceMap))) {\n                return this.props.showReplySocialSentenceMap[aa];\n            }\n            \n        ;\n        ;\n            return false;\n        },\n        renderComment: function(aa, ba) {\n            var ca = this.props, da = ca.feedback, ea = ((da.actorforpost === aa.author)), fa = q.getKeyForInstance(this.props.instanceid, \"locallycomposed\"), ga = ((aa.islocal || ((fa && fa[aa.id])))), ha = ((da.showremovemenu || ((da.viewerid === aa.author)))), ia = ((((da.canremoveall && da.isownerpage)) && !ea)), ja = ((ca.source != n.UFIFeedbackSourceType.INTERN)), ka = j.getTrackingInfo(j.types.COMMENT, ba), la = !!aa.parentcommentid, ma = this._shouldShowCommentReplies(aa.id), na = !!aa.isfeatured;\n            return (m({\n                comment: aa,\n                authorProfiles: this.props.authorProfiles,\n                viewerIsAuthor: ea,\n                feedback: da,\n                \"data-ft\": ka,\n                contextArgs: this.props.contextArgs,\n                hideAsSpamForPageAdmin: ia,\n                isLocallyComposed: ga,\n                isReply: la,\n                isFeatured: na,\n                showPermalink: ja,\n                showRemoveReportMenu: ha,\n                showReplies: ma,\n                onCommentLikeToggle: ca.onCommentLikeToggle.bind(null, aa),\n                onCommentReply: this.onCommentReply.bind(this, aa),\n                onCommentTranslate: ca.onCommentTranslate.bind(null, aa),\n                onEdit: ca.onCommentEdit.bind(null, aa),\n                onHideAsSpam: ca.onCommentHideAsSpam.bind(null, aa),\n                onInlineBan: ca.onCommentInlineBan.bind(null, aa),\n                onMarkAsNotSpam: ca.onCommentMarkAsNotSpam.bind(null, aa),\n                onOneClickRemove: ca.onCommentOneClickRemove.bind(null, aa),\n                onPreviewRemove: ca.onPreviewRemove.bind(null, aa),\n                onRemove: ca.onCommentRemove.bind(null, aa),\n                onRetrySubmit: ca.onRetrySubmit.bind(null, aa),\n                onUndoInlineBan: ca.onCommentUndoInlineBan.bind(null, aa),\n                onUndoOneClickRemove: ca.onCommentUndoOneClickRemove.bind(null, aa)\n            }));\n        },\n        _updateRepliesState: function(aa, ba, ca) {\n            var da = this.state.instanceShowRepliesMap;\n            da[aa] = ba;\n            var ea = this.state.instanceShowReplySocialSentenceMap;\n            ea[aa] = ca;\n            this.setState({\n                instanceShowRepliesMap: da,\n                instanceShowReplySocialSentenceMap: ea\n            });\n        },\n        onToggleReplies: function(aa) {\n            var ba = !this._shouldShowCommentReplies(aa.id), ca = ((this._shouldShowReplySocialSentence(aa.id) && !((ba && ((aa.replycount <= this.props.replySocialSentenceMaxReplies))))));\n            this._updateRepliesState(aa.id, ba, ca);\n            var da = ((this.state.requestRanges[aa.id].length - this.props.deletedCounts[aa.id]));\n            if (((ba && ((da === 0))))) {\n                var ea = this.props.commentCounts[aa.id], fa = Math.min(ea, this.props.pageSize);\n                this.onPage(aa.id, {\n                    offset: ((ea - fa)),\n                    length: fa\n                });\n            }\n        ;\n        ;\n        },\n        onPage: function(aa, ba) {\n            var ca = this.state.requestRanges;\n            ca[aa] = ba;\n            var da = ((this.state.hasPagedToplevel || ((aa === this.props.id))));\n            this.setState({\n                requestRanges: ca,\n                isActiveLoading: true,\n                hasPagedToplevel: da\n            });\n            this.props.onChangeRange(aa, ba);\n        },\n        isLoadingPrev: function(aa) {\n            var ba = this.props;\n            aa = ((aa || ba.id));\n            if (!this.state.requestRanges[aa]) {\n                this.state.requestRanges[aa] = ba.availableRanges[aa];\n            }\n        ;\n        ;\n            var ca = this.state.requestRanges[aa].offset, da = ba.availableRanges[aa].offset;\n            return ((ca < da));\n        },\n        isLoadingNext: function(aa) {\n            var ba = this.props;\n            aa = ((aa || ba.id));\n            if (!this.state.requestRanges[aa]) {\n                this.state.requestRanges[aa] = ba.availableRanges[aa];\n            }\n        ;\n        ;\n            var ca = this.state.requestRanges[aa].offset, da = this.state.requestRanges[aa].length, ea = ba.availableRanges[aa].offset, fa = ba.availableRanges[aa].length;\n            return ((((ca + da)) > ((ea + fa))));\n        },\n        renderPagers: function(aa) {\n            var ba = this.props;\n            aa = ((aa || ba.id));\n            var ca = ba.availableRanges[aa].offset, da = ba.availableRanges[aa].length, ea = ba.deletedCounts[aa], fa = ba.commentCounts[aa], ga = ((fa - ea)), ha = ((da - ea)), ia = ((ba.contextArgs.numberdelimiter || \",\")), ja = ((aa !== ba.id)), ka = {\n                topPager: null,\n                bottomPager: null\n            };\n            if (((ba.source == n.UFIFeedbackSourceType.ADS))) {\n                return ka;\n            }\n        ;\n        ;\n            var la = this.isLoadingPrev(aa), ma = this.isLoadingNext(aa);\n            if (((da == fa))) {\n                return ka;\n            }\n        ;\n        ;\n            var na = ((((ca + da)) == fa));\n            if (((((((fa < ba.pageSize)) && na)) || ((ha === 0))))) {\n                var oa = Math.min(fa, ba.pageSize), pa = this.onPage.bind(this, aa, {\n                    offset: ((fa - oa)),\n                    length: oa\n                }), qa, ra;\n                if (((ha === 0))) {\n                    if (((ga == 1))) {\n                        qa = ((ja ? \"View 1 reply\" : \"View 1 comment\"));\n                    }\n                     else {\n                        ra = g.formatIntegerWithDelimiter(ga, ia);\n                        qa = ((ja ? y._(\"View all {count} replies\", {\n                            count: ra\n                        }) : y._(\"View all {count} comments\", {\n                            count: ra\n                        })));\n                    }\n                ;\n                ;\n                }\n                 else if (((((ga - ha)) == 1))) {\n                    qa = ((ja ? \"View 1 more reply\" : \"View 1 more comment\"));\n                }\n                 else {\n                    ra = g.formatIntegerWithDelimiter(((ga - ha)), ia);\n                    qa = ((ja ? y._(\"View {count} more replies\", {\n                        count: ra\n                    }) : y._(\"View {count} more comments\", {\n                        count: ra\n                    })));\n                }\n                \n            ;\n            ;\n                var sa = j.getTrackingInfo(j.types.VIEW_ALL_COMMENTS), ta = s({\n                    contextArgs: ba.contextArgs,\n                    isUnseen: ba.feedback.hasunseencollapsed,\n                    isLoading: la,\n                    pagerLabel: qa,\n                    onPagerClick: pa,\n                    \"data-ft\": sa\n                });\n                if (((ba.feedback.isranked && !ja))) {\n                    ka.bottomPager = ta;\n                }\n                 else ka.topPager = ta;\n            ;\n            ;\n                return ka;\n            }\n        ;\n        ;\n            if (((ca > 0))) {\n                var ua = Math.max(((ca - ba.pageSize)), 0), oa = ((((ca + da)) - ua)), va = this.onPage.bind(this, aa, {\n                    offset: ua,\n                    length: oa\n                }), wa = g.formatIntegerWithDelimiter(ha, ia), xa = g.formatIntegerWithDelimiter(ga, ia), ya = y._(\"{countshown} of {totalcount}\", {\n                    countshown: wa,\n                    totalcount: xa\n                });\n                if (((ba.feedback.isranked && !ja))) {\n                    ka.bottomPager = s({\n                        contextArgs: ba.contextArgs,\n                        isLoading: la,\n                        pagerLabel: \"View more comments\",\n                        onPagerClick: va,\n                        countSentence: ya\n                    });\n                }\n                 else {\n                    var za = ((ja ? \"View previous replies\" : \"View previous comments\"));\n                    ka.topPager = s({\n                        contextArgs: ba.contextArgs,\n                        isLoading: la,\n                        pagerLabel: za,\n                        onPagerClick: va,\n                        countSentence: ya\n                    });\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            if (((((ca + da)) < fa))) {\n                var ab = Math.min(((da + ba.pageSize)), ((fa - ca))), bb = this.onPage.bind(this, aa, {\n                    offset: ca,\n                    length: ab\n                });\n                if (((ba.feedback.isranked && !ja))) {\n                    ka.topPager = s({\n                        contextArgs: ba.contextArgs,\n                        isLoading: ma,\n                        pagerLabel: \"View previous comments\",\n                        onPagerClick: bb\n                    });\n                }\n                 else {\n                    var cb = ((ja ? \"View more replies\" : \"View more comments\"));\n                    ka.bottomPager = s({\n                        contextArgs: ba.contextArgs,\n                        isLoading: ma,\n                        pagerLabel: cb,\n                        onPagerClick: bb\n                    });\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            return ka;\n        },\n        onCommentReply: function(aa) {\n            var ba = ((aa.parentcommentid || aa.id));\n            if (!this._shouldShowCommentReplies(ba)) {\n                this.onToggleReplies(aa);\n            }\n        ;\n        ;\n            if (((this.refs && this.refs[((\"replycomposer-\" + ba))]))) {\n                this.refs[((\"replycomposer-\" + ba))].JSBNG__focus();\n            }\n        ;\n        ;\n        },\n        onComment: function() {\n            if (((this.refs && this.refs.toplevelcomposer))) {\n                this.refs.toplevelcomposer.JSBNG__focus();\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = z;\n});\n__d(\"UFIController\", [\"Arbiter\",\"Bootloader\",\"CSS\",\"DOM\",\"DOMQuery\",\"ImmutableObject\",\"LayerRemoveOnHide\",\"LiveTimer\",\"Parent\",\"React\",\"ReactMount\",\"ShortProfiles\",\"UFI.react\",\"UFIActionLinkController\",\"UFICentralUpdates\",\"UFIComments\",\"UFIConstants\",\"UFIFeedbackTargets\",\"UFIInstanceState\",\"UFIUserActions\",\"URI\",\"copyProperties\",\"isEmpty\",\"tx\",\"UFICommentTemplates\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"Bootloader\"), i = b(\"CSS\"), j = b(\"DOM\"), k = b(\"DOMQuery\"), l = b(\"ImmutableObject\"), m = b(\"LayerRemoveOnHide\"), n = b(\"LiveTimer\"), o = b(\"Parent\"), p = b(\"React\"), q = b(\"ReactMount\"), r = b(\"ShortProfiles\"), s = b(\"UFI.react\"), t = b(\"UFIActionLinkController\"), u = b(\"UFICentralUpdates\"), v = b(\"UFIComments\"), w = b(\"UFIConstants\"), x = b(\"UFIFeedbackTargets\"), y = b(\"UFIInstanceState\"), z = b(\"UFIUserActions\"), aa = b(\"URI\"), ba = b(\"copyProperties\"), ca = b(\"isEmpty\"), da = b(\"tx\"), ea = b(\"UFICommentTemplates\"), fa = function(ia, ja, ka, la) {\n        var ma = ((((ia.offset + ia.length)) === ja));\n        return {\n            offset: ia.offset,\n            length: ((((ma && ga(la))) ? ((ka - ia.offset)) : ia.length))\n        };\n    }, ga = function(ia) {\n        return ((((ia == w.UFIPayloadSourceType.USER_ACTION)) || ((ia == w.UFIPayloadSourceType.LIVE_SEND))));\n    };\n    function ha(ia, ja, ka) {\n        this.root = ia;\n        this.id = ja.ftentidentifier;\n        this.source = ja.source;\n        this._ufiInstanceID = ja.instanceid;\n        this._contextArgs = ja;\n        this._contextArgs.rootid = this.root.id;\n        this._verifiedCommentsExpanded = false;\n        var la = ka.feedbacktargets[0];\n        this.actionLink = new t(ia, this._contextArgs, la);\n        this.orderingMode = la.defaultcommentorderingmode;\n        var ma = ka.commentlists.comments[this.id][this.orderingMode];\n        this.replyRanges = {\n        };\n        this.repliesMap = {\n        };\n        this.showRepliesMap = {\n        };\n        this.showReplySocialSentenceMap = {\n        };\n        this.commentcounts = {\n        };\n        this.commentcounts[this.id] = v.getCommentCount(this.id);\n        var na = {\n        }, oa = ((la.orderingmodes || [{\n            value: this.orderingMode\n        },]));\n        oa.forEach(function(sa) {\n            na[sa.value] = ba({\n            }, ma.range);\n        });\n        this.ranges = na;\n        if (ka.commentlists.replies) {\n            for (var pa = 0; ((pa < ma.values.length)); pa++) {\n                var qa = ma.values[pa], ra = ka.commentlists.replies[qa];\n                if (ra) {\n                    this.commentcounts[qa] = v.getCommentCount(qa);\n                    this.replyRanges[qa] = ba({\n                    }, ra.range);\n                }\n            ;\n            ;\n            };\n        }\n    ;\n    ;\n        this._loggingOffset = null;\n        this._ufi = null;\n        this.ufiCentralUpdatesSubscriptions = [u.subscribe(\"feedback-updated\", function(sa, ta) {\n            var ua = ta.updates, va = ta.payloadSource;\n            if (((((va != w.UFIPayloadSourceType.COLLAPSED_UFI)) && ((this.id in ua))))) {\n                this.fetchAndUpdate(this.render.bind(this), va);\n            }\n        ;\n        ;\n        }.bind(this)),u.subscribe(\"feedback-id-changed\", function(sa, ta) {\n            var ua = ta.updates;\n            if (((this.id in ua))) {\n                this.id = ua[this.id];\n            }\n        ;\n        ;\n        }.bind(this)),u.subscribe(\"instance-updated\", function(sa, ta) {\n            var ua = ta.updates;\n            if (((this._ufiInstanceID in ua))) {\n                var va = ua[this._ufiInstanceID];\n                if (va.editcommentid) {\n                    this.render(ta.payloadSource);\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n        }.bind(this)),u.subscribe(\"update-comment-lists\", function(sa, ta) {\n            if (((ta.commentlists && ta.commentlists.replies))) {\n                var ua = ta.commentlists.replies;\n                {\n                    var fin98keys = ((window.top.JSBNG_Replay.forInKeys)((ua))), fin98i = (0);\n                    var va;\n                    for (; (fin98i < fin98keys.length); (fin98i++)) {\n                        ((va) = (fin98keys[fin98i]));\n                        {\n                            if (((((((((this.id != va)) && ua[va])) && ((ua[va].ftentidentifier == this.id)))) && !this.replyRanges[va]))) {\n                                this.replyRanges[va] = ua[va].range;\n                            }\n                        ;\n                        ;\n                        };\n                    };\n                };\n            ;\n            }\n        ;\n        ;\n        }.bind(this)),];\n        this.clearPageletSubscription = g.subscribe(\"pagelet/destroy\", this.onPageletDestroy.bind(this));\n        this.clearPageSubscription = g.subscribe(\"ufi/page_cleared\", this._onDestroy.bind(this));\n        u.handleUpdate(w.UFIPayloadSourceType.INITIAL_SERVER, ka);\n        if (this._contextArgs.viewas) {\n            this.viewasUFICleanSubscription = g.subscribe(\"pre_page_transition\", function(sa, ta) {\n                if (((this._contextArgs.viewas !== aa(ta.to).getQueryData(\"viewas\")))) {\n                    v.resetFeedbackTarget(this.id);\n                }\n            ;\n            ;\n            }.bind(this));\n        }\n    ;\n    ;\n        h.loadModules([\"ScrollAwareDOM\",], function(sa) {\n            q.scrollMonitor = sa.monitor;\n        });\n    };\n;\n    ba(ha.prototype, {\n        _getParentForm: function() {\n            if (!this._form) {\n                this._form = o.byTag(this.root, \"form\");\n            }\n        ;\n        ;\n            return this._form;\n        },\n        _onTargetLikeToggle: function(JSBNG__event) {\n            var ia = !this.feedback.hasviewerliked;\n            z.changeLike(this.id, ia, {\n                source: this.source,\n                target: JSBNG__event.target,\n                rootid: this._contextArgs.rootid\n            });\n            JSBNG__event.preventDefault();\n        },\n        _onCommentLikeToggle: function(ia, JSBNG__event) {\n            var ja = !ia.hasviewerliked;\n            z.changeCommentLike(ia.id, ja, {\n                source: this.source,\n                target: JSBNG__event.target\n            });\n        },\n        _onCommentEdit: function(ia) {\n            y.updateState(this._ufiInstanceID, \"isediting\", true);\n            y.updateState(this._ufiInstanceID, \"editcommentid\", ia.id);\n        },\n        _onEditAttempt: function(ia, ja, JSBNG__event) {\n            if (((!ja.visibleValue && !ja.attachedPhoto))) {\n                this._onCommentRemove(ia, JSBNG__event);\n            }\n             else z.editComment(ia.id, ja.visibleValue, ja.encodedValue, {\n                source: this._contextArgs.source,\n                target: JSBNG__event.target,\n                attachedPhoto: ja.attachedPhoto\n            });\n        ;\n        ;\n            y.updateStateField(this._ufiInstanceID, \"locallycomposed\", ia.id, true);\n            this._onEditReset();\n        },\n        _onEditReset: function() {\n            y.updateState(this._ufiInstanceID, \"isediting\", false);\n            y.updateState(this._ufiInstanceID, \"editcommentid\", null);\n        },\n        _onCommentRemove: function(ia, JSBNG__event) {\n            var ja = ea[\":fb:ufi:hide-dialog-template\"].build();\n            j.setContent(ja.getNode(\"body\"), \"Are you sure you want to delete this comment?\");\n            j.setContent(ja.getNode(\"title\"), \"Delete Comment\");\n            h.loadModules([\"DialogX\",], function(ka) {\n                var la = new ka({\n                    modal: true,\n                    width: 465,\n                    addedBehaviors: [m,]\n                }, ja.getRoot());\n                la.subscribe(\"JSBNG__confirm\", function() {\n                    z.removeComment(ia.id, {\n                        source: this.source,\n                        oneclick: false,\n                        target: JSBNG__event.target,\n                        timelinelogdata: this._contextArgs.timelinelogdata\n                    });\n                    la.hide();\n                }.bind(this));\n                la.show();\n            }.bind(this));\n        },\n        _onCommentOneClickRemove: function(ia, JSBNG__event) {\n            z.removeComment(ia.id, {\n                source: this.source,\n                oneclick: true,\n                target: JSBNG__event.target,\n                timelinelogdata: this._contextArgs.timelinelogdata\n            });\n        },\n        _onCommentUndoOneClickRemove: function(ia, JSBNG__event) {\n            var ja = ((((this.feedback.canremoveall && this.feedback.isownerpage)) && ((this.feedback.actorforpost !== this.authorProfiles[ia.author]))));\n            z.undoRemoveComment(ia.id, ja, {\n                source: this.source,\n                target: JSBNG__event.target\n            });\n        },\n        _onCommentHideAsSpam: function(ia, JSBNG__event) {\n            z.setHideAsSpam(ia.id, true, {\n                source: this.source,\n                target: JSBNG__event.target\n            });\n        },\n        _onCommentMarkAsNotSpam: function(ia, JSBNG__event) {\n            z.setHideAsSpam(ia.id, false, {\n                source: this.source,\n                target: JSBNG__event.target\n            });\n        },\n        _onCommentTranslate: function(ia, JSBNG__event) {\n            z.translateComment(ia, {\n                source: this.source,\n                target: JSBNG__event.target\n            });\n        },\n        _onCommentInlineBanChange: function(ia, ja, JSBNG__event) {\n            z.banUser(ia, this.feedback.ownerid, ja, {\n                source: this.source,\n                target: JSBNG__event.target\n            });\n        },\n        _onCommentInlineBan: function(ia, JSBNG__event) {\n            this._onCommentInlineBanChange(ia, true, JSBNG__event);\n        },\n        _onCommentUndoInlineBan: function(ia, JSBNG__event) {\n            this._onCommentInlineBanChange(ia, false, JSBNG__event);\n        },\n        _fetchSpamComments: function(ia, ja) {\n            z.fetchSpamComments(this.id, ia, ja, this._contextArgs.viewas);\n        },\n        _removePreview: function(ia, JSBNG__event) {\n            z.removePreview(ia, {\n                source: this.source,\n                target: JSBNG__event.target\n            });\n        },\n        _retrySubmit: function(ia) {\n            h.loadModules([\"UFIRetryActions\",], function(ja) {\n                ja.retrySubmit(ia, {\n                    source: this.source\n                });\n            }.bind(this));\n        },\n        _ensureCommentsExpanded: function() {\n            if (this._verifiedCommentsExpanded) {\n                return;\n            }\n        ;\n        ;\n            var ia = o.byTag(this.root, \"form\");\n            if (ia) {\n                i.removeClass(ia, \"collapsed_comments\");\n                this._verifiedCommentsExpanded = true;\n            }\n        ;\n        ;\n        },\n        render: function(ia) {\n            var ja = ((this.comments.length || !ca(this.feedback.likesentences.current)));\n            if (((ja && ga(ia)))) {\n                this._ensureCommentsExpanded();\n            }\n        ;\n        ;\n            if (((this._loggingOffset === null))) {\n                this._loggingOffset = ((((this.ranges[this.orderingMode].offset + this.comments.length)) - 1));\n            }\n        ;\n        ;\n            var ka = ((this.feedback.replysocialsentencemaxreplies || -1)), la = {\n            };\n            la[this.id] = v.getDeletedCount(this.id);\n            this.comments.forEach(function(oa) {\n                la[oa.id] = v.getDeletedCount(oa.id);\n            });\n            var ma = ba({\n            }, this.replyRanges);\n            ma[this.id] = this.ranges[this.orderingMode];\n            ma = new l(ma);\n            var na = s({\n                feedback: this.feedback,\n                id: this.id,\n                onTargetLikeToggle: this._onTargetLikeToggle.bind(this),\n                onCommentLikeToggle: this._onCommentLikeToggle.bind(this),\n                onCommentRemove: this._onCommentRemove.bind(this),\n                onCommentHideAsSpam: this._onCommentHideAsSpam.bind(this),\n                onCommentMarkAsNotSpam: this._onCommentMarkAsNotSpam.bind(this),\n                onCommentEdit: this._onCommentEdit.bind(this),\n                onCommentOneClickRemove: this._onCommentOneClickRemove.bind(this),\n                onCommentUndoOneClickRemove: this._onCommentUndoOneClickRemove.bind(this),\n                onCommentTranslate: this._onCommentTranslate.bind(this),\n                onCommentInlineBan: this._onCommentInlineBan.bind(this),\n                onCommentUndoInlineBan: this._onCommentUndoInlineBan.bind(this),\n                onEditAttempt: this._onEditAttempt.bind(this),\n                onCancelEdit: this._onEditReset.bind(this),\n                onChangeRange: this._changeRange.bind(this),\n                onSpamFetch: this._fetchSpamComments.bind(this),\n                onPreviewRemove: this._removePreview.bind(this),\n                onRetrySubmit: this._retrySubmit.bind(this),\n                onOrderingModeChange: this._onOrderingModeChange.bind(this),\n                contextArgs: this._contextArgs,\n                repliesMap: this.repliesMap,\n                showRepliesMap: this.showRepliesMap,\n                showReplySocialSentenceMap: this.showReplySocialSentenceMap,\n                commentCounts: this.commentcounts,\n                deletedCounts: la,\n                availableComments: this.comments,\n                source: this.source,\n                availableRanges: ma,\n                pageSize: w.defaultPageSize,\n                authorProfiles: this.authorProfiles,\n                instanceid: this._ufiInstanceID,\n                loggingOffset: this._loggingOffset,\n                replySocialSentenceMaxReplies: ka,\n                giftRecipient: this._giftRecipient,\n                orderingMode: this.orderingMode\n            });\n            this._ufi = p.renderComponent(na, this.root);\n            n.updateTimeStamps();\n            if (this._getParentForm()) {\n                g.inform(\"ufi/changed\", {\n                    form: this._getParentForm()\n                });\n            }\n        ;\n        ;\n            if (((((ia != w.UFIPayloadSourceType.INITIAL_SERVER)) && ((ia != w.UFIPayloadSourceType.COLLAPSED_UFI))))) {\n                g.inform(\"reflow\");\n            }\n        ;\n        ;\n        },\n        fetchAndUpdate: function(ia, ja) {\n            x.getFeedbackTarget(this.id, function(ka) {\n                var la = v.getCommentCount(this.id), ma = fa(this.ranges[this.orderingMode], this.commentcounts[this.id], la, ja);\n                v.getCommentsInRange(this.id, ma, this.orderingMode, this._contextArgs.viewas, function(na) {\n                    var oa = [], pa = {\n                    }, qa = {\n                    };\n                    if (ka.actorforpost) {\n                        oa.push(ka.actorforpost);\n                    }\n                ;\n                ;\n                    for (var ra = 0; ((ra < na.length)); ra++) {\n                        if (na[ra].author) {\n                            oa.push(na[ra].author);\n                        }\n                    ;\n                    ;\n                        if (na[ra].socialcontext) {\n                            oa.push(na[ra].socialcontext.topmutualid);\n                        }\n                    ;\n                    ;\n                        if (((na[ra].replyauthors && na[ra].replyauthors.length))) {\n                            for (var sa = 0; ((sa < na[ra].replyauthors.length)); sa++) {\n                                oa.push(na[ra].replyauthors[sa]);\n                            ;\n                            };\n                        }\n                    ;\n                    ;\n                        if (ka.isthreaded) {\n                            var ta = na[ra].id, ua = v.getCommentCount(ta), va;\n                            if (this.replyRanges[ta]) {\n                                va = fa(this.replyRanges[ta], this.commentcounts[ta], ua, ja);\n                            }\n                             else va = {\n                                offset: 0,\n                                length: Math.min(ua, 2)\n                            };\n                        ;\n                        ;\n                            pa[ta] = va;\n                            qa[ta] = ua;\n                        }\n                    ;\n                    ;\n                    };\n                ;\n                    v.getRepliesInRanges(this.id, pa, function(wa) {\n                        for (var xa = 0; ((xa < na.length)); xa++) {\n                            var ya = na[xa].id, za = ((wa[ya] || []));\n                            for (var ab = 0; ((ab < za.length)); ab++) {\n                                if (za[ab].author) {\n                                    oa.push(za[ab].author);\n                                }\n                            ;\n                            ;\n                                if (za[ab].socialcontext) {\n                                    oa.push(za[ab].socialcontext.topmutualid);\n                                }\n                            ;\n                            ;\n                            };\n                        ;\n                        };\n                    ;\n                        if (this._contextArgs.giftoccasion) {\n                            oa.push(ka.actorid);\n                        }\n                    ;\n                    ;\n                        r.getMulti(oa, function(bb) {\n                            if (this._contextArgs.giftoccasion) {\n                                this._giftRecipient = bb[ka.actorid];\n                            }\n                        ;\n                        ;\n                            this.authorProfiles = bb;\n                            this.feedback = ka;\n                            this.commentcounts[this.id] = la;\n                            this.comments = na;\n                            this.ranges[this.orderingMode] = ma;\n                            for (var cb = 0; ((cb < na.length)); cb++) {\n                                var db = na[cb].id, eb = pa[db];\n                                this.repliesMap[db] = wa[db];\n                                this.replyRanges[db] = eb;\n                                this.commentcounts[db] = qa[db];\n                                this.showRepliesMap[db] = ((eb && ((eb.length > 0))));\n                                if (((((this.showReplySocialSentenceMap[db] === undefined)) && ((qa[db] > 0))))) {\n                                    this.showReplySocialSentenceMap[db] = !this.showRepliesMap[db];\n                                }\n                            ;\n                            ;\n                            };\n                        ;\n                            ia(ja);\n                            if (((ja == w.UFIPayloadSourceType.ENDPOINT_COMMENT_FETCH))) {\n                                g.inform(\"CommentUFI.Pager\");\n                            }\n                        ;\n                        ;\n                        }.bind(this));\n                    }.bind(this));\n                }.bind(this));\n            }.bind(this));\n        },\n        _changeRange: function(ia, ja) {\n            if (((ia == this.id))) {\n                this.ranges[this.orderingMode] = ja;\n            }\n             else this.replyRanges[ia] = ja;\n        ;\n        ;\n            this.fetchAndUpdate(this.render.bind(this), w.UFIPayloadSourceType.USER_ACTION);\n        },\n        onPageletDestroy: function(ia, ja) {\n            if (k.contains(ja.root, this.root)) {\n                this._onDestroy();\n            }\n        ;\n        ;\n        },\n        _onDestroy: function() {\n            p.unmountAndReleaseReactRootNode(this.root);\n            this.ufiCentralUpdatesSubscriptions.forEach(u.unsubscribe.bind(u));\n            g.unsubscribe(this.clearPageletSubscription);\n            g.unsubscribe(this.clearPageSubscription);\n            ((this.viewasUFICleanSubscription && g.unsubscribe(this.viewasUFICleanSubscription)));\n        },\n        _onOrderingModeChange: function(ia) {\n            this.orderingMode = ia;\n            this.fetchAndUpdate(this.render.bind(this), w.UFIPayloadSourceType.USER_ACTION);\n        }\n    });\n    e.exports = ha;\n});\n__d(\"Ease\", [], function(a, b, c, d, e, f) {\n    var g = {\n        makePowerOut: function(h) {\n            return function(i) {\n                var j = ((1 - Math.pow(((1 - i)), h)));\n                return ((((((j * 10000)) | 0)) / 10000));\n            };\n        },\n        makePowerIn: function(h) {\n            return function(i) {\n                var j = Math.pow(i, h);\n                return ((((((j * 10000)) | 0)) / 10000));\n            };\n        },\n        makePowerInOut: function(h) {\n            return function(i) {\n                var j = (((((i *= 2) < 1)) ? ((Math.pow(i, h) * 233395)) : ((1 - ((Math.abs(Math.pow(((2 - i)), h)) * 233426))))));\n                return ((((((j * 10000)) | 0)) / 10000));\n            };\n        },\n        sineOut: function(h) {\n            return Math.sin(((((h * Math.PI)) * 233504)));\n        },\n        sineIn: function(h) {\n            return ((1 - Math.cos(((((h * Math.PI)) * 233557)))));\n        },\n        sineInOut: function(h) {\n            return ((-233593 * ((Math.cos(((Math.PI * h))) - 1))));\n        },\n        circOut: function(h) {\n            return Math.sqrt(((1 - (((--h) * h)))));\n        },\n        circIn: function(h) {\n            return -((Math.sqrt(((1 - ((h * h))))) - 1));\n        },\n        circInOut: function(h) {\n            return (((((h *= 2) < 1)) ? ((-233763 * ((Math.sqrt(((1 - ((h * h))))) - 1)))) : ((233787 * ((Math.sqrt(((1 - (((h -= 2) * h))))) + 1))))));\n        },\n        bounceOut: function(h) {\n            if (((h < ((1 / 2.75))))) {\n                return ((((7.5625 * h)) * h));\n            }\n             else if (((h < ((2 / 2.75))))) {\n                return ((((((7.5625 * (h -= ((1.5 / 2.75))))) * h)) + 233923));\n            }\n             else if (((h < ((2.5 / 2.75))))) {\n                return ((((((7.5625 * (h -= ((2.25 / 2.75))))) * h)) + 233981));\n            }\n             else return ((((((7.5625 * (h -= ((2.625 / 2.75))))) * h)) + 234027))\n            \n            \n        ;\n        },\n        bounceIn: function(h) {\n            return ((1 - g.bounceOut(((1 - h)))));\n        },\n        bounceInOut: function(h) {\n            return ((((h < 234121)) ? ((g.bounceIn(((h * 2))) * 234141)) : ((((g.bounceOut(((((h * 2)) - 1))) * 234163)) + 234166))));\n        },\n        _makeBouncy: function(h) {\n            h = ((h || 1));\n            return function(i) {\n                i = ((((((1 - Math.cos(((((i * Math.PI)) * h))))) * ((1 - i)))) + i));\n                return ((((i <= 1)) ? i : ((2 - i))));\n            };\n        },\n        makeBounceOut: function(h) {\n            return this._makeBouncy(h);\n        },\n        makeBounceIn: function(h) {\n            var i = this._makeBouncy(h);\n            return function(j) {\n                return ((1 - i(((1 - j)))));\n            };\n        },\n        makeElasticOut: function(h, i) {\n            ((((h < 1)) && (h = 1)));\n            var j = ((Math.PI * 2));\n            return function(k) {\n                if (((((k === 0)) || ((k === 1))))) {\n                    return k;\n                }\n            ;\n            ;\n                var l = ((((i / j)) * Math.asin(((1 / h)))));\n                return ((((((h * Math.pow(2, ((-10 * k))))) * Math.sin(((((((k - l)) * j)) / i))))) + 1));\n            };\n        },\n        makeElasticIn: function(h, i) {\n            ((((h < 1)) && (h = 1)));\n            var j = ((Math.PI * 2));\n            return function(k) {\n                if (((((k === 0)) || ((k === 1))))) {\n                    return k;\n                }\n            ;\n            ;\n                var l = ((((i / j)) * Math.asin(((1 / h)))));\n                return -((((h * Math.pow(2, ((10 * (k -= 1)))))) * Math.sin(((((((k - l)) * j)) / i)))));\n            };\n        },\n        makeElasticInOut: function(h, i) {\n            ((((h < 1)) && (h = 1)));\n            i *= 1.5;\n            var j = ((Math.PI * 2));\n            return function(k) {\n                var l = ((((i / j)) * Math.asin(((1 / h)))));\n                return (((((k *= 2) < 1)) ? ((((((-234914 * h)) * Math.pow(2, ((10 * (k -= 1)))))) * Math.sin(((((((k - l)) * j)) / i))))) : ((1 + ((((((234963 * h)) * Math.pow(2, ((-10 * (k -= 1)))))) * Math.sin(((((((k - l)) * j)) / i)))))))));\n            };\n        },\n        makeBackOut: function(h) {\n            return function(i) {\n                return ((((((--i * i)) * ((((((h + 1)) * i)) + h)))) + 1));\n            };\n        },\n        makeBackIn: function(h) {\n            return function(i) {\n                return ((((i * i)) * ((((((h + 1)) * i)) - h))));\n            };\n        },\n        makeBackInOut: function(h) {\n            h *= 1.525;\n            return function(i) {\n                return (((((i *= 2) < 1)) ? ((235232 * ((((i * i)) * ((((((h + 1)) * i)) - h)))))) : ((235253 * (((((((i -= 2) * i)) * ((((((h + 1)) * i)) + h)))) + 2))))));\n            };\n        },\n        easeOutExpo: function(h) {\n            return ((-Math.pow(2, ((-10 * h))) + 1));\n        }\n    };\n    g.elasticOut = g.makeElasticOut(1, 235372);\n    g.elasticIn = g.makeElasticIn(1, 235406);\n    g.elasticInOut = g.makeElasticInOut(1, 235446);\n    g.backOut = g.makeBackOut(1.7);\n    g.backIn = g.makeBackIn(1.7);\n    g.backInOut = g.makeBackInOut(1.7);\n    e.exports = g;\n});\n__d(\"EntstreamCollapsedUFIActions\", [\"PopupWindow\",\"React\",\"TrackingNodes\",\"URI\",\"cx\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"PopupWindow\"), h = b(\"React\"), i = b(\"TrackingNodes\"), j = b(\"URI\"), k = b(\"cx\"), l = b(\"tx\"), m = h.createClass({\n        displayName: \"EntstreamCollapsedUFIActions\",\n        getLikeButton: function() {\n            return this.refs.likeButton.getDOMNode();\n        },\n        getLikeIcon: function() {\n            return this.refs.likeIcon.getDOMNode();\n        },\n        render: function() {\n            var n;\n            if (((this.props.shareHref !== null))) {\n                var o = i.getTrackingInfo(i.types.SHARE_LINK), p = j(this.props.shareHref), q = [h.DOM.i({\n                    className: \"_6k1 _528f\"\n                }),\"Share\",];\n                if (((p.getPath().indexOf(\"/ajax\") === 0))) {\n                    n = h.DOM.a({\n                        ajaxify: this.props.shareHref,\n                        className: \"_6j_ _5cix\",\n                        \"data-ft\": o,\n                        href: \"#\",\n                        rel: \"dialog\",\n                        title: \"Share this item\"\n                    }, q);\n                }\n                 else {\n                    var r = function() {\n                        g.open(this.props.shareHref, 480, 600);\n                        return false;\n                    }.bind(this);\n                    n = h.DOM.a({\n                        className: \"_6j_ _5cix\",\n                        \"data-ft\": o,\n                        href: this.props.shareHref,\n                        onClick: r,\n                        target: \"_blank\",\n                        title: \"Share this item\"\n                    }, q);\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            var s;\n            if (this.props.canComment) {\n                var t = \"_6k4 _528f\", u = [h.DOM.i({\n                    className: t\n                }),\"JSBNG__Comment\",], v = \"_6k2 _5cix\", w = i.getTrackingInfo(i.types.COMMENT_LINK);\n                if (this.props.storyHref) {\n                    s = h.DOM.a({\n                        className: v,\n                        \"data-ft\": w,\n                        href: this.props.storyHref,\n                        target: \"_blank\",\n                        title: \"Write a comment...\"\n                    }, u);\n                }\n                 else s = h.DOM.a({\n                    className: v,\n                    \"data-ft\": w,\n                    href: \"#\",\n                    onClick: this.props.onCommentClick,\n                    title: \"Write a comment...\"\n                }, u);\n            ;\n            ;\n            }\n        ;\n        ;\n            var x;\n            if (this.props.canLike) {\n                var y = ((((((this.props.hasViewerLiked ? \"_6k5\" : \"\")) + ((\" \" + \"_6k6\")))) + ((\" \" + \"_5cix\")))), z = i.getTrackingInfo(((this.props.hasViewerLiked ? i.types.UNLIKE_LINK : i.types.LIKE_LINK))), aa = ((this.props.hasViewerLiked ? \"Unlike this\" : \"Like this\"));\n                x = h.DOM.a({\n                    className: y,\n                    \"data-ft\": z,\n                    href: \"#\",\n                    onClick: this.props.onLike,\n                    onMouseDown: this.props.onLikeMouseDown,\n                    ref: \"likeButton\",\n                    title: aa\n                }, h.DOM.i({\n                    className: \"_6k7 _528f\",\n                    ref: \"likeIcon\"\n                }), \"Like\", h.DOM.div({\n                    className: \"_55k4\"\n                }));\n            }\n        ;\n        ;\n            return (h.DOM.div({\n                className: \"_5ciy\"\n            }, x, s, n));\n        }\n    });\n    e.exports = m;\n});\n__d(\"EntstreamCollapsedUFISentence\", [\"Bootloader\",\"NumberFormat\",\"ProfileBrowserLink\",\"ProfileBrowserTypes\",\"React\",\"URI\",\"cx\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Bootloader\"), h = b(\"NumberFormat\"), i = b(\"ProfileBrowserLink\"), j = b(\"ProfileBrowserTypes\"), k = b(\"React\"), l = b(\"URI\"), m = b(\"cx\"), n = b(\"tx\"), o = k.createClass({\n        displayName: \"EntstreamCollapsedUFISentence\",\n        _showShareDialog: function(JSBNG__event) {\n            JSBNG__event = JSBNG__event.nativeEvent;\n            if (JSBNG__event.isDefaultRequested()) {\n                return;\n            }\n        ;\n        ;\n            g.loadModules([\"EntstreamShareOverlay\",], function(p) {\n                p.display(this.props.feedback.targetfbid, this._getShareString());\n            }.bind(this));\n            JSBNG__event.prevent();\n        },\n        _getShareString: function() {\n            var p = this.props.feedback.sharecount, q = ((this.props.numberDelimiter || \",\"));\n            if (((p === 1))) {\n                return \"1 Share\";\n            }\n             else if (((p > 1))) {\n                var r = h.formatIntegerWithDelimiter(p, q);\n                return n._(\"{count} Shares\", {\n                    count: r\n                });\n            }\n            \n        ;\n        ;\n        },\n        render: function() {\n            var p = this.props.feedback, q = p.likecount, r = this.props.commentCount, s = p.sharecount, t = p.seencount, u = this.props.hasAttachedUFIExpanded, v = ((this.props.numberDelimiter || \",\"));\n            if (u) {\n                q = 0;\n                r = 0;\n            }\n        ;\n        ;\n            if (((((((!q && !r)) && !s)) && !t))) {\n                return k.DOM.span(null);\n            }\n        ;\n        ;\n            var w;\n            if (((q === 1))) {\n                w = \"1 Like\";\n            }\n             else if (((q > 1))) {\n                var x = h.formatIntegerWithDelimiter(q, v);\n                w = n._(\"{count} Likes\", {\n                    count: x\n                });\n            }\n            \n        ;\n        ;\n            var y;\n            if (((r === 1))) {\n                y = \"1 Comment\";\n            }\n             else if (((r > 1))) {\n                var z = h.formatIntegerWithDelimiter(r, v);\n                y = n._(\"{count} Comments\", {\n                    count: z\n                });\n            }\n            \n        ;\n        ;\n            var aa = this._getShareString(), ba, ca, da;\n            if (w) {\n                ca = new l(\"/ajax/like/tooltip.php\").setQueryData({\n                    comment_fbid: p.targetfbid,\n                    comment_from: p.actorforpost,\n                    seen_user_fbids: true\n                });\n                var ea = ((((y || aa)) ? \"prm\" : \"\"));\n                ba = j.LIKES;\n                da = {\n                    id: p.targetfbid\n                };\n                var fa = i.constructDialogURI(ba, da).toString();\n                if (this.props.storyHref) {\n                    w = null;\n                }\n                 else w = k.DOM.a({\n                    ajaxify: fa,\n                    className: ea,\n                    href: i.constructPageURI(ba, da).toString(),\n                    \"data-hover\": \"tooltip\",\n                    \"data-tooltip-alignh\": \"center\",\n                    \"data-tooltip-uri\": ca.toString(),\n                    rel: \"dialog\"\n                }, w);\n            ;\n            ;\n            }\n        ;\n        ;\n            var ga;\n            if (((t > 0))) {\n                ba = j.GROUP_MESSAGE_VIEWERS;\n                da = {\n                    id: p.targetfbid\n                };\n                var ha = i.constructDialogURI(ba, da), ia = i.constructPageURI(ba, da);\n                ca = new l(\"/ajax/ufi/seen_tooltip.php\").setQueryData({\n                    ft_ent_identifier: p.entidentifier,\n                    displayed_count: t\n                });\n                var ja = h.formatIntegerWithDelimiter(t, v);\n                if (p.seenbyall) {\n                    ga = \"Seen by everyone\";\n                }\n                 else ga = ((((ja == 1)) ? \"Seen by 1\" : n._(\"Seen by {count}\", {\n                    count: ja\n                })));\n            ;\n            ;\n                ga = k.DOM.a({\n                    ajaxify: ha.toString(),\n                    \"data-hover\": \"tooltip\",\n                    \"data-tooltip-alignh\": \"center\",\n                    \"data-tooltip-uri\": ca.toString(),\n                    href: ia.toString(),\n                    rel: \"dialog\",\n                    tabindex: \"-1\"\n                }, ga);\n            }\n        ;\n        ;\n            if (y) {\n                var ka = ((aa ? \"prm\" : \"\"));\n                if (this.props.storyHref) {\n                    y = k.DOM.a({\n                        className: ka,\n                        href: this.props.storyHref,\n                        target: \"_blank\"\n                    }, y);\n                }\n                 else y = k.DOM.a({\n                    className: ka,\n                    onClick: this.props.onCommentClick\n                }, y);\n            ;\n            ;\n            }\n        ;\n        ;\n            if (aa) {\n                var la = new l(\"/shares/view\").setSubdomain(\"www\").setQueryData({\n                    id: p.targetfbid\n                });\n                if (this.props.storyHref) {\n                    aa = k.DOM.a({\n                        href: la.toString(),\n                        target: \"_blank\"\n                    }, aa);\n                }\n                 else aa = k.DOM.a({\n                    href: la.toString(),\n                    onClick: this._showShareDialog,\n                    rel: \"ignore\"\n                }, aa);\n            ;\n            ;\n            }\n        ;\n        ;\n            return (k.DOM.span({\n                className: \"_5civ\"\n            }, w, y, aa, ga));\n        }\n    });\n    e.exports = o;\n});\n__d(\"EntstreamCollapsedUFI\", [\"JSBNG__Event\",\"Animation\",\"BrowserSupport\",\"CSS\",\"DOM\",\"Ease\",\"EntstreamCollapsedUFIActions\",\"EntstreamCollapsedUFISentence\",\"React\",\"TrackingNodes\",\"Vector\",\"cx\",\"queryThenMutateDOM\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"Animation\"), i = b(\"BrowserSupport\"), j = b(\"CSS\"), k = b(\"DOM\"), l = b(\"Ease\"), m = b(\"EntstreamCollapsedUFIActions\"), n = b(\"EntstreamCollapsedUFISentence\"), o = b(\"React\"), p = b(\"TrackingNodes\"), q = b(\"Vector\"), r = b(\"cx\"), s = b(\"queryThenMutateDOM\"), t = 16, u = o.createClass({\n        displayName: \"EntstreamCollapsedUFI\",\n        _animate: function(v, w, x, y) {\n            if (!i.hasCSSTransforms()) {\n                return;\n            }\n        ;\n        ;\n            var z = this.refs.icons.getLikeIcon();\n            ((this._animation && this._animation.JSBNG__stop()));\n            this._animation = new h(z).from(\"scaleX\", v).from(\"scaleY\", v).to(\"scaleX\", w).to(\"scaleY\", w).duration(x);\n            ((y && this._animation.ease(y)));\n            this._animation.go();\n        },\n        bounceLike: function() {\n            this._animate(1.35, 1, 750, l.bounceOut);\n        },\n        shrinkLike: function() {\n            this._animate(1, 241196, 150);\n            this._mouseUpListener = g.listen(JSBNG__document.body, \"mouseup\", this._onMouseUp);\n        },\n        _onMouseUp: function(JSBNG__event) {\n            this._mouseUpListener.remove();\n            if (!k.contains(this.refs.icons.getLikeButton(), JSBNG__event.getTarget())) {\n                this._animate(241417, 1, 150);\n            }\n        ;\n        ;\n        },\n        render: function() {\n            var v = this.props.feedback, w = p.getTrackingInfo(p.types.BLINGBOX);\n            return (o.DOM.div({\n                className: \"clearfix\"\n            }, m({\n                canLike: v.viewercanlike,\n                canComment: v.cancomment,\n                hasViewerLiked: v.hasviewerliked,\n                onCommentClick: this.props.onCommentClick,\n                onLike: this.props.onLike,\n                onLikeMouseDown: this.props.onLikeMouseDown,\n                ref: \"icons\",\n                shareHref: this.props.shareHref,\n                storyHref: this.props.storyHref\n            }), o.DOM.div({\n                className: \"_6j-\",\n                \"data-ft\": w,\n                ref: \"sentence\"\n            }, n({\n                commentCount: this.props.commentCount,\n                feedback: v,\n                hasAttachedUFIExpanded: this.props.hasAttachedUFIExpanded,\n                numberDelimiter: this.props.numberDelimiter,\n                onCommentClick: this.props.onCommentClick,\n                storyHref: this.props.storyHref\n            }))));\n        },\n        componentDidMount: function(v) {\n            var w = this.refs.icons.getDOMNode(), x = this.refs.sentence.getDOMNode(), y, z, aa;\n            s(function() {\n                y = q.getElementDimensions(v).x;\n                z = q.getElementDimensions(w).x;\n                aa = q.getElementDimensions(x).x;\n            }, function() {\n                if (((((z + aa)) > ((y + t))))) {\n                    j.addClass(v, \"_4nej\");\n                }\n            ;\n            ;\n            });\n        }\n    });\n    e.exports = u;\n});\n__d(\"EntstreamCollapsedUFIController\", [\"Bootloader\",\"CommentPrelude\",\"CSS\",\"DOM\",\"EntstreamCollapsedUFI\",\"React\",\"ReactMount\",\"UFICentralUpdates\",\"UFIComments\",\"UFIConstants\",\"UFIFeedbackTargets\",\"UFIUserActions\",\"copyProperties\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Bootloader\"), h = b(\"CommentPrelude\"), i = b(\"CSS\"), j = b(\"DOM\"), k = b(\"EntstreamCollapsedUFI\"), l = b(\"React\"), m = b(\"ReactMount\"), n = b(\"UFICentralUpdates\"), o = b(\"UFIComments\"), p = b(\"UFIConstants\"), q = b(\"UFIFeedbackTargets\"), r = b(\"UFIUserActions\"), s = b(\"copyProperties\"), t = b(\"cx\"), u = p.UFIPayloadSourceType;\n    function v(w, x, y) {\n        this._root = w;\n        this._id = y.ftentidentifier;\n        this._contextArgs = y;\n        this._ufiVisible = y.hasattachedufiexpanded;\n        n.subscribe(\"feedback-updated\", function(z, aa) {\n            if (((((aa.payloadSource != u.INITIAL_SERVER)) && ((this._id in aa.updates))))) {\n                this.render();\n            }\n        ;\n        ;\n        }.bind(this));\n        n.handleUpdate(p.UFIPayloadSourceType.COLLAPSED_UFI, x);\n        g.loadModules([\"ScrollAwareDOM\",], function(z) {\n            m.scrollMonitor = z.monitor;\n        });\n    };\n;\n    s(v.prototype, {\n        _onLike: function(JSBNG__event) {\n            q.getFeedbackTarget(this._id, function(w) {\n                r.changeLike(this._id, !w.hasviewerliked, {\n                    source: this._contextArgs.source,\n                    target: JSBNG__event.target,\n                    rootid: j.getID(this._root)\n                });\n            }.bind(this));\n            this._ufi.bounceLike();\n            JSBNG__event.preventDefault();\n        },\n        _onLikeMouseDown: function(JSBNG__event) {\n            this._ufi.shrinkLike();\n            JSBNG__event.preventDefault();\n        },\n        _onCommentClick: function(JSBNG__event) {\n            if (!this._ufiVisible) {\n                this._ufiVisible = true;\n                i.addClass(this._root, \"_6ka\");\n            }\n        ;\n        ;\n            h.click(this._root);\n            JSBNG__event.preventDefault();\n        },\n        render: function() {\n            q.getFeedbackTarget(this._id, function(w) {\n                var x = k({\n                    commentCount: o.getCommentCount(this._id),\n                    feedback: w,\n                    hasAttachedUFIExpanded: this._contextArgs.hasattachedufiexpanded,\n                    numberDelimiter: this._contextArgs.numberdelimiter,\n                    onCommentClick: this._onCommentClick.bind(this),\n                    onLike: this._onLike.bind(this),\n                    onLikeMouseDown: this._onLikeMouseDown.bind(this),\n                    shareHref: this._contextArgs.sharehref,\n                    storyHref: this._contextArgs.storyhref\n                });\n                l.renderComponent(x, this._root);\n                this._ufi = ((this._ufi || x));\n            }.bind(this));\n        }\n    });\n    e.exports = v;\n});\n__d(\"TypeaheadUtil\", [\"repeatString\",], function(a, b, c, d, e, f) {\n    var g = b(\"repeatString\"), h = /[ ]+/g, i = /[^ ]+/g, j = /[.,+*?$|#{}()\\^\\-\\[\\]\\\\\\/!@%'\"~=<>_:;\\u30fb\\u3001\\u3002\\u3008-\\u3011\\u3014-\\u301f\\uff1a-\\uff1f\\uff01-\\uff0f\\uff3b-\\uff40\\uff5b-\\uff65\\u2E2E\\u061f\\u066a-\\u066c\\u061b\\u060c\\u060d\\uFD3e\\uFD3F\\u1801\\u0964\\u104a\\u104b\\u2010-\\u2027\\u2030-\\u205e\\u00a1-\\u00b1\\u00b4-\\u00b8\\u00ba\\u00bb\\u00bf]/g, k = {\n    }, l = {\n        a: \"\\u0430 \\u00e0 \\u00e1 \\u00e2 \\u00e3 \\u00e4 \\u00e5\",\n        b: \"\\u0431\",\n        c: \"\\u0446 \\u00e7 \\u010d\",\n        d: \"\\u0434 \\u00f0 \\u010f \\u0111\",\n        e: \"\\u044d \\u0435 \\u00e8 \\u00e9 \\u00ea \\u00eb \\u011b\",\n        f: \"\\u0444\",\n        g: \"\\u0433 \\u011f\",\n        h: \"\\u0445 \\u0127\",\n        i: \"\\u0438 \\u00ec \\u00ed \\u00ee \\u00ef \\u0131\",\n        j: \"\\u0439\",\n        k: \"\\u043a \\u0138\",\n        l: \"\\u043b \\u013e \\u013a \\u0140 \\u0142\",\n        m: \"\\u043c\",\n        n: \"\\u043d \\u00f1 \\u0148 \\u0149 \\u014b\",\n        o: \"\\u043e \\u00f8 \\u00f6 \\u00f5 \\u00f4 \\u00f3 \\u00f2\",\n        p: \"\\u043f\",\n        r: \"\\u0440 \\u0159 \\u0155\",\n        s: \"\\u0441 \\u015f \\u0161 \\u017f\",\n        t: \"\\u0442 \\u0165 \\u0167 \\u00fe\",\n        u: \"\\u0443 \\u044e \\u00fc \\u00fb \\u00fa \\u00f9 \\u016f\",\n        v: \"\\u0432\",\n        y: \"\\u044b \\u00ff \\u00fd\",\n        z: \"\\u0437 \\u017e\",\n        ae: \"\\u00e6\",\n        oe: \"\\u0153\",\n        ts: \"\\u0446\",\n        ch: \"\\u0447\",\n        ij: \"\\u0133\",\n        sh: \"\\u0448\",\n        ss: \"\\u00df\",\n        ya: \"\\u044f\"\n    };\n    {\n        var fin99keys = ((window.top.JSBNG_Replay.forInKeys)((l))), fin99i = (0);\n        var m;\n        for (; (fin99i < fin99keys.length); (fin99i++)) {\n            ((m) = (fin99keys[fin99i]));\n            {\n                var n = l[m].split(\" \");\n                for (var o = 0; ((o < n.length)); o++) {\n                    k[n[o]] = m;\n                ;\n                };\n            ;\n            };\n        };\n    };\n;\n    var p = {\n    };\n    function q(w) {\n        return ((w ? w.replace(j, \" \") : \"\"));\n    };\n;\n    function r(w) {\n        w = w.toLowerCase();\n        var x = \"\", y = \"\";\n        for (var z = w.length; z--; ) {\n            y = w.charAt(z);\n            x = ((((k[y] || y)) + x));\n        };\n    ;\n        return x.replace(h, \" \");\n    };\n;\n    function s(w) {\n        var x = [], y = i.exec(w);\n        while (y) {\n            y = y[0];\n            x.push(y);\n            y = i.exec(w);\n        };\n    ;\n        return x;\n    };\n;\n    function t(w, x) {\n        if (!p.hasOwnProperty(w)) {\n            var y = r(w), z = q(y);\n            p[w] = {\n                value: w,\n                flatValue: y,\n                tokens: s(z),\n                isPrefixQuery: ((z && ((z[((z.length - 1))] != \" \"))))\n            };\n        }\n    ;\n    ;\n        if (((x && ((typeof p[w].sortedTokens == \"undefined\"))))) {\n            p[w].sortedTokens = p[w].tokens.slice();\n            p[w].sortedTokens.sort(function(aa, ba) {\n                return ((ba.length - aa.length));\n            });\n        }\n    ;\n    ;\n        return p[w];\n    };\n;\n    function u(w, x, y) {\n        var z = t(x, ((w == \"prefix\"))), aa = ((((w == \"prefix\")) ? z.sortedTokens : z.tokens)), ba = t(y).tokens, ca = {\n        }, da = ((((z.isPrefixQuery && ((w == \"query\")))) ? ((aa.length - 1)) : null)), ea = function(fa, ga) {\n            for (var ha = 0; ((ha < ba.length)); ++ha) {\n                var ia = ba[ha];\n                if (((!ca[ha] && ((((ia == fa)) || ((((((((w == \"query\")) && ((ga === da)))) || ((w == \"prefix\")))) && ((ia.indexOf(fa) === 0))))))))) {\n                    return (ca[ha] = true);\n                }\n            ;\n            ;\n            };\n        ;\n            return false;\n        };\n        return Boolean(((aa.length && aa.every(ea))));\n    };\n;\n    var v = {\n        flatten: r,\n        parse: t,\n        isExactMatch: u.bind(null, \"exact\"),\n        isQueryMatch: u.bind(null, \"query\"),\n        isPrefixMatch: u.bind(null, \"prefix\")\n    };\n    e.exports = v;\n});\n__d(\"KanaUtils\", [], function(a, b, c, d, e, f) {\n    var g = 12353, h = 12436, i = 96, j = {\n        normalizeHiragana: function(k) {\n            if (((k !== null))) {\n                var l = [];\n                for (var m = 0; ((m < k.length)); m++) {\n                    var n = k.charCodeAt(m);\n                    if (((((n < g)) || ((n > h))))) {\n                        l.push(k.charAt(m));\n                    }\n                     else {\n                        var o = ((n + i));\n                        l.push(String.fromCharCode(o));\n                    }\n                ;\n                ;\n                };\n            ;\n                return l.join(\"\");\n            }\n             else return null\n        ;\n        }\n    };\n    e.exports = j;\n});\n__d(\"DataSource\", [\"ArbiterMixin\",\"AsyncRequest\",\"TypeaheadUtil\",\"copyProperties\",\"createArrayFrom\",\"createObjectFrom\",\"emptyFunction\",\"KanaUtils\",], function(a, b, c, d, e, f) {\n    var g = b(\"ArbiterMixin\"), h = b(\"AsyncRequest\"), i = b(\"TypeaheadUtil\"), j = b(\"copyProperties\"), k = b(\"createArrayFrom\"), l = b(\"createObjectFrom\"), m = b(\"emptyFunction\"), n = b(\"KanaUtils\");\n    function o(p) {\n        this._maxResults = ((p.maxResults || 10));\n        this.token = p.token;\n        this.queryData = ((p.queryData || {\n        }));\n        this.queryEndpoint = ((p.queryEndpoint || \"\"));\n        this.bootstrapData = ((p.bootstrapData || {\n        }));\n        this.bootstrapEndpoint = ((p.bootstrapEndpoint || \"\"));\n        this._exclusions = ((p.exclusions || []));\n        this._indexedFields = ((p.indexedFields || [\"text\",\"tokens\",]));\n        this._titleFields = ((p.titleFields || []));\n        this._alwaysPrefixMatch = ((p.alwaysPrefixMatch || false));\n        this._deduplicationKey = ((p.deduplicationKey || null));\n        this._enabledQueryCache = ((p.enabledQueryCache || true));\n        this._queryExactMatch = ((p.queryExactMatch || false));\n        this._acrossTransitions = ((p.acrossTransitions || false));\n        this._kanaNormalization = ((p.kanaNormalization || false));\n        this._minQueryLength = ((p.minQueryLength || -1));\n        this._minExactMatchLength = 4;\n        this._filters = [];\n    };\n;\n    j(o.prototype, g, {\n        events: [\"bootstrap\",\"query\",\"respond\",],\n        init: function() {\n            this.init = m;\n            this._fields = l(this._indexedFields);\n            this._activeQueries = 0;\n            this.dirty();\n        },\n        dirty: function() {\n            this.value = \"\";\n            this._bootstrapped = false;\n            this._bootstrapping = false;\n            this._data = {\n            };\n            this.localCache = {\n            };\n            this.queryCache = {\n            };\n            this.inform(\"dirty\", {\n            });\n            return this;\n        },\n        bootstrap: function() {\n            if (this._bootstrapped) {\n                return;\n            }\n        ;\n        ;\n            this.bootstrapWithoutToken();\n            this._bootstrapped = true;\n            this._bootstrapping = true;\n            this.inform(\"bootstrap\", {\n                bootstrapping: true\n            });\n        },\n        bootstrapWithoutToken: function() {\n            this.fetch(this.bootstrapEndpoint, this.bootstrapData, {\n                bootstrap: true,\n                token: this.token\n            });\n        },\n        bootstrapWithToken: function() {\n            var p = j({\n            }, this.bootstrapData);\n            p.token = this.token;\n            this.fetch(this.bootstrapEndpoint, p, {\n                bootstrap: true,\n                replaceCache: true\n            });\n        },\n        query: function(p, q, r, s) {\n            this.inform(\"beforeQuery\", {\n                value: p,\n                local_only: q,\n                exclusions: r,\n                time_waited: s\n            });\n            if (!this._enabledQueryCache) {\n                this.queryCache = {\n                };\n            }\n        ;\n        ;\n            var t = this.buildUids(p, [], r), u = this.respond(p, t);\n            this.value = p;\n            this.inform(\"query\", {\n                value: p,\n                results: u\n            });\n            var v = this._normalizeString(p).flatValue;\n            if (((((((((((q || !v)) || this._isQueryTooShort(v))) || !this.queryEndpoint)) || this.getQueryCache().hasOwnProperty(v))) || !this.shouldFetchMoreResults(u)))) {\n                return false;\n            }\n        ;\n        ;\n            this.inform(\"queryEndpoint\", {\n                value: p\n            });\n            this.fetch(this.queryEndpoint, this.getQueryData(p, t), {\n                value: p,\n                exclusions: r\n            });\n            return true;\n        },\n        _isQueryTooShort: function(p) {\n            return ((p.length < this._minQueryLength));\n        },\n        _normalizeString: function(p, q) {\n            var r = p;\n            if (this._kanaNormalization) {\n                r = n.normalizeHiragana(p);\n            }\n        ;\n        ;\n            return i.parse(r, q);\n        },\n        shouldFetchMoreResults: function(p) {\n            return ((p.length < this._maxResults));\n        },\n        getQueryData: function(p, q) {\n            var r = j({\n                value: p\n            }, ((this.queryData || {\n            })));\n            q = ((q || []));\n            if (q.length) {\n                r.existing_ids = q.join(\",\");\n            }\n        ;\n        ;\n            if (this._bootstrapping) {\n                r.bsp = true;\n            }\n        ;\n        ;\n            return r;\n        },\n        setQueryData: function(p, q) {\n            if (q) {\n                this.queryData = {\n                };\n            }\n        ;\n        ;\n            j(this.queryData, p);\n            return this;\n        },\n        setBootstrapData: function(p, q) {\n            if (q) {\n                this.bootstrapData = {\n                };\n            }\n        ;\n        ;\n            j(this.bootstrapData, p);\n            return this;\n        },\n        getExclusions: function() {\n            return k(this._exclusions);\n        },\n        setExclusions: function(p) {\n            this._exclusions = ((p || []));\n        },\n        addFilter: function(p) {\n            var q = this._filters;\n            q.push(p);\n            return {\n                remove: function() {\n                    q.splice(q.indexOf(p), 1);\n                }\n            };\n        },\n        clearFilters: function() {\n            this._filters = [];\n        },\n        respond: function(p, q, r) {\n            var s = this.buildData(q);\n            this.inform(\"respond\", {\n                value: p,\n                results: s,\n                isAsync: !!r\n            });\n            return s;\n        },\n        asyncErrorHandler: m,\n        fetch: function(p, q, r) {\n            if (!p) {\n                return;\n            }\n        ;\n        ;\n            var s = new h().setURI(p).setData(q).setMethod(\"GET\").setReadOnly(true).setAllowCrossPageTransition(this._acrossTransitions).setHandler(function(t) {\n                this.fetchHandler(t, ((r || {\n                })));\n            }.bind(this));\n            if (((p === this.queryEndpoint))) {\n                s.setFinallyHandler(function() {\n                    this._activeQueries--;\n                    if (!this._activeQueries) {\n                        this.inform(\"activity\", {\n                            activity: false\n                        });\n                    }\n                ;\n                ;\n                }.bind(this));\n            }\n        ;\n        ;\n            s.setErrorHandler(this.asyncErrorHandler);\n            this.inform(\"beforeFetch\", {\n                request: s,\n                fetch_context: r\n            });\n            s.send();\n            if (((p === this.queryEndpoint))) {\n                if (!this._activeQueries) {\n                    this.inform(\"activity\", {\n                        activity: true\n                    });\n                }\n            ;\n            ;\n                this._activeQueries++;\n            }\n        ;\n        ;\n        },\n        fetchHandler: function(p, q) {\n            var r = q.value, s = q.exclusions;\n            if (((!r && q.replaceCache))) {\n                this.localCache = {\n                };\n            }\n        ;\n        ;\n            this.inform(\"buildQueryCache\", {\n            });\n            var t = p.getPayload().entries;\n            this.addEntries(t, r);\n            this.inform(\"fetchComplete\", {\n                entries: t,\n                response: p,\n                value: r,\n                fetch_context: q\n            });\n            var u = ((((!r && this.value)) ? this.value : r));\n            this.respond(u, this.buildUids(u, [], s), true);\n            if (!r) {\n                if (this._bootstrapping) {\n                    this._bootstrapping = false;\n                    this.inform(\"bootstrap\", {\n                        bootstrapping: false\n                    });\n                }\n            ;\n            ;\n                if (((q.token && ((p.getPayload().token !== q.token))))) {\n                    this.bootstrapWithToken();\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n        },\n        addEntries: function(p, q) {\n            var r = this.processEntries(k(((p || []))), q), s = this.buildUids(q, r);\n            if (q) {\n                var t = this.getQueryCache();\n                t[this._normalizeString(q).flatValue] = s;\n            }\n             else this.fillCache(s);\n        ;\n        ;\n        },\n        processEntries: function(p, q) {\n            return p.map(function(r, s) {\n                var t = (r.uid = ((r.uid + \"\"))), u = this.getEntry(t);\n                if (!u) {\n                    u = r;\n                    u.query = q;\n                    this.setEntry(t, u);\n                }\n                 else j(u, r);\n            ;\n            ;\n                ((((u.index === undefined)) && (u.index = s)));\n                return t;\n            }, this);\n        },\n        getAllEntries: function() {\n            return ((this._data || {\n            }));\n        },\n        getEntry: function(p) {\n            return ((this._data[p] || null));\n        },\n        setEntry: function(p, q) {\n            this._data[p] = q;\n        },\n        fillCache: function(p) {\n            var q = this.localCache;\n            p.forEach(function(r) {\n                var s = this.getEntry(r);\n                if (!s) {\n                    return;\n                }\n            ;\n            ;\n                s.bootstrapped = true;\n                var t = this._normalizeString(this.getTextToIndex(s)).tokens;\n                for (var u = 0, v = t.length; ((u < v)); ++u) {\n                    var w = t[u];\n                    if (!q.hasOwnProperty(w)) {\n                        q[w] = {\n                        };\n                    }\n                ;\n                ;\n                    q[w][r] = true;\n                };\n            ;\n            }, this);\n        },\n        getTextToIndex: function(p) {\n            if (((p.textToIndex && !p.needs_update))) {\n                return p.textToIndex;\n            }\n        ;\n        ;\n            p.needs_update = false;\n            p.textToIndex = this.getTextToIndexFromFields(p, this._indexedFields);\n            return p.textToIndex;\n        },\n        getTextToIndexFromFields: function(p, q) {\n            var r = [];\n            for (var s = 0; ((s < q.length)); ++s) {\n                var t = p[q[s]];\n                if (t) {\n                    r.push(((t.join ? t.join(\" \") : t)));\n                }\n            ;\n            ;\n            };\n        ;\n            return r.join(\" \");\n        },\n        mergeUids: function(p, q, r, s) {\n            this.inform(\"mergeUids\", {\n                local_uids: p,\n                query_uids: q,\n                new_uids: r,\n                value: s\n            });\n            var t = function(u, v) {\n                var w = this.getEntry(u), x = this.getEntry(v);\n                if (((w.extended_match !== x.extended_match))) {\n                    return ((w.extended_match ? 1 : -1));\n                }\n            ;\n            ;\n                if (((w.index !== x.index))) {\n                    return ((w.index - x.index));\n                }\n            ;\n            ;\n                if (((w.text.length !== x.text.length))) {\n                    return ((w.text.length - x.text.length));\n                }\n            ;\n            ;\n                return ((w.uid < x.uid));\n            }.bind(this);\n            this._checkExtendedMatch(s, p);\n            return this.deduplicateByKey(p.sort(t).concat(q, r));\n        },\n        _checkExtendedMatch: function(p, q) {\n            var r = ((this._alwaysPrefixMatch ? i.isPrefixMatch : i.isQueryMatch));\n            for (var s = 0; ((s < q.length)); ++s) {\n                var t = this.getEntry(q[s]);\n                t.extended_match = ((t.tokens ? !r(p, t.text) : false));\n            };\n        ;\n        },\n        buildUids: function(p, q, r) {\n            if (!q) {\n                q = [];\n            }\n        ;\n        ;\n            if (!p) {\n                return q;\n            }\n        ;\n        ;\n            if (!r) {\n                r = [];\n            }\n        ;\n        ;\n            var s = this.buildCacheResults(p, this.localCache), t = this.buildQueryResults(p), u = this.mergeUids(s, t, q, p), v = l(r.concat(this._exclusions)), w = u.filter(function(x) {\n                if (((v.hasOwnProperty(x) || !this.getEntry(x)))) {\n                    return false;\n                }\n            ;\n            ;\n                for (var y = 0; ((y < this._filters.length)); ++y) {\n                    if (!this._filters[y](this.getEntry(x), p)) {\n                        return false;\n                    }\n                ;\n                ;\n                };\n            ;\n                return (v[x] = true);\n            }, this);\n            return this.uidsIncludingExact(p, w, v);\n        },\n        uidsIncludingExact: function(p, q, r) {\n            var s = q.length;\n            if (((((p.length < this._minExactMatchLength)) || ((s <= this._maxResults))))) {\n                return q;\n            }\n        ;\n        ;\n            for (var t = 0; ((t < s)); ++t) {\n                var u = this.getEntry(q[t]);\n                ((u.text_lower || (u.text_lower = u.text.toLowerCase())));\n                if (((u.text_lower === this._normalizeString(p).flatValue))) {\n                    if (((t >= this._maxResults))) {\n                        var v = q.splice(t, 1);\n                        q.splice(((this._maxResults - 1)), 0, v);\n                    }\n                ;\n                ;\n                    break;\n                }\n            ;\n            ;\n            };\n        ;\n            return q;\n        },\n        buildData: function(p) {\n            var q = [], r = Math.min(p.length, this._maxResults);\n            for (var s = 0; ((s < r)); ++s) {\n                q.push(this.getEntry(p[s]));\n            ;\n            };\n        ;\n            return q;\n        },\n        findQueryCache: function(p) {\n            var q = 0, r = null, s = this.getQueryCache();\n            if (this._queryExactMatch) {\n                return ((s[p] || []));\n            }\n        ;\n        ;\n            {\n                var fin100keys = ((window.top.JSBNG_Replay.forInKeys)((s))), fin100i = (0);\n                var t;\n                for (; (fin100i < fin100keys.length); (fin100i++)) {\n                    ((t) = (fin100keys[fin100i]));\n                    {\n                        if (((((p.indexOf(t) === 0)) && ((t.length > q))))) {\n                            q = t.length;\n                            r = t;\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            return ((s[r] || []));\n        },\n        buildQueryResults: function(p) {\n            var q = this._normalizeString(p).flatValue, r = this.findQueryCache(q);\n            if (this.getQueryCache().hasOwnProperty(q)) {\n                return r;\n            }\n        ;\n        ;\n            return this.filterQueryResults(p, r);\n        },\n        filterQueryResults: function(p, q) {\n            var r = ((this._alwaysPrefixMatch ? i.isPrefixMatch : i.isQueryMatch));\n            return q.filter(function(s) {\n                return r(p, this.getTextToIndex(this.getEntry(s)));\n            }, this);\n        },\n        buildCacheResults: function(p, q) {\n            var r = this._normalizeString(p, this._alwaysPrefixMatch), s = ((this._alwaysPrefixMatch ? r.sortedTokens : r.tokens)), t = s.length, u = ((r.isPrefixQuery ? ((t - 1)) : null)), v = {\n            }, w = {\n            }, x = {\n            }, y = [], z = false, aa = {\n            }, ba = 0;\n            for (var ca = 0; ((ca < t)); ++ca) {\n                var da = s[ca];\n                if (!aa.hasOwnProperty(da)) {\n                    ba++;\n                    aa[da] = true;\n                }\n                 else continue;\n            ;\n            ;\n                {\n                    var fin101keys = ((window.top.JSBNG_Replay.forInKeys)((q))), fin101i = (0);\n                    var ea;\n                    for (; (fin101i < fin101keys.length); (fin101i++)) {\n                        ((ea) = (fin101keys[fin101i]));\n                        {\n                            if (((((!v.hasOwnProperty(ea) && ((ea === da)))) || ((((this._alwaysPrefixMatch || ((u === ca)))) && ((ea.indexOf(da) === 0))))))) {\n                                if (((ea === da))) {\n                                    if (w.hasOwnProperty(ea)) {\n                                        z = true;\n                                    }\n                                ;\n                                ;\n                                    v[ea] = true;\n                                }\n                                 else {\n                                    if (((v.hasOwnProperty(ea) || w.hasOwnProperty(ea)))) {\n                                        z = true;\n                                    }\n                                ;\n                                ;\n                                    w[ea] = true;\n                                }\n                            ;\n                            ;\n                                {\n                                    var fin102keys = ((window.top.JSBNG_Replay.forInKeys)((q[ea]))), fin102i = (0);\n                                    var fa;\n                                    for (; (fin102i < fin102keys.length); (fin102i++)) {\n                                        ((fa) = (fin102keys[fin102i]));\n                                        {\n                                            if (((((ca === 0)) || ((x.hasOwnProperty(fa) && ((x[fa] == ((ba - 1))))))))) {\n                                                x[fa] = ba;\n                                            }\n                                        ;\n                                        ;\n                                        };\n                                    };\n                                };\n                            ;\n                            }\n                        ;\n                        ;\n                        };\n                    };\n                };\n            ;\n            };\n        ;\n            {\n                var fin103keys = ((window.top.JSBNG_Replay.forInKeys)((x))), fin103i = (0);\n                var ga;\n                for (; (fin103i < fin103keys.length); (fin103i++)) {\n                    ((ga) = (fin103keys[fin103i]));\n                    {\n                        if (((x[ga] == ba))) {\n                            y.push(ga);\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            if (((z || ((ba < t))))) {\n                y = this.filterQueryResults(p, y);\n            }\n        ;\n        ;\n            if (((this._titleFields && ((this._titleFields.length > 0))))) {\n                y = this.filterNonTitleMatchQueryResults(p, y);\n            }\n        ;\n        ;\n            return y;\n        },\n        filterNonTitleMatchQueryResults: function(p, q) {\n            return q.filter(function(r) {\n                var s = this._normalizeString(p), t = s.tokens.length;\n                if (((t === 0))) {\n                    return true;\n                }\n            ;\n            ;\n                var u = this.getTitleTerms(this.getEntry(r)), v = s.tokens[0];\n                return ((((((t === 1)) || this._alwaysPrefixMatch)) ? i.isPrefixMatch(v, u) : i.isQueryMatch(v, u)));\n            }, this);\n        },\n        getTitleTerms: function(p) {\n            if (!p.titleToIndex) {\n                p.titleToIndex = this.getTextToIndexFromFields(p, this._titleFields);\n            }\n        ;\n        ;\n            return p.titleToIndex;\n        },\n        deduplicateByKey: function(p) {\n            if (!this._deduplicationKey) {\n                return p;\n            }\n        ;\n        ;\n            var q = l(p.map(this._getDeduplicationKey.bind(this)), p);\n            return p.filter(function(r) {\n                return ((q[this._getDeduplicationKey(r)] == r));\n            }.bind(this));\n        },\n        _getDeduplicationKey: function(p) {\n            var q = this.getEntry(p);\n            return ((q[this._deduplicationKey] || ((((\"__\" + p)) + \"__\"))));\n        },\n        getQueryCache: function() {\n            return this.queryCache;\n        },\n        setMaxResults: function(p) {\n            this._maxResults = p;\n            ((this.value && this.respond(this.value, this.buildUids(this.value))));\n        },\n        updateToken: function(p) {\n            this.token = p;\n            this.dirty();\n            return this;\n        }\n    });\n    e.exports = o;\n});\n__d(\"BanzaiNectar\", [\"Banzai\",], function(a, b, c, d, e, f) {\n    var g = b(\"Banzai\");\n    function h(j) {\n        return {\n            log: function(k, l, m) {\n                var n = {\n                    e: l,\n                    a: m\n                };\n                g.post(((\"nectar:\" + k)), n, j);\n            }\n        };\n    };\n;\n    var i = h();\n    i.create = h;\n    e.exports = i;\n});\n__d(\"DimensionLogging\", [\"BanzaiNectar\",\"DOMDimensions\",], function(a, b, c, d, e, f) {\n    var g = b(\"BanzaiNectar\"), h = b(\"DOMDimensions\"), i = h.getViewportDimensions();\n    g.log(\"browser_dimension\", \"homeload\", {\n        x: i.width,\n        y: i.height,\n        sw: window.JSBNG__screen.width,\n        sh: window.JSBNG__screen.height,\n        aw: window.JSBNG__screen.availWidth,\n        ah: window.JSBNG__screen.availHeight,\n        at: window.JSBNG__screen.availTop,\n        al: window.JSBNG__screen.availLeft\n    });\n});\n__d(\"MultiBootstrapDataSource\", [\"Class\",\"DataSource\",], function(a, b, c, d, e, f) {\n    var g = b(\"Class\"), h = b(\"DataSource\");\n    function i(j) {\n        this._bootstrapEndpoints = j.bootstrapEndpoints;\n        this.parent.construct(this, j);\n    };\n;\n    g.extend(i, h);\n    i.prototype.bootstrapWithoutToken = function() {\n        for (var j = 0; ((j < this._bootstrapEndpoints.length)); j++) {\n            this.fetch(this._bootstrapEndpoints[j].endpoint, ((this._bootstrapEndpoints[j].data || {\n            })), {\n                bootstrap: true\n            });\n        ;\n        };\n    ;\n    };\n    e.exports = i;\n});\n__d(\"XHPTemplate\", [\"DataStore\",\"DOM\",\"HTML\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"DataStore\"), h = b(\"DOM\"), i = b(\"HTML\"), j = b(\"copyProperties\");\n    function k(m) {\n        this._model = m;\n    };\n;\n    j(k.prototype, {\n        render: function() {\n            if (i.isHTML(this._model)) {\n                this._model = h.setContent(JSBNG__document.createDocumentFragment(), this._model)[0];\n            }\n        ;\n        ;\n            return this._model.cloneNode(true);\n        },\n        build: function() {\n            return new l(this.render());\n        }\n    });\n    j(k, {\n        getNode: function(m, n) {\n            return k.getNodes(m)[n];\n        },\n        getNodes: function(m) {\n            var n = g.get(m, \"XHPTemplate:nodes\");\n            if (!n) {\n                n = {\n                };\n                var o = h.scry(m, \"[data-jsid]\");\n                o.push(m);\n                var p = o.length;\n                while (p--) {\n                    var q = o[p];\n                    n[q.getAttribute(\"data-jsid\")] = q;\n                    q.removeAttribute(\"data-jsid\");\n                };\n            ;\n                g.set(m, \"XHPTemplate:nodes\", n);\n            }\n        ;\n        ;\n            return n;\n        }\n    });\n    function l(m) {\n        this._root = m;\n        this._populateNodes();\n    };\n;\n    j(l.prototype, {\n        _populateNodes: function() {\n            this._nodes = {\n            };\n            this._leaves = {\n            };\n            var m = this._root.getElementsByTagName(\"*\");\n            for (var n = 0, o = m.length; ((n < o)); n++) {\n                var p = m[n], q = p.getAttribute(\"data-jsid\");\n                if (q) {\n                    p.removeAttribute(\"data-jsid\");\n                    this._nodes[q] = p;\n                    this._leaves[q] = !p.childNodes.length;\n                }\n            ;\n            ;\n            };\n        ;\n        },\n        getRoot: function() {\n            return this._root;\n        },\n        getNode: function(m) {\n            return this._nodes[m];\n        },\n        setNodeProperty: function(m, n, o) {\n            this.getNode(m)[n] = o;\n            return this;\n        },\n        setNodeContent: function(m, n) {\n            if (!this._leaves[m]) {\n                throw new Error(((\"Can't setContent on non-leaf node: \" + m)));\n            }\n        ;\n        ;\n            h.setContent(this.getNode(m), n);\n            return this;\n        }\n    });\n    e.exports = k;\n});");
// 1299
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"var bigPipe = new (require(\"BigPipe\"))({\n    lid: 0,\n    forceFinish: true\n});");
// 1300
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"se151abf45cd37f530e5c8a27b753d912bd1be56a");
// 1301
geval("var bigPipe = new (require(\"BigPipe\"))({\n    lid: 0,\n    forceFinish: true\n});");
// 1306
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"bigPipe.onPageletArrive({\n    id: \"first_response\",\n    phase: 0,\n    jsmods: {\n    },\n    is_last: true,\n    css: [\"W3Ky6\",\"0duP3\",\"vFtag\",\"ynBUm\",\"xqZGj\",\"yagwf\",],\n    bootloadable: {\n    },\n    resource_map: {\n    },\n    js: [\"AyUu6\",\"OJTM4\",\"AsDOA\",\"63VzN\",\"4vv8/\",\"u//Ut\",\"1XxM1\",\"5dFET\",\"hfrQl\",\"C6rJk\",]\n});");
// 1307
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"s2cd3254f0c5abebdb9368c757b9aac0b68651aec");
// 1308
geval("bigPipe.onPageletArrive({\n    id: \"first_response\",\n    phase: 0,\n    jsmods: {\n    },\n    is_last: true,\n    css: [\"W3Ky6\",\"0duP3\",\"vFtag\",\"ynBUm\",\"xqZGj\",\"yagwf\",],\n    bootloadable: {\n    },\n    resource_map: {\n    },\n    js: [\"AyUu6\",\"OJTM4\",\"AsDOA\",\"63VzN\",\"4vv8/\",\"u//Ut\",\"1XxM1\",\"5dFET\",\"hfrQl\",\"C6rJk\",]\n});");
// 1310
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"bigPipe.onPageletArrive({\n    content: {\n        pagelet_welcome_box: {\n            container_id: \"u_0_g\"\n        }\n    },\n    css: [\"0duP3\",\"W3Ky6\",],\n    bootloadable: {\n    },\n    resource_map: {\n    },\n    id: \"pagelet_welcome_box\",\n    phase: 1\n});");
// 1311
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"s54eafbda3546281aead0f8229f13dfd09bff1667");
// 1312
geval("bigPipe.onPageletArrive({\n    JSBNG__content: {\n        pagelet_welcome_box: {\n            container_id: \"u_0_g\"\n        }\n    },\n    css: [\"0duP3\",\"W3Ky6\",],\n    bootloadable: {\n    },\n    resource_map: {\n    },\n    id: \"pagelet_welcome_box\",\n    phase: 1\n});");
// 1314
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"bigPipe.onPageletArrive({\n    content: {\n        pagelet_navigation: {\n            container_id: \"u_0_h\"\n        }\n    },\n    css: [\"0duP3\",\"W3Ky6\",],\n    bootloadable: {\n        ExplicitHover: {\n            resources: [\"AyUu6\",\"aOO05\",],\n            \"module\": true\n        },\n        SortableSideNav: {\n            resources: [\"AyUu6\",\"AsDOA\",\"6tAwh\",\"C03uu\",],\n            \"module\": true\n        }\n    },\n    resource_map: {\n        \"6tAwh\": {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yV/r/OktjXMyrl5l.js\"\n        },\n        C03uu: {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yC/r/3fdQLPa9g1g.js\"\n        },\n        aOO05: {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yW/r/zpbGrZRQcFa.js\"\n        },\n        \"25/dt\": {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yA/r/SIc-uOFF4WA.js\"\n        }\n    },\n    js: [\"AsDOA\",\"AyUu6\",\"25/dt\",\"bUzfU\",\"OJTM4\",],\n    provides: [\"pagelet_controller::home_side_future_nav\",],\n    jscc_map: \"({\\\"j2L3vxmkOLJgIjBIGm0\\\":function(){return new FutureHomeSideNav();}})\",\n    onload: [\"JSCC.get(\\\"j2L3vxmkOLJgIjBIGm0\\\").init($(\\\"sideNav\\\"), \\\"nf\\\", false);\",],\n    id: \"pagelet_navigation\",\n    phase: 1\n});");
// 1315
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"s201631d8707391161a96b96e28e62848597fad5b");
// 1316
geval("bigPipe.onPageletArrive({\n    JSBNG__content: {\n        pagelet_navigation: {\n            container_id: \"u_0_h\"\n        }\n    },\n    css: [\"0duP3\",\"W3Ky6\",],\n    bootloadable: {\n        ExplicitHover: {\n            resources: [\"AyUu6\",\"aOO05\",],\n            \"module\": true\n        },\n        SortableSideNav: {\n            resources: [\"AyUu6\",\"AsDOA\",\"6tAwh\",\"C03uu\",],\n            \"module\": true\n        }\n    },\n    resource_map: {\n        \"6tAwh\": {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yV/r/OktjXMyrl5l.js\"\n        },\n        C03uu: {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yC/r/3fdQLPa9g1g.js\"\n        },\n        aOO05: {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yW/r/zpbGrZRQcFa.js\"\n        },\n        \"25/dt\": {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yA/r/SIc-uOFF4WA.js\"\n        }\n    },\n    js: [\"AsDOA\",\"AyUu6\",\"25/dt\",\"bUzfU\",\"OJTM4\",],\n    provides: [\"pagelet_controller::home_side_future_nav\",],\n    jscc_map: \"({\\\"j2L3vxmkOLJgIjBIGm0\\\":function(){return new FutureHomeSideNav();}})\",\n    JSBNG__onload: [\"JSCC.get(\\\"j2L3vxmkOLJgIjBIGm0\\\").init($(\\\"sideNav\\\"), \\\"nf\\\", false);\",],\n    id: \"pagelet_navigation\",\n    phase: 1\n});");
// 1318
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"bigPipe.onPageletArrive({\n    content: {\n        pagelet_welcome: {\n            container_id: \"u_0_i\"\n        }\n    },\n    jsmods: {\n        require: [[\"RequiredFormListener\",],]\n    },\n    css: [\"MJfap\",\"W3Ky6\",],\n    bootloadable: {\n    },\n    resource_map: {\n        fvNhh: {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y7/r/sghigcwX_l-.js\"\n        },\n        MJfap: {\n            type: \"css\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yf/r/XZQMfQsFeGz.css\"\n        }\n    },\n    js: [\"AyUu6\",\"fvNhh\",\"AsDOA\",],\n    id: \"pagelet_welcome\",\n    phase: 1\n});");
// 1319
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"s0c3636cdc8c3db982e465ab8779db6628513e061");
// 1320
geval("bigPipe.onPageletArrive({\n    JSBNG__content: {\n        pagelet_welcome: {\n            container_id: \"u_0_i\"\n        }\n    },\n    jsmods: {\n        require: [[\"RequiredFormListener\",],]\n    },\n    css: [\"MJfap\",\"W3Ky6\",],\n    bootloadable: {\n    },\n    resource_map: {\n        fvNhh: {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y7/r/sghigcwX_l-.js\"\n        },\n        MJfap: {\n            type: \"css\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yf/r/XZQMfQsFeGz.css\"\n        }\n    },\n    js: [\"AyUu6\",\"fvNhh\",\"AsDOA\",],\n    id: \"pagelet_welcome\",\n    phase: 1\n});");
// 1322
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"bigPipe.onPageletArrive({\n    append: \"pagelet_pinned_nav\",\n    display_dependency: [\"pagelet_navigation\",],\n    is_last: true,\n    content: {\n        pagelet_pinned_nav_lite: {\n            container_id: \"u_0_j\"\n        }\n    },\n    css: [\"W3Ky6\",\"0duP3\",],\n    bootloadable: {\n    },\n    resource_map: {\n    },\n    id: \"pagelet_pinned_nav_lite\",\n    phase: 1,\n    tti_phase: 1\n});");
// 1323
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"s20152e61529a72f6f352b12a997eadc605fa25b1");
// 1324
geval("bigPipe.onPageletArrive({\n    append: \"pagelet_pinned_nav\",\n    display_dependency: [\"pagelet_navigation\",],\n    is_last: true,\n    JSBNG__content: {\n        pagelet_pinned_nav_lite: {\n            container_id: \"u_0_j\"\n        }\n    },\n    css: [\"W3Ky6\",\"0duP3\",],\n    bootloadable: {\n    },\n    resource_map: {\n    },\n    id: \"pagelet_pinned_nav_lite\",\n    phase: 1,\n    tti_phase: 1\n});");
// 1326
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"bigPipe.onPageletArrive({\n    content: {\n        pagelet_sidebar: {\n            container_id: \"u_0_x\"\n        }\n    },\n    jsmods: {\n        require: [[\"ChatSidebar\",\"init\",[\"m_0_1d\",\"m_0_1e\",\"m_0_1f\",],[{\n            __m: \"m_0_1d\"\n        },{\n            __m: \"m_0_1e\"\n        },{\n            __m: \"m_0_1f\"\n        },[],],],[\"ChatSidebarLog\",\"start\",[],[],],[\"m_0_1g\",],[\"m_0_1i\",],[\"m_0_1f\",],[\"Typeahead\",\"init\",[\"m_0_1j\",\"m_0_1f\",],[{\n            __m: \"m_0_1j\"\n        },{\n            __m: \"m_0_1f\"\n        },[\"chatTypeahead\",\"buildBestAvailableNames\",\"showLoadingIndicator\",],null,],],[\"ClearableTypeahead\",\"resetOnCloseButtonClick\",[\"m_0_1f\",\"m_0_1l\",],[{\n            __m: \"m_0_1f\"\n        },{\n            __m: \"m_0_1l\"\n        },],],[\"m_0_1o\",],[\"SelectorDeprecated\",],[\"m_0_1p\",],[\"Layer\",\"init\",[\"m_0_1p\",\"m_0_1q\",],[{\n            __m: \"m_0_1p\"\n        },{\n            __m: \"m_0_1q\"\n        },],],[\"m_0_1e\",],[\"PresencePrivacy\",],],\n        instances: [[\"m_0_1i\",[\"ScrollableArea\",\"m_0_1h\",],[{\n            __m: \"m_0_1h\"\n        },{\n            persistent: true\n        },],1,],[\"m_0_1f\",[\"Typeahead\",\"m_0_1m\",\"ChatTypeaheadView\",\"ChatTypeaheadRenderer\",\"m_0_1j\",\"ChatTypeaheadCore\",\"m_0_1k\",],[{\n            __m: \"m_0_1m\"\n        },{\n            node_id: \"u_0_k\",\n            node: null,\n            ctor: {\n                __m: \"ChatTypeaheadView\"\n            },\n            options: {\n                autoSelect: true,\n                renderer: {\n                    __m: \"ChatTypeaheadRenderer\"\n                },\n                causalElement: {\n                    __m: \"m_0_1j\"\n                },\n                minWidth: 0,\n                alignment: \"left\",\n                showBadges: 1\n            }\n        },{\n            ctor: {\n                __m: \"ChatTypeaheadCore\"\n            },\n            options: {\n                keepFocused: false,\n                resetOnSelect: true,\n                setValueOnSelect: false\n            }\n        },{\n            __m: \"m_0_1k\"\n        },],7,],[\"m_0_1o\",[\"ChatSidebarDropdown\",\"m_0_1n\",],[{\n            __m: \"m_0_1n\"\n        },null,],1,],[\"m_0_1p\",[\"LegacyContextualDialog\",\"AccessibleLayer\",],[{\n            buildWrapper: false,\n            causalElement: null,\n            addedBehaviors: [{\n                __m: \"AccessibleLayer\"\n            },]\n        },],5,],[\"m_0_1e\",[\"ChatOrderedList\",\"m_0_1r\",\"m_0_1s\",\"m_0_1t\",\"m_0_1p\",],[true,{\n            __m: \"m_0_1r\"\n        },{\n            __m: \"m_0_1s\"\n        },{\n            __m: \"m_0_1t\"\n        },{\n            __m: \"m_0_1p\"\n        },null,],5,],[\"m_0_1g\",[\"LiveBarDark\",\"m_0_1e\",],[{\n            __m: \"m_0_1e\"\n        },[],[\"music\",\"canvas\",\"checkin\",\"travelling\",],],1,],[\"m_0_1m\",[\"ChatTypeaheadDataSource\",],[{\n            alwaysPrefixMatch: true,\n            showOfflineUsers: true\n        },],2,],[\"m_0_1s\",[\"XHPTemplate\",\"m_0_1u\",],[{\n            __m: \"m_0_1u\"\n        },],2,],[\"m_0_1t\",[\"XHPTemplate\",\"m_0_1v\",],[{\n            __m: \"m_0_1v\"\n        },],2,],[\"m_0_1w\",[\"XHPTemplate\",\"m_0_20\",],[{\n            __m: \"m_0_20\"\n        },],2,],[\"m_0_1x\",[\"XHPTemplate\",\"m_0_21\",],[{\n            __m: \"m_0_21\"\n        },],2,],[\"m_0_1y\",[\"XHPTemplate\",\"m_0_23\",],[{\n            __m: \"m_0_23\"\n        },],2,],[\"m_0_1z\",[\"XHPTemplate\",\"m_0_25\",],[{\n            __m: \"m_0_25\"\n        },],2,],],\n        define: [[\"ChatOptionsInitialData\",[],{\n            sound: 1,\n            browser_notif: 0,\n            sidebar_mode: true\n        },13,],[\"ChatSidebarCalloutData\",[],{\n            isShown: false\n        },14,],[\"ChannelImplementation\",[\"ChannelConnection\",],{\n            instance: {\n                __m: \"ChannelConnection\"\n            }\n        },150,],[\"ChannelInitialData\",[],{\n            channelConfig: {\n                IFRAME_LOAD_TIMEOUT: 30000,\n                P_TIMEOUT: 30000,\n                STREAMING_TIMEOUT: 70000,\n                PROBE_HEARTBEATS_INTERVAL_LOW: 1000,\n                PROBE_HEARTBEATS_INTERVAL_HIGH: 3000,\n                user_channel: \"p_100006118350059\",\n                seq: -1,\n                retry_interval: 0,\n                max_conn: 6,\n                forceIframe: false,\n                streamProbe: false,\n                tryStreaming: true,\n                bustIframe: false,\n                webrtcSupport: false\n            },\n            reason: 6,\n            state: \"reconnect!\"\n        },143,],[\"MercuryConstants\",[\"MercuryAttachmentType\",\"MercuryPayloadSource\",\"MercuryParticipantTypes\",\"MercuryAttachmentContentType\",\"MercuryThreadlistConstants\",\"MessagingConfig\",\"MercuryTimePassed\",\"MercurySourceType\",\"MessagingEvent\",\"MercuryLogMessageType\",\"MercuryThreadMode\",\"MercuryMessageSourceTags\",\"MercuryActionStatus\",\"MercuryActionTypeConstants\",\"MercuryErrorType\",\"MercuryParticipantsConstants\",\"MessagingTag\",\"MercuryGlobalActionType\",\"MercuryGenericConstants\",\"MercuryAPIArgsSource\",],{\n            MercuryAttachmentType: {\n                __m: \"MercuryAttachmentType\"\n            },\n            VideoChatConstants: {\n                START_SESSION: 1,\n                GET_SKYPE_TOKEN: 2,\n                AWAITING_CALL: 3,\n                CANCELLED_CALL: 4,\n                CONNECTED_CALL: 5,\n                HANDLED_CALL: 6,\n                GOT_START_SESSION: 7,\n                INSTALLING: 8,\n                INSTALLED: 9,\n                INSTALL_CANCELED: 10,\n                ASSOC_CONNECTED_CALL: 118224944915447,\n                ASSOC_VIEWED_CALL_PROMO: 250568041676842,\n                MAX_VC_PROMO_VIEWS: 2,\n                MINIMUM_VC_PROMO_VIEW_INTERVAL: 5184000,\n                MINIMUM_VC_LAST_CALLED_INTERVAL: 5184000\n            },\n            MercuryAttachmentAudioClip: \"fb_voice_message\",\n            MercuryAppIDs: {\n                DESKTOP_NOTIFIER: 220764691281998,\n                DESKTOP_SOCIALFOX: 276729612446445\n            },\n            MercuryPayloadSource: {\n                __m: \"MercuryPayloadSource\"\n            },\n            AttachmentMaxSize: 26214400,\n            MercuryParticipantTypes: {\n                __m: \"MercuryParticipantTypes\"\n            },\n            MercuryTypeaheadConstants: {\n                COMPOSER_FRIENDS_MAX: 4,\n                COMPOSER_NON_FRIENDS_MAX: 2,\n                COMPOSER_SHOW_MORE_LIMIT: 4,\n                COMPOSER_THREADS_INITIAL_LIMIT: 2,\n                USER_TYPE: \"user\",\n                PAGE_TYPE: \"page\",\n                THREAD_TYPE: \"thread\",\n                HEADER_TYPE: \"header\",\n                FRIEND_TYPE: \"friend\",\n                NON_FRIEND_TYPE: \"non_friend\",\n                VALID_EMAIL: \"^([A-Z0-9._%+-]+@((?!facebook\\\\.com))[A-Z0-9.-]+\\\\.[A-Z]{2,4}|(([A-Z._%+-]+[A-Z0-9._%+-]*)|([A-Z0-9._%+-]+[A-Z._%+-]+[A-Z0-9._%+-]*))@(?:facebook\\\\.com))$\"\n            },\n            MercuryAttachmentContentType: {\n                __m: \"MercuryAttachmentContentType\"\n            },\n            MercurySendMessageTimeout: 45000,\n            ChatNotificationConstants: {\n                NORMAL: 0,\n                NO_USER_MESSAGE_NOTIFICATION: 1\n            },\n            MercuryThreadlistConstants: {\n                __m: \"MercuryThreadlistConstants\"\n            },\n            MessagingConfig: {\n                __m: \"MessagingConfig\"\n            },\n            MercuryTimePassed: {\n                __m: \"MercuryTimePassed\"\n            },\n            MercurySourceType: {\n                __m: \"MercurySourceType\"\n            },\n            MessagingEventTypes: {\n                __m: \"MessagingEvent\"\n            },\n            MessagingFilteringType: {\n                LEGACY: \"legacy\",\n                MODERATE: \"moderate\",\n                STRICT: \"strict\"\n            },\n            MercurySupportedShareType: {\n                FB_PHOTO: 2,\n                FB_ALBUM: 3,\n                FB_VIDEO: 11,\n                FB_SONG: 28,\n                FB_MUSIC_ALBUM: 30,\n                FB_PLAYLIST: 31,\n                FB_MUSICIAN: 35,\n                FB_RADIO_STATION: 33,\n                EXTERNAL: 100,\n                FB_TEMPLATE: 300,\n                FB_SOCIAL_REPORT_PHOTO: 48,\n                FB_COUPON: 32,\n                FB_SHARE: 99,\n                FB_HC_QUESTION: 55,\n                FB_HC_ANSWER: 56\n            },\n            Sandbox: {\n                ORIGIN: \"http://jsbngssl.fbstatic-a.akamaihd.net\",\n                PAGE_URL: \"http://jsbngssl.fbstatic-a.akamaihd.net/fbsbx/fbsbx.php?1\"\n            },\n            MercuryLogMessageType: {\n                __m: \"MercuryLogMessageType\"\n            },\n            MercuryThreadMode: {\n                __m: \"MercuryThreadMode\"\n            },\n            MercuryMessageSourceTags: {\n                __m: \"MercuryMessageSourceTags\"\n            },\n            MercuryActionStatus: {\n                __m: \"MercuryActionStatus\"\n            },\n            MercuryActionType: {\n                __m: \"MercuryActionTypeConstants\"\n            },\n            UIPushPhase: \"V3\",\n            MercuryErrorType: {\n                __m: \"MercuryErrorType\"\n            },\n            MercuryParticipantsConstants: {\n                __m: \"MercuryParticipantsConstants\"\n            },\n            MessagingTag: {\n                __m: \"MessagingTag\"\n            },\n            MercuryGlobalActionType: {\n                __m: \"MercuryGlobalActionType\"\n            },\n            MercuryGenericConstants: {\n                __m: \"MercuryGenericConstants\"\n            },\n            MercuryAPIArgsSource: {\n                __m: \"MercuryAPIArgsSource\"\n            }\n        },36,],[\"PresenceInitialData\",[],{\n            serverTime: \"1373490144000\",\n            cookiePollInterval: 500,\n            cookieVersion: 2,\n            dictEncode: true\n        },57,],[\"InitialChatFriendsList\",[],{\n            list: []\n        },26,],[\"BlackbirdUpsellConfig\",[],{\n            EducationTimeOfflineThresdhold: 5184000,\n            UpsellImpressions: 0,\n            UpsellGK: false,\n            UpsellImpressionLimit: 3,\n            TimeOffline: 0,\n            UpsellMinFriendCount: 50,\n            FriendCount: 0,\n            EducationDismissed: 0,\n            EducationGK: 1,\n            UpsellDismissed: 0,\n            EducationImpressionLimit: 2,\n            EducationImpressions: 0\n        },8,],[\"InitialMultichatList\",[],{\n        },132,],[\"BlackbirdUpsellTemplates\",[\"m_0_1w\",\"m_0_1x\",\"m_0_1y\",\"m_0_1z\",],{\n            \":fb:chat:blackbird:dialog-frame\": {\n                __m: \"m_0_1w\"\n            },\n            \":fb:chat:blackbird:offline-educate\": {\n                __m: \"m_0_1x\"\n            },\n            \":fb:chat:blackbird:most-friends-educate\": {\n                __m: \"m_0_1y\"\n            },\n            \":fb:chat:blackbird:some-friends-educate\": {\n                __m: \"m_0_1z\"\n            }\n        },10,],[\"ChatConfigInitialData\",[],{\n            warning_countdown_threshold_msec: 15000,\n            \"24h_times\": false,\n            livebar_fetch_defer: 1000,\n            \"video.collision_connect\": 1,\n            \"ordered_list.top_mobile\": 5,\n            mute_warning_time_msec: 25000,\n            \"blackbird.min_for_clear_button\": 10,\n            chat_multi_typ_send: 1,\n            web_messenger_suppress_tab_unread: 1,\n            \"ordered_list.top_friends\": 0,\n            chat_impression_logging_with_click: true,\n            channel_manual_reconnect_defer_msec: 2000,\n            \"sidebar.minimum_width\": 1225,\n            \"sound.notif_ogg_url\": \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/yT/r/q-Drar4Ade6.ogg\",\n            idle_limit: 1800000,\n            \"sidebar.min_friends\": 7,\n            \"sound.notif_mp3_url\": \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/yb/r/VBbzpp2k5li.mp3\",\n            idle_poll_interval: 300000,\n            activity_limit: 60000,\n            \"sound.ringtone_mp3_url\": \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/yq/r/Mpd0-fRgh5n.mp3\",\n            \"roger.seen_delay\": 15000,\n            tab_max_load_age: 86400000,\n            typing_notifications: true,\n            show_sticker_nux: true,\n            chat_web_ranking_with_presence: 1,\n            chat_ranked_by_coefficient: 1,\n            \"video.skype_client_log\": 1,\n            \"periodical_impression_logging_config.interval\": 1800000,\n            chat_tab_title_link_timeline: 1,\n            max_sidebar_multichats: 3,\n            tab_auto_close_timeout: 86400000,\n            chat_impression_logging_periodical: true,\n            divebar_has_new_groups_button: true,\n            sound_enabled: true,\n            \"sound.ringtone_ogg_url\": \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/y3/r/mbcn6dBHIeX.ogg\",\n            sidebar_ticker: 1\n        },12,],[\"AvailableListInitialData\",[],{\n            chatNotif: 0,\n            pollInterval: 100000,\n            availableList: {\n            },\n            lazyPollInterval: 300000,\n            favoriteList: [],\n            mobileFriends: null,\n            lazyThreshold: 300000,\n            availableCount: 0,\n            lastActiveTimes: null,\n            updateTime: 1373490144000\n        },166,],],\n        elements: [[\"m_0_1d\",\"u_0_l\",2,],[\"m_0_1h\",\"u_0_m\",2,],[\"m_0_1k\",\"u_0_n\",2,],[\"m_0_1l\",\"u_0_o\",2,],[\"m_0_1j\",\"u_0_p\",4,],[\"m_0_1n\",\"u_0_q\",2,],[\"m_0_1r\",\"u_0_s\",2,],[\"m_0_22\",\"u_0_u\",2,\"m_0_21\",],[\"m_0_24\",\"u_0_v\",2,\"m_0_23\",],[\"m_0_26\",\"u_0_w\",2,\"m_0_25\",],],\n        markup: [[\"m_0_1q\",{\n            __html: \"\\u003Cdiv class=\\\"uiContextualDialogPositioner\\\" id=\\\"u_0_r\\\" data-position=\\\"left\\\"\\u003E\\u003Cdiv class=\\\"uiOverlay uiContextualDialog\\\" data-width=\\\"300\\\" data-destroyonhide=\\\"false\\\" data-fadeonhide=\\\"false\\\"\\u003E\\u003Cdiv class=\\\"uiOverlayContent\\\"\\u003E\\u003Cdiv class=\\\"uiContextualDialogContent\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_1u\",{\n            __html: \"\\u003Cli class=\\\"_42fz\\\"\\u003E\\u003Ca class=\\\"clearfix _50zw\\\" data-jsid=\\\"anchor\\\" href=\\\"#\\\" role=\\\"\\\" rel=\\\"ignore\\\"\\u003E\\u003Cdiv class=\\\"_54sk _42g2\\\" data-jsid=\\\"favorite_button\\\"\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"pic_container\\\"\\u003E\\u003Cimg class=\\\"pic img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y4/r/-PAXP-deijE.gif\\\" data-jsid=\\\"profile-photo\\\" alt=\\\"\\\" width=\\\"1\\\" height=\\\"1\\\" /\\u003E\\u003C/div\\u003E\\u003Cimg class=\\\"_54sp _42i1 img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yW/r/F7kk7-cjEKk.png\\\" alt=\\\"\\\" width=\\\"10\\\" height=\\\"8\\\" /\\u003E\\u003Cdiv class=\\\"clearfix\\\"\\u003E\\u003Cdiv class=\\\"rfloat\\\"\\u003E\\u003Cspan data-jsid=\\\"accessible-name\\\" class=\\\"accessible_elem\\\"\\u003E\\u003C/span\\u003E\\u003Cdiv class=\\\"icon_container\\\"\\u003E\\u003Cimg class=\\\"_d3c icon img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y4/r/-PAXP-deijE.gif\\\" alt=\\\"\\\" width=\\\"1\\\" height=\\\"1\\\" /\\u003E\\u003Cdiv class=\\\"active_time icon\\\"\\u003E\\u003C/div\\u003E\\u003Cimg class=\\\"status icon img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y4/r/-PAXP-deijE.gif\\\" alt=\\\"\\\" width=\\\"1\\\" height=\\\"1\\\" /\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv aria-hidden=\\\"true\\\"\\u003E\\u003Cdiv class=\\\"_52zl\\\" data-jsid=\\\"name\\\"\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"_52zk\\\" data-jsid=\\\"context\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/a\\u003E\\u003C/li\\u003E\"\n        },2,],[\"m_0_1v\",{\n            __html: \"\\u003Cli\\u003E\\u003Cdiv class=\\\"phs fcg\\\"\\u003E\\u003Cspan data-jsid=\\\"message\\\"\\u003ELoading...\\u003C/span\\u003E\\u003C/div\\u003E\\u003C/li\\u003E\"\n        },2,],[\"m_0_20\",{\n            __html: \"\\u003Cdiv class=\\\"pam _362\\\"\\u003E\\u003Cdiv class=\\\"clearfix\\\"\\u003E\\u003Ci class=\\\"_8o _8r lfloat img sp_9kaae3 sx_ee64a9\\\"\\u003E\\u003C/i\\u003E\\u003Cdiv class=\\\"clearfix _8u _42ef\\\"\\u003E\\u003Clabel class=\\\"rfloat uiCloseButton uiCloseButtonSmall\\\" for=\\\"u_0_t\\\"\\u003E\\u003Cinput title=\\\"Remove\\\" type=\\\"button\\\" data-jsid=\\\"dialogCloseButton\\\" id=\\\"u_0_t\\\" /\\u003E\\u003C/label\\u003E\\u003Cdiv class=\\\"prs\\\" data-jsid=\\\"dialogContent\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_21\",{\n            __html: \"\\u003Cform method=\\\"post\\\" action=\\\"/ajax/chat/blackbird/learn_more.php?source=offline&amp;promo_source=educate\\\" onsubmit=\\\"return window.Event &amp;&amp; Event.__inlineSubmit &amp;&amp; Event.__inlineSubmit(this,event)\\\" id=\\\"u_0_u\\\"\\u003E\\u003Cinput type=\\\"hidden\\\" name=\\\"fb_dtsg\\\" value=\\\"AQCttlPQ\\\" autocomplete=\\\"off\\\" /\\u003E\\u003Cstrong\\u003ETip:\\u003C/strong\\u003E You can turn on chat for just a few friends. \\u003Clabel class=\\\"uiLinkButton\\\"\\u003E\\u003Cinput type=\\\"submit\\\" value=\\\"Learn more\\\" /\\u003E\\u003C/label\\u003E.\\u003Cdiv class=\\\"_361\\\"\\u003E\\u003Ca class=\\\"mvm _363 uiButton uiButtonConfirm\\\" href=\\\"#\\\" role=\\\"button\\\" ajaxify=\\\"/ajax/chat/privacy/settings_dialog.php\\\" rel=\\\"dialog\\\" data-jsid=\\\"chatSettingsButton\\\"\\u003E\\u003Cspan class=\\\"uiButtonText\\\"\\u003EEdit Chat Settings\\u003C/span\\u003E\\u003C/a\\u003E\\u003C/div\\u003E\\u003C/form\\u003E\"\n        },3,],[\"m_0_23\",{\n            __html: \"\\u003Cform method=\\\"post\\\" action=\\\"/ajax/chat/blackbird/learn_more.php?source=blackbird\\\" onsubmit=\\\"return window.Event &amp;&amp; Event.__inlineSubmit &amp;&amp; Event.__inlineSubmit(this,event)\\\" id=\\\"u_0_v\\\"\\u003E\\u003Cinput type=\\\"hidden\\\" name=\\\"fb_dtsg\\\" value=\\\"AQCttlPQ\\\" autocomplete=\\\"off\\\" /\\u003E\\u003Cstrong\\u003ETip:\\u003C/strong\\u003E While you have chat turned off for some friends, their messages go to your inbox. \\u003Clabel class=\\\"uiLinkButton\\\"\\u003E\\u003Cinput type=\\\"submit\\\" value=\\\"Learn more\\\" /\\u003E\\u003C/label\\u003E.\\u003C/form\\u003E\"\n        },3,],[\"m_0_25\",{\n            __html: \"\\u003Cform method=\\\"post\\\" action=\\\"/ajax/chat/blackbird/learn_more.php?source=blackbird\\\" onsubmit=\\\"return window.Event &amp;&amp; Event.__inlineSubmit &amp;&amp; Event.__inlineSubmit(this,event)\\\" id=\\\"u_0_w\\\"\\u003E\\u003Cinput type=\\\"hidden\\\" name=\\\"fb_dtsg\\\" value=\\\"AQCttlPQ\\\" autocomplete=\\\"off\\\" /\\u003E\\u003Cstrong\\u003ETip:\\u003C/strong\\u003E When chat is off, messages from friends go to your inbox for you to read later. \\u003Clabel class=\\\"uiLinkButton\\\"\\u003E\\u003Cinput type=\\\"submit\\\" value=\\\"Learn more\\\" /\\u003E\\u003C/label\\u003E.\\u003C/form\\u003E\"\n        },3,],]\n    },\n    css: [\"W3Ky6\",\"cy4a0\",\"0duP3\",],\n    bootloadable: {\n        SortableGroup: {\n            resources: [\"AyUu6\",\"6tAwh\",\"AsDOA\",],\n            \"module\": true\n        },\n        LitestandSidebarBookmarksDisplay: {\n            resources: [\"AyUu6\",\"W3Ky6\",\"b7cJk\",],\n            \"module\": true\n        },\n        LitestandSidebar: {\n            resources: [\"AyUu6\",\"fvNhh\",\"u//Ut\",\"AsDOA\",\"W3Ky6\",],\n            \"module\": true\n        },\n        DOMScroll: {\n            resources: [\"AyUu6\",\"AsDOA\",],\n            \"module\": true\n        }\n    },\n    resource_map: {\n        \"H+v1W\": {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yl/r/OUIW4Mbs_w6.js\"\n        },\n        b7cJk: {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yP/r/lI2QSIxa0G3.js\"\n        }\n    },\n    ixData: {\n        \"/images/chat/sidebar/newGroupChatLitestand.png\": {\n            sprited: false,\n            uri: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yk/r/3hu9Ow1TVfb.png\",\n            width: 28,\n            height: 28\n        },\n        \"/images/litestand/sidebar/blended/new_group_chat.png\": {\n            sprited: false,\n            uri: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yg/r/I5ybuQbRjJE.png\",\n            width: 32,\n            height: 32\n        },\n        \"/images/chat/status/online.png\": {\n            sprited: true,\n            spriteMapCssClass: \"sp_9kaae3\",\n            spriteCssClass: \"sx_1dc182\"\n        },\n        \"/images/litestand/bookmarks/sidebar/remove.png\": {\n            sprited: true,\n            spriteMapCssClass: \"sp_9kaae3\",\n            spriteCssClass: \"sx_76e896\"\n        },\n        \"/images/litestand/sidebar/blended/online.png\": {\n            sprited: true,\n            spriteMapCssClass: \"sp_9kaae3\",\n            spriteCssClass: \"sx_6ae2b7\"\n        },\n        \"/images/litestand/sidebar/blended/pushable.png\": {\n            sprited: true,\n            spriteMapCssClass: \"sp_9kaae3\",\n            spriteCssClass: \"sx_a69036\"\n        },\n        \"/images/litestand/bookmarks/sidebar/add.png\": {\n            sprited: true,\n            spriteMapCssClass: \"sp_9kaae3\",\n            spriteCssClass: \"sx_f57d5d\"\n        },\n        \"/images/litestand/sidebar/pushable.png\": {\n            sprited: true,\n            spriteMapCssClass: \"sp_9kaae3\",\n            spriteCssClass: \"sx_0b17f3\"\n        },\n        \"/images/litestand/sidebar/online.png\": {\n            sprited: true,\n            spriteMapCssClass: \"sp_9kaae3\",\n            spriteCssClass: \"sx_6b87d3\"\n        },\n        \"/images/chat/add.png\": {\n            sprited: true,\n            spriteMapCssClass: \"sp_9kaae3\",\n            spriteCssClass: \"sx_daa3c5\"\n        },\n        \"/images/chat/status/mobile.png\": {\n            sprited: true,\n            spriteMapCssClass: \"sp_9kaae3\",\n            spriteCssClass: \"sx_6633b3\"\n        },\n        \"/images/chat/sidebar/newGroupChat.png\": {\n            sprited: false,\n            uri: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/ys/r/S824hxiYJSG.png\",\n            width: 28,\n            height: 28\n        },\n        \"/images/chat/delete.png\": {\n            sprited: true,\n            spriteMapCssClass: \"sp_9kaae3\",\n            spriteCssClass: \"sx_1bb86f\"\n        }\n    },\n    js: [\"AyUu6\",\"AsDOA\",\"OJTM4\",\"u//Ut\",\"EzMPG\",\"brbS1\",\"H+v1W\",],\n    id: \"pagelet_sidebar\",\n    phase: 2\n});");
// 1327
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"s47467a92b28545709cf1d06718377123def554be");
// 1328
geval("bigPipe.onPageletArrive({\n    JSBNG__content: {\n        pagelet_sidebar: {\n            container_id: \"u_0_x\"\n        }\n    },\n    jsmods: {\n        require: [[\"ChatSidebar\",\"init\",[\"m_0_1d\",\"m_0_1e\",\"m_0_1f\",],[{\n            __m: \"m_0_1d\"\n        },{\n            __m: \"m_0_1e\"\n        },{\n            __m: \"m_0_1f\"\n        },[],],],[\"ChatSidebarLog\",\"start\",[],[],],[\"m_0_1g\",],[\"m_0_1i\",],[\"m_0_1f\",],[\"Typeahead\",\"init\",[\"m_0_1j\",\"m_0_1f\",],[{\n            __m: \"m_0_1j\"\n        },{\n            __m: \"m_0_1f\"\n        },[\"chatTypeahead\",\"buildBestAvailableNames\",\"showLoadingIndicator\",],null,],],[\"ClearableTypeahead\",\"resetOnCloseButtonClick\",[\"m_0_1f\",\"m_0_1l\",],[{\n            __m: \"m_0_1f\"\n        },{\n            __m: \"m_0_1l\"\n        },],],[\"m_0_1o\",],[\"SelectorDeprecated\",],[\"m_0_1p\",],[\"Layer\",\"init\",[\"m_0_1p\",\"m_0_1q\",],[{\n            __m: \"m_0_1p\"\n        },{\n            __m: \"m_0_1q\"\n        },],],[\"m_0_1e\",],[\"PresencePrivacy\",],],\n        instances: [[\"m_0_1i\",[\"ScrollableArea\",\"m_0_1h\",],[{\n            __m: \"m_0_1h\"\n        },{\n            persistent: true\n        },],1,],[\"m_0_1f\",[\"Typeahead\",\"m_0_1m\",\"ChatTypeaheadView\",\"ChatTypeaheadRenderer\",\"m_0_1j\",\"ChatTypeaheadCore\",\"m_0_1k\",],[{\n            __m: \"m_0_1m\"\n        },{\n            node_id: \"u_0_k\",\n            node: null,\n            ctor: {\n                __m: \"ChatTypeaheadView\"\n            },\n            options: {\n                autoSelect: true,\n                renderer: {\n                    __m: \"ChatTypeaheadRenderer\"\n                },\n                causalElement: {\n                    __m: \"m_0_1j\"\n                },\n                minWidth: 0,\n                alignment: \"left\",\n                showBadges: 1\n            }\n        },{\n            ctor: {\n                __m: \"ChatTypeaheadCore\"\n            },\n            options: {\n                keepFocused: false,\n                resetOnSelect: true,\n                setValueOnSelect: false\n            }\n        },{\n            __m: \"m_0_1k\"\n        },],7,],[\"m_0_1o\",[\"ChatSidebarDropdown\",\"m_0_1n\",],[{\n            __m: \"m_0_1n\"\n        },null,],1,],[\"m_0_1p\",[\"LegacyContextualDialog\",\"AccessibleLayer\",],[{\n            buildWrapper: false,\n            causalElement: null,\n            addedBehaviors: [{\n                __m: \"AccessibleLayer\"\n            },]\n        },],5,],[\"m_0_1e\",[\"ChatOrderedList\",\"m_0_1r\",\"m_0_1s\",\"m_0_1t\",\"m_0_1p\",],[true,{\n            __m: \"m_0_1r\"\n        },{\n            __m: \"m_0_1s\"\n        },{\n            __m: \"m_0_1t\"\n        },{\n            __m: \"m_0_1p\"\n        },null,],5,],[\"m_0_1g\",[\"LiveBarDark\",\"m_0_1e\",],[{\n            __m: \"m_0_1e\"\n        },[],[\"music\",\"canvas\",\"checkin\",\"travelling\",],],1,],[\"m_0_1m\",[\"ChatTypeaheadDataSource\",],[{\n            alwaysPrefixMatch: true,\n            showOfflineUsers: true\n        },],2,],[\"m_0_1s\",[\"XHPTemplate\",\"m_0_1u\",],[{\n            __m: \"m_0_1u\"\n        },],2,],[\"m_0_1t\",[\"XHPTemplate\",\"m_0_1v\",],[{\n            __m: \"m_0_1v\"\n        },],2,],[\"m_0_1w\",[\"XHPTemplate\",\"m_0_20\",],[{\n            __m: \"m_0_20\"\n        },],2,],[\"m_0_1x\",[\"XHPTemplate\",\"m_0_21\",],[{\n            __m: \"m_0_21\"\n        },],2,],[\"m_0_1y\",[\"XHPTemplate\",\"m_0_23\",],[{\n            __m: \"m_0_23\"\n        },],2,],[\"m_0_1z\",[\"XHPTemplate\",\"m_0_25\",],[{\n            __m: \"m_0_25\"\n        },],2,],],\n        define: [[\"ChatOptionsInitialData\",[],{\n            sound: 1,\n            browser_notif: 0,\n            sidebar_mode: true\n        },13,],[\"ChatSidebarCalloutData\",[],{\n            isShown: false\n        },14,],[\"ChannelImplementation\",[\"ChannelConnection\",],{\n            instance: {\n                __m: \"ChannelConnection\"\n            }\n        },150,],[\"ChannelInitialData\",[],{\n            channelConfig: {\n                IFRAME_LOAD_TIMEOUT: 30000,\n                P_TIMEOUT: 30000,\n                STREAMING_TIMEOUT: 70000,\n                PROBE_HEARTBEATS_INTERVAL_LOW: 1000,\n                PROBE_HEARTBEATS_INTERVAL_HIGH: 3000,\n                user_channel: \"p_100006118350059\",\n                seq: -1,\n                retry_interval: 0,\n                max_conn: 6,\n                forceIframe: false,\n                streamProbe: false,\n                tryStreaming: true,\n                bustIframe: false,\n                webrtcSupport: false\n            },\n            reason: 6,\n            state: \"reconnect!\"\n        },143,],[\"MercuryConstants\",[\"MercuryAttachmentType\",\"MercuryPayloadSource\",\"MercuryParticipantTypes\",\"MercuryAttachmentContentType\",\"MercuryThreadlistConstants\",\"MessagingConfig\",\"MercuryTimePassed\",\"MercurySourceType\",\"MessagingEvent\",\"MercuryLogMessageType\",\"MercuryThreadMode\",\"MercuryMessageSourceTags\",\"MercuryActionStatus\",\"MercuryActionTypeConstants\",\"MercuryErrorType\",\"MercuryParticipantsConstants\",\"MessagingTag\",\"MercuryGlobalActionType\",\"MercuryGenericConstants\",\"MercuryAPIArgsSource\",],{\n            MercuryAttachmentType: {\n                __m: \"MercuryAttachmentType\"\n            },\n            VideoChatConstants: {\n                START_SESSION: 1,\n                GET_SKYPE_TOKEN: 2,\n                AWAITING_CALL: 3,\n                CANCELLED_CALL: 4,\n                CONNECTED_CALL: 5,\n                HANDLED_CALL: 6,\n                GOT_START_SESSION: 7,\n                INSTALLING: 8,\n                INSTALLED: 9,\n                INSTALL_CANCELED: 10,\n                ASSOC_CONNECTED_CALL: 118224944915447,\n                ASSOC_VIEWED_CALL_PROMO: 250568041676842,\n                MAX_VC_PROMO_VIEWS: 2,\n                MINIMUM_VC_PROMO_VIEW_INTERVAL: 5184000,\n                MINIMUM_VC_LAST_CALLED_INTERVAL: 5184000\n            },\n            MercuryAttachmentAudioClip: \"fb_voice_message\",\n            MercuryAppIDs: {\n                DESKTOP_NOTIFIER: 220764691281998,\n                DESKTOP_SOCIALFOX: 276729612446445\n            },\n            MercuryPayloadSource: {\n                __m: \"MercuryPayloadSource\"\n            },\n            AttachmentMaxSize: 26214400,\n            MercuryParticipantTypes: {\n                __m: \"MercuryParticipantTypes\"\n            },\n            MercuryTypeaheadConstants: {\n                COMPOSER_FRIENDS_MAX: 4,\n                COMPOSER_NON_FRIENDS_MAX: 2,\n                COMPOSER_SHOW_MORE_LIMIT: 4,\n                COMPOSER_THREADS_INITIAL_LIMIT: 2,\n                USER_TYPE: \"user\",\n                PAGE_TYPE: \"page\",\n                THREAD_TYPE: \"thread\",\n                HEADER_TYPE: \"header\",\n                FRIEND_TYPE: \"friend\",\n                NON_FRIEND_TYPE: \"non_friend\",\n                VALID_EMAIL: \"^([A-Z0-9._%+-]+@((?!facebook\\\\.com))[A-Z0-9.-]+\\\\.[A-Z]{2,4}|(([A-Z._%+-]+[A-Z0-9._%+-]*)|([A-Z0-9._%+-]+[A-Z._%+-]+[A-Z0-9._%+-]*))@(?:facebook\\\\.com))$\"\n            },\n            MercuryAttachmentContentType: {\n                __m: \"MercuryAttachmentContentType\"\n            },\n            MercurySendMessageTimeout: 45000,\n            ChatNotificationConstants: {\n                NORMAL: 0,\n                NO_USER_MESSAGE_NOTIFICATION: 1\n            },\n            MercuryThreadlistConstants: {\n                __m: \"MercuryThreadlistConstants\"\n            },\n            MessagingConfig: {\n                __m: \"MessagingConfig\"\n            },\n            MercuryTimePassed: {\n                __m: \"MercuryTimePassed\"\n            },\n            MercurySourceType: {\n                __m: \"MercurySourceType\"\n            },\n            MessagingEventTypes: {\n                __m: \"MessagingEvent\"\n            },\n            MessagingFilteringType: {\n                LEGACY: \"legacy\",\n                MODERATE: \"moderate\",\n                STRICT: \"strict\"\n            },\n            MercurySupportedShareType: {\n                FB_PHOTO: 2,\n                FB_ALBUM: 3,\n                FB_VIDEO: 11,\n                FB_SONG: 28,\n                FB_MUSIC_ALBUM: 30,\n                FB_PLAYLIST: 31,\n                FB_MUSICIAN: 35,\n                FB_RADIO_STATION: 33,\n                EXTERNAL: 100,\n                FB_TEMPLATE: 300,\n                FB_SOCIAL_REPORT_PHOTO: 48,\n                FB_COUPON: 32,\n                FB_SHARE: 99,\n                FB_HC_QUESTION: 55,\n                FB_HC_ANSWER: 56\n            },\n            Sandbox: {\n                ORIGIN: \"http://jsbngssl.fbstatic-a.akamaihd.net\",\n                PAGE_URL: \"http://jsbngssl.fbstatic-a.akamaihd.net/fbsbx/fbsbx.php?1\"\n            },\n            MercuryLogMessageType: {\n                __m: \"MercuryLogMessageType\"\n            },\n            MercuryThreadMode: {\n                __m: \"MercuryThreadMode\"\n            },\n            MercuryMessageSourceTags: {\n                __m: \"MercuryMessageSourceTags\"\n            },\n            MercuryActionStatus: {\n                __m: \"MercuryActionStatus\"\n            },\n            MercuryActionType: {\n                __m: \"MercuryActionTypeConstants\"\n            },\n            UIPushPhase: \"V3\",\n            MercuryErrorType: {\n                __m: \"MercuryErrorType\"\n            },\n            MercuryParticipantsConstants: {\n                __m: \"MercuryParticipantsConstants\"\n            },\n            MessagingTag: {\n                __m: \"MessagingTag\"\n            },\n            MercuryGlobalActionType: {\n                __m: \"MercuryGlobalActionType\"\n            },\n            MercuryGenericConstants: {\n                __m: \"MercuryGenericConstants\"\n            },\n            MercuryAPIArgsSource: {\n                __m: \"MercuryAPIArgsSource\"\n            }\n        },36,],[\"PresenceInitialData\",[],{\n            serverTime: \"1373490144000\",\n            cookiePollInterval: 500,\n            cookieVersion: 2,\n            dictEncode: true\n        },57,],[\"InitialChatFriendsList\",[],{\n            list: []\n        },26,],[\"BlackbirdUpsellConfig\",[],{\n            EducationTimeOfflineThresdhold: 5184000,\n            UpsellImpressions: 0,\n            UpsellGK: false,\n            UpsellImpressionLimit: 3,\n            TimeOffline: 0,\n            UpsellMinFriendCount: 50,\n            FriendCount: 0,\n            EducationDismissed: 0,\n            EducationGK: 1,\n            UpsellDismissed: 0,\n            EducationImpressionLimit: 2,\n            EducationImpressions: 0\n        },8,],[\"InitialMultichatList\",[],{\n        },132,],[\"BlackbirdUpsellTemplates\",[\"m_0_1w\",\"m_0_1x\",\"m_0_1y\",\"m_0_1z\",],{\n            \":fb:chat:blackbird:dialog-frame\": {\n                __m: \"m_0_1w\"\n            },\n            \":fb:chat:blackbird:offline-educate\": {\n                __m: \"m_0_1x\"\n            },\n            \":fb:chat:blackbird:most-friends-educate\": {\n                __m: \"m_0_1y\"\n            },\n            \":fb:chat:blackbird:some-friends-educate\": {\n                __m: \"m_0_1z\"\n            }\n        },10,],[\"ChatConfigInitialData\",[],{\n            warning_countdown_threshold_msec: 15000,\n            \"24h_times\": false,\n            livebar_fetch_defer: 1000,\n            \"video.collision_connect\": 1,\n            \"ordered_list.top_mobile\": 5,\n            mute_warning_time_msec: 25000,\n            \"blackbird.min_for_clear_button\": 10,\n            chat_multi_typ_send: 1,\n            web_messenger_suppress_tab_unread: 1,\n            \"ordered_list.top_friends\": 0,\n            chat_impression_logging_with_click: true,\n            channel_manual_reconnect_defer_msec: 2000,\n            \"sidebar.minimum_width\": 1225,\n            \"sound.notif_ogg_url\": \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/yT/r/q-Drar4Ade6.ogg\",\n            idle_limit: 1800000,\n            \"sidebar.min_friends\": 7,\n            \"sound.notif_mp3_url\": \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/yb/r/VBbzpp2k5li.mp3\",\n            idle_poll_interval: 300000,\n            activity_limit: 60000,\n            \"sound.ringtone_mp3_url\": \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/yq/r/Mpd0-fRgh5n.mp3\",\n            \"roger.seen_delay\": 15000,\n            tab_max_load_age: 86400000,\n            typing_notifications: true,\n            show_sticker_nux: true,\n            chat_web_ranking_with_presence: 1,\n            chat_ranked_by_coefficient: 1,\n            \"video.skype_client_log\": 1,\n            \"periodical_impression_logging_config.interval\": 1800000,\n            chat_tab_title_link_timeline: 1,\n            max_sidebar_multichats: 3,\n            tab_auto_close_timeout: 86400000,\n            chat_impression_logging_periodical: true,\n            divebar_has_new_groups_button: true,\n            sound_enabled: true,\n            \"sound.ringtone_ogg_url\": \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/y3/r/mbcn6dBHIeX.ogg\",\n            sidebar_ticker: 1\n        },12,],[\"AvailableListInitialData\",[],{\n            chatNotif: 0,\n            pollInterval: 100000,\n            availableList: {\n            },\n            lazyPollInterval: 300000,\n            favoriteList: [],\n            mobileFriends: null,\n            lazyThreshold: 300000,\n            availableCount: 0,\n            lastActiveTimes: null,\n            updateTime: 1373490144000\n        },166,],],\n        elements: [[\"m_0_1d\",\"u_0_l\",2,],[\"m_0_1h\",\"u_0_m\",2,],[\"m_0_1k\",\"u_0_n\",2,],[\"m_0_1l\",\"u_0_o\",2,],[\"m_0_1j\",\"u_0_p\",4,],[\"m_0_1n\",\"u_0_q\",2,],[\"m_0_1r\",\"u_0_s\",2,],[\"m_0_22\",\"u_0_u\",2,\"m_0_21\",],[\"m_0_24\",\"u_0_v\",2,\"m_0_23\",],[\"m_0_26\",\"u_0_w\",2,\"m_0_25\",],],\n        markup: [[\"m_0_1q\",{\n            __html: \"\\u003Cdiv class=\\\"uiContextualDialogPositioner\\\" id=\\\"u_0_r\\\" data-position=\\\"left\\\"\\u003E\\u003Cdiv class=\\\"uiOverlay uiContextualDialog\\\" data-width=\\\"300\\\" data-destroyonhide=\\\"false\\\" data-fadeonhide=\\\"false\\\"\\u003E\\u003Cdiv class=\\\"uiOverlayContent\\\"\\u003E\\u003Cdiv class=\\\"uiContextualDialogContent\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_1u\",{\n            __html: \"\\u003Cli class=\\\"_42fz\\\"\\u003E\\u003Ca class=\\\"clearfix _50zw\\\" data-jsid=\\\"anchor\\\" href=\\\"#\\\" role=\\\"\\\" rel=\\\"ignore\\\"\\u003E\\u003Cdiv class=\\\"_54sk _42g2\\\" data-jsid=\\\"favorite_button\\\"\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"pic_container\\\"\\u003E\\u003Cimg class=\\\"pic img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y4/r/-PAXP-deijE.gif\\\" data-jsid=\\\"profile-photo\\\" alt=\\\"\\\" width=\\\"1\\\" height=\\\"1\\\" /\\u003E\\u003C/div\\u003E\\u003Cimg class=\\\"_54sp _42i1 img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yW/r/F7kk7-cjEKk.png\\\" alt=\\\"\\\" width=\\\"10\\\" height=\\\"8\\\" /\\u003E\\u003Cdiv class=\\\"clearfix\\\"\\u003E\\u003Cdiv class=\\\"rfloat\\\"\\u003E\\u003Cspan data-jsid=\\\"accessible-name\\\" class=\\\"accessible_elem\\\"\\u003E\\u003C/span\\u003E\\u003Cdiv class=\\\"icon_container\\\"\\u003E\\u003Cimg class=\\\"_d3c icon img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y4/r/-PAXP-deijE.gif\\\" alt=\\\"\\\" width=\\\"1\\\" height=\\\"1\\\" /\\u003E\\u003Cdiv class=\\\"active_time icon\\\"\\u003E\\u003C/div\\u003E\\u003Cimg class=\\\"status icon img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y4/r/-PAXP-deijE.gif\\\" alt=\\\"\\\" width=\\\"1\\\" height=\\\"1\\\" /\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv aria-hidden=\\\"true\\\"\\u003E\\u003Cdiv class=\\\"_52zl\\\" data-jsid=\\\"name\\\"\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"_52zk\\\" data-jsid=\\\"context\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/a\\u003E\\u003C/li\\u003E\"\n        },2,],[\"m_0_1v\",{\n            __html: \"\\u003Cli\\u003E\\u003Cdiv class=\\\"phs fcg\\\"\\u003E\\u003Cspan data-jsid=\\\"message\\\"\\u003ELoading...\\u003C/span\\u003E\\u003C/div\\u003E\\u003C/li\\u003E\"\n        },2,],[\"m_0_20\",{\n            __html: \"\\u003Cdiv class=\\\"pam _362\\\"\\u003E\\u003Cdiv class=\\\"clearfix\\\"\\u003E\\u003Ci class=\\\"_8o _8r lfloat img sp_9kaae3 sx_ee64a9\\\"\\u003E\\u003C/i\\u003E\\u003Cdiv class=\\\"clearfix _8u _42ef\\\"\\u003E\\u003Clabel class=\\\"rfloat uiCloseButton uiCloseButtonSmall\\\" for=\\\"u_0_t\\\"\\u003E\\u003Cinput title=\\\"Remove\\\" type=\\\"button\\\" data-jsid=\\\"dialogCloseButton\\\" id=\\\"u_0_t\\\" /\\u003E\\u003C/label\\u003E\\u003Cdiv class=\\\"prs\\\" data-jsid=\\\"dialogContent\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_21\",{\n            __html: \"\\u003Cform method=\\\"post\\\" action=\\\"/ajax/chat/blackbird/learn_more.php?source=offline&amp;promo_source=educate\\\" onsubmit=\\\"return window.Event &amp;&amp; Event.__inlineSubmit &amp;&amp; Event.__inlineSubmit(this,event)\\\" id=\\\"u_0_u\\\"\\u003E\\u003Cinput type=\\\"hidden\\\" name=\\\"fb_dtsg\\\" value=\\\"AQCttlPQ\\\" autocomplete=\\\"off\\\" /\\u003E\\u003Cstrong\\u003ETip:\\u003C/strong\\u003E You can turn on chat for just a few friends. \\u003Clabel class=\\\"uiLinkButton\\\"\\u003E\\u003Cinput type=\\\"submit\\\" value=\\\"Learn more\\\" /\\u003E\\u003C/label\\u003E.\\u003Cdiv class=\\\"_361\\\"\\u003E\\u003Ca class=\\\"mvm _363 uiButton uiButtonConfirm\\\" href=\\\"#\\\" role=\\\"button\\\" ajaxify=\\\"/ajax/chat/privacy/settings_dialog.php\\\" rel=\\\"dialog\\\" data-jsid=\\\"chatSettingsButton\\\"\\u003E\\u003Cspan class=\\\"uiButtonText\\\"\\u003EEdit Chat Settings\\u003C/span\\u003E\\u003C/a\\u003E\\u003C/div\\u003E\\u003C/form\\u003E\"\n        },3,],[\"m_0_23\",{\n            __html: \"\\u003Cform method=\\\"post\\\" action=\\\"/ajax/chat/blackbird/learn_more.php?source=blackbird\\\" onsubmit=\\\"return window.Event &amp;&amp; Event.__inlineSubmit &amp;&amp; Event.__inlineSubmit(this,event)\\\" id=\\\"u_0_v\\\"\\u003E\\u003Cinput type=\\\"hidden\\\" name=\\\"fb_dtsg\\\" value=\\\"AQCttlPQ\\\" autocomplete=\\\"off\\\" /\\u003E\\u003Cstrong\\u003ETip:\\u003C/strong\\u003E While you have chat turned off for some friends, their messages go to your inbox. \\u003Clabel class=\\\"uiLinkButton\\\"\\u003E\\u003Cinput type=\\\"submit\\\" value=\\\"Learn more\\\" /\\u003E\\u003C/label\\u003E.\\u003C/form\\u003E\"\n        },3,],[\"m_0_25\",{\n            __html: \"\\u003Cform method=\\\"post\\\" action=\\\"/ajax/chat/blackbird/learn_more.php?source=blackbird\\\" onsubmit=\\\"return window.Event &amp;&amp; Event.__inlineSubmit &amp;&amp; Event.__inlineSubmit(this,event)\\\" id=\\\"u_0_w\\\"\\u003E\\u003Cinput type=\\\"hidden\\\" name=\\\"fb_dtsg\\\" value=\\\"AQCttlPQ\\\" autocomplete=\\\"off\\\" /\\u003E\\u003Cstrong\\u003ETip:\\u003C/strong\\u003E When chat is off, messages from friends go to your inbox for you to read later. \\u003Clabel class=\\\"uiLinkButton\\\"\\u003E\\u003Cinput type=\\\"submit\\\" value=\\\"Learn more\\\" /\\u003E\\u003C/label\\u003E.\\u003C/form\\u003E\"\n        },3,],]\n    },\n    css: [\"W3Ky6\",\"cy4a0\",\"0duP3\",],\n    bootloadable: {\n        SortableGroup: {\n            resources: [\"AyUu6\",\"6tAwh\",\"AsDOA\",],\n            \"module\": true\n        },\n        LitestandSidebarBookmarksDisplay: {\n            resources: [\"AyUu6\",\"W3Ky6\",\"b7cJk\",],\n            \"module\": true\n        },\n        LitestandSidebar: {\n            resources: [\"AyUu6\",\"fvNhh\",\"u//Ut\",\"AsDOA\",\"W3Ky6\",],\n            \"module\": true\n        },\n        DOMScroll: {\n            resources: [\"AyUu6\",\"AsDOA\",],\n            \"module\": true\n        }\n    },\n    resource_map: {\n        \"H+v1W\": {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yl/r/OUIW4Mbs_w6.js\"\n        },\n        b7cJk: {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yP/r/lI2QSIxa0G3.js\"\n        }\n    },\n    ixData: {\n        \"/images/chat/sidebar/newGroupChatLitestand.png\": {\n            sprited: false,\n            uri: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yk/r/3hu9Ow1TVfb.png\",\n            width: 28,\n            height: 28\n        },\n        \"/images/litestand/sidebar/blended/new_group_chat.png\": {\n            sprited: false,\n            uri: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yg/r/I5ybuQbRjJE.png\",\n            width: 32,\n            height: 32\n        },\n        \"/images/chat/status/online.png\": {\n            sprited: true,\n            spriteMapCssClass: \"sp_9kaae3\",\n            spriteCssClass: \"sx_1dc182\"\n        },\n        \"/images/litestand/bookmarks/sidebar/remove.png\": {\n            sprited: true,\n            spriteMapCssClass: \"sp_9kaae3\",\n            spriteCssClass: \"sx_76e896\"\n        },\n        \"/images/litestand/sidebar/blended/online.png\": {\n            sprited: true,\n            spriteMapCssClass: \"sp_9kaae3\",\n            spriteCssClass: \"sx_6ae2b7\"\n        },\n        \"/images/litestand/sidebar/blended/pushable.png\": {\n            sprited: true,\n            spriteMapCssClass: \"sp_9kaae3\",\n            spriteCssClass: \"sx_a69036\"\n        },\n        \"/images/litestand/bookmarks/sidebar/add.png\": {\n            sprited: true,\n            spriteMapCssClass: \"sp_9kaae3\",\n            spriteCssClass: \"sx_f57d5d\"\n        },\n        \"/images/litestand/sidebar/pushable.png\": {\n            sprited: true,\n            spriteMapCssClass: \"sp_9kaae3\",\n            spriteCssClass: \"sx_0b17f3\"\n        },\n        \"/images/litestand/sidebar/online.png\": {\n            sprited: true,\n            spriteMapCssClass: \"sp_9kaae3\",\n            spriteCssClass: \"sx_6b87d3\"\n        },\n        \"/images/chat/add.png\": {\n            sprited: true,\n            spriteMapCssClass: \"sp_9kaae3\",\n            spriteCssClass: \"sx_daa3c5\"\n        },\n        \"/images/chat/status/mobile.png\": {\n            sprited: true,\n            spriteMapCssClass: \"sp_9kaae3\",\n            spriteCssClass: \"sx_6633b3\"\n        },\n        \"/images/chat/sidebar/newGroupChat.png\": {\n            sprited: false,\n            uri: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/ys/r/S824hxiYJSG.png\",\n            width: 28,\n            height: 28\n        },\n        \"/images/chat/delete.png\": {\n            sprited: true,\n            spriteMapCssClass: \"sp_9kaae3\",\n            spriteCssClass: \"sx_1bb86f\"\n        }\n    },\n    js: [\"AyUu6\",\"AsDOA\",\"OJTM4\",\"u//Ut\",\"EzMPG\",\"brbS1\",\"H+v1W\",],\n    id: \"pagelet_sidebar\",\n    phase: 2\n});");
// 1330
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"bigPipe.onPageletArrive({\n    content: {\n        pagelet_pinned_nav: {\n            container_id: \"u_0_y\"\n        }\n    },\n    css: [\"W3Ky6\",\"0duP3\",],\n    bootloadable: {\n    },\n    resource_map: {\n    },\n    js: [\"AsDOA\",\"AyUu6\",\"25/dt\",\"bUzfU\",\"OJTM4\",],\n    requires: [\"pagelet_controller::home_side_future_nav\",],\n    onload: [\"FutureSideNav.getInstance().initSection({\\\"id\\\":\\\"pinnedNav\\\",\\\"editEndpoint\\\":\\\"\\\\/ajax\\\\/bookmark\\\\/edit\\\\/\\\"}, [{\\\"id\\\":\\\"navItem_app_156203961126022\\\",\\\"key\\\":[\\\"app_156203961126022\\\",\\\"welcome\\\"],\\\"path\\\":[\\\"\\\\/\\\"],\\\"type\\\":\\\"apps\\\",\\\"endpoint\\\":\\\"\\\\/ajax\\\\/home\\\\/generic.php\\\",\\\"selected\\\":true,\\\"highlighted\\\":false,\\\"children\\\":[]},{\\\"id\\\":\\\"navItem_app_4748854339\\\",\\\"key\\\":[\\\"app_4748854339\\\",\\\"nf\\\",\\\"lf\\\",\\\"h\\\",\\\"h_chr\\\",\\\"h_nor\\\",\\\"h\\\",\\\"lf\\\",\\\"app_2915120374\\\",\\\"pp\\\",\\\"app_10150110253435258\\\"],\\\"path\\\":[\\\"\\\\/\\\"],\\\"type\\\":\\\"apps\\\",\\\"endpoint\\\":\\\"\\\\/ajax\\\\/home\\\\/generic.php\\\",\\\"selected\\\":false,\\\"highlighted\\\":false,\\\"children\\\":[]},{\\\"id\\\":\\\"navItem_app_217974574879787\\\",\\\"key\\\":[\\\"app_217974574879787\\\",\\\"inbox\\\"],\\\"path\\\":[\\\"\\\\/messages\\\\/\\\"],\\\"type\\\":\\\"apps\\\",\\\"endpoint\\\":null,\\\"selected\\\":false,\\\"highlighted\\\":false,\\\"children\\\":[{\\\"id\\\":\\\"navItem_other\\\",\\\"key\\\":[\\\"other\\\"],\\\"path\\\":[\\\"\\\\/messages\\\\/other\\\\/\\\"],\\\"type\\\":null,\\\"endpoint\\\":null,\\\"selected\\\":false,\\\"highlighted\\\":false,\\\"children\\\":[]}]},{\\\"id\\\":\\\"navItem_app_2344061033\\\",\\\"key\\\":[\\\"app_2344061033\\\"],\\\"path\\\":[\\\"\\\\/events\\\\/list\\\",\\\"\\\\/events\\\\/\\\",{\\\"regex\\\":\\\"\\\\\\\\\\\\/events\\\\\\\\\\\\/!(friends|create)\\\\\\\\\\\\/\\\"}],\\\"type\\\":\\\"apps\\\",\\\"endpoint\\\":null,\\\"selected\\\":false,\\\"highlighted\\\":false,\\\"children\\\":[]},{\\\"id\\\":\\\"navItem_app_2305272732\\\",\\\"key\\\":[\\\"app_2305272732\\\"],\\\"path\\\":[\\\"\\\\/javasee.cript\\\\/photos\\\"],\\\"type\\\":\\\"apps\\\",\\\"endpoint\\\":null,\\\"selected\\\":false,\\\"highlighted\\\":false,\\\"children\\\":[]},{\\\"id\\\":\\\"navItem_app_2356318349\\\",\\\"key\\\":[\\\"app_2356318349\\\",\\\"ff\\\"],\\\"path\\\":[\\\"\\\\/\\\"],\\\"type\\\":\\\"apps\\\",\\\"endpoint\\\":\\\"\\\\/ajax\\\\/home\\\\/generic.php\\\",\\\"selected\\\":false,\\\"highlighted\\\":false,\\\"children\\\":[]}]);\",],\n    id: \"pagelet_pinned_nav\",\n    phase: 2\n});");
// 1331
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"sd045c3849f9355f31b0293e50d6587f93aee68a8");
// 1332
geval("bigPipe.onPageletArrive({\n    JSBNG__content: {\n        pagelet_pinned_nav: {\n            container_id: \"u_0_y\"\n        }\n    },\n    css: [\"W3Ky6\",\"0duP3\",],\n    bootloadable: {\n    },\n    resource_map: {\n    },\n    js: [\"AsDOA\",\"AyUu6\",\"25/dt\",\"bUzfU\",\"OJTM4\",],\n    requires: [\"pagelet_controller::home_side_future_nav\",],\n    JSBNG__onload: [\"FutureSideNav.getInstance().initSection({\\\"id\\\":\\\"pinnedNav\\\",\\\"editEndpoint\\\":\\\"\\\\/ajax\\\\/bookmark\\\\/edit\\\\/\\\"}, [{\\\"id\\\":\\\"navItem_app_156203961126022\\\",\\\"key\\\":[\\\"app_156203961126022\\\",\\\"welcome\\\"],\\\"path\\\":[\\\"\\\\/\\\"],\\\"type\\\":\\\"apps\\\",\\\"endpoint\\\":\\\"\\\\/ajax\\\\/home\\\\/generic.php\\\",\\\"selected\\\":true,\\\"highlighted\\\":false,\\\"children\\\":[]},{\\\"id\\\":\\\"navItem_app_4748854339\\\",\\\"key\\\":[\\\"app_4748854339\\\",\\\"nf\\\",\\\"lf\\\",\\\"h\\\",\\\"h_chr\\\",\\\"h_nor\\\",\\\"h\\\",\\\"lf\\\",\\\"app_2915120374\\\",\\\"pp\\\",\\\"app_10150110253435258\\\"],\\\"path\\\":[\\\"\\\\/\\\"],\\\"type\\\":\\\"apps\\\",\\\"endpoint\\\":\\\"\\\\/ajax\\\\/home\\\\/generic.php\\\",\\\"selected\\\":false,\\\"highlighted\\\":false,\\\"children\\\":[]},{\\\"id\\\":\\\"navItem_app_217974574879787\\\",\\\"key\\\":[\\\"app_217974574879787\\\",\\\"inbox\\\"],\\\"path\\\":[\\\"\\\\/messages\\\\/\\\"],\\\"type\\\":\\\"apps\\\",\\\"endpoint\\\":null,\\\"selected\\\":false,\\\"highlighted\\\":false,\\\"children\\\":[{\\\"id\\\":\\\"navItem_other\\\",\\\"key\\\":[\\\"other\\\"],\\\"path\\\":[\\\"\\\\/messages\\\\/other\\\\/\\\"],\\\"type\\\":null,\\\"endpoint\\\":null,\\\"selected\\\":false,\\\"highlighted\\\":false,\\\"children\\\":[]}]},{\\\"id\\\":\\\"navItem_app_2344061033\\\",\\\"key\\\":[\\\"app_2344061033\\\"],\\\"path\\\":[\\\"\\\\/events\\\\/list\\\",\\\"\\\\/events\\\\/\\\",{\\\"regex\\\":\\\"\\\\\\\\\\\\/events\\\\\\\\\\\\/!(friends|create)\\\\\\\\\\\\/\\\"}],\\\"type\\\":\\\"apps\\\",\\\"endpoint\\\":null,\\\"selected\\\":false,\\\"highlighted\\\":false,\\\"children\\\":[]},{\\\"id\\\":\\\"navItem_app_2305272732\\\",\\\"key\\\":[\\\"app_2305272732\\\"],\\\"path\\\":[\\\"\\\\/javasee.cript\\\\/photos\\\"],\\\"type\\\":\\\"apps\\\",\\\"endpoint\\\":null,\\\"selected\\\":false,\\\"highlighted\\\":false,\\\"children\\\":[]},{\\\"id\\\":\\\"navItem_app_2356318349\\\",\\\"key\\\":[\\\"app_2356318349\\\",\\\"ff\\\"],\\\"path\\\":[\\\"\\\\/\\\"],\\\"type\\\":\\\"apps\\\",\\\"endpoint\\\":\\\"\\\\/ajax\\\\/home\\\\/generic.php\\\",\\\"selected\\\":false,\\\"highlighted\\\":false,\\\"children\\\":[]}]);\",],\n    id: \"pagelet_pinned_nav\",\n    phase: 2\n});");
// 1334
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"bigPipe.onPageletArrive({\n    is_last: true,\n    is_second_to_last_phase: true,\n    content: {\n        pagelet_bookmark_nav: {\n            container_id: \"u_0_z\"\n        }\n    },\n    css: [\"W3Ky6\",\"0duP3\",],\n    bootloadable: {\n    },\n    resource_map: {\n    },\n    js: [\"AsDOA\",\"AyUu6\",\"25/dt\",\"bUzfU\",\"OJTM4\",],\n    requires: [\"pagelet_controller::home_side_future_nav\",],\n    onload: [\"FutureSideNav.getInstance().initSection({\\\"id\\\":\\\"appsNav\\\",\\\"editEndpoint\\\":null}, [{\\\"id\\\":\\\"navItem_app_140332009231\\\",\\\"key\\\":[\\\"app_140332009231\\\",\\\"games\\\"],\\\"path\\\":[\\\"\\\\/appcenter\\\\/\\\"],\\\"type\\\":\\\"apps\\\",\\\"endpoint\\\":null,\\\"selected\\\":false,\\\"highlighted\\\":false,\\\"children\\\":[]},{\\\"id\\\":\\\"navItem_app_261369767293002\\\",\\\"key\\\":[\\\"app_261369767293002\\\",\\\"appsandgames\\\"],\\\"path\\\":[\\\"\\\\/apps\\\\/feed\\\"],\\\"type\\\":\\\"apps\\\",\\\"endpoint\\\":\\\"\\\\/ajax\\\\/home\\\\/generic.php\\\",\\\"selected\\\":false,\\\"highlighted\\\":false,\\\"children\\\":[]},{\\\"id\\\":\\\"navItem_app_119960514742544\\\",\\\"key\\\":[\\\"app_119960514742544\\\",\\\"music\\\"],\\\"path\\\":[\\\"\\\\/music\\\"],\\\"type\\\":\\\"apps\\\",\\\"endpoint\\\":\\\"\\\\/ajax\\\\/home\\\\/generic.php\\\",\\\"selected\\\":false,\\\"highlighted\\\":false,\\\"children\\\":[]},{\\\"id\\\":\\\"navItem_app_2347471856\\\",\\\"key\\\":[\\\"app_2347471856\\\",\\\"notes\\\"],\\\"path\\\":[\\\"\\\\/notes\\\\/\\\"],\\\"type\\\":\\\"apps\\\",\\\"endpoint\\\":\\\"\\\\/ajax\\\\/home\\\\/generic.php\\\",\\\"selected\\\":false,\\\"highlighted\\\":false,\\\"children\\\":[]},{\\\"id\\\":\\\"navItem_app_2309869772\\\",\\\"key\\\":[\\\"app_2309869772\\\"],\\\"path\\\":[\\\"\\\\/\\\"],\\\"type\\\":\\\"apps\\\",\\\"endpoint\\\":null,\\\"selected\\\":false,\\\"highlighted\\\":false,\\\"children\\\":[]},{\\\"id\\\":\\\"navItem_app_183217215062060\\\",\\\"key\\\":[\\\"app_183217215062060\\\",\\\"poke\\\"],\\\"path\\\":[\\\"\\\\/pokes\\\"],\\\"type\\\":\\\"apps\\\",\\\"endpoint\\\":\\\"\\\\/ajax\\\\/home\\\\/generic.php\\\",\\\"selected\\\":false,\\\"highlighted\\\":false,\\\"children\\\":[]}]);\",\"FutureSideNav.getInstance().initSection({\\\"id\\\":\\\"groupsNav\\\",\\\"editEndpoint\\\":null}, []);\",\"FutureSideNav.getInstance().initSection({\\\"id\\\":\\\"pagesNav\\\",\\\"editEndpoint\\\":null}, [{\\\"id\\\":\\\"navItem_app_140472815972081\\\",\\\"key\\\":[\\\"app_140472815972081\\\",\\\"pages\\\"],\\\"path\\\":[\\\"\\\\/pages\\\\/feed\\\"],\\\"type\\\":\\\"pages\\\",\\\"endpoint\\\":\\\"\\\\/ajax\\\\/home\\\\/generic.php\\\",\\\"selected\\\":false,\\\"highlighted\\\":false,\\\"children\\\":[]},{\\\"id\\\":\\\"navItem_app_357937250942127\\\",\\\"key\\\":[\\\"app_357937250942127\\\",\\\"addpage\\\"],\\\"path\\\":[\\\"\\\\/addpage\\\"],\\\"type\\\":\\\"pages\\\",\\\"endpoint\\\":null,\\\"selected\\\":false,\\\"highlighted\\\":false,\\\"children\\\":[]}]);\",\"FutureSideNav.getInstance().initSection({\\\"id\\\":\\\"listsNav\\\",\\\"editEndpoint\\\":null}, [{\\\"id\\\":\\\"navItem_fl_1374283956118870\\\",\\\"key\\\":[\\\"fl_1374283956118870\\\"],\\\"path\\\":[\\\"\\\\/lists\\\\/1374283956118870\\\"],\\\"type\\\":\\\"lists\\\",\\\"endpoint\\\":\\\"\\\\/ajax\\\\/home\\\\/generic.php\\\",\\\"selected\\\":false,\\\"highlighted\\\":false,\\\"children\\\":[]},{\\\"id\\\":\\\"navItem_fl_1389747037905895\\\",\\\"key\\\":[\\\"fl_1389747037905895\\\"],\\\"path\\\":[\\\"\\\\/lists\\\\/1389747037905895\\\"],\\\"type\\\":\\\"lists\\\",\\\"endpoint\\\":\\\"\\\\/ajax\\\\/home\\\\/generic.php\\\",\\\"selected\\\":false,\\\"highlighted\\\":false,\\\"children\\\":[]},{\\\"id\\\":\\\"navItem_fl_1389747041239228\\\",\\\"key\\\":[\\\"fl_1389747041239228\\\"],\\\"path\\\":[\\\"\\\\/lists\\\\/1389747041239228\\\"],\\\"type\\\":\\\"lists\\\",\\\"endpoint\\\":\\\"\\\\/ajax\\\\/home\\\\/generic.php\\\",\\\"selected\\\":false,\\\"highlighted\\\":false,\\\"children\\\":[]}]);\",\"FutureSideNav.getInstance().initSection({\\\"id\\\":\\\"interestsNav\\\",\\\"editEndpoint\\\":null}, []);\",],\n    id: \"pagelet_bookmark_nav\",\n    phase: 2\n});");
// 1335
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"s0304d00fe4437d067a621543ea4d1d14447910fd");
// 1336
geval("bigPipe.onPageletArrive({\n    is_last: true,\n    is_second_to_last_phase: true,\n    JSBNG__content: {\n        pagelet_bookmark_nav: {\n            container_id: \"u_0_z\"\n        }\n    },\n    css: [\"W3Ky6\",\"0duP3\",],\n    bootloadable: {\n    },\n    resource_map: {\n    },\n    js: [\"AsDOA\",\"AyUu6\",\"25/dt\",\"bUzfU\",\"OJTM4\",],\n    requires: [\"pagelet_controller::home_side_future_nav\",],\n    JSBNG__onload: [\"FutureSideNav.getInstance().initSection({\\\"id\\\":\\\"appsNav\\\",\\\"editEndpoint\\\":null}, [{\\\"id\\\":\\\"navItem_app_140332009231\\\",\\\"key\\\":[\\\"app_140332009231\\\",\\\"games\\\"],\\\"path\\\":[\\\"\\\\/appcenter\\\\/\\\"],\\\"type\\\":\\\"apps\\\",\\\"endpoint\\\":null,\\\"selected\\\":false,\\\"highlighted\\\":false,\\\"children\\\":[]},{\\\"id\\\":\\\"navItem_app_261369767293002\\\",\\\"key\\\":[\\\"app_261369767293002\\\",\\\"appsandgames\\\"],\\\"path\\\":[\\\"\\\\/apps\\\\/feed\\\"],\\\"type\\\":\\\"apps\\\",\\\"endpoint\\\":\\\"\\\\/ajax\\\\/home\\\\/generic.php\\\",\\\"selected\\\":false,\\\"highlighted\\\":false,\\\"children\\\":[]},{\\\"id\\\":\\\"navItem_app_119960514742544\\\",\\\"key\\\":[\\\"app_119960514742544\\\",\\\"music\\\"],\\\"path\\\":[\\\"\\\\/music\\\"],\\\"type\\\":\\\"apps\\\",\\\"endpoint\\\":\\\"\\\\/ajax\\\\/home\\\\/generic.php\\\",\\\"selected\\\":false,\\\"highlighted\\\":false,\\\"children\\\":[]},{\\\"id\\\":\\\"navItem_app_2347471856\\\",\\\"key\\\":[\\\"app_2347471856\\\",\\\"notes\\\"],\\\"path\\\":[\\\"\\\\/notes\\\\/\\\"],\\\"type\\\":\\\"apps\\\",\\\"endpoint\\\":\\\"\\\\/ajax\\\\/home\\\\/generic.php\\\",\\\"selected\\\":false,\\\"highlighted\\\":false,\\\"children\\\":[]},{\\\"id\\\":\\\"navItem_app_2309869772\\\",\\\"key\\\":[\\\"app_2309869772\\\"],\\\"path\\\":[\\\"\\\\/\\\"],\\\"type\\\":\\\"apps\\\",\\\"endpoint\\\":null,\\\"selected\\\":false,\\\"highlighted\\\":false,\\\"children\\\":[]},{\\\"id\\\":\\\"navItem_app_183217215062060\\\",\\\"key\\\":[\\\"app_183217215062060\\\",\\\"poke\\\"],\\\"path\\\":[\\\"\\\\/pokes\\\"],\\\"type\\\":\\\"apps\\\",\\\"endpoint\\\":\\\"\\\\/ajax\\\\/home\\\\/generic.php\\\",\\\"selected\\\":false,\\\"highlighted\\\":false,\\\"children\\\":[]}]);\",\"FutureSideNav.getInstance().initSection({\\\"id\\\":\\\"groupsNav\\\",\\\"editEndpoint\\\":null}, []);\",\"FutureSideNav.getInstance().initSection({\\\"id\\\":\\\"pagesNav\\\",\\\"editEndpoint\\\":null}, [{\\\"id\\\":\\\"navItem_app_140472815972081\\\",\\\"key\\\":[\\\"app_140472815972081\\\",\\\"pages\\\"],\\\"path\\\":[\\\"\\\\/pages\\\\/feed\\\"],\\\"type\\\":\\\"pages\\\",\\\"endpoint\\\":\\\"\\\\/ajax\\\\/home\\\\/generic.php\\\",\\\"selected\\\":false,\\\"highlighted\\\":false,\\\"children\\\":[]},{\\\"id\\\":\\\"navItem_app_357937250942127\\\",\\\"key\\\":[\\\"app_357937250942127\\\",\\\"addpage\\\"],\\\"path\\\":[\\\"\\\\/addpage\\\"],\\\"type\\\":\\\"pages\\\",\\\"endpoint\\\":null,\\\"selected\\\":false,\\\"highlighted\\\":false,\\\"children\\\":[]}]);\",\"FutureSideNav.getInstance().initSection({\\\"id\\\":\\\"listsNav\\\",\\\"editEndpoint\\\":null}, [{\\\"id\\\":\\\"navItem_fl_1374283956118870\\\",\\\"key\\\":[\\\"fl_1374283956118870\\\"],\\\"path\\\":[\\\"\\\\/lists\\\\/1374283956118870\\\"],\\\"type\\\":\\\"lists\\\",\\\"endpoint\\\":\\\"\\\\/ajax\\\\/home\\\\/generic.php\\\",\\\"selected\\\":false,\\\"highlighted\\\":false,\\\"children\\\":[]},{\\\"id\\\":\\\"navItem_fl_1389747037905895\\\",\\\"key\\\":[\\\"fl_1389747037905895\\\"],\\\"path\\\":[\\\"\\\\/lists\\\\/1389747037905895\\\"],\\\"type\\\":\\\"lists\\\",\\\"endpoint\\\":\\\"\\\\/ajax\\\\/home\\\\/generic.php\\\",\\\"selected\\\":false,\\\"highlighted\\\":false,\\\"children\\\":[]},{\\\"id\\\":\\\"navItem_fl_1389747041239228\\\",\\\"key\\\":[\\\"fl_1389747041239228\\\"],\\\"path\\\":[\\\"\\\\/lists\\\\/1389747041239228\\\"],\\\"type\\\":\\\"lists\\\",\\\"endpoint\\\":\\\"\\\\/ajax\\\\/home\\\\/generic.php\\\",\\\"selected\\\":false,\\\"highlighted\\\":false,\\\"children\\\":[]}]);\",\"FutureSideNav.getInstance().initSection({\\\"id\\\":\\\"interestsNav\\\",\\\"editEndpoint\\\":null}, []);\",],\n    id: \"pagelet_bookmark_nav\",\n    phase: 2\n});");
// 1338
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"bigPipe.onPageletArrive({\n    content: {\n        pagelet_dock: {\n            container_id: \"u_0_1o\"\n        }\n    },\n    jsmods: {\n        require: [[\"MusicButtonManager\",\"init\",[],[[\"music.song\",],],],[\"initLiveMessageReceiver\",],[\"Dock\",\"init\",[\"m_0_27\",],[{\n            __m: \"m_0_27\"\n        },],],[\"React\",\"constructAndRenderComponent\",[\"NotificationBeeper.react\",\"m_0_28\",],[{\n            __m: \"NotificationBeeper.react\"\n        },{\n            unseenVsUnread: false,\n            canPause: false,\n            shouldLogImpressions: false,\n            soundPath: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/yy/r/odIeERVR1c5.mp3\",\n            soundEnabled: true,\n            tracking: \"{\\\"ref\\\":\\\"beeper\\\",\\\"jewel\\\":\\\"notifications\\\",\\\"type\\\":\\\"click2canvas\\\"}\"\n        },{\n            __m: \"m_0_28\"\n        },],],[\"ChatApp\",\"init\",[\"m_0_29\",\"m_0_2a\",],[{\n            __m: \"m_0_29\"\n        },{\n            __m: \"m_0_2a\"\n        },{\n            payload_source: \"server_initial_data\"\n        },],],[\"ChatOptions\",],[\"ShortProfiles\",\"setMulti\",[],[{\n            100006118350059: {\n                id: \"100006118350059\",\n                name: \"Javasee Cript\",\n                firstName: \"Javasee\",\n                vanity: \"javasee.cript\",\n                thumbSrc: \"http://jsbngssl.fbcdn-profile-a.akamaihd.net/hprofile-ak-prn2/s32x32/275646_100006118350059_324335073_q.jpg\",\n                uri: \"http://jsbngssl.www.facebook.com/javasee.cript\",\n                gender: 2,\n                type: \"user\",\n                is_friend: false,\n                social_snippets: null,\n                showVideoPromo: false,\n                searchTokens: [\"Cript\",\"Javasee\",]\n            }\n        },],],[\"m_0_2c\",],[\"m_0_2e\",],[\"Typeahead\",\"init\",[\"m_0_2f\",\"m_0_2e\",],[{\n            __m: \"m_0_2f\"\n        },{\n            __m: \"m_0_2e\"\n        },[\"chatTypeahead\",\"buildBestAvailableNames\",\"showLoadingIndicator\",],null,],],[\"ClearableTypeahead\",\"resetOnCloseButtonClick\",[\"m_0_2e\",\"m_0_2h\",],[{\n            __m: \"m_0_2e\"\n        },{\n            __m: \"m_0_2h\"\n        },],],[\"m_0_2k\",],[\"m_0_2l\",],[\"Layer\",\"init\",[\"m_0_2l\",\"m_0_2m\",],[{\n            __m: \"m_0_2l\"\n        },{\n            __m: \"m_0_2m\"\n        },],],[\"m_0_2d\",],[\"m_0_4s\",],[\"Typeahead\",\"init\",[\"m_0_4q\",\"m_0_4s\",],[{\n            __m: \"m_0_4q\"\n        },{\n            __m: \"m_0_4s\"\n        },[],null,],],],\n        instances: [[\"m_0_2c\",[\"BuddyListNub\",\"m_0_2b\",\"m_0_2d\",\"m_0_2e\",],[{\n            __m: \"m_0_2b\"\n        },{\n            __m: \"m_0_2d\"\n        },{\n            __m: \"m_0_2e\"\n        },],1,],[\"m_0_2e\",[\"Typeahead\",\"m_0_2i\",\"ChatTypeaheadView\",\"ChatTypeaheadRenderer\",\"m_0_2f\",\"ChatTypeaheadCore\",\"m_0_2g\",],[{\n            __m: \"m_0_2i\"\n        },{\n            node_id: \"u_0_13\",\n            node: null,\n            ctor: {\n                __m: \"ChatTypeaheadView\"\n            },\n            options: {\n                autoSelect: true,\n                renderer: {\n                    __m: \"ChatTypeaheadRenderer\"\n                },\n                causalElement: {\n                    __m: \"m_0_2f\"\n                },\n                minWidth: 0,\n                alignment: \"left\",\n                showBadges: 1\n            }\n        },{\n            ctor: {\n                __m: \"ChatTypeaheadCore\"\n            },\n            options: {\n                keepFocused: false,\n                resetOnSelect: true,\n                setValueOnSelect: false\n            }\n        },{\n            __m: \"m_0_2g\"\n        },],7,],[\"m_0_2k\",[\"ChatSidebarDropdown\",\"m_0_2j\",],[{\n            __m: \"m_0_2j\"\n        },null,],1,],[\"m_0_2l\",[\"LegacyContextualDialog\",\"AccessibleLayer\",],[{\n            buildWrapper: false,\n            causalElement: null,\n            addedBehaviors: [{\n                __m: \"AccessibleLayer\"\n            },]\n        },],5,],[\"m_0_2d\",[\"ChatOrderedList\",\"m_0_2n\",\"m_0_2o\",\"m_0_2p\",\"m_0_2l\",],[false,{\n            __m: \"m_0_2n\"\n        },{\n            __m: \"m_0_2o\"\n        },{\n            __m: \"m_0_2p\"\n        },{\n            __m: \"m_0_2l\"\n        },null,],3,],[\"m_0_2i\",[\"ChatTypeaheadDataSource\",],[{\n            alwaysPrefixMatch: true,\n            showOfflineUsers: true\n        },],2,],[\"m_0_2o\",[\"XHPTemplate\",\"m_0_2q\",],[{\n            __m: \"m_0_2q\"\n        },],2,],[\"m_0_2p\",[\"XHPTemplate\",\"m_0_2r\",],[{\n            __m: \"m_0_2r\"\n        },],2,],[\"m_0_2s\",[\"XHPTemplate\",\"m_0_3x\",],[{\n            __m: \"m_0_3x\"\n        },],2,],[\"m_0_2t\",[\"XHPTemplate\",\"m_0_3y\",],[{\n            __m: \"m_0_3y\"\n        },],2,],[\"m_0_2u\",[\"XHPTemplate\",\"m_0_3z\",],[{\n            __m: \"m_0_3z\"\n        },],2,],[\"m_0_2v\",[\"XHPTemplate\",\"m_0_40\",],[{\n            __m: \"m_0_40\"\n        },],2,],[\"m_0_2w\",[\"XHPTemplate\",\"m_0_41\",],[{\n            __m: \"m_0_41\"\n        },],2,],[\"m_0_2x\",[\"XHPTemplate\",\"m_0_42\",],[{\n            __m: \"m_0_42\"\n        },],2,],[\"m_0_2y\",[\"XHPTemplate\",\"m_0_43\",],[{\n            __m: \"m_0_43\"\n        },],2,],[\"m_0_2z\",[\"XHPTemplate\",\"m_0_44\",],[{\n            __m: \"m_0_44\"\n        },],2,],[\"m_0_30\",[\"XHPTemplate\",\"m_0_45\",],[{\n            __m: \"m_0_45\"\n        },],2,],[\"m_0_31\",[\"XHPTemplate\",\"m_0_46\",],[{\n            __m: \"m_0_46\"\n        },],2,],[\"m_0_32\",[\"XHPTemplate\",\"m_0_47\",],[{\n            __m: \"m_0_47\"\n        },],2,],[\"m_0_33\",[\"DataSource\",],[{\n            maxResults: 5,\n            queryData: [],\n            bootstrapData: {\n                viewer: 100006118350059,\n                token: \"1372173655-7\",\n                filter: [\"user\",],\n                options: [\"friends_only\",]\n            },\n            bootstrapEndpoint: \"/ajax/typeahead/first_degree.php\"\n        },],2,],[\"m_0_34\",[\"XHPTemplate\",\"m_0_48\",],[{\n            __m: \"m_0_48\"\n        },],2,],[\"m_0_35\",[\"XHPTemplate\",\"m_0_49\",],[{\n            __m: \"m_0_49\"\n        },],2,],[\"m_0_36\",[\"XHPTemplate\",\"m_0_4a\",],[{\n            __m: \"m_0_4a\"\n        },],2,],[\"m_0_37\",[\"XHPTemplate\",\"m_0_4b\",],[{\n            __m: \"m_0_4b\"\n        },],2,],[\"m_0_38\",[\"XHPTemplate\",\"m_0_4c\",],[{\n            __m: \"m_0_4c\"\n        },],2,],[\"m_0_39\",[\"XHPTemplate\",\"m_0_4d\",],[{\n            __m: \"m_0_4d\"\n        },],2,],[\"m_0_3a\",[\"XHPTemplate\",\"m_0_4e\",],[{\n            __m: \"m_0_4e\"\n        },],2,],[\"m_0_3b\",[\"XHPTemplate\",\"m_0_4f\",],[{\n            __m: \"m_0_4f\"\n        },],2,],[\"m_0_3c\",[\"XHPTemplate\",\"m_0_4g\",],[{\n            __m: \"m_0_4g\"\n        },],2,],[\"m_0_3d\",[\"XHPTemplate\",\"m_0_4h\",],[{\n            __m: \"m_0_4h\"\n        },],2,],[\"m_0_3e\",[\"XHPTemplate\",\"m_0_4i\",],[{\n            __m: \"m_0_4i\"\n        },],2,],[\"m_0_3f\",[\"XHPTemplate\",\"m_0_4j\",],[{\n            __m: \"m_0_4j\"\n        },],2,],[\"m_0_3g\",[\"XHPTemplate\",\"m_0_4k\",],[{\n            __m: \"m_0_4k\"\n        },],2,],[\"m_0_3h\",[\"XHPTemplate\",\"m_0_4l\",],[{\n            __m: \"m_0_4l\"\n        },],2,],[\"m_0_3i\",[\"XHPTemplate\",\"m_0_4m\",],[{\n            __m: \"m_0_4m\"\n        },],2,],[\"m_0_4s\",[\"Typeahead\",\"m_0_4t\",\"ContextualTypeaheadView\",\"m_0_4q\",\"TypeaheadCore\",\"m_0_4r\",],[{\n            __m: \"m_0_4t\"\n        },{\n            node_id: \"\",\n            node: null,\n            ctor: {\n                __m: \"ContextualTypeaheadView\"\n            },\n            options: {\n                causalElement: {\n                    __m: \"m_0_4q\"\n                },\n                minWidth: 0,\n                alignment: \"left\",\n                showBadges: 1\n            }\n        },{\n            ctor: {\n                __m: \"TypeaheadCore\"\n            },\n            options: []\n        },{\n            __m: \"m_0_4r\"\n        },],3,],[\"m_0_3j\",[\"XHPTemplate\",\"m_0_4p\",],[{\n            __m: \"m_0_4p\"\n        },],2,],[\"m_0_3k\",[\"XHPTemplate\",\"m_0_4u\",],[{\n            __m: \"m_0_4u\"\n        },],2,],[\"m_0_3l\",[\"XHPTemplate\",\"m_0_4v\",],[{\n            __m: \"m_0_4v\"\n        },],2,],[\"m_0_3m\",[\"XHPTemplate\",\"m_0_4w\",],[{\n            __m: \"m_0_4w\"\n        },],2,],[\"m_0_3n\",[\"XHPTemplate\",\"m_0_4x\",],[{\n            __m: \"m_0_4x\"\n        },],2,],[\"m_0_3o\",[\"XHPTemplate\",\"m_0_4y\",],[{\n            __m: \"m_0_4y\"\n        },],2,],[\"m_0_3p\",[\"XHPTemplate\",\"m_0_4z\",],[{\n            __m: \"m_0_4z\"\n        },],2,],[\"m_0_3q\",[\"XHPTemplate\",\"m_0_50\",],[{\n            __m: \"m_0_50\"\n        },],2,],[\"m_0_3r\",[\"XHPTemplate\",\"m_0_51\",],[{\n            __m: \"m_0_51\"\n        },],2,],[\"m_0_3s\",[\"XHPTemplate\",\"m_0_54\",],[{\n            __m: \"m_0_54\"\n        },],2,],[\"m_0_3t\",[\"XHPTemplate\",\"m_0_55\",],[{\n            __m: \"m_0_55\"\n        },],2,],[\"m_0_3u\",[\"XHPTemplate\",\"m_0_56\",],[{\n            __m: \"m_0_56\"\n        },],2,],[\"m_0_3v\",[\"XHPTemplate\",\"m_0_57\",],[{\n            __m: \"m_0_57\"\n        },],2,],[\"m_0_3w\",[\"XHPTemplate\",\"m_0_58\",],[{\n            __m: \"m_0_58\"\n        },],2,],[\"m_0_4t\",[\"DataSource\",],[[],],2,],],\n        define: [[\"LinkshimHandlerConfig\",[],{\n            supports_meta_referrer: false,\n            render_verification_rate: 1000\n        },27,],[\"MercurySheetTemplates\",[\"m_0_2s\",],{\n            \":fb:mercury:tab-sheet:loading\": {\n                __m: \"m_0_2s\"\n            }\n        },40,],[\"MercuryAttachmentTemplates\",[\"m_0_2t\",\"m_0_2u\",\"m_0_2v\",\"m_0_2w\",\"m_0_2x\",\"m_0_2y\",\"m_0_2z\",\"m_0_30\",\"m_0_31\",\"m_0_32\",],{\n            \":fb:mercury:attachment:error\": {\n                __m: \"m_0_2t\"\n            },\n            \":fb:mercury:attachment:video-thumb\": {\n                __m: \"m_0_2u\"\n            },\n            \":fb:mercury:attachment:file-name\": {\n                __m: \"m_0_2v\"\n            },\n            \":fb:mercury:attachment:external-link\": {\n                __m: \"m_0_2w\"\n            },\n            \":fb:mercury:attachment:music\": {\n                __m: \"m_0_2x\"\n            },\n            \":fb:mercury:attachment:file-link\": {\n                __m: \"m_0_2y\"\n            },\n            \":fb:mercury:attachment:preview\": {\n                __m: \"m_0_2z\"\n            },\n            \":fb:mercury:attachment:share-link\": {\n                __m: \"m_0_30\"\n            },\n            \":fb:mercury:upload-file-row\": {\n                __m: \"m_0_31\"\n            },\n            \":fb:mercury:attachment:extended-file-link\": {\n                __m: \"m_0_32\"\n            }\n        },34,],[\"MercuryDataSourceWrapper\",[\"m_0_33\",],{\n            source: {\n                __m: \"m_0_33\"\n            }\n        },37,],[\"MercuryStickersInitialData\",[],{\n            packs: [{\n                id: 126361870881943,\n                name: \"Meep\",\n                icon: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yd/r/wn5XeO2Rkqj.png\",\n                selectedIcon: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yN/r/sZ4spcbuYtY.png\"\n            },{\n                id: 350357561732812,\n                name: \"Pusheen\",\n                icon: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yy/r/kLIslj7Vlau.png\",\n                selectedIcon: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yz/r/58FtCc-hDRb.png\"\n            },{\n                id: \"emoticons\",\n                name: \"Emoticons\",\n                icon: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y_/r/4Dc6kC7GMzT.png\",\n                selectedIcon: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yV/r/d-mu_AVkpiU.png\"\n            },]\n        },144,],[\"ChatTabTemplates\",[\"m_0_34\",\"m_0_35\",\"m_0_36\",\"m_0_37\",\"m_0_38\",\"m_0_39\",\"m_0_3a\",\"m_0_3b\",\"m_0_3c\",\"m_0_3d\",\"m_0_3e\",\"m_0_3f\",\"m_0_3g\",\"m_0_3h\",\"m_0_3i\",\"m_0_3j\",\"m_0_3k\",\"m_0_3l\",\"m_0_3m\",\"m_0_3n\",\"m_0_3o\",\"m_0_3p\",\"m_0_3q\",\"m_0_3r\",],{\n            \":fb:chat:conversation:message:event\": {\n                __m: \"m_0_34\"\n            },\n            \":fb:chat:conversation:message-group\": {\n                __m: \"m_0_35\"\n            },\n            \":fb:chat:conversation:message:undertext\": {\n                __m: \"m_0_36\"\n            },\n            \":fb:chat:tab:selector:item\": {\n                __m: \"m_0_37\"\n            },\n            \":fb:mercury:chat:message:forward\": {\n                __m: \"m_0_38\"\n            },\n            \":fb:chat:tab:selector\": {\n                __m: \"m_0_39\"\n            },\n            \":fb:mercury:chat:multichat-tooltip-item\": {\n                __m: \"m_0_3a\"\n            },\n            \":fb:chat:conversation:date-break\": {\n                __m: \"m_0_3b\"\n            },\n            \":fb:mercury:call:tour\": {\n                __m: \"m_0_3c\"\n            },\n            \":fb:mercury:chat:tab-sheet:message-icon-sheet\": {\n                __m: \"m_0_3d\"\n            },\n            \":fb:mercury:chat:tab-sheet:clickable-message-icon-sheet\": {\n                __m: \"m_0_3e\"\n            },\n            \":fb:mercury:chat:tab-sheet:user-blocked\": {\n                __m: \"m_0_3f\"\n            },\n            \":fb:chat:conversation:message:subject\": {\n                __m: \"m_0_3g\"\n            },\n            \":fb:mercury:chat:tab-sheet:add-friends-empty-tab\": {\n                __m: \"m_0_3h\"\n            },\n            \":fb:mercury:chat:multichat-tab\": {\n                __m: \"m_0_3i\"\n            },\n            \":fb:mercury:chat:tab-sheet:name-conversation\": {\n                __m: \"m_0_3j\"\n            },\n            \":fb:chat:conversation:message\": {\n                __m: \"m_0_3k\"\n            },\n            \":fb:mercury:call:promo\": {\n                __m: \"m_0_3l\"\n            },\n            \":fb:mercury:chat:tab-sheet:add-friends\": {\n                __m: \"m_0_3m\"\n            },\n            \":fb:chat:conversation:message:status\": {\n                __m: \"m_0_3n\"\n            },\n            \":fb:mercury:chat:tab-sheet:message-mute-sheet\": {\n                __m: \"m_0_3o\"\n            },\n            \":fb:mercury:typing-indicator:typing\": {\n                __m: \"m_0_3p\"\n            },\n            \":fb:mercury:timestamp\": {\n                __m: \"m_0_3q\"\n            },\n            \":fb:mercury:chat:user-tab\": {\n                __m: \"m_0_3r\"\n            }\n        },15,],[\"VideoCallTemplates\",[\"m_0_3s\",],{\n            \":fb:videocall:incoming-dialog\": {\n                __m: \"m_0_3s\"\n            }\n        },74,],[\"MercuryTypeaheadTemplates\",[\"m_0_3t\",\"m_0_3u\",\"m_0_3v\",\"m_0_3w\",],{\n            \":fb:mercury:tokenizer\": {\n                __m: \"m_0_3t\"\n            },\n            \":fb:mercury:typeahead:header\": {\n                __m: \"m_0_3u\"\n            },\n            \":fb:mercury:typeahead\": {\n                __m: \"m_0_3v\"\n            },\n            \":fb:mercury:typeahead:result\": {\n                __m: \"m_0_3w\"\n            }\n        },43,],],\n        elements: [[\"m_0_27\",\"u_0_10\",2,],[\"m_0_29\",\"u_0_11\",2,],[\"m_0_2a\",\"u_0_12\",2,],[\"m_0_2b\",\"fbDockChatBuddylistNub\",2,],[\"m_0_2g\",\"u_0_14\",2,],[\"m_0_2h\",\"u_0_15\",2,],[\"m_0_2f\",\"u_0_16\",4,],[\"m_0_2j\",\"u_0_17\",2,],[\"m_0_2n\",\"u_0_19\",2,],[\"m_0_28\",\"u_0_1a\",2,],[\"m_0_4o\",\"u_0_1f\",2,\"m_0_4m\",],[\"m_0_4n\",\"u_0_1g\",2,\"m_0_4m\",],[\"m_0_4r\",\"u_0_1h\",2,\"m_0_4p\",],[\"m_0_4q\",\"u_0_1i\",4,\"m_0_4p\",],[\"m_0_53\",\"u_0_1m\",2,\"m_0_51\",],[\"m_0_52\",\"u_0_1n\",2,\"m_0_51\",],],\n        markup: [[\"m_0_2m\",{\n            __html: \"\\u003Cdiv class=\\\"uiContextualDialogPositioner\\\" id=\\\"u_0_18\\\" data-position=\\\"left\\\"\\u003E\\u003Cdiv class=\\\"uiOverlay uiContextualDialog\\\" data-width=\\\"300\\\" data-destroyonhide=\\\"false\\\" data-fadeonhide=\\\"false\\\"\\u003E\\u003Cdiv class=\\\"uiOverlayContent\\\"\\u003E\\u003Cdiv class=\\\"uiContextualDialogContent\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_2q\",{\n            __html: \"\\u003Cli class=\\\"_42fz\\\"\\u003E\\u003Ca class=\\\"clearfix _50zw\\\" data-jsid=\\\"anchor\\\" href=\\\"#\\\" role=\\\"\\\" rel=\\\"ignore\\\"\\u003E\\u003Cdiv class=\\\"_54sk _42g2\\\" data-jsid=\\\"favorite_button\\\"\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"pic_container\\\"\\u003E\\u003Cimg class=\\\"pic img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y4/r/-PAXP-deijE.gif\\\" data-jsid=\\\"profile-photo\\\" alt=\\\"\\\" width=\\\"1\\\" height=\\\"1\\\" /\\u003E\\u003C/div\\u003E\\u003Cimg class=\\\"_54sp _42i1 img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yW/r/F7kk7-cjEKk.png\\\" alt=\\\"\\\" width=\\\"10\\\" height=\\\"8\\\" /\\u003E\\u003Cdiv class=\\\"clearfix\\\"\\u003E\\u003Cdiv class=\\\"rfloat\\\"\\u003E\\u003Cspan data-jsid=\\\"accessible-name\\\" class=\\\"accessible_elem\\\"\\u003E\\u003C/span\\u003E\\u003Cdiv class=\\\"icon_container\\\"\\u003E\\u003Cimg class=\\\"_d3c icon img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y4/r/-PAXP-deijE.gif\\\" alt=\\\"\\\" width=\\\"1\\\" height=\\\"1\\\" /\\u003E\\u003Cdiv class=\\\"active_time icon\\\"\\u003E\\u003C/div\\u003E\\u003Cimg class=\\\"status icon img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y4/r/-PAXP-deijE.gif\\\" alt=\\\"\\\" width=\\\"1\\\" height=\\\"1\\\" /\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv aria-hidden=\\\"true\\\"\\u003E\\u003Cdiv class=\\\"_52zl\\\" data-jsid=\\\"name\\\"\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"_52zk\\\" data-jsid=\\\"context\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/a\\u003E\\u003C/li\\u003E\"\n        },2,],[\"m_0_2r\",{\n            __html: \"\\u003Cli\\u003E\\u003Cdiv class=\\\"phs fcg\\\"\\u003E\\u003Cspan data-jsid=\\\"message\\\"\\u003ELoading...\\u003C/span\\u003E\\u003C/div\\u003E\\u003C/li\\u003E\"\n        },2,],[\"m_0_3x\",{\n            __html: \"\\u003Cimg class=\\\"hidden_elem _1sk7 img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yk/r/LOOn0JtHNzb.gif\\\" alt=\\\"\\\" width=\\\"16\\\" height=\\\"16\\\" /\\u003E\"\n        },2,],[\"m_0_3y\",{\n            __html: \"\\u003Cdiv class=\\\"mtm pam _4_wc attachment uiBoxGray\\\"\\u003E\\u003Cspan class=\\\"uiIconText MercuryThreadlistIconError\\\" data-jsid=\\\"error\\\"\\u003E\\u003Ci class=\\\"img sp_4p6kmz sx_25310e\\\"\\u003E\\u003C/i\\u003E\\u003C/span\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_3z\",{\n            __html: \"\\u003Cdiv class=\\\"_59go\\\"\\u003E\\u003Ca class=\\\"uiVideoThumb videoPreview\\\" href=\\\"#\\\" data-jsid=\\\"thumb\\\" role=\\\"button\\\"\\u003E\\u003Cimg class=\\\"img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y4/r/-PAXP-deijE.gif\\\" alt=\\\"\\\" /\\u003E\\u003Ci\\u003E\\u003C/i\\u003E\\u003C/a\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_40\",{\n            __html: \"\\u003Cdiv class=\\\"_59go _59gq\\\"\\u003E\\u003Cspan class=\\\"uiIconText _3tn\\\"\\u003E\\u003Ci class=\\\"img sp_2gr8ms sx_d68978\\\"\\u003E\\u003C/i\\u003E\\u003Cspan data-jsid=\\\"filename\\\" class=\\\"filename\\\"\\u003E\\u003C/span\\u003E\\u003C/span\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_41\",{\n            __html: \"\\u003Cdiv class=\\\"_59go\\\"\\u003E\\u003Cdiv class=\\\"clearfix MercuryExternalLink\\\"\\u003E\\u003Cdiv class=\\\"_rpb clearfix stat_elem lfloat\\\" data-jsid=\\\"preview\\\"\\u003E\\u003Ca class=\\\"_ksh\\\" data-jsid=\\\"image-link\\\" href=\\\"#\\\" target=\\\"_blank\\\" role=\\\"button\\\"\\u003E\\u003Cimg data-jsid=\\\"preview-image\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yw/r/drP8vlvSl_8.gif\\\" /\\u003E\\u003C/a\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"MercuryLinkRight rfloat\\\"\\u003E\\u003Cdiv class=\\\"MercuryLinkTitle\\\"\\u003E\\u003Ca class=\\\"linkTitle\\\" target=\\\"_blank\\\" href=\\\"#\\\" data-jsid=\\\"name\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"fsm fwn fcg\\\" data-jsid=\\\"shortLink\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_42\",{\n            __html: \"\\u003Cdiv class=\\\"musicAttachment\\\"\\u003E\\u003Cdiv class=\\\"_59go _59gq\\\" data-jsid=\\\"icon_link\\\"\\u003E\\u003Ca class=\\\"uiIconText _3tn\\\" href=\\\"#\\\" data-jsid=\\\"link\\\" role=\\\"button\\\"\\u003E\\u003Ci class=\\\"img sp_2gr8ms sx_d68978\\\"\\u003E\\u003C/i\\u003E\\u003Cspan data-jsid=\\\"filename\\\" class=\\\"_59gp\\\"\\u003E\\u003C/span\\u003E\\u003C/a\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"_rpb clearfix stat_elem\\\" data-jsid=\\\"preview\\\"\\u003E\\u003Ca class=\\\"_ksh\\\" data-jsid=\\\"image-link\\\" href=\\\"#\\\" target=\\\"_blank\\\" role=\\\"button\\\"\\u003E\\u003Cimg data-jsid=\\\"preview-image\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yw/r/drP8vlvSl_8.gif\\\" /\\u003E\\u003C/a\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_43\",{\n            __html: \"\\u003Cdiv class=\\\"_59go _59gq\\\"\\u003E\\u003Ca class=\\\"uiIconText _3tn\\\" href=\\\"#\\\" data-jsid=\\\"link\\\" role=\\\"button\\\"\\u003E\\u003Ci class=\\\"img sp_2gr8ms sx_d68978\\\"\\u003E\\u003C/i\\u003E\\u003Cspan data-jsid=\\\"filename\\\" class=\\\"_59gp\\\"\\u003E\\u003C/span\\u003E\\u003C/a\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_44\",{\n            __html: \"\\u003Cdiv class=\\\"_rpb clearfix stat_elem\\\"\\u003E\\u003Ca class=\\\"_ksh\\\" data-jsid=\\\"image-link\\\" href=\\\"#\\\" target=\\\"_blank\\\" role=\\\"button\\\"\\u003E\\u003Cimg data-jsid=\\\"preview-image\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yw/r/drP8vlvSl_8.gif\\\" /\\u003E\\u003C/a\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_45\",{\n            __html: \"\\u003Cdiv class=\\\"_59go\\\"\\u003E\\u003Ca data-jsid=\\\"link\\\" target=\\\"_blank\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003Cspan data-jsid=\\\"name\\\"\\u003E\\u003C/span\\u003E\\u003C/a\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_46\",{\n            __html: \"\\u003Cdiv class=\\\"_2qh _2qe uploadFileRow\\\"\\u003E\\u003Cimg class=\\\"_2qf img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yb/r/GsNJNwuI-UM.gif\\\" alt=\\\"\\\" width=\\\"16\\\" height=\\\"11\\\" /\\u003E\\u003Clabel class=\\\"_2qg uiCloseButton uiCloseButtonSmall uiCloseButtonSmallDark\\\" for=\\\"u_0_1b\\\"\\u003E\\u003Cinput title=\\\"Remove\\\" type=\\\"button\\\" data-jsid=\\\"closeFileUpload\\\" id=\\\"u_0_1b\\\" /\\u003E\\u003C/label\\u003E\\u003Cdiv class=\\\"_4-te\\\"\\u003E\\u003Cspan class=\\\"uiIconText _3tn\\\" data-jsid=\\\"iconText\\\"\\u003E\\u003Ci class=\\\"img sp_2gr8ms sx_d68978\\\"\\u003E\\u003C/i\\u003E\\u003C/span\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_47\",{\n            __html: \"\\u003Cdiv class=\\\"_59go _59gq\\\"\\u003E\\u003Cdiv class=\\\"_59gs\\\"\\u003E\\u003Cdiv data-jsid=\\\"openLinkContainer\\\" class=\\\"_59gr hidden_elem\\\"\\u003E\\u003Ca class=\\\"_59hm\\\" href=\\\"#\\\" data-jsid=\\\"openFile\\\" role=\\\"button\\\"\\u003Eopen\\u003C/a\\u003E \\u00b7 \\u003C/div\\u003E\\u003Ca class=\\\"_59hn\\\" href=\\\"#\\\" data-jsid=\\\"downloadFile\\\" role=\\\"button\\\"\\u003Edownload\\u003C/a\\u003E\\u003C/div\\u003E\\u003Ca class=\\\"uiIconText _3tn\\\" href=\\\"#\\\" data-jsid=\\\"link\\\" role=\\\"button\\\"\\u003E\\u003Ci class=\\\"img sp_2gr8ms sx_d68978\\\"\\u003E\\u003C/i\\u003E\\u003Cspan class=\\\"_59gp\\\" data-jsid=\\\"filename\\\"\\u003E\\u003C/span\\u003E\\u003C/a\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_48\",{\n            __html: \"\\u003Cdiv class=\\\"mhs mbs pts fbChatConvItem _511o clearfix\\\"\\u003E\\u003Cdiv class=\\\"_1_vw\\\"\\u003E\\u003Cimg class=\\\"_1_vv img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y4/r/-PAXP-deijE.gif\\\" data-jsid=\\\"icon\\\" alt=\\\"\\\" width=\\\"1\\\" height=\\\"1\\\" /\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"_1_vx\\\"\\u003E\\u003Cspan class=\\\"_1_zk fsm fcg\\\" data-jsid=\\\"message\\\"\\u003E\\u003C/span\\u003E\\u003Cspan class=\\\"mls _1_vz fss fcg\\\" data-jsid=\\\"timestamp\\\"\\u003E\\u003C/span\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"_1_vy\\\" data-jsid=\\\"attachment\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_49\",{\n            __html: \"\\u003Cdiv class=\\\"mhs mbs pts fbChatConvItem _50dw clearfix small\\\"\\u003E\\u003Cdiv class=\\\"_50ke\\\"\\u003E\\u003Cdiv class=\\\"_50x5\\\" data-jsid=\\\"profileName\\\"\\u003E\\u003C/div\\u003E\\u003Ca class=\\\"profileLink\\\" href=\\\"#\\\" data-jsid=\\\"profileLink\\\" role=\\\"button\\\"\\u003E\\u003Cimg class=\\\"profilePhoto\\\" src=\\\"/images/spacer.gif\\\" data-jsid=\\\"profilePhoto\\\" /\\u003E\\u003C/a\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"messages\\\" data-jsid=\\\"messages\\\"\\u003E\\u003Cdiv class=\\\"metaInfoContainer fss fcg\\\"\\u003E\\u003Cspan data-jsid=\\\"reportLinkWithDot\\\" class=\\\"hidden_elem\\\"\\u003E\\u003Ca href=\\\"#\\\" rel=\\\"dialog\\\" data-jsid=\\\"reportLink\\\" role=\\\"button\\\"\\u003E\\u003Cspan class=\\\"fcg\\\"\\u003EReport\\u003C/span\\u003E\\u003C/a\\u003E \\u00b7 \\u003C/span\\u003E\\u003Cspan class=\\\"timestamp\\\" data-jsid=\\\"timestamp\\\"\\u003E\\u003C/span\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_4a\",{\n            __html: \"\\u003Cdiv\\u003E\\u003Cdiv data-jsid=\\\"message\\\"\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"_542e fwb fcg\\\" data-jsid=\\\"status\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_4b\",{\n            __html: \"\\u003Cli class=\\\"uiMenuItem _51ju\\\"\\u003E\\u003Ca class=\\\"itemAnchor\\\" role=\\\"menuitem\\\" tabindex=\\\"-1\\\" href=\\\"#\\\"\\u003E\\u003Cspan class=\\\"itemLabel fsm\\\"\\u003E\\u003Cdiv class=\\\"clearfix\\\"\\u003E\\u003Clabel class=\\\"rfloat uiCloseButton uiCloseButtonSmall\\\" for=\\\"u_0_1c\\\"\\u003E\\u003Cinput title=\\\"Remove\\\" type=\\\"button\\\" data-jsid=\\\"closeButton\\\" id=\\\"u_0_1c\\\" /\\u003E\\u003C/label\\u003E\\u003Cdiv class=\\\"_51jv\\\"\\u003E\\u003Cspan class=\\\"unreadCount\\\" data-jsid=\\\"unreadCount\\\"\\u003E\\u003C/span\\u003E\\u003Cspan data-jsid=\\\"content\\\"\\u003E\\u003C/span\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/span\\u003E\\u003C/a\\u003E\\u003C/li\\u003E\"\n        },2,],[\"m_0_4c\",{\n            __html: \"\\u003Cdiv\\u003E\\u003Ca class=\\\"uiIconText _52i4\\\" href=\\\"#\\\" style=\\\"padding-left: 12px;\\\" data-jsid=\\\"forwardLink\\\" role=\\\"button\\\"\\u003E\\u003Ci class=\\\"img sp_2gr8ms sx_8448dd\\\" style=\\\"top: 3px;\\\"\\u003E\\u003C/i\\u003E\\u003Cspan data-jsid=\\\"forwardText\\\"\\u003E\\u003C/span\\u003E\\u003C/a\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_4d\",{\n            __html: \"\\u003Cdiv class=\\\"uiToggle _50-v fbNub _51jt\\\"\\u003E\\u003Ca class=\\\"fbNubButton\\\" tabindex=\\\"0\\\" href=\\\"#\\\" rel=\\\"toggle\\\" role=\\\"button\\\"\\u003E\\u003Ci class=\\\"messagesIcon img sp_9kaae3 sx_ee64a9\\\"\\u003E\\u003C/i\\u003E\\u003Cspan data-jsid=\\\"numTabs\\\"\\u003E\\u003C/span\\u003E\\u003Cspan class=\\\"_51jw\\\" data-jsid=\\\"numMessages\\\"\\u003E\\u003C/span\\u003E\\u003C/a\\u003E\\u003Cdiv class=\\\"fbNubFlyout uiToggleFlyout noTitlebar\\\"\\u003E\\u003Cdiv class=\\\"fbNubFlyoutOuter\\\"\\u003E\\u003Cdiv class=\\\"fbNubFlyoutInner\\\"\\u003E\\u003Cdiv class=\\\"fbNubFlyoutBody scrollable\\\"\\u003E\\u003Cdiv class=\\\"fbNubFlyoutBodyContent\\\"\\u003E\\u003Cdiv role=\\\"menu\\\" class=\\\"uiMenu\\\" data-jsid=\\\"menu\\\"\\u003E\\u003Cul class=\\\"uiMenuInner\\\"\\u003E\\u003Cli class=\\\"uiMenuItem\\\" data-label=\\\"Dummy\\\"\\u003E\\u003Ca class=\\\"itemAnchor\\\" role=\\\"menuitem\\\" tabindex=\\\"0\\\" href=\\\"#\\\"\\u003E\\u003Cspan class=\\\"itemLabel fsm\\\"\\u003E Dummy \\u003C/span\\u003E\\u003C/a\\u003E\\u003C/li\\u003E\\u003C/ul\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_4e\",{\n            __html: \"\\u003Cdiv class=\\\"clearfix mvs\\\"\\u003E\\u003Ci class=\\\"rfloat img sp_9kaae3 sx_1dc182\\\" data-jsid=\\\"icon\\\"\\u003E\\u003C/i\\u003E\\u003Cdiv data-jsid=\\\"name\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_4f\",{\n            __html: \"\\u003Cdiv class=\\\"_511m mhs mbs fbChatConvItem\\\"\\u003E\\u003Cdiv class=\\\"_511n fss fwb fcg\\\" data-jsid=\\\"date\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_4g\",{\n            __html: \"\\u003Cdiv\\u003E\\u003Cdiv class=\\\"clearfix mvm mrm mll videoCallPromo\\\"\\u003E\\u003Ci class=\\\"_8o _8s lfloat img sp_2gr8ms sx_cd450f\\\"\\u003E\\u003C/i\\u003E\\u003Cdiv class=\\\"_42ef\\\"\\u003E\\u003Cdiv class=\\\"pls\\\"\\u003E\\u003Cspan class=\\\"calloutTitle fwb\\\"\\u003ETalk face to face\\u003C/span\\u003E\\u003Cdiv class=\\\"fsm fwn fcg\\\"\\u003EClick \\u003Cspan\\u003E ( \\u003Ci class=\\\"onlineStatusIcon img sp_2gr8ms sx_8e093b\\\"\\u003E\\u003C/i\\u003E )\\u003C/span\\u003E below to start a video call.\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"uiOverlayFooter uiContextualDialogFooter uiBoxGray topborder\\\"\\u003E\\u003Ctable class=\\\"uiGrid\\\" cellspacing=\\\"0\\\" cellpadding=\\\"0\\\"\\u003E\\u003Ctbody\\u003E\\u003Ctr\\u003E\\u003Ctd class=\\\"prs uiOverlayFooterMessage\\\"\\u003E\\u003Ca target=\\\"_blank\\\" href=\\\"/help/?page=177940565599960\\\"\\u003ELearn more\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"uiOverlayFooterButtons\\\"\\u003E\\u003Ca class=\\\"uiOverlayButton layerCancel uiButton uiButtonConfirm\\\" href=\\\"#\\\" role=\\\"button\\\" name=\\\"cancel\\\"\\u003E\\u003Cspan class=\\\"uiButtonText\\\"\\u003EOkay\\u003C/span\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003C/tr\\u003E\\u003C/tbody\\u003E\\u003C/table\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_4h\",{\n            __html: \"\\u003Cdiv class=\\\"pas\\\"\\u003E\\u003Ci class=\\\"mrs _1skc img sp_9kaae3 sx_ee64a9\\\" data-jsid=\\\"image\\\"\\u003E\\u003C/i\\u003E\\u003Cspan class=\\\"_1skd fcg\\\" data-jsid=\\\"text\\\"\\u003E\\u003C/span\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_4i\",{\n            __html: \"\\u003Ca href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003Cdiv class=\\\"pas\\\"\\u003E\\u003Ci class=\\\"mrs _1skc img sp_9kaae3 sx_ee64a9\\\" data-jsid=\\\"image\\\"\\u003E\\u003C/i\\u003E\\u003Cspan class=\\\"_1skd fcg\\\" data-jsid=\\\"text\\\"\\u003E\\u003C/span\\u003E\\u003C/div\\u003E\\u003C/a\\u003E\"\n        },2,],[\"m_0_4j\",{\n            __html: \"\\u003Cdiv class=\\\"pas\\\"\\u003E\\u003Ci class=\\\"_1skc img sp_4p6kmz sx_c2c2e3\\\" data-jsid=\\\"image\\\"\\u003E\\u003C/i\\u003E\\u003Cdiv class=\\\"_1skd\\\"\\u003E\\u003Cspan class=\\\"fcg\\\" data-jsid=\\\"text\\\"\\u003E\\u003C/span\\u003E\\u003Cdiv\\u003E\\u003Ca href=\\\"#\\\" data-jsid=\\\"actionLink\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_4k\",{\n            __html: \"\\u003Cdiv class=\\\"fbChatMessageSubject fsm fwb\\\" data-jsid=\\\"messageSubject\\\"\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_4l\",{\n            __html: \"\\u003Cdiv class=\\\"_54_v\\\"\\u003E\\u003Ctable class=\\\"uiGrid\\\" cellspacing=\\\"0\\\" cellpadding=\\\"0\\\"\\u003E\\u003Ctbody\\u003E\\u003Ctr\\u003E\\u003Ctd class=\\\"vTop _54_x\\\"\\u003E\\u003Cspan class=\\\"fcg\\\"\\u003ETo:\\u003C/span\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"vTop _54_w\\\"\\u003E\\u003Cdiv data-jsid=\\\"participantsTypeahead\\\"\\u003E\\u003C/div\\u003E\\u003C/td\\u003E\\u003C/tr\\u003E\\u003C/tbody\\u003E\\u003C/table\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_4m\",{\n            __html: \"\\u003Cdiv class=\\\"fbNub _50-v _50mz _50m-\\\"\\u003E\\u003Ca class=\\\"fbNubButton\\\" tabindex=\\\"0\\\" href=\\\"#\\\" data-jsid=\\\"dockButton\\\" role=\\\"button\\\"\\u003E\\u003Cdiv class=\\\"clearfix fbChatTab\\\"\\u003E\\u003Cdiv class=\\\"funhouse rfloat\\\"\\u003E\\u003Cdiv class=\\\"close\\\" title=\\\"Close\\\" data-jsid=\\\"closeButton\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"wrapWrapper\\\"\\u003E\\u003Cdiv class=\\\"wrap\\\"\\u003E\\u003Cdiv class=\\\"name fwb\\\" data-jsid=\\\"name\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cspan class=\\\"_51jx hidden_elem\\\" data-jsid=\\\"numMessages\\\"\\u003E0\\u003C/span\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/a\\u003E\\u003Cdiv class=\\\"fbNubFlyout fbDockChatTabFlyout\\\" data-jsid=\\\"chatWrapper\\\" role=\\\"complementary\\\" aria-labelledby=\\\"u_0_1d\\\"\\u003E\\u003Cdiv class=\\\"fbNubFlyoutOuter\\\"\\u003E\\u003Cdiv class=\\\"fbNubFlyoutInner\\\"\\u003E\\u003Cdiv class=\\\"clearfix fbNubFlyoutTitlebar titlebar\\\" data-jsid=\\\"nubFlyoutTitlebar\\\"\\u003E\\u003Cdiv class=\\\"mls titlebarButtonWrapper rfloat\\\"\\u003E\\u003Ca data-hover=\\\"tooltip\\\" aria-label=\\\"Add more friends to chat\\\" data-tooltip-alignh=\\\"center\\\" class=\\\"addToThread button\\\" href=\\\"#\\\" data-jsid=\\\"addToThreadLink\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003Cdiv class=\\\"uiSelector inlineBlock _510p\\\" data-jsid=\\\"dropdown\\\"\\u003E\\u003Cdiv class=\\\"uiToggle wrap\\\"\\u003E\\u003Ca data-hover=\\\"tooltip\\\" aria-label=\\\"Options\\\" data-tooltip-alignh=\\\"center\\\" class=\\\"button uiSelectorButton\\\" href=\\\"#\\\" role=\\\"button\\\" aria-haspopup=\\\"1\\\" rel=\\\"toggle\\\"\\u003E\\u003C/a\\u003E\\u003Cdiv class=\\\"uiSelectorMenuWrapper uiToggleFlyout\\\"\\u003E\\u003Cdiv role=\\\"menu\\\" class=\\\"uiMenu uiSelectorMenu\\\"\\u003E\\u003Cul class=\\\"uiMenuInner\\\"\\u003E\\u003Cli class=\\\"uiMenuItem\\\" data-label=\\\"See Full Conversation\\\"\\u003E\\u003Ca class=\\\"itemAnchor\\\" role=\\\"menuitem\\\" tabindex=\\\"0\\\" href=\\\"#\\\" data-jsid=\\\"conversationLink\\\"\\u003E\\u003Cspan class=\\\"itemLabel fsm\\\"\\u003ESee Full Conversation\\u003C/span\\u003E\\u003C/a\\u003E\\u003C/li\\u003E\\u003Cli class=\\\"uiMenuItem\\\"\\u003E\\u003Cform data-jsid=\\\"attachButtonForm\\\" action=\\\"http://jsbngssl.attachments.facebook.com/ajax/mercury/upload.php\\\" method=\\\"post\\\" onsubmit=\\\"return window.Event &amp;&amp; Event.__inlineSubmit &amp;&amp; Event.__inlineSubmit(this,event)\\\" id=\\\"u_0_1f\\\"\\u003E\\u003Cinput type=\\\"hidden\\\" name=\\\"fb_dtsg\\\" value=\\\"AQCttlPQ\\\" autocomplete=\\\"off\\\" /\\u003E\\u003Cinput type=\\\"hidden\\\" autocomplete=\\\"off\\\" data-jsid=\\\"attachID\\\" name=\\\"attach_id\\\" /\\u003E\\u003Cinput type=\\\"hidden\\\" autocomplete=\\\"off\\\" name=\\\"store_as_message_image\\\" value=\\\"0\\\" /\\u003E\\u003Cdiv class=\\\"_6a _m _4q60 itemLabel\\\"\\u003E\\u003Cinput type=\\\"file\\\" class=\\\"_n\\\" name=\\\"attachment[]\\\" multiple=\\\"1\\\" data-jsid=\\\"fileInput\\\" /\\u003E\\u003Ca class=\\\"_4q61 itemAnchor\\\"\\u003EAdd Files...\\u003C/a\\u003E\\u003C/div\\u003E\\u003C/form\\u003E\\u003C/li\\u003E\\u003Cli class=\\\"uiMenuItem\\\" data-label=\\\"Add Friends to Chat...\\\"\\u003E\\u003Ca class=\\\"itemAnchor\\\" role=\\\"menuitem\\\" tabindex=\\\"-1\\\" href=\\\"#\\\" data-jsid=\\\"addFriendLink\\\"\\u003E\\u003Cspan class=\\\"itemLabel fsm\\\"\\u003EAdd Friends to Chat...\\u003C/span\\u003E\\u003C/a\\u003E\\u003C/li\\u003E\\u003Cli class=\\\"uiMenuItem\\\" data-label=\\\"Edit Conversation Name\\\"\\u003E\\u003Ca class=\\\"itemAnchor\\\" role=\\\"menuitem\\\" tabindex=\\\"-1\\\" href=\\\"#\\\" data-jsid=\\\"nameConversationLink\\\"\\u003E\\u003Cspan class=\\\"itemLabel fsm\\\"\\u003EEdit Conversation Name\\u003C/span\\u003E\\u003C/a\\u003E\\u003C/li\\u003E\\u003Cli class=\\\"uiMenuSeparator\\\"\\u003E\\u003C/li\\u003E\\u003Cli class=\\\"uiMenuItem hidden_elem\\\" data-label=\\\"Mute Conversation\\\"\\u003E\\u003Ca class=\\\"itemAnchor\\\" role=\\\"menuitem\\\" tabindex=\\\"-1\\\" href=\\\"#\\\" data-jsid=\\\"muteThreadLink\\\"\\u003E\\u003Cspan class=\\\"itemLabel fsm\\\"\\u003EMute Conversation\\u003C/span\\u003E\\u003C/a\\u003E\\u003C/li\\u003E\\u003Cli class=\\\"uiMenuItem hidden_elem\\\" data-label=\\\"Unmute Conversation\\\"\\u003E\\u003Ca class=\\\"itemAnchor\\\" role=\\\"menuitem\\\" tabindex=\\\"-1\\\" href=\\\"#\\\" data-jsid=\\\"unmuteThreadLink\\\"\\u003E\\u003Cspan class=\\\"itemLabel fsm\\\"\\u003EUnmute Conversation\\u003C/span\\u003E\\u003C/a\\u003E\\u003C/li\\u003E\\u003Cli class=\\\"uiMenuItem\\\" data-label=\\\"Leave Conversation...\\\"\\u003E\\u003Ca class=\\\"itemAnchor\\\" role=\\\"menuitem\\\" tabindex=\\\"-1\\\" href=\\\"#\\\" data-jsid=\\\"unsubscribeLink\\\"\\u003E\\u003Cspan class=\\\"itemLabel fsm\\\"\\u003ELeave Conversation...\\u003C/span\\u003E\\u003C/a\\u003E\\u003C/li\\u003E\\u003C/ul\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Ca class=\\\"close button\\\" href=\\\"#\\\" data-jsid=\\\"titlebarCloseButton\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"titlebarLabel clearfix\\\"\\u003E\\u003Ch4 class=\\\"titlebarTextWrapper\\\"\\u003E\\u003Cimg class=\\\"_51sn img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y4/r/-PAXP-deijE.gif\\\" data-jsid=\\\"presenceIndicator\\\" alt=\\\"\\\" width=\\\"1\\\" height=\\\"1\\\" /\\u003E\\u003Ca class=\\\"titlebarText noLink\\\" href=\\\"#\\\" rel=\\\"none\\\" data-jsid=\\\"titlebarText\\\" aria-level=\\\"3\\\" id=\\\"u_0_1d\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/h4\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"fbNubFlyoutHeader\\\"\\u003E\\u003Cdiv class=\\\"_1sk5\\\"\\u003E\\u003Cdiv class=\\\"_1sk6 hidden_elem\\\" data-jsid=\\\"sheet\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"fbNubFlyoutBody scrollable\\\" data-jsid=\\\"chatConv\\\"\\u003E\\u003Cdiv class=\\\"fbNubFlyoutBodyContent\\\"\\u003E\\u003Ctable class=\\\"uiGrid conversationContainer\\\" cellspacing=\\\"0\\\" cellpadding=\\\"0\\\" role=\\\"log\\\"\\u003E\\u003Ctbody\\u003E\\u003Ctr\\u003E\\u003Ctd class=\\\"vBot\\\"\\u003E\\u003Cdiv class=\\\"accessible_elem\\\"\\u003EChat Conversation Start\\u003C/div\\u003E\\u003Cimg class=\\\"pvm loading hidden_elem img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yb/r/GsNJNwuI-UM.gif\\\" alt=\\\"\\\" data-jsid=\\\"loadingIndicator\\\" width=\\\"16\\\" height=\\\"11\\\" /\\u003E\\u003Cdiv class=\\\"conversation\\\" aria-live=\\\"polite\\\" aria-atomic=\\\"false\\\" data-jsid=\\\"conversation\\\" id=\\\"u_0_1e\\\"\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"accessible_elem\\\"\\u003EChat Conversation End\\u003C/div\\u003E\\u003Cdiv class=\\\"_51lq\\\" data-jsid=\\\"typingIndicator\\\"\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"_510g\\\" data-jsid=\\\"lastMessageIndicator\\\"\\u003E\\u003Cdiv class=\\\"_510h\\\"\\u003E\\u003C/div\\u003E\\u003Cspan class=\\\"_510f\\\"\\u003E\\u003C/span\\u003E\\u003C/div\\u003E\\u003C/td\\u003E\\u003C/tr\\u003E\\u003C/tbody\\u003E\\u003C/table\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"fbNubFlyoutFooter\\\"\\u003E\\u003Cdiv class=\\\"_552h\\\" data-jsid=\\\"inputContainer\\\"\\u003E\\u003Ctextarea class=\\\"uiTextareaAutogrow _552m\\\" data-jsid=\\\"input\\\" aria-controls=\\\"u_0_1e\\\" onkeydown=\\\"window.Bootloader &amp;&amp; Bootloader.loadComponents([&quot;control-textarea&quot;], function() &#123; TextAreaControl.getInstance(this) &#125;.bind(this)); \\\"\\u003E\\u003C/textarea\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"_552n\\\" data-jsid=\\\"iconsContainer\\\"\\u003E\\u003Cform class=\\\"_552o\\\" data-jsid=\\\"photoAttachButtonForm\\\" action=\\\"http://jsbngssl.attachments.facebook.com/ajax/mercury/upload.php\\\" method=\\\"post\\\" onsubmit=\\\"return window.Event &amp;&amp; Event.__inlineSubmit &amp;&amp; Event.__inlineSubmit(this,event)\\\" id=\\\"u_0_1g\\\"\\u003E\\u003Cinput type=\\\"hidden\\\" name=\\\"fb_dtsg\\\" value=\\\"AQCttlPQ\\\" autocomplete=\\\"off\\\" /\\u003E\\u003Cinput type=\\\"hidden\\\" autocomplete=\\\"off\\\" data-jsid=\\\"photoAttachID\\\" name=\\\"attach_id\\\" /\\u003E\\u003Cinput type=\\\"hidden\\\" autocomplete=\\\"off\\\" name=\\\"store_as_message_image\\\" value=\\\"1\\\" /\\u003E\\u003Cdiv class=\\\"_6a _m _4q60\\\"\\u003E\\u003Cinput type=\\\"file\\\" class=\\\"_n\\\" name=\\\"attachment[]\\\" multiple=\\\"1\\\" data-jsid=\\\"photoFileInput\\\" accept=\\\"image/*\\\" /\\u003E\\u003Ca class=\\\"_4q61 _509v\\\" data-jsid=\\\"photoAttachLink\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003Cdiv class=\\\"_509w\\\"\\u003E\\u003C/div\\u003E\\u003C/a\\u003E\\u003C/div\\u003E\\u003C/form\\u003E\\u003Cdiv class=\\\"uiToggle emoticonsPanel\\\" data-jsid=\\\"emoticons\\\"\\u003E\\u003Ca class=\\\"emoteTogglerImg _5bvk\\\" aria-label=\\\"Choose an emoticon\\\" href=\\\"#\\\" rel=\\\"toggle\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003Cdiv class=\\\"panelFlyout _590j uiToggleFlyout\\\"\\u003E\\u003Cdiv data-jsid=\\\"stickers\\\"\\u003E\\u003Cdiv class=\\\"_5906\\\"\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"_5907\\\"\\u003E\\u003Cdiv class=\\\"_55bq hidden_elem\\\" data-id=\\\"emoticons\\\"\\u003E\\u003Ctable class=\\\"emoticonsTable\\\"\\u003E\\u003Ctbody\\u003E\\u003Ctr\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_smile\\\" aria-label=\\\"smile\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_frown\\\" aria-label=\\\"frown\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_tongue\\\" aria-label=\\\"tongue\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_grin\\\" aria-label=\\\"grin\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_gasp\\\" aria-label=\\\"gasp\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_wink\\\" aria-label=\\\"wink\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_pacman\\\" aria-label=\\\"pacman\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003C/tr\\u003E\\u003Ctr\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_grumpy\\\" aria-label=\\\"grumpy\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_unsure\\\" aria-label=\\\"unsure\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_cry\\\" aria-label=\\\"cry\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_kiki\\\" aria-label=\\\"kiki\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_glasses\\\" aria-label=\\\"glasses\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_sunglasses\\\" aria-label=\\\"sunglasses\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_heart\\\" aria-label=\\\"heart\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003C/tr\\u003E\\u003Ctr\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_devil\\\" aria-label=\\\"devil\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_angel\\\" aria-label=\\\"angel\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_squint\\\" aria-label=\\\"squint\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_confused\\\" aria-label=\\\"confused\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_upset\\\" aria-label=\\\"upset\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_colonthree\\\" aria-label=\\\"colonthree\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_like\\\" aria-label=\\\"like\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003C/tr\\u003E\\u003C/tbody\\u003E\\u003C/table\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"panelFlyoutArrow\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"fbNubFlyoutAttachments\\\"\\u003E\\u003Cdiv class=\\\"chatAttachmentShelf\\\" data-jsid=\\\"attachmentShelf\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },4,],[\"m_0_4p\",{\n            __html: \"\\u003Cdiv class=\\\"_56jk\\\"\\u003E\\u003Ctable class=\\\"uiGrid\\\" cellspacing=\\\"0\\\" cellpadding=\\\"0\\\"\\u003E\\u003Ctbody\\u003E\\u003Ctr\\u003E\\u003Ctd class=\\\"vTop _56jl\\\"\\u003E\\u003Cdiv class=\\\"uiTypeahead\\\" id=\\\"u_0_1h\\\"\\u003E\\u003Cdiv class=\\\"wrap\\\"\\u003E\\u003Cinput type=\\\"hidden\\\" autocomplete=\\\"off\\\" class=\\\"hiddenInput\\\" /\\u003E\\u003Cdiv class=\\\"innerWrap\\\"\\u003E\\u003Cinput type=\\\"text\\\" class=\\\"inputtext textInput DOMControl_placeholder\\\" data-jsid=\\\"nameInput\\\" placeholder=\\\"Name this group\\\" autocomplete=\\\"off\\\" aria-autocomplete=\\\"list\\\" aria-expanded=\\\"false\\\" aria-owns=\\\"typeahead_list_u_0_1h\\\" role=\\\"combobox\\\" spellcheck=\\\"false\\\" value=\\\"Name this group\\\" aria-label=\\\"Name this group\\\" id=\\\"u_0_1i\\\" /\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"vTop\\\"\\u003E\\u003Cbutton value=\\\"1\\\" class=\\\"_42ft _42fu selected _42g-\\\" data-jsid=\\\"doneButton\\\" type=\\\"submit\\\"\\u003EDone\\u003C/button\\u003E\\u003C/td\\u003E\\u003C/tr\\u003E\\u003C/tbody\\u003E\\u003C/table\\u003E\\u003C/div\\u003E\"\n        },4,],[\"m_0_4u\",{\n            __html: \"\\u003Cdiv class=\\\"_kso fsm\\\" data-jsid=\\\"message\\\"\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_4v\",{\n            __html: \"\\u003Cdiv\\u003E\\u003Cdiv class=\\\"clearfix mvm mrm mll videoCallPromo\\\"\\u003E\\u003Ci class=\\\"_8o _8s lfloat img sp_2gr8ms sx_cd450f\\\"\\u003E\\u003C/i\\u003E\\u003Cdiv class=\\\"_42ef\\\"\\u003E\\u003Cdiv class=\\\"pls\\\"\\u003E\\u003Cspan class=\\\"calloutTitle fwb\\\"\\u003ETry talking face to face\\u003C/span\\u003E\\u003Cdiv class=\\\"fsm fwn fcg\\\"\\u003EClick \\u003Cspan\\u003E ( \\u003Ci class=\\\"onlineStatusIcon img sp_2gr8ms sx_8e093b\\\"\\u003E\\u003C/i\\u003E )\\u003C/span\\u003E below to start a video call.\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"uiOverlayFooter uiContextualDialogFooter uiBoxGray topborder\\\"\\u003E\\u003Ctable class=\\\"uiGrid\\\" cellspacing=\\\"0\\\" cellpadding=\\\"0\\\"\\u003E\\u003Ctbody\\u003E\\u003Ctr\\u003E\\u003Ctd class=\\\"prs uiOverlayFooterMessage\\\"\\u003E\\u003Ca target=\\\"_blank\\\" href=\\\"/help/?page=177940565599960\\\"\\u003ELearn more\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"uiOverlayFooterButtons\\\"\\u003E\\u003Ca class=\\\"uiOverlayButton layerCancel uiButton uiButtonConfirm\\\" href=\\\"#\\\" role=\\\"button\\\" name=\\\"cancel\\\"\\u003E\\u003Cspan class=\\\"uiButtonText\\\"\\u003EClose\\u003C/span\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003C/tr\\u003E\\u003C/tbody\\u003E\\u003C/table\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_4w\",{\n            __html: \"\\u003Cdiv class=\\\"_54_-\\\"\\u003E\\u003Ctable class=\\\"uiGrid\\\" cellspacing=\\\"0\\\" cellpadding=\\\"0\\\"\\u003E\\u003Ctbody\\u003E\\u003Ctr\\u003E\\u003Ctd class=\\\"vTop _54__\\\"\\u003E\\u003Cdiv data-jsid=\\\"participantsTypeahead\\\"\\u003E\\u003C/div\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"vTop\\\"\\u003E\\u003Clabel class=\\\"doneButton uiButton uiButtonConfirm\\\" for=\\\"u_0_1j\\\"\\u003E\\u003Cinput value=\\\"Done\\\" data-jsid=\\\"doneButton\\\" type=\\\"submit\\\" id=\\\"u_0_1j\\\" /\\u003E\\u003C/label\\u003E\\u003C/td\\u003E\\u003C/tr\\u003E\\u003C/tbody\\u003E\\u003C/table\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_4x\",{\n            __html: \"\\u003Cdiv class=\\\"_542q clearfix\\\"\\u003E\\u003Cdiv data-jsid=\\\"message\\\"\\u003E\\u003C/div\\u003E\\u003Cdiv data-jsid=\\\"status\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_4y\",{\n            __html: \"\\u003Cdiv class=\\\"pas\\\"\\u003E\\u003Cspan class=\\\"_1skd _1ske fcg\\\" data-jsid=\\\"text\\\"\\u003E\\u003C/span\\u003E\\u003Ca class=\\\"pas\\\" data-jsid=\\\"unmuteButton\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003EUnmute\\u003C/a\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_4z\",{\n            __html: \"\\u003Cdiv class=\\\"_510u\\\"\\u003E\\u003Cdiv class=\\\"_510v\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_50\",{\n            __html: \"\\u003Cabbr title=\\\"Wednesday, December 31, 1969 at 7:00pm\\\" data-utime=\\\"0\\\" class=\\\"hidden_elem timestamp\\\" data-jsid=\\\"timestamp\\\"\\u003Eover a year ago\\u003C/abbr\\u003E\"\n        },2,],[\"m_0_51\",{\n            __html: \"\\u003Cdiv class=\\\"fbNub _50-v _50mz _50m_\\\"\\u003E\\u003Ca class=\\\"fbNubButton\\\" tabindex=\\\"0\\\" href=\\\"#\\\" data-jsid=\\\"dockButton\\\" role=\\\"button\\\"\\u003E\\u003Cdiv class=\\\"clearfix fbChatTab\\\"\\u003E\\u003Cdiv class=\\\"funhouse rfloat\\\"\\u003E\\u003Cdiv class=\\\"close\\\" title=\\\"Close\\\" data-jsid=\\\"closeButton\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"wrapWrapper\\\"\\u003E\\u003Cdiv class=\\\"wrap\\\"\\u003E\\u003Cdiv class=\\\"name fwb\\\" data-jsid=\\\"name\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cspan class=\\\"_51jx hidden_elem\\\" data-jsid=\\\"numMessages\\\"\\u003E0\\u003C/span\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/a\\u003E\\u003Cdiv class=\\\"fbNubFlyout fbDockChatTabFlyout\\\" data-jsid=\\\"chatWrapper\\\" role=\\\"complementary\\\" aria-labelledby=\\\"u_0_1k\\\"\\u003E\\u003Cdiv class=\\\"fbNubFlyoutOuter\\\"\\u003E\\u003Cdiv class=\\\"fbNubFlyoutInner\\\"\\u003E\\u003Cdiv class=\\\"clearfix fbNubFlyoutTitlebar titlebar\\\" data-jsid=\\\"nubFlyoutTitlebar\\\"\\u003E\\u003Cdiv class=\\\"mls titlebarButtonWrapper rfloat\\\"\\u003E\\u003Ca data-hover=\\\"tooltip\\\" aria-label=\\\"Add more friends to chat\\\" class=\\\"addToThread button\\\" href=\\\"#\\\" data-jsid=\\\"addToThreadLink\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003Ca data-hover=\\\"tooltip\\\" aria-label=\\\"Start a video call\\\" class=\\\"videoicon button\\\" href=\\\"#\\\" data-jsid=\\\"videoCallLink\\\" data-gt=\\\"&#123;&quot;videochat&quot;:&quot;call_clicked_chat_tab&quot;&#125;\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003Cdiv class=\\\"uiSelector inlineBlock _510p\\\" data-jsid=\\\"dropdown\\\"\\u003E\\u003Cdiv class=\\\"uiToggle wrap\\\"\\u003E\\u003Ca data-hover=\\\"tooltip\\\" aria-label=\\\"Options\\\" data-tooltip-alignh=\\\"center\\\" class=\\\"button uiSelectorButton\\\" href=\\\"#\\\" role=\\\"button\\\" aria-haspopup=\\\"1\\\" rel=\\\"toggle\\\"\\u003E\\u003C/a\\u003E\\u003Cdiv class=\\\"uiSelectorMenuWrapper uiToggleFlyout\\\"\\u003E\\u003Cdiv role=\\\"menu\\\" class=\\\"uiMenu uiSelectorMenu\\\"\\u003E\\u003Cul class=\\\"uiMenuInner\\\"\\u003E\\u003Cli class=\\\"uiMenuItem\\\" tabindex=\\\"0\\\"\\u003E\\u003Cform data-jsid=\\\"attachButtonForm\\\" action=\\\"http://jsbngssl.attachments.facebook.com/ajax/mercury/upload.php\\\" method=\\\"post\\\" onsubmit=\\\"return window.Event &amp;&amp; Event.__inlineSubmit &amp;&amp; Event.__inlineSubmit(this,event)\\\" id=\\\"u_0_1m\\\"\\u003E\\u003Cinput type=\\\"hidden\\\" name=\\\"fb_dtsg\\\" value=\\\"AQCttlPQ\\\" autocomplete=\\\"off\\\" /\\u003E\\u003Cinput type=\\\"hidden\\\" autocomplete=\\\"off\\\" data-jsid=\\\"attachID\\\" name=\\\"attach_id\\\" /\\u003E\\u003Cinput type=\\\"hidden\\\" autocomplete=\\\"off\\\" name=\\\"store_as_message_image\\\" value=\\\"0\\\" /\\u003E\\u003Cdiv class=\\\"_6a _m _4q60 itemLabel\\\"\\u003E\\u003Cinput type=\\\"file\\\" class=\\\"_n\\\" name=\\\"attachment[]\\\" multiple=\\\"1\\\" data-jsid=\\\"fileInput\\\" /\\u003E\\u003Ca class=\\\"_4q61 itemAnchor\\\"\\u003EAdd Files...\\u003C/a\\u003E\\u003C/div\\u003E\\u003C/form\\u003E\\u003C/li\\u003E\\u003Cli class=\\\"uiMenuItem\\\" data-label=\\\"Add Friends to Chat...\\\"\\u003E\\u003Ca class=\\\"itemAnchor\\\" role=\\\"menuitem\\\" tabindex=\\\"-1\\\" href=\\\"#\\\" data-jsid=\\\"addFriendLink\\\"\\u003E\\u003Cspan class=\\\"itemLabel fsm\\\"\\u003EAdd Friends to Chat...\\u003C/span\\u003E\\u003C/a\\u003E\\u003C/li\\u003E\\u003Cli class=\\\"uiMenuItem\\\" data-label=\\\"\\\"\\u003E\\u003Ca class=\\\"itemAnchor\\\" role=\\\"menuitem\\\" tabindex=\\\"-1\\\" href=\\\"#\\\" data-jsid=\\\"privacyLink\\\"\\u003E\\u003Cspan class=\\\"itemLabel fsm\\\"\\u003E \\u003C/span\\u003E\\u003C/a\\u003E\\u003C/li\\u003E\\u003Cli class=\\\"uiMenuSeparator\\\"\\u003E\\u003C/li\\u003E\\u003Cli class=\\\"uiMenuItem\\\" data-label=\\\"See Full Conversation\\\"\\u003E\\u003Ca class=\\\"itemAnchor\\\" role=\\\"menuitem\\\" tabindex=\\\"-1\\\" href=\\\"#\\\" data-jsid=\\\"conversationLink\\\"\\u003E\\u003Cspan class=\\\"itemLabel fsm\\\"\\u003ESee Full Conversation\\u003C/span\\u003E\\u003C/a\\u003E\\u003C/li\\u003E\\u003Cli class=\\\"uiMenuItem hidden_elem\\\" data-label=\\\"Mute Conversation\\\"\\u003E\\u003Ca class=\\\"itemAnchor\\\" role=\\\"menuitem\\\" tabindex=\\\"-1\\\" href=\\\"#\\\" data-jsid=\\\"muteThreadLink\\\"\\u003E\\u003Cspan class=\\\"itemLabel fsm\\\"\\u003EMute Conversation\\u003C/span\\u003E\\u003C/a\\u003E\\u003C/li\\u003E\\u003Cli class=\\\"uiMenuItem hidden_elem\\\" data-label=\\\"Unmute Conversation\\\"\\u003E\\u003Ca class=\\\"itemAnchor\\\" role=\\\"menuitem\\\" tabindex=\\\"-1\\\" href=\\\"#\\\" data-jsid=\\\"unmuteThreadLink\\\"\\u003E\\u003Cspan class=\\\"itemLabel fsm\\\"\\u003EUnmute Conversation\\u003C/span\\u003E\\u003C/a\\u003E\\u003C/li\\u003E\\u003Cli class=\\\"uiMenuItem\\\" data-label=\\\"Clear Window\\\"\\u003E\\u003Ca class=\\\"itemAnchor\\\" role=\\\"menuitem\\\" tabindex=\\\"-1\\\" href=\\\"#\\\" data-jsid=\\\"clearWindowLink\\\"\\u003E\\u003Cspan class=\\\"itemLabel fsm\\\"\\u003EClear Window\\u003C/span\\u003E\\u003C/a\\u003E\\u003C/li\\u003E\\u003Cli class=\\\"uiMenuSeparator\\\"\\u003E\\u003C/li\\u003E\\u003Cli class=\\\"uiMenuItem\\\" data-label=\\\"Report as Spam or Abuse...\\\"\\u003E\\u003Ca class=\\\"itemAnchor\\\" role=\\\"menuitem\\\" tabindex=\\\"-1\\\" href=\\\"#\\\" data-jsid=\\\"reportSpamLink\\\"\\u003E\\u003Cspan class=\\\"itemLabel fsm\\\"\\u003EReport as Spam or Abuse...\\u003C/span\\u003E\\u003C/a\\u003E\\u003C/li\\u003E\\u003C/ul\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Ca class=\\\"close button\\\" href=\\\"#\\\" data-jsid=\\\"titlebarCloseButton\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"titlebarLabel clearfix\\\"\\u003E\\u003Ch4 class=\\\"titlebarTextWrapper\\\"\\u003E\\u003Cimg class=\\\"_51sn img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y4/r/-PAXP-deijE.gif\\\" data-jsid=\\\"presenceIndicator\\\" alt=\\\"\\\" width=\\\"1\\\" height=\\\"1\\\" /\\u003E\\u003Ca class=\\\"titlebarText noLink\\\" href=\\\"#\\\" rel=\\\"none\\\" data-jsid=\\\"titlebarText\\\" aria-level=\\\"3\\\" id=\\\"u_0_1k\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/h4\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"fbNubFlyoutHeader\\\"\\u003E\\u003Cdiv class=\\\"_1sk5\\\"\\u003E\\u003Cdiv class=\\\"_1sk6 hidden_elem\\\" data-jsid=\\\"sheet\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"fbNubFlyoutBody scrollable\\\" data-jsid=\\\"chatConv\\\"\\u003E\\u003Cdiv class=\\\"fbNubFlyoutBodyContent\\\"\\u003E\\u003Ctable class=\\\"uiGrid conversationContainer\\\" cellspacing=\\\"0\\\" cellpadding=\\\"0\\\" role=\\\"log\\\"\\u003E\\u003Ctbody\\u003E\\u003Ctr\\u003E\\u003Ctd class=\\\"vBot\\\"\\u003E\\u003Cdiv class=\\\"accessible_elem\\\"\\u003EChat Conversation Start\\u003C/div\\u003E\\u003Cimg class=\\\"pvm loading hidden_elem img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yb/r/GsNJNwuI-UM.gif\\\" alt=\\\"\\\" data-jsid=\\\"loadingIndicator\\\" width=\\\"16\\\" height=\\\"11\\\" /\\u003E\\u003Cdiv class=\\\"conversation\\\" aria-live=\\\"polite\\\" aria-atomic=\\\"false\\\" data-jsid=\\\"conversation\\\" id=\\\"u_0_1l\\\"\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"accessible_elem\\\"\\u003EChat Conversation End\\u003C/div\\u003E\\u003Cdiv class=\\\"_51lq\\\" data-jsid=\\\"typingIndicator\\\"\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"_510g\\\" data-jsid=\\\"lastMessageIndicator\\\"\\u003E\\u003Cdiv class=\\\"_510h\\\"\\u003E\\u003C/div\\u003E\\u003Cspan class=\\\"_510f\\\"\\u003E\\u003C/span\\u003E\\u003C/div\\u003E\\u003C/td\\u003E\\u003C/tr\\u003E\\u003C/tbody\\u003E\\u003C/table\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"fbNubFlyoutFooter\\\"\\u003E\\u003Cdiv class=\\\"_552h\\\" data-jsid=\\\"inputContainer\\\"\\u003E\\u003Ctextarea class=\\\"uiTextareaAutogrow _552m\\\" data-jsid=\\\"input\\\" aria-controls=\\\"u_0_1l\\\" onkeydown=\\\"window.Bootloader &amp;&amp; Bootloader.loadComponents([&quot;control-textarea&quot;], function() &#123; TextAreaControl.getInstance(this) &#125;.bind(this)); \\\"\\u003E\\u003C/textarea\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"_552n\\\" data-jsid=\\\"iconsContainer\\\"\\u003E\\u003Cform class=\\\"_552o\\\" data-jsid=\\\"photoAttachButtonForm\\\" action=\\\"http://jsbngssl.attachments.facebook.com/ajax/mercury/upload.php\\\" method=\\\"post\\\" onsubmit=\\\"return window.Event &amp;&amp; Event.__inlineSubmit &amp;&amp; Event.__inlineSubmit(this,event)\\\" id=\\\"u_0_1n\\\"\\u003E\\u003Cinput type=\\\"hidden\\\" name=\\\"fb_dtsg\\\" value=\\\"AQCttlPQ\\\" autocomplete=\\\"off\\\" /\\u003E\\u003Cinput type=\\\"hidden\\\" autocomplete=\\\"off\\\" data-jsid=\\\"photoAttachID\\\" name=\\\"attach_id\\\" /\\u003E\\u003Cinput type=\\\"hidden\\\" autocomplete=\\\"off\\\" name=\\\"store_as_message_image\\\" value=\\\"1\\\" /\\u003E\\u003Cdiv class=\\\"_6a _m _4q60\\\"\\u003E\\u003Cinput type=\\\"file\\\" class=\\\"_n\\\" name=\\\"attachment[]\\\" multiple=\\\"1\\\" data-jsid=\\\"photoFileInput\\\" accept=\\\"image/*\\\" /\\u003E\\u003Ca class=\\\"_4q61 _509v\\\" data-jsid=\\\"photoAttachLink\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003Cdiv class=\\\"_509w\\\"\\u003E\\u003C/div\\u003E\\u003C/a\\u003E\\u003C/div\\u003E\\u003C/form\\u003E\\u003Cdiv class=\\\"uiToggle emoticonsPanel\\\" data-jsid=\\\"emoticons\\\"\\u003E\\u003Ca class=\\\"emoteTogglerImg _5bvk\\\" aria-label=\\\"Choose an emoticon\\\" href=\\\"#\\\" rel=\\\"toggle\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003Cdiv class=\\\"panelFlyout _590j uiToggleFlyout\\\"\\u003E\\u003Cdiv data-jsid=\\\"stickers\\\"\\u003E\\u003Cdiv class=\\\"_5906\\\"\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"_5907\\\"\\u003E\\u003Cdiv class=\\\"_55bq hidden_elem\\\" data-id=\\\"emoticons\\\"\\u003E\\u003Ctable class=\\\"emoticonsTable\\\"\\u003E\\u003Ctbody\\u003E\\u003Ctr\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_smile\\\" aria-label=\\\"smile\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_frown\\\" aria-label=\\\"frown\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_tongue\\\" aria-label=\\\"tongue\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_grin\\\" aria-label=\\\"grin\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_gasp\\\" aria-label=\\\"gasp\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_wink\\\" aria-label=\\\"wink\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_pacman\\\" aria-label=\\\"pacman\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003C/tr\\u003E\\u003Ctr\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_grumpy\\\" aria-label=\\\"grumpy\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_unsure\\\" aria-label=\\\"unsure\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_cry\\\" aria-label=\\\"cry\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_kiki\\\" aria-label=\\\"kiki\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_glasses\\\" aria-label=\\\"glasses\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_sunglasses\\\" aria-label=\\\"sunglasses\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_heart\\\" aria-label=\\\"heart\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003C/tr\\u003E\\u003Ctr\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_devil\\\" aria-label=\\\"devil\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_angel\\\" aria-label=\\\"angel\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_squint\\\" aria-label=\\\"squint\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_confused\\\" aria-label=\\\"confused\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_upset\\\" aria-label=\\\"upset\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_colonthree\\\" aria-label=\\\"colonthree\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_like\\\" aria-label=\\\"like\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003C/tr\\u003E\\u003C/tbody\\u003E\\u003C/table\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"panelFlyoutArrow\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"fbNubFlyoutAttachments\\\"\\u003E\\u003Cdiv class=\\\"chatAttachmentShelf\\\" data-jsid=\\\"attachmentShelf\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },4,],[\"m_0_54\",{\n            __html: \"\\u003Cdiv class=\\\"clearfix\\\"\\u003E\\u003Cimg class=\\\"mrm _s0 _29h _29i _rw img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yw/r/drP8vlvSl_8.gif\\\" alt=\\\"\\\" data-jsid=\\\"profilePhoto\\\" width=\\\"1\\\" height=\\\"1\\\" /\\u003E\\u003Cdiv class=\\\"_29j _29k\\\"\\u003E\\u003Cdiv class=\\\"mbs fsl fwb fcb\\\" data-jsid=\\\"mainText\\\"\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"aux-message fcg\\\" data-jsid=\\\"auxMessage\\\"\\u003EVideo will start as soon as you answer.\\u003C/div\\u003E\\u003Cdiv class=\\\"mts hidden_elem fcg\\\" data-jsid=\\\"slowMessage\\\"\\u003E\\u003Cspan class=\\\"fwb fcb\\\"\\u003EHaving trouble?\\u003C/span\\u003E Your connection may be \\u003Ca href=\\\"/help/214265948627885\\\" target=\\\"_blank\\\"\\u003Etoo slow\\u003C/a\\u003E.\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_55\",{\n            __html: \"\\u003Cdiv class=\\\"clearfix uiTokenizer uiInlineTokenizer\\\"\\u003E\\u003Cdiv class=\\\"tokenarea hidden_elem\\\" data-jsid=\\\"tokenarea\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_56\",{\n            __html: \"\\u003Cli class=\\\"_2qm\\\"\\u003E\\u003Cdiv class=\\\"clearfix\\\"\\u003E\\u003Cdiv class=\\\"lfloat\\\"\\u003E\\u003Cspan data-jsid=\\\"text\\\"\\u003E\\u003C/span\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"rfloat\\\"\\u003E\\u003Cspan\\u003E\\u003Cimg class=\\\"_356 img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yb/r/GsNJNwuI-UM.gif\\\" alt=\\\"\\\" data-jsid=\\\"loadingSpinner\\\" width=\\\"16\\\" height=\\\"11\\\" /\\u003E\\u003Ca class=\\\"_357\\\" data-jsid=\\\"link\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/span\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/li\\u003E\"\n        },2,],[\"m_0_57\",{\n            __html: \"\\u003Cdiv class=\\\"uiTypeahead\\\"\\u003E\\u003Cdiv class=\\\"wrap\\\"\\u003E\\u003Cinput type=\\\"hidden\\\" autocomplete=\\\"off\\\" class=\\\"hiddenInput\\\" /\\u003E\\u003Cdiv class=\\\"innerWrap\\\"\\u003E\\u003Cinput type=\\\"text\\\" class=\\\"inputtext textInput\\\" data-jsid=\\\"textfield\\\" /\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_58\",{\n            __html: \"\\u003Cli class=\\\"_2qs\\\"\\u003E\\u003Cdiv class=\\\"clearfix pvs\\\"\\u003E\\u003Cdiv class=\\\"MercuryThreadImage mrm _3ks lfloat\\\" data-jsid=\\\"image\\\"\\u003E\\u003Cimg class=\\\"_s0 _rw img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yw/r/drP8vlvSl_8.gif\\\" /\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"_2qr\\\"\\u003E\\u003Cspan class=\\\"_2qn\\\" data-jsid=\\\"name\\\"\\u003E\\u003C/span\\u003E\\u003Cdiv class=\\\"_2qq fsm fwn fcg\\\" data-jsid=\\\"snippet\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/li\\u003E\"\n        },2,],]\n    },\n    css: [\"W3Ky6\",\"0duP3\",\"cy4a0\",],\n    bootloadable: {\n        \"legacy:control-textarea\": {\n            resources: [\"AyUu6\",\"LpC/l\",\"W3Ky6\",\"c1+nc\",]\n        },\n        VideoCallController: {\n            resources: [\"AyUu6\",\"AsDOA\",\"W3Ky6\",\"4qhP/\",\"OJTM4\",\"u//Ut\",\"brbS1\",\"EzMPG\",\"gMfWI\",\"bUzfU\",\"KPLqg\",],\n            \"module\": true\n        },\n        ErrorDialog: {\n            resources: [\"AyUu6\",\"W3Ky6\",\"AsDOA\",\"bUzfU\",],\n            \"module\": true\n        },\n        FBRTCCallController: {\n            resources: [\"AyUu6\",\"AsDOA\",\"W3Ky6\",\"4qhP/\",\"brbS1\",\"u//Ut\",\"OJTM4\",\"EzMPG\",\"gMfWI\",\"a3inZ\",\"KPLqg\",\"bUzfU\",\"LTaK/\",\"21lHn\",\"+h1d2\",\"9aS3c\",\"MfG6c\",\"LsRx/\",\"3h2ll\",\"Mzbs2\",\"wGXi/\",\"d6Evh\",\"6WF8S\",],\n            \"module\": true\n        }\n    },\n    resource_map: {\n        \"9aS3c\": {\n            type: \"css\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yO/r/OErByX4rRhh.css\"\n        },\n        Mzbs2: {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y7/r/sM5jkmon6X9.js\"\n        },\n        \"3h2ll\": {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yz/r/8nGweTPJCKZ.js\"\n        },\n        \"6WF8S\": {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/ya/r/cHaSy_1vFQu.js\"\n        },\n        \"4qhP/\": {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yv/r/tMfRnsOx-tg.js\"\n        },\n        \"LTaK/\": {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y_/r/3Z79JZzbt1o.js\"\n        },\n        KPLqg: {\n            type: \"css\",\n            permanent: 1,\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yq/r/UJCnyWz8q3r.css\"\n        },\n        \"wGXi/\": {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/ym/r/usnMgvD8abB.js\"\n        },\n        gMfWI: {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yY/r/YnJRD6K1VJA.js\"\n        },\n        \"c1+nc\": {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y1/r/3A9a-abDc5V.js\"\n        },\n        \"LsRx/\": {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yu/r/kS-r05X6OEA.js\"\n        },\n        a3inZ: {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yO/r/9ELMM-KdnsD.js\"\n        },\n        d6Evh: {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y2/r/jalUIRLBuTe.js\"\n        },\n        MfG6c: {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yS/r/eKDf9pXbovQ.js\"\n        },\n        \"21lHn\": {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yP/r/QylH5JvJ2tZ.js\"\n        }\n    },\n    ixData: {\n        \"/images/messaging/stickers/selector/leftarrow.png\": {\n            sprited: false,\n            uri: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yS/r/lM_ryP3lE-X.png\",\n            width: 20,\n            height: 20\n        },\n        \"/images/chat/sidebar/newGroupChatLitestand.png\": {\n            sprited: false,\n            uri: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yk/r/3hu9Ow1TVfb.png\",\n            width: 28,\n            height: 28\n        },\n        \"/images/litestand/sidebar/blended/new_group_chat.png\": {\n            sprited: false,\n            uri: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yg/r/I5ybuQbRjJE.png\",\n            width: 32,\n            height: 32\n        },\n        \"/images/chat/status/online.png\": {\n            sprited: true,\n            spriteMapCssClass: \"sp_9kaae3\",\n            spriteCssClass: \"sx_1dc182\"\n        },\n        \"/images/litestand/bookmarks/sidebar/remove.png\": {\n            sprited: true,\n            spriteMapCssClass: \"sp_9kaae3\",\n            spriteCssClass: \"sx_76e896\"\n        },\n        \"/images/litestand/sidebar/blended/online.png\": {\n            sprited: true,\n            spriteMapCssClass: \"sp_9kaae3\",\n            spriteCssClass: \"sx_6ae2b7\"\n        },\n        \"/images/litestand/sidebar/blended/pushable.png\": {\n            sprited: true,\n            spriteMapCssClass: \"sp_9kaae3\",\n            spriteCssClass: \"sx_a69036\"\n        },\n        \"/images/litestand/bookmarks/sidebar/add.png\": {\n            sprited: true,\n            spriteMapCssClass: \"sp_9kaae3\",\n            spriteCssClass: \"sx_f57d5d\"\n        },\n        \"/images/litestand/sidebar/pushable.png\": {\n            sprited: true,\n            spriteMapCssClass: \"sp_9kaae3\",\n            spriteCssClass: \"sx_0b17f3\"\n        },\n        \"/images/litestand/sidebar/online.png\": {\n            sprited: true,\n            spriteMapCssClass: \"sp_9kaae3\",\n            spriteCssClass: \"sx_6b87d3\"\n        },\n        \"/images/messaging/stickers/selector/rightarrow.png\": {\n            sprited: false,\n            uri: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yt/r/jopyzHwsKtN.png\",\n            width: 20,\n            height: 20\n        },\n        \"/images/chat/add.png\": {\n            sprited: true,\n            spriteMapCssClass: \"sp_9kaae3\",\n            spriteCssClass: \"sx_daa3c5\"\n        },\n        \"/images/chat/status/mobile.png\": {\n            sprited: true,\n            spriteMapCssClass: \"sp_9kaae3\",\n            spriteCssClass: \"sx_6633b3\"\n        },\n        \"/images/chat/sidebar/newGroupChat.png\": {\n            sprited: false,\n            uri: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/ys/r/S824hxiYJSG.png\",\n            width: 28,\n            height: 28\n        },\n        \"/images/chat/delete.png\": {\n            sprited: true,\n            spriteMapCssClass: \"sp_9kaae3\",\n            spriteCssClass: \"sx_1bb86f\"\n        },\n        \"/images/messaging/stickers/selector/store.png\": {\n            sprited: false,\n            uri: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y9/r/WG0aM70e5Iq.png\",\n            width: 20,\n            height: 20\n        }\n    },\n    js: [\"AyUu6\",\"OJTM4\",\"AsDOA\",\"63VzN\",\"H+v1W\",\"LpC/l\",\"brbS1\",\"u//Ut\",\"EzMPG\",],\n    id: \"pagelet_dock\",\n    phase: 3\n});");
// 1339
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"sbef7b505199b5c5088f13e778f4a6e67f70c6c49");
// 1340
geval("bigPipe.onPageletArrive({\n    JSBNG__content: {\n        pagelet_dock: {\n            container_id: \"u_0_1o\"\n        }\n    },\n    jsmods: {\n        require: [[\"MusicButtonManager\",\"init\",[],[[\"music.song\",],],],[\"initLiveMessageReceiver\",],[\"Dock\",\"init\",[\"m_0_27\",],[{\n            __m: \"m_0_27\"\n        },],],[\"React\",\"constructAndRenderComponent\",[\"NotificationBeeper.react\",\"m_0_28\",],[{\n            __m: \"NotificationBeeper.react\"\n        },{\n            unseenVsUnread: false,\n            canPause: false,\n            shouldLogImpressions: false,\n            soundPath: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/yy/r/odIeERVR1c5.mp3\",\n            soundEnabled: true,\n            tracking: \"{\\\"ref\\\":\\\"beeper\\\",\\\"jewel\\\":\\\"notifications\\\",\\\"type\\\":\\\"click2canvas\\\"}\"\n        },{\n            __m: \"m_0_28\"\n        },],],[\"ChatApp\",\"init\",[\"m_0_29\",\"m_0_2a\",],[{\n            __m: \"m_0_29\"\n        },{\n            __m: \"m_0_2a\"\n        },{\n            payload_source: \"server_initial_data\"\n        },],],[\"ChatOptions\",],[\"ShortProfiles\",\"setMulti\",[],[{\n            100006118350059: {\n                id: \"100006118350059\",\n                JSBNG__name: \"Javasee Cript\",\n                firstName: \"Javasee\",\n                vanity: \"javasee.cript\",\n                thumbSrc: \"http://jsbngssl.fbcdn-profile-a.akamaihd.net/hprofile-ak-prn2/s32x32/275646_100006118350059_324335073_q.jpg\",\n                uri: \"http://jsbngssl.www.facebook.com/javasee.cript\",\n                gender: 2,\n                type: \"user\",\n                is_friend: false,\n                social_snippets: null,\n                showVideoPromo: false,\n                searchTokens: [\"Cript\",\"Javasee\",]\n            }\n        },],],[\"m_0_2c\",],[\"m_0_2e\",],[\"Typeahead\",\"init\",[\"m_0_2f\",\"m_0_2e\",],[{\n            __m: \"m_0_2f\"\n        },{\n            __m: \"m_0_2e\"\n        },[\"chatTypeahead\",\"buildBestAvailableNames\",\"showLoadingIndicator\",],null,],],[\"ClearableTypeahead\",\"resetOnCloseButtonClick\",[\"m_0_2e\",\"m_0_2h\",],[{\n            __m: \"m_0_2e\"\n        },{\n            __m: \"m_0_2h\"\n        },],],[\"m_0_2k\",],[\"m_0_2l\",],[\"Layer\",\"init\",[\"m_0_2l\",\"m_0_2m\",],[{\n            __m: \"m_0_2l\"\n        },{\n            __m: \"m_0_2m\"\n        },],],[\"m_0_2d\",],[\"m_0_4s\",],[\"Typeahead\",\"init\",[\"m_0_4q\",\"m_0_4s\",],[{\n            __m: \"m_0_4q\"\n        },{\n            __m: \"m_0_4s\"\n        },[],null,],],],\n        instances: [[\"m_0_2c\",[\"BuddyListNub\",\"m_0_2b\",\"m_0_2d\",\"m_0_2e\",],[{\n            __m: \"m_0_2b\"\n        },{\n            __m: \"m_0_2d\"\n        },{\n            __m: \"m_0_2e\"\n        },],1,],[\"m_0_2e\",[\"Typeahead\",\"m_0_2i\",\"ChatTypeaheadView\",\"ChatTypeaheadRenderer\",\"m_0_2f\",\"ChatTypeaheadCore\",\"m_0_2g\",],[{\n            __m: \"m_0_2i\"\n        },{\n            node_id: \"u_0_13\",\n            node: null,\n            ctor: {\n                __m: \"ChatTypeaheadView\"\n            },\n            options: {\n                autoSelect: true,\n                renderer: {\n                    __m: \"ChatTypeaheadRenderer\"\n                },\n                causalElement: {\n                    __m: \"m_0_2f\"\n                },\n                minWidth: 0,\n                alignment: \"left\",\n                showBadges: 1\n            }\n        },{\n            ctor: {\n                __m: \"ChatTypeaheadCore\"\n            },\n            options: {\n                keepFocused: false,\n                resetOnSelect: true,\n                setValueOnSelect: false\n            }\n        },{\n            __m: \"m_0_2g\"\n        },],7,],[\"m_0_2k\",[\"ChatSidebarDropdown\",\"m_0_2j\",],[{\n            __m: \"m_0_2j\"\n        },null,],1,],[\"m_0_2l\",[\"LegacyContextualDialog\",\"AccessibleLayer\",],[{\n            buildWrapper: false,\n            causalElement: null,\n            addedBehaviors: [{\n                __m: \"AccessibleLayer\"\n            },]\n        },],5,],[\"m_0_2d\",[\"ChatOrderedList\",\"m_0_2n\",\"m_0_2o\",\"m_0_2p\",\"m_0_2l\",],[false,{\n            __m: \"m_0_2n\"\n        },{\n            __m: \"m_0_2o\"\n        },{\n            __m: \"m_0_2p\"\n        },{\n            __m: \"m_0_2l\"\n        },null,],3,],[\"m_0_2i\",[\"ChatTypeaheadDataSource\",],[{\n            alwaysPrefixMatch: true,\n            showOfflineUsers: true\n        },],2,],[\"m_0_2o\",[\"XHPTemplate\",\"m_0_2q\",],[{\n            __m: \"m_0_2q\"\n        },],2,],[\"m_0_2p\",[\"XHPTemplate\",\"m_0_2r\",],[{\n            __m: \"m_0_2r\"\n        },],2,],[\"m_0_2s\",[\"XHPTemplate\",\"m_0_3x\",],[{\n            __m: \"m_0_3x\"\n        },],2,],[\"m_0_2t\",[\"XHPTemplate\",\"m_0_3y\",],[{\n            __m: \"m_0_3y\"\n        },],2,],[\"m_0_2u\",[\"XHPTemplate\",\"m_0_3z\",],[{\n            __m: \"m_0_3z\"\n        },],2,],[\"m_0_2v\",[\"XHPTemplate\",\"m_0_40\",],[{\n            __m: \"m_0_40\"\n        },],2,],[\"m_0_2w\",[\"XHPTemplate\",\"m_0_41\",],[{\n            __m: \"m_0_41\"\n        },],2,],[\"m_0_2x\",[\"XHPTemplate\",\"m_0_42\",],[{\n            __m: \"m_0_42\"\n        },],2,],[\"m_0_2y\",[\"XHPTemplate\",\"m_0_43\",],[{\n            __m: \"m_0_43\"\n        },],2,],[\"m_0_2z\",[\"XHPTemplate\",\"m_0_44\",],[{\n            __m: \"m_0_44\"\n        },],2,],[\"m_0_30\",[\"XHPTemplate\",\"m_0_45\",],[{\n            __m: \"m_0_45\"\n        },],2,],[\"m_0_31\",[\"XHPTemplate\",\"m_0_46\",],[{\n            __m: \"m_0_46\"\n        },],2,],[\"m_0_32\",[\"XHPTemplate\",\"m_0_47\",],[{\n            __m: \"m_0_47\"\n        },],2,],[\"m_0_33\",[\"DataSource\",],[{\n            maxResults: 5,\n            queryData: [],\n            bootstrapData: {\n                viewer: 100006118350059,\n                token: \"1372173655-7\",\n                filter: [\"user\",],\n                options: [\"friends_only\",]\n            },\n            bootstrapEndpoint: \"/ajax/typeahead/first_degree.php\"\n        },],2,],[\"m_0_34\",[\"XHPTemplate\",\"m_0_48\",],[{\n            __m: \"m_0_48\"\n        },],2,],[\"m_0_35\",[\"XHPTemplate\",\"m_0_49\",],[{\n            __m: \"m_0_49\"\n        },],2,],[\"m_0_36\",[\"XHPTemplate\",\"m_0_4a\",],[{\n            __m: \"m_0_4a\"\n        },],2,],[\"m_0_37\",[\"XHPTemplate\",\"m_0_4b\",],[{\n            __m: \"m_0_4b\"\n        },],2,],[\"m_0_38\",[\"XHPTemplate\",\"m_0_4c\",],[{\n            __m: \"m_0_4c\"\n        },],2,],[\"m_0_39\",[\"XHPTemplate\",\"m_0_4d\",],[{\n            __m: \"m_0_4d\"\n        },],2,],[\"m_0_3a\",[\"XHPTemplate\",\"m_0_4e\",],[{\n            __m: \"m_0_4e\"\n        },],2,],[\"m_0_3b\",[\"XHPTemplate\",\"m_0_4f\",],[{\n            __m: \"m_0_4f\"\n        },],2,],[\"m_0_3c\",[\"XHPTemplate\",\"m_0_4g\",],[{\n            __m: \"m_0_4g\"\n        },],2,],[\"m_0_3d\",[\"XHPTemplate\",\"m_0_4h\",],[{\n            __m: \"m_0_4h\"\n        },],2,],[\"m_0_3e\",[\"XHPTemplate\",\"m_0_4i\",],[{\n            __m: \"m_0_4i\"\n        },],2,],[\"m_0_3f\",[\"XHPTemplate\",\"m_0_4j\",],[{\n            __m: \"m_0_4j\"\n        },],2,],[\"m_0_3g\",[\"XHPTemplate\",\"m_0_4k\",],[{\n            __m: \"m_0_4k\"\n        },],2,],[\"m_0_3h\",[\"XHPTemplate\",\"m_0_4l\",],[{\n            __m: \"m_0_4l\"\n        },],2,],[\"m_0_3i\",[\"XHPTemplate\",\"m_0_4m\",],[{\n            __m: \"m_0_4m\"\n        },],2,],[\"m_0_4s\",[\"Typeahead\",\"m_0_4t\",\"ContextualTypeaheadView\",\"m_0_4q\",\"TypeaheadCore\",\"m_0_4r\",],[{\n            __m: \"m_0_4t\"\n        },{\n            node_id: \"\",\n            node: null,\n            ctor: {\n                __m: \"ContextualTypeaheadView\"\n            },\n            options: {\n                causalElement: {\n                    __m: \"m_0_4q\"\n                },\n                minWidth: 0,\n                alignment: \"left\",\n                showBadges: 1\n            }\n        },{\n            ctor: {\n                __m: \"TypeaheadCore\"\n            },\n            options: []\n        },{\n            __m: \"m_0_4r\"\n        },],3,],[\"m_0_3j\",[\"XHPTemplate\",\"m_0_4p\",],[{\n            __m: \"m_0_4p\"\n        },],2,],[\"m_0_3k\",[\"XHPTemplate\",\"m_0_4u\",],[{\n            __m: \"m_0_4u\"\n        },],2,],[\"m_0_3l\",[\"XHPTemplate\",\"m_0_4v\",],[{\n            __m: \"m_0_4v\"\n        },],2,],[\"m_0_3m\",[\"XHPTemplate\",\"m_0_4w\",],[{\n            __m: \"m_0_4w\"\n        },],2,],[\"m_0_3n\",[\"XHPTemplate\",\"m_0_4x\",],[{\n            __m: \"m_0_4x\"\n        },],2,],[\"m_0_3o\",[\"XHPTemplate\",\"m_0_4y\",],[{\n            __m: \"m_0_4y\"\n        },],2,],[\"m_0_3p\",[\"XHPTemplate\",\"m_0_4z\",],[{\n            __m: \"m_0_4z\"\n        },],2,],[\"m_0_3q\",[\"XHPTemplate\",\"m_0_50\",],[{\n            __m: \"m_0_50\"\n        },],2,],[\"m_0_3r\",[\"XHPTemplate\",\"m_0_51\",],[{\n            __m: \"m_0_51\"\n        },],2,],[\"m_0_3s\",[\"XHPTemplate\",\"m_0_54\",],[{\n            __m: \"m_0_54\"\n        },],2,],[\"m_0_3t\",[\"XHPTemplate\",\"m_0_55\",],[{\n            __m: \"m_0_55\"\n        },],2,],[\"m_0_3u\",[\"XHPTemplate\",\"m_0_56\",],[{\n            __m: \"m_0_56\"\n        },],2,],[\"m_0_3v\",[\"XHPTemplate\",\"m_0_57\",],[{\n            __m: \"m_0_57\"\n        },],2,],[\"m_0_3w\",[\"XHPTemplate\",\"m_0_58\",],[{\n            __m: \"m_0_58\"\n        },],2,],[\"m_0_4t\",[\"DataSource\",],[[],],2,],],\n        define: [[\"LinkshimHandlerConfig\",[],{\n            supports_meta_referrer: false,\n            render_verification_rate: 1000\n        },27,],[\"MercurySheetTemplates\",[\"m_0_2s\",],{\n            \":fb:mercury:tab-sheet:loading\": {\n                __m: \"m_0_2s\"\n            }\n        },40,],[\"MercuryAttachmentTemplates\",[\"m_0_2t\",\"m_0_2u\",\"m_0_2v\",\"m_0_2w\",\"m_0_2x\",\"m_0_2y\",\"m_0_2z\",\"m_0_30\",\"m_0_31\",\"m_0_32\",],{\n            \":fb:mercury:attachment:error\": {\n                __m: \"m_0_2t\"\n            },\n            \":fb:mercury:attachment:video-thumb\": {\n                __m: \"m_0_2u\"\n            },\n            \":fb:mercury:attachment:file-name\": {\n                __m: \"m_0_2v\"\n            },\n            \":fb:mercury:attachment:external-link\": {\n                __m: \"m_0_2w\"\n            },\n            \":fb:mercury:attachment:music\": {\n                __m: \"m_0_2x\"\n            },\n            \":fb:mercury:attachment:file-link\": {\n                __m: \"m_0_2y\"\n            },\n            \":fb:mercury:attachment:preview\": {\n                __m: \"m_0_2z\"\n            },\n            \":fb:mercury:attachment:share-link\": {\n                __m: \"m_0_30\"\n            },\n            \":fb:mercury:upload-file-row\": {\n                __m: \"m_0_31\"\n            },\n            \":fb:mercury:attachment:extended-file-link\": {\n                __m: \"m_0_32\"\n            }\n        },34,],[\"MercuryDataSourceWrapper\",[\"m_0_33\",],{\n            source: {\n                __m: \"m_0_33\"\n            }\n        },37,],[\"MercuryStickersInitialData\",[],{\n            packs: [{\n                id: 126361870881943,\n                JSBNG__name: \"Meep\",\n                icon: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yd/r/wn5XeO2Rkqj.png\",\n                selectedIcon: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yN/r/sZ4spcbuYtY.png\"\n            },{\n                id: 350357561732812,\n                JSBNG__name: \"Pusheen\",\n                icon: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yy/r/kLIslj7Vlau.png\",\n                selectedIcon: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yz/r/58FtCc-hDRb.png\"\n            },{\n                id: \"emoticons\",\n                JSBNG__name: \"Emoticons\",\n                icon: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y_/r/4Dc6kC7GMzT.png\",\n                selectedIcon: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yV/r/d-mu_AVkpiU.png\"\n            },]\n        },144,],[\"ChatTabTemplates\",[\"m_0_34\",\"m_0_35\",\"m_0_36\",\"m_0_37\",\"m_0_38\",\"m_0_39\",\"m_0_3a\",\"m_0_3b\",\"m_0_3c\",\"m_0_3d\",\"m_0_3e\",\"m_0_3f\",\"m_0_3g\",\"m_0_3h\",\"m_0_3i\",\"m_0_3j\",\"m_0_3k\",\"m_0_3l\",\"m_0_3m\",\"m_0_3n\",\"m_0_3o\",\"m_0_3p\",\"m_0_3q\",\"m_0_3r\",],{\n            \":fb:chat:conversation:message:event\": {\n                __m: \"m_0_34\"\n            },\n            \":fb:chat:conversation:message-group\": {\n                __m: \"m_0_35\"\n            },\n            \":fb:chat:conversation:message:undertext\": {\n                __m: \"m_0_36\"\n            },\n            \":fb:chat:tab:selector:item\": {\n                __m: \"m_0_37\"\n            },\n            \":fb:mercury:chat:message:forward\": {\n                __m: \"m_0_38\"\n            },\n            \":fb:chat:tab:selector\": {\n                __m: \"m_0_39\"\n            },\n            \":fb:mercury:chat:multichat-tooltip-item\": {\n                __m: \"m_0_3a\"\n            },\n            \":fb:chat:conversation:date-break\": {\n                __m: \"m_0_3b\"\n            },\n            \":fb:mercury:call:tour\": {\n                __m: \"m_0_3c\"\n            },\n            \":fb:mercury:chat:tab-sheet:message-icon-sheet\": {\n                __m: \"m_0_3d\"\n            },\n            \":fb:mercury:chat:tab-sheet:clickable-message-icon-sheet\": {\n                __m: \"m_0_3e\"\n            },\n            \":fb:mercury:chat:tab-sheet:user-blocked\": {\n                __m: \"m_0_3f\"\n            },\n            \":fb:chat:conversation:message:subject\": {\n                __m: \"m_0_3g\"\n            },\n            \":fb:mercury:chat:tab-sheet:add-friends-empty-tab\": {\n                __m: \"m_0_3h\"\n            },\n            \":fb:mercury:chat:multichat-tab\": {\n                __m: \"m_0_3i\"\n            },\n            \":fb:mercury:chat:tab-sheet:name-conversation\": {\n                __m: \"m_0_3j\"\n            },\n            \":fb:chat:conversation:message\": {\n                __m: \"m_0_3k\"\n            },\n            \":fb:mercury:call:promo\": {\n                __m: \"m_0_3l\"\n            },\n            \":fb:mercury:chat:tab-sheet:add-friends\": {\n                __m: \"m_0_3m\"\n            },\n            \":fb:chat:conversation:message:status\": {\n                __m: \"m_0_3n\"\n            },\n            \":fb:mercury:chat:tab-sheet:message-mute-sheet\": {\n                __m: \"m_0_3o\"\n            },\n            \":fb:mercury:typing-indicator:typing\": {\n                __m: \"m_0_3p\"\n            },\n            \":fb:mercury:timestamp\": {\n                __m: \"m_0_3q\"\n            },\n            \":fb:mercury:chat:user-tab\": {\n                __m: \"m_0_3r\"\n            }\n        },15,],[\"VideoCallTemplates\",[\"m_0_3s\",],{\n            \":fb:videocall:incoming-dialog\": {\n                __m: \"m_0_3s\"\n            }\n        },74,],[\"MercuryTypeaheadTemplates\",[\"m_0_3t\",\"m_0_3u\",\"m_0_3v\",\"m_0_3w\",],{\n            \":fb:mercury:tokenizer\": {\n                __m: \"m_0_3t\"\n            },\n            \":fb:mercury:typeahead:header\": {\n                __m: \"m_0_3u\"\n            },\n            \":fb:mercury:typeahead\": {\n                __m: \"m_0_3v\"\n            },\n            \":fb:mercury:typeahead:result\": {\n                __m: \"m_0_3w\"\n            }\n        },43,],],\n        elements: [[\"m_0_27\",\"u_0_10\",2,],[\"m_0_29\",\"u_0_11\",2,],[\"m_0_2a\",\"u_0_12\",2,],[\"m_0_2b\",\"fbDockChatBuddylistNub\",2,],[\"m_0_2g\",\"u_0_14\",2,],[\"m_0_2h\",\"u_0_15\",2,],[\"m_0_2f\",\"u_0_16\",4,],[\"m_0_2j\",\"u_0_17\",2,],[\"m_0_2n\",\"u_0_19\",2,],[\"m_0_28\",\"u_0_1a\",2,],[\"m_0_4o\",\"u_0_1f\",2,\"m_0_4m\",],[\"m_0_4n\",\"u_0_1g\",2,\"m_0_4m\",],[\"m_0_4r\",\"u_0_1h\",2,\"m_0_4p\",],[\"m_0_4q\",\"u_0_1i\",4,\"m_0_4p\",],[\"m_0_53\",\"u_0_1m\",2,\"m_0_51\",],[\"m_0_52\",\"u_0_1n\",2,\"m_0_51\",],],\n        markup: [[\"m_0_2m\",{\n            __html: \"\\u003Cdiv class=\\\"uiContextualDialogPositioner\\\" id=\\\"u_0_18\\\" data-position=\\\"left\\\"\\u003E\\u003Cdiv class=\\\"uiOverlay uiContextualDialog\\\" data-width=\\\"300\\\" data-destroyonhide=\\\"false\\\" data-fadeonhide=\\\"false\\\"\\u003E\\u003Cdiv class=\\\"uiOverlayContent\\\"\\u003E\\u003Cdiv class=\\\"uiContextualDialogContent\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_2q\",{\n            __html: \"\\u003Cli class=\\\"_42fz\\\"\\u003E\\u003Ca class=\\\"clearfix _50zw\\\" data-jsid=\\\"anchor\\\" href=\\\"#\\\" role=\\\"\\\" rel=\\\"ignore\\\"\\u003E\\u003Cdiv class=\\\"_54sk _42g2\\\" data-jsid=\\\"favorite_button\\\"\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"pic_container\\\"\\u003E\\u003Cimg class=\\\"pic img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y4/r/-PAXP-deijE.gif\\\" data-jsid=\\\"profile-photo\\\" alt=\\\"\\\" width=\\\"1\\\" height=\\\"1\\\" /\\u003E\\u003C/div\\u003E\\u003Cimg class=\\\"_54sp _42i1 img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yW/r/F7kk7-cjEKk.png\\\" alt=\\\"\\\" width=\\\"10\\\" height=\\\"8\\\" /\\u003E\\u003Cdiv class=\\\"clearfix\\\"\\u003E\\u003Cdiv class=\\\"rfloat\\\"\\u003E\\u003Cspan data-jsid=\\\"accessible-name\\\" class=\\\"accessible_elem\\\"\\u003E\\u003C/span\\u003E\\u003Cdiv class=\\\"icon_container\\\"\\u003E\\u003Cimg class=\\\"_d3c icon img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y4/r/-PAXP-deijE.gif\\\" alt=\\\"\\\" width=\\\"1\\\" height=\\\"1\\\" /\\u003E\\u003Cdiv class=\\\"active_time icon\\\"\\u003E\\u003C/div\\u003E\\u003Cimg class=\\\"status icon img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y4/r/-PAXP-deijE.gif\\\" alt=\\\"\\\" width=\\\"1\\\" height=\\\"1\\\" /\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv aria-hidden=\\\"true\\\"\\u003E\\u003Cdiv class=\\\"_52zl\\\" data-jsid=\\\"name\\\"\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"_52zk\\\" data-jsid=\\\"context\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/a\\u003E\\u003C/li\\u003E\"\n        },2,],[\"m_0_2r\",{\n            __html: \"\\u003Cli\\u003E\\u003Cdiv class=\\\"phs fcg\\\"\\u003E\\u003Cspan data-jsid=\\\"message\\\"\\u003ELoading...\\u003C/span\\u003E\\u003C/div\\u003E\\u003C/li\\u003E\"\n        },2,],[\"m_0_3x\",{\n            __html: \"\\u003Cimg class=\\\"hidden_elem _1sk7 img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yk/r/LOOn0JtHNzb.gif\\\" alt=\\\"\\\" width=\\\"16\\\" height=\\\"16\\\" /\\u003E\"\n        },2,],[\"m_0_3y\",{\n            __html: \"\\u003Cdiv class=\\\"mtm pam _4_wc attachment uiBoxGray\\\"\\u003E\\u003Cspan class=\\\"uiIconText MercuryThreadlistIconError\\\" data-jsid=\\\"error\\\"\\u003E\\u003Ci class=\\\"img sp_4p6kmz sx_25310e\\\"\\u003E\\u003C/i\\u003E\\u003C/span\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_3z\",{\n            __html: \"\\u003Cdiv class=\\\"_59go\\\"\\u003E\\u003Ca class=\\\"uiVideoThumb videoPreview\\\" href=\\\"#\\\" data-jsid=\\\"thumb\\\" role=\\\"button\\\"\\u003E\\u003Cimg class=\\\"img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y4/r/-PAXP-deijE.gif\\\" alt=\\\"\\\" /\\u003E\\u003Ci\\u003E\\u003C/i\\u003E\\u003C/a\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_40\",{\n            __html: \"\\u003Cdiv class=\\\"_59go _59gq\\\"\\u003E\\u003Cspan class=\\\"uiIconText _3tn\\\"\\u003E\\u003Ci class=\\\"img sp_2gr8ms sx_d68978\\\"\\u003E\\u003C/i\\u003E\\u003Cspan data-jsid=\\\"filename\\\" class=\\\"filename\\\"\\u003E\\u003C/span\\u003E\\u003C/span\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_41\",{\n            __html: \"\\u003Cdiv class=\\\"_59go\\\"\\u003E\\u003Cdiv class=\\\"clearfix MercuryExternalLink\\\"\\u003E\\u003Cdiv class=\\\"_rpb clearfix stat_elem lfloat\\\" data-jsid=\\\"preview\\\"\\u003E\\u003Ca class=\\\"_ksh\\\" data-jsid=\\\"image-link\\\" href=\\\"#\\\" target=\\\"_blank\\\" role=\\\"button\\\"\\u003E\\u003Cimg data-jsid=\\\"preview-image\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yw/r/drP8vlvSl_8.gif\\\" /\\u003E\\u003C/a\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"MercuryLinkRight rfloat\\\"\\u003E\\u003Cdiv class=\\\"MercuryLinkTitle\\\"\\u003E\\u003Ca class=\\\"linkTitle\\\" target=\\\"_blank\\\" href=\\\"#\\\" data-jsid=\\\"name\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"fsm fwn fcg\\\" data-jsid=\\\"shortLink\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_42\",{\n            __html: \"\\u003Cdiv class=\\\"musicAttachment\\\"\\u003E\\u003Cdiv class=\\\"_59go _59gq\\\" data-jsid=\\\"icon_link\\\"\\u003E\\u003Ca class=\\\"uiIconText _3tn\\\" href=\\\"#\\\" data-jsid=\\\"link\\\" role=\\\"button\\\"\\u003E\\u003Ci class=\\\"img sp_2gr8ms sx_d68978\\\"\\u003E\\u003C/i\\u003E\\u003Cspan data-jsid=\\\"filename\\\" class=\\\"_59gp\\\"\\u003E\\u003C/span\\u003E\\u003C/a\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"_rpb clearfix stat_elem\\\" data-jsid=\\\"preview\\\"\\u003E\\u003Ca class=\\\"_ksh\\\" data-jsid=\\\"image-link\\\" href=\\\"#\\\" target=\\\"_blank\\\" role=\\\"button\\\"\\u003E\\u003Cimg data-jsid=\\\"preview-image\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yw/r/drP8vlvSl_8.gif\\\" /\\u003E\\u003C/a\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_43\",{\n            __html: \"\\u003Cdiv class=\\\"_59go _59gq\\\"\\u003E\\u003Ca class=\\\"uiIconText _3tn\\\" href=\\\"#\\\" data-jsid=\\\"link\\\" role=\\\"button\\\"\\u003E\\u003Ci class=\\\"img sp_2gr8ms sx_d68978\\\"\\u003E\\u003C/i\\u003E\\u003Cspan data-jsid=\\\"filename\\\" class=\\\"_59gp\\\"\\u003E\\u003C/span\\u003E\\u003C/a\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_44\",{\n            __html: \"\\u003Cdiv class=\\\"_rpb clearfix stat_elem\\\"\\u003E\\u003Ca class=\\\"_ksh\\\" data-jsid=\\\"image-link\\\" href=\\\"#\\\" target=\\\"_blank\\\" role=\\\"button\\\"\\u003E\\u003Cimg data-jsid=\\\"preview-image\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yw/r/drP8vlvSl_8.gif\\\" /\\u003E\\u003C/a\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_45\",{\n            __html: \"\\u003Cdiv class=\\\"_59go\\\"\\u003E\\u003Ca data-jsid=\\\"link\\\" target=\\\"_blank\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003Cspan data-jsid=\\\"name\\\"\\u003E\\u003C/span\\u003E\\u003C/a\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_46\",{\n            __html: \"\\u003Cdiv class=\\\"_2qh _2qe uploadFileRow\\\"\\u003E\\u003Cimg class=\\\"_2qf img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yb/r/GsNJNwuI-UM.gif\\\" alt=\\\"\\\" width=\\\"16\\\" height=\\\"11\\\" /\\u003E\\u003Clabel class=\\\"_2qg uiCloseButton uiCloseButtonSmall uiCloseButtonSmallDark\\\" for=\\\"u_0_1b\\\"\\u003E\\u003Cinput title=\\\"Remove\\\" type=\\\"button\\\" data-jsid=\\\"closeFileUpload\\\" id=\\\"u_0_1b\\\" /\\u003E\\u003C/label\\u003E\\u003Cdiv class=\\\"_4-te\\\"\\u003E\\u003Cspan class=\\\"uiIconText _3tn\\\" data-jsid=\\\"iconText\\\"\\u003E\\u003Ci class=\\\"img sp_2gr8ms sx_d68978\\\"\\u003E\\u003C/i\\u003E\\u003C/span\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_47\",{\n            __html: \"\\u003Cdiv class=\\\"_59go _59gq\\\"\\u003E\\u003Cdiv class=\\\"_59gs\\\"\\u003E\\u003Cdiv data-jsid=\\\"openLinkContainer\\\" class=\\\"_59gr hidden_elem\\\"\\u003E\\u003Ca class=\\\"_59hm\\\" href=\\\"#\\\" data-jsid=\\\"openFile\\\" role=\\\"button\\\"\\u003Eopen\\u003C/a\\u003E \\u00b7 \\u003C/div\\u003E\\u003Ca class=\\\"_59hn\\\" href=\\\"#\\\" data-jsid=\\\"downloadFile\\\" role=\\\"button\\\"\\u003Edownload\\u003C/a\\u003E\\u003C/div\\u003E\\u003Ca class=\\\"uiIconText _3tn\\\" href=\\\"#\\\" data-jsid=\\\"link\\\" role=\\\"button\\\"\\u003E\\u003Ci class=\\\"img sp_2gr8ms sx_d68978\\\"\\u003E\\u003C/i\\u003E\\u003Cspan class=\\\"_59gp\\\" data-jsid=\\\"filename\\\"\\u003E\\u003C/span\\u003E\\u003C/a\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_48\",{\n            __html: \"\\u003Cdiv class=\\\"mhs mbs pts fbChatConvItem _511o clearfix\\\"\\u003E\\u003Cdiv class=\\\"_1_vw\\\"\\u003E\\u003Cimg class=\\\"_1_vv img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y4/r/-PAXP-deijE.gif\\\" data-jsid=\\\"icon\\\" alt=\\\"\\\" width=\\\"1\\\" height=\\\"1\\\" /\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"_1_vx\\\"\\u003E\\u003Cspan class=\\\"_1_zk fsm fcg\\\" data-jsid=\\\"message\\\"\\u003E\\u003C/span\\u003E\\u003Cspan class=\\\"mls _1_vz fss fcg\\\" data-jsid=\\\"timestamp\\\"\\u003E\\u003C/span\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"_1_vy\\\" data-jsid=\\\"attachment\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_49\",{\n            __html: \"\\u003Cdiv class=\\\"mhs mbs pts fbChatConvItem _50dw clearfix small\\\"\\u003E\\u003Cdiv class=\\\"_50ke\\\"\\u003E\\u003Cdiv class=\\\"_50x5\\\" data-jsid=\\\"profileName\\\"\\u003E\\u003C/div\\u003E\\u003Ca class=\\\"profileLink\\\" href=\\\"#\\\" data-jsid=\\\"profileLink\\\" role=\\\"button\\\"\\u003E\\u003Cimg class=\\\"profilePhoto\\\" src=\\\"/images/spacer.gif\\\" data-jsid=\\\"profilePhoto\\\" /\\u003E\\u003C/a\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"messages\\\" data-jsid=\\\"messages\\\"\\u003E\\u003Cdiv class=\\\"metaInfoContainer fss fcg\\\"\\u003E\\u003Cspan data-jsid=\\\"reportLinkWithDot\\\" class=\\\"hidden_elem\\\"\\u003E\\u003Ca href=\\\"#\\\" rel=\\\"dialog\\\" data-jsid=\\\"reportLink\\\" role=\\\"button\\\"\\u003E\\u003Cspan class=\\\"fcg\\\"\\u003EReport\\u003C/span\\u003E\\u003C/a\\u003E \\u00b7 \\u003C/span\\u003E\\u003Cspan class=\\\"timestamp\\\" data-jsid=\\\"timestamp\\\"\\u003E\\u003C/span\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_4a\",{\n            __html: \"\\u003Cdiv\\u003E\\u003Cdiv data-jsid=\\\"message\\\"\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"_542e fwb fcg\\\" data-jsid=\\\"status\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_4b\",{\n            __html: \"\\u003Cli class=\\\"uiMenuItem _51ju\\\"\\u003E\\u003Ca class=\\\"itemAnchor\\\" role=\\\"menuitem\\\" tabindex=\\\"-1\\\" href=\\\"#\\\"\\u003E\\u003Cspan class=\\\"itemLabel fsm\\\"\\u003E\\u003Cdiv class=\\\"clearfix\\\"\\u003E\\u003Clabel class=\\\"rfloat uiCloseButton uiCloseButtonSmall\\\" for=\\\"u_0_1c\\\"\\u003E\\u003Cinput title=\\\"Remove\\\" type=\\\"button\\\" data-jsid=\\\"closeButton\\\" id=\\\"u_0_1c\\\" /\\u003E\\u003C/label\\u003E\\u003Cdiv class=\\\"_51jv\\\"\\u003E\\u003Cspan class=\\\"unreadCount\\\" data-jsid=\\\"unreadCount\\\"\\u003E\\u003C/span\\u003E\\u003Cspan data-jsid=\\\"content\\\"\\u003E\\u003C/span\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/span\\u003E\\u003C/a\\u003E\\u003C/li\\u003E\"\n        },2,],[\"m_0_4c\",{\n            __html: \"\\u003Cdiv\\u003E\\u003Ca class=\\\"uiIconText _52i4\\\" href=\\\"#\\\" style=\\\"padding-left: 12px;\\\" data-jsid=\\\"forwardLink\\\" role=\\\"button\\\"\\u003E\\u003Ci class=\\\"img sp_2gr8ms sx_8448dd\\\" style=\\\"top: 3px;\\\"\\u003E\\u003C/i\\u003E\\u003Cspan data-jsid=\\\"forwardText\\\"\\u003E\\u003C/span\\u003E\\u003C/a\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_4d\",{\n            __html: \"\\u003Cdiv class=\\\"uiToggle _50-v fbNub _51jt\\\"\\u003E\\u003Ca class=\\\"fbNubButton\\\" tabindex=\\\"0\\\" href=\\\"#\\\" rel=\\\"toggle\\\" role=\\\"button\\\"\\u003E\\u003Ci class=\\\"messagesIcon img sp_9kaae3 sx_ee64a9\\\"\\u003E\\u003C/i\\u003E\\u003Cspan data-jsid=\\\"numTabs\\\"\\u003E\\u003C/span\\u003E\\u003Cspan class=\\\"_51jw\\\" data-jsid=\\\"numMessages\\\"\\u003E\\u003C/span\\u003E\\u003C/a\\u003E\\u003Cdiv class=\\\"fbNubFlyout uiToggleFlyout noTitlebar\\\"\\u003E\\u003Cdiv class=\\\"fbNubFlyoutOuter\\\"\\u003E\\u003Cdiv class=\\\"fbNubFlyoutInner\\\"\\u003E\\u003Cdiv class=\\\"fbNubFlyoutBody scrollable\\\"\\u003E\\u003Cdiv class=\\\"fbNubFlyoutBodyContent\\\"\\u003E\\u003Cdiv role=\\\"menu\\\" class=\\\"uiMenu\\\" data-jsid=\\\"menu\\\"\\u003E\\u003Cul class=\\\"uiMenuInner\\\"\\u003E\\u003Cli class=\\\"uiMenuItem\\\" data-label=\\\"Dummy\\\"\\u003E\\u003Ca class=\\\"itemAnchor\\\" role=\\\"menuitem\\\" tabindex=\\\"0\\\" href=\\\"#\\\"\\u003E\\u003Cspan class=\\\"itemLabel fsm\\\"\\u003E Dummy \\u003C/span\\u003E\\u003C/a\\u003E\\u003C/li\\u003E\\u003C/ul\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_4e\",{\n            __html: \"\\u003Cdiv class=\\\"clearfix mvs\\\"\\u003E\\u003Ci class=\\\"rfloat img sp_9kaae3 sx_1dc182\\\" data-jsid=\\\"icon\\\"\\u003E\\u003C/i\\u003E\\u003Cdiv data-jsid=\\\"name\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_4f\",{\n            __html: \"\\u003Cdiv class=\\\"_511m mhs mbs fbChatConvItem\\\"\\u003E\\u003Cdiv class=\\\"_511n fss fwb fcg\\\" data-jsid=\\\"date\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_4g\",{\n            __html: \"\\u003Cdiv\\u003E\\u003Cdiv class=\\\"clearfix mvm mrm mll videoCallPromo\\\"\\u003E\\u003Ci class=\\\"_8o _8s lfloat img sp_2gr8ms sx_cd450f\\\"\\u003E\\u003C/i\\u003E\\u003Cdiv class=\\\"_42ef\\\"\\u003E\\u003Cdiv class=\\\"pls\\\"\\u003E\\u003Cspan class=\\\"calloutTitle fwb\\\"\\u003ETalk face to face\\u003C/span\\u003E\\u003Cdiv class=\\\"fsm fwn fcg\\\"\\u003EClick \\u003Cspan\\u003E ( \\u003Ci class=\\\"onlineStatusIcon img sp_2gr8ms sx_8e093b\\\"\\u003E\\u003C/i\\u003E )\\u003C/span\\u003E below to start a video call.\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"uiOverlayFooter uiContextualDialogFooter uiBoxGray topborder\\\"\\u003E\\u003Ctable class=\\\"uiGrid\\\" cellspacing=\\\"0\\\" cellpadding=\\\"0\\\"\\u003E\\u003Ctbody\\u003E\\u003Ctr\\u003E\\u003Ctd class=\\\"prs uiOverlayFooterMessage\\\"\\u003E\\u003Ca target=\\\"_blank\\\" href=\\\"/help/?page=177940565599960\\\"\\u003ELearn more\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"uiOverlayFooterButtons\\\"\\u003E\\u003Ca class=\\\"uiOverlayButton layerCancel uiButton uiButtonConfirm\\\" href=\\\"#\\\" role=\\\"button\\\" name=\\\"cancel\\\"\\u003E\\u003Cspan class=\\\"uiButtonText\\\"\\u003EOkay\\u003C/span\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003C/tr\\u003E\\u003C/tbody\\u003E\\u003C/table\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_4h\",{\n            __html: \"\\u003Cdiv class=\\\"pas\\\"\\u003E\\u003Ci class=\\\"mrs _1skc img sp_9kaae3 sx_ee64a9\\\" data-jsid=\\\"image\\\"\\u003E\\u003C/i\\u003E\\u003Cspan class=\\\"_1skd fcg\\\" data-jsid=\\\"text\\\"\\u003E\\u003C/span\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_4i\",{\n            __html: \"\\u003Ca href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003Cdiv class=\\\"pas\\\"\\u003E\\u003Ci class=\\\"mrs _1skc img sp_9kaae3 sx_ee64a9\\\" data-jsid=\\\"image\\\"\\u003E\\u003C/i\\u003E\\u003Cspan class=\\\"_1skd fcg\\\" data-jsid=\\\"text\\\"\\u003E\\u003C/span\\u003E\\u003C/div\\u003E\\u003C/a\\u003E\"\n        },2,],[\"m_0_4j\",{\n            __html: \"\\u003Cdiv class=\\\"pas\\\"\\u003E\\u003Ci class=\\\"_1skc img sp_4p6kmz sx_c2c2e3\\\" data-jsid=\\\"image\\\"\\u003E\\u003C/i\\u003E\\u003Cdiv class=\\\"_1skd\\\"\\u003E\\u003Cspan class=\\\"fcg\\\" data-jsid=\\\"text\\\"\\u003E\\u003C/span\\u003E\\u003Cdiv\\u003E\\u003Ca href=\\\"#\\\" data-jsid=\\\"actionLink\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_4k\",{\n            __html: \"\\u003Cdiv class=\\\"fbChatMessageSubject fsm fwb\\\" data-jsid=\\\"messageSubject\\\"\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_4l\",{\n            __html: \"\\u003Cdiv class=\\\"_54_v\\\"\\u003E\\u003Ctable class=\\\"uiGrid\\\" cellspacing=\\\"0\\\" cellpadding=\\\"0\\\"\\u003E\\u003Ctbody\\u003E\\u003Ctr\\u003E\\u003Ctd class=\\\"vTop _54_x\\\"\\u003E\\u003Cspan class=\\\"fcg\\\"\\u003ETo:\\u003C/span\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"vTop _54_w\\\"\\u003E\\u003Cdiv data-jsid=\\\"participantsTypeahead\\\"\\u003E\\u003C/div\\u003E\\u003C/td\\u003E\\u003C/tr\\u003E\\u003C/tbody\\u003E\\u003C/table\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_4m\",{\n            __html: \"\\u003Cdiv class=\\\"fbNub _50-v _50mz _50m-\\\"\\u003E\\u003Ca class=\\\"fbNubButton\\\" tabindex=\\\"0\\\" href=\\\"#\\\" data-jsid=\\\"dockButton\\\" role=\\\"button\\\"\\u003E\\u003Cdiv class=\\\"clearfix fbChatTab\\\"\\u003E\\u003Cdiv class=\\\"funhouse rfloat\\\"\\u003E\\u003Cdiv class=\\\"close\\\" title=\\\"Close\\\" data-jsid=\\\"closeButton\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"wrapWrapper\\\"\\u003E\\u003Cdiv class=\\\"wrap\\\"\\u003E\\u003Cdiv class=\\\"name fwb\\\" data-jsid=\\\"name\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cspan class=\\\"_51jx hidden_elem\\\" data-jsid=\\\"numMessages\\\"\\u003E0\\u003C/span\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/a\\u003E\\u003Cdiv class=\\\"fbNubFlyout fbDockChatTabFlyout\\\" data-jsid=\\\"chatWrapper\\\" role=\\\"complementary\\\" aria-labelledby=\\\"u_0_1d\\\"\\u003E\\u003Cdiv class=\\\"fbNubFlyoutOuter\\\"\\u003E\\u003Cdiv class=\\\"fbNubFlyoutInner\\\"\\u003E\\u003Cdiv class=\\\"clearfix fbNubFlyoutTitlebar titlebar\\\" data-jsid=\\\"nubFlyoutTitlebar\\\"\\u003E\\u003Cdiv class=\\\"mls titlebarButtonWrapper rfloat\\\"\\u003E\\u003Ca data-hover=\\\"tooltip\\\" aria-label=\\\"Add more friends to chat\\\" data-tooltip-alignh=\\\"center\\\" class=\\\"addToThread button\\\" href=\\\"#\\\" data-jsid=\\\"addToThreadLink\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003Cdiv class=\\\"uiSelector inlineBlock _510p\\\" data-jsid=\\\"dropdown\\\"\\u003E\\u003Cdiv class=\\\"uiToggle wrap\\\"\\u003E\\u003Ca data-hover=\\\"tooltip\\\" aria-label=\\\"Options\\\" data-tooltip-alignh=\\\"center\\\" class=\\\"button uiSelectorButton\\\" href=\\\"#\\\" role=\\\"button\\\" aria-haspopup=\\\"1\\\" rel=\\\"toggle\\\"\\u003E\\u003C/a\\u003E\\u003Cdiv class=\\\"uiSelectorMenuWrapper uiToggleFlyout\\\"\\u003E\\u003Cdiv role=\\\"menu\\\" class=\\\"uiMenu uiSelectorMenu\\\"\\u003E\\u003Cul class=\\\"uiMenuInner\\\"\\u003E\\u003Cli class=\\\"uiMenuItem\\\" data-label=\\\"See Full Conversation\\\"\\u003E\\u003Ca class=\\\"itemAnchor\\\" role=\\\"menuitem\\\" tabindex=\\\"0\\\" href=\\\"#\\\" data-jsid=\\\"conversationLink\\\"\\u003E\\u003Cspan class=\\\"itemLabel fsm\\\"\\u003ESee Full Conversation\\u003C/span\\u003E\\u003C/a\\u003E\\u003C/li\\u003E\\u003Cli class=\\\"uiMenuItem\\\"\\u003E\\u003Cform data-jsid=\\\"attachButtonForm\\\" action=\\\"http://jsbngssl.attachments.facebook.com/ajax/mercury/upload.php\\\" method=\\\"post\\\" onsubmit=\\\"return window.Event &amp;&amp; Event.__inlineSubmit &amp;&amp; Event.__inlineSubmit(this,event)\\\" id=\\\"u_0_1f\\\"\\u003E\\u003Cinput type=\\\"hidden\\\" name=\\\"fb_dtsg\\\" value=\\\"AQCttlPQ\\\" autocomplete=\\\"off\\\" /\\u003E\\u003Cinput type=\\\"hidden\\\" autocomplete=\\\"off\\\" data-jsid=\\\"attachID\\\" name=\\\"attach_id\\\" /\\u003E\\u003Cinput type=\\\"hidden\\\" autocomplete=\\\"off\\\" name=\\\"store_as_message_image\\\" value=\\\"0\\\" /\\u003E\\u003Cdiv class=\\\"_6a _m _4q60 itemLabel\\\"\\u003E\\u003Cinput type=\\\"file\\\" class=\\\"_n\\\" name=\\\"attachment[]\\\" multiple=\\\"1\\\" data-jsid=\\\"fileInput\\\" /\\u003E\\u003Ca class=\\\"_4q61 itemAnchor\\\"\\u003EAdd Files...\\u003C/a\\u003E\\u003C/div\\u003E\\u003C/form\\u003E\\u003C/li\\u003E\\u003Cli class=\\\"uiMenuItem\\\" data-label=\\\"Add Friends to Chat...\\\"\\u003E\\u003Ca class=\\\"itemAnchor\\\" role=\\\"menuitem\\\" tabindex=\\\"-1\\\" href=\\\"#\\\" data-jsid=\\\"addFriendLink\\\"\\u003E\\u003Cspan class=\\\"itemLabel fsm\\\"\\u003EAdd Friends to Chat...\\u003C/span\\u003E\\u003C/a\\u003E\\u003C/li\\u003E\\u003Cli class=\\\"uiMenuItem\\\" data-label=\\\"Edit Conversation Name\\\"\\u003E\\u003Ca class=\\\"itemAnchor\\\" role=\\\"menuitem\\\" tabindex=\\\"-1\\\" href=\\\"#\\\" data-jsid=\\\"nameConversationLink\\\"\\u003E\\u003Cspan class=\\\"itemLabel fsm\\\"\\u003EEdit Conversation Name\\u003C/span\\u003E\\u003C/a\\u003E\\u003C/li\\u003E\\u003Cli class=\\\"uiMenuSeparator\\\"\\u003E\\u003C/li\\u003E\\u003Cli class=\\\"uiMenuItem hidden_elem\\\" data-label=\\\"Mute Conversation\\\"\\u003E\\u003Ca class=\\\"itemAnchor\\\" role=\\\"menuitem\\\" tabindex=\\\"-1\\\" href=\\\"#\\\" data-jsid=\\\"muteThreadLink\\\"\\u003E\\u003Cspan class=\\\"itemLabel fsm\\\"\\u003EMute Conversation\\u003C/span\\u003E\\u003C/a\\u003E\\u003C/li\\u003E\\u003Cli class=\\\"uiMenuItem hidden_elem\\\" data-label=\\\"Unmute Conversation\\\"\\u003E\\u003Ca class=\\\"itemAnchor\\\" role=\\\"menuitem\\\" tabindex=\\\"-1\\\" href=\\\"#\\\" data-jsid=\\\"unmuteThreadLink\\\"\\u003E\\u003Cspan class=\\\"itemLabel fsm\\\"\\u003EUnmute Conversation\\u003C/span\\u003E\\u003C/a\\u003E\\u003C/li\\u003E\\u003Cli class=\\\"uiMenuItem\\\" data-label=\\\"Leave Conversation...\\\"\\u003E\\u003Ca class=\\\"itemAnchor\\\" role=\\\"menuitem\\\" tabindex=\\\"-1\\\" href=\\\"#\\\" data-jsid=\\\"unsubscribeLink\\\"\\u003E\\u003Cspan class=\\\"itemLabel fsm\\\"\\u003ELeave Conversation...\\u003C/span\\u003E\\u003C/a\\u003E\\u003C/li\\u003E\\u003C/ul\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Ca class=\\\"close button\\\" href=\\\"#\\\" data-jsid=\\\"titlebarCloseButton\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"titlebarLabel clearfix\\\"\\u003E\\u003Ch4 class=\\\"titlebarTextWrapper\\\"\\u003E\\u003Cimg class=\\\"_51sn img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y4/r/-PAXP-deijE.gif\\\" data-jsid=\\\"presenceIndicator\\\" alt=\\\"\\\" width=\\\"1\\\" height=\\\"1\\\" /\\u003E\\u003Ca class=\\\"titlebarText noLink\\\" href=\\\"#\\\" rel=\\\"none\\\" data-jsid=\\\"titlebarText\\\" aria-level=\\\"3\\\" id=\\\"u_0_1d\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/h4\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"fbNubFlyoutHeader\\\"\\u003E\\u003Cdiv class=\\\"_1sk5\\\"\\u003E\\u003Cdiv class=\\\"_1sk6 hidden_elem\\\" data-jsid=\\\"sheet\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"fbNubFlyoutBody scrollable\\\" data-jsid=\\\"chatConv\\\"\\u003E\\u003Cdiv class=\\\"fbNubFlyoutBodyContent\\\"\\u003E\\u003Ctable class=\\\"uiGrid conversationContainer\\\" cellspacing=\\\"0\\\" cellpadding=\\\"0\\\" role=\\\"log\\\"\\u003E\\u003Ctbody\\u003E\\u003Ctr\\u003E\\u003Ctd class=\\\"vBot\\\"\\u003E\\u003Cdiv class=\\\"accessible_elem\\\"\\u003EChat Conversation Start\\u003C/div\\u003E\\u003Cimg class=\\\"pvm loading hidden_elem img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yb/r/GsNJNwuI-UM.gif\\\" alt=\\\"\\\" data-jsid=\\\"loadingIndicator\\\" width=\\\"16\\\" height=\\\"11\\\" /\\u003E\\u003Cdiv class=\\\"conversation\\\" aria-live=\\\"polite\\\" aria-atomic=\\\"false\\\" data-jsid=\\\"conversation\\\" id=\\\"u_0_1e\\\"\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"accessible_elem\\\"\\u003EChat Conversation End\\u003C/div\\u003E\\u003Cdiv class=\\\"_51lq\\\" data-jsid=\\\"typingIndicator\\\"\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"_510g\\\" data-jsid=\\\"lastMessageIndicator\\\"\\u003E\\u003Cdiv class=\\\"_510h\\\"\\u003E\\u003C/div\\u003E\\u003Cspan class=\\\"_510f\\\"\\u003E\\u003C/span\\u003E\\u003C/div\\u003E\\u003C/td\\u003E\\u003C/tr\\u003E\\u003C/tbody\\u003E\\u003C/table\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"fbNubFlyoutFooter\\\"\\u003E\\u003Cdiv class=\\\"_552h\\\" data-jsid=\\\"inputContainer\\\"\\u003E\\u003Ctextarea class=\\\"uiTextareaAutogrow _552m\\\" data-jsid=\\\"input\\\" aria-controls=\\\"u_0_1e\\\" onkeydown=\\\"window.Bootloader &amp;&amp; Bootloader.loadComponents([&quot;control-textarea&quot;], function() &#123; TextAreaControl.getInstance(this) &#125;.bind(this)); \\\"\\u003E\\u003C/textarea\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"_552n\\\" data-jsid=\\\"iconsContainer\\\"\\u003E\\u003Cform class=\\\"_552o\\\" data-jsid=\\\"photoAttachButtonForm\\\" action=\\\"http://jsbngssl.attachments.facebook.com/ajax/mercury/upload.php\\\" method=\\\"post\\\" onsubmit=\\\"return window.Event &amp;&amp; Event.__inlineSubmit &amp;&amp; Event.__inlineSubmit(this,event)\\\" id=\\\"u_0_1g\\\"\\u003E\\u003Cinput type=\\\"hidden\\\" name=\\\"fb_dtsg\\\" value=\\\"AQCttlPQ\\\" autocomplete=\\\"off\\\" /\\u003E\\u003Cinput type=\\\"hidden\\\" autocomplete=\\\"off\\\" data-jsid=\\\"photoAttachID\\\" name=\\\"attach_id\\\" /\\u003E\\u003Cinput type=\\\"hidden\\\" autocomplete=\\\"off\\\" name=\\\"store_as_message_image\\\" value=\\\"1\\\" /\\u003E\\u003Cdiv class=\\\"_6a _m _4q60\\\"\\u003E\\u003Cinput type=\\\"file\\\" class=\\\"_n\\\" name=\\\"attachment[]\\\" multiple=\\\"1\\\" data-jsid=\\\"photoFileInput\\\" accept=\\\"image/*\\\" /\\u003E\\u003Ca class=\\\"_4q61 _509v\\\" data-jsid=\\\"photoAttachLink\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003Cdiv class=\\\"_509w\\\"\\u003E\\u003C/div\\u003E\\u003C/a\\u003E\\u003C/div\\u003E\\u003C/form\\u003E\\u003Cdiv class=\\\"uiToggle emoticonsPanel\\\" data-jsid=\\\"emoticons\\\"\\u003E\\u003Ca class=\\\"emoteTogglerImg _5bvk\\\" aria-label=\\\"Choose an emoticon\\\" href=\\\"#\\\" rel=\\\"toggle\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003Cdiv class=\\\"panelFlyout _590j uiToggleFlyout\\\"\\u003E\\u003Cdiv data-jsid=\\\"stickers\\\"\\u003E\\u003Cdiv class=\\\"_5906\\\"\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"_5907\\\"\\u003E\\u003Cdiv class=\\\"_55bq hidden_elem\\\" data-id=\\\"emoticons\\\"\\u003E\\u003Ctable class=\\\"emoticonsTable\\\"\\u003E\\u003Ctbody\\u003E\\u003Ctr\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_smile\\\" aria-label=\\\"smile\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_frown\\\" aria-label=\\\"frown\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_tongue\\\" aria-label=\\\"tongue\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_grin\\\" aria-label=\\\"grin\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_gasp\\\" aria-label=\\\"gasp\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_wink\\\" aria-label=\\\"wink\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_pacman\\\" aria-label=\\\"pacman\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003C/tr\\u003E\\u003Ctr\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_grumpy\\\" aria-label=\\\"grumpy\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_unsure\\\" aria-label=\\\"unsure\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_cry\\\" aria-label=\\\"cry\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_kiki\\\" aria-label=\\\"kiki\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_glasses\\\" aria-label=\\\"glasses\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_sunglasses\\\" aria-label=\\\"sunglasses\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_heart\\\" aria-label=\\\"heart\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003C/tr\\u003E\\u003Ctr\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_devil\\\" aria-label=\\\"devil\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_angel\\\" aria-label=\\\"angel\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_squint\\\" aria-label=\\\"squint\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_confused\\\" aria-label=\\\"confused\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_upset\\\" aria-label=\\\"upset\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_colonthree\\\" aria-label=\\\"colonthree\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_like\\\" aria-label=\\\"like\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003C/tr\\u003E\\u003C/tbody\\u003E\\u003C/table\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"panelFlyoutArrow\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"fbNubFlyoutAttachments\\\"\\u003E\\u003Cdiv class=\\\"chatAttachmentShelf\\\" data-jsid=\\\"attachmentShelf\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },4,],[\"m_0_4p\",{\n            __html: \"\\u003Cdiv class=\\\"_56jk\\\"\\u003E\\u003Ctable class=\\\"uiGrid\\\" cellspacing=\\\"0\\\" cellpadding=\\\"0\\\"\\u003E\\u003Ctbody\\u003E\\u003Ctr\\u003E\\u003Ctd class=\\\"vTop _56jl\\\"\\u003E\\u003Cdiv class=\\\"uiTypeahead\\\" id=\\\"u_0_1h\\\"\\u003E\\u003Cdiv class=\\\"wrap\\\"\\u003E\\u003Cinput type=\\\"hidden\\\" autocomplete=\\\"off\\\" class=\\\"hiddenInput\\\" /\\u003E\\u003Cdiv class=\\\"innerWrap\\\"\\u003E\\u003Cinput type=\\\"text\\\" class=\\\"inputtext textInput DOMControl_placeholder\\\" data-jsid=\\\"nameInput\\\" placeholder=\\\"Name this group\\\" autocomplete=\\\"off\\\" aria-autocomplete=\\\"list\\\" aria-expanded=\\\"false\\\" aria-owns=\\\"typeahead_list_u_0_1h\\\" role=\\\"combobox\\\" spellcheck=\\\"false\\\" value=\\\"Name this group\\\" aria-label=\\\"Name this group\\\" id=\\\"u_0_1i\\\" /\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"vTop\\\"\\u003E\\u003Cbutton value=\\\"1\\\" class=\\\"_42ft _42fu selected _42g-\\\" data-jsid=\\\"doneButton\\\" type=\\\"submit\\\"\\u003EDone\\u003C/button\\u003E\\u003C/td\\u003E\\u003C/tr\\u003E\\u003C/tbody\\u003E\\u003C/table\\u003E\\u003C/div\\u003E\"\n        },4,],[\"m_0_4u\",{\n            __html: \"\\u003Cdiv class=\\\"_kso fsm\\\" data-jsid=\\\"message\\\"\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_4v\",{\n            __html: \"\\u003Cdiv\\u003E\\u003Cdiv class=\\\"clearfix mvm mrm mll videoCallPromo\\\"\\u003E\\u003Ci class=\\\"_8o _8s lfloat img sp_2gr8ms sx_cd450f\\\"\\u003E\\u003C/i\\u003E\\u003Cdiv class=\\\"_42ef\\\"\\u003E\\u003Cdiv class=\\\"pls\\\"\\u003E\\u003Cspan class=\\\"calloutTitle fwb\\\"\\u003ETry talking face to face\\u003C/span\\u003E\\u003Cdiv class=\\\"fsm fwn fcg\\\"\\u003EClick \\u003Cspan\\u003E ( \\u003Ci class=\\\"onlineStatusIcon img sp_2gr8ms sx_8e093b\\\"\\u003E\\u003C/i\\u003E )\\u003C/span\\u003E below to start a video call.\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"uiOverlayFooter uiContextualDialogFooter uiBoxGray topborder\\\"\\u003E\\u003Ctable class=\\\"uiGrid\\\" cellspacing=\\\"0\\\" cellpadding=\\\"0\\\"\\u003E\\u003Ctbody\\u003E\\u003Ctr\\u003E\\u003Ctd class=\\\"prs uiOverlayFooterMessage\\\"\\u003E\\u003Ca target=\\\"_blank\\\" href=\\\"/help/?page=177940565599960\\\"\\u003ELearn more\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"uiOverlayFooterButtons\\\"\\u003E\\u003Ca class=\\\"uiOverlayButton layerCancel uiButton uiButtonConfirm\\\" href=\\\"#\\\" role=\\\"button\\\" name=\\\"cancel\\\"\\u003E\\u003Cspan class=\\\"uiButtonText\\\"\\u003EClose\\u003C/span\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003C/tr\\u003E\\u003C/tbody\\u003E\\u003C/table\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_4w\",{\n            __html: \"\\u003Cdiv class=\\\"_54_-\\\"\\u003E\\u003Ctable class=\\\"uiGrid\\\" cellspacing=\\\"0\\\" cellpadding=\\\"0\\\"\\u003E\\u003Ctbody\\u003E\\u003Ctr\\u003E\\u003Ctd class=\\\"vTop _54__\\\"\\u003E\\u003Cdiv data-jsid=\\\"participantsTypeahead\\\"\\u003E\\u003C/div\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"vTop\\\"\\u003E\\u003Clabel class=\\\"doneButton uiButton uiButtonConfirm\\\" for=\\\"u_0_1j\\\"\\u003E\\u003Cinput value=\\\"Done\\\" data-jsid=\\\"doneButton\\\" type=\\\"submit\\\" id=\\\"u_0_1j\\\" /\\u003E\\u003C/label\\u003E\\u003C/td\\u003E\\u003C/tr\\u003E\\u003C/tbody\\u003E\\u003C/table\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_4x\",{\n            __html: \"\\u003Cdiv class=\\\"_542q clearfix\\\"\\u003E\\u003Cdiv data-jsid=\\\"message\\\"\\u003E\\u003C/div\\u003E\\u003Cdiv data-jsid=\\\"status\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_4y\",{\n            __html: \"\\u003Cdiv class=\\\"pas\\\"\\u003E\\u003Cspan class=\\\"_1skd _1ske fcg\\\" data-jsid=\\\"text\\\"\\u003E\\u003C/span\\u003E\\u003Ca class=\\\"pas\\\" data-jsid=\\\"unmuteButton\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003EUnmute\\u003C/a\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_4z\",{\n            __html: \"\\u003Cdiv class=\\\"_510u\\\"\\u003E\\u003Cdiv class=\\\"_510v\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_50\",{\n            __html: \"\\u003Cabbr title=\\\"Wednesday, December 31, 1969 at 7:00pm\\\" data-utime=\\\"0\\\" class=\\\"hidden_elem timestamp\\\" data-jsid=\\\"timestamp\\\"\\u003Eover a year ago\\u003C/abbr\\u003E\"\n        },2,],[\"m_0_51\",{\n            __html: \"\\u003Cdiv class=\\\"fbNub _50-v _50mz _50m_\\\"\\u003E\\u003Ca class=\\\"fbNubButton\\\" tabindex=\\\"0\\\" href=\\\"#\\\" data-jsid=\\\"dockButton\\\" role=\\\"button\\\"\\u003E\\u003Cdiv class=\\\"clearfix fbChatTab\\\"\\u003E\\u003Cdiv class=\\\"funhouse rfloat\\\"\\u003E\\u003Cdiv class=\\\"close\\\" title=\\\"Close\\\" data-jsid=\\\"closeButton\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"wrapWrapper\\\"\\u003E\\u003Cdiv class=\\\"wrap\\\"\\u003E\\u003Cdiv class=\\\"name fwb\\\" data-jsid=\\\"name\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cspan class=\\\"_51jx hidden_elem\\\" data-jsid=\\\"numMessages\\\"\\u003E0\\u003C/span\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/a\\u003E\\u003Cdiv class=\\\"fbNubFlyout fbDockChatTabFlyout\\\" data-jsid=\\\"chatWrapper\\\" role=\\\"complementary\\\" aria-labelledby=\\\"u_0_1k\\\"\\u003E\\u003Cdiv class=\\\"fbNubFlyoutOuter\\\"\\u003E\\u003Cdiv class=\\\"fbNubFlyoutInner\\\"\\u003E\\u003Cdiv class=\\\"clearfix fbNubFlyoutTitlebar titlebar\\\" data-jsid=\\\"nubFlyoutTitlebar\\\"\\u003E\\u003Cdiv class=\\\"mls titlebarButtonWrapper rfloat\\\"\\u003E\\u003Ca data-hover=\\\"tooltip\\\" aria-label=\\\"Add more friends to chat\\\" class=\\\"addToThread button\\\" href=\\\"#\\\" data-jsid=\\\"addToThreadLink\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003Ca data-hover=\\\"tooltip\\\" aria-label=\\\"Start a video call\\\" class=\\\"videoicon button\\\" href=\\\"#\\\" data-jsid=\\\"videoCallLink\\\" data-gt=\\\"&#123;&quot;videochat&quot;:&quot;call_clicked_chat_tab&quot;&#125;\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003Cdiv class=\\\"uiSelector inlineBlock _510p\\\" data-jsid=\\\"dropdown\\\"\\u003E\\u003Cdiv class=\\\"uiToggle wrap\\\"\\u003E\\u003Ca data-hover=\\\"tooltip\\\" aria-label=\\\"Options\\\" data-tooltip-alignh=\\\"center\\\" class=\\\"button uiSelectorButton\\\" href=\\\"#\\\" role=\\\"button\\\" aria-haspopup=\\\"1\\\" rel=\\\"toggle\\\"\\u003E\\u003C/a\\u003E\\u003Cdiv class=\\\"uiSelectorMenuWrapper uiToggleFlyout\\\"\\u003E\\u003Cdiv role=\\\"menu\\\" class=\\\"uiMenu uiSelectorMenu\\\"\\u003E\\u003Cul class=\\\"uiMenuInner\\\"\\u003E\\u003Cli class=\\\"uiMenuItem\\\" tabindex=\\\"0\\\"\\u003E\\u003Cform data-jsid=\\\"attachButtonForm\\\" action=\\\"http://jsbngssl.attachments.facebook.com/ajax/mercury/upload.php\\\" method=\\\"post\\\" onsubmit=\\\"return window.Event &amp;&amp; Event.__inlineSubmit &amp;&amp; Event.__inlineSubmit(this,event)\\\" id=\\\"u_0_1m\\\"\\u003E\\u003Cinput type=\\\"hidden\\\" name=\\\"fb_dtsg\\\" value=\\\"AQCttlPQ\\\" autocomplete=\\\"off\\\" /\\u003E\\u003Cinput type=\\\"hidden\\\" autocomplete=\\\"off\\\" data-jsid=\\\"attachID\\\" name=\\\"attach_id\\\" /\\u003E\\u003Cinput type=\\\"hidden\\\" autocomplete=\\\"off\\\" name=\\\"store_as_message_image\\\" value=\\\"0\\\" /\\u003E\\u003Cdiv class=\\\"_6a _m _4q60 itemLabel\\\"\\u003E\\u003Cinput type=\\\"file\\\" class=\\\"_n\\\" name=\\\"attachment[]\\\" multiple=\\\"1\\\" data-jsid=\\\"fileInput\\\" /\\u003E\\u003Ca class=\\\"_4q61 itemAnchor\\\"\\u003EAdd Files...\\u003C/a\\u003E\\u003C/div\\u003E\\u003C/form\\u003E\\u003C/li\\u003E\\u003Cli class=\\\"uiMenuItem\\\" data-label=\\\"Add Friends to Chat...\\\"\\u003E\\u003Ca class=\\\"itemAnchor\\\" role=\\\"menuitem\\\" tabindex=\\\"-1\\\" href=\\\"#\\\" data-jsid=\\\"addFriendLink\\\"\\u003E\\u003Cspan class=\\\"itemLabel fsm\\\"\\u003EAdd Friends to Chat...\\u003C/span\\u003E\\u003C/a\\u003E\\u003C/li\\u003E\\u003Cli class=\\\"uiMenuItem\\\" data-label=\\\"\\\"\\u003E\\u003Ca class=\\\"itemAnchor\\\" role=\\\"menuitem\\\" tabindex=\\\"-1\\\" href=\\\"#\\\" data-jsid=\\\"privacyLink\\\"\\u003E\\u003Cspan class=\\\"itemLabel fsm\\\"\\u003E \\u003C/span\\u003E\\u003C/a\\u003E\\u003C/li\\u003E\\u003Cli class=\\\"uiMenuSeparator\\\"\\u003E\\u003C/li\\u003E\\u003Cli class=\\\"uiMenuItem\\\" data-label=\\\"See Full Conversation\\\"\\u003E\\u003Ca class=\\\"itemAnchor\\\" role=\\\"menuitem\\\" tabindex=\\\"-1\\\" href=\\\"#\\\" data-jsid=\\\"conversationLink\\\"\\u003E\\u003Cspan class=\\\"itemLabel fsm\\\"\\u003ESee Full Conversation\\u003C/span\\u003E\\u003C/a\\u003E\\u003C/li\\u003E\\u003Cli class=\\\"uiMenuItem hidden_elem\\\" data-label=\\\"Mute Conversation\\\"\\u003E\\u003Ca class=\\\"itemAnchor\\\" role=\\\"menuitem\\\" tabindex=\\\"-1\\\" href=\\\"#\\\" data-jsid=\\\"muteThreadLink\\\"\\u003E\\u003Cspan class=\\\"itemLabel fsm\\\"\\u003EMute Conversation\\u003C/span\\u003E\\u003C/a\\u003E\\u003C/li\\u003E\\u003Cli class=\\\"uiMenuItem hidden_elem\\\" data-label=\\\"Unmute Conversation\\\"\\u003E\\u003Ca class=\\\"itemAnchor\\\" role=\\\"menuitem\\\" tabindex=\\\"-1\\\" href=\\\"#\\\" data-jsid=\\\"unmuteThreadLink\\\"\\u003E\\u003Cspan class=\\\"itemLabel fsm\\\"\\u003EUnmute Conversation\\u003C/span\\u003E\\u003C/a\\u003E\\u003C/li\\u003E\\u003Cli class=\\\"uiMenuItem\\\" data-label=\\\"Clear Window\\\"\\u003E\\u003Ca class=\\\"itemAnchor\\\" role=\\\"menuitem\\\" tabindex=\\\"-1\\\" href=\\\"#\\\" data-jsid=\\\"clearWindowLink\\\"\\u003E\\u003Cspan class=\\\"itemLabel fsm\\\"\\u003EClear Window\\u003C/span\\u003E\\u003C/a\\u003E\\u003C/li\\u003E\\u003Cli class=\\\"uiMenuSeparator\\\"\\u003E\\u003C/li\\u003E\\u003Cli class=\\\"uiMenuItem\\\" data-label=\\\"Report as Spam or Abuse...\\\"\\u003E\\u003Ca class=\\\"itemAnchor\\\" role=\\\"menuitem\\\" tabindex=\\\"-1\\\" href=\\\"#\\\" data-jsid=\\\"reportSpamLink\\\"\\u003E\\u003Cspan class=\\\"itemLabel fsm\\\"\\u003EReport as Spam or Abuse...\\u003C/span\\u003E\\u003C/a\\u003E\\u003C/li\\u003E\\u003C/ul\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Ca class=\\\"close button\\\" href=\\\"#\\\" data-jsid=\\\"titlebarCloseButton\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"titlebarLabel clearfix\\\"\\u003E\\u003Ch4 class=\\\"titlebarTextWrapper\\\"\\u003E\\u003Cimg class=\\\"_51sn img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y4/r/-PAXP-deijE.gif\\\" data-jsid=\\\"presenceIndicator\\\" alt=\\\"\\\" width=\\\"1\\\" height=\\\"1\\\" /\\u003E\\u003Ca class=\\\"titlebarText noLink\\\" href=\\\"#\\\" rel=\\\"none\\\" data-jsid=\\\"titlebarText\\\" aria-level=\\\"3\\\" id=\\\"u_0_1k\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/h4\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"fbNubFlyoutHeader\\\"\\u003E\\u003Cdiv class=\\\"_1sk5\\\"\\u003E\\u003Cdiv class=\\\"_1sk6 hidden_elem\\\" data-jsid=\\\"sheet\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"fbNubFlyoutBody scrollable\\\" data-jsid=\\\"chatConv\\\"\\u003E\\u003Cdiv class=\\\"fbNubFlyoutBodyContent\\\"\\u003E\\u003Ctable class=\\\"uiGrid conversationContainer\\\" cellspacing=\\\"0\\\" cellpadding=\\\"0\\\" role=\\\"log\\\"\\u003E\\u003Ctbody\\u003E\\u003Ctr\\u003E\\u003Ctd class=\\\"vBot\\\"\\u003E\\u003Cdiv class=\\\"accessible_elem\\\"\\u003EChat Conversation Start\\u003C/div\\u003E\\u003Cimg class=\\\"pvm loading hidden_elem img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yb/r/GsNJNwuI-UM.gif\\\" alt=\\\"\\\" data-jsid=\\\"loadingIndicator\\\" width=\\\"16\\\" height=\\\"11\\\" /\\u003E\\u003Cdiv class=\\\"conversation\\\" aria-live=\\\"polite\\\" aria-atomic=\\\"false\\\" data-jsid=\\\"conversation\\\" id=\\\"u_0_1l\\\"\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"accessible_elem\\\"\\u003EChat Conversation End\\u003C/div\\u003E\\u003Cdiv class=\\\"_51lq\\\" data-jsid=\\\"typingIndicator\\\"\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"_510g\\\" data-jsid=\\\"lastMessageIndicator\\\"\\u003E\\u003Cdiv class=\\\"_510h\\\"\\u003E\\u003C/div\\u003E\\u003Cspan class=\\\"_510f\\\"\\u003E\\u003C/span\\u003E\\u003C/div\\u003E\\u003C/td\\u003E\\u003C/tr\\u003E\\u003C/tbody\\u003E\\u003C/table\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"fbNubFlyoutFooter\\\"\\u003E\\u003Cdiv class=\\\"_552h\\\" data-jsid=\\\"inputContainer\\\"\\u003E\\u003Ctextarea class=\\\"uiTextareaAutogrow _552m\\\" data-jsid=\\\"input\\\" aria-controls=\\\"u_0_1l\\\" onkeydown=\\\"window.Bootloader &amp;&amp; Bootloader.loadComponents([&quot;control-textarea&quot;], function() &#123; TextAreaControl.getInstance(this) &#125;.bind(this)); \\\"\\u003E\\u003C/textarea\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"_552n\\\" data-jsid=\\\"iconsContainer\\\"\\u003E\\u003Cform class=\\\"_552o\\\" data-jsid=\\\"photoAttachButtonForm\\\" action=\\\"http://jsbngssl.attachments.facebook.com/ajax/mercury/upload.php\\\" method=\\\"post\\\" onsubmit=\\\"return window.Event &amp;&amp; Event.__inlineSubmit &amp;&amp; Event.__inlineSubmit(this,event)\\\" id=\\\"u_0_1n\\\"\\u003E\\u003Cinput type=\\\"hidden\\\" name=\\\"fb_dtsg\\\" value=\\\"AQCttlPQ\\\" autocomplete=\\\"off\\\" /\\u003E\\u003Cinput type=\\\"hidden\\\" autocomplete=\\\"off\\\" data-jsid=\\\"photoAttachID\\\" name=\\\"attach_id\\\" /\\u003E\\u003Cinput type=\\\"hidden\\\" autocomplete=\\\"off\\\" name=\\\"store_as_message_image\\\" value=\\\"1\\\" /\\u003E\\u003Cdiv class=\\\"_6a _m _4q60\\\"\\u003E\\u003Cinput type=\\\"file\\\" class=\\\"_n\\\" name=\\\"attachment[]\\\" multiple=\\\"1\\\" data-jsid=\\\"photoFileInput\\\" accept=\\\"image/*\\\" /\\u003E\\u003Ca class=\\\"_4q61 _509v\\\" data-jsid=\\\"photoAttachLink\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003Cdiv class=\\\"_509w\\\"\\u003E\\u003C/div\\u003E\\u003C/a\\u003E\\u003C/div\\u003E\\u003C/form\\u003E\\u003Cdiv class=\\\"uiToggle emoticonsPanel\\\" data-jsid=\\\"emoticons\\\"\\u003E\\u003Ca class=\\\"emoteTogglerImg _5bvk\\\" aria-label=\\\"Choose an emoticon\\\" href=\\\"#\\\" rel=\\\"toggle\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003Cdiv class=\\\"panelFlyout _590j uiToggleFlyout\\\"\\u003E\\u003Cdiv data-jsid=\\\"stickers\\\"\\u003E\\u003Cdiv class=\\\"_5906\\\"\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"_5907\\\"\\u003E\\u003Cdiv class=\\\"_55bq hidden_elem\\\" data-id=\\\"emoticons\\\"\\u003E\\u003Ctable class=\\\"emoticonsTable\\\"\\u003E\\u003Ctbody\\u003E\\u003Ctr\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_smile\\\" aria-label=\\\"smile\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_frown\\\" aria-label=\\\"frown\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_tongue\\\" aria-label=\\\"tongue\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_grin\\\" aria-label=\\\"grin\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_gasp\\\" aria-label=\\\"gasp\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_wink\\\" aria-label=\\\"wink\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_pacman\\\" aria-label=\\\"pacman\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003C/tr\\u003E\\u003Ctr\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_grumpy\\\" aria-label=\\\"grumpy\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_unsure\\\" aria-label=\\\"unsure\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_cry\\\" aria-label=\\\"cry\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_kiki\\\" aria-label=\\\"kiki\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_glasses\\\" aria-label=\\\"glasses\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_sunglasses\\\" aria-label=\\\"sunglasses\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_heart\\\" aria-label=\\\"heart\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003C/tr\\u003E\\u003Ctr\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_devil\\\" aria-label=\\\"devil\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_angel\\\" aria-label=\\\"angel\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_squint\\\" aria-label=\\\"squint\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_confused\\\" aria-label=\\\"confused\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_upset\\\" aria-label=\\\"upset\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_colonthree\\\" aria-label=\\\"colonthree\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_like\\\" aria-label=\\\"like\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003C/tr\\u003E\\u003C/tbody\\u003E\\u003C/table\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"panelFlyoutArrow\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"fbNubFlyoutAttachments\\\"\\u003E\\u003Cdiv class=\\\"chatAttachmentShelf\\\" data-jsid=\\\"attachmentShelf\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },4,],[\"m_0_54\",{\n            __html: \"\\u003Cdiv class=\\\"clearfix\\\"\\u003E\\u003Cimg class=\\\"mrm _s0 _29h _29i _rw img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yw/r/drP8vlvSl_8.gif\\\" alt=\\\"\\\" data-jsid=\\\"profilePhoto\\\" width=\\\"1\\\" height=\\\"1\\\" /\\u003E\\u003Cdiv class=\\\"_29j _29k\\\"\\u003E\\u003Cdiv class=\\\"mbs fsl fwb fcb\\\" data-jsid=\\\"mainText\\\"\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"aux-message fcg\\\" data-jsid=\\\"auxMessage\\\"\\u003EVideo will start as soon as you answer.\\u003C/div\\u003E\\u003Cdiv class=\\\"mts hidden_elem fcg\\\" data-jsid=\\\"slowMessage\\\"\\u003E\\u003Cspan class=\\\"fwb fcb\\\"\\u003EHaving trouble?\\u003C/span\\u003E Your connection may be \\u003Ca href=\\\"/help/214265948627885\\\" target=\\\"_blank\\\"\\u003Etoo slow\\u003C/a\\u003E.\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_55\",{\n            __html: \"\\u003Cdiv class=\\\"clearfix uiTokenizer uiInlineTokenizer\\\"\\u003E\\u003Cdiv class=\\\"tokenarea hidden_elem\\\" data-jsid=\\\"tokenarea\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_56\",{\n            __html: \"\\u003Cli class=\\\"_2qm\\\"\\u003E\\u003Cdiv class=\\\"clearfix\\\"\\u003E\\u003Cdiv class=\\\"lfloat\\\"\\u003E\\u003Cspan data-jsid=\\\"text\\\"\\u003E\\u003C/span\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"rfloat\\\"\\u003E\\u003Cspan\\u003E\\u003Cimg class=\\\"_356 img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yb/r/GsNJNwuI-UM.gif\\\" alt=\\\"\\\" data-jsid=\\\"loadingSpinner\\\" width=\\\"16\\\" height=\\\"11\\\" /\\u003E\\u003Ca class=\\\"_357\\\" data-jsid=\\\"link\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/span\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/li\\u003E\"\n        },2,],[\"m_0_57\",{\n            __html: \"\\u003Cdiv class=\\\"uiTypeahead\\\"\\u003E\\u003Cdiv class=\\\"wrap\\\"\\u003E\\u003Cinput type=\\\"hidden\\\" autocomplete=\\\"off\\\" class=\\\"hiddenInput\\\" /\\u003E\\u003Cdiv class=\\\"innerWrap\\\"\\u003E\\u003Cinput type=\\\"text\\\" class=\\\"inputtext textInput\\\" data-jsid=\\\"textfield\\\" /\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_58\",{\n            __html: \"\\u003Cli class=\\\"_2qs\\\"\\u003E\\u003Cdiv class=\\\"clearfix pvs\\\"\\u003E\\u003Cdiv class=\\\"MercuryThreadImage mrm _3ks lfloat\\\" data-jsid=\\\"image\\\"\\u003E\\u003Cimg class=\\\"_s0 _rw img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yw/r/drP8vlvSl_8.gif\\\" /\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"_2qr\\\"\\u003E\\u003Cspan class=\\\"_2qn\\\" data-jsid=\\\"name\\\"\\u003E\\u003C/span\\u003E\\u003Cdiv class=\\\"_2qq fsm fwn fcg\\\" data-jsid=\\\"snippet\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/li\\u003E\"\n        },2,],]\n    },\n    css: [\"W3Ky6\",\"0duP3\",\"cy4a0\",],\n    bootloadable: {\n        \"legacy:control-textarea\": {\n            resources: [\"AyUu6\",\"LpC/l\",\"W3Ky6\",\"c1+nc\",]\n        },\n        VideoCallController: {\n            resources: [\"AyUu6\",\"AsDOA\",\"W3Ky6\",\"4qhP/\",\"OJTM4\",\"u//Ut\",\"brbS1\",\"EzMPG\",\"gMfWI\",\"bUzfU\",\"KPLqg\",],\n            \"module\": true\n        },\n        ErrorDialog: {\n            resources: [\"AyUu6\",\"W3Ky6\",\"AsDOA\",\"bUzfU\",],\n            \"module\": true\n        },\n        FBRTCCallController: {\n            resources: [\"AyUu6\",\"AsDOA\",\"W3Ky6\",\"4qhP/\",\"brbS1\",\"u//Ut\",\"OJTM4\",\"EzMPG\",\"gMfWI\",\"a3inZ\",\"KPLqg\",\"bUzfU\",\"LTaK/\",\"21lHn\",\"+h1d2\",\"9aS3c\",\"MfG6c\",\"LsRx/\",\"3h2ll\",\"Mzbs2\",\"wGXi/\",\"d6Evh\",\"6WF8S\",],\n            \"module\": true\n        }\n    },\n    resource_map: {\n        \"9aS3c\": {\n            type: \"css\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yO/r/OErByX4rRhh.css\"\n        },\n        Mzbs2: {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y7/r/sM5jkmon6X9.js\"\n        },\n        \"3h2ll\": {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yz/r/8nGweTPJCKZ.js\"\n        },\n        \"6WF8S\": {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/ya/r/cHaSy_1vFQu.js\"\n        },\n        \"4qhP/\": {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yv/r/tMfRnsOx-tg.js\"\n        },\n        \"LTaK/\": {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y_/r/3Z79JZzbt1o.js\"\n        },\n        KPLqg: {\n            type: \"css\",\n            permanent: 1,\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yq/r/UJCnyWz8q3r.css\"\n        },\n        \"wGXi/\": {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/ym/r/usnMgvD8abB.js\"\n        },\n        gMfWI: {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yY/r/YnJRD6K1VJA.js\"\n        },\n        \"c1+nc\": {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y1/r/3A9a-abDc5V.js\"\n        },\n        \"LsRx/\": {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yu/r/kS-r05X6OEA.js\"\n        },\n        a3inZ: {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yO/r/9ELMM-KdnsD.js\"\n        },\n        d6Evh: {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y2/r/jalUIRLBuTe.js\"\n        },\n        MfG6c: {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yS/r/eKDf9pXbovQ.js\"\n        },\n        \"21lHn\": {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yP/r/QylH5JvJ2tZ.js\"\n        }\n    },\n    ixData: {\n        \"/images/messaging/stickers/selector/leftarrow.png\": {\n            sprited: false,\n            uri: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yS/r/lM_ryP3lE-X.png\",\n            width: 20,\n            height: 20\n        },\n        \"/images/chat/sidebar/newGroupChatLitestand.png\": {\n            sprited: false,\n            uri: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yk/r/3hu9Ow1TVfb.png\",\n            width: 28,\n            height: 28\n        },\n        \"/images/litestand/sidebar/blended/new_group_chat.png\": {\n            sprited: false,\n            uri: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yg/r/I5ybuQbRjJE.png\",\n            width: 32,\n            height: 32\n        },\n        \"/images/chat/status/online.png\": {\n            sprited: true,\n            spriteMapCssClass: \"sp_9kaae3\",\n            spriteCssClass: \"sx_1dc182\"\n        },\n        \"/images/litestand/bookmarks/sidebar/remove.png\": {\n            sprited: true,\n            spriteMapCssClass: \"sp_9kaae3\",\n            spriteCssClass: \"sx_76e896\"\n        },\n        \"/images/litestand/sidebar/blended/online.png\": {\n            sprited: true,\n            spriteMapCssClass: \"sp_9kaae3\",\n            spriteCssClass: \"sx_6ae2b7\"\n        },\n        \"/images/litestand/sidebar/blended/pushable.png\": {\n            sprited: true,\n            spriteMapCssClass: \"sp_9kaae3\",\n            spriteCssClass: \"sx_a69036\"\n        },\n        \"/images/litestand/bookmarks/sidebar/add.png\": {\n            sprited: true,\n            spriteMapCssClass: \"sp_9kaae3\",\n            spriteCssClass: \"sx_f57d5d\"\n        },\n        \"/images/litestand/sidebar/pushable.png\": {\n            sprited: true,\n            spriteMapCssClass: \"sp_9kaae3\",\n            spriteCssClass: \"sx_0b17f3\"\n        },\n        \"/images/litestand/sidebar/online.png\": {\n            sprited: true,\n            spriteMapCssClass: \"sp_9kaae3\",\n            spriteCssClass: \"sx_6b87d3\"\n        },\n        \"/images/messaging/stickers/selector/rightarrow.png\": {\n            sprited: false,\n            uri: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yt/r/jopyzHwsKtN.png\",\n            width: 20,\n            height: 20\n        },\n        \"/images/chat/add.png\": {\n            sprited: true,\n            spriteMapCssClass: \"sp_9kaae3\",\n            spriteCssClass: \"sx_daa3c5\"\n        },\n        \"/images/chat/status/mobile.png\": {\n            sprited: true,\n            spriteMapCssClass: \"sp_9kaae3\",\n            spriteCssClass: \"sx_6633b3\"\n        },\n        \"/images/chat/sidebar/newGroupChat.png\": {\n            sprited: false,\n            uri: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/ys/r/S824hxiYJSG.png\",\n            width: 28,\n            height: 28\n        },\n        \"/images/chat/delete.png\": {\n            sprited: true,\n            spriteMapCssClass: \"sp_9kaae3\",\n            spriteCssClass: \"sx_1bb86f\"\n        },\n        \"/images/messaging/stickers/selector/store.png\": {\n            sprited: false,\n            uri: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y9/r/WG0aM70e5Iq.png\",\n            width: 20,\n            height: 20\n        }\n    },\n    js: [\"AyUu6\",\"OJTM4\",\"AsDOA\",\"63VzN\",\"H+v1W\",\"LpC/l\",\"brbS1\",\"u//Ut\",\"EzMPG\",],\n    id: \"pagelet_dock\",\n    phase: 3\n});");
// 1342
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"bigPipe.onPageletArrive({\n    content: {\n        fbRequestsList: {\n            container_id: \"u_0_1p\"\n        }\n    },\n    css: [\"W3Ky6\",],\n    bootloadable: {\n    },\n    resource_map: {\n    },\n    id: \"fbRequestsList\",\n    phase: 3\n});");
// 1343
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"s36ac659c411571829b74b36874dd86d2abc554af");
// 1344
geval("bigPipe.onPageletArrive({\n    JSBNG__content: {\n        fbRequestsList: {\n            container_id: \"u_0_1p\"\n        }\n    },\n    css: [\"W3Ky6\",],\n    bootloadable: {\n    },\n    resource_map: {\n    },\n    id: \"fbRequestsList\",\n    phase: 3\n});");
// 1346
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"bigPipe.onPageletArrive({\n    id: \"\",\n    phase: 3,\n    jsmods: {\n    },\n    is_last: true,\n    css: [\"W3Ky6\",\"0duP3\",\"vFtag\",\"ynBUm\",\"xqZGj\",\"yagwf\",],\n    bootloadable: {\n    },\n    resource_map: {\n    },\n    js: [\"AyUu6\",\"OJTM4\",\"AsDOA\",\"63VzN\",\"4vv8/\",\"u//Ut\",\"1XxM1\",\"5dFET\",\"hfrQl\",\"C6rJk\",],\n    the_end: true\n});");
// 1347
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"s0143c850f445614ea7a441221381555af42f3c7e");
// 1348
geval("bigPipe.onPageletArrive({\n    id: \"\",\n    phase: 3,\n    jsmods: {\n    },\n    is_last: true,\n    css: [\"W3Ky6\",\"0duP3\",\"vFtag\",\"ynBUm\",\"xqZGj\",\"yagwf\",],\n    bootloadable: {\n    },\n    resource_map: {\n    },\n    js: [\"AyUu6\",\"OJTM4\",\"AsDOA\",\"63VzN\",\"4vv8/\",\"u//Ut\",\"1XxM1\",\"5dFET\",\"hfrQl\",\"C6rJk\",],\n    the_end: true\n});");
// 1351
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_222[0], o0,o18);
// undefined
o18 = null;
// 1467
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"if (self.CavalryLogger) {\n    CavalryLogger.start_js([\"63VzN\",]);\n}\n;\n__d(\"NotificationURI\", [\"URI\",], function(a, b, c, d, e, f) {\n    var g = b(\"URI\"), h = {\n        localize: function(i) {\n            i = g(i);\n            if (!i.isFacebookURI()) {\n                return i.toString()\n            };\n            var j = i.getSubdomain();\n            return i.getUnqualifiedURI().getQualifiedURI().setSubdomain(j).toString();\n        },\n        snowliftable: function(i) {\n            if (!i) {\n                return false\n            };\n            i = g(i);\n            return (i.isFacebookURI() && i.getQueryData().hasOwnProperty(\"fbid\"));\n        },\n        isVaultSetURI: function(i) {\n            if (!i) {\n                return false\n            };\n            i = g(i);\n            return (i.isFacebookURI() && (i.getPath() == \"/ajax/vault/sharer_preview.php\"));\n        }\n    };\n    e.exports = h;\n});\n__d(\"legacy:fbdesktop-detect\", [\"FBDesktopDetect\",], function(a, b, c, d) {\n    a.FbDesktopDetect = b(\"FBDesktopDetect\");\n}, 3);\n__d(\"IntlUtils\", [\"AsyncRequest\",\"Cookie\",\"goURI\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = b(\"Cookie\"), i = b(\"goURI\"), j = {\n        setXmode: function(k) {\n            (new g()).setURI(\"/ajax/intl/save_xmode.php\").setData({\n                xmode: k\n            }).setHandler(function() {\n                document.location.reload();\n            }).send();\n        },\n        setAmode: function(k) {\n            new g().setURI(\"/ajax/intl/save_xmode.php\").setData({\n                amode: k,\n                app: false\n            }).setHandler(function() {\n                document.location.reload();\n            }).send();\n        },\n        setLocale: function(k, l, m, n) {\n            if (!m) {\n                m = k.options[k.selectedIndex].value;\n            };\n            j.saveLocale(m, true, null, l, n);\n        },\n        saveLocale: function(k, l, m, n, o) {\n            new g().setURI(\"/ajax/intl/save_locale.php\").setData({\n                aloc: k,\n                source: n,\n                app_only: o\n            }).setHandler(function(p) {\n                if (l) {\n                    document.location.reload();\n                }\n                 else i(m);\n            ;\n            }).send();\n        },\n        setLocaleCookie: function(k, l) {\n            h.set(\"locale\", k, ((7 * 24) * 3600000));\n            i(l);\n        }\n    };\n    e.exports = j;\n});\n__d(\"legacy:intl-base\", [\"IntlUtils\",], function(a, b, c, d) {\n    var e = b(\"IntlUtils\");\n    a.intl_set_xmode = e.setXmode;\n    a.intl_set_amode = e.setAmode;\n    a.intl_set_locale = e.setLocale;\n    a.intl_save_locale = e.saveLocale;\n    a.intl_set_cookie_locale = e.setLocaleCookie;\n}, 3);\n__d(\"legacy:onload-action\", [\"OnloadHooks\",], function(a, b, c, d) {\n    var e = b(\"OnloadHooks\");\n    a._onloadHook = e._onloadHook;\n    a._onafterloadHook = e._onafterloadHook;\n    a.runHook = e.runHook;\n    a.runHooks = e.runHooks;\n    a.keep_window_set_as_loaded = e.keepWindowSetAsLoaded;\n}, 3);\n__d(\"LoginFormController\", [\"Event\",\"ge\",\"Button\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"ge\"), i = b(\"Button\");\n    f.init = function(j, k) {\n        g.listen(j, \"submit\", function() {\n            i.setEnabled(k, false);\n            i.setEnabled.curry(k, true).defer(15000);\n        });\n        var l = h(\"lgnjs\");\n        if (l) {\n            l.value = parseInt((Date.now() / 1000), 10);\n        };\n    };\n});\n__d(\"ClickRefUtils\", [], function(a, b, c, d, e, f) {\n    var g = {\n        get_intern_ref: function(h) {\n            if (!!h) {\n                var i = {\n                    profile_minifeed: 1,\n                    gb_content_and_toolbar: 1,\n                    gb_muffin_area: 1,\n                    ego: 1,\n                    bookmarks_menu: 1,\n                    jewelBoxNotif: 1,\n                    jewelNotif: 1,\n                    BeeperBox: 1,\n                    navSearch: 1\n                };\n                for (var j = h; (j && (j != document.body)); j = j.parentNode) {\n                    if ((!j.id || (typeof j.id !== \"string\"))) {\n                        continue;\n                    };\n                    if ((j.id.substr(0, 8) == \"pagelet_\")) {\n                        return j.id.substr(8)\n                    };\n                    if ((j.id.substr(0, 8) == \"box_app_\")) {\n                        return j.id\n                    };\n                    if (i[j.id]) {\n                        return j.id\n                    };\n                };\n            }\n        ;\n            return \"-\";\n        },\n        get_href: function(h) {\n            var i = (((((h.getAttribute && ((h.getAttribute(\"ajaxify\") || h.getAttribute(\"data-endpoint\")))) || h.action) || h.href) || h.name));\n            return ((typeof i === \"string\") ? i : null);\n        },\n        should_report: function(h, i) {\n            if ((i == \"FORCE\")) {\n                return true\n            };\n            if ((i == \"INDIRECT\")) {\n                return false\n            };\n            return (h && ((g.get_href(h) || ((h.getAttribute && h.getAttribute(\"data-ft\"))))));\n        }\n    };\n    e.exports = g;\n});\n__d(\"setUECookie\", [\"Env\",], function(a, b, c, d, e, f) {\n    var g = b(\"Env\");\n    function h(i) {\n        if (!g.no_cookies) {\n            document.cookie = (((\"act=\" + encodeURIComponent(i)) + \"; path=/; domain=\") + window.location.hostname.replace(/^.*(\\.facebook\\..*)$/i, \"$1\"));\n        };\n    };\n    e.exports = h;\n});\n__d(\"ClickRefLogger\", [\"Arbiter\",\"EagleEye\",\"ClickRefUtils\",\"collectDataAttributes\",\"copyProperties\",\"ge\",\"setUECookie\",\"$\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"EagleEye\"), i = b(\"ClickRefUtils\"), j = b(\"collectDataAttributes\"), k = b(\"copyProperties\"), l = b(\"ge\"), m = b(\"setUECookie\"), n = b(\"$\");\n    function o(q) {\n        if (!l(\"content\")) {\n            return [0,0,0,0,]\n        };\n        var r = n(\"content\"), s = (a.Vector2 ? a.Vector2.getEventPosition(q) : {\n            x: 0,\n            y: 0\n        });\n        return [s.x,s.y,r.offsetLeft,r.clientWidth,];\n    };\n    function p(q, r, event, s) {\n        var t = ((!a.ArbiterMonitor) ? \"r\" : \"a\"), u = [0,0,0,0,], v, w, x;\n        if (!!event) {\n            v = event.type;\n            if (((v == \"click\") && l(\"content\"))) {\n                u = o(event);\n            };\n            var y = 0;\n            (event.ctrlKey && (y += 1));\n            (event.shiftKey && (y += 2));\n            (event.altKey && (y += 4));\n            (event.metaKey && (y += 8));\n            if (y) {\n                v += y;\n            };\n        }\n    ;\n        if (!!r) {\n            w = i.get_href(r);\n        };\n        var z = [];\n        if (a.ArbiterMonitor) {\n            x = a.ArbiterMonitor.getInternRef(r);\n            z = a.ArbiterMonitor.getActFields();\n        }\n    ;\n        var aa = j((!!event ? ((event.target || event.srcElement)) : r), [\"ft\",\"gt\",]);\n        k(aa.ft, (s.ft || {\n        }));\n        k(aa.gt, (s.gt || {\n        }));\n        if ((typeof (aa.ft.ei) === \"string\")) {\n            delete aa.ft.ei;\n        };\n        var ba = [q._ue_ts,q._ue_count,(w || \"-\"),q._context,(v || \"-\"),(x || i.get_intern_ref(r)),t,(a.URI ? a.URI.getRequestURI(true, true).getUnqualifiedURI().toString() : ((location.pathname + location.search) + location.hash)),aa,].concat(u).concat(z);\n        return ba;\n    };\n    g.subscribe(\"ClickRefAction/new\", function(q, r) {\n        if (i.should_report(r.node, r.mode)) {\n            var s = p(r.cfa, r.node, r.event, r.extra_data);\n            m(r.cfa.ue);\n            h.log(\"act\", s);\n            if (window.chromePerfExtension) {\n                window.postMessage({\n                    clickRef: JSON.stringify(s)\n                }, window.location.origin);\n            };\n        }\n    ;\n    });\n});\n__d(\"QuicklingAugmenter\", [\"URI\",], function(a, b, c, d, e, f) {\n    var g = b(\"URI\"), h = [], i = {\n        addHandler: function(j) {\n            h.push(j);\n        },\n        augmentURI: function(j) {\n            var k = [], l = g(j);\n            h.forEach(function(m) {\n                var n = m(l);\n                if (!n) {\n                    return l\n                };\n                k.push(m);\n                l = l.addQueryData(n);\n            });\n            h = k;\n            return l;\n        }\n    };\n    e.exports = i;\n});\n__d(\"Quickling\", [\"AjaxPipeRequest\",\"Arbiter\",\"Class\",\"CSSClassTransition\",\"DocumentTitle\",\"DOM\",\"ErrorUtils\",\"HTML\",\"OnloadHooks\",\"PageTransitions\",\"QuicklingAugmenter\",\"Run\",\"URI\",\"UserAgent\",\"copyProperties\",\"goOrReplace\",\"isEmpty\",\"QuicklingConfig\",], function(a, b, c, d, e, f) {\n    var g = b(\"AjaxPipeRequest\"), h = b(\"Arbiter\"), i = b(\"Class\"), j = b(\"CSSClassTransition\"), k = b(\"DocumentTitle\"), l = b(\"DOM\"), m = b(\"ErrorUtils\"), n = b(\"HTML\"), o = b(\"OnloadHooks\"), p = b(\"PageTransitions\"), q = b(\"QuicklingAugmenter\"), r = b(\"Run\"), s = b(\"URI\"), t = b(\"UserAgent\"), u = b(\"copyProperties\"), v = b(\"goOrReplace\"), w = b(\"isEmpty\"), x = b(\"QuicklingConfig\"), y = x.version, z = x.sessionLength, aa = new RegExp(x.inactivePageRegex), ba = 0, ca, da = \"\", ea = {\n        isActive: function() {\n            return true;\n        },\n        isPageActive: function(la) {\n            if ((la == \"#\")) {\n                return false\n            };\n            la = new s(la);\n            if ((la.getDomain() && (la.getDomain() != s().getDomain()))) {\n                return false\n            };\n            if ((la.getPath() == \"/l.php\")) {\n                var ma = la.getQueryData().u;\n                if (ma) {\n                    ma = s(unescape(ma)).getDomain();\n                    if ((ma && (ma != s().getDomain()))) {\n                        return false\n                    };\n                }\n            ;\n            }\n        ;\n            var na = la.getPath(), oa = la.getQueryData();\n            if (!w(oa)) {\n                na += (\"?\" + s.implodeQuery(oa));\n            };\n            return !aa.test(na);\n        },\n        getLoadCount: function() {\n            return ba;\n        }\n    };\n    function fa(la) {\n        la = (la || \"Facebook\");\n        k.set(la);\n        if (t.ie()) {\n            da = la;\n            if (!ca) {\n                ca = window.setInterval(function() {\n                    var ma = da, na = k.get();\n                    if ((ma != na)) {\n                        k.set(ma);\n                    };\n                }, 5000, false);\n            };\n        }\n    ;\n    };\n    function ga(la) {\n        var ma = document.getElementsByTagName(\"link\");\n        for (var na = 0; (na < ma.length); ++na) {\n            if ((ma[na].rel != \"alternate\")) {\n                continue;\n            };\n            l.remove(ma[na]);\n        };\n        if (la.length) {\n            var oa = l.find(document, \"head\");\n            (oa && l.appendContent(oa, n(la[0])));\n        }\n    ;\n    };\n    function ha(la) {\n        var ma = {\n            version: y\n        };\n        this.parent.construct(this, la, {\n            quickling: ma\n        });\n    };\n    i.extend(ha, g);\n    u(ha.prototype, {\n        _preBootloadFirstResponse: function(la) {\n            return true;\n        },\n        _fireDomContentCallback: function() {\n            (this._request.cavalry && this._request.cavalry.setTimeStamp(\"t_domcontent\"));\n            p.transitionComplete();\n            (this._onPageDisplayed && this._onPageDisplayed(this.pipe));\n            this.parent._fireDomContentCallback();\n        },\n        _fireOnloadCallback: function() {\n            if (this._request.cavalry) {\n                this._request.cavalry.setTimeStamp(\"t_hooks\");\n                this._request.cavalry.setTimeStamp(\"t_layout\");\n                this._request.cavalry.setTimeStamp(\"t_onload\");\n            }\n        ;\n            this.parent._fireOnloadCallback();\n        },\n        isPageActive: function(la) {\n            return ea.isPageActive(la);\n        },\n        _versionCheck: function(la) {\n            if ((la.version == y)) {\n                return true\n            };\n            var ma = [\"quickling\",\"ajaxpipe\",\"ajaxpipe_token\",];\n            v(window.location, s(la.uri).removeQueryData(ma), true);\n            return false;\n        },\n        _processFirstResponse: function(la) {\n            var ma = la.getPayload();\n            fa(ma.title);\n            ga((ma.syndication || []));\n            window.scrollTo(0, 0);\n            j.go(document.body, (ma.body_class || \"\"), p.getMostRecentURI(), la.getRequest().getURI());\n            h.inform(\"quickling/response\");\n        },\n        getSanitizedParameters: function() {\n            return [\"quickling\",];\n        }\n    });\n    function ia() {\n        ba++;\n        return (ba >= z);\n    };\n    function ja(la) {\n        g.setCurrentRequest(null);\n        if (ia()) {\n            return false\n        };\n        la = q.augmentURI(la);\n        if (!ea.isPageActive(la)) {\n            return false\n        };\n        window.ExitTime = Date.now();\n        r.__removeHook(\"onafterloadhooks\");\n        r.__removeHook(\"onloadhooks\");\n        o.runHooks(\"onleavehooks\");\n        h.inform(\"onload/exit\", true);\n        new ha(la).setCanvasId(\"content\").send();\n        return true;\n    };\n    function ka(la) {\n        var ma = window[la];\n        function na(oa, pa, qa) {\n            if ((typeof oa !== \"function\")) {\n                oa = eval.bind(null, oa);\n            };\n            var ra = ma(m.guard(oa), pa);\n            if ((pa > 0)) {\n                if ((qa !== false)) {\n                    r.onLeave(function() {\n                        clearInterval(ra);\n                    });\n                }\n            };\n            return ra;\n        };\n        window[la] = na;\n    };\n    r.onAfterLoad(function la() {\n        ka(\"setInterval\");\n        ka(\"setTimeout\");\n        p.registerHandler(ja, 1);\n    });\n    e.exports = a.Quickling = ea;\n});\n__d(\"ScubaSample\", [\"Banzai\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = \"scuba_sample\", h = b(\"Banzai\"), i = b(\"copyProperties\");\n    function j(m, n, o) {\n        this.fields = {\n        };\n        this.flush = function() {\n            if (!m) {\n                return\n            };\n            var p = {\n            };\n            i(p, this.fields);\n            p._ds = m;\n            if (n) {\n                p._lid = n;\n            };\n            p._options = o;\n            h.post(g, p);\n            this.flush = function() {\n            \n            };\n            this.flushed = true;\n        };\n        this.lid = n;\n        return this;\n    };\n    function k(m, n, o) {\n        if (!this.fields[m]) {\n            this.fields[m] = {\n            };\n        };\n        this.fields[m][n] = o;\n        return this;\n    };\n    function l(m) {\n        return function(n, o) {\n            if (this.flushed) {\n                return this\n            };\n            return k.call(this, m, n, o);\n        };\n    };\n    i(j.prototype, {\n        addNormal: l(\"normal\"),\n        addInteger: l(\"int\"),\n        addDenorm: l(\"denorm\")\n    });\n    e.exports = j;\n});\n__d(\"ScriptMonitorReporter\", [\"ScriptMonitor\",\"ScubaSample\",\"setTimeoutAcrossTransitions\",\"URI\",], function(a, b, c, d, e, f) {\n    var g = b(\"ScriptMonitor\"), h = b(\"ScubaSample\"), i = b(\"setTimeoutAcrossTransitions\"), j = b(\"URI\");\n    function k(o) {\n        var p = [];\n        for (var q = 0; (q < o.length); q++) {\n            p.push(new RegExp(o[q], \"i\"));;\n        };\n        return p;\n    };\n    function l(o, p) {\n        for (var q = 0; (q < p.length); q++) {\n            if (p[q].src) {\n                o.push(p[q].src);\n            };\n        };\n    };\n    function m(o, p) {\n        for (var q = 0; (q < p.length); q++) {\n            if (p[q].test(o)) {\n                return true\n            };\n        };\n        return false;\n    };\n    function n(o, p) {\n        var q = g.stop(), r = {\n            addGeoFields: 1,\n            addBrowserFields: 1,\n            addUser: 1\n        }, s = {\n        };\n        l(q, document.getElementsByTagName(\"script\"));\n        l(q, document.getElementsByTagName(\"iframe\"));\n        for (var t = 0; (t < q.length); t++) {\n            var u = q[t].replace(/\\?.*/, \"\"), v;\n            if (s[u]) {\n                continue;\n            };\n            s[u] = 1;\n            if (!j.isValidURI(u)) {\n                v = true;\n            }\n             else if (m(u, p)) {\n                v = false;\n            }\n             else if (m(new j(u).getDomain(), o)) {\n                v = false;\n            }\n             else v = true;\n            \n            \n        ;\n            if (v) {\n                new h(\"unknown_scripts\", 0, r).addNormal(\"url\", u).flush();\n            };\n        };\n    };\n    e.exports = {\n        runScan: function(o, p) {\n            i(function() {\n                n(k(o), k(p));\n            }, 5000);\n        }\n    };\n});\n__d(\"StringTransformations\", [], function(a, b, c, d, e, f) {\n    e.exports = {\n        unicodeEscape: function(g) {\n            return g.replace(/[^A-Za-z0-9\\-\\.\\:\\_\\$\\/\\+\\=]/g, function(h) {\n                var i = h.charCodeAt().toString(16);\n                return (\"\\\\u\" + ((\"0000\" + i.toUpperCase())).slice(-4));\n            });\n        },\n        unicodeUnescape: function(g) {\n            return g.replace(/(\\\\u[0-9A-Fa-f]{4})/g, function(h) {\n                return String.fromCharCode(parseInt(h.slice(2), 16));\n            });\n        }\n    };\n});\n__d(\"TimeSpentLogger\", [\"Arbiter\",\"Banzai\",\"CSS\",\"ClickRefUtils\",\"DOMEventListener\",\"ScriptPath\",\"UserActivity\",\"collectDataAttributes\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"Banzai\"), i = b(\"CSS\"), j = b(\"ClickRefUtils\"), k = b(\"DOMEventListener\"), l = b(\"ScriptPath\"), m = b(\"UserActivity\"), n = b(\"collectDataAttributes\"), o = b(\"copyProperties\"), p = [m.getLastInformTime(),0,], q = m.getLastInformTime(), r = {\n        tos_seq: 0,\n        tos_cumulative: 0,\n        transport_cause: null,\n        buenopath: null,\n        page_token: null,\n        elements: 0,\n        uact_tos: null,\n        client_time: null\n    }, s = 100, t = 100, u = (10 * 1000), v = (3 * 1000), w = 1, x = 2, y = 4, z = 8, aa = {\n    };\n    m.subscribe(function(ia, ja) {\n        var ka = (p.length - 1);\n        q = ja.last_inform;\n        if ((ja.idleness < v)) {\n            p[ka] += ja.idleness;\n            r.tos_cumulative += ja.idleness;\n        }\n         else {\n            if ((ka > s)) {\n                fa(\"array_limit_reached\");\n            };\n            p.push(ja.idleness, 0);\n        }\n    ;\n    });\n    function ba(ia) {\n        var ja = 0;\n        if (document.getElementById(\"boulder_fixed_header\")) {\n            ja = (ja | w);\n        };\n        if (i.hasClass(document.body, \"timelineLayout\")) {\n            ja = (ja | y);\n            var ka = document.getElementById(\"pagelet_main_column_personal\");\n            if ((ka && (ka.getAttribute(\"data-referrer\") === \"pagelet_main_column_personal_timeline\"))) {\n                ja = (ja | x);\n            };\n            if (i.hasClass(document.body, \"pagesTimelineLayout\")) {\n                ja = (ja | z);\n            };\n        }\n    ;\n        return ja;\n    };\n    function ca(ia) {\n        var ja = ba(), ka = l.getScriptPath(), la = l.getCategoryToken();\n        r.uact_tos = p;\n        if (ka) {\n            r.buenopath = ka.substring(0, t);\n        }\n         else r.buenopath = \"\";\n    ;\n        if (la) {\n            r.page_token = la;\n        }\n         else r.page_token = \"\";\n    ;\n        r.elements = ja;\n        r.transport_cause = ia;\n        r.client_time = Date.now();\n    };\n    function da() {\n        r.tos_seq += 1;\n        p = [q,0,];\n    };\n    var ea = {\n        store: true,\n        delay: 3000,\n        retry: true\n    };\n    function fa(ia) {\n        ca(ia);\n        if (h.isEnabled(\"time_spent\")) {\n            g.inform(\"timespent/tosdataposted\", o({\n            }, r));\n            h.post(\"time_spent\", o({\n            }, r), ea);\n        }\n    ;\n        da();\n    };\n    function ga() {\n        fa(\"heartbeat\");\n    };\n    function ha() {\n        fa(\"before_unload\");\n    };\n    if ((window.top == window.self)) {\n        k.add(window, \"beforeunload\", ha);\n        setInterval(function() {\n            if ((((Date.now() - m.getLastInformTime()) > ((u - 100))) && (((p.length > 2) || (p[(p.length - 1)] > 0))))) {\n                ga();\n            };\n        }, u);\n    }\n;\n    g.subscribe(\"UserAction/new\", function(ia, ja) {\n        if (j.should_report(ja.node, ja.mode)) {\n            var ka = n(ja.node, [\"gt\",]), la = {\n                iref: j.get_intern_ref(ja.node),\n                gt_ref: ka.ref,\n                nav_section: ka.nav_section\n            };\n            ca(\"useraction\");\n            o(la, r);\n            ja.ua.add_data(la);\n            g.inform(\"timespent/tosdataposted\", o({\n            }, r));\n            da();\n        }\n    ;\n    });\n    e.exports = aa;\n});\n__d(\"UserActionHistory\", [\"Arbiter\",\"ClickRefUtils\",\"ScriptPath\",\"throttle\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ClickRefUtils\"), i = b(\"ScriptPath\"), j = b(\"throttle\"), k = {\n        click: 1,\n        submit: 1\n    }, l = false, m = {\n        log: [],\n        len: 0\n    }, n = j.acrossTransitions(function() {\n        try {\n            l._ua_log = JSON.stringify(m);\n        } catch (q) {\n            l = false;\n        };\n    }, 1000);\n    function o() {\n        try {\n            if (a.sessionStorage) {\n                l = a.sessionStorage;\n                (l._ua_log && (m = JSON.parse(l._ua_log)));\n            }\n        ;\n        } catch (q) {\n            l = false;\n        };\n        m.log[(m.len % 10)] = {\n            ts: Date.now(),\n            path: \"-\",\n            index: m.len,\n            type: \"init\",\n            iref: \"-\"\n        };\n        m.len++;\n        g.subscribe(\"UserAction/new\", function(r, s) {\n            var t = s.ua, u = s.node, event = s.event;\n            if ((!event || !((event.type in k)))) {\n                return\n            };\n            var v = {\n                path: i.getScriptPath(),\n                type: event.type,\n                ts: t._ue_ts,\n                iref: (h.get_intern_ref(u) || \"-\"),\n                index: m.len\n            };\n            m.log[(m.len++ % 10)] = v;\n            (l && n());\n        });\n    };\n    function p() {\n        return m.log.sort(function(q, r) {\n            return (((r.ts != q.ts)) ? ((r.ts - q.ts)) : ((r.index - q.index)));\n        });\n    };\n    o();\n    e.exports = {\n        getHistory: p\n    };\n});\n__d(\"clip\", [], function(a, b, c, d, e, f) {\n    function g(h, i, j) {\n        return Math.min(Math.max(h, i), j);\n    };\n    e.exports = g;\n});\n__d(\"MusicButtonStore\", [], function(a, b, c, d, e, f) {\n    var g = {\n    }, h = {\n        addButton: function(i, j) {\n            g[i] = j;\n            return j;\n        },\n        getButton: function(i) {\n            return g[i];\n        },\n        getButtons: function() {\n            return g;\n        },\n        removeButton: function(i) {\n            (g[i] && g[i].resetLoadingTimers());\n            delete g[i];\n        }\n    };\n    e.exports = h;\n});\n__d(\"MusicConstants\", [\"URI\",], function(a, b, c, d, e, f) {\n    var g = b(\"URI\"), h = {\n        DEBUG: false,\n        LIVE_LISTEN_MIN_SPOTIFY_VERSION: \"spotify-0.6.6.0.g5a9eaca5\",\n        enableDebug: function() {\n            this.DEBUG = true;\n        },\n        sameURLs: function(i, j) {\n            var k = /\\/$/;\n            if ((i && j)) {\n                i = g(i);\n                j = g(j);\n                return ((i.getDomain() == j.getDomain()) && (i.getPath() == j.getPath()));\n            }\n        ;\n            return false;\n        },\n        greaterOrEqualToMinimumVersion: function(i, j) {\n            var k = /(?:\\d+\\.)+/, l = i.match(k)[0].split(\".\").slice(0, -1), m = j.match(k)[0].split(\".\").slice(0, -1);\n            if ((l.length !== m.length)) {\n                return false\n            };\n            for (var n = 0; (n < m.length); n++) {\n                if ((+l[n] < +m[n])) {\n                    return false;\n                }\n                 else if ((+l[n] > +m[n])) {\n                    return true\n                }\n            ;\n            };\n            return true;\n        },\n        sanitizeForProviders: function(i) {\n            var j = {\n            };\n            for (var k in i) {\n                if (this.ALLOWED_EXTERNAL_CONTEXT_PARAMS[k]) {\n                    j[k] = i[k];\n                };\n            };\n            return j;\n        },\n        OP: {\n            RESUME: \"RESUME\",\n            PAUSE: \"PAUSE\",\n            PLAY: \"PLAY\",\n            VERSION: \"VERSION\"\n        },\n        STATUS_CHANGE_OP: {\n            STATUS: \"STATUS\",\n            LOGIN: \"LOGIN\",\n            REINFORM: \"REINFORM\"\n        },\n        STATUS_CHANGE_EVENT: {\n            playing: \"PLAY_STATE_CHANGED\",\n            track: \"TRACK_CHANGED\"\n        },\n        DIAGNOSTIC_EVENT: {\n            ALL_PAUSED: \"ALL_PAUSED\",\n            ALL_OFFLINE: \"ALL_OFFLINE\",\n            OFFLINE: \"OFFLINE\",\n            ONLINE: \"ONLINE\",\n            SEARCHING: \"SEARCHING\",\n            HIT: \"HIT\",\n            MISS: \"MISS\",\n            RESIGN: \"RESIGN\",\n            IFRAME_POLLING: \"IFRAME_POLLING\",\n            RELAUNCH: \"RELAUNCH\",\n            STATE_CHANGE: \"STATE_CHANGE\",\n            WRONG_VERSION: \"WRONG_VERSION\",\n            SERVICE_ERROR: \"SERVICE_ERROR\",\n            INCORRECT_ONLINE_STATE: \"INCORRECT_ONLINE_STATE\",\n            LOG_SEND_OP: \"LOG_SEND_OP\",\n            REQUEUE_OP: \"REQUEUE_OP\"\n        },\n        ALLOWED_STATUS_PARAMS: {\n            playing: \"playing\",\n            track: \"track\",\n            context: \"context\",\n            client_version: \"client_version\",\n            start_time: \"start_time\",\n            expires_in: \"expires_in\",\n            open_graph_state: \"open_graph_state\"\n        },\n        ALLOWED_EXTERNAL_CONTEXT_PARAMS: {\n            uri: true,\n            song: true,\n            radio_station: true,\n            album: true,\n            playlist: true,\n            musician: true,\n            song_list: true,\n            offset: true,\n            title: true,\n            request_id: true,\n            listen_with_friends: true,\n            needs_tos: true\n        },\n        LIVE_LISTEN_OP: {\n            NOW_LEADING: \"NOW_LEADING\",\n            NOW_LISTENING: \"NOW_LISTENING\",\n            END_SESSION: \"END_SESSION\",\n            SONG_PLAYING: \"SONG_PLAYING\",\n            LISTENER_UPDATE: \"LISTENER_UPDATE\",\n            QUEUE_SESSION: \"QUEUE_SESSION\",\n            PLAY_ERROR: \"PLAY_ERROR\",\n            SESSION_UPDATED: \"SESSION_UPDATED\",\n            QUEUING_SESSION: \"QUEUING_SESSION\"\n        },\n        MUSIC_BUTTON: {\n            ACTIVATE: \"ACTIVATE\"\n        },\n        ERROR: {\n            1: \"SERVICE_UNAVAILABLE_WITHOUT_PREMIUM\",\n            2: \"SERVICE_UNAVAILABLE_WITHOUT_PREMIUM_OR_WAIT\",\n            3: \"SERVICE_UNAVAILABLE_BILLING_ISSUE\",\n            4: \"SERVICE_UNAVAILABLE_TECHNICAL_ISSUE\",\n            5: \"AUDIO_AD_PLAYING\",\n            99: \"SERVICE_TEMPORARILY_UNAVAILABLE\",\n            101: \"SONG_UNAVAILABLE_WITHOUT_PURCHASE\",\n            102: \"SONG_UNAVAILABLE_WITHOUT_PREMIUM\",\n            103: \"SONG_UNAVAILABLE_INDEFINITELY\"\n        }\n    };\n    e.exports = (a.MusicConstants || h);\n});\n__d(\"MusicEvents\", [\"Arbiter\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\");\n    e.exports = a.MusicEvents = new g();\n});\n__d(\"MusicButton\", [\"BanzaiODS\",\"Bootloader\",\"copyProperties\",\"CSS\",\"DOM\",\"MusicButtonStore\",\"MusicConstants\",\"MusicEvents\",\"Parent\",\"ScubaSample\",\"Tooltip\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"BanzaiODS\"), h = b(\"Bootloader\"), i = b(\"copyProperties\"), j = b(\"CSS\"), k = b(\"DOM\"), l = b(\"MusicButtonStore\"), m = b(\"MusicConstants\"), n = b(\"MusicEvents\"), o = b(\"Parent\"), p = b(\"ScubaSample\"), q = b(\"Tooltip\"), r = b(\"cx\"), s = function(t, u, v, w, x, y) {\n        this.provider = t;\n        this.buttonElem = u;\n        this.url = v;\n        this.context = (w || {\n        });\n        this.mediaType = x;\n        this.setState(this.STATES.OFFLINE);\n        this.tooltip = (y || \"\");\n        n.subscribe(m.MUSIC_BUTTON.ACTIVATE, this.processClick.bind(this));\n    };\n    i(s, {\n        tracksetableTypes: []\n    });\n    i(s.prototype, {\n        SHOW_LOADING_TIMEOUT: 500,\n        HIDE_LOADING_TIMEOUT: 4000,\n        RECENTLY_ONLINE_TIMEOUT: 6000,\n        STATES: {\n            PLAYING: \"music_playing\",\n            PAUSED: \"music_paused\",\n            LOADING: \"music_loading\",\n            DISABLED: \"music_disabled\",\n            OFFLINE: \"music_offline\"\n        },\n        setState: function(t) {\n            if ((t !== this.STATES.LOADING)) {\n                this.resetLoadingTimers();\n                this.previousState = (this.state || t);\n            }\n        ;\n            if ((t === this.STATES.PLAYING)) {\n                q.set(this.buttonElem, this.tooltip);\n            }\n             else q.set(this.buttonElem, \"\");\n        ;\n            var u = this.buttonElem.parentNode;\n            (this.state && j.removeClass(u, this.state));\n            this.state = t;\n            j.addClass(u, this.state);\n        },\n        isTracksetable: function(t) {\n            return (s.tracksetableTypes.indexOf(this.mediaType) !== -1);\n        },\n        handleIncomingEvent: function(t, u) {\n            clearTimeout(this._showLoadingTimer);\n            if (((u && u.provider) && (u.provider != this.provider))) {\n                return\n            };\n            switch (t) {\n              case m.DIAGNOSTIC_EVENT.ONLINE:\n            \n              case m.STATUS_CHANGE_EVENT.track:\n            \n              case m.STATUS_CHANGE_EVENT.playing:\n                var v = ((u && u.track) && u.track.uri), w = ((u && u.context) && u.context.uri);\n                if (((u && u.playing) && ((m.sameURLs(v, this.url) || m.sameURLs(w, this.url))))) {\n                    this.setState(this.STATES.PLAYING);\n                }\n                 else if (((this.state === this.STATES.LOADING) && (((this.previousState === this.STATES.PAUSED) || (this.previousState === this.STATES.OFFLINE))))) {\n                    clearTimeout(this._attemptingPlayTimer);\n                    this._attemptingPlayTimer = this.setState.bind(this, this.STATES.PAUSED).defer(this.RECENTLY_ONLINE_TIMEOUT, false);\n                }\n                 else if (!this._attemptingPlayTimer) {\n                    this.setState(this.STATES.PAUSED);\n                }\n                \n            ;\n                break;\n              case m.DIAGNOSTIC_EVENT.OFFLINE:\n                this.setState(this.STATES.OFFLINE);\n                break;\n              case m.DIAGNOSTIC_EVENT.ALL_OFFLINE:\n                this.setState(this.STATES.OFFLINE);\n                break;\n            };\n        },\n        processClick: function(t, u) {\n            if ((u != this.buttonElem)) {\n                if ((this.state === this.STATES.LOADING)) {\n                    (this.previousState && this.setState(this.previousState));\n                };\n                return;\n            }\n        ;\n            var v = new p(\"music_play_button_click\", null, {\n                addBrowserFields: true,\n                addGeoFields: true,\n                addUser: true\n            });\n            v.addNormal(\"uses_bridge\", \"1\");\n            v.addNormal(\"state\", this.state);\n            v.addNormal(\"provider\", this.provider);\n            v.addNormal(\"class\", \"MusicButton\");\n            v.addDenorm(\"url\", this.url);\n            v.flush();\n            if ((this.state != this.STATES.PLAYING)) {\n                g.bumpEntityKey(\"music_play_button\", \"music_play_button_click\");\n                g.bumpEntityKey(\"music_play_button\", (\"music_play_button_click.\" + this.provider));\n                var w = o.byClass(this.buttonElem, \"_4--s\");\n                if (w) {\n                    j.addClass(w, \"_4--t\");\n                    j.removeClass.curry(w, \"_4--t\").defer(3000);\n                }\n            ;\n            }\n        ;\n            var x = (this.isTracksetable() && o.byClass(this.buttonElem, \"music_trackset_container\")), y = [];\n            if (x) {\n                var z = x.getAttribute(\"data-trackset-title\"), aa = this.provider, ba = k.scry(x, \".music_button\");\n                for (var ca = 0; (ca < ba.length); ca++) {\n                    var da = l.getButton([ba[ca].id,]);\n                    if (((da && (da.provider == aa)) && da.isTracksetable())) {\n                        y.push(da.url);\n                    };\n                };\n            }\n        ;\n            if (!a.Music) {\n                this.showLoading(true);\n            };\n            h.loadModules([\"Music\",], function(ea) {\n                var fa = (((x && (y.length > 1))) ? ea.playPauseSongList(this.provider, this.url, y, z, this.context) : ea.playPauseSong(this.provider, this.url, this.context));\n                this.showLoading(!fa);\n            }.bind(this));\n        },\n        showLoading: function(t) {\n            this.resetLoadingTimers();\n            this._hideLoadingTimer = this._timeout.bind(this, t).defer(this.HIDE_LOADING_TIMEOUT, false);\n            this._showLoadingTimer = this.setState.bind(this, this.STATES.LOADING).defer(this.SHOW_LOADING_TIMEOUT, false);\n        },\n        resetLoadingTimers: function() {\n            clearTimeout(this._hideLoadingTimer);\n            clearTimeout(this._showLoadingTimer);\n            clearTimeout(this._attemptingPlayTimer);\n            this._attemptingPlayTimer = null;\n        },\n        destroy: function() {\n            this.resetLoadingTimers();\n            this.buttonElem = null;\n        },\n        _timeout: function(t) {\n            (a.Music && a.Music.reInform([this.provider,]));\n            if ((!t && (this.state === this.STATES.LOADING))) {\n                this.setState(this.STATES.PAUSED);\n            };\n        }\n    });\n    e.exports = s;\n});\n__d(\"MusicButtonManager\", [\"Event\",\"DOM\",\"KeyedCallbackManager\",\"Layer\",\"MusicButton\",\"MusicButtonStore\",\"MusicConstants\",\"MusicEvents\",\"Parent\",\"$\",\"copyProperties\",\"ge\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"DOM\"), i = b(\"KeyedCallbackManager\"), j = b(\"Layer\"), k = b(\"MusicButton\"), l = b(\"MusicButtonStore\"), m = b(\"MusicConstants\"), n = b(\"MusicEvents\"), o = b(\"Parent\"), p = b(\"$\"), q = b(\"copyProperties\"), r = b(\"ge\"), s = new i(), t = null, u = {\n    }, v = 0;\n    function w(da) {\n        var ea = da.getTarget(), fa = o.byClass(ea, \"music_button\");\n        fa = (fa || ((!((da.getModifiers && da.getModifiers().any)) && x(ea))));\n        if (!fa) {\n            return\n        };\n        return y(fa, da);\n    };\n    function x(da) {\n        var ea = (o.byClass(da, \"music_button_trigger\") && o.byClass(da, \"music_button_trigger_group\"));\n        if (ea) {\n            var fa = h.scry(ea, \".music_button\");\n            if (fa.length) {\n                return fa[0]\n            };\n        }\n    ;\n        return null;\n    };\n    function y(da, event) {\n        (event && event.stop());\n        n.inform(m.MUSIC_BUTTON.ACTIVATE, da);\n        return false;\n    };\n    function z(da) {\n        (a.Music && a.Music.reInform(da));\n    };\n    function aa(da, ea) {\n        var fa = l.getButtons();\n        for (var ga in fa) {\n            if ((fa[ga].noGC || r(ga))) {\n                fa[ga].handleIncomingEvent(da, ea);\n            }\n             else l.removeButton(ga);\n        ;\n        };\n    };\n    var ba = {\n        init: function(da) {\n            if (t) {\n                return\n            };\n            t = true;\n            k.tracksetableTypes = (da || []);\n            g.listen(document.body, \"click\", w);\n            n.subscribe([m.STATUS_CHANGE_EVENT.playing,m.STATUS_CHANGE_EVENT.track,m.DIAGNOSTIC_EVENT.OFFLINE,m.DIAGNOSTIC_EVENT.ALL_OFFLINE,m.DIAGNOSTIC_EVENT.ONLINE,], aa);\n        },\n        add: function(da, ea, fa, ga, ha, ia) {\n            (t || ba.init());\n            var ja = ea.id, ka = l.getButton(ja);\n            if (ka) {\n                return ka\n            };\n            ka = l.addButton(ja, new k(da, ea, fa, q({\n                button_id: ja\n            }, ga), ha, ia));\n            var la = o.byClass(ea, \"uiOverlay\");\n            if (la) {\n                ka.noGC = true;\n                var ma = j.subscribe(\"destroy\", function(na, oa) {\n                    if (h.contains(oa.getRoot(), ea)) {\n                        l.removeButton(ja);\n                        j.unsubscribe(ma);\n                    }\n                ;\n                });\n            }\n        ;\n            if ((da && !u[da])) {\n                u[da] = function() {\n                    var na = Object.keys(u);\n                    (na.length && z(na));\n                    u = {\n                    };\n                }.defer();\n            };\n            return ka;\n        },\n        addButton: function(da, ea, fa, ga, ha, ia) {\n            if (!r(ea)) {\n                return\n            };\n            var ja = p(ea);\n            return ba.add(da, ja, fa, ga, ha, ia);\n        },\n        asyncAddMusicButton: function(da, ea) {\n            da.setAttribute(\"id\", (\"music_button_\" + v++));\n            ca(da, ea);\n        },\n        tryAddButtonInDOM: function(da, ea) {\n            var fa = r(da);\n            (fa && ca(fa, ea));\n        },\n        addMusicData: function(da, ea, fa, ga, ha, ia) {\n            s.setResource(da, {\n                provider: ea,\n                uri: fa,\n                context: ga,\n                media_type: ha,\n                tooltip: ia\n            });\n        }\n    };\n    function ca(da, ea) {\n        var fa = h.find(da, \"a.button_anchor\").getAttribute(\"href\");\n        s.executeOrEnqueue(fa, function(ga) {\n            return ba.add(ga.provider, da, ga.uri, ga.context, ga.media_type, (ea ? ga.tooltip : \"\"));\n        });\n    };\n    e.exports = (a.MusicButtonManager || ba);\n});\n__d(\"TinyViewport\", [\"Arbiter\",\"CSS\",\"DOM\",\"Event\",\"queryThenMutateDOM\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"CSS\"), i = b(\"DOM\"), j = b(\"Event\"), k = b(\"queryThenMutateDOM\"), l = document.documentElement, m, n, o = k.bind(null, function() {\n        n = (n || i.getDocumentScrollElement());\n        m = ((l.clientHeight < 400) || (l.clientWidth < n.scrollWidth));\n    }, function() {\n        h.conditionClass(l, \"tinyViewport\", m);\n        h.conditionClass(l, \"canHaveFixedElements\", !m);\n    }, \"TinyViewport\");\n    o();\n    g.subscribe(\"quickling/response\", o);\n    j.listen(window, \"resize\", o);\n});\n__d(\"TimeSpentArray\", [\"Banzai\",\"pageID\",], function(a, b, c, d, e, f) {\n    var g = b(\"Banzai\"), h = b(\"pageID\"), i = 2, j = (i * 32), k = 1500, l, m, n, o, p, q, r, s, t;\n    function u() {\n        if (l) {\n            var ca = Date.now();\n            if ((ca > p)) {\n                r = Math.min(j, Math.ceil((((ca / 1000)) - o)));\n            };\n            var da = z();\n            if (da) {\n                l(da);\n            };\n        }\n    ;\n        y();\n    };\n    function v() {\n        w();\n        m = setTimeout(u, ((n * 1000) + k), false);\n    };\n    function w() {\n        if (m) {\n            clearTimeout(m);\n            m = null;\n        }\n    ;\n    };\n    function x(ca) {\n        o = ca;\n        p = (o * 1000);\n        q = [1,];\n        for (var da = 1; (da < i); da++) {\n            q.push(0);;\n        };\n        r = 1;\n        s += 1;\n        t += 1;\n        v();\n    };\n    function y() {\n        w();\n        q = null;\n        n = j;\n    };\n    function z() {\n        if (!q) {\n            return null\n        };\n        return {\n            tos_id: h,\n            start_time: o,\n            tos_array: q.slice(0),\n            tos_len: r,\n            tos_seq: t,\n            tos_cum: s\n        };\n    };\n    function aa(ca) {\n        if (((ca >= p) && (((ca - p)) < 1000))) {\n            return\n        };\n        ba(Math.floor((ca / 1000)));\n    };\n    function ba(ca) {\n        var da = (ca - o);\n        if (((da < 0) || (da >= j))) {\n            u();\n        };\n        if (!q) {\n            x(ca);\n        }\n         else {\n            q[(da >> 5)] |= ((1 << ((da & 31))));\n            r = (da + 1);\n            s += 1;\n            p = (ca * 1000);\n        }\n    ;\n    };\n    e.exports = {\n        init: function(ca, da) {\n            s = 0;\n            t = -1;\n            l = ca;\n            n = (da || j);\n            x(Math.floor((Date.now() / 1000)));\n            g.subscribe(g.SHUTDOWN, u);\n        },\n        update: function(ca) {\n            aa(ca);\n        },\n        get: function() {\n            return z();\n        },\n        ship: function() {\n            u();\n        },\n        reset: function() {\n            y();\n        }\n    };\n});\n__d(\"WebStorageMonster\", [\"Event\",\"AsyncRequest\",\"UserActivity\",\"StringTransformations\",\"arrayContains\",\"setTimeoutAcrossTransitions\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"AsyncRequest\"), i = b(\"UserActivity\"), j = b(\"StringTransformations\"), k = b(\"arrayContains\"), l = b(\"setTimeoutAcrossTransitions\"), m = 300000, n = false;\n    function o(t) {\n        var u = {\n        };\n        for (var v in t) {\n            var w = t.getItem(v), x = j.unicodeEscape(v);\n            if ((typeof w === \"string\")) {\n                u[x] = w.length;\n            };\n        };\n        return u;\n    };\n    function p(t) {\n        if ((a.localStorage && t.keys)) {\n            s._getLocalStorageKeys().forEach(function(u) {\n                if (k(t.keys, u)) {\n                    a.localStorage.removeItem(u);\n                };\n            });\n        };\n    };\n    function q(t) {\n        if (a.localStorage) {\n            s._getLocalStorageKeys().forEach(function(u) {\n                if (!t.some(function(v) {\n                    return new RegExp(v).test(u);\n                })) {\n                    a.localStorage.removeItem(u);\n                };\n            });\n        };\n        if (a.sessionStorage) {\n            a.sessionStorage.clear();\n        };\n    };\n    function r(t) {\n        if (i.isActive(m)) {\n            l(r.curry(t), m);\n        }\n         else s.cleanNow(t);\n    ;\n    };\n    var s = {\n        registerLogoutForm: function(t, u) {\n            g.listen(t, \"submit\", function(v) {\n                s.cleanOnLogout(u);\n            });\n        },\n        schedule: function(t) {\n            if (n) {\n                return\n            };\n            n = true;\n            r(t);\n        },\n        cleanNow: function(t) {\n            var u = Date.now(), v = {\n            }, w = false;\n            [\"localStorage\",\"sessionStorage\",].forEach(function(y) {\n                if (a[y]) {\n                    v[y] = o(a[y]);\n                    w = true;\n                }\n            ;\n            });\n            var x = Date.now();\n            v.logtime = (x - u);\n            if (w) {\n                new h(\"/ajax/webstorage/process_keys.php\").setData(v).setHandler(function(y) {\n                    if (!t) {\n                        var z = y.getPayload();\n                        if (z.keys) {\n                            z.keys = z.keys.map(j.unicodeUnescape);\n                        };\n                        p(z);\n                    }\n                ;\n                }.bind(this)).send();\n            };\n        },\n        cleanOnLogout: function(t) {\n            if (t) {\n                q(t);\n            };\n            if (a.sessionStorage) {\n                a.sessionStorage.clear();\n            };\n        },\n        _getLocalStorageKeys: Object.keys.curry(a.localStorage)\n    };\n    e.exports = s;\n});");
// 1510
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"if (self.CavalryLogger) {\n    CavalryLogger.start_js([\"63VzN\",]);\n}\n;\n__d(\"NotificationURI\", [\"URI\",], function(a, b, c, d, e, f) {\n    var g = b(\"URI\"), h = {\n        localize: function(i) {\n            i = g(i);\n            if (!i.isFacebookURI()) {\n                return i.toString()\n            };\n            var j = i.getSubdomain();\n            return i.getUnqualifiedURI().getQualifiedURI().setSubdomain(j).toString();\n        },\n        snowliftable: function(i) {\n            if (!i) {\n                return false\n            };\n            i = g(i);\n            return (i.isFacebookURI() && i.getQueryData().hasOwnProperty(\"fbid\"));\n        },\n        isVaultSetURI: function(i) {\n            if (!i) {\n                return false\n            };\n            i = g(i);\n            return (i.isFacebookURI() && (i.getPath() == \"/ajax/vault/sharer_preview.php\"));\n        }\n    };\n    e.exports = h;\n});\n__d(\"legacy:fbdesktop-detect\", [\"FBDesktopDetect\",], function(a, b, c, d) {\n    a.FbDesktopDetect = b(\"FBDesktopDetect\");\n}, 3);\n__d(\"IntlUtils\", [\"AsyncRequest\",\"Cookie\",\"goURI\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = b(\"Cookie\"), i = b(\"goURI\"), j = {\n        setXmode: function(k) {\n            (new g()).setURI(\"/ajax/intl/save_xmode.php\").setData({\n                xmode: k\n            }).setHandler(function() {\n                document.location.reload();\n            }).send();\n        },\n        setAmode: function(k) {\n            new g().setURI(\"/ajax/intl/save_xmode.php\").setData({\n                amode: k,\n                app: false\n            }).setHandler(function() {\n                document.location.reload();\n            }).send();\n        },\n        setLocale: function(k, l, m, n) {\n            if (!m) {\n                m = k.options[k.selectedIndex].value;\n            };\n            j.saveLocale(m, true, null, l, n);\n        },\n        saveLocale: function(k, l, m, n, o) {\n            new g().setURI(\"/ajax/intl/save_locale.php\").setData({\n                aloc: k,\n                source: n,\n                app_only: o\n            }).setHandler(function(p) {\n                if (l) {\n                    document.location.reload();\n                }\n                 else i(m);\n            ;\n            }).send();\n        },\n        setLocaleCookie: function(k, l) {\n            h.set(\"locale\", k, ((7 * 24) * 3600000));\n            i(l);\n        }\n    };\n    e.exports = j;\n});\n__d(\"legacy:intl-base\", [\"IntlUtils\",], function(a, b, c, d) {\n    var e = b(\"IntlUtils\");\n    a.intl_set_xmode = e.setXmode;\n    a.intl_set_amode = e.setAmode;\n    a.intl_set_locale = e.setLocale;\n    a.intl_save_locale = e.saveLocale;\n    a.intl_set_cookie_locale = e.setLocaleCookie;\n}, 3);\n__d(\"legacy:onload-action\", [\"OnloadHooks\",], function(a, b, c, d) {\n    var e = b(\"OnloadHooks\");\n    a._onloadHook = e._onloadHook;\n    a._onafterloadHook = e._onafterloadHook;\n    a.runHook = e.runHook;\n    a.runHooks = e.runHooks;\n    a.keep_window_set_as_loaded = e.keepWindowSetAsLoaded;\n}, 3);\n__d(\"LoginFormController\", [\"Event\",\"ge\",\"Button\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"ge\"), i = b(\"Button\");\n    f.init = function(j, k) {\n        g.listen(j, \"submit\", function() {\n            i.setEnabled(k, false);\n            i.setEnabled.curry(k, true).defer(15000);\n        });\n        var l = h(\"lgnjs\");\n        if (l) {\n            l.value = parseInt((Date.now() / 1000), 10);\n        };\n    };\n});\n__d(\"ClickRefUtils\", [], function(a, b, c, d, e, f) {\n    var g = {\n        get_intern_ref: function(h) {\n            if (!!h) {\n                var i = {\n                    profile_minifeed: 1,\n                    gb_content_and_toolbar: 1,\n                    gb_muffin_area: 1,\n                    ego: 1,\n                    bookmarks_menu: 1,\n                    jewelBoxNotif: 1,\n                    jewelNotif: 1,\n                    BeeperBox: 1,\n                    navSearch: 1\n                };\n                for (var j = h; (j && (j != document.body)); j = j.parentNode) {\n                    if ((!j.id || (typeof j.id !== \"string\"))) {\n                        continue;\n                    };\n                    if ((j.id.substr(0, 8) == \"pagelet_\")) {\n                        return j.id.substr(8)\n                    };\n                    if ((j.id.substr(0, 8) == \"box_app_\")) {\n                        return j.id\n                    };\n                    if (i[j.id]) {\n                        return j.id\n                    };\n                };\n            }\n        ;\n            return \"-\";\n        },\n        get_href: function(h) {\n            var i = (((((h.getAttribute && ((h.getAttribute(\"ajaxify\") || h.getAttribute(\"data-endpoint\")))) || h.action) || h.href) || h.name));\n            return ((typeof i === \"string\") ? i : null);\n        },\n        should_report: function(h, i) {\n            if ((i == \"FORCE\")) {\n                return true\n            };\n            if ((i == \"INDIRECT\")) {\n                return false\n            };\n            return (h && ((g.get_href(h) || ((h.getAttribute && h.getAttribute(\"data-ft\"))))));\n        }\n    };\n    e.exports = g;\n});\n__d(\"setUECookie\", [\"Env\",], function(a, b, c, d, e, f) {\n    var g = b(\"Env\");\n    function h(i) {\n        if (!g.no_cookies) {\n            document.cookie = (((\"act=\" + encodeURIComponent(i)) + \"; path=/; domain=\") + window.location.hostname.replace(/^.*(\\.facebook\\..*)$/i, \"$1\"));\n        };\n    };\n    e.exports = h;\n});\n__d(\"ClickRefLogger\", [\"Arbiter\",\"EagleEye\",\"ClickRefUtils\",\"collectDataAttributes\",\"copyProperties\",\"ge\",\"setUECookie\",\"$\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"EagleEye\"), i = b(\"ClickRefUtils\"), j = b(\"collectDataAttributes\"), k = b(\"copyProperties\"), l = b(\"ge\"), m = b(\"setUECookie\"), n = b(\"$\");\n    function o(q) {\n        if (!l(\"content\")) {\n            return [0,0,0,0,]\n        };\n        var r = n(\"content\"), s = (a.Vector2 ? a.Vector2.getEventPosition(q) : {\n            x: 0,\n            y: 0\n        });\n        return [s.x,s.y,r.offsetLeft,r.clientWidth,];\n    };\n    function p(q, r, event, s) {\n        var t = ((!a.ArbiterMonitor) ? \"r\" : \"a\"), u = [0,0,0,0,], v, w, x;\n        if (!!event) {\n            v = event.type;\n            if (((v == \"click\") && l(\"content\"))) {\n                u = o(event);\n            };\n            var y = 0;\n            (event.ctrlKey && (y += 1));\n            (event.shiftKey && (y += 2));\n            (event.altKey && (y += 4));\n            (event.metaKey && (y += 8));\n            if (y) {\n                v += y;\n            };\n        }\n    ;\n        if (!!r) {\n            w = i.get_href(r);\n        };\n        var z = [];\n        if (a.ArbiterMonitor) {\n            x = a.ArbiterMonitor.getInternRef(r);\n            z = a.ArbiterMonitor.getActFields();\n        }\n    ;\n        var aa = j((!!event ? ((event.target || event.srcElement)) : r), [\"ft\",\"gt\",]);\n        k(aa.ft, (s.ft || {\n        }));\n        k(aa.gt, (s.gt || {\n        }));\n        if ((typeof (aa.ft.ei) === \"string\")) {\n            delete aa.ft.ei;\n        };\n        var ba = [q._ue_ts,q._ue_count,(w || \"-\"),q._context,(v || \"-\"),(x || i.get_intern_ref(r)),t,(a.URI ? a.URI.getRequestURI(true, true).getUnqualifiedURI().toString() : ((location.pathname + location.search) + location.hash)),aa,].concat(u).concat(z);\n        return ba;\n    };\n    g.subscribe(\"ClickRefAction/new\", function(q, r) {\n        if (i.should_report(r.node, r.mode)) {\n            var s = p(r.cfa, r.node, r.event, r.extra_data);\n            m(r.cfa.ue);\n            h.log(\"act\", s);\n            if (window.chromePerfExtension) {\n                window.postMessage({\n                    clickRef: JSON.stringify(s)\n                }, window.location.origin);\n            };\n        }\n    ;\n    });\n});\n__d(\"QuicklingAugmenter\", [\"URI\",], function(a, b, c, d, e, f) {\n    var g = b(\"URI\"), h = [], i = {\n        addHandler: function(j) {\n            h.push(j);\n        },\n        augmentURI: function(j) {\n            var k = [], l = g(j);\n            h.forEach(function(m) {\n                var n = m(l);\n                if (!n) {\n                    return l\n                };\n                k.push(m);\n                l = l.addQueryData(n);\n            });\n            h = k;\n            return l;\n        }\n    };\n    e.exports = i;\n});\n__d(\"Quickling\", [\"AjaxPipeRequest\",\"Arbiter\",\"Class\",\"CSSClassTransition\",\"DocumentTitle\",\"DOM\",\"ErrorUtils\",\"HTML\",\"OnloadHooks\",\"PageTransitions\",\"QuicklingAugmenter\",\"Run\",\"URI\",\"UserAgent\",\"copyProperties\",\"goOrReplace\",\"isEmpty\",\"QuicklingConfig\",], function(a, b, c, d, e, f) {\n    var g = b(\"AjaxPipeRequest\"), h = b(\"Arbiter\"), i = b(\"Class\"), j = b(\"CSSClassTransition\"), k = b(\"DocumentTitle\"), l = b(\"DOM\"), m = b(\"ErrorUtils\"), n = b(\"HTML\"), o = b(\"OnloadHooks\"), p = b(\"PageTransitions\"), q = b(\"QuicklingAugmenter\"), r = b(\"Run\"), s = b(\"URI\"), t = b(\"UserAgent\"), u = b(\"copyProperties\"), v = b(\"goOrReplace\"), w = b(\"isEmpty\"), x = b(\"QuicklingConfig\"), y = x.version, z = x.sessionLength, aa = new RegExp(x.inactivePageRegex), ba = 0, ca, da = \"\", ea = {\n        isActive: function() {\n            return true;\n        },\n        isPageActive: function(la) {\n            if ((la == \"#\")) {\n                return false\n            };\n            la = new s(la);\n            if ((la.getDomain() && (la.getDomain() != s().getDomain()))) {\n                return false\n            };\n            if ((la.getPath() == \"/l.php\")) {\n                var ma = la.getQueryData().u;\n                if (ma) {\n                    ma = s(unescape(ma)).getDomain();\n                    if ((ma && (ma != s().getDomain()))) {\n                        return false\n                    };\n                }\n            ;\n            }\n        ;\n            var na = la.getPath(), oa = la.getQueryData();\n            if (!w(oa)) {\n                na += (\"?\" + s.implodeQuery(oa));\n            };\n            return !aa.test(na);\n        },\n        getLoadCount: function() {\n            return ba;\n        }\n    };\n    function fa(la) {\n        la = (la || \"Facebook\");\n        k.set(la);\n        if (t.ie()) {\n            da = la;\n            if (!ca) {\n                ca = window.setInterval(function() {\n                    var ma = da, na = k.get();\n                    if ((ma != na)) {\n                        k.set(ma);\n                    };\n                }, 5000, false);\n            };\n        }\n    ;\n    };\n    function ga(la) {\n        var ma = document.getElementsByTagName(\"link\");\n        for (var na = 0; (na < ma.length); ++na) {\n            if ((ma[na].rel != \"alternate\")) {\n                continue;\n            };\n            l.remove(ma[na]);\n        };\n        if (la.length) {\n            var oa = l.find(document, \"head\");\n            (oa && l.appendContent(oa, n(la[0])));\n        }\n    ;\n    };\n    function ha(la) {\n        var ma = {\n            version: y\n        };\n        this.parent.construct(this, la, {\n            quickling: ma\n        });\n    };\n    i.extend(ha, g);\n    u(ha.prototype, {\n        _preBootloadFirstResponse: function(la) {\n            return true;\n        },\n        _fireDomContentCallback: function() {\n            (this._request.cavalry && this._request.cavalry.setTimeStamp(\"t_domcontent\"));\n            p.transitionComplete();\n            (this._onPageDisplayed && this._onPageDisplayed(this.pipe));\n            this.parent._fireDomContentCallback();\n        },\n        _fireOnloadCallback: function() {\n            if (this._request.cavalry) {\n                this._request.cavalry.setTimeStamp(\"t_hooks\");\n                this._request.cavalry.setTimeStamp(\"t_layout\");\n                this._request.cavalry.setTimeStamp(\"t_onload\");\n            }\n        ;\n            this.parent._fireOnloadCallback();\n        },\n        isPageActive: function(la) {\n            return ea.isPageActive(la);\n        },\n        _versionCheck: function(la) {\n            if ((la.version == y)) {\n                return true\n            };\n            var ma = [\"quickling\",\"ajaxpipe\",\"ajaxpipe_token\",];\n            v(window.location, s(la.uri).removeQueryData(ma), true);\n            return false;\n        },\n        _processFirstResponse: function(la) {\n            var ma = la.getPayload();\n            fa(ma.title);\n            ga((ma.syndication || []));\n            window.scrollTo(0, 0);\n            j.go(document.body, (ma.body_class || \"\"), p.getMostRecentURI(), la.getRequest().getURI());\n            h.inform(\"quickling/response\");\n        },\n        getSanitizedParameters: function() {\n            return [\"quickling\",];\n        }\n    });\n    function ia() {\n        ba++;\n        return (ba >= z);\n    };\n    function ja(la) {\n        g.setCurrentRequest(null);\n        if (ia()) {\n            return false\n        };\n        la = q.augmentURI(la);\n        if (!ea.isPageActive(la)) {\n            return false\n        };\n        window.ExitTime = Date.now();\n        r.__removeHook(\"onafterloadhooks\");\n        r.__removeHook(\"onloadhooks\");\n        o.runHooks(\"onleavehooks\");\n        h.inform(\"onload/exit\", true);\n        new ha(la).setCanvasId(\"content\").send();\n        return true;\n    };\n    function ka(la) {\n        var ma = window[la];\n        function na(oa, pa, qa) {\n            if ((typeof oa !== \"function\")) {\n                oa = eval.bind(null, oa);\n            };\n            var ra = ma(m.guard(oa), pa);\n            if ((pa > 0)) {\n                if ((qa !== false)) {\n                    r.onLeave(function() {\n                        clearInterval(ra);\n                    });\n                }\n            };\n            return ra;\n        };\n        window[la] = na;\n    };\n    r.onAfterLoad(function la() {\n        ka(\"setInterval\");\n        ka(\"setTimeout\");\n        p.registerHandler(ja, 1);\n    });\n    e.exports = a.Quickling = ea;\n});\n__d(\"ScubaSample\", [\"Banzai\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = \"scuba_sample\", h = b(\"Banzai\"), i = b(\"copyProperties\");\n    function j(m, n, o) {\n        this.fields = {\n        };\n        this.flush = function() {\n            if (!m) {\n                return\n            };\n            var p = {\n            };\n            i(p, this.fields);\n            p._ds = m;\n            if (n) {\n                p._lid = n;\n            };\n            p._options = o;\n            h.post(g, p);\n            this.flush = function() {\n            \n            };\n            this.flushed = true;\n        };\n        this.lid = n;\n        return this;\n    };\n    function k(m, n, o) {\n        if (!this.fields[m]) {\n            this.fields[m] = {\n            };\n        };\n        this.fields[m][n] = o;\n        return this;\n    };\n    function l(m) {\n        return function(n, o) {\n            if (this.flushed) {\n                return this\n            };\n            return k.call(this, m, n, o);\n        };\n    };\n    i(j.prototype, {\n        addNormal: l(\"normal\"),\n        addInteger: l(\"int\"),\n        addDenorm: l(\"denorm\")\n    });\n    e.exports = j;\n});\n__d(\"ScriptMonitorReporter\", [\"ScriptMonitor\",\"ScubaSample\",\"setTimeoutAcrossTransitions\",\"URI\",], function(a, b, c, d, e, f) {\n    var g = b(\"ScriptMonitor\"), h = b(\"ScubaSample\"), i = b(\"setTimeoutAcrossTransitions\"), j = b(\"URI\");\n    function k(o) {\n        var p = [];\n        for (var q = 0; (q < o.length); q++) {\n            p.push(new RegExp(o[q], \"i\"));;\n        };\n        return p;\n    };\n    function l(o, p) {\n        for (var q = 0; (q < p.length); q++) {\n            if (p[q].src) {\n                o.push(p[q].src);\n            };\n        };\n    };\n    function m(o, p) {\n        for (var q = 0; (q < p.length); q++) {\n            if (p[q].test(o)) {\n                return true\n            };\n        };\n        return false;\n    };\n    function n(o, p) {\n        var q = g.stop(), r = {\n            addGeoFields: 1,\n            addBrowserFields: 1,\n            addUser: 1\n        }, s = {\n        };\n        l(q, document.getElementsByTagName(\"script\"));\n        l(q, document.getElementsByTagName(\"iframe\"));\n        for (var t = 0; (t < q.length); t++) {\n            var u = q[t].replace(/\\?.*/, \"\"), v;\n            if (s[u]) {\n                continue;\n            };\n            s[u] = 1;\n            if (!j.isValidURI(u)) {\n                v = true;\n            }\n             else if (m(u, p)) {\n                v = false;\n            }\n             else if (m(new j(u).getDomain(), o)) {\n                v = false;\n            }\n             else v = true;\n            \n            \n        ;\n            if (v) {\n                new h(\"unknown_scripts\", 0, r).addNormal(\"url\", u).flush();\n            };\n        };\n    };\n    e.exports = {\n        runScan: function(o, p) {\n            i(function() {\n                n(k(o), k(p));\n            }, 5000);\n        }\n    };\n});\n__d(\"StringTransformations\", [], function(a, b, c, d, e, f) {\n    e.exports = {\n        unicodeEscape: function(g) {\n            return g.replace(/[^A-Za-z0-9\\-\\.\\:\\_\\$\\/\\+\\=]/g, function(h) {\n                var i = h.charCodeAt().toString(16);\n                return (\"\\\\u\" + ((\"0000\" + i.toUpperCase())).slice(-4));\n            });\n        },\n        unicodeUnescape: function(g) {\n            return g.replace(/(\\\\u[0-9A-Fa-f]{4})/g, function(h) {\n                return String.fromCharCode(parseInt(h.slice(2), 16));\n            });\n        }\n    };\n});\n__d(\"TimeSpentLogger\", [\"Arbiter\",\"Banzai\",\"CSS\",\"ClickRefUtils\",\"DOMEventListener\",\"ScriptPath\",\"UserActivity\",\"collectDataAttributes\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"Banzai\"), i = b(\"CSS\"), j = b(\"ClickRefUtils\"), k = b(\"DOMEventListener\"), l = b(\"ScriptPath\"), m = b(\"UserActivity\"), n = b(\"collectDataAttributes\"), o = b(\"copyProperties\"), p = [m.getLastInformTime(),0,], q = m.getLastInformTime(), r = {\n        tos_seq: 0,\n        tos_cumulative: 0,\n        transport_cause: null,\n        buenopath: null,\n        page_token: null,\n        elements: 0,\n        uact_tos: null,\n        client_time: null\n    }, s = 100, t = 100, u = (10 * 1000), v = (3 * 1000), w = 1, x = 2, y = 4, z = 8, aa = {\n    };\n    m.subscribe(function(ia, ja) {\n        var ka = (p.length - 1);\n        q = ja.last_inform;\n        if ((ja.idleness < v)) {\n            p[ka] += ja.idleness;\n            r.tos_cumulative += ja.idleness;\n        }\n         else {\n            if ((ka > s)) {\n                fa(\"array_limit_reached\");\n            };\n            p.push(ja.idleness, 0);\n        }\n    ;\n    });\n    function ba(ia) {\n        var ja = 0;\n        if (document.getElementById(\"boulder_fixed_header\")) {\n            ja = (ja | w);\n        };\n        if (i.hasClass(document.body, \"timelineLayout\")) {\n            ja = (ja | y);\n            var ka = document.getElementById(\"pagelet_main_column_personal\");\n            if ((ka && (ka.getAttribute(\"data-referrer\") === \"pagelet_main_column_personal_timeline\"))) {\n                ja = (ja | x);\n            };\n            if (i.hasClass(document.body, \"pagesTimelineLayout\")) {\n                ja = (ja | z);\n            };\n        }\n    ;\n        return ja;\n    };\n    function ca(ia) {\n        var ja = ba(), ka = l.getScriptPath(), la = l.getCategoryToken();\n        r.uact_tos = p;\n        if (ka) {\n            r.buenopath = ka.substring(0, t);\n        }\n         else r.buenopath = \"\";\n    ;\n        if (la) {\n            r.page_token = la;\n        }\n         else r.page_token = \"\";\n    ;\n        r.elements = ja;\n        r.transport_cause = ia;\n        r.client_time = Date.now();\n    };\n    function da() {\n        r.tos_seq += 1;\n        p = [q,0,];\n    };\n    var ea = {\n        store: true,\n        delay: 3000,\n        retry: true\n    };\n    function fa(ia) {\n        ca(ia);\n        if (h.isEnabled(\"time_spent\")) {\n            g.inform(\"timespent/tosdataposted\", o({\n            }, r));\n            h.post(\"time_spent\", o({\n            }, r), ea);\n        }\n    ;\n        da();\n    };\n    function ga() {\n        fa(\"heartbeat\");\n    };\n    function ha() {\n        fa(\"before_unload\");\n    };\n    if ((window.top == window.self)) {\n        k.add(window, \"beforeunload\", ha);\n        setInterval(function() {\n            if ((((Date.now() - m.getLastInformTime()) > ((u - 100))) && (((p.length > 2) || (p[(p.length - 1)] > 0))))) {\n                ga();\n            };\n        }, u);\n    }\n;\n    g.subscribe(\"UserAction/new\", function(ia, ja) {\n        if (j.should_report(ja.node, ja.mode)) {\n            var ka = n(ja.node, [\"gt\",]), la = {\n                iref: j.get_intern_ref(ja.node),\n                gt_ref: ka.ref,\n                nav_section: ka.nav_section\n            };\n            ca(\"useraction\");\n            o(la, r);\n            ja.ua.add_data(la);\n            g.inform(\"timespent/tosdataposted\", o({\n            }, r));\n            da();\n        }\n    ;\n    });\n    e.exports = aa;\n});\n__d(\"UserActionHistory\", [\"Arbiter\",\"ClickRefUtils\",\"ScriptPath\",\"throttle\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ClickRefUtils\"), i = b(\"ScriptPath\"), j = b(\"throttle\"), k = {\n        click: 1,\n        submit: 1\n    }, l = false, m = {\n        log: [],\n        len: 0\n    }, n = j.acrossTransitions(function() {\n        try {\n            l._ua_log = JSON.stringify(m);\n        } catch (q) {\n            l = false;\n        };\n    }, 1000);\n    function o() {\n        try {\n            if (a.sessionStorage) {\n                l = a.sessionStorage;\n                (l._ua_log && (m = JSON.parse(l._ua_log)));\n            }\n        ;\n        } catch (q) {\n            l = false;\n        };\n        m.log[(m.len % 10)] = {\n            ts: Date.now(),\n            path: \"-\",\n            index: m.len,\n            type: \"init\",\n            iref: \"-\"\n        };\n        m.len++;\n        g.subscribe(\"UserAction/new\", function(r, s) {\n            var t = s.ua, u = s.node, event = s.event;\n            if ((!event || !((event.type in k)))) {\n                return\n            };\n            var v = {\n                path: i.getScriptPath(),\n                type: event.type,\n                ts: t._ue_ts,\n                iref: (h.get_intern_ref(u) || \"-\"),\n                index: m.len\n            };\n            m.log[(m.len++ % 10)] = v;\n            (l && n());\n        });\n    };\n    function p() {\n        return m.log.sort(function(q, r) {\n            return (((r.ts != q.ts)) ? ((r.ts - q.ts)) : ((r.index - q.index)));\n        });\n    };\n    o();\n    e.exports = {\n        getHistory: p\n    };\n});\n__d(\"clip\", [], function(a, b, c, d, e, f) {\n    function g(h, i, j) {\n        return Math.min(Math.max(h, i), j);\n    };\n    e.exports = g;\n});\n__d(\"MusicButtonStore\", [], function(a, b, c, d, e, f) {\n    var g = {\n    }, h = {\n        addButton: function(i, j) {\n            g[i] = j;\n            return j;\n        },\n        getButton: function(i) {\n            return g[i];\n        },\n        getButtons: function() {\n            return g;\n        },\n        removeButton: function(i) {\n            (g[i] && g[i].resetLoadingTimers());\n            delete g[i];\n        }\n    };\n    e.exports = h;\n});\n__d(\"MusicConstants\", [\"URI\",], function(a, b, c, d, e, f) {\n    var g = b(\"URI\"), h = {\n        DEBUG: false,\n        LIVE_LISTEN_MIN_SPOTIFY_VERSION: \"spotify-0.6.6.0.g5a9eaca5\",\n        enableDebug: function() {\n            this.DEBUG = true;\n        },\n        sameURLs: function(i, j) {\n            var k = /\\/$/;\n            if ((i && j)) {\n                i = g(i);\n                j = g(j);\n                return ((i.getDomain() == j.getDomain()) && (i.getPath() == j.getPath()));\n            }\n        ;\n            return false;\n        },\n        greaterOrEqualToMinimumVersion: function(i, j) {\n            var k = /(?:\\d+\\.)+/, l = i.match(k)[0].split(\".\").slice(0, -1), m = j.match(k)[0].split(\".\").slice(0, -1);\n            if ((l.length !== m.length)) {\n                return false\n            };\n            for (var n = 0; (n < m.length); n++) {\n                if ((+l[n] < +m[n])) {\n                    return false;\n                }\n                 else if ((+l[n] > +m[n])) {\n                    return true\n                }\n            ;\n            };\n            return true;\n        },\n        sanitizeForProviders: function(i) {\n            var j = {\n            };\n            for (var k in i) {\n                if (this.ALLOWED_EXTERNAL_CONTEXT_PARAMS[k]) {\n                    j[k] = i[k];\n                };\n            };\n            return j;\n        },\n        OP: {\n            RESUME: \"RESUME\",\n            PAUSE: \"PAUSE\",\n            PLAY: \"PLAY\",\n            VERSION: \"VERSION\"\n        },\n        STATUS_CHANGE_OP: {\n            STATUS: \"STATUS\",\n            LOGIN: \"LOGIN\",\n            REINFORM: \"REINFORM\"\n        },\n        STATUS_CHANGE_EVENT: {\n            playing: \"PLAY_STATE_CHANGED\",\n            track: \"TRACK_CHANGED\"\n        },\n        DIAGNOSTIC_EVENT: {\n            ALL_PAUSED: \"ALL_PAUSED\",\n            ALL_OFFLINE: \"ALL_OFFLINE\",\n            OFFLINE: \"OFFLINE\",\n            ONLINE: \"ONLINE\",\n            SEARCHING: \"SEARCHING\",\n            HIT: \"HIT\",\n            MISS: \"MISS\",\n            RESIGN: \"RESIGN\",\n            IFRAME_POLLING: \"IFRAME_POLLING\",\n            RELAUNCH: \"RELAUNCH\",\n            STATE_CHANGE: \"STATE_CHANGE\",\n            WRONG_VERSION: \"WRONG_VERSION\",\n            SERVICE_ERROR: \"SERVICE_ERROR\",\n            INCORRECT_ONLINE_STATE: \"INCORRECT_ONLINE_STATE\",\n            LOG_SEND_OP: \"LOG_SEND_OP\",\n            REQUEUE_OP: \"REQUEUE_OP\"\n        },\n        ALLOWED_STATUS_PARAMS: {\n            playing: \"playing\",\n            track: \"track\",\n            context: \"context\",\n            client_version: \"client_version\",\n            start_time: \"start_time\",\n            expires_in: \"expires_in\",\n            open_graph_state: \"open_graph_state\"\n        },\n        ALLOWED_EXTERNAL_CONTEXT_PARAMS: {\n            uri: true,\n            song: true,\n            radio_station: true,\n            album: true,\n            playlist: true,\n            musician: true,\n            song_list: true,\n            offset: true,\n            title: true,\n            request_id: true,\n            listen_with_friends: true,\n            needs_tos: true\n        },\n        LIVE_LISTEN_OP: {\n            NOW_LEADING: \"NOW_LEADING\",\n            NOW_LISTENING: \"NOW_LISTENING\",\n            END_SESSION: \"END_SESSION\",\n            SONG_PLAYING: \"SONG_PLAYING\",\n            LISTENER_UPDATE: \"LISTENER_UPDATE\",\n            QUEUE_SESSION: \"QUEUE_SESSION\",\n            PLAY_ERROR: \"PLAY_ERROR\",\n            SESSION_UPDATED: \"SESSION_UPDATED\",\n            QUEUING_SESSION: \"QUEUING_SESSION\"\n        },\n        MUSIC_BUTTON: {\n            ACTIVATE: \"ACTIVATE\"\n        },\n        ERROR: {\n            1: \"SERVICE_UNAVAILABLE_WITHOUT_PREMIUM\",\n            2: \"SERVICE_UNAVAILABLE_WITHOUT_PREMIUM_OR_WAIT\",\n            3: \"SERVICE_UNAVAILABLE_BILLING_ISSUE\",\n            4: \"SERVICE_UNAVAILABLE_TECHNICAL_ISSUE\",\n            5: \"AUDIO_AD_PLAYING\",\n            99: \"SERVICE_TEMPORARILY_UNAVAILABLE\",\n            101: \"SONG_UNAVAILABLE_WITHOUT_PURCHASE\",\n            102: \"SONG_UNAVAILABLE_WITHOUT_PREMIUM\",\n            103: \"SONG_UNAVAILABLE_INDEFINITELY\"\n        }\n    };\n    e.exports = (a.MusicConstants || h);\n});\n__d(\"MusicEvents\", [\"Arbiter\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\");\n    e.exports = a.MusicEvents = new g();\n});\n__d(\"MusicButton\", [\"BanzaiODS\",\"Bootloader\",\"copyProperties\",\"CSS\",\"DOM\",\"MusicButtonStore\",\"MusicConstants\",\"MusicEvents\",\"Parent\",\"ScubaSample\",\"Tooltip\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"BanzaiODS\"), h = b(\"Bootloader\"), i = b(\"copyProperties\"), j = b(\"CSS\"), k = b(\"DOM\"), l = b(\"MusicButtonStore\"), m = b(\"MusicConstants\"), n = b(\"MusicEvents\"), o = b(\"Parent\"), p = b(\"ScubaSample\"), q = b(\"Tooltip\"), r = b(\"cx\"), s = function(t, u, v, w, x, y) {\n        this.provider = t;\n        this.buttonElem = u;\n        this.url = v;\n        this.context = (w || {\n        });\n        this.mediaType = x;\n        this.setState(this.STATES.OFFLINE);\n        this.tooltip = (y || \"\");\n        n.subscribe(m.MUSIC_BUTTON.ACTIVATE, this.processClick.bind(this));\n    };\n    i(s, {\n        tracksetableTypes: []\n    });\n    i(s.prototype, {\n        SHOW_LOADING_TIMEOUT: 500,\n        HIDE_LOADING_TIMEOUT: 4000,\n        RECENTLY_ONLINE_TIMEOUT: 6000,\n        STATES: {\n            PLAYING: \"music_playing\",\n            PAUSED: \"music_paused\",\n            LOADING: \"music_loading\",\n            DISABLED: \"music_disabled\",\n            OFFLINE: \"music_offline\"\n        },\n        setState: function(t) {\n            if ((t !== this.STATES.LOADING)) {\n                this.resetLoadingTimers();\n                this.previousState = (this.state || t);\n            }\n        ;\n            if ((t === this.STATES.PLAYING)) {\n                q.set(this.buttonElem, this.tooltip);\n            }\n             else q.set(this.buttonElem, \"\");\n        ;\n            var u = this.buttonElem.parentNode;\n            (this.state && j.removeClass(u, this.state));\n            this.state = t;\n            j.addClass(u, this.state);\n        },\n        isTracksetable: function(t) {\n            return (s.tracksetableTypes.indexOf(this.mediaType) !== -1);\n        },\n        handleIncomingEvent: function(t, u) {\n            clearTimeout(this._showLoadingTimer);\n            if (((u && u.provider) && (u.provider != this.provider))) {\n                return\n            };\n            switch (t) {\n              case m.DIAGNOSTIC_EVENT.ONLINE:\n            \n              case m.STATUS_CHANGE_EVENT.track:\n            \n              case m.STATUS_CHANGE_EVENT.playing:\n                var v = ((u && u.track) && u.track.uri), w = ((u && u.context) && u.context.uri);\n                if (((u && u.playing) && ((m.sameURLs(v, this.url) || m.sameURLs(w, this.url))))) {\n                    this.setState(this.STATES.PLAYING);\n                }\n                 else if (((this.state === this.STATES.LOADING) && (((this.previousState === this.STATES.PAUSED) || (this.previousState === this.STATES.OFFLINE))))) {\n                    clearTimeout(this._attemptingPlayTimer);\n                    this._attemptingPlayTimer = this.setState.bind(this, this.STATES.PAUSED).defer(this.RECENTLY_ONLINE_TIMEOUT, false);\n                }\n                 else if (!this._attemptingPlayTimer) {\n                    this.setState(this.STATES.PAUSED);\n                }\n                \n            ;\n                break;\n              case m.DIAGNOSTIC_EVENT.OFFLINE:\n                this.setState(this.STATES.OFFLINE);\n                break;\n              case m.DIAGNOSTIC_EVENT.ALL_OFFLINE:\n                this.setState(this.STATES.OFFLINE);\n                break;\n            };\n        },\n        processClick: function(t, u) {\n            if ((u != this.buttonElem)) {\n                if ((this.state === this.STATES.LOADING)) {\n                    (this.previousState && this.setState(this.previousState));\n                };\n                return;\n            }\n        ;\n            var v = new p(\"music_play_button_click\", null, {\n                addBrowserFields: true,\n                addGeoFields: true,\n                addUser: true\n            });\n            v.addNormal(\"uses_bridge\", \"1\");\n            v.addNormal(\"state\", this.state);\n            v.addNormal(\"provider\", this.provider);\n            v.addNormal(\"class\", \"MusicButton\");\n            v.addDenorm(\"url\", this.url);\n            v.flush();\n            if ((this.state != this.STATES.PLAYING)) {\n                g.bumpEntityKey(\"music_play_button\", \"music_play_button_click\");\n                g.bumpEntityKey(\"music_play_button\", (\"music_play_button_click.\" + this.provider));\n                var w = o.byClass(this.buttonElem, \"_4--s\");\n                if (w) {\n                    j.addClass(w, \"_4--t\");\n                    j.removeClass.curry(w, \"_4--t\").defer(3000);\n                }\n            ;\n            }\n        ;\n            var x = (this.isTracksetable() && o.byClass(this.buttonElem, \"music_trackset_container\")), y = [];\n            if (x) {\n                var z = x.getAttribute(\"data-trackset-title\"), aa = this.provider, ba = k.scry(x, \".music_button\");\n                for (var ca = 0; (ca < ba.length); ca++) {\n                    var da = l.getButton([ba[ca].id,]);\n                    if (((da && (da.provider == aa)) && da.isTracksetable())) {\n                        y.push(da.url);\n                    };\n                };\n            }\n        ;\n            if (!a.Music) {\n                this.showLoading(true);\n            };\n            h.loadModules([\"Music\",], function(ea) {\n                var fa = (((x && (y.length > 1))) ? ea.playPauseSongList(this.provider, this.url, y, z, this.context) : ea.playPauseSong(this.provider, this.url, this.context));\n                this.showLoading(!fa);\n            }.bind(this));\n        },\n        showLoading: function(t) {\n            this.resetLoadingTimers();\n            this._hideLoadingTimer = this._timeout.bind(this, t).defer(this.HIDE_LOADING_TIMEOUT, false);\n            this._showLoadingTimer = this.setState.bind(this, this.STATES.LOADING).defer(this.SHOW_LOADING_TIMEOUT, false);\n        },\n        resetLoadingTimers: function() {\n            clearTimeout(this._hideLoadingTimer);\n            clearTimeout(this._showLoadingTimer);\n            clearTimeout(this._attemptingPlayTimer);\n            this._attemptingPlayTimer = null;\n        },\n        destroy: function() {\n            this.resetLoadingTimers();\n            this.buttonElem = null;\n        },\n        _timeout: function(t) {\n            (a.Music && a.Music.reInform([this.provider,]));\n            if ((!t && (this.state === this.STATES.LOADING))) {\n                this.setState(this.STATES.PAUSED);\n            };\n        }\n    });\n    e.exports = s;\n});\n__d(\"MusicButtonManager\", [\"Event\",\"DOM\",\"KeyedCallbackManager\",\"Layer\",\"MusicButton\",\"MusicButtonStore\",\"MusicConstants\",\"MusicEvents\",\"Parent\",\"$\",\"copyProperties\",\"ge\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"DOM\"), i = b(\"KeyedCallbackManager\"), j = b(\"Layer\"), k = b(\"MusicButton\"), l = b(\"MusicButtonStore\"), m = b(\"MusicConstants\"), n = b(\"MusicEvents\"), o = b(\"Parent\"), p = b(\"$\"), q = b(\"copyProperties\"), r = b(\"ge\"), s = new i(), t = null, u = {\n    }, v = 0;\n    function w(da) {\n        var ea = da.getTarget(), fa = o.byClass(ea, \"music_button\");\n        fa = (fa || ((!((da.getModifiers && da.getModifiers().any)) && x(ea))));\n        if (!fa) {\n            return\n        };\n        return y(fa, da);\n    };\n    function x(da) {\n        var ea = (o.byClass(da, \"music_button_trigger\") && o.byClass(da, \"music_button_trigger_group\"));\n        if (ea) {\n            var fa = h.scry(ea, \".music_button\");\n            if (fa.length) {\n                return fa[0]\n            };\n        }\n    ;\n        return null;\n    };\n    function y(da, event) {\n        (event && event.stop());\n        n.inform(m.MUSIC_BUTTON.ACTIVATE, da);\n        return false;\n    };\n    function z(da) {\n        (a.Music && a.Music.reInform(da));\n    };\n    function aa(da, ea) {\n        var fa = l.getButtons();\n        for (var ga in fa) {\n            if ((fa[ga].noGC || r(ga))) {\n                fa[ga].handleIncomingEvent(da, ea);\n            }\n             else l.removeButton(ga);\n        ;\n        };\n    };\n    var ba = {\n        init: function(da) {\n            if (t) {\n                return\n            };\n            t = true;\n            k.tracksetableTypes = (da || []);\n            g.listen(document.body, \"click\", w);\n            n.subscribe([m.STATUS_CHANGE_EVENT.playing,m.STATUS_CHANGE_EVENT.track,m.DIAGNOSTIC_EVENT.OFFLINE,m.DIAGNOSTIC_EVENT.ALL_OFFLINE,m.DIAGNOSTIC_EVENT.ONLINE,], aa);\n        },\n        add: function(da, ea, fa, ga, ha, ia) {\n            (t || ba.init());\n            var ja = ea.id, ka = l.getButton(ja);\n            if (ka) {\n                return ka\n            };\n            ka = l.addButton(ja, new k(da, ea, fa, q({\n                button_id: ja\n            }, ga), ha, ia));\n            var la = o.byClass(ea, \"uiOverlay\");\n            if (la) {\n                ka.noGC = true;\n                var ma = j.subscribe(\"destroy\", function(na, oa) {\n                    if (h.contains(oa.getRoot(), ea)) {\n                        l.removeButton(ja);\n                        j.unsubscribe(ma);\n                    }\n                ;\n                });\n            }\n        ;\n            if ((da && !u[da])) {\n                u[da] = function() {\n                    var na = Object.keys(u);\n                    (na.length && z(na));\n                    u = {\n                    };\n                }.defer();\n            };\n            return ka;\n        },\n        addButton: function(da, ea, fa, ga, ha, ia) {\n            if (!r(ea)) {\n                return\n            };\n            var ja = p(ea);\n            return ba.add(da, ja, fa, ga, ha, ia);\n        },\n        asyncAddMusicButton: function(da, ea) {\n            da.setAttribute(\"id\", (\"music_button_\" + v++));\n            ca(da, ea);\n        },\n        tryAddButtonInDOM: function(da, ea) {\n            var fa = r(da);\n            (fa && ca(fa, ea));\n        },\n        addMusicData: function(da, ea, fa, ga, ha, ia) {\n            s.setResource(da, {\n                provider: ea,\n                uri: fa,\n                context: ga,\n                media_type: ha,\n                tooltip: ia\n            });\n        }\n    };\n    function ca(da, ea) {\n        var fa = h.find(da, \"a.button_anchor\").getAttribute(\"href\");\n        s.executeOrEnqueue(fa, function(ga) {\n            return ba.add(ga.provider, da, ga.uri, ga.context, ga.media_type, (ea ? ga.tooltip : \"\"));\n        });\n    };\n    e.exports = (a.MusicButtonManager || ba);\n});\n__d(\"TinyViewport\", [\"Arbiter\",\"CSS\",\"DOM\",\"Event\",\"queryThenMutateDOM\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"CSS\"), i = b(\"DOM\"), j = b(\"Event\"), k = b(\"queryThenMutateDOM\"), l = document.documentElement, m, n, o = k.bind(null, function() {\n        n = (n || i.getDocumentScrollElement());\n        m = ((l.clientHeight < 400) || (l.clientWidth < n.scrollWidth));\n    }, function() {\n        h.conditionClass(l, \"tinyViewport\", m);\n        h.conditionClass(l, \"canHaveFixedElements\", !m);\n    }, \"TinyViewport\");\n    o();\n    g.subscribe(\"quickling/response\", o);\n    j.listen(window, \"resize\", o);\n});\n__d(\"TimeSpentArray\", [\"Banzai\",\"pageID\",], function(a, b, c, d, e, f) {\n    var g = b(\"Banzai\"), h = b(\"pageID\"), i = 2, j = (i * 32), k = 1500, l, m, n, o, p, q, r, s, t;\n    function u() {\n        if (l) {\n            var ca = Date.now();\n            if ((ca > p)) {\n                r = Math.min(j, Math.ceil((((ca / 1000)) - o)));\n            };\n            var da = z();\n            if (da) {\n                l(da);\n            };\n        }\n    ;\n        y();\n    };\n    function v() {\n        w();\n        m = setTimeout(u, ((n * 1000) + k), false);\n    };\n    function w() {\n        if (m) {\n            clearTimeout(m);\n            m = null;\n        }\n    ;\n    };\n    function x(ca) {\n        o = ca;\n        p = (o * 1000);\n        q = [1,];\n        for (var da = 1; (da < i); da++) {\n            q.push(0);;\n        };\n        r = 1;\n        s += 1;\n        t += 1;\n        v();\n    };\n    function y() {\n        w();\n        q = null;\n        n = j;\n    };\n    function z() {\n        if (!q) {\n            return null\n        };\n        return {\n            tos_id: h,\n            start_time: o,\n            tos_array: q.slice(0),\n            tos_len: r,\n            tos_seq: t,\n            tos_cum: s\n        };\n    };\n    function aa(ca) {\n        if (((ca >= p) && (((ca - p)) < 1000))) {\n            return\n        };\n        ba(Math.floor((ca / 1000)));\n    };\n    function ba(ca) {\n        var da = (ca - o);\n        if (((da < 0) || (da >= j))) {\n            u();\n        };\n        if (!q) {\n            x(ca);\n        }\n         else {\n            q[(da >> 5)] |= ((1 << ((da & 31))));\n            r = (da + 1);\n            s += 1;\n            p = (ca * 1000);\n        }\n    ;\n    };\n    e.exports = {\n        init: function(ca, da) {\n            s = 0;\n            t = -1;\n            l = ca;\n            n = (da || j);\n            x(Math.floor((Date.now() / 1000)));\n            g.subscribe(g.SHUTDOWN, u);\n        },\n        update: function(ca) {\n            aa(ca);\n        },\n        get: function() {\n            return z();\n        },\n        ship: function() {\n            u();\n        },\n        reset: function() {\n            y();\n        }\n    };\n});\n__d(\"WebStorageMonster\", [\"Event\",\"AsyncRequest\",\"UserActivity\",\"StringTransformations\",\"arrayContains\",\"setTimeoutAcrossTransitions\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"AsyncRequest\"), i = b(\"UserActivity\"), j = b(\"StringTransformations\"), k = b(\"arrayContains\"), l = b(\"setTimeoutAcrossTransitions\"), m = 300000, n = false;\n    function o(t) {\n        var u = {\n        };\n        for (var v in t) {\n            var w = t.getItem(v), x = j.unicodeEscape(v);\n            if ((typeof w === \"string\")) {\n                u[x] = w.length;\n            };\n        };\n        return u;\n    };\n    function p(t) {\n        if ((a.localStorage && t.keys)) {\n            s._getLocalStorageKeys().forEach(function(u) {\n                if (k(t.keys, u)) {\n                    a.localStorage.removeItem(u);\n                };\n            });\n        };\n    };\n    function q(t) {\n        if (a.localStorage) {\n            s._getLocalStorageKeys().forEach(function(u) {\n                if (!t.some(function(v) {\n                    return new RegExp(v).test(u);\n                })) {\n                    a.localStorage.removeItem(u);\n                };\n            });\n        };\n        if (a.sessionStorage) {\n            a.sessionStorage.clear();\n        };\n    };\n    function r(t) {\n        if (i.isActive(m)) {\n            l(r.curry(t), m);\n        }\n         else s.cleanNow(t);\n    ;\n    };\n    var s = {\n        registerLogoutForm: function(t, u) {\n            g.listen(t, \"submit\", function(v) {\n                s.cleanOnLogout(u);\n            });\n        },\n        schedule: function(t) {\n            if (n) {\n                return\n            };\n            n = true;\n            r(t);\n        },\n        cleanNow: function(t) {\n            var u = Date.now(), v = {\n            }, w = false;\n            [\"localStorage\",\"sessionStorage\",].forEach(function(y) {\n                if (a[y]) {\n                    v[y] = o(a[y]);\n                    w = true;\n                }\n            ;\n            });\n            var x = Date.now();\n            v.logtime = (x - u);\n            if (w) {\n                new h(\"/ajax/webstorage/process_keys.php\").setData(v).setHandler(function(y) {\n                    if (!t) {\n                        var z = y.getPayload();\n                        if (z.keys) {\n                            z.keys = z.keys.map(j.unicodeUnescape);\n                        };\n                        p(z);\n                    }\n                ;\n                }.bind(this)).send();\n            };\n        },\n        cleanOnLogout: function(t) {\n            if (t) {\n                q(t);\n            };\n            if (a.sessionStorage) {\n                a.sessionStorage.clear();\n            };\n        },\n        _getLocalStorageKeys: Object.keys.curry(a.localStorage)\n    };\n    e.exports = s;\n});");
// 1511
geval("if (JSBNG__self.CavalryLogger) {\n    CavalryLogger.start_js([\"AsDOA\",]);\n}\n;\n;\n__d(\"AdblockDetector\", [], function(a, b, c, d, e, f) {\n    var g = \"data-adblock-hash\", h = {\n    }, i = 0;\n    function j(k, l) {\n        var m = k.getAttribute(g);\n        if (!m) {\n            m = ++i;\n            k.setAttribute(g, m);\n        }\n         else if (h[m]) {\n            JSBNG__clearTimeout(h[m]);\n            h[m] = null;\n        }\n        \n    ;\n    ;\n        h[m] = JSBNG__setTimeout(function() {\n            h[m] = null;\n            if (!k.offsetHeight) {\n                var n = k, o = JSBNG__document.getElementsByTagName(\"body\")[0];\n                while (((n && ((n !== o))))) {\n                    if (((((((((((n.style.display === \"none\")) || ((n.style.height === \"0px\")))) || ((n.style.height === 0)))) || ((n.style.height === \"0\")))) || ((n.childNodes.length === 0))))) {\n                        return;\n                    }\n                ;\n                ;\n                    n = n.parentNode;\n                };\n            ;\n                if (((n === o))) {\n                    ((l && l(k)));\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n        }, 3000);\n    };\n;\n    f.assertUnblocked = j;\n});\n__d(\"EagleEye\", [\"Arbiter\",\"Env\",\"OnloadEvent\",\"isInIframe\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"Env\"), i = b(\"OnloadEvent\"), j = b(\"isInIframe\"), k = ((h.eagleEyeConfig || {\n    })), l = \"_e_\", m = ((window.JSBNG__name || \"\")).toString();\n    if (((((m.length == 7)) && ((m.substr(0, 3) == l))))) {\n        m = m.substr(3);\n    }\n     else {\n        m = k.seed;\n        if (!j()) {\n            window.JSBNG__name = ((l + m));\n        }\n    ;\n    ;\n    }\n;\n;\n    var n = ((((((window.JSBNG__location.protocol == \"https:\")) && JSBNG__document.cookie.match(/\\bcsm=1/))) ? \"; secure\" : \"\")), o = ((((l + m)) + \"_\")), p = new JSBNG__Date(((JSBNG__Date.now() + 604800000))).toGMTString(), q = window.JSBNG__location.hostname.replace(/^.*(facebook\\..*)$/i, \"$1\"), r = ((((((((\"; expires=\" + p)) + \";path=/; domain=\")) + q)) + n)), s = 0, t, u = ((k.JSBNG__sessionStorage && a.JSBNG__sessionStorage)), v = JSBNG__document.cookie.length, w = false, x = JSBNG__Date.now();\n    function y(ca) {\n        return ((((((((o + (s++))) + \"=\")) + encodeURIComponent(ca))) + r));\n    };\n;\n    function z() {\n        var ca = [], da = false, ea = 0, fa = 0;\n        this.isEmpty = function() {\n            return !ca.length;\n        };\n        this.enqueue = function(ga, ha) {\n            if (ha) {\n                ca.unshift(ga);\n            }\n             else ca.push(ga);\n        ;\n        ;\n        };\n        this.dequeue = function() {\n            ca.shift();\n        };\n        this.peek = function() {\n            return ca[0];\n        };\n        this.clear = function(ga) {\n            v = Math.min(v, JSBNG__document.cookie.length);\n            if (((!w && ((((new JSBNG__Date() - x)) > 60000))))) {\n                w = true;\n            }\n        ;\n        ;\n            var ha = ((!ga && ((JSBNG__document.cookie.search(l) >= 0)))), ia = !!h.cookie_header_limit, ja = ((h.cookie_count_limit || 19)), ka = ((h.cookie_header_limit || 3950)), la = ((ja - 5)), ma = ((ka - 1000));\n            while (!this.isEmpty()) {\n                var na = y(this.peek());\n                if (((ia && ((((na.length > ka)) || ((w && ((((na.length + v)) > ka))))))))) {\n                    this.dequeue();\n                    continue;\n                }\n            ;\n            ;\n                if (((((ha || ia)) && ((((((JSBNG__document.cookie.length + na.length)) > ka)) || ((JSBNG__document.cookie.split(\";\").length > ja))))))) {\n                    break;\n                }\n            ;\n            ;\n                JSBNG__document.cookie = na;\n                ha = true;\n                this.dequeue();\n            };\n        ;\n            var oa = JSBNG__Date.now();\n            if (((ga || ((((((((!da && ha)) && ((((fa > 0)) && ((((Math.min(((10 * Math.pow(2, ((fa - 1))))), 60000) + ea)) < oa)))))) && g.query(i.ONLOAD))) && ((((!this.isEmpty() || ((JSBNG__document.cookie.length > ma)))) || ((JSBNG__document.cookie.split(\";\").length > la))))))))) {\n                var pa = new JSBNG__Image(), qa = this, ra = ((h.tracking_domain || \"\"));\n                da = true;\n                pa.JSBNG__onload = function ua() {\n                    da = false;\n                    fa = 0;\n                    qa.clear();\n                };\n                pa.JSBNG__onerror = pa.JSBNG__onabort = function ua() {\n                    da = false;\n                    ea = JSBNG__Date.now();\n                    fa++;\n                };\n                var sa = ((h.fb_isb ? ((\"&fb_isb=\" + h.fb_isb)) : \"\")), ta = ((\"&__user=\" + h.user));\n                pa.src = ((((((((((((((ra + \"/ajax/nectar.php?asyncSignal=\")) + ((Math.floor(((Math.JSBNG__random() * 10000))) + 1)))) + sa)) + ta)) + \"&\")) + ((!ga ? \"\" : \"s=\")))) + oa));\n            }\n        ;\n        ;\n        };\n    };\n;\n    t = new z();\n    if (u) {\n        var aa = function() {\n            var ca = 0, da = ca;\n            function ea() {\n                var ha = JSBNG__sessionStorage.getItem(\"_e_ids\");\n                if (ha) {\n                    var ia = ((ha + \"\")).split(\";\");\n                    if (((ia.length == 2))) {\n                        ca = parseInt(ia[0], 10);\n                        da = parseInt(ia[1], 10);\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n            };\n        ;\n            function fa() {\n                var ha = ((((ca + \";\")) + da));\n                JSBNG__sessionStorage.setItem(\"_e_ids\", ha);\n            };\n        ;\n            function ga(ha) {\n                return ((\"_e_\" + ((((ha !== undefined)) ? ha : ca++))));\n            };\n        ;\n            this.isEmpty = function() {\n                return ((da === ca));\n            };\n            this.enqueue = function(ha, ia) {\n                var ja = ((ia ? ga(--da) : ga()));\n                JSBNG__sessionStorage.setItem(ja, ha);\n                fa();\n            };\n            this.dequeue = function() {\n                this.isEmpty();\n                JSBNG__sessionStorage.removeItem(ga(da));\n                da++;\n                fa();\n            };\n            this.peek = function() {\n                var ha = JSBNG__sessionStorage.getItem(ga(da));\n                return ((ha ? ((ha + \"\")) : ha));\n            };\n            this.clear = t.clear;\n            ea();\n        };\n        t = new aa();\n    }\n;\n;\n    var ba = {\n        log: function(ca, da, ea) {\n            if (h.no_cookies) {\n                return;\n            }\n        ;\n        ;\n            var fa = [m,JSBNG__Date.now(),ca,].concat(da);\n            fa.push(fa.length);\n            function ga() {\n                var ha = JSON.stringify(fa);\n                try {\n                    t.enqueue(ha, !!ea);\n                    t.clear(!!ea);\n                } catch (ia) {\n                    if (((u && ((ia.code === 1000))))) {\n                        t = new z();\n                        u = false;\n                        ga();\n                    }\n                ;\n                ;\n                };\n            ;\n            };\n        ;\n            ga();\n        },\n        getSessionID: function() {\n            return m;\n        }\n    };\n    e.exports = ba;\n    a.EagleEye = ba;\n}, 3);\n__d(\"AdblockDetectorLogging\", [\"AdblockDetector\",\"EagleEye\",], function(a, b, c, d, e, f) {\n    var g = b(\"AdblockDetector\"), h = b(\"EagleEye\");\n    function i(j) {\n        g.assertUnblocked(j, h.log.bind(h, \"ads\", {\n            JSBNG__event: \"ads_blocked\"\n        }));\n    };\n;\n    f.assertUnblocked = i;\n});\n__d(\"EgoAdsObjectSet\", [\"copyProperties\",\"csx\",\"DOM\",], function(a, b, c, d, e, f) {\n    var g = b(\"copyProperties\"), h = b(\"csx\"), i = b(\"DOM\");\n    function j() {\n        this._allEgoUnits = [];\n        this._egoUnits = [];\n    };\n;\n    g(j.prototype, {\n        init: function(l) {\n            this._allEgoUnits = l;\n            this._egoUnits = [];\n            this._allEgoUnits.forEach(function(m) {\n                var n = k(m);\n                if (((!n || !n.holdout))) {\n                    this._egoUnits.push(m);\n                }\n            ;\n            ;\n            }, this);\n        },\n        getCount: function() {\n            return this._egoUnits.length;\n        },\n        forEach: function(l, m) {\n            this._egoUnits.forEach(l, m);\n        },\n        getUnit: function(l) {\n            return this._egoUnits[l];\n        },\n        getHoldoutAdIDsForSpace: function(l, m) {\n            if (((!l || !m))) {\n                return [];\n            }\n        ;\n        ;\n            var n = [];\n            for (var o = 0; ((((l > 0)) && ((o < this._allEgoUnits.length)))); o++) {\n                var p = this._allEgoUnits[o], q = m(p), r = k(p);\n                if (((((((l >= q)) && r)) && r.holdout))) {\n                    n.push(r.adid);\n                }\n            ;\n            ;\n                l -= q;\n            };\n        ;\n            return n;\n        },\n        getHoldoutAdIDsForNumAds: function(l) {\n            l = Math.min(l, this._allEgoUnits.length);\n            var m = [];\n            for (var n = 0; ((n < l)); n++) {\n                var o = this._allEgoUnits[n], p = k(o);\n                if (((p && p.holdout))) {\n                    m.push(p.adid);\n                }\n            ;\n            ;\n            };\n        ;\n            return m;\n        }\n    });\n    function k(l) {\n        var m = i.scry(l, \"div._4u8\")[0], n = ((m && m.getAttribute(\"data-ad\")));\n        return ((((n && JSON.parse(n))) || undefined));\n    };\n;\n    e.exports = j;\n});\n__d(\"EmuController\", [\"AsyncRequest\",\"DataStore\",\"URI\",\"copyProperties\",\"emptyFunction\",\"ge\",\"goURI\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = b(\"DataStore\"), i = b(\"URI\"), j = b(\"copyProperties\"), k = b(\"emptyFunction\"), l = b(\"ge\"), m = b(\"goURI\");\n    function n(o, p) {\n        var q = l(o);\n        if (!q) {\n            return null;\n        }\n    ;\n    ;\n        this.impression = p;\n        this.containerId = o;\n        h.set(q, \"emuController\", this);\n        return this;\n    };\n;\n    j(n, {\n        fromContainer: function(o) {\n            var p = l(o);\n            if (!p) {\n                return null;\n            }\n        ;\n        ;\n            return h.get(p, \"emuController\");\n        },\n        getEventClass: function(o) {\n            return ((\"emuEvent\" + String(o).trim()));\n        }\n    });\n    j(n.prototype, {\n        EVENT_HANDLER_PATH: \"/ajax/emu/end.php\",\n        CLICK: 1,\n        FAN: \"fad_fan\",\n        JSBNG__event: function(o, p, q, r) {\n            var s = {\n                eid: this.impression,\n                f: 0,\n                ui: this.containerId,\n                en: o,\n                a: 1\n            };\n            if (p) {\n                s.ed = JSON.stringify(p);\n            }\n        ;\n        ;\n            if (!r) {\n                r = k;\n            }\n        ;\n        ;\n            var t = new g().setURI(this.EVENT_HANDLER_PATH).setData(s).setErrorHandler(r);\n            if (q) {\n                t.setHandler(q);\n            }\n        ;\n        ;\n            t.send();\n        },\n        redirect: function() {\n            var o = {\n                eid: this.impression,\n                f: 0,\n                ui: this.containerId,\n                en: this.CLICK,\n                a: 0,\n                sig: ((Math.floor(((Math.JSBNG__random() * 65535))) + 65536))\n            }, p = new i(this.EVENT_HANDLER_PATH);\n            p.setQueryData(o);\n            m(p);\n        }\n    });\n    e.exports = n;\n});\n__d(\"legacy:ad-units-base-js\", [\"EmuController\",], function(a, b, c, d) {\n    a.EmuController = b(\"EmuController\");\n}, 3);\n__d(\"ChatConfig\", [\"ChatConfigInitialData\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"ChatConfigInitialData\"), h = b(\"copyProperties\"), i = {\n    }, j = {\n        get: function(k, l) {\n            return ((((k in i)) ? i[k] : l));\n        },\n        set: function(k) {\n            if (((arguments.length > 1))) {\n                var l = {\n                };\n                l[k] = arguments[1];\n                k = l;\n            }\n        ;\n        ;\n            h(i, k);\n        },\n        getDebugInfo: function() {\n            return i;\n        }\n    };\n    j.set(g);\n    e.exports = j;\n});\n__d(\"JSBNG__cancelAnimationFrame\", [], function(a, b, c, d, e, f) {\n    var g = ((((((((((a.JSBNG__cancelAnimationFrame || a.JSBNG__webkitCancelAnimationFrame)) || a.JSBNG__mozCancelAnimationFrame)) || a.oCancelAnimationFrame)) || a.msCancelAnimationFrame)) || a.JSBNG__clearTimeout));\n    e.exports = g;\n});\n__d(\"XUISpinner.react\", [\"BrowserSupport\",\"ReactProps\",\"React\",\"JSBNG__cancelAnimationFrame\",\"cx\",\"joinClasses\",\"JSBNG__requestAnimationFrame\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"BrowserSupport\"), h = b(\"ReactProps\"), i = b(\"React\"), j = b(\"JSBNG__cancelAnimationFrame\"), k = b(\"cx\"), l = b(\"joinClasses\"), m = b(\"JSBNG__requestAnimationFrame\"), n = b(\"tx\"), o = g.hasCSSAnimations(), p = {\n        SMALL: 16,\n        LARGE: 32\n    }, q = {\n        SMALL: 2,\n        LARGE: 4\n    }, r = 5, s = 8, t = ((r * s)), u = 1200, v = ((u / t)), w = i.createClass({\n        displayName: \"XUISpinner\",\n        props: {\n            size: h.oneOf([\"small\",\"large\",]),\n            background: h.oneOf([\"light\",\"dark\",])\n        },\n        getDefaultProps: function() {\n            return {\n                size: \"small\",\n                background: \"light\"\n            };\n        },\n        getInitialState: function() {\n            if (!o) {\n                return {\n                    frame: 0,\n                    timer: JSBNG__Date.now()\n                };\n            }\n        ;\n        ;\n        },\n        componentDidMount: function() {\n            if (!o) {\n                this._step();\n            }\n        ;\n        ;\n        },\n        componentWillUnmount: function() {\n            ((this._requestID && j(this._requestID)));\n        },\n        _step: function() {\n            this._requestID = m(this._step);\n            var x = JSBNG__Date.now();\n            if (((((x - v)) > this.state.timer))) {\n                this.setState({\n                    frame: ((((this.state.frame + 1)) % t)),\n                    timer: x\n                });\n            }\n        ;\n        ;\n        },\n        _renderWithCSSAnimation: function(x) {\n            return this.transferPropsTo(i.DOM.span({\n                className: x\n            }, \"Loading...\"));\n        },\n        _renderWithJavaScriptAnimation: function(x) {\n            var y = Math.floor(((this.state.frame / s))), z = ((this.state.frame % s)), aa = ((((this.props.size == \"small\")) ? p.SMALL : p.LARGE)), ba = ((((this.props.size == \"small\")) ? q.SMALL : q.LARGE)), ca = {\n                backgroundPosition: ((((((((((\"-\" + ((((z * aa)) + ba)))) + \"px \")) + \"-\")) + ((((y * aa)) + ba)))) + \"px\"))\n            }, da = l((\"_55yr\"), x);\n            return this.transferPropsTo(i.DOM.span({\n                className: da,\n                style: ca\n            }, \"Loading...\"));\n        },\n        render: function() {\n            var x = (((((((((\"_55ym\") + ((((this.props.size == \"small\")) ? ((\" \" + \"_55yn\")) : \"\")))) + ((((this.props.size == \"large\")) ? ((\" \" + \"_55yq\")) : \"\")))) + ((((this.props.background == \"light\")) ? ((\" \" + \"_55yo\")) : \"\")))) + ((((this.props.background == \"dark\")) ? ((\" \" + \"_55yp\")) : \"\"))));\n            return ((o ? this._renderWithCSSAnimation(x) : this._renderWithJavaScriptAnimation(x)));\n        }\n    });\n    e.exports = w;\n});\n__d(\"ViewportBounds\", [\"Style\",\"Vector\",\"emptyFunction\",\"ge\",\"removeFromArray\",], function(a, b, c, d, e, f) {\n    var g = b(\"Style\"), h = b(\"Vector\"), i = b(\"emptyFunction\"), j = b(\"ge\"), k = b(\"removeFromArray\"), l = {\n        JSBNG__top: [],\n        right: [],\n        bottom: [],\n        left: []\n    };\n    function m(q) {\n        return function() {\n            var r = 0;\n            l[q].forEach(function(s) {\n                r = Math.max(r, s.getSize());\n            });\n            return r;\n        };\n    };\n;\n    function n(q) {\n        return function(r) {\n            return new o(q, r);\n        };\n    };\n;\n    function o(q, r) {\n        this.getSide = i.thatReturns(q);\n        this.getSize = function() {\n            return ((((typeof r === \"function\")) ? r() : r));\n        };\n        l[q].push(this);\n    };\n;\n    o.prototype.remove = function() {\n        k(l[this.getSide()], this);\n    };\n    var p = {\n        getTop: m(\"JSBNG__top\"),\n        getRight: m(\"right\"),\n        getBottom: m(\"bottom\"),\n        getLeft: m(\"left\"),\n        getElementPosition: function(q) {\n            var r = h.getElementPosition(q);\n            r.y -= p.getTop();\n            return r;\n        },\n        addTop: n(\"JSBNG__top\"),\n        addRight: n(\"right\"),\n        addBottom: n(\"bottom\"),\n        addLeft: n(\"left\")\n    };\n    p.addTop(function() {\n        var q = j(\"blueBar\");\n        if (((q && g.isFixed(q)))) {\n            return j(\"blueBarHolder\").offsetHeight;\n        }\n    ;\n    ;\n        return 0;\n    });\n    e.exports = p;\n});\n__d(\"isAsyncScrollQuery\", [\"UserAgent\",], function(a, b, c, d, e, f) {\n    var g = b(\"UserAgent\"), h = null;\n    function i() {\n        if (((h === null))) {\n            h = ((((((g.osx() >= 10.8)) && ((g.webkit() >= 536.25)))) && !g.chrome()));\n        }\n    ;\n    ;\n        return h;\n    };\n;\n    e.exports = i;\n});\n__d(\"ScrollAwareDOM\", [\"ArbiterMixin\",\"CSS\",\"DOM\",\"DOMDimensions\",\"DOMPosition\",\"DOMQuery\",\"HTML\",\"Vector\",\"ViewportBounds\",\"copyProperties\",\"isAsyncScrollQuery\",], function(a, b, c, d, e, f) {\n    var g = b(\"ArbiterMixin\"), h = b(\"CSS\"), i = b(\"DOM\"), j = b(\"DOMDimensions\"), k = b(\"DOMPosition\"), l = b(\"DOMQuery\"), m = b(\"HTML\"), n = b(\"Vector\"), o = b(\"ViewportBounds\"), p = b(\"copyProperties\"), q = b(\"isAsyncScrollQuery\");\n    function r(w, x) {\n        return function() {\n            v.monitor(arguments[w], x.curry.apply(x, arguments));\n        };\n    };\n;\n    function s(w) {\n        if (!((w instanceof Array))) {\n            w = [w,];\n        }\n    ;\n    ;\n        for (var x = 0; ((x < w.length)); x++) {\n            var y = m.replaceJSONWrapper(w[x]);\n            if (((y instanceof m))) {\n                return y.getRootNode();\n            }\n             else if (i.isNode(y)) {\n                return y;\n            }\n            \n        ;\n        ;\n        };\n    ;\n        return null;\n    };\n;\n    function t(w) {\n        return ((k.getElementPosition(w).y > o.getTop()));\n    };\n;\n    function u(w) {\n        var x = ((k.getElementPosition(w).y + j.getElementDimensions(w).height)), y = ((j.getViewportDimensions().height - o.getBottom()));\n        return ((x >= y));\n    };\n;\n    var v = p({\n        monitor: function(w, x) {\n            if (q()) {\n                return x();\n            }\n        ;\n        ;\n            var y = s(w);\n            if (y) {\n                var z = !!y.offsetParent;\n                if (((z && ((t(y) || u(y)))))) {\n                    return x();\n                }\n            ;\n            ;\n                var aa = n.getDocumentDimensions(), ba = x();\n                if (((z || ((y.offsetParent && !t(y)))))) {\n                    var ca = n.getDocumentDimensions().sub(aa), da = {\n                        delta: ca,\n                        target: y\n                    };\n                    if (((v.inform(\"JSBNG__scroll\", da) !== false))) {\n                        ca.scrollElementBy(l.getDocumentScrollElement());\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n                return ba;\n            }\n             else return x()\n        ;\n        },\n        replace: function(w, x) {\n            var y = s(x);\n            if (((!y || h.hasClass(y, \"hidden_elem\")))) {\n                y = w;\n            }\n        ;\n        ;\n            return v.monitor(y, function() {\n                i.replace(w, x);\n            });\n        },\n        prependContent: r(1, i.prependContent),\n        insertAfter: r(1, i.insertAfter),\n        insertBefore: r(1, i.insertBefore),\n        setContent: r(0, i.setContent),\n        appendContent: r(1, i.appendContent),\n        remove: r(0, i.remove),\n        empty: r(0, i.empty)\n    }, g);\n    e.exports = v;\n});\n__d(\"legacy:ScrollAwareDOM\", [\"ScrollAwareDOM\",], function(a, b, c, d) {\n    a.ScrollAwareDOM = b(\"ScrollAwareDOM\");\n}, 3);\n__d(\"Base64\", [], function(a, b, c, d, e, f) {\n    var g = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";\n    function h(l) {\n        l = ((((((l.charCodeAt(0) << 16)) | ((l.charCodeAt(1) << 8)))) | l.charCodeAt(2)));\n        return String.fromCharCode(g.charCodeAt(((l >>> 18))), g.charCodeAt(((((l >>> 12)) & 63))), g.charCodeAt(((((l >>> 6)) & 63))), g.charCodeAt(((l & 63))));\n    };\n;\n    var i = ((((\"\\u003E___?456789:;\\u003C=_______\" + \"\\u0000\\u0001\\u0002\\u0003\\u0004\\u0005\\u0006\\u0007\\u0008\\u0009\\u000a\\u000b\\u000c\\u000d\\u000e\\u000f\\u0010\\u0011\\u0012\\u0013\\u0014\\u0015\\u0016\\u0017\\u0018\\u0019\")) + \"______\\u001a\\u001b\\u001c\\u001d\\u001e\\u001f !\\\"#$%&'()*+,-./0123\"));\n    function j(l) {\n        l = ((((((((i.charCodeAt(((l.charCodeAt(0) - 43))) << 18)) | ((i.charCodeAt(((l.charCodeAt(1) - 43))) << 12)))) | ((i.charCodeAt(((l.charCodeAt(2) - 43))) << 6)))) | i.charCodeAt(((l.charCodeAt(3) - 43)))));\n        return String.fromCharCode(((l >>> 16)), ((((l >>> 8)) & 255)), ((l & 255)));\n    };\n;\n    var k = {\n        encode: function(l) {\n            l = unescape(encodeURI(l));\n            var m = ((((l.length + 2)) % 3));\n            l = ((l + \"\\u0000\\u0000\".slice(m))).replace(/[\\s\\S]{3}/g, h);\n            return ((l.slice(0, ((((l.length + m)) - 2))) + \"==\".slice(m)));\n        },\n        decode: function(l) {\n            l = l.replace(/[^A-Za-z0-9+\\/]/g, \"\");\n            var m = ((((l.length + 3)) & 3));\n            l = ((l + \"AAA\".slice(m))).replace(/..../g, j);\n            l = l.slice(0, ((((l.length + m)) - 3)));\n            try {\n                return decodeURIComponent(escape(l));\n            } catch (n) {\n                throw new Error(\"Not valid UTF-8\");\n            };\n        ;\n        },\n        encodeObject: function(l) {\n            return k.encode(JSON.stringify(l));\n        },\n        decodeObject: function(l) {\n            return JSON.parse(k.decode(l));\n        },\n        encodeNums: function(l) {\n            return String.fromCharCode.apply(String, l.map(function(m) {\n                return g.charCodeAt(((((((m | -((m > 63)))) & -((m > 0)))) & 63)));\n            }));\n        }\n    };\n    e.exports = k;\n});\n__d(\"legacy:base64\", [\"Base64\",], function(a, b, c, d) {\n    a.Base64 = b(\"Base64\");\n}, 3);\n__d(\"legacy:css\", [\"CSS\",], function(a, b, c, d) {\n    a.CSS = b(\"CSS\");\n}, 3);\n__d(\"legacy:dom\", [\"DOM\",], function(a, b, c, d) {\n    a.DOM = b(\"DOM\");\n}, 3);\n__d(\"FBDesktopDetect\", [\"UserAgent\",], function(a, b, c, d, e, f) {\n    var g = b(\"UserAgent\"), h = \"facebook.desktopplugin\", i = {\n        mimeType: \"application/x-facebook-desktop-1\",\n        isPluginInstalled: function() {\n            if (g.osx()) {\n                return false;\n            }\n        ;\n        ;\n            var j = null;\n            if (a.ActiveXObject) {\n                try {\n                    j = new a.ActiveXObject(h);\n                    if (j) {\n                        return true;\n                    }\n                ;\n                ;\n                } catch (k) {\n                \n                };\n            ;\n            }\n             else if (((a.JSBNG__navigator && a.JSBNG__navigator.plugins))) {\n                a.JSBNG__navigator.plugins.refresh(false);\n                for (var l = 0, m = a.JSBNG__navigator.plugins.length; ((l < m)); l++) {\n                    j = a.JSBNG__navigator.plugins[l];\n                    if (((j.length && ((j[0].type === this.mimeType))))) {\n                        return true;\n                    }\n                ;\n                ;\n                };\n            ;\n            }\n            \n        ;\n        ;\n            return false;\n        }\n    };\n    e.exports = i;\n});\n__d(\"NavigationMessage\", [], function(a, b, c, d, e, f) {\n    var g = {\n        NAVIGATION_BEGIN: \"NavigationMessage/navigationBegin\",\n        NAVIGATION_SELECT: \"NavigationMessage/navigationSelect\",\n        NAVIGATION_FIRST_RESPONSE: \"NavigationMessage/navigationFirstResponse\",\n        NAVIGATION_COMPLETED: \"NavigationMessage/navigationCompleted\",\n        NAVIGATION_FAILED: \"NavigationMessage/navigationFailed\",\n        NAVIGATION_COUNT_UPDATE: \"NavigationMessage/navigationCount\",\n        NAVIGATION_FAVORITE_UPDATE: \"NavigationMessage/navigationFavoriteUpdate\",\n        NAVIGATION_ITEM_REMOVED: \"NavigationMessage/navigationItemRemoved\",\n        NAVIGATION_ITEM_HIDDEN: \"NavigationMessage/navigationItemHidden\",\n        INTERNAL_LOADING_BEGIN: \"NavigationMessage/internalLoadingBegin\",\n        INTERNAL_LOADING_COMPLETED: \"NavigationMessage/internalLoadingCompleted\"\n    };\n    e.exports = g;\n});\n__d(\"SimpleDrag\", [\"JSBNG__Event\",\"ArbiterMixin\",\"UserAgent\",\"Vector\",\"copyProperties\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"ArbiterMixin\"), i = b(\"UserAgent\"), j = b(\"Vector\"), k = b(\"copyProperties\"), l = b(\"emptyFunction\");\n    function m(n) {\n        this.minDragDistance = 0;\n        g.listen(n, \"mousedown\", this._start.bind(this));\n    };\n;\n    k(m.prototype, h, {\n        setMinDragDistance: function(n) {\n            this.minDragDistance = n;\n        },\n        _start: function(JSBNG__event) {\n            var n = false, o = true, p = null;\n            if (this.inform(\"mousedown\", JSBNG__event)) {\n                o = false;\n            }\n        ;\n        ;\n            if (this.minDragDistance) {\n                p = j.getEventPosition(JSBNG__event);\n            }\n             else {\n                n = true;\n                var q = this.inform(\"start\", JSBNG__event);\n                if (((q === true))) {\n                    o = false;\n                }\n                 else if (((q === false))) {\n                    n = false;\n                    return;\n                }\n                \n            ;\n            ;\n            }\n        ;\n        ;\n            var r = ((((i.ie() < 9)) ? JSBNG__document.documentElement : window)), s = g.listen(r, {\n                selectstart: ((o ? g.prevent : l)),\n                mousemove: function(JSBNG__event) {\n                    if (!n) {\n                        var t = j.getEventPosition(JSBNG__event);\n                        if (((p.distanceTo(t) < this.minDragDistance))) {\n                            return;\n                        }\n                    ;\n                    ;\n                        n = true;\n                        if (((this.inform(\"start\", JSBNG__event) === false))) {\n                            n = false;\n                            return;\n                        }\n                    ;\n                    ;\n                    }\n                ;\n                ;\n                    this.inform(\"update\", JSBNG__event);\n                }.bind(this),\n                mouseup: function(JSBNG__event) {\n                    {\n                        var fin104keys = ((window.top.JSBNG_Replay.forInKeys)((s))), fin104i = (0);\n                        var t;\n                        for (; (fin104i < fin104keys.length); (fin104i++)) {\n                            ((t) = (fin104keys[fin104i]));\n                            {\n                                s[t].remove();\n                            ;\n                            };\n                        };\n                    };\n                ;\n                    if (n) {\n                        this.inform(\"end\", JSBNG__event);\n                    }\n                     else this.inform(\"click\", JSBNG__event);\n                ;\n                ;\n                }.bind(this)\n            });\n            ((o && JSBNG__event.prevent()));\n        }\n    });\n    e.exports = m;\n});\n__d(\"legacy:async-signal\", [\"AsyncSignal\",], function(a, b, c, d) {\n    a.AsyncSignal = b(\"AsyncSignal\");\n}, 3);\n__d(\"FlipDirectionOnKeypress\", [\"JSBNG__Event\",\"DOM\",\"Input\",\"Style\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"DOM\"), i = b(\"Input\"), j = b(\"Style\");\n    function k(JSBNG__event) {\n        var l = JSBNG__event.getTarget(), m = ((h.isNodeOfType(l, \"input\") && ((l.type == \"text\")))), n = h.isNodeOfType(l, \"textarea\");\n        if (((!((m || n)) || l.getAttribute(\"data-prevent-auto-flip\")))) {\n            return;\n        }\n    ;\n    ;\n        var o = i.getValue(l), p = ((l.style && l.style.direction));\n        if (!p) {\n            var q = 0, r = true;\n            for (var s = 0; ((s < o.length)); s++) {\n                var t = o.charCodeAt(s);\n                if (((t >= 48))) {\n                    if (r) {\n                        r = false;\n                        q++;\n                    }\n                ;\n                ;\n                    if (((((t >= 1470)) && ((t <= 1920))))) {\n                        j.set(l, \"direction\", \"rtl\");\n                        return;\n                    }\n                ;\n                ;\n                    if (((q == 5))) {\n                        j.set(l, \"direction\", \"ltr\");\n                        return;\n                    }\n                ;\n                ;\n                }\n                 else r = true;\n            ;\n            ;\n            };\n        ;\n        }\n         else if (((o.length === 0))) {\n            j.set(l, \"direction\", \"\");\n        }\n        \n    ;\n    ;\n    };\n;\n    g.listen(JSBNG__document.documentElement, {\n        keyup: k,\n        input: k\n    });\n});\n__d(\"PlaceholderOnsubmitFormListener\", [\"JSBNG__Event\",\"Input\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"Input\");\n    g.listen(JSBNG__document.documentElement, \"submit\", function(i) {\n        var j = i.getTarget().getElementsByTagName(\"*\");\n        for (var k = 0; ((k < j.length)); k++) {\n            if (((j[k].getAttribute(\"placeholder\") && h.isEmpty(j[k])))) {\n                h.setValue(j[k], \"\");\n            }\n        ;\n        ;\n        };\n    ;\n    });\n});\n__d(\"ARIA\", [\"DOM\",\"emptyFunction\",\"ge\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOM\"), h = b(\"emptyFunction\"), i = b(\"ge\"), j, k, l = function() {\n        j = i(\"ariaAssertiveAlert\");\n        if (!j) {\n            j = g.create(\"div\", {\n                id: \"ariaAssertiveAlert\",\n                className: \"accessible_elem\",\n                \"aria-live\": \"assertive\"\n            });\n            g.appendContent(JSBNG__document.body, j);\n        }\n    ;\n    ;\n        k = i(\"ariaPoliteAlert\");\n        if (!k) {\n            k = j.cloneNode(false);\n            k.setAttribute(\"id\", \"ariaPoliteAlert\");\n            k.setAttribute(\"aria-live\", \"polite\");\n            g.appendContent(JSBNG__document.body, k);\n        }\n    ;\n    ;\n        l = h;\n    };\n    function m(o, p) {\n        l();\n        var q = ((p ? j : k));\n        g.setContent(q, o);\n    };\n;\n    var n = {\n        owns: function(o, p) {\n            o.setAttribute(\"aria-owns\", g.getID(p));\n        },\n        setPopup: function(o, p) {\n            var q = g.getID(p);\n            o.setAttribute(\"aria-owns\", q);\n            o.setAttribute(\"aria-haspopup\", \"true\");\n            if (((o.tabIndex == -1))) {\n                o.tabIndex = 0;\n            }\n        ;\n        ;\n        },\n        announce: function(o) {\n            m(o, true);\n        },\n        notify: function(o) {\n            m(o);\n        }\n    };\n    e.exports = n;\n});\n__d(\"ScriptPathState\", [\"Arbiter\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h, i, j, k, l = 100, m = {\n        setIsUIPageletRequest: function(n) {\n            j = n;\n        },\n        setUserURISampleRate: function(n) {\n            k = n;\n        },\n        reset: function() {\n            h = null;\n            i = false;\n            j = false;\n        },\n        _shouldUpdateScriptPath: function() {\n            return ((i && !j));\n        },\n        _shouldSendURI: function() {\n            return ((Math.JSBNG__random() < k));\n        },\n        getParams: function() {\n            var n = {\n            };\n            if (m._shouldUpdateScriptPath()) {\n                if (((m._shouldSendURI() && ((h !== null))))) {\n                    n.user_uri = h.substring(0, l);\n                }\n            ;\n            ;\n            }\n             else n.no_script_path = 1;\n        ;\n        ;\n            return n;\n        }\n    };\n    g.subscribe(\"pre_page_transition\", function(n, o) {\n        i = true;\n        h = o.to.getUnqualifiedURI().toString();\n    });\n    e.exports = a.ScriptPathState = m;\n});\n__d(\"goOrReplace\", [\"URI\",\"UserAgent\",], function(a, b, c, d, e, f) {\n    var g = b(\"URI\"), h = b(\"UserAgent\");\n    function i(j, k, l) {\n        var m = new g(k), n = a.Quickling;\n        if (((((((((((j.pathname == \"/\")) && ((m.getPath() != \"/\")))) && n)) && n.isActive())) && n.isPageActive(m)))) {\n            var o = ((j.search ? {\n            } : {\n                q: \"\"\n            }));\n            m = new g().setPath(\"/\").setQueryData(o).setFragment(m.getUnqualifiedURI().toString());\n            k = m.toString();\n        }\n    ;\n    ;\n        if (((l && !((h.ie() < 8))))) {\n            j.replace(k);\n        }\n         else if (((j.href == k))) {\n            j.reload();\n        }\n         else j.href = k;\n        \n    ;\n    ;\n    };\n;\n    e.exports = i;\n});\n__d(\"AjaxPipeRequest\", [\"Arbiter\",\"AsyncRequest\",\"BigPipe\",\"CSS\",\"DOM\",\"Env\",\"PageletSet\",\"ScriptPathState\",\"URI\",\"copyProperties\",\"goOrReplace\",\"ge\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"AsyncRequest\"), i = b(\"BigPipe\"), j = b(\"CSS\"), k = b(\"DOM\"), l = b(\"Env\"), m = b(\"PageletSet\"), n = b(\"ScriptPathState\"), o = b(\"URI\"), p = b(\"copyProperties\"), q = b(\"goOrReplace\"), r = b(\"ge\"), s;\n    function t(w, x) {\n        var y = r(w);\n        if (!y) {\n            return;\n        }\n    ;\n    ;\n        if (!x) {\n            y.style.minHeight = \"600px\";\n        }\n    ;\n    ;\n        var z = m.getPageletIDs();\n        for (var aa = 0; ((aa < z.length)); aa++) {\n            var ba = z[aa];\n            if (k.contains(y, ba)) {\n                m.removePagelet(ba);\n            }\n        ;\n        ;\n        };\n    ;\n        k.empty(y);\n    };\n;\n    function u(w, x) {\n        var y = r(w);\n        if (((y && !x))) {\n            y.style.minHeight = \"100px\";\n        }\n    ;\n    ;\n    };\n;\n    function v(w, x) {\n        this._uri = w;\n        this._query_data = x;\n        this._request = new h();\n        this._canvas_id = null;\n        this._allow_cross_page_transition = true;\n    };\n;\n    p(v.prototype, {\n        setCanvasId: function(w) {\n            this._canvas_id = w;\n            return this;\n        },\n        setURI: function(w) {\n            this._uri = w;\n            return this;\n        },\n        setData: function(w) {\n            this._query_data = w;\n            return this;\n        },\n        getData: function(w) {\n            return this._query_data;\n        },\n        setAllowCrossPageTransition: function(w) {\n            this._allow_cross_page_transition = w;\n            return this;\n        },\n        setAppend: function(w) {\n            this._append = w;\n            return this;\n        },\n        send: function() {\n            var w = {\n                ajaxpipe: 1,\n                ajaxpipe_token: l.ajaxpipe_token\n            };\n            p(w, n.getParams());\n            n.reset();\n            this._request.setOption(\"useIframeTransport\", true).setURI(this._uri).setData(p(w, this._query_data)).setPreBootloadHandler(this._preBootloadHandler.bind(this)).setInitialHandler(this._onInitialResponse.bind(this)).setHandler(this._onResponse.bind(this)).setMethod(\"GET\").setReadOnly(true).setAllowCrossPageTransition(this._allow_cross_page_transition);\n            if (this._automatic) {\n                this._relevantRequest = s;\n            }\n             else s = this._request;\n        ;\n        ;\n            this._request.send();\n            return this;\n        },\n        _preBootloadFirstResponse: function(w) {\n            return false;\n        },\n        _fireDomContentCallback: function() {\n            this._arbiter.inform(\"ajaxpipe/domcontent_callback\", true, g.BEHAVIOR_STATE);\n        },\n        _fireOnloadCallback: function() {\n            this._arbiter.inform(\"ajaxpipe/onload_callback\", true, g.BEHAVIOR_STATE);\n        },\n        _isRelevant: function(w) {\n            return ((((((this._request == s)) || ((this._automatic && ((this._relevantRequest == s)))))) || this._jsNonBlock));\n        },\n        _preBootloadHandler: function(w) {\n            var x = w.getPayload();\n            if (((((!x || x.redirect)) || !this._isRelevant(w)))) {\n                return false;\n            }\n        ;\n        ;\n            var y = false;\n            if (w.is_first) {\n                ((((!this._append && !this._displayCallback)) && t(this._canvas_id, this._constHeight)));\n                this._arbiter = new g();\n                y = this._preBootloadFirstResponse(w);\n                this.pipe = new i({\n                    arbiter: this._arbiter,\n                    rootNodeID: this._canvas_id,\n                    lid: this._request.lid,\n                    isAjax: true,\n                    domContentCallback: this._fireDomContentCallback.bind(this),\n                    onloadCallback: this._fireOnloadCallback.bind(this),\n                    domContentEvt: \"ajaxpipe/domcontent_callback\",\n                    onloadEvt: \"ajaxpipe/onload_callback\",\n                    jsNonBlock: this._jsNonBlock,\n                    automatic: this._automatic,\n                    displayCallback: this._displayCallback\n                });\n            }\n        ;\n        ;\n            return y;\n        },\n        _redirect: function(w) {\n            if (w.redirect) {\n                if (((w.force || !this.isPageActive(w.redirect)))) {\n                    var x = [\"ajaxpipe\",\"ajaxpipe_token\",].concat(this.getSanitizedParameters());\n                    q(window.JSBNG__location, o(w.redirect).removeQueryData(x), true);\n                }\n                 else {\n                    var y = a.PageTransitions;\n                    y.go(w.redirect, true);\n                }\n            ;\n            ;\n                return true;\n            }\n             else return false\n        ;\n        },\n        isPageActive: function(w) {\n            return true;\n        },\n        getSanitizedParameters: function() {\n            return [];\n        },\n        _versionCheck: function(w) {\n            return true;\n        },\n        _onInitialResponse: function(w) {\n            var x = w.getPayload();\n            if (!this._isRelevant(w)) {\n                return false;\n            }\n        ;\n        ;\n            if (!x) {\n                return true;\n            }\n        ;\n        ;\n            if (((this._redirect(x) || !this._versionCheck(x)))) {\n                return false;\n            }\n        ;\n        ;\n            return true;\n        },\n        _processFirstResponse: function(w) {\n            var x = w.getPayload();\n            if (((r(this._canvas_id) && ((x.canvas_class != null))))) {\n                j.setClass(this._canvas_id, x.canvas_class);\n            }\n        ;\n        ;\n        },\n        setFirstResponseCallback: function(w) {\n            this._firstResponseCallback = w;\n            return this;\n        },\n        setFirstResponseHandler: function(w) {\n            this._processFirstResponse = w;\n            return this;\n        },\n        _onResponse: function(w) {\n            var x = w.payload;\n            if (!this._isRelevant(w)) {\n                return h.suppressOnloadToken;\n            }\n        ;\n        ;\n            if (w.is_first) {\n                this._processFirstResponse(w);\n                ((this._firstResponseCallback && this._firstResponseCallback()));\n                x.provides = ((x.provides || []));\n                x.provides.push(\"uipage_onload\");\n                if (this._append) {\n                    x.append = this._canvas_id;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            if (x) {\n                if (((((((\"JSBNG__content\" in x.JSBNG__content)) && ((this._canvas_id !== null)))) && ((this._canvas_id != \"JSBNG__content\"))))) {\n                    x.JSBNG__content[this._canvas_id] = x.JSBNG__content.JSBNG__content;\n                    delete x.JSBNG__content.JSBNG__content;\n                }\n            ;\n            ;\n                this.pipe.onPageletArrive(x);\n            }\n        ;\n        ;\n            if (w.is_last) {\n                u(this._canvas_id, this._constHeight);\n            }\n        ;\n        ;\n            return h.suppressOnloadToken;\n        },\n        setNectarModuleDataSafe: function(w) {\n            this._request.setNectarModuleDataSafe(w);\n            return this;\n        },\n        setFinallyHandler: function(w) {\n            this._request.setFinallyHandler(w);\n            return this;\n        },\n        setErrorHandler: function(w) {\n            this._request.setErrorHandler(w);\n            return this;\n        },\n        abort: function() {\n            this._request.abort();\n            if (((s == this._request))) {\n                s = null;\n            }\n        ;\n        ;\n            this._request = null;\n            return this;\n        },\n        setJSNonBlock: function(w) {\n            this._jsNonBlock = w;\n            return this;\n        },\n        setAutomatic: function(w) {\n            this._automatic = w;\n            return this;\n        },\n        setDisplayCallback: function(w) {\n            this._displayCallback = w;\n            return this;\n        },\n        setConstHeight: function(w) {\n            this._constHeight = w;\n            return this;\n        },\n        getAsyncRequest: function() {\n            return this._request;\n        }\n    });\n    p(v, {\n        getCurrentRequest: function() {\n            return s;\n        },\n        setCurrentRequest: function(w) {\n            s = w;\n        }\n    });\n    e.exports = v;\n});\n__d(\"AsyncRequestNectarLogging\", [\"AsyncRequest\",\"Nectar\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = b(\"Nectar\"), i = b(\"copyProperties\");\n    i(g.prototype, {\n        setNectarModuleData: function(j) {\n            if (((this.method == \"POST\"))) {\n                h.addModuleData(this.data, j);\n            }\n        ;\n        ;\n        },\n        setNectarImpressionId: function() {\n            if (((this.method == \"POST\"))) {\n                h.addImpressionID(this.data);\n            }\n        ;\n        ;\n        }\n    });\n});\n__d(\"CSSClassTransition\", [\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"copyProperties\"), h = [];\n    function i() {\n    \n    };\n;\n    g(i, {\n        go: function(j, k, l, m) {\n            var n;\n            for (var o = 0; ((o < h.length)); o++) {\n                if (((h[o](j, k, l, m) === true))) {\n                    n = true;\n                }\n            ;\n            ;\n            };\n        ;\n            if (!n) {\n                j.className = k;\n            }\n        ;\n        ;\n        },\n        registerHandler: function(j) {\n            h.push(j);\n            return {\n                remove: function() {\n                    var k = h.indexOf(j);\n                    if (((k >= 0))) {\n                        h.splice(k, 1);\n                    }\n                ;\n                ;\n                }\n            };\n        }\n    });\n    e.exports = i;\n});\n__d(\"DOMScroll\", [\"Animation\",\"Arbiter\",\"DOM\",\"DOMQuery\",\"Vector\",\"ViewportBounds\",\"ge\",\"isAsyncScrollQuery\",], function(a, b, c, d, e, f) {\n    var g = b(\"Animation\"), h = b(\"Arbiter\"), i = b(\"DOM\"), j = b(\"DOMQuery\"), k = b(\"Vector\"), l = b(\"ViewportBounds\"), m = b(\"ge\"), n = b(\"isAsyncScrollQuery\"), o = {\n        SCROLL: \"dom-scroll\",\n        getScrollState: function() {\n            var p = k.getViewportDimensions(), q = k.getDocumentDimensions(), r = ((q.x > p.x)), s = ((q.y > p.y));\n            r += 0;\n            s += 0;\n            return new k(r, s);\n        },\n        _scrollbarSize: null,\n        _initScrollbarSize: function() {\n            var p = i.create(\"p\");\n            p.style.width = \"100%\";\n            p.style.height = \"200px\";\n            var q = i.create(\"div\");\n            q.style.position = \"absolute\";\n            q.style.JSBNG__top = \"0px\";\n            q.style.left = \"0px\";\n            q.style.visibility = \"hidden\";\n            q.style.width = \"200px\";\n            q.style.height = \"150px\";\n            q.style.overflow = \"hidden\";\n            q.appendChild(p);\n            JSBNG__document.body.appendChild(q);\n            var r = p.offsetWidth;\n            q.style.overflow = \"JSBNG__scroll\";\n            var s = p.offsetWidth;\n            if (((r == s))) {\n                s = q.clientWidth;\n            }\n        ;\n        ;\n            JSBNG__document.body.removeChild(q);\n            o._scrollbarSize = ((r - s));\n        },\n        getScrollbarSize: function() {\n            if (((o._scrollbarSize === null))) {\n                o._initScrollbarSize();\n            }\n        ;\n        ;\n            return o._scrollbarSize;\n        },\n        JSBNG__scrollTo: function(p, q, r, s, t) {\n            if (((((typeof q == \"undefined\")) || ((q === true))))) {\n                q = 750;\n            }\n        ;\n        ;\n            if (n()) {\n                q = false;\n            }\n        ;\n        ;\n            if (!((p instanceof k))) {\n                var u = k.getScrollPosition().x, v = k.getElementPosition(m(p)).y;\n                p = new k(u, v, \"JSBNG__document\");\n                if (!s) {\n                    p.y -= ((l.getTop() / ((r ? 2 : 1))));\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            if (r) {\n                p.y -= ((k.getViewportDimensions().y / 2));\n            }\n             else if (s) {\n                p.y -= k.getViewportDimensions().y;\n                p.y += s;\n            }\n            \n        ;\n        ;\n            p = p.convertTo(\"JSBNG__document\");\n            if (q) {\n                return new g(JSBNG__document.body).to(\"scrollTop\", p.y).to(\"scrollLeft\", p.x).ease(g.ease.end).duration(q).ondone(t).go();\n            }\n             else if (window.JSBNG__scrollTo) {\n                window.JSBNG__scrollTo(p.x, p.y);\n                ((t && t()));\n            }\n            \n        ;\n        ;\n            h.inform(o.SCROLL);\n        },\n        ensureVisible: function(p, q, r, s, t) {\n            if (((r === undefined))) {\n                r = 10;\n            }\n        ;\n        ;\n            p = m(p);\n            if (q) {\n                p = j.JSBNG__find(p, q);\n            }\n        ;\n        ;\n            var u = k.getScrollPosition().x, v = k.getScrollPosition().y, w = ((v + k.getViewportDimensions().y)), x = k.getElementPosition(p).y, y = ((x + k.getElementDimensions(p).y));\n            x -= l.getTop();\n            x -= r;\n            y += r;\n            if (((x < v))) {\n                o.JSBNG__scrollTo(new k(u, x, \"JSBNG__document\"), s, false, false, t);\n            }\n             else if (((y > w))) {\n                if (((((x - ((y - w)))) < v))) {\n                    o.JSBNG__scrollTo(new k(u, x, \"JSBNG__document\"), s, false, false, t);\n                }\n                 else o.JSBNG__scrollTo(new k(u, y, \"JSBNG__document\"), s, false, true, t);\n            ;\n            }\n            \n        ;\n        ;\n        },\n        scrollToTop: function(p) {\n            var q = k.getScrollPosition();\n            o.JSBNG__scrollTo(new k(q.x, 0, \"JSBNG__document\"), ((p !== false)));\n        }\n    };\n    e.exports = o;\n});\n__d(\"Button\", [\"CSS\",\"DataStore\",\"DOM\",\"JSBNG__Event\",\"Parent\",\"cx\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSS\"), h = b(\"DataStore\"), i = b(\"DOM\"), j = b(\"JSBNG__Event\"), k = b(\"Parent\"), l = b(\"cx\"), m = b(\"emptyFunction\"), n = \"uiButtonDisabled\", o = \"uiButtonDepressed\", p = \"_42fr\", q = \"_42fs\", r = \"button:blocker\", s = \"href\", t = \"ajaxify\";\n    function u(aa, ba) {\n        var ca = h.get(aa, r);\n        if (ba) {\n            if (ca) {\n                ca.remove();\n                h.remove(aa, r);\n            }\n        ;\n        ;\n        }\n         else if (!ca) {\n            h.set(aa, r, j.listen(aa, \"click\", m.thatReturnsFalse, j.Priority.URGENT));\n        }\n        \n    ;\n    ;\n    };\n;\n    function v(aa) {\n        var ba = ((k.byClass(aa, \"uiButton\") || k.byClass(aa, \"_42ft\")));\n        if (!ba) {\n            throw new Error(\"invalid use case\");\n        }\n    ;\n    ;\n        return ba;\n    };\n;\n    function w(aa) {\n        return i.isNodeOfType(aa, \"a\");\n    };\n;\n    function x(aa) {\n        return i.isNodeOfType(aa, \"button\");\n    };\n;\n    function y(aa) {\n        return g.hasClass(aa, \"_42ft\");\n    };\n;\n    var z = {\n        getInputElement: function(aa) {\n            aa = v(aa);\n            if (w(aa)) {\n                throw new Error(\"invalid use case\");\n            }\n        ;\n        ;\n            return ((x(aa) ? aa : i.JSBNG__find(aa, \"input\")));\n        },\n        isEnabled: function(aa) {\n            return !((g.hasClass(v(aa), n) || g.hasClass(v(aa), p)));\n        },\n        setEnabled: function(aa, ba) {\n            aa = v(aa);\n            var ca = ((y(aa) ? p : n));\n            g.conditionClass(aa, ca, !ba);\n            if (w(aa)) {\n                var da = aa.getAttribute(\"href\"), ea = aa.getAttribute(\"ajaxify\"), fa = h.get(aa, s, \"#\"), ga = h.get(aa, t);\n                if (ba) {\n                    if (!da) {\n                        aa.setAttribute(\"href\", fa);\n                    }\n                ;\n                ;\n                    if (((!ea && ga))) {\n                        aa.setAttribute(\"ajaxify\", ga);\n                    }\n                ;\n                ;\n                    aa.removeAttribute(\"tabIndex\");\n                }\n                 else {\n                    if (((da && ((da !== fa))))) {\n                        h.set(aa, s, da);\n                    }\n                ;\n                ;\n                    if (((ea && ((ea !== ga))))) {\n                        h.set(aa, t, ea);\n                    }\n                ;\n                ;\n                    aa.removeAttribute(\"href\");\n                    aa.removeAttribute(\"ajaxify\");\n                    aa.setAttribute(\"tabIndex\", \"-1\");\n                }\n            ;\n            ;\n                u(aa, ba);\n            }\n             else {\n                var ha = z.getInputElement(aa);\n                ha.disabled = !ba;\n                u(ha, ba);\n            }\n        ;\n        ;\n        },\n        setDepressed: function(aa, ba) {\n            aa = v(aa);\n            var ca = ((y(aa) ? q : o));\n            g.conditionClass(aa, ca, ba);\n        },\n        isDepressed: function(aa) {\n            aa = v(aa);\n            var ba = ((y(aa) ? q : o));\n            return g.hasClass(aa, ba);\n        },\n        setLabel: function(aa, ba) {\n            aa = v(aa);\n            if (y(aa)) {\n                var ca = [];\n                if (ba) {\n                    ca.push(ba);\n                }\n            ;\n            ;\n                var da = i.scry(aa, \".img\")[0];\n                if (da) {\n                    if (((aa.firstChild == da))) {\n                        ca.unshift(da);\n                    }\n                     else ca.push(da);\n                ;\n                }\n            ;\n            ;\n                i.setContent(aa, ca);\n            }\n             else if (w(aa)) {\n                var ea = i.JSBNG__find(aa, \"span.uiButtonText\");\n                i.setContent(ea, ba);\n            }\n             else z.getInputElement(aa).value = ba;\n            \n        ;\n        ;\n            var fa = ((y(aa) ? \"_42fv\" : \"uiButtonNoText\"));\n            g.conditionClass(aa, fa, !ba);\n        },\n        setIcon: function(aa, ba) {\n            if (((ba && !i.isNode(ba)))) {\n                return;\n            }\n        ;\n        ;\n            aa = v(aa);\n            var ca = i.scry(aa, \".img\")[0];\n            if (!ba) {\n                ((ca && i.remove(ca)));\n                return;\n            }\n        ;\n        ;\n            g.addClass(ba, \"customimg\");\n            if (((ca != ba))) {\n                if (ca) {\n                    i.replace(ca, ba);\n                }\n                 else i.prependContent(aa, ba);\n            ;\n            }\n        ;\n        ;\n        }\n    };\n    e.exports = z;\n});\n__d(\"Form\", [\"JSBNG__Event\",\"AsyncRequest\",\"AsyncResponse\",\"CSS\",\"DOM\",\"DOMPosition\",\"DOMQuery\",\"DataStore\",\"Env\",\"Input\",\"Parent\",\"URI\",\"createArrayFrom\",\"trackReferrer\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"AsyncRequest\"), i = b(\"AsyncResponse\"), j = b(\"CSS\"), k = b(\"DOM\"), l = b(\"DOMPosition\"), m = b(\"DOMQuery\"), n = b(\"DataStore\"), o = b(\"Env\"), p = b(\"Input\"), q = b(\"Parent\"), r = b(\"URI\"), s = b(\"createArrayFrom\"), t = b(\"trackReferrer\"), u = ((\"JSBNG__FileList\" in window)), v = ((\"JSBNG__FormData\" in window));\n    function w(y) {\n        var z = {\n        };\n        r.implodeQuery(y).split(\"&\").forEach(function(aa) {\n            if (aa) {\n                var ba = /^([^=]*)(?:=(.*))?$/.exec(aa), ca = r.decodeComponent(ba[1]), da = ((ba[2] ? r.decodeComponent(ba[2]) : null));\n                z[ca] = da;\n            }\n        ;\n        ;\n        });\n        return z;\n    };\n;\n    var x = {\n        getInputs: function(y) {\n            y = ((y || JSBNG__document));\n            return [].concat(s(m.scry(y, \"input\")), s(m.scry(y, \"select\")), s(m.scry(y, \"textarea\")), s(m.scry(y, \"button\")));\n        },\n        getInputsByName: function(y) {\n            var z = {\n            };\n            x.getInputs(y).forEach(function(aa) {\n                var ba = z[aa.JSBNG__name];\n                z[aa.JSBNG__name] = ((((typeof ba === \"undefined\")) ? aa : [aa,].concat(ba)));\n            });\n            return z;\n        },\n        getSelectValue: function(y) {\n            return y.options[y.selectedIndex].value;\n        },\n        setSelectValue: function(y, z) {\n            for (var aa = 0; ((aa < y.options.length)); ++aa) {\n                if (((y.options[aa].value == z))) {\n                    y.selectedIndex = aa;\n                    break;\n                }\n            ;\n            ;\n            };\n        ;\n        },\n        getRadioValue: function(y) {\n            for (var z = 0; ((z < y.length)); z++) {\n                if (y[z].checked) {\n                    return y[z].value;\n                }\n            ;\n            ;\n            };\n        ;\n            return null;\n        },\n        getElements: function(y) {\n            return s(((((y.tagName == \"FORM\")) ? y.elements : x.getInputs(y))));\n        },\n        getAttribute: function(y, z) {\n            return ((((y.getAttributeNode(z) || {\n            })).value || null));\n        },\n        setDisabled: function(y, z) {\n            x.getElements(y).forEach(function(aa) {\n                if (((aa.disabled !== undefined))) {\n                    var ba = n.get(aa, \"origDisabledState\");\n                    if (z) {\n                        if (((ba === undefined))) {\n                            n.set(aa, \"origDisabledState\", aa.disabled);\n                        }\n                    ;\n                    ;\n                        aa.disabled = z;\n                    }\n                     else if (((ba !== true))) {\n                        aa.disabled = false;\n                    }\n                    \n                ;\n                ;\n                }\n            ;\n            ;\n            });\n        },\n        bootstrap: function(y, z) {\n            var aa = ((x.getAttribute(y, \"method\") || \"GET\")).toUpperCase();\n            z = ((q.byTag(z, \"button\") || z));\n            var ba = ((q.byClass(z, \"stat_elem\") || y));\n            if (j.hasClass(ba, \"async_saving\")) {\n                return;\n            }\n        ;\n        ;\n            if (((z && ((((((z.form !== y)) || ((((z.nodeName != \"INPUT\")) && ((z.nodeName != \"BUTTON\")))))) || ((z.type != \"submit\"))))))) {\n                var ca = m.scry(y, \".enter_submit_target\")[0];\n                ((ca && (z = ca)));\n            }\n        ;\n        ;\n            var da = x.serialize(y, z);\n            x.setDisabled(y, true);\n            var ea = ((x.getAttribute(y, \"ajaxify\") || x.getAttribute(y, \"action\")));\n            t(y, ea);\n            var fa = new h(ea);\n            fa.setData(da).setNectarModuleDataSafe(y).setReadOnly(((aa == \"GET\"))).setMethod(aa).setRelativeTo(y).setStatusElement(ba).setInitialHandler(x.setDisabled.curry(y, false)).setHandler(function(ga) {\n                g.fire(y, \"success\", {\n                    response: ga\n                });\n            }).setErrorHandler(function(ga) {\n                if (((g.fire(y, \"error\", {\n                    response: ga\n                }) !== false))) {\n                    i.defaultErrorHandler(ga);\n                }\n            ;\n            ;\n            }).setFinallyHandler(x.setDisabled.curry(y, false)).send();\n        },\n        forEachValue: function(y, z, aa) {\n            x.getElements(y).forEach(function(ba) {\n                if (((((ba.JSBNG__name && !ba.disabled)) && ((ba.type !== \"submit\"))))) {\n                    if (((((((((((!ba.type || ((((((ba.type === \"radio\")) || ((ba.type === \"checkbox\")))) && ba.checked)))) || ((ba.type === \"text\")))) || ((ba.type === \"password\")))) || ((ba.type === \"hidden\")))) || ((ba.nodeName === \"TEXTAREA\"))))) {\n                        aa(ba.type, ba.JSBNG__name, p.getValue(ba));\n                    }\n                     else if (((ba.nodeName === \"SELECT\"))) {\n                        for (var ca = 0, da = ba.options.length; ((ca < da)); ca++) {\n                            var ea = ba.options[ca];\n                            if (ea.selected) {\n                                aa(\"select\", ba.JSBNG__name, ea.value);\n                            }\n                        ;\n                        ;\n                        };\n                    ;\n                    }\n                     else if (((u && ((ba.type === \"file\"))))) {\n                        var fa = ba.files;\n                        for (var ga = 0; ((ga < fa.length)); ga++) {\n                            aa(\"file\", ba.JSBNG__name, fa.item(ga));\n                        ;\n                        };\n                    ;\n                    }\n                    \n                    \n                ;\n                }\n            ;\n            ;\n            });\n            if (((((((((z && z.JSBNG__name)) && ((z.type === \"submit\")))) && m.contains(y, z))) && m.isNodeOfType(z, [\"input\",\"button\",])))) {\n                aa(\"submit\", z.JSBNG__name, z.value);\n            }\n        ;\n        ;\n        },\n        createFormData: function(y, z) {\n            if (!v) {\n                return null;\n            }\n        ;\n        ;\n            var aa = new JSBNG__FormData();\n            if (y) {\n                if (m.isNode(y)) {\n                    x.forEachValue(y, z, function(da, ea, fa) {\n                        aa.append(ea, fa);\n                    });\n                }\n                 else {\n                    var ba = w(y);\n                    {\n                        var fin105keys = ((window.top.JSBNG_Replay.forInKeys)((ba))), fin105i = (0);\n                        var ca;\n                        for (; (fin105i < fin105keys.length); (fin105i++)) {\n                            ((ca) = (fin105keys[fin105i]));\n                            {\n                                aa.append(ca, ba[ca]);\n                            ;\n                            };\n                        };\n                    };\n                ;\n                }\n            ;\n            }\n        ;\n        ;\n            return aa;\n        },\n        serialize: function(y, z) {\n            var aa = {\n            };\n            x.forEachValue(y, z, function(ba, ca, da) {\n                if (((ba === \"file\"))) {\n                    return;\n                }\n            ;\n            ;\n                x._serializeHelper(aa, ca, da);\n            });\n            return x._serializeFix(aa);\n        },\n        _serializeHelper: function(y, z, aa) {\n            var ba = Object.prototype.hasOwnProperty, ca = /([^\\]]+)\\[([^\\]]*)\\](.*)/.exec(z);\n            if (ca) {\n                if (((!y[ca[1]] || !ba.call(y, ca[1])))) {\n                    var da;\n                    y[ca[1]] = da = {\n                    };\n                    if (((y[ca[1]] !== da))) {\n                        return;\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n                var ea = 0;\n                if (((ca[2] === \"\"))) {\n                    while (((y[ca[1]][ea] !== undefined))) {\n                        ea++;\n                    ;\n                    };\n                ;\n                }\n                 else ea = ca[2];\n            ;\n            ;\n                if (((ca[3] === \"\"))) {\n                    y[ca[1]][ea] = aa;\n                }\n                 else x._serializeHelper(y[ca[1]], ea.concat(ca[3]), aa);\n            ;\n            ;\n            }\n             else y[z] = aa;\n        ;\n        ;\n        },\n        _serializeFix: function(y) {\n            {\n                var fin106keys = ((window.top.JSBNG_Replay.forInKeys)((y))), fin106i = (0);\n                var z;\n                for (; (fin106i < fin106keys.length); (fin106i++)) {\n                    ((z) = (fin106keys[fin106i]));\n                    {\n                        if (((y[z] instanceof Object))) {\n                            y[z] = x._serializeFix(y[z]);\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            var aa = Object.keys(y);\n            if (((((aa.length === 0)) || aa.some(isNaN)))) {\n                return y;\n            }\n        ;\n        ;\n            aa.sort(function(da, ea) {\n                return ((da - ea));\n            });\n            var ba = 0, ca = aa.every(function(da) {\n                return ((+da === ba++));\n            });\n            if (ca) {\n                return aa.map(function(da) {\n                    return y[da];\n                });\n            }\n        ;\n        ;\n            return y;\n        },\n        post: function(y, z, aa) {\n            var ba = JSBNG__document.createElement(\"form\");\n            ba.action = y.toString();\n            ba.method = \"POST\";\n            ba.style.display = \"none\";\n            if (aa) {\n                ba.target = aa;\n            }\n        ;\n        ;\n            z.fb_dtsg = o.fb_dtsg;\n            x.createHiddenInputs(z, ba);\n            m.getRootElement().appendChild(ba);\n            ba.submit();\n            return false;\n        },\n        createHiddenInputs: function(y, z, aa, ba) {\n            aa = ((aa || {\n            }));\n            var ca = w(y);\n            {\n                var fin107keys = ((window.top.JSBNG_Replay.forInKeys)((ca))), fin107i = (0);\n                var da;\n                for (; (fin107i < fin107keys.length); (fin107i++)) {\n                    ((da) = (fin107keys[fin107i]));\n                    {\n                        if (((ca[da] === null))) {\n                            continue;\n                        }\n                    ;\n                    ;\n                        if (((aa[da] && ba))) {\n                            aa[da].value = ca[da];\n                        }\n                         else {\n                            var ea = k.create(\"input\", {\n                                type: \"hidden\",\n                                JSBNG__name: da,\n                                value: ca[da]\n                            });\n                            aa[da] = ea;\n                            z.appendChild(ea);\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            return aa;\n        },\n        getFirstElement: function(y, z) {\n            z = ((z || [\"input[type=\\\"text\\\"]\",\"textarea\",\"input[type=\\\"password\\\"]\",\"input[type=\\\"button\\\"]\",\"input[type=\\\"submit\\\"]\",]));\n            var aa = [];\n            for (var ba = 0; ((ba < z.length)); ba++) {\n                aa = m.scry(y, z[ba]);\n                for (var ca = 0; ((ca < aa.length)); ca++) {\n                    var da = aa[ca];\n                    try {\n                        var fa = l.getElementPosition(da);\n                        if (((((fa.y > 0)) && ((fa.x > 0))))) {\n                            return da;\n                        }\n                    ;\n                    ;\n                    } catch (ea) {\n                    \n                    };\n                ;\n                };\n            ;\n            };\n        ;\n            return null;\n        },\n        focusFirst: function(y) {\n            var z = x.getFirstElement(y);\n            if (z) {\n                z.JSBNG__focus();\n                return true;\n            }\n        ;\n        ;\n            return false;\n        }\n    };\n    e.exports = x;\n});\n__d(\"Locale\", [\"Style\",], function(a, b, c, d, e, f) {\n    var g = b(\"Style\"), h, i = {\n        isRTL: function() {\n            if (((h === undefined))) {\n                h = ((\"rtl\" === g.get(JSBNG__document.body, \"direction\")));\n            }\n        ;\n        ;\n            return h;\n        }\n    };\n    e.exports = i;\n});\n__d(\"getOverlayZIndex\", [\"Style\",], function(a, b, c, d, e, f) {\n    var g = b(\"Style\");\n    function h(i, j) {\n        j = ((j || JSBNG__document.body));\n        var k = [];\n        while (((i && ((i !== j))))) {\n            k.push(i);\n            i = i.parentNode;\n        };\n    ;\n        if (((i !== j))) {\n            return 0;\n        }\n    ;\n    ;\n        for (var l = ((k.length - 1)); ((l >= 0)); l--) {\n            var m = k[l];\n            if (((g.get(m, \"position\") != \"static\"))) {\n                var n = parseInt(g.get(m, \"z-index\"), 10);\n                if (!isNaN(n)) {\n                    return n;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n        };\n    ;\n        return 0;\n    };\n;\n    e.exports = h;\n});\n__d(\"Dialog\", [\"Animation\",\"Arbiter\",\"AsyncRequest\",\"Bootloader\",\"Button\",\"ContextualThing\",\"CSS\",\"DOM\",\"JSBNG__Event\",\"Focus\",\"Form\",\"HTML\",\"Keys\",\"Locale\",\"Parent\",\"Run\",\"Style\",\"URI\",\"UserAgent\",\"Vector\",\"bind\",\"copyProperties\",\"createArrayFrom\",\"emptyFunction\",\"getObjectValues\",\"getOverlayZIndex\",\"removeFromArray\",\"shield\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Animation\"), h = b(\"Arbiter\"), i = b(\"AsyncRequest\"), j = b(\"Bootloader\"), k = b(\"Button\"), l = b(\"ContextualThing\"), m = b(\"CSS\"), n = b(\"DOM\"), o = b(\"JSBNG__Event\"), p = b(\"Focus\"), q = b(\"Form\"), r = b(\"HTML\"), s = b(\"Keys\"), t = b(\"Locale\"), u = b(\"Parent\"), v = b(\"Run\"), w = b(\"Style\"), x = b(\"URI\"), y = b(\"UserAgent\"), z = b(\"Vector\"), aa = b(\"bind\"), ba = b(\"copyProperties\"), ca = b(\"createArrayFrom\"), da = b(\"emptyFunction\"), ea = b(\"getObjectValues\"), fa = b(\"getOverlayZIndex\"), ga = b(\"removeFromArray\"), ha = b(\"shield\"), ia = b(\"tx\"), ja = function() {\n        var la = JSBNG__document.body, ma = JSBNG__document.createElement(\"div\"), na = JSBNG__document.createElement(\"div\");\n        la.insertBefore(ma, la.firstChild);\n        la.insertBefore(na, la.firstChild);\n        ma.style.position = \"fixed\";\n        ma.style.JSBNG__top = \"20px\";\n        var oa = ((ma.offsetTop !== na.offsetTop));\n        la.removeChild(ma);\n        la.removeChild(na);\n        ja = da.thatReturns(oa);\n        return oa;\n    };\n    function ka(la) {\n        this._show_loading = true;\n        this._auto_focus = true;\n        this._submit_on_enter = false;\n        this._fade_enabled = true;\n        this._onload_handlers = [];\n        this._top = 125;\n        this._uniqueID = ((\"dialog_\" + ka._globalCount++));\n        this._content = null;\n        this._obj = null;\n        this._popup = null;\n        this._overlay = null;\n        this._shim = null;\n        this._causal_elem = null;\n        this._previous_focus = null;\n        this._buttons = [];\n        this._buildDialog();\n        if (la) {\n            this._setFromModel(la);\n        }\n    ;\n    ;\n        ka._init();\n    };\n;\n    ba(ka, {\n        OK: {\n            JSBNG__name: \"ok\",\n            label: \"Okay\"\n        },\n        CANCEL: {\n            JSBNG__name: \"cancel\",\n            label: \"Cancel\",\n            className: \"inputaux\"\n        },\n        CLOSE: {\n            JSBNG__name: \"close\",\n            label: \"Close\"\n        },\n        NEXT: {\n            JSBNG__name: \"next\",\n            label: \"Next\"\n        },\n        SAVE: {\n            JSBNG__name: \"save\",\n            label: \"Save\"\n        },\n        SUBMIT: {\n            JSBNG__name: \"submit\",\n            label: \"Submit\"\n        },\n        CONFIRM: {\n            JSBNG__name: \"JSBNG__confirm\",\n            label: \"Confirm\"\n        },\n        DELETE: {\n            JSBNG__name: \"delete\",\n            label: \"Delete\"\n        },\n        _globalCount: 0,\n        _bottoms: [0,],\n        max_bottom: 0,\n        _updateMaxBottom: function() {\n            ka.max_bottom = Math.max.apply(Math, ka._bottoms);\n        }\n    });\n    ba(ka, {\n        OK_AND_CANCEL: [ka.OK,ka.CANCEL,],\n        _STANDARD_BUTTONS: [ka.OK,ka.CANCEL,ka.CLOSE,ka.SAVE,ka.SUBMIT,ka.CONFIRM,ka.DELETE,],\n        SIZE: {\n            WIDE: 555,\n            STANDARD: 445\n        },\n        _HALO_WIDTH: 10,\n        _BORDER_WIDTH: 1,\n        _PADDING_WIDTH: 10,\n        _PAGE_MARGIN: 40,\n        _stack: [],\n        _isUsingCSSBorders: function() {\n            return ((y.ie() < 7));\n        },\n        newButton: function(la, ma, na, oa) {\n            var pa = {\n                JSBNG__name: la,\n                label: ma\n            };\n            if (na) {\n                pa.className = na;\n            }\n        ;\n        ;\n            if (oa) {\n                pa.handler = oa;\n            }\n        ;\n        ;\n            return pa;\n        },\n        getCurrent: function() {\n            var la = ka._stack;\n            return ((la.length ? la[((la.length - 1))] : null));\n        },\n        hideCurrent: function() {\n            var la = ka.getCurrent();\n            ((la && la.hide()));\n        },\n        bootstrap: function(la, ma, na, oa, pa, qa) {\n            ma = ((ma || {\n            }));\n            ba(ma, new x(la).getQueryData());\n            oa = ((oa || ((na ? \"GET\" : \"POST\"))));\n            var ra = ((u.byClass(qa, \"stat_elem\") || qa));\n            if (((ra && m.hasClass(ra, \"async_saving\")))) {\n                return false;\n            }\n        ;\n        ;\n            var sa = new i().setReadOnly(!!na).setMethod(oa).setRelativeTo(qa).setStatusElement(ra).setURI(la).setNectarModuleDataSafe(qa).setData(ma), ta = new ka(pa).setCausalElement(qa).setAsync(sa);\n            ta.show();\n            return false;\n        },\n        showFromModel: function(la, ma) {\n            var na = new ka(la).setCausalElement(ma).show();\n            if (la.hiding) {\n                na.hide();\n            }\n        ;\n        ;\n        },\n        _init: function() {\n            this._init = da;\n            v.onLeave(ha(ka._tearDown, null, false));\n            h.subscribe(\"page_transition\", ha(ka._tearDown, null, true));\n            o.listen(JSBNG__document.documentElement, \"keydown\", function(JSBNG__event) {\n                if (((((o.getKeyCode(JSBNG__event) == s.ESC)) && !JSBNG__event.getModifiers().any))) {\n                    if (ka._escape()) {\n                        JSBNG__event.kill();\n                    }\n                ;\n                ;\n                }\n                 else if (((((o.getKeyCode(JSBNG__event) == s.RETURN)) && !JSBNG__event.getModifiers().any))) {\n                    if (ka._enter()) {\n                        JSBNG__event.kill();\n                    }\n                ;\n                }\n                \n            ;\n            ;\n            });\n            o.listen(window, \"resize\", function(JSBNG__event) {\n                var la = ka.getCurrent();\n                ((la && la._resetDialogObj()));\n            });\n        },\n        _findButton: function(la, ma) {\n            if (la) {\n                for (var na = 0; ((na < la.length)); ++na) {\n                    if (((la[na].JSBNG__name == ma))) {\n                        return la[na];\n                    }\n                ;\n                ;\n                };\n            }\n        ;\n        ;\n            return null;\n        },\n        _tearDown: function(la) {\n            var ma = ka._stack.slice();\n            for (var na = ((ma.length - 1)); ((na >= 0)); na--) {\n                if (((((la && !ma[na]._cross_transition)) || ((!la && !ma[na]._cross_quickling))))) {\n                    ma[na].hide();\n                }\n            ;\n            ;\n            };\n        ;\n        },\n        _escape: function() {\n            var la = ka.getCurrent();\n            if (!la) {\n                return false;\n            }\n        ;\n        ;\n            var ma = la._semi_modal, na = la._buttons;\n            if (((!na.length && !ma))) {\n                return false;\n            }\n        ;\n        ;\n            if (((ma && !na.length))) {\n                la.hide();\n                return true;\n            }\n        ;\n        ;\n            var oa, pa = ka._findButton(na, \"cancel\");\n            if (la._cancelHandler) {\n                la.cancel();\n                return true;\n            }\n             else if (pa) {\n                oa = pa;\n            }\n             else if (((na.length == 1))) {\n                oa = na[0];\n            }\n             else return false\n            \n            \n        ;\n            la._handleButton(oa);\n            return true;\n        },\n        _enter: function() {\n            var la = ka.getCurrent();\n            if (((!la || !la._submit_on_enter))) {\n                return false;\n            }\n        ;\n        ;\n            if (((JSBNG__document.activeElement != la._frame))) {\n                return false;\n            }\n        ;\n        ;\n            var ma = la._buttons;\n            if (!ma) {\n                return false;\n            }\n        ;\n        ;\n            la._handleButton(ma[0]);\n            return true;\n        },\n        call_or_eval: function(la, ma, na) {\n            if (!ma) {\n                return undefined;\n            }\n        ;\n        ;\n            na = ((na || {\n            }));\n            if (((typeof ma == \"string\"))) {\n                var oa = Object.keys(na).join(\", \");\n                ma = (eval)(((((((((\"({f: function(\" + oa)) + \") { \")) + ma)) + \"}})\"))).f;\n            }\n        ;\n        ;\n            return ma.apply(la, ea(na));\n        }\n    });\n    ba(ka.prototype, {\n        _cross_quickling: false,\n        _cross_transition: false,\n        _loading: false,\n        _showing: false,\n        show: function() {\n            this._showing = true;\n            if (this._async_request) {\n                if (this._show_loading) {\n                    this.showLoading();\n                }\n            ;\n            ;\n            }\n             else this._update();\n        ;\n        ;\n            return this;\n        },\n        showLoading: function() {\n            this._loading = true;\n            m.addClass(this._frame, \"dialog_loading_shown\");\n            this._renderDialog();\n            return this;\n        },\n        hide: function() {\n            if (((!this._showing && !this._loading))) {\n                return this;\n            }\n        ;\n        ;\n            this._showing = false;\n            if (this._autohide_timeout) {\n                JSBNG__clearTimeout(this._autohide_timeout);\n                this._autohide_timeout = null;\n            }\n        ;\n        ;\n            if (((this._fade_enabled && ((ka._stack.length <= 1))))) {\n                this._fadeOut();\n            }\n             else this._hide();\n        ;\n        ;\n            return this;\n        },\n        cancel: function() {\n            if (((!this._cancelHandler || ((this._cancelHandler() !== false))))) {\n                this.hide();\n            }\n        ;\n        ;\n        },\n        getRoot: function() {\n            return this._obj;\n        },\n        getBody: function() {\n            return n.scry(this._obj, \"div.dialog_body\")[0];\n        },\n        getButtonElement: function(la) {\n            if (((typeof la == \"string\"))) {\n                la = ka._findButton(this._buttons, la);\n            }\n        ;\n        ;\n            if (((!la || !la.JSBNG__name))) {\n                return null;\n            }\n        ;\n        ;\n            var ma = n.scry(this._popup, \"input\"), na = function(oa) {\n                return ((oa.JSBNG__name == la.JSBNG__name));\n            };\n            return ((ma.filter(na)[0] || null));\n        },\n        getContentNode: function() {\n            return n.JSBNG__find(this._content, \"div.dialog_content\");\n        },\n        getFormData: function() {\n            return q.serialize(this.getContentNode());\n        },\n        setAllowCrossPageTransition: function(la) {\n            this._cross_transition = la;\n            return this;\n        },\n        setAllowCrossQuicklingNavigation: function(la) {\n            this._cross_quickling = la;\n            return this;\n        },\n        setShowing: function() {\n            this.show();\n            return this;\n        },\n        setHiding: function() {\n            this.hide();\n            return this;\n        },\n        setTitle: function(la) {\n            var ma = this._nodes.title, na = this._nodes.title_inner, oa = this._nodes.JSBNG__content;\n            n.setContent(na, this._format(((la || \"\"))));\n            m.conditionShow(ma, !!la);\n            m.conditionClass(oa, \"dialog_content_titleless\", !la);\n            return this;\n        },\n        setBody: function(la) {\n            n.setContent(this._nodes.body, this._format(la));\n            return this;\n        },\n        setExtraData: function(la) {\n            this._extra_data = la;\n            return this;\n        },\n        setReturnData: function(la) {\n            this._return_data = la;\n            return this;\n        },\n        setShowLoading: function(la) {\n            this._show_loading = la;\n            return this;\n        },\n        setCustomLoading: function(la) {\n            var ma = n.create(\"div\", {\n                className: \"dialog_loading\"\n            }, la);\n            n.setContent(this._frame, [this._nodes.title,this._nodes.JSBNG__content,ma,]);\n            return this;\n        },\n        setFullBleed: function(la) {\n            this._full_bleed = la;\n            this._updateWidth();\n            m.conditionClass(this._obj, \"full_bleed\", la);\n            return this;\n        },\n        setCausalElement: function(la) {\n            this._causal_elem = la;\n            return this;\n        },\n        setUserData: function(la) {\n            this._user_data = la;\n            return this;\n        },\n        getUserData: function() {\n            return this._user_data;\n        },\n        setAutohide: function(la) {\n            if (la) {\n                if (this._showing) {\n                    this._autohide_timeout = JSBNG__setTimeout(ha(this.hide, this), la);\n                }\n                 else this._autohide = la;\n            ;\n            ;\n            }\n             else {\n                this._autohide = null;\n                if (this._autohide_timeout) {\n                    JSBNG__clearTimeout(this._autohide_timeout);\n                    this._autohide_timeout = null;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            return this;\n        },\n        setSummary: function(la) {\n            var ma = this._nodes.summary;\n            n.setContent(ma, this._format(((la || \"\"))));\n            m.conditionShow(ma, !!la);\n            return this;\n        },\n        setButtons: function(la) {\n            var ma, na;\n            if (!((la instanceof Array))) {\n                ma = ca(arguments);\n            }\n             else ma = la;\n        ;\n        ;\n            for (var oa = 0; ((oa < ma.length)); ++oa) {\n                if (((typeof ma[oa] == \"string\"))) {\n                    na = ka._findButton(ka._STANDARD_BUTTONS, ma[oa]);\n                    ma[oa] = na;\n                }\n            ;\n            ;\n            };\n        ;\n            this._buttons = ma;\n            var pa = [];\n            if (((ma && ((ma.length > 0))))) {\n                for (var qa = 0; ((qa < ma.length)); qa++) {\n                    na = ma[qa];\n                    var ra = n.create(\"input\", {\n                        type: \"button\",\n                        JSBNG__name: ((na.JSBNG__name || \"\")),\n                        value: na.label\n                    }), sa = n.create(\"label\", {\n                        className: \"uiButton uiButtonLarge uiButtonConfirm\"\n                    }, ra);\n                    if (na.className) {\n                        na.className.split(/\\s+/).forEach(function(ua) {\n                            m.addClass(sa, ua);\n                        });\n                        if (m.hasClass(sa, \"inputaux\")) {\n                            m.removeClass(sa, \"inputaux\");\n                            m.removeClass(sa, \"uiButtonConfirm\");\n                        }\n                    ;\n                    ;\n                        if (m.hasClass(sa, \"uiButtonSpecial\")) {\n                            m.removeClass(sa, \"uiButtonConfirm\");\n                        }\n                    ;\n                    ;\n                    }\n                ;\n                ;\n                    if (na.icon) {\n                        n.prependContent(sa, n.create(\"img\", {\n                            src: na.icon,\n                            className: \"img mrs\"\n                        }));\n                    }\n                ;\n                ;\n                    if (na.disabled) {\n                        k.setEnabled(sa, false);\n                    }\n                ;\n                ;\n                    o.listen(ra, \"click\", this._handleButton.bind(this, na.JSBNG__name));\n                    {\n                        var fin108keys = ((window.top.JSBNG_Replay.forInKeys)((na))), fin108i = (0);\n                        var ta;\n                        for (; (fin108i < fin108keys.length); (fin108i++)) {\n                            ((ta) = (fin108keys[fin108i]));\n                            {\n                                if (((((ta.indexOf(\"data-\") === 0)) && ((ta.length > 5))))) {\n                                    ra.setAttribute(ta, na[ta]);\n                                }\n                            ;\n                            ;\n                            };\n                        };\n                    };\n                ;\n                    pa.push(sa);\n                };\n            }\n        ;\n        ;\n            n.setContent(this._nodes.buttons, pa);\n            this._updateButtonVisibility();\n            return this;\n        },\n        setButtonsMessage: function(la) {\n            n.setContent(this._nodes.button_message, this._format(((la || \"\"))));\n            this._has_button_message = !!la;\n            this._updateButtonVisibility();\n            return this;\n        },\n        _updateButtonVisibility: function() {\n            var la = ((((this._buttons.length > 0)) || this._has_button_message));\n            m.conditionShow(this._nodes.button_wrapper, la);\n            m.conditionClass(this._obj, \"omitDialogFooter\", !la);\n        },\n        setClickButtonOnEnter: function(la, ma) {\n            this._clickOnEnterTarget = la;\n            if (!this._clickOnEnterListener) {\n                this._clickOnEnterListener = o.listen(this._nodes.body, \"keypress\", function(JSBNG__event) {\n                    var na = JSBNG__event.getTarget();\n                    if (((na && ((na.id === this._clickOnEnterTarget))))) {\n                        if (((o.getKeyCode(JSBNG__event) == s.RETURN))) {\n                            this._handleButton(ma);\n                            JSBNG__event.kill();\n                        }\n                    ;\n                    }\n                ;\n                ;\n                    return true;\n                }.bind(this));\n            }\n        ;\n        ;\n            return this;\n        },\n        setStackable: function(la, ma) {\n            this._is_stackable = la;\n            this._shown_while_stacked = ((la && ma));\n            return this;\n        },\n        setHandler: function(la) {\n            this._handler = la;\n            return this;\n        },\n        setCancelHandler: function(la) {\n            this._cancelHandler = ka.call_or_eval.bind(null, this, la);\n            return this;\n        },\n        setCloseHandler: function(la) {\n            this._close_handler = ka.call_or_eval.bind(null, this, la);\n            return this;\n        },\n        clearHandler: function() {\n            return this.setHandler(null);\n        },\n        setPostURI: function(la, ma) {\n            if (((ma === undefined))) {\n                ma = true;\n            }\n        ;\n        ;\n            if (ma) {\n                this.setHandler(this._submitForm.bind(this, \"POST\", la));\n            }\n             else this.setHandler(function() {\n                q.post(la, this.getFormData());\n                this.hide();\n            }.bind(this));\n        ;\n        ;\n            return this;\n        },\n        setGetURI: function(la) {\n            this.setHandler(this._submitForm.bind(this, \"GET\", la));\n            return this;\n        },\n        setModal: function(la) {\n            this._modal = la;\n            m.conditionClass(this._obj, \"generic_dialog_modal\", la);\n            return this;\n        },\n        setSemiModal: function(la) {\n            if (la) {\n                this.setModal(true);\n                this._semiModalListener = o.listen(this._obj, \"click\", function(ma) {\n                    if (!n.contains(this._popup, ma.getTarget())) {\n                        this.hide();\n                    }\n                ;\n                ;\n                }.bind(this));\n            }\n             else ((this._semiModalListener && this._semiModalListener.remove()));\n        ;\n        ;\n            this._semi_modal = la;\n            return this;\n        },\n        setWideDialog: function(la) {\n            this._wide_dialog = la;\n            this._updateWidth();\n            return this;\n        },\n        setContentWidth: function(la) {\n            this._content_width = la;\n            this._updateWidth();\n            return this;\n        },\n        setTitleLoading: function(la) {\n            if (((la === undefined))) {\n                la = true;\n            }\n        ;\n        ;\n            var ma = n.JSBNG__find(this._popup, \"h2.dialog_title\");\n            if (ma) {\n                m.conditionClass(ma, \"loading\", la);\n            }\n        ;\n        ;\n            return this;\n        },\n        setSecure: function(la) {\n            m.conditionClass(this._nodes.title, \"secure\", la);\n            return this;\n        },\n        setClassName: function(la) {\n            la.split(/\\s+/).forEach(m.addClass.bind(m, this._obj));\n            return this;\n        },\n        setFadeEnabled: function(la) {\n            this._fade_enabled = la;\n            return this;\n        },\n        setFooter: function(la) {\n            var ma = this._nodes.footer;\n            n.setContent(ma, this._format(((la || \"\"))));\n            m.conditionShow(ma, !!la);\n            return this;\n        },\n        setAutoFocus: function(la) {\n            this._auto_focus = la;\n            return this;\n        },\n        setTop: function(la) {\n            this._top = la;\n            this._resetDialogObj();\n            return this;\n        },\n        onloadRegister: function(la) {\n            ca(la).forEach(function(ma) {\n                if (((typeof ma == \"string\"))) {\n                    ma = new Function(ma);\n                }\n            ;\n            ;\n                this._onload_handlers.push(ma.bind(this));\n            }.bind(this));\n            return this;\n        },\n        setAsyncURL: function(la) {\n            return this.setAsync(new i(la));\n        },\n        setAsync: function(la) {\n            var ma = function(ua) {\n                if (((this._async_request != la))) {\n                    return;\n                }\n            ;\n            ;\n                this._async_request = null;\n                var va = ua.getPayload(), wa = va;\n                if (this._loading) {\n                    this._showing = true;\n                }\n            ;\n            ;\n                if (((typeof wa == \"string\"))) {\n                    this.setBody(wa);\n                }\n                 else this._setFromModel(wa);\n            ;\n            ;\n                this._update();\n            }.bind(this), na = la.getData();\n            na.__d = 1;\n            la.setData(na);\n            var oa = ((la.getHandler() || da));\n            la.setHandler(function(ua) {\n                oa(ua);\n                ma(ua);\n            });\n            var pa = la, qa = ((pa.getErrorHandler() || da)), ra = ((pa.getTransportErrorHandler() || da)), sa = function() {\n                this._async_request = null;\n                this._loading = false;\n                if (((this._showing && this._shown_while_stacked))) {\n                    this._update();\n                }\n                 else this._hide(this._is_stackable);\n            ;\n            ;\n            }.bind(this), ta = ((pa.getServerDialogCancelHandler() || sa));\n            pa.setAllowCrossPageTransition(this._cross_transition).setErrorHandler(function(ua) {\n                sa();\n                qa(ua);\n            }).setTransportErrorHandler(function(ua) {\n                sa();\n                ra(ua);\n            }).setServerDialogCancelHandler(ta);\n            la.send();\n            this._async_request = la;\n            if (this._showing) {\n                this.show();\n            }\n        ;\n        ;\n            return this;\n        },\n        _format: function(la) {\n            if (((typeof la == \"string\"))) {\n                la = r(la);\n            }\n             else la = r.replaceJSONWrapper(la);\n        ;\n        ;\n            if (((la instanceof r))) {\n                la.setDeferred(true);\n            }\n        ;\n        ;\n            return la;\n        },\n        _update: function() {\n            if (!this._showing) {\n                return;\n            }\n        ;\n        ;\n            if (((((this._autohide && !this._async_request)) && !this._autohide_timeout))) {\n                this._autohide_timeout = JSBNG__setTimeout(aa(this, \"hide\"), this._autohide);\n            }\n        ;\n        ;\n            m.removeClass(this._frame, \"dialog_loading_shown\");\n            this._loading = false;\n            this._renderDialog();\n            this._runOnloads();\n            this._previous_focus = JSBNG__document.activeElement;\n            p.set(this._frame);\n        },\n        _runOnloads: function() {\n            for (var la = 0; ((la < this._onload_handlers.length)); ++la) {\n                try {\n                    this._onload_handlers[la]();\n                } catch (ma) {\n                \n                };\n            ;\n            };\n        ;\n            this._onload_handlers = [];\n        },\n        _updateWidth: function() {\n            var la = ((2 * ka._BORDER_WIDTH));\n            if (ka._isUsingCSSBorders()) {\n                la += ((2 * ka._HALO_WIDTH));\n            }\n        ;\n        ;\n            if (this._content_width) {\n                la += this._content_width;\n                if (!this._full_bleed) {\n                    la += ((2 * ka._PADDING_WIDTH));\n                }\n            ;\n            ;\n            }\n             else if (this._wide_dialog) {\n                la += ka.SIZE.WIDE;\n            }\n             else la += ka.SIZE.STANDARD;\n            \n        ;\n        ;\n            this._popup.style.width = ((la + \"px\"));\n        },\n        _updateZIndex: function() {\n            if (((!this._hasSetZIndex && this._causal_elem))) {\n                var la = fa(this._causal_elem), ma = this._causal_elem;\n                while (((!la && (ma = l.getContext(ma))))) {\n                    la = fa(ma);\n                ;\n                };\n            ;\n                this._hasSetZIndex = ((la > ((this._modal ? 400 : 200))));\n                w.set(this._obj, \"z-index\", ((this._hasSetZIndex ? la : \"\")));\n            }\n        ;\n        ;\n        },\n        _renderDialog: function() {\n            this._updateZIndex();\n            this._pushOntoStack();\n            this._obj.style.height = ((((this._modal && ((y.ie() < 7)))) ? ((z.getDocumentDimensions().y + \"px\")) : null));\n            if (((this._obj && this._obj.style.display))) {\n                this._obj.style.visibility = \"hidden\";\n                this._obj.style.display = \"\";\n                this.resetDialogPosition();\n                this._obj.style.visibility = \"\";\n                this._obj.dialog = this;\n            }\n             else this.resetDialogPosition();\n        ;\n        ;\n            JSBNG__clearInterval(this.active_hiding);\n            this.active_hiding = JSBNG__setInterval(this._activeResize.bind(this), 500);\n            this._submit_on_enter = false;\n            if (this._auto_focus) {\n                var la = q.getFirstElement(this._content, [\"input[type=\\\"text\\\"]\",\"textarea\",\"input[type=\\\"password\\\"]\",]);\n                if (la) {\n                    q.focusFirst.bind(this, this._content).defer();\n                }\n                 else this._submit_on_enter = true;\n            ;\n            ;\n            }\n        ;\n        ;\n            var ma = ((z.getElementDimensions(this._content).y + z.getElementPosition(this._content).y));\n            ka._bottoms.push(ma);\n            this._bottom = ma;\n            ka._updateMaxBottom();\n            return this;\n        },\n        _buildDialog: function() {\n            this._obj = n.create(\"div\", {\n                className: \"generic_dialog\",\n                id: this._uniqueID\n            });\n            this._obj.style.display = \"none\";\n            n.appendContent(JSBNG__document.body, this._obj);\n            if (!this._popup) {\n                this._popup = n.create(\"div\", {\n                    className: \"generic_dialog_popup\"\n                });\n            }\n        ;\n        ;\n            this._obj.appendChild(this._popup);\n            if (((((y.ie() < 7)) && !this._shim))) {\n                j.loadModules([\"IframeShim\",], function(xa) {\n                    this._shim = new xa(this._popup);\n                });\n            }\n        ;\n        ;\n            m.addClass(this._obj, \"pop_dialog\");\n            if (t.isRTL()) {\n                m.addClass(this._obj, \"pop_dialog_rtl\");\n            }\n        ;\n        ;\n            var la;\n            if (ka._isUsingCSSBorders()) {\n                la = ((((\"\\u003Cdiv class=\\\"pop_container_advanced\\\"\\u003E\" + \"\\u003Cdiv class=\\\"pop_content\\\" id=\\\"pop_content\\\"\\u003E\\u003C/div\\u003E\")) + \"\\u003C/div\\u003E\"));\n            }\n             else la = ((((((((((((((((\"\\u003Cdiv class=\\\"pop_container\\\"\\u003E\" + \"\\u003Cdiv class=\\\"pop_verticalslab\\\"\\u003E\\u003C/div\\u003E\")) + \"\\u003Cdiv class=\\\"pop_horizontalslab\\\"\\u003E\\u003C/div\\u003E\")) + \"\\u003Cdiv class=\\\"pop_topleft\\\"\\u003E\\u003C/div\\u003E\")) + \"\\u003Cdiv class=\\\"pop_topright\\\"\\u003E\\u003C/div\\u003E\")) + \"\\u003Cdiv class=\\\"pop_bottomright\\\"\\u003E\\u003C/div\\u003E\")) + \"\\u003Cdiv class=\\\"pop_bottomleft\\\"\\u003E\\u003C/div\\u003E\")) + \"\\u003Cdiv class=\\\"pop_content pop_content_old\\\" id=\\\"pop_content\\\"\\u003E\\u003C/div\\u003E\")) + \"\\u003C/div\\u003E\"));\n        ;\n        ;\n            n.setContent(this._popup, r(la));\n            var ma = n.JSBNG__find(this._popup, \"div.pop_content\");\n            ma.setAttribute(\"tabIndex\", \"0\");\n            ma.setAttribute(\"role\", \"alertdialog\");\n            this._frame = this._content = ma;\n            var na = n.create(\"div\", {\n                className: \"dialog_loading\"\n            }, \"Loading...\"), oa = n.create(\"span\"), pa = n.create(\"h2\", {\n                className: \"dialog_title hidden_elem\",\n                id: ((\"title_\" + this._uniqueID))\n            }, oa), qa = n.create(\"div\", {\n                className: \"dialog_summary hidden_elem\"\n            }), ra = n.create(\"div\", {\n                className: \"dialog_body\"\n            }), sa = n.create(\"div\", {\n                className: \"rfloat mlm\"\n            }), ta = n.create(\"div\", {\n                className: \"dialog_buttons_msg\"\n            }), ua = n.create(\"div\", {\n                className: \"dialog_buttons clearfix hidden_elem\"\n            }, [sa,ta,]), va = n.create(\"div\", {\n                className: \"dialog_footer hidden_elem\"\n            }), wa = n.create(\"div\", {\n                className: \"dialog_content\"\n            }, [qa,ra,ua,va,]);\n            this._nodes = {\n                summary: qa,\n                body: ra,\n                buttons: sa,\n                button_message: ta,\n                button_wrapper: ua,\n                footer: va,\n                JSBNG__content: wa,\n                title: pa,\n                title_inner: oa\n            };\n            n.setContent(this._frame, [pa,wa,na,]);\n        },\n        _updateShim: function() {\n            return ((this._shim && this._shim.show()));\n        },\n        _activeResize: function() {\n            if (((this.last_offset_height != this._content.offsetHeight))) {\n                this.last_offset_height = this._content.offsetHeight;\n                this.resetDialogPosition();\n            }\n        ;\n        ;\n        },\n        resetDialogPosition: function() {\n            if (!this._popup) {\n                return;\n            }\n        ;\n        ;\n            this._resetDialogObj();\n            this._updateShim();\n        },\n        _resetDialogObj: function() {\n            var la = ((2 * ka._PAGE_MARGIN)), ma = z.getViewportDimensions(), na = ((ma.x - la)), oa = ((ma.y - la)), pa = ((2 * ka._HALO_WIDTH)), qa = z.getElementDimensions(this._content), ra = ((qa.x + pa)), sa = ((qa.y + pa)), ta = this._top, ua = ((na - ra)), va = ((oa - sa));\n            if (((va < 0))) {\n                ta = ka._PAGE_MARGIN;\n            }\n             else if (((ta > va))) {\n                ta = ((ka._PAGE_MARGIN + ((Math.max(va, 0) / 2))));\n            }\n            \n        ;\n        ;\n            var wa = ja();\n            if (!wa) {\n                ta += z.getScrollPosition().y;\n            }\n        ;\n        ;\n            w.set(this._popup, \"marginTop\", ((ta + \"px\")));\n            var xa = ((wa && ((((ua < 0)) || ((va < 0))))));\n            m.conditionClass(this._obj, \"generic_dialog_fixed_overflow\", xa);\n            m.conditionClass(JSBNG__document.documentElement, \"generic_dialog_overflow_mode\", xa);\n        },\n        _fadeOut: function(la) {\n            if (!this._popup) {\n                return;\n            }\n        ;\n        ;\n            try {\n                new g(this._obj).duration(0).checkpoint().to(\"opacity\", 0).hide().duration(250).ondone(this._hide.bind(this, la)).go();\n            } catch (ma) {\n                this._hide(la);\n            };\n        ;\n        },\n        _hide: function(la) {\n            if (this._obj) {\n                this._obj.style.display = \"none\";\n            }\n        ;\n        ;\n            m.removeClass(JSBNG__document.documentElement, \"generic_dialog_overflow_mode\");\n            this._updateShim();\n            JSBNG__clearInterval(this.active_hiding);\n            if (this._bottom) {\n                var ma = ka._bottoms;\n                ma.splice(ma.indexOf(this._bottom), 1);\n                ka._updateMaxBottom();\n            }\n        ;\n        ;\n            if (((((this._previous_focus && JSBNG__document.activeElement)) && n.contains(this._obj, JSBNG__document.activeElement)))) {\n                p.set(this._previous_focus);\n            }\n        ;\n        ;\n            if (la) {\n                return;\n            }\n        ;\n        ;\n            this.destroy();\n        },\n        destroy: function() {\n            this._popFromStack();\n            JSBNG__clearInterval(this.active_hiding);\n            if (this._obj) {\n                n.remove(this._obj);\n                this._obj = null;\n                ((this._shim && this._shim.hide()));\n                this._shim = null;\n            }\n        ;\n        ;\n            ((this._clickOnEnterListener && this._clickOnEnterListener.remove()));\n            if (this._close_handler) {\n                this._close_handler({\n                    return_data: this._return_data\n                });\n            }\n        ;\n        ;\n        },\n        _handleButton: function(la) {\n            if (((typeof la == \"string\"))) {\n                la = ka._findButton(this._buttons, la);\n            }\n        ;\n        ;\n            var ma = ka.call_or_eval(la, la.handler);\n            if (((ma === false))) {\n                return;\n            }\n        ;\n        ;\n            if (((la.JSBNG__name == \"cancel\"))) {\n                this.cancel();\n            }\n             else if (((ka.call_or_eval(this, this._handler, {\n                button: la\n            }) !== false))) {\n                this.hide();\n            }\n            \n        ;\n        ;\n        },\n        _submitForm: function(la, ma, na) {\n            var oa = this.getFormData();\n            if (na) {\n                oa[na.JSBNG__name] = na.label;\n            }\n        ;\n        ;\n            if (this._extra_data) {\n                ba(oa, this._extra_data);\n            }\n        ;\n        ;\n            var pa = new i().setURI(ma).setData(oa).setMethod(la).setNectarModuleDataSafe(this._causal_elem).setReadOnly(((la == \"GET\")));\n            this.setAsync(pa);\n            return false;\n        },\n        _setFromModel: function(la) {\n            var ma = {\n            };\n            ba(ma, la);\n            {\n                var fin109keys = ((window.top.JSBNG_Replay.forInKeys)((ma))), fin109i = (0);\n                var na;\n                for (; (fin109i < fin109keys.length); (fin109i++)) {\n                    ((na) = (fin109keys[fin109i]));\n                    {\n                        if (((na == \"onloadRegister\"))) {\n                            this.onloadRegister(ma[na]);\n                            continue;\n                        }\n                    ;\n                    ;\n                        var oa = this[((((\"set\" + na.substr(0, 1).toUpperCase())) + na.substr(1)))];\n                        oa.apply(this, ca(ma[na]));\n                    };\n                };\n            };\n        ;\n        },\n        _updateBottom: function() {\n            var la = ((z.getElementDimensions(this._content).y + z.getElementPosition(this._content).y));\n            ka._bottoms[((ka._bottoms.length - 1))] = la;\n            ka._updateMaxBottom();\n        },\n        _pushOntoStack: function() {\n            var la = ka._stack;\n            if (!la.length) {\n                h.inform(\"layer_shown\", {\n                    type: \"Dialog\"\n                });\n            }\n        ;\n        ;\n            ga(la, this);\n            la.push(this);\n            for (var ma = ((la.length - 2)); ((ma >= 0)); ma--) {\n                var na = la[ma];\n                if (((!na._is_stackable && !na._async_request))) {\n                    na._hide();\n                }\n                 else if (!na._shown_while_stacked) {\n                    na._hide(true);\n                }\n                \n            ;\n            ;\n            };\n        ;\n        },\n        _popFromStack: function() {\n            var la = ka._stack, ma = ((la[((la.length - 1))] === this));\n            ga(la, this);\n            if (la.length) {\n                if (ma) {\n                    la[((la.length - 1))].show();\n                }\n            ;\n            ;\n            }\n             else h.inform(\"layer_hidden\", {\n                type: \"Dialog\"\n            });\n        ;\n        ;\n        }\n    });\n    e.exports = ka;\n    a.Dialog = ka;\n});\n__d(\"DialogHideOnSuccess\", [\"copyProperties\",\"CSS\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"copyProperties\"), h = b(\"CSS\"), i = b(\"cx\");\n    function j(k) {\n        this._layer = k;\n    };\n;\n    g(j.prototype, {\n        _subscription: null,\n        enable: function() {\n            this._subscription = this._layer.subscribe(\"success\", this._handle.bind(this));\n        },\n        disable: function() {\n            this._subscription.unsubscribe();\n            this._subscription = null;\n        },\n        _handle: function(k, JSBNG__event) {\n            if (h.hasClass(JSBNG__event.getTarget(), \"_s\")) {\n                this._layer.hide();\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = j;\n});\n__d(\"DocumentTitle\", [\"Arbiter\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = JSBNG__document.title, i = null, j = 1500, k = [], l = 0, m = null, n = false;\n    function o() {\n        if (((k.length > 0))) {\n            if (!n) {\n                p(k[l].title);\n                l = ((++l % k.length));\n            }\n             else q();\n        ;\n        ;\n        }\n         else {\n            JSBNG__clearInterval(m);\n            m = null;\n            q();\n        }\n    ;\n    ;\n    };\n;\n    function p(s) {\n        JSBNG__document.title = s;\n        n = true;\n    };\n;\n    function q() {\n        r.set(((i || h)), true);\n        n = false;\n    };\n;\n    var r = {\n        get: function() {\n            return h;\n        },\n        set: function(s, t) {\n            JSBNG__document.title = s;\n            if (!t) {\n                h = s;\n                i = null;\n                g.inform(\"update_title\", s);\n            }\n             else i = s;\n        ;\n        ;\n        },\n        blink: function(s) {\n            var t = {\n                title: s\n            };\n            k.push(t);\n            if (((m === null))) {\n                m = JSBNG__setInterval(o, j);\n            }\n        ;\n        ;\n            return {\n                JSBNG__stop: function() {\n                    var u = k.indexOf(t);\n                    if (((u >= 0))) {\n                        k.splice(u, 1);\n                        if (((l > u))) {\n                            l--;\n                        }\n                         else if (((((l == u)) && ((l == k.length))))) {\n                            l = 0;\n                        }\n                        \n                    ;\n                    ;\n                    }\n                ;\n                ;\n                }\n            };\n        }\n    };\n    e.exports = r;\n});\n__d(\"DoublyLinkedListMap\", [\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"copyProperties\");\n    function h() {\n        this._head = null;\n        this._tail = null;\n        this._nodes = {\n        };\n        this._nodeCount = 0;\n    };\n;\n    g(h.prototype, {\n        get: function(i) {\n            return ((this._nodes[i] ? this._nodes[i].data : null));\n        },\n        getIndex: function(i) {\n            for (var j = this._head, k = 0; j; j = j.next, k++) {\n                if (((j.key === i))) {\n                    return k;\n                }\n            ;\n            ;\n            };\n        ;\n            return null;\n        },\n        _insert: function(i, j, k, l) {\n            ((((k && !this._nodes[k])) && (k = null)));\n            var m = ((((k && this._nodes[k])) || ((l ? this._head : this._tail)))), n = {\n                data: j,\n                key: i,\n                next: null,\n                prev: null\n            };\n            if (m) {\n                this.remove(i);\n                if (l) {\n                    n.prev = m.prev;\n                    ((m.prev && (m.prev.next = n)));\n                    m.prev = n;\n                    n.next = m;\n                }\n                 else {\n                    n.next = m.next;\n                    ((m.next && (m.next.prev = n)));\n                    m.next = n;\n                    n.prev = m;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            ((((n.prev === null)) && (this._head = n)));\n            ((((n.next === null)) && (this._tail = n)));\n            this._nodes[i] = n;\n            this._nodeCount++;\n            return this;\n        },\n        insertBefore: function(i, j, k) {\n            return this._insert(i, j, k, true);\n        },\n        insertAfter: function(i, j, k) {\n            return this._insert(i, j, k, false);\n        },\n        prepend: function(i, j) {\n            return this.insertBefore(i, j, ((this._head && this._head.key)));\n        },\n        append: function(i, j) {\n            return this.insertAfter(i, j, ((this._tail && this._tail.key)));\n        },\n        remove: function(i) {\n            var j = this._nodes[i];\n            if (j) {\n                var k = j.next, l = j.prev;\n                ((k && (k.prev = l)));\n                ((l && (l.next = k)));\n                ((((this._head === j)) && (this._head = k)));\n                ((((this._tail === j)) && (this._tail = l)));\n                delete this._nodes[i];\n                this._nodeCount--;\n            }\n        ;\n        ;\n            return this;\n        },\n        JSBNG__find: function(i) {\n            for (var j = this._head; j; j = j.next) {\n                if (i(j.data)) {\n                    return j.key;\n                }\n            ;\n            ;\n            };\n        ;\n            return null;\n        },\n        reduce: function(i, j) {\n            for (var k = this._head; k; k = k.next) {\n                j = i(k.data, j);\n            ;\n            };\n        ;\n            return j;\n        },\n        exists: function(i) {\n            return !!this._nodes[i];\n        },\n        isEmpty: function() {\n            return !this._head;\n        },\n        reset: function() {\n            this._head = null;\n            this._tail = null;\n            this._nodes = {\n            };\n            this._nodeCount = 0;\n        },\n        map: function(i) {\n            for (var j = this._head; j; j = j.next) {\n                i(j.data);\n            ;\n            };\n        ;\n        },\n        getCount: function() {\n            return this._nodeCount;\n        },\n        getHead: function() {\n            return ((this._head && this._head.data));\n        },\n        getTail: function() {\n            return ((this._tail && this._tail.data));\n        },\n        getNext: function(i) {\n            var j = this._nodes[i];\n            if (((j && j.next))) {\n                return j.next.data;\n            }\n        ;\n        ;\n            return null;\n        },\n        getPrev: function(i) {\n            var j = this._nodes[i];\n            if (((j && j.prev))) {\n                return j.prev.data;\n            }\n        ;\n        ;\n            return null;\n        }\n    });\n    e.exports = h;\n});\n__d(\"throttle\", [\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"copyProperties\");\n    function h(j, k, l) {\n        return i(j, k, l, false, false);\n    };\n;\n    g(h, {\n        acrossTransitions: function(j, k, l) {\n            return i(j, k, l, true, false);\n        },\n        withBlocking: function(j, k, l) {\n            return i(j, k, l, false, true);\n        }\n    });\n    function i(j, k, l, m, n) {\n        if (((k == null))) {\n            k = 100;\n        }\n    ;\n    ;\n        var o, p, q;\n        function r() {\n            p = JSBNG__Date.now();\n            if (o) {\n                j.apply(l, o);\n                o = null;\n                q = JSBNG__setTimeout(r, k, !m);\n            }\n             else q = false;\n        ;\n        ;\n        };\n    ;\n        return function s() {\n            o = arguments;\n            if (((!q || ((((JSBNG__Date.now() - p)) > k))))) {\n                if (n) {\n                    r();\n                }\n                 else q = JSBNG__setTimeout(r, 0, !m);\n            ;\n            }\n        ;\n        ;\n        };\n    };\n;\n    e.exports = h;\n});\n__d(\"FullScreen\", [\"JSBNG__Event\",\"Arbiter\",\"CSS\",\"UserAgent\",\"copyProperties\",\"throttle\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"Arbiter\"), i = b(\"CSS\"), j = b(\"UserAgent\"), k = b(\"copyProperties\"), l = b(\"throttle\"), m = {\n    }, n = k(new h(), {\n        listenForEvent: function(p) {\n            var q = l(this.onChange, 0, this);\n            if (!m[p.id]) {\n                m[p.id] = true;\n                g.listen(p, {\n                    webkitfullscreenchange: q,\n                    mozfullscreenchange: q,\n                    fullscreenchange: q\n                });\n            }\n        ;\n        ;\n        },\n        enableFullScreen: function(p) {\n            this.listenForEvent(p);\n            if (p.webkitRequestFullScreen) {\n                if (j.chrome()) {\n                    p.webkitRequestFullScreen(JSBNG__Element.ALLOW_KEYBOARD_INPUT);\n                }\n                 else p.webkitRequestFullScreen();\n            ;\n            ;\n            }\n             else if (p.mozRequestFullScreen) {\n                p.mozRequestFullScreen();\n            }\n             else if (p.requestFullScreen) {\n                p.requestFullScreen();\n            }\n             else return false\n            \n            \n        ;\n            return true;\n        },\n        disableFullScreen: function() {\n            if (JSBNG__document.webkitCancelFullScreen) {\n                JSBNG__document.webkitCancelFullScreen();\n            }\n             else if (JSBNG__document.mozCancelFullScreen) {\n                JSBNG__document.mozCancelFullScreen();\n            }\n             else if (JSBNG__document.cancelFullScreen) {\n                JSBNG__document.cancelFullScreen();\n            }\n             else if (JSBNG__document.exitFullScreen) {\n                JSBNG__document.exitFullScreen();\n            }\n             else return false\n            \n            \n            \n        ;\n            return true;\n        },\n        isFullScreen: function() {\n            return ((((JSBNG__document.webkitIsFullScreen || JSBNG__document.JSBNG__fullScreen)) || JSBNG__document.mozFullScreen));\n        },\n        toggleFullScreen: function(p) {\n            if (this.isFullScreen()) {\n                this.disableFullScreen();\n                return false;\n            }\n             else return this.enableFullScreen(p)\n        ;\n            return false;\n        },\n        onChange: function() {\n            var p = this.isFullScreen();\n            i.conditionClass(JSBNG__document.body, \"JSBNG__fullScreen\", p);\n            this.inform(\"changed\");\n        },\n        isSupported: function() {\n            return ((((((((JSBNG__document.webkitCancelFullScreen && j.chrome())) || JSBNG__document.mozCancelFullScreen)) || JSBNG__document.cancelFullScreen)) || JSBNG__document.exitFullScreen));\n        }\n    }), o = l(n.onChange, 0, n);\n    g.listen(JSBNG__document, {\n        webkitfullscreenchange: o,\n        mozfullscreenchange: o,\n        fullscreenchange: o\n    });\n    e.exports = n;\n});\n__d(\"HistoryManager\", [\"JSBNG__Event\",\"function-extensions\",\"Cookie\",\"Env\",\"URI\",\"UserAgent\",\"copyProperties\",\"emptyFunction\",\"goOrReplace\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\");\n    b(\"function-extensions\");\n    var h = b(\"Cookie\"), i = b(\"Env\"), j = b(\"URI\"), k = b(\"UserAgent\"), l = b(\"copyProperties\"), m = b(\"emptyFunction\"), n = b(\"goOrReplace\"), o = {\n        _IFRAME_BASE_URI: \"http://static.ak.facebook.com/common/history_manager.php\",\n        JSBNG__history: null,\n        current: 0,\n        fragment: null,\n        _setIframeSrcFragment: function(p) {\n            p = p.toString();\n            var q = ((o.JSBNG__history.length - 1));\n            o.iframe.src = ((((((((o._IFRAME_BASE_URI + \"?|index=\")) + q)) + \"#\")) + encodeURIComponent(p)));\n            return o;\n        },\n        getIframeSrcFragment: function() {\n            return decodeURIComponent(j(o.iframe.contentWindow.JSBNG__document.JSBNG__location.href).getFragment());\n        },\n        nextframe: function(p, q) {\n            if (q) {\n                o._setIframeSrcFragment(p);\n                return;\n            }\n        ;\n        ;\n            if (((p !== undefined))) {\n                o.iframeQueue.push(p);\n            }\n             else {\n                o.iframeQueue.splice(0, 1);\n                o.iframeTimeout = null;\n                o.checkURI();\n            }\n        ;\n        ;\n            if (((o.iframeQueue.length && !o.iframeTimeout))) {\n                var r = o.iframeQueue[0];\n                o.iframeTimeout = JSBNG__setTimeout(function() {\n                    o._setIframeSrcFragment(r);\n                }, 100, false);\n            }\n        ;\n        ;\n        },\n        isInitialized: function() {\n            return !!o._initialized;\n        },\n        init: function() {\n            if (((!i.ALLOW_TRANSITION_IN_IFRAME && ((window != window.JSBNG__top))))) {\n                return;\n            }\n        ;\n        ;\n            if (o._initialized) {\n                return o;\n            }\n        ;\n        ;\n            var p = j(), q = ((p.getFragment() || \"\"));\n            if (((q.charAt(0) === \"!\"))) {\n                q = q.substr(1);\n                p.setFragment(q);\n            }\n        ;\n        ;\n            if (((j.getRequestURI(false).getProtocol().toLowerCase() == \"https\"))) {\n                o._IFRAME_BASE_URI = \"https://s-static.ak.facebook.com/common/history_manager.php\";\n            }\n        ;\n        ;\n            l(o, {\n                _initialized: true,\n                fragment: q,\n                orig_fragment: q,\n                JSBNG__history: [p,],\n                callbacks: [],\n                lastChanged: JSBNG__Date.now(),\n                canonical: j(\"#\"),\n                fragmentTimeout: null,\n                user: 0,\n                iframeTimeout: null,\n                iframeQueue: [],\n                enabled: true,\n                debug: m\n            });\n            if (((window.JSBNG__history && JSBNG__history.pushState))) {\n                this.lastURI = JSBNG__document.JSBNG__URL;\n                window.JSBNG__history.replaceState(this.lastURI, null);\n                g.listen(window, \"popstate\", function(r) {\n                    if (((((r && r.state)) && ((o.lastURI != r.state))))) {\n                        o.lastURI = r.state;\n                        o.lastChanged = JSBNG__Date.now();\n                        o.notify(j(r.state).getUnqualifiedURI().toString());\n                    }\n                ;\n                ;\n                }.bind(o));\n                if (((((k.webkit() < 534)) || ((k.chrome() <= 13))))) {\n                    JSBNG__setInterval(o.checkURI, 42, false);\n                    o._updateRefererURI(this.lastURI);\n                }\n            ;\n            ;\n                return o;\n            }\n        ;\n        ;\n            o._updateRefererURI(j.getRequestURI(false));\n            if (((((k.webkit() < 500)) || ((k.firefox() < 2))))) {\n                o.enabled = false;\n                return o;\n            }\n        ;\n        ;\n            if (((k.ie() < 8))) {\n                o.iframe = JSBNG__document.createElement(\"div\");\n                l(o.iframe.style, {\n                    width: \"0\",\n                    height: \"0\",\n                    frameborder: \"0\",\n                    left: \"0\",\n                    JSBNG__top: \"0\",\n                    position: \"absolute\"\n                });\n                o._setIframeSrcFragment(q);\n                JSBNG__document.body.insertBefore(o.iframe, JSBNG__document.body.firstChild);\n            }\n             else if (((\"JSBNG__onhashchange\" in window))) {\n                g.listen(window, \"hashchange\", function() {\n                    o.checkURI.bind(o).defer();\n                });\n            }\n             else JSBNG__setInterval(o.checkURI, 42, false);\n            \n        ;\n        ;\n            return o;\n        },\n        registerURIHandler: function(p) {\n            o.callbacks.push(p);\n            return o;\n        },\n        setCanonicalLocation: function(p) {\n            o.canonical = j(p);\n            return o;\n        },\n        notify: function(p) {\n            if (((p == o.orig_fragment))) {\n                p = o.canonical.getFragment();\n            }\n        ;\n        ;\n            for (var q = 0; ((q < o.callbacks.length)); q++) {\n                try {\n                    if (o.callbacks[q](p)) {\n                        return true;\n                    }\n                ;\n                ;\n                } catch (r) {\n                \n                };\n            ;\n            };\n        ;\n            return false;\n        },\n        checkURI: function() {\n            if (((((JSBNG__Date.now() - o.lastChanged)) < 400))) {\n                return;\n            }\n        ;\n        ;\n            if (((window.JSBNG__history && JSBNG__history.pushState))) {\n                var p = j(JSBNG__document.JSBNG__URL).removeQueryData(\"ref\").toString(), q = j(o.lastURI).removeQueryData(\"ref\").toString();\n                if (((p != q))) {\n                    o.lastChanged = JSBNG__Date.now();\n                    o.lastURI = p;\n                    if (((k.webkit() < 534))) {\n                        o._updateRefererURI(p);\n                    }\n                ;\n                ;\n                    o.notify(j(p).getUnqualifiedURI().toString());\n                }\n            ;\n            ;\n                return;\n            }\n        ;\n        ;\n            if (((((k.ie() < 8)) && o.iframeQueue.length))) {\n                return;\n            }\n        ;\n        ;\n            if (((k.webkit() && ((window.JSBNG__history.length == 200))))) {\n                if (!o.warned) {\n                    o.warned = true;\n                }\n            ;\n            ;\n                return;\n            }\n        ;\n        ;\n            var r = j().getFragment();\n            if (((r.charAt(0) == \"!\"))) {\n                r = r.substr(1);\n            }\n        ;\n        ;\n            if (((k.ie() < 8))) {\n                r = o.getIframeSrcFragment();\n            }\n        ;\n        ;\n            r = r.replace(/%23/g, \"#\");\n            if (((r != o.fragment.replace(/%23/g, \"#\")))) {\n                o.debug([r,\" vs \",o.fragment,\"whl: \",window.JSBNG__history.length,\"QHL: \",o.JSBNG__history.length,].join(\" \"));\n                for (var s = ((o.JSBNG__history.length - 1)); ((s >= 0)); --s) {\n                    if (((o.JSBNG__history[s].getFragment().replace(/%23/g, \"#\") == r))) {\n                        break;\n                    }\n                ;\n                ;\n                };\n            ;\n                ++o.user;\n                if (((s >= 0))) {\n                    o.go(((s - o.current)));\n                }\n                 else o.go(((\"#\" + r)));\n            ;\n            ;\n                --o.user;\n            }\n        ;\n        ;\n        },\n        _updateRefererURI: function(p) {\n            p = p.toString();\n            if (((((p.charAt(0) != \"/\")) && ((p.indexOf(\"//\") == -1))))) {\n                return;\n            }\n        ;\n        ;\n            var q = new j(window.JSBNG__location);\n            if (q.isFacebookURI()) {\n                var r = ((q.getPath() + window.JSBNG__location.search));\n            }\n             else var r = \"\"\n        ;\n            var s = j(p).getQualifiedURI().setFragment(r).toString(), t = 2048;\n            if (((s.length > t))) {\n                s = ((s.substring(0, t) + \"...\"));\n            }\n        ;\n        ;\n            h.set(\"x-referer\", s);\n        },\n        go: function(p, q, r) {\n            if (((window.JSBNG__history && JSBNG__history.pushState))) {\n                ((q || ((typeof (p) == \"number\"))));\n                var s = j(p).removeQueryData(\"ref\").toString();\n                o.lastChanged = JSBNG__Date.now();\n                this.lastURI = s;\n                if (r) {\n                    window.JSBNG__history.replaceState(p, null, s);\n                }\n                 else window.JSBNG__history.pushState(p, null, s);\n            ;\n            ;\n                if (((k.webkit() < 534))) {\n                    o._updateRefererURI(p);\n                }\n            ;\n            ;\n                return false;\n            }\n        ;\n        ;\n            o.debug(((\"go: \" + p)));\n            if (((q === undefined))) {\n                q = true;\n            }\n        ;\n        ;\n            if (!o.enabled) {\n                if (!q) {\n                    return false;\n                }\n            ;\n            }\n        ;\n        ;\n            if (((typeof (p) == \"number\"))) {\n                if (!p) {\n                    return false;\n                }\n            ;\n            ;\n                var t = ((p + o.current)), u = Math.max(0, Math.min(((o.JSBNG__history.length - 1)), t));\n                o.current = u;\n                t = ((o.JSBNG__history[u].getFragment() || o.orig_fragment));\n                t = j(t).removeQueryData(\"ref\").getUnqualifiedURI().toString();\n                o.fragment = t;\n                o.lastChanged = JSBNG__Date.now();\n                if (((k.ie() < 8))) {\n                    if (o.fragmentTimeout) {\n                        JSBNG__clearTimeout(o.fragmentTimeout);\n                    }\n                ;\n                ;\n                    o._temporary_fragment = t;\n                    o.fragmentTimeout = JSBNG__setTimeout(function() {\n                        window.JSBNG__location.hash = ((\"#!\" + t));\n                        delete o._temporary_fragment;\n                    }, 750, false);\n                    if (!o.user) {\n                        o.nextframe(t, r);\n                    }\n                ;\n                ;\n                }\n                 else if (!o.user) {\n                    n(window.JSBNG__location, ((((window.JSBNG__location.href.split(\"#\")[0] + \"#!\")) + t)), r);\n                }\n                \n            ;\n            ;\n                if (q) {\n                    o.notify(t);\n                }\n            ;\n            ;\n                o._updateRefererURI(t);\n                return false;\n            }\n        ;\n        ;\n            p = j(p);\n            if (((p.getDomain() == j().getDomain()))) {\n                p = j(((\"#\" + p.getUnqualifiedURI())));\n            }\n        ;\n        ;\n            var v = o.JSBNG__history[o.current].getFragment(), w = p.getFragment();\n            if (((((w == v)) || ((((v == o.orig_fragment)) && ((w == o.canonical.getFragment()))))))) {\n                if (q) {\n                    o.notify(w);\n                }\n            ;\n            ;\n                o._updateRefererURI(w);\n                return false;\n            }\n        ;\n        ;\n            if (r) {\n                o.current--;\n            }\n        ;\n        ;\n            var x = ((((o.JSBNG__history.length - o.current)) - 1));\n            o.JSBNG__history.splice(((o.current + 1)), x);\n            o.JSBNG__history.push(j(p));\n            return o.go(1, q, r);\n        },\n        getCurrentFragment: function() {\n            var p = ((((o._temporary_fragment !== undefined)) ? o._temporary_fragment : j.getRequestURI(false).getFragment()));\n            return ((((p == o.orig_fragment)) ? o.canonical.getFragment() : p));\n        }\n    };\n    e.exports = o;\n});\n__d(\"InputSelection\", [\"DOM\",\"Focus\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOM\"), h = b(\"Focus\"), i = {\n        get: function(j) {\n            if (!JSBNG__document.selection) {\n                return {\n                    start: j.selectionStart,\n                    end: j.selectionEnd\n                };\n            }\n        ;\n        ;\n            var k = JSBNG__document.selection.createRange();\n            if (((k.parentElement() !== j))) {\n                return {\n                    start: 0,\n                    end: 0\n                };\n            }\n        ;\n        ;\n            var l = j.value.length;\n            if (g.isNodeOfType(j, \"input\")) {\n                return {\n                    start: -k.moveStart(\"character\", -l),\n                    end: -k.moveEnd(\"character\", -l)\n                };\n            }\n             else {\n                var m = k.duplicate();\n                m.moveToElementText(j);\n                m.setEndPoint(\"StartToEnd\", k);\n                var n = ((l - m.text.length));\n                m.setEndPoint(\"StartToStart\", k);\n                return {\n                    start: ((l - m.text.length)),\n                    end: n\n                };\n            }\n        ;\n        ;\n        },\n        set: function(j, k, l) {\n            if (((typeof l == \"undefined\"))) {\n                l = k;\n            }\n        ;\n        ;\n            if (JSBNG__document.selection) {\n                if (((j.tagName == \"TEXTAREA\"))) {\n                    var m = ((j.value.slice(0, k).match(/\\r/g) || [])).length, n = ((j.value.slice(k, l).match(/\\r/g) || [])).length;\n                    k -= m;\n                    l -= ((m + n));\n                }\n            ;\n            ;\n                var o = j.createTextRange();\n                o.collapse(true);\n                o.moveStart(\"character\", k);\n                o.moveEnd(\"character\", ((l - k)));\n                o.select();\n            }\n             else {\n                j.selectionStart = k;\n                j.selectionEnd = Math.min(l, j.value.length);\n                h.set(j);\n            }\n        ;\n        ;\n        }\n    };\n    e.exports = i;\n});\n__d(\"JSONPTransport\", [\"ArbiterMixin\",\"DOM\",\"HTML\",\"URI\",\"asyncCallback\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"ArbiterMixin\"), h = b(\"DOM\"), i = b(\"HTML\"), j = b(\"URI\"), k = b(\"asyncCallback\"), l = b(\"copyProperties\"), m = {\n    }, n = 2, o = \"jsonp\", p = \"div\";\n    function q(s) {\n        delete m[s];\n    };\n;\n    function r(s, t) {\n        this._type = s;\n        this._uri = t;\n        m[this.getID()] = this;\n    };\n;\n    l(r, {\n        respond: function(s, t, u) {\n            var v = m[s];\n            if (v) {\n                if (!u) {\n                    q(s);\n                }\n            ;\n            ;\n                if (((v._type == p))) {\n                    t = JSON.parse(JSON.stringify(t));\n                }\n            ;\n            ;\n                k(v.handleResponse.bind(v), \"json\")(t);\n            }\n             else {\n                var w = a.ErrorSignal;\n                if (((w && !u))) {\n                    w.logJSError(\"ajax\", {\n                        error: \"UnexpectedJsonResponse\",\n                        extra: {\n                            id: s,\n                            uri: ((((t.payload && t.payload.uri)) || \"\"))\n                        }\n                    });\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n        }\n    });\n    l(r.prototype, g, {\n        getID: function() {\n            return ((this._id || (this._id = n++)));\n        },\n        hasFinished: function() {\n            return !((this.getID() in m));\n        },\n        getRequestURI: function() {\n            return j(this._uri).addQueryData({\n                __a: 1,\n                __adt: this.getID(),\n                __req: ((\"jsonp_\" + this.getID()))\n            });\n        },\n        getTransportFrame: function() {\n            if (this._iframe) {\n                return this._iframe;\n            }\n        ;\n        ;\n            var s = ((\"transport_frame_\" + this.getID())), t = i(((((\"\\u003Ciframe class=\\\"hidden_elem\\\" name=\\\"\" + s)) + \"\\\" src=\\\"javascript:void(0)\\\" /\\u003E\")));\n            return this._iframe = h.appendContent(JSBNG__document.body, t)[0];\n        },\n        send: function() {\n            if (((this._type === o))) {\n                (function() {\n                    h.appendContent(JSBNG__document.body, h.create(\"script\", {\n                        src: this.getRequestURI().toString(),\n                        type: \"text/javascript\"\n                    }));\n                }).bind(this).defer();\n            }\n             else this.getTransportFrame().src = this.getRequestURI().toString();\n        ;\n        ;\n        },\n        handleResponse: function(s) {\n            this.inform(\"response\", s);\n            if (this.hasFinished()) {\n                this._cleanup.bind(this).defer();\n            }\n        ;\n        ;\n        },\n        abort: function() {\n            if (this._aborted) {\n                return;\n            }\n        ;\n        ;\n            this._aborted = true;\n            this._cleanup();\n            q(this.getID());\n            this.inform(\"abort\");\n        },\n        _cleanup: function() {\n            if (this._iframe) {\n                h.remove(this._iframe);\n                this._iframe = null;\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = r;\n});\n__d(\"JSXDOM\", [\"DOM\",\"flattenArray\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOM\"), h = b(\"flattenArray\"), i = [\"a\",\"br\",\"button\",\"canvas\",\"checkbox\",\"dd\",\"div\",\"dl\",\"dt\",\"em\",\"form\",\"h1\",\"h2\",\"h3\",\"h4\",\"h5\",\"h6\",\"hr\",\"i\",\"div\",\"img\",\"input\",\"label\",\"li\",\"option\",\"p\",\"pre\",\"select\",\"span\",\"strong\",\"table\",\"tbody\",\"thead\",\"td\",\"textarea\",\"th\",\"tr\",\"ul\",\"video\",], j = {\n    };\n    i.forEach(function(k) {\n        var l = function(m, n) {\n            if (((arguments.length > 2))) {\n                n = Array.prototype.slice.call(arguments, 1);\n            }\n        ;\n        ;\n            if (((!n && m))) {\n                n = m.children;\n                delete m.children;\n            }\n        ;\n        ;\n            if (n) {\n                n = ((Array.isArray(n) ? h(n) : h([n,])));\n            }\n        ;\n        ;\n            return g.create(k, m, n);\n        };\n        j[k] = l;\n    });\n    e.exports = j;\n});\n__d(\"LinkController\", [\"JSBNG__Event\",\"DataStore\",\"Parent\",\"trackReferrer\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"DataStore\"), i = b(\"Parent\"), j = b(\"trackReferrer\"), k = \"LinkControllerHandler\", l = [], m = [];\n    function n(JSBNG__event) {\n        var r = i.byTag(JSBNG__event.getTarget(), \"a\"), s = ((r && r.getAttribute(\"href\", 2)));\n        if (((((((!s || r.rel)) || !p(s))) || h.get(r, k)))) {\n            return;\n        }\n    ;\n    ;\n        var t = g.listen(r, \"click\", function(u) {\n            if (((s.charAt(((s.length - 1))) == \"#\"))) {\n                u.prevent();\n                return;\n            }\n        ;\n        ;\n            j(r, s);\n            o(r, u);\n        });\n        h.set(r, k, t);\n    };\n;\n    function o(r, JSBNG__event) {\n        if (((((((r.target || r.rel)) || JSBNG__event.getModifiers().any)) || ((JSBNG__event.which && ((JSBNG__event.which != 1))))))) {\n            return;\n        }\n    ;\n    ;\n        var s = l.concat(m);\n        for (var t = 0, u = s.length; ((t < u)); t++) {\n            if (((s[t](r, JSBNG__event) === false))) {\n                return JSBNG__event.prevent();\n            }\n        ;\n        ;\n        };\n    ;\n    };\n;\n    function p(r) {\n        var s = r.match(/^(\\w+):/);\n        return ((!s || s[1].match(/^http/i)));\n    };\n;\n    var q = {\n        registerHandler: function(r) {\n            l.push(r);\n        },\n        registerFallbackHandler: function(r) {\n            m.push(r);\n        }\n    };\n    g.listen(JSBNG__document.documentElement, \"mousedown\", n);\n    g.listen(JSBNG__document.documentElement, \"keydown\", n);\n    e.exports = q;\n});\n__d(\"MenuDeprecated\", [\"JSBNG__Event\",\"Arbiter\",\"CSS\",\"DataStore\",\"DOM\",\"HTML\",\"Keys\",\"Parent\",\"Style\",\"UserAgent\",\"copyProperties\",\"emptyFunction\",\"Run\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"Arbiter\"), i = b(\"CSS\"), j = b(\"DataStore\"), k = b(\"DOM\"), l = b(\"HTML\"), m = b(\"Keys\"), n = b(\"Parent\"), o = b(\"Style\"), p = b(\"UserAgent\"), q = b(\"copyProperties\"), r = b(\"emptyFunction\"), s = \"menu:mouseover\", t = null;\n    function u(ea) {\n        if (i.hasClass(ea, \"uiMenuContainer\")) {\n            return ea;\n        }\n    ;\n    ;\n        return n.byClass(ea, \"uiMenu\");\n    };\n;\n    function v(ea) {\n        return n.byClass(ea, \"uiMenuItem\");\n    };\n;\n    function w(ea) {\n        if (JSBNG__document.activeElement) {\n            var fa = v(JSBNG__document.activeElement);\n            return ea.indexOf(fa);\n        }\n    ;\n    ;\n        return -1;\n    };\n;\n    function x(ea) {\n        return k.JSBNG__find(ea, \"a.itemAnchor\");\n    };\n;\n    function y(ea) {\n        return i.hasClass(ea, \"checked\");\n    };\n;\n    function z(ea) {\n        return ((!i.hasClass(ea, \"disabled\") && ((o.get(ea, \"display\") !== \"none\"))));\n    };\n;\n    function aa(JSBNG__event) {\n        var ea = JSBNG__document.activeElement;\n        if (((((!ea || !n.byClass(ea, \"uiMenu\"))) || !k.isInputNode(ea)))) {\n            var fa = v(JSBNG__event.getTarget());\n            ((fa && da.focusItem(fa)));\n        }\n    ;\n    ;\n    };\n;\n    function ba(ea) {\n        ((p.firefox() && x(ea).JSBNG__blur()));\n        da.inform(\"select\", {\n            menu: u(ea),\n            item: ea\n        });\n    };\n;\n    var ca = function() {\n        ca = r;\n        var ea = {\n        };\n        ea.click = function(JSBNG__event) {\n            var fa = v(JSBNG__event.getTarget());\n            if (((fa && z(fa)))) {\n                ba(fa);\n                var ga = x(fa), ha = ga.href, ia = ga.getAttribute(\"rel\");\n                return ((((ia && ((ia !== \"ignore\")))) || ((ha && ((ha.charAt(((ha.length - 1))) !== \"#\"))))));\n            }\n        ;\n        ;\n        };\n        ea.keydown = function(JSBNG__event) {\n            var fa = JSBNG__event.getTarget();\n            if (JSBNG__event.getModifiers().any) {\n                return;\n            }\n        ;\n        ;\n            if (((!t || k.isInputNode(fa)))) {\n                return;\n            }\n        ;\n        ;\n            var ga = g.getKeyCode(JSBNG__event), ha;\n            switch (ga) {\n              case m.UP:\n            \n              case m.DOWN:\n                var ia = da.getEnabledItems(t);\n                ha = w(ia);\n                da.focusItem(ia[((ha + ((((ga === m.UP)) ? -1 : 1))))]);\n                return false;\n              case m.SPACE:\n                var ja = v(fa);\n                if (ja) {\n                    ba(ja);\n                    JSBNG__event.prevent();\n                }\n            ;\n            ;\n                break;\n              default:\n                var ka = String.fromCharCode(ga).toLowerCase(), la = da.getEnabledItems(t);\n                ha = w(la);\n                var ma = ha, na = la.length;\n                while (((((~ha && (((ma = ((++ma % na))) !== ha)))) || ((!~ha && ((++ma < na))))))) {\n                    var oa = da.getItemLabel(la[ma]);\n                    if (((oa && ((oa.charAt(0).toLowerCase() === ka))))) {\n                        da.focusItem(la[ma]);\n                        return false;\n                    }\n                ;\n                ;\n                };\n            ;\n            };\n        ;\n        };\n        g.listen(JSBNG__document.body, ea);\n    }, da = q(new h(), {\n        focusItem: function(ea) {\n            if (((ea && z(ea)))) {\n                this._removeSelected(u(ea));\n                i.addClass(ea, \"selected\");\n                x(ea).JSBNG__focus();\n            }\n        ;\n        ;\n        },\n        getEnabledItems: function(ea) {\n            return da.getItems(ea).filter(z);\n        },\n        getCheckedItems: function(ea) {\n            return da.getItems(ea).filter(y);\n        },\n        getItems: function(ea) {\n            return k.scry(ea, \"li.uiMenuItem\");\n        },\n        getItemLabel: function(ea) {\n            return ((ea.getAttribute(\"data-label\", 2) || \"\"));\n        },\n        isItemChecked: function(ea) {\n            return i.hasClass(ea, \"checked\");\n        },\n        autoregister: function(ea, fa, ga) {\n            ea.subscribe(\"show\", function() {\n                da.register(fa, ga);\n            });\n            ea.subscribe(\"hide\", function() {\n                da.unregister(fa);\n            });\n        },\n        register: function(ea, fa) {\n            ea = u(ea);\n            ca();\n            if (!j.get(ea, s)) {\n                j.set(ea, s, g.listen(ea, \"mouseover\", aa));\n            }\n        ;\n        ;\n            if (((fa !== false))) {\n                t = ea;\n            }\n        ;\n        ;\n        },\n        setItemEnabled: function(ea, fa) {\n            if (((!fa && !k.scry(ea, \"span.disabledAnchor\")[0]))) {\n                k.appendContent(ea, k.create(\"span\", {\n                    className: ((k.JSBNG__find(ea, \"a\").className + \" disabledAnchor\"))\n                }, l(x(ea).innerHTML)));\n            }\n        ;\n        ;\n            i.conditionClass(ea, \"disabled\", !fa);\n        },\n        toggleItem: function(ea) {\n            var fa = !da.isItemChecked(ea);\n            da.setItemChecked(ea, fa);\n        },\n        setItemChecked: function(ea, fa) {\n            i.conditionClass(ea, \"checked\", fa);\n            x(ea).setAttribute(\"aria-checked\", fa);\n        },\n        unregister: function(ea) {\n            ea = u(ea);\n            var fa = j.remove(ea, s);\n            ((fa && fa.remove()));\n            t = null;\n            this._removeSelected(ea);\n        },\n        _removeSelected: function(ea) {\n            da.getItems(ea).filter(function(fa) {\n                return i.hasClass(fa, \"selected\");\n            }).forEach(function(fa) {\n                i.removeClass(fa, \"selected\");\n            });\n        }\n    });\n    e.exports = da;\n});\n__d(\"coalesce\", [], function(a, b, c, d, e, f) {\n    function g() {\n        for (var h = 0; ((h < arguments.length)); ++h) {\n            if (((arguments[h] != null))) {\n                return arguments[h];\n            }\n        ;\n        ;\n        };\n    ;\n        return null;\n    };\n;\n    e.exports = g;\n});\n__d(\"OnVisible\", [\"Arbiter\",\"DOM\",\"JSBNG__Event\",\"Parent\",\"Run\",\"Vector\",\"ViewportBounds\",\"coalesce\",\"copyProperties\",\"queryThenMutateDOM\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"DOM\"), i = b(\"JSBNG__Event\"), j = b(\"Parent\"), k = b(\"Run\"), l = b(\"Vector\"), m = b(\"ViewportBounds\"), n = b(\"coalesce\"), o = b(\"copyProperties\"), p = b(\"queryThenMutateDOM\"), q = [], r, s = 0, t = [], u, v, w, x, y;\n    function z() {\n        q.forEach(function(fa) {\n            fa.remove();\n        });\n        if (v) {\n            v.remove();\n            u.remove();\n            r.unsubscribe();\n            v = u = r = null;\n        }\n    ;\n    ;\n        s = 0;\n        q.length = 0;\n    };\n;\n    function aa() {\n        if (!q.length) {\n            z();\n            return;\n        }\n    ;\n    ;\n        t.length = 0;\n        w = l.getScrollPosition().y;\n        x = l.getViewportDimensions().y;\n        y = m.getTop();\n        for (var fa = 0; ((fa < q.length)); ++fa) {\n            var ga = q[fa];\n            if (isNaN(ga.elementHeight)) {\n                t.push(fa);\n            }\n        ;\n        ;\n            ga.elementHeight = l.getElementDimensions(ga.element).y;\n            ga.elementPos = l.getElementPosition(ga.element);\n            ga.hidden = j.byClass(ga.element, \"hidden_elem\");\n            if (ga.scrollArea) {\n                ga.scrollAreaHeight = l.getElementDimensions(ga.scrollArea).y;\n                ga.scrollAreaY = l.getElementPosition(ga.scrollArea).y;\n            }\n        ;\n        ;\n        };\n    ;\n        s = fa;\n    };\n;\n    function ba() {\n        for (var fa = ((Math.min(q.length, s) - 1)); ((fa >= 0)); --fa) {\n            var ga = q[fa];\n            if (((((!ga.elementPos || ga.removed)) || ga.hidden))) {\n                q.splice(fa, 1);\n                continue;\n            }\n        ;\n        ;\n            var ha = ((((w + x)) + ga.buffer)), ia = false;\n            if (((ha > ga.elementPos.y))) {\n                var ja = ((!ga.strict || ((((((w + y)) - ga.buffer)) < ((ga.elementPos.y + ga.elementHeight))))));\n                ia = ja;\n                if (((ia && ga.scrollArea))) {\n                    var ka = ((((ga.scrollAreaY + ga.scrollAreaHeight)) + ga.buffer));\n                    ia = ((((ga.elementPos.y > ((ga.scrollAreaY - ga.buffer)))) && ((ga.elementPos.y < ka))));\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            if (((ga.inverse ? !ia : ia))) {\n                ga.remove();\n                ga.handler(((t.indexOf(fa) !== -1)));\n            }\n        ;\n        ;\n        };\n    ;\n    };\n;\n    function ca() {\n        da();\n        if (q.length) {\n            return;\n        }\n    ;\n    ;\n        v = i.listen(window, \"JSBNG__scroll\", da);\n        u = i.listen(window, \"resize\", da);\n        r = g.subscribe(\"dom-scroll\", da);\n    };\n;\n    function da() {\n        p(aa, ba, \"OnVisible/positionCheck\");\n    };\n;\n    function ea(fa, ga, ha, ia, ja, ka) {\n        this.element = fa;\n        this.handler = ga;\n        this.strict = ha;\n        this.buffer = n(ia, 300);\n        this.inverse = n(ja, false);\n        this.scrollArea = ((ka || null));\n        if (this.scrollArea) {\n            this.scrollAreaListener = i.listen(h.JSBNG__find(ka, \".uiScrollableAreaWrap\"), \"JSBNG__scroll\", this.checkBuffer);\n        }\n    ;\n    ;\n        if (((q.length === 0))) {\n            k.onLeave(z);\n        }\n    ;\n    ;\n        ca();\n        q.push(this);\n    };\n;\n    o(ea, {\n        checkBuffer: da\n    });\n    o(ea.prototype, {\n        remove: function() {\n            this.removed = true;\n            if (this.scrollAreaListener) {\n                this.scrollAreaListener.remove();\n            }\n        ;\n        ;\n        },\n        reset: function() {\n            this.elementHeight = null;\n            this.removed = false;\n            ((((q.indexOf(this) === -1)) && q.push(this)));\n            ca();\n        },\n        setBuffer: function(fa) {\n            this.buffer = fa;\n            da();\n        },\n        checkBuffer: function() {\n            da();\n        }\n    });\n    e.exports = ea;\n});\n__d(\"OnloadHooks\", [\"Arbiter\",\"ErrorUtils\",\"InitialJSLoader\",\"OnloadEvent\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ErrorUtils\"), i = b(\"InitialJSLoader\"), j = b(\"OnloadEvent\");\n    function k() {\n        var r = a.CavalryLogger;\n        if (((!window.loaded && r))) {\n            r.getInstance().setTimeStamp(\"t_prehooks\");\n        }\n    ;\n    ;\n        n(\"onloadhooks\");\n        if (((!window.loaded && r))) {\n            r.getInstance().setTimeStamp(\"t_hooks\");\n        }\n    ;\n    ;\n        window.loaded = true;\n        g.inform(\"uipage_onload\", true, g.BEHAVIOR_STATE);\n    };\n;\n    function l() {\n        n(\"onafterloadhooks\");\n        window.afterloaded = true;\n    };\n;\n    function m(r, s) {\n        return h.applyWithGuard(r, null, null, function(t) {\n            t.event_type = s;\n            t.category = \"runhook\";\n        });\n    };\n;\n    function n(r) {\n        var s = ((((r == \"onbeforeleavehooks\")) || ((r == \"onbeforeunloadhooks\"))));\n        do {\n            var t = window[r];\n            if (!t) {\n                break;\n            }\n        ;\n        ;\n            if (!s) {\n                window[r] = null;\n            }\n        ;\n        ;\n            for (var u = 0; ((u < t.length)); u++) {\n                var v = m(t[u], r);\n                if (((s && v))) {\n                    return v;\n                }\n            ;\n            ;\n            };\n        ;\n        } while (((!s && window[r])));\n    };\n;\n    function o() {\n        if (!window.loaded) {\n            window.loaded = true;\n            n(\"onloadhooks\");\n        }\n    ;\n    ;\n        if (!window.afterloaded) {\n            window.afterloaded = true;\n            n(\"onafterloadhooks\");\n        }\n    ;\n    ;\n    };\n;\n    function p() {\n        g.registerCallback(k, [j.ONLOAD_DOMCONTENT_CALLBACK,i.INITIAL_JS_READY,]);\n        g.registerCallback(l, [j.ONLOAD_DOMCONTENT_CALLBACK,j.ONLOAD_CALLBACK,i.INITIAL_JS_READY,]);\n        g.subscribe(j.ONBEFOREUNLOAD, function(r, s) {\n            s.warn = ((n(\"onbeforeleavehooks\") || n(\"onbeforeunloadhooks\")));\n            if (!s.warn) {\n                window.loaded = false;\n                window.afterloaded = false;\n            }\n        ;\n        ;\n        }, g.SUBSCRIBE_NEW);\n        g.subscribe(j.ONUNLOAD, function(r, s) {\n            n(\"onunloadhooks\");\n            n(\"onafterunloadhooks\");\n        }, g.SUBSCRIBE_NEW);\n    };\n;\n    var q = {\n        _onloadHook: k,\n        _onafterloadHook: l,\n        runHook: m,\n        runHooks: n,\n        keepWindowSetAsLoaded: o\n    };\n    p();\n    a.OnloadHooks = e.exports = q;\n});\n__d(\"areEqual\", [], function(a, b, c, d, e, f) {\n    var g = function(k, l, m, n) {\n        if (((k === l))) {\n            return ((((k !== 0)) || ((((1 / k)) == ((1 / l))))));\n        }\n    ;\n    ;\n        if (((((k == null)) || ((l == null))))) {\n            return false;\n        }\n    ;\n    ;\n        if (((((typeof k != \"object\")) || ((typeof l != \"object\"))))) {\n            return false;\n        }\n    ;\n    ;\n        var o = Object.prototype.toString, p = o.call(k);\n        if (((p != o.call(l)))) {\n            return false;\n        }\n    ;\n    ;\n        switch (p) {\n          case \"[object String]\":\n            return ((k == String(l)));\n          case \"[object Number]\":\n            return ((((isNaN(k) || isNaN(l))) ? false : ((k == Number(l)))));\n          case \"[object Date]\":\n        \n          case \"[object Boolean]\":\n            return ((+k == +l));\n          case \"[object RegExp]\":\n            return ((((((((k.source == l.source)) && ((k.global == l.global)))) && ((k.multiline == l.multiline)))) && ((k.ignoreCase == l.ignoreCase))));\n        };\n    ;\n        var q = m.length;\n        while (q--) {\n            if (((m[q] == k))) {\n                return ((n[q] == l));\n            }\n        ;\n        ;\n        };\n    ;\n        m.push(k);\n        n.push(l);\n        var r = 0;\n        if (((p === \"[object Array]\"))) {\n            r = k.length;\n            if (((r !== l.length))) {\n                return false;\n            }\n        ;\n        ;\n            while (r--) {\n                if (!g(k[r], l[r], m, n)) {\n                    return false;\n                }\n            ;\n            ;\n            };\n        ;\n        }\n         else {\n            if (((k.constructor !== l.constructor))) {\n                return false;\n            }\n        ;\n        ;\n            if (((k.hasOwnProperty(\"valueOf\") && l.hasOwnProperty(\"valueOf\")))) {\n                return ((k.valueOf() == l.valueOf()));\n            }\n        ;\n        ;\n            var s = Object.keys(k);\n            if (((s.length != Object.keys(l).length))) {\n                return false;\n            }\n        ;\n        ;\n            for (var t = 0; ((t < s.length)); t++) {\n                if (!g(k[s[t]], l[s[t]], m, n)) {\n                    return false;\n                }\n            ;\n            ;\n            };\n        ;\n        }\n    ;\n    ;\n        m.pop();\n        n.pop();\n        return true;\n    }, h = [], i = [], j = function(k, l) {\n        var m = ((h.length ? h.pop() : [])), n = ((i.length ? i.pop() : [])), o = g(k, l, m, n);\n        m.length = 0;\n        n.length = 0;\n        h.push(m);\n        i.push(n);\n        return o;\n    };\n    e.exports = j;\n});\n__d(\"computeRelativeURI\", [\"URI\",\"isEmpty\",], function(a, b, c, d, e, f) {\n    var g = b(\"URI\"), h = b(\"isEmpty\");\n    function i(k, l) {\n        if (!l) {\n            return k;\n        }\n    ;\n    ;\n        if (((l.charAt(0) == \"/\"))) {\n            return l;\n        }\n    ;\n    ;\n        var m = k.split(\"/\").slice(0, -1);\n        ((m[0] !== \"\"));\n        l.split(\"/\").forEach(function(n) {\n            if (!((n == \".\"))) {\n                if (((n == \"..\"))) {\n                    if (((m.length > 1))) {\n                        m = m.slice(0, -1);\n                    }\n                ;\n                ;\n                }\n                 else m.push(n);\n            ;\n            }\n        ;\n        ;\n        });\n        return m.join(\"/\");\n    };\n;\n    function j(k, l) {\n        var m = new g(), n = l;\n        k = new g(k);\n        l = new g(l);\n        if (((l.getDomain() && !l.isFacebookURI()))) {\n            return n;\n        }\n    ;\n    ;\n        var o = k, p = [\"Protocol\",\"Domain\",\"Port\",\"Path\",\"QueryData\",\"Fragment\",];\n        p.forEach(function(q) {\n            var r = ((((q == \"Path\")) && ((o === k))));\n            if (r) {\n                m.setPath(i(k.getPath(), l.getPath()));\n            }\n        ;\n        ;\n            if (!h(l[((\"get\" + q))]())) {\n                o = l;\n            }\n        ;\n        ;\n            if (!r) {\n                m[((\"set\" + q))](o[((\"get\" + q))]());\n            }\n        ;\n        ;\n        });\n        return m;\n    };\n;\n    e.exports = j;\n});\n__d(\"escapeJSQuotes\", [], function(a, b, c, d, e, f) {\n    function g(h) {\n        if (((((((typeof h == \"undefined\")) || ((h == null)))) || !h.valueOf()))) {\n            return \"\";\n        }\n    ;\n    ;\n        return h.toString().replace(/\\\\/g, \"\\\\\\\\\").replace(/\\n/g, \"\\\\n\").replace(/\\r/g, \"\\\\r\").replace(/\"/g, \"\\\\x22\").replace(/'/g, \"\\\\'\").replace(/</g, \"\\\\x3c\").replace(/>/g, \"\\\\x3e\").replace(/&/g, \"\\\\x26\");\n    };\n;\n    e.exports = g;\n});\n__d(\"PageTransitions\", [\"Arbiter\",\"Dialog\",\"DOMQuery\",\"DOMScroll\",\"Env\",\"JSBNG__Event\",\"Form\",\"HistoryManager\",\"JSLogger\",\"LinkController\",\"OnloadHooks\",\"Parent\",\"URI\",\"UserAgent\",\"Vector\",\"areEqual\",\"clickRefAction\",\"computeRelativeURI\",\"copyProperties\",\"escapeJSQuotes\",\"ge\",\"goOrReplace\",\"htmlize\",\"setTimeoutAcrossTransitions\",\"startsWith\",\"tx\",\"userAction\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"Dialog\"), i = b(\"DOMQuery\"), j = b(\"DOMScroll\"), k = b(\"Env\"), l = b(\"JSBNG__Event\"), m = b(\"Form\"), n = b(\"HistoryManager\"), o = b(\"JSLogger\"), p = b(\"LinkController\"), q = b(\"OnloadHooks\"), r = b(\"Parent\"), s = b(\"URI\"), t = b(\"UserAgent\"), u = b(\"Vector\"), v = b(\"areEqual\"), w = b(\"clickRefAction\"), x = b(\"computeRelativeURI\"), y = b(\"copyProperties\"), z = b(\"escapeJSQuotes\"), aa = b(\"ge\"), ba = b(\"goOrReplace\"), ca = b(\"htmlize\"), da = b(\"setTimeoutAcrossTransitions\"), ea = b(\"startsWith\"), fa = b(\"tx\"), ga = b(\"userAction\"), ha = {\n    };\n    function ia(ta, ua) {\n        ha[ta.getUnqualifiedURI()] = ua;\n    };\n;\n    function ja(ta) {\n        return ha[ta.getUnqualifiedURI()];\n    };\n;\n    function ka(ta) {\n        delete ha[ta.getUnqualifiedURI()];\n    };\n;\n    var la = null, ma = null;\n    function na(ta) {\n        ma = ta;\n        da(function() {\n            ma = null;\n        }, 0);\n    };\n;\n    function oa(JSBNG__event) {\n        if (ma) {\n            if (!JSBNG__event.isDefaultPrevented()) {\n                pa(ma);\n                sa.lookBusy(ma);\n                ra.go(ma.getAttribute(\"href\"));\n            }\n        ;\n        ;\n            JSBNG__event.prevent();\n        }\n         else {\n            la = JSBNG__event.getTarget();\n            da(function() {\n                la = null;\n            }, 0);\n        }\n    ;\n    ;\n    };\n;\n    function pa(ta) {\n        var ua = ta.getAttribute(\"href\"), va = x(ra._most_recent_uri.getQualifiedURI(), ua).toString();\n        if (((ua != va))) {\n            ta.setAttribute(\"href\", va);\n        }\n    ;\n    ;\n    };\n;\n    function qa(JSBNG__event) {\n        var ta = JSBNG__event.getTarget();\n        if (((m.getAttribute(ta, \"rel\") || m.getAttribute(ta, \"target\")))) {\n            return;\n        }\n    ;\n    ;\n        w(\"form\", ta, JSBNG__event).set_namespace(\"page_transition\");\n        var ua = ga(\"page_transitions\", ta, JSBNG__event, {\n            mode: \"DEDUP\"\n        }).uai_fallback(null, \"form\"), va = a.ArbiterMonitor;\n        if (va) {\n            va.initUA(ua, [ta,]);\n        }\n    ;\n    ;\n        var wa = new s(((m.getAttribute(ta, \"action\") || \"\"))), xa = x(ra._most_recent_uri, wa);\n        ta.setAttribute(\"action\", xa.toString());\n        if (((((m.getAttribute(ta, \"method\") || \"GET\")).toUpperCase() === \"GET\"))) {\n            var ya = m.serialize(ta), za = la;\n            if (((((za && ((((i.isNodeOfType(za, \"input\") && ((za.type === \"submit\")))) || (za = r.byTag(za, \"button\")))))) && za.JSBNG__name))) {\n                ya[za.JSBNG__name] = za.value;\n            }\n        ;\n        ;\n            ra.go(xa.addQueryData(ya));\n            JSBNG__event.kill();\n        }\n    ;\n    ;\n    };\n;\n    var ra = {\n        _transition_handlers: [],\n        _scroll_locked: false,\n        isInitialized: function() {\n            return !!ra._initialized;\n        },\n        _init: function() {\n            if (k.DISABLE_PAGE_TRANSITIONS) {\n                return;\n            }\n        ;\n        ;\n            if (((!k.ALLOW_TRANSITION_IN_IFRAME && ((window != window.JSBNG__top))))) {\n                return;\n            }\n        ;\n        ;\n            if (ra._initialized) {\n                return ra;\n            }\n        ;\n        ;\n            ra._initialized = true;\n            var ta = s.getRequestURI(false), ua = ta.getUnqualifiedURI(), va = s(ua).setFragment(null), wa = ua.getFragment();\n            if (((((wa.charAt(0) === \"!\")) && ((va.toString() === wa.substr(1)))))) {\n                ua = va;\n            }\n        ;\n        ;\n            y(ra, {\n                _current_uri: ua,\n                _most_recent_uri: ua,\n                _next_uri: ua\n            });\n            var xa;\n            if (ea(ta.getFragment(), \"/\")) {\n                xa = ta.getFragment();\n            }\n             else xa = ua;\n        ;\n        ;\n            n.init().setCanonicalLocation(((\"#\" + xa))).registerURIHandler(ra._historyManagerHandler);\n            p.registerFallbackHandler(na);\n            l.listen(JSBNG__document, \"click\", oa, l.Priority._BUBBLE);\n            l.listen(JSBNG__document, \"submit\", qa, l.Priority._BUBBLE);\n            l.listen(window, \"JSBNG__scroll\", function() {\n                if (!ra._scroll_locked) {\n                    ia(ra._current_uri, u.getScrollPosition());\n                }\n            ;\n            ;\n            });\n            return ra;\n        },\n        registerHandler: function(ta, ua) {\n            ra._init();\n            ua = ((ua || 5));\n            if (!ra._transition_handlers[ua]) {\n                ra._transition_handlers[ua] = [];\n            }\n        ;\n        ;\n            ra._transition_handlers[ua].push(ta);\n        },\n        getCurrentURI: function(ta) {\n            if (((!ra._current_uri && !ta))) {\n                return new s(ra._most_recent_uri);\n            }\n        ;\n        ;\n            return new s(ra._current_uri);\n        },\n        getMostRecentURI: function() {\n            return new s(ra._most_recent_uri);\n        },\n        getNextURI: function() {\n            return new s(ra._next_uri);\n        },\n        go: function(ta, ua) {\n            var va = new s(ta).removeQueryData(\"quickling\").getQualifiedURI();\n            o.create(\"pagetransition\").debug(\"go\", {\n                uri: va.toString()\n            });\n            ka(va);\n            ((!ua && w(\"uri\", {\n                href: va.toString()\n            }, null, \"INDIRECT\")));\n            sa.lookBusy();\n            ra._loadPage(va, function(wa) {\n                if (wa) {\n                    n.go(va.toString(), false, ua);\n                }\n                 else ba(window.JSBNG__location, va, ua);\n            ;\n            ;\n            });\n        },\n        _historyManagerHandler: function(ta) {\n            if (((ta.charAt(0) != \"/\"))) {\n                return false;\n            }\n        ;\n        ;\n            w(\"h\", {\n                href: ta\n            });\n            ga(\"page_transitions\").uai(null, \"history_manager\");\n            ra._loadPage(new s(ta), function(ua) {\n                if (!ua) {\n                    ba(window.JSBNG__location, ta, true);\n                }\n            ;\n            ;\n            });\n            return true;\n        },\n        _loadPage: function(ta, ua) {\n            if (((s(ta).getFragment() && v(s(ta).setFragment(null).getQualifiedURI(), s(ra._current_uri).setFragment(null).getQualifiedURI())))) {\n                if (ra.restoreScrollPosition(ta)) {\n                    ra._current_uri = ra._most_recent_uri = ta;\n                    sa.stopLookingBusy();\n                    return;\n                }\n            ;\n            }\n        ;\n        ;\n            var va;\n            if (ra._current_uri) {\n                va = ja(ra._current_uri);\n            }\n        ;\n        ;\n            ra._current_uri = null;\n            ra._next_uri = ta;\n            if (va) {\n                j.JSBNG__scrollTo(va, false);\n            }\n        ;\n        ;\n            var wa = function() {\n                ra._scroll_locked = true;\n                var ya = ra._handleTransition(ta);\n                ((ua && ua(ya)));\n            }, xa = q.runHooks(\"onbeforeleavehooks\");\n            if (xa) {\n                sa.stopLookingBusy();\n                ra._warnBeforeLeaving(xa, wa);\n            }\n             else wa();\n        ;\n        ;\n        },\n        _handleTransition: function(ta) {\n            window.onbeforeleavehooks = undefined;\n            sa.lookBusy();\n            if (!ta.isSameOrigin()) {\n                return false;\n            }\n        ;\n        ;\n            var ua = ((window.AsyncRequest && window.AsyncRequest.getLastID()));\n            g.inform(\"pre_page_transition\", {\n                from: ra.getMostRecentURI(),\n                to: ta\n            });\n            for (var va = ((ra._transition_handlers.length - 1)); ((va >= 0)); --va) {\n                var wa = ra._transition_handlers[va];\n                if (!wa) {\n                    continue;\n                }\n            ;\n            ;\n                for (var xa = ((wa.length - 1)); ((xa >= 0)); --xa) {\n                    if (((wa[xa](ta) === true))) {\n                        var ya = {\n                            sender: this,\n                            uri: ta,\n                            id: ua\n                        };\n                        try {\n                            g.inform(\"page_transition\", ya);\n                        } catch (za) {\n                        \n                        };\n                    ;\n                        return true;\n                    }\n                     else wa.splice(xa, 1);\n                ;\n                ;\n                };\n            ;\n            };\n        ;\n            return false;\n        },\n        unifyURI: function() {\n            ra._current_uri = ra._most_recent_uri = ra._next_uri;\n        },\n        transitionComplete: function(ta) {\n            ra._executeCompletionCallback();\n            sa.stopLookingBusy();\n            ra.unifyURI();\n            if (!ta) {\n                ra.restoreScrollPosition(ra._current_uri);\n            }\n        ;\n        ;\n            try {\n                if (((JSBNG__document.activeElement && ((JSBNG__document.activeElement.nodeName === \"A\"))))) {\n                    JSBNG__document.activeElement.JSBNG__blur();\n                }\n            ;\n            ;\n            } catch (ua) {\n            \n            };\n        ;\n        },\n        _executeCompletionCallback: function() {\n            if (ra._completionCallback) {\n                ra._completionCallback();\n            }\n        ;\n        ;\n            ra._completionCallback = null;\n        },\n        setCompletionCallback: function(ta) {\n            ra._completionCallback = ta;\n        },\n        rewriteCurrentURI: function(ta, ua) {\n            ra.registerHandler(function() {\n                if (((ta == ra.getMostRecentURI().getUnqualifiedURI().toString()))) {\n                    ra.transitionComplete();\n                    return true;\n                }\n            ;\n            ;\n            });\n            ra.go(ua, true);\n        },\n        _warnBeforeLeaving: function(ta, ua) {\n            new h().setTitle(\"Are you sure you want to leave this page?\").setBody(ca(ta)).setButtons([{\n                JSBNG__name: \"leave_page\",\n                label: \"Leave this Page\",\n                handler: ua\n            },{\n                JSBNG__name: \"continue_editing\",\n                label: \"Stay on this Page\",\n                className: \"inputaux\"\n            },]).setModal(true).show();\n        },\n        restoreScrollPosition: function(ta) {\n            ra._scroll_locked = false;\n            var ua = ja(ta);\n            if (ua) {\n                j.JSBNG__scrollTo(ua, false);\n                return true;\n            }\n        ;\n        ;\n            function va(ya) {\n                if (!ya) {\n                    return null;\n                }\n            ;\n            ;\n                var za = ((((\"a[name='\" + z(ya))) + \"']\"));\n                return ((i.scry(JSBNG__document.body, za)[0] || aa(ya)));\n            };\n        ;\n            var wa = va(s(ta).getFragment());\n            if (wa) {\n                var xa = u.getElementPosition(wa);\n                xa.x = 0;\n                j.JSBNG__scrollTo(xa);\n                return true;\n            }\n        ;\n        ;\n            return false;\n        }\n    }, sa = ((window._BusyUIManager || {\n        _looking_busy: false,\n        _original_cursors: [],\n        lookBusy: function(ta) {\n            if (ta) {\n                sa._giveProgressCursor(ta);\n            }\n        ;\n        ;\n            if (sa._looking_busy) {\n                return;\n            }\n        ;\n        ;\n            sa._looking_busy = true;\n            sa._giveProgressCursor(JSBNG__document.documentElement);\n        },\n        stopLookingBusy: function() {\n            if (!sa._looking_busy) {\n                return;\n            }\n        ;\n        ;\n            sa._looking_busy = false;\n            while (sa._original_cursors.length) {\n                var ta = sa._original_cursors.pop(), ua = ta[0], va = ta[1];\n                if (ua.style) {\n                    ua.style.cursor = ((va || \"\"));\n                }\n            ;\n            ;\n            };\n        ;\n        },\n        _giveProgressCursor: function(ta) {\n            if (!t.webkit()) {\n                sa._original_cursors.push([ta,ta.style.cursor,]);\n                ta.style.cursor = \"progress\";\n            }\n        ;\n        ;\n        }\n    }));\n    e.exports = ra;\n    a.PageTransitions = ra;\n});\n__d(\"PixelRatio\", [\"Arbiter\",\"Cookie\",\"Run\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"Cookie\"), i = b(\"Run\"), j = \"dpr\", k, l;\n    function m() {\n        return ((window.JSBNG__devicePixelRatio || 1));\n    };\n;\n    function n() {\n        h.set(j, m());\n    };\n;\n    function o() {\n        h.clear(j);\n    };\n;\n    function p() {\n        var r = m();\n        if (((r !== k))) {\n            n();\n        }\n         else o();\n    ;\n    ;\n    };\n;\n    var q = {\n        startDetecting: function(r) {\n            k = ((r || 1));\n            o();\n            if (l) {\n                return;\n            }\n        ;\n        ;\n            l = [g.subscribe(\"pre_page_transition\", p),];\n            i.onBeforeUnload(p);\n        }\n    };\n    e.exports = q;\n});\n__d(\"LayerHideOnTransition\", [\"function-extensions\",\"PageTransitions\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    b(\"function-extensions\");\n    var g = b(\"PageTransitions\"), h = b(\"copyProperties\");\n    function i(j) {\n        this._layer = j;\n    };\n;\n    h(i.prototype, {\n        _enabled: false,\n        _subscribed: false,\n        enable: function() {\n            this._enabled = true;\n            if (!this._subscribed) {\n                this._subscribe.bind(this).defer();\n                this._subscribed = true;\n            }\n        ;\n        ;\n        },\n        disable: function() {\n            this._enabled = false;\n        },\n        _subscribe: function() {\n            g.registerHandler(function() {\n                if (this._enabled) {\n                    this._layer.hide();\n                }\n            ;\n            ;\n                this._subscribed = false;\n            }.bind(this));\n        }\n    });\n    e.exports = i;\n});\n__d(\"JSBNG__Rect\", [\"Vector\",\"$\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Vector\"), h = b(\"$\"), i = b(\"copyProperties\");\n    function j(k, l, m, n, o) {\n        if (((arguments.length === 1))) {\n            if (((k instanceof j))) {\n                return k;\n            }\n        ;\n        ;\n            if (((k instanceof g))) {\n                return new j(k.y, k.x, k.y, k.x, k.domain);\n            }\n        ;\n        ;\n            return j.getElementBounds(h(k));\n        }\n    ;\n    ;\n        i(this, {\n            t: k,\n            r: l,\n            b: m,\n            l: n,\n            domain: ((o || \"pure\"))\n        });\n    };\n;\n    i(j.prototype, {\n        w: function() {\n            return ((this.r - this.l));\n        },\n        h: function() {\n            return ((this.b - this.t));\n        },\n        toString: function() {\n            return ((((((((((((((((\"((\" + this.l)) + \", \")) + this.t)) + \"), (\")) + this.r)) + \", \")) + this.b)) + \"))\"));\n        },\n        contains: function(k) {\n            k = new j(k).convertTo(this.domain);\n            var l = this;\n            return ((((((((l.l <= k.l)) && ((l.r >= k.r)))) && ((l.t <= k.t)))) && ((l.b >= k.b))));\n        },\n        add: function(k, l) {\n            if (((arguments.length == 1))) {\n                if (((k.domain != \"pure\"))) {\n                    k = k.convertTo(this.domain);\n                }\n            ;\n            ;\n                return this.add(k.x, k.y);\n            }\n        ;\n        ;\n            var m = parseFloat(k), n = parseFloat(l);\n            return new j(((this.t + n)), ((this.r + m)), ((this.b + n)), ((this.l + m)), this.domain);\n        },\n        sub: function(k, l) {\n            if (((arguments.length == 1))) {\n                return this.add(k.mul(-1));\n            }\n             else return this.add(-k, -l)\n        ;\n        },\n        rotateAroundOrigin: function(k) {\n            var l = this.getCenter().rotate(((((k * Math.PI)) / 2))), m, n;\n            if (((k % 2))) {\n                m = this.h();\n                n = this.w();\n            }\n             else {\n                m = this.w();\n                n = this.h();\n            }\n        ;\n        ;\n            var o = ((l.y - ((n / 2)))), p = ((l.x - ((m / 2)))), q = ((o + n)), r = ((p + m));\n            return new j(o, r, q, p);\n        },\n        boundWithin: function(k) {\n            var l = 0, m = 0;\n            if (((this.l < k.l))) {\n                l = ((k.l - this.l));\n            }\n             else if (((this.r > k.r))) {\n                l = ((k.r - this.r));\n            }\n            \n        ;\n        ;\n            if (((this.t < k.t))) {\n                m = ((k.t - this.t));\n            }\n             else if (((this.b > k.b))) {\n                m = ((k.b - this.b));\n            }\n            \n        ;\n        ;\n            return this.add(l, m);\n        },\n        getCenter: function() {\n            return new g(((this.l + ((this.w() / 2)))), ((this.t + ((this.h() / 2)))), this.domain);\n        },\n        getPositionVector: function() {\n            return new g(this.l, this.t, this.domain);\n        },\n        getDimensionVector: function() {\n            return new g(this.w(), this.h(), \"pure\");\n        },\n        convertTo: function(k) {\n            if (((this.domain == k))) {\n                return this;\n            }\n        ;\n        ;\n            if (((k == \"pure\"))) {\n                return new j(this.t, this.r, this.b, this.l, \"pure\");\n            }\n        ;\n        ;\n            if (((this.domain == \"pure\"))) {\n                return new j(0, 0, 0, 0);\n            }\n        ;\n        ;\n            var l = new g(this.l, this.t, this.domain).convertTo(k);\n            return new j(l.y, ((l.x + this.w())), ((l.y + this.h())), l.x, k);\n        }\n    });\n    i(j, {\n        deserialize: function(k) {\n            var l = k.split(\":\");\n            return new j(parseFloat(l[1]), parseFloat(l[2]), parseFloat(l[3]), parseFloat(l[0]));\n        },\n        newFromVectors: function(k, l) {\n            return new j(k.y, ((k.x + l.x)), ((k.y + l.y)), k.x, k.domain);\n        },\n        getElementBounds: function(k) {\n            return j.newFromVectors(g.getElementPosition(k), g.getElementDimensions(k));\n        },\n        getViewportBounds: function() {\n            return j.newFromVectors(g.getScrollPosition(), g.getViewportDimensions());\n        },\n        minimumBoundingBox: function(k) {\n            var l = new j(Math.min(), Math.max(), Math.max(), Math.min()), m;\n            for (var n = 0; ((n < k.length)); n++) {\n                m = k[n];\n                l.t = Math.min(l.t, m.t);\n                l.r = Math.max(l.r, m.r);\n                l.b = Math.max(l.b, m.b);\n                l.l = Math.min(l.l, m.l);\n            };\n        ;\n            return l;\n        }\n    });\n    e.exports = j;\n});\n__d(\"SVGChecker\", [], function(a, b, c, d, e, f) {\n    e.exports = {\n        isSVG: function(g) {\n            return ((!!g.ownerSVGElement || ((g.tagName.toLowerCase() === \"svg\"))));\n        },\n        isDisplayed: function(g) {\n            try {\n                var i = g.getBBox();\n                if (((i && ((((i.height === 0)) || ((i.width === 0))))))) {\n                    return false;\n                }\n            ;\n            ;\n            } catch (h) {\n                return false;\n            };\n        ;\n            return true;\n        }\n    };\n});\n__d(\"arrayContains\", [], function(a, b, c, d, e, f) {\n    function g(h, i) {\n        return ((h.indexOf(i) != -1));\n    };\n;\n    e.exports = g;\n});\n__d(\"ContextualLayer\", [\"JSBNG__Event\",\"Arbiter\",\"ARIA\",\"Class\",\"ContextualThing\",\"CSS\",\"DataStore\",\"DOM\",\"Layer\",\"LayerHideOnTransition\",\"Locale\",\"Parent\",\"JSBNG__Rect\",\"Style\",\"Vector\",\"SVGChecker\",\"arrayContains\",\"copyProperties\",\"emptyFunction\",\"getOverlayZIndex\",\"removeFromArray\",\"throttle\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"Arbiter\"), i = b(\"ARIA\"), j = b(\"Class\"), k = b(\"ContextualThing\"), l = b(\"CSS\"), m = b(\"DataStore\"), n = b(\"DOM\"), o = b(\"Layer\"), p = b(\"LayerHideOnTransition\"), q = b(\"Locale\"), r = b(\"Parent\"), s = b(\"JSBNG__Rect\"), t = b(\"Style\"), u = b(\"Vector\"), v = b(\"SVGChecker\"), w = b(\"arrayContains\"), x = b(\"copyProperties\"), y = b(\"emptyFunction\"), z = b(\"getOverlayZIndex\"), aa = b(\"removeFromArray\"), ba = b(\"throttle\");\n    function ca(ja) {\n        return ((((ja.getPosition() === \"left\")) || ((ja.isVertical() && ((ja.getAlignment() === \"right\"))))));\n    };\n;\n    function da(ja) {\n        var ka = ja.parentNode;\n        if (ka) {\n            var la = t.get(ka, \"position\");\n            if (((la === \"static\"))) {\n                if (((ka === JSBNG__document.body))) {\n                    ka = JSBNG__document.documentElement;\n                }\n                 else ka = da(ka);\n            ;\n            ;\n            }\n             else return ka\n        ;\n        }\n         else ka = JSBNG__document.documentElement;\n    ;\n    ;\n        return ka;\n    };\n;\n    function ea(ja, ka) {\n        this.parent.construct(this, ja, ka);\n    };\n;\n    var fa = [];\n    h.subscribe(\"reflow\", function() {\n        fa.forEach(function(ja) {\n            if (((ja.updatePosition() === false))) {\n                ja.hide();\n            }\n        ;\n        ;\n        });\n    });\n    j.extend(ea, o);\n    x(ea.prototype, {\n        _contentWrapper: null,\n        _content: null,\n        _contextNode: null,\n        _contextBounds: null,\n        _contextSelector: null,\n        _parentLayer: null,\n        _parentSubscription: null,\n        _orientation: null,\n        _orientationClass: null,\n        _shouldSetARIAProperties: true,\n        _configure: function(ja, ka) {\n            this.parent._configure(ja, ka);\n            if (ja.context) {\n                this.setContext(ja.context);\n            }\n             else if (ja.contextID) {\n                this._setContextID(ja.contextID);\n            }\n             else if (ja.contextSelector) {\n                this._setContextSelector(ja.contextSelector);\n            }\n            \n            \n        ;\n        ;\n            this.setPosition(ja.position);\n            this.setAlignment(ja.alignment);\n            this.setOffsetX(ja.offsetX);\n            this.setOffsetY(ja.offsetY);\n            this._content = ka;\n        },\n        _getDefaultBehaviors: function() {\n            return this.parent._getDefaultBehaviors().concat([p,]);\n        },\n        _buildWrapper: function(ja, ka) {\n            this._contentWrapper = n.create(\"div\", {\n                className: \"uiContextualLayer\"\n            }, ka);\n            return n.create(\"div\", {\n                className: \"uiContextualLayerPositioner\"\n            }, this._contentWrapper);\n        },\n        getInsertParent: function() {\n            var ja = this._insertParent;\n            if (!ja) {\n                var ka = this.getContext();\n                if (ka) {\n                    ja = r.byClass(ka, \"uiContextualLayerParent\");\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            return ((ja || this.parent.getInsertParent()));\n        },\n        setContent: function(ja) {\n            this._content = ja;\n            n.setContent(this._contentWrapper, this._content);\n            ((this._shown && this.updatePosition()));\n            return this;\n        },\n        setContext: function(ja) {\n            return this.setContextWithBounds(ja, null);\n        },\n        setContextWithBounds: function(ja, ka) {\n            this._contextNode = ja;\n            this._contextBounds = ((ka || null));\n            this._contextSelector = this._contextScrollParent = null;\n            if (this._shown) {\n                k.register(this.getRoot(), this._contextNode);\n                this.updatePosition();\n            }\n        ;\n        ;\n            this._setParentSubscription();\n            this.setARIAProperties();\n            return this;\n        },\n        shouldSetARIAProperties: function(ja) {\n            this._shouldSetARIAProperties = ja;\n            return this;\n        },\n        setARIAProperties: function() {\n            if (this._shouldSetARIAProperties) {\n                i.setPopup(this.getCausalElement(), this.getRoot());\n            }\n        ;\n        ;\n            return this;\n        },\n        _setContextID: function(ja) {\n            this._contextSelector = ((\"#\" + ja));\n            this._contextNode = null;\n        },\n        _setContextSelector: function(ja) {\n            this._contextSelector = ja;\n            this._contextNode = null;\n        },\n        getCausalElement: function() {\n            return ((this.parent.getCausalElement() || this.getContext()));\n        },\n        _setParentSubscription: function() {\n            var ja = this.getContext(), ka = null;\n            while (((ja !== null))) {\n                ka = m.get(ja, \"layer\");\n                if (ka) {\n                    break;\n                }\n            ;\n            ;\n                ja = ja.parentNode;\n            };\n        ;\n            if (((ka === this._parentLayer))) {\n                return;\n            }\n        ;\n        ;\n            if (((this._parentLayer && this._parentSubscription))) {\n                this._parentLayer.unsubscribe(this._parentSubscription);\n                this._parentSubscription = null;\n            }\n        ;\n        ;\n            if (ka) {\n                this._parentSubscription = ka.subscribe(\"hide\", this.hide.bind(this));\n            }\n        ;\n        ;\n            this._parentLayer = ka;\n        },\n        setPosition: function(ja) {\n            if (this._getOrientation().setDefaultPosition(ja)) {\n                ((this._shown && this.updatePosition()));\n            }\n        ;\n        ;\n            return this;\n        },\n        setAlignment: function(ja) {\n            if (this._getOrientation().setDefaultAlignment(ja)) {\n                ((this._shown && this.updatePosition()));\n            }\n        ;\n        ;\n            return this;\n        },\n        setOffsetX: function(ja) {\n            if (this._getOrientation().setDefaultOffsetX(ja)) {\n                ((this._shown && this.updatePosition()));\n            }\n        ;\n        ;\n            return this;\n        },\n        setOffsetY: function(ja) {\n            if (this._getOrientation().setDefaultOffsetY(ja)) {\n                ((this._shown && this.updatePosition()));\n            }\n        ;\n        ;\n            return this;\n        },\n        _getOrientation: function() {\n            if (!this._orientation) {\n                this._orientation = new ia();\n            }\n        ;\n        ;\n            return this._orientation;\n        },\n        getContentRoot: function() {\n            return this._contentWrapper;\n        },\n        getContent: function() {\n            return this._content;\n        },\n        getContext: function() {\n            if (!this._contextNode) {\n                this._contextNode = n.JSBNG__find(JSBNG__document, this._contextSelector);\n            }\n        ;\n        ;\n            return this._contextNode;\n        },\n        getContextBounds: function(ja) {\n            if (this._contextBounds) {\n                return this._contextBounds.convertTo(ja);\n            }\n        ;\n        ;\n            var ka = this.getContext();\n            return s.newFromVectors(u.getElementPosition(ka, ja), u.getElementDimensions(ka));\n        },\n        getContextScrollParent: function() {\n            if (!this._contextScrollParent) {\n                this._contextScrollParent = t.getScrollParent(this.getContext());\n            }\n        ;\n        ;\n            return this._contextScrollParent;\n        },\n        setInsertParent: function(ja) {\n            this._insertScrollParent = null;\n            return this.parent.setInsertParent(ja);\n        },\n        getInsertScrollParent: function() {\n            if (!this._insertScrollParent) {\n                this._insertScrollParent = t.getScrollParent(this.getInsertParent());\n            }\n        ;\n        ;\n            return this._insertScrollParent;\n        },\n        show: function() {\n            if (this._shown) {\n                return this;\n            }\n        ;\n        ;\n            this.parent.show();\n            if (this._shown) {\n                k.register(this.getRoot(), this.getContext());\n                fa.push(this);\n                this._resizeListener = ((this._resizeListener || g.listen(window, \"resize\", ba(this.updatePosition.bind(this)))));\n            }\n        ;\n        ;\n            return this;\n        },\n        finishHide: function() {\n            aa(fa, this);\n            ((this._resizeListener && this._resizeListener.remove()));\n            this._resizeListener = null;\n            return this.parent.finishHide();\n        },\n        isFixed: function() {\n            return ((t.isFixed(this.getContext()) && !t.isFixed(this.getInsertParent())));\n        },\n        updatePosition: function() {\n            var ja = this.getContext();\n            if (!ja) {\n                return false;\n            }\n        ;\n        ;\n            var ka = this.isFixed();\n            if (((!ka && !((ja.offsetParent || ((v.isSVG(ja) && v.isDisplayed(ja)))))))) {\n                return false;\n            }\n        ;\n        ;\n            var la = this.getRoot();\n            t.set(la, \"width\", ((u.getViewportDimensions().x + \"px\")));\n            var ma = this._getOrientation();\n            this.inform(\"adjust\", ma.reset());\n            if (!ma.isValid()) {\n                return false;\n            }\n        ;\n        ;\n            this._updateWrapperPosition(ma);\n            this._updateWrapperClass(ma);\n            l.conditionClass(la, \"uiContextualLayerPositionerFixed\", ka);\n            var na, oa, pa = ((ka ? \"viewport\" : \"JSBNG__document\")), qa = ((ka ? JSBNG__document.documentElement : da(la)));\n            if (((qa === JSBNG__document.documentElement))) {\n                na = new u(0, 0);\n                oa = JSBNG__document.documentElement.clientWidth;\n            }\n             else if (!la.offsetParent) {\n                return false;\n            }\n             else {\n                na = u.getElementPosition(qa, pa);\n                oa = qa.offsetWidth;\n                if (((qa !== JSBNG__document.body))) {\n                    na = na.sub(new u(qa.scrollLeft, qa.scrollTop));\n                }\n            ;\n            ;\n            }\n            \n        ;\n        ;\n            var ra = this.getContextBounds(pa), sa = ((ra.l - na.x)), ta = ((ra.t - na.y)), ua = ra.h(), va = ra.w(), wa = q.isRTL();\n            if (((ma.getPosition() === \"below\"))) {\n                ta += ua;\n            }\n        ;\n        ;\n            if (((((((ma.getPosition() === \"right\")) || ((ma.isVertical() && ((ma.getAlignment() === \"right\")))))) != wa))) {\n                sa += va;\n            }\n        ;\n        ;\n            var xa = ma.getOffsetX();\n            if (((ma.isVertical() && ((ma.getAlignment() === \"center\"))))) {\n                xa += ((((va - this.getContentRoot().offsetWidth)) / 2));\n            }\n        ;\n        ;\n            if (wa) {\n                xa *= -1;\n            }\n        ;\n        ;\n            var ya = \"left\", za = Math.floor(((sa + xa)));\n            if (((ca(ma) !== wa))) {\n                ya = \"right\";\n                za = ((oa - za));\n            }\n        ;\n        ;\n            t.set(la, ya, ((za + \"px\")));\n            t.set(la, ((((ya === \"left\")) ? \"right\" : \"left\")), \"\");\n            var ab = this.getInsertScrollParent(), bb;\n            if (((ab !== window))) {\n                bb = ab.clientWidth;\n            }\n             else bb = JSBNG__document.documentElement.clientWidth;\n        ;\n        ;\n            var cb = u.getElementPosition(la).x;\n            if (((ya === \"left\"))) {\n                if (((((bb - cb)) > 0))) {\n                    t.set(la, \"width\", ((((bb - cb)) + \"px\")));\n                }\n                 else t.set(la, \"width\", \"\");\n            ;\n            ;\n            }\n             else t.set(la, \"width\", ((((cb + la.offsetWidth)) + \"px\")));\n        ;\n        ;\n            t.set(la, \"JSBNG__top\", ((((ta + ma.getOffsetY())) + \"px\")));\n            var db = z(ja, this.getInsertParent());\n            t.set(la, \"z-index\", ((((db > 200)) ? db : \"\")));\n            this.inform(\"reposition\", ma);\n            return true;\n        },\n        _updateWrapperPosition: function(ja) {\n            var ka = ((ja.getPosition() === \"above\"));\n            t.set(this._contentWrapper, \"bottom\", ((ka ? \"0\" : null)));\n            var la = ((q.isRTL() ? \"left\" : \"right\")), ma = ca(ja);\n            t.set(this._contentWrapper, la, ((ma ? \"0\" : null)));\n        },\n        _updateWrapperClass: function(ja) {\n            var ka = ja.getClassName();\n            if (((ka === this._orientationClass))) {\n                return;\n            }\n        ;\n        ;\n            if (this._orientationClass) {\n                l.removeClass(this._contentWrapper, this._orientationClass);\n            }\n        ;\n        ;\n            this._orientationClass = ka;\n            l.addClass(this._contentWrapper, ka);\n        },\n        simulateOrientation: function(ja, ka) {\n            var la = ja.getClassName();\n            if (((la === this._orientationClass))) {\n                return ka();\n            }\n             else {\n                if (this._orientationClass) {\n                    l.removeClass(this._contentWrapper, this._orientationClass);\n                }\n            ;\n            ;\n                l.addClass(this._contentWrapper, la);\n                var ma = ka();\n                l.removeClass(this._contentWrapper, la);\n                if (this._orientationClass) {\n                    l.addClass(this._contentWrapper, this._orientationClass);\n                }\n            ;\n            ;\n                return ma;\n            }\n        ;\n        ;\n        },\n        destroy: function() {\n            this.parent.destroy();\n            this._contentWrapper = null;\n            this._content = null;\n            return this;\n        }\n    });\n    var ga = y.thatReturnsArgument, ha = y.thatReturnsArgument;\n    function ia() {\n        this._default = {\n            _position: \"above\",\n            _alignment: \"left\",\n            _offsetX: 0,\n            _offsetY: 0,\n            _valid: true\n        };\n        this.reset();\n    };\n;\n    ia.OPPOSITE = {\n        above: \"below\",\n        below: \"above\",\n        left: \"right\",\n        right: \"left\"\n    };\n    x(ia.prototype, {\n        setPosition: function(ja) {\n            this._position = ga(ja);\n            return this;\n        },\n        setAlignment: function(ja) {\n            this._alignment = ha(ja);\n            return this;\n        },\n        getOppositePosition: function() {\n            return ia.OPPOSITE[this.getPosition()];\n        },\n        invalidate: function() {\n            this._valid = false;\n            return this;\n        },\n        getPosition: function() {\n            return ((this._position || \"above\"));\n        },\n        getAlignment: function() {\n            return ((this._alignment || \"left\"));\n        },\n        getOffsetX: function() {\n            var ja = ((this._offsetX || 0));\n            if (!this.isVertical()) {\n                if (((this._default._position !== this._position))) {\n                    ja *= -1;\n                }\n            ;\n            ;\n            }\n             else if (((this._default._alignment !== this._alignment))) {\n                ja *= -1;\n            }\n            \n        ;\n        ;\n            return ja;\n        },\n        getOffsetY: function() {\n            var ja = ((this._offsetY || 0));\n            if (((this.isVertical() && ((this._default._position !== this._position))))) {\n                ja *= -1;\n            }\n        ;\n        ;\n            return ja;\n        },\n        getClassName: function() {\n            var ja = this.getAlignment(), ka = this.getPosition();\n            if (((ka === \"below\"))) {\n                if (((ja === \"left\"))) {\n                    return \"uiContextualLayerBelowLeft\";\n                }\n                 else if (((ja === \"right\"))) {\n                    return \"uiContextualLayerBelowRight\";\n                }\n                 else return \"uiContextualLayerBelowCenter\"\n                \n            ;\n            }\n             else if (((ka === \"above\"))) {\n                if (((ja === \"left\"))) {\n                    return \"uiContextualLayerAboveLeft\";\n                }\n                 else if (((ja === \"right\"))) {\n                    return \"uiContextualLayerAboveRight\";\n                }\n                 else return \"uiContextualLayerAboveCenter\"\n                \n            ;\n            }\n             else if (((ka === \"left\"))) {\n                return \"uiContextualLayerLeft\";\n            }\n             else return \"uiContextualLayerRight\"\n            \n            \n        ;\n        },\n        isValid: function() {\n            return this._valid;\n        },\n        isVertical: function() {\n            return ((((this.getPosition() === \"above\")) || ((this.getPosition() === \"below\"))));\n        },\n        reset: function(ja, ka) {\n            x(this, this._default);\n            return this;\n        },\n        setDefaultPosition: function(ja) {\n            var ka = this._default._position;\n            this._default._position = ga(ja);\n            return ((ka !== ja));\n        },\n        setDefaultAlignment: function(ja) {\n            var ka = this._default._alignment;\n            this._default._alignment = ha(ja);\n            return ((ka !== ja));\n        },\n        setDefaultOffsetX: function(ja) {\n            var ka = this._default._offsetX;\n            this._default._offsetX = ja;\n            return ((ka !== ja));\n        },\n        setDefaultOffsetY: function(ja) {\n            var ka = this._default._offsetY;\n            this._default._offsetY = ja;\n            return ((ka !== ja));\n        }\n    });\n    e.exports = ea;\n});\n__d(\"ContextualLayerHideOnScroll\", [\"JSBNG__Event\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"copyProperties\");\n    function i(j) {\n        this._layer = j;\n    };\n;\n    h(i.prototype, {\n        _subscriptions: [],\n        enable: function() {\n            this._subscriptions = [this._layer.subscribe(\"contextchange\", this._handleContextChange.bind(this)),this._layer.subscribe(\"show\", this.attach.bind(this)),this._layer.subscribe(\"hide\", this.detach.bind(this)),];\n        },\n        disable: function() {\n            while (this._subscriptions.length) {\n                this._subscriptions.pop().unsubscribe();\n            ;\n            };\n        ;\n            this.detach();\n        },\n        attach: function() {\n            if (this._listener) {\n                return;\n            }\n        ;\n        ;\n            var j = this._layer.getContextScrollParent();\n            if (((j === window))) {\n                return;\n            }\n        ;\n        ;\n            this._listener = g.listen(j, \"JSBNG__scroll\", this._layer.hide.bind(this._layer));\n        },\n        detach: function() {\n            ((this._listener && this._listener.remove()));\n            this._listener = null;\n        },\n        _handleContextChange: function() {\n            this.detach();\n            if (this._layer.isShown()) {\n                this.attach();\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = i;\n});\n__d(\"LayerHideOnEscape\", [\"JSBNG__Event\",\"copyProperties\",\"Keys\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"copyProperties\"), i = b(\"Keys\");\n    function j(k) {\n        this._layer = k;\n    };\n;\n    h(j.prototype, {\n        _subscription: null,\n        enable: function() {\n            this._subscription = this._layer.subscribe(\"key\", this._handle.bind(this));\n        },\n        disable: function() {\n            this._subscription.unsubscribe();\n            this._subscription = null;\n        },\n        _handle: function(k, JSBNG__event) {\n            if (((g.getKeyCode(JSBNG__event) === i.ESC))) {\n                this._layer.hide();\n                return false;\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = j;\n});\n__d(\"TabbableElements\", [\"Style\",\"createArrayFrom\",], function(a, b, c, d, e, f) {\n    var g = b(\"Style\"), h = b(\"createArrayFrom\");\n    function i(l) {\n        if (((l.tabIndex >= 0))) {\n            return true;\n        }\n    ;\n    ;\n        switch (l.tagName) {\n          case \"A\":\n            return ((l.href && ((l.rel != \"ignore\"))));\n          case \"INPUT\":\n            return ((((((l.type != \"hidden\")) && ((l.type != \"file\")))) && !l.disabled));\n          case \"BUTTON\":\n        \n          case \"SELECT\":\n        \n          case \"TEXTAREA\":\n            return !l.disabled;\n        };\n    ;\n        return false;\n    };\n;\n    function j(l) {\n        if (((((l.offsetHeight === 0)) && ((l.offsetWidth === 0))))) {\n            return false;\n        }\n    ;\n    ;\n        while (((((l !== JSBNG__document)) && ((g.get(l, \"visibility\") != \"hidden\"))))) {\n            l = l.parentNode;\n        ;\n        };\n    ;\n        return ((l === JSBNG__document));\n    };\n;\n    var k = {\n        JSBNG__find: function(l) {\n            var m = h(l.getElementsByTagName(\"*\"));\n            return m.filter(k.isTabbable);\n        },\n        isTabbable: function(l) {\n            return ((i(l) && j(l)));\n        }\n    };\n    e.exports = k;\n});\n__d(\"Toggler\", [\"JSBNG__Event\",\"Arbiter\",\"ArbiterMixin\",\"ContextualThing\",\"CSS\",\"DataStore\",\"Dialog\",\"DOM\",\"DOMQuery\",\"Focus\",\"Parent\",\"TabbableElements\",\"arrayContains\",\"cx\",\"copyProperties\",\"createArrayFrom\",\"emptyFunction\",\"ge\",\"getContextualParent\",\"getObjectValues\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"Arbiter\"), i = b(\"ArbiterMixin\"), j = b(\"ContextualThing\"), k = b(\"CSS\"), l = b(\"DataStore\"), m = b(\"Dialog\"), n = b(\"DOM\"), o = b(\"DOMQuery\"), p = b(\"Focus\"), q = b(\"Parent\"), r = b(\"TabbableElements\"), s = b(\"arrayContains\"), t = b(\"cx\"), u = b(\"copyProperties\"), v = b(\"createArrayFrom\"), w = b(\"emptyFunction\"), x = b(\"ge\"), y = b(\"getContextualParent\"), z = b(\"getObjectValues\"), aa = [], ba;\n    function ca() {\n        ca = w;\n        g.listen(JSBNG__document.documentElement, \"click\", function(JSBNG__event) {\n            var ga = JSBNG__event.getTarget();\n            aa.forEach(function(ha) {\n                ha.clickedTarget = ga;\n                ((((((((((((ha.active && !ha.sticky)) && !j.containsIncludingLayers(ha.getActive(), ga))) && !ha.inTargetFlyout(ga))) && ha.inActiveDialog())) && !ha.isIgnoredByModalLayer(ga))) && ha.hide()));\n            });\n        }, g.Priority.URGENT);\n    };\n;\n    var da = function() {\n        this.active = null;\n        this.togglers = {\n        };\n        this.setSticky(false);\n        aa.push(this);\n        this.subscribe([\"show\",\"hide\",], da.inform.bind(da));\n        return ca();\n    };\n    u(da.prototype, i, {\n        show: function(ga) {\n            var ha = ea(this, ga), ia = ha.active;\n            if (((ga !== ia))) {\n                ((ia && ha.hide()));\n                ha.active = ga;\n                k.addClass(ga, \"openToggler\");\n                var ja = n.scry(ga, \"a[rel=\\\"toggle\\\"]\");\n                if (((((ja.length > 0)) && ja[0].getAttribute(\"data-target\")))) {\n                    k.removeClass(x(ja[0].getAttribute(\"data-target\")), \"toggleTargetClosed\");\n                }\n            ;\n            ;\n                var ka = o.scry(ga, \".uiToggleFlyout\")[0];\n                if (ka) {\n                    var la = ((r.JSBNG__find(ka)[0] || ka));\n                    if (((la.tabIndex == -1))) {\n                        la.tabIndex = 0;\n                    }\n                ;\n                ;\n                    p.setWithoutOutline(la);\n                }\n            ;\n            ;\n                n.appendContent(ga, ha.getToggler(\"next\"));\n                n.prependContent(ga, ha.getToggler(\"prev\"));\n                ha.inform(\"show\", ha);\n            }\n        ;\n        ;\n        },\n        hide: function(ga) {\n            var ha = ea(this, ga), ia = ha.active;\n            if (((ia && ((!ga || ((ga === ia))))))) {\n                k.removeClass(ia, \"openToggler\");\n                var ja = n.scry(ia, \"a[rel=\\\"toggle\\\"]\");\n                if (((((ja.length > 0)) && ja[0].getAttribute(\"data-target\")))) {\n                    k.addClass(x(ja[0].getAttribute(\"data-target\")), \"toggleTargetClosed\");\n                }\n            ;\n            ;\n                z(ha.togglers).forEach(n.remove);\n                ha.inform(\"hide\", ha);\n                ha.active = null;\n            }\n        ;\n        ;\n        },\n        toggle: function(ga) {\n            var ha = ea(this, ga);\n            if (((ha.active === ga))) {\n                ha.hide();\n            }\n             else ha.show(ga);\n        ;\n        ;\n        },\n        getActive: function() {\n            return ea(this).active;\n        },\n        isShown: function() {\n            return ((ea(this).active && k.hasClass(ea(this).active, \"openToggler\")));\n        },\n        inTargetFlyout: function(ga) {\n            var ha = fa(this.getActive());\n            return ((ha && j.containsIncludingLayers(ha, ga)));\n        },\n        inActiveDialog: function() {\n            var ga = m.getCurrent();\n            return ((!ga || n.contains(ga.getRoot(), this.getActive())));\n        },\n        isIgnoredByModalLayer: function(ga) {\n            return ((q.byClass(ga, \"_3qw\") && !q.byClass(this.getActive(), \"_3qw\")));\n        },\n        getToggler: function(ga) {\n            var ha = ea(this);\n            if (!ha.togglers[ga]) {\n                ha.togglers[ga] = n.create(\"button\", {\n                    className: \"hideToggler\",\n                    JSBNG__onfocus: function() {\n                        var ia = n.scry(ha.active, \"a[rel=\\\"toggle\\\"]\")[0];\n                        ((ia && ia.JSBNG__focus()));\n                        ha.hide();\n                    }\n                });\n                ha.togglers[ga].setAttribute(\"type\", \"button\");\n            }\n        ;\n        ;\n            return this.togglers[ga];\n        },\n        setSticky: function(ga) {\n            var ha = ea(this);\n            ga = ((ga !== false));\n            if (((ga !== ha.sticky))) {\n                ha.sticky = ga;\n                if (ga) {\n                    ((ha._pt && ha._pt.unsubscribe()));\n                }\n                 else ha._pt = h.subscribe(\"pre_page_transition\", ha.hide.bind(ha, null));\n            ;\n            ;\n            }\n        ;\n        ;\n            return ha;\n        }\n    });\n    u(da, da.prototype);\n    u(da, {\n        bootstrap: function(ga) {\n            var ha = ga.parentNode;\n            da.getInstance(ha).toggle(ha);\n        },\n        createInstance: function(ga) {\n            var ha = new da().setSticky(true);\n            l.set(ga, \"toggler\", ha);\n            return ha;\n        },\n        destroyInstance: function(ga) {\n            l.remove(ga, \"toggler\");\n        },\n        getInstance: function(ga) {\n            while (ga) {\n                var ha = l.get(ga, \"toggler\");\n                if (ha) {\n                    return ha;\n                }\n            ;\n            ;\n                if (k.hasClass(ga, \"uiToggleContext\")) {\n                    return da.createInstance(ga);\n                }\n            ;\n            ;\n                ga = y(ga);\n            };\n        ;\n            return (ba = ((ba || new da())));\n        },\n        listen: function(ga, ha, ia) {\n            return da.subscribe(v(ga), function(ja, ka) {\n                if (((ka.getActive() === ha))) {\n                    return ia(ja, ka);\n                }\n            ;\n            ;\n            });\n        },\n        subscribe: (function(ga) {\n            return function(ha, ia) {\n                ha = v(ha);\n                if (s(ha, \"show\")) {\n                    aa.forEach(function(ja) {\n                        if (ja.getActive()) {\n                            ia.curry(\"show\", ja).defer();\n                        }\n                    ;\n                    ;\n                    });\n                }\n            ;\n            ;\n                return ga(ha, ia);\n            };\n        })(da.subscribe.bind(da))\n    });\n    function ea(ga, ha) {\n        if (((ga instanceof da))) {\n            return ga;\n        }\n    ;\n    ;\n        return da.getInstance(ha);\n    };\n;\n    function fa(ga) {\n        var ha = n.scry(ga, \"a[rel=\\\"toggle\\\"]\");\n        if (((((ha.length > 0)) && ha[0].getAttribute(\"data-target\")))) {\n            return x(ha[0].getAttribute(\"data-target\"));\n        }\n    ;\n    ;\n    };\n;\n    e.exports = da;\n});\n__d(\"curry\", [\"bind\",], function(a, b, c, d, e, f) {\n    var g = b(\"bind\"), h = g(null, g, null);\n    e.exports = h;\n});\n__d(\"Popover\", [\"JSBNG__Event\",\"Arbiter\",\"ArbiterMixin\",\"ContextualLayer\",\"ContextualLayerHideOnScroll\",\"CSS\",\"DataStore\",\"DOM\",\"Focus\",\"Keys\",\"KeyStatus\",\"LayerHideOnEscape\",\"Toggler\",\"copyProperties\",\"curry\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"Arbiter\"), i = b(\"ArbiterMixin\"), j = b(\"ContextualLayer\"), k = b(\"ContextualLayerHideOnScroll\"), l = b(\"CSS\"), m = b(\"DataStore\"), n = b(\"DOM\"), o = b(\"Focus\"), p = b(\"Keys\"), q = b(\"KeyStatus\"), r = b(\"LayerHideOnEscape\"), s = b(\"Toggler\"), t = b(\"copyProperties\"), u = b(\"curry\");\n    s.subscribe([\"show\",\"hide\",], function(w, x) {\n        var y = m.get(x.getActive(), \"Popover\");\n        if (y) {\n            if (((w === \"show\"))) {\n                y.showLayer();\n            }\n             else y.hideLayer();\n        ;\n        }\n    ;\n    ;\n    });\n    function v(w, x, y, z) {\n        this._root = w;\n        this._triggerElem = x;\n        this._behaviors = y;\n        this._config = ((z || {\n        }));\n        this._disabled = !!this._config.disabled;\n        this._listeners = [];\n        if (((!this._disabled && ((((x.nodeName !== \"A\")) || ((x.rel !== \"toggle\"))))))) {\n            this._setupClickListener();\n        }\n    ;\n    ;\n        this._setupKeyListener();\n        x.setAttribute(\"role\", \"button\");\n        m.set(w, \"Popover\", this);\n    };\n;\n    t(v.prototype, i, {\n        _layer: null,\n        ensureInit: function() {\n            if (!this._layer) {\n                this._init();\n            }\n        ;\n        ;\n        },\n        showLayer: function() {\n            this.ensureInit();\n            this._layer.show();\n            s.show(this._root);\n            l.addClass(this._root, \"selected\");\n            this.inform(\"show\");\n            this._triggerElem.setAttribute(\"aria-expanded\", \"true\");\n        },\n        getLayer: function() {\n            return this._layer;\n        },\n        hideLayer: function() {\n            this._layer.hide();\n            this._triggerElem.setAttribute(\"aria-expanded\", \"false\");\n        },\n        isShown: function() {\n            return ((this._layer && this._layer.isShown()));\n        },\n        setLayerContent: function(w) {\n            this.ensureInit();\n            this._layer.setContent(w);\n        },\n        _init: function() {\n            var w = new j({\n                context: this._triggerElem,\n                position: \"below\"\n            }, n.create(\"div\"));\n            w.enableBehaviors([k,r,]);\n            s.createInstance(w.getRoot()).setSticky(false);\n            w.subscribe(\"hide\", this._onLayerHide.bind(this));\n            ((this._behaviors && w.enableBehaviors(this._behaviors)));\n            this._layer = w;\n            if (this._config.alignh) {\n                this._layer.setAlignment(this._config.alignh);\n            }\n        ;\n        ;\n            if (this._config.layer_content) {\n                this._layer.setContent(this._config.layer_content);\n            }\n        ;\n        ;\n            this.inform(\"init\", null, h.BEHAVIOR_PERSISTENT);\n        },\n        _onLayerHide: function() {\n            s.hide(this._root);\n            l.removeClass(this._root, \"selected\");\n            this.inform(\"hide\");\n            if (((q.getKeyDownCode() === p.ESC))) {\n                o.set(this._triggerElem);\n            }\n        ;\n        ;\n        },\n        enable: function() {\n            if (!this._disabled) {\n                return;\n            }\n        ;\n        ;\n            this._setupClickListener();\n            this._setupKeyListener();\n            this._disabled = false;\n        },\n        disable: function() {\n            if (this._disabled) {\n                return;\n            }\n        ;\n        ;\n            if (this.isShown()) {\n                this.hideLayer();\n            }\n        ;\n        ;\n            while (this._listeners.length) {\n                this._listeners.pop().remove();\n            ;\n            };\n        ;\n            if (((this._triggerElem.getAttribute(\"rel\") === \"toggle\"))) {\n                this._triggerElem.removeAttribute(\"rel\");\n            }\n        ;\n        ;\n            this._disabled = true;\n        },\n        _setupClickListener: function() {\n            this._listeners.push(g.listen(this._triggerElem, \"click\", u(s.bootstrap, this._triggerElem)));\n        },\n        _setupKeyListener: function() {\n            this._listeners.push(g.listen(this._triggerElem, \"keydown\", this._handleKeyEvent.bind(this)));\n        },\n        _handleKeyEvent: function(JSBNG__event) {\n            if (JSBNG__event.getModifiers().any) {\n                return;\n            }\n        ;\n        ;\n            switch (g.getKeyCode(JSBNG__event)) {\n              case p.DOWN:\n            \n              case p.UP:\n                s.bootstrap(this._triggerElem);\n                break;\n              default:\n                return;\n            };\n        ;\n            JSBNG__event.prevent();\n        }\n    });\n    e.exports = v;\n});\n__d(\"PopoverMenu\", [\"JSBNG__Event\",\"Arbiter\",\"ArbiterMixin\",\"ARIA\",\"BehaviorsMixin\",\"Focus\",\"Keys\",\"KeyStatus\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"Arbiter\"), i = b(\"ArbiterMixin\"), j = b(\"ARIA\"), k = b(\"BehaviorsMixin\"), l = b(\"Focus\"), m = b(\"Keys\"), n = b(\"KeyStatus\"), o = b(\"copyProperties\");\n    function p(q, r, s, t) {\n        this._popover = q;\n        this._triggerElem = r;\n        this._initialMenu = s;\n        q.subscribe(\"init\", this._onLayerInit.bind(this));\n        q.subscribe(\"show\", this._onPopoverShow.bind(this));\n        q.subscribe(\"hide\", this._onPopoverHide.bind(this));\n        g.listen(this._triggerElem, \"keydown\", this._handleKeyEventOnTrigger.bind(this));\n        ((t && this.enableBehaviors(t)));\n    };\n;\n    o(p.prototype, i, k);\n    o(p.prototype, {\n        _popoverShown: false,\n        setMenu: function(q) {\n            this._menu = q;\n            var r = q.getRoot();\n            this._popover.setLayerContent(r);\n            q.subscribe(\"done\", this._onMenuDone.bind(this));\n            if (this._popoverShown) {\n                this._menu.onShow();\n            }\n        ;\n        ;\n            j.owns(this._triggerElem, r);\n            this.inform(\"setMenu\", null, h.BEHAVIOR_PERSISTENT);\n        },\n        getPopover: function() {\n            return this._popover;\n        },\n        getTriggerElem: function() {\n            return this._triggerElem;\n        },\n        getMenu: function() {\n            return this._menu;\n        },\n        _onLayerInit: function() {\n            this.setMenu(this._initialMenu);\n            this._popover.getLayer().subscribe(\"key\", this._handleKeyEvent.bind(this));\n        },\n        _onPopoverShow: function() {\n            if (this._menu) {\n                this._menu.onShow();\n            }\n        ;\n        ;\n            this._popoverShown = true;\n        },\n        _onPopoverHide: function() {\n            if (this._menu) {\n                this._menu.onHide();\n            }\n        ;\n        ;\n            this._popoverShown = false;\n        },\n        _handleKeyEvent: function(q, r) {\n            var s = g.getKeyCode(r);\n            if (((s === m.TAB))) {\n                this._popover.hideLayer();\n                l.set(this._triggerElem);\n                return;\n            }\n        ;\n        ;\n            if (r.getModifiers().any) {\n                return;\n            }\n        ;\n        ;\n            switch (s) {\n              case m.RETURN:\n                return;\n              case m.UP:\n            \n              case m.DOWN:\n                this._menu.handleKeydown(s, r);\n                break;\n              default:\n                if (((this._menu.handleKeydown(s, r) === false))) {\n                    this._menu.JSBNG__blur();\n                    this._menu.handleKeydown(s, r);\n                }\n            ;\n            ;\n                break;\n            };\n        ;\n            r.prevent();\n        },\n        _handleKeyEventOnTrigger: function(q) {\n            var r = g.getKeyCode(q);\n            switch (r) {\n              case m.DOWN:\n            \n              case m.UP:\n                break;\n              default:\n                var s = String.fromCharCode(r).toLowerCase();\n                if (!/^\\s?$/.test(s)) {\n                    this._popover.showLayer();\n                    this._menu.JSBNG__blur();\n                    if (((this._menu.handleKeydown(r, q) === false))) {\n                        this._popover.hideLayer();\n                        l.set(this._triggerElem);\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n            };\n        ;\n        },\n        _onMenuDone: function(q) {\n            this._popover.hideLayer.bind(this._popover).defer();\n            if (n.isKeyDown()) {\n                l.set(this._triggerElem);\n            }\n        ;\n        ;\n        },\n        enable: function() {\n            this._popover.enable();\n        },\n        disable: function() {\n            this._popover.disable();\n        }\n    });\n    e.exports = p;\n});\n__d(\"PopoverAsyncMenu\", [\"JSBNG__Event\",\"AsyncRequest\",\"Class\",\"PopoverMenu\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"AsyncRequest\"), i = b(\"Class\"), j = b(\"PopoverMenu\"), k = b(\"copyProperties\"), l = {\n    }, m = 0;\n    function n(o, p, q, r, s) {\n        this._endpoint = r;\n        this._loadingMenu = q;\n        this._instanceId = m++;\n        l[this._instanceId] = this;\n        this._mouseoverListener = g.listen(p, \"mouseover\", this._fetchMenu.bind(this));\n        this.parent.construct(this, o, p, null, s);\n    };\n;\n    n.setMenu = function(o, p) {\n        l[o].setMenu(p);\n    };\n    n.getInstance = function(o) {\n        return l[o];\n    };\n    i.extend(n, j);\n    k(n.prototype, {\n        _fetched: false,\n        _mouseoverListener: null,\n        _onLayerInit: function() {\n            if (!this._menu) {\n                this.setMenu(this._loadingMenu);\n            }\n        ;\n        ;\n            this._fetchMenu();\n            this._popover.getLayer().subscribe(\"key\", this._handleKeyEvent.bind(this));\n        },\n        _fetchMenu: function() {\n            if (this._fetched) {\n                return;\n            }\n        ;\n        ;\n            new h().setURI(this._endpoint).setData({\n                pmid: this._instanceId\n            }).send();\n            this._fetched = true;\n            if (this._mouseoverListener) {\n                this._mouseoverListener.remove();\n                this._mouseoverListener = null;\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = n;\n});\n__d(\"PopoverMenuInterface\", [\"ArbiterMixin\",\"copyProperties\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"ArbiterMixin\"), h = b(\"copyProperties\"), i = b(\"emptyFunction\");\n    function j() {\n    \n    };\n;\n    h(j.prototype, g, {\n        getRoot: i,\n        onShow: i,\n        onHide: i,\n        focusAnItem: i.thatReturnsFalse,\n        JSBNG__blur: i,\n        handleKeydown: i.thatReturnsFalse,\n        done: function() {\n            this.inform(\"done\");\n        }\n    });\n    e.exports = j;\n});\n__d(\"PopoverMenuOverlappingBorder\", [\"CSS\",\"DOM\",\"Style\",\"copyProperties\",\"cx\",\"shield\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSS\"), h = b(\"DOM\"), i = b(\"Style\"), j = b(\"copyProperties\"), k = b(\"cx\"), l = b(\"shield\");\n    function m(n) {\n        this._popoverMenu = n;\n        this._popover = n.getPopover();\n        this._triggerElem = n.getTriggerElem();\n    };\n;\n    j(m.prototype, {\n        _shortBorder: null,\n        _setMenuSubscription: null,\n        _showSubscription: null,\n        _menuSubscription: null,\n        enable: function() {\n            this._setMenuSubscription = this._popoverMenu.subscribe(\"setMenu\", l(this._onSetMenu, this));\n        },\n        disable: function() {\n            this._popoverMenu.unsubscribe(this._setMenuSubscription);\n            this._setMenuSubscription = null;\n            this._removeBorderSubscriptions();\n            this._removeShortBorder();\n        },\n        _onSetMenu: function() {\n            this._removeBorderSubscriptions();\n            this._menu = this._popoverMenu.getMenu();\n            this._renderShortBorder(this._menu.getRoot());\n            this._showSubscription = this._popover.subscribe(\"show\", l(this._updateBorder, this));\n            this._menuSubscription = this._menu.subscribe([\"change\",\"resize\",], l(Function.prototype.defer, l(this._updateBorder, this)));\n            this._updateBorder();\n        },\n        _updateBorder: function() {\n            var n = this._menu.getRoot(), o = this._triggerElem.offsetWidth, p = Math.max(((n.offsetWidth - o)), 0);\n            i.set(this._shortBorder, \"width\", ((p + \"px\")));\n        },\n        _renderShortBorder: function(n) {\n            this._shortBorder = h.create(\"div\", {\n                className: \"_54hx\"\n            });\n            h.appendContent(n, this._shortBorder);\n            g.addClass(n, \"_54hy\");\n        },\n        _removeShortBorder: function() {\n            if (this._shortBorder) {\n                h.remove(this._shortBorder);\n                this._shortBorder = null;\n                g.removeClass(this._popoverMenu.getMenu().getRoot(), \"_54hy\");\n            }\n        ;\n        ;\n        },\n        _removeBorderSubscriptions: function() {\n            if (this._showSubscription) {\n                this._popover.unsubscribe(this._showSubscription);\n                this._showSubscription = null;\n            }\n        ;\n        ;\n            if (this._menuSubscription) {\n                this._menu.unsubscribe(this._menuSubscription);\n                this._menuSubscription = null;\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = m;\n});\n__d(\"PostLoadJS\", [\"Bootloader\",\"Run\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"Bootloader\"), h = b(\"Run\"), i = b(\"emptyFunction\");\n    function j(l, m) {\n        h.onAfterLoad(function() {\n            g.loadModules.call(g, [l,], m);\n        });\n    };\n;\n    var k = {\n        loadAndRequire: function(l) {\n            j(l, i);\n        },\n        loadAndCall: function(l, m, n) {\n            j(l, function(o) {\n                o[m].apply(o, n);\n            });\n        }\n    };\n    e.exports = k;\n});\n__d(\"ContextualLayerDimensions\", [\"DOM\",\"Locale\",\"JSBNG__Rect\",\"Vector\",\"ViewportBounds\",\"ge\",\"getOverlayZIndex\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOM\"), h = b(\"Locale\"), i = b(\"JSBNG__Rect\"), j = b(\"Vector\"), k = b(\"ViewportBounds\"), l = b(\"ge\"), m = b(\"getOverlayZIndex\"), n = {\n        getViewportRect: function(o) {\n            var p = l(\"globalContainer\"), q = o.getContext(), r = ((((p && g.contains(p, q))) || ((m(q) < 300)))), s = i.getViewportBounds();\n            if (r) {\n                s.t += k.getTop();\n                if (h.isRTL()) {\n                    s.r -= k.getLeft();\n                    s.l += k.getRight();\n                }\n                 else {\n                    s.r -= k.getRight();\n                    s.l += k.getLeft();\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            return s;\n        },\n        getLayerRect: function(o, p) {\n            var q = o.getContextBounds(\"viewport\"), r = o.simulateOrientation(p, function() {\n                return j.getElementDimensions(o.getContent());\n            }), s = ((q.t + p.getOffsetY()));\n            if (((p.getPosition() === \"above\"))) {\n                s -= r.y;\n            }\n             else if (((p.getPosition() === \"below\"))) {\n                s += ((q.b - q.t));\n            }\n            \n        ;\n        ;\n            var t = ((q.l + p.getOffsetX())), u = ((q.r - q.l));\n            if (p.isVertical()) {\n                var v = p.getAlignment();\n                if (((v === \"center\"))) {\n                    t += ((((u - r.x)) / 2));\n                }\n                 else if (((((v === \"right\")) !== h.isRTL()))) {\n                    t += ((u - r.x));\n                }\n                \n            ;\n            ;\n            }\n             else if (((((p.getPosition() === \"right\")) !== h.isRTL()))) {\n                t += u;\n            }\n             else t -= r.x;\n            \n        ;\n        ;\n            return new i(s, ((t + r.x)), ((s + r.y)), t, \"viewport\");\n        }\n    };\n    e.exports = n;\n});\n__d(\"ContextualLayerAutoFlip\", [\"ContextualLayerDimensions\",\"DOM\",\"Vector\",\"arrayContains\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"ContextualLayerDimensions\"), h = b(\"DOM\"), i = b(\"Vector\"), j = b(\"arrayContains\"), k = b(\"copyProperties\");\n    function l(m) {\n        this._layer = m;\n    };\n;\n    k(l.prototype, {\n        _subscription: null,\n        enable: function() {\n            this._subscription = this._layer.subscribe(\"adjust\", this._adjustOrientation.bind(this));\n            if (this._layer.isShown()) {\n                this._layer.updatePosition();\n            }\n        ;\n        ;\n        },\n        disable: function() {\n            this._subscription.unsubscribe();\n            this._subscription = null;\n            if (this._layer.isShown()) {\n                this._layer.updatePosition();\n            }\n        ;\n        ;\n        },\n        _adjustOrientation: function(m, n) {\n            var o = this._getValidPositions(n);\n            if (!o.length) {\n                n.invalidate();\n                return;\n            }\n        ;\n        ;\n            var p = g.getViewportRect(this._layer), q = this._getValidAlignments(n), r, s, t;\n            for (r = 0; ((r < q.length)); r++) {\n                n.setAlignment(q[r]);\n                for (s = 0; ((s < o.length)); s++) {\n                    n.setPosition(o[s]);\n                    t = g.getLayerRect(this._layer, n);\n                    if (p.contains(t)) {\n                        return;\n                    }\n                ;\n                ;\n                };\n            ;\n            };\n        ;\n            n.setPosition(((j(o, \"below\") ? \"below\" : o[0])));\n            for (r = 0; ((r < q.length)); r++) {\n                n.setAlignment(q[r]);\n                t = g.getLayerRect(this._layer, n);\n                if (((((t.l >= p.l)) && ((t.r <= p.r))))) {\n                    return;\n                }\n            ;\n            ;\n            };\n        ;\n            n.setAlignment(q[0]);\n        },\n        _getValidPositions: function(m) {\n            var n = [m.getPosition(),m.getOppositePosition(),], o = this._layer.getContextScrollParent();\n            if (((((o === window)) || ((o === h.getDocumentScrollElement()))))) {\n                return n;\n            }\n        ;\n        ;\n            var p = this._layer.getContext(), q = i.getElementPosition(o, \"viewport\").y, r = i.getElementPosition(p, \"viewport\").y;\n            if (m.isVertical()) {\n                return n.filter(function(t) {\n                    if (((t === \"above\"))) {\n                        return ((r >= q));\n                    }\n                     else {\n                        var u = ((q + o.offsetHeight)), v = ((r + p.offsetHeight));\n                        return ((v <= u));\n                    }\n                ;\n                ;\n                });\n            }\n             else {\n                var s = ((q + o.offsetHeight));\n                if (((((r >= q)) && ((((r + p.offsetHeight)) <= s))))) {\n                    return n;\n                }\n                 else return []\n            ;\n            }\n        ;\n        ;\n        },\n        _getValidAlignments: function(m) {\n            var n = [\"left\",\"right\",\"center\",], o = m.getAlignment(), p = n.indexOf(o);\n            if (((p > 0))) {\n                n.splice(p, 1);\n                n.unshift(o);\n            }\n        ;\n        ;\n            return n;\n        }\n    });\n    e.exports = l;\n});\n__d(\"Tooltip\", [\"JSBNG__Event\",\"AsyncRequest\",\"ContextualLayer\",\"ContextualLayerAutoFlip\",\"CSS\",\"DataStore\",\"DOM\",\"Style\",\"URI\",\"copyProperties\",\"emptyFunction\",\"cx\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"AsyncRequest\"), i = b(\"ContextualLayer\"), j = b(\"ContextualLayerAutoFlip\"), k = b(\"CSS\"), l = b(\"DataStore\"), m = b(\"DOM\"), n = b(\"Style\"), o = b(\"URI\"), p = b(\"copyProperties\"), q = b(\"emptyFunction\"), r = b(\"cx\"), s = b(\"tx\"), t = null, u = null, v = null, w = [], x;\n    function y() {\n        if (!u) {\n            v = m.create(\"div\", {\n                className: \"tooltipContent\"\n            });\n            var fa = m.create(\"i\", {\n                className: \"arrow\"\n            }), ga = m.create(\"div\", {\n                className: \"uiTooltipX\"\n            }, [v,fa,]);\n            u = new i({\n            }, ga);\n            u.shouldSetARIAProperties(false);\n            u.enableBehavior(j);\n        }\n    ;\n    ;\n    };\n;\n    function z(fa) {\n        return p({\n            JSBNG__content: fa.getAttribute(\"aria-label\"),\n            position: ((fa.getAttribute(\"data-tooltip-position\") || \"above\")),\n            alignH: ((fa.getAttribute(\"data-tooltip-alignh\") || \"left\"))\n        }, l.get(fa, \"tooltip\"));\n    };\n;\n    function aa(fa, ga) {\n        var ha = z(fa);\n        l.set(fa, \"tooltip\", {\n            JSBNG__content: ((ga.JSBNG__content || ha.JSBNG__content)),\n            position: ((ga.position || ha.position)),\n            alignH: ((ga.alignH || ha.alignH)),\n            suspend: ((ga.suspend || ha.suspend))\n        });\n        fa.setAttribute(\"data-hover\", \"tooltip\");\n    };\n;\n    function ba(fa, ga) {\n        ea.set(fa, \"Loading...\");\n        new h(ga).setHandler(function(ha) {\n            ea.set(fa, ha.getPayload());\n        }).setErrorHandler(q).send();\n    };\n;\n    var ca = /(\\r\\n|[\\r\\n])/;\n    function da(fa) {\n        return fa.split(ca).map(function(ga) {\n            return ((ca.test(ga) ? m.create(\"br\") : ga));\n        });\n    };\n;\n    var ea = {\n        process: function(fa, ga) {\n            if (!m.contains(fa, ga)) {\n                return;\n            }\n        ;\n        ;\n            if (((((fa !== t)) && !fa.getAttribute(\"data-tooltip-suspend\")))) {\n                var ha = fa.getAttribute(\"data-tooltip-uri\");\n                if (ha) {\n                    fa.removeAttribute(\"data-tooltip-uri\");\n                    ba(fa, ha);\n                }\n            ;\n            ;\n                ea.show(fa);\n            }\n        ;\n        ;\n        },\n        remove: function(fa) {\n            l.remove(fa, \"tooltip\");\n            fa.removeAttribute(\"data-hover\");\n            fa.removeAttribute(\"data-tooltip-position\");\n            fa.removeAttribute(\"data-tooltip-alignh\");\n            ((((fa === t)) && ea.hide()));\n        },\n        suspend: function(fa) {\n            fa.setAttribute(\"data-tooltip-suspend\", true);\n            ((((fa === t)) && ea.hide()));\n        },\n        unsuspend: function(fa) {\n            fa.removeAttribute(\"data-tooltip-suspend\");\n        },\n        hide: function() {\n            if (t) {\n                u.hide();\n                t = null;\n                while (w.length) {\n                    w.pop().remove();\n                ;\n                };\n            ;\n            }\n        ;\n        ;\n        },\n        set: function(fa, ga, ha, ia) {\n            if (((ha || ia))) {\n                aa(fa, {\n                    position: ha,\n                    alignH: ia\n                });\n            }\n        ;\n        ;\n            if (((ga instanceof o))) {\n                if (((fa === t))) {\n                    ba(fa, ga);\n                }\n                 else fa.setAttribute(\"data-tooltip-uri\", ga);\n            ;\n            ;\n            }\n             else {\n                if (((typeof ga !== \"string\"))) {\n                    ga = m.create(\"div\", {\n                    }, ga);\n                    fa.setAttribute(\"aria-label\", m.getText(ga));\n                }\n                 else fa.setAttribute(\"aria-label\", ga);\n            ;\n            ;\n                aa(fa, {\n                    JSBNG__content: ga\n                });\n                ((((fa === t)) && ea.show(fa)));\n            }\n        ;\n        ;\n        },\n        show: function(fa) {\n            y();\n            ea.hide();\n            var ga = z(fa);\n            if (!ga.JSBNG__content) {\n                return;\n            }\n        ;\n        ;\n            var ha = 0, ia = 0;\n            if (((((ga.position === \"left\")) || ((ga.position === \"right\"))))) {\n                x = ((x || k.hasClass(JSBNG__document.body, \"_6nw\")));\n                var ja = ((x ? 28 : 20));\n                ia = ((((fa.offsetHeight - ja)) / 2));\n            }\n             else if (((ga.alignH !== \"center\"))) {\n                var ka = fa.offsetWidth;\n                if (((ka < 18))) {\n                    ha = ((((((ka - 18)) / 2)) * ((((ga.alignH === \"right\")) ? -1 : 1))));\n                }\n            ;\n            ;\n            }\n            \n        ;\n        ;\n            u.setContext(fa).setOffsetX(ha).setOffsetY(ia).setPosition(ga.position).setAlignment(ga.alignH);\n            if (((typeof ga.JSBNG__content === \"string\"))) {\n                k.addClass(u.getRoot(), \"invisible_elem\");\n                var la = m.create(\"span\", {\n                }, da(ga.JSBNG__content)), ma = m.create(\"div\", {\n                    className: \"tooltipText\"\n                }, la);\n                m.setContent(v, ma);\n                u.show();\n                var na;\n                if (ma.getClientRects) {\n                    var oa = ma.getClientRects()[0];\n                    if (oa) {\n                        na = Math.round(((oa.right - oa.left)));\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n                if (!na) {\n                    na = ma.offsetWidth;\n                }\n            ;\n            ;\n                if (((na < la.offsetWidth))) {\n                    k.addClass(ma, \"tooltipWrap\");\n                    u.updatePosition();\n                }\n            ;\n            ;\n                k.removeClass(u.getRoot(), \"invisible_elem\");\n            }\n             else {\n                m.setContent(v, ga.JSBNG__content);\n                u.show();\n            }\n        ;\n        ;\n            var pa = function(ra) {\n                if (!m.contains(t, ra.getTarget())) {\n                    ea.hide();\n                }\n            ;\n            ;\n            };\n            w.push(g.listen(JSBNG__document.documentElement, \"mouseover\", pa), g.listen(JSBNG__document.documentElement, \"focusin\", pa));\n            var qa = n.getScrollParent(fa);\n            if (((qa !== window))) {\n                w.push(g.listen(qa, \"JSBNG__scroll\", ea.hide));\n            }\n        ;\n        ;\n            w.push(g.listen(fa, \"click\", ea.hide));\n            t = fa;\n        }\n    };\n    g.listen(window, \"JSBNG__scroll\", ea.hide);\n    e.exports = ea;\n});\n__d(\"SelectorDeprecated\", [\"JSBNG__Event\",\"Arbiter\",\"Button\",\"ContextualLayer\",\"CSS\",\"DataStore\",\"DOM\",\"Focus\",\"HTML\",\"Keys\",\"KeyStatus\",\"MenuDeprecated\",\"Parent\",\"Style\",\"Toggler\",\"Tooltip\",\"Vector\",\"arrayContains\",\"copyProperties\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"Arbiter\"), i = b(\"Button\"), j = b(\"ContextualLayer\"), k = b(\"CSS\"), l = b(\"DataStore\"), m = b(\"DOM\"), n = b(\"Focus\"), o = b(\"HTML\"), p = b(\"Keys\"), q = b(\"KeyStatus\"), r = b(\"MenuDeprecated\"), s = b(\"Parent\"), t = b(\"Style\"), u = b(\"Toggler\"), v = b(\"Tooltip\"), w = b(\"Vector\"), x = b(\"arrayContains\"), y = b(\"copyProperties\"), z = b(\"emptyFunction\"), aa, ba, ca = [], da;\n    function ea(pa) {\n        return s.byClass(pa, \"uiSelector\");\n    };\n;\n    function fa(pa) {\n        return s.byClass(pa, \"uiSelectorButton\");\n    };\n;\n    function ga() {\n        if (!ba) {\n            ba = new j({\n                position: \"below\"\n            }, m.create(\"div\"));\n            k.addClass(ba.getRoot(), \"uiSelectorContextualLayer\");\n        }\n    ;\n    ;\n        return ba;\n    };\n;\n    function ha(pa) {\n        return m.scry(pa, \"select\")[0];\n    };\n;\n    function ia(pa) {\n        return m.JSBNG__find(pa, \"div.uiSelectorMenuWrapper\");\n    };\n;\n    function ja() {\n        ja = z;\n        r.subscribe(\"select\", function(pa, qa) {\n            if (((((!aa || !qa)) || ((qa.menu !== oa.getSelectorMenu(aa)))))) {\n                return;\n            }\n        ;\n        ;\n            var ra = ka(aa), sa = la(qa.item);\n            if (sa) {\n                var ta = aa, ua = oa.isOptionSelected(qa.item), va = oa.inform(\"select\", {\n                    selector: ta,\n                    option: qa.item,\n                    clone: da\n                });\n                if (((va === false))) {\n                    return;\n                }\n            ;\n            ;\n                if (((ra || !ua))) {\n                    oa.setSelected(ta, oa.getOptionValue(qa.item), !ua);\n                    oa.inform(\"toggle\", {\n                        selector: ta,\n                        option: qa.item\n                    });\n                    oa.inform(\"change\", {\n                        selector: ta\n                    });\n                    h.inform(\"Form/change\", {\n                        node: ta\n                    });\n                    if (ma(ta)) {\n                        l.set(ta, \"dirty\", true);\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            if (((!ra || !sa))) {\n                ((aa && oa.toggle(aa)));\n            }\n        ;\n        ;\n        });\n    };\n;\n    function ka(pa) {\n        return !!pa.getAttribute(\"data-multiple\");\n    };\n;\n    function la(pa) {\n        return k.hasClass(pa, \"uiSelectorOption\");\n    };\n;\n    function ma(pa) {\n        return !!pa.getAttribute(\"data-autosubmit\");\n    };\n;\n    var na = function() {\n        na = z;\n        var pa = {\n            keydown: function(JSBNG__event) {\n                var qa = JSBNG__event.getTarget();\n                if (m.isInputNode(qa)) {\n                    return;\n                }\n            ;\n            ;\n                switch (g.getKeyCode(JSBNG__event)) {\n                  case p.DOWN:\n                \n                  case p.SPACE:\n                \n                  case p.UP:\n                    if (fa(qa)) {\n                        var ra = ea(qa);\n                        oa.toggle(ra);\n                        return false;\n                    }\n                ;\n                ;\n                    break;\n                  case p.ESC:\n                    if (aa) {\n                        var sa = oa.getSelectorButton(aa);\n                        oa.toggle(aa);\n                        ((sa && n.set(sa)));\n                        return false;\n                    }\n                ;\n                ;\n                    break;\n                };\n            ;\n            },\n            mouseover: function(JSBNG__event) {\n                var qa = s.byAttribute(JSBNG__event.getTarget(), \"ajaxify\");\n                if (((qa && k.hasClass(qa, \"uiSelectorButton\")))) {\n                    oa.loadMenu(ea(qa));\n                }\n            ;\n            ;\n            }\n        };\n        g.listen(JSBNG__document.body, pa);\n    };\n    u.subscribe([\"show\",\"hide\",], function(pa, qa) {\n        var ra = ea(qa.getActive());\n        if (ra) {\n            na();\n            ja();\n            var sa = oa.getSelectorButton(ra), ta = oa.getSelectorMenu(ra), ua = ((pa === \"show\"));\n            sa.setAttribute(\"aria-expanded\", ((ua ? \"true\" : \"false\")));\n            if (ua) {\n                aa = ra;\n                if (k.hasClass(sa, \"uiButtonDisabled\")) {\n                    oa.setEnabled(ra, false);\n                    return false;\n                }\n            ;\n            ;\n                ta = ((ta || oa.loadMenu(ra)));\n                var va = t.getScrollParent(ra), wa = ((((va !== window)) && ((va !== m.getDocumentScrollElement()))));\n                if (((wa || k.hasClass(ra, \"uiSelectorUseLayer\")))) {\n                    if (wa) {\n                        ca.push(g.listen(va, \"JSBNG__scroll\", function() {\n                            qa.hide();\n                        }));\n                    }\n                ;\n                ;\n                    da = m.create(\"div\", {\n                        className: ra.className\n                    });\n                    k.addClass(da, \"invisible_elem\");\n                    w.getElementDimensions(ra).setElementDimensions(da);\n                    m.replace(ra, da);\n                    var xa = k.hasClass(ra, \"uiSelectorRight\"), ya = k.hasClass(ra, \"uiSelectorBottomUp\");\n                    ga().setContext(da).setContent(ra).setPosition(((ya ? \"above\" : \"below\"))).setAlignment(((xa ? \"right\" : \"left\"))).show();\n                }\n            ;\n            ;\n                r.register(ta);\n                if (q.isKeyDown()) {\n                    var za = r.getCheckedItems(ta);\n                    if (!za.length) {\n                        za = r.getEnabledItems(ta);\n                    }\n                ;\n                ;\n                    r.focusItem(za[0]);\n                }\n            ;\n            ;\n            }\n             else {\n                aa = null;\n                if (da) {\n                    while (ca.length) {\n                        ca.pop().remove();\n                    ;\n                    };\n                ;\n                    m.replace(da, ra);\n                    ga().hide();\n                    da = null;\n                }\n            ;\n            ;\n                ((ta && r.unregister(ta)));\n                if (((ma(ra) && l.get(ra, \"dirty\")))) {\n                    var ab = m.scry(ra, \"input.submitButton\")[0];\n                    ((ab && ab.click()));\n                    l.remove(ra, \"dirty\");\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            k.conditionClass(oa.getSelectorButton(ra), \"selected\", ua);\n            oa.inform(((ua ? \"open\" : \"close\")), {\n                selector: ra,\n                clone: da\n            });\n        }\n    ;\n    ;\n    });\n    var oa = y(new h(), {\n        attachMenu: function(pa, qa, ra) {\n            pa = ea(pa);\n            if (pa) {\n                ((aa && r.unregister(oa.getSelectorMenu(aa))));\n                m.setContent(ia(pa), qa);\n                ((aa && r.register(oa.getSelectorMenu(pa))));\n                ((da && ga().updatePosition()));\n                if (ra) {\n                    var sa = pa.getAttribute(\"data-name\");\n                    ((sa && ra.setAttribute(\"JSBNG__name\", sa)));\n                    if (!ka(pa)) {\n                        ra.setAttribute(\"multiple\", false);\n                    }\n                ;\n                ;\n                    var ta = ha(pa);\n                    if (ta) {\n                        m.replace(ta, ra);\n                    }\n                     else m.insertAfter(pa.firstChild, ra);\n                ;\n                ;\n                }\n            ;\n            ;\n                return true;\n            }\n        ;\n        ;\n        },\n        getOption: function(pa, qa) {\n            var ra = oa.getOptions(pa), sa = ra.length;\n            while (sa--) {\n                if (((qa === oa.getOptionValue(ra[sa])))) {\n                    return ra[sa];\n                }\n            ;\n            ;\n            };\n        ;\n            return null;\n        },\n        getOptions: function(pa) {\n            var qa = r.getItems(oa.getSelectorMenu(pa));\n            return qa.filter(la);\n        },\n        getEnabledOptions: function(pa) {\n            var qa = r.getEnabledItems(oa.getSelectorMenu(pa));\n            return qa.filter(la);\n        },\n        getSelectedOptions: function(pa) {\n            return r.getCheckedItems(oa.getSelectorMenu(pa));\n        },\n        getOptionText: function(pa) {\n            return r.getItemLabel(pa);\n        },\n        getOptionValue: function(pa) {\n            var qa = ea(pa), ra = ha(qa), sa = oa.getOptions(qa).indexOf(pa);\n            return ((((sa >= 0)) ? ra.options[((sa + 1))].value : \"\"));\n        },\n        getSelectorButton: function(pa) {\n            return m.JSBNG__find(pa, \"a.uiSelectorButton\");\n        },\n        getSelectorMenu: function(pa) {\n            return m.scry(pa, \"div.uiSelectorMenu\")[0];\n        },\n        getValue: function(pa) {\n            var qa = ha(pa);\n            if (!qa) {\n                return null;\n            }\n        ;\n        ;\n            if (!ka(pa)) {\n                return qa.value;\n            }\n        ;\n        ;\n            var ra = [], sa = qa.options;\n            for (var ta = 1, ua = sa.length; ((ta < ua)); ta++) {\n                if (sa[ta].selected) {\n                    ra.push(sa[ta].value);\n                }\n            ;\n            ;\n            };\n        ;\n            return ra;\n        },\n        isOptionSelected: function(pa) {\n            return r.isItemChecked(pa);\n        },\n        listen: function(pa, qa, ra) {\n            return this.subscribe(qa, function(sa, ta) {\n                if (((ta.selector === pa))) {\n                    return ra(ta, sa);\n                }\n            ;\n            ;\n            });\n        },\n        loadMenu: function(pa) {\n            var qa = oa.getSelectorMenu(pa);\n            if (!qa) {\n                var ra = oa.getSelectorButton(pa), sa = ra.getAttribute(\"ajaxify\");\n                if (sa) {\n                    d([\"AsyncRequest\",], function(ua) {\n                        ua.bootstrap(sa, ra);\n                    });\n                    var ta = o(((((((((((((\"\\u003Cdiv class=\\\"uiSelectorMenuWrapper uiToggleFlyout\\\"\\u003E\" + \"\\u003Cdiv class=\\\"uiMenu uiSelectorMenu loading\\\"\\u003E\")) + \"\\u003Cul class=\\\"uiMenuInner\\\"\\u003E\")) + \"\\u003Cli\\u003E\\u003Cspan\\u003E\\u003C/span\\u003E\\u003C/li\\u003E\")) + \"\\u003C/ul\\u003E\")) + \"\\u003C/div\\u003E\")) + \"\\u003C/div\\u003E\")));\n                    m.appendContent(ra.parentNode, ta);\n                    qa = oa.getSelectorMenu(pa);\n                    ra.removeAttribute(\"JSBNG__onmouseover\");\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            return qa;\n        },\n        setButtonLabel: function(pa, qa) {\n            var ra = oa.getSelectorButton(pa), sa = parseInt(ra.getAttribute(\"data-length\"), 10);\n            qa = ((((qa || ra.getAttribute(\"data-label\"))) || \"\"));\n            i.setLabel(ra, qa);\n            if (((typeof qa === \"string\"))) {\n                k.conditionClass(ra, \"uiSelectorBigButtonLabel\", ((qa.length > sa)));\n                if (((sa && ((qa.length > sa))))) {\n                    ra.setAttribute(\"title\", qa);\n                }\n                 else ra.removeAttribute(\"title\");\n            ;\n            ;\n            }\n        ;\n        ;\n        },\n        setButtonTooltip: function(pa, qa) {\n            var ra = oa.getSelectorButton(pa), sa = s.byTag(ra, \"a\");\n            ((sa && v.set(sa, ((((qa || ra.getAttribute(\"data-tooltip\"))) || \"\")))));\n        },\n        updateButtonARIALabel: function(pa, qa) {\n            var ra = oa.getSelectorButton(pa), sa = s.byTag(ra, \"a\");\n            if (sa) {\n                var ta = ra.getAttribute(\"data-ariaprefix\");\n                if (ta) {\n                    ra.setAttribute(\"aria-label\", ((((ta + \": \")) + qa)));\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n        },\n        setEnabled: function(pa, qa) {\n            if (((((!qa && aa)) && ((ea(pa) === aa))))) {\n                oa.toggle(pa);\n            }\n        ;\n        ;\n            i.setEnabled(oa.getSelectorButton(pa), qa);\n        },\n        setOptionEnabled: function(pa, qa) {\n            r.setItemEnabled(pa, qa);\n        },\n        setSelected: function(pa, qa, ra) {\n            ra = ((ra !== false));\n            var sa = oa.getOption(pa, qa);\n            if (!sa) {\n                return;\n            }\n        ;\n        ;\n            var ta = oa.isOptionSelected(sa);\n            if (((ra !== ta))) {\n                if (((!ka(pa) && !ta))) {\n                    var ua = oa.getSelectedOptions(pa)[0];\n                    ((ua && r.toggleItem(ua)));\n                }\n            ;\n            ;\n                r.toggleItem(sa);\n            }\n        ;\n        ;\n            oa.updateSelector(pa);\n        },\n        toggle: function(pa) {\n            u.toggle(m.scry(ea(pa), \"div.wrap\")[0]);\n        },\n        updateSelector: function(pa) {\n            var qa = oa.getOptions(pa), ra = oa.getSelectedOptions(pa), sa = ha(pa).options, ta = [], ua = [];\n            for (var va = 0, wa = qa.length; ((va < wa)); va++) {\n                var xa = x(ra, qa[va]);\n                sa[((va + 1))].selected = xa;\n                if (xa) {\n                    var ya = oa.getOptionText(qa[va]);\n                    ta.push(ya);\n                    ua.push(((qa[va].getAttribute(\"data-tooltip\") || ya)));\n                }\n            ;\n            ;\n            };\n        ;\n            sa[0].selected = !ra.length;\n            var za = k.hasClass(pa, \"uiSelectorDynamicLabel\"), ab = k.hasClass(pa, \"uiSelectorDynamicTooltip\");\n            if (((za || ab))) {\n                var bb = \"\";\n                if (ka(pa)) {\n                    var cb = oa.getSelectorButton(pa);\n                    bb = ((cb.getAttribute(\"data-delimiter\") || \", \"));\n                }\n            ;\n            ;\n                ta = ta.join(bb);\n                ua = ua.join(bb);\n                if (za) {\n                    oa.setButtonLabel(pa, ta);\n                    oa.updateButtonARIALabel(pa, ta);\n                }\n            ;\n            ;\n                ((ab && oa.setButtonTooltip(pa, ua)));\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = oa;\n});\n__d(\"SubscriptionsHandler\", [\"JSLogger\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSLogger\"), h = b(\"copyProperties\"), i = g.create(\"subscriptions_handler\");\n    function j(k) {\n        this._name = ((k || \"unnamed\"));\n        this._subscriptions = [];\n    };\n;\n    h(j.prototype, {\n        addSubscriptions: function() {\n            if (this._subscriptions) {\n                Array.prototype.push.apply(this._subscriptions, arguments);\n            }\n             else {\n                i.warn(((this._name + \".subscribe_while_released\")));\n                for (var k = 0, l = arguments.length; ((k < l)); k++) {\n                    this._unsubscribe(arguments[k]);\n                ;\n                };\n            ;\n            }\n        ;\n        ;\n        },\n        engage: function() {\n            this._subscriptions = ((this._subscriptions || []));\n        },\n        release: function() {\n            if (this._subscriptions) {\n                this._subscriptions.forEach(this._unsubscribe.bind(this));\n            }\n        ;\n        ;\n            this._subscriptions = null;\n        },\n        _unsubscribe: function(k) {\n            if (k.remove) {\n                k.remove();\n            }\n             else if (k.reset) {\n                k.reset();\n            }\n             else if (k.unsubscribe) {\n                k.unsubscribe();\n            }\n             else i.error(((this._name + \".invalid\")), k);\n            \n            \n        ;\n        ;\n        }\n    });\n    e.exports = j;\n});\n__d(\"UserActivity\", [\"Arbiter\",\"JSBNG__Event\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"JSBNG__Event\"), i = 5000, j = 500, k = -5, l = JSBNG__Date.now(), m = l, n = {\n        subscribeOnce: function(p) {\n            var q = n.subscribe(function() {\n                n.unsubscribe(q);\n                p();\n            });\n        },\n        subscribe: function(p) {\n            return g.subscribe(\"useractivity/activity\", p);\n        },\n        unsubscribe: function(p) {\n            p.unsubscribe();\n        },\n        isActive: function(p) {\n            return ((((new JSBNG__Date() - l)) < ((p || i))));\n        },\n        getLastInformTime: function() {\n            return m;\n        }\n    };\n    function o(JSBNG__event) {\n        l = JSBNG__Date.now();\n        var p = ((l - m));\n        if (((p > j))) {\n            m = l;\n            g.inform(\"useractivity/activity\", {\n                JSBNG__event: JSBNG__event,\n                idleness: p,\n                last_inform: m\n            });\n        }\n         else if (((p < k))) {\n            m = l;\n        }\n        \n    ;\n    ;\n    };\n;\n    h.listen(window, \"JSBNG__scroll\", o);\n    h.listen(window, \"JSBNG__focus\", o);\n    h.listen(JSBNG__document.documentElement, {\n        DOMMouseScroll: o,\n        mousewheel: o,\n        keydown: o,\n        mouseover: o,\n        mousemove: o,\n        click: o\n    });\n    g.subscribe(\"Event/stop\", function(p, q) {\n        o(q.JSBNG__event);\n    });\n    e.exports = n;\n});\n__d(\"enforceMaxLength\", [\"JSBNG__Event\",\"function-extensions\",\"DOM\",\"Input\",\"InputSelection\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\");\n    b(\"function-extensions\");\n    var h = b(\"DOM\"), i = b(\"Input\"), j = b(\"InputSelection\"), k = function(n, o) {\n        var p = i.getValue(n), q = p.length, r = ((q - o));\n        if (((r > 0))) {\n            var s, t;\n            try {\n                s = j.get(n);\n                t = s.end;\n            } catch (u) {\n                s = null;\n                t = 0;\n            };\n        ;\n            if (((t >= r))) {\n                q = t;\n            }\n        ;\n        ;\n            var v = ((q - r));\n            if (((v && ((((p.charCodeAt(((v - 1))) & 64512)) === 55296))))) {\n                v--;\n            }\n        ;\n        ;\n            t = Math.min(t, v);\n            i.setValue(n, ((p.slice(0, v) + p.slice(q))));\n            if (s) {\n                j.set(n, Math.min(s.start, t), t);\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n    }, l = function(JSBNG__event) {\n        var n = JSBNG__event.getTarget(), o = ((n.getAttribute && parseInt(n.getAttribute(\"maxlength\"), 10)));\n        if (((((o > 0)) && h.isNodeOfType(n, [\"input\",\"textarea\",])))) {\n            k.bind(null, n, o).defer();\n        }\n    ;\n    ;\n    }, m = ((((\"maxLength\" in h.create(\"input\"))) && ((\"maxLength\" in h.create(\"textarea\")))));\n    if (!m) {\n        g.listen(JSBNG__document.documentElement, {\n            keydown: l,\n            paste: l\n        });\n    }\n;\n;\n    e.exports = k;\n});\n__d(\"guid\", [], function(a, b, c, d, e, f) {\n    function g() {\n        return ((\"f\" + ((Math.JSBNG__random() * ((1 << 30)))).toString(16).replace(\".\", \"\")));\n    };\n;\n    e.exports = g;\n});\n__d(\"reportData\", [\"EagleEye\",\"userAction\",], function(a, b, c, d, e, f) {\n    var g = b(\"EagleEye\"), h = b(\"userAction\");\n    function i(j, k) {\n        k = ((k || {\n        }));\n        var l = {\n            ft: ((k.ft || {\n            })),\n            gt: ((k.gt || {\n            }))\n        }, m = \"-\", n = a.ArbiterMonitor, o = (((!!n) ? n.getActFields() : [])), p = (((!n) ? \"r\" : \"a\")), q = [JSBNG__Date.now(),h.getCurrentUECount(),m,j,m,m,p,((a.URI ? a.URI.getRequestURI(true, true).getUnqualifiedURI().toString() : ((((JSBNG__location.pathname + JSBNG__location.search)) + JSBNG__location.hash)))),l,0,0,0,0,].concat(o);\n        g.log(\"act\", q);\n    };\n;\n    e.exports = i;\n});\n__d(\"NetEgo\", [\"Arbiter\",\"CSS\",\"DOM\",\"URI\",\"ge\",\"Animation\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"CSS\"), i = b(\"DOM\"), j = b(\"URI\"), k = b(\"ge\"), l = b(\"Animation\"), m = {\n        setup: function(n) {\n            g.subscribe([\"page/liked\",\"FriendRequest/sending\",], function(o, p) {\n                if (((((n == p.id)) || ((n == p.uid))))) {\n                    var q = k(JSBNG__document.body, \".ego_unit_container\");\n                    if (q) {\n                        var r = i.scry(q, \".ego_unit\"), s = r.length;\n                        for (var t = 0; ((t < s)); t++) {\n                            var u = r[t].getAttribute(\"data-ego-fbid\");\n                            if (((((u == p.id)) || ((u == p.uid))))) {\n                                var v = i.JSBNG__find(r[t], \".ego_action a\");\n                                if (v) {\n                                    v.click();\n                                }\n                            ;\n                            ;\n                                break;\n                            }\n                        ;\n                        ;\n                        };\n                    ;\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n            });\n        },\n        updateXids: function(n, o) {\n            if (((((n.length == 0)) && ((o.length == 0))))) {\n                return;\n            }\n        ;\n        ;\n            var p = function(z) {\n                return function(aa) {\n                    var ba = aa.getAttribute(z);\n                    if (!ba) {\n                        return false;\n                    }\n                ;\n                ;\n                    var ca = new j(ba).getQueryData();\n                    return !!ca.xids;\n                };\n            }, q = i.scry(JSBNG__document.body, \".ego_unit a\");\n            q = q.filter(p(\"ajaxify\"));\n            if (((q.length == 0))) {\n                return;\n            }\n        ;\n        ;\n            var r = new j(q[0].getAttribute(\"ajaxify\")), s = r.getQueryData();\n            if (!s.xids) {\n                return;\n            }\n        ;\n        ;\n            try {\n                var u = JSON.parse(s.xids);\n            } catch (t) {\n                return;\n            };\n        ;\n            for (var v = 0; ((v < n.length)); ++v) {\n                delete u[n[v]];\n            ;\n            };\n        ;\n            for (v = 0; ((v < o.length)); ++v) {\n                u[o[v]] = 1;\n            ;\n            };\n        ;\n            var w = JSON.stringify(u), x = function(z, aa) {\n                r = new j(z.getAttribute(aa));\n                s = r.getQueryData();\n                s.xids = w;\n                r.setQueryData(s);\n                z.setAttribute(aa, r.toString());\n            };\n            for (v = 0; ((v < q.length)); ++v) {\n                x(q[v], \"ajaxify\");\n            ;\n            };\n        ;\n            var y = i.scry(JSBNG__document.body, \".ego_unit form\");\n            y = y.filter(p(\"action\"));\n            for (v = 0; ((v < y.length)); ++v) {\n                x(y[v], \"action\");\n            ;\n            };\n        ;\n        },\n        replaceUnit: function(n, o, p, q) {\n            var r = i.insertAfter(n, o);\n            r.forEach(h.hide);\n            if (((((q !== undefined)) && ((q !== null))))) {\n                (function() {\n                    m._replaceUnitFadeout(n, r, p);\n                }).defer(q);\n            }\n             else m._replaceUnitFadeout(n, r, p);\n        ;\n        ;\n        },\n        _replaceUnitFadeout: function(n, o, p) {\n            if (p) {\n                new l(n).from(\"opacity\", 1).to(\"opacity\", 0).duration(p).checkpoint(1, function() {\n                    m._replaceUnitElement(n, o);\n                }).go();\n            }\n             else m._replaceUnitElement(n, o);\n        ;\n        ;\n        },\n        _replaceUnitElement: function(n, o) {\n            i.remove(n);\n            o.forEach(h.show);\n            g.inform(\"netego_replacedUnit\");\n            m.clearHeader();\n        },\n        clearHeader: function() {\n            var n = i.scry(JSBNG__document.body, \".ego_column\"), o = [];\n            for (var p = 0; ((p < n.length)); ++p) {\n                o = o.concat(i.scry(n[p], \".uiHeader\"));\n            ;\n            };\n        ;\n            for (p = 0; ((p < o.length)); ++p) {\n                var q = o[p].nextSibling;\n                if (((!q || ((q.childNodes.length === 0))))) {\n                    i.remove(o[p]);\n                }\n                 else if (((q.childNodes.length === 1))) {\n                    var r = q.childNodes[0];\n                    if (((h.hasClass(r, \"ego_appended_units\") && ((r.childNodes.length === 0))))) {\n                        i.remove(o[p]);\n                    }\n                ;\n                ;\n                }\n                \n            ;\n            ;\n            };\n        ;\n        }\n    };\n    e.exports = m;\n});\n__d(\"ControlledReferer\", [\"JSBNG__Event\",\"URI\",\"UserAgent\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"URI\"), i = b(\"UserAgent\"), j = {\n        useFacebookReferer: function(k, l, m) {\n            var n = false;\n            function o() {\n                if (n) {\n                    return;\n                }\n            ;\n            ;\n                var q = k.contentWindow.JSBNG__location.pathname;\n                if (((((q !== \"/intern/common/referer_frame.php\")) && ((q !== \"/common/referer_frame.php\"))))) {\n                    return;\n                }\n            ;\n            ;\n                n = true;\n                k.contentWindow.JSBNG__document.body.style.margin = 0;\n                l();\n            };\n        ;\n            var p;\n            if (((JSBNG__document.domain !== \"facebook.com\"))) {\n                p = \"/intern/common/referer_frame.php\";\n            }\n             else if (i.JSBNG__opera()) {\n                p = \"/common/referer_frame.php\";\n            }\n             else if (h().isSecure()) {\n                p = \"https://s-static.ak.facebook.com/common/referer_frame.php\";\n            }\n             else p = \"http://static.ak.facebook.com/common/referer_frame.php\";\n            \n            \n        ;\n        ;\n            if (m) {\n                p += ((\"?fb_source=\" + m));\n            }\n        ;\n        ;\n            g.listen(k, \"load\", o);\n            k.src = p;\n        },\n        useFacebookRefererHtml: function(k, l, m) {\n            j.useFacebookReferer(k, function() {\n                k.contentWindow.JSBNG__document.body.innerHTML = l;\n            }, m);\n        }\n    };\n    e.exports = j;\n});\n__d(\"UIIntentionalStreamMessage\", [], function(a, b, c, d, e, f) {\n    var g = {\n        SET_AUTO_INSERT: \"UIIntentionalStream/setAutoInsert\",\n        UPDATE_STREAM: \"UIIntentionalStreamRefresh/updateStream\",\n        REFRESH_STREAM: \"UIIntentionalStreamRefresh/refreshStream\",\n        UPDATE_AUTOREFRESH_CONFIG: \"UIIntentionalStream/updateAutoRefreshConfig\",\n        UPDATE_HTML_CONTENT: \"UIIntentionalStream/updateHtmlContent\",\n        UPDATE_LAST_REFRESH_TIME: \"UIIntentionalStream/updateLastRefreshTime\",\n        INSERT_STORIES: \"UIIntentionalStream/updateLastRefreshTime\",\n        UNLOAD: \"UIIntentionalStream/unload\"\n    };\n    e.exports = g;\n});\n__d(\"UIPagelet\", [\"AjaxPipeRequest\",\"AsyncRequest\",\"DOM\",\"HTML\",\"ScriptPathState\",\"URI\",\"copyProperties\",\"emptyFunction\",\"ge\",], function(a, b, c, d, e, f) {\n    var g = b(\"AjaxPipeRequest\"), h = b(\"AsyncRequest\"), i = b(\"DOM\"), j = b(\"HTML\"), k = b(\"ScriptPathState\"), l = b(\"URI\"), m = b(\"copyProperties\"), n = b(\"emptyFunction\"), o = b(\"ge\");\n    function p(q, r, s) {\n        var t = ((((q && i.isElementNode(q))) ? q.id : q));\n        this._id = ((t || null));\n        this._element = o(((q || i.create(\"div\"))));\n        this._src = ((r || null));\n        this._context_data = ((s || {\n        }));\n        this._data = {\n        };\n        this._handler = n;\n        this._request = null;\n        this._use_ajaxpipe = false;\n        this._is_bundle = true;\n        this._allow_cross_page_transition = false;\n        this._append = false;\n    };\n;\n    p.loadFromEndpoint = function(q, r, s, t) {\n        t = ((t || {\n        }));\n        var u = ((\"/ajax/pagelet/generic.php/\" + q));\n        if (t.intern) {\n            u = ((\"/intern\" + u));\n        }\n    ;\n    ;\n        var v = new l(u.replace(/\\/+/g, \"/\"));\n        if (t.subdomain) {\n            v.setSubdomain(t.subdomain);\n        }\n    ;\n    ;\n        var w = new p(r, v, s).setUseAjaxPipe(t.usePipe).setBundleOption(((t.bundle !== false))).setAppend(t.append).setJSNonBlock(t.jsNonblock).setAutomatic(t.automatic).setDisplayCallback(t.displayCallback).setConstHeight(t.constHeight).setAllowCrossPageTransition(t.crossPage).setFinallyHandler(((t.finallyHandler || n))).setTransportErrorHandler(t.transportErrorHandler);\n        ((t.handler && w.setHandler(t.handler)));\n        w.go();\n        return w;\n    };\n    m(p.prototype, {\n        getElement: function() {\n            return this._element;\n        },\n        setHandler: function(q) {\n            this._handler = q;\n            return this;\n        },\n        go: function(q, r) {\n            if (((((arguments.length >= 2)) || ((typeof q == \"string\"))))) {\n                this._src = q;\n                this._data = ((r || {\n                }));\n            }\n             else if (((arguments.length == 1))) {\n                this._data = q;\n            }\n            \n        ;\n        ;\n            this.refresh();\n            return this;\n        },\n        setAllowCrossPageTransition: function(q) {\n            this._allow_cross_page_transition = q;\n            return this;\n        },\n        setBundleOption: function(q) {\n            this._is_bundle = q;\n            return this;\n        },\n        setTransportErrorHandler: function(q) {\n            this.transportErrorHandler = q;\n            return this;\n        },\n        refresh: function() {\n            if (this._use_ajaxpipe) {\n                k.setIsUIPageletRequest(true);\n                this._request = new g();\n                this._request.setCanvasId(this._id).setAppend(this._append).setConstHeight(this._constHeight).setJSNonBlock(this._jsNonblock).setAutomatic(this._automatic).setDisplayCallback(this._displayCallback).setFinallyHandler(this._finallyHandler);\n            }\n             else {\n                var q = function(t) {\n                    this._request = null;\n                    var u = j(t.getPayload());\n                    if (this._append) {\n                        i.appendContent(this._element, u);\n                    }\n                     else i.setContent(this._element, u);\n                ;\n                ;\n                    this._handler();\n                }.bind(this), r = this._displayCallback;\n                this._request = new h().setMethod(\"GET\").setReadOnly(true).setOption(\"bundle\", this._is_bundle).setHandler(function(t) {\n                    if (r) {\n                        r(q.curry(t));\n                    }\n                     else q(t);\n                ;\n                ;\n                    if (this._finallyHandler) {\n                        this._finallyHandler();\n                    }\n                ;\n                ;\n                });\n                if (this.transportErrorHandler) {\n                    this._request.setTransportErrorHandler(this.transportErrorHandler);\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            var s = {\n            };\n            m(s, this._context_data);\n            m(s, this._data);\n            this._request.setURI(this._src).setAllowCrossPageTransition(this._allow_cross_page_transition).setData({\n                data: JSON.stringify(s)\n            }).send();\n            return this;\n        },\n        cancel: function() {\n            if (this._request) {\n                this._request.abort();\n            }\n        ;\n        ;\n        },\n        setUseAjaxPipe: function(q) {\n            this._use_ajaxpipe = !!q;\n            return this;\n        },\n        setAppend: function(q) {\n            this._append = !!q;\n            return this;\n        },\n        setJSNonBlock: function(q) {\n            this._jsNonblock = !!q;\n            return this;\n        },\n        setAutomatic: function(q) {\n            this._automatic = !!q;\n            return this;\n        },\n        setDisplayCallback: function(q) {\n            this._displayCallback = q;\n            return this;\n        },\n        setConstHeight: function(q) {\n            this._constHeight = !!q;\n            return this;\n        },\n        setFinallyHandler: function(q) {\n            this._finallyHandler = q;\n            return this;\n        }\n    });\n    e.exports = p;\n});\n__d(\"ScrollableArea\", [\"Animation\",\"ArbiterMixin\",\"BrowserSupport\",\"CSS\",\"DataStore\",\"DOM\",\"JSBNG__Event\",\"Parent\",\"Run\",\"SimpleDrag\",\"Style\",\"UserAgent\",\"Vector\",\"copyProperties\",\"throttle\",], function(a, b, c, d, e, f) {\n    var g = b(\"Animation\"), h = b(\"ArbiterMixin\"), i = b(\"BrowserSupport\"), j = b(\"CSS\"), k = b(\"DataStore\"), l = b(\"DOM\"), m = b(\"JSBNG__Event\"), n = b(\"Parent\"), o = b(\"Run\"), p = b(\"SimpleDrag\"), q = b(\"Style\"), r = b(\"UserAgent\"), s = b(\"Vector\"), t = b(\"copyProperties\"), u = b(\"throttle\"), v = 12;\n    function w(x, y) {\n        if (!x) {\n            return;\n        }\n    ;\n    ;\n        y = ((y || {\n        }));\n        this._elem = x;\n        this._wrap = l.JSBNG__find(x, \"div.uiScrollableAreaWrap\");\n        this._body = l.JSBNG__find(this._wrap, \"div.uiScrollableAreaBody\");\n        this._content = l.JSBNG__find(this._body, \"div.uiScrollableAreaContent\");\n        this._track = l.JSBNG__find(x, \"div.uiScrollableAreaTrack\");\n        this._gripper = l.JSBNG__find(this._track, \"div.uiScrollableAreaGripper\");\n        this._options = y;\n        this._throttledComputeHeights = u.withBlocking(this._computeHeights, 250, this);\n        this.throttledAdjustGripper = u.withBlocking(this.adjustGripper, 250, this);\n        this._throttledShowGripperAndShadows = u.withBlocking(this._showGripperAndShadows, 250, this);\n        this._throttledRespondMouseMove = u(this._respondMouseMove, 250, this);\n        this.adjustGripper.bind(this).defer();\n        this._listeners = [m.listen(this._wrap, \"JSBNG__scroll\", this._handleScroll.bind(this)),m.listen(x, \"mousemove\", this._handleMouseMove.bind(this)),m.listen(this._track, \"click\", this._handleClickOnTrack.bind(this)),];\n        if (i.hasPointerEvents()) {\n            this._listeners.push(m.listen(x, \"click\", this._handleClickOnTrack.bind(this)));\n        }\n    ;\n    ;\n        if (((y.fade !== false))) {\n            this._listeners.push(m.listen(x, \"mouseenter\", this._handleMouseEnter.bind(this)), m.listen(x, \"mouseleave\", this._handleMouseLeave.bind(this)), m.listen(x, \"focusin\", this.showScrollbar.bind(this, false)), m.listen(x, \"focusout\", this.hideScrollbar.bind(this)));\n        }\n         else if (i.hasPointerEvents()) {\n            this._listeners.push(m.listen(x, \"mouseleave\", j.removeClass.curry(x, \"uiScrollableAreaTrackOver\")));\n        }\n        \n    ;\n    ;\n        if (((r.webkit() || r.chrome()))) {\n            this._listeners.push(m.listen(x, \"mousedown\", function() {\n                var z = m.listen(window, \"mouseup\", function() {\n                    if (x.scrollLeft) {\n                        x.scrollLeft = 0;\n                    }\n                ;\n                ;\n                    z.remove();\n                });\n            }));\n        }\n         else if (r.firefox()) {\n            this._wrap.JSBNG__addEventListener(\"DOMMouseScroll\", function(JSBNG__event) {\n                ((((JSBNG__event.axis === JSBNG__event.HORIZONTAL_AXIS)) && JSBNG__event.preventDefault()));\n            }, false);\n        }\n        \n    ;\n    ;\n        this.initDrag();\n        k.set(this._elem, \"ScrollableArea\", this);\n        if (!y.persistent) {\n            o.onLeave(this.destroy.bind(this));\n        }\n    ;\n    ;\n        if (((y.shadow !== false))) {\n            j.addClass(this._elem, \"uiScrollableAreaWithShadow\");\n        }\n    ;\n    ;\n    };\n;\n    t(w, {\n        renderDOM: function() {\n            var x = l.create(\"div\", {\n                className: \"uiScrollableAreaContent\"\n            }), y = l.create(\"div\", {\n                className: \"uiScrollableAreaBody\"\n            }, x), z = l.create(\"div\", {\n                className: \"uiScrollableAreaWrap\"\n            }, y), aa = l.create(\"div\", {\n                className: \"uiScrollableArea native\"\n            }, z);\n            return {\n                root: aa,\n                wrap: z,\n                body: y,\n                JSBNG__content: x\n            };\n        },\n        fromNative: function(x, y) {\n            if (((!j.hasClass(x, \"uiScrollableArea\") || !j.hasClass(x, \"native\")))) {\n                return;\n            }\n        ;\n        ;\n            y = ((y || {\n            }));\n            j.removeClass(x, \"native\");\n            var z = l.create(\"div\", {\n                className: \"uiScrollableAreaTrack\"\n            }, l.create(\"div\", {\n                className: \"uiScrollableAreaGripper\"\n            }));\n            if (((y.fade !== false))) {\n                j.addClass(x, \"fade\");\n                j.addClass(z, \"invisible_elem\");\n            }\n             else j.addClass(x, \"nofade\");\n        ;\n        ;\n            l.appendContent(x, z);\n            var aa = new w(x, y);\n            aa.resize();\n            return aa;\n        },\n        getInstance: function(x) {\n            var y = n.byClass(x, \"uiScrollableArea\");\n            return ((y ? k.get(y, \"ScrollableArea\") : null));\n        },\n        poke: function(x) {\n            var y = w.getInstance(x);\n            ((y && y.poke()));\n        }\n    });\n    t(w.prototype, h, {\n        initDrag: function() {\n            var x = i.hasPointerEvents(), y = new p(((x ? this._elem : this._gripper)));\n            y.subscribe(\"start\", function(z, JSBNG__event) {\n                if (!((((JSBNG__event.which && ((JSBNG__event.which === 1)))) || ((JSBNG__event.button && ((JSBNG__event.button === 1))))))) {\n                    return;\n                }\n            ;\n            ;\n                var aa = s.getEventPosition(JSBNG__event, \"viewport\");\n                if (x) {\n                    var ba = this._gripper.getBoundingClientRect();\n                    if (((((((((aa.x < ba.left)) || ((aa.x > ba.right)))) || ((aa.y < ba.JSBNG__top)))) || ((aa.y > ba.bottom))))) {\n                        return false;\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n                this.inform(\"grip_start\");\n                var ca = aa.y, da = this._gripper.offsetTop;\n                j.addClass(this._elem, \"uiScrollableAreaDragging\");\n                var ea = y.subscribe(\"update\", function(ga, JSBNG__event) {\n                    var ha = ((s.getEventPosition(JSBNG__event, \"viewport\").y - ca));\n                    this._throttledComputeHeights();\n                    var ia = ((this._contentHeight - this._containerHeight)), ja = ((da + ha)), ka = ((this._trackHeight - this._gripperHeight));\n                    ja = Math.max(Math.min(ja, ka), 0);\n                    var la = ((((ja / ka)) * ia));\n                    this._wrap.scrollTop = la;\n                }.bind(this)), fa = y.subscribe(\"end\", function() {\n                    y.unsubscribe(ea);\n                    y.unsubscribe(fa);\n                    j.removeClass(this._elem, \"uiScrollableAreaDragging\");\n                    this.inform(\"grip_end\");\n                }.bind(this));\n            }.bind(this));\n        },\n        adjustGripper: function() {\n            if (this._needsGripper()) {\n                q.set(this._gripper, \"height\", ((this._gripperHeight + \"px\")));\n                this._slideGripper();\n            }\n        ;\n        ;\n            this._throttledShowGripperAndShadows();\n            return this;\n        },\n        _computeHeights: function() {\n            this._containerHeight = this._elem.clientHeight;\n            this._contentHeight = this._content.offsetHeight;\n            this._trackHeight = this._track.offsetHeight;\n            this._gripperHeight = Math.max(((((this._containerHeight / this._contentHeight)) * this._trackHeight)), v);\n        },\n        _needsGripper: function() {\n            this._throttledComputeHeights();\n            return ((this._gripperHeight < this._trackHeight));\n        },\n        _slideGripper: function() {\n            var x = ((((this._wrap.scrollTop / ((this._contentHeight - this._containerHeight)))) * ((this._trackHeight - this._gripperHeight))));\n            q.set(this._gripper, \"JSBNG__top\", ((x + \"px\")));\n        },\n        _showGripperAndShadows: function() {\n            j.conditionShow(this._gripper, this._needsGripper());\n            j.conditionClass(this._elem, \"contentBefore\", ((this._wrap.scrollTop > 0)));\n            j.conditionClass(this._elem, \"contentAfter\", !this.isScrolledToBottom());\n        },\n        destroy: function() {\n            this._listeners.forEach(function(x) {\n                x.remove();\n            });\n            this._listeners.length = 0;\n        },\n        _handleClickOnTrack: function(JSBNG__event) {\n            var x = s.getEventPosition(JSBNG__event, \"viewport\"), y = this._gripper.getBoundingClientRect();\n            if (((((x.x < y.right)) && ((x.x > y.left))))) {\n                if (((x.y < y.JSBNG__top))) {\n                    this.setScrollTop(((this.getScrollTop() - this._elem.clientHeight)));\n                }\n                 else if (((x.y > y.bottom))) {\n                    this.setScrollTop(((this.getScrollTop() + this._elem.clientHeight)));\n                }\n                \n            ;\n            ;\n                JSBNG__event.prevent();\n            }\n        ;\n        ;\n        },\n        _handleMouseMove: function(JSBNG__event) {\n            var x = ((this._options.fade !== false));\n            if (((i.hasPointerEvents() || x))) {\n                this._mousePos = s.getEventPosition(JSBNG__event);\n                this._throttledRespondMouseMove();\n            }\n        ;\n        ;\n        },\n        _respondMouseMove: function() {\n            if (!this._mouseOver) {\n                return;\n            }\n        ;\n        ;\n            var x = ((this._options.fade !== false)), y = this._mousePos, z = s.getElementPosition(this._track).x, aa = s.getElementDimensions(this._track).x, ba = Math.abs(((((z + ((aa / 2)))) - y.x)));\n            j.conditionClass(this._elem, \"uiScrollableAreaTrackOver\", ((i.hasPointerEvents() && ((ba <= 10)))));\n            if (x) {\n                if (((ba < 25))) {\n                    this.showScrollbar(false);\n                }\n                 else if (!this._options.no_fade_on_hover) {\n                    this.hideScrollbar();\n                }\n                \n            ;\n            }\n        ;\n        ;\n        },\n        _handleScroll: function(JSBNG__event) {\n            if (this._needsGripper()) {\n                this._slideGripper();\n            }\n        ;\n        ;\n            this.throttledAdjustGripper();\n            if (((this._options.fade !== false))) {\n                this.showScrollbar();\n            }\n        ;\n        ;\n            this.inform(\"JSBNG__scroll\");\n        },\n        _handleMouseLeave: function() {\n            this._mouseOver = false;\n            this.hideScrollbar();\n        },\n        _handleMouseEnter: function() {\n            this._mouseOver = true;\n            this.showScrollbar();\n        },\n        hideScrollbar: function(x) {\n            if (!this._scrollbarVisible) {\n                return this;\n            }\n        ;\n        ;\n            this._scrollbarVisible = false;\n            if (this._hideTimeout) {\n                JSBNG__clearTimeout(this._hideTimeout);\n                this._hideTimeout = null;\n            }\n        ;\n        ;\n            if (x) {\n                q.set(this._track, \"opacity\", 0);\n                j.addClass.curry(this._track, \"invisible_elem\");\n            }\n             else this._hideTimeout = function() {\n                if (this._hideAnimation) {\n                    this._hideAnimation.JSBNG__stop();\n                    this._hideAnimation = null;\n                }\n            ;\n            ;\n                this._hideAnimation = (new g(this._track)).from(\"opacity\", 1).to(\"opacity\", 0).duration(250).ondone(j.addClass.curry(this._track, \"invisible_elem\")).go();\n            }.bind(this).defer(750);\n        ;\n        ;\n            return this;\n        },\n        resize: function() {\n            var x = s.getElementDimensions(this._elem).x;\n            if (((this._options.fade === false))) {\n                x -= 10;\n            }\n        ;\n        ;\n            x = Math.max(0, x);\n            q.set(this._body, \"width\", ((x + \"px\")));\n            return this;\n        },\n        showScrollbar: function(x) {\n            this.throttledAdjustGripper();\n            if (this._scrollbarVisible) {\n                return this;\n            }\n        ;\n        ;\n            this._scrollbarVisible = true;\n            if (this._hideTimeout) {\n                JSBNG__clearTimeout(this._hideTimeout);\n                this._hideTimeout = null;\n            }\n        ;\n        ;\n            if (this._hideAnimation) {\n                this._hideAnimation.JSBNG__stop();\n                this._hideAnimation = null;\n            }\n        ;\n        ;\n            q.set(this._track, \"opacity\", 1);\n            j.removeClass(this._track, \"invisible_elem\");\n            if (((((x !== false)) && !this._options.no_fade_on_hover))) {\n                this.hideScrollbar();\n            }\n        ;\n        ;\n            return this;\n        },\n        isScrolledToBottom: function() {\n            return ((this._wrap.scrollTop >= ((this._contentHeight - this._containerHeight))));\n        },\n        isScrolledToTop: function() {\n            return ((this._wrap.scrollTop === 0));\n        },\n        scrollToBottom: function(x) {\n            this.setScrollTop(this._wrap.scrollHeight, x);\n        },\n        scrollToTop: function(x) {\n            this.setScrollTop(0, x);\n        },\n        scrollIntoView: function(x, y) {\n            var z = this._wrap.clientHeight, aa = x.offsetHeight, ba = this._wrap.scrollTop, ca = ((ba + z)), da = x.offsetTop, ea = ((da + aa));\n            if (((((da < ba)) || ((z < aa))))) {\n                this.setScrollTop(da, y);\n            }\n             else if (((ea > ca))) {\n                this.setScrollTop(((ba + ((ea - ca)))), y);\n            }\n            \n        ;\n        ;\n        },\n        poke: function() {\n            var x = this._wrap.scrollTop;\n            this._wrap.scrollTop += 1;\n            this._wrap.scrollTop -= 1;\n            this._wrap.scrollTop = x;\n            return this.showScrollbar(false);\n        },\n        getScrollTop: function() {\n            return this._wrap.scrollTop;\n        },\n        getScrollHeight: function() {\n            return this._wrap.scrollHeight;\n        },\n        setScrollTop: function(x, y, z) {\n            if (((y !== false))) {\n                if (this._scrollTopAnimation) {\n                    this._scrollTopAnimation.JSBNG__stop();\n                }\n            ;\n            ;\n                z = ((z || {\n                }));\n                var aa = ((z.duration || 250)), ba = ((z.ease || g.ease.end));\n                this._scrollTopAnimation = (new g(this._wrap)).to(\"scrollTop\", x).ease(ba).duration(aa).go();\n            }\n             else this._wrap.scrollTop = x;\n        ;\n        ;\n        }\n    });\n    e.exports = w;\n});\n__d(\"Menu\", [\"CSS\",\"Class\",\"DataStore\",\"DOM\",\"JSBNG__Event\",\"Keys\",\"Parent\",\"PopoverMenuInterface\",\"ScrollableArea\",\"Style\",\"copyProperties\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSS\"), h = b(\"Class\"), i = b(\"DataStore\"), j = b(\"DOM\"), k = b(\"JSBNG__Event\"), l = b(\"Keys\"), m = b(\"Parent\"), n = b(\"PopoverMenuInterface\"), o = b(\"ScrollableArea\"), p = b(\"Style\"), q = b(\"copyProperties\"), r = b(\"cx\");\n    function s(t, u) {\n        this.parent.construct(this);\n        this._items = [];\n        for (var v = 0; ((v < t.length)); v++) {\n            this._items[v] = new t[v].ctor(t[v]);\n        ;\n        };\n    ;\n        this._config = ((u || {\n        }));\n        this._theme = ((u.theme || {\n        }));\n    };\n;\n    h.extend(s, n);\n    q(s.prototype, {\n        _focused: null,\n        _root: null,\n        addItem: function(t) {\n            this._addItem(t);\n        },\n        addItemBefore: function(t, u) {\n            this._addItem(t, u, false);\n        },\n        addItemAfter: function(t, u) {\n            this._addItem(t, u, true);\n        },\n        _addItem: function(t, u, v) {\n            var w = this._items.indexOf(t);\n            if (((w >= 0))) {\n                var x = ((v ? -1 : 1));\n                if (((this._items[((w + x))] == u))) {\n                    return;\n                }\n            ;\n            ;\n                this._items.splice(w, 1);\n            }\n        ;\n        ;\n            if (u) {\n                w = this._items.indexOf(u);\n                if (((w < 0))) {\n                    throw new Error(\"reference item must already be in the menu\");\n                }\n            ;\n            ;\n                if (v) {\n                    w++;\n                }\n            ;\n            ;\n                this._items.splice(w, 0, t);\n            }\n             else this._items.push(t);\n        ;\n        ;\n            if (this._root) {\n                this._insertItem(t, u, v);\n            }\n        ;\n        ;\n        },\n        removeItem: function(t) {\n            var u = this._items.indexOf(t);\n            if (((u < 0))) {\n                return;\n            }\n        ;\n        ;\n            this._items.splice(u, 1);\n            ((this._root && j.remove(t.getRoot())));\n        },\n        forEachItem: function(t) {\n            this._items.forEach(t);\n        },\n        getItemAt: function(t) {\n            return ((this._items[t] || null));\n        },\n        getRoot: function() {\n            if (!this._root) {\n                this._render();\n            }\n        ;\n        ;\n            return this._root;\n        },\n        onShow: function() {\n            if (this._config.maxheight) {\n                if (!this._scrollableArea) {\n                    this._scrollableArea = o.fromNative(this._scrollableElems.root, {\n                        fade: true\n                    });\n                }\n                 else this._scrollableArea.resize();\n            ;\n            }\n        ;\n        ;\n            this.focusAnItem();\n        },\n        onHide: function() {\n            this.JSBNG__blur();\n        },\n        focusAnItem: function() {\n            return this._attemptFocus(0, 1);\n        },\n        JSBNG__blur: function() {\n            if (this._focused) {\n                this._focused.JSBNG__blur();\n                this._focused = null;\n                this.inform(\"JSBNG__blur\");\n            }\n        ;\n        ;\n        },\n        handleKeydown: function(t, u) {\n            var v = this._items.indexOf(this._focused);\n            switch (t) {\n              case l.UP:\n            \n              case l.DOWN:\n                var w = ((((t === l.UP)) ? -1 : 1));\n                if (((v !== -1))) {\n                    return this._attemptFocus(((v + w)), w);\n                }\n                 else if (((t === l.UP))) {\n                    return this._attemptFocus(((this._items.length - 1)), -1);\n                }\n                 else return this._attemptFocus(0, 1)\n                \n            ;\n                break;\n              case l.SPACE:\n                if (((this._items.indexOf(this._focused) !== -1))) {\n                    this._handleItemClick(this._focused, u);\n                    return true;\n                }\n            ;\n            ;\n                return false;\n              default:\n                var x = String.fromCharCode(t).toLowerCase(), y;\n                for (var z = ((v + 1)); ((z < this._items.length)); z++) {\n                    y = this._items[z].getAccessKey();\n                    if (((y && ((y.charAt(0).toLowerCase() === x))))) {\n                        if (this._focusItem(this._items[z])) {\n                            return true;\n                        }\n                    ;\n                    }\n                ;\n                ;\n                };\n            ;\n                return false;\n            };\n        ;\n        },\n        _render: function() {\n            this._ul = j.create(\"ul\", {\n                className: \"_54nf\"\n            });\n            this._ul.setAttribute(\"role\", \"menu\");\n            this._items.forEach(function(v) {\n                this._insertItem(v, null);\n            }.bind(this));\n            k.listen(this._ul, \"click\", this._handleClick.bind(this));\n            k.listen(this._ul, \"mouseover\", this._handleMouseOver.bind(this));\n            k.listen(this._ul, \"mouseout\", this._handleMouseOut.bind(this));\n            var t = this._ul;\n            if (this._config.maxheight) {\n                this._scrollableElems = o.renderDOM();\n                j.setContent(this._scrollableElems.JSBNG__content, this._ul);\n                t = this._scrollableElems.root;\n                p.set(this._scrollableElems.wrap, \"max-height\", ((this._config.maxheight + \"px\")));\n            }\n        ;\n        ;\n            var u = ((((\"_54nq\" + ((this._config.className ? ((\" \" + this._config.className)) : \"\")))) + ((this._theme.className ? ((\" \" + this._theme.className)) : \"\"))));\n            this._root = j.create(\"div\", {\n                className: u\n            }, j.create(\"div\", {\n                className: \"_54ng\"\n            }, t));\n            ((this._config.id && this._root.setAttribute(\"id\", this._config.id)));\n            this.inform(\"rendered\", this._root);\n        },\n        _needsDefaultBehavior: function(t) {\n            if (((t.isDefaultRequested && t.isDefaultRequested()))) {\n                var u = m.byTag(t.getTarget(), \"a\"), v = ((u && u.getAttribute(\"href\")));\n                return ((v && ((v[0] !== \"#\"))));\n            }\n        ;\n        ;\n            return false;\n        },\n        _handleClick: function(t) {\n            if (!this._needsDefaultBehavior(t)) {\n                var u = this._getItemInstance(t.getTarget());\n                if (u) {\n                    return this._handleItemClick(u, t);\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n        },\n        _handleItemClick: function(t, u) {\n            this.inform(\"itemclick\", {\n                item: t,\n                JSBNG__event: u\n            });\n            if (t.hasAction()) {\n                this.done();\n            }\n        ;\n        ;\n            return t.handleClick();\n        },\n        _handleMouseOver: function(t) {\n            var u = this._getItemInstance(t.getTarget());\n            ((u && this._focusItem(u, true)));\n        },\n        _handleMouseOut: function(t) {\n            var u = this._getItemInstance(t.getTarget());\n            if (((u && ((this._focused === u))))) {\n                this.JSBNG__blur();\n            }\n        ;\n        ;\n        },\n        _insertItem: function(t, u, v) {\n            var w = t.getRoot();\n            g.addClass(w, \"__MenuItem\");\n            i.set(w, \"MenuItem\", t);\n            if (u) {\n                var x = ((v ? j.insertAfter : j.insertBefore));\n                x(u.getRoot(), w);\n            }\n             else j.appendContent(this._ul, w);\n        ;\n        ;\n        },\n        _attemptFocus: function(t, u) {\n            var v = this.getItemAt(t);\n            if (v) {\n                if (this._focusItem(v)) {\n                    return true;\n                }\n                 else return this._attemptFocus(((t + u)), u)\n            ;\n            }\n        ;\n        ;\n            return false;\n        },\n        _focusItem: function(t, u) {\n            if (((t.JSBNG__focus(u) !== false))) {\n                if (((this._focused !== t))) {\n                    this.JSBNG__blur();\n                    this._focused = t;\n                    this.inform(\"JSBNG__focus\");\n                }\n            ;\n            ;\n                return true;\n            }\n        ;\n        ;\n            return false;\n        },\n        _getItemInstance: function(t) {\n            var u = m.byClass(t, \"__MenuItem\");\n            return ((u ? i.get(u, \"MenuItem\") : null));\n        }\n    });\n    e.exports = s;\n});\n__d(\"MenuItemInterface\", [\"copyProperties\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"copyProperties\"), h = b(\"emptyFunction\");\n    function i() {\n    \n    };\n;\n    g(i.prototype, {\n        _root: null,\n        getRoot: function() {\n            if (!this._root) {\n                this._root = this.render();\n            }\n        ;\n        ;\n            return this._root;\n        },\n        render: h,\n        getAccessKey: h,\n        hasAction: h.thatReturnsFalse,\n        JSBNG__focus: h.thatReturnsFalse,\n        JSBNG__blur: h.thatReturnsFalse,\n        handleClick: h.thatReturnsFalse\n    });\n    e.exports = i;\n});\n__d(\"MenuItemBase\", [\"Class\",\"DOM\",\"HTML\",\"MenuItemInterface\",\"copyProperties\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Class\"), h = b(\"DOM\"), i = b(\"HTML\"), j = b(\"MenuItemInterface\"), k = b(\"copyProperties\"), l = b(\"cx\");\n    function m(n) {\n        this.parent.construct(this);\n        this._data = n;\n    };\n;\n    g.extend(m, j);\n    k(m.prototype, {\n        render: function() {\n            var n = \"_54ni\";\n            if (this._data.className) {\n                n += ((\" \" + this._data.className));\n            }\n        ;\n        ;\n            var o = {\n                className: n,\n                \"aria-selected\": \"false\"\n            };\n            {\n                var fin110keys = ((window.top.JSBNG_Replay.forInKeys)((this._data))), fin110i = (0);\n                var p;\n                for (; (fin110i < fin110keys.length); (fin110i++)) {\n                    ((p) = (fin110keys[fin110i]));\n                    {\n                        if (((p.indexOf(\"data-\") === 0))) {\n                            o[p] = this._data[p];\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            return h.create(\"li\", o, this._renderItemContent());\n        },\n        _renderItemContent: function() {\n            return i(this._data.markup).getNodes();\n        }\n    });\n    e.exports = m;\n});\n__d(\"MenuItem\", [\"Class\",\"CSS\",\"DOM\",\"MenuItemBase\",\"React\",\"copyProperties\",\"cx\",\"emptyFunction\",\"startsWith\",], function(a, b, c, d, e, f) {\n    var g = b(\"Class\"), h = b(\"CSS\"), i = b(\"DOM\"), j = b(\"MenuItemBase\"), k = b(\"React\"), l = b(\"copyProperties\"), m = b(\"cx\"), n = b(\"emptyFunction\"), o = b(\"startsWith\");\n    function p(q) {\n        this.parent.construct(this, q);\n        this._disabled = !!this._data.disabled;\n    };\n;\n    g.extend(p, j);\n    l(p.prototype, {\n        getValue: function() {\n            return this._data.value;\n        },\n        getAccessKey: function() {\n            return ((this._data.label && this._data.label.charAt(0)));\n        },\n        hasAction: n.thatReturnsTrue,\n        JSBNG__focus: function(q) {\n            if (((this.isDisabled() || !this._root.offsetParent))) {\n                return false;\n            }\n        ;\n        ;\n            h.addClass(this._root, \"_54ne\");\n            h.addClass(this._root, \"selected\");\n            this._root.setAttribute(\"aria-selected\", \"true\");\n            ((q || this._anchor.JSBNG__focus()));\n        },\n        JSBNG__blur: function() {\n            h.removeClass(this._root, \"_54ne\");\n            h.removeClass(this._root, \"selected\");\n            this._root.setAttribute(\"aria-selected\", \"false\");\n        },\n        handleClick: function() {\n            if (this.isDisabled()) {\n                return false;\n            }\n        ;\n        ;\n            if (((typeof this._onclickHandler === \"function\"))) {\n                return this._onclickHandler();\n            }\n        ;\n        ;\n            return !!((((this._data.rel && ((this._data.rel !== \"ignore\")))) || this._data.href));\n        },\n        setOnClickHandler: function(q) {\n            this._onclickHandler = q;\n        },\n        _renderItemContent: function() {\n            this._anchor = i.create(\"a\", {\n                className: \"_54nc\"\n            });\n            if (this._data.reactChildren) {\n                k.renderComponent(k.DOM.span({\n                    className: \"_54nh\"\n                }, this._data.reactChildren), this._anchor);\n                this._data.label = ((this._anchor.innerText || this._anchor.textContent));\n            }\n             else i.setContent(this._anchor, i.create(\"span\", {\n                className: \"_54nh\"\n            }, ((this._data.markup || this._data.label))));\n        ;\n        ;\n            if (this._data.icon) {\n                i.prependContent(this._anchor, this._data.icon);\n                h.addClass(this._anchor, \"_54nu\");\n            }\n        ;\n        ;\n            if (!this.isDisabled()) {\n                this._anchor.setAttribute(\"href\", ((this._data.href || \"#\")));\n            }\n        ;\n        ;\n            if (this._data.rel) {\n                this._anchor.setAttribute(\"rel\", this._data.rel);\n            }\n             else if (!this._data.href) {\n                this._anchor.setAttribute(\"rel\", \"ignore\");\n            }\n            \n        ;\n        ;\n            if (this._data.ajaxify) {\n                this._anchor.setAttribute(\"ajaxify\", this._data.ajaxify);\n            }\n        ;\n        ;\n            if (this._data.target) {\n                this._anchor.setAttribute(\"target\", this._data.target);\n            }\n        ;\n        ;\n            {\n                var fin111keys = ((window.top.JSBNG_Replay.forInKeys)((this._data))), fin111i = (0);\n                var q;\n                for (; (fin111i < fin111keys.length); (fin111i++)) {\n                    ((q) = (fin111keys[fin111i]));\n                    {\n                        if (((((typeof q === \"string\")) && o(q, \"data-\")))) {\n                            this._anchor.setAttribute(q, this._data[q]);\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            this._anchor.setAttribute(\"role\", \"menuitem\");\n            this._anchor.setAttribute(\"title\", this._data.title);\n            return this._anchor;\n        },\n        isDisabled: function() {\n            return this._disabled;\n        },\n        enable: function() {\n            this._anchor.setAttribute(\"href\", ((this._data.href || \"#\")));\n            h.removeClass(this._root, \"_5arm\");\n            this._disabled = false;\n        },\n        disable: function() {\n            this._anchor.removeAttribute(\"href\");\n            h.addClass(this._root, \"_5arm\");\n            this._disabled = true;\n        },\n        render: function() {\n            var q = this.parent.render();\n            if (this._data.disabled) {\n                h.addClass(q, \"_5arm\");\n            }\n        ;\n        ;\n            return q;\n        }\n    });\n    e.exports = p;\n});\n__d(\"MenuSelectableItem\", [\"Class\",\"CSS\",\"MenuItem\",\"copyProperties\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Class\"), h = b(\"CSS\"), i = b(\"MenuItem\"), j = b(\"copyProperties\"), k = b(\"cx\");\n    function l(m) {\n        this.parent.construct(this, m);\n        this._selected = !!this._data.selected;\n    };\n;\n    g.extend(l, i);\n    j(l.prototype, {\n        _selected: false,\n        getLabel: function() {\n            return this._data.label;\n        },\n        getIcon: function() {\n            return this._data.icon;\n        },\n        isSelected: function() {\n            return this._selected;\n        },\n        select: function() {\n            if (this.isDisabled()) {\n                return false;\n            }\n        ;\n        ;\n            h.addClass(this._root, \"_54nd\");\n            this._selected = true;\n        },\n        deselect: function() {\n            h.removeClass(this._root, \"_54nd\");\n            this._selected = false;\n        },\n        render: function() {\n            var m = this.parent.render();\n            if (this._data.selected) {\n                h.addClass(m, \"_54nd\");\n            }\n        ;\n        ;\n            return m;\n        }\n    });\n    e.exports = l;\n});\n__d(\"SelectableMenu\", [\"Class\",\"Menu\",\"arrayContains\",\"copyProperties\",\"createArrayFrom\",], function(a, b, c, d, e, f) {\n    var g = b(\"Class\"), h = b(\"Menu\"), i = b(\"arrayContains\"), j = b(\"copyProperties\"), k = b(\"createArrayFrom\");\n    function l(o, p) {\n        this.parent.construct(this, o, p);\n    };\n;\n    function m(o) {\n        return ((((o.select && o.deselect)) && o.isSelected));\n    };\n;\n    function n(o) {\n        return ((m(o) && o.isSelected()));\n    };\n;\n    g.extend(l, h);\n    j(l.prototype, {\n        focusAnItem: function() {\n            for (var o = 0; ((o < this._items.length)); o++) {\n                if (n(this._items[o])) {\n                    if (((this._focusItem(this._items[o]) !== false))) {\n                        return true;\n                    }\n                ;\n                }\n            ;\n            ;\n            };\n        ;\n            return this.parent.focusAnItem();\n        },\n        setValue: function(o) {\n            if (!this._root) {\n                this._render();\n            }\n        ;\n        ;\n            var p = k(o);\n            this._items.forEach(function(q) {\n                if (m(q)) {\n                    if (i(p, q.getValue())) {\n                        q.select();\n                    }\n                     else if (n(q)) {\n                        q.deselect();\n                    }\n                    \n                ;\n                }\n            ;\n            ;\n            });\n            this.inform(\"change\", this._getSelection());\n        },\n        _handleItemClick: function(o, p) {\n            if (!m(o)) {\n                return this.parent._handleItemClick(o, p);\n            }\n        ;\n        ;\n            this.inform(\"itemclick\", {\n                item: o,\n                JSBNG__event: p\n            });\n            if (this._config.multiple) {\n                var q = ((n(o) ? o.deselect() : o.select()));\n                if (((q !== false))) {\n                    this.inform(\"change\", this._getSelection());\n                }\n            ;\n            ;\n            }\n             else {\n                if (!n(o)) {\n                    if (((o.select() !== false))) {\n                        this._items.forEach(function(r) {\n                            if (((n(r) && ((r !== o))))) {\n                                r.deselect();\n                            }\n                        ;\n                        ;\n                        });\n                        this.inform(\"change\", this._getSelection());\n                    }\n                ;\n                }\n            ;\n            ;\n                this.done();\n            }\n        ;\n        ;\n            return o.handleClick();\n        },\n        _getSelection: function() {\n            var o = [];\n            this._items.forEach(function(p) {\n                if (n(p)) {\n                    o.push({\n                        label: p.getLabel(),\n                        value: p.getValue(),\n                        item: p\n                    });\n                }\n            ;\n            ;\n            });\n            if (!this._config.multiple) {\n                o = o[0];\n            }\n        ;\n        ;\n            return o;\n        }\n    });\n    e.exports = l;\n});\n__d(\"PopoverLoadingMenu\", [\"Class\",\"DOM\",\"PopoverMenuInterface\",\"copyProperties\",\"cx\",\"joinClasses\",], function(a, b, c, d, e, f) {\n    var g = b(\"Class\"), h = b(\"DOM\"), i = b(\"PopoverMenuInterface\"), j = b(\"copyProperties\"), k = b(\"cx\"), l = b(\"joinClasses\");\n    function m(n) {\n        this.parent.construct(this);\n        this._config = ((n || {\n        }));\n        this._theme = ((n.theme || {\n        }));\n    };\n;\n    g.extend(m, i);\n    j(m.prototype, {\n        _root: null,\n        getRoot: function() {\n            if (!this._root) {\n                this._root = h.create(\"div\", {\n                    className: l(\"_54nq\", this._config.className, this._theme.className)\n                }, h.create(\"div\", {\n                    className: \"_54ng\"\n                }, h.create(\"div\", {\n                    className: \"_54nf _54af\"\n                }, h.create(\"span\", {\n                    className: \"_54ag\"\n                }))));\n            }\n        ;\n        ;\n            return this._root;\n        }\n    });\n    e.exports = m;\n});\n__d(\"TabIsolation\", [\"JSBNG__Event\",\"DOMQuery\",\"Focus\",\"Keys\",\"TabbableElements\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"DOMQuery\"), i = b(\"Focus\"), j = b(\"Keys\"), k = b(\"TabbableElements\"), l = b(\"copyProperties\"), m = [], n = 0;\n    function o(p) {\n        this._root = p;\n        this._eventHandler = null;\n        this._identifier = n++;\n    };\n;\n    l(o.prototype, {\n        enable: function() {\n            m.unshift(this._identifier);\n            this._eventHandler = g.listen(window, \"keydown\", function(p) {\n                if (((m[0] === this._identifier))) {\n                    this._tabHandler(p);\n                }\n            ;\n            ;\n            }.bind(this), g.Priority.URGENT);\n        },\n        disable: function() {\n            var p;\n            if (this._eventHandler) {\n                p = m.indexOf(this._identifier);\n                if (((p > -1))) {\n                    m.splice(p, 1);\n                }\n            ;\n            ;\n                this._eventHandler.remove();\n                this._eventHandler = null;\n            }\n        ;\n        ;\n        },\n        _tabHandler: function(p) {\n            if (((g.getKeyCode(p) !== j.TAB))) {\n                return;\n            }\n        ;\n        ;\n            var q = p.getTarget();\n            if (!q) {\n                return;\n            }\n        ;\n        ;\n            var r = k.JSBNG__find(this._root), s = r[0], t = r[((r.length - 1))], u = p.getModifiers().shift;\n            if (((u && ((q === s))))) {\n                p.preventDefault();\n                i.set(t);\n            }\n             else if (((((!u && ((q === t)))) || !h.contains(this._root, q)))) {\n                p.preventDefault();\n                i.set(s);\n            }\n            \n        ;\n        ;\n        }\n    });\n    e.exports = o;\n});\n__d(\"AccessibleLayer\", [\"JSBNG__Event\",\"DOM\",\"Focus\",\"copyProperties\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"DOM\"), i = b(\"Focus\"), j = b(\"copyProperties\"), k = b(\"tx\");\n    function l(m) {\n        this._layer = m;\n    };\n;\n    j(l.prototype, {\n        enable: function() {\n            this._afterShowSubscription = this._layer.subscribe(\"aftershow\", this._onAfterShow.bind(this));\n        },\n        disable: function() {\n            ((this._listener && this._listener.remove()));\n            this._afterShowSubscription.unsubscribe();\n            this._listener = this._afterShowSubscription = null;\n        },\n        _closeListener: function(JSBNG__event) {\n            var m = this._layer.getCausalElement();\n            if (m) {\n                if (((m.tabIndex == -1))) {\n                    m.tabIndex = 0;\n                    i.setWithoutOutline(m);\n                }\n                 else i.set(m);\n            ;\n            }\n        ;\n        ;\n            this._layer.hide();\n        },\n        _onAfterShow: function() {\n            var m = this._layer.getContentRoot();\n            if (h.scry(m, \".layer_close_elem\")[0]) {\n                return;\n            }\n        ;\n        ;\n            var n = h.create(\"a\", {\n                className: \"accessible_elem layer_close_elem\",\n                href: \"#\"\n            }, [\"Close popup and return\",]);\n            h.appendContent(m, n);\n            this._listener = g.listen(n, \"click\", this._closeListener.bind(this));\n        }\n    });\n    e.exports = l;\n});\n__d(\"ContextualLayerAsyncRelative\", [\"JSBNG__Event\",\"copyProperties\",\"Parent\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"copyProperties\"), i = b(\"Parent\");\n    function j(k) {\n        this._layer = k;\n    };\n;\n    h(j.prototype, {\n        _layerSubscription: null,\n        _listener: null,\n        enable: function() {\n            this._layerSubscription = this._layer.subscribe(\"show\", this._attachListener.bind(this));\n            if (this._layer.isShown()) {\n                this._attachListener();\n            }\n        ;\n        ;\n        },\n        disable: function() {\n            this._layerSubscription.unsubscribe();\n            this._layerSubscription = null;\n            if (this._listener) {\n                this._listener.remove();\n                this._listener = null;\n            }\n        ;\n        ;\n        },\n        _attachListener: function() {\n            this._listener = g.listen(this._layer.getRoot(), \"click\", this._onclick.bind(this));\n        },\n        _onclick: function(k) {\n            var l = i.byTag(k.getTarget(), \"A\");\n            if (!l) {\n                return;\n            }\n        ;\n        ;\n            var m = l.getAttribute(\"ajaxify\"), n = l.href, o = ((m || n));\n            if (((((l.rel === \"async\")) || ((l.rel === \"async-post\"))))) {\n                d([\"AsyncRequest\",], function(p) {\n                    p.bootstrap(o, this._layer.getContext(), ((l.rel === \"async-post\")));\n                }.bind(this));\n                return false;\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = j;\n});\n__d(\"ContextualLayerUpdateOnScroll\", [\"JSBNG__Event\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"copyProperties\");\n    function i(j) {\n        this._layer = j;\n    };\n;\n    h(i.prototype, {\n        _subscriptions: [],\n        enable: function() {\n            this._subscriptions = [this._layer.subscribe(\"show\", this._attachScrollListener.bind(this)),this._layer.subscribe(\"hide\", this._removeScrollListener.bind(this)),];\n        },\n        disable: function() {\n            while (this._subscriptions.length) {\n                this._subscriptions.pop().unsubscribe();\n            ;\n            };\n        ;\n            this.detach();\n        },\n        _attachScrollListener: function() {\n            if (this._listener) {\n                return;\n            }\n        ;\n        ;\n            var j = this._layer.getContextScrollParent();\n            this._listener = g.listen(j, \"JSBNG__scroll\", this._layer.updatePosition.bind(this._layer));\n        },\n        _removeScrollListener: function() {\n            ((this._listener && this._listener.remove()));\n            this._listener = null;\n        }\n    });\n    e.exports = i;\n});\n__d(\"LayerAutoFocus\", [\"function-extensions\",\"DOMQuery\",\"Focus\",\"TabbableElements\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    b(\"function-extensions\");\n    var g = b(\"DOMQuery\"), h = b(\"Focus\"), i = b(\"TabbableElements\"), j = b(\"copyProperties\");\n    function k(l) {\n        this._layer = l;\n    };\n;\n    j(k.prototype, {\n        _subscription: null,\n        enable: function() {\n            this._subscription = this._layer.subscribe(\"aftershow\", this._focus.bind(this));\n        },\n        disable: function() {\n            this._subscription.unsubscribe();\n            this._subscription = null;\n        },\n        _focus: function() {\n            var l = this._layer.getRoot(), m = g.scry(l, \".autofocus\")[0], n = true;\n            if (!m) {\n                var o = JSBNG__document.activeElement;\n                if (g.isNodeOfType(o, [\"input\",\"textarea\",])) {\n                    return;\n                }\n            ;\n            ;\n                var p = i.JSBNG__find(l);\n                for (var q = 0; ((q < p.length)); q++) {\n                    if (((p[q].tagName != \"A\"))) {\n                        m = p[q];\n                        n = false;\n                        break;\n                    }\n                ;\n                ;\n                };\n            ;\n            }\n             else if (((m.tabIndex !== 0))) {\n                n = false;\n            }\n            \n        ;\n        ;\n            if (m) {\n                ((n ? h.set(m) : h.setWithoutOutline(m)));\n            }\n             else {\n                l.tabIndex = 0;\n                h.setWithoutOutline(l);\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = k;\n});\n__d(\"LayerButtons\", [\"JSBNG__Event\",\"Parent\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"Parent\"), i = b(\"copyProperties\");\n    function j(k) {\n        this._layer = k;\n    };\n;\n    i(j.prototype, {\n        _listener: null,\n        enable: function() {\n            this._listener = g.listen(this._layer.getRoot(), \"click\", this._handle.bind(this));\n        },\n        disable: function() {\n            this._listener.remove();\n            this._listener = null;\n        },\n        _handle: function(k) {\n            var l = k.getTarget(), m = h.byClass(l, \"layerConfirm\");\n            if (m) {\n                if (((this._layer.inform(\"JSBNG__confirm\", m) === false))) {\n                    k.prevent();\n                }\n            ;\n            ;\n                return;\n            }\n        ;\n        ;\n            var n = h.byClass(l, \"layerCancel\");\n            if (n) {\n                if (((this._layer.inform(\"cancel\", n) !== false))) {\n                    this._layer.hide();\n                }\n            ;\n            ;\n                k.prevent();\n                return;\n            }\n        ;\n        ;\n            var o = h.byClass(l, \"layerButton\");\n            if (o) {\n                if (((this._layer.inform(\"button\", o) === false))) {\n                    k.prevent();\n                }\n            ;\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = j;\n});\n__d(\"LayerDestroyOnHide\", [\"function-extensions\",\"copyProperties\",\"shield\",], function(a, b, c, d, e, f) {\n    b(\"function-extensions\");\n    var g = b(\"copyProperties\"), h = b(\"shield\");\n    function i(j) {\n        this._layer = j;\n    };\n;\n    g(i.prototype, {\n        _subscription: null,\n        enable: function() {\n            this._subscription = this._layer.subscribe(\"hide\", h(Function.prototype.defer, this._layer.destroy.bind(this._layer)));\n        },\n        disable: function() {\n            if (this._subscription) {\n                this._subscription.unsubscribe();\n                this._subscription = null;\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = i;\n});\n__d(\"LayerFadeOnHide\", [\"Animation\",\"Layer\",\"Style\",\"UserAgent\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Animation\"), h = b(\"Layer\"), i = b(\"Style\"), j = b(\"UserAgent\"), k = b(\"copyProperties\");\n    function l(m) {\n        this._layer = m;\n    };\n;\n    k(l.prototype, {\n        _subscription: null,\n        enable: function() {\n            if (((j.ie() < 9))) {\n                return;\n            }\n        ;\n        ;\n            this._subscription = this._layer.subscribe(\"starthide\", this._handleStartHide.bind(this));\n        },\n        disable: function() {\n            if (this._subscription) {\n                this._subscription.unsubscribe();\n                this._subscription = null;\n            }\n        ;\n        ;\n        },\n        _handleStartHide: function() {\n            var m = true, n = h.subscribe(\"show\", function() {\n                n.unsubscribe();\n                m = false;\n            });\n            (function() {\n                n.unsubscribe();\n                n = null;\n                if (m) {\n                    this._animate();\n                }\n                 else this._layer.finishHide();\n            ;\n            ;\n            }).bind(this).defer();\n            return false;\n        },\n        _animate: function() {\n            new g(this._layer.getRoot()).from(\"opacity\", 1).to(\"opacity\", 0).duration(150).ondone(this._finish.bind(this)).go();\n        },\n        _finish: function() {\n            i.set(this._layer.getRoot(), \"opacity\", \"\");\n            this._layer.finishHide();\n        }\n    });\n    e.exports = l;\n});\n__d(\"LayerFadeOnShow\", [\"Animation\",\"Style\",\"UserAgent\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Animation\"), h = b(\"Style\"), i = b(\"UserAgent\"), j = b(\"copyProperties\");\n    function k(l) {\n        this._layer = l;\n    };\n;\n    j(k.prototype, {\n        _subscriptions: null,\n        enable: function() {\n            if (((i.ie() < 9))) {\n                return;\n            }\n        ;\n        ;\n            this._subscriptions = [this._layer.subscribe(\"beforeshow\", function() {\n                h.set(this._layer.getRoot(), \"opacity\", 0);\n            }.bind(this)),this._layer.subscribe(\"show\", this._animate.bind(this)),];\n        },\n        disable: function() {\n            if (this._subscriptions) {\n                while (this._subscriptions.length) {\n                    this._subscriptions.pop().unsubscribe();\n                ;\n                };\n            ;\n                this._subscriptions = null;\n            }\n        ;\n        ;\n        },\n        _getDuration: function() {\n            return 100;\n        },\n        _animate: function() {\n            var l = this._layer.getRoot();\n            new g(l).from(\"opacity\", 0).to(\"opacity\", 1).duration(this._getDuration()).ondone(h.set.curry(l, \"opacity\", \"\")).go();\n        }\n    });\n    e.exports = k;\n});\n__d(\"LayerFormHooks\", [\"JSBNG__Event\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"copyProperties\");\n    function i(j) {\n        this._layer = j;\n    };\n;\n    h(i.prototype, {\n        _subscriptions: null,\n        enable: function() {\n            var j = this._layer.getRoot();\n            this._subscriptions = [g.listen(j, \"submit\", this._onSubmit.bind(this)),g.listen(j, \"success\", this._onSuccess.bind(this)),g.listen(j, \"error\", this._onError.bind(this)),];\n        },\n        disable: function() {\n            this._subscriptions.forEach(function(j) {\n                j.remove();\n            });\n            this._subscriptions = null;\n        },\n        _onSubmit: function(JSBNG__event) {\n            if (((this._layer.inform(\"submit\", JSBNG__event) === false))) {\n                JSBNG__event.kill();\n            }\n        ;\n        ;\n        },\n        _onSuccess: function(JSBNG__event) {\n            if (((this._layer.inform(\"success\", JSBNG__event) === false))) {\n                JSBNG__event.kill();\n            }\n        ;\n        ;\n        },\n        _onError: function(JSBNG__event) {\n            var j = JSBNG__event.getData();\n            if (((this._layer.inform(\"error\", {\n                response: j.response\n            }) === false))) {\n                JSBNG__event.kill();\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = i;\n});\n__d(\"LayerHideOnBlur\", [\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"copyProperties\");\n    function h(i) {\n        this._layer = i;\n    };\n;\n    g(h.prototype, {\n        _subscriptions: null,\n        _onBlur: null,\n        enable: function() {\n            this._subscriptions = [this._layer.subscribe(\"show\", this._attach.bind(this)),this._layer.subscribe(\"hide\", this._detach.bind(this)),];\n            if (this._layer.isShown()) {\n                this._attach();\n            }\n        ;\n        ;\n        },\n        disable: function() {\n            this._detach();\n            while (this._subscriptions.length) {\n                this._subscriptions.pop().unsubscribe();\n            ;\n            };\n        ;\n            this._subscriptions = null;\n        },\n        _detach: function() {\n            ((this._onBlur && this._onBlur.unsubscribe()));\n            this._onBlur = null;\n        },\n        _attach: function() {\n            this._onBlur = this._layer.subscribe(\"JSBNG__blur\", function() {\n                this._layer.hide();\n                return false;\n            }.bind(this));\n        }\n    });\n    e.exports = h;\n});\n__d(\"LayerMouseHooks\", [\"JSBNG__Event\",\"function-extensions\",\"Arbiter\",\"ContextualThing\",\"Layer\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\");\n    b(\"function-extensions\");\n    var h = b(\"Arbiter\"), i = b(\"ContextualThing\"), j = b(\"Layer\"), k = b(\"copyProperties\"), l = new h();\n    function m(n) {\n        this._layer = n;\n        this._subscriptions = [];\n        this._currentlyActive = false;\n    };\n;\n    k(m.prototype, {\n        enable: function() {\n            this._subscriptions = [l.subscribe(\"mouseenter\", this._handleActive.bind(this)),l.subscribe(\"mouseleave\", this._handleInactive.bind(this)),this._layer.subscribe(\"hide\", function() {\n                this._currentlyActive = false;\n            }.bind(this)),];\n        },\n        disable: function() {\n            while (this._subscriptions.length) {\n                this._subscriptions.pop().unsubscribe();\n            ;\n            };\n        ;\n            this._subscriptions = [];\n            this._currentlyActive = false;\n        },\n        _handleActive: function(n, o) {\n            if (((!this._currentlyActive && this._isNodeWithinStack(o)))) {\n                this._layer.inform(\"mouseenter\");\n                this._currentlyActive = true;\n            }\n        ;\n        ;\n        },\n        _handleInactive: function(n, o) {\n            if (this._currentlyActive) {\n                if (((!o || !this._isNodeWithinStack(o)))) {\n                    this._layer.inform(\"mouseleave\");\n                    this._currentlyActive = false;\n                }\n            ;\n            }\n        ;\n        ;\n        },\n        _isNodeWithinStack: function(n) {\n            return i.containsIncludingLayers(this._layer.getContentRoot(), n);\n        }\n    });\n    j.subscribe(\"show\", function(n, o) {\n        var p = o.getContentRoot(), q = [g.listen(p, \"mouseenter\", function() {\n            l.inform(\"mouseenter\", p);\n        }),g.listen(p, \"mouseleave\", function(s) {\n            l.inform(\"mouseleave\", s.getRelatedTarget());\n        }),], r = o.subscribe(\"hide\", function() {\n            while (q.length) {\n                q.pop().remove();\n            ;\n            };\n        ;\n            r.unsubscribe();\n            q = r = null;\n        });\n    });\n    e.exports = m;\n});\n__d(\"LayerRefocusOnHide\", [\"copyProperties\",\"Focus\",\"ContextualThing\",\"DOM\",\"DOMQuery\",\"Parent\",], function(a, b, c, d, e, f) {\n    var g = b(\"copyProperties\"), h = b(\"Focus\"), i = b(\"ContextualThing\"), j = b(\"DOM\"), k = b(\"DOMQuery\"), l = b(\"Parent\");\n    function m(n) {\n        this._layer = n;\n    };\n;\n    g(m.prototype, {\n        _subscription: null,\n        enable: function() {\n            this._subscription = this._layer.subscribe(\"hide\", this._handle.bind(this));\n        },\n        disable: function() {\n            this._subscription.unsubscribe();\n            this._subscription = null;\n        },\n        _handle: function(n, JSBNG__event) {\n            if (((((JSBNG__document.activeElement === JSBNG__document.body)) || k.contains(this._layer.getRoot(), JSBNG__document.activeElement)))) {\n                var o = this._layer.getCausalElement();\n                while (((o && (!o.offsetWidth)))) {\n                    var p = l.byClass(o, \"uiToggle\");\n                    if (((p && p.offsetWidth))) {\n                        o = j.scry(p, \"[rel=\\\"toggle\\\"]\")[0];\n                    }\n                     else {\n                        var q = i.getContext(o);\n                        if (q) {\n                            o = q;\n                        }\n                         else o = o.parentNode;\n                    ;\n                    ;\n                    }\n                ;\n                ;\n                };\n            ;\n                if (((o && ((o.tabIndex != -1))))) {\n                    h.setWithoutOutline(o);\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = m;\n});\n__d(\"LayerTabIsolation\", [\"TabIsolation\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"TabIsolation\"), h = b(\"copyProperties\");\n    function i(j) {\n        this._layer = j;\n        this._tabIsolation = null;\n    };\n;\n    h(i.prototype, {\n        _subscriptions: [],\n        enable: function() {\n            this._tabIsolation = new g(this._layer.getRoot());\n            this._subscriptions = [this._layer.subscribe(\"show\", this._tabIsolation.enable.bind(this._tabIsolation)),this._layer.subscribe(\"hide\", this._tabIsolation.disable.bind(this._tabIsolation)),];\n        },\n        disable: function() {\n            while (this._subscriptions.length) {\n                this._subscriptions.pop().unsubscribe();\n            ;\n            };\n        ;\n            this._tabIsolation.disable();\n            this._tabIsolation = null;\n        }\n    });\n    e.exports = i;\n});\n__d(\"ModalLayer\", [\"JSBNG__Event\",\"function-extensions\",\"Arbiter\",\"CSS\",\"DataStore\",\"DOM\",\"DOMDimensions\",\"DOMQuery\",\"ScrollAwareDOM\",\"Style\",\"URI\",\"UserAgent\",\"Vector\",\"copyProperties\",\"csx\",\"cx\",\"debounceAcrossTransitions\",\"isAsyncScrollQuery\",\"removeFromArray\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\");\n    b(\"function-extensions\");\n    var h = b(\"Arbiter\"), i = b(\"CSS\"), j = b(\"DataStore\"), k = b(\"DOM\"), l = b(\"DOMDimensions\"), m = b(\"DOMQuery\"), n = b(\"ScrollAwareDOM\"), o = b(\"Style\"), p = b(\"URI\"), q = b(\"UserAgent\"), r = b(\"Vector\"), s = b(\"copyProperties\"), t = b(\"csx\"), u = b(\"cx\"), v = b(\"debounceAcrossTransitions\"), w = b(\"isAsyncScrollQuery\"), x = b(\"removeFromArray\"), y = [], z = null, aa = null, ba = null;\n    function ca() {\n        if (!ba) {\n            ba = m.scry(JSBNG__document.body, \"._li\")[0];\n        }\n    ;\n    ;\n        return ba;\n    };\n;\n    function da(la) {\n        var ma = {\n            position: r.getScrollPosition()\n        }, na = ((la.offsetTop - ma.position.y));\n        i.addClass(la, \"_31e\");\n        o.set(la, \"JSBNG__top\", ((na + \"px\")));\n        h.inform(\"reflow\");\n        ma.listener = n.subscribe(\"JSBNG__scroll\", function(oa, pa) {\n            if (m.contains(la, pa.target)) {\n                var qa = ((la.offsetTop - pa.delta.y));\n                o.set(la, \"JSBNG__top\", ((qa + \"px\")));\n                ma.position = ma.position.add(pa.delta);\n                return false;\n            }\n        ;\n        ;\n        });\n        j.set(la, \"ModalLayerData\", ma);\n        if (((q.firefox() < 13))) {\n            ea.curry(la).defer();\n        }\n    ;\n    ;\n    };\n;\n    function ea(la) {\n        m.scry(la, \"div.swfObject\").forEach(function(ma) {\n            var na = ma.getAttribute(\"data-swfid\");\n            if (((na && window[na]))) {\n                var oa = window[na];\n                oa.addParam(\"autostart\", \"false\");\n                oa.addParam(\"autoplay\", \"false\");\n                oa.addParam(\"play\", \"false\");\n                oa.addVariable(\"video_autoplay\", \"0\");\n                oa.addVariable(\"autoplay\", \"0\");\n                oa.addVariable(\"play\", \"0\");\n                var pa = p(oa.getAttribute(\"swf\"));\n                pa.addQueryData({\n                    autoplay: \"0\"\n                });\n                pa.setPath(pa.getPath().replace(\"autoplay=1\", \"autoplay=0\"));\n                oa.setAttribute(\"swf\", pa.toString());\n                oa.write(ma);\n            }\n        ;\n        ;\n        });\n    };\n;\n    function fa(la, ma) {\n        var na = j.get(la, \"ModalLayerData\");\n        if (na) {\n            var oa = function() {\n                i.removeClass(la, \"_31e\");\n                o.set(la, \"JSBNG__top\", \"\");\n                if (ma) {\n                    var ra = m.getDocumentScrollElement();\n                    ra.scrollTop = na.position.y;\n                }\n            ;\n            ;\n                h.inform(\"reflow\");\n                na.listener.unsubscribe();\n                na.listener = null;\n                j.remove(la, \"ModalLayerData\");\n            };\n            if (((ma && w()))) {\n                var pa = k.create(\"div\", {\n                    className: \"_42w\"\n                });\n                o.set(pa, \"height\", ((la.offsetHeight + \"px\")));\n                k.appendContent(JSBNG__document.body, pa);\n                var qa = m.getDocumentScrollElement();\n                qa.scrollTop = na.position.y;\n                ma = false;\n                !function() {\n                    oa();\n                    k.remove(pa);\n                }.defer();\n            }\n             else oa();\n        ;\n        ;\n        }\n    ;\n    ;\n        if (((q.ie() < 7))) {\n            o.set(la, \"height\", \"\");\n        }\n    ;\n    ;\n    };\n;\n    function ga() {\n        var la = ca();\n        if (!i.hasClass(la, \"_31e\")) {\n            da(la);\n        }\n    ;\n    ;\n    };\n;\n    function ha() {\n        if (!y.length) {\n            fa(ca(), true);\n        }\n    ;\n    ;\n    };\n;\n    function ia() {\n        var la;\n        if (((q.ie() < 7))) {\n            var ma = y[((y.length - 1))].getLayerRoot(), na = Math.max(ma.offsetHeight, ma.scrollHeight);\n            la = function(ta) {\n                o.set(ta, \"height\", ((((-ta.offsetTop + na)) + \"px\")));\n            };\n        }\n    ;\n    ;\n        var oa = y.length;\n        while (oa--) {\n            var pa = y[oa], qa = pa.getLayerRoot();\n            ja(qa, \"\");\n            var ra = pa.getLayerContentRoot(), sa = ((ra.offsetWidth + l.measureElementBox(ra, \"width\", 0, 0, 1)));\n            ja(qa, sa);\n            if (((la && ((oa < ((y.length - 1))))))) {\n                la(qa);\n            }\n        ;\n        ;\n        };\n    ;\n        ((la && la(ca())));\n    };\n;\n    function ja(la, ma) {\n        var na = ((q.ie() < 7));\n        if (((((na && ma)) && ((ma <= JSBNG__document.body.clientWidth))))) {\n            ma = \"\";\n        }\n    ;\n    ;\n        o.set(la, ((na ? \"width\" : \"min-width\")), ((ma + ((ma ? \"px\" : \"\")))));\n    };\n;\n    function ka(la) {\n        this._layer = la;\n    };\n;\n    s(ka.prototype, {\n        _subscription: null,\n        enable: function() {\n            if (!ca()) {\n                return;\n            }\n        ;\n        ;\n            this._subscription = this._layer.subscribe([\"show\",\"hide\",], function(la) {\n                ((((la == \"show\")) ? this._addModal() : this._removeModal()));\n            }.bind(this));\n            if (this._layer.isShown()) {\n                this._addModal();\n            }\n        ;\n        ;\n        },\n        disable: function() {\n            if (!ca()) {\n                return;\n            }\n        ;\n        ;\n            this._subscription.unsubscribe();\n            this._subscription = null;\n            if (this._layer.isShown()) {\n                this._removeModal();\n            }\n        ;\n        ;\n        },\n        _addModal: function() {\n            i.addClass(this.getLayerRoot(), \"_3qw\");\n            var la = y[((y.length - 1))];\n            if (la) {\n                da(la.getLayerRoot());\n            }\n             else ga();\n        ;\n        ;\n            var ma = m.getDocumentScrollElement();\n            ma.scrollTop = 0;\n            if (!y.length) {\n                if (((q.ie() < 7))) {\n                    i.addClass(JSBNG__document.documentElement, \"_31d\");\n                }\n            ;\n            ;\n                var na = v(ia, 100);\n                z = g.listen(window, \"resize\", na);\n                aa = h.subscribe(\"reflow\", na);\n            }\n        ;\n        ;\n            y.push(this);\n            ia.defer();\n        },\n        _removeModal: function() {\n            var la = this.getLayerRoot();\n            i.removeClass(la, \"_3qw\");\n            ja(la, \"\");\n            var ma = ((this === y[((y.length - 1))]));\n            x(y, this);\n            var na = y[((y.length - 1))];\n            if (!na) {\n                z.remove();\n                z = null;\n                aa.unsubscribe();\n                aa = null;\n            }\n        ;\n        ;\n            !function() {\n                if (na) {\n                    fa(na.getLayerRoot(), ma);\n                }\n                 else ha();\n            ;\n            ;\n                if (y.length) {\n                    ia.defer();\n                }\n                 else if (((q.ie() < 7))) {\n                    i.removeClass(JSBNG__document.documentElement, \"_31d\");\n                }\n                \n            ;\n            ;\n            }.defer(400, false);\n        },\n        getLayerRoot: function() {\n            return this._layer.getRoot();\n        },\n        getLayerContentRoot: function() {\n            return this._layer.getContentRoot();\n        }\n    });\n    e.exports = ka;\n});\n__d(\"ContextualDialogArrow\", [\"JSXDOM\",\"CSS\",\"DOM\",\"Locale\",\"Style\",\"Vector\",\"copyProperties\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSXDOM\"), h = b(\"CSS\"), i = b(\"DOM\"), j = b(\"Locale\"), k = b(\"Style\"), l = b(\"Vector\"), m = b(\"copyProperties\"), n = b(\"cx\"), o = {\n        bottom: \"_53ik\",\n        JSBNG__top: \"_53il\",\n        right: \"_53im\",\n        left: \"_53in\"\n    }, p = {\n        above: \"bottom\",\n        below: \"JSBNG__top\",\n        left: \"right\",\n        right: \"left\"\n    };\n    function q(r) {\n        this._layer = r;\n    };\n;\n    m(q.prototype, {\n        _subscription: null,\n        _arrow: null,\n        enable: function() {\n            this._subscription = this._layer.subscribe([\"adjust\",\"reposition\",], this._handle.bind(this));\n        },\n        disable: function() {\n            this._subscription.unsubscribe();\n            this._subscription = null;\n        },\n        _handle: function(r, s) {\n            if (((r === \"adjust\"))) {\n                this._repositionArrow(s);\n            }\n             else this._repositionRoot(s);\n        ;\n        ;\n        },\n        _repositionRoot: function(r) {\n            var s = r.getAlignment();\n            if (((s == \"center\"))) {\n                return;\n            }\n        ;\n        ;\n            var t = this._layer.getRoot(), u = this._layer.getContext(), v = r.isVertical(), w = this._layer.getArrowDimensions(), x = w.offset, y = w.length, z = l.getElementDimensions(u), aa = ((v ? z.x : z.y));\n            if (((aa >= ((y + ((x * 2))))))) {\n                return;\n            }\n        ;\n        ;\n            var ba = ((((y / 2)) + x)), ca = ((aa / 2)), da = parseInt(((ba - ca)), 10);\n            if (v) {\n                if (((s == \"left\"))) {\n                    var ea = parseInt(k.get(t, \"left\"), 10);\n                    k.set(t, \"left\", ((((ea - da)) + \"px\")));\n                }\n                 else {\n                    var fa = parseInt(k.get(t, \"right\"), 10);\n                    k.set(t, \"right\", ((((fa - da)) + \"px\")));\n                }\n            ;\n            ;\n            }\n             else {\n                var ga = parseInt(k.get(t, \"JSBNG__top\"), 10);\n                k.set(t, \"JSBNG__top\", ((((ga - da)) + \"px\")));\n            }\n        ;\n        ;\n        },\n        _repositionArrow: function(r) {\n            var s = this._layer._contentWrapper, t = r.getPosition(), u = p[t];\n            {\n                var fin112keys = ((window.top.JSBNG_Replay.forInKeys)((o))), fin112i = (0);\n                var v;\n                for (; (fin112i < fin112keys.length); (fin112i++)) {\n                    ((v) = (fin112keys[fin112i]));\n                    {\n                        h.conditionClass(s, o[v], ((u === v)));\n                    ;\n                    };\n                };\n            };\n        ;\n            if (((t == \"none\"))) {\n                return;\n            }\n        ;\n        ;\n            if (!this._arrow) {\n                this._arrow = g.i({\n                    className: \"_53io\"\n                });\n                i.appendContent(s, this._arrow);\n            }\n        ;\n        ;\n            h.conditionClass(s, \"_kc\", this._layer.getFooter());\n            k.set(this._arrow, \"JSBNG__top\", \"\");\n            k.set(this._arrow, \"left\", \"\");\n            k.set(this._arrow, \"right\", \"\");\n            k.set(this._arrow, \"margin\", \"\");\n            var w = q.getOffsetPercent(r), x = q.getOffset(r, w, this._layer), y = q.getOffsetSide(r);\n            k.set(this._arrow, y, ((w + \"%\")));\n            k.set(this._arrow, ((\"margin-\" + y)), ((x + \"px\")));\n        }\n    });\n    m(q, {\n        getOffsetPercent: function(r) {\n            var s = r.getAlignment(), t = r.getPosition();\n            if (((((t == \"above\")) || ((t == \"below\"))))) {\n                if (((s == \"center\"))) {\n                    return 50;\n                }\n                 else if (((s == \"right\"))) {\n                    return 100;\n                }\n                \n            ;\n            }\n        ;\n        ;\n            return 0;\n        },\n        getOffsetSide: function(r) {\n            var s = r.isVertical();\n            return ((s ? ((j.isRTL() ? \"right\" : \"left\")) : \"JSBNG__top\"));\n        },\n        getOffset: function(r, s, t) {\n            var u = t.getArrowDimensions(), v = u.offset, w = u.length, x = r.getAlignment(), y = ((((x == \"center\")) ? 0 : v));\n            y += ((((w * s)) / 100));\n            if (((x != \"left\"))) {\n                y *= -1;\n            }\n        ;\n        ;\n            return y;\n        }\n    });\n    e.exports = q;\n});\n__d(\"ContextualDialogFitInViewport\", [\"JSBNG__Event\",\"ContextualLayerDimensions\",\"Style\",\"Vector\",\"copyProperties\",\"throttle\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"ContextualLayerDimensions\"), i = b(\"Style\"), j = b(\"Vector\"), k = b(\"copyProperties\"), l = b(\"throttle\");\n    function m(n) {\n        this._layer = n;\n        this._listeners = [];\n    };\n;\n    k(m.prototype, {\n        _subscription: null,\n        _minimumTop: null,\n        enable: function() {\n            var n = this._layer.getArrowDimensions();\n            this._arrowOffset = n.offset;\n            var o = n.length;\n            this._arrowBuffer = ((this._arrowOffset + o));\n            this._subscription = this._layer.subscribe([\"show\",\"hide\",\"reposition\",], function(p, q) {\n                if (((p == \"reposition\"))) {\n                    this._calculateMinimumTop(q);\n                }\n                 else if (((p == \"show\"))) {\n                    this._attachScroll();\n                    this._adjustForScroll();\n                }\n                 else this._detachScroll();\n                \n            ;\n            ;\n            }.bind(this));\n            if (this._layer.isShown()) {\n                this._attachScroll();\n            }\n        ;\n        ;\n        },\n        disable: function() {\n            if (this._layer.isShown()) {\n                this._detachScroll();\n            }\n        ;\n        ;\n            this._subscription.unsubscribe();\n            this._subscription = null;\n        },\n        _attachScroll: function() {\n            var n = l(this._adjustForScroll.bind(this)), o = ((this._layer.getContextScrollParent() || window));\n            this._listeners = [g.listen(o, \"JSBNG__scroll\", n),g.listen(window, \"resize\", n),];\n        },\n        _detachScroll: function() {\n            while (this._listeners.length) {\n                this._listeners.pop().remove();\n            ;\n            };\n        ;\n            this._listeners = [];\n        },\n        _getContentHeight: function() {\n            return j.getElementDimensions(this._layer._contentWrapper).y;\n        },\n        _getContextY: function() {\n            return j.getElementPosition(this._layer.getContext()).y;\n        },\n        _calculateMinimumTop: function(n) {\n            if (n.isVertical()) {\n                return;\n            }\n        ;\n        ;\n            this._minimumTop = ((((this._getContextY() - ((this._getContentHeight() - this._arrowBuffer)))) + n.getOffsetY()));\n        },\n        _adjustForScroll: function() {\n            if (this._layer.isFixed()) {\n                return;\n            }\n        ;\n        ;\n            var n = this._layer._getOrientation();\n            if (n.isVertical()) {\n                return;\n            }\n        ;\n        ;\n            var o = h.getViewportRect(this._layer), p = ((o.b - this._minimumTop));\n            if (((p < 0))) {\n                return;\n            }\n        ;\n        ;\n            var q = this._getContentHeight(), r = ((q - ((this._arrowBuffer + this._arrowOffset)))), s = Math.max(0, Math.min(r, ((r - ((p - q))))));\n            i.set(this._layer.getContent(), \"JSBNG__top\", ((-s + \"px\")));\n        }\n    });\n    e.exports = m;\n});\n__d(\"ContextualDialogDefaultTheme\", [\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"cx\"), h = {\n        wrapperClassName: \"_53ip\",\n        arrowDimensions: {\n            offset: 15,\n            length: 16\n        }\n    };\n    e.exports = h;\n});\n__d(\"ContextualDialog\", [\"AccessibleLayer\",\"Class\",\"ContextualDialogArrow\",\"ContextualDialogFitInViewport\",\"ContextualLayer\",\"ContextualDialogDefaultTheme\",\"CSS\",\"DOM\",\"LayerAutoFocus\",\"LayerButtons\",\"LayerHideOnTransition\",\"LayerFormHooks\",\"LayerMouseHooks\",\"Style\",\"copyProperties\",\"csx\",\"cx\",\"removeFromArray\",], function(a, b, c, d, e, f) {\n    var g = b(\"AccessibleLayer\"), h = b(\"Class\"), i = b(\"ContextualDialogArrow\"), j = b(\"ContextualDialogFitInViewport\"), k = b(\"ContextualLayer\"), l = b(\"ContextualDialogDefaultTheme\"), m = b(\"CSS\"), n = b(\"DOM\"), o = b(\"LayerAutoFocus\"), p = b(\"LayerButtons\"), q = b(\"LayerHideOnTransition\"), r = b(\"LayerFormHooks\"), s = b(\"LayerMouseHooks\"), t = b(\"Style\"), u = b(\"copyProperties\"), v = b(\"csx\"), w = b(\"cx\"), x = b(\"removeFromArray\");\n    function y(z, aa) {\n        this.parent.construct(this, z, aa);\n    };\n;\n    h.extend(y, k);\n    u(y.prototype, {\n        _footer: null,\n        _configure: function(z, aa) {\n            u(z, ((z.theme || l)));\n            var ba = ((z.arrowBehavior || i));\n            z.addedBehaviors = ((z.addedBehaviors || []));\n            z.addedBehaviors.push(ba);\n            this._footer = n.scry(aa, \"div._572u\")[0];\n            this.parent._configure(z, aa);\n        },\n        _getDefaultBehaviors: function() {\n            var z = this.parent._getDefaultBehaviors();\n            x(z, q);\n            return z.concat([g,o,j,p,r,s,]);\n        },\n        _buildWrapper: function(z, aa) {\n            m.addClass(aa, \"_53ij\");\n            var ba = this.parent._buildWrapper(z, aa);\n            m.addClass(ba, z.wrapperClassName);\n            if (z.width) {\n                this.setWidth(z.width);\n            }\n        ;\n        ;\n            return ba;\n        },\n        setWidth: function(z) {\n            this._width = Math.floor(z);\n            t.set(this._contentWrapper, \"width\", ((z + \"px\")));\n            return this;\n        },\n        getFooter: function() {\n            return this._footer;\n        },\n        getArrowDimensions: function() {\n            return this._config.arrowDimensions;\n        }\n    });\n    u(y, {\n        setContext: function(z, aa) {\n            z.setContext(aa);\n        }\n    });\n    e.exports = y;\n});\n__d(\"DialogPosition\", [\"Vector\",], function(a, b, c, d, e, f) {\n    var g = b(\"Vector\"), h = 40, i, j = {\n        calculateTopMargin: function(k, l) {\n            if (i) {\n                return i;\n            }\n        ;\n        ;\n            var m = g.getViewportDimensions(), n = Math.floor(((((((m.x + k)) * ((m.y - l)))) / ((4 * m.x)))));\n            return Math.max(n, h);\n        },\n        setFixedTopMargin: function(k) {\n            i = k;\n        }\n    };\n    e.exports = j;\n});\n__d(\"DialogX\", [\"function-extensions\",\"JSXDOM\",\"Arbiter\",\"Class\",\"CSS\",\"DialogPosition\",\"JSBNG__Event\",\"Layer\",\"LayerAutoFocus\",\"LayerButtons\",\"LayerFormHooks\",\"LayerRefocusOnHide\",\"LayerTabIsolation\",\"ModalLayer\",\"Style\",\"Vector\",\"copyProperties\",\"cx\",\"debounce\",\"shield\",], function(a, b, c, d, e, f) {\n    b(\"function-extensions\");\n    var g = b(\"JSXDOM\"), h = b(\"Arbiter\"), i = b(\"Class\"), j = b(\"CSS\"), k = b(\"DialogPosition\"), l = b(\"JSBNG__Event\"), m = b(\"Layer\"), n = b(\"LayerAutoFocus\"), o = b(\"LayerButtons\"), p = b(\"LayerFormHooks\"), q = b(\"LayerRefocusOnHide\"), r = b(\"LayerTabIsolation\"), s = b(\"ModalLayer\"), t = b(\"Style\"), u = b(\"Vector\"), v = b(\"copyProperties\"), w = b(\"cx\"), x = b(\"debounce\"), y = b(\"shield\");\n    function z(ba, ca) {\n        this.parent.construct(this, ba, ca);\n    };\n;\n    i.extend(z, m);\n    v(z.prototype, {\n        _configure: function(ba, ca) {\n            this.parent._configure(ba, ca);\n            j.addClass(this.getRoot(), \"_4-hy\");\n            if (ba.autohide) {\n                var da = this.subscribe(\"show\", function() {\n                    da.unsubscribe();\n                    y(this.hide, this).defer(ba.autohide);\n                }.bind(this));\n            }\n        ;\n        ;\n        },\n        _getDefaultBehaviors: function() {\n            return this.parent._getDefaultBehaviors().concat([aa,s,n,o,p,r,q,]);\n        },\n        _buildWrapper: function(ba, ca) {\n            var da = ((ba.xui ? \"_4-hz\" : \"_t\")), ea = ((ba.xui ? \"_59s7\" : \"_1yv\"));\n            this._innerContent = g.div(null, ca);\n            this._wrapper = g.div({\n                className: ea,\n                role: \"dialog\",\n                \"aria-labelledby\": ((ba.titleID || null))\n            }, g.div({\n                className: da\n            }, this._innerContent));\n            this.setWidth(ba.width);\n            return (g.div({\n                className: \"_10\",\n                role: \"dialog\"\n            }, this._wrapper));\n        },\n        getContentRoot: function() {\n            return this._wrapper;\n        },\n        getInnerContent: function() {\n            return this._innerContent;\n        },\n        updatePosition: function() {\n            var ba = u.getElementDimensions(this._wrapper), ca = k.calculateTopMargin(ba.x, ba.y);\n            t.set(this._wrapper, \"margin-top\", ((ca + \"px\")));\n            this.inform(\"update_position\", {\n                type: \"DialogX\",\n                JSBNG__top: ca\n            });\n        },\n        setWidth: function(ba) {\n            ba = Math.floor(ba);\n            if (((ba === this._width))) {\n                return;\n            }\n        ;\n        ;\n            this._width = ba;\n            t.set(this._wrapper, \"width\", ((ba + \"px\")));\n        },\n        getWidth: function() {\n            return this._width;\n        }\n    });\n    function aa(ba) {\n        this._layer = ba;\n    };\n;\n    v(aa.prototype, {\n        _subscription: null,\n        _resize: null,\n        enable: function() {\n            this._subscription = this._layer.subscribe([\"show\",\"hide\",], function(ba) {\n                if (((ba === \"show\"))) {\n                    this._attach();\n                    h.inform(\"layer_shown\", {\n                        type: \"DialogX\"\n                    });\n                }\n                 else {\n                    this._detach();\n                    h.inform(\"layer_hidden\", {\n                        type: \"DialogX\"\n                    });\n                }\n            ;\n            ;\n            }.bind(this));\n        },\n        disable: function() {\n            this._subscription.unsubscribe();\n            this._subscription = null;\n            ((this._resize && this._detach()));\n        },\n        _attach: function() {\n            this._layer.updatePosition();\n            this._resize = l.listen(window, \"resize\", x(this._layer.updatePosition.bind(this._layer)));\n        },\n        _detach: function() {\n            this._resize.remove();\n            this._resize = null;\n        }\n    });\n    e.exports = z;\n});\n__d(\"eachKeyVal\", [], function(a, b, c, d, e, f) {\n    function g(h, i, j) {\n        if (((!h || !i))) {\n            return;\n        }\n    ;\n    ;\n        var k = Object.keys(h), l;\n        for (l = 0; ((l < k.length)); l++) {\n            i.call(j, k[l], h[k[l]], h, l);\n        ;\n        };\n    ;\n    };\n;\n    e.exports = g;\n});\n__d(\"LoadingDialogDimensions\", [], function(a, b, c, d, e, f) {\n    var g = {\n        HEIGHT: 96,\n        WIDTH: 300\n    };\n    e.exports = g;\n});\n__d(\"AsyncDialog\", [\"AsyncRequest\",\"Bootloader\",\"CSS\",\"DialogX\",\"DOM\",\"Env\",\"Keys\",\"LayerFadeOnShow\",\"Parent\",\"React\",\"URI\",\"XUISpinner.react\",\"copyProperties\",\"cx\",\"eachKeyVal\",\"emptyFunction\",\"LoadingDialogDimensions\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = b(\"Bootloader\"), i = b(\"CSS\"), j = b(\"DialogX\"), k = b(\"DOM\"), l = b(\"Env\"), m = b(\"Keys\"), n = b(\"LayerFadeOnShow\"), o = b(\"Parent\"), p = b(\"React\"), q = b(\"URI\"), r = b(\"XUISpinner.react\"), s = b(\"copyProperties\"), t = b(\"cx\"), u = b(\"eachKeyVal\"), v = b(\"emptyFunction\"), w = b(\"LoadingDialogDimensions\").WIDTH, x;\n    function y() {\n        if (!x) {\n            var ga = k.create(\"div\", {\n                className: \"_57-x\"\n            });\n            x = new j({\n                width: w,\n                addedBehaviors: [n,],\n                xui: true\n            }, k.create(\"div\", null, ga));\n            p.renderComponent(r({\n                size: \"large\"\n            }), ga);\n            x.subscribe([\"key\",\"JSBNG__blur\",], function(ha, ia) {\n                if (((((ha == \"JSBNG__blur\")) || ((((ha == \"key\")) && ((ia.keyCode == m.ESC))))))) {\n                    ca();\n                    return false;\n                }\n            ;\n            ;\n            });\n        }\n    ;\n    ;\n        return x;\n    };\n;\n    var z = {\n    }, aa = 1, ba = [];\n    function ca() {\n        u(z, function(ga, ha) {\n            ha.abandon();\n            da(ga);\n        });\n    };\n;\n    function da(ga) {\n        delete z[ga];\n        if (!Object.keys(z).length) {\n            y().hide();\n        }\n    ;\n    ;\n    };\n;\n    function ea(ga, ha) {\n        var ia = aa++;\n        ba[ia] = ha;\n        z[ia] = ga;\n        var ja = da.curry(((\"\" + ia)));\n        s(ga.getData(), {\n            __asyncDialog: ia\n        });\n        y().setCausalElement(ga.getRelativeTo()).show();\n        var ka = ga.finallyHandler;\n        ga.setFinallyHandler(function(la) {\n            var ma = la.getPayload();\n            if (((ma && ma.asyncURL))) {\n                fa.send(new g(ma.asyncURL));\n            }\n        ;\n        ;\n            ja();\n            ((ka && ka(la)));\n        });\n        ga.setInterceptHandler(ja).setAbortHandler(ja);\n        ga.send();\n    };\n;\n    var fa = {\n        send: function(ga, ha) {\n            ea(ga, ((ha || v)));\n        },\n        bootstrap: function(ga, ha, ia) {\n            if (!ga) {\n                return;\n            }\n        ;\n        ;\n            var ja = ((o.byClass(ha, \"stat_elem\") || ha));\n            if (((ja && i.hasClass(ja, \"async_saving\")))) {\n                return false;\n            }\n        ;\n        ;\n            var ka = new q(ga).getQueryData(), la = ((ia === \"dialog\")), ma = new g().setURI(ga).setData(ka).setMethod(((la ? \"GET\" : \"POST\"))).setReadOnly(la).setRelativeTo(ha).setStatusElement(ja).setNectarModuleDataSafe(ha);\n            if (l.is_desktop) {\n                h.loadModules([\"FbdDialogProvider\",], function(na) {\n                    na.sendDialog(ma, fa.send);\n                });\n                return;\n            }\n        ;\n        ;\n            fa.send(ma);\n        },\n        respond: function(ga, ha) {\n            var ia = ba[ga];\n            if (ia) {\n                ia(ha);\n                delete ba[ga];\n            }\n        ;\n        ;\n        },\n        getLoadingDialog: function() {\n            return y();\n        }\n    };\n    e.exports = fa;\n});\n__d(\"Hovercard\", [\"JSXDOM\",\"JSBNG__Event\",\"function-extensions\",\"AccessibleLayer\",\"Arbiter\",\"AsyncRequest\",\"AsyncSignal\",\"ContextualDialog\",\"ContextualThing\",\"DOM\",\"LayerAutoFocus\",\"Parent\",\"JSBNG__Rect\",\"Style\",\"UserAgent\",\"Vector\",\"clickRefAction\",\"cx\",\"emptyFunction\",\"tx\",\"userAction\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSXDOM\"), h = b(\"JSBNG__Event\");\n    b(\"function-extensions\");\n    var i = b(\"AccessibleLayer\"), j = b(\"Arbiter\"), k = b(\"AsyncRequest\"), l = b(\"AsyncSignal\"), m = b(\"ContextualDialog\"), n = b(\"ContextualThing\"), o = b(\"DOM\"), p = b(\"LayerAutoFocus\"), q = b(\"Parent\"), r = b(\"JSBNG__Rect\"), s = b(\"Style\"), t = b(\"UserAgent\"), u = b(\"Vector\"), v = b(\"clickRefAction\"), w = b(\"cx\"), x = b(\"emptyFunction\"), y = b(\"tx\"), z = b(\"userAction\"), aa = {\n    }, ba = {\n    }, ca = null, da = null, ea = null, fa = 150, ga = 700, ha = 1000, ia = 250, ja = null, ka = null, la = null, ma = null;\n    function na(JSBNG__event) {\n        var cb = q.byTag(JSBNG__event.getTarget(), \"a\");\n        ((bb.processNode(cb) && JSBNG__event.JSBNG__stop()));\n    };\n;\n    function oa(cb) {\n        da = cb;\n        if (!pa(cb)) {\n            var db;\n            if (((!cb || !(db = qa(cb))))) {\n                ((ba.moveToken && ba.moveToken.remove()));\n                ba = {\n                };\n                return false;\n            }\n        ;\n        ;\n            if (((ba.node != cb))) {\n                ((ba.moveToken && ba.moveToken.remove()));\n                ba = {\n                    node: cb,\n                    endpoint: db,\n                    pos: null\n                };\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n        return true;\n    };\n;\n    function pa(cb) {\n        return ((((cb && ca)) && ((ba.node == cb))));\n    };\n;\n    function qa(cb) {\n        return cb.getAttribute(\"data-hovercard\");\n    };\n;\n    function ra(cb) {\n        var db = h.listen(cb, \"mouseout\", function() {\n            JSBNG__clearTimeout(ja);\n            JSBNG__clearTimeout(ka);\n            db.remove();\n            da = null;\n            if (!bb.contains(cb)) {\n                bb.hide();\n            }\n        ;\n        ;\n        });\n        if (!ba.moveToken) {\n            ba.moveToken = h.listen(cb, \"mousemove\", function(JSBNG__event) {\n                ba.pos = u.getEventPosition(JSBNG__event);\n            });\n        }\n    ;\n    ;\n        JSBNG__clearTimeout(ja);\n        JSBNG__clearTimeout(ka);\n        JSBNG__clearTimeout(ma);\n        var eb = fa, fb = ((ca ? ia : ga));\n        if (cb.getAttribute(\"data-hovercard-instant\")) {\n            eb = fb = 50;\n        }\n    ;\n    ;\n        ja = JSBNG__setTimeout(wa.curry(cb), eb);\n        ka = JSBNG__setTimeout(sa.curry(cb), fb);\n    };\n;\n    function sa(cb, db) {\n        if (((ba.node != cb))) {\n            return;\n        }\n    ;\n    ;\n        var eb = aa[qa(cb)];\n        if (eb) {\n            ua(eb);\n        }\n         else if (db) {\n            ua(ya());\n        }\n         else {\n            var fb = ((ca ? ia : ga));\n            la = JSBNG__setTimeout(sa.curry(cb, true), ((ha - fb)));\n        }\n        \n    ;\n    ;\n    };\n;\n    function ta() {\n        bb.hide(true);\n        JSBNG__clearTimeout(ka);\n    };\n;\n    function ua(cb) {\n        var db = ba.node, eb = ca, fb = ((eb != db));\n        if (ea) {\n            var gb = ea.getContentRoot();\n            if (!n.containsIncludingLayers(gb, db)) {\n                ea.hide();\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n        if (!o.contains(JSBNG__document.body, db)) {\n            bb.hide(true);\n            return;\n        }\n    ;\n    ;\n        ca = db;\n        ea = cb;\n        cb.setContextWithBounds(db, va(db)).show();\n        if (fb) {\n            (function() {\n                new l(\"/ajax/hovercard/shown.php\").send();\n                v(\"himp\", ca, null, \"FORCE\", {\n                    ft: {\n                        evt: 39\n                    }\n                });\n                z(\"hovercard\", ca).uai(\"show\");\n            }).defer();\n        }\n    ;\n    ;\n    };\n;\n    function va(cb) {\n        var db = ba.pos, eb = cb.getClientRects();\n        if (((!db || ((eb.length === 0))))) {\n            return r.getElementBounds(cb);\n        }\n    ;\n    ;\n        var fb, gb = false;\n        for (var hb = 0; ((hb < eb.length)); hb++) {\n            var ib = new r(Math.round(eb[hb].JSBNG__top), Math.round(eb[hb].right), Math.round(eb[hb].bottom), Math.round(eb[hb].left), \"viewport\").convertTo(\"JSBNG__document\"), jb = ib.getPositionVector(), kb = jb.add(ib.getDimensionVector());\n            if (((!fb || ((((jb.x <= fb.l)) && ((jb.y > fb.t))))))) {\n                if (gb) {\n                    break;\n                }\n            ;\n            ;\n                fb = new r(jb.y, kb.x, kb.y, jb.x, \"JSBNG__document\");\n            }\n             else {\n                fb.t = Math.min(fb.t, jb.y);\n                fb.b = Math.max(fb.b, kb.y);\n                fb.r = kb.x;\n            }\n        ;\n        ;\n            if (ib.contains(db)) {\n                gb = true;\n            }\n        ;\n        ;\n        };\n    ;\n        return fb;\n    };\n;\n    function wa(cb) {\n        if (((cb.id && ((aa[cb.id] != null))))) {\n            return;\n        }\n    ;\n    ;\n        var db = qa(cb);\n        if (((aa[db] != null))) {\n            return;\n        }\n    ;\n    ;\n        xa(db);\n        var eb = function() {\n            bb.dirty(db);\n            ta();\n        };\n        new k(db).setData({\n            endpoint: db\n        }).setMethod(\"GET\").setReadOnly(true).setErrorHandler(eb).setTransportErrorHandler(eb).send();\n    };\n;\n    function xa(cb) {\n        aa[cb] = false;\n    };\n;\n    var ya = function() {\n        var cb = new m({\n            width: 275\n        }, g.div({\n            className: \"_7lk\"\n        }, \"Loading...\"));\n        cb.disableBehavior(i).disableBehavior(p);\n        za(cb);\n        ya = x.thatReturns(cb);\n        return cb;\n    };\n    function za(cb) {\n        var db = [cb.subscribe(\"mouseenter\", function() {\n            JSBNG__clearTimeout(ma);\n            da = ba.node;\n        }),cb.subscribe(\"mouseleave\", function() {\n            cb.hide();\n            da = null;\n        }),cb.subscribe(\"destroy\", function() {\n            while (db.length) {\n                db.pop().unsubscribe();\n            ;\n            };\n        ;\n            db = null;\n        }),];\n    };\n;\n    var ab = true, bb = {\n        hide: function(cb) {\n            if (!ca) {\n                return;\n            }\n        ;\n        ;\n            if (cb) {\n                if (ea) {\n                    ea.hide();\n                }\n            ;\n            ;\n                da = null;\n                ca = null;\n                ea = null;\n            }\n             else ma = JSBNG__setTimeout(bb.hide.curry(true), ia);\n        ;\n        ;\n        },\n        setDialog: function(cb, db) {\n            db.disableBehavior(i).disableBehavior(p);\n            aa[cb] = db;\n            za(db);\n            if (((((ba.endpoint == cb)) && ((da == ba.node))))) {\n                ya().hide();\n                var eb = ba.node.getAttribute(\"data-hovercard-position\");\n                ((eb && db.setPosition(eb)));\n                var fb = ba.node.getAttribute(\"data-hovercard-offset-x\");\n                ((fb && db.setOffsetX(parseInt(fb, 10))));\n                var gb = ba.node.getAttribute(\"data-hovercard-offset-y\");\n                ((gb && db.setOffsetY(parseInt(gb, 10))));\n                ua(db);\n            }\n        ;\n        ;\n        },\n        getDialog: function(cb) {\n            return aa[cb];\n        },\n        contains: function(cb) {\n            if (ea) {\n                return n.containsIncludingLayers(ea.getContentRoot(), cb);\n            }\n        ;\n        ;\n            return false;\n        },\n        dirty: function(cb) {\n            var db = aa[cb];\n            if (db) {\n                db.destroy();\n                delete aa[cb];\n            }\n        ;\n        ;\n        },\n        dirtyAll: function() {\n            {\n                var fin113keys = ((window.top.JSBNG_Replay.forInKeys)((aa))), fin113i = (0);\n                var cb;\n                for (; (fin113i < fin113keys.length); (fin113i++)) {\n                    ((cb) = (fin113keys[fin113i]));\n                    {\n                        var db = aa[cb];\n                        ((db && bb.dirty(cb)));\n                    };\n                };\n            };\n        ;\n            j.inform(\"Hovercard/dirty\");\n        },\n        processNode: function(cb) {\n            if (((cb && oa(cb)))) {\n                ra(cb);\n                return true;\n            }\n        ;\n        ;\n            return false;\n        },\n        setDirtyAllOnPageTransition: function(cb) {\n            ab = cb;\n        }\n    };\n    (function() {\n        if (((t.ie() < 8))) {\n            return;\n        }\n    ;\n    ;\n        h.listen(JSBNG__document.documentElement, \"mouseover\", na);\n        h.listen(window, \"JSBNG__scroll\", function() {\n            if (((ca && s.isFixed(ca)))) {\n                bb.hide(true);\n            }\n        ;\n        ;\n        });\n        j.subscribe(\"page_transition\", function() {\n            ta();\n            ((ab && bb.dirtyAll()));\n        }, j.SUBSCRIBE_NEW);\n    })();\n    e.exports = bb;\n});\n__d(\"StickyPlaceholderInput\", [\"JSBNG__Event\",\"CSS\",\"DOM\",\"Input\",\"Parent\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"CSS\"), i = b(\"DOM\"), j = b(\"Input\"), k = b(\"Parent\"), l = b(\"emptyFunction\");\n    function m(q) {\n        return k.byClass(q, \"uiStickyPlaceholderInput\");\n    };\n;\n    function n(q) {\n        return i.scry(q, \".placeholder\")[0];\n    };\n;\n    function o(q) {\n        q = ((q || window.JSBNG__event));\n        var r = ((q.target || q.srcElement));\n        if (i.isNodeOfType(r, [\"input\",\"textarea\",])) {\n            var s = m(r);\n            if (s) {\n                (function() {\n                    h.conditionClass(s, \"uiStickyPlaceholderEmptyInput\", !r.value.length);\n                }).defer();\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n    };\n;\n    var p = {\n        init: function() {\n            p.init = l;\n            g.listen(JSBNG__document.documentElement, {\n                keydown: o,\n                paste: o,\n                focusout: o\n            });\n        },\n        registerInput: function(q) {\n            p.init();\n            var r = ((q.getAttribute(\"placeholder\") || \"\"));\n            if (r.length) {\n                if (((JSBNG__document.activeElement === q))) {\n                    var s = g.listen(q, \"JSBNG__blur\", function() {\n                        p.manipulateInput(q, r);\n                        s.remove();\n                    });\n                }\n                 else p.manipulateInput(q, r);\n            ;\n            }\n        ;\n        ;\n        },\n        manipulateInput: function(q, r) {\n            var s = i.create(\"div\", {\n                className: \"placeholder\",\n                \"aria-hidden\": \"true\"\n            }, r), t = i.create(\"div\", {\n                className: \"uiStickyPlaceholderInput\"\n            }, s);\n            if (i.isNodeOfType(q, \"textarea\")) {\n                h.addClass(t, \"uiStickyPlaceholderTextarea\");\n            }\n        ;\n        ;\n            g.listen(s, \"click\", function() {\n                q.JSBNG__focus();\n            });\n            if (((q.value === r))) {\n                q.value = \"\";\n            }\n        ;\n        ;\n            h.removeClass(q, \"DOMControl_placeholder\");\n            q.setAttribute(\"placeholder\", \"\");\n            i.replace(q, t);\n            i.appendContent(t, q);\n            h.conditionClass(t, \"uiStickyPlaceholderEmptyInput\", !q.value.length);\n        },\n        setPlaceholderText: function(q, r) {\n            var s = m(q);\n            if (!s) {\n                j.setPlaceholder(q, r);\n            }\n             else {\n                var t = n(s);\n                ((t && i.setContent(t, r)));\n            }\n        ;\n        ;\n        },\n        getPlaceholderText: function(q) {\n            var r = m(q), s = n(r);\n            return ((s && i.getText(s)));\n        },\n        update: function(q) {\n            var r = m(q);\n            if (r) {\n                h.conditionClass(r, \"uiStickyPlaceholderEmptyInput\", !q.value.length);\n            }\n        ;\n        ;\n        },\n        getVisibleText: function(q) {\n            var r = m(q);\n            if (h.hasClass(r, \"uiStickyPlaceholderEmptyInput\")) {\n                var s = n(r);\n                return ((s && i.getText(s)));\n            }\n             else return q.value\n        ;\n        }\n    };\n    e.exports = p;\n});\n__d(\"UIForm\", [\"JSBNG__Event\",\"ArbiterMixin\",\"BehaviorsMixin\",\"DOM\",\"Form\",\"Run\",\"areObjectsEqual\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"ArbiterMixin\"), i = b(\"BehaviorsMixin\"), j = b(\"DOM\"), k = b(\"Form\"), l = b(\"Run\"), m = b(\"areObjectsEqual\"), n = b(\"copyProperties\");\n    function o(p, q, r, s, t) {\n        this._root = p;\n        this.controller = p;\n        this._message = q;\n        if (s) {\n            this._confirm_dialog = s;\n            s.subscribe(\"JSBNG__confirm\", this._handleDialogConfirm.bind(this));\n            j.prependContent(this._root, j.create(\"input\", {\n                type: \"hidden\",\n                JSBNG__name: \"confirmed\",\n                value: \"true\"\n            }));\n        }\n    ;\n    ;\n        l.onAfterLoad(function() {\n            this._originalState = k.serialize(this._root);\n        }.bind(this));\n        this._forceDirty = r;\n        this._confirmed = false;\n        this._submitted = false;\n        g.listen(this._root, \"submit\", this._handleSubmit.bind(this));\n        if (((t && t.length))) {\n            this.enableBehaviors(t);\n        }\n    ;\n    ;\n        var u = true;\n        l.onBeforeUnload(this.checkUnsaved.bind(this), u);\n    };\n;\n    n(o.prototype, h, i, {\n        getRoot: function() {\n            return this._root;\n        },\n        _handleSubmit: function() {\n            if (((this._confirm_dialog && !this._confirmed))) {\n                this._confirm_dialog.show();\n                return false;\n            }\n        ;\n        ;\n            if (((this.inform(\"submit\") === false))) {\n                return false;\n            }\n        ;\n        ;\n            this._submitted = true;\n            return true;\n        },\n        _handleDialogConfirm: function() {\n            this._confirmed = true;\n            this._confirm_dialog.hide();\n            if (this._root.getAttribute(\"ajaxify\")) {\n                g.fire(this._root, \"submit\");\n            }\n             else if (this._handleSubmit()) {\n                this._root.submit();\n            }\n            \n        ;\n        ;\n        },\n        reset: function() {\n            this.inform(\"reset\");\n            this._submitted = false;\n            this._confirmed = false;\n        },\n        isDirty: function() {\n            if (((this._submitted || !j.contains(JSBNG__document.body, this._root)))) {\n                return false;\n            }\n        ;\n        ;\n            if (this._forceDirty) {\n                return true;\n            }\n        ;\n        ;\n            var p = k.serialize(this._root);\n            return !m(p, this._originalState);\n        },\n        checkUnsaved: function() {\n            if (this.isDirty()) {\n                return this._message;\n            }\n        ;\n        ;\n            return null;\n        }\n    });\n    e.exports = ((a.UIForm || o));\n});\n__d(\"MenuTheme\", [\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"cx\");\n    e.exports = {\n        className: \"_569t\"\n    };\n});\n__d(\"legacy:Tooltip\", [\"Tooltip\",], function(a, b, c, d) {\n    a.Tooltip = b(\"Tooltip\");\n}, 3);\n__d(\"BanzaiODS\", [\"Banzai\",\"invariant\",], function(a, b, c, d, e, f) {\n    var g = b(\"Banzai\"), h = b(\"invariant\");\n    function i() {\n        var k = {\n        };\n        function l(m, n, o, p) {\n            var q = ((k[m] || (k[m] = {\n            }))), r = ((q[n] || (q[n] = [0,])));\n            if (((o === undefined))) {\n                o = 1;\n            }\n        ;\n        ;\n            if (((p === undefined))) {\n                p = 1;\n            }\n        ;\n        ;\n            o = Number(o);\n            p = Number(p);\n            if (((!isFinite(o) || !isFinite(p)))) {\n                return;\n            }\n        ;\n        ;\n            r[0] += o;\n            if (((arguments.length >= 4))) {\n                if (!r[1]) {\n                    r[1] = 0;\n                }\n            ;\n            ;\n                r[1] += p;\n            }\n        ;\n        ;\n        };\n    ;\n        return {\n            bumpEntityKey: function(m, n, o) {\n                l(m, n, o);\n            },\n            bumpFraction: function(m, n, o, p) {\n                l(m, n, o, p);\n            },\n            flush: function(m) {\n                {\n                    var fin114keys = ((window.top.JSBNG_Replay.forInKeys)((k))), fin114i = (0);\n                    var n;\n                    for (; (fin114i < fin114keys.length); (fin114i++)) {\n                        ((n) = (fin114keys[fin114i]));\n                        {\n                            g.post(((\"ods:\" + n)), k[n], m);\n                        ;\n                        };\n                    };\n                };\n            ;\n                k = {\n                };\n            }\n        };\n    };\n;\n    var j = i();\n    j.create = i;\n    g.subscribe(g.SEND, j.flush.bind(j, null));\n    e.exports = j;\n});\n__d(\"endsWith\", [], function(a, b, c, d, e, f) {\n    function g(h, i) {\n        return ((h.indexOf(i, ((h.length - i.length))) > -1));\n    };\n;\n    e.exports = g;\n});\n__d(\"extendArray\", [], function(a, b, c, d, e, f) {\n    function g(h, i) {\n        Array.prototype.push.apply(h, i);\n        return h;\n    };\n;\n    e.exports = g;\n});");
// 1554
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"if (self.CavalryLogger) {\n    CavalryLogger.start_js([\"63VzN\",]);\n}\n;\n__d(\"NotificationURI\", [\"URI\",], function(a, b, c, d, e, f) {\n    var g = b(\"URI\"), h = {\n        localize: function(i) {\n            i = g(i);\n            if (!i.isFacebookURI()) {\n                return i.toString()\n            };\n            var j = i.getSubdomain();\n            return i.getUnqualifiedURI().getQualifiedURI().setSubdomain(j).toString();\n        },\n        snowliftable: function(i) {\n            if (!i) {\n                return false\n            };\n            i = g(i);\n            return (i.isFacebookURI() && i.getQueryData().hasOwnProperty(\"fbid\"));\n        },\n        isVaultSetURI: function(i) {\n            if (!i) {\n                return false\n            };\n            i = g(i);\n            return (i.isFacebookURI() && (i.getPath() == \"/ajax/vault/sharer_preview.php\"));\n        }\n    };\n    e.exports = h;\n});\n__d(\"legacy:fbdesktop-detect\", [\"FBDesktopDetect\",], function(a, b, c, d) {\n    a.FbDesktopDetect = b(\"FBDesktopDetect\");\n}, 3);\n__d(\"IntlUtils\", [\"AsyncRequest\",\"Cookie\",\"goURI\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = b(\"Cookie\"), i = b(\"goURI\"), j = {\n        setXmode: function(k) {\n            (new g()).setURI(\"/ajax/intl/save_xmode.php\").setData({\n                xmode: k\n            }).setHandler(function() {\n                document.location.reload();\n            }).send();\n        },\n        setAmode: function(k) {\n            new g().setURI(\"/ajax/intl/save_xmode.php\").setData({\n                amode: k,\n                app: false\n            }).setHandler(function() {\n                document.location.reload();\n            }).send();\n        },\n        setLocale: function(k, l, m, n) {\n            if (!m) {\n                m = k.options[k.selectedIndex].value;\n            };\n            j.saveLocale(m, true, null, l, n);\n        },\n        saveLocale: function(k, l, m, n, o) {\n            new g().setURI(\"/ajax/intl/save_locale.php\").setData({\n                aloc: k,\n                source: n,\n                app_only: o\n            }).setHandler(function(p) {\n                if (l) {\n                    document.location.reload();\n                }\n                 else i(m);\n            ;\n            }).send();\n        },\n        setLocaleCookie: function(k, l) {\n            h.set(\"locale\", k, ((7 * 24) * 3600000));\n            i(l);\n        }\n    };\n    e.exports = j;\n});\n__d(\"legacy:intl-base\", [\"IntlUtils\",], function(a, b, c, d) {\n    var e = b(\"IntlUtils\");\n    a.intl_set_xmode = e.setXmode;\n    a.intl_set_amode = e.setAmode;\n    a.intl_set_locale = e.setLocale;\n    a.intl_save_locale = e.saveLocale;\n    a.intl_set_cookie_locale = e.setLocaleCookie;\n}, 3);\n__d(\"legacy:onload-action\", [\"OnloadHooks\",], function(a, b, c, d) {\n    var e = b(\"OnloadHooks\");\n    a._onloadHook = e._onloadHook;\n    a._onafterloadHook = e._onafterloadHook;\n    a.runHook = e.runHook;\n    a.runHooks = e.runHooks;\n    a.keep_window_set_as_loaded = e.keepWindowSetAsLoaded;\n}, 3);\n__d(\"LoginFormController\", [\"Event\",\"ge\",\"Button\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"ge\"), i = b(\"Button\");\n    f.init = function(j, k) {\n        g.listen(j, \"submit\", function() {\n            i.setEnabled(k, false);\n            i.setEnabled.curry(k, true).defer(15000);\n        });\n        var l = h(\"lgnjs\");\n        if (l) {\n            l.value = parseInt((Date.now() / 1000), 10);\n        };\n    };\n});\n__d(\"ClickRefUtils\", [], function(a, b, c, d, e, f) {\n    var g = {\n        get_intern_ref: function(h) {\n            if (!!h) {\n                var i = {\n                    profile_minifeed: 1,\n                    gb_content_and_toolbar: 1,\n                    gb_muffin_area: 1,\n                    ego: 1,\n                    bookmarks_menu: 1,\n                    jewelBoxNotif: 1,\n                    jewelNotif: 1,\n                    BeeperBox: 1,\n                    navSearch: 1\n                };\n                for (var j = h; (j && (j != document.body)); j = j.parentNode) {\n                    if ((!j.id || (typeof j.id !== \"string\"))) {\n                        continue;\n                    };\n                    if ((j.id.substr(0, 8) == \"pagelet_\")) {\n                        return j.id.substr(8)\n                    };\n                    if ((j.id.substr(0, 8) == \"box_app_\")) {\n                        return j.id\n                    };\n                    if (i[j.id]) {\n                        return j.id\n                    };\n                };\n            }\n        ;\n            return \"-\";\n        },\n        get_href: function(h) {\n            var i = (((((h.getAttribute && ((h.getAttribute(\"ajaxify\") || h.getAttribute(\"data-endpoint\")))) || h.action) || h.href) || h.name));\n            return ((typeof i === \"string\") ? i : null);\n        },\n        should_report: function(h, i) {\n            if ((i == \"FORCE\")) {\n                return true\n            };\n            if ((i == \"INDIRECT\")) {\n                return false\n            };\n            return (h && ((g.get_href(h) || ((h.getAttribute && h.getAttribute(\"data-ft\"))))));\n        }\n    };\n    e.exports = g;\n});\n__d(\"setUECookie\", [\"Env\",], function(a, b, c, d, e, f) {\n    var g = b(\"Env\");\n    function h(i) {\n        if (!g.no_cookies) {\n            document.cookie = (((\"act=\" + encodeURIComponent(i)) + \"; path=/; domain=\") + window.location.hostname.replace(/^.*(\\.facebook\\..*)$/i, \"$1\"));\n        };\n    };\n    e.exports = h;\n});\n__d(\"ClickRefLogger\", [\"Arbiter\",\"EagleEye\",\"ClickRefUtils\",\"collectDataAttributes\",\"copyProperties\",\"ge\",\"setUECookie\",\"$\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"EagleEye\"), i = b(\"ClickRefUtils\"), j = b(\"collectDataAttributes\"), k = b(\"copyProperties\"), l = b(\"ge\"), m = b(\"setUECookie\"), n = b(\"$\");\n    function o(q) {\n        if (!l(\"content\")) {\n            return [0,0,0,0,]\n        };\n        var r = n(\"content\"), s = (a.Vector2 ? a.Vector2.getEventPosition(q) : {\n            x: 0,\n            y: 0\n        });\n        return [s.x,s.y,r.offsetLeft,r.clientWidth,];\n    };\n    function p(q, r, event, s) {\n        var t = ((!a.ArbiterMonitor) ? \"r\" : \"a\"), u = [0,0,0,0,], v, w, x;\n        if (!!event) {\n            v = event.type;\n            if (((v == \"click\") && l(\"content\"))) {\n                u = o(event);\n            };\n            var y = 0;\n            (event.ctrlKey && (y += 1));\n            (event.shiftKey && (y += 2));\n            (event.altKey && (y += 4));\n            (event.metaKey && (y += 8));\n            if (y) {\n                v += y;\n            };\n        }\n    ;\n        if (!!r) {\n            w = i.get_href(r);\n        };\n        var z = [];\n        if (a.ArbiterMonitor) {\n            x = a.ArbiterMonitor.getInternRef(r);\n            z = a.ArbiterMonitor.getActFields();\n        }\n    ;\n        var aa = j((!!event ? ((event.target || event.srcElement)) : r), [\"ft\",\"gt\",]);\n        k(aa.ft, (s.ft || {\n        }));\n        k(aa.gt, (s.gt || {\n        }));\n        if ((typeof (aa.ft.ei) === \"string\")) {\n            delete aa.ft.ei;\n        };\n        var ba = [q._ue_ts,q._ue_count,(w || \"-\"),q._context,(v || \"-\"),(x || i.get_intern_ref(r)),t,(a.URI ? a.URI.getRequestURI(true, true).getUnqualifiedURI().toString() : ((location.pathname + location.search) + location.hash)),aa,].concat(u).concat(z);\n        return ba;\n    };\n    g.subscribe(\"ClickRefAction/new\", function(q, r) {\n        if (i.should_report(r.node, r.mode)) {\n            var s = p(r.cfa, r.node, r.event, r.extra_data);\n            m(r.cfa.ue);\n            h.log(\"act\", s);\n            if (window.chromePerfExtension) {\n                window.postMessage({\n                    clickRef: JSON.stringify(s)\n                }, window.location.origin);\n            };\n        }\n    ;\n    });\n});\n__d(\"QuicklingAugmenter\", [\"URI\",], function(a, b, c, d, e, f) {\n    var g = b(\"URI\"), h = [], i = {\n        addHandler: function(j) {\n            h.push(j);\n        },\n        augmentURI: function(j) {\n            var k = [], l = g(j);\n            h.forEach(function(m) {\n                var n = m(l);\n                if (!n) {\n                    return l\n                };\n                k.push(m);\n                l = l.addQueryData(n);\n            });\n            h = k;\n            return l;\n        }\n    };\n    e.exports = i;\n});\n__d(\"Quickling\", [\"AjaxPipeRequest\",\"Arbiter\",\"Class\",\"CSSClassTransition\",\"DocumentTitle\",\"DOM\",\"ErrorUtils\",\"HTML\",\"OnloadHooks\",\"PageTransitions\",\"QuicklingAugmenter\",\"Run\",\"URI\",\"UserAgent\",\"copyProperties\",\"goOrReplace\",\"isEmpty\",\"QuicklingConfig\",], function(a, b, c, d, e, f) {\n    var g = b(\"AjaxPipeRequest\"), h = b(\"Arbiter\"), i = b(\"Class\"), j = b(\"CSSClassTransition\"), k = b(\"DocumentTitle\"), l = b(\"DOM\"), m = b(\"ErrorUtils\"), n = b(\"HTML\"), o = b(\"OnloadHooks\"), p = b(\"PageTransitions\"), q = b(\"QuicklingAugmenter\"), r = b(\"Run\"), s = b(\"URI\"), t = b(\"UserAgent\"), u = b(\"copyProperties\"), v = b(\"goOrReplace\"), w = b(\"isEmpty\"), x = b(\"QuicklingConfig\"), y = x.version, z = x.sessionLength, aa = new RegExp(x.inactivePageRegex), ba = 0, ca, da = \"\", ea = {\n        isActive: function() {\n            return true;\n        },\n        isPageActive: function(la) {\n            if ((la == \"#\")) {\n                return false\n            };\n            la = new s(la);\n            if ((la.getDomain() && (la.getDomain() != s().getDomain()))) {\n                return false\n            };\n            if ((la.getPath() == \"/l.php\")) {\n                var ma = la.getQueryData().u;\n                if (ma) {\n                    ma = s(unescape(ma)).getDomain();\n                    if ((ma && (ma != s().getDomain()))) {\n                        return false\n                    };\n                }\n            ;\n            }\n        ;\n            var na = la.getPath(), oa = la.getQueryData();\n            if (!w(oa)) {\n                na += (\"?\" + s.implodeQuery(oa));\n            };\n            return !aa.test(na);\n        },\n        getLoadCount: function() {\n            return ba;\n        }\n    };\n    function fa(la) {\n        la = (la || \"Facebook\");\n        k.set(la);\n        if (t.ie()) {\n            da = la;\n            if (!ca) {\n                ca = window.setInterval(function() {\n                    var ma = da, na = k.get();\n                    if ((ma != na)) {\n                        k.set(ma);\n                    };\n                }, 5000, false);\n            };\n        }\n    ;\n    };\n    function ga(la) {\n        var ma = document.getElementsByTagName(\"link\");\n        for (var na = 0; (na < ma.length); ++na) {\n            if ((ma[na].rel != \"alternate\")) {\n                continue;\n            };\n            l.remove(ma[na]);\n        };\n        if (la.length) {\n            var oa = l.find(document, \"head\");\n            (oa && l.appendContent(oa, n(la[0])));\n        }\n    ;\n    };\n    function ha(la) {\n        var ma = {\n            version: y\n        };\n        this.parent.construct(this, la, {\n            quickling: ma\n        });\n    };\n    i.extend(ha, g);\n    u(ha.prototype, {\n        _preBootloadFirstResponse: function(la) {\n            return true;\n        },\n        _fireDomContentCallback: function() {\n            (this._request.cavalry && this._request.cavalry.setTimeStamp(\"t_domcontent\"));\n            p.transitionComplete();\n            (this._onPageDisplayed && this._onPageDisplayed(this.pipe));\n            this.parent._fireDomContentCallback();\n        },\n        _fireOnloadCallback: function() {\n            if (this._request.cavalry) {\n                this._request.cavalry.setTimeStamp(\"t_hooks\");\n                this._request.cavalry.setTimeStamp(\"t_layout\");\n                this._request.cavalry.setTimeStamp(\"t_onload\");\n            }\n        ;\n            this.parent._fireOnloadCallback();\n        },\n        isPageActive: function(la) {\n            return ea.isPageActive(la);\n        },\n        _versionCheck: function(la) {\n            if ((la.version == y)) {\n                return true\n            };\n            var ma = [\"quickling\",\"ajaxpipe\",\"ajaxpipe_token\",];\n            v(window.location, s(la.uri).removeQueryData(ma), true);\n            return false;\n        },\n        _processFirstResponse: function(la) {\n            var ma = la.getPayload();\n            fa(ma.title);\n            ga((ma.syndication || []));\n            window.scrollTo(0, 0);\n            j.go(document.body, (ma.body_class || \"\"), p.getMostRecentURI(), la.getRequest().getURI());\n            h.inform(\"quickling/response\");\n        },\n        getSanitizedParameters: function() {\n            return [\"quickling\",];\n        }\n    });\n    function ia() {\n        ba++;\n        return (ba >= z);\n    };\n    function ja(la) {\n        g.setCurrentRequest(null);\n        if (ia()) {\n            return false\n        };\n        la = q.augmentURI(la);\n        if (!ea.isPageActive(la)) {\n            return false\n        };\n        window.ExitTime = Date.now();\n        r.__removeHook(\"onafterloadhooks\");\n        r.__removeHook(\"onloadhooks\");\n        o.runHooks(\"onleavehooks\");\n        h.inform(\"onload/exit\", true);\n        new ha(la).setCanvasId(\"content\").send();\n        return true;\n    };\n    function ka(la) {\n        var ma = window[la];\n        function na(oa, pa, qa) {\n            if ((typeof oa !== \"function\")) {\n                oa = eval.bind(null, oa);\n            };\n            var ra = ma(m.guard(oa), pa);\n            if ((pa > 0)) {\n                if ((qa !== false)) {\n                    r.onLeave(function() {\n                        clearInterval(ra);\n                    });\n                }\n            };\n            return ra;\n        };\n        window[la] = na;\n    };\n    r.onAfterLoad(function la() {\n        ka(\"setInterval\");\n        ka(\"setTimeout\");\n        p.registerHandler(ja, 1);\n    });\n    e.exports = a.Quickling = ea;\n});\n__d(\"ScubaSample\", [\"Banzai\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = \"scuba_sample\", h = b(\"Banzai\"), i = b(\"copyProperties\");\n    function j(m, n, o) {\n        this.fields = {\n        };\n        this.flush = function() {\n            if (!m) {\n                return\n            };\n            var p = {\n            };\n            i(p, this.fields);\n            p._ds = m;\n            if (n) {\n                p._lid = n;\n            };\n            p._options = o;\n            h.post(g, p);\n            this.flush = function() {\n            \n            };\n            this.flushed = true;\n        };\n        this.lid = n;\n        return this;\n    };\n    function k(m, n, o) {\n        if (!this.fields[m]) {\n            this.fields[m] = {\n            };\n        };\n        this.fields[m][n] = o;\n        return this;\n    };\n    function l(m) {\n        return function(n, o) {\n            if (this.flushed) {\n                return this\n            };\n            return k.call(this, m, n, o);\n        };\n    };\n    i(j.prototype, {\n        addNormal: l(\"normal\"),\n        addInteger: l(\"int\"),\n        addDenorm: l(\"denorm\")\n    });\n    e.exports = j;\n});\n__d(\"ScriptMonitorReporter\", [\"ScriptMonitor\",\"ScubaSample\",\"setTimeoutAcrossTransitions\",\"URI\",], function(a, b, c, d, e, f) {\n    var g = b(\"ScriptMonitor\"), h = b(\"ScubaSample\"), i = b(\"setTimeoutAcrossTransitions\"), j = b(\"URI\");\n    function k(o) {\n        var p = [];\n        for (var q = 0; (q < o.length); q++) {\n            p.push(new RegExp(o[q], \"i\"));;\n        };\n        return p;\n    };\n    function l(o, p) {\n        for (var q = 0; (q < p.length); q++) {\n            if (p[q].src) {\n                o.push(p[q].src);\n            };\n        };\n    };\n    function m(o, p) {\n        for (var q = 0; (q < p.length); q++) {\n            if (p[q].test(o)) {\n                return true\n            };\n        };\n        return false;\n    };\n    function n(o, p) {\n        var q = g.stop(), r = {\n            addGeoFields: 1,\n            addBrowserFields: 1,\n            addUser: 1\n        }, s = {\n        };\n        l(q, document.getElementsByTagName(\"script\"));\n        l(q, document.getElementsByTagName(\"iframe\"));\n        for (var t = 0; (t < q.length); t++) {\n            var u = q[t].replace(/\\?.*/, \"\"), v;\n            if (s[u]) {\n                continue;\n            };\n            s[u] = 1;\n            if (!j.isValidURI(u)) {\n                v = true;\n            }\n             else if (m(u, p)) {\n                v = false;\n            }\n             else if (m(new j(u).getDomain(), o)) {\n                v = false;\n            }\n             else v = true;\n            \n            \n        ;\n            if (v) {\n                new h(\"unknown_scripts\", 0, r).addNormal(\"url\", u).flush();\n            };\n        };\n    };\n    e.exports = {\n        runScan: function(o, p) {\n            i(function() {\n                n(k(o), k(p));\n            }, 5000);\n        }\n    };\n});\n__d(\"StringTransformations\", [], function(a, b, c, d, e, f) {\n    e.exports = {\n        unicodeEscape: function(g) {\n            return g.replace(/[^A-Za-z0-9\\-\\.\\:\\_\\$\\/\\+\\=]/g, function(h) {\n                var i = h.charCodeAt().toString(16);\n                return (\"\\\\u\" + ((\"0000\" + i.toUpperCase())).slice(-4));\n            });\n        },\n        unicodeUnescape: function(g) {\n            return g.replace(/(\\\\u[0-9A-Fa-f]{4})/g, function(h) {\n                return String.fromCharCode(parseInt(h.slice(2), 16));\n            });\n        }\n    };\n});\n__d(\"TimeSpentLogger\", [\"Arbiter\",\"Banzai\",\"CSS\",\"ClickRefUtils\",\"DOMEventListener\",\"ScriptPath\",\"UserActivity\",\"collectDataAttributes\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"Banzai\"), i = b(\"CSS\"), j = b(\"ClickRefUtils\"), k = b(\"DOMEventListener\"), l = b(\"ScriptPath\"), m = b(\"UserActivity\"), n = b(\"collectDataAttributes\"), o = b(\"copyProperties\"), p = [m.getLastInformTime(),0,], q = m.getLastInformTime(), r = {\n        tos_seq: 0,\n        tos_cumulative: 0,\n        transport_cause: null,\n        buenopath: null,\n        page_token: null,\n        elements: 0,\n        uact_tos: null,\n        client_time: null\n    }, s = 100, t = 100, u = (10 * 1000), v = (3 * 1000), w = 1, x = 2, y = 4, z = 8, aa = {\n    };\n    m.subscribe(function(ia, ja) {\n        var ka = (p.length - 1);\n        q = ja.last_inform;\n        if ((ja.idleness < v)) {\n            p[ka] += ja.idleness;\n            r.tos_cumulative += ja.idleness;\n        }\n         else {\n            if ((ka > s)) {\n                fa(\"array_limit_reached\");\n            };\n            p.push(ja.idleness, 0);\n        }\n    ;\n    });\n    function ba(ia) {\n        var ja = 0;\n        if (document.getElementById(\"boulder_fixed_header\")) {\n            ja = (ja | w);\n        };\n        if (i.hasClass(document.body, \"timelineLayout\")) {\n            ja = (ja | y);\n            var ka = document.getElementById(\"pagelet_main_column_personal\");\n            if ((ka && (ka.getAttribute(\"data-referrer\") === \"pagelet_main_column_personal_timeline\"))) {\n                ja = (ja | x);\n            };\n            if (i.hasClass(document.body, \"pagesTimelineLayout\")) {\n                ja = (ja | z);\n            };\n        }\n    ;\n        return ja;\n    };\n    function ca(ia) {\n        var ja = ba(), ka = l.getScriptPath(), la = l.getCategoryToken();\n        r.uact_tos = p;\n        if (ka) {\n            r.buenopath = ka.substring(0, t);\n        }\n         else r.buenopath = \"\";\n    ;\n        if (la) {\n            r.page_token = la;\n        }\n         else r.page_token = \"\";\n    ;\n        r.elements = ja;\n        r.transport_cause = ia;\n        r.client_time = Date.now();\n    };\n    function da() {\n        r.tos_seq += 1;\n        p = [q,0,];\n    };\n    var ea = {\n        store: true,\n        delay: 3000,\n        retry: true\n    };\n    function fa(ia) {\n        ca(ia);\n        if (h.isEnabled(\"time_spent\")) {\n            g.inform(\"timespent/tosdataposted\", o({\n            }, r));\n            h.post(\"time_spent\", o({\n            }, r), ea);\n        }\n    ;\n        da();\n    };\n    function ga() {\n        fa(\"heartbeat\");\n    };\n    function ha() {\n        fa(\"before_unload\");\n    };\n    if ((window.top == window.self)) {\n        k.add(window, \"beforeunload\", ha);\n        setInterval(function() {\n            if ((((Date.now() - m.getLastInformTime()) > ((u - 100))) && (((p.length > 2) || (p[(p.length - 1)] > 0))))) {\n                ga();\n            };\n        }, u);\n    }\n;\n    g.subscribe(\"UserAction/new\", function(ia, ja) {\n        if (j.should_report(ja.node, ja.mode)) {\n            var ka = n(ja.node, [\"gt\",]), la = {\n                iref: j.get_intern_ref(ja.node),\n                gt_ref: ka.ref,\n                nav_section: ka.nav_section\n            };\n            ca(\"useraction\");\n            o(la, r);\n            ja.ua.add_data(la);\n            g.inform(\"timespent/tosdataposted\", o({\n            }, r));\n            da();\n        }\n    ;\n    });\n    e.exports = aa;\n});\n__d(\"UserActionHistory\", [\"Arbiter\",\"ClickRefUtils\",\"ScriptPath\",\"throttle\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ClickRefUtils\"), i = b(\"ScriptPath\"), j = b(\"throttle\"), k = {\n        click: 1,\n        submit: 1\n    }, l = false, m = {\n        log: [],\n        len: 0\n    }, n = j.acrossTransitions(function() {\n        try {\n            l._ua_log = JSON.stringify(m);\n        } catch (q) {\n            l = false;\n        };\n    }, 1000);\n    function o() {\n        try {\n            if (a.sessionStorage) {\n                l = a.sessionStorage;\n                (l._ua_log && (m = JSON.parse(l._ua_log)));\n            }\n        ;\n        } catch (q) {\n            l = false;\n        };\n        m.log[(m.len % 10)] = {\n            ts: Date.now(),\n            path: \"-\",\n            index: m.len,\n            type: \"init\",\n            iref: \"-\"\n        };\n        m.len++;\n        g.subscribe(\"UserAction/new\", function(r, s) {\n            var t = s.ua, u = s.node, event = s.event;\n            if ((!event || !((event.type in k)))) {\n                return\n            };\n            var v = {\n                path: i.getScriptPath(),\n                type: event.type,\n                ts: t._ue_ts,\n                iref: (h.get_intern_ref(u) || \"-\"),\n                index: m.len\n            };\n            m.log[(m.len++ % 10)] = v;\n            (l && n());\n        });\n    };\n    function p() {\n        return m.log.sort(function(q, r) {\n            return (((r.ts != q.ts)) ? ((r.ts - q.ts)) : ((r.index - q.index)));\n        });\n    };\n    o();\n    e.exports = {\n        getHistory: p\n    };\n});\n__d(\"clip\", [], function(a, b, c, d, e, f) {\n    function g(h, i, j) {\n        return Math.min(Math.max(h, i), j);\n    };\n    e.exports = g;\n});\n__d(\"MusicButtonStore\", [], function(a, b, c, d, e, f) {\n    var g = {\n    }, h = {\n        addButton: function(i, j) {\n            g[i] = j;\n            return j;\n        },\n        getButton: function(i) {\n            return g[i];\n        },\n        getButtons: function() {\n            return g;\n        },\n        removeButton: function(i) {\n            (g[i] && g[i].resetLoadingTimers());\n            delete g[i];\n        }\n    };\n    e.exports = h;\n});\n__d(\"MusicConstants\", [\"URI\",], function(a, b, c, d, e, f) {\n    var g = b(\"URI\"), h = {\n        DEBUG: false,\n        LIVE_LISTEN_MIN_SPOTIFY_VERSION: \"spotify-0.6.6.0.g5a9eaca5\",\n        enableDebug: function() {\n            this.DEBUG = true;\n        },\n        sameURLs: function(i, j) {\n            var k = /\\/$/;\n            if ((i && j)) {\n                i = g(i);\n                j = g(j);\n                return ((i.getDomain() == j.getDomain()) && (i.getPath() == j.getPath()));\n            }\n        ;\n            return false;\n        },\n        greaterOrEqualToMinimumVersion: function(i, j) {\n            var k = /(?:\\d+\\.)+/, l = i.match(k)[0].split(\".\").slice(0, -1), m = j.match(k)[0].split(\".\").slice(0, -1);\n            if ((l.length !== m.length)) {\n                return false\n            };\n            for (var n = 0; (n < m.length); n++) {\n                if ((+l[n] < +m[n])) {\n                    return false;\n                }\n                 else if ((+l[n] > +m[n])) {\n                    return true\n                }\n            ;\n            };\n            return true;\n        },\n        sanitizeForProviders: function(i) {\n            var j = {\n            };\n            for (var k in i) {\n                if (this.ALLOWED_EXTERNAL_CONTEXT_PARAMS[k]) {\n                    j[k] = i[k];\n                };\n            };\n            return j;\n        },\n        OP: {\n            RESUME: \"RESUME\",\n            PAUSE: \"PAUSE\",\n            PLAY: \"PLAY\",\n            VERSION: \"VERSION\"\n        },\n        STATUS_CHANGE_OP: {\n            STATUS: \"STATUS\",\n            LOGIN: \"LOGIN\",\n            REINFORM: \"REINFORM\"\n        },\n        STATUS_CHANGE_EVENT: {\n            playing: \"PLAY_STATE_CHANGED\",\n            track: \"TRACK_CHANGED\"\n        },\n        DIAGNOSTIC_EVENT: {\n            ALL_PAUSED: \"ALL_PAUSED\",\n            ALL_OFFLINE: \"ALL_OFFLINE\",\n            OFFLINE: \"OFFLINE\",\n            ONLINE: \"ONLINE\",\n            SEARCHING: \"SEARCHING\",\n            HIT: \"HIT\",\n            MISS: \"MISS\",\n            RESIGN: \"RESIGN\",\n            IFRAME_POLLING: \"IFRAME_POLLING\",\n            RELAUNCH: \"RELAUNCH\",\n            STATE_CHANGE: \"STATE_CHANGE\",\n            WRONG_VERSION: \"WRONG_VERSION\",\n            SERVICE_ERROR: \"SERVICE_ERROR\",\n            INCORRECT_ONLINE_STATE: \"INCORRECT_ONLINE_STATE\",\n            LOG_SEND_OP: \"LOG_SEND_OP\",\n            REQUEUE_OP: \"REQUEUE_OP\"\n        },\n        ALLOWED_STATUS_PARAMS: {\n            playing: \"playing\",\n            track: \"track\",\n            context: \"context\",\n            client_version: \"client_version\",\n            start_time: \"start_time\",\n            expires_in: \"expires_in\",\n            open_graph_state: \"open_graph_state\"\n        },\n        ALLOWED_EXTERNAL_CONTEXT_PARAMS: {\n            uri: true,\n            song: true,\n            radio_station: true,\n            album: true,\n            playlist: true,\n            musician: true,\n            song_list: true,\n            offset: true,\n            title: true,\n            request_id: true,\n            listen_with_friends: true,\n            needs_tos: true\n        },\n        LIVE_LISTEN_OP: {\n            NOW_LEADING: \"NOW_LEADING\",\n            NOW_LISTENING: \"NOW_LISTENING\",\n            END_SESSION: \"END_SESSION\",\n            SONG_PLAYING: \"SONG_PLAYING\",\n            LISTENER_UPDATE: \"LISTENER_UPDATE\",\n            QUEUE_SESSION: \"QUEUE_SESSION\",\n            PLAY_ERROR: \"PLAY_ERROR\",\n            SESSION_UPDATED: \"SESSION_UPDATED\",\n            QUEUING_SESSION: \"QUEUING_SESSION\"\n        },\n        MUSIC_BUTTON: {\n            ACTIVATE: \"ACTIVATE\"\n        },\n        ERROR: {\n            1: \"SERVICE_UNAVAILABLE_WITHOUT_PREMIUM\",\n            2: \"SERVICE_UNAVAILABLE_WITHOUT_PREMIUM_OR_WAIT\",\n            3: \"SERVICE_UNAVAILABLE_BILLING_ISSUE\",\n            4: \"SERVICE_UNAVAILABLE_TECHNICAL_ISSUE\",\n            5: \"AUDIO_AD_PLAYING\",\n            99: \"SERVICE_TEMPORARILY_UNAVAILABLE\",\n            101: \"SONG_UNAVAILABLE_WITHOUT_PURCHASE\",\n            102: \"SONG_UNAVAILABLE_WITHOUT_PREMIUM\",\n            103: \"SONG_UNAVAILABLE_INDEFINITELY\"\n        }\n    };\n    e.exports = (a.MusicConstants || h);\n});\n__d(\"MusicEvents\", [\"Arbiter\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\");\n    e.exports = a.MusicEvents = new g();\n});\n__d(\"MusicButton\", [\"BanzaiODS\",\"Bootloader\",\"copyProperties\",\"CSS\",\"DOM\",\"MusicButtonStore\",\"MusicConstants\",\"MusicEvents\",\"Parent\",\"ScubaSample\",\"Tooltip\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"BanzaiODS\"), h = b(\"Bootloader\"), i = b(\"copyProperties\"), j = b(\"CSS\"), k = b(\"DOM\"), l = b(\"MusicButtonStore\"), m = b(\"MusicConstants\"), n = b(\"MusicEvents\"), o = b(\"Parent\"), p = b(\"ScubaSample\"), q = b(\"Tooltip\"), r = b(\"cx\"), s = function(t, u, v, w, x, y) {\n        this.provider = t;\n        this.buttonElem = u;\n        this.url = v;\n        this.context = (w || {\n        });\n        this.mediaType = x;\n        this.setState(this.STATES.OFFLINE);\n        this.tooltip = (y || \"\");\n        n.subscribe(m.MUSIC_BUTTON.ACTIVATE, this.processClick.bind(this));\n    };\n    i(s, {\n        tracksetableTypes: []\n    });\n    i(s.prototype, {\n        SHOW_LOADING_TIMEOUT: 500,\n        HIDE_LOADING_TIMEOUT: 4000,\n        RECENTLY_ONLINE_TIMEOUT: 6000,\n        STATES: {\n            PLAYING: \"music_playing\",\n            PAUSED: \"music_paused\",\n            LOADING: \"music_loading\",\n            DISABLED: \"music_disabled\",\n            OFFLINE: \"music_offline\"\n        },\n        setState: function(t) {\n            if ((t !== this.STATES.LOADING)) {\n                this.resetLoadingTimers();\n                this.previousState = (this.state || t);\n            }\n        ;\n            if ((t === this.STATES.PLAYING)) {\n                q.set(this.buttonElem, this.tooltip);\n            }\n             else q.set(this.buttonElem, \"\");\n        ;\n            var u = this.buttonElem.parentNode;\n            (this.state && j.removeClass(u, this.state));\n            this.state = t;\n            j.addClass(u, this.state);\n        },\n        isTracksetable: function(t) {\n            return (s.tracksetableTypes.indexOf(this.mediaType) !== -1);\n        },\n        handleIncomingEvent: function(t, u) {\n            clearTimeout(this._showLoadingTimer);\n            if (((u && u.provider) && (u.provider != this.provider))) {\n                return\n            };\n            switch (t) {\n              case m.DIAGNOSTIC_EVENT.ONLINE:\n            \n              case m.STATUS_CHANGE_EVENT.track:\n            \n              case m.STATUS_CHANGE_EVENT.playing:\n                var v = ((u && u.track) && u.track.uri), w = ((u && u.context) && u.context.uri);\n                if (((u && u.playing) && ((m.sameURLs(v, this.url) || m.sameURLs(w, this.url))))) {\n                    this.setState(this.STATES.PLAYING);\n                }\n                 else if (((this.state === this.STATES.LOADING) && (((this.previousState === this.STATES.PAUSED) || (this.previousState === this.STATES.OFFLINE))))) {\n                    clearTimeout(this._attemptingPlayTimer);\n                    this._attemptingPlayTimer = this.setState.bind(this, this.STATES.PAUSED).defer(this.RECENTLY_ONLINE_TIMEOUT, false);\n                }\n                 else if (!this._attemptingPlayTimer) {\n                    this.setState(this.STATES.PAUSED);\n                }\n                \n            ;\n                break;\n              case m.DIAGNOSTIC_EVENT.OFFLINE:\n                this.setState(this.STATES.OFFLINE);\n                break;\n              case m.DIAGNOSTIC_EVENT.ALL_OFFLINE:\n                this.setState(this.STATES.OFFLINE);\n                break;\n            };\n        },\n        processClick: function(t, u) {\n            if ((u != this.buttonElem)) {\n                if ((this.state === this.STATES.LOADING)) {\n                    (this.previousState && this.setState(this.previousState));\n                };\n                return;\n            }\n        ;\n            var v = new p(\"music_play_button_click\", null, {\n                addBrowserFields: true,\n                addGeoFields: true,\n                addUser: true\n            });\n            v.addNormal(\"uses_bridge\", \"1\");\n            v.addNormal(\"state\", this.state);\n            v.addNormal(\"provider\", this.provider);\n            v.addNormal(\"class\", \"MusicButton\");\n            v.addDenorm(\"url\", this.url);\n            v.flush();\n            if ((this.state != this.STATES.PLAYING)) {\n                g.bumpEntityKey(\"music_play_button\", \"music_play_button_click\");\n                g.bumpEntityKey(\"music_play_button\", (\"music_play_button_click.\" + this.provider));\n                var w = o.byClass(this.buttonElem, \"_4--s\");\n                if (w) {\n                    j.addClass(w, \"_4--t\");\n                    j.removeClass.curry(w, \"_4--t\").defer(3000);\n                }\n            ;\n            }\n        ;\n            var x = (this.isTracksetable() && o.byClass(this.buttonElem, \"music_trackset_container\")), y = [];\n            if (x) {\n                var z = x.getAttribute(\"data-trackset-title\"), aa = this.provider, ba = k.scry(x, \".music_button\");\n                for (var ca = 0; (ca < ba.length); ca++) {\n                    var da = l.getButton([ba[ca].id,]);\n                    if (((da && (da.provider == aa)) && da.isTracksetable())) {\n                        y.push(da.url);\n                    };\n                };\n            }\n        ;\n            if (!a.Music) {\n                this.showLoading(true);\n            };\n            h.loadModules([\"Music\",], function(ea) {\n                var fa = (((x && (y.length > 1))) ? ea.playPauseSongList(this.provider, this.url, y, z, this.context) : ea.playPauseSong(this.provider, this.url, this.context));\n                this.showLoading(!fa);\n            }.bind(this));\n        },\n        showLoading: function(t) {\n            this.resetLoadingTimers();\n            this._hideLoadingTimer = this._timeout.bind(this, t).defer(this.HIDE_LOADING_TIMEOUT, false);\n            this._showLoadingTimer = this.setState.bind(this, this.STATES.LOADING).defer(this.SHOW_LOADING_TIMEOUT, false);\n        },\n        resetLoadingTimers: function() {\n            clearTimeout(this._hideLoadingTimer);\n            clearTimeout(this._showLoadingTimer);\n            clearTimeout(this._attemptingPlayTimer);\n            this._attemptingPlayTimer = null;\n        },\n        destroy: function() {\n            this.resetLoadingTimers();\n            this.buttonElem = null;\n        },\n        _timeout: function(t) {\n            (a.Music && a.Music.reInform([this.provider,]));\n            if ((!t && (this.state === this.STATES.LOADING))) {\n                this.setState(this.STATES.PAUSED);\n            };\n        }\n    });\n    e.exports = s;\n});\n__d(\"MusicButtonManager\", [\"Event\",\"DOM\",\"KeyedCallbackManager\",\"Layer\",\"MusicButton\",\"MusicButtonStore\",\"MusicConstants\",\"MusicEvents\",\"Parent\",\"$\",\"copyProperties\",\"ge\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"DOM\"), i = b(\"KeyedCallbackManager\"), j = b(\"Layer\"), k = b(\"MusicButton\"), l = b(\"MusicButtonStore\"), m = b(\"MusicConstants\"), n = b(\"MusicEvents\"), o = b(\"Parent\"), p = b(\"$\"), q = b(\"copyProperties\"), r = b(\"ge\"), s = new i(), t = null, u = {\n    }, v = 0;\n    function w(da) {\n        var ea = da.getTarget(), fa = o.byClass(ea, \"music_button\");\n        fa = (fa || ((!((da.getModifiers && da.getModifiers().any)) && x(ea))));\n        if (!fa) {\n            return\n        };\n        return y(fa, da);\n    };\n    function x(da) {\n        var ea = (o.byClass(da, \"music_button_trigger\") && o.byClass(da, \"music_button_trigger_group\"));\n        if (ea) {\n            var fa = h.scry(ea, \".music_button\");\n            if (fa.length) {\n                return fa[0]\n            };\n        }\n    ;\n        return null;\n    };\n    function y(da, event) {\n        (event && event.stop());\n        n.inform(m.MUSIC_BUTTON.ACTIVATE, da);\n        return false;\n    };\n    function z(da) {\n        (a.Music && a.Music.reInform(da));\n    };\n    function aa(da, ea) {\n        var fa = l.getButtons();\n        for (var ga in fa) {\n            if ((fa[ga].noGC || r(ga))) {\n                fa[ga].handleIncomingEvent(da, ea);\n            }\n             else l.removeButton(ga);\n        ;\n        };\n    };\n    var ba = {\n        init: function(da) {\n            if (t) {\n                return\n            };\n            t = true;\n            k.tracksetableTypes = (da || []);\n            g.listen(document.body, \"click\", w);\n            n.subscribe([m.STATUS_CHANGE_EVENT.playing,m.STATUS_CHANGE_EVENT.track,m.DIAGNOSTIC_EVENT.OFFLINE,m.DIAGNOSTIC_EVENT.ALL_OFFLINE,m.DIAGNOSTIC_EVENT.ONLINE,], aa);\n        },\n        add: function(da, ea, fa, ga, ha, ia) {\n            (t || ba.init());\n            var ja = ea.id, ka = l.getButton(ja);\n            if (ka) {\n                return ka\n            };\n            ka = l.addButton(ja, new k(da, ea, fa, q({\n                button_id: ja\n            }, ga), ha, ia));\n            var la = o.byClass(ea, \"uiOverlay\");\n            if (la) {\n                ka.noGC = true;\n                var ma = j.subscribe(\"destroy\", function(na, oa) {\n                    if (h.contains(oa.getRoot(), ea)) {\n                        l.removeButton(ja);\n                        j.unsubscribe(ma);\n                    }\n                ;\n                });\n            }\n        ;\n            if ((da && !u[da])) {\n                u[da] = function() {\n                    var na = Object.keys(u);\n                    (na.length && z(na));\n                    u = {\n                    };\n                }.defer();\n            };\n            return ka;\n        },\n        addButton: function(da, ea, fa, ga, ha, ia) {\n            if (!r(ea)) {\n                return\n            };\n            var ja = p(ea);\n            return ba.add(da, ja, fa, ga, ha, ia);\n        },\n        asyncAddMusicButton: function(da, ea) {\n            da.setAttribute(\"id\", (\"music_button_\" + v++));\n            ca(da, ea);\n        },\n        tryAddButtonInDOM: function(da, ea) {\n            var fa = r(da);\n            (fa && ca(fa, ea));\n        },\n        addMusicData: function(da, ea, fa, ga, ha, ia) {\n            s.setResource(da, {\n                provider: ea,\n                uri: fa,\n                context: ga,\n                media_type: ha,\n                tooltip: ia\n            });\n        }\n    };\n    function ca(da, ea) {\n        var fa = h.find(da, \"a.button_anchor\").getAttribute(\"href\");\n        s.executeOrEnqueue(fa, function(ga) {\n            return ba.add(ga.provider, da, ga.uri, ga.context, ga.media_type, (ea ? ga.tooltip : \"\"));\n        });\n    };\n    e.exports = (a.MusicButtonManager || ba);\n});\n__d(\"TinyViewport\", [\"Arbiter\",\"CSS\",\"DOM\",\"Event\",\"queryThenMutateDOM\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"CSS\"), i = b(\"DOM\"), j = b(\"Event\"), k = b(\"queryThenMutateDOM\"), l = document.documentElement, m, n, o = k.bind(null, function() {\n        n = (n || i.getDocumentScrollElement());\n        m = ((l.clientHeight < 400) || (l.clientWidth < n.scrollWidth));\n    }, function() {\n        h.conditionClass(l, \"tinyViewport\", m);\n        h.conditionClass(l, \"canHaveFixedElements\", !m);\n    }, \"TinyViewport\");\n    o();\n    g.subscribe(\"quickling/response\", o);\n    j.listen(window, \"resize\", o);\n});\n__d(\"TimeSpentArray\", [\"Banzai\",\"pageID\",], function(a, b, c, d, e, f) {\n    var g = b(\"Banzai\"), h = b(\"pageID\"), i = 2, j = (i * 32), k = 1500, l, m, n, o, p, q, r, s, t;\n    function u() {\n        if (l) {\n            var ca = Date.now();\n            if ((ca > p)) {\n                r = Math.min(j, Math.ceil((((ca / 1000)) - o)));\n            };\n            var da = z();\n            if (da) {\n                l(da);\n            };\n        }\n    ;\n        y();\n    };\n    function v() {\n        w();\n        m = setTimeout(u, ((n * 1000) + k), false);\n    };\n    function w() {\n        if (m) {\n            clearTimeout(m);\n            m = null;\n        }\n    ;\n    };\n    function x(ca) {\n        o = ca;\n        p = (o * 1000);\n        q = [1,];\n        for (var da = 1; (da < i); da++) {\n            q.push(0);;\n        };\n        r = 1;\n        s += 1;\n        t += 1;\n        v();\n    };\n    function y() {\n        w();\n        q = null;\n        n = j;\n    };\n    function z() {\n        if (!q) {\n            return null\n        };\n        return {\n            tos_id: h,\n            start_time: o,\n            tos_array: q.slice(0),\n            tos_len: r,\n            tos_seq: t,\n            tos_cum: s\n        };\n    };\n    function aa(ca) {\n        if (((ca >= p) && (((ca - p)) < 1000))) {\n            return\n        };\n        ba(Math.floor((ca / 1000)));\n    };\n    function ba(ca) {\n        var da = (ca - o);\n        if (((da < 0) || (da >= j))) {\n            u();\n        };\n        if (!q) {\n            x(ca);\n        }\n         else {\n            q[(da >> 5)] |= ((1 << ((da & 31))));\n            r = (da + 1);\n            s += 1;\n            p = (ca * 1000);\n        }\n    ;\n    };\n    e.exports = {\n        init: function(ca, da) {\n            s = 0;\n            t = -1;\n            l = ca;\n            n = (da || j);\n            x(Math.floor((Date.now() / 1000)));\n            g.subscribe(g.SHUTDOWN, u);\n        },\n        update: function(ca) {\n            aa(ca);\n        },\n        get: function() {\n            return z();\n        },\n        ship: function() {\n            u();\n        },\n        reset: function() {\n            y();\n        }\n    };\n});\n__d(\"WebStorageMonster\", [\"Event\",\"AsyncRequest\",\"UserActivity\",\"StringTransformations\",\"arrayContains\",\"setTimeoutAcrossTransitions\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"AsyncRequest\"), i = b(\"UserActivity\"), j = b(\"StringTransformations\"), k = b(\"arrayContains\"), l = b(\"setTimeoutAcrossTransitions\"), m = 300000, n = false;\n    function o(t) {\n        var u = {\n        };\n        for (var v in t) {\n            var w = t.getItem(v), x = j.unicodeEscape(v);\n            if ((typeof w === \"string\")) {\n                u[x] = w.length;\n            };\n        };\n        return u;\n    };\n    function p(t) {\n        if ((a.localStorage && t.keys)) {\n            s._getLocalStorageKeys().forEach(function(u) {\n                if (k(t.keys, u)) {\n                    a.localStorage.removeItem(u);\n                };\n            });\n        };\n    };\n    function q(t) {\n        if (a.localStorage) {\n            s._getLocalStorageKeys().forEach(function(u) {\n                if (!t.some(function(v) {\n                    return new RegExp(v).test(u);\n                })) {\n                    a.localStorage.removeItem(u);\n                };\n            });\n        };\n        if (a.sessionStorage) {\n            a.sessionStorage.clear();\n        };\n    };\n    function r(t) {\n        if (i.isActive(m)) {\n            l(r.curry(t), m);\n        }\n         else s.cleanNow(t);\n    ;\n    };\n    var s = {\n        registerLogoutForm: function(t, u) {\n            g.listen(t, \"submit\", function(v) {\n                s.cleanOnLogout(u);\n            });\n        },\n        schedule: function(t) {\n            if (n) {\n                return\n            };\n            n = true;\n            r(t);\n        },\n        cleanNow: function(t) {\n            var u = Date.now(), v = {\n            }, w = false;\n            [\"localStorage\",\"sessionStorage\",].forEach(function(y) {\n                if (a[y]) {\n                    v[y] = o(a[y]);\n                    w = true;\n                }\n            ;\n            });\n            var x = Date.now();\n            v.logtime = (x - u);\n            if (w) {\n                new h(\"/ajax/webstorage/process_keys.php\").setData(v).setHandler(function(y) {\n                    if (!t) {\n                        var z = y.getPayload();\n                        if (z.keys) {\n                            z.keys = z.keys.map(j.unicodeUnescape);\n                        };\n                        p(z);\n                    }\n                ;\n                }.bind(this)).send();\n            };\n        },\n        cleanOnLogout: function(t) {\n            if (t) {\n                q(t);\n            };\n            if (a.sessionStorage) {\n                a.sessionStorage.clear();\n            };\n        },\n        _getLocalStorageKeys: Object.keys.curry(a.localStorage)\n    };\n    e.exports = s;\n});");
// 1555
geval("if (JSBNG__self.CavalryLogger) {\n    CavalryLogger.start_js([\"AsDOA\",]);\n}\n;\n;\n__d(\"AdblockDetector\", [], function(a, b, c, d, e, f) {\n    var g = \"data-adblock-hash\", h = {\n    }, i = 0;\n    function j(k, l) {\n        var m = k.getAttribute(g);\n        if (!m) {\n            m = ++i;\n            k.setAttribute(g, m);\n        }\n         else if (h[m]) {\n            JSBNG__clearTimeout(h[m]);\n            h[m] = null;\n        }\n        \n    ;\n    ;\n        h[m] = JSBNG__setTimeout(function() {\n            h[m] = null;\n            if (!k.offsetHeight) {\n                var n = k, o = JSBNG__document.getElementsByTagName(\"body\")[0];\n                while (((n && ((n !== o))))) {\n                    if (((((((((((n.style.display === \"none\")) || ((n.style.height === \"0px\")))) || ((n.style.height === 0)))) || ((n.style.height === \"0\")))) || ((n.childNodes.length === 0))))) {\n                        return;\n                    }\n                ;\n                ;\n                    n = n.parentNode;\n                };\n            ;\n                if (((n === o))) {\n                    ((l && l(k)));\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n        }, 3000);\n    };\n;\n    f.assertUnblocked = j;\n});\n__d(\"EagleEye\", [\"Arbiter\",\"Env\",\"OnloadEvent\",\"isInIframe\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"Env\"), i = b(\"OnloadEvent\"), j = b(\"isInIframe\"), k = ((h.eagleEyeConfig || {\n    })), l = \"_e_\", m = ((window.JSBNG__name || \"\")).toString();\n    if (((((m.length == 7)) && ((m.substr(0, 3) == l))))) {\n        m = m.substr(3);\n    }\n     else {\n        m = k.seed;\n        if (!j()) {\n            window.JSBNG__name = ((l + m));\n        }\n    ;\n    ;\n    }\n;\n;\n    var n = ((((((window.JSBNG__location.protocol == \"https:\")) && JSBNG__document.cookie.match(/\\bcsm=1/))) ? \"; secure\" : \"\")), o = ((((l + m)) + \"_\")), p = new JSBNG__Date(((JSBNG__Date.now() + 604800000))).toGMTString(), q = window.JSBNG__location.hostname.replace(/^.*(facebook\\..*)$/i, \"$1\"), r = ((((((((\"; expires=\" + p)) + \";path=/; domain=\")) + q)) + n)), s = 0, t, u = ((k.JSBNG__sessionStorage && a.JSBNG__sessionStorage)), v = JSBNG__document.cookie.length, w = false, x = JSBNG__Date.now();\n    function y(ca) {\n        return ((((((((o + (s++))) + \"=\")) + encodeURIComponent(ca))) + r));\n    };\n;\n    function z() {\n        var ca = [], da = false, ea = 0, fa = 0;\n        this.isEmpty = function() {\n            return !ca.length;\n        };\n        this.enqueue = function(ga, ha) {\n            if (ha) {\n                ca.unshift(ga);\n            }\n             else ca.push(ga);\n        ;\n        ;\n        };\n        this.dequeue = function() {\n            ca.shift();\n        };\n        this.peek = function() {\n            return ca[0];\n        };\n        this.clear = function(ga) {\n            v = Math.min(v, JSBNG__document.cookie.length);\n            if (((!w && ((((new JSBNG__Date() - x)) > 60000))))) {\n                w = true;\n            }\n        ;\n        ;\n            var ha = ((!ga && ((JSBNG__document.cookie.search(l) >= 0)))), ia = !!h.cookie_header_limit, ja = ((h.cookie_count_limit || 19)), ka = ((h.cookie_header_limit || 3950)), la = ((ja - 5)), ma = ((ka - 1000));\n            while (!this.isEmpty()) {\n                var na = y(this.peek());\n                if (((ia && ((((na.length > ka)) || ((w && ((((na.length + v)) > ka))))))))) {\n                    this.dequeue();\n                    continue;\n                }\n            ;\n            ;\n                if (((((ha || ia)) && ((((((JSBNG__document.cookie.length + na.length)) > ka)) || ((JSBNG__document.cookie.split(\";\").length > ja))))))) {\n                    break;\n                }\n            ;\n            ;\n                JSBNG__document.cookie = na;\n                ha = true;\n                this.dequeue();\n            };\n        ;\n            var oa = JSBNG__Date.now();\n            if (((ga || ((((((((!da && ha)) && ((((fa > 0)) && ((((Math.min(((10 * Math.pow(2, ((fa - 1))))), 60000) + ea)) < oa)))))) && g.query(i.ONLOAD))) && ((((!this.isEmpty() || ((JSBNG__document.cookie.length > ma)))) || ((JSBNG__document.cookie.split(\";\").length > la))))))))) {\n                var pa = new JSBNG__Image(), qa = this, ra = ((h.tracking_domain || \"\"));\n                da = true;\n                pa.JSBNG__onload = function ua() {\n                    da = false;\n                    fa = 0;\n                    qa.clear();\n                };\n                pa.JSBNG__onerror = pa.JSBNG__onabort = function ua() {\n                    da = false;\n                    ea = JSBNG__Date.now();\n                    fa++;\n                };\n                var sa = ((h.fb_isb ? ((\"&fb_isb=\" + h.fb_isb)) : \"\")), ta = ((\"&__user=\" + h.user));\n                pa.src = ((((((((((((((ra + \"/ajax/nectar.php?asyncSignal=\")) + ((Math.floor(((Math.JSBNG__random() * 10000))) + 1)))) + sa)) + ta)) + \"&\")) + ((!ga ? \"\" : \"s=\")))) + oa));\n            }\n        ;\n        ;\n        };\n    };\n;\n    t = new z();\n    if (u) {\n        var aa = function() {\n            var ca = 0, da = ca;\n            function ea() {\n                var ha = JSBNG__sessionStorage.getItem(\"_e_ids\");\n                if (ha) {\n                    var ia = ((ha + \"\")).split(\";\");\n                    if (((ia.length == 2))) {\n                        ca = parseInt(ia[0], 10);\n                        da = parseInt(ia[1], 10);\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n            };\n        ;\n            function fa() {\n                var ha = ((((ca + \";\")) + da));\n                JSBNG__sessionStorage.setItem(\"_e_ids\", ha);\n            };\n        ;\n            function ga(ha) {\n                return ((\"_e_\" + ((((ha !== undefined)) ? ha : ca++))));\n            };\n        ;\n            this.isEmpty = function() {\n                return ((da === ca));\n            };\n            this.enqueue = function(ha, ia) {\n                var ja = ((ia ? ga(--da) : ga()));\n                JSBNG__sessionStorage.setItem(ja, ha);\n                fa();\n            };\n            this.dequeue = function() {\n                this.isEmpty();\n                JSBNG__sessionStorage.removeItem(ga(da));\n                da++;\n                fa();\n            };\n            this.peek = function() {\n                var ha = JSBNG__sessionStorage.getItem(ga(da));\n                return ((ha ? ((ha + \"\")) : ha));\n            };\n            this.clear = t.clear;\n            ea();\n        };\n        t = new aa();\n    }\n;\n;\n    var ba = {\n        log: function(ca, da, ea) {\n            if (h.no_cookies) {\n                return;\n            }\n        ;\n        ;\n            var fa = [m,JSBNG__Date.now(),ca,].concat(da);\n            fa.push(fa.length);\n            function ga() {\n                var ha = JSON.stringify(fa);\n                try {\n                    t.enqueue(ha, !!ea);\n                    t.clear(!!ea);\n                } catch (ia) {\n                    if (((u && ((ia.code === 1000))))) {\n                        t = new z();\n                        u = false;\n                        ga();\n                    }\n                ;\n                ;\n                };\n            ;\n            };\n        ;\n            ga();\n        },\n        getSessionID: function() {\n            return m;\n        }\n    };\n    e.exports = ba;\n    a.EagleEye = ba;\n}, 3);\n__d(\"AdblockDetectorLogging\", [\"AdblockDetector\",\"EagleEye\",], function(a, b, c, d, e, f) {\n    var g = b(\"AdblockDetector\"), h = b(\"EagleEye\");\n    function i(j) {\n        g.assertUnblocked(j, h.log.bind(h, \"ads\", {\n            JSBNG__event: \"ads_blocked\"\n        }));\n    };\n;\n    f.assertUnblocked = i;\n});\n__d(\"EgoAdsObjectSet\", [\"copyProperties\",\"csx\",\"DOM\",], function(a, b, c, d, e, f) {\n    var g = b(\"copyProperties\"), h = b(\"csx\"), i = b(\"DOM\");\n    function j() {\n        this._allEgoUnits = [];\n        this._egoUnits = [];\n    };\n;\n    g(j.prototype, {\n        init: function(l) {\n            this._allEgoUnits = l;\n            this._egoUnits = [];\n            this._allEgoUnits.forEach(function(m) {\n                var n = k(m);\n                if (((!n || !n.holdout))) {\n                    this._egoUnits.push(m);\n                }\n            ;\n            ;\n            }, this);\n        },\n        getCount: function() {\n            return this._egoUnits.length;\n        },\n        forEach: function(l, m) {\n            this._egoUnits.forEach(l, m);\n        },\n        getUnit: function(l) {\n            return this._egoUnits[l];\n        },\n        getHoldoutAdIDsForSpace: function(l, m) {\n            if (((!l || !m))) {\n                return [];\n            }\n        ;\n        ;\n            var n = [];\n            for (var o = 0; ((((l > 0)) && ((o < this._allEgoUnits.length)))); o++) {\n                var p = this._allEgoUnits[o], q = m(p), r = k(p);\n                if (((((((l >= q)) && r)) && r.holdout))) {\n                    n.push(r.adid);\n                }\n            ;\n            ;\n                l -= q;\n            };\n        ;\n            return n;\n        },\n        getHoldoutAdIDsForNumAds: function(l) {\n            l = Math.min(l, this._allEgoUnits.length);\n            var m = [];\n            for (var n = 0; ((n < l)); n++) {\n                var o = this._allEgoUnits[n], p = k(o);\n                if (((p && p.holdout))) {\n                    m.push(p.adid);\n                }\n            ;\n            ;\n            };\n        ;\n            return m;\n        }\n    });\n    function k(l) {\n        var m = i.scry(l, \"div._4u8\")[0], n = ((m && m.getAttribute(\"data-ad\")));\n        return ((((n && JSON.parse(n))) || undefined));\n    };\n;\n    e.exports = j;\n});\n__d(\"EmuController\", [\"AsyncRequest\",\"DataStore\",\"URI\",\"copyProperties\",\"emptyFunction\",\"ge\",\"goURI\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = b(\"DataStore\"), i = b(\"URI\"), j = b(\"copyProperties\"), k = b(\"emptyFunction\"), l = b(\"ge\"), m = b(\"goURI\");\n    function n(o, p) {\n        var q = l(o);\n        if (!q) {\n            return null;\n        }\n    ;\n    ;\n        this.impression = p;\n        this.containerId = o;\n        h.set(q, \"emuController\", this);\n        return this;\n    };\n;\n    j(n, {\n        fromContainer: function(o) {\n            var p = l(o);\n            if (!p) {\n                return null;\n            }\n        ;\n        ;\n            return h.get(p, \"emuController\");\n        },\n        getEventClass: function(o) {\n            return ((\"emuEvent\" + String(o).trim()));\n        }\n    });\n    j(n.prototype, {\n        EVENT_HANDLER_PATH: \"/ajax/emu/end.php\",\n        CLICK: 1,\n        FAN: \"fad_fan\",\n        JSBNG__event: function(o, p, q, r) {\n            var s = {\n                eid: this.impression,\n                f: 0,\n                ui: this.containerId,\n                en: o,\n                a: 1\n            };\n            if (p) {\n                s.ed = JSON.stringify(p);\n            }\n        ;\n        ;\n            if (!r) {\n                r = k;\n            }\n        ;\n        ;\n            var t = new g().setURI(this.EVENT_HANDLER_PATH).setData(s).setErrorHandler(r);\n            if (q) {\n                t.setHandler(q);\n            }\n        ;\n        ;\n            t.send();\n        },\n        redirect: function() {\n            var o = {\n                eid: this.impression,\n                f: 0,\n                ui: this.containerId,\n                en: this.CLICK,\n                a: 0,\n                sig: ((Math.floor(((Math.JSBNG__random() * 65535))) + 65536))\n            }, p = new i(this.EVENT_HANDLER_PATH);\n            p.setQueryData(o);\n            m(p);\n        }\n    });\n    e.exports = n;\n});\n__d(\"legacy:ad-units-base-js\", [\"EmuController\",], function(a, b, c, d) {\n    a.EmuController = b(\"EmuController\");\n}, 3);\n__d(\"ChatConfig\", [\"ChatConfigInitialData\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"ChatConfigInitialData\"), h = b(\"copyProperties\"), i = {\n    }, j = {\n        get: function(k, l) {\n            return ((((k in i)) ? i[k] : l));\n        },\n        set: function(k) {\n            if (((arguments.length > 1))) {\n                var l = {\n                };\n                l[k] = arguments[1];\n                k = l;\n            }\n        ;\n        ;\n            h(i, k);\n        },\n        getDebugInfo: function() {\n            return i;\n        }\n    };\n    j.set(g);\n    e.exports = j;\n});\n__d(\"JSBNG__cancelAnimationFrame\", [], function(a, b, c, d, e, f) {\n    var g = ((((((((((a.JSBNG__cancelAnimationFrame || a.JSBNG__webkitCancelAnimationFrame)) || a.JSBNG__mozCancelAnimationFrame)) || a.oCancelAnimationFrame)) || a.msCancelAnimationFrame)) || a.JSBNG__clearTimeout));\n    e.exports = g;\n});\n__d(\"XUISpinner.react\", [\"BrowserSupport\",\"ReactProps\",\"React\",\"JSBNG__cancelAnimationFrame\",\"cx\",\"joinClasses\",\"JSBNG__requestAnimationFrame\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"BrowserSupport\"), h = b(\"ReactProps\"), i = b(\"React\"), j = b(\"JSBNG__cancelAnimationFrame\"), k = b(\"cx\"), l = b(\"joinClasses\"), m = b(\"JSBNG__requestAnimationFrame\"), n = b(\"tx\"), o = g.hasCSSAnimations(), p = {\n        SMALL: 16,\n        LARGE: 32\n    }, q = {\n        SMALL: 2,\n        LARGE: 4\n    }, r = 5, s = 8, t = ((r * s)), u = 1200, v = ((u / t)), w = i.createClass({\n        displayName: \"XUISpinner\",\n        props: {\n            size: h.oneOf([\"small\",\"large\",]),\n            background: h.oneOf([\"light\",\"dark\",])\n        },\n        getDefaultProps: function() {\n            return {\n                size: \"small\",\n                background: \"light\"\n            };\n        },\n        getInitialState: function() {\n            if (!o) {\n                return {\n                    frame: 0,\n                    timer: JSBNG__Date.now()\n                };\n            }\n        ;\n        ;\n        },\n        componentDidMount: function() {\n            if (!o) {\n                this._step();\n            }\n        ;\n        ;\n        },\n        componentWillUnmount: function() {\n            ((this._requestID && j(this._requestID)));\n        },\n        _step: function() {\n            this._requestID = m(this._step);\n            var x = JSBNG__Date.now();\n            if (((((x - v)) > this.state.timer))) {\n                this.setState({\n                    frame: ((((this.state.frame + 1)) % t)),\n                    timer: x\n                });\n            }\n        ;\n        ;\n        },\n        _renderWithCSSAnimation: function(x) {\n            return this.transferPropsTo(i.DOM.span({\n                className: x\n            }, \"Loading...\"));\n        },\n        _renderWithJavaScriptAnimation: function(x) {\n            var y = Math.floor(((this.state.frame / s))), z = ((this.state.frame % s)), aa = ((((this.props.size == \"small\")) ? p.SMALL : p.LARGE)), ba = ((((this.props.size == \"small\")) ? q.SMALL : q.LARGE)), ca = {\n                backgroundPosition: ((((((((((\"-\" + ((((z * aa)) + ba)))) + \"px \")) + \"-\")) + ((((y * aa)) + ba)))) + \"px\"))\n            }, da = l((\"_55yr\"), x);\n            return this.transferPropsTo(i.DOM.span({\n                className: da,\n                style: ca\n            }, \"Loading...\"));\n        },\n        render: function() {\n            var x = (((((((((\"_55ym\") + ((((this.props.size == \"small\")) ? ((\" \" + \"_55yn\")) : \"\")))) + ((((this.props.size == \"large\")) ? ((\" \" + \"_55yq\")) : \"\")))) + ((((this.props.background == \"light\")) ? ((\" \" + \"_55yo\")) : \"\")))) + ((((this.props.background == \"dark\")) ? ((\" \" + \"_55yp\")) : \"\"))));\n            return ((o ? this._renderWithCSSAnimation(x) : this._renderWithJavaScriptAnimation(x)));\n        }\n    });\n    e.exports = w;\n});\n__d(\"ViewportBounds\", [\"Style\",\"Vector\",\"emptyFunction\",\"ge\",\"removeFromArray\",], function(a, b, c, d, e, f) {\n    var g = b(\"Style\"), h = b(\"Vector\"), i = b(\"emptyFunction\"), j = b(\"ge\"), k = b(\"removeFromArray\"), l = {\n        JSBNG__top: [],\n        right: [],\n        bottom: [],\n        left: []\n    };\n    function m(q) {\n        return function() {\n            var r = 0;\n            l[q].forEach(function(s) {\n                r = Math.max(r, s.getSize());\n            });\n            return r;\n        };\n    };\n;\n    function n(q) {\n        return function(r) {\n            return new o(q, r);\n        };\n    };\n;\n    function o(q, r) {\n        this.getSide = i.thatReturns(q);\n        this.getSize = function() {\n            return ((((typeof r === \"function\")) ? r() : r));\n        };\n        l[q].push(this);\n    };\n;\n    o.prototype.remove = function() {\n        k(l[this.getSide()], this);\n    };\n    var p = {\n        getTop: m(\"JSBNG__top\"),\n        getRight: m(\"right\"),\n        getBottom: m(\"bottom\"),\n        getLeft: m(\"left\"),\n        getElementPosition: function(q) {\n            var r = h.getElementPosition(q);\n            r.y -= p.getTop();\n            return r;\n        },\n        addTop: n(\"JSBNG__top\"),\n        addRight: n(\"right\"),\n        addBottom: n(\"bottom\"),\n        addLeft: n(\"left\")\n    };\n    p.addTop(function() {\n        var q = j(\"blueBar\");\n        if (((q && g.isFixed(q)))) {\n            return j(\"blueBarHolder\").offsetHeight;\n        }\n    ;\n    ;\n        return 0;\n    });\n    e.exports = p;\n});\n__d(\"isAsyncScrollQuery\", [\"UserAgent\",], function(a, b, c, d, e, f) {\n    var g = b(\"UserAgent\"), h = null;\n    function i() {\n        if (((h === null))) {\n            h = ((((((g.osx() >= 10.8)) && ((g.webkit() >= 536.25)))) && !g.chrome()));\n        }\n    ;\n    ;\n        return h;\n    };\n;\n    e.exports = i;\n});\n__d(\"ScrollAwareDOM\", [\"ArbiterMixin\",\"CSS\",\"DOM\",\"DOMDimensions\",\"DOMPosition\",\"DOMQuery\",\"HTML\",\"Vector\",\"ViewportBounds\",\"copyProperties\",\"isAsyncScrollQuery\",], function(a, b, c, d, e, f) {\n    var g = b(\"ArbiterMixin\"), h = b(\"CSS\"), i = b(\"DOM\"), j = b(\"DOMDimensions\"), k = b(\"DOMPosition\"), l = b(\"DOMQuery\"), m = b(\"HTML\"), n = b(\"Vector\"), o = b(\"ViewportBounds\"), p = b(\"copyProperties\"), q = b(\"isAsyncScrollQuery\");\n    function r(w, x) {\n        return function() {\n            v.monitor(arguments[w], x.curry.apply(x, arguments));\n        };\n    };\n;\n    function s(w) {\n        if (!((w instanceof Array))) {\n            w = [w,];\n        }\n    ;\n    ;\n        for (var x = 0; ((x < w.length)); x++) {\n            var y = m.replaceJSONWrapper(w[x]);\n            if (((y instanceof m))) {\n                return y.getRootNode();\n            }\n             else if (i.isNode(y)) {\n                return y;\n            }\n            \n        ;\n        ;\n        };\n    ;\n        return null;\n    };\n;\n    function t(w) {\n        return ((k.getElementPosition(w).y > o.getTop()));\n    };\n;\n    function u(w) {\n        var x = ((k.getElementPosition(w).y + j.getElementDimensions(w).height)), y = ((j.getViewportDimensions().height - o.getBottom()));\n        return ((x >= y));\n    };\n;\n    var v = p({\n        monitor: function(w, x) {\n            if (q()) {\n                return x();\n            }\n        ;\n        ;\n            var y = s(w);\n            if (y) {\n                var z = !!y.offsetParent;\n                if (((z && ((t(y) || u(y)))))) {\n                    return x();\n                }\n            ;\n            ;\n                var aa = n.getDocumentDimensions(), ba = x();\n                if (((z || ((y.offsetParent && !t(y)))))) {\n                    var ca = n.getDocumentDimensions().sub(aa), da = {\n                        delta: ca,\n                        target: y\n                    };\n                    if (((v.inform(\"JSBNG__scroll\", da) !== false))) {\n                        ca.scrollElementBy(l.getDocumentScrollElement());\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n                return ba;\n            }\n             else return x()\n        ;\n        },\n        replace: function(w, x) {\n            var y = s(x);\n            if (((!y || h.hasClass(y, \"hidden_elem\")))) {\n                y = w;\n            }\n        ;\n        ;\n            return v.monitor(y, function() {\n                i.replace(w, x);\n            });\n        },\n        prependContent: r(1, i.prependContent),\n        insertAfter: r(1, i.insertAfter),\n        insertBefore: r(1, i.insertBefore),\n        setContent: r(0, i.setContent),\n        appendContent: r(1, i.appendContent),\n        remove: r(0, i.remove),\n        empty: r(0, i.empty)\n    }, g);\n    e.exports = v;\n});\n__d(\"legacy:ScrollAwareDOM\", [\"ScrollAwareDOM\",], function(a, b, c, d) {\n    a.ScrollAwareDOM = b(\"ScrollAwareDOM\");\n}, 3);\n__d(\"Base64\", [], function(a, b, c, d, e, f) {\n    var g = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";\n    function h(l) {\n        l = ((((((l.charCodeAt(0) << 16)) | ((l.charCodeAt(1) << 8)))) | l.charCodeAt(2)));\n        return String.fromCharCode(g.charCodeAt(((l >>> 18))), g.charCodeAt(((((l >>> 12)) & 63))), g.charCodeAt(((((l >>> 6)) & 63))), g.charCodeAt(((l & 63))));\n    };\n;\n    var i = ((((\"\\u003E___?456789:;\\u003C=_______\" + \"\\u0000\\u0001\\u0002\\u0003\\u0004\\u0005\\u0006\\u0007\\u0008\\u0009\\u000a\\u000b\\u000c\\u000d\\u000e\\u000f\\u0010\\u0011\\u0012\\u0013\\u0014\\u0015\\u0016\\u0017\\u0018\\u0019\")) + \"______\\u001a\\u001b\\u001c\\u001d\\u001e\\u001f !\\\"#$%&'()*+,-./0123\"));\n    function j(l) {\n        l = ((((((((i.charCodeAt(((l.charCodeAt(0) - 43))) << 18)) | ((i.charCodeAt(((l.charCodeAt(1) - 43))) << 12)))) | ((i.charCodeAt(((l.charCodeAt(2) - 43))) << 6)))) | i.charCodeAt(((l.charCodeAt(3) - 43)))));\n        return String.fromCharCode(((l >>> 16)), ((((l >>> 8)) & 255)), ((l & 255)));\n    };\n;\n    var k = {\n        encode: function(l) {\n            l = unescape(encodeURI(l));\n            var m = ((((l.length + 2)) % 3));\n            l = ((l + \"\\u0000\\u0000\".slice(m))).replace(/[\\s\\S]{3}/g, h);\n            return ((l.slice(0, ((((l.length + m)) - 2))) + \"==\".slice(m)));\n        },\n        decode: function(l) {\n            l = l.replace(/[^A-Za-z0-9+\\/]/g, \"\");\n            var m = ((((l.length + 3)) & 3));\n            l = ((l + \"AAA\".slice(m))).replace(/..../g, j);\n            l = l.slice(0, ((((l.length + m)) - 3)));\n            try {\n                return decodeURIComponent(escape(l));\n            } catch (n) {\n                throw new Error(\"Not valid UTF-8\");\n            };\n        ;\n        },\n        encodeObject: function(l) {\n            return k.encode(JSON.stringify(l));\n        },\n        decodeObject: function(l) {\n            return JSON.parse(k.decode(l));\n        },\n        encodeNums: function(l) {\n            return String.fromCharCode.apply(String, l.map(function(m) {\n                return g.charCodeAt(((((((m | -((m > 63)))) & -((m > 0)))) & 63)));\n            }));\n        }\n    };\n    e.exports = k;\n});\n__d(\"legacy:base64\", [\"Base64\",], function(a, b, c, d) {\n    a.Base64 = b(\"Base64\");\n}, 3);\n__d(\"legacy:css\", [\"CSS\",], function(a, b, c, d) {\n    a.CSS = b(\"CSS\");\n}, 3);\n__d(\"legacy:dom\", [\"DOM\",], function(a, b, c, d) {\n    a.DOM = b(\"DOM\");\n}, 3);\n__d(\"FBDesktopDetect\", [\"UserAgent\",], function(a, b, c, d, e, f) {\n    var g = b(\"UserAgent\"), h = \"facebook.desktopplugin\", i = {\n        mimeType: \"application/x-facebook-desktop-1\",\n        isPluginInstalled: function() {\n            if (g.osx()) {\n                return false;\n            }\n        ;\n        ;\n            var j = null;\n            if (a.ActiveXObject) {\n                try {\n                    j = new a.ActiveXObject(h);\n                    if (j) {\n                        return true;\n                    }\n                ;\n                ;\n                } catch (k) {\n                \n                };\n            ;\n            }\n             else if (((a.JSBNG__navigator && a.JSBNG__navigator.plugins))) {\n                a.JSBNG__navigator.plugins.refresh(false);\n                for (var l = 0, m = a.JSBNG__navigator.plugins.length; ((l < m)); l++) {\n                    j = a.JSBNG__navigator.plugins[l];\n                    if (((j.length && ((j[0].type === this.mimeType))))) {\n                        return true;\n                    }\n                ;\n                ;\n                };\n            ;\n            }\n            \n        ;\n        ;\n            return false;\n        }\n    };\n    e.exports = i;\n});\n__d(\"NavigationMessage\", [], function(a, b, c, d, e, f) {\n    var g = {\n        NAVIGATION_BEGIN: \"NavigationMessage/navigationBegin\",\n        NAVIGATION_SELECT: \"NavigationMessage/navigationSelect\",\n        NAVIGATION_FIRST_RESPONSE: \"NavigationMessage/navigationFirstResponse\",\n        NAVIGATION_COMPLETED: \"NavigationMessage/navigationCompleted\",\n        NAVIGATION_FAILED: \"NavigationMessage/navigationFailed\",\n        NAVIGATION_COUNT_UPDATE: \"NavigationMessage/navigationCount\",\n        NAVIGATION_FAVORITE_UPDATE: \"NavigationMessage/navigationFavoriteUpdate\",\n        NAVIGATION_ITEM_REMOVED: \"NavigationMessage/navigationItemRemoved\",\n        NAVIGATION_ITEM_HIDDEN: \"NavigationMessage/navigationItemHidden\",\n        INTERNAL_LOADING_BEGIN: \"NavigationMessage/internalLoadingBegin\",\n        INTERNAL_LOADING_COMPLETED: \"NavigationMessage/internalLoadingCompleted\"\n    };\n    e.exports = g;\n});\n__d(\"SimpleDrag\", [\"JSBNG__Event\",\"ArbiterMixin\",\"UserAgent\",\"Vector\",\"copyProperties\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"ArbiterMixin\"), i = b(\"UserAgent\"), j = b(\"Vector\"), k = b(\"copyProperties\"), l = b(\"emptyFunction\");\n    function m(n) {\n        this.minDragDistance = 0;\n        g.listen(n, \"mousedown\", this._start.bind(this));\n    };\n;\n    k(m.prototype, h, {\n        setMinDragDistance: function(n) {\n            this.minDragDistance = n;\n        },\n        _start: function(JSBNG__event) {\n            var n = false, o = true, p = null;\n            if (this.inform(\"mousedown\", JSBNG__event)) {\n                o = false;\n            }\n        ;\n        ;\n            if (this.minDragDistance) {\n                p = j.getEventPosition(JSBNG__event);\n            }\n             else {\n                n = true;\n                var q = this.inform(\"start\", JSBNG__event);\n                if (((q === true))) {\n                    o = false;\n                }\n                 else if (((q === false))) {\n                    n = false;\n                    return;\n                }\n                \n            ;\n            ;\n            }\n        ;\n        ;\n            var r = ((((i.ie() < 9)) ? JSBNG__document.documentElement : window)), s = g.listen(r, {\n                selectstart: ((o ? g.prevent : l)),\n                mousemove: function(JSBNG__event) {\n                    if (!n) {\n                        var t = j.getEventPosition(JSBNG__event);\n                        if (((p.distanceTo(t) < this.minDragDistance))) {\n                            return;\n                        }\n                    ;\n                    ;\n                        n = true;\n                        if (((this.inform(\"start\", JSBNG__event) === false))) {\n                            n = false;\n                            return;\n                        }\n                    ;\n                    ;\n                    }\n                ;\n                ;\n                    this.inform(\"update\", JSBNG__event);\n                }.bind(this),\n                mouseup: function(JSBNG__event) {\n                    {\n                        var fin115keys = ((window.top.JSBNG_Replay.forInKeys)((s))), fin115i = (0);\n                        var t;\n                        for (; (fin115i < fin115keys.length); (fin115i++)) {\n                            ((t) = (fin115keys[fin115i]));\n                            {\n                                s[t].remove();\n                            ;\n                            };\n                        };\n                    };\n                ;\n                    if (n) {\n                        this.inform(\"end\", JSBNG__event);\n                    }\n                     else this.inform(\"click\", JSBNG__event);\n                ;\n                ;\n                }.bind(this)\n            });\n            ((o && JSBNG__event.prevent()));\n        }\n    });\n    e.exports = m;\n});\n__d(\"legacy:async-signal\", [\"AsyncSignal\",], function(a, b, c, d) {\n    a.AsyncSignal = b(\"AsyncSignal\");\n}, 3);\n__d(\"FlipDirectionOnKeypress\", [\"JSBNG__Event\",\"DOM\",\"Input\",\"Style\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"DOM\"), i = b(\"Input\"), j = b(\"Style\");\n    function k(JSBNG__event) {\n        var l = JSBNG__event.getTarget(), m = ((h.isNodeOfType(l, \"input\") && ((l.type == \"text\")))), n = h.isNodeOfType(l, \"textarea\");\n        if (((!((m || n)) || l.getAttribute(\"data-prevent-auto-flip\")))) {\n            return;\n        }\n    ;\n    ;\n        var o = i.getValue(l), p = ((l.style && l.style.direction));\n        if (!p) {\n            var q = 0, r = true;\n            for (var s = 0; ((s < o.length)); s++) {\n                var t = o.charCodeAt(s);\n                if (((t >= 48))) {\n                    if (r) {\n                        r = false;\n                        q++;\n                    }\n                ;\n                ;\n                    if (((((t >= 1470)) && ((t <= 1920))))) {\n                        j.set(l, \"direction\", \"rtl\");\n                        return;\n                    }\n                ;\n                ;\n                    if (((q == 5))) {\n                        j.set(l, \"direction\", \"ltr\");\n                        return;\n                    }\n                ;\n                ;\n                }\n                 else r = true;\n            ;\n            ;\n            };\n        ;\n        }\n         else if (((o.length === 0))) {\n            j.set(l, \"direction\", \"\");\n        }\n        \n    ;\n    ;\n    };\n;\n    g.listen(JSBNG__document.documentElement, {\n        keyup: k,\n        input: k\n    });\n});\n__d(\"PlaceholderOnsubmitFormListener\", [\"JSBNG__Event\",\"Input\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"Input\");\n    g.listen(JSBNG__document.documentElement, \"submit\", function(i) {\n        var j = i.getTarget().getElementsByTagName(\"*\");\n        for (var k = 0; ((k < j.length)); k++) {\n            if (((j[k].getAttribute(\"placeholder\") && h.isEmpty(j[k])))) {\n                h.setValue(j[k], \"\");\n            }\n        ;\n        ;\n        };\n    ;\n    });\n});\n__d(\"ARIA\", [\"DOM\",\"emptyFunction\",\"ge\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOM\"), h = b(\"emptyFunction\"), i = b(\"ge\"), j, k, l = function() {\n        j = i(\"ariaAssertiveAlert\");\n        if (!j) {\n            j = g.create(\"div\", {\n                id: \"ariaAssertiveAlert\",\n                className: \"accessible_elem\",\n                \"aria-live\": \"assertive\"\n            });\n            g.appendContent(JSBNG__document.body, j);\n        }\n    ;\n    ;\n        k = i(\"ariaPoliteAlert\");\n        if (!k) {\n            k = j.cloneNode(false);\n            k.setAttribute(\"id\", \"ariaPoliteAlert\");\n            k.setAttribute(\"aria-live\", \"polite\");\n            g.appendContent(JSBNG__document.body, k);\n        }\n    ;\n    ;\n        l = h;\n    };\n    function m(o, p) {\n        l();\n        var q = ((p ? j : k));\n        g.setContent(q, o);\n    };\n;\n    var n = {\n        owns: function(o, p) {\n            o.setAttribute(\"aria-owns\", g.getID(p));\n        },\n        setPopup: function(o, p) {\n            var q = g.getID(p);\n            o.setAttribute(\"aria-owns\", q);\n            o.setAttribute(\"aria-haspopup\", \"true\");\n            if (((o.tabIndex == -1))) {\n                o.tabIndex = 0;\n            }\n        ;\n        ;\n        },\n        announce: function(o) {\n            m(o, true);\n        },\n        notify: function(o) {\n            m(o);\n        }\n    };\n    e.exports = n;\n});\n__d(\"ScriptPathState\", [\"Arbiter\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h, i, j, k, l = 100, m = {\n        setIsUIPageletRequest: function(n) {\n            j = n;\n        },\n        setUserURISampleRate: function(n) {\n            k = n;\n        },\n        reset: function() {\n            h = null;\n            i = false;\n            j = false;\n        },\n        _shouldUpdateScriptPath: function() {\n            return ((i && !j));\n        },\n        _shouldSendURI: function() {\n            return ((Math.JSBNG__random() < k));\n        },\n        getParams: function() {\n            var n = {\n            };\n            if (m._shouldUpdateScriptPath()) {\n                if (((m._shouldSendURI() && ((h !== null))))) {\n                    n.user_uri = h.substring(0, l);\n                }\n            ;\n            ;\n            }\n             else n.no_script_path = 1;\n        ;\n        ;\n            return n;\n        }\n    };\n    g.subscribe(\"pre_page_transition\", function(n, o) {\n        i = true;\n        h = o.to.getUnqualifiedURI().toString();\n    });\n    e.exports = a.ScriptPathState = m;\n});\n__d(\"goOrReplace\", [\"URI\",\"UserAgent\",], function(a, b, c, d, e, f) {\n    var g = b(\"URI\"), h = b(\"UserAgent\");\n    function i(j, k, l) {\n        var m = new g(k), n = a.Quickling;\n        if (((((((((((j.pathname == \"/\")) && ((m.getPath() != \"/\")))) && n)) && n.isActive())) && n.isPageActive(m)))) {\n            var o = ((j.search ? {\n            } : {\n                q: \"\"\n            }));\n            m = new g().setPath(\"/\").setQueryData(o).setFragment(m.getUnqualifiedURI().toString());\n            k = m.toString();\n        }\n    ;\n    ;\n        if (((l && !((h.ie() < 8))))) {\n            j.replace(k);\n        }\n         else if (((j.href == k))) {\n            j.reload();\n        }\n         else j.href = k;\n        \n    ;\n    ;\n    };\n;\n    e.exports = i;\n});\n__d(\"AjaxPipeRequest\", [\"Arbiter\",\"AsyncRequest\",\"BigPipe\",\"CSS\",\"DOM\",\"Env\",\"PageletSet\",\"ScriptPathState\",\"URI\",\"copyProperties\",\"goOrReplace\",\"ge\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"AsyncRequest\"), i = b(\"BigPipe\"), j = b(\"CSS\"), k = b(\"DOM\"), l = b(\"Env\"), m = b(\"PageletSet\"), n = b(\"ScriptPathState\"), o = b(\"URI\"), p = b(\"copyProperties\"), q = b(\"goOrReplace\"), r = b(\"ge\"), s;\n    function t(w, x) {\n        var y = r(w);\n        if (!y) {\n            return;\n        }\n    ;\n    ;\n        if (!x) {\n            y.style.minHeight = \"600px\";\n        }\n    ;\n    ;\n        var z = m.getPageletIDs();\n        for (var aa = 0; ((aa < z.length)); aa++) {\n            var ba = z[aa];\n            if (k.contains(y, ba)) {\n                m.removePagelet(ba);\n            }\n        ;\n        ;\n        };\n    ;\n        k.empty(y);\n    };\n;\n    function u(w, x) {\n        var y = r(w);\n        if (((y && !x))) {\n            y.style.minHeight = \"100px\";\n        }\n    ;\n    ;\n    };\n;\n    function v(w, x) {\n        this._uri = w;\n        this._query_data = x;\n        this._request = new h();\n        this._canvas_id = null;\n        this._allow_cross_page_transition = true;\n    };\n;\n    p(v.prototype, {\n        setCanvasId: function(w) {\n            this._canvas_id = w;\n            return this;\n        },\n        setURI: function(w) {\n            this._uri = w;\n            return this;\n        },\n        setData: function(w) {\n            this._query_data = w;\n            return this;\n        },\n        getData: function(w) {\n            return this._query_data;\n        },\n        setAllowCrossPageTransition: function(w) {\n            this._allow_cross_page_transition = w;\n            return this;\n        },\n        setAppend: function(w) {\n            this._append = w;\n            return this;\n        },\n        send: function() {\n            var w = {\n                ajaxpipe: 1,\n                ajaxpipe_token: l.ajaxpipe_token\n            };\n            p(w, n.getParams());\n            n.reset();\n            this._request.setOption(\"useIframeTransport\", true).setURI(this._uri).setData(p(w, this._query_data)).setPreBootloadHandler(this._preBootloadHandler.bind(this)).setInitialHandler(this._onInitialResponse.bind(this)).setHandler(this._onResponse.bind(this)).setMethod(\"GET\").setReadOnly(true).setAllowCrossPageTransition(this._allow_cross_page_transition);\n            if (this._automatic) {\n                this._relevantRequest = s;\n            }\n             else s = this._request;\n        ;\n        ;\n            this._request.send();\n            return this;\n        },\n        _preBootloadFirstResponse: function(w) {\n            return false;\n        },\n        _fireDomContentCallback: function() {\n            this._arbiter.inform(\"ajaxpipe/domcontent_callback\", true, g.BEHAVIOR_STATE);\n        },\n        _fireOnloadCallback: function() {\n            this._arbiter.inform(\"ajaxpipe/onload_callback\", true, g.BEHAVIOR_STATE);\n        },\n        _isRelevant: function(w) {\n            return ((((((this._request == s)) || ((this._automatic && ((this._relevantRequest == s)))))) || this._jsNonBlock));\n        },\n        _preBootloadHandler: function(w) {\n            var x = w.getPayload();\n            if (((((!x || x.redirect)) || !this._isRelevant(w)))) {\n                return false;\n            }\n        ;\n        ;\n            var y = false;\n            if (w.is_first) {\n                ((((!this._append && !this._displayCallback)) && t(this._canvas_id, this._constHeight)));\n                this._arbiter = new g();\n                y = this._preBootloadFirstResponse(w);\n                this.pipe = new i({\n                    arbiter: this._arbiter,\n                    rootNodeID: this._canvas_id,\n                    lid: this._request.lid,\n                    isAjax: true,\n                    domContentCallback: this._fireDomContentCallback.bind(this),\n                    onloadCallback: this._fireOnloadCallback.bind(this),\n                    domContentEvt: \"ajaxpipe/domcontent_callback\",\n                    onloadEvt: \"ajaxpipe/onload_callback\",\n                    jsNonBlock: this._jsNonBlock,\n                    automatic: this._automatic,\n                    displayCallback: this._displayCallback\n                });\n            }\n        ;\n        ;\n            return y;\n        },\n        _redirect: function(w) {\n            if (w.redirect) {\n                if (((w.force || !this.isPageActive(w.redirect)))) {\n                    var x = [\"ajaxpipe\",\"ajaxpipe_token\",].concat(this.getSanitizedParameters());\n                    q(window.JSBNG__location, o(w.redirect).removeQueryData(x), true);\n                }\n                 else {\n                    var y = a.PageTransitions;\n                    y.go(w.redirect, true);\n                }\n            ;\n            ;\n                return true;\n            }\n             else return false\n        ;\n        },\n        isPageActive: function(w) {\n            return true;\n        },\n        getSanitizedParameters: function() {\n            return [];\n        },\n        _versionCheck: function(w) {\n            return true;\n        },\n        _onInitialResponse: function(w) {\n            var x = w.getPayload();\n            if (!this._isRelevant(w)) {\n                return false;\n            }\n        ;\n        ;\n            if (!x) {\n                return true;\n            }\n        ;\n        ;\n            if (((this._redirect(x) || !this._versionCheck(x)))) {\n                return false;\n            }\n        ;\n        ;\n            return true;\n        },\n        _processFirstResponse: function(w) {\n            var x = w.getPayload();\n            if (((r(this._canvas_id) && ((x.canvas_class != null))))) {\n                j.setClass(this._canvas_id, x.canvas_class);\n            }\n        ;\n        ;\n        },\n        setFirstResponseCallback: function(w) {\n            this._firstResponseCallback = w;\n            return this;\n        },\n        setFirstResponseHandler: function(w) {\n            this._processFirstResponse = w;\n            return this;\n        },\n        _onResponse: function(w) {\n            var x = w.payload;\n            if (!this._isRelevant(w)) {\n                return h.suppressOnloadToken;\n            }\n        ;\n        ;\n            if (w.is_first) {\n                this._processFirstResponse(w);\n                ((this._firstResponseCallback && this._firstResponseCallback()));\n                x.provides = ((x.provides || []));\n                x.provides.push(\"uipage_onload\");\n                if (this._append) {\n                    x.append = this._canvas_id;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            if (x) {\n                if (((((((\"JSBNG__content\" in x.JSBNG__content)) && ((this._canvas_id !== null)))) && ((this._canvas_id != \"JSBNG__content\"))))) {\n                    x.JSBNG__content[this._canvas_id] = x.JSBNG__content.JSBNG__content;\n                    delete x.JSBNG__content.JSBNG__content;\n                }\n            ;\n            ;\n                this.pipe.onPageletArrive(x);\n            }\n        ;\n        ;\n            if (w.is_last) {\n                u(this._canvas_id, this._constHeight);\n            }\n        ;\n        ;\n            return h.suppressOnloadToken;\n        },\n        setNectarModuleDataSafe: function(w) {\n            this._request.setNectarModuleDataSafe(w);\n            return this;\n        },\n        setFinallyHandler: function(w) {\n            this._request.setFinallyHandler(w);\n            return this;\n        },\n        setErrorHandler: function(w) {\n            this._request.setErrorHandler(w);\n            return this;\n        },\n        abort: function() {\n            this._request.abort();\n            if (((s == this._request))) {\n                s = null;\n            }\n        ;\n        ;\n            this._request = null;\n            return this;\n        },\n        setJSNonBlock: function(w) {\n            this._jsNonBlock = w;\n            return this;\n        },\n        setAutomatic: function(w) {\n            this._automatic = w;\n            return this;\n        },\n        setDisplayCallback: function(w) {\n            this._displayCallback = w;\n            return this;\n        },\n        setConstHeight: function(w) {\n            this._constHeight = w;\n            return this;\n        },\n        getAsyncRequest: function() {\n            return this._request;\n        }\n    });\n    p(v, {\n        getCurrentRequest: function() {\n            return s;\n        },\n        setCurrentRequest: function(w) {\n            s = w;\n        }\n    });\n    e.exports = v;\n});\n__d(\"AsyncRequestNectarLogging\", [\"AsyncRequest\",\"Nectar\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = b(\"Nectar\"), i = b(\"copyProperties\");\n    i(g.prototype, {\n        setNectarModuleData: function(j) {\n            if (((this.method == \"POST\"))) {\n                h.addModuleData(this.data, j);\n            }\n        ;\n        ;\n        },\n        setNectarImpressionId: function() {\n            if (((this.method == \"POST\"))) {\n                h.addImpressionID(this.data);\n            }\n        ;\n        ;\n        }\n    });\n});\n__d(\"CSSClassTransition\", [\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"copyProperties\"), h = [];\n    function i() {\n    \n    };\n;\n    g(i, {\n        go: function(j, k, l, m) {\n            var n;\n            for (var o = 0; ((o < h.length)); o++) {\n                if (((h[o](j, k, l, m) === true))) {\n                    n = true;\n                }\n            ;\n            ;\n            };\n        ;\n            if (!n) {\n                j.className = k;\n            }\n        ;\n        ;\n        },\n        registerHandler: function(j) {\n            h.push(j);\n            return {\n                remove: function() {\n                    var k = h.indexOf(j);\n                    if (((k >= 0))) {\n                        h.splice(k, 1);\n                    }\n                ;\n                ;\n                }\n            };\n        }\n    });\n    e.exports = i;\n});\n__d(\"DOMScroll\", [\"Animation\",\"Arbiter\",\"DOM\",\"DOMQuery\",\"Vector\",\"ViewportBounds\",\"ge\",\"isAsyncScrollQuery\",], function(a, b, c, d, e, f) {\n    var g = b(\"Animation\"), h = b(\"Arbiter\"), i = b(\"DOM\"), j = b(\"DOMQuery\"), k = b(\"Vector\"), l = b(\"ViewportBounds\"), m = b(\"ge\"), n = b(\"isAsyncScrollQuery\"), o = {\n        SCROLL: \"dom-scroll\",\n        getScrollState: function() {\n            var p = k.getViewportDimensions(), q = k.getDocumentDimensions(), r = ((q.x > p.x)), s = ((q.y > p.y));\n            r += 0;\n            s += 0;\n            return new k(r, s);\n        },\n        _scrollbarSize: null,\n        _initScrollbarSize: function() {\n            var p = i.create(\"p\");\n            p.style.width = \"100%\";\n            p.style.height = \"200px\";\n            var q = i.create(\"div\");\n            q.style.position = \"absolute\";\n            q.style.JSBNG__top = \"0px\";\n            q.style.left = \"0px\";\n            q.style.visibility = \"hidden\";\n            q.style.width = \"200px\";\n            q.style.height = \"150px\";\n            q.style.overflow = \"hidden\";\n            q.appendChild(p);\n            JSBNG__document.body.appendChild(q);\n            var r = p.offsetWidth;\n            q.style.overflow = \"JSBNG__scroll\";\n            var s = p.offsetWidth;\n            if (((r == s))) {\n                s = q.clientWidth;\n            }\n        ;\n        ;\n            JSBNG__document.body.removeChild(q);\n            o._scrollbarSize = ((r - s));\n        },\n        getScrollbarSize: function() {\n            if (((o._scrollbarSize === null))) {\n                o._initScrollbarSize();\n            }\n        ;\n        ;\n            return o._scrollbarSize;\n        },\n        JSBNG__scrollTo: function(p, q, r, s, t) {\n            if (((((typeof q == \"undefined\")) || ((q === true))))) {\n                q = 750;\n            }\n        ;\n        ;\n            if (n()) {\n                q = false;\n            }\n        ;\n        ;\n            if (!((p instanceof k))) {\n                var u = k.getScrollPosition().x, v = k.getElementPosition(m(p)).y;\n                p = new k(u, v, \"JSBNG__document\");\n                if (!s) {\n                    p.y -= ((l.getTop() / ((r ? 2 : 1))));\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            if (r) {\n                p.y -= ((k.getViewportDimensions().y / 2));\n            }\n             else if (s) {\n                p.y -= k.getViewportDimensions().y;\n                p.y += s;\n            }\n            \n        ;\n        ;\n            p = p.convertTo(\"JSBNG__document\");\n            if (q) {\n                return new g(JSBNG__document.body).to(\"scrollTop\", p.y).to(\"scrollLeft\", p.x).ease(g.ease.end).duration(q).ondone(t).go();\n            }\n             else if (window.JSBNG__scrollTo) {\n                window.JSBNG__scrollTo(p.x, p.y);\n                ((t && t()));\n            }\n            \n        ;\n        ;\n            h.inform(o.SCROLL);\n        },\n        ensureVisible: function(p, q, r, s, t) {\n            if (((r === undefined))) {\n                r = 10;\n            }\n        ;\n        ;\n            p = m(p);\n            if (q) {\n                p = j.JSBNG__find(p, q);\n            }\n        ;\n        ;\n            var u = k.getScrollPosition().x, v = k.getScrollPosition().y, w = ((v + k.getViewportDimensions().y)), x = k.getElementPosition(p).y, y = ((x + k.getElementDimensions(p).y));\n            x -= l.getTop();\n            x -= r;\n            y += r;\n            if (((x < v))) {\n                o.JSBNG__scrollTo(new k(u, x, \"JSBNG__document\"), s, false, false, t);\n            }\n             else if (((y > w))) {\n                if (((((x - ((y - w)))) < v))) {\n                    o.JSBNG__scrollTo(new k(u, x, \"JSBNG__document\"), s, false, false, t);\n                }\n                 else o.JSBNG__scrollTo(new k(u, y, \"JSBNG__document\"), s, false, true, t);\n            ;\n            }\n            \n        ;\n        ;\n        },\n        scrollToTop: function(p) {\n            var q = k.getScrollPosition();\n            o.JSBNG__scrollTo(new k(q.x, 0, \"JSBNG__document\"), ((p !== false)));\n        }\n    };\n    e.exports = o;\n});\n__d(\"Button\", [\"CSS\",\"DataStore\",\"DOM\",\"JSBNG__Event\",\"Parent\",\"cx\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSS\"), h = b(\"DataStore\"), i = b(\"DOM\"), j = b(\"JSBNG__Event\"), k = b(\"Parent\"), l = b(\"cx\"), m = b(\"emptyFunction\"), n = \"uiButtonDisabled\", o = \"uiButtonDepressed\", p = \"_42fr\", q = \"_42fs\", r = \"button:blocker\", s = \"href\", t = \"ajaxify\";\n    function u(aa, ba) {\n        var ca = h.get(aa, r);\n        if (ba) {\n            if (ca) {\n                ca.remove();\n                h.remove(aa, r);\n            }\n        ;\n        ;\n        }\n         else if (!ca) {\n            h.set(aa, r, j.listen(aa, \"click\", m.thatReturnsFalse, j.Priority.URGENT));\n        }\n        \n    ;\n    ;\n    };\n;\n    function v(aa) {\n        var ba = ((k.byClass(aa, \"uiButton\") || k.byClass(aa, \"_42ft\")));\n        if (!ba) {\n            throw new Error(\"invalid use case\");\n        }\n    ;\n    ;\n        return ba;\n    };\n;\n    function w(aa) {\n        return i.isNodeOfType(aa, \"a\");\n    };\n;\n    function x(aa) {\n        return i.isNodeOfType(aa, \"button\");\n    };\n;\n    function y(aa) {\n        return g.hasClass(aa, \"_42ft\");\n    };\n;\n    var z = {\n        getInputElement: function(aa) {\n            aa = v(aa);\n            if (w(aa)) {\n                throw new Error(\"invalid use case\");\n            }\n        ;\n        ;\n            return ((x(aa) ? aa : i.JSBNG__find(aa, \"input\")));\n        },\n        isEnabled: function(aa) {\n            return !((g.hasClass(v(aa), n) || g.hasClass(v(aa), p)));\n        },\n        setEnabled: function(aa, ba) {\n            aa = v(aa);\n            var ca = ((y(aa) ? p : n));\n            g.conditionClass(aa, ca, !ba);\n            if (w(aa)) {\n                var da = aa.getAttribute(\"href\"), ea = aa.getAttribute(\"ajaxify\"), fa = h.get(aa, s, \"#\"), ga = h.get(aa, t);\n                if (ba) {\n                    if (!da) {\n                        aa.setAttribute(\"href\", fa);\n                    }\n                ;\n                ;\n                    if (((!ea && ga))) {\n                        aa.setAttribute(\"ajaxify\", ga);\n                    }\n                ;\n                ;\n                    aa.removeAttribute(\"tabIndex\");\n                }\n                 else {\n                    if (((da && ((da !== fa))))) {\n                        h.set(aa, s, da);\n                    }\n                ;\n                ;\n                    if (((ea && ((ea !== ga))))) {\n                        h.set(aa, t, ea);\n                    }\n                ;\n                ;\n                    aa.removeAttribute(\"href\");\n                    aa.removeAttribute(\"ajaxify\");\n                    aa.setAttribute(\"tabIndex\", \"-1\");\n                }\n            ;\n            ;\n                u(aa, ba);\n            }\n             else {\n                var ha = z.getInputElement(aa);\n                ha.disabled = !ba;\n                u(ha, ba);\n            }\n        ;\n        ;\n        },\n        setDepressed: function(aa, ba) {\n            aa = v(aa);\n            var ca = ((y(aa) ? q : o));\n            g.conditionClass(aa, ca, ba);\n        },\n        isDepressed: function(aa) {\n            aa = v(aa);\n            var ba = ((y(aa) ? q : o));\n            return g.hasClass(aa, ba);\n        },\n        setLabel: function(aa, ba) {\n            aa = v(aa);\n            if (y(aa)) {\n                var ca = [];\n                if (ba) {\n                    ca.push(ba);\n                }\n            ;\n            ;\n                var da = i.scry(aa, \".img\")[0];\n                if (da) {\n                    if (((aa.firstChild == da))) {\n                        ca.unshift(da);\n                    }\n                     else ca.push(da);\n                ;\n                }\n            ;\n            ;\n                i.setContent(aa, ca);\n            }\n             else if (w(aa)) {\n                var ea = i.JSBNG__find(aa, \"span.uiButtonText\");\n                i.setContent(ea, ba);\n            }\n             else z.getInputElement(aa).value = ba;\n            \n        ;\n        ;\n            var fa = ((y(aa) ? \"_42fv\" : \"uiButtonNoText\"));\n            g.conditionClass(aa, fa, !ba);\n        },\n        setIcon: function(aa, ba) {\n            if (((ba && !i.isNode(ba)))) {\n                return;\n            }\n        ;\n        ;\n            aa = v(aa);\n            var ca = i.scry(aa, \".img\")[0];\n            if (!ba) {\n                ((ca && i.remove(ca)));\n                return;\n            }\n        ;\n        ;\n            g.addClass(ba, \"customimg\");\n            if (((ca != ba))) {\n                if (ca) {\n                    i.replace(ca, ba);\n                }\n                 else i.prependContent(aa, ba);\n            ;\n            }\n        ;\n        ;\n        }\n    };\n    e.exports = z;\n});\n__d(\"Form\", [\"JSBNG__Event\",\"AsyncRequest\",\"AsyncResponse\",\"CSS\",\"DOM\",\"DOMPosition\",\"DOMQuery\",\"DataStore\",\"Env\",\"Input\",\"Parent\",\"URI\",\"createArrayFrom\",\"trackReferrer\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"AsyncRequest\"), i = b(\"AsyncResponse\"), j = b(\"CSS\"), k = b(\"DOM\"), l = b(\"DOMPosition\"), m = b(\"DOMQuery\"), n = b(\"DataStore\"), o = b(\"Env\"), p = b(\"Input\"), q = b(\"Parent\"), r = b(\"URI\"), s = b(\"createArrayFrom\"), t = b(\"trackReferrer\"), u = ((\"JSBNG__FileList\" in window)), v = ((\"JSBNG__FormData\" in window));\n    function w(y) {\n        var z = {\n        };\n        r.implodeQuery(y).split(\"&\").forEach(function(aa) {\n            if (aa) {\n                var ba = /^([^=]*)(?:=(.*))?$/.exec(aa), ca = r.decodeComponent(ba[1]), da = ((ba[2] ? r.decodeComponent(ba[2]) : null));\n                z[ca] = da;\n            }\n        ;\n        ;\n        });\n        return z;\n    };\n;\n    var x = {\n        getInputs: function(y) {\n            y = ((y || JSBNG__document));\n            return [].concat(s(m.scry(y, \"input\")), s(m.scry(y, \"select\")), s(m.scry(y, \"textarea\")), s(m.scry(y, \"button\")));\n        },\n        getInputsByName: function(y) {\n            var z = {\n            };\n            x.getInputs(y).forEach(function(aa) {\n                var ba = z[aa.JSBNG__name];\n                z[aa.JSBNG__name] = ((((typeof ba === \"undefined\")) ? aa : [aa,].concat(ba)));\n            });\n            return z;\n        },\n        getSelectValue: function(y) {\n            return y.options[y.selectedIndex].value;\n        },\n        setSelectValue: function(y, z) {\n            for (var aa = 0; ((aa < y.options.length)); ++aa) {\n                if (((y.options[aa].value == z))) {\n                    y.selectedIndex = aa;\n                    break;\n                }\n            ;\n            ;\n            };\n        ;\n        },\n        getRadioValue: function(y) {\n            for (var z = 0; ((z < y.length)); z++) {\n                if (y[z].checked) {\n                    return y[z].value;\n                }\n            ;\n            ;\n            };\n        ;\n            return null;\n        },\n        getElements: function(y) {\n            return s(((((y.tagName == \"FORM\")) ? y.elements : x.getInputs(y))));\n        },\n        getAttribute: function(y, z) {\n            return ((((y.getAttributeNode(z) || {\n            })).value || null));\n        },\n        setDisabled: function(y, z) {\n            x.getElements(y).forEach(function(aa) {\n                if (((aa.disabled !== undefined))) {\n                    var ba = n.get(aa, \"origDisabledState\");\n                    if (z) {\n                        if (((ba === undefined))) {\n                            n.set(aa, \"origDisabledState\", aa.disabled);\n                        }\n                    ;\n                    ;\n                        aa.disabled = z;\n                    }\n                     else if (((ba !== true))) {\n                        aa.disabled = false;\n                    }\n                    \n                ;\n                ;\n                }\n            ;\n            ;\n            });\n        },\n        bootstrap: function(y, z) {\n            var aa = ((x.getAttribute(y, \"method\") || \"GET\")).toUpperCase();\n            z = ((q.byTag(z, \"button\") || z));\n            var ba = ((q.byClass(z, \"stat_elem\") || y));\n            if (j.hasClass(ba, \"async_saving\")) {\n                return;\n            }\n        ;\n        ;\n            if (((z && ((((((z.form !== y)) || ((((z.nodeName != \"INPUT\")) && ((z.nodeName != \"BUTTON\")))))) || ((z.type != \"submit\"))))))) {\n                var ca = m.scry(y, \".enter_submit_target\")[0];\n                ((ca && (z = ca)));\n            }\n        ;\n        ;\n            var da = x.serialize(y, z);\n            x.setDisabled(y, true);\n            var ea = ((x.getAttribute(y, \"ajaxify\") || x.getAttribute(y, \"action\")));\n            t(y, ea);\n            var fa = new h(ea);\n            fa.setData(da).setNectarModuleDataSafe(y).setReadOnly(((aa == \"GET\"))).setMethod(aa).setRelativeTo(y).setStatusElement(ba).setInitialHandler(x.setDisabled.curry(y, false)).setHandler(function(ga) {\n                g.fire(y, \"success\", {\n                    response: ga\n                });\n            }).setErrorHandler(function(ga) {\n                if (((g.fire(y, \"error\", {\n                    response: ga\n                }) !== false))) {\n                    i.defaultErrorHandler(ga);\n                }\n            ;\n            ;\n            }).setFinallyHandler(x.setDisabled.curry(y, false)).send();\n        },\n        forEachValue: function(y, z, aa) {\n            x.getElements(y).forEach(function(ba) {\n                if (((((ba.JSBNG__name && !ba.disabled)) && ((ba.type !== \"submit\"))))) {\n                    if (((((((((((!ba.type || ((((((ba.type === \"radio\")) || ((ba.type === \"checkbox\")))) && ba.checked)))) || ((ba.type === \"text\")))) || ((ba.type === \"password\")))) || ((ba.type === \"hidden\")))) || ((ba.nodeName === \"TEXTAREA\"))))) {\n                        aa(ba.type, ba.JSBNG__name, p.getValue(ba));\n                    }\n                     else if (((ba.nodeName === \"SELECT\"))) {\n                        for (var ca = 0, da = ba.options.length; ((ca < da)); ca++) {\n                            var ea = ba.options[ca];\n                            if (ea.selected) {\n                                aa(\"select\", ba.JSBNG__name, ea.value);\n                            }\n                        ;\n                        ;\n                        };\n                    ;\n                    }\n                     else if (((u && ((ba.type === \"file\"))))) {\n                        var fa = ba.files;\n                        for (var ga = 0; ((ga < fa.length)); ga++) {\n                            aa(\"file\", ba.JSBNG__name, fa.item(ga));\n                        ;\n                        };\n                    ;\n                    }\n                    \n                    \n                ;\n                }\n            ;\n            ;\n            });\n            if (((((((((z && z.JSBNG__name)) && ((z.type === \"submit\")))) && m.contains(y, z))) && m.isNodeOfType(z, [\"input\",\"button\",])))) {\n                aa(\"submit\", z.JSBNG__name, z.value);\n            }\n        ;\n        ;\n        },\n        createFormData: function(y, z) {\n            if (!v) {\n                return null;\n            }\n        ;\n        ;\n            var aa = new JSBNG__FormData();\n            if (y) {\n                if (m.isNode(y)) {\n                    x.forEachValue(y, z, function(da, ea, fa) {\n                        aa.append(ea, fa);\n                    });\n                }\n                 else {\n                    var ba = w(y);\n                    {\n                        var fin116keys = ((window.top.JSBNG_Replay.forInKeys)((ba))), fin116i = (0);\n                        var ca;\n                        for (; (fin116i < fin116keys.length); (fin116i++)) {\n                            ((ca) = (fin116keys[fin116i]));\n                            {\n                                aa.append(ca, ba[ca]);\n                            ;\n                            };\n                        };\n                    };\n                ;\n                }\n            ;\n            }\n        ;\n        ;\n            return aa;\n        },\n        serialize: function(y, z) {\n            var aa = {\n            };\n            x.forEachValue(y, z, function(ba, ca, da) {\n                if (((ba === \"file\"))) {\n                    return;\n                }\n            ;\n            ;\n                x._serializeHelper(aa, ca, da);\n            });\n            return x._serializeFix(aa);\n        },\n        _serializeHelper: function(y, z, aa) {\n            var ba = Object.prototype.hasOwnProperty, ca = /([^\\]]+)\\[([^\\]]*)\\](.*)/.exec(z);\n            if (ca) {\n                if (((!y[ca[1]] || !ba.call(y, ca[1])))) {\n                    var da;\n                    y[ca[1]] = da = {\n                    };\n                    if (((y[ca[1]] !== da))) {\n                        return;\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n                var ea = 0;\n                if (((ca[2] === \"\"))) {\n                    while (((y[ca[1]][ea] !== undefined))) {\n                        ea++;\n                    ;\n                    };\n                ;\n                }\n                 else ea = ca[2];\n            ;\n            ;\n                if (((ca[3] === \"\"))) {\n                    y[ca[1]][ea] = aa;\n                }\n                 else x._serializeHelper(y[ca[1]], ea.concat(ca[3]), aa);\n            ;\n            ;\n            }\n             else y[z] = aa;\n        ;\n        ;\n        },\n        _serializeFix: function(y) {\n            {\n                var fin117keys = ((window.top.JSBNG_Replay.forInKeys)((y))), fin117i = (0);\n                var z;\n                for (; (fin117i < fin117keys.length); (fin117i++)) {\n                    ((z) = (fin117keys[fin117i]));\n                    {\n                        if (((y[z] instanceof Object))) {\n                            y[z] = x._serializeFix(y[z]);\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            var aa = Object.keys(y);\n            if (((((aa.length === 0)) || aa.some(isNaN)))) {\n                return y;\n            }\n        ;\n        ;\n            aa.sort(function(da, ea) {\n                return ((da - ea));\n            });\n            var ba = 0, ca = aa.every(function(da) {\n                return ((+da === ba++));\n            });\n            if (ca) {\n                return aa.map(function(da) {\n                    return y[da];\n                });\n            }\n        ;\n        ;\n            return y;\n        },\n        post: function(y, z, aa) {\n            var ba = JSBNG__document.createElement(\"form\");\n            ba.action = y.toString();\n            ba.method = \"POST\";\n            ba.style.display = \"none\";\n            if (aa) {\n                ba.target = aa;\n            }\n        ;\n        ;\n            z.fb_dtsg = o.fb_dtsg;\n            x.createHiddenInputs(z, ba);\n            m.getRootElement().appendChild(ba);\n            ba.submit();\n            return false;\n        },\n        createHiddenInputs: function(y, z, aa, ba) {\n            aa = ((aa || {\n            }));\n            var ca = w(y);\n            {\n                var fin118keys = ((window.top.JSBNG_Replay.forInKeys)((ca))), fin118i = (0);\n                var da;\n                for (; (fin118i < fin118keys.length); (fin118i++)) {\n                    ((da) = (fin118keys[fin118i]));\n                    {\n                        if (((ca[da] === null))) {\n                            continue;\n                        }\n                    ;\n                    ;\n                        if (((aa[da] && ba))) {\n                            aa[da].value = ca[da];\n                        }\n                         else {\n                            var ea = k.create(\"input\", {\n                                type: \"hidden\",\n                                JSBNG__name: da,\n                                value: ca[da]\n                            });\n                            aa[da] = ea;\n                            z.appendChild(ea);\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            return aa;\n        },\n        getFirstElement: function(y, z) {\n            z = ((z || [\"input[type=\\\"text\\\"]\",\"textarea\",\"input[type=\\\"password\\\"]\",\"input[type=\\\"button\\\"]\",\"input[type=\\\"submit\\\"]\",]));\n            var aa = [];\n            for (var ba = 0; ((ba < z.length)); ba++) {\n                aa = m.scry(y, z[ba]);\n                for (var ca = 0; ((ca < aa.length)); ca++) {\n                    var da = aa[ca];\n                    try {\n                        var fa = l.getElementPosition(da);\n                        if (((((fa.y > 0)) && ((fa.x > 0))))) {\n                            return da;\n                        }\n                    ;\n                    ;\n                    } catch (ea) {\n                    \n                    };\n                ;\n                };\n            ;\n            };\n        ;\n            return null;\n        },\n        focusFirst: function(y) {\n            var z = x.getFirstElement(y);\n            if (z) {\n                z.JSBNG__focus();\n                return true;\n            }\n        ;\n        ;\n            return false;\n        }\n    };\n    e.exports = x;\n});\n__d(\"Locale\", [\"Style\",], function(a, b, c, d, e, f) {\n    var g = b(\"Style\"), h, i = {\n        isRTL: function() {\n            if (((h === undefined))) {\n                h = ((\"rtl\" === g.get(JSBNG__document.body, \"direction\")));\n            }\n        ;\n        ;\n            return h;\n        }\n    };\n    e.exports = i;\n});\n__d(\"getOverlayZIndex\", [\"Style\",], function(a, b, c, d, e, f) {\n    var g = b(\"Style\");\n    function h(i, j) {\n        j = ((j || JSBNG__document.body));\n        var k = [];\n        while (((i && ((i !== j))))) {\n            k.push(i);\n            i = i.parentNode;\n        };\n    ;\n        if (((i !== j))) {\n            return 0;\n        }\n    ;\n    ;\n        for (var l = ((k.length - 1)); ((l >= 0)); l--) {\n            var m = k[l];\n            if (((g.get(m, \"position\") != \"static\"))) {\n                var n = parseInt(g.get(m, \"z-index\"), 10);\n                if (!isNaN(n)) {\n                    return n;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n        };\n    ;\n        return 0;\n    };\n;\n    e.exports = h;\n});\n__d(\"Dialog\", [\"Animation\",\"Arbiter\",\"AsyncRequest\",\"Bootloader\",\"Button\",\"ContextualThing\",\"CSS\",\"DOM\",\"JSBNG__Event\",\"Focus\",\"Form\",\"HTML\",\"Keys\",\"Locale\",\"Parent\",\"Run\",\"Style\",\"URI\",\"UserAgent\",\"Vector\",\"bind\",\"copyProperties\",\"createArrayFrom\",\"emptyFunction\",\"getObjectValues\",\"getOverlayZIndex\",\"removeFromArray\",\"shield\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Animation\"), h = b(\"Arbiter\"), i = b(\"AsyncRequest\"), j = b(\"Bootloader\"), k = b(\"Button\"), l = b(\"ContextualThing\"), m = b(\"CSS\"), n = b(\"DOM\"), o = b(\"JSBNG__Event\"), p = b(\"Focus\"), q = b(\"Form\"), r = b(\"HTML\"), s = b(\"Keys\"), t = b(\"Locale\"), u = b(\"Parent\"), v = b(\"Run\"), w = b(\"Style\"), x = b(\"URI\"), y = b(\"UserAgent\"), z = b(\"Vector\"), aa = b(\"bind\"), ba = b(\"copyProperties\"), ca = b(\"createArrayFrom\"), da = b(\"emptyFunction\"), ea = b(\"getObjectValues\"), fa = b(\"getOverlayZIndex\"), ga = b(\"removeFromArray\"), ha = b(\"shield\"), ia = b(\"tx\"), ja = function() {\n        var la = JSBNG__document.body, ma = JSBNG__document.createElement(\"div\"), na = JSBNG__document.createElement(\"div\");\n        la.insertBefore(ma, la.firstChild);\n        la.insertBefore(na, la.firstChild);\n        ma.style.position = \"fixed\";\n        ma.style.JSBNG__top = \"20px\";\n        var oa = ((ma.offsetTop !== na.offsetTop));\n        la.removeChild(ma);\n        la.removeChild(na);\n        ja = da.thatReturns(oa);\n        return oa;\n    };\n    function ka(la) {\n        this._show_loading = true;\n        this._auto_focus = true;\n        this._submit_on_enter = false;\n        this._fade_enabled = true;\n        this._onload_handlers = [];\n        this._top = 125;\n        this._uniqueID = ((\"dialog_\" + ka._globalCount++));\n        this._content = null;\n        this._obj = null;\n        this._popup = null;\n        this._overlay = null;\n        this._shim = null;\n        this._causal_elem = null;\n        this._previous_focus = null;\n        this._buttons = [];\n        this._buildDialog();\n        if (la) {\n            this._setFromModel(la);\n        }\n    ;\n    ;\n        ka._init();\n    };\n;\n    ba(ka, {\n        OK: {\n            JSBNG__name: \"ok\",\n            label: \"Okay\"\n        },\n        CANCEL: {\n            JSBNG__name: \"cancel\",\n            label: \"Cancel\",\n            className: \"inputaux\"\n        },\n        CLOSE: {\n            JSBNG__name: \"close\",\n            label: \"Close\"\n        },\n        NEXT: {\n            JSBNG__name: \"next\",\n            label: \"Next\"\n        },\n        SAVE: {\n            JSBNG__name: \"save\",\n            label: \"Save\"\n        },\n        SUBMIT: {\n            JSBNG__name: \"submit\",\n            label: \"Submit\"\n        },\n        CONFIRM: {\n            JSBNG__name: \"JSBNG__confirm\",\n            label: \"Confirm\"\n        },\n        DELETE: {\n            JSBNG__name: \"delete\",\n            label: \"Delete\"\n        },\n        _globalCount: 0,\n        _bottoms: [0,],\n        max_bottom: 0,\n        _updateMaxBottom: function() {\n            ka.max_bottom = Math.max.apply(Math, ka._bottoms);\n        }\n    });\n    ba(ka, {\n        OK_AND_CANCEL: [ka.OK,ka.CANCEL,],\n        _STANDARD_BUTTONS: [ka.OK,ka.CANCEL,ka.CLOSE,ka.SAVE,ka.SUBMIT,ka.CONFIRM,ka.DELETE,],\n        SIZE: {\n            WIDE: 555,\n            STANDARD: 445\n        },\n        _HALO_WIDTH: 10,\n        _BORDER_WIDTH: 1,\n        _PADDING_WIDTH: 10,\n        _PAGE_MARGIN: 40,\n        _stack: [],\n        _isUsingCSSBorders: function() {\n            return ((y.ie() < 7));\n        },\n        newButton: function(la, ma, na, oa) {\n            var pa = {\n                JSBNG__name: la,\n                label: ma\n            };\n            if (na) {\n                pa.className = na;\n            }\n        ;\n        ;\n            if (oa) {\n                pa.handler = oa;\n            }\n        ;\n        ;\n            return pa;\n        },\n        getCurrent: function() {\n            var la = ka._stack;\n            return ((la.length ? la[((la.length - 1))] : null));\n        },\n        hideCurrent: function() {\n            var la = ka.getCurrent();\n            ((la && la.hide()));\n        },\n        bootstrap: function(la, ma, na, oa, pa, qa) {\n            ma = ((ma || {\n            }));\n            ba(ma, new x(la).getQueryData());\n            oa = ((oa || ((na ? \"GET\" : \"POST\"))));\n            var ra = ((u.byClass(qa, \"stat_elem\") || qa));\n            if (((ra && m.hasClass(ra, \"async_saving\")))) {\n                return false;\n            }\n        ;\n        ;\n            var sa = new i().setReadOnly(!!na).setMethod(oa).setRelativeTo(qa).setStatusElement(ra).setURI(la).setNectarModuleDataSafe(qa).setData(ma), ta = new ka(pa).setCausalElement(qa).setAsync(sa);\n            ta.show();\n            return false;\n        },\n        showFromModel: function(la, ma) {\n            var na = new ka(la).setCausalElement(ma).show();\n            if (la.hiding) {\n                na.hide();\n            }\n        ;\n        ;\n        },\n        _init: function() {\n            this._init = da;\n            v.onLeave(ha(ka._tearDown, null, false));\n            h.subscribe(\"page_transition\", ha(ka._tearDown, null, true));\n            o.listen(JSBNG__document.documentElement, \"keydown\", function(JSBNG__event) {\n                if (((((o.getKeyCode(JSBNG__event) == s.ESC)) && !JSBNG__event.getModifiers().any))) {\n                    if (ka._escape()) {\n                        JSBNG__event.kill();\n                    }\n                ;\n                ;\n                }\n                 else if (((((o.getKeyCode(JSBNG__event) == s.RETURN)) && !JSBNG__event.getModifiers().any))) {\n                    if (ka._enter()) {\n                        JSBNG__event.kill();\n                    }\n                ;\n                }\n                \n            ;\n            ;\n            });\n            o.listen(window, \"resize\", function(JSBNG__event) {\n                var la = ka.getCurrent();\n                ((la && la._resetDialogObj()));\n            });\n        },\n        _findButton: function(la, ma) {\n            if (la) {\n                for (var na = 0; ((na < la.length)); ++na) {\n                    if (((la[na].JSBNG__name == ma))) {\n                        return la[na];\n                    }\n                ;\n                ;\n                };\n            }\n        ;\n        ;\n            return null;\n        },\n        _tearDown: function(la) {\n            var ma = ka._stack.slice();\n            for (var na = ((ma.length - 1)); ((na >= 0)); na--) {\n                if (((((la && !ma[na]._cross_transition)) || ((!la && !ma[na]._cross_quickling))))) {\n                    ma[na].hide();\n                }\n            ;\n            ;\n            };\n        ;\n        },\n        _escape: function() {\n            var la = ka.getCurrent();\n            if (!la) {\n                return false;\n            }\n        ;\n        ;\n            var ma = la._semi_modal, na = la._buttons;\n            if (((!na.length && !ma))) {\n                return false;\n            }\n        ;\n        ;\n            if (((ma && !na.length))) {\n                la.hide();\n                return true;\n            }\n        ;\n        ;\n            var oa, pa = ka._findButton(na, \"cancel\");\n            if (la._cancelHandler) {\n                la.cancel();\n                return true;\n            }\n             else if (pa) {\n                oa = pa;\n            }\n             else if (((na.length == 1))) {\n                oa = na[0];\n            }\n             else return false\n            \n            \n        ;\n            la._handleButton(oa);\n            return true;\n        },\n        _enter: function() {\n            var la = ka.getCurrent();\n            if (((!la || !la._submit_on_enter))) {\n                return false;\n            }\n        ;\n        ;\n            if (((JSBNG__document.activeElement != la._frame))) {\n                return false;\n            }\n        ;\n        ;\n            var ma = la._buttons;\n            if (!ma) {\n                return false;\n            }\n        ;\n        ;\n            la._handleButton(ma[0]);\n            return true;\n        },\n        call_or_eval: function(la, ma, na) {\n            if (!ma) {\n                return undefined;\n            }\n        ;\n        ;\n            na = ((na || {\n            }));\n            if (((typeof ma == \"string\"))) {\n                var oa = Object.keys(na).join(\", \");\n                ma = (eval)(((((((((\"({f: function(\" + oa)) + \") { \")) + ma)) + \"}})\"))).f;\n            }\n        ;\n        ;\n            return ma.apply(la, ea(na));\n        }\n    });\n    ba(ka.prototype, {\n        _cross_quickling: false,\n        _cross_transition: false,\n        _loading: false,\n        _showing: false,\n        show: function() {\n            this._showing = true;\n            if (this._async_request) {\n                if (this._show_loading) {\n                    this.showLoading();\n                }\n            ;\n            ;\n            }\n             else this._update();\n        ;\n        ;\n            return this;\n        },\n        showLoading: function() {\n            this._loading = true;\n            m.addClass(this._frame, \"dialog_loading_shown\");\n            this._renderDialog();\n            return this;\n        },\n        hide: function() {\n            if (((!this._showing && !this._loading))) {\n                return this;\n            }\n        ;\n        ;\n            this._showing = false;\n            if (this._autohide_timeout) {\n                JSBNG__clearTimeout(this._autohide_timeout);\n                this._autohide_timeout = null;\n            }\n        ;\n        ;\n            if (((this._fade_enabled && ((ka._stack.length <= 1))))) {\n                this._fadeOut();\n            }\n             else this._hide();\n        ;\n        ;\n            return this;\n        },\n        cancel: function() {\n            if (((!this._cancelHandler || ((this._cancelHandler() !== false))))) {\n                this.hide();\n            }\n        ;\n        ;\n        },\n        getRoot: function() {\n            return this._obj;\n        },\n        getBody: function() {\n            return n.scry(this._obj, \"div.dialog_body\")[0];\n        },\n        getButtonElement: function(la) {\n            if (((typeof la == \"string\"))) {\n                la = ka._findButton(this._buttons, la);\n            }\n        ;\n        ;\n            if (((!la || !la.JSBNG__name))) {\n                return null;\n            }\n        ;\n        ;\n            var ma = n.scry(this._popup, \"input\"), na = function(oa) {\n                return ((oa.JSBNG__name == la.JSBNG__name));\n            };\n            return ((ma.filter(na)[0] || null));\n        },\n        getContentNode: function() {\n            return n.JSBNG__find(this._content, \"div.dialog_content\");\n        },\n        getFormData: function() {\n            return q.serialize(this.getContentNode());\n        },\n        setAllowCrossPageTransition: function(la) {\n            this._cross_transition = la;\n            return this;\n        },\n        setAllowCrossQuicklingNavigation: function(la) {\n            this._cross_quickling = la;\n            return this;\n        },\n        setShowing: function() {\n            this.show();\n            return this;\n        },\n        setHiding: function() {\n            this.hide();\n            return this;\n        },\n        setTitle: function(la) {\n            var ma = this._nodes.title, na = this._nodes.title_inner, oa = this._nodes.JSBNG__content;\n            n.setContent(na, this._format(((la || \"\"))));\n            m.conditionShow(ma, !!la);\n            m.conditionClass(oa, \"dialog_content_titleless\", !la);\n            return this;\n        },\n        setBody: function(la) {\n            n.setContent(this._nodes.body, this._format(la));\n            return this;\n        },\n        setExtraData: function(la) {\n            this._extra_data = la;\n            return this;\n        },\n        setReturnData: function(la) {\n            this._return_data = la;\n            return this;\n        },\n        setShowLoading: function(la) {\n            this._show_loading = la;\n            return this;\n        },\n        setCustomLoading: function(la) {\n            var ma = n.create(\"div\", {\n                className: \"dialog_loading\"\n            }, la);\n            n.setContent(this._frame, [this._nodes.title,this._nodes.JSBNG__content,ma,]);\n            return this;\n        },\n        setFullBleed: function(la) {\n            this._full_bleed = la;\n            this._updateWidth();\n            m.conditionClass(this._obj, \"full_bleed\", la);\n            return this;\n        },\n        setCausalElement: function(la) {\n            this._causal_elem = la;\n            return this;\n        },\n        setUserData: function(la) {\n            this._user_data = la;\n            return this;\n        },\n        getUserData: function() {\n            return this._user_data;\n        },\n        setAutohide: function(la) {\n            if (la) {\n                if (this._showing) {\n                    this._autohide_timeout = JSBNG__setTimeout(ha(this.hide, this), la);\n                }\n                 else this._autohide = la;\n            ;\n            ;\n            }\n             else {\n                this._autohide = null;\n                if (this._autohide_timeout) {\n                    JSBNG__clearTimeout(this._autohide_timeout);\n                    this._autohide_timeout = null;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            return this;\n        },\n        setSummary: function(la) {\n            var ma = this._nodes.summary;\n            n.setContent(ma, this._format(((la || \"\"))));\n            m.conditionShow(ma, !!la);\n            return this;\n        },\n        setButtons: function(la) {\n            var ma, na;\n            if (!((la instanceof Array))) {\n                ma = ca(arguments);\n            }\n             else ma = la;\n        ;\n        ;\n            for (var oa = 0; ((oa < ma.length)); ++oa) {\n                if (((typeof ma[oa] == \"string\"))) {\n                    na = ka._findButton(ka._STANDARD_BUTTONS, ma[oa]);\n                    ma[oa] = na;\n                }\n            ;\n            ;\n            };\n        ;\n            this._buttons = ma;\n            var pa = [];\n            if (((ma && ((ma.length > 0))))) {\n                for (var qa = 0; ((qa < ma.length)); qa++) {\n                    na = ma[qa];\n                    var ra = n.create(\"input\", {\n                        type: \"button\",\n                        JSBNG__name: ((na.JSBNG__name || \"\")),\n                        value: na.label\n                    }), sa = n.create(\"label\", {\n                        className: \"uiButton uiButtonLarge uiButtonConfirm\"\n                    }, ra);\n                    if (na.className) {\n                        na.className.split(/\\s+/).forEach(function(ua) {\n                            m.addClass(sa, ua);\n                        });\n                        if (m.hasClass(sa, \"inputaux\")) {\n                            m.removeClass(sa, \"inputaux\");\n                            m.removeClass(sa, \"uiButtonConfirm\");\n                        }\n                    ;\n                    ;\n                        if (m.hasClass(sa, \"uiButtonSpecial\")) {\n                            m.removeClass(sa, \"uiButtonConfirm\");\n                        }\n                    ;\n                    ;\n                    }\n                ;\n                ;\n                    if (na.icon) {\n                        n.prependContent(sa, n.create(\"img\", {\n                            src: na.icon,\n                            className: \"img mrs\"\n                        }));\n                    }\n                ;\n                ;\n                    if (na.disabled) {\n                        k.setEnabled(sa, false);\n                    }\n                ;\n                ;\n                    o.listen(ra, \"click\", this._handleButton.bind(this, na.JSBNG__name));\n                    {\n                        var fin119keys = ((window.top.JSBNG_Replay.forInKeys)((na))), fin119i = (0);\n                        var ta;\n                        for (; (fin119i < fin119keys.length); (fin119i++)) {\n                            ((ta) = (fin119keys[fin119i]));\n                            {\n                                if (((((ta.indexOf(\"data-\") === 0)) && ((ta.length > 5))))) {\n                                    ra.setAttribute(ta, na[ta]);\n                                }\n                            ;\n                            ;\n                            };\n                        };\n                    };\n                ;\n                    pa.push(sa);\n                };\n            }\n        ;\n        ;\n            n.setContent(this._nodes.buttons, pa);\n            this._updateButtonVisibility();\n            return this;\n        },\n        setButtonsMessage: function(la) {\n            n.setContent(this._nodes.button_message, this._format(((la || \"\"))));\n            this._has_button_message = !!la;\n            this._updateButtonVisibility();\n            return this;\n        },\n        _updateButtonVisibility: function() {\n            var la = ((((this._buttons.length > 0)) || this._has_button_message));\n            m.conditionShow(this._nodes.button_wrapper, la);\n            m.conditionClass(this._obj, \"omitDialogFooter\", !la);\n        },\n        setClickButtonOnEnter: function(la, ma) {\n            this._clickOnEnterTarget = la;\n            if (!this._clickOnEnterListener) {\n                this._clickOnEnterListener = o.listen(this._nodes.body, \"keypress\", function(JSBNG__event) {\n                    var na = JSBNG__event.getTarget();\n                    if (((na && ((na.id === this._clickOnEnterTarget))))) {\n                        if (((o.getKeyCode(JSBNG__event) == s.RETURN))) {\n                            this._handleButton(ma);\n                            JSBNG__event.kill();\n                        }\n                    ;\n                    }\n                ;\n                ;\n                    return true;\n                }.bind(this));\n            }\n        ;\n        ;\n            return this;\n        },\n        setStackable: function(la, ma) {\n            this._is_stackable = la;\n            this._shown_while_stacked = ((la && ma));\n            return this;\n        },\n        setHandler: function(la) {\n            this._handler = la;\n            return this;\n        },\n        setCancelHandler: function(la) {\n            this._cancelHandler = ka.call_or_eval.bind(null, this, la);\n            return this;\n        },\n        setCloseHandler: function(la) {\n            this._close_handler = ka.call_or_eval.bind(null, this, la);\n            return this;\n        },\n        clearHandler: function() {\n            return this.setHandler(null);\n        },\n        setPostURI: function(la, ma) {\n            if (((ma === undefined))) {\n                ma = true;\n            }\n        ;\n        ;\n            if (ma) {\n                this.setHandler(this._submitForm.bind(this, \"POST\", la));\n            }\n             else this.setHandler(function() {\n                q.post(la, this.getFormData());\n                this.hide();\n            }.bind(this));\n        ;\n        ;\n            return this;\n        },\n        setGetURI: function(la) {\n            this.setHandler(this._submitForm.bind(this, \"GET\", la));\n            return this;\n        },\n        setModal: function(la) {\n            this._modal = la;\n            m.conditionClass(this._obj, \"generic_dialog_modal\", la);\n            return this;\n        },\n        setSemiModal: function(la) {\n            if (la) {\n                this.setModal(true);\n                this._semiModalListener = o.listen(this._obj, \"click\", function(ma) {\n                    if (!n.contains(this._popup, ma.getTarget())) {\n                        this.hide();\n                    }\n                ;\n                ;\n                }.bind(this));\n            }\n             else ((this._semiModalListener && this._semiModalListener.remove()));\n        ;\n        ;\n            this._semi_modal = la;\n            return this;\n        },\n        setWideDialog: function(la) {\n            this._wide_dialog = la;\n            this._updateWidth();\n            return this;\n        },\n        setContentWidth: function(la) {\n            this._content_width = la;\n            this._updateWidth();\n            return this;\n        },\n        setTitleLoading: function(la) {\n            if (((la === undefined))) {\n                la = true;\n            }\n        ;\n        ;\n            var ma = n.JSBNG__find(this._popup, \"h2.dialog_title\");\n            if (ma) {\n                m.conditionClass(ma, \"loading\", la);\n            }\n        ;\n        ;\n            return this;\n        },\n        setSecure: function(la) {\n            m.conditionClass(this._nodes.title, \"secure\", la);\n            return this;\n        },\n        setClassName: function(la) {\n            la.split(/\\s+/).forEach(m.addClass.bind(m, this._obj));\n            return this;\n        },\n        setFadeEnabled: function(la) {\n            this._fade_enabled = la;\n            return this;\n        },\n        setFooter: function(la) {\n            var ma = this._nodes.footer;\n            n.setContent(ma, this._format(((la || \"\"))));\n            m.conditionShow(ma, !!la);\n            return this;\n        },\n        setAutoFocus: function(la) {\n            this._auto_focus = la;\n            return this;\n        },\n        setTop: function(la) {\n            this._top = la;\n            this._resetDialogObj();\n            return this;\n        },\n        onloadRegister: function(la) {\n            ca(la).forEach(function(ma) {\n                if (((typeof ma == \"string\"))) {\n                    ma = new Function(ma);\n                }\n            ;\n            ;\n                this._onload_handlers.push(ma.bind(this));\n            }.bind(this));\n            return this;\n        },\n        setAsyncURL: function(la) {\n            return this.setAsync(new i(la));\n        },\n        setAsync: function(la) {\n            var ma = function(ua) {\n                if (((this._async_request != la))) {\n                    return;\n                }\n            ;\n            ;\n                this._async_request = null;\n                var va = ua.getPayload(), wa = va;\n                if (this._loading) {\n                    this._showing = true;\n                }\n            ;\n            ;\n                if (((typeof wa == \"string\"))) {\n                    this.setBody(wa);\n                }\n                 else this._setFromModel(wa);\n            ;\n            ;\n                this._update();\n            }.bind(this), na = la.getData();\n            na.__d = 1;\n            la.setData(na);\n            var oa = ((la.getHandler() || da));\n            la.setHandler(function(ua) {\n                oa(ua);\n                ma(ua);\n            });\n            var pa = la, qa = ((pa.getErrorHandler() || da)), ra = ((pa.getTransportErrorHandler() || da)), sa = function() {\n                this._async_request = null;\n                this._loading = false;\n                if (((this._showing && this._shown_while_stacked))) {\n                    this._update();\n                }\n                 else this._hide(this._is_stackable);\n            ;\n            ;\n            }.bind(this), ta = ((pa.getServerDialogCancelHandler() || sa));\n            pa.setAllowCrossPageTransition(this._cross_transition).setErrorHandler(function(ua) {\n                sa();\n                qa(ua);\n            }).setTransportErrorHandler(function(ua) {\n                sa();\n                ra(ua);\n            }).setServerDialogCancelHandler(ta);\n            la.send();\n            this._async_request = la;\n            if (this._showing) {\n                this.show();\n            }\n        ;\n        ;\n            return this;\n        },\n        _format: function(la) {\n            if (((typeof la == \"string\"))) {\n                la = r(la);\n            }\n             else la = r.replaceJSONWrapper(la);\n        ;\n        ;\n            if (((la instanceof r))) {\n                la.setDeferred(true);\n            }\n        ;\n        ;\n            return la;\n        },\n        _update: function() {\n            if (!this._showing) {\n                return;\n            }\n        ;\n        ;\n            if (((((this._autohide && !this._async_request)) && !this._autohide_timeout))) {\n                this._autohide_timeout = JSBNG__setTimeout(aa(this, \"hide\"), this._autohide);\n            }\n        ;\n        ;\n            m.removeClass(this._frame, \"dialog_loading_shown\");\n            this._loading = false;\n            this._renderDialog();\n            this._runOnloads();\n            this._previous_focus = JSBNG__document.activeElement;\n            p.set(this._frame);\n        },\n        _runOnloads: function() {\n            for (var la = 0; ((la < this._onload_handlers.length)); ++la) {\n                try {\n                    this._onload_handlers[la]();\n                } catch (ma) {\n                \n                };\n            ;\n            };\n        ;\n            this._onload_handlers = [];\n        },\n        _updateWidth: function() {\n            var la = ((2 * ka._BORDER_WIDTH));\n            if (ka._isUsingCSSBorders()) {\n                la += ((2 * ka._HALO_WIDTH));\n            }\n        ;\n        ;\n            if (this._content_width) {\n                la += this._content_width;\n                if (!this._full_bleed) {\n                    la += ((2 * ka._PADDING_WIDTH));\n                }\n            ;\n            ;\n            }\n             else if (this._wide_dialog) {\n                la += ka.SIZE.WIDE;\n            }\n             else la += ka.SIZE.STANDARD;\n            \n        ;\n        ;\n            this._popup.style.width = ((la + \"px\"));\n        },\n        _updateZIndex: function() {\n            if (((!this._hasSetZIndex && this._causal_elem))) {\n                var la = fa(this._causal_elem), ma = this._causal_elem;\n                while (((!la && (ma = l.getContext(ma))))) {\n                    la = fa(ma);\n                ;\n                };\n            ;\n                this._hasSetZIndex = ((la > ((this._modal ? 400 : 200))));\n                w.set(this._obj, \"z-index\", ((this._hasSetZIndex ? la : \"\")));\n            }\n        ;\n        ;\n        },\n        _renderDialog: function() {\n            this._updateZIndex();\n            this._pushOntoStack();\n            this._obj.style.height = ((((this._modal && ((y.ie() < 7)))) ? ((z.getDocumentDimensions().y + \"px\")) : null));\n            if (((this._obj && this._obj.style.display))) {\n                this._obj.style.visibility = \"hidden\";\n                this._obj.style.display = \"\";\n                this.resetDialogPosition();\n                this._obj.style.visibility = \"\";\n                this._obj.dialog = this;\n            }\n             else this.resetDialogPosition();\n        ;\n        ;\n            JSBNG__clearInterval(this.active_hiding);\n            this.active_hiding = JSBNG__setInterval(this._activeResize.bind(this), 500);\n            this._submit_on_enter = false;\n            if (this._auto_focus) {\n                var la = q.getFirstElement(this._content, [\"input[type=\\\"text\\\"]\",\"textarea\",\"input[type=\\\"password\\\"]\",]);\n                if (la) {\n                    q.focusFirst.bind(this, this._content).defer();\n                }\n                 else this._submit_on_enter = true;\n            ;\n            ;\n            }\n        ;\n        ;\n            var ma = ((z.getElementDimensions(this._content).y + z.getElementPosition(this._content).y));\n            ka._bottoms.push(ma);\n            this._bottom = ma;\n            ka._updateMaxBottom();\n            return this;\n        },\n        _buildDialog: function() {\n            this._obj = n.create(\"div\", {\n                className: \"generic_dialog\",\n                id: this._uniqueID\n            });\n            this._obj.style.display = \"none\";\n            n.appendContent(JSBNG__document.body, this._obj);\n            if (!this._popup) {\n                this._popup = n.create(\"div\", {\n                    className: \"generic_dialog_popup\"\n                });\n            }\n        ;\n        ;\n            this._obj.appendChild(this._popup);\n            if (((((y.ie() < 7)) && !this._shim))) {\n                j.loadModules([\"IframeShim\",], function(xa) {\n                    this._shim = new xa(this._popup);\n                });\n            }\n        ;\n        ;\n            m.addClass(this._obj, \"pop_dialog\");\n            if (t.isRTL()) {\n                m.addClass(this._obj, \"pop_dialog_rtl\");\n            }\n        ;\n        ;\n            var la;\n            if (ka._isUsingCSSBorders()) {\n                la = ((((\"\\u003Cdiv class=\\\"pop_container_advanced\\\"\\u003E\" + \"\\u003Cdiv class=\\\"pop_content\\\" id=\\\"pop_content\\\"\\u003E\\u003C/div\\u003E\")) + \"\\u003C/div\\u003E\"));\n            }\n             else la = ((((((((((((((((\"\\u003Cdiv class=\\\"pop_container\\\"\\u003E\" + \"\\u003Cdiv class=\\\"pop_verticalslab\\\"\\u003E\\u003C/div\\u003E\")) + \"\\u003Cdiv class=\\\"pop_horizontalslab\\\"\\u003E\\u003C/div\\u003E\")) + \"\\u003Cdiv class=\\\"pop_topleft\\\"\\u003E\\u003C/div\\u003E\")) + \"\\u003Cdiv class=\\\"pop_topright\\\"\\u003E\\u003C/div\\u003E\")) + \"\\u003Cdiv class=\\\"pop_bottomright\\\"\\u003E\\u003C/div\\u003E\")) + \"\\u003Cdiv class=\\\"pop_bottomleft\\\"\\u003E\\u003C/div\\u003E\")) + \"\\u003Cdiv class=\\\"pop_content pop_content_old\\\" id=\\\"pop_content\\\"\\u003E\\u003C/div\\u003E\")) + \"\\u003C/div\\u003E\"));\n        ;\n        ;\n            n.setContent(this._popup, r(la));\n            var ma = n.JSBNG__find(this._popup, \"div.pop_content\");\n            ma.setAttribute(\"tabIndex\", \"0\");\n            ma.setAttribute(\"role\", \"alertdialog\");\n            this._frame = this._content = ma;\n            var na = n.create(\"div\", {\n                className: \"dialog_loading\"\n            }, \"Loading...\"), oa = n.create(\"span\"), pa = n.create(\"h2\", {\n                className: \"dialog_title hidden_elem\",\n                id: ((\"title_\" + this._uniqueID))\n            }, oa), qa = n.create(\"div\", {\n                className: \"dialog_summary hidden_elem\"\n            }), ra = n.create(\"div\", {\n                className: \"dialog_body\"\n            }), sa = n.create(\"div\", {\n                className: \"rfloat mlm\"\n            }), ta = n.create(\"div\", {\n                className: \"dialog_buttons_msg\"\n            }), ua = n.create(\"div\", {\n                className: \"dialog_buttons clearfix hidden_elem\"\n            }, [sa,ta,]), va = n.create(\"div\", {\n                className: \"dialog_footer hidden_elem\"\n            }), wa = n.create(\"div\", {\n                className: \"dialog_content\"\n            }, [qa,ra,ua,va,]);\n            this._nodes = {\n                summary: qa,\n                body: ra,\n                buttons: sa,\n                button_message: ta,\n                button_wrapper: ua,\n                footer: va,\n                JSBNG__content: wa,\n                title: pa,\n                title_inner: oa\n            };\n            n.setContent(this._frame, [pa,wa,na,]);\n        },\n        _updateShim: function() {\n            return ((this._shim && this._shim.show()));\n        },\n        _activeResize: function() {\n            if (((this.last_offset_height != this._content.offsetHeight))) {\n                this.last_offset_height = this._content.offsetHeight;\n                this.resetDialogPosition();\n            }\n        ;\n        ;\n        },\n        resetDialogPosition: function() {\n            if (!this._popup) {\n                return;\n            }\n        ;\n        ;\n            this._resetDialogObj();\n            this._updateShim();\n        },\n        _resetDialogObj: function() {\n            var la = ((2 * ka._PAGE_MARGIN)), ma = z.getViewportDimensions(), na = ((ma.x - la)), oa = ((ma.y - la)), pa = ((2 * ka._HALO_WIDTH)), qa = z.getElementDimensions(this._content), ra = ((qa.x + pa)), sa = ((qa.y + pa)), ta = this._top, ua = ((na - ra)), va = ((oa - sa));\n            if (((va < 0))) {\n                ta = ka._PAGE_MARGIN;\n            }\n             else if (((ta > va))) {\n                ta = ((ka._PAGE_MARGIN + ((Math.max(va, 0) / 2))));\n            }\n            \n        ;\n        ;\n            var wa = ja();\n            if (!wa) {\n                ta += z.getScrollPosition().y;\n            }\n        ;\n        ;\n            w.set(this._popup, \"marginTop\", ((ta + \"px\")));\n            var xa = ((wa && ((((ua < 0)) || ((va < 0))))));\n            m.conditionClass(this._obj, \"generic_dialog_fixed_overflow\", xa);\n            m.conditionClass(JSBNG__document.documentElement, \"generic_dialog_overflow_mode\", xa);\n        },\n        _fadeOut: function(la) {\n            if (!this._popup) {\n                return;\n            }\n        ;\n        ;\n            try {\n                new g(this._obj).duration(0).checkpoint().to(\"opacity\", 0).hide().duration(250).ondone(this._hide.bind(this, la)).go();\n            } catch (ma) {\n                this._hide(la);\n            };\n        ;\n        },\n        _hide: function(la) {\n            if (this._obj) {\n                this._obj.style.display = \"none\";\n            }\n        ;\n        ;\n            m.removeClass(JSBNG__document.documentElement, \"generic_dialog_overflow_mode\");\n            this._updateShim();\n            JSBNG__clearInterval(this.active_hiding);\n            if (this._bottom) {\n                var ma = ka._bottoms;\n                ma.splice(ma.indexOf(this._bottom), 1);\n                ka._updateMaxBottom();\n            }\n        ;\n        ;\n            if (((((this._previous_focus && JSBNG__document.activeElement)) && n.contains(this._obj, JSBNG__document.activeElement)))) {\n                p.set(this._previous_focus);\n            }\n        ;\n        ;\n            if (la) {\n                return;\n            }\n        ;\n        ;\n            this.destroy();\n        },\n        destroy: function() {\n            this._popFromStack();\n            JSBNG__clearInterval(this.active_hiding);\n            if (this._obj) {\n                n.remove(this._obj);\n                this._obj = null;\n                ((this._shim && this._shim.hide()));\n                this._shim = null;\n            }\n        ;\n        ;\n            ((this._clickOnEnterListener && this._clickOnEnterListener.remove()));\n            if (this._close_handler) {\n                this._close_handler({\n                    return_data: this._return_data\n                });\n            }\n        ;\n        ;\n        },\n        _handleButton: function(la) {\n            if (((typeof la == \"string\"))) {\n                la = ka._findButton(this._buttons, la);\n            }\n        ;\n        ;\n            var ma = ka.call_or_eval(la, la.handler);\n            if (((ma === false))) {\n                return;\n            }\n        ;\n        ;\n            if (((la.JSBNG__name == \"cancel\"))) {\n                this.cancel();\n            }\n             else if (((ka.call_or_eval(this, this._handler, {\n                button: la\n            }) !== false))) {\n                this.hide();\n            }\n            \n        ;\n        ;\n        },\n        _submitForm: function(la, ma, na) {\n            var oa = this.getFormData();\n            if (na) {\n                oa[na.JSBNG__name] = na.label;\n            }\n        ;\n        ;\n            if (this._extra_data) {\n                ba(oa, this._extra_data);\n            }\n        ;\n        ;\n            var pa = new i().setURI(ma).setData(oa).setMethod(la).setNectarModuleDataSafe(this._causal_elem).setReadOnly(((la == \"GET\")));\n            this.setAsync(pa);\n            return false;\n        },\n        _setFromModel: function(la) {\n            var ma = {\n            };\n            ba(ma, la);\n            {\n                var fin120keys = ((window.top.JSBNG_Replay.forInKeys)((ma))), fin120i = (0);\n                var na;\n                for (; (fin120i < fin120keys.length); (fin120i++)) {\n                    ((na) = (fin120keys[fin120i]));\n                    {\n                        if (((na == \"onloadRegister\"))) {\n                            this.onloadRegister(ma[na]);\n                            continue;\n                        }\n                    ;\n                    ;\n                        var oa = this[((((\"set\" + na.substr(0, 1).toUpperCase())) + na.substr(1)))];\n                        oa.apply(this, ca(ma[na]));\n                    };\n                };\n            };\n        ;\n        },\n        _updateBottom: function() {\n            var la = ((z.getElementDimensions(this._content).y + z.getElementPosition(this._content).y));\n            ka._bottoms[((ka._bottoms.length - 1))] = la;\n            ka._updateMaxBottom();\n        },\n        _pushOntoStack: function() {\n            var la = ka._stack;\n            if (!la.length) {\n                h.inform(\"layer_shown\", {\n                    type: \"Dialog\"\n                });\n            }\n        ;\n        ;\n            ga(la, this);\n            la.push(this);\n            for (var ma = ((la.length - 2)); ((ma >= 0)); ma--) {\n                var na = la[ma];\n                if (((!na._is_stackable && !na._async_request))) {\n                    na._hide();\n                }\n                 else if (!na._shown_while_stacked) {\n                    na._hide(true);\n                }\n                \n            ;\n            ;\n            };\n        ;\n        },\n        _popFromStack: function() {\n            var la = ka._stack, ma = ((la[((la.length - 1))] === this));\n            ga(la, this);\n            if (la.length) {\n                if (ma) {\n                    la[((la.length - 1))].show();\n                }\n            ;\n            ;\n            }\n             else h.inform(\"layer_hidden\", {\n                type: \"Dialog\"\n            });\n        ;\n        ;\n        }\n    });\n    e.exports = ka;\n    a.Dialog = ka;\n});\n__d(\"DialogHideOnSuccess\", [\"copyProperties\",\"CSS\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"copyProperties\"), h = b(\"CSS\"), i = b(\"cx\");\n    function j(k) {\n        this._layer = k;\n    };\n;\n    g(j.prototype, {\n        _subscription: null,\n        enable: function() {\n            this._subscription = this._layer.subscribe(\"success\", this._handle.bind(this));\n        },\n        disable: function() {\n            this._subscription.unsubscribe();\n            this._subscription = null;\n        },\n        _handle: function(k, JSBNG__event) {\n            if (h.hasClass(JSBNG__event.getTarget(), \"_s\")) {\n                this._layer.hide();\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = j;\n});\n__d(\"DocumentTitle\", [\"Arbiter\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = JSBNG__document.title, i = null, j = 1500, k = [], l = 0, m = null, n = false;\n    function o() {\n        if (((k.length > 0))) {\n            if (!n) {\n                p(k[l].title);\n                l = ((++l % k.length));\n            }\n             else q();\n        ;\n        ;\n        }\n         else {\n            JSBNG__clearInterval(m);\n            m = null;\n            q();\n        }\n    ;\n    ;\n    };\n;\n    function p(s) {\n        JSBNG__document.title = s;\n        n = true;\n    };\n;\n    function q() {\n        r.set(((i || h)), true);\n        n = false;\n    };\n;\n    var r = {\n        get: function() {\n            return h;\n        },\n        set: function(s, t) {\n            JSBNG__document.title = s;\n            if (!t) {\n                h = s;\n                i = null;\n                g.inform(\"update_title\", s);\n            }\n             else i = s;\n        ;\n        ;\n        },\n        blink: function(s) {\n            var t = {\n                title: s\n            };\n            k.push(t);\n            if (((m === null))) {\n                m = JSBNG__setInterval(o, j);\n            }\n        ;\n        ;\n            return {\n                JSBNG__stop: function() {\n                    var u = k.indexOf(t);\n                    if (((u >= 0))) {\n                        k.splice(u, 1);\n                        if (((l > u))) {\n                            l--;\n                        }\n                         else if (((((l == u)) && ((l == k.length))))) {\n                            l = 0;\n                        }\n                        \n                    ;\n                    ;\n                    }\n                ;\n                ;\n                }\n            };\n        }\n    };\n    e.exports = r;\n});\n__d(\"DoublyLinkedListMap\", [\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"copyProperties\");\n    function h() {\n        this._head = null;\n        this._tail = null;\n        this._nodes = {\n        };\n        this._nodeCount = 0;\n    };\n;\n    g(h.prototype, {\n        get: function(i) {\n            return ((this._nodes[i] ? this._nodes[i].data : null));\n        },\n        getIndex: function(i) {\n            for (var j = this._head, k = 0; j; j = j.next, k++) {\n                if (((j.key === i))) {\n                    return k;\n                }\n            ;\n            ;\n            };\n        ;\n            return null;\n        },\n        _insert: function(i, j, k, l) {\n            ((((k && !this._nodes[k])) && (k = null)));\n            var m = ((((k && this._nodes[k])) || ((l ? this._head : this._tail)))), n = {\n                data: j,\n                key: i,\n                next: null,\n                prev: null\n            };\n            if (m) {\n                this.remove(i);\n                if (l) {\n                    n.prev = m.prev;\n                    ((m.prev && (m.prev.next = n)));\n                    m.prev = n;\n                    n.next = m;\n                }\n                 else {\n                    n.next = m.next;\n                    ((m.next && (m.next.prev = n)));\n                    m.next = n;\n                    n.prev = m;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            ((((n.prev === null)) && (this._head = n)));\n            ((((n.next === null)) && (this._tail = n)));\n            this._nodes[i] = n;\n            this._nodeCount++;\n            return this;\n        },\n        insertBefore: function(i, j, k) {\n            return this._insert(i, j, k, true);\n        },\n        insertAfter: function(i, j, k) {\n            return this._insert(i, j, k, false);\n        },\n        prepend: function(i, j) {\n            return this.insertBefore(i, j, ((this._head && this._head.key)));\n        },\n        append: function(i, j) {\n            return this.insertAfter(i, j, ((this._tail && this._tail.key)));\n        },\n        remove: function(i) {\n            var j = this._nodes[i];\n            if (j) {\n                var k = j.next, l = j.prev;\n                ((k && (k.prev = l)));\n                ((l && (l.next = k)));\n                ((((this._head === j)) && (this._head = k)));\n                ((((this._tail === j)) && (this._tail = l)));\n                delete this._nodes[i];\n                this._nodeCount--;\n            }\n        ;\n        ;\n            return this;\n        },\n        JSBNG__find: function(i) {\n            for (var j = this._head; j; j = j.next) {\n                if (i(j.data)) {\n                    return j.key;\n                }\n            ;\n            ;\n            };\n        ;\n            return null;\n        },\n        reduce: function(i, j) {\n            for (var k = this._head; k; k = k.next) {\n                j = i(k.data, j);\n            ;\n            };\n        ;\n            return j;\n        },\n        exists: function(i) {\n            return !!this._nodes[i];\n        },\n        isEmpty: function() {\n            return !this._head;\n        },\n        reset: function() {\n            this._head = null;\n            this._tail = null;\n            this._nodes = {\n            };\n            this._nodeCount = 0;\n        },\n        map: function(i) {\n            for (var j = this._head; j; j = j.next) {\n                i(j.data);\n            ;\n            };\n        ;\n        },\n        getCount: function() {\n            return this._nodeCount;\n        },\n        getHead: function() {\n            return ((this._head && this._head.data));\n        },\n        getTail: function() {\n            return ((this._tail && this._tail.data));\n        },\n        getNext: function(i) {\n            var j = this._nodes[i];\n            if (((j && j.next))) {\n                return j.next.data;\n            }\n        ;\n        ;\n            return null;\n        },\n        getPrev: function(i) {\n            var j = this._nodes[i];\n            if (((j && j.prev))) {\n                return j.prev.data;\n            }\n        ;\n        ;\n            return null;\n        }\n    });\n    e.exports = h;\n});\n__d(\"throttle\", [\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"copyProperties\");\n    function h(j, k, l) {\n        return i(j, k, l, false, false);\n    };\n;\n    g(h, {\n        acrossTransitions: function(j, k, l) {\n            return i(j, k, l, true, false);\n        },\n        withBlocking: function(j, k, l) {\n            return i(j, k, l, false, true);\n        }\n    });\n    function i(j, k, l, m, n) {\n        if (((k == null))) {\n            k = 100;\n        }\n    ;\n    ;\n        var o, p, q;\n        function r() {\n            p = JSBNG__Date.now();\n            if (o) {\n                j.apply(l, o);\n                o = null;\n                q = JSBNG__setTimeout(r, k, !m);\n            }\n             else q = false;\n        ;\n        ;\n        };\n    ;\n        return function s() {\n            o = arguments;\n            if (((!q || ((((JSBNG__Date.now() - p)) > k))))) {\n                if (n) {\n                    r();\n                }\n                 else q = JSBNG__setTimeout(r, 0, !m);\n            ;\n            }\n        ;\n        ;\n        };\n    };\n;\n    e.exports = h;\n});\n__d(\"FullScreen\", [\"JSBNG__Event\",\"Arbiter\",\"CSS\",\"UserAgent\",\"copyProperties\",\"throttle\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"Arbiter\"), i = b(\"CSS\"), j = b(\"UserAgent\"), k = b(\"copyProperties\"), l = b(\"throttle\"), m = {\n    }, n = k(new h(), {\n        listenForEvent: function(p) {\n            var q = l(this.onChange, 0, this);\n            if (!m[p.id]) {\n                m[p.id] = true;\n                g.listen(p, {\n                    webkitfullscreenchange: q,\n                    mozfullscreenchange: q,\n                    fullscreenchange: q\n                });\n            }\n        ;\n        ;\n        },\n        enableFullScreen: function(p) {\n            this.listenForEvent(p);\n            if (p.webkitRequestFullScreen) {\n                if (j.chrome()) {\n                    p.webkitRequestFullScreen(JSBNG__Element.ALLOW_KEYBOARD_INPUT);\n                }\n                 else p.webkitRequestFullScreen();\n            ;\n            ;\n            }\n             else if (p.mozRequestFullScreen) {\n                p.mozRequestFullScreen();\n            }\n             else if (p.requestFullScreen) {\n                p.requestFullScreen();\n            }\n             else return false\n            \n            \n        ;\n            return true;\n        },\n        disableFullScreen: function() {\n            if (JSBNG__document.webkitCancelFullScreen) {\n                JSBNG__document.webkitCancelFullScreen();\n            }\n             else if (JSBNG__document.mozCancelFullScreen) {\n                JSBNG__document.mozCancelFullScreen();\n            }\n             else if (JSBNG__document.cancelFullScreen) {\n                JSBNG__document.cancelFullScreen();\n            }\n             else if (JSBNG__document.exitFullScreen) {\n                JSBNG__document.exitFullScreen();\n            }\n             else return false\n            \n            \n            \n        ;\n            return true;\n        },\n        isFullScreen: function() {\n            return ((((JSBNG__document.webkitIsFullScreen || JSBNG__document.JSBNG__fullScreen)) || JSBNG__document.mozFullScreen));\n        },\n        toggleFullScreen: function(p) {\n            if (this.isFullScreen()) {\n                this.disableFullScreen();\n                return false;\n            }\n             else return this.enableFullScreen(p)\n        ;\n            return false;\n        },\n        onChange: function() {\n            var p = this.isFullScreen();\n            i.conditionClass(JSBNG__document.body, \"JSBNG__fullScreen\", p);\n            this.inform(\"changed\");\n        },\n        isSupported: function() {\n            return ((((((((JSBNG__document.webkitCancelFullScreen && j.chrome())) || JSBNG__document.mozCancelFullScreen)) || JSBNG__document.cancelFullScreen)) || JSBNG__document.exitFullScreen));\n        }\n    }), o = l(n.onChange, 0, n);\n    g.listen(JSBNG__document, {\n        webkitfullscreenchange: o,\n        mozfullscreenchange: o,\n        fullscreenchange: o\n    });\n    e.exports = n;\n});\n__d(\"HistoryManager\", [\"JSBNG__Event\",\"function-extensions\",\"Cookie\",\"Env\",\"URI\",\"UserAgent\",\"copyProperties\",\"emptyFunction\",\"goOrReplace\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\");\n    b(\"function-extensions\");\n    var h = b(\"Cookie\"), i = b(\"Env\"), j = b(\"URI\"), k = b(\"UserAgent\"), l = b(\"copyProperties\"), m = b(\"emptyFunction\"), n = b(\"goOrReplace\"), o = {\n        _IFRAME_BASE_URI: \"http://static.ak.facebook.com/common/history_manager.php\",\n        JSBNG__history: null,\n        current: 0,\n        fragment: null,\n        _setIframeSrcFragment: function(p) {\n            p = p.toString();\n            var q = ((o.JSBNG__history.length - 1));\n            o.iframe.src = ((((((((o._IFRAME_BASE_URI + \"?|index=\")) + q)) + \"#\")) + encodeURIComponent(p)));\n            return o;\n        },\n        getIframeSrcFragment: function() {\n            return decodeURIComponent(j(o.iframe.contentWindow.JSBNG__document.JSBNG__location.href).getFragment());\n        },\n        nextframe: function(p, q) {\n            if (q) {\n                o._setIframeSrcFragment(p);\n                return;\n            }\n        ;\n        ;\n            if (((p !== undefined))) {\n                o.iframeQueue.push(p);\n            }\n             else {\n                o.iframeQueue.splice(0, 1);\n                o.iframeTimeout = null;\n                o.checkURI();\n            }\n        ;\n        ;\n            if (((o.iframeQueue.length && !o.iframeTimeout))) {\n                var r = o.iframeQueue[0];\n                o.iframeTimeout = JSBNG__setTimeout(function() {\n                    o._setIframeSrcFragment(r);\n                }, 100, false);\n            }\n        ;\n        ;\n        },\n        isInitialized: function() {\n            return !!o._initialized;\n        },\n        init: function() {\n            if (((!i.ALLOW_TRANSITION_IN_IFRAME && ((window != window.JSBNG__top))))) {\n                return;\n            }\n        ;\n        ;\n            if (o._initialized) {\n                return o;\n            }\n        ;\n        ;\n            var p = j(), q = ((p.getFragment() || \"\"));\n            if (((q.charAt(0) === \"!\"))) {\n                q = q.substr(1);\n                p.setFragment(q);\n            }\n        ;\n        ;\n            if (((j.getRequestURI(false).getProtocol().toLowerCase() == \"https\"))) {\n                o._IFRAME_BASE_URI = \"https://s-static.ak.facebook.com/common/history_manager.php\";\n            }\n        ;\n        ;\n            l(o, {\n                _initialized: true,\n                fragment: q,\n                orig_fragment: q,\n                JSBNG__history: [p,],\n                callbacks: [],\n                lastChanged: JSBNG__Date.now(),\n                canonical: j(\"#\"),\n                fragmentTimeout: null,\n                user: 0,\n                iframeTimeout: null,\n                iframeQueue: [],\n                enabled: true,\n                debug: m\n            });\n            if (((window.JSBNG__history && JSBNG__history.pushState))) {\n                this.lastURI = JSBNG__document.JSBNG__URL;\n                window.JSBNG__history.replaceState(this.lastURI, null);\n                g.listen(window, \"popstate\", function(r) {\n                    if (((((r && r.state)) && ((o.lastURI != r.state))))) {\n                        o.lastURI = r.state;\n                        o.lastChanged = JSBNG__Date.now();\n                        o.notify(j(r.state).getUnqualifiedURI().toString());\n                    }\n                ;\n                ;\n                }.bind(o));\n                if (((((k.webkit() < 534)) || ((k.chrome() <= 13))))) {\n                    JSBNG__setInterval(o.checkURI, 42, false);\n                    o._updateRefererURI(this.lastURI);\n                }\n            ;\n            ;\n                return o;\n            }\n        ;\n        ;\n            o._updateRefererURI(j.getRequestURI(false));\n            if (((((k.webkit() < 500)) || ((k.firefox() < 2))))) {\n                o.enabled = false;\n                return o;\n            }\n        ;\n        ;\n            if (((k.ie() < 8))) {\n                o.iframe = JSBNG__document.createElement(\"div\");\n                l(o.iframe.style, {\n                    width: \"0\",\n                    height: \"0\",\n                    frameborder: \"0\",\n                    left: \"0\",\n                    JSBNG__top: \"0\",\n                    position: \"absolute\"\n                });\n                o._setIframeSrcFragment(q);\n                JSBNG__document.body.insertBefore(o.iframe, JSBNG__document.body.firstChild);\n            }\n             else if (((\"JSBNG__onhashchange\" in window))) {\n                g.listen(window, \"hashchange\", function() {\n                    o.checkURI.bind(o).defer();\n                });\n            }\n             else JSBNG__setInterval(o.checkURI, 42, false);\n            \n        ;\n        ;\n            return o;\n        },\n        registerURIHandler: function(p) {\n            o.callbacks.push(p);\n            return o;\n        },\n        setCanonicalLocation: function(p) {\n            o.canonical = j(p);\n            return o;\n        },\n        notify: function(p) {\n            if (((p == o.orig_fragment))) {\n                p = o.canonical.getFragment();\n            }\n        ;\n        ;\n            for (var q = 0; ((q < o.callbacks.length)); q++) {\n                try {\n                    if (o.callbacks[q](p)) {\n                        return true;\n                    }\n                ;\n                ;\n                } catch (r) {\n                \n                };\n            ;\n            };\n        ;\n            return false;\n        },\n        checkURI: function() {\n            if (((((JSBNG__Date.now() - o.lastChanged)) < 400))) {\n                return;\n            }\n        ;\n        ;\n            if (((window.JSBNG__history && JSBNG__history.pushState))) {\n                var p = j(JSBNG__document.JSBNG__URL).removeQueryData(\"ref\").toString(), q = j(o.lastURI).removeQueryData(\"ref\").toString();\n                if (((p != q))) {\n                    o.lastChanged = JSBNG__Date.now();\n                    o.lastURI = p;\n                    if (((k.webkit() < 534))) {\n                        o._updateRefererURI(p);\n                    }\n                ;\n                ;\n                    o.notify(j(p).getUnqualifiedURI().toString());\n                }\n            ;\n            ;\n                return;\n            }\n        ;\n        ;\n            if (((((k.ie() < 8)) && o.iframeQueue.length))) {\n                return;\n            }\n        ;\n        ;\n            if (((k.webkit() && ((window.JSBNG__history.length == 200))))) {\n                if (!o.warned) {\n                    o.warned = true;\n                }\n            ;\n            ;\n                return;\n            }\n        ;\n        ;\n            var r = j().getFragment();\n            if (((r.charAt(0) == \"!\"))) {\n                r = r.substr(1);\n            }\n        ;\n        ;\n            if (((k.ie() < 8))) {\n                r = o.getIframeSrcFragment();\n            }\n        ;\n        ;\n            r = r.replace(/%23/g, \"#\");\n            if (((r != o.fragment.replace(/%23/g, \"#\")))) {\n                o.debug([r,\" vs \",o.fragment,\"whl: \",window.JSBNG__history.length,\"QHL: \",o.JSBNG__history.length,].join(\" \"));\n                for (var s = ((o.JSBNG__history.length - 1)); ((s >= 0)); --s) {\n                    if (((o.JSBNG__history[s].getFragment().replace(/%23/g, \"#\") == r))) {\n                        break;\n                    }\n                ;\n                ;\n                };\n            ;\n                ++o.user;\n                if (((s >= 0))) {\n                    o.go(((s - o.current)));\n                }\n                 else o.go(((\"#\" + r)));\n            ;\n            ;\n                --o.user;\n            }\n        ;\n        ;\n        },\n        _updateRefererURI: function(p) {\n            p = p.toString();\n            if (((((p.charAt(0) != \"/\")) && ((p.indexOf(\"//\") == -1))))) {\n                return;\n            }\n        ;\n        ;\n            var q = new j(window.JSBNG__location);\n            if (q.isFacebookURI()) {\n                var r = ((q.getPath() + window.JSBNG__location.search));\n            }\n             else var r = \"\"\n        ;\n            var s = j(p).getQualifiedURI().setFragment(r).toString(), t = 2048;\n            if (((s.length > t))) {\n                s = ((s.substring(0, t) + \"...\"));\n            }\n        ;\n        ;\n            h.set(\"x-referer\", s);\n        },\n        go: function(p, q, r) {\n            if (((window.JSBNG__history && JSBNG__history.pushState))) {\n                ((q || ((typeof (p) == \"number\"))));\n                var s = j(p).removeQueryData(\"ref\").toString();\n                o.lastChanged = JSBNG__Date.now();\n                this.lastURI = s;\n                if (r) {\n                    window.JSBNG__history.replaceState(p, null, s);\n                }\n                 else window.JSBNG__history.pushState(p, null, s);\n            ;\n            ;\n                if (((k.webkit() < 534))) {\n                    o._updateRefererURI(p);\n                }\n            ;\n            ;\n                return false;\n            }\n        ;\n        ;\n            o.debug(((\"go: \" + p)));\n            if (((q === undefined))) {\n                q = true;\n            }\n        ;\n        ;\n            if (!o.enabled) {\n                if (!q) {\n                    return false;\n                }\n            ;\n            }\n        ;\n        ;\n            if (((typeof (p) == \"number\"))) {\n                if (!p) {\n                    return false;\n                }\n            ;\n            ;\n                var t = ((p + o.current)), u = Math.max(0, Math.min(((o.JSBNG__history.length - 1)), t));\n                o.current = u;\n                t = ((o.JSBNG__history[u].getFragment() || o.orig_fragment));\n                t = j(t).removeQueryData(\"ref\").getUnqualifiedURI().toString();\n                o.fragment = t;\n                o.lastChanged = JSBNG__Date.now();\n                if (((k.ie() < 8))) {\n                    if (o.fragmentTimeout) {\n                        JSBNG__clearTimeout(o.fragmentTimeout);\n                    }\n                ;\n                ;\n                    o._temporary_fragment = t;\n                    o.fragmentTimeout = JSBNG__setTimeout(function() {\n                        window.JSBNG__location.hash = ((\"#!\" + t));\n                        delete o._temporary_fragment;\n                    }, 750, false);\n                    if (!o.user) {\n                        o.nextframe(t, r);\n                    }\n                ;\n                ;\n                }\n                 else if (!o.user) {\n                    n(window.JSBNG__location, ((((window.JSBNG__location.href.split(\"#\")[0] + \"#!\")) + t)), r);\n                }\n                \n            ;\n            ;\n                if (q) {\n                    o.notify(t);\n                }\n            ;\n            ;\n                o._updateRefererURI(t);\n                return false;\n            }\n        ;\n        ;\n            p = j(p);\n            if (((p.getDomain() == j().getDomain()))) {\n                p = j(((\"#\" + p.getUnqualifiedURI())));\n            }\n        ;\n        ;\n            var v = o.JSBNG__history[o.current].getFragment(), w = p.getFragment();\n            if (((((w == v)) || ((((v == o.orig_fragment)) && ((w == o.canonical.getFragment()))))))) {\n                if (q) {\n                    o.notify(w);\n                }\n            ;\n            ;\n                o._updateRefererURI(w);\n                return false;\n            }\n        ;\n        ;\n            if (r) {\n                o.current--;\n            }\n        ;\n        ;\n            var x = ((((o.JSBNG__history.length - o.current)) - 1));\n            o.JSBNG__history.splice(((o.current + 1)), x);\n            o.JSBNG__history.push(j(p));\n            return o.go(1, q, r);\n        },\n        getCurrentFragment: function() {\n            var p = ((((o._temporary_fragment !== undefined)) ? o._temporary_fragment : j.getRequestURI(false).getFragment()));\n            return ((((p == o.orig_fragment)) ? o.canonical.getFragment() : p));\n        }\n    };\n    e.exports = o;\n});\n__d(\"InputSelection\", [\"DOM\",\"Focus\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOM\"), h = b(\"Focus\"), i = {\n        get: function(j) {\n            if (!JSBNG__document.selection) {\n                return {\n                    start: j.selectionStart,\n                    end: j.selectionEnd\n                };\n            }\n        ;\n        ;\n            var k = JSBNG__document.selection.createRange();\n            if (((k.parentElement() !== j))) {\n                return {\n                    start: 0,\n                    end: 0\n                };\n            }\n        ;\n        ;\n            var l = j.value.length;\n            if (g.isNodeOfType(j, \"input\")) {\n                return {\n                    start: -k.moveStart(\"character\", -l),\n                    end: -k.moveEnd(\"character\", -l)\n                };\n            }\n             else {\n                var m = k.duplicate();\n                m.moveToElementText(j);\n                m.setEndPoint(\"StartToEnd\", k);\n                var n = ((l - m.text.length));\n                m.setEndPoint(\"StartToStart\", k);\n                return {\n                    start: ((l - m.text.length)),\n                    end: n\n                };\n            }\n        ;\n        ;\n        },\n        set: function(j, k, l) {\n            if (((typeof l == \"undefined\"))) {\n                l = k;\n            }\n        ;\n        ;\n            if (JSBNG__document.selection) {\n                if (((j.tagName == \"TEXTAREA\"))) {\n                    var m = ((j.value.slice(0, k).match(/\\r/g) || [])).length, n = ((j.value.slice(k, l).match(/\\r/g) || [])).length;\n                    k -= m;\n                    l -= ((m + n));\n                }\n            ;\n            ;\n                var o = j.createTextRange();\n                o.collapse(true);\n                o.moveStart(\"character\", k);\n                o.moveEnd(\"character\", ((l - k)));\n                o.select();\n            }\n             else {\n                j.selectionStart = k;\n                j.selectionEnd = Math.min(l, j.value.length);\n                h.set(j);\n            }\n        ;\n        ;\n        }\n    };\n    e.exports = i;\n});\n__d(\"JSONPTransport\", [\"ArbiterMixin\",\"DOM\",\"HTML\",\"URI\",\"asyncCallback\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"ArbiterMixin\"), h = b(\"DOM\"), i = b(\"HTML\"), j = b(\"URI\"), k = b(\"asyncCallback\"), l = b(\"copyProperties\"), m = {\n    }, n = 2, o = \"jsonp\", p = \"div\";\n    function q(s) {\n        delete m[s];\n    };\n;\n    function r(s, t) {\n        this._type = s;\n        this._uri = t;\n        m[this.getID()] = this;\n    };\n;\n    l(r, {\n        respond: function(s, t, u) {\n            var v = m[s];\n            if (v) {\n                if (!u) {\n                    q(s);\n                }\n            ;\n            ;\n                if (((v._type == p))) {\n                    t = JSON.parse(JSON.stringify(t));\n                }\n            ;\n            ;\n                k(v.handleResponse.bind(v), \"json\")(t);\n            }\n             else {\n                var w = a.ErrorSignal;\n                if (((w && !u))) {\n                    w.logJSError(\"ajax\", {\n                        error: \"UnexpectedJsonResponse\",\n                        extra: {\n                            id: s,\n                            uri: ((((t.payload && t.payload.uri)) || \"\"))\n                        }\n                    });\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n        }\n    });\n    l(r.prototype, g, {\n        getID: function() {\n            return ((this._id || (this._id = n++)));\n        },\n        hasFinished: function() {\n            return !((this.getID() in m));\n        },\n        getRequestURI: function() {\n            return j(this._uri).addQueryData({\n                __a: 1,\n                __adt: this.getID(),\n                __req: ((\"jsonp_\" + this.getID()))\n            });\n        },\n        getTransportFrame: function() {\n            if (this._iframe) {\n                return this._iframe;\n            }\n        ;\n        ;\n            var s = ((\"transport_frame_\" + this.getID())), t = i(((((\"\\u003Ciframe class=\\\"hidden_elem\\\" name=\\\"\" + s)) + \"\\\" src=\\\"javascript:void(0)\\\" /\\u003E\")));\n            return this._iframe = h.appendContent(JSBNG__document.body, t)[0];\n        },\n        send: function() {\n            if (((this._type === o))) {\n                (function() {\n                    h.appendContent(JSBNG__document.body, h.create(\"script\", {\n                        src: this.getRequestURI().toString(),\n                        type: \"text/javascript\"\n                    }));\n                }).bind(this).defer();\n            }\n             else this.getTransportFrame().src = this.getRequestURI().toString();\n        ;\n        ;\n        },\n        handleResponse: function(s) {\n            this.inform(\"response\", s);\n            if (this.hasFinished()) {\n                this._cleanup.bind(this).defer();\n            }\n        ;\n        ;\n        },\n        abort: function() {\n            if (this._aborted) {\n                return;\n            }\n        ;\n        ;\n            this._aborted = true;\n            this._cleanup();\n            q(this.getID());\n            this.inform(\"abort\");\n        },\n        _cleanup: function() {\n            if (this._iframe) {\n                h.remove(this._iframe);\n                this._iframe = null;\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = r;\n});\n__d(\"JSXDOM\", [\"DOM\",\"flattenArray\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOM\"), h = b(\"flattenArray\"), i = [\"a\",\"br\",\"button\",\"canvas\",\"checkbox\",\"dd\",\"div\",\"dl\",\"dt\",\"em\",\"form\",\"h1\",\"h2\",\"h3\",\"h4\",\"h5\",\"h6\",\"hr\",\"i\",\"div\",\"img\",\"input\",\"label\",\"li\",\"option\",\"p\",\"pre\",\"select\",\"span\",\"strong\",\"table\",\"tbody\",\"thead\",\"td\",\"textarea\",\"th\",\"tr\",\"ul\",\"video\",], j = {\n    };\n    i.forEach(function(k) {\n        var l = function(m, n) {\n            if (((arguments.length > 2))) {\n                n = Array.prototype.slice.call(arguments, 1);\n            }\n        ;\n        ;\n            if (((!n && m))) {\n                n = m.children;\n                delete m.children;\n            }\n        ;\n        ;\n            if (n) {\n                n = ((Array.isArray(n) ? h(n) : h([n,])));\n            }\n        ;\n        ;\n            return g.create(k, m, n);\n        };\n        j[k] = l;\n    });\n    e.exports = j;\n});\n__d(\"LinkController\", [\"JSBNG__Event\",\"DataStore\",\"Parent\",\"trackReferrer\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"DataStore\"), i = b(\"Parent\"), j = b(\"trackReferrer\"), k = \"LinkControllerHandler\", l = [], m = [];\n    function n(JSBNG__event) {\n        var r = i.byTag(JSBNG__event.getTarget(), \"a\"), s = ((r && r.getAttribute(\"href\", 2)));\n        if (((((((!s || r.rel)) || !p(s))) || h.get(r, k)))) {\n            return;\n        }\n    ;\n    ;\n        var t = g.listen(r, \"click\", function(u) {\n            if (((s.charAt(((s.length - 1))) == \"#\"))) {\n                u.prevent();\n                return;\n            }\n        ;\n        ;\n            j(r, s);\n            o(r, u);\n        });\n        h.set(r, k, t);\n    };\n;\n    function o(r, JSBNG__event) {\n        if (((((((r.target || r.rel)) || JSBNG__event.getModifiers().any)) || ((JSBNG__event.which && ((JSBNG__event.which != 1))))))) {\n            return;\n        }\n    ;\n    ;\n        var s = l.concat(m);\n        for (var t = 0, u = s.length; ((t < u)); t++) {\n            if (((s[t](r, JSBNG__event) === false))) {\n                return JSBNG__event.prevent();\n            }\n        ;\n        ;\n        };\n    ;\n    };\n;\n    function p(r) {\n        var s = r.match(/^(\\w+):/);\n        return ((!s || s[1].match(/^http/i)));\n    };\n;\n    var q = {\n        registerHandler: function(r) {\n            l.push(r);\n        },\n        registerFallbackHandler: function(r) {\n            m.push(r);\n        }\n    };\n    g.listen(JSBNG__document.documentElement, \"mousedown\", n);\n    g.listen(JSBNG__document.documentElement, \"keydown\", n);\n    e.exports = q;\n});\n__d(\"MenuDeprecated\", [\"JSBNG__Event\",\"Arbiter\",\"CSS\",\"DataStore\",\"DOM\",\"HTML\",\"Keys\",\"Parent\",\"Style\",\"UserAgent\",\"copyProperties\",\"emptyFunction\",\"Run\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"Arbiter\"), i = b(\"CSS\"), j = b(\"DataStore\"), k = b(\"DOM\"), l = b(\"HTML\"), m = b(\"Keys\"), n = b(\"Parent\"), o = b(\"Style\"), p = b(\"UserAgent\"), q = b(\"copyProperties\"), r = b(\"emptyFunction\"), s = \"menu:mouseover\", t = null;\n    function u(ea) {\n        if (i.hasClass(ea, \"uiMenuContainer\")) {\n            return ea;\n        }\n    ;\n    ;\n        return n.byClass(ea, \"uiMenu\");\n    };\n;\n    function v(ea) {\n        return n.byClass(ea, \"uiMenuItem\");\n    };\n;\n    function w(ea) {\n        if (JSBNG__document.activeElement) {\n            var fa = v(JSBNG__document.activeElement);\n            return ea.indexOf(fa);\n        }\n    ;\n    ;\n        return -1;\n    };\n;\n    function x(ea) {\n        return k.JSBNG__find(ea, \"a.itemAnchor\");\n    };\n;\n    function y(ea) {\n        return i.hasClass(ea, \"checked\");\n    };\n;\n    function z(ea) {\n        return ((!i.hasClass(ea, \"disabled\") && ((o.get(ea, \"display\") !== \"none\"))));\n    };\n;\n    function aa(JSBNG__event) {\n        var ea = JSBNG__document.activeElement;\n        if (((((!ea || !n.byClass(ea, \"uiMenu\"))) || !k.isInputNode(ea)))) {\n            var fa = v(JSBNG__event.getTarget());\n            ((fa && da.focusItem(fa)));\n        }\n    ;\n    ;\n    };\n;\n    function ba(ea) {\n        ((p.firefox() && x(ea).JSBNG__blur()));\n        da.inform(\"select\", {\n            menu: u(ea),\n            item: ea\n        });\n    };\n;\n    var ca = function() {\n        ca = r;\n        var ea = {\n        };\n        ea.click = function(JSBNG__event) {\n            var fa = v(JSBNG__event.getTarget());\n            if (((fa && z(fa)))) {\n                ba(fa);\n                var ga = x(fa), ha = ga.href, ia = ga.getAttribute(\"rel\");\n                return ((((ia && ((ia !== \"ignore\")))) || ((ha && ((ha.charAt(((ha.length - 1))) !== \"#\"))))));\n            }\n        ;\n        ;\n        };\n        ea.keydown = function(JSBNG__event) {\n            var fa = JSBNG__event.getTarget();\n            if (JSBNG__event.getModifiers().any) {\n                return;\n            }\n        ;\n        ;\n            if (((!t || k.isInputNode(fa)))) {\n                return;\n            }\n        ;\n        ;\n            var ga = g.getKeyCode(JSBNG__event), ha;\n            switch (ga) {\n              case m.UP:\n            \n              case m.DOWN:\n                var ia = da.getEnabledItems(t);\n                ha = w(ia);\n                da.focusItem(ia[((ha + ((((ga === m.UP)) ? -1 : 1))))]);\n                return false;\n              case m.SPACE:\n                var ja = v(fa);\n                if (ja) {\n                    ba(ja);\n                    JSBNG__event.prevent();\n                }\n            ;\n            ;\n                break;\n              default:\n                var ka = String.fromCharCode(ga).toLowerCase(), la = da.getEnabledItems(t);\n                ha = w(la);\n                var ma = ha, na = la.length;\n                while (((((~ha && (((ma = ((++ma % na))) !== ha)))) || ((!~ha && ((++ma < na))))))) {\n                    var oa = da.getItemLabel(la[ma]);\n                    if (((oa && ((oa.charAt(0).toLowerCase() === ka))))) {\n                        da.focusItem(la[ma]);\n                        return false;\n                    }\n                ;\n                ;\n                };\n            ;\n            };\n        ;\n        };\n        g.listen(JSBNG__document.body, ea);\n    }, da = q(new h(), {\n        focusItem: function(ea) {\n            if (((ea && z(ea)))) {\n                this._removeSelected(u(ea));\n                i.addClass(ea, \"selected\");\n                x(ea).JSBNG__focus();\n            }\n        ;\n        ;\n        },\n        getEnabledItems: function(ea) {\n            return da.getItems(ea).filter(z);\n        },\n        getCheckedItems: function(ea) {\n            return da.getItems(ea).filter(y);\n        },\n        getItems: function(ea) {\n            return k.scry(ea, \"li.uiMenuItem\");\n        },\n        getItemLabel: function(ea) {\n            return ((ea.getAttribute(\"data-label\", 2) || \"\"));\n        },\n        isItemChecked: function(ea) {\n            return i.hasClass(ea, \"checked\");\n        },\n        autoregister: function(ea, fa, ga) {\n            ea.subscribe(\"show\", function() {\n                da.register(fa, ga);\n            });\n            ea.subscribe(\"hide\", function() {\n                da.unregister(fa);\n            });\n        },\n        register: function(ea, fa) {\n            ea = u(ea);\n            ca();\n            if (!j.get(ea, s)) {\n                j.set(ea, s, g.listen(ea, \"mouseover\", aa));\n            }\n        ;\n        ;\n            if (((fa !== false))) {\n                t = ea;\n            }\n        ;\n        ;\n        },\n        setItemEnabled: function(ea, fa) {\n            if (((!fa && !k.scry(ea, \"span.disabledAnchor\")[0]))) {\n                k.appendContent(ea, k.create(\"span\", {\n                    className: ((k.JSBNG__find(ea, \"a\").className + \" disabledAnchor\"))\n                }, l(x(ea).innerHTML)));\n            }\n        ;\n        ;\n            i.conditionClass(ea, \"disabled\", !fa);\n        },\n        toggleItem: function(ea) {\n            var fa = !da.isItemChecked(ea);\n            da.setItemChecked(ea, fa);\n        },\n        setItemChecked: function(ea, fa) {\n            i.conditionClass(ea, \"checked\", fa);\n            x(ea).setAttribute(\"aria-checked\", fa);\n        },\n        unregister: function(ea) {\n            ea = u(ea);\n            var fa = j.remove(ea, s);\n            ((fa && fa.remove()));\n            t = null;\n            this._removeSelected(ea);\n        },\n        _removeSelected: function(ea) {\n            da.getItems(ea).filter(function(fa) {\n                return i.hasClass(fa, \"selected\");\n            }).forEach(function(fa) {\n                i.removeClass(fa, \"selected\");\n            });\n        }\n    });\n    e.exports = da;\n});\n__d(\"coalesce\", [], function(a, b, c, d, e, f) {\n    function g() {\n        for (var h = 0; ((h < arguments.length)); ++h) {\n            if (((arguments[h] != null))) {\n                return arguments[h];\n            }\n        ;\n        ;\n        };\n    ;\n        return null;\n    };\n;\n    e.exports = g;\n});\n__d(\"OnVisible\", [\"Arbiter\",\"DOM\",\"JSBNG__Event\",\"Parent\",\"Run\",\"Vector\",\"ViewportBounds\",\"coalesce\",\"copyProperties\",\"queryThenMutateDOM\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"DOM\"), i = b(\"JSBNG__Event\"), j = b(\"Parent\"), k = b(\"Run\"), l = b(\"Vector\"), m = b(\"ViewportBounds\"), n = b(\"coalesce\"), o = b(\"copyProperties\"), p = b(\"queryThenMutateDOM\"), q = [], r, s = 0, t = [], u, v, w, x, y;\n    function z() {\n        q.forEach(function(fa) {\n            fa.remove();\n        });\n        if (v) {\n            v.remove();\n            u.remove();\n            r.unsubscribe();\n            v = u = r = null;\n        }\n    ;\n    ;\n        s = 0;\n        q.length = 0;\n    };\n;\n    function aa() {\n        if (!q.length) {\n            z();\n            return;\n        }\n    ;\n    ;\n        t.length = 0;\n        w = l.getScrollPosition().y;\n        x = l.getViewportDimensions().y;\n        y = m.getTop();\n        for (var fa = 0; ((fa < q.length)); ++fa) {\n            var ga = q[fa];\n            if (isNaN(ga.elementHeight)) {\n                t.push(fa);\n            }\n        ;\n        ;\n            ga.elementHeight = l.getElementDimensions(ga.element).y;\n            ga.elementPos = l.getElementPosition(ga.element);\n            ga.hidden = j.byClass(ga.element, \"hidden_elem\");\n            if (ga.scrollArea) {\n                ga.scrollAreaHeight = l.getElementDimensions(ga.scrollArea).y;\n                ga.scrollAreaY = l.getElementPosition(ga.scrollArea).y;\n            }\n        ;\n        ;\n        };\n    ;\n        s = fa;\n    };\n;\n    function ba() {\n        for (var fa = ((Math.min(q.length, s) - 1)); ((fa >= 0)); --fa) {\n            var ga = q[fa];\n            if (((((!ga.elementPos || ga.removed)) || ga.hidden))) {\n                q.splice(fa, 1);\n                continue;\n            }\n        ;\n        ;\n            var ha = ((((w + x)) + ga.buffer)), ia = false;\n            if (((ha > ga.elementPos.y))) {\n                var ja = ((!ga.strict || ((((((w + y)) - ga.buffer)) < ((ga.elementPos.y + ga.elementHeight))))));\n                ia = ja;\n                if (((ia && ga.scrollArea))) {\n                    var ka = ((((ga.scrollAreaY + ga.scrollAreaHeight)) + ga.buffer));\n                    ia = ((((ga.elementPos.y > ((ga.scrollAreaY - ga.buffer)))) && ((ga.elementPos.y < ka))));\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            if (((ga.inverse ? !ia : ia))) {\n                ga.remove();\n                ga.handler(((t.indexOf(fa) !== -1)));\n            }\n        ;\n        ;\n        };\n    ;\n    };\n;\n    function ca() {\n        da();\n        if (q.length) {\n            return;\n        }\n    ;\n    ;\n        v = i.listen(window, \"JSBNG__scroll\", da);\n        u = i.listen(window, \"resize\", da);\n        r = g.subscribe(\"dom-scroll\", da);\n    };\n;\n    function da() {\n        p(aa, ba, \"OnVisible/positionCheck\");\n    };\n;\n    function ea(fa, ga, ha, ia, ja, ka) {\n        this.element = fa;\n        this.handler = ga;\n        this.strict = ha;\n        this.buffer = n(ia, 300);\n        this.inverse = n(ja, false);\n        this.scrollArea = ((ka || null));\n        if (this.scrollArea) {\n            this.scrollAreaListener = i.listen(h.JSBNG__find(ka, \".uiScrollableAreaWrap\"), \"JSBNG__scroll\", this.checkBuffer);\n        }\n    ;\n    ;\n        if (((q.length === 0))) {\n            k.onLeave(z);\n        }\n    ;\n    ;\n        ca();\n        q.push(this);\n    };\n;\n    o(ea, {\n        checkBuffer: da\n    });\n    o(ea.prototype, {\n        remove: function() {\n            this.removed = true;\n            if (this.scrollAreaListener) {\n                this.scrollAreaListener.remove();\n            }\n        ;\n        ;\n        },\n        reset: function() {\n            this.elementHeight = null;\n            this.removed = false;\n            ((((q.indexOf(this) === -1)) && q.push(this)));\n            ca();\n        },\n        setBuffer: function(fa) {\n            this.buffer = fa;\n            da();\n        },\n        checkBuffer: function() {\n            da();\n        }\n    });\n    e.exports = ea;\n});\n__d(\"OnloadHooks\", [\"Arbiter\",\"ErrorUtils\",\"InitialJSLoader\",\"OnloadEvent\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ErrorUtils\"), i = b(\"InitialJSLoader\"), j = b(\"OnloadEvent\");\n    function k() {\n        var r = a.CavalryLogger;\n        if (((!window.loaded && r))) {\n            r.getInstance().setTimeStamp(\"t_prehooks\");\n        }\n    ;\n    ;\n        n(\"onloadhooks\");\n        if (((!window.loaded && r))) {\n            r.getInstance().setTimeStamp(\"t_hooks\");\n        }\n    ;\n    ;\n        window.loaded = true;\n        g.inform(\"uipage_onload\", true, g.BEHAVIOR_STATE);\n    };\n;\n    function l() {\n        n(\"onafterloadhooks\");\n        window.afterloaded = true;\n    };\n;\n    function m(r, s) {\n        return h.applyWithGuard(r, null, null, function(t) {\n            t.event_type = s;\n            t.category = \"runhook\";\n        });\n    };\n;\n    function n(r) {\n        var s = ((((r == \"onbeforeleavehooks\")) || ((r == \"onbeforeunloadhooks\"))));\n        do {\n            var t = window[r];\n            if (!t) {\n                break;\n            }\n        ;\n        ;\n            if (!s) {\n                window[r] = null;\n            }\n        ;\n        ;\n            for (var u = 0; ((u < t.length)); u++) {\n                var v = m(t[u], r);\n                if (((s && v))) {\n                    return v;\n                }\n            ;\n            ;\n            };\n        ;\n        } while (((!s && window[r])));\n    };\n;\n    function o() {\n        if (!window.loaded) {\n            window.loaded = true;\n            n(\"onloadhooks\");\n        }\n    ;\n    ;\n        if (!window.afterloaded) {\n            window.afterloaded = true;\n            n(\"onafterloadhooks\");\n        }\n    ;\n    ;\n    };\n;\n    function p() {\n        g.registerCallback(k, [j.ONLOAD_DOMCONTENT_CALLBACK,i.INITIAL_JS_READY,]);\n        g.registerCallback(l, [j.ONLOAD_DOMCONTENT_CALLBACK,j.ONLOAD_CALLBACK,i.INITIAL_JS_READY,]);\n        g.subscribe(j.ONBEFOREUNLOAD, function(r, s) {\n            s.warn = ((n(\"onbeforeleavehooks\") || n(\"onbeforeunloadhooks\")));\n            if (!s.warn) {\n                window.loaded = false;\n                window.afterloaded = false;\n            }\n        ;\n        ;\n        }, g.SUBSCRIBE_NEW);\n        g.subscribe(j.ONUNLOAD, function(r, s) {\n            n(\"onunloadhooks\");\n            n(\"onafterunloadhooks\");\n        }, g.SUBSCRIBE_NEW);\n    };\n;\n    var q = {\n        _onloadHook: k,\n        _onafterloadHook: l,\n        runHook: m,\n        runHooks: n,\n        keepWindowSetAsLoaded: o\n    };\n    p();\n    a.OnloadHooks = e.exports = q;\n});\n__d(\"areEqual\", [], function(a, b, c, d, e, f) {\n    var g = function(k, l, m, n) {\n        if (((k === l))) {\n            return ((((k !== 0)) || ((((1 / k)) == ((1 / l))))));\n        }\n    ;\n    ;\n        if (((((k == null)) || ((l == null))))) {\n            return false;\n        }\n    ;\n    ;\n        if (((((typeof k != \"object\")) || ((typeof l != \"object\"))))) {\n            return false;\n        }\n    ;\n    ;\n        var o = Object.prototype.toString, p = o.call(k);\n        if (((p != o.call(l)))) {\n            return false;\n        }\n    ;\n    ;\n        switch (p) {\n          case \"[object String]\":\n            return ((k == String(l)));\n          case \"[object Number]\":\n            return ((((isNaN(k) || isNaN(l))) ? false : ((k == Number(l)))));\n          case \"[object Date]\":\n        \n          case \"[object Boolean]\":\n            return ((+k == +l));\n          case \"[object RegExp]\":\n            return ((((((((k.source == l.source)) && ((k.global == l.global)))) && ((k.multiline == l.multiline)))) && ((k.ignoreCase == l.ignoreCase))));\n        };\n    ;\n        var q = m.length;\n        while (q--) {\n            if (((m[q] == k))) {\n                return ((n[q] == l));\n            }\n        ;\n        ;\n        };\n    ;\n        m.push(k);\n        n.push(l);\n        var r = 0;\n        if (((p === \"[object Array]\"))) {\n            r = k.length;\n            if (((r !== l.length))) {\n                return false;\n            }\n        ;\n        ;\n            while (r--) {\n                if (!g(k[r], l[r], m, n)) {\n                    return false;\n                }\n            ;\n            ;\n            };\n        ;\n        }\n         else {\n            if (((k.constructor !== l.constructor))) {\n                return false;\n            }\n        ;\n        ;\n            if (((k.hasOwnProperty(\"valueOf\") && l.hasOwnProperty(\"valueOf\")))) {\n                return ((k.valueOf() == l.valueOf()));\n            }\n        ;\n        ;\n            var s = Object.keys(k);\n            if (((s.length != Object.keys(l).length))) {\n                return false;\n            }\n        ;\n        ;\n            for (var t = 0; ((t < s.length)); t++) {\n                if (!g(k[s[t]], l[s[t]], m, n)) {\n                    return false;\n                }\n            ;\n            ;\n            };\n        ;\n        }\n    ;\n    ;\n        m.pop();\n        n.pop();\n        return true;\n    }, h = [], i = [], j = function(k, l) {\n        var m = ((h.length ? h.pop() : [])), n = ((i.length ? i.pop() : [])), o = g(k, l, m, n);\n        m.length = 0;\n        n.length = 0;\n        h.push(m);\n        i.push(n);\n        return o;\n    };\n    e.exports = j;\n});\n__d(\"computeRelativeURI\", [\"URI\",\"isEmpty\",], function(a, b, c, d, e, f) {\n    var g = b(\"URI\"), h = b(\"isEmpty\");\n    function i(k, l) {\n        if (!l) {\n            return k;\n        }\n    ;\n    ;\n        if (((l.charAt(0) == \"/\"))) {\n            return l;\n        }\n    ;\n    ;\n        var m = k.split(\"/\").slice(0, -1);\n        ((m[0] !== \"\"));\n        l.split(\"/\").forEach(function(n) {\n            if (!((n == \".\"))) {\n                if (((n == \"..\"))) {\n                    if (((m.length > 1))) {\n                        m = m.slice(0, -1);\n                    }\n                ;\n                ;\n                }\n                 else m.push(n);\n            ;\n            }\n        ;\n        ;\n        });\n        return m.join(\"/\");\n    };\n;\n    function j(k, l) {\n        var m = new g(), n = l;\n        k = new g(k);\n        l = new g(l);\n        if (((l.getDomain() && !l.isFacebookURI()))) {\n            return n;\n        }\n    ;\n    ;\n        var o = k, p = [\"Protocol\",\"Domain\",\"Port\",\"Path\",\"QueryData\",\"Fragment\",];\n        p.forEach(function(q) {\n            var r = ((((q == \"Path\")) && ((o === k))));\n            if (r) {\n                m.setPath(i(k.getPath(), l.getPath()));\n            }\n        ;\n        ;\n            if (!h(l[((\"get\" + q))]())) {\n                o = l;\n            }\n        ;\n        ;\n            if (!r) {\n                m[((\"set\" + q))](o[((\"get\" + q))]());\n            }\n        ;\n        ;\n        });\n        return m;\n    };\n;\n    e.exports = j;\n});\n__d(\"escapeJSQuotes\", [], function(a, b, c, d, e, f) {\n    function g(h) {\n        if (((((((typeof h == \"undefined\")) || ((h == null)))) || !h.valueOf()))) {\n            return \"\";\n        }\n    ;\n    ;\n        return h.toString().replace(/\\\\/g, \"\\\\\\\\\").replace(/\\n/g, \"\\\\n\").replace(/\\r/g, \"\\\\r\").replace(/\"/g, \"\\\\x22\").replace(/'/g, \"\\\\'\").replace(/</g, \"\\\\x3c\").replace(/>/g, \"\\\\x3e\").replace(/&/g, \"\\\\x26\");\n    };\n;\n    e.exports = g;\n});\n__d(\"PageTransitions\", [\"Arbiter\",\"Dialog\",\"DOMQuery\",\"DOMScroll\",\"Env\",\"JSBNG__Event\",\"Form\",\"HistoryManager\",\"JSLogger\",\"LinkController\",\"OnloadHooks\",\"Parent\",\"URI\",\"UserAgent\",\"Vector\",\"areEqual\",\"clickRefAction\",\"computeRelativeURI\",\"copyProperties\",\"escapeJSQuotes\",\"ge\",\"goOrReplace\",\"htmlize\",\"setTimeoutAcrossTransitions\",\"startsWith\",\"tx\",\"userAction\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"Dialog\"), i = b(\"DOMQuery\"), j = b(\"DOMScroll\"), k = b(\"Env\"), l = b(\"JSBNG__Event\"), m = b(\"Form\"), n = b(\"HistoryManager\"), o = b(\"JSLogger\"), p = b(\"LinkController\"), q = b(\"OnloadHooks\"), r = b(\"Parent\"), s = b(\"URI\"), t = b(\"UserAgent\"), u = b(\"Vector\"), v = b(\"areEqual\"), w = b(\"clickRefAction\"), x = b(\"computeRelativeURI\"), y = b(\"copyProperties\"), z = b(\"escapeJSQuotes\"), aa = b(\"ge\"), ba = b(\"goOrReplace\"), ca = b(\"htmlize\"), da = b(\"setTimeoutAcrossTransitions\"), ea = b(\"startsWith\"), fa = b(\"tx\"), ga = b(\"userAction\"), ha = {\n    };\n    function ia(ta, ua) {\n        ha[ta.getUnqualifiedURI()] = ua;\n    };\n;\n    function ja(ta) {\n        return ha[ta.getUnqualifiedURI()];\n    };\n;\n    function ka(ta) {\n        delete ha[ta.getUnqualifiedURI()];\n    };\n;\n    var la = null, ma = null;\n    function na(ta) {\n        ma = ta;\n        da(function() {\n            ma = null;\n        }, 0);\n    };\n;\n    function oa(JSBNG__event) {\n        if (ma) {\n            if (!JSBNG__event.isDefaultPrevented()) {\n                pa(ma);\n                sa.lookBusy(ma);\n                ra.go(ma.getAttribute(\"href\"));\n            }\n        ;\n        ;\n            JSBNG__event.prevent();\n        }\n         else {\n            la = JSBNG__event.getTarget();\n            da(function() {\n                la = null;\n            }, 0);\n        }\n    ;\n    ;\n    };\n;\n    function pa(ta) {\n        var ua = ta.getAttribute(\"href\"), va = x(ra._most_recent_uri.getQualifiedURI(), ua).toString();\n        if (((ua != va))) {\n            ta.setAttribute(\"href\", va);\n        }\n    ;\n    ;\n    };\n;\n    function qa(JSBNG__event) {\n        var ta = JSBNG__event.getTarget();\n        if (((m.getAttribute(ta, \"rel\") || m.getAttribute(ta, \"target\")))) {\n            return;\n        }\n    ;\n    ;\n        w(\"form\", ta, JSBNG__event).set_namespace(\"page_transition\");\n        var ua = ga(\"page_transitions\", ta, JSBNG__event, {\n            mode: \"DEDUP\"\n        }).uai_fallback(null, \"form\"), va = a.ArbiterMonitor;\n        if (va) {\n            va.initUA(ua, [ta,]);\n        }\n    ;\n    ;\n        var wa = new s(((m.getAttribute(ta, \"action\") || \"\"))), xa = x(ra._most_recent_uri, wa);\n        ta.setAttribute(\"action\", xa.toString());\n        if (((((m.getAttribute(ta, \"method\") || \"GET\")).toUpperCase() === \"GET\"))) {\n            var ya = m.serialize(ta), za = la;\n            if (((((za && ((((i.isNodeOfType(za, \"input\") && ((za.type === \"submit\")))) || (za = r.byTag(za, \"button\")))))) && za.JSBNG__name))) {\n                ya[za.JSBNG__name] = za.value;\n            }\n        ;\n        ;\n            ra.go(xa.addQueryData(ya));\n            JSBNG__event.kill();\n        }\n    ;\n    ;\n    };\n;\n    var ra = {\n        _transition_handlers: [],\n        _scroll_locked: false,\n        isInitialized: function() {\n            return !!ra._initialized;\n        },\n        _init: function() {\n            if (k.DISABLE_PAGE_TRANSITIONS) {\n                return;\n            }\n        ;\n        ;\n            if (((!k.ALLOW_TRANSITION_IN_IFRAME && ((window != window.JSBNG__top))))) {\n                return;\n            }\n        ;\n        ;\n            if (ra._initialized) {\n                return ra;\n            }\n        ;\n        ;\n            ra._initialized = true;\n            var ta = s.getRequestURI(false), ua = ta.getUnqualifiedURI(), va = s(ua).setFragment(null), wa = ua.getFragment();\n            if (((((wa.charAt(0) === \"!\")) && ((va.toString() === wa.substr(1)))))) {\n                ua = va;\n            }\n        ;\n        ;\n            y(ra, {\n                _current_uri: ua,\n                _most_recent_uri: ua,\n                _next_uri: ua\n            });\n            var xa;\n            if (ea(ta.getFragment(), \"/\")) {\n                xa = ta.getFragment();\n            }\n             else xa = ua;\n        ;\n        ;\n            n.init().setCanonicalLocation(((\"#\" + xa))).registerURIHandler(ra._historyManagerHandler);\n            p.registerFallbackHandler(na);\n            l.listen(JSBNG__document, \"click\", oa, l.Priority._BUBBLE);\n            l.listen(JSBNG__document, \"submit\", qa, l.Priority._BUBBLE);\n            l.listen(window, \"JSBNG__scroll\", function() {\n                if (!ra._scroll_locked) {\n                    ia(ra._current_uri, u.getScrollPosition());\n                }\n            ;\n            ;\n            });\n            return ra;\n        },\n        registerHandler: function(ta, ua) {\n            ra._init();\n            ua = ((ua || 5));\n            if (!ra._transition_handlers[ua]) {\n                ra._transition_handlers[ua] = [];\n            }\n        ;\n        ;\n            ra._transition_handlers[ua].push(ta);\n        },\n        getCurrentURI: function(ta) {\n            if (((!ra._current_uri && !ta))) {\n                return new s(ra._most_recent_uri);\n            }\n        ;\n        ;\n            return new s(ra._current_uri);\n        },\n        getMostRecentURI: function() {\n            return new s(ra._most_recent_uri);\n        },\n        getNextURI: function() {\n            return new s(ra._next_uri);\n        },\n        go: function(ta, ua) {\n            var va = new s(ta).removeQueryData(\"quickling\").getQualifiedURI();\n            o.create(\"pagetransition\").debug(\"go\", {\n                uri: va.toString()\n            });\n            ka(va);\n            ((!ua && w(\"uri\", {\n                href: va.toString()\n            }, null, \"INDIRECT\")));\n            sa.lookBusy();\n            ra._loadPage(va, function(wa) {\n                if (wa) {\n                    n.go(va.toString(), false, ua);\n                }\n                 else ba(window.JSBNG__location, va, ua);\n            ;\n            ;\n            });\n        },\n        _historyManagerHandler: function(ta) {\n            if (((ta.charAt(0) != \"/\"))) {\n                return false;\n            }\n        ;\n        ;\n            w(\"h\", {\n                href: ta\n            });\n            ga(\"page_transitions\").uai(null, \"history_manager\");\n            ra._loadPage(new s(ta), function(ua) {\n                if (!ua) {\n                    ba(window.JSBNG__location, ta, true);\n                }\n            ;\n            ;\n            });\n            return true;\n        },\n        _loadPage: function(ta, ua) {\n            if (((s(ta).getFragment() && v(s(ta).setFragment(null).getQualifiedURI(), s(ra._current_uri).setFragment(null).getQualifiedURI())))) {\n                if (ra.restoreScrollPosition(ta)) {\n                    ra._current_uri = ra._most_recent_uri = ta;\n                    sa.stopLookingBusy();\n                    return;\n                }\n            ;\n            }\n        ;\n        ;\n            var va;\n            if (ra._current_uri) {\n                va = ja(ra._current_uri);\n            }\n        ;\n        ;\n            ra._current_uri = null;\n            ra._next_uri = ta;\n            if (va) {\n                j.JSBNG__scrollTo(va, false);\n            }\n        ;\n        ;\n            var wa = function() {\n                ra._scroll_locked = true;\n                var ya = ra._handleTransition(ta);\n                ((ua && ua(ya)));\n            }, xa = q.runHooks(\"onbeforeleavehooks\");\n            if (xa) {\n                sa.stopLookingBusy();\n                ra._warnBeforeLeaving(xa, wa);\n            }\n             else wa();\n        ;\n        ;\n        },\n        _handleTransition: function(ta) {\n            window.onbeforeleavehooks = undefined;\n            sa.lookBusy();\n            if (!ta.isSameOrigin()) {\n                return false;\n            }\n        ;\n        ;\n            var ua = ((window.AsyncRequest && window.AsyncRequest.getLastID()));\n            g.inform(\"pre_page_transition\", {\n                from: ra.getMostRecentURI(),\n                to: ta\n            });\n            for (var va = ((ra._transition_handlers.length - 1)); ((va >= 0)); --va) {\n                var wa = ra._transition_handlers[va];\n                if (!wa) {\n                    continue;\n                }\n            ;\n            ;\n                for (var xa = ((wa.length - 1)); ((xa >= 0)); --xa) {\n                    if (((wa[xa](ta) === true))) {\n                        var ya = {\n                            sender: this,\n                            uri: ta,\n                            id: ua\n                        };\n                        try {\n                            g.inform(\"page_transition\", ya);\n                        } catch (za) {\n                        \n                        };\n                    ;\n                        return true;\n                    }\n                     else wa.splice(xa, 1);\n                ;\n                ;\n                };\n            ;\n            };\n        ;\n            return false;\n        },\n        unifyURI: function() {\n            ra._current_uri = ra._most_recent_uri = ra._next_uri;\n        },\n        transitionComplete: function(ta) {\n            ra._executeCompletionCallback();\n            sa.stopLookingBusy();\n            ra.unifyURI();\n            if (!ta) {\n                ra.restoreScrollPosition(ra._current_uri);\n            }\n        ;\n        ;\n            try {\n                if (((JSBNG__document.activeElement && ((JSBNG__document.activeElement.nodeName === \"A\"))))) {\n                    JSBNG__document.activeElement.JSBNG__blur();\n                }\n            ;\n            ;\n            } catch (ua) {\n            \n            };\n        ;\n        },\n        _executeCompletionCallback: function() {\n            if (ra._completionCallback) {\n                ra._completionCallback();\n            }\n        ;\n        ;\n            ra._completionCallback = null;\n        },\n        setCompletionCallback: function(ta) {\n            ra._completionCallback = ta;\n        },\n        rewriteCurrentURI: function(ta, ua) {\n            ra.registerHandler(function() {\n                if (((ta == ra.getMostRecentURI().getUnqualifiedURI().toString()))) {\n                    ra.transitionComplete();\n                    return true;\n                }\n            ;\n            ;\n            });\n            ra.go(ua, true);\n        },\n        _warnBeforeLeaving: function(ta, ua) {\n            new h().setTitle(\"Are you sure you want to leave this page?\").setBody(ca(ta)).setButtons([{\n                JSBNG__name: \"leave_page\",\n                label: \"Leave this Page\",\n                handler: ua\n            },{\n                JSBNG__name: \"continue_editing\",\n                label: \"Stay on this Page\",\n                className: \"inputaux\"\n            },]).setModal(true).show();\n        },\n        restoreScrollPosition: function(ta) {\n            ra._scroll_locked = false;\n            var ua = ja(ta);\n            if (ua) {\n                j.JSBNG__scrollTo(ua, false);\n                return true;\n            }\n        ;\n        ;\n            function va(ya) {\n                if (!ya) {\n                    return null;\n                }\n            ;\n            ;\n                var za = ((((\"a[name='\" + z(ya))) + \"']\"));\n                return ((i.scry(JSBNG__document.body, za)[0] || aa(ya)));\n            };\n        ;\n            var wa = va(s(ta).getFragment());\n            if (wa) {\n                var xa = u.getElementPosition(wa);\n                xa.x = 0;\n                j.JSBNG__scrollTo(xa);\n                return true;\n            }\n        ;\n        ;\n            return false;\n        }\n    }, sa = ((window._BusyUIManager || {\n        _looking_busy: false,\n        _original_cursors: [],\n        lookBusy: function(ta) {\n            if (ta) {\n                sa._giveProgressCursor(ta);\n            }\n        ;\n        ;\n            if (sa._looking_busy) {\n                return;\n            }\n        ;\n        ;\n            sa._looking_busy = true;\n            sa._giveProgressCursor(JSBNG__document.documentElement);\n        },\n        stopLookingBusy: function() {\n            if (!sa._looking_busy) {\n                return;\n            }\n        ;\n        ;\n            sa._looking_busy = false;\n            while (sa._original_cursors.length) {\n                var ta = sa._original_cursors.pop(), ua = ta[0], va = ta[1];\n                if (ua.style) {\n                    ua.style.cursor = ((va || \"\"));\n                }\n            ;\n            ;\n            };\n        ;\n        },\n        _giveProgressCursor: function(ta) {\n            if (!t.webkit()) {\n                sa._original_cursors.push([ta,ta.style.cursor,]);\n                ta.style.cursor = \"progress\";\n            }\n        ;\n        ;\n        }\n    }));\n    e.exports = ra;\n    a.PageTransitions = ra;\n});\n__d(\"PixelRatio\", [\"Arbiter\",\"Cookie\",\"Run\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"Cookie\"), i = b(\"Run\"), j = \"dpr\", k, l;\n    function m() {\n        return ((window.JSBNG__devicePixelRatio || 1));\n    };\n;\n    function n() {\n        h.set(j, m());\n    };\n;\n    function o() {\n        h.clear(j);\n    };\n;\n    function p() {\n        var r = m();\n        if (((r !== k))) {\n            n();\n        }\n         else o();\n    ;\n    ;\n    };\n;\n    var q = {\n        startDetecting: function(r) {\n            k = ((r || 1));\n            o();\n            if (l) {\n                return;\n            }\n        ;\n        ;\n            l = [g.subscribe(\"pre_page_transition\", p),];\n            i.onBeforeUnload(p);\n        }\n    };\n    e.exports = q;\n});\n__d(\"LayerHideOnTransition\", [\"function-extensions\",\"PageTransitions\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    b(\"function-extensions\");\n    var g = b(\"PageTransitions\"), h = b(\"copyProperties\");\n    function i(j) {\n        this._layer = j;\n    };\n;\n    h(i.prototype, {\n        _enabled: false,\n        _subscribed: false,\n        enable: function() {\n            this._enabled = true;\n            if (!this._subscribed) {\n                this._subscribe.bind(this).defer();\n                this._subscribed = true;\n            }\n        ;\n        ;\n        },\n        disable: function() {\n            this._enabled = false;\n        },\n        _subscribe: function() {\n            g.registerHandler(function() {\n                if (this._enabled) {\n                    this._layer.hide();\n                }\n            ;\n            ;\n                this._subscribed = false;\n            }.bind(this));\n        }\n    });\n    e.exports = i;\n});\n__d(\"JSBNG__Rect\", [\"Vector\",\"$\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Vector\"), h = b(\"$\"), i = b(\"copyProperties\");\n    function j(k, l, m, n, o) {\n        if (((arguments.length === 1))) {\n            if (((k instanceof j))) {\n                return k;\n            }\n        ;\n        ;\n            if (((k instanceof g))) {\n                return new j(k.y, k.x, k.y, k.x, k.domain);\n            }\n        ;\n        ;\n            return j.getElementBounds(h(k));\n        }\n    ;\n    ;\n        i(this, {\n            t: k,\n            r: l,\n            b: m,\n            l: n,\n            domain: ((o || \"pure\"))\n        });\n    };\n;\n    i(j.prototype, {\n        w: function() {\n            return ((this.r - this.l));\n        },\n        h: function() {\n            return ((this.b - this.t));\n        },\n        toString: function() {\n            return ((((((((((((((((\"((\" + this.l)) + \", \")) + this.t)) + \"), (\")) + this.r)) + \", \")) + this.b)) + \"))\"));\n        },\n        contains: function(k) {\n            k = new j(k).convertTo(this.domain);\n            var l = this;\n            return ((((((((l.l <= k.l)) && ((l.r >= k.r)))) && ((l.t <= k.t)))) && ((l.b >= k.b))));\n        },\n        add: function(k, l) {\n            if (((arguments.length == 1))) {\n                if (((k.domain != \"pure\"))) {\n                    k = k.convertTo(this.domain);\n                }\n            ;\n            ;\n                return this.add(k.x, k.y);\n            }\n        ;\n        ;\n            var m = parseFloat(k), n = parseFloat(l);\n            return new j(((this.t + n)), ((this.r + m)), ((this.b + n)), ((this.l + m)), this.domain);\n        },\n        sub: function(k, l) {\n            if (((arguments.length == 1))) {\n                return this.add(k.mul(-1));\n            }\n             else return this.add(-k, -l)\n        ;\n        },\n        rotateAroundOrigin: function(k) {\n            var l = this.getCenter().rotate(((((k * Math.PI)) / 2))), m, n;\n            if (((k % 2))) {\n                m = this.h();\n                n = this.w();\n            }\n             else {\n                m = this.w();\n                n = this.h();\n            }\n        ;\n        ;\n            var o = ((l.y - ((n / 2)))), p = ((l.x - ((m / 2)))), q = ((o + n)), r = ((p + m));\n            return new j(o, r, q, p);\n        },\n        boundWithin: function(k) {\n            var l = 0, m = 0;\n            if (((this.l < k.l))) {\n                l = ((k.l - this.l));\n            }\n             else if (((this.r > k.r))) {\n                l = ((k.r - this.r));\n            }\n            \n        ;\n        ;\n            if (((this.t < k.t))) {\n                m = ((k.t - this.t));\n            }\n             else if (((this.b > k.b))) {\n                m = ((k.b - this.b));\n            }\n            \n        ;\n        ;\n            return this.add(l, m);\n        },\n        getCenter: function() {\n            return new g(((this.l + ((this.w() / 2)))), ((this.t + ((this.h() / 2)))), this.domain);\n        },\n        getPositionVector: function() {\n            return new g(this.l, this.t, this.domain);\n        },\n        getDimensionVector: function() {\n            return new g(this.w(), this.h(), \"pure\");\n        },\n        convertTo: function(k) {\n            if (((this.domain == k))) {\n                return this;\n            }\n        ;\n        ;\n            if (((k == \"pure\"))) {\n                return new j(this.t, this.r, this.b, this.l, \"pure\");\n            }\n        ;\n        ;\n            if (((this.domain == \"pure\"))) {\n                return new j(0, 0, 0, 0);\n            }\n        ;\n        ;\n            var l = new g(this.l, this.t, this.domain).convertTo(k);\n            return new j(l.y, ((l.x + this.w())), ((l.y + this.h())), l.x, k);\n        }\n    });\n    i(j, {\n        deserialize: function(k) {\n            var l = k.split(\":\");\n            return new j(parseFloat(l[1]), parseFloat(l[2]), parseFloat(l[3]), parseFloat(l[0]));\n        },\n        newFromVectors: function(k, l) {\n            return new j(k.y, ((k.x + l.x)), ((k.y + l.y)), k.x, k.domain);\n        },\n        getElementBounds: function(k) {\n            return j.newFromVectors(g.getElementPosition(k), g.getElementDimensions(k));\n        },\n        getViewportBounds: function() {\n            return j.newFromVectors(g.getScrollPosition(), g.getViewportDimensions());\n        },\n        minimumBoundingBox: function(k) {\n            var l = new j(Math.min(), Math.max(), Math.max(), Math.min()), m;\n            for (var n = 0; ((n < k.length)); n++) {\n                m = k[n];\n                l.t = Math.min(l.t, m.t);\n                l.r = Math.max(l.r, m.r);\n                l.b = Math.max(l.b, m.b);\n                l.l = Math.min(l.l, m.l);\n            };\n        ;\n            return l;\n        }\n    });\n    e.exports = j;\n});\n__d(\"SVGChecker\", [], function(a, b, c, d, e, f) {\n    e.exports = {\n        isSVG: function(g) {\n            return ((!!g.ownerSVGElement || ((g.tagName.toLowerCase() === \"svg\"))));\n        },\n        isDisplayed: function(g) {\n            try {\n                var i = g.getBBox();\n                if (((i && ((((i.height === 0)) || ((i.width === 0))))))) {\n                    return false;\n                }\n            ;\n            ;\n            } catch (h) {\n                return false;\n            };\n        ;\n            return true;\n        }\n    };\n});\n__d(\"arrayContains\", [], function(a, b, c, d, e, f) {\n    function g(h, i) {\n        return ((h.indexOf(i) != -1));\n    };\n;\n    e.exports = g;\n});\n__d(\"ContextualLayer\", [\"JSBNG__Event\",\"Arbiter\",\"ARIA\",\"Class\",\"ContextualThing\",\"CSS\",\"DataStore\",\"DOM\",\"Layer\",\"LayerHideOnTransition\",\"Locale\",\"Parent\",\"JSBNG__Rect\",\"Style\",\"Vector\",\"SVGChecker\",\"arrayContains\",\"copyProperties\",\"emptyFunction\",\"getOverlayZIndex\",\"removeFromArray\",\"throttle\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"Arbiter\"), i = b(\"ARIA\"), j = b(\"Class\"), k = b(\"ContextualThing\"), l = b(\"CSS\"), m = b(\"DataStore\"), n = b(\"DOM\"), o = b(\"Layer\"), p = b(\"LayerHideOnTransition\"), q = b(\"Locale\"), r = b(\"Parent\"), s = b(\"JSBNG__Rect\"), t = b(\"Style\"), u = b(\"Vector\"), v = b(\"SVGChecker\"), w = b(\"arrayContains\"), x = b(\"copyProperties\"), y = b(\"emptyFunction\"), z = b(\"getOverlayZIndex\"), aa = b(\"removeFromArray\"), ba = b(\"throttle\");\n    function ca(ja) {\n        return ((((ja.getPosition() === \"left\")) || ((ja.isVertical() && ((ja.getAlignment() === \"right\"))))));\n    };\n;\n    function da(ja) {\n        var ka = ja.parentNode;\n        if (ka) {\n            var la = t.get(ka, \"position\");\n            if (((la === \"static\"))) {\n                if (((ka === JSBNG__document.body))) {\n                    ka = JSBNG__document.documentElement;\n                }\n                 else ka = da(ka);\n            ;\n            ;\n            }\n             else return ka\n        ;\n        }\n         else ka = JSBNG__document.documentElement;\n    ;\n    ;\n        return ka;\n    };\n;\n    function ea(ja, ka) {\n        this.parent.construct(this, ja, ka);\n    };\n;\n    var fa = [];\n    h.subscribe(\"reflow\", function() {\n        fa.forEach(function(ja) {\n            if (((ja.updatePosition() === false))) {\n                ja.hide();\n            }\n        ;\n        ;\n        });\n    });\n    j.extend(ea, o);\n    x(ea.prototype, {\n        _contentWrapper: null,\n        _content: null,\n        _contextNode: null,\n        _contextBounds: null,\n        _contextSelector: null,\n        _parentLayer: null,\n        _parentSubscription: null,\n        _orientation: null,\n        _orientationClass: null,\n        _shouldSetARIAProperties: true,\n        _configure: function(ja, ka) {\n            this.parent._configure(ja, ka);\n            if (ja.context) {\n                this.setContext(ja.context);\n            }\n             else if (ja.contextID) {\n                this._setContextID(ja.contextID);\n            }\n             else if (ja.contextSelector) {\n                this._setContextSelector(ja.contextSelector);\n            }\n            \n            \n        ;\n        ;\n            this.setPosition(ja.position);\n            this.setAlignment(ja.alignment);\n            this.setOffsetX(ja.offsetX);\n            this.setOffsetY(ja.offsetY);\n            this._content = ka;\n        },\n        _getDefaultBehaviors: function() {\n            return this.parent._getDefaultBehaviors().concat([p,]);\n        },\n        _buildWrapper: function(ja, ka) {\n            this._contentWrapper = n.create(\"div\", {\n                className: \"uiContextualLayer\"\n            }, ka);\n            return n.create(\"div\", {\n                className: \"uiContextualLayerPositioner\"\n            }, this._contentWrapper);\n        },\n        getInsertParent: function() {\n            var ja = this._insertParent;\n            if (!ja) {\n                var ka = this.getContext();\n                if (ka) {\n                    ja = r.byClass(ka, \"uiContextualLayerParent\");\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            return ((ja || this.parent.getInsertParent()));\n        },\n        setContent: function(ja) {\n            this._content = ja;\n            n.setContent(this._contentWrapper, this._content);\n            ((this._shown && this.updatePosition()));\n            return this;\n        },\n        setContext: function(ja) {\n            return this.setContextWithBounds(ja, null);\n        },\n        setContextWithBounds: function(ja, ka) {\n            this._contextNode = ja;\n            this._contextBounds = ((ka || null));\n            this._contextSelector = this._contextScrollParent = null;\n            if (this._shown) {\n                k.register(this.getRoot(), this._contextNode);\n                this.updatePosition();\n            }\n        ;\n        ;\n            this._setParentSubscription();\n            this.setARIAProperties();\n            return this;\n        },\n        shouldSetARIAProperties: function(ja) {\n            this._shouldSetARIAProperties = ja;\n            return this;\n        },\n        setARIAProperties: function() {\n            if (this._shouldSetARIAProperties) {\n                i.setPopup(this.getCausalElement(), this.getRoot());\n            }\n        ;\n        ;\n            return this;\n        },\n        _setContextID: function(ja) {\n            this._contextSelector = ((\"#\" + ja));\n            this._contextNode = null;\n        },\n        _setContextSelector: function(ja) {\n            this._contextSelector = ja;\n            this._contextNode = null;\n        },\n        getCausalElement: function() {\n            return ((this.parent.getCausalElement() || this.getContext()));\n        },\n        _setParentSubscription: function() {\n            var ja = this.getContext(), ka = null;\n            while (((ja !== null))) {\n                ka = m.get(ja, \"layer\");\n                if (ka) {\n                    break;\n                }\n            ;\n            ;\n                ja = ja.parentNode;\n            };\n        ;\n            if (((ka === this._parentLayer))) {\n                return;\n            }\n        ;\n        ;\n            if (((this._parentLayer && this._parentSubscription))) {\n                this._parentLayer.unsubscribe(this._parentSubscription);\n                this._parentSubscription = null;\n            }\n        ;\n        ;\n            if (ka) {\n                this._parentSubscription = ka.subscribe(\"hide\", this.hide.bind(this));\n            }\n        ;\n        ;\n            this._parentLayer = ka;\n        },\n        setPosition: function(ja) {\n            if (this._getOrientation().setDefaultPosition(ja)) {\n                ((this._shown && this.updatePosition()));\n            }\n        ;\n        ;\n            return this;\n        },\n        setAlignment: function(ja) {\n            if (this._getOrientation().setDefaultAlignment(ja)) {\n                ((this._shown && this.updatePosition()));\n            }\n        ;\n        ;\n            return this;\n        },\n        setOffsetX: function(ja) {\n            if (this._getOrientation().setDefaultOffsetX(ja)) {\n                ((this._shown && this.updatePosition()));\n            }\n        ;\n        ;\n            return this;\n        },\n        setOffsetY: function(ja) {\n            if (this._getOrientation().setDefaultOffsetY(ja)) {\n                ((this._shown && this.updatePosition()));\n            }\n        ;\n        ;\n            return this;\n        },\n        _getOrientation: function() {\n            if (!this._orientation) {\n                this._orientation = new ia();\n            }\n        ;\n        ;\n            return this._orientation;\n        },\n        getContentRoot: function() {\n            return this._contentWrapper;\n        },\n        getContent: function() {\n            return this._content;\n        },\n        getContext: function() {\n            if (!this._contextNode) {\n                this._contextNode = n.JSBNG__find(JSBNG__document, this._contextSelector);\n            }\n        ;\n        ;\n            return this._contextNode;\n        },\n        getContextBounds: function(ja) {\n            if (this._contextBounds) {\n                return this._contextBounds.convertTo(ja);\n            }\n        ;\n        ;\n            var ka = this.getContext();\n            return s.newFromVectors(u.getElementPosition(ka, ja), u.getElementDimensions(ka));\n        },\n        getContextScrollParent: function() {\n            if (!this._contextScrollParent) {\n                this._contextScrollParent = t.getScrollParent(this.getContext());\n            }\n        ;\n        ;\n            return this._contextScrollParent;\n        },\n        setInsertParent: function(ja) {\n            this._insertScrollParent = null;\n            return this.parent.setInsertParent(ja);\n        },\n        getInsertScrollParent: function() {\n            if (!this._insertScrollParent) {\n                this._insertScrollParent = t.getScrollParent(this.getInsertParent());\n            }\n        ;\n        ;\n            return this._insertScrollParent;\n        },\n        show: function() {\n            if (this._shown) {\n                return this;\n            }\n        ;\n        ;\n            this.parent.show();\n            if (this._shown) {\n                k.register(this.getRoot(), this.getContext());\n                fa.push(this);\n                this._resizeListener = ((this._resizeListener || g.listen(window, \"resize\", ba(this.updatePosition.bind(this)))));\n            }\n        ;\n        ;\n            return this;\n        },\n        finishHide: function() {\n            aa(fa, this);\n            ((this._resizeListener && this._resizeListener.remove()));\n            this._resizeListener = null;\n            return this.parent.finishHide();\n        },\n        isFixed: function() {\n            return ((t.isFixed(this.getContext()) && !t.isFixed(this.getInsertParent())));\n        },\n        updatePosition: function() {\n            var ja = this.getContext();\n            if (!ja) {\n                return false;\n            }\n        ;\n        ;\n            var ka = this.isFixed();\n            if (((!ka && !((ja.offsetParent || ((v.isSVG(ja) && v.isDisplayed(ja)))))))) {\n                return false;\n            }\n        ;\n        ;\n            var la = this.getRoot();\n            t.set(la, \"width\", ((u.getViewportDimensions().x + \"px\")));\n            var ma = this._getOrientation();\n            this.inform(\"adjust\", ma.reset());\n            if (!ma.isValid()) {\n                return false;\n            }\n        ;\n        ;\n            this._updateWrapperPosition(ma);\n            this._updateWrapperClass(ma);\n            l.conditionClass(la, \"uiContextualLayerPositionerFixed\", ka);\n            var na, oa, pa = ((ka ? \"viewport\" : \"JSBNG__document\")), qa = ((ka ? JSBNG__document.documentElement : da(la)));\n            if (((qa === JSBNG__document.documentElement))) {\n                na = new u(0, 0);\n                oa = JSBNG__document.documentElement.clientWidth;\n            }\n             else if (!la.offsetParent) {\n                return false;\n            }\n             else {\n                na = u.getElementPosition(qa, pa);\n                oa = qa.offsetWidth;\n                if (((qa !== JSBNG__document.body))) {\n                    na = na.sub(new u(qa.scrollLeft, qa.scrollTop));\n                }\n            ;\n            ;\n            }\n            \n        ;\n        ;\n            var ra = this.getContextBounds(pa), sa = ((ra.l - na.x)), ta = ((ra.t - na.y)), ua = ra.h(), va = ra.w(), wa = q.isRTL();\n            if (((ma.getPosition() === \"below\"))) {\n                ta += ua;\n            }\n        ;\n        ;\n            if (((((((ma.getPosition() === \"right\")) || ((ma.isVertical() && ((ma.getAlignment() === \"right\")))))) != wa))) {\n                sa += va;\n            }\n        ;\n        ;\n            var xa = ma.getOffsetX();\n            if (((ma.isVertical() && ((ma.getAlignment() === \"center\"))))) {\n                xa += ((((va - this.getContentRoot().offsetWidth)) / 2));\n            }\n        ;\n        ;\n            if (wa) {\n                xa *= -1;\n            }\n        ;\n        ;\n            var ya = \"left\", za = Math.floor(((sa + xa)));\n            if (((ca(ma) !== wa))) {\n                ya = \"right\";\n                za = ((oa - za));\n            }\n        ;\n        ;\n            t.set(la, ya, ((za + \"px\")));\n            t.set(la, ((((ya === \"left\")) ? \"right\" : \"left\")), \"\");\n            var ab = this.getInsertScrollParent(), bb;\n            if (((ab !== window))) {\n                bb = ab.clientWidth;\n            }\n             else bb = JSBNG__document.documentElement.clientWidth;\n        ;\n        ;\n            var cb = u.getElementPosition(la).x;\n            if (((ya === \"left\"))) {\n                if (((((bb - cb)) > 0))) {\n                    t.set(la, \"width\", ((((bb - cb)) + \"px\")));\n                }\n                 else t.set(la, \"width\", \"\");\n            ;\n            ;\n            }\n             else t.set(la, \"width\", ((((cb + la.offsetWidth)) + \"px\")));\n        ;\n        ;\n            t.set(la, \"JSBNG__top\", ((((ta + ma.getOffsetY())) + \"px\")));\n            var db = z(ja, this.getInsertParent());\n            t.set(la, \"z-index\", ((((db > 200)) ? db : \"\")));\n            this.inform(\"reposition\", ma);\n            return true;\n        },\n        _updateWrapperPosition: function(ja) {\n            var ka = ((ja.getPosition() === \"above\"));\n            t.set(this._contentWrapper, \"bottom\", ((ka ? \"0\" : null)));\n            var la = ((q.isRTL() ? \"left\" : \"right\")), ma = ca(ja);\n            t.set(this._contentWrapper, la, ((ma ? \"0\" : null)));\n        },\n        _updateWrapperClass: function(ja) {\n            var ka = ja.getClassName();\n            if (((ka === this._orientationClass))) {\n                return;\n            }\n        ;\n        ;\n            if (this._orientationClass) {\n                l.removeClass(this._contentWrapper, this._orientationClass);\n            }\n        ;\n        ;\n            this._orientationClass = ka;\n            l.addClass(this._contentWrapper, ka);\n        },\n        simulateOrientation: function(ja, ka) {\n            var la = ja.getClassName();\n            if (((la === this._orientationClass))) {\n                return ka();\n            }\n             else {\n                if (this._orientationClass) {\n                    l.removeClass(this._contentWrapper, this._orientationClass);\n                }\n            ;\n            ;\n                l.addClass(this._contentWrapper, la);\n                var ma = ka();\n                l.removeClass(this._contentWrapper, la);\n                if (this._orientationClass) {\n                    l.addClass(this._contentWrapper, this._orientationClass);\n                }\n            ;\n            ;\n                return ma;\n            }\n        ;\n        ;\n        },\n        destroy: function() {\n            this.parent.destroy();\n            this._contentWrapper = null;\n            this._content = null;\n            return this;\n        }\n    });\n    var ga = y.thatReturnsArgument, ha = y.thatReturnsArgument;\n    function ia() {\n        this._default = {\n            _position: \"above\",\n            _alignment: \"left\",\n            _offsetX: 0,\n            _offsetY: 0,\n            _valid: true\n        };\n        this.reset();\n    };\n;\n    ia.OPPOSITE = {\n        above: \"below\",\n        below: \"above\",\n        left: \"right\",\n        right: \"left\"\n    };\n    x(ia.prototype, {\n        setPosition: function(ja) {\n            this._position = ga(ja);\n            return this;\n        },\n        setAlignment: function(ja) {\n            this._alignment = ha(ja);\n            return this;\n        },\n        getOppositePosition: function() {\n            return ia.OPPOSITE[this.getPosition()];\n        },\n        invalidate: function() {\n            this._valid = false;\n            return this;\n        },\n        getPosition: function() {\n            return ((this._position || \"above\"));\n        },\n        getAlignment: function() {\n            return ((this._alignment || \"left\"));\n        },\n        getOffsetX: function() {\n            var ja = ((this._offsetX || 0));\n            if (!this.isVertical()) {\n                if (((this._default._position !== this._position))) {\n                    ja *= -1;\n                }\n            ;\n            ;\n            }\n             else if (((this._default._alignment !== this._alignment))) {\n                ja *= -1;\n            }\n            \n        ;\n        ;\n            return ja;\n        },\n        getOffsetY: function() {\n            var ja = ((this._offsetY || 0));\n            if (((this.isVertical() && ((this._default._position !== this._position))))) {\n                ja *= -1;\n            }\n        ;\n        ;\n            return ja;\n        },\n        getClassName: function() {\n            var ja = this.getAlignment(), ka = this.getPosition();\n            if (((ka === \"below\"))) {\n                if (((ja === \"left\"))) {\n                    return \"uiContextualLayerBelowLeft\";\n                }\n                 else if (((ja === \"right\"))) {\n                    return \"uiContextualLayerBelowRight\";\n                }\n                 else return \"uiContextualLayerBelowCenter\"\n                \n            ;\n            }\n             else if (((ka === \"above\"))) {\n                if (((ja === \"left\"))) {\n                    return \"uiContextualLayerAboveLeft\";\n                }\n                 else if (((ja === \"right\"))) {\n                    return \"uiContextualLayerAboveRight\";\n                }\n                 else return \"uiContextualLayerAboveCenter\"\n                \n            ;\n            }\n             else if (((ka === \"left\"))) {\n                return \"uiContextualLayerLeft\";\n            }\n             else return \"uiContextualLayerRight\"\n            \n            \n        ;\n        },\n        isValid: function() {\n            return this._valid;\n        },\n        isVertical: function() {\n            return ((((this.getPosition() === \"above\")) || ((this.getPosition() === \"below\"))));\n        },\n        reset: function(ja, ka) {\n            x(this, this._default);\n            return this;\n        },\n        setDefaultPosition: function(ja) {\n            var ka = this._default._position;\n            this._default._position = ga(ja);\n            return ((ka !== ja));\n        },\n        setDefaultAlignment: function(ja) {\n            var ka = this._default._alignment;\n            this._default._alignment = ha(ja);\n            return ((ka !== ja));\n        },\n        setDefaultOffsetX: function(ja) {\n            var ka = this._default._offsetX;\n            this._default._offsetX = ja;\n            return ((ka !== ja));\n        },\n        setDefaultOffsetY: function(ja) {\n            var ka = this._default._offsetY;\n            this._default._offsetY = ja;\n            return ((ka !== ja));\n        }\n    });\n    e.exports = ea;\n});\n__d(\"ContextualLayerHideOnScroll\", [\"JSBNG__Event\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"copyProperties\");\n    function i(j) {\n        this._layer = j;\n    };\n;\n    h(i.prototype, {\n        _subscriptions: [],\n        enable: function() {\n            this._subscriptions = [this._layer.subscribe(\"contextchange\", this._handleContextChange.bind(this)),this._layer.subscribe(\"show\", this.attach.bind(this)),this._layer.subscribe(\"hide\", this.detach.bind(this)),];\n        },\n        disable: function() {\n            while (this._subscriptions.length) {\n                this._subscriptions.pop().unsubscribe();\n            ;\n            };\n        ;\n            this.detach();\n        },\n        attach: function() {\n            if (this._listener) {\n                return;\n            }\n        ;\n        ;\n            var j = this._layer.getContextScrollParent();\n            if (((j === window))) {\n                return;\n            }\n        ;\n        ;\n            this._listener = g.listen(j, \"JSBNG__scroll\", this._layer.hide.bind(this._layer));\n        },\n        detach: function() {\n            ((this._listener && this._listener.remove()));\n            this._listener = null;\n        },\n        _handleContextChange: function() {\n            this.detach();\n            if (this._layer.isShown()) {\n                this.attach();\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = i;\n});\n__d(\"LayerHideOnEscape\", [\"JSBNG__Event\",\"copyProperties\",\"Keys\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"copyProperties\"), i = b(\"Keys\");\n    function j(k) {\n        this._layer = k;\n    };\n;\n    h(j.prototype, {\n        _subscription: null,\n        enable: function() {\n            this._subscription = this._layer.subscribe(\"key\", this._handle.bind(this));\n        },\n        disable: function() {\n            this._subscription.unsubscribe();\n            this._subscription = null;\n        },\n        _handle: function(k, JSBNG__event) {\n            if (((g.getKeyCode(JSBNG__event) === i.ESC))) {\n                this._layer.hide();\n                return false;\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = j;\n});\n__d(\"TabbableElements\", [\"Style\",\"createArrayFrom\",], function(a, b, c, d, e, f) {\n    var g = b(\"Style\"), h = b(\"createArrayFrom\");\n    function i(l) {\n        if (((l.tabIndex >= 0))) {\n            return true;\n        }\n    ;\n    ;\n        switch (l.tagName) {\n          case \"A\":\n            return ((l.href && ((l.rel != \"ignore\"))));\n          case \"INPUT\":\n            return ((((((l.type != \"hidden\")) && ((l.type != \"file\")))) && !l.disabled));\n          case \"BUTTON\":\n        \n          case \"SELECT\":\n        \n          case \"TEXTAREA\":\n            return !l.disabled;\n        };\n    ;\n        return false;\n    };\n;\n    function j(l) {\n        if (((((l.offsetHeight === 0)) && ((l.offsetWidth === 0))))) {\n            return false;\n        }\n    ;\n    ;\n        while (((((l !== JSBNG__document)) && ((g.get(l, \"visibility\") != \"hidden\"))))) {\n            l = l.parentNode;\n        ;\n        };\n    ;\n        return ((l === JSBNG__document));\n    };\n;\n    var k = {\n        JSBNG__find: function(l) {\n            var m = h(l.getElementsByTagName(\"*\"));\n            return m.filter(k.isTabbable);\n        },\n        isTabbable: function(l) {\n            return ((i(l) && j(l)));\n        }\n    };\n    e.exports = k;\n});\n__d(\"Toggler\", [\"JSBNG__Event\",\"Arbiter\",\"ArbiterMixin\",\"ContextualThing\",\"CSS\",\"DataStore\",\"Dialog\",\"DOM\",\"DOMQuery\",\"Focus\",\"Parent\",\"TabbableElements\",\"arrayContains\",\"cx\",\"copyProperties\",\"createArrayFrom\",\"emptyFunction\",\"ge\",\"getContextualParent\",\"getObjectValues\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"Arbiter\"), i = b(\"ArbiterMixin\"), j = b(\"ContextualThing\"), k = b(\"CSS\"), l = b(\"DataStore\"), m = b(\"Dialog\"), n = b(\"DOM\"), o = b(\"DOMQuery\"), p = b(\"Focus\"), q = b(\"Parent\"), r = b(\"TabbableElements\"), s = b(\"arrayContains\"), t = b(\"cx\"), u = b(\"copyProperties\"), v = b(\"createArrayFrom\"), w = b(\"emptyFunction\"), x = b(\"ge\"), y = b(\"getContextualParent\"), z = b(\"getObjectValues\"), aa = [], ba;\n    function ca() {\n        ca = w;\n        g.listen(JSBNG__document.documentElement, \"click\", function(JSBNG__event) {\n            var ga = JSBNG__event.getTarget();\n            aa.forEach(function(ha) {\n                ha.clickedTarget = ga;\n                ((((((((((((ha.active && !ha.sticky)) && !j.containsIncludingLayers(ha.getActive(), ga))) && !ha.inTargetFlyout(ga))) && ha.inActiveDialog())) && !ha.isIgnoredByModalLayer(ga))) && ha.hide()));\n            });\n        }, g.Priority.URGENT);\n    };\n;\n    var da = function() {\n        this.active = null;\n        this.togglers = {\n        };\n        this.setSticky(false);\n        aa.push(this);\n        this.subscribe([\"show\",\"hide\",], da.inform.bind(da));\n        return ca();\n    };\n    u(da.prototype, i, {\n        show: function(ga) {\n            var ha = ea(this, ga), ia = ha.active;\n            if (((ga !== ia))) {\n                ((ia && ha.hide()));\n                ha.active = ga;\n                k.addClass(ga, \"openToggler\");\n                var ja = n.scry(ga, \"a[rel=\\\"toggle\\\"]\");\n                if (((((ja.length > 0)) && ja[0].getAttribute(\"data-target\")))) {\n                    k.removeClass(x(ja[0].getAttribute(\"data-target\")), \"toggleTargetClosed\");\n                }\n            ;\n            ;\n                var ka = o.scry(ga, \".uiToggleFlyout\")[0];\n                if (ka) {\n                    var la = ((r.JSBNG__find(ka)[0] || ka));\n                    if (((la.tabIndex == -1))) {\n                        la.tabIndex = 0;\n                    }\n                ;\n                ;\n                    p.setWithoutOutline(la);\n                }\n            ;\n            ;\n                n.appendContent(ga, ha.getToggler(\"next\"));\n                n.prependContent(ga, ha.getToggler(\"prev\"));\n                ha.inform(\"show\", ha);\n            }\n        ;\n        ;\n        },\n        hide: function(ga) {\n            var ha = ea(this, ga), ia = ha.active;\n            if (((ia && ((!ga || ((ga === ia))))))) {\n                k.removeClass(ia, \"openToggler\");\n                var ja = n.scry(ia, \"a[rel=\\\"toggle\\\"]\");\n                if (((((ja.length > 0)) && ja[0].getAttribute(\"data-target\")))) {\n                    k.addClass(x(ja[0].getAttribute(\"data-target\")), \"toggleTargetClosed\");\n                }\n            ;\n            ;\n                z(ha.togglers).forEach(n.remove);\n                ha.inform(\"hide\", ha);\n                ha.active = null;\n            }\n        ;\n        ;\n        },\n        toggle: function(ga) {\n            var ha = ea(this, ga);\n            if (((ha.active === ga))) {\n                ha.hide();\n            }\n             else ha.show(ga);\n        ;\n        ;\n        },\n        getActive: function() {\n            return ea(this).active;\n        },\n        isShown: function() {\n            return ((ea(this).active && k.hasClass(ea(this).active, \"openToggler\")));\n        },\n        inTargetFlyout: function(ga) {\n            var ha = fa(this.getActive());\n            return ((ha && j.containsIncludingLayers(ha, ga)));\n        },\n        inActiveDialog: function() {\n            var ga = m.getCurrent();\n            return ((!ga || n.contains(ga.getRoot(), this.getActive())));\n        },\n        isIgnoredByModalLayer: function(ga) {\n            return ((q.byClass(ga, \"_3qw\") && !q.byClass(this.getActive(), \"_3qw\")));\n        },\n        getToggler: function(ga) {\n            var ha = ea(this);\n            if (!ha.togglers[ga]) {\n                ha.togglers[ga] = n.create(\"button\", {\n                    className: \"hideToggler\",\n                    JSBNG__onfocus: function() {\n                        var ia = n.scry(ha.active, \"a[rel=\\\"toggle\\\"]\")[0];\n                        ((ia && ia.JSBNG__focus()));\n                        ha.hide();\n                    }\n                });\n                ha.togglers[ga].setAttribute(\"type\", \"button\");\n            }\n        ;\n        ;\n            return this.togglers[ga];\n        },\n        setSticky: function(ga) {\n            var ha = ea(this);\n            ga = ((ga !== false));\n            if (((ga !== ha.sticky))) {\n                ha.sticky = ga;\n                if (ga) {\n                    ((ha._pt && ha._pt.unsubscribe()));\n                }\n                 else ha._pt = h.subscribe(\"pre_page_transition\", ha.hide.bind(ha, null));\n            ;\n            ;\n            }\n        ;\n        ;\n            return ha;\n        }\n    });\n    u(da, da.prototype);\n    u(da, {\n        bootstrap: function(ga) {\n            var ha = ga.parentNode;\n            da.getInstance(ha).toggle(ha);\n        },\n        createInstance: function(ga) {\n            var ha = new da().setSticky(true);\n            l.set(ga, \"toggler\", ha);\n            return ha;\n        },\n        destroyInstance: function(ga) {\n            l.remove(ga, \"toggler\");\n        },\n        getInstance: function(ga) {\n            while (ga) {\n                var ha = l.get(ga, \"toggler\");\n                if (ha) {\n                    return ha;\n                }\n            ;\n            ;\n                if (k.hasClass(ga, \"uiToggleContext\")) {\n                    return da.createInstance(ga);\n                }\n            ;\n            ;\n                ga = y(ga);\n            };\n        ;\n            return (ba = ((ba || new da())));\n        },\n        listen: function(ga, ha, ia) {\n            return da.subscribe(v(ga), function(ja, ka) {\n                if (((ka.getActive() === ha))) {\n                    return ia(ja, ka);\n                }\n            ;\n            ;\n            });\n        },\n        subscribe: (function(ga) {\n            return function(ha, ia) {\n                ha = v(ha);\n                if (s(ha, \"show\")) {\n                    aa.forEach(function(ja) {\n                        if (ja.getActive()) {\n                            ia.curry(\"show\", ja).defer();\n                        }\n                    ;\n                    ;\n                    });\n                }\n            ;\n            ;\n                return ga(ha, ia);\n            };\n        })(da.subscribe.bind(da))\n    });\n    function ea(ga, ha) {\n        if (((ga instanceof da))) {\n            return ga;\n        }\n    ;\n    ;\n        return da.getInstance(ha);\n    };\n;\n    function fa(ga) {\n        var ha = n.scry(ga, \"a[rel=\\\"toggle\\\"]\");\n        if (((((ha.length > 0)) && ha[0].getAttribute(\"data-target\")))) {\n            return x(ha[0].getAttribute(\"data-target\"));\n        }\n    ;\n    ;\n    };\n;\n    e.exports = da;\n});\n__d(\"curry\", [\"bind\",], function(a, b, c, d, e, f) {\n    var g = b(\"bind\"), h = g(null, g, null);\n    e.exports = h;\n});\n__d(\"Popover\", [\"JSBNG__Event\",\"Arbiter\",\"ArbiterMixin\",\"ContextualLayer\",\"ContextualLayerHideOnScroll\",\"CSS\",\"DataStore\",\"DOM\",\"Focus\",\"Keys\",\"KeyStatus\",\"LayerHideOnEscape\",\"Toggler\",\"copyProperties\",\"curry\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"Arbiter\"), i = b(\"ArbiterMixin\"), j = b(\"ContextualLayer\"), k = b(\"ContextualLayerHideOnScroll\"), l = b(\"CSS\"), m = b(\"DataStore\"), n = b(\"DOM\"), o = b(\"Focus\"), p = b(\"Keys\"), q = b(\"KeyStatus\"), r = b(\"LayerHideOnEscape\"), s = b(\"Toggler\"), t = b(\"copyProperties\"), u = b(\"curry\");\n    s.subscribe([\"show\",\"hide\",], function(w, x) {\n        var y = m.get(x.getActive(), \"Popover\");\n        if (y) {\n            if (((w === \"show\"))) {\n                y.showLayer();\n            }\n             else y.hideLayer();\n        ;\n        }\n    ;\n    ;\n    });\n    function v(w, x, y, z) {\n        this._root = w;\n        this._triggerElem = x;\n        this._behaviors = y;\n        this._config = ((z || {\n        }));\n        this._disabled = !!this._config.disabled;\n        this._listeners = [];\n        if (((!this._disabled && ((((x.nodeName !== \"A\")) || ((x.rel !== \"toggle\"))))))) {\n            this._setupClickListener();\n        }\n    ;\n    ;\n        this._setupKeyListener();\n        x.setAttribute(\"role\", \"button\");\n        m.set(w, \"Popover\", this);\n    };\n;\n    t(v.prototype, i, {\n        _layer: null,\n        ensureInit: function() {\n            if (!this._layer) {\n                this._init();\n            }\n        ;\n        ;\n        },\n        showLayer: function() {\n            this.ensureInit();\n            this._layer.show();\n            s.show(this._root);\n            l.addClass(this._root, \"selected\");\n            this.inform(\"show\");\n            this._triggerElem.setAttribute(\"aria-expanded\", \"true\");\n        },\n        getLayer: function() {\n            return this._layer;\n        },\n        hideLayer: function() {\n            this._layer.hide();\n            this._triggerElem.setAttribute(\"aria-expanded\", \"false\");\n        },\n        isShown: function() {\n            return ((this._layer && this._layer.isShown()));\n        },\n        setLayerContent: function(w) {\n            this.ensureInit();\n            this._layer.setContent(w);\n        },\n        _init: function() {\n            var w = new j({\n                context: this._triggerElem,\n                position: \"below\"\n            }, n.create(\"div\"));\n            w.enableBehaviors([k,r,]);\n            s.createInstance(w.getRoot()).setSticky(false);\n            w.subscribe(\"hide\", this._onLayerHide.bind(this));\n            ((this._behaviors && w.enableBehaviors(this._behaviors)));\n            this._layer = w;\n            if (this._config.alignh) {\n                this._layer.setAlignment(this._config.alignh);\n            }\n        ;\n        ;\n            if (this._config.layer_content) {\n                this._layer.setContent(this._config.layer_content);\n            }\n        ;\n        ;\n            this.inform(\"init\", null, h.BEHAVIOR_PERSISTENT);\n        },\n        _onLayerHide: function() {\n            s.hide(this._root);\n            l.removeClass(this._root, \"selected\");\n            this.inform(\"hide\");\n            if (((q.getKeyDownCode() === p.ESC))) {\n                o.set(this._triggerElem);\n            }\n        ;\n        ;\n        },\n        enable: function() {\n            if (!this._disabled) {\n                return;\n            }\n        ;\n        ;\n            this._setupClickListener();\n            this._setupKeyListener();\n            this._disabled = false;\n        },\n        disable: function() {\n            if (this._disabled) {\n                return;\n            }\n        ;\n        ;\n            if (this.isShown()) {\n                this.hideLayer();\n            }\n        ;\n        ;\n            while (this._listeners.length) {\n                this._listeners.pop().remove();\n            ;\n            };\n        ;\n            if (((this._triggerElem.getAttribute(\"rel\") === \"toggle\"))) {\n                this._triggerElem.removeAttribute(\"rel\");\n            }\n        ;\n        ;\n            this._disabled = true;\n        },\n        _setupClickListener: function() {\n            this._listeners.push(g.listen(this._triggerElem, \"click\", u(s.bootstrap, this._triggerElem)));\n        },\n        _setupKeyListener: function() {\n            this._listeners.push(g.listen(this._triggerElem, \"keydown\", this._handleKeyEvent.bind(this)));\n        },\n        _handleKeyEvent: function(JSBNG__event) {\n            if (JSBNG__event.getModifiers().any) {\n                return;\n            }\n        ;\n        ;\n            switch (g.getKeyCode(JSBNG__event)) {\n              case p.DOWN:\n            \n              case p.UP:\n                s.bootstrap(this._triggerElem);\n                break;\n              default:\n                return;\n            };\n        ;\n            JSBNG__event.prevent();\n        }\n    });\n    e.exports = v;\n});\n__d(\"PopoverMenu\", [\"JSBNG__Event\",\"Arbiter\",\"ArbiterMixin\",\"ARIA\",\"BehaviorsMixin\",\"Focus\",\"Keys\",\"KeyStatus\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"Arbiter\"), i = b(\"ArbiterMixin\"), j = b(\"ARIA\"), k = b(\"BehaviorsMixin\"), l = b(\"Focus\"), m = b(\"Keys\"), n = b(\"KeyStatus\"), o = b(\"copyProperties\");\n    function p(q, r, s, t) {\n        this._popover = q;\n        this._triggerElem = r;\n        this._initialMenu = s;\n        q.subscribe(\"init\", this._onLayerInit.bind(this));\n        q.subscribe(\"show\", this._onPopoverShow.bind(this));\n        q.subscribe(\"hide\", this._onPopoverHide.bind(this));\n        g.listen(this._triggerElem, \"keydown\", this._handleKeyEventOnTrigger.bind(this));\n        ((t && this.enableBehaviors(t)));\n    };\n;\n    o(p.prototype, i, k);\n    o(p.prototype, {\n        _popoverShown: false,\n        setMenu: function(q) {\n            this._menu = q;\n            var r = q.getRoot();\n            this._popover.setLayerContent(r);\n            q.subscribe(\"done\", this._onMenuDone.bind(this));\n            if (this._popoverShown) {\n                this._menu.onShow();\n            }\n        ;\n        ;\n            j.owns(this._triggerElem, r);\n            this.inform(\"setMenu\", null, h.BEHAVIOR_PERSISTENT);\n        },\n        getPopover: function() {\n            return this._popover;\n        },\n        getTriggerElem: function() {\n            return this._triggerElem;\n        },\n        getMenu: function() {\n            return this._menu;\n        },\n        _onLayerInit: function() {\n            this.setMenu(this._initialMenu);\n            this._popover.getLayer().subscribe(\"key\", this._handleKeyEvent.bind(this));\n        },\n        _onPopoverShow: function() {\n            if (this._menu) {\n                this._menu.onShow();\n            }\n        ;\n        ;\n            this._popoverShown = true;\n        },\n        _onPopoverHide: function() {\n            if (this._menu) {\n                this._menu.onHide();\n            }\n        ;\n        ;\n            this._popoverShown = false;\n        },\n        _handleKeyEvent: function(q, r) {\n            var s = g.getKeyCode(r);\n            if (((s === m.TAB))) {\n                this._popover.hideLayer();\n                l.set(this._triggerElem);\n                return;\n            }\n        ;\n        ;\n            if (r.getModifiers().any) {\n                return;\n            }\n        ;\n        ;\n            switch (s) {\n              case m.RETURN:\n                return;\n              case m.UP:\n            \n              case m.DOWN:\n                this._menu.handleKeydown(s, r);\n                break;\n              default:\n                if (((this._menu.handleKeydown(s, r) === false))) {\n                    this._menu.JSBNG__blur();\n                    this._menu.handleKeydown(s, r);\n                }\n            ;\n            ;\n                break;\n            };\n        ;\n            r.prevent();\n        },\n        _handleKeyEventOnTrigger: function(q) {\n            var r = g.getKeyCode(q);\n            switch (r) {\n              case m.DOWN:\n            \n              case m.UP:\n                break;\n              default:\n                var s = String.fromCharCode(r).toLowerCase();\n                if (!/^\\s?$/.test(s)) {\n                    this._popover.showLayer();\n                    this._menu.JSBNG__blur();\n                    if (((this._menu.handleKeydown(r, q) === false))) {\n                        this._popover.hideLayer();\n                        l.set(this._triggerElem);\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n            };\n        ;\n        },\n        _onMenuDone: function(q) {\n            this._popover.hideLayer.bind(this._popover).defer();\n            if (n.isKeyDown()) {\n                l.set(this._triggerElem);\n            }\n        ;\n        ;\n        },\n        enable: function() {\n            this._popover.enable();\n        },\n        disable: function() {\n            this._popover.disable();\n        }\n    });\n    e.exports = p;\n});\n__d(\"PopoverAsyncMenu\", [\"JSBNG__Event\",\"AsyncRequest\",\"Class\",\"PopoverMenu\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"AsyncRequest\"), i = b(\"Class\"), j = b(\"PopoverMenu\"), k = b(\"copyProperties\"), l = {\n    }, m = 0;\n    function n(o, p, q, r, s) {\n        this._endpoint = r;\n        this._loadingMenu = q;\n        this._instanceId = m++;\n        l[this._instanceId] = this;\n        this._mouseoverListener = g.listen(p, \"mouseover\", this._fetchMenu.bind(this));\n        this.parent.construct(this, o, p, null, s);\n    };\n;\n    n.setMenu = function(o, p) {\n        l[o].setMenu(p);\n    };\n    n.getInstance = function(o) {\n        return l[o];\n    };\n    i.extend(n, j);\n    k(n.prototype, {\n        _fetched: false,\n        _mouseoverListener: null,\n        _onLayerInit: function() {\n            if (!this._menu) {\n                this.setMenu(this._loadingMenu);\n            }\n        ;\n        ;\n            this._fetchMenu();\n            this._popover.getLayer().subscribe(\"key\", this._handleKeyEvent.bind(this));\n        },\n        _fetchMenu: function() {\n            if (this._fetched) {\n                return;\n            }\n        ;\n        ;\n            new h().setURI(this._endpoint).setData({\n                pmid: this._instanceId\n            }).send();\n            this._fetched = true;\n            if (this._mouseoverListener) {\n                this._mouseoverListener.remove();\n                this._mouseoverListener = null;\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = n;\n});\n__d(\"PopoverMenuInterface\", [\"ArbiterMixin\",\"copyProperties\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"ArbiterMixin\"), h = b(\"copyProperties\"), i = b(\"emptyFunction\");\n    function j() {\n    \n    };\n;\n    h(j.prototype, g, {\n        getRoot: i,\n        onShow: i,\n        onHide: i,\n        focusAnItem: i.thatReturnsFalse,\n        JSBNG__blur: i,\n        handleKeydown: i.thatReturnsFalse,\n        done: function() {\n            this.inform(\"done\");\n        }\n    });\n    e.exports = j;\n});\n__d(\"PopoverMenuOverlappingBorder\", [\"CSS\",\"DOM\",\"Style\",\"copyProperties\",\"cx\",\"shield\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSS\"), h = b(\"DOM\"), i = b(\"Style\"), j = b(\"copyProperties\"), k = b(\"cx\"), l = b(\"shield\");\n    function m(n) {\n        this._popoverMenu = n;\n        this._popover = n.getPopover();\n        this._triggerElem = n.getTriggerElem();\n    };\n;\n    j(m.prototype, {\n        _shortBorder: null,\n        _setMenuSubscription: null,\n        _showSubscription: null,\n        _menuSubscription: null,\n        enable: function() {\n            this._setMenuSubscription = this._popoverMenu.subscribe(\"setMenu\", l(this._onSetMenu, this));\n        },\n        disable: function() {\n            this._popoverMenu.unsubscribe(this._setMenuSubscription);\n            this._setMenuSubscription = null;\n            this._removeBorderSubscriptions();\n            this._removeShortBorder();\n        },\n        _onSetMenu: function() {\n            this._removeBorderSubscriptions();\n            this._menu = this._popoverMenu.getMenu();\n            this._renderShortBorder(this._menu.getRoot());\n            this._showSubscription = this._popover.subscribe(\"show\", l(this._updateBorder, this));\n            this._menuSubscription = this._menu.subscribe([\"change\",\"resize\",], l(Function.prototype.defer, l(this._updateBorder, this)));\n            this._updateBorder();\n        },\n        _updateBorder: function() {\n            var n = this._menu.getRoot(), o = this._triggerElem.offsetWidth, p = Math.max(((n.offsetWidth - o)), 0);\n            i.set(this._shortBorder, \"width\", ((p + \"px\")));\n        },\n        _renderShortBorder: function(n) {\n            this._shortBorder = h.create(\"div\", {\n                className: \"_54hx\"\n            });\n            h.appendContent(n, this._shortBorder);\n            g.addClass(n, \"_54hy\");\n        },\n        _removeShortBorder: function() {\n            if (this._shortBorder) {\n                h.remove(this._shortBorder);\n                this._shortBorder = null;\n                g.removeClass(this._popoverMenu.getMenu().getRoot(), \"_54hy\");\n            }\n        ;\n        ;\n        },\n        _removeBorderSubscriptions: function() {\n            if (this._showSubscription) {\n                this._popover.unsubscribe(this._showSubscription);\n                this._showSubscription = null;\n            }\n        ;\n        ;\n            if (this._menuSubscription) {\n                this._menu.unsubscribe(this._menuSubscription);\n                this._menuSubscription = null;\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = m;\n});\n__d(\"PostLoadJS\", [\"Bootloader\",\"Run\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"Bootloader\"), h = b(\"Run\"), i = b(\"emptyFunction\");\n    function j(l, m) {\n        h.onAfterLoad(function() {\n            g.loadModules.call(g, [l,], m);\n        });\n    };\n;\n    var k = {\n        loadAndRequire: function(l) {\n            j(l, i);\n        },\n        loadAndCall: function(l, m, n) {\n            j(l, function(o) {\n                o[m].apply(o, n);\n            });\n        }\n    };\n    e.exports = k;\n});\n__d(\"ContextualLayerDimensions\", [\"DOM\",\"Locale\",\"JSBNG__Rect\",\"Vector\",\"ViewportBounds\",\"ge\",\"getOverlayZIndex\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOM\"), h = b(\"Locale\"), i = b(\"JSBNG__Rect\"), j = b(\"Vector\"), k = b(\"ViewportBounds\"), l = b(\"ge\"), m = b(\"getOverlayZIndex\"), n = {\n        getViewportRect: function(o) {\n            var p = l(\"globalContainer\"), q = o.getContext(), r = ((((p && g.contains(p, q))) || ((m(q) < 300)))), s = i.getViewportBounds();\n            if (r) {\n                s.t += k.getTop();\n                if (h.isRTL()) {\n                    s.r -= k.getLeft();\n                    s.l += k.getRight();\n                }\n                 else {\n                    s.r -= k.getRight();\n                    s.l += k.getLeft();\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            return s;\n        },\n        getLayerRect: function(o, p) {\n            var q = o.getContextBounds(\"viewport\"), r = o.simulateOrientation(p, function() {\n                return j.getElementDimensions(o.getContent());\n            }), s = ((q.t + p.getOffsetY()));\n            if (((p.getPosition() === \"above\"))) {\n                s -= r.y;\n            }\n             else if (((p.getPosition() === \"below\"))) {\n                s += ((q.b - q.t));\n            }\n            \n        ;\n        ;\n            var t = ((q.l + p.getOffsetX())), u = ((q.r - q.l));\n            if (p.isVertical()) {\n                var v = p.getAlignment();\n                if (((v === \"center\"))) {\n                    t += ((((u - r.x)) / 2));\n                }\n                 else if (((((v === \"right\")) !== h.isRTL()))) {\n                    t += ((u - r.x));\n                }\n                \n            ;\n            ;\n            }\n             else if (((((p.getPosition() === \"right\")) !== h.isRTL()))) {\n                t += u;\n            }\n             else t -= r.x;\n            \n        ;\n        ;\n            return new i(s, ((t + r.x)), ((s + r.y)), t, \"viewport\");\n        }\n    };\n    e.exports = n;\n});\n__d(\"ContextualLayerAutoFlip\", [\"ContextualLayerDimensions\",\"DOM\",\"Vector\",\"arrayContains\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"ContextualLayerDimensions\"), h = b(\"DOM\"), i = b(\"Vector\"), j = b(\"arrayContains\"), k = b(\"copyProperties\");\n    function l(m) {\n        this._layer = m;\n    };\n;\n    k(l.prototype, {\n        _subscription: null,\n        enable: function() {\n            this._subscription = this._layer.subscribe(\"adjust\", this._adjustOrientation.bind(this));\n            if (this._layer.isShown()) {\n                this._layer.updatePosition();\n            }\n        ;\n        ;\n        },\n        disable: function() {\n            this._subscription.unsubscribe();\n            this._subscription = null;\n            if (this._layer.isShown()) {\n                this._layer.updatePosition();\n            }\n        ;\n        ;\n        },\n        _adjustOrientation: function(m, n) {\n            var o = this._getValidPositions(n);\n            if (!o.length) {\n                n.invalidate();\n                return;\n            }\n        ;\n        ;\n            var p = g.getViewportRect(this._layer), q = this._getValidAlignments(n), r, s, t;\n            for (r = 0; ((r < q.length)); r++) {\n                n.setAlignment(q[r]);\n                for (s = 0; ((s < o.length)); s++) {\n                    n.setPosition(o[s]);\n                    t = g.getLayerRect(this._layer, n);\n                    if (p.contains(t)) {\n                        return;\n                    }\n                ;\n                ;\n                };\n            ;\n            };\n        ;\n            n.setPosition(((j(o, \"below\") ? \"below\" : o[0])));\n            for (r = 0; ((r < q.length)); r++) {\n                n.setAlignment(q[r]);\n                t = g.getLayerRect(this._layer, n);\n                if (((((t.l >= p.l)) && ((t.r <= p.r))))) {\n                    return;\n                }\n            ;\n            ;\n            };\n        ;\n            n.setAlignment(q[0]);\n        },\n        _getValidPositions: function(m) {\n            var n = [m.getPosition(),m.getOppositePosition(),], o = this._layer.getContextScrollParent();\n            if (((((o === window)) || ((o === h.getDocumentScrollElement()))))) {\n                return n;\n            }\n        ;\n        ;\n            var p = this._layer.getContext(), q = i.getElementPosition(o, \"viewport\").y, r = i.getElementPosition(p, \"viewport\").y;\n            if (m.isVertical()) {\n                return n.filter(function(t) {\n                    if (((t === \"above\"))) {\n                        return ((r >= q));\n                    }\n                     else {\n                        var u = ((q + o.offsetHeight)), v = ((r + p.offsetHeight));\n                        return ((v <= u));\n                    }\n                ;\n                ;\n                });\n            }\n             else {\n                var s = ((q + o.offsetHeight));\n                if (((((r >= q)) && ((((r + p.offsetHeight)) <= s))))) {\n                    return n;\n                }\n                 else return []\n            ;\n            }\n        ;\n        ;\n        },\n        _getValidAlignments: function(m) {\n            var n = [\"left\",\"right\",\"center\",], o = m.getAlignment(), p = n.indexOf(o);\n            if (((p > 0))) {\n                n.splice(p, 1);\n                n.unshift(o);\n            }\n        ;\n        ;\n            return n;\n        }\n    });\n    e.exports = l;\n});\n__d(\"Tooltip\", [\"JSBNG__Event\",\"AsyncRequest\",\"ContextualLayer\",\"ContextualLayerAutoFlip\",\"CSS\",\"DataStore\",\"DOM\",\"Style\",\"URI\",\"copyProperties\",\"emptyFunction\",\"cx\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"AsyncRequest\"), i = b(\"ContextualLayer\"), j = b(\"ContextualLayerAutoFlip\"), k = b(\"CSS\"), l = b(\"DataStore\"), m = b(\"DOM\"), n = b(\"Style\"), o = b(\"URI\"), p = b(\"copyProperties\"), q = b(\"emptyFunction\"), r = b(\"cx\"), s = b(\"tx\"), t = null, u = null, v = null, w = [], x;\n    function y() {\n        if (!u) {\n            v = m.create(\"div\", {\n                className: \"tooltipContent\"\n            });\n            var fa = m.create(\"i\", {\n                className: \"arrow\"\n            }), ga = m.create(\"div\", {\n                className: \"uiTooltipX\"\n            }, [v,fa,]);\n            u = new i({\n            }, ga);\n            u.shouldSetARIAProperties(false);\n            u.enableBehavior(j);\n        }\n    ;\n    ;\n    };\n;\n    function z(fa) {\n        return p({\n            JSBNG__content: fa.getAttribute(\"aria-label\"),\n            position: ((fa.getAttribute(\"data-tooltip-position\") || \"above\")),\n            alignH: ((fa.getAttribute(\"data-tooltip-alignh\") || \"left\"))\n        }, l.get(fa, \"tooltip\"));\n    };\n;\n    function aa(fa, ga) {\n        var ha = z(fa);\n        l.set(fa, \"tooltip\", {\n            JSBNG__content: ((ga.JSBNG__content || ha.JSBNG__content)),\n            position: ((ga.position || ha.position)),\n            alignH: ((ga.alignH || ha.alignH)),\n            suspend: ((ga.suspend || ha.suspend))\n        });\n        fa.setAttribute(\"data-hover\", \"tooltip\");\n    };\n;\n    function ba(fa, ga) {\n        ea.set(fa, \"Loading...\");\n        new h(ga).setHandler(function(ha) {\n            ea.set(fa, ha.getPayload());\n        }).setErrorHandler(q).send();\n    };\n;\n    var ca = /(\\r\\n|[\\r\\n])/;\n    function da(fa) {\n        return fa.split(ca).map(function(ga) {\n            return ((ca.test(ga) ? m.create(\"br\") : ga));\n        });\n    };\n;\n    var ea = {\n        process: function(fa, ga) {\n            if (!m.contains(fa, ga)) {\n                return;\n            }\n        ;\n        ;\n            if (((((fa !== t)) && !fa.getAttribute(\"data-tooltip-suspend\")))) {\n                var ha = fa.getAttribute(\"data-tooltip-uri\");\n                if (ha) {\n                    fa.removeAttribute(\"data-tooltip-uri\");\n                    ba(fa, ha);\n                }\n            ;\n            ;\n                ea.show(fa);\n            }\n        ;\n        ;\n        },\n        remove: function(fa) {\n            l.remove(fa, \"tooltip\");\n            fa.removeAttribute(\"data-hover\");\n            fa.removeAttribute(\"data-tooltip-position\");\n            fa.removeAttribute(\"data-tooltip-alignh\");\n            ((((fa === t)) && ea.hide()));\n        },\n        suspend: function(fa) {\n            fa.setAttribute(\"data-tooltip-suspend\", true);\n            ((((fa === t)) && ea.hide()));\n        },\n        unsuspend: function(fa) {\n            fa.removeAttribute(\"data-tooltip-suspend\");\n        },\n        hide: function() {\n            if (t) {\n                u.hide();\n                t = null;\n                while (w.length) {\n                    w.pop().remove();\n                ;\n                };\n            ;\n            }\n        ;\n        ;\n        },\n        set: function(fa, ga, ha, ia) {\n            if (((ha || ia))) {\n                aa(fa, {\n                    position: ha,\n                    alignH: ia\n                });\n            }\n        ;\n        ;\n            if (((ga instanceof o))) {\n                if (((fa === t))) {\n                    ba(fa, ga);\n                }\n                 else fa.setAttribute(\"data-tooltip-uri\", ga);\n            ;\n            ;\n            }\n             else {\n                if (((typeof ga !== \"string\"))) {\n                    ga = m.create(\"div\", {\n                    }, ga);\n                    fa.setAttribute(\"aria-label\", m.getText(ga));\n                }\n                 else fa.setAttribute(\"aria-label\", ga);\n            ;\n            ;\n                aa(fa, {\n                    JSBNG__content: ga\n                });\n                ((((fa === t)) && ea.show(fa)));\n            }\n        ;\n        ;\n        },\n        show: function(fa) {\n            y();\n            ea.hide();\n            var ga = z(fa);\n            if (!ga.JSBNG__content) {\n                return;\n            }\n        ;\n        ;\n            var ha = 0, ia = 0;\n            if (((((ga.position === \"left\")) || ((ga.position === \"right\"))))) {\n                x = ((x || k.hasClass(JSBNG__document.body, \"_6nw\")));\n                var ja = ((x ? 28 : 20));\n                ia = ((((fa.offsetHeight - ja)) / 2));\n            }\n             else if (((ga.alignH !== \"center\"))) {\n                var ka = fa.offsetWidth;\n                if (((ka < 18))) {\n                    ha = ((((((ka - 18)) / 2)) * ((((ga.alignH === \"right\")) ? -1 : 1))));\n                }\n            ;\n            ;\n            }\n            \n        ;\n        ;\n            u.setContext(fa).setOffsetX(ha).setOffsetY(ia).setPosition(ga.position).setAlignment(ga.alignH);\n            if (((typeof ga.JSBNG__content === \"string\"))) {\n                k.addClass(u.getRoot(), \"invisible_elem\");\n                var la = m.create(\"span\", {\n                }, da(ga.JSBNG__content)), ma = m.create(\"div\", {\n                    className: \"tooltipText\"\n                }, la);\n                m.setContent(v, ma);\n                u.show();\n                var na;\n                if (ma.getClientRects) {\n                    var oa = ma.getClientRects()[0];\n                    if (oa) {\n                        na = Math.round(((oa.right - oa.left)));\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n                if (!na) {\n                    na = ma.offsetWidth;\n                }\n            ;\n            ;\n                if (((na < la.offsetWidth))) {\n                    k.addClass(ma, \"tooltipWrap\");\n                    u.updatePosition();\n                }\n            ;\n            ;\n                k.removeClass(u.getRoot(), \"invisible_elem\");\n            }\n             else {\n                m.setContent(v, ga.JSBNG__content);\n                u.show();\n            }\n        ;\n        ;\n            var pa = function(ra) {\n                if (!m.contains(t, ra.getTarget())) {\n                    ea.hide();\n                }\n            ;\n            ;\n            };\n            w.push(g.listen(JSBNG__document.documentElement, \"mouseover\", pa), g.listen(JSBNG__document.documentElement, \"focusin\", pa));\n            var qa = n.getScrollParent(fa);\n            if (((qa !== window))) {\n                w.push(g.listen(qa, \"JSBNG__scroll\", ea.hide));\n            }\n        ;\n        ;\n            w.push(g.listen(fa, \"click\", ea.hide));\n            t = fa;\n        }\n    };\n    g.listen(window, \"JSBNG__scroll\", ea.hide);\n    e.exports = ea;\n});\n__d(\"SelectorDeprecated\", [\"JSBNG__Event\",\"Arbiter\",\"Button\",\"ContextualLayer\",\"CSS\",\"DataStore\",\"DOM\",\"Focus\",\"HTML\",\"Keys\",\"KeyStatus\",\"MenuDeprecated\",\"Parent\",\"Style\",\"Toggler\",\"Tooltip\",\"Vector\",\"arrayContains\",\"copyProperties\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"Arbiter\"), i = b(\"Button\"), j = b(\"ContextualLayer\"), k = b(\"CSS\"), l = b(\"DataStore\"), m = b(\"DOM\"), n = b(\"Focus\"), o = b(\"HTML\"), p = b(\"Keys\"), q = b(\"KeyStatus\"), r = b(\"MenuDeprecated\"), s = b(\"Parent\"), t = b(\"Style\"), u = b(\"Toggler\"), v = b(\"Tooltip\"), w = b(\"Vector\"), x = b(\"arrayContains\"), y = b(\"copyProperties\"), z = b(\"emptyFunction\"), aa, ba, ca = [], da;\n    function ea(pa) {\n        return s.byClass(pa, \"uiSelector\");\n    };\n;\n    function fa(pa) {\n        return s.byClass(pa, \"uiSelectorButton\");\n    };\n;\n    function ga() {\n        if (!ba) {\n            ba = new j({\n                position: \"below\"\n            }, m.create(\"div\"));\n            k.addClass(ba.getRoot(), \"uiSelectorContextualLayer\");\n        }\n    ;\n    ;\n        return ba;\n    };\n;\n    function ha(pa) {\n        return m.scry(pa, \"select\")[0];\n    };\n;\n    function ia(pa) {\n        return m.JSBNG__find(pa, \"div.uiSelectorMenuWrapper\");\n    };\n;\n    function ja() {\n        ja = z;\n        r.subscribe(\"select\", function(pa, qa) {\n            if (((((!aa || !qa)) || ((qa.menu !== oa.getSelectorMenu(aa)))))) {\n                return;\n            }\n        ;\n        ;\n            var ra = ka(aa), sa = la(qa.item);\n            if (sa) {\n                var ta = aa, ua = oa.isOptionSelected(qa.item), va = oa.inform(\"select\", {\n                    selector: ta,\n                    option: qa.item,\n                    clone: da\n                });\n                if (((va === false))) {\n                    return;\n                }\n            ;\n            ;\n                if (((ra || !ua))) {\n                    oa.setSelected(ta, oa.getOptionValue(qa.item), !ua);\n                    oa.inform(\"toggle\", {\n                        selector: ta,\n                        option: qa.item\n                    });\n                    oa.inform(\"change\", {\n                        selector: ta\n                    });\n                    h.inform(\"Form/change\", {\n                        node: ta\n                    });\n                    if (ma(ta)) {\n                        l.set(ta, \"dirty\", true);\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            if (((!ra || !sa))) {\n                ((aa && oa.toggle(aa)));\n            }\n        ;\n        ;\n        });\n    };\n;\n    function ka(pa) {\n        return !!pa.getAttribute(\"data-multiple\");\n    };\n;\n    function la(pa) {\n        return k.hasClass(pa, \"uiSelectorOption\");\n    };\n;\n    function ma(pa) {\n        return !!pa.getAttribute(\"data-autosubmit\");\n    };\n;\n    var na = function() {\n        na = z;\n        var pa = {\n            keydown: function(JSBNG__event) {\n                var qa = JSBNG__event.getTarget();\n                if (m.isInputNode(qa)) {\n                    return;\n                }\n            ;\n            ;\n                switch (g.getKeyCode(JSBNG__event)) {\n                  case p.DOWN:\n                \n                  case p.SPACE:\n                \n                  case p.UP:\n                    if (fa(qa)) {\n                        var ra = ea(qa);\n                        oa.toggle(ra);\n                        return false;\n                    }\n                ;\n                ;\n                    break;\n                  case p.ESC:\n                    if (aa) {\n                        var sa = oa.getSelectorButton(aa);\n                        oa.toggle(aa);\n                        ((sa && n.set(sa)));\n                        return false;\n                    }\n                ;\n                ;\n                    break;\n                };\n            ;\n            },\n            mouseover: function(JSBNG__event) {\n                var qa = s.byAttribute(JSBNG__event.getTarget(), \"ajaxify\");\n                if (((qa && k.hasClass(qa, \"uiSelectorButton\")))) {\n                    oa.loadMenu(ea(qa));\n                }\n            ;\n            ;\n            }\n        };\n        g.listen(JSBNG__document.body, pa);\n    };\n    u.subscribe([\"show\",\"hide\",], function(pa, qa) {\n        var ra = ea(qa.getActive());\n        if (ra) {\n            na();\n            ja();\n            var sa = oa.getSelectorButton(ra), ta = oa.getSelectorMenu(ra), ua = ((pa === \"show\"));\n            sa.setAttribute(\"aria-expanded\", ((ua ? \"true\" : \"false\")));\n            if (ua) {\n                aa = ra;\n                if (k.hasClass(sa, \"uiButtonDisabled\")) {\n                    oa.setEnabled(ra, false);\n                    return false;\n                }\n            ;\n            ;\n                ta = ((ta || oa.loadMenu(ra)));\n                var va = t.getScrollParent(ra), wa = ((((va !== window)) && ((va !== m.getDocumentScrollElement()))));\n                if (((wa || k.hasClass(ra, \"uiSelectorUseLayer\")))) {\n                    if (wa) {\n                        ca.push(g.listen(va, \"JSBNG__scroll\", function() {\n                            qa.hide();\n                        }));\n                    }\n                ;\n                ;\n                    da = m.create(\"div\", {\n                        className: ra.className\n                    });\n                    k.addClass(da, \"invisible_elem\");\n                    w.getElementDimensions(ra).setElementDimensions(da);\n                    m.replace(ra, da);\n                    var xa = k.hasClass(ra, \"uiSelectorRight\"), ya = k.hasClass(ra, \"uiSelectorBottomUp\");\n                    ga().setContext(da).setContent(ra).setPosition(((ya ? \"above\" : \"below\"))).setAlignment(((xa ? \"right\" : \"left\"))).show();\n                }\n            ;\n            ;\n                r.register(ta);\n                if (q.isKeyDown()) {\n                    var za = r.getCheckedItems(ta);\n                    if (!za.length) {\n                        za = r.getEnabledItems(ta);\n                    }\n                ;\n                ;\n                    r.focusItem(za[0]);\n                }\n            ;\n            ;\n            }\n             else {\n                aa = null;\n                if (da) {\n                    while (ca.length) {\n                        ca.pop().remove();\n                    ;\n                    };\n                ;\n                    m.replace(da, ra);\n                    ga().hide();\n                    da = null;\n                }\n            ;\n            ;\n                ((ta && r.unregister(ta)));\n                if (((ma(ra) && l.get(ra, \"dirty\")))) {\n                    var ab = m.scry(ra, \"input.submitButton\")[0];\n                    ((ab && ab.click()));\n                    l.remove(ra, \"dirty\");\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            k.conditionClass(oa.getSelectorButton(ra), \"selected\", ua);\n            oa.inform(((ua ? \"open\" : \"close\")), {\n                selector: ra,\n                clone: da\n            });\n        }\n    ;\n    ;\n    });\n    var oa = y(new h(), {\n        attachMenu: function(pa, qa, ra) {\n            pa = ea(pa);\n            if (pa) {\n                ((aa && r.unregister(oa.getSelectorMenu(aa))));\n                m.setContent(ia(pa), qa);\n                ((aa && r.register(oa.getSelectorMenu(pa))));\n                ((da && ga().updatePosition()));\n                if (ra) {\n                    var sa = pa.getAttribute(\"data-name\");\n                    ((sa && ra.setAttribute(\"JSBNG__name\", sa)));\n                    if (!ka(pa)) {\n                        ra.setAttribute(\"multiple\", false);\n                    }\n                ;\n                ;\n                    var ta = ha(pa);\n                    if (ta) {\n                        m.replace(ta, ra);\n                    }\n                     else m.insertAfter(pa.firstChild, ra);\n                ;\n                ;\n                }\n            ;\n            ;\n                return true;\n            }\n        ;\n        ;\n        },\n        getOption: function(pa, qa) {\n            var ra = oa.getOptions(pa), sa = ra.length;\n            while (sa--) {\n                if (((qa === oa.getOptionValue(ra[sa])))) {\n                    return ra[sa];\n                }\n            ;\n            ;\n            };\n        ;\n            return null;\n        },\n        getOptions: function(pa) {\n            var qa = r.getItems(oa.getSelectorMenu(pa));\n            return qa.filter(la);\n        },\n        getEnabledOptions: function(pa) {\n            var qa = r.getEnabledItems(oa.getSelectorMenu(pa));\n            return qa.filter(la);\n        },\n        getSelectedOptions: function(pa) {\n            return r.getCheckedItems(oa.getSelectorMenu(pa));\n        },\n        getOptionText: function(pa) {\n            return r.getItemLabel(pa);\n        },\n        getOptionValue: function(pa) {\n            var qa = ea(pa), ra = ha(qa), sa = oa.getOptions(qa).indexOf(pa);\n            return ((((sa >= 0)) ? ra.options[((sa + 1))].value : \"\"));\n        },\n        getSelectorButton: function(pa) {\n            return m.JSBNG__find(pa, \"a.uiSelectorButton\");\n        },\n        getSelectorMenu: function(pa) {\n            return m.scry(pa, \"div.uiSelectorMenu\")[0];\n        },\n        getValue: function(pa) {\n            var qa = ha(pa);\n            if (!qa) {\n                return null;\n            }\n        ;\n        ;\n            if (!ka(pa)) {\n                return qa.value;\n            }\n        ;\n        ;\n            var ra = [], sa = qa.options;\n            for (var ta = 1, ua = sa.length; ((ta < ua)); ta++) {\n                if (sa[ta].selected) {\n                    ra.push(sa[ta].value);\n                }\n            ;\n            ;\n            };\n        ;\n            return ra;\n        },\n        isOptionSelected: function(pa) {\n            return r.isItemChecked(pa);\n        },\n        listen: function(pa, qa, ra) {\n            return this.subscribe(qa, function(sa, ta) {\n                if (((ta.selector === pa))) {\n                    return ra(ta, sa);\n                }\n            ;\n            ;\n            });\n        },\n        loadMenu: function(pa) {\n            var qa = oa.getSelectorMenu(pa);\n            if (!qa) {\n                var ra = oa.getSelectorButton(pa), sa = ra.getAttribute(\"ajaxify\");\n                if (sa) {\n                    d([\"AsyncRequest\",], function(ua) {\n                        ua.bootstrap(sa, ra);\n                    });\n                    var ta = o(((((((((((((\"\\u003Cdiv class=\\\"uiSelectorMenuWrapper uiToggleFlyout\\\"\\u003E\" + \"\\u003Cdiv class=\\\"uiMenu uiSelectorMenu loading\\\"\\u003E\")) + \"\\u003Cul class=\\\"uiMenuInner\\\"\\u003E\")) + \"\\u003Cli\\u003E\\u003Cspan\\u003E\\u003C/span\\u003E\\u003C/li\\u003E\")) + \"\\u003C/ul\\u003E\")) + \"\\u003C/div\\u003E\")) + \"\\u003C/div\\u003E\")));\n                    m.appendContent(ra.parentNode, ta);\n                    qa = oa.getSelectorMenu(pa);\n                    ra.removeAttribute(\"JSBNG__onmouseover\");\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            return qa;\n        },\n        setButtonLabel: function(pa, qa) {\n            var ra = oa.getSelectorButton(pa), sa = parseInt(ra.getAttribute(\"data-length\"), 10);\n            qa = ((((qa || ra.getAttribute(\"data-label\"))) || \"\"));\n            i.setLabel(ra, qa);\n            if (((typeof qa === \"string\"))) {\n                k.conditionClass(ra, \"uiSelectorBigButtonLabel\", ((qa.length > sa)));\n                if (((sa && ((qa.length > sa))))) {\n                    ra.setAttribute(\"title\", qa);\n                }\n                 else ra.removeAttribute(\"title\");\n            ;\n            ;\n            }\n        ;\n        ;\n        },\n        setButtonTooltip: function(pa, qa) {\n            var ra = oa.getSelectorButton(pa), sa = s.byTag(ra, \"a\");\n            ((sa && v.set(sa, ((((qa || ra.getAttribute(\"data-tooltip\"))) || \"\")))));\n        },\n        updateButtonARIALabel: function(pa, qa) {\n            var ra = oa.getSelectorButton(pa), sa = s.byTag(ra, \"a\");\n            if (sa) {\n                var ta = ra.getAttribute(\"data-ariaprefix\");\n                if (ta) {\n                    ra.setAttribute(\"aria-label\", ((((ta + \": \")) + qa)));\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n        },\n        setEnabled: function(pa, qa) {\n            if (((((!qa && aa)) && ((ea(pa) === aa))))) {\n                oa.toggle(pa);\n            }\n        ;\n        ;\n            i.setEnabled(oa.getSelectorButton(pa), qa);\n        },\n        setOptionEnabled: function(pa, qa) {\n            r.setItemEnabled(pa, qa);\n        },\n        setSelected: function(pa, qa, ra) {\n            ra = ((ra !== false));\n            var sa = oa.getOption(pa, qa);\n            if (!sa) {\n                return;\n            }\n        ;\n        ;\n            var ta = oa.isOptionSelected(sa);\n            if (((ra !== ta))) {\n                if (((!ka(pa) && !ta))) {\n                    var ua = oa.getSelectedOptions(pa)[0];\n                    ((ua && r.toggleItem(ua)));\n                }\n            ;\n            ;\n                r.toggleItem(sa);\n            }\n        ;\n        ;\n            oa.updateSelector(pa);\n        },\n        toggle: function(pa) {\n            u.toggle(m.scry(ea(pa), \"div.wrap\")[0]);\n        },\n        updateSelector: function(pa) {\n            var qa = oa.getOptions(pa), ra = oa.getSelectedOptions(pa), sa = ha(pa).options, ta = [], ua = [];\n            for (var va = 0, wa = qa.length; ((va < wa)); va++) {\n                var xa = x(ra, qa[va]);\n                sa[((va + 1))].selected = xa;\n                if (xa) {\n                    var ya = oa.getOptionText(qa[va]);\n                    ta.push(ya);\n                    ua.push(((qa[va].getAttribute(\"data-tooltip\") || ya)));\n                }\n            ;\n            ;\n            };\n        ;\n            sa[0].selected = !ra.length;\n            var za = k.hasClass(pa, \"uiSelectorDynamicLabel\"), ab = k.hasClass(pa, \"uiSelectorDynamicTooltip\");\n            if (((za || ab))) {\n                var bb = \"\";\n                if (ka(pa)) {\n                    var cb = oa.getSelectorButton(pa);\n                    bb = ((cb.getAttribute(\"data-delimiter\") || \", \"));\n                }\n            ;\n            ;\n                ta = ta.join(bb);\n                ua = ua.join(bb);\n                if (za) {\n                    oa.setButtonLabel(pa, ta);\n                    oa.updateButtonARIALabel(pa, ta);\n                }\n            ;\n            ;\n                ((ab && oa.setButtonTooltip(pa, ua)));\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = oa;\n});\n__d(\"SubscriptionsHandler\", [\"JSLogger\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSLogger\"), h = b(\"copyProperties\"), i = g.create(\"subscriptions_handler\");\n    function j(k) {\n        this._name = ((k || \"unnamed\"));\n        this._subscriptions = [];\n    };\n;\n    h(j.prototype, {\n        addSubscriptions: function() {\n            if (this._subscriptions) {\n                Array.prototype.push.apply(this._subscriptions, arguments);\n            }\n             else {\n                i.warn(((this._name + \".subscribe_while_released\")));\n                for (var k = 0, l = arguments.length; ((k < l)); k++) {\n                    this._unsubscribe(arguments[k]);\n                ;\n                };\n            ;\n            }\n        ;\n        ;\n        },\n        engage: function() {\n            this._subscriptions = ((this._subscriptions || []));\n        },\n        release: function() {\n            if (this._subscriptions) {\n                this._subscriptions.forEach(this._unsubscribe.bind(this));\n            }\n        ;\n        ;\n            this._subscriptions = null;\n        },\n        _unsubscribe: function(k) {\n            if (k.remove) {\n                k.remove();\n            }\n             else if (k.reset) {\n                k.reset();\n            }\n             else if (k.unsubscribe) {\n                k.unsubscribe();\n            }\n             else i.error(((this._name + \".invalid\")), k);\n            \n            \n        ;\n        ;\n        }\n    });\n    e.exports = j;\n});\n__d(\"UserActivity\", [\"Arbiter\",\"JSBNG__Event\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"JSBNG__Event\"), i = 5000, j = 500, k = -5, l = JSBNG__Date.now(), m = l, n = {\n        subscribeOnce: function(p) {\n            var q = n.subscribe(function() {\n                n.unsubscribe(q);\n                p();\n            });\n        },\n        subscribe: function(p) {\n            return g.subscribe(\"useractivity/activity\", p);\n        },\n        unsubscribe: function(p) {\n            p.unsubscribe();\n        },\n        isActive: function(p) {\n            return ((((new JSBNG__Date() - l)) < ((p || i))));\n        },\n        getLastInformTime: function() {\n            return m;\n        }\n    };\n    function o(JSBNG__event) {\n        l = JSBNG__Date.now();\n        var p = ((l - m));\n        if (((p > j))) {\n            m = l;\n            g.inform(\"useractivity/activity\", {\n                JSBNG__event: JSBNG__event,\n                idleness: p,\n                last_inform: m\n            });\n        }\n         else if (((p < k))) {\n            m = l;\n        }\n        \n    ;\n    ;\n    };\n;\n    h.listen(window, \"JSBNG__scroll\", o);\n    h.listen(window, \"JSBNG__focus\", o);\n    h.listen(JSBNG__document.documentElement, {\n        DOMMouseScroll: o,\n        mousewheel: o,\n        keydown: o,\n        mouseover: o,\n        mousemove: o,\n        click: o\n    });\n    g.subscribe(\"Event/stop\", function(p, q) {\n        o(q.JSBNG__event);\n    });\n    e.exports = n;\n});\n__d(\"enforceMaxLength\", [\"JSBNG__Event\",\"function-extensions\",\"DOM\",\"Input\",\"InputSelection\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\");\n    b(\"function-extensions\");\n    var h = b(\"DOM\"), i = b(\"Input\"), j = b(\"InputSelection\"), k = function(n, o) {\n        var p = i.getValue(n), q = p.length, r = ((q - o));\n        if (((r > 0))) {\n            var s, t;\n            try {\n                s = j.get(n);\n                t = s.end;\n            } catch (u) {\n                s = null;\n                t = 0;\n            };\n        ;\n            if (((t >= r))) {\n                q = t;\n            }\n        ;\n        ;\n            var v = ((q - r));\n            if (((v && ((((p.charCodeAt(((v - 1))) & 64512)) === 55296))))) {\n                v--;\n            }\n        ;\n        ;\n            t = Math.min(t, v);\n            i.setValue(n, ((p.slice(0, v) + p.slice(q))));\n            if (s) {\n                j.set(n, Math.min(s.start, t), t);\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n    }, l = function(JSBNG__event) {\n        var n = JSBNG__event.getTarget(), o = ((n.getAttribute && parseInt(n.getAttribute(\"maxlength\"), 10)));\n        if (((((o > 0)) && h.isNodeOfType(n, [\"input\",\"textarea\",])))) {\n            k.bind(null, n, o).defer();\n        }\n    ;\n    ;\n    }, m = ((((\"maxLength\" in h.create(\"input\"))) && ((\"maxLength\" in h.create(\"textarea\")))));\n    if (!m) {\n        g.listen(JSBNG__document.documentElement, {\n            keydown: l,\n            paste: l\n        });\n    }\n;\n;\n    e.exports = k;\n});\n__d(\"guid\", [], function(a, b, c, d, e, f) {\n    function g() {\n        return ((\"f\" + ((Math.JSBNG__random() * ((1 << 30)))).toString(16).replace(\".\", \"\")));\n    };\n;\n    e.exports = g;\n});\n__d(\"reportData\", [\"EagleEye\",\"userAction\",], function(a, b, c, d, e, f) {\n    var g = b(\"EagleEye\"), h = b(\"userAction\");\n    function i(j, k) {\n        k = ((k || {\n        }));\n        var l = {\n            ft: ((k.ft || {\n            })),\n            gt: ((k.gt || {\n            }))\n        }, m = \"-\", n = a.ArbiterMonitor, o = (((!!n) ? n.getActFields() : [])), p = (((!n) ? \"r\" : \"a\")), q = [JSBNG__Date.now(),h.getCurrentUECount(),m,j,m,m,p,((a.URI ? a.URI.getRequestURI(true, true).getUnqualifiedURI().toString() : ((((JSBNG__location.pathname + JSBNG__location.search)) + JSBNG__location.hash)))),l,0,0,0,0,].concat(o);\n        g.log(\"act\", q);\n    };\n;\n    e.exports = i;\n});\n__d(\"NetEgo\", [\"Arbiter\",\"CSS\",\"DOM\",\"URI\",\"ge\",\"Animation\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"CSS\"), i = b(\"DOM\"), j = b(\"URI\"), k = b(\"ge\"), l = b(\"Animation\"), m = {\n        setup: function(n) {\n            g.subscribe([\"page/liked\",\"FriendRequest/sending\",], function(o, p) {\n                if (((((n == p.id)) || ((n == p.uid))))) {\n                    var q = k(JSBNG__document.body, \".ego_unit_container\");\n                    if (q) {\n                        var r = i.scry(q, \".ego_unit\"), s = r.length;\n                        for (var t = 0; ((t < s)); t++) {\n                            var u = r[t].getAttribute(\"data-ego-fbid\");\n                            if (((((u == p.id)) || ((u == p.uid))))) {\n                                var v = i.JSBNG__find(r[t], \".ego_action a\");\n                                if (v) {\n                                    v.click();\n                                }\n                            ;\n                            ;\n                                break;\n                            }\n                        ;\n                        ;\n                        };\n                    ;\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n            });\n        },\n        updateXids: function(n, o) {\n            if (((((n.length == 0)) && ((o.length == 0))))) {\n                return;\n            }\n        ;\n        ;\n            var p = function(z) {\n                return function(aa) {\n                    var ba = aa.getAttribute(z);\n                    if (!ba) {\n                        return false;\n                    }\n                ;\n                ;\n                    var ca = new j(ba).getQueryData();\n                    return !!ca.xids;\n                };\n            }, q = i.scry(JSBNG__document.body, \".ego_unit a\");\n            q = q.filter(p(\"ajaxify\"));\n            if (((q.length == 0))) {\n                return;\n            }\n        ;\n        ;\n            var r = new j(q[0].getAttribute(\"ajaxify\")), s = r.getQueryData();\n            if (!s.xids) {\n                return;\n            }\n        ;\n        ;\n            try {\n                var u = JSON.parse(s.xids);\n            } catch (t) {\n                return;\n            };\n        ;\n            for (var v = 0; ((v < n.length)); ++v) {\n                delete u[n[v]];\n            ;\n            };\n        ;\n            for (v = 0; ((v < o.length)); ++v) {\n                u[o[v]] = 1;\n            ;\n            };\n        ;\n            var w = JSON.stringify(u), x = function(z, aa) {\n                r = new j(z.getAttribute(aa));\n                s = r.getQueryData();\n                s.xids = w;\n                r.setQueryData(s);\n                z.setAttribute(aa, r.toString());\n            };\n            for (v = 0; ((v < q.length)); ++v) {\n                x(q[v], \"ajaxify\");\n            ;\n            };\n        ;\n            var y = i.scry(JSBNG__document.body, \".ego_unit form\");\n            y = y.filter(p(\"action\"));\n            for (v = 0; ((v < y.length)); ++v) {\n                x(y[v], \"action\");\n            ;\n            };\n        ;\n        },\n        replaceUnit: function(n, o, p, q) {\n            var r = i.insertAfter(n, o);\n            r.forEach(h.hide);\n            if (((((q !== undefined)) && ((q !== null))))) {\n                (function() {\n                    m._replaceUnitFadeout(n, r, p);\n                }).defer(q);\n            }\n             else m._replaceUnitFadeout(n, r, p);\n        ;\n        ;\n        },\n        _replaceUnitFadeout: function(n, o, p) {\n            if (p) {\n                new l(n).from(\"opacity\", 1).to(\"opacity\", 0).duration(p).checkpoint(1, function() {\n                    m._replaceUnitElement(n, o);\n                }).go();\n            }\n             else m._replaceUnitElement(n, o);\n        ;\n        ;\n        },\n        _replaceUnitElement: function(n, o) {\n            i.remove(n);\n            o.forEach(h.show);\n            g.inform(\"netego_replacedUnit\");\n            m.clearHeader();\n        },\n        clearHeader: function() {\n            var n = i.scry(JSBNG__document.body, \".ego_column\"), o = [];\n            for (var p = 0; ((p < n.length)); ++p) {\n                o = o.concat(i.scry(n[p], \".uiHeader\"));\n            ;\n            };\n        ;\n            for (p = 0; ((p < o.length)); ++p) {\n                var q = o[p].nextSibling;\n                if (((!q || ((q.childNodes.length === 0))))) {\n                    i.remove(o[p]);\n                }\n                 else if (((q.childNodes.length === 1))) {\n                    var r = q.childNodes[0];\n                    if (((h.hasClass(r, \"ego_appended_units\") && ((r.childNodes.length === 0))))) {\n                        i.remove(o[p]);\n                    }\n                ;\n                ;\n                }\n                \n            ;\n            ;\n            };\n        ;\n        }\n    };\n    e.exports = m;\n});\n__d(\"ControlledReferer\", [\"JSBNG__Event\",\"URI\",\"UserAgent\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"URI\"), i = b(\"UserAgent\"), j = {\n        useFacebookReferer: function(k, l, m) {\n            var n = false;\n            function o() {\n                if (n) {\n                    return;\n                }\n            ;\n            ;\n                var q = k.contentWindow.JSBNG__location.pathname;\n                if (((((q !== \"/intern/common/referer_frame.php\")) && ((q !== \"/common/referer_frame.php\"))))) {\n                    return;\n                }\n            ;\n            ;\n                n = true;\n                k.contentWindow.JSBNG__document.body.style.margin = 0;\n                l();\n            };\n        ;\n            var p;\n            if (((JSBNG__document.domain !== \"facebook.com\"))) {\n                p = \"/intern/common/referer_frame.php\";\n            }\n             else if (i.JSBNG__opera()) {\n                p = \"/common/referer_frame.php\";\n            }\n             else if (h().isSecure()) {\n                p = \"https://s-static.ak.facebook.com/common/referer_frame.php\";\n            }\n             else p = \"http://static.ak.facebook.com/common/referer_frame.php\";\n            \n            \n        ;\n        ;\n            if (m) {\n                p += ((\"?fb_source=\" + m));\n            }\n        ;\n        ;\n            g.listen(k, \"load\", o);\n            k.src = p;\n        },\n        useFacebookRefererHtml: function(k, l, m) {\n            j.useFacebookReferer(k, function() {\n                k.contentWindow.JSBNG__document.body.innerHTML = l;\n            }, m);\n        }\n    };\n    e.exports = j;\n});\n__d(\"UIIntentionalStreamMessage\", [], function(a, b, c, d, e, f) {\n    var g = {\n        SET_AUTO_INSERT: \"UIIntentionalStream/setAutoInsert\",\n        UPDATE_STREAM: \"UIIntentionalStreamRefresh/updateStream\",\n        REFRESH_STREAM: \"UIIntentionalStreamRefresh/refreshStream\",\n        UPDATE_AUTOREFRESH_CONFIG: \"UIIntentionalStream/updateAutoRefreshConfig\",\n        UPDATE_HTML_CONTENT: \"UIIntentionalStream/updateHtmlContent\",\n        UPDATE_LAST_REFRESH_TIME: \"UIIntentionalStream/updateLastRefreshTime\",\n        INSERT_STORIES: \"UIIntentionalStream/updateLastRefreshTime\",\n        UNLOAD: \"UIIntentionalStream/unload\"\n    };\n    e.exports = g;\n});\n__d(\"UIPagelet\", [\"AjaxPipeRequest\",\"AsyncRequest\",\"DOM\",\"HTML\",\"ScriptPathState\",\"URI\",\"copyProperties\",\"emptyFunction\",\"ge\",], function(a, b, c, d, e, f) {\n    var g = b(\"AjaxPipeRequest\"), h = b(\"AsyncRequest\"), i = b(\"DOM\"), j = b(\"HTML\"), k = b(\"ScriptPathState\"), l = b(\"URI\"), m = b(\"copyProperties\"), n = b(\"emptyFunction\"), o = b(\"ge\");\n    function p(q, r, s) {\n        var t = ((((q && i.isElementNode(q))) ? q.id : q));\n        this._id = ((t || null));\n        this._element = o(((q || i.create(\"div\"))));\n        this._src = ((r || null));\n        this._context_data = ((s || {\n        }));\n        this._data = {\n        };\n        this._handler = n;\n        this._request = null;\n        this._use_ajaxpipe = false;\n        this._is_bundle = true;\n        this._allow_cross_page_transition = false;\n        this._append = false;\n    };\n;\n    p.loadFromEndpoint = function(q, r, s, t) {\n        t = ((t || {\n        }));\n        var u = ((\"/ajax/pagelet/generic.php/\" + q));\n        if (t.intern) {\n            u = ((\"/intern\" + u));\n        }\n    ;\n    ;\n        var v = new l(u.replace(/\\/+/g, \"/\"));\n        if (t.subdomain) {\n            v.setSubdomain(t.subdomain);\n        }\n    ;\n    ;\n        var w = new p(r, v, s).setUseAjaxPipe(t.usePipe).setBundleOption(((t.bundle !== false))).setAppend(t.append).setJSNonBlock(t.jsNonblock).setAutomatic(t.automatic).setDisplayCallback(t.displayCallback).setConstHeight(t.constHeight).setAllowCrossPageTransition(t.crossPage).setFinallyHandler(((t.finallyHandler || n))).setTransportErrorHandler(t.transportErrorHandler);\n        ((t.handler && w.setHandler(t.handler)));\n        w.go();\n        return w;\n    };\n    m(p.prototype, {\n        getElement: function() {\n            return this._element;\n        },\n        setHandler: function(q) {\n            this._handler = q;\n            return this;\n        },\n        go: function(q, r) {\n            if (((((arguments.length >= 2)) || ((typeof q == \"string\"))))) {\n                this._src = q;\n                this._data = ((r || {\n                }));\n            }\n             else if (((arguments.length == 1))) {\n                this._data = q;\n            }\n            \n        ;\n        ;\n            this.refresh();\n            return this;\n        },\n        setAllowCrossPageTransition: function(q) {\n            this._allow_cross_page_transition = q;\n            return this;\n        },\n        setBundleOption: function(q) {\n            this._is_bundle = q;\n            return this;\n        },\n        setTransportErrorHandler: function(q) {\n            this.transportErrorHandler = q;\n            return this;\n        },\n        refresh: function() {\n            if (this._use_ajaxpipe) {\n                k.setIsUIPageletRequest(true);\n                this._request = new g();\n                this._request.setCanvasId(this._id).setAppend(this._append).setConstHeight(this._constHeight).setJSNonBlock(this._jsNonblock).setAutomatic(this._automatic).setDisplayCallback(this._displayCallback).setFinallyHandler(this._finallyHandler);\n            }\n             else {\n                var q = function(t) {\n                    this._request = null;\n                    var u = j(t.getPayload());\n                    if (this._append) {\n                        i.appendContent(this._element, u);\n                    }\n                     else i.setContent(this._element, u);\n                ;\n                ;\n                    this._handler();\n                }.bind(this), r = this._displayCallback;\n                this._request = new h().setMethod(\"GET\").setReadOnly(true).setOption(\"bundle\", this._is_bundle).setHandler(function(t) {\n                    if (r) {\n                        r(q.curry(t));\n                    }\n                     else q(t);\n                ;\n                ;\n                    if (this._finallyHandler) {\n                        this._finallyHandler();\n                    }\n                ;\n                ;\n                });\n                if (this.transportErrorHandler) {\n                    this._request.setTransportErrorHandler(this.transportErrorHandler);\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            var s = {\n            };\n            m(s, this._context_data);\n            m(s, this._data);\n            this._request.setURI(this._src).setAllowCrossPageTransition(this._allow_cross_page_transition).setData({\n                data: JSON.stringify(s)\n            }).send();\n            return this;\n        },\n        cancel: function() {\n            if (this._request) {\n                this._request.abort();\n            }\n        ;\n        ;\n        },\n        setUseAjaxPipe: function(q) {\n            this._use_ajaxpipe = !!q;\n            return this;\n        },\n        setAppend: function(q) {\n            this._append = !!q;\n            return this;\n        },\n        setJSNonBlock: function(q) {\n            this._jsNonblock = !!q;\n            return this;\n        },\n        setAutomatic: function(q) {\n            this._automatic = !!q;\n            return this;\n        },\n        setDisplayCallback: function(q) {\n            this._displayCallback = q;\n            return this;\n        },\n        setConstHeight: function(q) {\n            this._constHeight = !!q;\n            return this;\n        },\n        setFinallyHandler: function(q) {\n            this._finallyHandler = q;\n            return this;\n        }\n    });\n    e.exports = p;\n});\n__d(\"ScrollableArea\", [\"Animation\",\"ArbiterMixin\",\"BrowserSupport\",\"CSS\",\"DataStore\",\"DOM\",\"JSBNG__Event\",\"Parent\",\"Run\",\"SimpleDrag\",\"Style\",\"UserAgent\",\"Vector\",\"copyProperties\",\"throttle\",], function(a, b, c, d, e, f) {\n    var g = b(\"Animation\"), h = b(\"ArbiterMixin\"), i = b(\"BrowserSupport\"), j = b(\"CSS\"), k = b(\"DataStore\"), l = b(\"DOM\"), m = b(\"JSBNG__Event\"), n = b(\"Parent\"), o = b(\"Run\"), p = b(\"SimpleDrag\"), q = b(\"Style\"), r = b(\"UserAgent\"), s = b(\"Vector\"), t = b(\"copyProperties\"), u = b(\"throttle\"), v = 12;\n    function w(x, y) {\n        if (!x) {\n            return;\n        }\n    ;\n    ;\n        y = ((y || {\n        }));\n        this._elem = x;\n        this._wrap = l.JSBNG__find(x, \"div.uiScrollableAreaWrap\");\n        this._body = l.JSBNG__find(this._wrap, \"div.uiScrollableAreaBody\");\n        this._content = l.JSBNG__find(this._body, \"div.uiScrollableAreaContent\");\n        this._track = l.JSBNG__find(x, \"div.uiScrollableAreaTrack\");\n        this._gripper = l.JSBNG__find(this._track, \"div.uiScrollableAreaGripper\");\n        this._options = y;\n        this._throttledComputeHeights = u.withBlocking(this._computeHeights, 250, this);\n        this.throttledAdjustGripper = u.withBlocking(this.adjustGripper, 250, this);\n        this._throttledShowGripperAndShadows = u.withBlocking(this._showGripperAndShadows, 250, this);\n        this._throttledRespondMouseMove = u(this._respondMouseMove, 250, this);\n        this.adjustGripper.bind(this).defer();\n        this._listeners = [m.listen(this._wrap, \"JSBNG__scroll\", this._handleScroll.bind(this)),m.listen(x, \"mousemove\", this._handleMouseMove.bind(this)),m.listen(this._track, \"click\", this._handleClickOnTrack.bind(this)),];\n        if (i.hasPointerEvents()) {\n            this._listeners.push(m.listen(x, \"click\", this._handleClickOnTrack.bind(this)));\n        }\n    ;\n    ;\n        if (((y.fade !== false))) {\n            this._listeners.push(m.listen(x, \"mouseenter\", this._handleMouseEnter.bind(this)), m.listen(x, \"mouseleave\", this._handleMouseLeave.bind(this)), m.listen(x, \"focusin\", this.showScrollbar.bind(this, false)), m.listen(x, \"focusout\", this.hideScrollbar.bind(this)));\n        }\n         else if (i.hasPointerEvents()) {\n            this._listeners.push(m.listen(x, \"mouseleave\", j.removeClass.curry(x, \"uiScrollableAreaTrackOver\")));\n        }\n        \n    ;\n    ;\n        if (((r.webkit() || r.chrome()))) {\n            this._listeners.push(m.listen(x, \"mousedown\", function() {\n                var z = m.listen(window, \"mouseup\", function() {\n                    if (x.scrollLeft) {\n                        x.scrollLeft = 0;\n                    }\n                ;\n                ;\n                    z.remove();\n                });\n            }));\n        }\n         else if (r.firefox()) {\n            this._wrap.JSBNG__addEventListener(\"DOMMouseScroll\", function(JSBNG__event) {\n                ((((JSBNG__event.axis === JSBNG__event.HORIZONTAL_AXIS)) && JSBNG__event.preventDefault()));\n            }, false);\n        }\n        \n    ;\n    ;\n        this.initDrag();\n        k.set(this._elem, \"ScrollableArea\", this);\n        if (!y.persistent) {\n            o.onLeave(this.destroy.bind(this));\n        }\n    ;\n    ;\n        if (((y.shadow !== false))) {\n            j.addClass(this._elem, \"uiScrollableAreaWithShadow\");\n        }\n    ;\n    ;\n    };\n;\n    t(w, {\n        renderDOM: function() {\n            var x = l.create(\"div\", {\n                className: \"uiScrollableAreaContent\"\n            }), y = l.create(\"div\", {\n                className: \"uiScrollableAreaBody\"\n            }, x), z = l.create(\"div\", {\n                className: \"uiScrollableAreaWrap\"\n            }, y), aa = l.create(\"div\", {\n                className: \"uiScrollableArea native\"\n            }, z);\n            return {\n                root: aa,\n                wrap: z,\n                body: y,\n                JSBNG__content: x\n            };\n        },\n        fromNative: function(x, y) {\n            if (((!j.hasClass(x, \"uiScrollableArea\") || !j.hasClass(x, \"native\")))) {\n                return;\n            }\n        ;\n        ;\n            y = ((y || {\n            }));\n            j.removeClass(x, \"native\");\n            var z = l.create(\"div\", {\n                className: \"uiScrollableAreaTrack\"\n            }, l.create(\"div\", {\n                className: \"uiScrollableAreaGripper\"\n            }));\n            if (((y.fade !== false))) {\n                j.addClass(x, \"fade\");\n                j.addClass(z, \"invisible_elem\");\n            }\n             else j.addClass(x, \"nofade\");\n        ;\n        ;\n            l.appendContent(x, z);\n            var aa = new w(x, y);\n            aa.resize();\n            return aa;\n        },\n        getInstance: function(x) {\n            var y = n.byClass(x, \"uiScrollableArea\");\n            return ((y ? k.get(y, \"ScrollableArea\") : null));\n        },\n        poke: function(x) {\n            var y = w.getInstance(x);\n            ((y && y.poke()));\n        }\n    });\n    t(w.prototype, h, {\n        initDrag: function() {\n            var x = i.hasPointerEvents(), y = new p(((x ? this._elem : this._gripper)));\n            y.subscribe(\"start\", function(z, JSBNG__event) {\n                if (!((((JSBNG__event.which && ((JSBNG__event.which === 1)))) || ((JSBNG__event.button && ((JSBNG__event.button === 1))))))) {\n                    return;\n                }\n            ;\n            ;\n                var aa = s.getEventPosition(JSBNG__event, \"viewport\");\n                if (x) {\n                    var ba = this._gripper.getBoundingClientRect();\n                    if (((((((((aa.x < ba.left)) || ((aa.x > ba.right)))) || ((aa.y < ba.JSBNG__top)))) || ((aa.y > ba.bottom))))) {\n                        return false;\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n                this.inform(\"grip_start\");\n                var ca = aa.y, da = this._gripper.offsetTop;\n                j.addClass(this._elem, \"uiScrollableAreaDragging\");\n                var ea = y.subscribe(\"update\", function(ga, JSBNG__event) {\n                    var ha = ((s.getEventPosition(JSBNG__event, \"viewport\").y - ca));\n                    this._throttledComputeHeights();\n                    var ia = ((this._contentHeight - this._containerHeight)), ja = ((da + ha)), ka = ((this._trackHeight - this._gripperHeight));\n                    ja = Math.max(Math.min(ja, ka), 0);\n                    var la = ((((ja / ka)) * ia));\n                    this._wrap.scrollTop = la;\n                }.bind(this)), fa = y.subscribe(\"end\", function() {\n                    y.unsubscribe(ea);\n                    y.unsubscribe(fa);\n                    j.removeClass(this._elem, \"uiScrollableAreaDragging\");\n                    this.inform(\"grip_end\");\n                }.bind(this));\n            }.bind(this));\n        },\n        adjustGripper: function() {\n            if (this._needsGripper()) {\n                q.set(this._gripper, \"height\", ((this._gripperHeight + \"px\")));\n                this._slideGripper();\n            }\n        ;\n        ;\n            this._throttledShowGripperAndShadows();\n            return this;\n        },\n        _computeHeights: function() {\n            this._containerHeight = this._elem.clientHeight;\n            this._contentHeight = this._content.offsetHeight;\n            this._trackHeight = this._track.offsetHeight;\n            this._gripperHeight = Math.max(((((this._containerHeight / this._contentHeight)) * this._trackHeight)), v);\n        },\n        _needsGripper: function() {\n            this._throttledComputeHeights();\n            return ((this._gripperHeight < this._trackHeight));\n        },\n        _slideGripper: function() {\n            var x = ((((this._wrap.scrollTop / ((this._contentHeight - this._containerHeight)))) * ((this._trackHeight - this._gripperHeight))));\n            q.set(this._gripper, \"JSBNG__top\", ((x + \"px\")));\n        },\n        _showGripperAndShadows: function() {\n            j.conditionShow(this._gripper, this._needsGripper());\n            j.conditionClass(this._elem, \"contentBefore\", ((this._wrap.scrollTop > 0)));\n            j.conditionClass(this._elem, \"contentAfter\", !this.isScrolledToBottom());\n        },\n        destroy: function() {\n            this._listeners.forEach(function(x) {\n                x.remove();\n            });\n            this._listeners.length = 0;\n        },\n        _handleClickOnTrack: function(JSBNG__event) {\n            var x = s.getEventPosition(JSBNG__event, \"viewport\"), y = this._gripper.getBoundingClientRect();\n            if (((((x.x < y.right)) && ((x.x > y.left))))) {\n                if (((x.y < y.JSBNG__top))) {\n                    this.setScrollTop(((this.getScrollTop() - this._elem.clientHeight)));\n                }\n                 else if (((x.y > y.bottom))) {\n                    this.setScrollTop(((this.getScrollTop() + this._elem.clientHeight)));\n                }\n                \n            ;\n            ;\n                JSBNG__event.prevent();\n            }\n        ;\n        ;\n        },\n        _handleMouseMove: function(JSBNG__event) {\n            var x = ((this._options.fade !== false));\n            if (((i.hasPointerEvents() || x))) {\n                this._mousePos = s.getEventPosition(JSBNG__event);\n                this._throttledRespondMouseMove();\n            }\n        ;\n        ;\n        },\n        _respondMouseMove: function() {\n            if (!this._mouseOver) {\n                return;\n            }\n        ;\n        ;\n            var x = ((this._options.fade !== false)), y = this._mousePos, z = s.getElementPosition(this._track).x, aa = s.getElementDimensions(this._track).x, ba = Math.abs(((((z + ((aa / 2)))) - y.x)));\n            j.conditionClass(this._elem, \"uiScrollableAreaTrackOver\", ((i.hasPointerEvents() && ((ba <= 10)))));\n            if (x) {\n                if (((ba < 25))) {\n                    this.showScrollbar(false);\n                }\n                 else if (!this._options.no_fade_on_hover) {\n                    this.hideScrollbar();\n                }\n                \n            ;\n            }\n        ;\n        ;\n        },\n        _handleScroll: function(JSBNG__event) {\n            if (this._needsGripper()) {\n                this._slideGripper();\n            }\n        ;\n        ;\n            this.throttledAdjustGripper();\n            if (((this._options.fade !== false))) {\n                this.showScrollbar();\n            }\n        ;\n        ;\n            this.inform(\"JSBNG__scroll\");\n        },\n        _handleMouseLeave: function() {\n            this._mouseOver = false;\n            this.hideScrollbar();\n        },\n        _handleMouseEnter: function() {\n            this._mouseOver = true;\n            this.showScrollbar();\n        },\n        hideScrollbar: function(x) {\n            if (!this._scrollbarVisible) {\n                return this;\n            }\n        ;\n        ;\n            this._scrollbarVisible = false;\n            if (this._hideTimeout) {\n                JSBNG__clearTimeout(this._hideTimeout);\n                this._hideTimeout = null;\n            }\n        ;\n        ;\n            if (x) {\n                q.set(this._track, \"opacity\", 0);\n                j.addClass.curry(this._track, \"invisible_elem\");\n            }\n             else this._hideTimeout = function() {\n                if (this._hideAnimation) {\n                    this._hideAnimation.JSBNG__stop();\n                    this._hideAnimation = null;\n                }\n            ;\n            ;\n                this._hideAnimation = (new g(this._track)).from(\"opacity\", 1).to(\"opacity\", 0).duration(250).ondone(j.addClass.curry(this._track, \"invisible_elem\")).go();\n            }.bind(this).defer(750);\n        ;\n        ;\n            return this;\n        },\n        resize: function() {\n            var x = s.getElementDimensions(this._elem).x;\n            if (((this._options.fade === false))) {\n                x -= 10;\n            }\n        ;\n        ;\n            x = Math.max(0, x);\n            q.set(this._body, \"width\", ((x + \"px\")));\n            return this;\n        },\n        showScrollbar: function(x) {\n            this.throttledAdjustGripper();\n            if (this._scrollbarVisible) {\n                return this;\n            }\n        ;\n        ;\n            this._scrollbarVisible = true;\n            if (this._hideTimeout) {\n                JSBNG__clearTimeout(this._hideTimeout);\n                this._hideTimeout = null;\n            }\n        ;\n        ;\n            if (this._hideAnimation) {\n                this._hideAnimation.JSBNG__stop();\n                this._hideAnimation = null;\n            }\n        ;\n        ;\n            q.set(this._track, \"opacity\", 1);\n            j.removeClass(this._track, \"invisible_elem\");\n            if (((((x !== false)) && !this._options.no_fade_on_hover))) {\n                this.hideScrollbar();\n            }\n        ;\n        ;\n            return this;\n        },\n        isScrolledToBottom: function() {\n            return ((this._wrap.scrollTop >= ((this._contentHeight - this._containerHeight))));\n        },\n        isScrolledToTop: function() {\n            return ((this._wrap.scrollTop === 0));\n        },\n        scrollToBottom: function(x) {\n            this.setScrollTop(this._wrap.scrollHeight, x);\n        },\n        scrollToTop: function(x) {\n            this.setScrollTop(0, x);\n        },\n        scrollIntoView: function(x, y) {\n            var z = this._wrap.clientHeight, aa = x.offsetHeight, ba = this._wrap.scrollTop, ca = ((ba + z)), da = x.offsetTop, ea = ((da + aa));\n            if (((((da < ba)) || ((z < aa))))) {\n                this.setScrollTop(da, y);\n            }\n             else if (((ea > ca))) {\n                this.setScrollTop(((ba + ((ea - ca)))), y);\n            }\n            \n        ;\n        ;\n        },\n        poke: function() {\n            var x = this._wrap.scrollTop;\n            this._wrap.scrollTop += 1;\n            this._wrap.scrollTop -= 1;\n            this._wrap.scrollTop = x;\n            return this.showScrollbar(false);\n        },\n        getScrollTop: function() {\n            return this._wrap.scrollTop;\n        },\n        getScrollHeight: function() {\n            return this._wrap.scrollHeight;\n        },\n        setScrollTop: function(x, y, z) {\n            if (((y !== false))) {\n                if (this._scrollTopAnimation) {\n                    this._scrollTopAnimation.JSBNG__stop();\n                }\n            ;\n            ;\n                z = ((z || {\n                }));\n                var aa = ((z.duration || 250)), ba = ((z.ease || g.ease.end));\n                this._scrollTopAnimation = (new g(this._wrap)).to(\"scrollTop\", x).ease(ba).duration(aa).go();\n            }\n             else this._wrap.scrollTop = x;\n        ;\n        ;\n        }\n    });\n    e.exports = w;\n});\n__d(\"Menu\", [\"CSS\",\"Class\",\"DataStore\",\"DOM\",\"JSBNG__Event\",\"Keys\",\"Parent\",\"PopoverMenuInterface\",\"ScrollableArea\",\"Style\",\"copyProperties\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSS\"), h = b(\"Class\"), i = b(\"DataStore\"), j = b(\"DOM\"), k = b(\"JSBNG__Event\"), l = b(\"Keys\"), m = b(\"Parent\"), n = b(\"PopoverMenuInterface\"), o = b(\"ScrollableArea\"), p = b(\"Style\"), q = b(\"copyProperties\"), r = b(\"cx\");\n    function s(t, u) {\n        this.parent.construct(this);\n        this._items = [];\n        for (var v = 0; ((v < t.length)); v++) {\n            this._items[v] = new t[v].ctor(t[v]);\n        ;\n        };\n    ;\n        this._config = ((u || {\n        }));\n        this._theme = ((u.theme || {\n        }));\n    };\n;\n    h.extend(s, n);\n    q(s.prototype, {\n        _focused: null,\n        _root: null,\n        addItem: function(t) {\n            this._addItem(t);\n        },\n        addItemBefore: function(t, u) {\n            this._addItem(t, u, false);\n        },\n        addItemAfter: function(t, u) {\n            this._addItem(t, u, true);\n        },\n        _addItem: function(t, u, v) {\n            var w = this._items.indexOf(t);\n            if (((w >= 0))) {\n                var x = ((v ? -1 : 1));\n                if (((this._items[((w + x))] == u))) {\n                    return;\n                }\n            ;\n            ;\n                this._items.splice(w, 1);\n            }\n        ;\n        ;\n            if (u) {\n                w = this._items.indexOf(u);\n                if (((w < 0))) {\n                    throw new Error(\"reference item must already be in the menu\");\n                }\n            ;\n            ;\n                if (v) {\n                    w++;\n                }\n            ;\n            ;\n                this._items.splice(w, 0, t);\n            }\n             else this._items.push(t);\n        ;\n        ;\n            if (this._root) {\n                this._insertItem(t, u, v);\n            }\n        ;\n        ;\n        },\n        removeItem: function(t) {\n            var u = this._items.indexOf(t);\n            if (((u < 0))) {\n                return;\n            }\n        ;\n        ;\n            this._items.splice(u, 1);\n            ((this._root && j.remove(t.getRoot())));\n        },\n        forEachItem: function(t) {\n            this._items.forEach(t);\n        },\n        getItemAt: function(t) {\n            return ((this._items[t] || null));\n        },\n        getRoot: function() {\n            if (!this._root) {\n                this._render();\n            }\n        ;\n        ;\n            return this._root;\n        },\n        onShow: function() {\n            if (this._config.maxheight) {\n                if (!this._scrollableArea) {\n                    this._scrollableArea = o.fromNative(this._scrollableElems.root, {\n                        fade: true\n                    });\n                }\n                 else this._scrollableArea.resize();\n            ;\n            }\n        ;\n        ;\n            this.focusAnItem();\n        },\n        onHide: function() {\n            this.JSBNG__blur();\n        },\n        focusAnItem: function() {\n            return this._attemptFocus(0, 1);\n        },\n        JSBNG__blur: function() {\n            if (this._focused) {\n                this._focused.JSBNG__blur();\n                this._focused = null;\n                this.inform(\"JSBNG__blur\");\n            }\n        ;\n        ;\n        },\n        handleKeydown: function(t, u) {\n            var v = this._items.indexOf(this._focused);\n            switch (t) {\n              case l.UP:\n            \n              case l.DOWN:\n                var w = ((((t === l.UP)) ? -1 : 1));\n                if (((v !== -1))) {\n                    return this._attemptFocus(((v + w)), w);\n                }\n                 else if (((t === l.UP))) {\n                    return this._attemptFocus(((this._items.length - 1)), -1);\n                }\n                 else return this._attemptFocus(0, 1)\n                \n            ;\n                break;\n              case l.SPACE:\n                if (((this._items.indexOf(this._focused) !== -1))) {\n                    this._handleItemClick(this._focused, u);\n                    return true;\n                }\n            ;\n            ;\n                return false;\n              default:\n                var x = String.fromCharCode(t).toLowerCase(), y;\n                for (var z = ((v + 1)); ((z < this._items.length)); z++) {\n                    y = this._items[z].getAccessKey();\n                    if (((y && ((y.charAt(0).toLowerCase() === x))))) {\n                        if (this._focusItem(this._items[z])) {\n                            return true;\n                        }\n                    ;\n                    }\n                ;\n                ;\n                };\n            ;\n                return false;\n            };\n        ;\n        },\n        _render: function() {\n            this._ul = j.create(\"ul\", {\n                className: \"_54nf\"\n            });\n            this._ul.setAttribute(\"role\", \"menu\");\n            this._items.forEach(function(v) {\n                this._insertItem(v, null);\n            }.bind(this));\n            k.listen(this._ul, \"click\", this._handleClick.bind(this));\n            k.listen(this._ul, \"mouseover\", this._handleMouseOver.bind(this));\n            k.listen(this._ul, \"mouseout\", this._handleMouseOut.bind(this));\n            var t = this._ul;\n            if (this._config.maxheight) {\n                this._scrollableElems = o.renderDOM();\n                j.setContent(this._scrollableElems.JSBNG__content, this._ul);\n                t = this._scrollableElems.root;\n                p.set(this._scrollableElems.wrap, \"max-height\", ((this._config.maxheight + \"px\")));\n            }\n        ;\n        ;\n            var u = ((((\"_54nq\" + ((this._config.className ? ((\" \" + this._config.className)) : \"\")))) + ((this._theme.className ? ((\" \" + this._theme.className)) : \"\"))));\n            this._root = j.create(\"div\", {\n                className: u\n            }, j.create(\"div\", {\n                className: \"_54ng\"\n            }, t));\n            ((this._config.id && this._root.setAttribute(\"id\", this._config.id)));\n            this.inform(\"rendered\", this._root);\n        },\n        _needsDefaultBehavior: function(t) {\n            if (((t.isDefaultRequested && t.isDefaultRequested()))) {\n                var u = m.byTag(t.getTarget(), \"a\"), v = ((u && u.getAttribute(\"href\")));\n                return ((v && ((v[0] !== \"#\"))));\n            }\n        ;\n        ;\n            return false;\n        },\n        _handleClick: function(t) {\n            if (!this._needsDefaultBehavior(t)) {\n                var u = this._getItemInstance(t.getTarget());\n                if (u) {\n                    return this._handleItemClick(u, t);\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n        },\n        _handleItemClick: function(t, u) {\n            this.inform(\"itemclick\", {\n                item: t,\n                JSBNG__event: u\n            });\n            if (t.hasAction()) {\n                this.done();\n            }\n        ;\n        ;\n            return t.handleClick();\n        },\n        _handleMouseOver: function(t) {\n            var u = this._getItemInstance(t.getTarget());\n            ((u && this._focusItem(u, true)));\n        },\n        _handleMouseOut: function(t) {\n            var u = this._getItemInstance(t.getTarget());\n            if (((u && ((this._focused === u))))) {\n                this.JSBNG__blur();\n            }\n        ;\n        ;\n        },\n        _insertItem: function(t, u, v) {\n            var w = t.getRoot();\n            g.addClass(w, \"__MenuItem\");\n            i.set(w, \"MenuItem\", t);\n            if (u) {\n                var x = ((v ? j.insertAfter : j.insertBefore));\n                x(u.getRoot(), w);\n            }\n             else j.appendContent(this._ul, w);\n        ;\n        ;\n        },\n        _attemptFocus: function(t, u) {\n            var v = this.getItemAt(t);\n            if (v) {\n                if (this._focusItem(v)) {\n                    return true;\n                }\n                 else return this._attemptFocus(((t + u)), u)\n            ;\n            }\n        ;\n        ;\n            return false;\n        },\n        _focusItem: function(t, u) {\n            if (((t.JSBNG__focus(u) !== false))) {\n                if (((this._focused !== t))) {\n                    this.JSBNG__blur();\n                    this._focused = t;\n                    this.inform(\"JSBNG__focus\");\n                }\n            ;\n            ;\n                return true;\n            }\n        ;\n        ;\n            return false;\n        },\n        _getItemInstance: function(t) {\n            var u = m.byClass(t, \"__MenuItem\");\n            return ((u ? i.get(u, \"MenuItem\") : null));\n        }\n    });\n    e.exports = s;\n});\n__d(\"MenuItemInterface\", [\"copyProperties\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"copyProperties\"), h = b(\"emptyFunction\");\n    function i() {\n    \n    };\n;\n    g(i.prototype, {\n        _root: null,\n        getRoot: function() {\n            if (!this._root) {\n                this._root = this.render();\n            }\n        ;\n        ;\n            return this._root;\n        },\n        render: h,\n        getAccessKey: h,\n        hasAction: h.thatReturnsFalse,\n        JSBNG__focus: h.thatReturnsFalse,\n        JSBNG__blur: h.thatReturnsFalse,\n        handleClick: h.thatReturnsFalse\n    });\n    e.exports = i;\n});\n__d(\"MenuItemBase\", [\"Class\",\"DOM\",\"HTML\",\"MenuItemInterface\",\"copyProperties\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Class\"), h = b(\"DOM\"), i = b(\"HTML\"), j = b(\"MenuItemInterface\"), k = b(\"copyProperties\"), l = b(\"cx\");\n    function m(n) {\n        this.parent.construct(this);\n        this._data = n;\n    };\n;\n    g.extend(m, j);\n    k(m.prototype, {\n        render: function() {\n            var n = \"_54ni\";\n            if (this._data.className) {\n                n += ((\" \" + this._data.className));\n            }\n        ;\n        ;\n            var o = {\n                className: n,\n                \"aria-selected\": \"false\"\n            };\n            {\n                var fin121keys = ((window.top.JSBNG_Replay.forInKeys)((this._data))), fin121i = (0);\n                var p;\n                for (; (fin121i < fin121keys.length); (fin121i++)) {\n                    ((p) = (fin121keys[fin121i]));\n                    {\n                        if (((p.indexOf(\"data-\") === 0))) {\n                            o[p] = this._data[p];\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            return h.create(\"li\", o, this._renderItemContent());\n        },\n        _renderItemContent: function() {\n            return i(this._data.markup).getNodes();\n        }\n    });\n    e.exports = m;\n});\n__d(\"MenuItem\", [\"Class\",\"CSS\",\"DOM\",\"MenuItemBase\",\"React\",\"copyProperties\",\"cx\",\"emptyFunction\",\"startsWith\",], function(a, b, c, d, e, f) {\n    var g = b(\"Class\"), h = b(\"CSS\"), i = b(\"DOM\"), j = b(\"MenuItemBase\"), k = b(\"React\"), l = b(\"copyProperties\"), m = b(\"cx\"), n = b(\"emptyFunction\"), o = b(\"startsWith\");\n    function p(q) {\n        this.parent.construct(this, q);\n        this._disabled = !!this._data.disabled;\n    };\n;\n    g.extend(p, j);\n    l(p.prototype, {\n        getValue: function() {\n            return this._data.value;\n        },\n        getAccessKey: function() {\n            return ((this._data.label && this._data.label.charAt(0)));\n        },\n        hasAction: n.thatReturnsTrue,\n        JSBNG__focus: function(q) {\n            if (((this.isDisabled() || !this._root.offsetParent))) {\n                return false;\n            }\n        ;\n        ;\n            h.addClass(this._root, \"_54ne\");\n            h.addClass(this._root, \"selected\");\n            this._root.setAttribute(\"aria-selected\", \"true\");\n            ((q || this._anchor.JSBNG__focus()));\n        },\n        JSBNG__blur: function() {\n            h.removeClass(this._root, \"_54ne\");\n            h.removeClass(this._root, \"selected\");\n            this._root.setAttribute(\"aria-selected\", \"false\");\n        },\n        handleClick: function() {\n            if (this.isDisabled()) {\n                return false;\n            }\n        ;\n        ;\n            if (((typeof this._onclickHandler === \"function\"))) {\n                return this._onclickHandler();\n            }\n        ;\n        ;\n            return !!((((this._data.rel && ((this._data.rel !== \"ignore\")))) || this._data.href));\n        },\n        setOnClickHandler: function(q) {\n            this._onclickHandler = q;\n        },\n        _renderItemContent: function() {\n            this._anchor = i.create(\"a\", {\n                className: \"_54nc\"\n            });\n            if (this._data.reactChildren) {\n                k.renderComponent(k.DOM.span({\n                    className: \"_54nh\"\n                }, this._data.reactChildren), this._anchor);\n                this._data.label = ((this._anchor.innerText || this._anchor.textContent));\n            }\n             else i.setContent(this._anchor, i.create(\"span\", {\n                className: \"_54nh\"\n            }, ((this._data.markup || this._data.label))));\n        ;\n        ;\n            if (this._data.icon) {\n                i.prependContent(this._anchor, this._data.icon);\n                h.addClass(this._anchor, \"_54nu\");\n            }\n        ;\n        ;\n            if (!this.isDisabled()) {\n                this._anchor.setAttribute(\"href\", ((this._data.href || \"#\")));\n            }\n        ;\n        ;\n            if (this._data.rel) {\n                this._anchor.setAttribute(\"rel\", this._data.rel);\n            }\n             else if (!this._data.href) {\n                this._anchor.setAttribute(\"rel\", \"ignore\");\n            }\n            \n        ;\n        ;\n            if (this._data.ajaxify) {\n                this._anchor.setAttribute(\"ajaxify\", this._data.ajaxify);\n            }\n        ;\n        ;\n            if (this._data.target) {\n                this._anchor.setAttribute(\"target\", this._data.target);\n            }\n        ;\n        ;\n            {\n                var fin122keys = ((window.top.JSBNG_Replay.forInKeys)((this._data))), fin122i = (0);\n                var q;\n                for (; (fin122i < fin122keys.length); (fin122i++)) {\n                    ((q) = (fin122keys[fin122i]));\n                    {\n                        if (((((typeof q === \"string\")) && o(q, \"data-\")))) {\n                            this._anchor.setAttribute(q, this._data[q]);\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            this._anchor.setAttribute(\"role\", \"menuitem\");\n            this._anchor.setAttribute(\"title\", this._data.title);\n            return this._anchor;\n        },\n        isDisabled: function() {\n            return this._disabled;\n        },\n        enable: function() {\n            this._anchor.setAttribute(\"href\", ((this._data.href || \"#\")));\n            h.removeClass(this._root, \"_5arm\");\n            this._disabled = false;\n        },\n        disable: function() {\n            this._anchor.removeAttribute(\"href\");\n            h.addClass(this._root, \"_5arm\");\n            this._disabled = true;\n        },\n        render: function() {\n            var q = this.parent.render();\n            if (this._data.disabled) {\n                h.addClass(q, \"_5arm\");\n            }\n        ;\n        ;\n            return q;\n        }\n    });\n    e.exports = p;\n});\n__d(\"MenuSelectableItem\", [\"Class\",\"CSS\",\"MenuItem\",\"copyProperties\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Class\"), h = b(\"CSS\"), i = b(\"MenuItem\"), j = b(\"copyProperties\"), k = b(\"cx\");\n    function l(m) {\n        this.parent.construct(this, m);\n        this._selected = !!this._data.selected;\n    };\n;\n    g.extend(l, i);\n    j(l.prototype, {\n        _selected: false,\n        getLabel: function() {\n            return this._data.label;\n        },\n        getIcon: function() {\n            return this._data.icon;\n        },\n        isSelected: function() {\n            return this._selected;\n        },\n        select: function() {\n            if (this.isDisabled()) {\n                return false;\n            }\n        ;\n        ;\n            h.addClass(this._root, \"_54nd\");\n            this._selected = true;\n        },\n        deselect: function() {\n            h.removeClass(this._root, \"_54nd\");\n            this._selected = false;\n        },\n        render: function() {\n            var m = this.parent.render();\n            if (this._data.selected) {\n                h.addClass(m, \"_54nd\");\n            }\n        ;\n        ;\n            return m;\n        }\n    });\n    e.exports = l;\n});\n__d(\"SelectableMenu\", [\"Class\",\"Menu\",\"arrayContains\",\"copyProperties\",\"createArrayFrom\",], function(a, b, c, d, e, f) {\n    var g = b(\"Class\"), h = b(\"Menu\"), i = b(\"arrayContains\"), j = b(\"copyProperties\"), k = b(\"createArrayFrom\");\n    function l(o, p) {\n        this.parent.construct(this, o, p);\n    };\n;\n    function m(o) {\n        return ((((o.select && o.deselect)) && o.isSelected));\n    };\n;\n    function n(o) {\n        return ((m(o) && o.isSelected()));\n    };\n;\n    g.extend(l, h);\n    j(l.prototype, {\n        focusAnItem: function() {\n            for (var o = 0; ((o < this._items.length)); o++) {\n                if (n(this._items[o])) {\n                    if (((this._focusItem(this._items[o]) !== false))) {\n                        return true;\n                    }\n                ;\n                }\n            ;\n            ;\n            };\n        ;\n            return this.parent.focusAnItem();\n        },\n        setValue: function(o) {\n            if (!this._root) {\n                this._render();\n            }\n        ;\n        ;\n            var p = k(o);\n            this._items.forEach(function(q) {\n                if (m(q)) {\n                    if (i(p, q.getValue())) {\n                        q.select();\n                    }\n                     else if (n(q)) {\n                        q.deselect();\n                    }\n                    \n                ;\n                }\n            ;\n            ;\n            });\n            this.inform(\"change\", this._getSelection());\n        },\n        _handleItemClick: function(o, p) {\n            if (!m(o)) {\n                return this.parent._handleItemClick(o, p);\n            }\n        ;\n        ;\n            this.inform(\"itemclick\", {\n                item: o,\n                JSBNG__event: p\n            });\n            if (this._config.multiple) {\n                var q = ((n(o) ? o.deselect() : o.select()));\n                if (((q !== false))) {\n                    this.inform(\"change\", this._getSelection());\n                }\n            ;\n            ;\n            }\n             else {\n                if (!n(o)) {\n                    if (((o.select() !== false))) {\n                        this._items.forEach(function(r) {\n                            if (((n(r) && ((r !== o))))) {\n                                r.deselect();\n                            }\n                        ;\n                        ;\n                        });\n                        this.inform(\"change\", this._getSelection());\n                    }\n                ;\n                }\n            ;\n            ;\n                this.done();\n            }\n        ;\n        ;\n            return o.handleClick();\n        },\n        _getSelection: function() {\n            var o = [];\n            this._items.forEach(function(p) {\n                if (n(p)) {\n                    o.push({\n                        label: p.getLabel(),\n                        value: p.getValue(),\n                        item: p\n                    });\n                }\n            ;\n            ;\n            });\n            if (!this._config.multiple) {\n                o = o[0];\n            }\n        ;\n        ;\n            return o;\n        }\n    });\n    e.exports = l;\n});\n__d(\"PopoverLoadingMenu\", [\"Class\",\"DOM\",\"PopoverMenuInterface\",\"copyProperties\",\"cx\",\"joinClasses\",], function(a, b, c, d, e, f) {\n    var g = b(\"Class\"), h = b(\"DOM\"), i = b(\"PopoverMenuInterface\"), j = b(\"copyProperties\"), k = b(\"cx\"), l = b(\"joinClasses\");\n    function m(n) {\n        this.parent.construct(this);\n        this._config = ((n || {\n        }));\n        this._theme = ((n.theme || {\n        }));\n    };\n;\n    g.extend(m, i);\n    j(m.prototype, {\n        _root: null,\n        getRoot: function() {\n            if (!this._root) {\n                this._root = h.create(\"div\", {\n                    className: l(\"_54nq\", this._config.className, this._theme.className)\n                }, h.create(\"div\", {\n                    className: \"_54ng\"\n                }, h.create(\"div\", {\n                    className: \"_54nf _54af\"\n                }, h.create(\"span\", {\n                    className: \"_54ag\"\n                }))));\n            }\n        ;\n        ;\n            return this._root;\n        }\n    });\n    e.exports = m;\n});\n__d(\"TabIsolation\", [\"JSBNG__Event\",\"DOMQuery\",\"Focus\",\"Keys\",\"TabbableElements\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"DOMQuery\"), i = b(\"Focus\"), j = b(\"Keys\"), k = b(\"TabbableElements\"), l = b(\"copyProperties\"), m = [], n = 0;\n    function o(p) {\n        this._root = p;\n        this._eventHandler = null;\n        this._identifier = n++;\n    };\n;\n    l(o.prototype, {\n        enable: function() {\n            m.unshift(this._identifier);\n            this._eventHandler = g.listen(window, \"keydown\", function(p) {\n                if (((m[0] === this._identifier))) {\n                    this._tabHandler(p);\n                }\n            ;\n            ;\n            }.bind(this), g.Priority.URGENT);\n        },\n        disable: function() {\n            var p;\n            if (this._eventHandler) {\n                p = m.indexOf(this._identifier);\n                if (((p > -1))) {\n                    m.splice(p, 1);\n                }\n            ;\n            ;\n                this._eventHandler.remove();\n                this._eventHandler = null;\n            }\n        ;\n        ;\n        },\n        _tabHandler: function(p) {\n            if (((g.getKeyCode(p) !== j.TAB))) {\n                return;\n            }\n        ;\n        ;\n            var q = p.getTarget();\n            if (!q) {\n                return;\n            }\n        ;\n        ;\n            var r = k.JSBNG__find(this._root), s = r[0], t = r[((r.length - 1))], u = p.getModifiers().shift;\n            if (((u && ((q === s))))) {\n                p.preventDefault();\n                i.set(t);\n            }\n             else if (((((!u && ((q === t)))) || !h.contains(this._root, q)))) {\n                p.preventDefault();\n                i.set(s);\n            }\n            \n        ;\n        ;\n        }\n    });\n    e.exports = o;\n});\n__d(\"AccessibleLayer\", [\"JSBNG__Event\",\"DOM\",\"Focus\",\"copyProperties\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"DOM\"), i = b(\"Focus\"), j = b(\"copyProperties\"), k = b(\"tx\");\n    function l(m) {\n        this._layer = m;\n    };\n;\n    j(l.prototype, {\n        enable: function() {\n            this._afterShowSubscription = this._layer.subscribe(\"aftershow\", this._onAfterShow.bind(this));\n        },\n        disable: function() {\n            ((this._listener && this._listener.remove()));\n            this._afterShowSubscription.unsubscribe();\n            this._listener = this._afterShowSubscription = null;\n        },\n        _closeListener: function(JSBNG__event) {\n            var m = this._layer.getCausalElement();\n            if (m) {\n                if (((m.tabIndex == -1))) {\n                    m.tabIndex = 0;\n                    i.setWithoutOutline(m);\n                }\n                 else i.set(m);\n            ;\n            }\n        ;\n        ;\n            this._layer.hide();\n        },\n        _onAfterShow: function() {\n            var m = this._layer.getContentRoot();\n            if (h.scry(m, \".layer_close_elem\")[0]) {\n                return;\n            }\n        ;\n        ;\n            var n = h.create(\"a\", {\n                className: \"accessible_elem layer_close_elem\",\n                href: \"#\"\n            }, [\"Close popup and return\",]);\n            h.appendContent(m, n);\n            this._listener = g.listen(n, \"click\", this._closeListener.bind(this));\n        }\n    });\n    e.exports = l;\n});\n__d(\"ContextualLayerAsyncRelative\", [\"JSBNG__Event\",\"copyProperties\",\"Parent\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"copyProperties\"), i = b(\"Parent\");\n    function j(k) {\n        this._layer = k;\n    };\n;\n    h(j.prototype, {\n        _layerSubscription: null,\n        _listener: null,\n        enable: function() {\n            this._layerSubscription = this._layer.subscribe(\"show\", this._attachListener.bind(this));\n            if (this._layer.isShown()) {\n                this._attachListener();\n            }\n        ;\n        ;\n        },\n        disable: function() {\n            this._layerSubscription.unsubscribe();\n            this._layerSubscription = null;\n            if (this._listener) {\n                this._listener.remove();\n                this._listener = null;\n            }\n        ;\n        ;\n        },\n        _attachListener: function() {\n            this._listener = g.listen(this._layer.getRoot(), \"click\", this._onclick.bind(this));\n        },\n        _onclick: function(k) {\n            var l = i.byTag(k.getTarget(), \"A\");\n            if (!l) {\n                return;\n            }\n        ;\n        ;\n            var m = l.getAttribute(\"ajaxify\"), n = l.href, o = ((m || n));\n            if (((((l.rel === \"async\")) || ((l.rel === \"async-post\"))))) {\n                d([\"AsyncRequest\",], function(p) {\n                    p.bootstrap(o, this._layer.getContext(), ((l.rel === \"async-post\")));\n                }.bind(this));\n                return false;\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = j;\n});\n__d(\"ContextualLayerUpdateOnScroll\", [\"JSBNG__Event\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"copyProperties\");\n    function i(j) {\n        this._layer = j;\n    };\n;\n    h(i.prototype, {\n        _subscriptions: [],\n        enable: function() {\n            this._subscriptions = [this._layer.subscribe(\"show\", this._attachScrollListener.bind(this)),this._layer.subscribe(\"hide\", this._removeScrollListener.bind(this)),];\n        },\n        disable: function() {\n            while (this._subscriptions.length) {\n                this._subscriptions.pop().unsubscribe();\n            ;\n            };\n        ;\n            this.detach();\n        },\n        _attachScrollListener: function() {\n            if (this._listener) {\n                return;\n            }\n        ;\n        ;\n            var j = this._layer.getContextScrollParent();\n            this._listener = g.listen(j, \"JSBNG__scroll\", this._layer.updatePosition.bind(this._layer));\n        },\n        _removeScrollListener: function() {\n            ((this._listener && this._listener.remove()));\n            this._listener = null;\n        }\n    });\n    e.exports = i;\n});\n__d(\"LayerAutoFocus\", [\"function-extensions\",\"DOMQuery\",\"Focus\",\"TabbableElements\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    b(\"function-extensions\");\n    var g = b(\"DOMQuery\"), h = b(\"Focus\"), i = b(\"TabbableElements\"), j = b(\"copyProperties\");\n    function k(l) {\n        this._layer = l;\n    };\n;\n    j(k.prototype, {\n        _subscription: null,\n        enable: function() {\n            this._subscription = this._layer.subscribe(\"aftershow\", this._focus.bind(this));\n        },\n        disable: function() {\n            this._subscription.unsubscribe();\n            this._subscription = null;\n        },\n        _focus: function() {\n            var l = this._layer.getRoot(), m = g.scry(l, \".autofocus\")[0], n = true;\n            if (!m) {\n                var o = JSBNG__document.activeElement;\n                if (g.isNodeOfType(o, [\"input\",\"textarea\",])) {\n                    return;\n                }\n            ;\n            ;\n                var p = i.JSBNG__find(l);\n                for (var q = 0; ((q < p.length)); q++) {\n                    if (((p[q].tagName != \"A\"))) {\n                        m = p[q];\n                        n = false;\n                        break;\n                    }\n                ;\n                ;\n                };\n            ;\n            }\n             else if (((m.tabIndex !== 0))) {\n                n = false;\n            }\n            \n        ;\n        ;\n            if (m) {\n                ((n ? h.set(m) : h.setWithoutOutline(m)));\n            }\n             else {\n                l.tabIndex = 0;\n                h.setWithoutOutline(l);\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = k;\n});\n__d(\"LayerButtons\", [\"JSBNG__Event\",\"Parent\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"Parent\"), i = b(\"copyProperties\");\n    function j(k) {\n        this._layer = k;\n    };\n;\n    i(j.prototype, {\n        _listener: null,\n        enable: function() {\n            this._listener = g.listen(this._layer.getRoot(), \"click\", this._handle.bind(this));\n        },\n        disable: function() {\n            this._listener.remove();\n            this._listener = null;\n        },\n        _handle: function(k) {\n            var l = k.getTarget(), m = h.byClass(l, \"layerConfirm\");\n            if (m) {\n                if (((this._layer.inform(\"JSBNG__confirm\", m) === false))) {\n                    k.prevent();\n                }\n            ;\n            ;\n                return;\n            }\n        ;\n        ;\n            var n = h.byClass(l, \"layerCancel\");\n            if (n) {\n                if (((this._layer.inform(\"cancel\", n) !== false))) {\n                    this._layer.hide();\n                }\n            ;\n            ;\n                k.prevent();\n                return;\n            }\n        ;\n        ;\n            var o = h.byClass(l, \"layerButton\");\n            if (o) {\n                if (((this._layer.inform(\"button\", o) === false))) {\n                    k.prevent();\n                }\n            ;\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = j;\n});\n__d(\"LayerDestroyOnHide\", [\"function-extensions\",\"copyProperties\",\"shield\",], function(a, b, c, d, e, f) {\n    b(\"function-extensions\");\n    var g = b(\"copyProperties\"), h = b(\"shield\");\n    function i(j) {\n        this._layer = j;\n    };\n;\n    g(i.prototype, {\n        _subscription: null,\n        enable: function() {\n            this._subscription = this._layer.subscribe(\"hide\", h(Function.prototype.defer, this._layer.destroy.bind(this._layer)));\n        },\n        disable: function() {\n            if (this._subscription) {\n                this._subscription.unsubscribe();\n                this._subscription = null;\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = i;\n});\n__d(\"LayerFadeOnHide\", [\"Animation\",\"Layer\",\"Style\",\"UserAgent\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Animation\"), h = b(\"Layer\"), i = b(\"Style\"), j = b(\"UserAgent\"), k = b(\"copyProperties\");\n    function l(m) {\n        this._layer = m;\n    };\n;\n    k(l.prototype, {\n        _subscription: null,\n        enable: function() {\n            if (((j.ie() < 9))) {\n                return;\n            }\n        ;\n        ;\n            this._subscription = this._layer.subscribe(\"starthide\", this._handleStartHide.bind(this));\n        },\n        disable: function() {\n            if (this._subscription) {\n                this._subscription.unsubscribe();\n                this._subscription = null;\n            }\n        ;\n        ;\n        },\n        _handleStartHide: function() {\n            var m = true, n = h.subscribe(\"show\", function() {\n                n.unsubscribe();\n                m = false;\n            });\n            (function() {\n                n.unsubscribe();\n                n = null;\n                if (m) {\n                    this._animate();\n                }\n                 else this._layer.finishHide();\n            ;\n            ;\n            }).bind(this).defer();\n            return false;\n        },\n        _animate: function() {\n            new g(this._layer.getRoot()).from(\"opacity\", 1).to(\"opacity\", 0).duration(150).ondone(this._finish.bind(this)).go();\n        },\n        _finish: function() {\n            i.set(this._layer.getRoot(), \"opacity\", \"\");\n            this._layer.finishHide();\n        }\n    });\n    e.exports = l;\n});\n__d(\"LayerFadeOnShow\", [\"Animation\",\"Style\",\"UserAgent\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Animation\"), h = b(\"Style\"), i = b(\"UserAgent\"), j = b(\"copyProperties\");\n    function k(l) {\n        this._layer = l;\n    };\n;\n    j(k.prototype, {\n        _subscriptions: null,\n        enable: function() {\n            if (((i.ie() < 9))) {\n                return;\n            }\n        ;\n        ;\n            this._subscriptions = [this._layer.subscribe(\"beforeshow\", function() {\n                h.set(this._layer.getRoot(), \"opacity\", 0);\n            }.bind(this)),this._layer.subscribe(\"show\", this._animate.bind(this)),];\n        },\n        disable: function() {\n            if (this._subscriptions) {\n                while (this._subscriptions.length) {\n                    this._subscriptions.pop().unsubscribe();\n                ;\n                };\n            ;\n                this._subscriptions = null;\n            }\n        ;\n        ;\n        },\n        _getDuration: function() {\n            return 100;\n        },\n        _animate: function() {\n            var l = this._layer.getRoot();\n            new g(l).from(\"opacity\", 0).to(\"opacity\", 1).duration(this._getDuration()).ondone(h.set.curry(l, \"opacity\", \"\")).go();\n        }\n    });\n    e.exports = k;\n});\n__d(\"LayerFormHooks\", [\"JSBNG__Event\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"copyProperties\");\n    function i(j) {\n        this._layer = j;\n    };\n;\n    h(i.prototype, {\n        _subscriptions: null,\n        enable: function() {\n            var j = this._layer.getRoot();\n            this._subscriptions = [g.listen(j, \"submit\", this._onSubmit.bind(this)),g.listen(j, \"success\", this._onSuccess.bind(this)),g.listen(j, \"error\", this._onError.bind(this)),];\n        },\n        disable: function() {\n            this._subscriptions.forEach(function(j) {\n                j.remove();\n            });\n            this._subscriptions = null;\n        },\n        _onSubmit: function(JSBNG__event) {\n            if (((this._layer.inform(\"submit\", JSBNG__event) === false))) {\n                JSBNG__event.kill();\n            }\n        ;\n        ;\n        },\n        _onSuccess: function(JSBNG__event) {\n            if (((this._layer.inform(\"success\", JSBNG__event) === false))) {\n                JSBNG__event.kill();\n            }\n        ;\n        ;\n        },\n        _onError: function(JSBNG__event) {\n            var j = JSBNG__event.getData();\n            if (((this._layer.inform(\"error\", {\n                response: j.response\n            }) === false))) {\n                JSBNG__event.kill();\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = i;\n});\n__d(\"LayerHideOnBlur\", [\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"copyProperties\");\n    function h(i) {\n        this._layer = i;\n    };\n;\n    g(h.prototype, {\n        _subscriptions: null,\n        _onBlur: null,\n        enable: function() {\n            this._subscriptions = [this._layer.subscribe(\"show\", this._attach.bind(this)),this._layer.subscribe(\"hide\", this._detach.bind(this)),];\n            if (this._layer.isShown()) {\n                this._attach();\n            }\n        ;\n        ;\n        },\n        disable: function() {\n            this._detach();\n            while (this._subscriptions.length) {\n                this._subscriptions.pop().unsubscribe();\n            ;\n            };\n        ;\n            this._subscriptions = null;\n        },\n        _detach: function() {\n            ((this._onBlur && this._onBlur.unsubscribe()));\n            this._onBlur = null;\n        },\n        _attach: function() {\n            this._onBlur = this._layer.subscribe(\"JSBNG__blur\", function() {\n                this._layer.hide();\n                return false;\n            }.bind(this));\n        }\n    });\n    e.exports = h;\n});\n__d(\"LayerMouseHooks\", [\"JSBNG__Event\",\"function-extensions\",\"Arbiter\",\"ContextualThing\",\"Layer\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\");\n    b(\"function-extensions\");\n    var h = b(\"Arbiter\"), i = b(\"ContextualThing\"), j = b(\"Layer\"), k = b(\"copyProperties\"), l = new h();\n    function m(n) {\n        this._layer = n;\n        this._subscriptions = [];\n        this._currentlyActive = false;\n    };\n;\n    k(m.prototype, {\n        enable: function() {\n            this._subscriptions = [l.subscribe(\"mouseenter\", this._handleActive.bind(this)),l.subscribe(\"mouseleave\", this._handleInactive.bind(this)),this._layer.subscribe(\"hide\", function() {\n                this._currentlyActive = false;\n            }.bind(this)),];\n        },\n        disable: function() {\n            while (this._subscriptions.length) {\n                this._subscriptions.pop().unsubscribe();\n            ;\n            };\n        ;\n            this._subscriptions = [];\n            this._currentlyActive = false;\n        },\n        _handleActive: function(n, o) {\n            if (((!this._currentlyActive && this._isNodeWithinStack(o)))) {\n                this._layer.inform(\"mouseenter\");\n                this._currentlyActive = true;\n            }\n        ;\n        ;\n        },\n        _handleInactive: function(n, o) {\n            if (this._currentlyActive) {\n                if (((!o || !this._isNodeWithinStack(o)))) {\n                    this._layer.inform(\"mouseleave\");\n                    this._currentlyActive = false;\n                }\n            ;\n            }\n        ;\n        ;\n        },\n        _isNodeWithinStack: function(n) {\n            return i.containsIncludingLayers(this._layer.getContentRoot(), n);\n        }\n    });\n    j.subscribe(\"show\", function(n, o) {\n        var p = o.getContentRoot(), q = [g.listen(p, \"mouseenter\", function() {\n            l.inform(\"mouseenter\", p);\n        }),g.listen(p, \"mouseleave\", function(s) {\n            l.inform(\"mouseleave\", s.getRelatedTarget());\n        }),], r = o.subscribe(\"hide\", function() {\n            while (q.length) {\n                q.pop().remove();\n            ;\n            };\n        ;\n            r.unsubscribe();\n            q = r = null;\n        });\n    });\n    e.exports = m;\n});\n__d(\"LayerRefocusOnHide\", [\"copyProperties\",\"Focus\",\"ContextualThing\",\"DOM\",\"DOMQuery\",\"Parent\",], function(a, b, c, d, e, f) {\n    var g = b(\"copyProperties\"), h = b(\"Focus\"), i = b(\"ContextualThing\"), j = b(\"DOM\"), k = b(\"DOMQuery\"), l = b(\"Parent\");\n    function m(n) {\n        this._layer = n;\n    };\n;\n    g(m.prototype, {\n        _subscription: null,\n        enable: function() {\n            this._subscription = this._layer.subscribe(\"hide\", this._handle.bind(this));\n        },\n        disable: function() {\n            this._subscription.unsubscribe();\n            this._subscription = null;\n        },\n        _handle: function(n, JSBNG__event) {\n            if (((((JSBNG__document.activeElement === JSBNG__document.body)) || k.contains(this._layer.getRoot(), JSBNG__document.activeElement)))) {\n                var o = this._layer.getCausalElement();\n                while (((o && (!o.offsetWidth)))) {\n                    var p = l.byClass(o, \"uiToggle\");\n                    if (((p && p.offsetWidth))) {\n                        o = j.scry(p, \"[rel=\\\"toggle\\\"]\")[0];\n                    }\n                     else {\n                        var q = i.getContext(o);\n                        if (q) {\n                            o = q;\n                        }\n                         else o = o.parentNode;\n                    ;\n                    ;\n                    }\n                ;\n                ;\n                };\n            ;\n                if (((o && ((o.tabIndex != -1))))) {\n                    h.setWithoutOutline(o);\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = m;\n});\n__d(\"LayerTabIsolation\", [\"TabIsolation\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"TabIsolation\"), h = b(\"copyProperties\");\n    function i(j) {\n        this._layer = j;\n        this._tabIsolation = null;\n    };\n;\n    h(i.prototype, {\n        _subscriptions: [],\n        enable: function() {\n            this._tabIsolation = new g(this._layer.getRoot());\n            this._subscriptions = [this._layer.subscribe(\"show\", this._tabIsolation.enable.bind(this._tabIsolation)),this._layer.subscribe(\"hide\", this._tabIsolation.disable.bind(this._tabIsolation)),];\n        },\n        disable: function() {\n            while (this._subscriptions.length) {\n                this._subscriptions.pop().unsubscribe();\n            ;\n            };\n        ;\n            this._tabIsolation.disable();\n            this._tabIsolation = null;\n        }\n    });\n    e.exports = i;\n});\n__d(\"ModalLayer\", [\"JSBNG__Event\",\"function-extensions\",\"Arbiter\",\"CSS\",\"DataStore\",\"DOM\",\"DOMDimensions\",\"DOMQuery\",\"ScrollAwareDOM\",\"Style\",\"URI\",\"UserAgent\",\"Vector\",\"copyProperties\",\"csx\",\"cx\",\"debounceAcrossTransitions\",\"isAsyncScrollQuery\",\"removeFromArray\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\");\n    b(\"function-extensions\");\n    var h = b(\"Arbiter\"), i = b(\"CSS\"), j = b(\"DataStore\"), k = b(\"DOM\"), l = b(\"DOMDimensions\"), m = b(\"DOMQuery\"), n = b(\"ScrollAwareDOM\"), o = b(\"Style\"), p = b(\"URI\"), q = b(\"UserAgent\"), r = b(\"Vector\"), s = b(\"copyProperties\"), t = b(\"csx\"), u = b(\"cx\"), v = b(\"debounceAcrossTransitions\"), w = b(\"isAsyncScrollQuery\"), x = b(\"removeFromArray\"), y = [], z = null, aa = null, ba = null;\n    function ca() {\n        if (!ba) {\n            ba = m.scry(JSBNG__document.body, \"._li\")[0];\n        }\n    ;\n    ;\n        return ba;\n    };\n;\n    function da(la) {\n        var ma = {\n            position: r.getScrollPosition()\n        }, na = ((la.offsetTop - ma.position.y));\n        i.addClass(la, \"_31e\");\n        o.set(la, \"JSBNG__top\", ((na + \"px\")));\n        h.inform(\"reflow\");\n        ma.listener = n.subscribe(\"JSBNG__scroll\", function(oa, pa) {\n            if (m.contains(la, pa.target)) {\n                var qa = ((la.offsetTop - pa.delta.y));\n                o.set(la, \"JSBNG__top\", ((qa + \"px\")));\n                ma.position = ma.position.add(pa.delta);\n                return false;\n            }\n        ;\n        ;\n        });\n        j.set(la, \"ModalLayerData\", ma);\n        if (((q.firefox() < 13))) {\n            ea.curry(la).defer();\n        }\n    ;\n    ;\n    };\n;\n    function ea(la) {\n        m.scry(la, \"div.swfObject\").forEach(function(ma) {\n            var na = ma.getAttribute(\"data-swfid\");\n            if (((na && window[na]))) {\n                var oa = window[na];\n                oa.addParam(\"autostart\", \"false\");\n                oa.addParam(\"autoplay\", \"false\");\n                oa.addParam(\"play\", \"false\");\n                oa.addVariable(\"video_autoplay\", \"0\");\n                oa.addVariable(\"autoplay\", \"0\");\n                oa.addVariable(\"play\", \"0\");\n                var pa = p(oa.getAttribute(\"swf\"));\n                pa.addQueryData({\n                    autoplay: \"0\"\n                });\n                pa.setPath(pa.getPath().replace(\"autoplay=1\", \"autoplay=0\"));\n                oa.setAttribute(\"swf\", pa.toString());\n                oa.write(ma);\n            }\n        ;\n        ;\n        });\n    };\n;\n    function fa(la, ma) {\n        var na = j.get(la, \"ModalLayerData\");\n        if (na) {\n            var oa = function() {\n                i.removeClass(la, \"_31e\");\n                o.set(la, \"JSBNG__top\", \"\");\n                if (ma) {\n                    var ra = m.getDocumentScrollElement();\n                    ra.scrollTop = na.position.y;\n                }\n            ;\n            ;\n                h.inform(\"reflow\");\n                na.listener.unsubscribe();\n                na.listener = null;\n                j.remove(la, \"ModalLayerData\");\n            };\n            if (((ma && w()))) {\n                var pa = k.create(\"div\", {\n                    className: \"_42w\"\n                });\n                o.set(pa, \"height\", ((la.offsetHeight + \"px\")));\n                k.appendContent(JSBNG__document.body, pa);\n                var qa = m.getDocumentScrollElement();\n                qa.scrollTop = na.position.y;\n                ma = false;\n                !function() {\n                    oa();\n                    k.remove(pa);\n                }.defer();\n            }\n             else oa();\n        ;\n        ;\n        }\n    ;\n    ;\n        if (((q.ie() < 7))) {\n            o.set(la, \"height\", \"\");\n        }\n    ;\n    ;\n    };\n;\n    function ga() {\n        var la = ca();\n        if (!i.hasClass(la, \"_31e\")) {\n            da(la);\n        }\n    ;\n    ;\n    };\n;\n    function ha() {\n        if (!y.length) {\n            fa(ca(), true);\n        }\n    ;\n    ;\n    };\n;\n    function ia() {\n        var la;\n        if (((q.ie() < 7))) {\n            var ma = y[((y.length - 1))].getLayerRoot(), na = Math.max(ma.offsetHeight, ma.scrollHeight);\n            la = function(ta) {\n                o.set(ta, \"height\", ((((-ta.offsetTop + na)) + \"px\")));\n            };\n        }\n    ;\n    ;\n        var oa = y.length;\n        while (oa--) {\n            var pa = y[oa], qa = pa.getLayerRoot();\n            ja(qa, \"\");\n            var ra = pa.getLayerContentRoot(), sa = ((ra.offsetWidth + l.measureElementBox(ra, \"width\", 0, 0, 1)));\n            ja(qa, sa);\n            if (((la && ((oa < ((y.length - 1))))))) {\n                la(qa);\n            }\n        ;\n        ;\n        };\n    ;\n        ((la && la(ca())));\n    };\n;\n    function ja(la, ma) {\n        var na = ((q.ie() < 7));\n        if (((((na && ma)) && ((ma <= JSBNG__document.body.clientWidth))))) {\n            ma = \"\";\n        }\n    ;\n    ;\n        o.set(la, ((na ? \"width\" : \"min-width\")), ((ma + ((ma ? \"px\" : \"\")))));\n    };\n;\n    function ka(la) {\n        this._layer = la;\n    };\n;\n    s(ka.prototype, {\n        _subscription: null,\n        enable: function() {\n            if (!ca()) {\n                return;\n            }\n        ;\n        ;\n            this._subscription = this._layer.subscribe([\"show\",\"hide\",], function(la) {\n                ((((la == \"show\")) ? this._addModal() : this._removeModal()));\n            }.bind(this));\n            if (this._layer.isShown()) {\n                this._addModal();\n            }\n        ;\n        ;\n        },\n        disable: function() {\n            if (!ca()) {\n                return;\n            }\n        ;\n        ;\n            this._subscription.unsubscribe();\n            this._subscription = null;\n            if (this._layer.isShown()) {\n                this._removeModal();\n            }\n        ;\n        ;\n        },\n        _addModal: function() {\n            i.addClass(this.getLayerRoot(), \"_3qw\");\n            var la = y[((y.length - 1))];\n            if (la) {\n                da(la.getLayerRoot());\n            }\n             else ga();\n        ;\n        ;\n            var ma = m.getDocumentScrollElement();\n            ma.scrollTop = 0;\n            if (!y.length) {\n                if (((q.ie() < 7))) {\n                    i.addClass(JSBNG__document.documentElement, \"_31d\");\n                }\n            ;\n            ;\n                var na = v(ia, 100);\n                z = g.listen(window, \"resize\", na);\n                aa = h.subscribe(\"reflow\", na);\n            }\n        ;\n        ;\n            y.push(this);\n            ia.defer();\n        },\n        _removeModal: function() {\n            var la = this.getLayerRoot();\n            i.removeClass(la, \"_3qw\");\n            ja(la, \"\");\n            var ma = ((this === y[((y.length - 1))]));\n            x(y, this);\n            var na = y[((y.length - 1))];\n            if (!na) {\n                z.remove();\n                z = null;\n                aa.unsubscribe();\n                aa = null;\n            }\n        ;\n        ;\n            !function() {\n                if (na) {\n                    fa(na.getLayerRoot(), ma);\n                }\n                 else ha();\n            ;\n            ;\n                if (y.length) {\n                    ia.defer();\n                }\n                 else if (((q.ie() < 7))) {\n                    i.removeClass(JSBNG__document.documentElement, \"_31d\");\n                }\n                \n            ;\n            ;\n            }.defer(400, false);\n        },\n        getLayerRoot: function() {\n            return this._layer.getRoot();\n        },\n        getLayerContentRoot: function() {\n            return this._layer.getContentRoot();\n        }\n    });\n    e.exports = ka;\n});\n__d(\"ContextualDialogArrow\", [\"JSXDOM\",\"CSS\",\"DOM\",\"Locale\",\"Style\",\"Vector\",\"copyProperties\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSXDOM\"), h = b(\"CSS\"), i = b(\"DOM\"), j = b(\"Locale\"), k = b(\"Style\"), l = b(\"Vector\"), m = b(\"copyProperties\"), n = b(\"cx\"), o = {\n        bottom: \"_53ik\",\n        JSBNG__top: \"_53il\",\n        right: \"_53im\",\n        left: \"_53in\"\n    }, p = {\n        above: \"bottom\",\n        below: \"JSBNG__top\",\n        left: \"right\",\n        right: \"left\"\n    };\n    function q(r) {\n        this._layer = r;\n    };\n;\n    m(q.prototype, {\n        _subscription: null,\n        _arrow: null,\n        enable: function() {\n            this._subscription = this._layer.subscribe([\"adjust\",\"reposition\",], this._handle.bind(this));\n        },\n        disable: function() {\n            this._subscription.unsubscribe();\n            this._subscription = null;\n        },\n        _handle: function(r, s) {\n            if (((r === \"adjust\"))) {\n                this._repositionArrow(s);\n            }\n             else this._repositionRoot(s);\n        ;\n        ;\n        },\n        _repositionRoot: function(r) {\n            var s = r.getAlignment();\n            if (((s == \"center\"))) {\n                return;\n            }\n        ;\n        ;\n            var t = this._layer.getRoot(), u = this._layer.getContext(), v = r.isVertical(), w = this._layer.getArrowDimensions(), x = w.offset, y = w.length, z = l.getElementDimensions(u), aa = ((v ? z.x : z.y));\n            if (((aa >= ((y + ((x * 2))))))) {\n                return;\n            }\n        ;\n        ;\n            var ba = ((((y / 2)) + x)), ca = ((aa / 2)), da = parseInt(((ba - ca)), 10);\n            if (v) {\n                if (((s == \"left\"))) {\n                    var ea = parseInt(k.get(t, \"left\"), 10);\n                    k.set(t, \"left\", ((((ea - da)) + \"px\")));\n                }\n                 else {\n                    var fa = parseInt(k.get(t, \"right\"), 10);\n                    k.set(t, \"right\", ((((fa - da)) + \"px\")));\n                }\n            ;\n            ;\n            }\n             else {\n                var ga = parseInt(k.get(t, \"JSBNG__top\"), 10);\n                k.set(t, \"JSBNG__top\", ((((ga - da)) + \"px\")));\n            }\n        ;\n        ;\n        },\n        _repositionArrow: function(r) {\n            var s = this._layer._contentWrapper, t = r.getPosition(), u = p[t];\n            {\n                var fin123keys = ((window.top.JSBNG_Replay.forInKeys)((o))), fin123i = (0);\n                var v;\n                for (; (fin123i < fin123keys.length); (fin123i++)) {\n                    ((v) = (fin123keys[fin123i]));\n                    {\n                        h.conditionClass(s, o[v], ((u === v)));\n                    ;\n                    };\n                };\n            };\n        ;\n            if (((t == \"none\"))) {\n                return;\n            }\n        ;\n        ;\n            if (!this._arrow) {\n                this._arrow = g.i({\n                    className: \"_53io\"\n                });\n                i.appendContent(s, this._arrow);\n            }\n        ;\n        ;\n            h.conditionClass(s, \"_kc\", this._layer.getFooter());\n            k.set(this._arrow, \"JSBNG__top\", \"\");\n            k.set(this._arrow, \"left\", \"\");\n            k.set(this._arrow, \"right\", \"\");\n            k.set(this._arrow, \"margin\", \"\");\n            var w = q.getOffsetPercent(r), x = q.getOffset(r, w, this._layer), y = q.getOffsetSide(r);\n            k.set(this._arrow, y, ((w + \"%\")));\n            k.set(this._arrow, ((\"margin-\" + y)), ((x + \"px\")));\n        }\n    });\n    m(q, {\n        getOffsetPercent: function(r) {\n            var s = r.getAlignment(), t = r.getPosition();\n            if (((((t == \"above\")) || ((t == \"below\"))))) {\n                if (((s == \"center\"))) {\n                    return 50;\n                }\n                 else if (((s == \"right\"))) {\n                    return 100;\n                }\n                \n            ;\n            }\n        ;\n        ;\n            return 0;\n        },\n        getOffsetSide: function(r) {\n            var s = r.isVertical();\n            return ((s ? ((j.isRTL() ? \"right\" : \"left\")) : \"JSBNG__top\"));\n        },\n        getOffset: function(r, s, t) {\n            var u = t.getArrowDimensions(), v = u.offset, w = u.length, x = r.getAlignment(), y = ((((x == \"center\")) ? 0 : v));\n            y += ((((w * s)) / 100));\n            if (((x != \"left\"))) {\n                y *= -1;\n            }\n        ;\n        ;\n            return y;\n        }\n    });\n    e.exports = q;\n});\n__d(\"ContextualDialogFitInViewport\", [\"JSBNG__Event\",\"ContextualLayerDimensions\",\"Style\",\"Vector\",\"copyProperties\",\"throttle\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"ContextualLayerDimensions\"), i = b(\"Style\"), j = b(\"Vector\"), k = b(\"copyProperties\"), l = b(\"throttle\");\n    function m(n) {\n        this._layer = n;\n        this._listeners = [];\n    };\n;\n    k(m.prototype, {\n        _subscription: null,\n        _minimumTop: null,\n        enable: function() {\n            var n = this._layer.getArrowDimensions();\n            this._arrowOffset = n.offset;\n            var o = n.length;\n            this._arrowBuffer = ((this._arrowOffset + o));\n            this._subscription = this._layer.subscribe([\"show\",\"hide\",\"reposition\",], function(p, q) {\n                if (((p == \"reposition\"))) {\n                    this._calculateMinimumTop(q);\n                }\n                 else if (((p == \"show\"))) {\n                    this._attachScroll();\n                    this._adjustForScroll();\n                }\n                 else this._detachScroll();\n                \n            ;\n            ;\n            }.bind(this));\n            if (this._layer.isShown()) {\n                this._attachScroll();\n            }\n        ;\n        ;\n        },\n        disable: function() {\n            if (this._layer.isShown()) {\n                this._detachScroll();\n            }\n        ;\n        ;\n            this._subscription.unsubscribe();\n            this._subscription = null;\n        },\n        _attachScroll: function() {\n            var n = l(this._adjustForScroll.bind(this)), o = ((this._layer.getContextScrollParent() || window));\n            this._listeners = [g.listen(o, \"JSBNG__scroll\", n),g.listen(window, \"resize\", n),];\n        },\n        _detachScroll: function() {\n            while (this._listeners.length) {\n                this._listeners.pop().remove();\n            ;\n            };\n        ;\n            this._listeners = [];\n        },\n        _getContentHeight: function() {\n            return j.getElementDimensions(this._layer._contentWrapper).y;\n        },\n        _getContextY: function() {\n            return j.getElementPosition(this._layer.getContext()).y;\n        },\n        _calculateMinimumTop: function(n) {\n            if (n.isVertical()) {\n                return;\n            }\n        ;\n        ;\n            this._minimumTop = ((((this._getContextY() - ((this._getContentHeight() - this._arrowBuffer)))) + n.getOffsetY()));\n        },\n        _adjustForScroll: function() {\n            if (this._layer.isFixed()) {\n                return;\n            }\n        ;\n        ;\n            var n = this._layer._getOrientation();\n            if (n.isVertical()) {\n                return;\n            }\n        ;\n        ;\n            var o = h.getViewportRect(this._layer), p = ((o.b - this._minimumTop));\n            if (((p < 0))) {\n                return;\n            }\n        ;\n        ;\n            var q = this._getContentHeight(), r = ((q - ((this._arrowBuffer + this._arrowOffset)))), s = Math.max(0, Math.min(r, ((r - ((p - q))))));\n            i.set(this._layer.getContent(), \"JSBNG__top\", ((-s + \"px\")));\n        }\n    });\n    e.exports = m;\n});\n__d(\"ContextualDialogDefaultTheme\", [\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"cx\"), h = {\n        wrapperClassName: \"_53ip\",\n        arrowDimensions: {\n            offset: 15,\n            length: 16\n        }\n    };\n    e.exports = h;\n});\n__d(\"ContextualDialog\", [\"AccessibleLayer\",\"Class\",\"ContextualDialogArrow\",\"ContextualDialogFitInViewport\",\"ContextualLayer\",\"ContextualDialogDefaultTheme\",\"CSS\",\"DOM\",\"LayerAutoFocus\",\"LayerButtons\",\"LayerHideOnTransition\",\"LayerFormHooks\",\"LayerMouseHooks\",\"Style\",\"copyProperties\",\"csx\",\"cx\",\"removeFromArray\",], function(a, b, c, d, e, f) {\n    var g = b(\"AccessibleLayer\"), h = b(\"Class\"), i = b(\"ContextualDialogArrow\"), j = b(\"ContextualDialogFitInViewport\"), k = b(\"ContextualLayer\"), l = b(\"ContextualDialogDefaultTheme\"), m = b(\"CSS\"), n = b(\"DOM\"), o = b(\"LayerAutoFocus\"), p = b(\"LayerButtons\"), q = b(\"LayerHideOnTransition\"), r = b(\"LayerFormHooks\"), s = b(\"LayerMouseHooks\"), t = b(\"Style\"), u = b(\"copyProperties\"), v = b(\"csx\"), w = b(\"cx\"), x = b(\"removeFromArray\");\n    function y(z, aa) {\n        this.parent.construct(this, z, aa);\n    };\n;\n    h.extend(y, k);\n    u(y.prototype, {\n        _footer: null,\n        _configure: function(z, aa) {\n            u(z, ((z.theme || l)));\n            var ba = ((z.arrowBehavior || i));\n            z.addedBehaviors = ((z.addedBehaviors || []));\n            z.addedBehaviors.push(ba);\n            this._footer = n.scry(aa, \"div._572u\")[0];\n            this.parent._configure(z, aa);\n        },\n        _getDefaultBehaviors: function() {\n            var z = this.parent._getDefaultBehaviors();\n            x(z, q);\n            return z.concat([g,o,j,p,r,s,]);\n        },\n        _buildWrapper: function(z, aa) {\n            m.addClass(aa, \"_53ij\");\n            var ba = this.parent._buildWrapper(z, aa);\n            m.addClass(ba, z.wrapperClassName);\n            if (z.width) {\n                this.setWidth(z.width);\n            }\n        ;\n        ;\n            return ba;\n        },\n        setWidth: function(z) {\n            this._width = Math.floor(z);\n            t.set(this._contentWrapper, \"width\", ((z + \"px\")));\n            return this;\n        },\n        getFooter: function() {\n            return this._footer;\n        },\n        getArrowDimensions: function() {\n            return this._config.arrowDimensions;\n        }\n    });\n    u(y, {\n        setContext: function(z, aa) {\n            z.setContext(aa);\n        }\n    });\n    e.exports = y;\n});\n__d(\"DialogPosition\", [\"Vector\",], function(a, b, c, d, e, f) {\n    var g = b(\"Vector\"), h = 40, i, j = {\n        calculateTopMargin: function(k, l) {\n            if (i) {\n                return i;\n            }\n        ;\n        ;\n            var m = g.getViewportDimensions(), n = Math.floor(((((((m.x + k)) * ((m.y - l)))) / ((4 * m.x)))));\n            return Math.max(n, h);\n        },\n        setFixedTopMargin: function(k) {\n            i = k;\n        }\n    };\n    e.exports = j;\n});\n__d(\"DialogX\", [\"function-extensions\",\"JSXDOM\",\"Arbiter\",\"Class\",\"CSS\",\"DialogPosition\",\"JSBNG__Event\",\"Layer\",\"LayerAutoFocus\",\"LayerButtons\",\"LayerFormHooks\",\"LayerRefocusOnHide\",\"LayerTabIsolation\",\"ModalLayer\",\"Style\",\"Vector\",\"copyProperties\",\"cx\",\"debounce\",\"shield\",], function(a, b, c, d, e, f) {\n    b(\"function-extensions\");\n    var g = b(\"JSXDOM\"), h = b(\"Arbiter\"), i = b(\"Class\"), j = b(\"CSS\"), k = b(\"DialogPosition\"), l = b(\"JSBNG__Event\"), m = b(\"Layer\"), n = b(\"LayerAutoFocus\"), o = b(\"LayerButtons\"), p = b(\"LayerFormHooks\"), q = b(\"LayerRefocusOnHide\"), r = b(\"LayerTabIsolation\"), s = b(\"ModalLayer\"), t = b(\"Style\"), u = b(\"Vector\"), v = b(\"copyProperties\"), w = b(\"cx\"), x = b(\"debounce\"), y = b(\"shield\");\n    function z(ba, ca) {\n        this.parent.construct(this, ba, ca);\n    };\n;\n    i.extend(z, m);\n    v(z.prototype, {\n        _configure: function(ba, ca) {\n            this.parent._configure(ba, ca);\n            j.addClass(this.getRoot(), \"_4-hy\");\n            if (ba.autohide) {\n                var da = this.subscribe(\"show\", function() {\n                    da.unsubscribe();\n                    y(this.hide, this).defer(ba.autohide);\n                }.bind(this));\n            }\n        ;\n        ;\n        },\n        _getDefaultBehaviors: function() {\n            return this.parent._getDefaultBehaviors().concat([aa,s,n,o,p,r,q,]);\n        },\n        _buildWrapper: function(ba, ca) {\n            var da = ((ba.xui ? \"_4-hz\" : \"_t\")), ea = ((ba.xui ? \"_59s7\" : \"_1yv\"));\n            this._innerContent = g.div(null, ca);\n            this._wrapper = g.div({\n                className: ea,\n                role: \"dialog\",\n                \"aria-labelledby\": ((ba.titleID || null))\n            }, g.div({\n                className: da\n            }, this._innerContent));\n            this.setWidth(ba.width);\n            return (g.div({\n                className: \"_10\",\n                role: \"dialog\"\n            }, this._wrapper));\n        },\n        getContentRoot: function() {\n            return this._wrapper;\n        },\n        getInnerContent: function() {\n            return this._innerContent;\n        },\n        updatePosition: function() {\n            var ba = u.getElementDimensions(this._wrapper), ca = k.calculateTopMargin(ba.x, ba.y);\n            t.set(this._wrapper, \"margin-top\", ((ca + \"px\")));\n            this.inform(\"update_position\", {\n                type: \"DialogX\",\n                JSBNG__top: ca\n            });\n        },\n        setWidth: function(ba) {\n            ba = Math.floor(ba);\n            if (((ba === this._width))) {\n                return;\n            }\n        ;\n        ;\n            this._width = ba;\n            t.set(this._wrapper, \"width\", ((ba + \"px\")));\n        },\n        getWidth: function() {\n            return this._width;\n        }\n    });\n    function aa(ba) {\n        this._layer = ba;\n    };\n;\n    v(aa.prototype, {\n        _subscription: null,\n        _resize: null,\n        enable: function() {\n            this._subscription = this._layer.subscribe([\"show\",\"hide\",], function(ba) {\n                if (((ba === \"show\"))) {\n                    this._attach();\n                    h.inform(\"layer_shown\", {\n                        type: \"DialogX\"\n                    });\n                }\n                 else {\n                    this._detach();\n                    h.inform(\"layer_hidden\", {\n                        type: \"DialogX\"\n                    });\n                }\n            ;\n            ;\n            }.bind(this));\n        },\n        disable: function() {\n            this._subscription.unsubscribe();\n            this._subscription = null;\n            ((this._resize && this._detach()));\n        },\n        _attach: function() {\n            this._layer.updatePosition();\n            this._resize = l.listen(window, \"resize\", x(this._layer.updatePosition.bind(this._layer)));\n        },\n        _detach: function() {\n            this._resize.remove();\n            this._resize = null;\n        }\n    });\n    e.exports = z;\n});\n__d(\"eachKeyVal\", [], function(a, b, c, d, e, f) {\n    function g(h, i, j) {\n        if (((!h || !i))) {\n            return;\n        }\n    ;\n    ;\n        var k = Object.keys(h), l;\n        for (l = 0; ((l < k.length)); l++) {\n            i.call(j, k[l], h[k[l]], h, l);\n        ;\n        };\n    ;\n    };\n;\n    e.exports = g;\n});\n__d(\"LoadingDialogDimensions\", [], function(a, b, c, d, e, f) {\n    var g = {\n        HEIGHT: 96,\n        WIDTH: 300\n    };\n    e.exports = g;\n});\n__d(\"AsyncDialog\", [\"AsyncRequest\",\"Bootloader\",\"CSS\",\"DialogX\",\"DOM\",\"Env\",\"Keys\",\"LayerFadeOnShow\",\"Parent\",\"React\",\"URI\",\"XUISpinner.react\",\"copyProperties\",\"cx\",\"eachKeyVal\",\"emptyFunction\",\"LoadingDialogDimensions\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = b(\"Bootloader\"), i = b(\"CSS\"), j = b(\"DialogX\"), k = b(\"DOM\"), l = b(\"Env\"), m = b(\"Keys\"), n = b(\"LayerFadeOnShow\"), o = b(\"Parent\"), p = b(\"React\"), q = b(\"URI\"), r = b(\"XUISpinner.react\"), s = b(\"copyProperties\"), t = b(\"cx\"), u = b(\"eachKeyVal\"), v = b(\"emptyFunction\"), w = b(\"LoadingDialogDimensions\").WIDTH, x;\n    function y() {\n        if (!x) {\n            var ga = k.create(\"div\", {\n                className: \"_57-x\"\n            });\n            x = new j({\n                width: w,\n                addedBehaviors: [n,],\n                xui: true\n            }, k.create(\"div\", null, ga));\n            p.renderComponent(r({\n                size: \"large\"\n            }), ga);\n            x.subscribe([\"key\",\"JSBNG__blur\",], function(ha, ia) {\n                if (((((ha == \"JSBNG__blur\")) || ((((ha == \"key\")) && ((ia.keyCode == m.ESC))))))) {\n                    ca();\n                    return false;\n                }\n            ;\n            ;\n            });\n        }\n    ;\n    ;\n        return x;\n    };\n;\n    var z = {\n    }, aa = 1, ba = [];\n    function ca() {\n        u(z, function(ga, ha) {\n            ha.abandon();\n            da(ga);\n        });\n    };\n;\n    function da(ga) {\n        delete z[ga];\n        if (!Object.keys(z).length) {\n            y().hide();\n        }\n    ;\n    ;\n    };\n;\n    function ea(ga, ha) {\n        var ia = aa++;\n        ba[ia] = ha;\n        z[ia] = ga;\n        var ja = da.curry(((\"\" + ia)));\n        s(ga.getData(), {\n            __asyncDialog: ia\n        });\n        y().setCausalElement(ga.getRelativeTo()).show();\n        var ka = ga.finallyHandler;\n        ga.setFinallyHandler(function(la) {\n            var ma = la.getPayload();\n            if (((ma && ma.asyncURL))) {\n                fa.send(new g(ma.asyncURL));\n            }\n        ;\n        ;\n            ja();\n            ((ka && ka(la)));\n        });\n        ga.setInterceptHandler(ja).setAbortHandler(ja);\n        ga.send();\n    };\n;\n    var fa = {\n        send: function(ga, ha) {\n            ea(ga, ((ha || v)));\n        },\n        bootstrap: function(ga, ha, ia) {\n            if (!ga) {\n                return;\n            }\n        ;\n        ;\n            var ja = ((o.byClass(ha, \"stat_elem\") || ha));\n            if (((ja && i.hasClass(ja, \"async_saving\")))) {\n                return false;\n            }\n        ;\n        ;\n            var ka = new q(ga).getQueryData(), la = ((ia === \"dialog\")), ma = new g().setURI(ga).setData(ka).setMethod(((la ? \"GET\" : \"POST\"))).setReadOnly(la).setRelativeTo(ha).setStatusElement(ja).setNectarModuleDataSafe(ha);\n            if (l.is_desktop) {\n                h.loadModules([\"FbdDialogProvider\",], function(na) {\n                    na.sendDialog(ma, fa.send);\n                });\n                return;\n            }\n        ;\n        ;\n            fa.send(ma);\n        },\n        respond: function(ga, ha) {\n            var ia = ba[ga];\n            if (ia) {\n                ia(ha);\n                delete ba[ga];\n            }\n        ;\n        ;\n        },\n        getLoadingDialog: function() {\n            return y();\n        }\n    };\n    e.exports = fa;\n});\n__d(\"Hovercard\", [\"JSXDOM\",\"JSBNG__Event\",\"function-extensions\",\"AccessibleLayer\",\"Arbiter\",\"AsyncRequest\",\"AsyncSignal\",\"ContextualDialog\",\"ContextualThing\",\"DOM\",\"LayerAutoFocus\",\"Parent\",\"JSBNG__Rect\",\"Style\",\"UserAgent\",\"Vector\",\"clickRefAction\",\"cx\",\"emptyFunction\",\"tx\",\"userAction\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSXDOM\"), h = b(\"JSBNG__Event\");\n    b(\"function-extensions\");\n    var i = b(\"AccessibleLayer\"), j = b(\"Arbiter\"), k = b(\"AsyncRequest\"), l = b(\"AsyncSignal\"), m = b(\"ContextualDialog\"), n = b(\"ContextualThing\"), o = b(\"DOM\"), p = b(\"LayerAutoFocus\"), q = b(\"Parent\"), r = b(\"JSBNG__Rect\"), s = b(\"Style\"), t = b(\"UserAgent\"), u = b(\"Vector\"), v = b(\"clickRefAction\"), w = b(\"cx\"), x = b(\"emptyFunction\"), y = b(\"tx\"), z = b(\"userAction\"), aa = {\n    }, ba = {\n    }, ca = null, da = null, ea = null, fa = 150, ga = 700, ha = 1000, ia = 250, ja = null, ka = null, la = null, ma = null;\n    function na(JSBNG__event) {\n        var cb = q.byTag(JSBNG__event.getTarget(), \"a\");\n        ((bb.processNode(cb) && JSBNG__event.JSBNG__stop()));\n    };\n;\n    function oa(cb) {\n        da = cb;\n        if (!pa(cb)) {\n            var db;\n            if (((!cb || !(db = qa(cb))))) {\n                ((ba.moveToken && ba.moveToken.remove()));\n                ba = {\n                };\n                return false;\n            }\n        ;\n        ;\n            if (((ba.node != cb))) {\n                ((ba.moveToken && ba.moveToken.remove()));\n                ba = {\n                    node: cb,\n                    endpoint: db,\n                    pos: null\n                };\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n        return true;\n    };\n;\n    function pa(cb) {\n        return ((((cb && ca)) && ((ba.node == cb))));\n    };\n;\n    function qa(cb) {\n        return cb.getAttribute(\"data-hovercard\");\n    };\n;\n    function ra(cb) {\n        var db = h.listen(cb, \"mouseout\", function() {\n            JSBNG__clearTimeout(ja);\n            JSBNG__clearTimeout(ka);\n            db.remove();\n            da = null;\n            if (!bb.contains(cb)) {\n                bb.hide();\n            }\n        ;\n        ;\n        });\n        if (!ba.moveToken) {\n            ba.moveToken = h.listen(cb, \"mousemove\", function(JSBNG__event) {\n                ba.pos = u.getEventPosition(JSBNG__event);\n            });\n        }\n    ;\n    ;\n        JSBNG__clearTimeout(ja);\n        JSBNG__clearTimeout(ka);\n        JSBNG__clearTimeout(ma);\n        var eb = fa, fb = ((ca ? ia : ga));\n        if (cb.getAttribute(\"data-hovercard-instant\")) {\n            eb = fb = 50;\n        }\n    ;\n    ;\n        ja = JSBNG__setTimeout(wa.curry(cb), eb);\n        ka = JSBNG__setTimeout(sa.curry(cb), fb);\n    };\n;\n    function sa(cb, db) {\n        if (((ba.node != cb))) {\n            return;\n        }\n    ;\n    ;\n        var eb = aa[qa(cb)];\n        if (eb) {\n            ua(eb);\n        }\n         else if (db) {\n            ua(ya());\n        }\n         else {\n            var fb = ((ca ? ia : ga));\n            la = JSBNG__setTimeout(sa.curry(cb, true), ((ha - fb)));\n        }\n        \n    ;\n    ;\n    };\n;\n    function ta() {\n        bb.hide(true);\n        JSBNG__clearTimeout(ka);\n    };\n;\n    function ua(cb) {\n        var db = ba.node, eb = ca, fb = ((eb != db));\n        if (ea) {\n            var gb = ea.getContentRoot();\n            if (!n.containsIncludingLayers(gb, db)) {\n                ea.hide();\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n        if (!o.contains(JSBNG__document.body, db)) {\n            bb.hide(true);\n            return;\n        }\n    ;\n    ;\n        ca = db;\n        ea = cb;\n        cb.setContextWithBounds(db, va(db)).show();\n        if (fb) {\n            (function() {\n                new l(\"/ajax/hovercard/shown.php\").send();\n                v(\"himp\", ca, null, \"FORCE\", {\n                    ft: {\n                        evt: 39\n                    }\n                });\n                z(\"hovercard\", ca).uai(\"show\");\n            }).defer();\n        }\n    ;\n    ;\n    };\n;\n    function va(cb) {\n        var db = ba.pos, eb = cb.getClientRects();\n        if (((!db || ((eb.length === 0))))) {\n            return r.getElementBounds(cb);\n        }\n    ;\n    ;\n        var fb, gb = false;\n        for (var hb = 0; ((hb < eb.length)); hb++) {\n            var ib = new r(Math.round(eb[hb].JSBNG__top), Math.round(eb[hb].right), Math.round(eb[hb].bottom), Math.round(eb[hb].left), \"viewport\").convertTo(\"JSBNG__document\"), jb = ib.getPositionVector(), kb = jb.add(ib.getDimensionVector());\n            if (((!fb || ((((jb.x <= fb.l)) && ((jb.y > fb.t))))))) {\n                if (gb) {\n                    break;\n                }\n            ;\n            ;\n                fb = new r(jb.y, kb.x, kb.y, jb.x, \"JSBNG__document\");\n            }\n             else {\n                fb.t = Math.min(fb.t, jb.y);\n                fb.b = Math.max(fb.b, kb.y);\n                fb.r = kb.x;\n            }\n        ;\n        ;\n            if (ib.contains(db)) {\n                gb = true;\n            }\n        ;\n        ;\n        };\n    ;\n        return fb;\n    };\n;\n    function wa(cb) {\n        if (((cb.id && ((aa[cb.id] != null))))) {\n            return;\n        }\n    ;\n    ;\n        var db = qa(cb);\n        if (((aa[db] != null))) {\n            return;\n        }\n    ;\n    ;\n        xa(db);\n        var eb = function() {\n            bb.dirty(db);\n            ta();\n        };\n        new k(db).setData({\n            endpoint: db\n        }).setMethod(\"GET\").setReadOnly(true).setErrorHandler(eb).setTransportErrorHandler(eb).send();\n    };\n;\n    function xa(cb) {\n        aa[cb] = false;\n    };\n;\n    var ya = function() {\n        var cb = new m({\n            width: 275\n        }, g.div({\n            className: \"_7lk\"\n        }, \"Loading...\"));\n        cb.disableBehavior(i).disableBehavior(p);\n        za(cb);\n        ya = x.thatReturns(cb);\n        return cb;\n    };\n    function za(cb) {\n        var db = [cb.subscribe(\"mouseenter\", function() {\n            JSBNG__clearTimeout(ma);\n            da = ba.node;\n        }),cb.subscribe(\"mouseleave\", function() {\n            cb.hide();\n            da = null;\n        }),cb.subscribe(\"destroy\", function() {\n            while (db.length) {\n                db.pop().unsubscribe();\n            ;\n            };\n        ;\n            db = null;\n        }),];\n    };\n;\n    var ab = true, bb = {\n        hide: function(cb) {\n            if (!ca) {\n                return;\n            }\n        ;\n        ;\n            if (cb) {\n                if (ea) {\n                    ea.hide();\n                }\n            ;\n            ;\n                da = null;\n                ca = null;\n                ea = null;\n            }\n             else ma = JSBNG__setTimeout(bb.hide.curry(true), ia);\n        ;\n        ;\n        },\n        setDialog: function(cb, db) {\n            db.disableBehavior(i).disableBehavior(p);\n            aa[cb] = db;\n            za(db);\n            if (((((ba.endpoint == cb)) && ((da == ba.node))))) {\n                ya().hide();\n                var eb = ba.node.getAttribute(\"data-hovercard-position\");\n                ((eb && db.setPosition(eb)));\n                var fb = ba.node.getAttribute(\"data-hovercard-offset-x\");\n                ((fb && db.setOffsetX(parseInt(fb, 10))));\n                var gb = ba.node.getAttribute(\"data-hovercard-offset-y\");\n                ((gb && db.setOffsetY(parseInt(gb, 10))));\n                ua(db);\n            }\n        ;\n        ;\n        },\n        getDialog: function(cb) {\n            return aa[cb];\n        },\n        contains: function(cb) {\n            if (ea) {\n                return n.containsIncludingLayers(ea.getContentRoot(), cb);\n            }\n        ;\n        ;\n            return false;\n        },\n        dirty: function(cb) {\n            var db = aa[cb];\n            if (db) {\n                db.destroy();\n                delete aa[cb];\n            }\n        ;\n        ;\n        },\n        dirtyAll: function() {\n            {\n                var fin124keys = ((window.top.JSBNG_Replay.forInKeys)((aa))), fin124i = (0);\n                var cb;\n                for (; (fin124i < fin124keys.length); (fin124i++)) {\n                    ((cb) = (fin124keys[fin124i]));\n                    {\n                        var db = aa[cb];\n                        ((db && bb.dirty(cb)));\n                    };\n                };\n            };\n        ;\n            j.inform(\"Hovercard/dirty\");\n        },\n        processNode: function(cb) {\n            if (((cb && oa(cb)))) {\n                ra(cb);\n                return true;\n            }\n        ;\n        ;\n            return false;\n        },\n        setDirtyAllOnPageTransition: function(cb) {\n            ab = cb;\n        }\n    };\n    (function() {\n        if (((t.ie() < 8))) {\n            return;\n        }\n    ;\n    ;\n        h.listen(JSBNG__document.documentElement, \"mouseover\", na);\n        h.listen(window, \"JSBNG__scroll\", function() {\n            if (((ca && s.isFixed(ca)))) {\n                bb.hide(true);\n            }\n        ;\n        ;\n        });\n        j.subscribe(\"page_transition\", function() {\n            ta();\n            ((ab && bb.dirtyAll()));\n        }, j.SUBSCRIBE_NEW);\n    })();\n    e.exports = bb;\n});\n__d(\"StickyPlaceholderInput\", [\"JSBNG__Event\",\"CSS\",\"DOM\",\"Input\",\"Parent\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"CSS\"), i = b(\"DOM\"), j = b(\"Input\"), k = b(\"Parent\"), l = b(\"emptyFunction\");\n    function m(q) {\n        return k.byClass(q, \"uiStickyPlaceholderInput\");\n    };\n;\n    function n(q) {\n        return i.scry(q, \".placeholder\")[0];\n    };\n;\n    function o(q) {\n        q = ((q || window.JSBNG__event));\n        var r = ((q.target || q.srcElement));\n        if (i.isNodeOfType(r, [\"input\",\"textarea\",])) {\n            var s = m(r);\n            if (s) {\n                (function() {\n                    h.conditionClass(s, \"uiStickyPlaceholderEmptyInput\", !r.value.length);\n                }).defer();\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n    };\n;\n    var p = {\n        init: function() {\n            p.init = l;\n            g.listen(JSBNG__document.documentElement, {\n                keydown: o,\n                paste: o,\n                focusout: o\n            });\n        },\n        registerInput: function(q) {\n            p.init();\n            var r = ((q.getAttribute(\"placeholder\") || \"\"));\n            if (r.length) {\n                if (((JSBNG__document.activeElement === q))) {\n                    var s = g.listen(q, \"JSBNG__blur\", function() {\n                        p.manipulateInput(q, r);\n                        s.remove();\n                    });\n                }\n                 else p.manipulateInput(q, r);\n            ;\n            }\n        ;\n        ;\n        },\n        manipulateInput: function(q, r) {\n            var s = i.create(\"div\", {\n                className: \"placeholder\",\n                \"aria-hidden\": \"true\"\n            }, r), t = i.create(\"div\", {\n                className: \"uiStickyPlaceholderInput\"\n            }, s);\n            if (i.isNodeOfType(q, \"textarea\")) {\n                h.addClass(t, \"uiStickyPlaceholderTextarea\");\n            }\n        ;\n        ;\n            g.listen(s, \"click\", function() {\n                q.JSBNG__focus();\n            });\n            if (((q.value === r))) {\n                q.value = \"\";\n            }\n        ;\n        ;\n            h.removeClass(q, \"DOMControl_placeholder\");\n            q.setAttribute(\"placeholder\", \"\");\n            i.replace(q, t);\n            i.appendContent(t, q);\n            h.conditionClass(t, \"uiStickyPlaceholderEmptyInput\", !q.value.length);\n        },\n        setPlaceholderText: function(q, r) {\n            var s = m(q);\n            if (!s) {\n                j.setPlaceholder(q, r);\n            }\n             else {\n                var t = n(s);\n                ((t && i.setContent(t, r)));\n            }\n        ;\n        ;\n        },\n        getPlaceholderText: function(q) {\n            var r = m(q), s = n(r);\n            return ((s && i.getText(s)));\n        },\n        update: function(q) {\n            var r = m(q);\n            if (r) {\n                h.conditionClass(r, \"uiStickyPlaceholderEmptyInput\", !q.value.length);\n            }\n        ;\n        ;\n        },\n        getVisibleText: function(q) {\n            var r = m(q);\n            if (h.hasClass(r, \"uiStickyPlaceholderEmptyInput\")) {\n                var s = n(r);\n                return ((s && i.getText(s)));\n            }\n             else return q.value\n        ;\n        }\n    };\n    e.exports = p;\n});\n__d(\"UIForm\", [\"JSBNG__Event\",\"ArbiterMixin\",\"BehaviorsMixin\",\"DOM\",\"Form\",\"Run\",\"areObjectsEqual\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"ArbiterMixin\"), i = b(\"BehaviorsMixin\"), j = b(\"DOM\"), k = b(\"Form\"), l = b(\"Run\"), m = b(\"areObjectsEqual\"), n = b(\"copyProperties\");\n    function o(p, q, r, s, t) {\n        this._root = p;\n        this.controller = p;\n        this._message = q;\n        if (s) {\n            this._confirm_dialog = s;\n            s.subscribe(\"JSBNG__confirm\", this._handleDialogConfirm.bind(this));\n            j.prependContent(this._root, j.create(\"input\", {\n                type: \"hidden\",\n                JSBNG__name: \"confirmed\",\n                value: \"true\"\n            }));\n        }\n    ;\n    ;\n        l.onAfterLoad(function() {\n            this._originalState = k.serialize(this._root);\n        }.bind(this));\n        this._forceDirty = r;\n        this._confirmed = false;\n        this._submitted = false;\n        g.listen(this._root, \"submit\", this._handleSubmit.bind(this));\n        if (((t && t.length))) {\n            this.enableBehaviors(t);\n        }\n    ;\n    ;\n        var u = true;\n        l.onBeforeUnload(this.checkUnsaved.bind(this), u);\n    };\n;\n    n(o.prototype, h, i, {\n        getRoot: function() {\n            return this._root;\n        },\n        _handleSubmit: function() {\n            if (((this._confirm_dialog && !this._confirmed))) {\n                this._confirm_dialog.show();\n                return false;\n            }\n        ;\n        ;\n            if (((this.inform(\"submit\") === false))) {\n                return false;\n            }\n        ;\n        ;\n            this._submitted = true;\n            return true;\n        },\n        _handleDialogConfirm: function() {\n            this._confirmed = true;\n            this._confirm_dialog.hide();\n            if (this._root.getAttribute(\"ajaxify\")) {\n                g.fire(this._root, \"submit\");\n            }\n             else if (this._handleSubmit()) {\n                this._root.submit();\n            }\n            \n        ;\n        ;\n        },\n        reset: function() {\n            this.inform(\"reset\");\n            this._submitted = false;\n            this._confirmed = false;\n        },\n        isDirty: function() {\n            if (((this._submitted || !j.contains(JSBNG__document.body, this._root)))) {\n                return false;\n            }\n        ;\n        ;\n            if (this._forceDirty) {\n                return true;\n            }\n        ;\n        ;\n            var p = k.serialize(this._root);\n            return !m(p, this._originalState);\n        },\n        checkUnsaved: function() {\n            if (this.isDirty()) {\n                return this._message;\n            }\n        ;\n        ;\n            return null;\n        }\n    });\n    e.exports = ((a.UIForm || o));\n});\n__d(\"MenuTheme\", [\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"cx\");\n    e.exports = {\n        className: \"_569t\"\n    };\n});\n__d(\"legacy:Tooltip\", [\"Tooltip\",], function(a, b, c, d) {\n    a.Tooltip = b(\"Tooltip\");\n}, 3);\n__d(\"BanzaiODS\", [\"Banzai\",\"invariant\",], function(a, b, c, d, e, f) {\n    var g = b(\"Banzai\"), h = b(\"invariant\");\n    function i() {\n        var k = {\n        };\n        function l(m, n, o, p) {\n            var q = ((k[m] || (k[m] = {\n            }))), r = ((q[n] || (q[n] = [0,])));\n            if (((o === undefined))) {\n                o = 1;\n            }\n        ;\n        ;\n            if (((p === undefined))) {\n                p = 1;\n            }\n        ;\n        ;\n            o = Number(o);\n            p = Number(p);\n            if (((!isFinite(o) || !isFinite(p)))) {\n                return;\n            }\n        ;\n        ;\n            r[0] += o;\n            if (((arguments.length >= 4))) {\n                if (!r[1]) {\n                    r[1] = 0;\n                }\n            ;\n            ;\n                r[1] += p;\n            }\n        ;\n        ;\n        };\n    ;\n        return {\n            bumpEntityKey: function(m, n, o) {\n                l(m, n, o);\n            },\n            bumpFraction: function(m, n, o, p) {\n                l(m, n, o, p);\n            },\n            flush: function(m) {\n                {\n                    var fin125keys = ((window.top.JSBNG_Replay.forInKeys)((k))), fin125i = (0);\n                    var n;\n                    for (; (fin125i < fin125keys.length); (fin125i++)) {\n                        ((n) = (fin125keys[fin125i]));\n                        {\n                            g.post(((\"ods:\" + n)), k[n], m);\n                        ;\n                        };\n                    };\n                };\n            ;\n                k = {\n                };\n            }\n        };\n    };\n;\n    var j = i();\n    j.create = i;\n    g.subscribe(g.SEND, j.flush.bind(j, null));\n    e.exports = j;\n});\n__d(\"endsWith\", [], function(a, b, c, d, e, f) {\n    function g(h, i) {\n        return ((h.indexOf(i, ((h.length - i.length))) > -1));\n    };\n;\n    e.exports = g;\n});\n__d(\"extendArray\", [], function(a, b, c, d, e, f) {\n    function g(h, i) {\n        Array.prototype.push.apply(h, i);\n        return h;\n    };\n;\n    e.exports = g;\n});");
// 1556
geval("if (JSBNG__self.CavalryLogger) {\n    CavalryLogger.start_js([\"4vv8/\",]);\n}\n;\n;\n__d(\"TimeSpentBitArrayLogger\", [\"UserActivity\",\"copyProperties\",\"Banzai\",\"BanzaiODS\",\"TimeSpentArray\",\"Arbiter\",\"TimeSpentConfig\",], function(a, b, c, d, e, f) {\n    var g = b(\"UserActivity\"), h = b(\"copyProperties\"), i = b(\"Banzai\"), j = b(\"BanzaiODS\"), k = b(\"TimeSpentArray\"), l = b(\"Arbiter\"), m = b(\"TimeSpentConfig\"), n = {\n        store: true,\n        delay: m.initial_delay,\n        retry: true\n    };\n    function o(p) {\n        if (i.isEnabled(\"time_spent_bit_array\")) {\n            l.inform(\"timespent/tosbitdataposted\", h({\n            }, p));\n            i.post(\"time_spent_bit_array\", h({\n            }, p), n);\n            n.delay = m.delay;\n        }\n    ;\n    ;\n    };\n;\n    e.exports = {\n        init: function(p) {\n            if (((window.JSBNG__top == window.JSBNG__self))) {\n                g.subscribe(function(q, r) {\n                    k.update(r.last_inform);\n                });\n                k.init(o, m.initial_timeout);\n                j.bumpEntityKey(\"ms.time_spent.qa.www\", \"time_spent.bits.js_initialized\");\n            }\n        ;\n        ;\n        }\n    };\n});");
// 2056
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"if (self.CavalryLogger) {\n    CavalryLogger.start_js([\"63VzN\",]);\n}\n;\n__d(\"NotificationURI\", [\"URI\",], function(a, b, c, d, e, f) {\n    var g = b(\"URI\"), h = {\n        localize: function(i) {\n            i = g(i);\n            if (!i.isFacebookURI()) {\n                return i.toString()\n            };\n            var j = i.getSubdomain();\n            return i.getUnqualifiedURI().getQualifiedURI().setSubdomain(j).toString();\n        },\n        snowliftable: function(i) {\n            if (!i) {\n                return false\n            };\n            i = g(i);\n            return (i.isFacebookURI() && i.getQueryData().hasOwnProperty(\"fbid\"));\n        },\n        isVaultSetURI: function(i) {\n            if (!i) {\n                return false\n            };\n            i = g(i);\n            return (i.isFacebookURI() && (i.getPath() == \"/ajax/vault/sharer_preview.php\"));\n        }\n    };\n    e.exports = h;\n});\n__d(\"legacy:fbdesktop-detect\", [\"FBDesktopDetect\",], function(a, b, c, d) {\n    a.FbDesktopDetect = b(\"FBDesktopDetect\");\n}, 3);\n__d(\"IntlUtils\", [\"AsyncRequest\",\"Cookie\",\"goURI\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = b(\"Cookie\"), i = b(\"goURI\"), j = {\n        setXmode: function(k) {\n            (new g()).setURI(\"/ajax/intl/save_xmode.php\").setData({\n                xmode: k\n            }).setHandler(function() {\n                document.location.reload();\n            }).send();\n        },\n        setAmode: function(k) {\n            new g().setURI(\"/ajax/intl/save_xmode.php\").setData({\n                amode: k,\n                app: false\n            }).setHandler(function() {\n                document.location.reload();\n            }).send();\n        },\n        setLocale: function(k, l, m, n) {\n            if (!m) {\n                m = k.options[k.selectedIndex].value;\n            };\n            j.saveLocale(m, true, null, l, n);\n        },\n        saveLocale: function(k, l, m, n, o) {\n            new g().setURI(\"/ajax/intl/save_locale.php\").setData({\n                aloc: k,\n                source: n,\n                app_only: o\n            }).setHandler(function(p) {\n                if (l) {\n                    document.location.reload();\n                }\n                 else i(m);\n            ;\n            }).send();\n        },\n        setLocaleCookie: function(k, l) {\n            h.set(\"locale\", k, ((7 * 24) * 3600000));\n            i(l);\n        }\n    };\n    e.exports = j;\n});\n__d(\"legacy:intl-base\", [\"IntlUtils\",], function(a, b, c, d) {\n    var e = b(\"IntlUtils\");\n    a.intl_set_xmode = e.setXmode;\n    a.intl_set_amode = e.setAmode;\n    a.intl_set_locale = e.setLocale;\n    a.intl_save_locale = e.saveLocale;\n    a.intl_set_cookie_locale = e.setLocaleCookie;\n}, 3);\n__d(\"legacy:onload-action\", [\"OnloadHooks\",], function(a, b, c, d) {\n    var e = b(\"OnloadHooks\");\n    a._onloadHook = e._onloadHook;\n    a._onafterloadHook = e._onafterloadHook;\n    a.runHook = e.runHook;\n    a.runHooks = e.runHooks;\n    a.keep_window_set_as_loaded = e.keepWindowSetAsLoaded;\n}, 3);\n__d(\"LoginFormController\", [\"Event\",\"ge\",\"Button\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"ge\"), i = b(\"Button\");\n    f.init = function(j, k) {\n        g.listen(j, \"submit\", function() {\n            i.setEnabled(k, false);\n            i.setEnabled.curry(k, true).defer(15000);\n        });\n        var l = h(\"lgnjs\");\n        if (l) {\n            l.value = parseInt((Date.now() / 1000), 10);\n        };\n    };\n});\n__d(\"ClickRefUtils\", [], function(a, b, c, d, e, f) {\n    var g = {\n        get_intern_ref: function(h) {\n            if (!!h) {\n                var i = {\n                    profile_minifeed: 1,\n                    gb_content_and_toolbar: 1,\n                    gb_muffin_area: 1,\n                    ego: 1,\n                    bookmarks_menu: 1,\n                    jewelBoxNotif: 1,\n                    jewelNotif: 1,\n                    BeeperBox: 1,\n                    navSearch: 1\n                };\n                for (var j = h; (j && (j != document.body)); j = j.parentNode) {\n                    if ((!j.id || (typeof j.id !== \"string\"))) {\n                        continue;\n                    };\n                    if ((j.id.substr(0, 8) == \"pagelet_\")) {\n                        return j.id.substr(8)\n                    };\n                    if ((j.id.substr(0, 8) == \"box_app_\")) {\n                        return j.id\n                    };\n                    if (i[j.id]) {\n                        return j.id\n                    };\n                };\n            }\n        ;\n            return \"-\";\n        },\n        get_href: function(h) {\n            var i = (((((h.getAttribute && ((h.getAttribute(\"ajaxify\") || h.getAttribute(\"data-endpoint\")))) || h.action) || h.href) || h.name));\n            return ((typeof i === \"string\") ? i : null);\n        },\n        should_report: function(h, i) {\n            if ((i == \"FORCE\")) {\n                return true\n            };\n            if ((i == \"INDIRECT\")) {\n                return false\n            };\n            return (h && ((g.get_href(h) || ((h.getAttribute && h.getAttribute(\"data-ft\"))))));\n        }\n    };\n    e.exports = g;\n});\n__d(\"setUECookie\", [\"Env\",], function(a, b, c, d, e, f) {\n    var g = b(\"Env\");\n    function h(i) {\n        if (!g.no_cookies) {\n            document.cookie = (((\"act=\" + encodeURIComponent(i)) + \"; path=/; domain=\") + window.location.hostname.replace(/^.*(\\.facebook\\..*)$/i, \"$1\"));\n        };\n    };\n    e.exports = h;\n});\n__d(\"ClickRefLogger\", [\"Arbiter\",\"EagleEye\",\"ClickRefUtils\",\"collectDataAttributes\",\"copyProperties\",\"ge\",\"setUECookie\",\"$\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"EagleEye\"), i = b(\"ClickRefUtils\"), j = b(\"collectDataAttributes\"), k = b(\"copyProperties\"), l = b(\"ge\"), m = b(\"setUECookie\"), n = b(\"$\");\n    function o(q) {\n        if (!l(\"content\")) {\n            return [0,0,0,0,]\n        };\n        var r = n(\"content\"), s = (a.Vector2 ? a.Vector2.getEventPosition(q) : {\n            x: 0,\n            y: 0\n        });\n        return [s.x,s.y,r.offsetLeft,r.clientWidth,];\n    };\n    function p(q, r, event, s) {\n        var t = ((!a.ArbiterMonitor) ? \"r\" : \"a\"), u = [0,0,0,0,], v, w, x;\n        if (!!event) {\n            v = event.type;\n            if (((v == \"click\") && l(\"content\"))) {\n                u = o(event);\n            };\n            var y = 0;\n            (event.ctrlKey && (y += 1));\n            (event.shiftKey && (y += 2));\n            (event.altKey && (y += 4));\n            (event.metaKey && (y += 8));\n            if (y) {\n                v += y;\n            };\n        }\n    ;\n        if (!!r) {\n            w = i.get_href(r);\n        };\n        var z = [];\n        if (a.ArbiterMonitor) {\n            x = a.ArbiterMonitor.getInternRef(r);\n            z = a.ArbiterMonitor.getActFields();\n        }\n    ;\n        var aa = j((!!event ? ((event.target || event.srcElement)) : r), [\"ft\",\"gt\",]);\n        k(aa.ft, (s.ft || {\n        }));\n        k(aa.gt, (s.gt || {\n        }));\n        if ((typeof (aa.ft.ei) === \"string\")) {\n            delete aa.ft.ei;\n        };\n        var ba = [q._ue_ts,q._ue_count,(w || \"-\"),q._context,(v || \"-\"),(x || i.get_intern_ref(r)),t,(a.URI ? a.URI.getRequestURI(true, true).getUnqualifiedURI().toString() : ((location.pathname + location.search) + location.hash)),aa,].concat(u).concat(z);\n        return ba;\n    };\n    g.subscribe(\"ClickRefAction/new\", function(q, r) {\n        if (i.should_report(r.node, r.mode)) {\n            var s = p(r.cfa, r.node, r.event, r.extra_data);\n            m(r.cfa.ue);\n            h.log(\"act\", s);\n            if (window.chromePerfExtension) {\n                window.postMessage({\n                    clickRef: JSON.stringify(s)\n                }, window.location.origin);\n            };\n        }\n    ;\n    });\n});\n__d(\"QuicklingAugmenter\", [\"URI\",], function(a, b, c, d, e, f) {\n    var g = b(\"URI\"), h = [], i = {\n        addHandler: function(j) {\n            h.push(j);\n        },\n        augmentURI: function(j) {\n            var k = [], l = g(j);\n            h.forEach(function(m) {\n                var n = m(l);\n                if (!n) {\n                    return l\n                };\n                k.push(m);\n                l = l.addQueryData(n);\n            });\n            h = k;\n            return l;\n        }\n    };\n    e.exports = i;\n});\n__d(\"Quickling\", [\"AjaxPipeRequest\",\"Arbiter\",\"Class\",\"CSSClassTransition\",\"DocumentTitle\",\"DOM\",\"ErrorUtils\",\"HTML\",\"OnloadHooks\",\"PageTransitions\",\"QuicklingAugmenter\",\"Run\",\"URI\",\"UserAgent\",\"copyProperties\",\"goOrReplace\",\"isEmpty\",\"QuicklingConfig\",], function(a, b, c, d, e, f) {\n    var g = b(\"AjaxPipeRequest\"), h = b(\"Arbiter\"), i = b(\"Class\"), j = b(\"CSSClassTransition\"), k = b(\"DocumentTitle\"), l = b(\"DOM\"), m = b(\"ErrorUtils\"), n = b(\"HTML\"), o = b(\"OnloadHooks\"), p = b(\"PageTransitions\"), q = b(\"QuicklingAugmenter\"), r = b(\"Run\"), s = b(\"URI\"), t = b(\"UserAgent\"), u = b(\"copyProperties\"), v = b(\"goOrReplace\"), w = b(\"isEmpty\"), x = b(\"QuicklingConfig\"), y = x.version, z = x.sessionLength, aa = new RegExp(x.inactivePageRegex), ba = 0, ca, da = \"\", ea = {\n        isActive: function() {\n            return true;\n        },\n        isPageActive: function(la) {\n            if ((la == \"#\")) {\n                return false\n            };\n            la = new s(la);\n            if ((la.getDomain() && (la.getDomain() != s().getDomain()))) {\n                return false\n            };\n            if ((la.getPath() == \"/l.php\")) {\n                var ma = la.getQueryData().u;\n                if (ma) {\n                    ma = s(unescape(ma)).getDomain();\n                    if ((ma && (ma != s().getDomain()))) {\n                        return false\n                    };\n                }\n            ;\n            }\n        ;\n            var na = la.getPath(), oa = la.getQueryData();\n            if (!w(oa)) {\n                na += (\"?\" + s.implodeQuery(oa));\n            };\n            return !aa.test(na);\n        },\n        getLoadCount: function() {\n            return ba;\n        }\n    };\n    function fa(la) {\n        la = (la || \"Facebook\");\n        k.set(la);\n        if (t.ie()) {\n            da = la;\n            if (!ca) {\n                ca = window.setInterval(function() {\n                    var ma = da, na = k.get();\n                    if ((ma != na)) {\n                        k.set(ma);\n                    };\n                }, 5000, false);\n            };\n        }\n    ;\n    };\n    function ga(la) {\n        var ma = document.getElementsByTagName(\"link\");\n        for (var na = 0; (na < ma.length); ++na) {\n            if ((ma[na].rel != \"alternate\")) {\n                continue;\n            };\n            l.remove(ma[na]);\n        };\n        if (la.length) {\n            var oa = l.find(document, \"head\");\n            (oa && l.appendContent(oa, n(la[0])));\n        }\n    ;\n    };\n    function ha(la) {\n        var ma = {\n            version: y\n        };\n        this.parent.construct(this, la, {\n            quickling: ma\n        });\n    };\n    i.extend(ha, g);\n    u(ha.prototype, {\n        _preBootloadFirstResponse: function(la) {\n            return true;\n        },\n        _fireDomContentCallback: function() {\n            (this._request.cavalry && this._request.cavalry.setTimeStamp(\"t_domcontent\"));\n            p.transitionComplete();\n            (this._onPageDisplayed && this._onPageDisplayed(this.pipe));\n            this.parent._fireDomContentCallback();\n        },\n        _fireOnloadCallback: function() {\n            if (this._request.cavalry) {\n                this._request.cavalry.setTimeStamp(\"t_hooks\");\n                this._request.cavalry.setTimeStamp(\"t_layout\");\n                this._request.cavalry.setTimeStamp(\"t_onload\");\n            }\n        ;\n            this.parent._fireOnloadCallback();\n        },\n        isPageActive: function(la) {\n            return ea.isPageActive(la);\n        },\n        _versionCheck: function(la) {\n            if ((la.version == y)) {\n                return true\n            };\n            var ma = [\"quickling\",\"ajaxpipe\",\"ajaxpipe_token\",];\n            v(window.location, s(la.uri).removeQueryData(ma), true);\n            return false;\n        },\n        _processFirstResponse: function(la) {\n            var ma = la.getPayload();\n            fa(ma.title);\n            ga((ma.syndication || []));\n            window.scrollTo(0, 0);\n            j.go(document.body, (ma.body_class || \"\"), p.getMostRecentURI(), la.getRequest().getURI());\n            h.inform(\"quickling/response\");\n        },\n        getSanitizedParameters: function() {\n            return [\"quickling\",];\n        }\n    });\n    function ia() {\n        ba++;\n        return (ba >= z);\n    };\n    function ja(la) {\n        g.setCurrentRequest(null);\n        if (ia()) {\n            return false\n        };\n        la = q.augmentURI(la);\n        if (!ea.isPageActive(la)) {\n            return false\n        };\n        window.ExitTime = Date.now();\n        r.__removeHook(\"onafterloadhooks\");\n        r.__removeHook(\"onloadhooks\");\n        o.runHooks(\"onleavehooks\");\n        h.inform(\"onload/exit\", true);\n        new ha(la).setCanvasId(\"content\").send();\n        return true;\n    };\n    function ka(la) {\n        var ma = window[la];\n        function na(oa, pa, qa) {\n            if ((typeof oa !== \"function\")) {\n                oa = eval.bind(null, oa);\n            };\n            var ra = ma(m.guard(oa), pa);\n            if ((pa > 0)) {\n                if ((qa !== false)) {\n                    r.onLeave(function() {\n                        clearInterval(ra);\n                    });\n                }\n            };\n            return ra;\n        };\n        window[la] = na;\n    };\n    r.onAfterLoad(function la() {\n        ka(\"setInterval\");\n        ka(\"setTimeout\");\n        p.registerHandler(ja, 1);\n    });\n    e.exports = a.Quickling = ea;\n});\n__d(\"ScubaSample\", [\"Banzai\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = \"scuba_sample\", h = b(\"Banzai\"), i = b(\"copyProperties\");\n    function j(m, n, o) {\n        this.fields = {\n        };\n        this.flush = function() {\n            if (!m) {\n                return\n            };\n            var p = {\n            };\n            i(p, this.fields);\n            p._ds = m;\n            if (n) {\n                p._lid = n;\n            };\n            p._options = o;\n            h.post(g, p);\n            this.flush = function() {\n            \n            };\n            this.flushed = true;\n        };\n        this.lid = n;\n        return this;\n    };\n    function k(m, n, o) {\n        if (!this.fields[m]) {\n            this.fields[m] = {\n            };\n        };\n        this.fields[m][n] = o;\n        return this;\n    };\n    function l(m) {\n        return function(n, o) {\n            if (this.flushed) {\n                return this\n            };\n            return k.call(this, m, n, o);\n        };\n    };\n    i(j.prototype, {\n        addNormal: l(\"normal\"),\n        addInteger: l(\"int\"),\n        addDenorm: l(\"denorm\")\n    });\n    e.exports = j;\n});\n__d(\"ScriptMonitorReporter\", [\"ScriptMonitor\",\"ScubaSample\",\"setTimeoutAcrossTransitions\",\"URI\",], function(a, b, c, d, e, f) {\n    var g = b(\"ScriptMonitor\"), h = b(\"ScubaSample\"), i = b(\"setTimeoutAcrossTransitions\"), j = b(\"URI\");\n    function k(o) {\n        var p = [];\n        for (var q = 0; (q < o.length); q++) {\n            p.push(new RegExp(o[q], \"i\"));;\n        };\n        return p;\n    };\n    function l(o, p) {\n        for (var q = 0; (q < p.length); q++) {\n            if (p[q].src) {\n                o.push(p[q].src);\n            };\n        };\n    };\n    function m(o, p) {\n        for (var q = 0; (q < p.length); q++) {\n            if (p[q].test(o)) {\n                return true\n            };\n        };\n        return false;\n    };\n    function n(o, p) {\n        var q = g.stop(), r = {\n            addGeoFields: 1,\n            addBrowserFields: 1,\n            addUser: 1\n        }, s = {\n        };\n        l(q, document.getElementsByTagName(\"script\"));\n        l(q, document.getElementsByTagName(\"iframe\"));\n        for (var t = 0; (t < q.length); t++) {\n            var u = q[t].replace(/\\?.*/, \"\"), v;\n            if (s[u]) {\n                continue;\n            };\n            s[u] = 1;\n            if (!j.isValidURI(u)) {\n                v = true;\n            }\n             else if (m(u, p)) {\n                v = false;\n            }\n             else if (m(new j(u).getDomain(), o)) {\n                v = false;\n            }\n             else v = true;\n            \n            \n        ;\n            if (v) {\n                new h(\"unknown_scripts\", 0, r).addNormal(\"url\", u).flush();\n            };\n        };\n    };\n    e.exports = {\n        runScan: function(o, p) {\n            i(function() {\n                n(k(o), k(p));\n            }, 5000);\n        }\n    };\n});\n__d(\"StringTransformations\", [], function(a, b, c, d, e, f) {\n    e.exports = {\n        unicodeEscape: function(g) {\n            return g.replace(/[^A-Za-z0-9\\-\\.\\:\\_\\$\\/\\+\\=]/g, function(h) {\n                var i = h.charCodeAt().toString(16);\n                return (\"\\\\u\" + ((\"0000\" + i.toUpperCase())).slice(-4));\n            });\n        },\n        unicodeUnescape: function(g) {\n            return g.replace(/(\\\\u[0-9A-Fa-f]{4})/g, function(h) {\n                return String.fromCharCode(parseInt(h.slice(2), 16));\n            });\n        }\n    };\n});\n__d(\"TimeSpentLogger\", [\"Arbiter\",\"Banzai\",\"CSS\",\"ClickRefUtils\",\"DOMEventListener\",\"ScriptPath\",\"UserActivity\",\"collectDataAttributes\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"Banzai\"), i = b(\"CSS\"), j = b(\"ClickRefUtils\"), k = b(\"DOMEventListener\"), l = b(\"ScriptPath\"), m = b(\"UserActivity\"), n = b(\"collectDataAttributes\"), o = b(\"copyProperties\"), p = [m.getLastInformTime(),0,], q = m.getLastInformTime(), r = {\n        tos_seq: 0,\n        tos_cumulative: 0,\n        transport_cause: null,\n        buenopath: null,\n        page_token: null,\n        elements: 0,\n        uact_tos: null,\n        client_time: null\n    }, s = 100, t = 100, u = (10 * 1000), v = (3 * 1000), w = 1, x = 2, y = 4, z = 8, aa = {\n    };\n    m.subscribe(function(ia, ja) {\n        var ka = (p.length - 1);\n        q = ja.last_inform;\n        if ((ja.idleness < v)) {\n            p[ka] += ja.idleness;\n            r.tos_cumulative += ja.idleness;\n        }\n         else {\n            if ((ka > s)) {\n                fa(\"array_limit_reached\");\n            };\n            p.push(ja.idleness, 0);\n        }\n    ;\n    });\n    function ba(ia) {\n        var ja = 0;\n        if (document.getElementById(\"boulder_fixed_header\")) {\n            ja = (ja | w);\n        };\n        if (i.hasClass(document.body, \"timelineLayout\")) {\n            ja = (ja | y);\n            var ka = document.getElementById(\"pagelet_main_column_personal\");\n            if ((ka && (ka.getAttribute(\"data-referrer\") === \"pagelet_main_column_personal_timeline\"))) {\n                ja = (ja | x);\n            };\n            if (i.hasClass(document.body, \"pagesTimelineLayout\")) {\n                ja = (ja | z);\n            };\n        }\n    ;\n        return ja;\n    };\n    function ca(ia) {\n        var ja = ba(), ka = l.getScriptPath(), la = l.getCategoryToken();\n        r.uact_tos = p;\n        if (ka) {\n            r.buenopath = ka.substring(0, t);\n        }\n         else r.buenopath = \"\";\n    ;\n        if (la) {\n            r.page_token = la;\n        }\n         else r.page_token = \"\";\n    ;\n        r.elements = ja;\n        r.transport_cause = ia;\n        r.client_time = Date.now();\n    };\n    function da() {\n        r.tos_seq += 1;\n        p = [q,0,];\n    };\n    var ea = {\n        store: true,\n        delay: 3000,\n        retry: true\n    };\n    function fa(ia) {\n        ca(ia);\n        if (h.isEnabled(\"time_spent\")) {\n            g.inform(\"timespent/tosdataposted\", o({\n            }, r));\n            h.post(\"time_spent\", o({\n            }, r), ea);\n        }\n    ;\n        da();\n    };\n    function ga() {\n        fa(\"heartbeat\");\n    };\n    function ha() {\n        fa(\"before_unload\");\n    };\n    if ((window.top == window.self)) {\n        k.add(window, \"beforeunload\", ha);\n        setInterval(function() {\n            if ((((Date.now() - m.getLastInformTime()) > ((u - 100))) && (((p.length > 2) || (p[(p.length - 1)] > 0))))) {\n                ga();\n            };\n        }, u);\n    }\n;\n    g.subscribe(\"UserAction/new\", function(ia, ja) {\n        if (j.should_report(ja.node, ja.mode)) {\n            var ka = n(ja.node, [\"gt\",]), la = {\n                iref: j.get_intern_ref(ja.node),\n                gt_ref: ka.ref,\n                nav_section: ka.nav_section\n            };\n            ca(\"useraction\");\n            o(la, r);\n            ja.ua.add_data(la);\n            g.inform(\"timespent/tosdataposted\", o({\n            }, r));\n            da();\n        }\n    ;\n    });\n    e.exports = aa;\n});\n__d(\"UserActionHistory\", [\"Arbiter\",\"ClickRefUtils\",\"ScriptPath\",\"throttle\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ClickRefUtils\"), i = b(\"ScriptPath\"), j = b(\"throttle\"), k = {\n        click: 1,\n        submit: 1\n    }, l = false, m = {\n        log: [],\n        len: 0\n    }, n = j.acrossTransitions(function() {\n        try {\n            l._ua_log = JSON.stringify(m);\n        } catch (q) {\n            l = false;\n        };\n    }, 1000);\n    function o() {\n        try {\n            if (a.sessionStorage) {\n                l = a.sessionStorage;\n                (l._ua_log && (m = JSON.parse(l._ua_log)));\n            }\n        ;\n        } catch (q) {\n            l = false;\n        };\n        m.log[(m.len % 10)] = {\n            ts: Date.now(),\n            path: \"-\",\n            index: m.len,\n            type: \"init\",\n            iref: \"-\"\n        };\n        m.len++;\n        g.subscribe(\"UserAction/new\", function(r, s) {\n            var t = s.ua, u = s.node, event = s.event;\n            if ((!event || !((event.type in k)))) {\n                return\n            };\n            var v = {\n                path: i.getScriptPath(),\n                type: event.type,\n                ts: t._ue_ts,\n                iref: (h.get_intern_ref(u) || \"-\"),\n                index: m.len\n            };\n            m.log[(m.len++ % 10)] = v;\n            (l && n());\n        });\n    };\n    function p() {\n        return m.log.sort(function(q, r) {\n            return (((r.ts != q.ts)) ? ((r.ts - q.ts)) : ((r.index - q.index)));\n        });\n    };\n    o();\n    e.exports = {\n        getHistory: p\n    };\n});\n__d(\"clip\", [], function(a, b, c, d, e, f) {\n    function g(h, i, j) {\n        return Math.min(Math.max(h, i), j);\n    };\n    e.exports = g;\n});\n__d(\"MusicButtonStore\", [], function(a, b, c, d, e, f) {\n    var g = {\n    }, h = {\n        addButton: function(i, j) {\n            g[i] = j;\n            return j;\n        },\n        getButton: function(i) {\n            return g[i];\n        },\n        getButtons: function() {\n            return g;\n        },\n        removeButton: function(i) {\n            (g[i] && g[i].resetLoadingTimers());\n            delete g[i];\n        }\n    };\n    e.exports = h;\n});\n__d(\"MusicConstants\", [\"URI\",], function(a, b, c, d, e, f) {\n    var g = b(\"URI\"), h = {\n        DEBUG: false,\n        LIVE_LISTEN_MIN_SPOTIFY_VERSION: \"spotify-0.6.6.0.g5a9eaca5\",\n        enableDebug: function() {\n            this.DEBUG = true;\n        },\n        sameURLs: function(i, j) {\n            var k = /\\/$/;\n            if ((i && j)) {\n                i = g(i);\n                j = g(j);\n                return ((i.getDomain() == j.getDomain()) && (i.getPath() == j.getPath()));\n            }\n        ;\n            return false;\n        },\n        greaterOrEqualToMinimumVersion: function(i, j) {\n            var k = /(?:\\d+\\.)+/, l = i.match(k)[0].split(\".\").slice(0, -1), m = j.match(k)[0].split(\".\").slice(0, -1);\n            if ((l.length !== m.length)) {\n                return false\n            };\n            for (var n = 0; (n < m.length); n++) {\n                if ((+l[n] < +m[n])) {\n                    return false;\n                }\n                 else if ((+l[n] > +m[n])) {\n                    return true\n                }\n            ;\n            };\n            return true;\n        },\n        sanitizeForProviders: function(i) {\n            var j = {\n            };\n            for (var k in i) {\n                if (this.ALLOWED_EXTERNAL_CONTEXT_PARAMS[k]) {\n                    j[k] = i[k];\n                };\n            };\n            return j;\n        },\n        OP: {\n            RESUME: \"RESUME\",\n            PAUSE: \"PAUSE\",\n            PLAY: \"PLAY\",\n            VERSION: \"VERSION\"\n        },\n        STATUS_CHANGE_OP: {\n            STATUS: \"STATUS\",\n            LOGIN: \"LOGIN\",\n            REINFORM: \"REINFORM\"\n        },\n        STATUS_CHANGE_EVENT: {\n            playing: \"PLAY_STATE_CHANGED\",\n            track: \"TRACK_CHANGED\"\n        },\n        DIAGNOSTIC_EVENT: {\n            ALL_PAUSED: \"ALL_PAUSED\",\n            ALL_OFFLINE: \"ALL_OFFLINE\",\n            OFFLINE: \"OFFLINE\",\n            ONLINE: \"ONLINE\",\n            SEARCHING: \"SEARCHING\",\n            HIT: \"HIT\",\n            MISS: \"MISS\",\n            RESIGN: \"RESIGN\",\n            IFRAME_POLLING: \"IFRAME_POLLING\",\n            RELAUNCH: \"RELAUNCH\",\n            STATE_CHANGE: \"STATE_CHANGE\",\n            WRONG_VERSION: \"WRONG_VERSION\",\n            SERVICE_ERROR: \"SERVICE_ERROR\",\n            INCORRECT_ONLINE_STATE: \"INCORRECT_ONLINE_STATE\",\n            LOG_SEND_OP: \"LOG_SEND_OP\",\n            REQUEUE_OP: \"REQUEUE_OP\"\n        },\n        ALLOWED_STATUS_PARAMS: {\n            playing: \"playing\",\n            track: \"track\",\n            context: \"context\",\n            client_version: \"client_version\",\n            start_time: \"start_time\",\n            expires_in: \"expires_in\",\n            open_graph_state: \"open_graph_state\"\n        },\n        ALLOWED_EXTERNAL_CONTEXT_PARAMS: {\n            uri: true,\n            song: true,\n            radio_station: true,\n            album: true,\n            playlist: true,\n            musician: true,\n            song_list: true,\n            offset: true,\n            title: true,\n            request_id: true,\n            listen_with_friends: true,\n            needs_tos: true\n        },\n        LIVE_LISTEN_OP: {\n            NOW_LEADING: \"NOW_LEADING\",\n            NOW_LISTENING: \"NOW_LISTENING\",\n            END_SESSION: \"END_SESSION\",\n            SONG_PLAYING: \"SONG_PLAYING\",\n            LISTENER_UPDATE: \"LISTENER_UPDATE\",\n            QUEUE_SESSION: \"QUEUE_SESSION\",\n            PLAY_ERROR: \"PLAY_ERROR\",\n            SESSION_UPDATED: \"SESSION_UPDATED\",\n            QUEUING_SESSION: \"QUEUING_SESSION\"\n        },\n        MUSIC_BUTTON: {\n            ACTIVATE: \"ACTIVATE\"\n        },\n        ERROR: {\n            1: \"SERVICE_UNAVAILABLE_WITHOUT_PREMIUM\",\n            2: \"SERVICE_UNAVAILABLE_WITHOUT_PREMIUM_OR_WAIT\",\n            3: \"SERVICE_UNAVAILABLE_BILLING_ISSUE\",\n            4: \"SERVICE_UNAVAILABLE_TECHNICAL_ISSUE\",\n            5: \"AUDIO_AD_PLAYING\",\n            99: \"SERVICE_TEMPORARILY_UNAVAILABLE\",\n            101: \"SONG_UNAVAILABLE_WITHOUT_PURCHASE\",\n            102: \"SONG_UNAVAILABLE_WITHOUT_PREMIUM\",\n            103: \"SONG_UNAVAILABLE_INDEFINITELY\"\n        }\n    };\n    e.exports = (a.MusicConstants || h);\n});\n__d(\"MusicEvents\", [\"Arbiter\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\");\n    e.exports = a.MusicEvents = new g();\n});\n__d(\"MusicButton\", [\"BanzaiODS\",\"Bootloader\",\"copyProperties\",\"CSS\",\"DOM\",\"MusicButtonStore\",\"MusicConstants\",\"MusicEvents\",\"Parent\",\"ScubaSample\",\"Tooltip\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"BanzaiODS\"), h = b(\"Bootloader\"), i = b(\"copyProperties\"), j = b(\"CSS\"), k = b(\"DOM\"), l = b(\"MusicButtonStore\"), m = b(\"MusicConstants\"), n = b(\"MusicEvents\"), o = b(\"Parent\"), p = b(\"ScubaSample\"), q = b(\"Tooltip\"), r = b(\"cx\"), s = function(t, u, v, w, x, y) {\n        this.provider = t;\n        this.buttonElem = u;\n        this.url = v;\n        this.context = (w || {\n        });\n        this.mediaType = x;\n        this.setState(this.STATES.OFFLINE);\n        this.tooltip = (y || \"\");\n        n.subscribe(m.MUSIC_BUTTON.ACTIVATE, this.processClick.bind(this));\n    };\n    i(s, {\n        tracksetableTypes: []\n    });\n    i(s.prototype, {\n        SHOW_LOADING_TIMEOUT: 500,\n        HIDE_LOADING_TIMEOUT: 4000,\n        RECENTLY_ONLINE_TIMEOUT: 6000,\n        STATES: {\n            PLAYING: \"music_playing\",\n            PAUSED: \"music_paused\",\n            LOADING: \"music_loading\",\n            DISABLED: \"music_disabled\",\n            OFFLINE: \"music_offline\"\n        },\n        setState: function(t) {\n            if ((t !== this.STATES.LOADING)) {\n                this.resetLoadingTimers();\n                this.previousState = (this.state || t);\n            }\n        ;\n            if ((t === this.STATES.PLAYING)) {\n                q.set(this.buttonElem, this.tooltip);\n            }\n             else q.set(this.buttonElem, \"\");\n        ;\n            var u = this.buttonElem.parentNode;\n            (this.state && j.removeClass(u, this.state));\n            this.state = t;\n            j.addClass(u, this.state);\n        },\n        isTracksetable: function(t) {\n            return (s.tracksetableTypes.indexOf(this.mediaType) !== -1);\n        },\n        handleIncomingEvent: function(t, u) {\n            clearTimeout(this._showLoadingTimer);\n            if (((u && u.provider) && (u.provider != this.provider))) {\n                return\n            };\n            switch (t) {\n              case m.DIAGNOSTIC_EVENT.ONLINE:\n            \n              case m.STATUS_CHANGE_EVENT.track:\n            \n              case m.STATUS_CHANGE_EVENT.playing:\n                var v = ((u && u.track) && u.track.uri), w = ((u && u.context) && u.context.uri);\n                if (((u && u.playing) && ((m.sameURLs(v, this.url) || m.sameURLs(w, this.url))))) {\n                    this.setState(this.STATES.PLAYING);\n                }\n                 else if (((this.state === this.STATES.LOADING) && (((this.previousState === this.STATES.PAUSED) || (this.previousState === this.STATES.OFFLINE))))) {\n                    clearTimeout(this._attemptingPlayTimer);\n                    this._attemptingPlayTimer = this.setState.bind(this, this.STATES.PAUSED).defer(this.RECENTLY_ONLINE_TIMEOUT, false);\n                }\n                 else if (!this._attemptingPlayTimer) {\n                    this.setState(this.STATES.PAUSED);\n                }\n                \n            ;\n                break;\n              case m.DIAGNOSTIC_EVENT.OFFLINE:\n                this.setState(this.STATES.OFFLINE);\n                break;\n              case m.DIAGNOSTIC_EVENT.ALL_OFFLINE:\n                this.setState(this.STATES.OFFLINE);\n                break;\n            };\n        },\n        processClick: function(t, u) {\n            if ((u != this.buttonElem)) {\n                if ((this.state === this.STATES.LOADING)) {\n                    (this.previousState && this.setState(this.previousState));\n                };\n                return;\n            }\n        ;\n            var v = new p(\"music_play_button_click\", null, {\n                addBrowserFields: true,\n                addGeoFields: true,\n                addUser: true\n            });\n            v.addNormal(\"uses_bridge\", \"1\");\n            v.addNormal(\"state\", this.state);\n            v.addNormal(\"provider\", this.provider);\n            v.addNormal(\"class\", \"MusicButton\");\n            v.addDenorm(\"url\", this.url);\n            v.flush();\n            if ((this.state != this.STATES.PLAYING)) {\n                g.bumpEntityKey(\"music_play_button\", \"music_play_button_click\");\n                g.bumpEntityKey(\"music_play_button\", (\"music_play_button_click.\" + this.provider));\n                var w = o.byClass(this.buttonElem, \"_4--s\");\n                if (w) {\n                    j.addClass(w, \"_4--t\");\n                    j.removeClass.curry(w, \"_4--t\").defer(3000);\n                }\n            ;\n            }\n        ;\n            var x = (this.isTracksetable() && o.byClass(this.buttonElem, \"music_trackset_container\")), y = [];\n            if (x) {\n                var z = x.getAttribute(\"data-trackset-title\"), aa = this.provider, ba = k.scry(x, \".music_button\");\n                for (var ca = 0; (ca < ba.length); ca++) {\n                    var da = l.getButton([ba[ca].id,]);\n                    if (((da && (da.provider == aa)) && da.isTracksetable())) {\n                        y.push(da.url);\n                    };\n                };\n            }\n        ;\n            if (!a.Music) {\n                this.showLoading(true);\n            };\n            h.loadModules([\"Music\",], function(ea) {\n                var fa = (((x && (y.length > 1))) ? ea.playPauseSongList(this.provider, this.url, y, z, this.context) : ea.playPauseSong(this.provider, this.url, this.context));\n                this.showLoading(!fa);\n            }.bind(this));\n        },\n        showLoading: function(t) {\n            this.resetLoadingTimers();\n            this._hideLoadingTimer = this._timeout.bind(this, t).defer(this.HIDE_LOADING_TIMEOUT, false);\n            this._showLoadingTimer = this.setState.bind(this, this.STATES.LOADING).defer(this.SHOW_LOADING_TIMEOUT, false);\n        },\n        resetLoadingTimers: function() {\n            clearTimeout(this._hideLoadingTimer);\n            clearTimeout(this._showLoadingTimer);\n            clearTimeout(this._attemptingPlayTimer);\n            this._attemptingPlayTimer = null;\n        },\n        destroy: function() {\n            this.resetLoadingTimers();\n            this.buttonElem = null;\n        },\n        _timeout: function(t) {\n            (a.Music && a.Music.reInform([this.provider,]));\n            if ((!t && (this.state === this.STATES.LOADING))) {\n                this.setState(this.STATES.PAUSED);\n            };\n        }\n    });\n    e.exports = s;\n});\n__d(\"MusicButtonManager\", [\"Event\",\"DOM\",\"KeyedCallbackManager\",\"Layer\",\"MusicButton\",\"MusicButtonStore\",\"MusicConstants\",\"MusicEvents\",\"Parent\",\"$\",\"copyProperties\",\"ge\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"DOM\"), i = b(\"KeyedCallbackManager\"), j = b(\"Layer\"), k = b(\"MusicButton\"), l = b(\"MusicButtonStore\"), m = b(\"MusicConstants\"), n = b(\"MusicEvents\"), o = b(\"Parent\"), p = b(\"$\"), q = b(\"copyProperties\"), r = b(\"ge\"), s = new i(), t = null, u = {\n    }, v = 0;\n    function w(da) {\n        var ea = da.getTarget(), fa = o.byClass(ea, \"music_button\");\n        fa = (fa || ((!((da.getModifiers && da.getModifiers().any)) && x(ea))));\n        if (!fa) {\n            return\n        };\n        return y(fa, da);\n    };\n    function x(da) {\n        var ea = (o.byClass(da, \"music_button_trigger\") && o.byClass(da, \"music_button_trigger_group\"));\n        if (ea) {\n            var fa = h.scry(ea, \".music_button\");\n            if (fa.length) {\n                return fa[0]\n            };\n        }\n    ;\n        return null;\n    };\n    function y(da, event) {\n        (event && event.stop());\n        n.inform(m.MUSIC_BUTTON.ACTIVATE, da);\n        return false;\n    };\n    function z(da) {\n        (a.Music && a.Music.reInform(da));\n    };\n    function aa(da, ea) {\n        var fa = l.getButtons();\n        for (var ga in fa) {\n            if ((fa[ga].noGC || r(ga))) {\n                fa[ga].handleIncomingEvent(da, ea);\n            }\n             else l.removeButton(ga);\n        ;\n        };\n    };\n    var ba = {\n        init: function(da) {\n            if (t) {\n                return\n            };\n            t = true;\n            k.tracksetableTypes = (da || []);\n            g.listen(document.body, \"click\", w);\n            n.subscribe([m.STATUS_CHANGE_EVENT.playing,m.STATUS_CHANGE_EVENT.track,m.DIAGNOSTIC_EVENT.OFFLINE,m.DIAGNOSTIC_EVENT.ALL_OFFLINE,m.DIAGNOSTIC_EVENT.ONLINE,], aa);\n        },\n        add: function(da, ea, fa, ga, ha, ia) {\n            (t || ba.init());\n            var ja = ea.id, ka = l.getButton(ja);\n            if (ka) {\n                return ka\n            };\n            ka = l.addButton(ja, new k(da, ea, fa, q({\n                button_id: ja\n            }, ga), ha, ia));\n            var la = o.byClass(ea, \"uiOverlay\");\n            if (la) {\n                ka.noGC = true;\n                var ma = j.subscribe(\"destroy\", function(na, oa) {\n                    if (h.contains(oa.getRoot(), ea)) {\n                        l.removeButton(ja);\n                        j.unsubscribe(ma);\n                    }\n                ;\n                });\n            }\n        ;\n            if ((da && !u[da])) {\n                u[da] = function() {\n                    var na = Object.keys(u);\n                    (na.length && z(na));\n                    u = {\n                    };\n                }.defer();\n            };\n            return ka;\n        },\n        addButton: function(da, ea, fa, ga, ha, ia) {\n            if (!r(ea)) {\n                return\n            };\n            var ja = p(ea);\n            return ba.add(da, ja, fa, ga, ha, ia);\n        },\n        asyncAddMusicButton: function(da, ea) {\n            da.setAttribute(\"id\", (\"music_button_\" + v++));\n            ca(da, ea);\n        },\n        tryAddButtonInDOM: function(da, ea) {\n            var fa = r(da);\n            (fa && ca(fa, ea));\n        },\n        addMusicData: function(da, ea, fa, ga, ha, ia) {\n            s.setResource(da, {\n                provider: ea,\n                uri: fa,\n                context: ga,\n                media_type: ha,\n                tooltip: ia\n            });\n        }\n    };\n    function ca(da, ea) {\n        var fa = h.find(da, \"a.button_anchor\").getAttribute(\"href\");\n        s.executeOrEnqueue(fa, function(ga) {\n            return ba.add(ga.provider, da, ga.uri, ga.context, ga.media_type, (ea ? ga.tooltip : \"\"));\n        });\n    };\n    e.exports = (a.MusicButtonManager || ba);\n});\n__d(\"TinyViewport\", [\"Arbiter\",\"CSS\",\"DOM\",\"Event\",\"queryThenMutateDOM\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"CSS\"), i = b(\"DOM\"), j = b(\"Event\"), k = b(\"queryThenMutateDOM\"), l = document.documentElement, m, n, o = k.bind(null, function() {\n        n = (n || i.getDocumentScrollElement());\n        m = ((l.clientHeight < 400) || (l.clientWidth < n.scrollWidth));\n    }, function() {\n        h.conditionClass(l, \"tinyViewport\", m);\n        h.conditionClass(l, \"canHaveFixedElements\", !m);\n    }, \"TinyViewport\");\n    o();\n    g.subscribe(\"quickling/response\", o);\n    j.listen(window, \"resize\", o);\n});\n__d(\"TimeSpentArray\", [\"Banzai\",\"pageID\",], function(a, b, c, d, e, f) {\n    var g = b(\"Banzai\"), h = b(\"pageID\"), i = 2, j = (i * 32), k = 1500, l, m, n, o, p, q, r, s, t;\n    function u() {\n        if (l) {\n            var ca = Date.now();\n            if ((ca > p)) {\n                r = Math.min(j, Math.ceil((((ca / 1000)) - o)));\n            };\n            var da = z();\n            if (da) {\n                l(da);\n            };\n        }\n    ;\n        y();\n    };\n    function v() {\n        w();\n        m = setTimeout(u, ((n * 1000) + k), false);\n    };\n    function w() {\n        if (m) {\n            clearTimeout(m);\n            m = null;\n        }\n    ;\n    };\n    function x(ca) {\n        o = ca;\n        p = (o * 1000);\n        q = [1,];\n        for (var da = 1; (da < i); da++) {\n            q.push(0);;\n        };\n        r = 1;\n        s += 1;\n        t += 1;\n        v();\n    };\n    function y() {\n        w();\n        q = null;\n        n = j;\n    };\n    function z() {\n        if (!q) {\n            return null\n        };\n        return {\n            tos_id: h,\n            start_time: o,\n            tos_array: q.slice(0),\n            tos_len: r,\n            tos_seq: t,\n            tos_cum: s\n        };\n    };\n    function aa(ca) {\n        if (((ca >= p) && (((ca - p)) < 1000))) {\n            return\n        };\n        ba(Math.floor((ca / 1000)));\n    };\n    function ba(ca) {\n        var da = (ca - o);\n        if (((da < 0) || (da >= j))) {\n            u();\n        };\n        if (!q) {\n            x(ca);\n        }\n         else {\n            q[(da >> 5)] |= ((1 << ((da & 31))));\n            r = (da + 1);\n            s += 1;\n            p = (ca * 1000);\n        }\n    ;\n    };\n    e.exports = {\n        init: function(ca, da) {\n            s = 0;\n            t = -1;\n            l = ca;\n            n = (da || j);\n            x(Math.floor((Date.now() / 1000)));\n            g.subscribe(g.SHUTDOWN, u);\n        },\n        update: function(ca) {\n            aa(ca);\n        },\n        get: function() {\n            return z();\n        },\n        ship: function() {\n            u();\n        },\n        reset: function() {\n            y();\n        }\n    };\n});\n__d(\"WebStorageMonster\", [\"Event\",\"AsyncRequest\",\"UserActivity\",\"StringTransformations\",\"arrayContains\",\"setTimeoutAcrossTransitions\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"AsyncRequest\"), i = b(\"UserActivity\"), j = b(\"StringTransformations\"), k = b(\"arrayContains\"), l = b(\"setTimeoutAcrossTransitions\"), m = 300000, n = false;\n    function o(t) {\n        var u = {\n        };\n        for (var v in t) {\n            var w = t.getItem(v), x = j.unicodeEscape(v);\n            if ((typeof w === \"string\")) {\n                u[x] = w.length;\n            };\n        };\n        return u;\n    };\n    function p(t) {\n        if ((a.localStorage && t.keys)) {\n            s._getLocalStorageKeys().forEach(function(u) {\n                if (k(t.keys, u)) {\n                    a.localStorage.removeItem(u);\n                };\n            });\n        };\n    };\n    function q(t) {\n        if (a.localStorage) {\n            s._getLocalStorageKeys().forEach(function(u) {\n                if (!t.some(function(v) {\n                    return new RegExp(v).test(u);\n                })) {\n                    a.localStorage.removeItem(u);\n                };\n            });\n        };\n        if (a.sessionStorage) {\n            a.sessionStorage.clear();\n        };\n    };\n    function r(t) {\n        if (i.isActive(m)) {\n            l(r.curry(t), m);\n        }\n         else s.cleanNow(t);\n    ;\n    };\n    var s = {\n        registerLogoutForm: function(t, u) {\n            g.listen(t, \"submit\", function(v) {\n                s.cleanOnLogout(u);\n            });\n        },\n        schedule: function(t) {\n            if (n) {\n                return\n            };\n            n = true;\n            r(t);\n        },\n        cleanNow: function(t) {\n            var u = Date.now(), v = {\n            }, w = false;\n            [\"localStorage\",\"sessionStorage\",].forEach(function(y) {\n                if (a[y]) {\n                    v[y] = o(a[y]);\n                    w = true;\n                }\n            ;\n            });\n            var x = Date.now();\n            v.logtime = (x - u);\n            if (w) {\n                new h(\"/ajax/webstorage/process_keys.php\").setData(v).setHandler(function(y) {\n                    if (!t) {\n                        var z = y.getPayload();\n                        if (z.keys) {\n                            z.keys = z.keys.map(j.unicodeUnescape);\n                        };\n                        p(z);\n                    }\n                ;\n                }.bind(this)).send();\n            };\n        },\n        cleanOnLogout: function(t) {\n            if (t) {\n                q(t);\n            };\n            if (a.sessionStorage) {\n                a.sessionStorage.clear();\n            };\n        },\n        _getLocalStorageKeys: Object.keys.curry(a.localStorage)\n    };\n    e.exports = s;\n});");
// 2057
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"s6de57b149b09c494ec606f82771caf93a5a215db");
// 2058
geval("if (JSBNG__self.CavalryLogger) {\n    CavalryLogger.start_js([\"63VzN\",]);\n}\n;\n;\n__d(\"NotificationURI\", [\"URI\",], function(a, b, c, d, e, f) {\n    var g = b(\"URI\"), h = {\n        localize: function(i) {\n            i = g(i);\n            if (!i.isFacebookURI()) {\n                return i.toString();\n            }\n        ;\n        ;\n            var j = i.getSubdomain();\n            return i.getUnqualifiedURI().getQualifiedURI().setSubdomain(j).toString();\n        },\n        snowliftable: function(i) {\n            if (!i) {\n                return false;\n            }\n        ;\n        ;\n            i = g(i);\n            return ((i.isFacebookURI() && i.getQueryData().hasOwnProperty(\"fbid\")));\n        },\n        isVaultSetURI: function(i) {\n            if (!i) {\n                return false;\n            }\n        ;\n        ;\n            i = g(i);\n            return ((i.isFacebookURI() && ((i.getPath() == \"/ajax/vault/sharer_preview.php\"))));\n        }\n    };\n    e.exports = h;\n});\n__d(\"legacy:fbdesktop-detect\", [\"FBDesktopDetect\",], function(a, b, c, d) {\n    a.FbDesktopDetect = b(\"FBDesktopDetect\");\n}, 3);\n__d(\"IntlUtils\", [\"AsyncRequest\",\"Cookie\",\"goURI\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = b(\"Cookie\"), i = b(\"goURI\"), j = {\n        setXmode: function(k) {\n            (new g()).setURI(\"/ajax/intl/save_xmode.php\").setData({\n                xmode: k\n            }).setHandler(function() {\n                JSBNG__document.JSBNG__location.reload();\n            }).send();\n        },\n        setAmode: function(k) {\n            new g().setURI(\"/ajax/intl/save_xmode.php\").setData({\n                amode: k,\n                app: false\n            }).setHandler(function() {\n                JSBNG__document.JSBNG__location.reload();\n            }).send();\n        },\n        setLocale: function(k, l, m, n) {\n            if (!m) {\n                m = k.options[k.selectedIndex].value;\n            }\n        ;\n        ;\n            j.saveLocale(m, true, null, l, n);\n        },\n        saveLocale: function(k, l, m, n, o) {\n            new g().setURI(\"/ajax/intl/save_locale.php\").setData({\n                aloc: k,\n                source: n,\n                app_only: o\n            }).setHandler(function(p) {\n                if (l) {\n                    JSBNG__document.JSBNG__location.reload();\n                }\n                 else i(m);\n            ;\n            ;\n            }).send();\n        },\n        setLocaleCookie: function(k, l) {\n            h.set(\"locale\", k, ((((7 * 24)) * 3600000)));\n            i(l);\n        }\n    };\n    e.exports = j;\n});\n__d(\"legacy:intl-base\", [\"IntlUtils\",], function(a, b, c, d) {\n    var e = b(\"IntlUtils\");\n    a.intl_set_xmode = e.setXmode;\n    a.intl_set_amode = e.setAmode;\n    a.intl_set_locale = e.setLocale;\n    a.intl_save_locale = e.saveLocale;\n    a.intl_set_cookie_locale = e.setLocaleCookie;\n}, 3);\n__d(\"legacy:onload-action\", [\"OnloadHooks\",], function(a, b, c, d) {\n    var e = b(\"OnloadHooks\");\n    a._onloadHook = e._onloadHook;\n    a._onafterloadHook = e._onafterloadHook;\n    a.runHook = e.runHook;\n    a.runHooks = e.runHooks;\n    a.keep_window_set_as_loaded = e.keepWindowSetAsLoaded;\n}, 3);\n__d(\"LoginFormController\", [\"JSBNG__Event\",\"ge\",\"Button\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"ge\"), i = b(\"Button\");\n    f.init = function(j, k) {\n        g.listen(j, \"submit\", function() {\n            i.setEnabled(k, false);\n            i.setEnabled.curry(k, true).defer(15000);\n        });\n        var l = h(\"lgnjs\");\n        if (l) {\n            l.value = parseInt(((JSBNG__Date.now() / 1000)), 10);\n        }\n    ;\n    ;\n    };\n});\n__d(\"ClickRefUtils\", [], function(a, b, c, d, e, f) {\n    var g = {\n        get_intern_ref: function(h) {\n            if (!!h) {\n                var i = {\n                    profile_minifeed: 1,\n                    gb_content_and_toolbar: 1,\n                    gb_muffin_area: 1,\n                    ego: 1,\n                    bookmarks_menu: 1,\n                    jewelBoxNotif: 1,\n                    jewelNotif: 1,\n                    BeeperBox: 1,\n                    navSearch: 1\n                };\n                for (var j = h; ((j && ((j != JSBNG__document.body)))); j = j.parentNode) {\n                    if (((!j.id || ((typeof j.id !== \"string\"))))) {\n                        continue;\n                    }\n                ;\n                ;\n                    if (((j.id.substr(0, 8) == \"pagelet_\"))) {\n                        return j.id.substr(8);\n                    }\n                ;\n                ;\n                    if (((j.id.substr(0, 8) == \"box_app_\"))) {\n                        return j.id;\n                    }\n                ;\n                ;\n                    if (i[j.id]) {\n                        return j.id;\n                    }\n                ;\n                ;\n                };\n            ;\n            }\n        ;\n        ;\n            return \"-\";\n        },\n        get_href: function(h) {\n            var i = ((((((((h.getAttribute && ((h.getAttribute(\"ajaxify\") || h.getAttribute(\"data-endpoint\"))))) || h.action)) || h.href)) || h.JSBNG__name));\n            return ((((typeof i === \"string\")) ? i : null));\n        },\n        should_report: function(h, i) {\n            if (((i == \"FORCE\"))) {\n                return true;\n            }\n        ;\n        ;\n            if (((i == \"INDIRECT\"))) {\n                return false;\n            }\n        ;\n        ;\n            return ((h && ((g.get_href(h) || ((h.getAttribute && h.getAttribute(\"data-ft\")))))));\n        }\n    };\n    e.exports = g;\n});\n__d(\"setUECookie\", [\"Env\",], function(a, b, c, d, e, f) {\n    var g = b(\"Env\");\n    function h(i) {\n        if (!g.no_cookies) {\n            JSBNG__document.cookie = ((((((\"act=\" + encodeURIComponent(i))) + \"; path=/; domain=\")) + window.JSBNG__location.hostname.replace(/^.*(\\.facebook\\..*)$/i, \"$1\")));\n        }\n    ;\n    ;\n    };\n;\n    e.exports = h;\n});\n__d(\"ClickRefLogger\", [\"Arbiter\",\"EagleEye\",\"ClickRefUtils\",\"collectDataAttributes\",\"copyProperties\",\"ge\",\"setUECookie\",\"$\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"EagleEye\"), i = b(\"ClickRefUtils\"), j = b(\"collectDataAttributes\"), k = b(\"copyProperties\"), l = b(\"ge\"), m = b(\"setUECookie\"), n = b(\"$\");\n    function o(q) {\n        if (!l(\"JSBNG__content\")) {\n            return [0,0,0,0,];\n        }\n    ;\n    ;\n        var r = n(\"JSBNG__content\"), s = ((a.Vector2 ? a.Vector2.getEventPosition(q) : {\n            x: 0,\n            y: 0\n        }));\n        return [s.x,s.y,r.offsetLeft,r.clientWidth,];\n    };\n;\n    function p(q, r, JSBNG__event, s) {\n        var t = (((!a.ArbiterMonitor) ? \"r\" : \"a\")), u = [0,0,0,0,], v, w, x;\n        if (!!JSBNG__event) {\n            v = JSBNG__event.type;\n            if (((((v == \"click\")) && l(\"JSBNG__content\")))) {\n                u = o(JSBNG__event);\n            }\n        ;\n        ;\n            var y = 0;\n            ((JSBNG__event.ctrlKey && (y += 1)));\n            ((JSBNG__event.shiftKey && (y += 2)));\n            ((JSBNG__event.altKey && (y += 4)));\n            ((JSBNG__event.metaKey && (y += 8)));\n            if (y) {\n                v += y;\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n        if (!!r) {\n            w = i.get_href(r);\n        }\n    ;\n    ;\n        var z = [];\n        if (a.ArbiterMonitor) {\n            x = a.ArbiterMonitor.getInternRef(r);\n            z = a.ArbiterMonitor.getActFields();\n        }\n    ;\n    ;\n        var aa = j(((!!JSBNG__event ? ((JSBNG__event.target || JSBNG__event.srcElement)) : r)), [\"ft\",\"gt\",]);\n        k(aa.ft, ((s.ft || {\n        })));\n        k(aa.gt, ((s.gt || {\n        })));\n        if (((typeof (aa.ft.ei) === \"string\"))) {\n            delete aa.ft.ei;\n        }\n    ;\n    ;\n        var ba = [q._ue_ts,q._ue_count,((w || \"-\")),q._context,((v || \"-\")),((x || i.get_intern_ref(r))),t,((a.URI ? a.URI.getRequestURI(true, true).getUnqualifiedURI().toString() : ((((JSBNG__location.pathname + JSBNG__location.search)) + JSBNG__location.hash)))),aa,].concat(u).concat(z);\n        return ba;\n    };\n;\n    g.subscribe(\"ClickRefAction/new\", function(q, r) {\n        if (i.should_report(r.node, r.mode)) {\n            var s = p(r.cfa, r.node, r.JSBNG__event, r.extra_data);\n            m(r.cfa.ue);\n            h.log(\"act\", s);\n            if (window.chromePerfExtension) {\n                window.JSBNG__postMessage({\n                    clickRef: JSON.stringify(s)\n                }, window.JSBNG__location.origin);\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n    });\n});\n__d(\"QuicklingAugmenter\", [\"URI\",], function(a, b, c, d, e, f) {\n    var g = b(\"URI\"), h = [], i = {\n        addHandler: function(j) {\n            h.push(j);\n        },\n        augmentURI: function(j) {\n            var k = [], l = g(j);\n            h.forEach(function(m) {\n                var n = m(l);\n                if (!n) {\n                    return l;\n                }\n            ;\n            ;\n                k.push(m);\n                l = l.addQueryData(n);\n            });\n            h = k;\n            return l;\n        }\n    };\n    e.exports = i;\n});\n__d(\"Quickling\", [\"AjaxPipeRequest\",\"Arbiter\",\"Class\",\"CSSClassTransition\",\"DocumentTitle\",\"DOM\",\"ErrorUtils\",\"HTML\",\"OnloadHooks\",\"PageTransitions\",\"QuicklingAugmenter\",\"Run\",\"URI\",\"UserAgent\",\"copyProperties\",\"goOrReplace\",\"isEmpty\",\"QuicklingConfig\",], function(a, b, c, d, e, f) {\n    var g = b(\"AjaxPipeRequest\"), h = b(\"Arbiter\"), i = b(\"Class\"), j = b(\"CSSClassTransition\"), k = b(\"DocumentTitle\"), l = b(\"DOM\"), m = b(\"ErrorUtils\"), n = b(\"HTML\"), o = b(\"OnloadHooks\"), p = b(\"PageTransitions\"), q = b(\"QuicklingAugmenter\"), r = b(\"Run\"), s = b(\"URI\"), t = b(\"UserAgent\"), u = b(\"copyProperties\"), v = b(\"goOrReplace\"), w = b(\"isEmpty\"), x = b(\"QuicklingConfig\"), y = x.version, z = x.sessionLength, aa = new RegExp(x.inactivePageRegex), ba = 0, ca, da = \"\", ea = {\n        isActive: function() {\n            return true;\n        },\n        isPageActive: function(la) {\n            if (((la == \"#\"))) {\n                return false;\n            }\n        ;\n        ;\n            la = new s(la);\n            if (((la.getDomain() && ((la.getDomain() != s().getDomain()))))) {\n                return false;\n            }\n        ;\n        ;\n            if (((la.getPath() == \"/l.php\"))) {\n                var ma = la.getQueryData().u;\n                if (ma) {\n                    ma = s(unescape(ma)).getDomain();\n                    if (((ma && ((ma != s().getDomain()))))) {\n                        return false;\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            var na = la.getPath(), oa = la.getQueryData();\n            if (!w(oa)) {\n                na += ((\"?\" + s.implodeQuery(oa)));\n            }\n        ;\n        ;\n            return !aa.test(na);\n        },\n        getLoadCount: function() {\n            return ba;\n        }\n    };\n    function fa(la) {\n        la = ((la || \"Facebook\"));\n        k.set(la);\n        if (t.ie()) {\n            da = la;\n            if (!ca) {\n                ca = window.JSBNG__setInterval(function() {\n                    var ma = da, na = k.get();\n                    if (((ma != na))) {\n                        k.set(ma);\n                    }\n                ;\n                ;\n                }, 5000, false);\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n    };\n;\n    function ga(la) {\n        var ma = JSBNG__document.getElementsByTagName(\"link\");\n        for (var na = 0; ((na < ma.length)); ++na) {\n            if (((ma[na].rel != \"alternate\"))) {\n                continue;\n            }\n        ;\n        ;\n            l.remove(ma[na]);\n        };\n    ;\n        if (la.length) {\n            var oa = l.JSBNG__find(JSBNG__document, \"head\");\n            ((oa && l.appendContent(oa, n(la[0]))));\n        }\n    ;\n    ;\n    };\n;\n    function ha(la) {\n        var ma = {\n            version: y\n        };\n        this.parent.construct(this, la, {\n            quickling: ma\n        });\n    };\n;\n    i.extend(ha, g);\n    u(ha.prototype, {\n        _preBootloadFirstResponse: function(la) {\n            return true;\n        },\n        _fireDomContentCallback: function() {\n            ((this._request.cavalry && this._request.cavalry.setTimeStamp(\"t_domcontent\")));\n            p.transitionComplete();\n            ((this._onPageDisplayed && this._onPageDisplayed(this.pipe)));\n            this.parent._fireDomContentCallback();\n        },\n        _fireOnloadCallback: function() {\n            if (this._request.cavalry) {\n                this._request.cavalry.setTimeStamp(\"t_hooks\");\n                this._request.cavalry.setTimeStamp(\"t_layout\");\n                this._request.cavalry.setTimeStamp(\"t_onload\");\n            }\n        ;\n        ;\n            this.parent._fireOnloadCallback();\n        },\n        isPageActive: function(la) {\n            return ea.isPageActive(la);\n        },\n        _versionCheck: function(la) {\n            if (((la.version == y))) {\n                return true;\n            }\n        ;\n        ;\n            var ma = [\"quickling\",\"ajaxpipe\",\"ajaxpipe_token\",];\n            v(window.JSBNG__location, s(la.uri).removeQueryData(ma), true);\n            return false;\n        },\n        _processFirstResponse: function(la) {\n            var ma = la.getPayload();\n            fa(ma.title);\n            ga(((ma.syndication || [])));\n            window.JSBNG__scrollTo(0, 0);\n            j.go(JSBNG__document.body, ((ma.body_class || \"\")), p.getMostRecentURI(), la.getRequest().getURI());\n            h.inform(\"quickling/response\");\n        },\n        getSanitizedParameters: function() {\n            return [\"quickling\",];\n        }\n    });\n    function ia() {\n        ba++;\n        return ((ba >= z));\n    };\n;\n    function ja(la) {\n        g.setCurrentRequest(null);\n        if (ia()) {\n            return false;\n        }\n    ;\n    ;\n        la = q.augmentURI(la);\n        if (!ea.isPageActive(la)) {\n            return false;\n        }\n    ;\n    ;\n        window.ExitTime = JSBNG__Date.now();\n        r.__removeHook(\"onafterloadhooks\");\n        r.__removeHook(\"onloadhooks\");\n        o.runHooks(\"onleavehooks\");\n        h.inform(\"onload/exit\", true);\n        new ha(la).setCanvasId(\"JSBNG__content\").send();\n        return true;\n    };\n;\n    function ka(la) {\n        var ma = window[la];\n        function na(oa, pa, qa) {\n            if (((typeof oa !== \"function\"))) {\n                oa = eval.bind(null, oa);\n            }\n        ;\n        ;\n            var ra = ma(m.guard(oa), pa);\n            if (((pa > 0))) {\n                if (((qa !== false))) {\n                    r.onLeave(function() {\n                        JSBNG__clearInterval(ra);\n                    });\n                }\n            ;\n            }\n        ;\n        ;\n            return ra;\n        };\n    ;\n        window[la] = na;\n    };\n;\n    r.onAfterLoad(function la() {\n        ka(\"JSBNG__setInterval\");\n        ka(\"JSBNG__setTimeout\");\n        p.registerHandler(ja, 1);\n    });\n    e.exports = a.Quickling = ea;\n});\n__d(\"ScubaSample\", [\"Banzai\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = \"scuba_sample\", h = b(\"Banzai\"), i = b(\"copyProperties\");\n    function j(m, n, o) {\n        this.fields = {\n        };\n        this.flush = function() {\n            if (!m) {\n                return;\n            }\n        ;\n        ;\n            var p = {\n            };\n            i(p, this.fields);\n            p._ds = m;\n            if (n) {\n                p._lid = n;\n            }\n        ;\n        ;\n            p._options = o;\n            h.post(g, p);\n            this.flush = function() {\n            \n            };\n            this.flushed = true;\n        };\n        this.lid = n;\n        return this;\n    };\n;\n    function k(m, n, o) {\n        if (!this.fields[m]) {\n            this.fields[m] = {\n            };\n        }\n    ;\n    ;\n        this.fields[m][n] = o;\n        return this;\n    };\n;\n    function l(m) {\n        return function(n, o) {\n            if (this.flushed) {\n                return this;\n            }\n        ;\n        ;\n            return k.call(this, m, n, o);\n        };\n    };\n;\n    i(j.prototype, {\n        addNormal: l(\"normal\"),\n        addInteger: l(\"int\"),\n        addDenorm: l(\"denorm\")\n    });\n    e.exports = j;\n});\n__d(\"ScriptMonitorReporter\", [\"ScriptMonitor\",\"ScubaSample\",\"setTimeoutAcrossTransitions\",\"URI\",], function(a, b, c, d, e, f) {\n    var g = b(\"ScriptMonitor\"), h = b(\"ScubaSample\"), i = b(\"setTimeoutAcrossTransitions\"), j = b(\"URI\");\n    function k(o) {\n        var p = [];\n        for (var q = 0; ((q < o.length)); q++) {\n            p.push(new RegExp(o[q], \"i\"));\n        ;\n        };\n    ;\n        return p;\n    };\n;\n    function l(o, p) {\n        for (var q = 0; ((q < p.length)); q++) {\n            if (p[q].src) {\n                o.push(p[q].src);\n            }\n        ;\n        ;\n        };\n    ;\n    };\n;\n    function m(o, p) {\n        for (var q = 0; ((q < p.length)); q++) {\n            if (p[q].test(o)) {\n                return true;\n            }\n        ;\n        ;\n        };\n    ;\n        return false;\n    };\n;\n    function n(o, p) {\n        var q = g.JSBNG__stop(), r = {\n            addGeoFields: 1,\n            addBrowserFields: 1,\n            addUser: 1\n        }, s = {\n        };\n        l(q, JSBNG__document.getElementsByTagName(\"script\"));\n        l(q, JSBNG__document.getElementsByTagName(\"div\"));\n        for (var t = 0; ((t < q.length)); t++) {\n            var u = q[t].replace(/\\?.*/, \"\"), v;\n            if (s[u]) {\n                continue;\n            }\n        ;\n        ;\n            s[u] = 1;\n            if (!j.isValidURI(u)) {\n                v = true;\n            }\n             else if (m(u, p)) {\n                v = false;\n            }\n             else if (m(new j(u).getDomain(), o)) {\n                v = false;\n            }\n             else v = true;\n            \n            \n        ;\n        ;\n            if (v) {\n                new h(\"unknown_scripts\", 0, r).addNormal(\"url\", u).flush();\n            }\n        ;\n        ;\n        };\n    ;\n    };\n;\n    e.exports = {\n        runScan: function(o, p) {\n            i(function() {\n                n(k(o), k(p));\n            }, 5000);\n        }\n    };\n});\n__d(\"StringTransformations\", [], function(a, b, c, d, e, f) {\n    e.exports = {\n        unicodeEscape: function(g) {\n            return g.replace(/[^A-Za-z0-9\\-\\.\\:\\_\\$\\/\\+\\=]/g, function(h) {\n                var i = h.charCodeAt().toString(16);\n                return ((\"\\\\u\" + ((\"0000\" + i.toUpperCase())).slice(-4)));\n            });\n        },\n        unicodeUnescape: function(g) {\n            return g.replace(/(\\\\u[0-9A-Fa-f]{4})/g, function(h) {\n                return String.fromCharCode(parseInt(h.slice(2), 16));\n            });\n        }\n    };\n});\n__d(\"TimeSpentLogger\", [\"Arbiter\",\"Banzai\",\"CSS\",\"ClickRefUtils\",\"DOMEventListener\",\"ScriptPath\",\"UserActivity\",\"collectDataAttributes\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"Banzai\"), i = b(\"CSS\"), j = b(\"ClickRefUtils\"), k = b(\"DOMEventListener\"), l = b(\"ScriptPath\"), m = b(\"UserActivity\"), n = b(\"collectDataAttributes\"), o = b(\"copyProperties\"), p = [m.getLastInformTime(),0,], q = m.getLastInformTime(), r = {\n        tos_seq: 0,\n        tos_cumulative: 0,\n        transport_cause: null,\n        buenopath: null,\n        page_token: null,\n        elements: 0,\n        uact_tos: null,\n        client_time: null\n    }, s = 100, t = 100, u = ((10 * 1000)), v = ((3 * 1000)), w = 1, x = 2, y = 4, z = 8, aa = {\n    };\n    m.subscribe(function(ia, ja) {\n        var ka = ((p.length - 1));\n        q = ja.last_inform;\n        if (((ja.idleness < v))) {\n            p[ka] += ja.idleness;\n            r.tos_cumulative += ja.idleness;\n        }\n         else {\n            if (((ka > s))) {\n                fa(\"array_limit_reached\");\n            }\n        ;\n        ;\n            p.push(ja.idleness, 0);\n        }\n    ;\n    ;\n    });\n    function ba(ia) {\n        var ja = 0;\n        if (JSBNG__document.getElementById(\"boulder_fixed_header\")) {\n            ja = ((ja | w));\n        }\n    ;\n    ;\n        if (i.hasClass(JSBNG__document.body, \"timelineLayout\")) {\n            ja = ((ja | y));\n            var ka = JSBNG__document.getElementById(\"pagelet_main_column_personal\");\n            if (((ka && ((ka.getAttribute(\"data-referrer\") === \"pagelet_main_column_personal_timeline\"))))) {\n                ja = ((ja | x));\n            }\n        ;\n        ;\n            if (i.hasClass(JSBNG__document.body, \"pagesTimelineLayout\")) {\n                ja = ((ja | z));\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n        return ja;\n    };\n;\n    function ca(ia) {\n        var ja = ba(), ka = l.getScriptPath(), la = l.getCategoryToken();\n        r.uact_tos = p;\n        if (ka) {\n            r.buenopath = ka.substring(0, t);\n        }\n         else r.buenopath = \"\";\n    ;\n    ;\n        if (la) {\n            r.page_token = la;\n        }\n         else r.page_token = \"\";\n    ;\n    ;\n        r.elements = ja;\n        r.transport_cause = ia;\n        r.client_time = JSBNG__Date.now();\n    };\n;\n    function da() {\n        r.tos_seq += 1;\n        p = [q,0,];\n    };\n;\n    var ea = {\n        store: true,\n        delay: 3000,\n        retry: true\n    };\n    function fa(ia) {\n        ca(ia);\n        if (h.isEnabled(\"time_spent\")) {\n            g.inform(\"timespent/tosdataposted\", o({\n            }, r));\n            h.post(\"time_spent\", o({\n            }, r), ea);\n        }\n    ;\n    ;\n        da();\n    };\n;\n    function ga() {\n        fa(\"heartbeat\");\n    };\n;\n    function ha() {\n        fa(\"before_unload\");\n    };\n;\n    if (((window.JSBNG__top == window.JSBNG__self))) {\n        k.add(window, \"beforeunload\", ha);\n        JSBNG__setInterval(function() {\n            if (((((((JSBNG__Date.now() - m.getLastInformTime())) > ((u - 100)))) && ((((p.length > 2)) || ((p[((p.length - 1))] > 0))))))) {\n                ga();\n            }\n        ;\n        ;\n        }, u);\n    }\n;\n;\n    g.subscribe(\"UserAction/new\", function(ia, ja) {\n        if (j.should_report(ja.node, ja.mode)) {\n            var ka = n(ja.node, [\"gt\",]), la = {\n                iref: j.get_intern_ref(ja.node),\n                gt_ref: ka.ref,\n                nav_section: ka.nav_section\n            };\n            ca(\"useraction\");\n            o(la, r);\n            ja.ua.add_data(la);\n            g.inform(\"timespent/tosdataposted\", o({\n            }, r));\n            da();\n        }\n    ;\n    ;\n    });\n    e.exports = aa;\n});\n__d(\"UserActionHistory\", [\"Arbiter\",\"ClickRefUtils\",\"ScriptPath\",\"throttle\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ClickRefUtils\"), i = b(\"ScriptPath\"), j = b(\"throttle\"), k = {\n        click: 1,\n        submit: 1\n    }, l = false, m = {\n        log: [],\n        len: 0\n    }, n = j.acrossTransitions(function() {\n        try {\n            l._ua_log = JSON.stringify(m);\n        } catch (q) {\n            l = false;\n        };\n    ;\n    }, 1000);\n    function o() {\n        try {\n            if (a.JSBNG__sessionStorage) {\n                l = a.JSBNG__sessionStorage;\n                ((l._ua_log && (m = JSON.parse(l._ua_log))));\n            }\n        ;\n        ;\n        } catch (q) {\n            l = false;\n        };\n    ;\n        m.log[((m.len % 10))] = {\n            ts: JSBNG__Date.now(),\n            path: \"-\",\n            index: m.len,\n            type: \"init\",\n            iref: \"-\"\n        };\n        m.len++;\n        g.subscribe(\"UserAction/new\", function(r, s) {\n            var t = s.ua, u = s.node, JSBNG__event = s.JSBNG__event;\n            if (((!JSBNG__event || !((JSBNG__event.type in k))))) {\n                return;\n            }\n        ;\n        ;\n            var v = {\n                path: i.getScriptPath(),\n                type: JSBNG__event.type,\n                ts: t._ue_ts,\n                iref: ((h.get_intern_ref(u) || \"-\")),\n                index: m.len\n            };\n            m.log[((m.len++ % 10))] = v;\n            ((l && n()));\n        });\n    };\n;\n    function p() {\n        return m.log.sort(function(q, r) {\n            return ((((r.ts != q.ts)) ? ((r.ts - q.ts)) : ((r.index - q.index))));\n        });\n    };\n;\n    o();\n    e.exports = {\n        getHistory: p\n    };\n});\n__d(\"clip\", [], function(a, b, c, d, e, f) {\n    function g(h, i, j) {\n        return Math.min(Math.max(h, i), j);\n    };\n;\n    e.exports = g;\n});\n__d(\"MusicButtonStore\", [], function(a, b, c, d, e, f) {\n    var g = {\n    }, h = {\n        addButton: function(i, j) {\n            g[i] = j;\n            return j;\n        },\n        getButton: function(i) {\n            return g[i];\n        },\n        getButtons: function() {\n            return g;\n        },\n        removeButton: function(i) {\n            ((g[i] && g[i].resetLoadingTimers()));\n            delete g[i];\n        }\n    };\n    e.exports = h;\n});\n__d(\"MusicConstants\", [\"URI\",], function(a, b, c, d, e, f) {\n    var g = b(\"URI\"), h = {\n        DEBUG: false,\n        LIVE_LISTEN_MIN_SPOTIFY_VERSION: \"spotify-0.6.6.0.g5a9eaca5\",\n        enableDebug: function() {\n            this.DEBUG = true;\n        },\n        sameURLs: function(i, j) {\n            var k = /\\/$/;\n            if (((i && j))) {\n                i = g(i);\n                j = g(j);\n                return ((((i.getDomain() == j.getDomain())) && ((i.getPath() == j.getPath()))));\n            }\n        ;\n        ;\n            return false;\n        },\n        greaterOrEqualToMinimumVersion: function(i, j) {\n            var k = /(?:\\d+\\.)+/, l = i.match(k)[0].split(\".\").slice(0, -1), m = j.match(k)[0].split(\".\").slice(0, -1);\n            if (((l.length !== m.length))) {\n                return false;\n            }\n        ;\n        ;\n            for (var n = 0; ((n < m.length)); n++) {\n                if (((+l[n] < +m[n]))) {\n                    return false;\n                }\n                 else if (((+l[n] > +m[n]))) {\n                    return true;\n                }\n                \n            ;\n            ;\n            };\n        ;\n            return true;\n        },\n        sanitizeForProviders: function(i) {\n            var j = {\n            };\n            {\n                var fin126keys = ((window.top.JSBNG_Replay.forInKeys)((i))), fin126i = (0);\n                var k;\n                for (; (fin126i < fin126keys.length); (fin126i++)) {\n                    ((k) = (fin126keys[fin126i]));\n                    {\n                        if (this.ALLOWED_EXTERNAL_CONTEXT_PARAMS[k]) {\n                            j[k] = i[k];\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            return j;\n        },\n        OP: {\n            RESUME: \"RESUME\",\n            PAUSE: \"PAUSE\",\n            PLAY: \"PLAY\",\n            VERSION: \"VERSION\"\n        },\n        STATUS_CHANGE_OP: {\n            STATUS: \"STATUS\",\n            LOGIN: \"LOGIN\",\n            REINFORM: \"REINFORM\"\n        },\n        STATUS_CHANGE_EVENT: {\n            playing: \"PLAY_STATE_CHANGED\",\n            track: \"TRACK_CHANGED\"\n        },\n        DIAGNOSTIC_EVENT: {\n            ALL_PAUSED: \"ALL_PAUSED\",\n            ALL_OFFLINE: \"ALL_OFFLINE\",\n            OFFLINE: \"OFFLINE\",\n            ONLINE: \"ONLINE\",\n            SEARCHING: \"SEARCHING\",\n            HIT: \"HIT\",\n            MISS: \"MISS\",\n            RESIGN: \"RESIGN\",\n            IFRAME_POLLING: \"IFRAME_POLLING\",\n            RELAUNCH: \"RELAUNCH\",\n            STATE_CHANGE: \"STATE_CHANGE\",\n            WRONG_VERSION: \"WRONG_VERSION\",\n            SERVICE_ERROR: \"SERVICE_ERROR\",\n            INCORRECT_ONLINE_STATE: \"INCORRECT_ONLINE_STATE\",\n            LOG_SEND_OP: \"LOG_SEND_OP\",\n            REQUEUE_OP: \"REQUEUE_OP\"\n        },\n        ALLOWED_STATUS_PARAMS: {\n            playing: \"playing\",\n            track: \"track\",\n            context: \"context\",\n            client_version: \"client_version\",\n            start_time: \"start_time\",\n            expires_in: \"expires_in\",\n            open_graph_state: \"open_graph_state\"\n        },\n        ALLOWED_EXTERNAL_CONTEXT_PARAMS: {\n            uri: true,\n            song: true,\n            radio_station: true,\n            album: true,\n            playlist: true,\n            musician: true,\n            song_list: true,\n            offset: true,\n            title: true,\n            request_id: true,\n            listen_with_friends: true,\n            needs_tos: true\n        },\n        LIVE_LISTEN_OP: {\n            NOW_LEADING: \"NOW_LEADING\",\n            NOW_LISTENING: \"NOW_LISTENING\",\n            END_SESSION: \"END_SESSION\",\n            SONG_PLAYING: \"SONG_PLAYING\",\n            LISTENER_UPDATE: \"LISTENER_UPDATE\",\n            QUEUE_SESSION: \"QUEUE_SESSION\",\n            PLAY_ERROR: \"PLAY_ERROR\",\n            SESSION_UPDATED: \"SESSION_UPDATED\",\n            QUEUING_SESSION: \"QUEUING_SESSION\"\n        },\n        MUSIC_BUTTON: {\n            ACTIVATE: \"ACTIVATE\"\n        },\n        ERROR: {\n            1: \"SERVICE_UNAVAILABLE_WITHOUT_PREMIUM\",\n            2: \"SERVICE_UNAVAILABLE_WITHOUT_PREMIUM_OR_WAIT\",\n            3: \"SERVICE_UNAVAILABLE_BILLING_ISSUE\",\n            4: \"SERVICE_UNAVAILABLE_TECHNICAL_ISSUE\",\n            5: \"AUDIO_AD_PLAYING\",\n            99: \"SERVICE_TEMPORARILY_UNAVAILABLE\",\n            101: \"SONG_UNAVAILABLE_WITHOUT_PURCHASE\",\n            102: \"SONG_UNAVAILABLE_WITHOUT_PREMIUM\",\n            103: \"SONG_UNAVAILABLE_INDEFINITELY\"\n        }\n    };\n    e.exports = ((a.MusicConstants || h));\n});\n__d(\"MusicEvents\", [\"Arbiter\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\");\n    e.exports = a.MusicEvents = new g();\n});\n__d(\"MusicButton\", [\"BanzaiODS\",\"Bootloader\",\"copyProperties\",\"CSS\",\"DOM\",\"MusicButtonStore\",\"MusicConstants\",\"MusicEvents\",\"Parent\",\"ScubaSample\",\"Tooltip\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"BanzaiODS\"), h = b(\"Bootloader\"), i = b(\"copyProperties\"), j = b(\"CSS\"), k = b(\"DOM\"), l = b(\"MusicButtonStore\"), m = b(\"MusicConstants\"), n = b(\"MusicEvents\"), o = b(\"Parent\"), p = b(\"ScubaSample\"), q = b(\"Tooltip\"), r = b(\"cx\"), s = function(t, u, v, w, x, y) {\n        this.provider = t;\n        this.buttonElem = u;\n        this.url = v;\n        this.context = ((w || {\n        }));\n        this.mediaType = x;\n        this.setState(this.STATES.OFFLINE);\n        this.tooltip = ((y || \"\"));\n        n.subscribe(m.MUSIC_BUTTON.ACTIVATE, this.processClick.bind(this));\n    };\n    i(s, {\n        tracksetableTypes: []\n    });\n    i(s.prototype, {\n        SHOW_LOADING_TIMEOUT: 500,\n        HIDE_LOADING_TIMEOUT: 4000,\n        RECENTLY_ONLINE_TIMEOUT: 6000,\n        STATES: {\n            PLAYING: \"music_playing\",\n            PAUSED: \"music_paused\",\n            LOADING: \"music_loading\",\n            DISABLED: \"music_disabled\",\n            OFFLINE: \"music_offline\"\n        },\n        setState: function(t) {\n            if (((t !== this.STATES.LOADING))) {\n                this.resetLoadingTimers();\n                this.previousState = ((this.state || t));\n            }\n        ;\n        ;\n            if (((t === this.STATES.PLAYING))) {\n                q.set(this.buttonElem, this.tooltip);\n            }\n             else q.set(this.buttonElem, \"\");\n        ;\n        ;\n            var u = this.buttonElem.parentNode;\n            ((this.state && j.removeClass(u, this.state)));\n            this.state = t;\n            j.addClass(u, this.state);\n        },\n        isTracksetable: function(t) {\n            return ((s.tracksetableTypes.indexOf(this.mediaType) !== -1));\n        },\n        handleIncomingEvent: function(t, u) {\n            JSBNG__clearTimeout(this._showLoadingTimer);\n            if (((((u && u.provider)) && ((u.provider != this.provider))))) {\n                return;\n            }\n        ;\n        ;\n            switch (t) {\n              case m.DIAGNOSTIC_EVENT.ONLINE:\n            \n              case m.STATUS_CHANGE_EVENT.track:\n            \n              case m.STATUS_CHANGE_EVENT.playing:\n                var v = ((((u && u.track)) && u.track.uri)), w = ((((u && u.context)) && u.context.uri));\n                if (((((u && u.playing)) && ((m.sameURLs(v, this.url) || m.sameURLs(w, this.url)))))) {\n                    this.setState(this.STATES.PLAYING);\n                }\n                 else if (((((this.state === this.STATES.LOADING)) && ((((this.previousState === this.STATES.PAUSED)) || ((this.previousState === this.STATES.OFFLINE))))))) {\n                    JSBNG__clearTimeout(this._attemptingPlayTimer);\n                    this._attemptingPlayTimer = this.setState.bind(this, this.STATES.PAUSED).defer(this.RECENTLY_ONLINE_TIMEOUT, false);\n                }\n                 else if (!this._attemptingPlayTimer) {\n                    this.setState(this.STATES.PAUSED);\n                }\n                \n                \n            ;\n            ;\n                break;\n              case m.DIAGNOSTIC_EVENT.OFFLINE:\n                this.setState(this.STATES.OFFLINE);\n                break;\n              case m.DIAGNOSTIC_EVENT.ALL_OFFLINE:\n                this.setState(this.STATES.OFFLINE);\n                break;\n            };\n        ;\n        },\n        processClick: function(t, u) {\n            if (((u != this.buttonElem))) {\n                if (((this.state === this.STATES.LOADING))) {\n                    ((this.previousState && this.setState(this.previousState)));\n                }\n            ;\n            ;\n                return;\n            }\n        ;\n        ;\n            var v = new p(\"music_play_button_click\", null, {\n                addBrowserFields: true,\n                addGeoFields: true,\n                addUser: true\n            });\n            v.addNormal(\"uses_bridge\", \"1\");\n            v.addNormal(\"state\", this.state);\n            v.addNormal(\"provider\", this.provider);\n            v.addNormal(\"class\", \"MusicButton\");\n            v.addDenorm(\"url\", this.url);\n            v.flush();\n            if (((this.state != this.STATES.PLAYING))) {\n                g.bumpEntityKey(\"music_play_button\", \"music_play_button_click\");\n                g.bumpEntityKey(\"music_play_button\", ((\"music_play_button_click.\" + this.provider)));\n                var w = o.byClass(this.buttonElem, \"_4--s\");\n                if (w) {\n                    j.addClass(w, \"_4--t\");\n                    j.removeClass.curry(w, \"_4--t\").defer(3000);\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            var x = ((this.isTracksetable() && o.byClass(this.buttonElem, \"music_trackset_container\"))), y = [];\n            if (x) {\n                var z = x.getAttribute(\"data-trackset-title\"), aa = this.provider, ba = k.scry(x, \".music_button\");\n                for (var ca = 0; ((ca < ba.length)); ca++) {\n                    var da = l.getButton([ba[ca].id,]);\n                    if (((((da && ((da.provider == aa)))) && da.isTracksetable()))) {\n                        y.push(da.url);\n                    }\n                ;\n                ;\n                };\n            ;\n            }\n        ;\n        ;\n            if (!a.Music) {\n                this.showLoading(true);\n            }\n        ;\n        ;\n            h.loadModules([\"Music\",], function(ea) {\n                var fa = ((((x && ((y.length > 1)))) ? ea.playPauseSongList(this.provider, this.url, y, z, this.context) : ea.playPauseSong(this.provider, this.url, this.context)));\n                this.showLoading(!fa);\n            }.bind(this));\n        },\n        showLoading: function(t) {\n            this.resetLoadingTimers();\n            this._hideLoadingTimer = this._timeout.bind(this, t).defer(this.HIDE_LOADING_TIMEOUT, false);\n            this._showLoadingTimer = this.setState.bind(this, this.STATES.LOADING).defer(this.SHOW_LOADING_TIMEOUT, false);\n        },\n        resetLoadingTimers: function() {\n            JSBNG__clearTimeout(this._hideLoadingTimer);\n            JSBNG__clearTimeout(this._showLoadingTimer);\n            JSBNG__clearTimeout(this._attemptingPlayTimer);\n            this._attemptingPlayTimer = null;\n        },\n        destroy: function() {\n            this.resetLoadingTimers();\n            this.buttonElem = null;\n        },\n        _timeout: function(t) {\n            ((a.Music && a.Music.reInform([this.provider,])));\n            if (((!t && ((this.state === this.STATES.LOADING))))) {\n                this.setState(this.STATES.PAUSED);\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = s;\n});\n__d(\"MusicButtonManager\", [\"JSBNG__Event\",\"DOM\",\"KeyedCallbackManager\",\"Layer\",\"MusicButton\",\"MusicButtonStore\",\"MusicConstants\",\"MusicEvents\",\"Parent\",\"$\",\"copyProperties\",\"ge\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"DOM\"), i = b(\"KeyedCallbackManager\"), j = b(\"Layer\"), k = b(\"MusicButton\"), l = b(\"MusicButtonStore\"), m = b(\"MusicConstants\"), n = b(\"MusicEvents\"), o = b(\"Parent\"), p = b(\"$\"), q = b(\"copyProperties\"), r = b(\"ge\"), s = new i(), t = null, u = {\n    }, v = 0;\n    function w(da) {\n        var ea = da.getTarget(), fa = o.byClass(ea, \"music_button\");\n        fa = ((fa || ((!((da.getModifiers && da.getModifiers().any)) && x(ea)))));\n        if (!fa) {\n            return;\n        }\n    ;\n    ;\n        return y(fa, da);\n    };\n;\n    function x(da) {\n        var ea = ((o.byClass(da, \"music_button_trigger\") && o.byClass(da, \"music_button_trigger_group\")));\n        if (ea) {\n            var fa = h.scry(ea, \".music_button\");\n            if (fa.length) {\n                return fa[0];\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n        return null;\n    };\n;\n    function y(da, JSBNG__event) {\n        ((JSBNG__event && JSBNG__event.JSBNG__stop()));\n        n.inform(m.MUSIC_BUTTON.ACTIVATE, da);\n        return false;\n    };\n;\n    function z(da) {\n        ((a.Music && a.Music.reInform(da)));\n    };\n;\n    function aa(da, ea) {\n        var fa = l.getButtons();\n        {\n            var fin127keys = ((window.top.JSBNG_Replay.forInKeys)((fa))), fin127i = (0);\n            var ga;\n            for (; (fin127i < fin127keys.length); (fin127i++)) {\n                ((ga) = (fin127keys[fin127i]));\n                {\n                    if (((fa[ga].noGC || r(ga)))) {\n                        fa[ga].handleIncomingEvent(da, ea);\n                    }\n                     else l.removeButton(ga);\n                ;\n                ;\n                };\n            };\n        };\n    ;\n    };\n;\n    var ba = {\n        init: function(da) {\n            if (t) {\n                return;\n            }\n        ;\n        ;\n            t = true;\n            k.tracksetableTypes = ((da || []));\n            g.listen(JSBNG__document.body, \"click\", w);\n            n.subscribe([m.STATUS_CHANGE_EVENT.playing,m.STATUS_CHANGE_EVENT.track,m.DIAGNOSTIC_EVENT.OFFLINE,m.DIAGNOSTIC_EVENT.ALL_OFFLINE,m.DIAGNOSTIC_EVENT.ONLINE,], aa);\n        },\n        add: function(da, ea, fa, ga, ha, ia) {\n            ((t || ba.init()));\n            var ja = ea.id, ka = l.getButton(ja);\n            if (ka) {\n                return ka;\n            }\n        ;\n        ;\n            ka = l.addButton(ja, new k(da, ea, fa, q({\n                button_id: ja\n            }, ga), ha, ia));\n            var la = o.byClass(ea, \"uiOverlay\");\n            if (la) {\n                ka.noGC = true;\n                var ma = j.subscribe(\"destroy\", function(na, oa) {\n                    if (h.contains(oa.getRoot(), ea)) {\n                        l.removeButton(ja);\n                        j.unsubscribe(ma);\n                    }\n                ;\n                ;\n                });\n            }\n        ;\n        ;\n            if (((da && !u[da]))) {\n                u[da] = function() {\n                    var na = Object.keys(u);\n                    ((na.length && z(na)));\n                    u = {\n                    };\n                }.defer();\n            }\n        ;\n        ;\n            return ka;\n        },\n        addButton: function(da, ea, fa, ga, ha, ia) {\n            if (!r(ea)) {\n                return;\n            }\n        ;\n        ;\n            var ja = p(ea);\n            return ba.add(da, ja, fa, ga, ha, ia);\n        },\n        asyncAddMusicButton: function(da, ea) {\n            da.setAttribute(\"id\", ((\"music_button_\" + v++)));\n            ca(da, ea);\n        },\n        tryAddButtonInDOM: function(da, ea) {\n            var fa = r(da);\n            ((fa && ca(fa, ea)));\n        },\n        addMusicData: function(da, ea, fa, ga, ha, ia) {\n            s.setResource(da, {\n                provider: ea,\n                uri: fa,\n                context: ga,\n                media_type: ha,\n                tooltip: ia\n            });\n        }\n    };\n    function ca(da, ea) {\n        var fa = h.JSBNG__find(da, \"a.button_anchor\").getAttribute(\"href\");\n        s.executeOrEnqueue(fa, function(ga) {\n            return ba.add(ga.provider, da, ga.uri, ga.context, ga.media_type, ((ea ? ga.tooltip : \"\")));\n        });\n    };\n;\n    e.exports = ((a.MusicButtonManager || ba));\n});\n__d(\"TinyViewport\", [\"Arbiter\",\"CSS\",\"DOM\",\"JSBNG__Event\",\"queryThenMutateDOM\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"CSS\"), i = b(\"DOM\"), j = b(\"JSBNG__Event\"), k = b(\"queryThenMutateDOM\"), l = JSBNG__document.documentElement, m, n, o = k.bind(null, function() {\n        n = ((n || i.getDocumentScrollElement()));\n        m = ((((l.clientHeight < 400)) || ((l.clientWidth < n.scrollWidth))));\n    }, function() {\n        h.conditionClass(l, \"tinyViewport\", m);\n        h.conditionClass(l, \"canHaveFixedElements\", !m);\n    }, \"TinyViewport\");\n    o();\n    g.subscribe(\"quickling/response\", o);\n    j.listen(window, \"resize\", o);\n});\n__d(\"TimeSpentArray\", [\"Banzai\",\"pageID\",], function(a, b, c, d, e, f) {\n    var g = b(\"Banzai\"), h = b(\"pageID\"), i = 2, j = ((i * 32)), k = 1500, l, m, n, o, p, q, r, s, t;\n    function u() {\n        if (l) {\n            var ca = JSBNG__Date.now();\n            if (((ca > p))) {\n                r = Math.min(j, Math.ceil(((((ca / 1000)) - o))));\n            }\n        ;\n        ;\n            var da = z();\n            if (da) {\n                l(da);\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n        y();\n    };\n;\n    function v() {\n        w();\n        m = JSBNG__setTimeout(u, ((((n * 1000)) + k)), false);\n    };\n;\n    function w() {\n        if (m) {\n            JSBNG__clearTimeout(m);\n            m = null;\n        }\n    ;\n    ;\n    };\n;\n    function x(ca) {\n        o = ca;\n        p = ((o * 1000));\n        q = [1,];\n        for (var da = 1; ((da < i)); da++) {\n            q.push(0);\n        ;\n        };\n    ;\n        r = 1;\n        s += 1;\n        t += 1;\n        v();\n    };\n;\n    function y() {\n        w();\n        q = null;\n        n = j;\n    };\n;\n    function z() {\n        if (!q) {\n            return null;\n        }\n    ;\n    ;\n        return {\n            tos_id: h,\n            start_time: o,\n            tos_array: q.slice(0),\n            tos_len: r,\n            tos_seq: t,\n            tos_cum: s\n        };\n    };\n;\n    function aa(ca) {\n        if (((((ca >= p)) && ((((ca - p)) < 1000))))) {\n            return;\n        }\n    ;\n    ;\n        ba(Math.floor(((ca / 1000))));\n    };\n;\n    function ba(ca) {\n        var da = ((ca - o));\n        if (((((da < 0)) || ((da >= j))))) {\n            u();\n        }\n    ;\n    ;\n        if (!q) {\n            x(ca);\n        }\n         else {\n            q[((da >> 5))] |= ((1 << ((da & 31))));\n            r = ((da + 1));\n            s += 1;\n            p = ((ca * 1000));\n        }\n    ;\n    ;\n    };\n;\n    e.exports = {\n        init: function(ca, da) {\n            s = 0;\n            t = -1;\n            l = ca;\n            n = ((da || j));\n            x(Math.floor(((JSBNG__Date.now() / 1000))));\n            g.subscribe(g.SHUTDOWN, u);\n        },\n        update: function(ca) {\n            aa(ca);\n        },\n        get: function() {\n            return z();\n        },\n        ship: function() {\n            u();\n        },\n        reset: function() {\n            y();\n        }\n    };\n});\n__d(\"WebStorageMonster\", [\"JSBNG__Event\",\"AsyncRequest\",\"UserActivity\",\"StringTransformations\",\"arrayContains\",\"setTimeoutAcrossTransitions\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"AsyncRequest\"), i = b(\"UserActivity\"), j = b(\"StringTransformations\"), k = b(\"arrayContains\"), l = b(\"setTimeoutAcrossTransitions\"), m = 300000, n = false;\n    function o(t) {\n        var u = {\n        };\n        {\n            var fin128keys = ((window.top.JSBNG_Replay.forInKeys)((t))), fin128i = (0);\n            var v;\n            for (; (fin128i < fin128keys.length); (fin128i++)) {\n                ((v) = (fin128keys[fin128i]));\n                {\n                    var w = t.getItem(v), x = j.unicodeEscape(v);\n                    if (((typeof w === \"string\"))) {\n                        u[x] = w.length;\n                    }\n                ;\n                ;\n                };\n            };\n        };\n    ;\n        return u;\n    };\n;\n    function p(t) {\n        if (((a.JSBNG__localStorage && t.keys))) {\n            s._getLocalStorageKeys().forEach(function(u) {\n                if (k(t.keys, u)) {\n                    a.JSBNG__localStorage.removeItem(u);\n                }\n            ;\n            ;\n            });\n        }\n    ;\n    ;\n    };\n;\n    function q(t) {\n        if (a.JSBNG__localStorage) {\n            s._getLocalStorageKeys().forEach(function(u) {\n                if (!t.some(function(v) {\n                    return new RegExp(v).test(u);\n                })) {\n                    a.JSBNG__localStorage.removeItem(u);\n                }\n            ;\n            ;\n            });\n        }\n    ;\n    ;\n        if (a.JSBNG__sessionStorage) {\n            a.JSBNG__sessionStorage.clear();\n        }\n    ;\n    ;\n    };\n;\n    function r(t) {\n        if (i.isActive(m)) {\n            l(r.curry(t), m);\n        }\n         else s.cleanNow(t);\n    ;\n    ;\n    };\n;\n    var s = {\n        registerLogoutForm: function(t, u) {\n            g.listen(t, \"submit\", function(v) {\n                s.cleanOnLogout(u);\n            });\n        },\n        schedule: function(t) {\n            if (n) {\n                return;\n            }\n        ;\n        ;\n            n = true;\n            r(t);\n        },\n        cleanNow: function(t) {\n            var u = JSBNG__Date.now(), v = {\n            }, w = false;\n            [\"JSBNG__localStorage\",\"JSBNG__sessionStorage\",].forEach(function(y) {\n                if (a[y]) {\n                    v[y] = o(a[y]);\n                    w = true;\n                }\n            ;\n            ;\n            });\n            var x = JSBNG__Date.now();\n            v.logtime = ((x - u));\n            if (w) {\n                new h(\"/ajax/webstorage/process_keys.php\").setData(v).setHandler(function(y) {\n                    if (!t) {\n                        var z = y.getPayload();\n                        if (z.keys) {\n                            z.keys = z.keys.map(j.unicodeUnescape);\n                        }\n                    ;\n                    ;\n                        p(z);\n                    }\n                ;\n                ;\n                }.bind(this)).send();\n            }\n        ;\n        ;\n        },\n        cleanOnLogout: function(t) {\n            if (t) {\n                q(t);\n            }\n        ;\n        ;\n            if (a.JSBNG__sessionStorage) {\n                a.JSBNG__sessionStorage.clear();\n            }\n        ;\n        ;\n        },\n        _getLocalStorageKeys: Object.keys.curry(a.JSBNG__localStorage)\n    };\n    e.exports = s;\n});");
// 2067
JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_190[0](o41,false,"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/ye/r/v9y92rsUvEH.js",o42);
// 2169
JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_190[0](o41,false,"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/ye/r/v9y92rsUvEH.js",o42);
// 2263
geval("if (JSBNG__self.CavalryLogger) {\n    CavalryLogger.start_js([\"1XxM1\",]);\n}\n;\n;\n__d(\"UnityObject\", [], function(a, b, c, d, e, f) {\n    var g = function() {\n        var h = \"Unity Player\", i = \"application/vnd.unity\", j = window, k = JSBNG__document, l = JSBNG__navigator, m = \"https://ssl-webplayer.unity3d.com/download_webplayer-3.x/\", n = \"_unity_triedjava\", o = \"undefined\", p = \"installed\", q = \"missing\", r = \"broken\", s = \"unsupported\", t = \"standard\", u = \"java\", v = \"clickonce\", w = function() {\n            var fa = l.userAgent, ga = l.platform, ha = {\n                w3: ((((((typeof k.getElementById != o)) && ((typeof k.getElementsByTagName != o)))) && ((typeof k.createElement != o)))),\n                win: ((ga ? /win/i.test(ga) : /win/i.test(fa))),\n                mac: ((ga ? /mac/i.test(ga) : /mac/i.test(fa))),\n                ie: ((/msie/i.test(fa) ? parseFloat(fa.replace(/^.*msie ([0-9]+(\\.[0-9]+)?).*$/i, \"$1\")) : false)),\n                ff: /firefox/i.test(fa),\n                ch: /chrome/i.test(fa),\n                sf: /safari/i.test(fa),\n                wk: ((/webkit/i.test(fa) ? parseFloat(fa.replace(/^.*webkit\\/(\\d+(\\.\\d+)?).*$/i, \"$1\")) : false)),\n                x64: ((/win64/i.test(fa) && /x64/i.test(fa))),\n                moz: ((/mozilla/i.test(fa) ? parseFloat(fa.replace(/^.*mozilla\\/([0-9]+(\\.[0-9]+)?).*$/i, \"$1\")) : 0))\n            }, ia = k.getElementsByTagName(\"script\");\n            for (var ja = 0; ((ja < ia.length)); ++ja) {\n                var ka = ia[ja].src.match(/^(.*)3\\.0\\/uo\\/UnityObject\\.js$/i);\n                if (ka) {\n                    m = ka[1];\n                    break;\n                }\n            ;\n            ;\n            };\n        ;\n            function la(oa, pa) {\n                for (var qa = 0; ((qa < Math.max(oa.length, pa.length))); ++qa) {\n                    var ra = ((((((qa < oa.length)) && oa[qa])) ? Number(oa[qa]) : 0)), sa = ((((((qa < pa.length)) && pa[qa])) ? Number(pa[qa]) : 0));\n                    if (((ra < sa))) {\n                        return -1;\n                    }\n                ;\n                ;\n                    if (((ra > sa))) {\n                        return 1;\n                    }\n                ;\n                ;\n                };\n            ;\n                return 0;\n            };\n        ;\n            function ma(oa) {\n                try {\n                    return ((new ActiveXObject(((((\"JavaWebStart.isInstalled.\" + oa)) + \".0\"))) != null));\n                } catch (pa) {\n                    return false;\n                };\n            ;\n            };\n        ;\n            function na(oa) {\n                try {\n                    return ((new ActiveXObject(((\"JavaPlugin.160_\" + oa))) != null));\n                } catch (pa) {\n                    return false;\n                };\n            ;\n            };\n        ;\n            ha.java = function() {\n                if (l.javaEnabled()) {\n                    var oa = ((ha.win && ha.ff)), pa = false;\n                    if (((oa || pa))) {\n                        if (((typeof l.mimeTypes != o))) {\n                            var qa = ((oa ? [1,6,0,12,] : [1,4,2,0,]));\n                            for (var ra = 0; ((ra < l.mimeTypes.length)); ++ra) {\n                                if (l.mimeTypes[ra].enabledPlugin) {\n                                    var sa = l.mimeTypes[ra].type.match(/^application\\/x-java-applet;(?:jpi-)?version=(\\d+)(?:\\.(\\d+)(?:\\.(\\d+)(?:_(\\d+))?)?)?$/);\n                                    if (((sa != null))) {\n                                        if (((la(qa, sa.slice(1)) <= 0))) {\n                                            return true;\n                                        }\n                                    ;\n                                    }\n                                ;\n                                ;\n                                }\n                            ;\n                            ;\n                            };\n                        ;\n                        }\n                    ;\n                    ;\n                    }\n                     else if (((ha.win && ha.ie))) {\n                        if (((typeof ActiveXObject != o))) {\n                            if (ma(\"1.7.0\")) {\n                                return true;\n                            }\n                        ;\n                        ;\n                            if (((ha.ie >= 8))) {\n                                if (ma(\"1.6.0\")) {\n                                    for (ra = 12; ((ra <= 50)); ++ra) {\n                                        if (na(ra)) {\n                                            if (((((((ha.ie == 9)) && ((ha.moz == 5)))) && ((ra < 24))))) {\n                                                continue;\n                                            }\n                                             else return true\n                                        ;\n                                        }\n                                    ;\n                                    ;\n                                    };\n                                ;\n                                    return false;\n                                }\n                            ;\n                            ;\n                            }\n                             else return ((((ma(\"1.6.0\") || ma(\"1.5.0\"))) || ma(\"1.4.2\")))\n                        ;\n                        }\n                    ;\n                    }\n                    \n                ;\n                ;\n                }\n            ;\n            ;\n                return false;\n            }();\n            ha.co = function() {\n                if (((ha.win && ha.ie))) {\n                    var oa = fa.match(/(\\.NET CLR [0-9.]+)|(\\.NET[0-9.]+)/g);\n                    if (((oa != null))) {\n                        var pa = [3,5,0,];\n                        for (var qa = 0; ((qa < oa.length)); ++qa) {\n                            var ra = oa[qa].match(/[0-9.]{2,}/g)[0].split(\".\");\n                            if (((la(pa, ra) <= 0))) {\n                                return true;\n                            }\n                        ;\n                        ;\n                        };\n                    ;\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n                return false;\n            }();\n            return ha;\n        }();\n        function x(fa) {\n            var ga = new RegExp(((escape(fa) + \"=([^;]+)\")));\n            if (ga.test(((k.cookie + \";\")))) {\n                ga.exec(((k.cookie + \";\")));\n                return RegExp.$1;\n            }\n        ;\n        ;\n            return false;\n        };\n    ;\n        function y(fa, ga) {\n            JSBNG__document.cookie = ((((((escape(fa) + \"=\")) + escape(ga))) + \"; path=/\"));\n        };\n    ;\n        function z(fa) {\n            var ga = 0;\n            if (fa) {\n                var ha = fa.toLowerCase().match(/^(\\d+)(?:\\.(\\d+)(?:\\.(\\d+)([dabfr])?(\\d+)?)?)?$/);\n                if (((ha && ha[1]))) {\n                    var ia = ha[1], ja = ((ha[2] ? ha[2] : 0)), ka = ((ha[3] ? ha[3] : 0)), la = ((ha[4] ? ha[4] : \"r\")), ma = ((ha[5] ? ha[5] : 0));\n                    ga |= ((((((ia / 10)) % 10)) << 28));\n                    ga |= ((((ia % 10)) << 24));\n                    ga |= ((((ja % 10)) << 20));\n                    ga |= ((((ka % 10)) << 16));\n                    ga |= {\n                        d: ((2 << 12)),\n                        a: ((4 << 12)),\n                        b: ((6 << 12)),\n                        f: ((8 << 12)),\n                        r: ((8 << 12))\n                    }[la];\n                    ga |= ((((((ma / 100)) % 10)) << 8));\n                    ga |= ((((((ma / 10)) % 10)) << 4));\n                    ga |= ((ma % 10));\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            return ga;\n        };\n    ;\n        function aa(fa) {\n            var ga = null, ha = k.getElementsByTagName(\"body\")[0], ia = k.createElement(\"object\");\n            if (((ha && ia))) {\n                ia.setAttribute(\"type\", i);\n                ia.style.visibility = \"hidden\";\n                ha.appendChild(ia);\n                var ja = 0;\n                (function() {\n                    if (((typeof ia.GetPluginVersion == o))) {\n                        if (((ja++ < 10))) {\n                            JSBNG__setTimeout(arguments.callee, 10);\n                        }\n                    ;\n                    ;\n                    }\n                     else {\n                        ga = {\n                        };\n                        ga.plugin = ia.GetPluginVersion();\n                        ga.unity = ia.GetUnityVersion(\"\");\n                    }\n                ;\n                ;\n                })();\n                ha.removeChild(ia);\n            }\n        ;\n        ;\n            fa(ga);\n        };\n    ;\n        function ba(fa) {\n            var ga = q, ha = null;\n            l.plugins.refresh();\n            if (((((((((((typeof l.plugins != o)) && l.plugins[h])) && ((typeof l.mimeTypes != o)))) && l.mimeTypes[i])) && l.mimeTypes[i].enabledPlugin))) {\n                ga = p;\n                aa(function(ma) {\n                    if (((!ma || !ma.plugin))) {\n                        ga = r;\n                    }\n                     else if (((((w.mac && w.ch)) && ((z(ma.plugin) <= z(\"2.6.1f3\")))))) {\n                        ga = r;\n                    }\n                     else ha = ma.plugin;\n                    \n                ;\n                ;\n                    fa(ga, ha);\n                });\n                return;\n            }\n             else if (((typeof j.ActiveXObject != o))) {\n                try {\n                    var ja = new ActiveXObject(\"UnityWebPlayer.UnityWebPlayer.1\");\n                    ha = ja.GetPluginVersion();\n                    ga = p;\n                    if (((ha == \"2.5.0f5\"))) {\n                        var ka = /Windows NT \\d+\\.\\d+/.exec(l.userAgent);\n                        if (((ka && ((ka.length > 0))))) {\n                            var la = parseFloat(ka[0].split(\" \")[2]);\n                            if (((la >= 6))) {\n                                ga = r;\n                            }\n                        ;\n                        ;\n                        }\n                    ;\n                    ;\n                    }\n                ;\n                ;\n                } catch (ia) {\n                    if (((((w.win && w.ie)) && w.x64))) {\n                        ga = s;\n                    }\n                ;\n                ;\n                };\n            }\n            \n        ;\n        ;\n            fa(ga, ha);\n        };\n    ;\n        function ca(fa) {\n            var ga = t, ha = \"\";\n            if (((w.java && !x(n)))) {\n                ha = \"\";\n                ga = u;\n            }\n             else if (w.co) {\n                ha = ((((m + \"3.0/co/UnityWebPlayer.application?installer=\")) + encodeURIComponent(((m + \"UnityWebPlayer.exe\")))));\n                ga = v;\n            }\n             else if (w.win) {\n                ha = ((m + \"UnityWebPlayer.exe\"));\n            }\n             else if (((l.platform == \"MacIntel\"))) {\n                ha = ((m + \"webplayer-mini.dmg\"));\n            }\n             else if (((l.platform == \"MacPPC\"))) {\n                ha = ((m + \"webplayer-mini.dmg\"));\n            }\n             else {\n                ha = \"javascript:window.open(\\\"http://unity3d.com/webplayer/\\\");\";\n                ga = s;\n            }\n            \n            \n            \n            \n        ;\n        ;\n            fa(ha, ga);\n        };\n    ;\n        function da() {\n            y(n, true);\n            var fa = {\n                type: \"application/x-java-applet\",\n                archive: ((m + \"3.0/jws/UnityWebPlayer.jar\")),\n                code: \"UnityWebPlayer\",\n                JSBNG__name: \"Unity Web Player\",\n                width: 1,\n                height: 1\n            }, ga = k.createElement(\"div\"), ha = k.body.lastChild;\n            k.body.insertBefore(ga, ha.nextSibling);\n            var ia = {\n                jnlp_href: ((m + \"3.0/jws/UnityWebPlayer.jnlp\")),\n                classloader_cache: false,\n                installer: ea(),\n                image: \"http://webplayer.unity3d.com/installation/unitylogo.png\",\n                centerimage: true,\n                boxborder: false,\n                scriptable: true,\n                mayscript: true\n            };\n            if (((w.win && w.ie))) {\n                var ja = \"\";\n                {\n                    var fin129keys = ((window.top.JSBNG_Replay.forInKeys)((fa))), fin129i = (0);\n                    var ka;\n                    for (; (fin129i < fin129keys.length); (fin129i++)) {\n                        ((ka) = (fin129keys[fin129i]));\n                        {\n                            ja += ((((((((\" \" + ka)) + \"=\\\"\")) + fa[ka])) + \"\\\"\"));\n                        ;\n                        };\n                    };\n                };\n            ;\n                var la = \"\";\n                {\n                    var fin130keys = ((window.top.JSBNG_Replay.forInKeys)((ia))), fin130i = (0);\n                    var ma;\n                    for (; (fin130i < fin130keys.length); (fin130i++)) {\n                        ((ma) = (fin130keys[fin130i]));\n                        {\n                            la += ((((((((\"\\u003Cparam name=\\\"\" + ma)) + \"\\\" value=\\\"\")) + ia[ma])) + \"\\\" /\\u003E\"));\n                        ;\n                        };\n                    };\n                };\n            ;\n                ga.outerHTML = ((((((((\"\\u003Cobject\" + ja)) + \"\\u003E\")) + la)) + \"\\u003C/object\\u003E\"));\n            }\n             else {\n                var na = k.createElement(\"object\");\n                {\n                    var fin131keys = ((window.top.JSBNG_Replay.forInKeys)((fa))), fin131i = (0);\n                    (0);\n                    for (; (fin131i < fin131keys.length); (fin131i++)) {\n                        ((ka) = (fin131keys[fin131i]));\n                        {\n                            na.setAttribute(ka, fa[ka]);\n                        ;\n                        };\n                    };\n                };\n            ;\n                {\n                    var fin132keys = ((window.top.JSBNG_Replay.forInKeys)((ia))), fin132i = (0);\n                    (0);\n                    for (; (fin132i < fin132keys.length); (fin132i++)) {\n                        ((ma) = (fin132keys[fin132i]));\n                        {\n                            var oa = k.createElement(\"param\");\n                            oa.JSBNG__name = ma;\n                            oa.value = ia[ma];\n                            na.appendChild(oa);\n                        };\n                    };\n                };\n            ;\n                ga.parentNode.replaceChild(na, ga);\n            }\n        ;\n        ;\n        };\n    ;\n        function ea() {\n            return ((m + ((w.win ? \"UnityWebPlayer.exe\" : \"UnityPlayer.plugin.zip\"))));\n        };\n    ;\n        return {\n            kInstalled: p,\n            kMissing: q,\n            triedJavaCookie: n,\n            detectUnity: function(fa) {\n                if (((((w.w3 && !((w.wk && ((w.wk < 312)))))) && fa))) {\n                    ba(fa);\n                }\n                 else if (fa) {\n                    fa(q);\n                }\n                \n            ;\n            ;\n            },\n            genInstallUnity: function(fa) {\n                ca(fa);\n            },\n            doJavaInstall: function() {\n                da();\n            }\n        };\n    }();\n    e.exports.kInstalled = g.kInstalled;\n    e.exports.kMissing = g.kMissing;\n    e.exports.triedJavaCookie = g.triedJavaCookie;\n    e.exports.detectUnity = function(h) {\n        g.detectUnity(function(i, j) {\n            h(i, j);\n        });\n    };\n    e.exports.genInstallUnity = function(h) {\n        g.genInstallUnity(function(i, j) {\n            h(i, j);\n        });\n    };\n    e.exports.doJavaInstall = function() {\n        g.doJavaInstall();\n    };\n    e.exports.callbackWhenUnityDetected = function(h) {\n        var i = function() {\n            g.detectUnity(function(j, k) {\n                if (((j == g.kInstalled))) {\n                    h(j, k);\n                }\n                 else JSBNG__setTimeout(i, 3000);\n            ;\n            ;\n            });\n        };\n        i();\n    };\n});\n__d(\"UnityLogging\", [\"AsyncRequest\",\"UnityObject\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = b(\"UnityObject\"), i = function(j, k) {\n        var l = {\n            JSBNG__status: j,\n            version: k\n        };\n        new g().setURI(\"/ajax/platform/unity/logging\").setData(l).send();\n    };\n    e.exports.logUnityVersion = function() {\n        h.detectUnity(i);\n    };\n    e.exports.logUntilInstalled = function() {\n        h.detectUnity(function(j, k) {\n            i(j, k);\n            if (((j != h.kInstalled))) {\n                h.callbackWhenUnityDetected(i);\n            }\n        ;\n        ;\n        });\n    };\n});");
// 2272
JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_190[0](o41,false,"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/ye/r/v9y92rsUvEH.js",o42);
// undefined
o41 = null;
// undefined
o42 = null;
// 2366
geval("if (JSBNG__self.CavalryLogger) {\n    CavalryLogger.start_js([\"1XxM1\",]);\n}\n;\n;\n__d(\"UnityObject\", [], function(a, b, c, d, e, f) {\n    var g = function() {\n        var h = \"Unity Player\", i = \"application/vnd.unity\", j = window, k = JSBNG__document, l = JSBNG__navigator, m = \"https://ssl-webplayer.unity3d.com/download_webplayer-3.x/\", n = \"_unity_triedjava\", o = \"undefined\", p = \"installed\", q = \"missing\", r = \"broken\", s = \"unsupported\", t = \"standard\", u = \"java\", v = \"clickonce\", w = function() {\n            var fa = l.userAgent, ga = l.platform, ha = {\n                w3: ((((((typeof k.getElementById != o)) && ((typeof k.getElementsByTagName != o)))) && ((typeof k.createElement != o)))),\n                win: ((ga ? /win/i.test(ga) : /win/i.test(fa))),\n                mac: ((ga ? /mac/i.test(ga) : /mac/i.test(fa))),\n                ie: ((/msie/i.test(fa) ? parseFloat(fa.replace(/^.*msie ([0-9]+(\\.[0-9]+)?).*$/i, \"$1\")) : false)),\n                ff: /firefox/i.test(fa),\n                ch: /chrome/i.test(fa),\n                sf: /safari/i.test(fa),\n                wk: ((/webkit/i.test(fa) ? parseFloat(fa.replace(/^.*webkit\\/(\\d+(\\.\\d+)?).*$/i, \"$1\")) : false)),\n                x64: ((/win64/i.test(fa) && /x64/i.test(fa))),\n                moz: ((/mozilla/i.test(fa) ? parseFloat(fa.replace(/^.*mozilla\\/([0-9]+(\\.[0-9]+)?).*$/i, \"$1\")) : 0))\n            }, ia = k.getElementsByTagName(\"script\");\n            for (var ja = 0; ((ja < ia.length)); ++ja) {\n                var ka = ia[ja].src.match(/^(.*)3\\.0\\/uo\\/UnityObject\\.js$/i);\n                if (ka) {\n                    m = ka[1];\n                    break;\n                }\n            ;\n            ;\n            };\n        ;\n            function la(oa, pa) {\n                for (var qa = 0; ((qa < Math.max(oa.length, pa.length))); ++qa) {\n                    var ra = ((((((qa < oa.length)) && oa[qa])) ? Number(oa[qa]) : 0)), sa = ((((((qa < pa.length)) && pa[qa])) ? Number(pa[qa]) : 0));\n                    if (((ra < sa))) {\n                        return -1;\n                    }\n                ;\n                ;\n                    if (((ra > sa))) {\n                        return 1;\n                    }\n                ;\n                ;\n                };\n            ;\n                return 0;\n            };\n        ;\n            function ma(oa) {\n                try {\n                    return ((new ActiveXObject(((((\"JavaWebStart.isInstalled.\" + oa)) + \".0\"))) != null));\n                } catch (pa) {\n                    return false;\n                };\n            ;\n            };\n        ;\n            function na(oa) {\n                try {\n                    return ((new ActiveXObject(((\"JavaPlugin.160_\" + oa))) != null));\n                } catch (pa) {\n                    return false;\n                };\n            ;\n            };\n        ;\n            ha.java = function() {\n                if (l.javaEnabled()) {\n                    var oa = ((ha.win && ha.ff)), pa = false;\n                    if (((oa || pa))) {\n                        if (((typeof l.mimeTypes != o))) {\n                            var qa = ((oa ? [1,6,0,12,] : [1,4,2,0,]));\n                            for (var ra = 0; ((ra < l.mimeTypes.length)); ++ra) {\n                                if (l.mimeTypes[ra].enabledPlugin) {\n                                    var sa = l.mimeTypes[ra].type.match(/^application\\/x-java-applet;(?:jpi-)?version=(\\d+)(?:\\.(\\d+)(?:\\.(\\d+)(?:_(\\d+))?)?)?$/);\n                                    if (((sa != null))) {\n                                        if (((la(qa, sa.slice(1)) <= 0))) {\n                                            return true;\n                                        }\n                                    ;\n                                    }\n                                ;\n                                ;\n                                }\n                            ;\n                            ;\n                            };\n                        ;\n                        }\n                    ;\n                    ;\n                    }\n                     else if (((ha.win && ha.ie))) {\n                        if (((typeof ActiveXObject != o))) {\n                            if (ma(\"1.7.0\")) {\n                                return true;\n                            }\n                        ;\n                        ;\n                            if (((ha.ie >= 8))) {\n                                if (ma(\"1.6.0\")) {\n                                    for (ra = 12; ((ra <= 50)); ++ra) {\n                                        if (na(ra)) {\n                                            if (((((((ha.ie == 9)) && ((ha.moz == 5)))) && ((ra < 24))))) {\n                                                continue;\n                                            }\n                                             else return true\n                                        ;\n                                        }\n                                    ;\n                                    ;\n                                    };\n                                ;\n                                    return false;\n                                }\n                            ;\n                            ;\n                            }\n                             else return ((((ma(\"1.6.0\") || ma(\"1.5.0\"))) || ma(\"1.4.2\")))\n                        ;\n                        }\n                    ;\n                    }\n                    \n                ;\n                ;\n                }\n            ;\n            ;\n                return false;\n            }();\n            ha.co = function() {\n                if (((ha.win && ha.ie))) {\n                    var oa = fa.match(/(\\.NET CLR [0-9.]+)|(\\.NET[0-9.]+)/g);\n                    if (((oa != null))) {\n                        var pa = [3,5,0,];\n                        for (var qa = 0; ((qa < oa.length)); ++qa) {\n                            var ra = oa[qa].match(/[0-9.]{2,}/g)[0].split(\".\");\n                            if (((la(pa, ra) <= 0))) {\n                                return true;\n                            }\n                        ;\n                        ;\n                        };\n                    ;\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n                return false;\n            }();\n            return ha;\n        }();\n        function x(fa) {\n            var ga = new RegExp(((escape(fa) + \"=([^;]+)\")));\n            if (ga.test(((k.cookie + \";\")))) {\n                ga.exec(((k.cookie + \";\")));\n                return RegExp.$1;\n            }\n        ;\n        ;\n            return false;\n        };\n    ;\n        function y(fa, ga) {\n            JSBNG__document.cookie = ((((((escape(fa) + \"=\")) + escape(ga))) + \"; path=/\"));\n        };\n    ;\n        function z(fa) {\n            var ga = 0;\n            if (fa) {\n                var ha = fa.toLowerCase().match(/^(\\d+)(?:\\.(\\d+)(?:\\.(\\d+)([dabfr])?(\\d+)?)?)?$/);\n                if (((ha && ha[1]))) {\n                    var ia = ha[1], ja = ((ha[2] ? ha[2] : 0)), ka = ((ha[3] ? ha[3] : 0)), la = ((ha[4] ? ha[4] : \"r\")), ma = ((ha[5] ? ha[5] : 0));\n                    ga |= ((((((ia / 10)) % 10)) << 28));\n                    ga |= ((((ia % 10)) << 24));\n                    ga |= ((((ja % 10)) << 20));\n                    ga |= ((((ka % 10)) << 16));\n                    ga |= {\n                        d: ((2 << 12)),\n                        a: ((4 << 12)),\n                        b: ((6 << 12)),\n                        f: ((8 << 12)),\n                        r: ((8 << 12))\n                    }[la];\n                    ga |= ((((((ma / 100)) % 10)) << 8));\n                    ga |= ((((((ma / 10)) % 10)) << 4));\n                    ga |= ((ma % 10));\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            return ga;\n        };\n    ;\n        function aa(fa) {\n            var ga = null, ha = k.getElementsByTagName(\"body\")[0], ia = k.createElement(\"object\");\n            if (((ha && ia))) {\n                ia.setAttribute(\"type\", i);\n                ia.style.visibility = \"hidden\";\n                ha.appendChild(ia);\n                var ja = 0;\n                (function() {\n                    if (((typeof ia.GetPluginVersion == o))) {\n                        if (((ja++ < 10))) {\n                            JSBNG__setTimeout(arguments.callee, 10);\n                        }\n                    ;\n                    ;\n                    }\n                     else {\n                        ga = {\n                        };\n                        ga.plugin = ia.GetPluginVersion();\n                        ga.unity = ia.GetUnityVersion(\"\");\n                    }\n                ;\n                ;\n                })();\n                ha.removeChild(ia);\n            }\n        ;\n        ;\n            fa(ga);\n        };\n    ;\n        function ba(fa) {\n            var ga = q, ha = null;\n            l.plugins.refresh();\n            if (((((((((((typeof l.plugins != o)) && l.plugins[h])) && ((typeof l.mimeTypes != o)))) && l.mimeTypes[i])) && l.mimeTypes[i].enabledPlugin))) {\n                ga = p;\n                aa(function(ma) {\n                    if (((!ma || !ma.plugin))) {\n                        ga = r;\n                    }\n                     else if (((((w.mac && w.ch)) && ((z(ma.plugin) <= z(\"2.6.1f3\")))))) {\n                        ga = r;\n                    }\n                     else ha = ma.plugin;\n                    \n                ;\n                ;\n                    fa(ga, ha);\n                });\n                return;\n            }\n             else if (((typeof j.ActiveXObject != o))) {\n                try {\n                    var ja = new ActiveXObject(\"UnityWebPlayer.UnityWebPlayer.1\");\n                    ha = ja.GetPluginVersion();\n                    ga = p;\n                    if (((ha == \"2.5.0f5\"))) {\n                        var ka = /Windows NT \\d+\\.\\d+/.exec(l.userAgent);\n                        if (((ka && ((ka.length > 0))))) {\n                            var la = parseFloat(ka[0].split(\" \")[2]);\n                            if (((la >= 6))) {\n                                ga = r;\n                            }\n                        ;\n                        ;\n                        }\n                    ;\n                    ;\n                    }\n                ;\n                ;\n                } catch (ia) {\n                    if (((((w.win && w.ie)) && w.x64))) {\n                        ga = s;\n                    }\n                ;\n                ;\n                };\n            }\n            \n        ;\n        ;\n            fa(ga, ha);\n        };\n    ;\n        function ca(fa) {\n            var ga = t, ha = \"\";\n            if (((w.java && !x(n)))) {\n                ha = \"\";\n                ga = u;\n            }\n             else if (w.co) {\n                ha = ((((m + \"3.0/co/UnityWebPlayer.application?installer=\")) + encodeURIComponent(((m + \"UnityWebPlayer.exe\")))));\n                ga = v;\n            }\n             else if (w.win) {\n                ha = ((m + \"UnityWebPlayer.exe\"));\n            }\n             else if (((l.platform == \"MacIntel\"))) {\n                ha = ((m + \"webplayer-mini.dmg\"));\n            }\n             else if (((l.platform == \"MacPPC\"))) {\n                ha = ((m + \"webplayer-mini.dmg\"));\n            }\n             else {\n                ha = \"javascript:window.open(\\\"http://unity3d.com/webplayer/\\\");\";\n                ga = s;\n            }\n            \n            \n            \n            \n        ;\n        ;\n            fa(ha, ga);\n        };\n    ;\n        function da() {\n            y(n, true);\n            var fa = {\n                type: \"application/x-java-applet\",\n                archive: ((m + \"3.0/jws/UnityWebPlayer.jar\")),\n                code: \"UnityWebPlayer\",\n                JSBNG__name: \"Unity Web Player\",\n                width: 1,\n                height: 1\n            }, ga = k.createElement(\"div\"), ha = k.body.lastChild;\n            k.body.insertBefore(ga, ha.nextSibling);\n            var ia = {\n                jnlp_href: ((m + \"3.0/jws/UnityWebPlayer.jnlp\")),\n                classloader_cache: false,\n                installer: ea(),\n                image: \"http://webplayer.unity3d.com/installation/unitylogo.png\",\n                centerimage: true,\n                boxborder: false,\n                scriptable: true,\n                mayscript: true\n            };\n            if (((w.win && w.ie))) {\n                var ja = \"\";\n                {\n                    var fin133keys = ((window.top.JSBNG_Replay.forInKeys)((fa))), fin133i = (0);\n                    var ka;\n                    for (; (fin133i < fin133keys.length); (fin133i++)) {\n                        ((ka) = (fin133keys[fin133i]));\n                        {\n                            ja += ((((((((\" \" + ka)) + \"=\\\"\")) + fa[ka])) + \"\\\"\"));\n                        ;\n                        };\n                    };\n                };\n            ;\n                var la = \"\";\n                {\n                    var fin134keys = ((window.top.JSBNG_Replay.forInKeys)((ia))), fin134i = (0);\n                    var ma;\n                    for (; (fin134i < fin134keys.length); (fin134i++)) {\n                        ((ma) = (fin134keys[fin134i]));\n                        {\n                            la += ((((((((\"\\u003Cparam name=\\\"\" + ma)) + \"\\\" value=\\\"\")) + ia[ma])) + \"\\\" /\\u003E\"));\n                        ;\n                        };\n                    };\n                };\n            ;\n                ga.outerHTML = ((((((((\"\\u003Cobject\" + ja)) + \"\\u003E\")) + la)) + \"\\u003C/object\\u003E\"));\n            }\n             else {\n                var na = k.createElement(\"object\");\n                {\n                    var fin135keys = ((window.top.JSBNG_Replay.forInKeys)((fa))), fin135i = (0);\n                    (0);\n                    for (; (fin135i < fin135keys.length); (fin135i++)) {\n                        ((ka) = (fin135keys[fin135i]));\n                        {\n                            na.setAttribute(ka, fa[ka]);\n                        ;\n                        };\n                    };\n                };\n            ;\n                {\n                    var fin136keys = ((window.top.JSBNG_Replay.forInKeys)((ia))), fin136i = (0);\n                    (0);\n                    for (; (fin136i < fin136keys.length); (fin136i++)) {\n                        ((ma) = (fin136keys[fin136i]));\n                        {\n                            var oa = k.createElement(\"param\");\n                            oa.JSBNG__name = ma;\n                            oa.value = ia[ma];\n                            na.appendChild(oa);\n                        };\n                    };\n                };\n            ;\n                ga.parentNode.replaceChild(na, ga);\n            }\n        ;\n        ;\n        };\n    ;\n        function ea() {\n            return ((m + ((w.win ? \"UnityWebPlayer.exe\" : \"UnityPlayer.plugin.zip\"))));\n        };\n    ;\n        return {\n            kInstalled: p,\n            kMissing: q,\n            triedJavaCookie: n,\n            detectUnity: function(fa) {\n                if (((((w.w3 && !((w.wk && ((w.wk < 312)))))) && fa))) {\n                    ba(fa);\n                }\n                 else if (fa) {\n                    fa(q);\n                }\n                \n            ;\n            ;\n            },\n            genInstallUnity: function(fa) {\n                ca(fa);\n            },\n            doJavaInstall: function() {\n                da();\n            }\n        };\n    }();\n    e.exports.kInstalled = g.kInstalled;\n    e.exports.kMissing = g.kMissing;\n    e.exports.triedJavaCookie = g.triedJavaCookie;\n    e.exports.detectUnity = function(h) {\n        g.detectUnity(function(i, j) {\n            h(i, j);\n        });\n    };\n    e.exports.genInstallUnity = function(h) {\n        g.genInstallUnity(function(i, j) {\n            h(i, j);\n        });\n    };\n    e.exports.doJavaInstall = function() {\n        g.doJavaInstall();\n    };\n    e.exports.callbackWhenUnityDetected = function(h) {\n        var i = function() {\n            g.detectUnity(function(j, k) {\n                if (((j == g.kInstalled))) {\n                    h(j, k);\n                }\n                 else JSBNG__setTimeout(i, 3000);\n            ;\n            ;\n            });\n        };\n        i();\n    };\n});\n__d(\"UnityLogging\", [\"AsyncRequest\",\"UnityObject\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = b(\"UnityObject\"), i = function(j, k) {\n        var l = {\n            JSBNG__status: j,\n            version: k\n        };\n        new g().setURI(\"/ajax/platform/unity/logging\").setData(l).send();\n    };\n    e.exports.logUnityVersion = function() {\n        h.detectUnity(i);\n    };\n    e.exports.logUntilInstalled = function() {\n        h.detectUnity(function(j, k) {\n            i(j, k);\n            if (((j != h.kInstalled))) {\n                h.callbackWhenUnityDetected(i);\n            }\n        ;\n        ;\n        });\n    };\n});");
// 2367
geval("if (JSBNG__self.CavalryLogger) {\n    CavalryLogger.start_js([\"C6rJk\",]);\n}\n;\n;\n__d(\"NotifXList\", [], function(a, b, c, d, e, f) {\n    var g = {\n    }, h = null;\n    function i(p) {\n        if (!p) {\n            throw new Error(\"You have to init NotifXList with a non-null owner\");\n        }\n    ;\n    ;\n        h = p;\n    };\n;\n    function j(p) {\n        g[p] = null;\n    };\n;\n    function k(p, q) {\n        if (!q) {\n            throw new Error(\"You have to add a non-null data to xList\");\n        }\n    ;\n    ;\n        g[p] = q;\n    };\n;\n    function l(p) {\n        var q = ((undefined !== g[p.notif_id])), r = ((p.notif_alt_id && ((undefined !== g[p.notif_alt_id]))));\n        if (((q || r))) {\n            k(((q ? p.notif_id : p.notif_alt_id)), p);\n            return true;\n        }\n    ;\n    ;\n        return false;\n    };\n;\n    function m(p) {\n        return ((null != g[p]));\n    };\n;\n    function n(p) {\n        if (m(p)) {\n            var q = g[p];\n            o(p);\n            h.alertList.insert(q.notif_id, q.notif_time, q.notif_markup, q.replace, q.ignoreUnread, q.notif_alt_id);\n        }\n    ;\n    ;\n    };\n;\n    function o(p) {\n        delete g[p];\n    };\n;\n    e.exports = {\n        init: i,\n        userXClick: j,\n        filterStoreClicked: l,\n        newNotifExist: m,\n        resumeInsert: n,\n        removeNotif: o\n    };\n});");
// 2491
geval("if (JSBNG__self.CavalryLogger) {\n    CavalryLogger.start_js([\"5dFET\",]);\n}\n;\n;\n__d(\"TickerReadStateTracking\", [\"Style\",\"clickRefAction\",], function(a, b, c, d, e, f) {\n    var g = b(\"Style\"), h = b(\"clickRefAction\"), i = 73, j = \"ticker_hover\", k = [];\n    function l(n) {\n        var o = JSON.parse(n.getAttribute(\"data-ft\"));\n        if (!o) {\n            return null;\n        }\n    ;\n    ;\n        if (o.mf_story_key) {\n            return o.mf_story_key;\n        }\n    ;\n    ;\n        if (o.fbid) {\n            return o.fbid;\n        }\n    ;\n    ;\n        return null;\n    };\n;\n    function m(n) {\n        var o = l(n);\n        if (((!o || ((o in k))))) {\n            return;\n        }\n    ;\n    ;\n        k[o] = true;\n        var p = {\n            evt: i\n        };\n        h(j, n, null, \"FORCE\", {\n            ft: p\n        });\n    };\n;\n    e.exports.log = m;\n});\n__d(\"TickerRightHideController\", [\"CSS\",\"DOM\",\"ge\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSS\"), h = b(\"DOM\"), i = b(\"ge\");\n    function j() {\n    \n    };\n;\n    j._markAsClosedHelper = function(k) {\n        var l = i(\"pagelet_reminders\");\n        if (l) {\n            var m = h.scry(l, \"div.tickerToggleWrapper\")[0];\n            if (m) {\n                g.conditionClass(m, \"displayedTickerToggleWrapper\", k);\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n        var n = i(\"pagelet_moments\");\n        if (n) {\n            var o = h.scry(n, \"div.tickerToggleWrapper\")[0];\n            if (o) {\n                g.conditionClass(o, \"displayedTickerToggleWrapper\", k);\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n        var p = i(\"pagelet_rhc_ticker\");\n        if (p) {\n            var q = h.scry(p, \"div.tickerToggleWrapper\")[0];\n            if (q) {\n                g.conditionClass(q, \"displayedTickerToggleWrapper\", !k);\n            }\n        ;\n        ;\n            g.conditionClass(p, \"hidden_rhc_ticker\", k);\n        }\n    ;\n    ;\n    };\n    j.markAsClosed = function() {\n        j._markAsClosedHelper(true);\n    };\n    j.markAsUnclosed = function() {\n        j._markAsClosedHelper(false);\n    };\n    e.exports = j;\n});\n__d(\"legacy:TickerRightHideController\", [\"TickerRightHideController\",], function(a, b, c, d) {\n    a.TickerRightHideController = b(\"TickerRightHideController\");\n}, 3);\n__d(\"TickerController\", [\"JSBNG__Event\",\"Animation\",\"Arbiter\",\"AsyncRequest\",\"AsyncSignal\",\"Bootloader\",\"ChannelConstants\",\"LegacyContextualDialog\",\"CSS\",\"DOM\",\"HTML\",\"JSLogger\",\"Keys\",\"LayerFadeOnHide\",\"LiveTimer\",\"NavigationMessage\",\"Parent\",\"Run\",\"ScrollableArea\",\"SelectorDeprecated\",\"Style\",\"TickerReadStateTracking\",\"Toggler\",\"UIPagelet\",\"URI\",\"UserActivity\",\"UserAgent\",\"Vector\",\"$\",\"clickRefAction\",\"collectDataAttributes\",\"copyProperties\",\"cx\",\"emptyFunction\",\"ge\",\"goURI\",\"throttle\",\"userAction\",\"TickerRHCPageletByGK\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"Animation\"), i = b(\"Arbiter\"), j = b(\"AsyncRequest\"), k = b(\"AsyncSignal\"), l = b(\"Bootloader\"), m = b(\"ChannelConstants\"), n = b(\"LegacyContextualDialog\"), o = b(\"CSS\"), p = b(\"DOM\"), q = b(\"HTML\"), r = b(\"JSLogger\"), s = b(\"Keys\"), t = b(\"LayerFadeOnHide\"), u = b(\"LiveTimer\"), v = b(\"NavigationMessage\"), w = b(\"Parent\"), x = b(\"Run\"), y = b(\"ScrollableArea\"), z = b(\"SelectorDeprecated\"), aa = b(\"Style\"), ba = b(\"TickerReadStateTracking\"), ca = b(\"Toggler\"), da = b(\"UIPagelet\"), ea = b(\"URI\"), fa = b(\"UserActivity\"), ga = b(\"UserAgent\"), ha = b(\"Vector\"), ia = b(\"$\"), ja = b(\"clickRefAction\"), ka = b(\"collectDataAttributes\"), la = b(\"copyProperties\"), ma = b(\"cx\"), na = b(\"emptyFunction\"), oa = b(\"ge\"), pa = b(\"goURI\"), qa = b(\"throttle\"), ra = b(\"userAction\"), sa = 1, ta = 2, ua = 3, va = 4, wa = r.create(\"ticker_controller\");\n    function xa() {\n    \n    };\n;\n    la(xa, {\n        _instances: {\n        },\n        _activeInstance: null,\n        _placeholders: {\n        },\n        _logPositionChange: false,\n        getInstance: function(ya) {\n            var za = w.byClass(ia(ya), \"fbFeedTicker\");\n            return ((za ? xa._instances[za.id] : null));\n        },\n        isLoaded: function(ya) {\n            var za = xa._placeholders[ya.id];\n            return ((!za || ((za.JSBNG__status == ua))));\n        },\n        show: function(ya, za) {\n            za = ((za || na));\n            {\n                var fin137keys = ((window.top.JSBNG_Replay.forInKeys)((xa._instances))), fin137i = (0);\n                var ab;\n                for (; (fin137i < fin137keys.length); (fin137i++)) {\n                    ((ab) = (fin137keys[fin137i]));\n                    {\n                        var bb = oa(ab);\n                        if (((!bb || ((bb.parentNode.id == ya.id))))) {\n                            continue;\n                        }\n                    ;\n                    ;\n                        xa.hide(bb.parentNode);\n                    };\n                };\n            };\n        ;\n            xa._doPositionChange(ya);\n            o.show(ya);\n            var cb = xa._placeholders[ya.id];\n            if (((cb && ((cb.JSBNG__status == sa))))) {\n                xa._fetchTickerForPlaceholder(ya, za);\n            }\n             else {\n                var db = p.scry(ya, \".fbFeedTicker\")[0], eb = ((db && xa.getInstance(db)));\n                xa._activeInstance = eb;\n                ((eb && eb._poll()));\n                xa._placeholders[ya.id] = {\n                    JSBNG__status: va,\n                    callback: za\n                };\n                za();\n            }\n        ;\n        ;\n        },\n        _doPositionChange: function(ya) {\n            if (((!xa._logPositionChange || o.shown(ya)))) {\n                return;\n            }\n        ;\n        ;\n            new k(\"/common/ods_endpoint.php\", {\n                k: ((\"ticker.render.switch.\" + ya.id))\n            }).send();\n        },\n        hide: function(ya) {\n            var za = p.scry(ya, \".fbFeedTicker\")[0], ab = ((za && xa.getInstance(za)));\n            ((ab && ab.hideActiveStory()));\n            o.hide(ya);\n        },\n        hideStoriesByClass: function(ya) {\n            {\n                var fin138keys = ((window.top.JSBNG_Replay.forInKeys)((xa._instances))), fin138i = (0);\n                var za;\n                for (; (fin138i < fin138keys.length); (fin138i++)) {\n                    ((za) = (fin138keys[fin138i]));\n                    {\n                        p.scry(ia(za), ya).forEach(o.hide);\n                    ;\n                    };\n                };\n            };\n        ;\n        },\n        hideStory: function(ya) {\n            var za = ((ya && xa.getInstance(ya)));\n            ((za && za.hideStory(ya)));\n        },\n        undoHideStory: function(ya) {\n            var za = ((ya && xa.getInstance(ya)));\n            ((za && za.undoHideStory(ya)));\n        },\n        insertStoriesAtBottom: function(ya) {\n            xa._activeInstance.insertStoriesAtBottom(ya);\n        },\n        _fetchTickerForPlaceholder: function(ya, za) {\n            var ab = {\n                handler: function() {\n                    xa._placeholders[ya.id].JSBNG__status = ua;\n                    za();\n                }\n            }, bb = b(\"TickerRHCPageletByGK\"), cb = bb.pagelet_name;\n            da.loadFromEndpoint(cb, ya.id, xa._placeholders[ya.id].pageletData, ab);\n            xa._placeholders[ya.id].JSBNG__status = ta;\n        },\n        registerStoryDialog: function(ya, za) {\n            i.subscribe(\"ticker/init\", function() {\n                var ab = oa(ya), bb = ((ab && xa.getInstance(ab)));\n                ((bb && bb.registerStoryDialog(ab, za)));\n            }, i.SUBSCRIBE_ALL);\n        },\n        registerPlaceholder: function(ya, za) {\n            var ab = xa._placeholders[ya];\n            xa._placeholders[ya] = {\n                JSBNG__status: sa,\n                pageletData: za\n            };\n            if (((ab && ((ab.JSBNG__status == va))))) {\n                xa.show(ia(ya));\n                ab.callback();\n            }\n        ;\n        ;\n        }\n    });\n    la(xa.prototype, {\n        ADS_IDLE_MS: 300000,\n        FLYOUT_MAX_HEIGHT: 450,\n        FLYOUT_OFFSET_THRESHOLD: 20,\n        FLYOUT_COMMENT_OFFSET: 15,\n        FLYOUT_VIEWPORT_PADDING: 75,\n        FLYOUT_TARGET_HEIGHT_OFFSET: 25,\n        init: function(ya, za, ab) {\n            xa._instances[ya.id] = this;\n            xa._activeInstance = this;\n            this._root = ya;\n            this._content = p.JSBNG__find(ya, \".ticker_stream\");\n            this._stories = p.JSBNG__find(this._root, \".tickerActivityStories\");\n            this._scrollableArea = za;\n            this._container = p.JSBNG__find(ya, \"div.uiScrollableAreaWrap\");\n            this._newestStory = {\n            };\n            this._storyIDs = [];\n            this._objectIDs = [];\n            this._fetchedStories = {\n            };\n            this._removedStoryIDs = [];\n            this._storiesToRemove = [];\n            var bb = JSBNG__Date.now();\n            this._initTime = bb;\n            this._lastUpdate = bb;\n            this._lastPull = bb;\n            this._lastInsert = bb;\n            this._lastCustomStory = 0;\n            this._pollOnly = false;\n            this._needNonCustomStoryNum = 0;\n            this._doCustomUpdate = true;\n            this._autoloadStoryIndex = 1;\n            this._scrollTopThreshold = 100;\n            this._scrollTopPrompt = p.JSBNG__find(this._root, \".scrollTopPrompt\");\n            this._scrollTopPromptVisible = false;\n            this._maxStoriesToKeep = 50;\n            this._minStoriesToKeep = 25;\n            this._tickerInSidebarMode = !!w.byClass(this._root, \"fbChatSidebar\");\n            this._loadStoriesWithActions();\n            ja(\"ticker_flyout\");\n            ja(\"ticker_flyout_prefetch\");\n            ja(\"ticker_flyout_loadtime\");\n            ja(\"ticker_stream\");\n            this._ua = {\n                flyout: ra(\"ticker\").uai(\"flyout\", \"flyout\", false),\n                flyout_prefetch: ra(\"ticker\").uai(\"flyout_prefetch\", \"flyout_prefetch\", false),\n                flyout_loadtime: ra(\"ticker\").uai(\"ticker_flyout_loadtime\", \"flyout_loadtime\", false),\n                stream: ra(\"ticker\").uai(\"ticker_stream\", \"stream\", false)\n            };\n            this._uaCurStoryIDFetch = null;\n            this._uaCurStoryIDPrefetch = null;\n            var cb = p.create(\"div\", {\n                className: \"storyQueue hidden_elem\"\n            });\n            this._storyQueue = cb;\n            p.appendContent(this._root, cb);\n            this._initObjectIDs();\n            this._initConfig(ab);\n            this._resetMorePager();\n            this._initListeners();\n            this._initSubscriptions(ab);\n            i.inform(\"ticker/init\", this, i.BEHAVIOR_PERSISTENT);\n            this._poll();\n            if (this._prefetchAfterLoad) {\n                this._logUserEvent(\"stream\", \"prefetch\");\n                this._fetchStories(this._getInsertedStories().slice(0, 5));\n            }\n        ;\n        ;\n        },\n        _loadStoriesWithActions: function() {\n            var ya = oa(\"rightCol\");\n            if (!ya) {\n                return;\n            }\n        ;\n        ;\n            this._toggleWrapper = p.scry(ya, \".tickerToggleWrapper\")[0];\n            if (this._toggleWrapper) {\n                var za = p.scry(this._stories, \".tickerStoryWithButton\");\n                this._storiesWithActions = {\n                };\n                for (var ab = 0; ((ab < za.length)); ab++) {\n                    var bb = za[ab];\n                    this._storiesWithActions[bb.getAttribute(\"data-story-key\")] = bb;\n                };\n            ;\n            }\n        ;\n        ;\n        },\n        _initConfig: function(ya) {\n            la(this, {\n                _newest: ya.newest,\n                _page_newest: ya.newest,\n                _timeout: ya.timeout,\n                _heartbeatTimeout: Math.min(5000, ya.heartbeatTimeout),\n                _maxHeartbeatTimeout: Math.max(30000, ya.maxHeartbeatTimeout),\n                _pullTimeout: Math.max(30000, ya.pullTimeout),\n                _insertTimeout: ya.insertTimeout,\n                _friendCount: ya.friendCount,\n                _maxQueueLength: ya.maxQueueLength,\n                _heartbeatEndpoint: ya.heartbeatEndpoint,\n                _noPoll: ya.nopoll,\n                _maxCustomQueueLength: ya.maxCustomQueueLength,\n                _customStoryInsertTimeout: Math.max(5000, ya.customStoryInsertTimeout),\n                _nonCustomToCustomStoryRatio: ya.nonCustomToCustomStoryRatio,\n                _minForceUpdateInterval: Math.max(ya.insertTimeout, ya.minForceUpdateInterval),\n                _popupOnHover: ya.popupOnHover,\n                _priorityAppId: ya.priorityAppId,\n                _prefetchOnHover: ya.prefetchStoriesOnHover,\n                _userIdleTimeout: ya.userIdleTimeout,\n                _firstCustomStoryDelay: ya.firstCustomStoryDelay,\n                _pollOnly: ya.pollOnly,\n                _tickerSource: ya.tickerSource,\n                _prefetchAfterLoad: ya.prefetchAfterLoad,\n                _logFlyouts: ya.logFlyouts,\n                _userScrollGaurdDelay: ya.userScrollGaurdDelay,\n                _rescheduleScrollToTopDelay: ya.rescheduleScrollToTopDelay,\n                _aggressiveRegulator: ya.aggressiveRegulator\n            });\n            this._queueCustomStories(ya.customStories);\n        },\n        _initListeners: function() {\n            this._listeners = g.listen(this._root, {\n                click: this._handleClick.bind(this),\n                keydown: this._handleKeydown.bind(this),\n                mouseout: this._handleMouseout.bind(this),\n                mouseover: this._handleMouseover.bind(this),\n                mousedown: this._tickerDeClicker.bind(this),\n                mouseup: this._handleMouseup.bind(this)\n            });\n            this._listeners.JSBNG__scroll = g.listen(this._container, \"JSBNG__scroll\", this._handleScroll.bind(this));\n            this._initInfiniteScrollListener.bind(this).defer();\n        },\n        _initSubscriptions: function(ya) {\n            x.onLeave(this._cleanup.bind(this));\n            this._subscriptions = [i.subscribe(v.NAVIGATION_BEGIN, this._onNavHandler.bind(this)),i.subscribe(\"composer/publish\", this._handleComposerPublish.bind(this)),i.subscribe(\"Ticker/storiesInserted\", this._handleStoriesInserted.bind(this)),i.subscribe(\"Ticker/fixed\", this._setFixed.bind(this, true)),i.subscribe(\"Ticker/unfixed\", this._setFixed.bind(this, false)),i.subscribe(\"Ticker/resized\", this._checkInfiniteScroll.bind(this)),i.subscribe(\"ufi/comment\", this._scrollDialogToBottom.bind(this)),i.subscribe(\"Ticker/chatOpened\", this._handleChatOpened.bind(this)),];\n            if (!ya.pollOnly) {\n                this._subscriptions.push(i.subscribe(m.getArbiterType(\"ticker_update\"), this._handleTickerPush.bind(this)));\n            }\n        ;\n        ;\n            if (((ya.pushChannel && !ya.pollOnly))) {\n                this.setPushChannel(ya.pushChannel);\n            }\n        ;\n        ;\n        },\n        _handleClick: function(JSBNG__event) {\n            var ya = JSBNG__event.getTarget();\n            if (this._getButtonFromNode(ya)) {\n                this._logUserAction(ya, \"click\", JSBNG__event);\n                this._handleActionButton(JSBNG__event);\n                return;\n            }\n        ;\n        ;\n            var za = this._getStoryFromNode(ya), ab = w.byClass(ya, \"tickerStoryAllowClick\");\n            if (((((!za || ((za == this._selectedStory)))) || ab))) {\n                return;\n            }\n        ;\n        ;\n            if (this._storyIsHidden(za)) {\n                return;\n            }\n        ;\n        ;\n            if (((((za == this._activeStory)) && !this._selectedStory))) {\n                this._selecting = true;\n            }\n        ;\n        ;\n            this._clearNux();\n            this._logUserEvent(\"flyout\", \"click\");\n            this._logUserEvent(\"flyout_loadtime\", \"open\");\n            if (this._storyCanOpenExternally(za)) {\n                var bb = za.getAttribute(\"data-href\");\n                if (((bb && !ya.getAttribute(\"href\")))) {\n                    var cb = {\n                        href: bb\n                    }, db = ka(ya, [\"ft\",\"gt\",]);\n                    ja(\"click\", cb, JSBNG__event, \"FORCE\", db);\n                    ra(\"ticker\", cb, JSBNG__event).uai(\"click\");\n                }\n                 else this._logUserAction(ya, \"click\", JSBNG__event);\n            ;\n            ;\n                this._openStoryExternally(za, JSBNG__event);\n                return;\n            }\n        ;\n        ;\n            this._logUserAction(ya, \"flyout\", JSBNG__event);\n            this._activateStory(za, \"click\");\n            this._selectStory(za);\n        },\n        _handleMouseover: function(JSBNG__event) {\n            this._setLocked(true);\n            var ya = JSBNG__event.getTarget(), za = this._getOpenableStory(ya);\n            if (!za) {\n                return;\n            }\n        ;\n        ;\n            JSBNG__event.kill();\n            if (((this._prefetchOnHover || this._popupOnHover))) {\n                if (!((za.id in this._fetchedStories))) {\n                    this._logUserEvent(\"flyout_prefetch\", \"prefetch_on_hover\");\n                    this._uaCurStoryIDPrefetch = za.id;\n                }\n            ;\n            ;\n                this._fetchStory(za);\n            }\n        ;\n        ;\n            if (this._selectedStory) {\n                return;\n            }\n        ;\n        ;\n            if (this._popupOnHover) {\n                this._clearHoverTimeouts();\n                var ab = ((this._storyCanOpenExternally(za) ? 500 : 1000)), bb = ((this._activeStory ? 75 : ab));\n                this._hoverShowTimeout = this._setTimeout(function() {\n                    this._logUserEvent(\"flyout\", \"hover\", bb);\n                    this._logUserEvent(\"flyout_loadtime\", \"open\");\n                    this._activateStory(za, \"hover\");\n                    this._logUserAction(ya, \"flyout\", JSBNG__event);\n                }.bind(this), bb);\n            }\n        ;\n        ;\n        },\n        _handleMouseout: function(JSBNG__event) {\n            var ya = JSBNG__event.getTarget();\n            this._setLocked(false);\n            if (((ya == this._getStoryFromNode(ya)))) {\n                var za = p.scry(ya.parentNode, \".openToggler\");\n                for (var ab = 0; ((ab < za.length)); ab++) {\n                    z.toggle(za[ab]);\n                ;\n                };\n            ;\n            }\n        ;\n        ;\n            this._clearClickedStory();\n            this._scheduleHide();\n        },\n        _handleKeydown: function(JSBNG__event) {\n            this._tickerDeClicker(JSBNG__event);\n            var ya = this._activeStory;\n            if (!ya) {\n                return;\n            }\n        ;\n        ;\n            var za = g.getKeyCode(JSBNG__event);\n            switch (za) {\n              case s.UP:\n            \n              case s.DOWN:\n                var ab = this._getInsertedStories(), bb;\n                if (JSBNG__event.getModifiers().any) {\n                    bb = ((((za === s.UP)) ? 0 : ((ab.length - 1))));\n                }\n                 else bb = ((ab.indexOf(ya) + ((((za === s.UP)) ? -1 : 1))));\n            ;\n            ;\n                ya = ab[bb];\n                break;\n              case s.ESC:\n                this._deactivateStory(true);\n                return;\n              default:\n                return;\n            };\n        ;\n            JSBNG__event.kill();\n            if (!ya) {\n                return;\n            }\n        ;\n        ;\n            this._activateStory(ya, \"keypress\");\n            this._selectStory(ya);\n        },\n        _fadeTopmostStoryButton: function() {\n            var ya = 0, za = 15;\n            if (this._storiesWithActions) {\n                {\n                    var fin139keys = ((window.top.JSBNG_Replay.forInKeys)((this._storiesWithActions))), fin139i = (0);\n                    var ab;\n                    for (; (fin139i < fin139keys.length); (fin139i++)) {\n                        ((ab) = (fin139keys[fin139i]));\n                        {\n                            var bb = this._storiesWithActions[ab], cb = p.scry(bb, \".tickerInlineActionButton\")[0], db = p.scry(cb, \".tickerActionIcon\")[0], eb = ((ha.getElementPosition(cb).y - ha.getElementPosition(this._toggleWrapper).y));\n                            if (((eb < ya))) {\n                                aa.set(cb, \"opacity\", 0);\n                                aa.set(db, \"opacity\", 0);\n                            }\n                             else if (((((eb >= ya)) && ((eb < za))))) {\n                                var fb = ((((eb - ya)) / ((za - ya))));\n                                aa.set(cb, \"opacity\", fb);\n                                aa.set(db, \"opacity\", fb);\n                                break;\n                            }\n                             else {\n                                aa.set(cb, \"opacity\", 1);\n                                aa.set(db, \"opacity\", 1);\n                            }\n                            \n                        ;\n                        ;\n                        };\n                    };\n                };\n            }\n        ;\n        ;\n        },\n        _handleScroll: function() {\n            if (!this._preventScrollDismiss) {\n                this._deactivateStory(true);\n            }\n             else this._preventScrollDismiss = false;\n        ;\n        ;\n            if (!this._handleScrollThrottled) {\n                this._handleScrollThrottled = qa(this._handleScrollInner.bind(this));\n            }\n        ;\n        ;\n            this._handleScrollThrottled();\n        },\n        _handleScrollInner: function() {\n            this._fadeTopmostStoryButton();\n            this._checkInfiniteScroll();\n            this._setIsUserScrolling();\n            if (!this._scrollLogged) {\n                this._scrollLogged = true;\n                var ya = this._stories.childNodes.length, za = this._stories.getAttribute(\"data-gt\"), ab = {\n                    ticker_scroll: 1,\n                    number_stories: ya,\n                    source: za\n                };\n                ja(\"JSBNG__scroll\", null, null, \"FORCE\", {\n                    gt: ab\n                });\n                ra(\"ticker\").uai(\"JSBNG__scroll\");\n            }\n        ;\n        ;\n        },\n        _setIsUserScrolling: function() {\n            JSBNG__clearTimeout(this._userScrollingToken);\n            if (this._isScrolledToTop()) {\n                this._userScrolling = false;\n                return;\n            }\n        ;\n        ;\n            this._userScrolling = true;\n            this._userScrollingToken = JSBNG__setTimeout(function() {\n                this._userScrolling = false;\n                this._userScrollingToken = null;\n            }.bind(this), this._userScrollGaurdDelay);\n        },\n        _isUserScrolling: function() {\n            return this._userScrolling;\n        },\n        _handleStoriesInserted: function() {\n            this._initInfiniteScrollListener();\n            if (((this._scrollableArea instanceof y))) {\n                this._scrollableArea.adjustGripper();\n            }\n             else wa.error(\"wrong_scrollable_area\", {\n                JSBNG__dump: this\n            });\n        ;\n        ;\n            this._logUserEvent(\"stream\", \"insert\");\n        },\n        _handleActionButton: function(JSBNG__event) {\n            var ya = JSBNG__event.getTarget(), za = this._getOpenableStory(ya), ab = this._getStoryDialog(za);\n            if (ab) {\n                var bb = ab.subscribe(\"beforehide\", function() {\n                    ab.unsubscribe(bb);\n                    return false;\n                });\n            }\n        ;\n        ;\n        },\n        _handleScrollToTopClick: function() {\n            this._scrollToTop(this._poll.bind(this));\n        },\n        _scheduleScrollToTop: function() {\n            ((this._scrollToTopToken && JSBNG__clearTimeout(this._scrollToTopToken)));\n            this._scrollToTopToken = JSBNG__setTimeout(function() {\n                if (((this._isLocked() || this._isUserScrolling()))) {\n                    this._scheduleScrollToTop();\n                }\n                 else {\n                    this._scrollToTopToken = null;\n                    this._scrollToTop();\n                }\n            ;\n            ;\n            }.bind(this), this._rescheduleScrollToTopDelay);\n        },\n        _scrollToTop: function(ya) {\n            new h(this._container).to(\"scrollTop\", 0).ease(h.ease.end).ondone(ya).go();\n        },\n        _clearHoverTimeouts: function() {\n            JSBNG__clearTimeout(this._hoverShowTimeout);\n            JSBNG__clearTimeout(this._hoverHideTimeout);\n        },\n        _getAllStories: function() {\n            return p.scry(this._root, \"div.fbFeedTickerStory\");\n        },\n        _getInsertedStories: function() {\n            return this._getAllStories().filter(function(ya) {\n                return ((!o.hasClass(ya, \"queuedStory\") && !o.hasClass(ya, \"customStory\")));\n            });\n        },\n        _getQueuedStories: function() {\n            return p.scry(this._storyQueue, \".fbFeedTickerStory.queuedStory\");\n        },\n        _getQueuedCustomStories: function() {\n            return p.scry(this._storyQueue, \".fbFeedTickerStory.customStory\");\n        },\n        _getButtonFromNode: function(ya) {\n            return w.byClass(ya, \"tickerInlineOverlay\");\n        },\n        _getStoryFromNode: function(ya) {\n            return w.byClass(ya, \"fbFeedTickerStory\");\n        },\n        _getActionButtonFromStory: function(ya) {\n            return p.scry(ya, \".tickerInlineActionButton\")[0];\n        },\n        _getOpenableStory: function(ya) {\n            var za = this._getStoryFromNode(ya);\n            return ((this._storyCanOpenDialog(za) ? za : null));\n        },\n        _getStoryDialog: function(ya) {\n            return n.getInstance(ya);\n        },\n        _getStoryDialogEndpoint: function(ya) {\n            return ((((((ya && ((ya.getAttribute(\"data-rel\") == \"async\")))) && ya.getAttribute(\"data-ajaxify\"))) || null));\n        },\n        _storyCanOpenDialog: function(ya) {\n            return ((!!this._getStoryDialogEndpoint(ya) && !this._storyIsHidden(ya)));\n        },\n        _storyCanOpenExternally: function(ya) {\n            return ((!!ya.getAttribute(\"data-href\") || !this._storyCanOpenDialog(ya)));\n        },\n        _storyIsHidden: function(ya) {\n            return o.hasClass(ya, \"tickerStoryHidden\");\n        },\n        hideActiveStory: function() {\n            ((this._activeStory && this.hideStory(this._activeStory)));\n        },\n        hideStory: function(ya) {\n            this._deactivateStory();\n            if (((p.getText(ya) === \"\"))) {\n                p.remove(ya);\n            }\n        ;\n        ;\n            o.addClass(ya, \"tickerStoryHidden\");\n            o.removeClass(ya, \"tickerStoryClickable\");\n        },\n        undoHideStory: function(ya) {\n            o.addClass(ya, \"tickerStoryClickable\");\n            o.removeClass(ya, \"tickerStoryHidden\");\n        },\n        insertStoriesAtBottom: function(ya) {\n            if (!ya) {\n                return;\n            }\n        ;\n        ;\n            var za = p.create(\"div\");\n            za.appendChild(ya);\n            var ab = p.scry(za, \".fbFeedTickerStory\"), bb = p.JSBNG__find(za, \".tickerMorePager\"), cb = [];\n            for (var db = 0; ((db < ab.length)); db++) {\n                if (!this.dedupeStory(ab[db])) {\n                    cb.push(ab[db]);\n                }\n            ;\n            ;\n            };\n        ;\n            if (cb.length) {\n                cb.push(bb);\n                p.replace(p.JSBNG__find(this._root, \".tickerMorePager\"), cb);\n            }\n        ;\n        ;\n            i.inform(\"Ticker/storiesInserted\");\n        },\n        _scheduleHide: function() {\n            if (((this._popupOnHover && !this._selectedStory))) {\n                this._clearHoverTimeouts();\n                this._hoverHideTimeout = this._setTimeout(this._deactivateStory.bind(this), 100);\n            }\n        ;\n        ;\n        },\n        _setScrollTopPromptVisible: function(ya) {\n            this._scrollTopPromptVisible = ya;\n            o.conditionShow(this._scrollTopPrompt, ya);\n            if (((ya && !this._listeners.scrollTop))) {\n                this._listeners.scrollTop = g.listen(this._scrollTopPrompt, {\n                    click: this._handleScrollToTopClick.bind(this)\n                });\n            }\n             else if (((!ya && this._listeners.scrollTop))) {\n                this._listeners.scrollTop.click.remove();\n                this._listeners.scrollTop = null;\n            }\n            \n        ;\n        ;\n        },\n        _isUserIdle: function() {\n            return !fa.isActive(this._userIdleTimeout);\n        },\n        _schedulePoll: function() {\n            JSBNG__clearTimeout(this._pollToken);\n            this._pollToken = this._setTimeout(this._poll.bind(this), this._timeout);\n        },\n        _poll: function() {\n            if (!this._isTickerVisible()) {\n                return;\n            }\n        ;\n        ;\n            if (((this._storiesToRemove.length > 0))) {\n                if (this._isInsertingStory) {\n                    return this._schedulePoll();\n                }\n            ;\n            ;\n                var ya = this._storiesToRemove.pop();\n                this.removeStory(ya);\n            }\n        ;\n        ;\n            var za = ((!this._isScrolledToTop() && this._getQueuedStories().length));\n            this._setScrollTopPromptVisible(za);\n            var ab = JSBNG__Date.now(), bb = ((ab - this._lastInsert));\n            if (((((bb < this._insertTimeout)) || this._isLocked()))) {\n                return this._schedulePoll();\n            }\n        ;\n        ;\n            var cb = this._getQueuedStories(), db = this._getQueuedCustomStories(), eb = this._isUserIdle(), fb = ((cb.length > 0)), gb = ((((((((db.length > 0)) && !eb)) && ((((ab - this._initTime)) > this._firstCustomStoryDelay)))) && ((((this._needNonCustomStoryNum === 0)) || ((!fb && ((((ab - this._lastCustomStory)) > this._customStoryInsertTimeout))))))));\n            if (gb) {\n                this.insertStory(db.shift());\n                this._lastCustomStory = ab;\n                this._needNonCustomStoryNum = this._nonCustomToCustomStoryRatio;\n                return this._schedulePoll();\n            }\n        ;\n        ;\n            if (fb) {\n                this.insertStory(cb.shift());\n                this._needNonCustomStoryNum--;\n                if (((this._needNonCustomStoryNum < 0))) {\n                    this._needNonCustomStoryNum = 0;\n                }\n            ;\n            ;\n                return this._schedulePoll();\n            }\n        ;\n        ;\n            if (eb) {\n                return fa.subscribeOnce(this._poll.bind(this));\n            }\n        ;\n        ;\n            var hb = ((((((((((db.length === 0)) && ((this._needNonCustomStoryNum === 0)))) && ((this._nonCustomToCustomStoryRatio > 0)))) && fa.isActive(this.ADS_IDLE_MS))) && ((((ab - this._lastUpdate)) > this._minForceUpdateInterval)))), ib = false, jb = false;\n            if (this._pollOnly) {\n                jb = ((((ab - this._lastUpdate)) > this._heartbeatTimeout));\n            }\n             else ib = ((((ab - this._lastPull)) > this._pullTimeout));\n        ;\n        ;\n            var kb = ((((((hb && this._doCustomUpdate)) || ib)) || jb));\n            if (!kb) {\n                return this._schedulePoll();\n            }\n        ;\n        ;\n            if (hb) {\n                this._doCustomUpdate = false;\n            }\n        ;\n        ;\n            this.update({\n                pull: ib,\n                fullpoll: jb,\n                needcustomstory: hb\n            });\n        },\n        _updatePollOnlyHeartbeatTimeout: function() {\n            if (((this._pollOnly && ((this._heartbeatTimeout < this._maxHeartbeatTimeout))))) {\n                this._heartbeatTimeout = Math.min(((this._heartbeatTimeout + 5000)), this._maxHeartbeatTimeout);\n            }\n        ;\n        ;\n        },\n        update: function(ya) {\n            this._updatePollOnlyHeartbeatTimeout();\n            if (((this._noPoll && !this._pollOnly))) {\n                return this._schedulePoll();\n            }\n        ;\n        ;\n            var za = {\n                newest: ((((ya.fullpoll || ya.cache_update)) ? this._newest : this._page_newest)),\n                storyids: this._storyIDs,\n                friendcount: this._friendCount,\n                priorityappid: this._priorityAppId,\n                source: this._tickerSource,\n                needcustomstory: ((this._nonCustomToCustomStoryRatio > 0))\n            };\n            la(za, ya);\n            new j().setURI(this._heartbeatEndpoint).setReadOnly(true).setOption(\"retries\", 0).setData(za).setHandler(this._handleResponse.bind(this)).setFinallyHandler(this._poll.bind(this)).setAllowCrossPageTransition(true).send();\n            this._lastUpdate = JSBNG__Date.now();\n            if (za.pull) {\n                this._lastPull = this._lastUpdate;\n            }\n        ;\n        ;\n            this._storyIDs = [];\n        },\n        insertStory: function(ya, za, ab) {\n            this._lastInsert = JSBNG__Date.now();\n            ((window.LiveTimer && u.addTimeStamps(ya)));\n            o.removeClass(ya, \"queuedStory\");\n            o.removeClass(ya, \"customStory\");\n            if (((za !== false))) {\n                var bb = ((ab ? this._fadeStoryIn : this._flyStoryIn));\n                if (this._isUserScrolling()) {\n                    var cb = function() {\n                        this._container.scrollTop = ((this._container.scrollTop + this._stories.firstChild.offsetHeight));\n                        this._scheduleScrollToTop();\n                    }.bind(this);\n                    this._fadeStoryIn(ya, cb);\n                }\n                 else this._scrollToTop(bb.bind(this, ya));\n            ;\n            ;\n            }\n             else p.prependContent(this._stories, ya);\n        ;\n        ;\n            if (((this._storiesWithActions && o.hasClass(ya, \"tickerStoryWithButton\")))) {\n                this._storiesWithActions[ya.getAttribute(\"data-story-key\")] = ya;\n            }\n        ;\n        ;\n            this._removeOldStories();\n        },\n        _removeOldStories: function() {\n            var ya = this._getInsertedStories();\n            if (((ya.length <= this._maxStoriesToKeep))) {\n                return;\n            }\n        ;\n        ;\n            var za = this._minStoriesToKeep, ab = ya.slice(za);\n            ab.forEach(p.remove);\n            if (this._storiesWithActions) {\n                for (var bb = 0; ((bb < ab.length)); bb++) {\n                    delete this._storiesWithActions[ab[bb].getAttribute(\"data-story-key\")];\n                ;\n                };\n            }\n        ;\n        ;\n            this._resetMorePager();\n        },\n        _resetMorePager: function() {\n            var ya = this._getInsertedStories();\n            if (((!ya || !ya.length))) {\n                return;\n            }\n        ;\n        ;\n            var za = ya[((ya.length - 1))].getAttribute(\"data-ticker-timestamp\"), ab = p.scry(this._root, \".tickerMorePager a\")[0];\n            if (((!ab || !za))) {\n                return;\n            }\n        ;\n        ;\n            var bb = new ea(ab.getAttribute(\"ajaxify\"));\n            bb.addQueryData({\n                oldest: za\n            });\n            ab.setAttribute(\"ajaxify\", bb);\n        },\n        _setLocked: function(ya) {\n            this._locked = ya;\n        },\n        _isLocked: function() {\n            return !!((this._locked || this._activeStory));\n        },\n        informAndRemoveStory: function(ya, za, ab) {\n            var bb = this._getStoryFromNode(ya), cb = bb.getAttribute(\"data-story-key\");\n            p.setContent(bb, za);\n            o.addClass(bb, \"highlightedStory\");\n            this._setTimeout(this.removeStory.bind(this, cb), ((ab || 6000)));\n        },\n        _getStoryByStoryKey: function(ya) {\n            var za = this._getAllStories();\n            for (var ab = 0; ((ab < za.length)); ab++) {\n                var bb = za[ab];\n                if (((bb.getAttribute(\"data-story-key\") == ya))) {\n                    return bb;\n                }\n            ;\n            ;\n            };\n        ;\n            return null;\n        },\n        removeStory: function(ya) {\n            this._removedStoryIDs[ya] = true;\n            var za = this._getStoryByStoryKey(ya);\n            if (!za) {\n                return;\n            }\n        ;\n        ;\n            if (this._storiesWithActions) {\n                delete this._storiesWithActions[ya];\n            }\n        ;\n        ;\n            if (((za == this._activeStory))) {\n                this._deactivateStory();\n            }\n        ;\n        ;\n            var ab = this._getStoryDialog(za);\n            ((ab && ab.destroy()));\n            if (o.hasClass(za, \"queuedStory\")) {\n                p.remove(za);\n                return;\n            }\n        ;\n        ;\n            this._animateStoryOut(za);\n        },\n        _isScrolledToTop: function() {\n            return ((this._container.scrollTop <= this._scrollTopThreshold));\n        },\n        _flyStoryIn: function(ya) {\n            var za = p.create(\"div\", {\n                style: {\n                    marginTop: \"-1000px\"\n                }\n            }, ya);\n            aa.set(za, \"opacity\", 0);\n            p.prependContent(this._stories, za);\n            var ab = ha.getElementDimensions(za).y;\n            aa.set(za, \"marginTop\", ((((\"-\" + ab)) + \"px\")));\n            this._isInsertingStory = true;\n            new h(za).to(\"marginTop\", 0).ease(h.ease.end).checkpoint(21801).to(\"opacity\", 1).ondone(function() {\n                p.replace(za, ya);\n                this._afterInsert(ya);\n                this._isInsertingStory = false;\n            }.bind(this)).go();\n        },\n        _fadeStoryIn: function(ya, za) {\n            new h(this._stories).to(\"opacity\", 21991).ondone(function() {\n                p.prependContent(this._stories, ya);\n                if (za) {\n                    za();\n                }\n            ;\n            ;\n                new h(this._stories).to(\"opacity\", 1).ondone(function() {\n                    this._afterInsert(ya);\n                }.bind(this)).go();\n            }.bind(this)).go();\n        },\n        _animateStoryOut: function(ya) {\n            var za = p.create(\"div\", {\n                style: {\n                    overflow: \"hidden\",\n                    position: \"relative\"\n                }\n            });\n            p.insertBefore(ya, za);\n            p.appendContent(za, ya);\n            new h(za).to(\"JSBNG__top\", 20).to(\"height\", 0).to(\"opacity\", 0).ease(h.ease.end).ondone(function() {\n                p.remove(za);\n                i.inform(\"Ticker/animateOut\");\n            }.bind(this)).go();\n        },\n        _afterInsert: function(ya) {\n            i.inform(\"Ticker/afterInsert\");\n        },\n        setPushChannel: function(ya) {\n            ((this._pushSubscription && this._pushSubscription.unsubscribe()));\n            this._pushSubscription = i.subscribe(m.getArbiterType(ya), this._handleTickerPush.bind(this));\n            d([\"ChatConfig\",\"ChannelConnection\",], function(za, ab) {\n                this._channelConnection = ab;\n                this._checkChannelConnection();\n                this._channelConnectionSubscription = this._channelConnection.subscribe([this._channelConnection.CONNECTED,this._channelConnection.RECONNECTING,this._channelConnection.SHUTDOWN,this._channelConnection.MUTE_WARNING,this._channelConnection.UNMUTE_WARNING,], this._handleChannelConnection.bind(this));\n            }.bind(this));\n        },\n        _checkChannelConnection: function() {\n            o.conditionClass(this._root, \"disconnected\", this._channelConnection.disconnected());\n        },\n        setCurrentAppId: function(ya) {\n            this._priorityAppId = ya;\n        },\n        _handleTickerPush: function(ya, za) {\n            var ab = za.obj;\n            if (ab.delete_id) {\n                this._storiesToRemove.push(ab.delete_id);\n                return;\n            }\n        ;\n        ;\n            if (ab.fromups) {\n                if (ab.do_logging) {\n                    this._logDarkLaunch(ab);\n                }\n            ;\n            }\n        ;\n        ;\n            var bb = ab.story_xhp;\n            if (!bb) {\n                return;\n            }\n        ;\n        ;\n            this._newest = ab.story_time;\n            var cb = q(bb).getRootNode();\n            this.queueStory(cb, ab.flyout_js_cmds);\n            if (((this._aggressiveRegulator && ((ab.actor == this._newestStory.actorID))))) {\n                this.removeStory(this._newestStory.storyKey);\n                new k(\"/common/ods_endpoint.php\", {\n                    k: \"ticker.aggr.remove\"\n                }).send();\n            }\n        ;\n        ;\n            this._newestStory = {\n                actorID: ab.actor,\n                storyKey: cb.getAttribute(\"data-story-key\")\n            };\n        },\n        _handleComposerPublish: function(ya, za) {\n            ((za.tickerMarkup && this.insertStory(za.tickerMarkup)));\n        },\n        _clearNux: function() {\n            var ya = p.scry(JSBNG__document.body, \"div.tickerNUXContainer\");\n            if (ya.length) {\n                ya.forEach(function(za) {\n                    var ab = n.getInstance(za);\n                    ((ab && ab.hide()));\n                });\n                new j().setURI(\"/ajax/feed/ticker/nux.php\").send();\n            }\n        ;\n        ;\n            this._clearNux = na;\n        },\n        _logDarkLaunch: function(ya) {\n            var za = {\n                actor: ya.actor,\n                story_time: ya.story_time,\n                key: ya.story_obj_id,\n                dark: 1\n            };\n            new j().setURI(\"/alite/push/log.php\").setData({\n                msg: JSON.stringify(za)\n            }).send();\n        },\n        _logRender: function() {\n            if (this._loggedRender) {\n                return;\n            }\n        ;\n        ;\n            var ya = this._tickerInSidebarMode;\n            if (((ya || w.byClass(this._content, \"home_right_column\")))) {\n                new k(\"/ajax/log_ticker_render.php\", {\n                    sidebar_mode: ya\n                }).send();\n                this._loggedRender = true;\n            }\n        ;\n        ;\n        },\n        _isTickerVisible: function() {\n            var ya = ((xa._activeInstance == this));\n            ((ya && this._logRender()));\n            return ya;\n        },\n        _handleResponse: function(ya) {\n            var za = ya.getPayload();\n            if (za.newest) {\n                this._newest = this._page_newest = za.newest;\n            }\n        ;\n        ;\n            if (za.JSBNG__content) {\n                if (((za.JSBNG__content instanceof Array))) {\n                    for (var ab = 0; ((ab < za.JSBNG__content.length)); ab++) {\n                        this.queueStoryMarkup(za.JSBNG__content[ab]);\n                    ;\n                    };\n                ;\n                }\n                 else this.queueStoryMarkup(za.JSBNG__content);\n            ;\n            }\n        ;\n        ;\n            if (((za.custom_stories && za.custom_stories.length))) {\n                this._queueCustomStories(za.custom_stories);\n                this._doCustomUpdate = true;\n            }\n        ;\n        ;\n        },\n        queueStoryMarkup: function(ya) {\n            var za = q(ya).getRootNode();\n            this.queueStory(za);\n        },\n        dedupeStory: function(ya) {\n            var za = ya.getAttribute(\"data-story-key\"), ab = ((za && ((!!this._objectIDs[za] || !!this._removedStoryIDs[za]))));\n            ((za && (this._objectIDs[za] = true)));\n            return ab;\n        },\n        queueStory: function(ya, za) {\n            if (this.dedupeStory(ya)) {\n                return;\n            }\n        ;\n        ;\n            o.addClass(ya, \"queuedStory\");\n            p.appendContent(this._storyQueue, ya);\n            var ab = ((za && za.length));\n            if (ab) {\n                za.forEach(function(cb) {\n                    new Function(cb).apply();\n                });\n            }\n        ;\n        ;\n            ya.setAttribute(\"id\", ((((ya.id + \"_\")) + this._root.id)));\n            var bb = this._getQueuedStories();\n            bb.slice(0, -this._maxQueueLength).forEach(p.remove);\n            if (ab) {\n                this._fetchedStories[ya.id] = true;\n            }\n        ;\n        ;\n        },\n        _queueCustomStories: function(ya) {\n            while (ya.length) {\n                var za = ya.shift();\n                za = q(za).getRootNode();\n                if (this.dedupeStory(za)) {\n                    continue;\n                }\n            ;\n            ;\n                o.addClass(za, \"customStory\");\n                p.appendContent(this._storyQueue, za);\n            };\n        ;\n            var ab = this._getQueuedCustomStories();\n            ab.slice(0, -this._maxQueueLength).forEach(p.remove);\n        },\n        _cleanup: function() {\n            xa._placeholders.pagelet_rhc_ticker = null;\n            if (!w.byClass(this._content, \"hasRightCol\")) {\n                return;\n            }\n        ;\n        ;\n            this._objectIDs = [];\n            this._subscriptions.forEach(i.unsubscribe);\n            ((this._channelConnectionSubscription && this._channelConnection.unsubscribe(this._channelConnectionSubscription)));\n            ((this._pushSubscription && this._pushSubscription.unsubscribe()));\n            {\n                var fin140keys = ((window.top.JSBNG_Replay.forInKeys)((this._listeners))), fin140i = (0);\n                var ya;\n                for (; (fin140i < fin140keys.length); (fin140i++)) {\n                    ((ya) = (fin140keys[fin140i]));\n                    {\n                        ((this._listeners[ya] && this._listeners[ya].remove()));\n                    ;\n                    };\n                };\n            };\n        ;\n            JSBNG__clearTimeout(this._pollToken);\n            this._pollToken = null;\n            this._cleanupInputFocusListener();\n            this._cleanupContentResizeListener();\n            i.inform(\"Ticker/cleanup\");\n        },\n        _onNavHandler: function(ya, za) {\n            var ab = za.params.key;\n            if (((((ab != \"lf\")) && ((ab != \"h\"))))) {\n                this._cleanup();\n            }\n        ;\n        ;\n        },\n        _getPositionForDialog: function() {\n            if (((this._tickerInSidebarMode && o.hasClass(JSBNG__document.body, \"_58v4\")))) {\n                return \"right\";\n            }\n        ;\n        ;\n            return \"left\";\n        },\n        registerStoryDialog: function(ya, za) {\n            if (((this._uaCurStoryIDFetch == ya.id))) {\n                this._uaCurStoryIDFetch = null;\n                this._logUserEvent(\"flyout\", \"fetch_success\");\n            }\n        ;\n        ;\n            if (((this._uaCurStoryIDPrefetch == ya.id))) {\n                this._uaCurStoryIDPrefetch = null;\n                this._logUserEvent(\"flyout_prefetch\", \"prefetch_success\");\n            }\n        ;\n        ;\n            this._fetchedStories[ya.id] = true;\n            za.setContext(ya);\n            za.setPosition(this._getPositionForDialog());\n            za.subscribe(\"hide\", this._deactivateStory.bind(this, true));\n            za.subscribe(\"success\", this._focusStory.bind(this, ya));\n            za.subscribe(\"beforehide\", function() {\n                if (this._selecting) {\n                    this._selecting = false;\n                    return false;\n                }\n            ;\n            ;\n            }.bind(this));\n            if (this._popupOnHover) {\n                za.subscribe(\"mouseenter\", this._clearHoverTimeouts.bind(this));\n                za.subscribe(\"mouseleave\", this._scheduleHide.bind(this));\n                za.subscribe(\"show\", function() {\n                    this._highlightDialogScrollbar.bind(this, za).defer();\n                    var ab = g.listen(za.getContent(), \"mousedown\", function() {\n                        this._selectStory(ya);\n                        ab.remove();\n                    }.bind(this));\n                }.bind(this));\n            }\n        ;\n        ;\n            if (((ya == this._activeStory))) {\n                this._logUserEvent(\"flyout_loadtime\", \"show_fetched\");\n                this._logUserEvent(\"flyout\", \"show\");\n                this._openDialog(za);\n            }\n        ;\n        ;\n        },\n        _highlightDialogScrollbar: function(ya) {\n            var za = p.scry(ya.getContent(), \".uiScrollableArea\")[0];\n            ((za && y.poke(za)));\n        },\n        _openStoryExternally: function(ya, JSBNG__event) {\n            var za = ya.getAttribute(\"data-href\");\n            if (((!za || ((za == \"#\"))))) {\n                return;\n            }\n        ;\n        ;\n            var ab = ya.getAttribute(\"data-story-rel\");\n            switch (ab) {\n              case \"theater\":\n                this._deactivateAndClearStory();\n                l.loadModules([\"PhotoViewer\",], function(db) {\n                    db.bootstrap(za, ya);\n                });\n                return;\n              case \"async\":\n                this._deactivateAndClearStory();\n                j.bootstrap(za, ya);\n                return;\n            };\n        ;\n            var bb = ya.getAttribute(\"data-target\"), cb = ((((((JSBNG__event.which != 1)) || JSBNG__event.getModifiers().any)) || ((bb == \"_blank\"))));\n            ((cb ? window.open(za, \"_blank\") : pa(za)));\n        },\n        _deactivateAndClearStory: function() {\n            this._clearHoverTimeouts();\n            this._deactivateStory();\n        },\n        _focusStoryWillTriggerScroll: function(ya) {\n            var za = this._container, ab = za.clientHeight, bb = ya.offsetHeight, cb = za.scrollTop, db = ((cb + ab)), eb = ya.offsetTop, fb = ((eb + bb));\n            return ((((eb < cb)) || ((fb > db))));\n        },\n        _focusStory: function(ya) {\n            if (this._focusStoryWillTriggerScroll(ya)) {\n                this._preventScrollDismiss = true;\n            }\n        ;\n        ;\n            ya.JSBNG__focus();\n        },\n        _selectStory: function(ya) {\n            this._selectedStory = ya;\n            o.addClass(ya, \"tickerStorySelected\");\n            o.addClass(this._root, \"tickerChildSelected\");\n        },\n        _activateStory: function(ya, za) {\n            this._clearHoverTimeouts();\n            if (((((ya == this._activeStory)) || !this._storyCanOpenDialog(ya)))) {\n                return;\n            }\n        ;\n        ;\n            this._deactivateStory();\n            this._focusStory(ya);\n            this._activeStory = ya;\n            o.addClass(ya, \"tickerStoryActive\");\n            ((window.Toggler && ca.hide()));\n            if (this._logFlyouts) {\n                za = ((za || \"unknown\"));\n                new k(\"/ajax/feed/ticker/flyout.php\", {\n                    src: za\n                }).send();\n            }\n        ;\n        ;\n            ba.log(ya);\n            var ab = this._getStoryDialog(ya);\n            if (ab) {\n                this._logUserEvent(\"flyout_loadtime\", \"show_prefetched\");\n                this._logUserEvent(\"flyout\", \"show\");\n                this._openDialog(ab);\n                return;\n            }\n        ;\n        ;\n            if (!((ya.id in this._fetchedStories))) {\n                this._uaCurStoryIDFetch = ya.id;\n                this._logUserEvent(\"flyout\", \"fetch\");\n            }\n        ;\n        ;\n            this._fetchStory(ya);\n        },\n        _deactivateStory: function(ya) {\n            if (((this._activeStory === this._deactivatingStory))) {\n                return;\n            }\n        ;\n        ;\n            this._deactivatingStory = this._activeStory;\n            if (this._dialog) {\n                if (((ya === true))) {\n                    this._dialog.enableBehavior(t);\n                }\n                 else this._dialog.disableBehavior(t);\n            ;\n            ;\n                this._dialog.hide();\n                this._logUserEvent(\"flyout\", \"close\");\n            }\n        ;\n        ;\n            if (this._activeStory) {\n                o.removeClass(this._activeStory, \"tickerStoryActive\");\n                o.removeClass(this._activeStory, \"tickerStorySelected\");\n                o.removeClass(this._root, \"tickerChildSelected\");\n            }\n        ;\n        ;\n            this._dialog = this._selectedStory = this._activeStory = null;\n            this._cleanupInputFocusListener();\n            this._cleanupContentResizeListener();\n            this._deactivatingStory = null;\n        },\n        _logUserAction: function(ya, za, JSBNG__event) {\n            ja(za, ya, JSBNG__event, \"FORCE\");\n            ra(\"ticker\", ya, JSBNG__event).uai(za);\n        },\n        _logUserEvent: function(ya, JSBNG__event) {\n            if (this._ua[ya]) {\n                this._ua[ya].add_event(JSBNG__event);\n            }\n        ;\n        ;\n        },\n        _fetchStory: function(ya) {\n            JSBNG__clearTimeout(this._fetchToken);\n            var za = [], ab = this._getInsertedStories(), bb = ab.indexOf(ya);\n            [-1,0,1,].forEach(function(cb) {\n                var db = ab[((bb + cb))];\n                ((db && za.push(db)));\n            }, this);\n            this._fetchToken = JSBNG__setTimeout(this._fetchStories.bind(this, za), 100);\n        },\n        _fetchStories: function(ya) {\n            var za = [], ab, bb = function(cb) {\n                JSBNG__clearTimeout(ab);\n                ya.forEach(function(db) {\n                    o.conditionClass(db, \"tickerStoryFetching\", cb);\n                });\n            };\n            ya = ya.filter(function(cb) {\n                if (((cb.id in this._fetchedStories))) {\n                    return false;\n                }\n            ;\n            ;\n                this._fetchedStories[cb.id] = true;\n                var db = this._getStoryDialogEndpoint(cb), eb = ea(db).getQueryData();\n                if (((!db || !eb))) {\n                    return false;\n                }\n            ;\n            ;\n                eb.uniq_id = cb.getAttribute(\"id\");\n                eb.referrer = this._tickerSource;\n                za.push(eb);\n                return true;\n            }, this);\n            if (!za.length) {\n                return;\n            }\n        ;\n        ;\n            ab = this._setTimeout(bb.curry(true), 500);\n            new j(\"/ajax/feed/ticker/multi_story\").setFinallyHandler(bb.curry(false)).setErrorHandler(na).setData({\n                stories: za\n            }).setAllowCrossPageTransition(this._tickerInSidebarMode).send();\n        },\n        _tickerDeClicker: function(JSBNG__event) {\n            var ya = JSBNG__event.getTarget(), za = w.byTag(ya, \"a\"), ab = this._getStoryFromNode(ya), bb = this._getButtonFromNode(ya);\n            if (((((((((((ab && za)) && !bb)) && o.hasClass(ab, \"tickerStoryClickable\"))) && !o.hasClass(za, \"tickerStoryAllowClick\"))) && !this._storyIsHidden(ab)))) {\n                za.setAttribute(\"rel\", \"ignore\");\n                za.removeAttribute(\"JSBNG__onclick\");\n                za.removeAttribute(\"ajaxify\");\n                za.removeAttribute(\"href\");\n            }\n        ;\n        ;\n            var cb = ((JSBNG__event.button == 2)), db = ((JSBNG__event.type === \"keydown\")), eb = ((ab && this._getActionButtonFromStory(ab)));\n            if (((((!cb && eb)) && !db))) {\n                this._setClickedStory(ab);\n            }\n        ;\n        ;\n        },\n        _handleMouseup: function(JSBNG__event) {\n            this._clearClickedStory();\n        },\n        _setClickedStory: function(ya) {\n            this._clearClickedStory();\n            o.addClass(ya, \"tickerStoryClicked\");\n            this._clickedStory = ya;\n        },\n        _clearClickedStory: function() {\n            if (this._clickedStory) {\n                o.removeClass(this._clickedStory, \"tickerStoryClicked\");\n                this._clickedStory = null;\n            }\n        ;\n        ;\n        },\n        _initInfiniteScrollListener: function() {\n            var ya = this._getInsertedStories();\n            if (this._storiesWithActions) {\n                for (var za = 0; ((za < ya.length)); za++) {\n                    var ab = ya[za];\n                    if (o.hasClass(ab, \"tickerStoryWithButton\")) {\n                        this._storiesWithActions[ab.getAttribute(\"data-story-key\")] = ab;\n                    }\n                ;\n                ;\n                };\n            }\n        ;\n        ;\n            var bb = Math.max(0, ((ya.length - this._autoloadStoryIndex)));\n            this._infiniteScrollStory = ya[bb];\n            this._checkInfiniteScroll();\n        },\n        _checkInfiniteScroll: function() {\n            if (this._infiniteScrollStory) {\n                var ya = ha.getElementPosition(this._infiniteScrollStory).y, za = ((ha.getElementPosition(this._container).y + ha.getElementDimensions(this._container).y));\n                if (((ya < za))) {\n                    var ab = p.scry(this._root, \".tickerMorePager a\")[0];\n                    if (ab) {\n                        var bb = ((w.byClass(ab, \"stat_elem\") || ab));\n                        new j(ab.getAttribute(\"ajaxify\")).setReadOnly(true).setRelativeTo(ab).setStatusElement(bb).setAllowCrossPageTransition(true).send();\n                        this._logUserEvent(\"stream\", \"JSBNG__scroll\");\n                    }\n                ;\n                ;\n                    this._infiniteScrollStory = null;\n                    this._autoloadStoryIndex = 5;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n        },\n        _setFixed: function(ya) {\n            if (!this._selectedStory) {\n                return;\n            }\n        ;\n        ;\n            var za = this._getStoryDialog(this._selectedStory);\n            if (za) {\n                za.setPosition(this._getPositionForDialog());\n                za.setFixed(ya);\n                za.updatePosition();\n            }\n        ;\n        ;\n        },\n        _setTimeout: function(ya, za) {\n            return JSBNG__setTimeout(ya, za, !this._tickerInSidebarMode);\n        },\n        _scrollDialogToBottom: function() {\n            var ya = ((this._dialog && this._dialog.getContent())), za = ((ya && p.scry(ya, \".uiScrollableAreaWrap\")[0])), ab = ((za && y.getInstance(za)));\n            ((ab && ab.scrollToBottom()));\n        },\n        _openDialog: function(ya) {\n            if (!this._tickerInSidebarMode) {\n                o.addClass(ya.getRoot(), \"tickerStoryOverlayOnTop\");\n            }\n        ;\n        ;\n            this._dialog = ya.show();\n            this._updateDialogPosition();\n            this._writeSwfFrame(ya);\n            this._initCommentFocusListener.bind(this).defer();\n            this._initContentResizeListener.bind(this).defer();\n            this._stupidIE7VideoResizeHack(ya);\n        },\n        _stupidIE7VideoResizeHack: function(ya) {\n            if (((ga.ie() === 7))) {\n                var za = p.scry(ya.getContent(), \".uiVideoThumb .img\");\n                za.forEach(function(ab) {\n                    aa.set(ab, \"width\", \"\");\n                });\n            }\n        ;\n        ;\n        },\n        _updateDialogPosition: function() {\n            var ya = ((this._tickerInSidebarMode || !!w.byClass(this._root, \"fixed_elem\")));\n            this._dialog.setPosition(this._getPositionForDialog());\n            this._dialog.setFixed(ya);\n            this._adjustFlyoutContentHeight();\n            this._dialog.updatePosition();\n        },\n        _writeSwfFrame: function(ya) {\n            var za = ((this._dialog && this._dialog.getContent())), ab = p.scry(za, \".swfObject\")[0];\n            if (!ab) {\n                return;\n            }\n        ;\n        ;\n            var bb = ab.getAttribute(\"data-swfid\");\n            if (((bb && window[bb]))) {\n                var cb = window[bb];\n                cb.write(ab);\n            }\n        ;\n        ;\n        },\n        _initCommentFocusListener: function() {\n            var ya = ((this._dialog && this._dialog.getContent())), za = ((ya && p.scry(ya, \".tickerDialogFooter textarea\")[0]));\n            if (!za) {\n                return;\n            }\n        ;\n        ;\n            this._listeners.inputFocus = g.listen(za, \"JSBNG__focus\", this._scrollDialogToBottom.bind(this));\n        },\n        _cleanupInputFocusListener: function() {\n            if (this._listeners.inputFocus) {\n                this._listeners.inputFocus.remove();\n                this._listeners.inputFocus = null;\n            }\n        ;\n        ;\n        },\n        _initContentResizeListener: function() {\n            var ya = ((this._dialog && this._dialog.getContent()));\n            if (!ya) {\n                return;\n            }\n        ;\n        ;\n            this._listeners.contentResize = g.listen(ya, \"click\", function() {\n                this._dialog.updatePosition.bind(this._dialog).defer();\n            }.bind(this));\n        },\n        _cleanupContentResizeListener: function() {\n            if (this._listeners.contentResize) {\n                this._listeners.contentResize.remove();\n                this._listeners.contentResize = null;\n            }\n        ;\n        ;\n        },\n        _adjustFlyoutContentHeight: function() {\n            var ya = ((this._dialog && this._dialog.getContent())), za = ((ya && p.scry(ya, \".uiScrollableAreaWrap\")[0]));\n            if (!za) {\n                return;\n            }\n        ;\n        ;\n            var ab = ha.getElementDimensions(za), bb = ha.getElementPosition(za), cb = p.scry(za, \".uiUfi .uiUfiComment\"), db = ((ha.getViewportDimensions().y - this.FLYOUT_VIEWPORT_PADDING)), eb = Math.min(this.FLYOUT_MAX_HEIGHT, db), fb = ((eb - this.FLYOUT_TARGET_HEIGHT_OFFSET));\n            for (var gb = 0; ((gb < cb.length)); gb++) {\n                var hb = cb[gb], ib = ha.getElementPosition(hb), jb = ((ib.y - bb.y));\n                if (((Math.abs(((jb - fb))) <= this.FLYOUT_OFFSET_THRESHOLD))) {\n                    fb = ((jb + this.FLYOUT_COMMENT_OFFSET));\n                    break;\n                }\n            ;\n            ;\n            };\n        ;\n            if (((ab.y > fb))) {\n                aa.set(za, \"height\", ((fb + \"px\")));\n                aa.set(za, \"max-height\", null);\n            }\n             else {\n                aa.set(za, \"max-height\", ((eb + \"px\")));\n                aa.set(za, \"height\", null);\n            }\n        ;\n        ;\n        },\n        _initObjectIDs: function() {\n            var ya = this._getAllStories();\n            for (var za = 0; ((za < ya.length)); ++za) {\n                var ab = ya[za].getAttribute(\"data-story-key\");\n                ((ab && (this._objectIDs[ab] = true)));\n            };\n        ;\n        },\n        _handleChatOpened: function() {\n            this._deactivateStory(true);\n        },\n        _handleChannelConnection: function() {\n            this._checkChannelConnection();\n        },\n        getNewest: function() {\n            return this._newest;\n        }\n    });\n    e.exports = xa;\n});\n__d(\"legacy:TickerController\", [\"TickerController\",], function(a, b, c, d) {\n    a.TickerController = b(\"TickerController\");\n}, 3);\n__d(\"HomeTickerFirstRightColumnController\", [\"$\",\"ge\",\"debounceAcrossTransitions\",\"throttle\",\"UIPagelet\",\"Arbiter\",\"Style\",\"csx\",\"CSS\",\"DOM\",\"Vector\",\"Run\",\"LegacyContextualDialog\",\"TickerController\",\"UIIntentionalStreamMessage\",\"JSBNG__Event\",], function(a, b, c, d, e, f) {\n    var g = b(\"$\"), h = b(\"ge\"), i = b(\"debounceAcrossTransitions\"), j = b(\"throttle\"), k = b(\"UIPagelet\"), l = b(\"Arbiter\"), m = b(\"Style\"), n = b(\"csx\"), o = b(\"CSS\"), p = b(\"DOM\"), q = b(\"Vector\"), r = b(\"Run\"), s = b(\"LegacyContextualDialog\"), t = b(\"TickerController\"), u = b(\"UIIntentionalStreamMessage\"), v = b(\"JSBNG__Event\"), w = null, x = 75, y = 50, z = 15, aa = false, ba = false, ca, da, ea, fa, ga, ha, ia, ja, ka, la = y, ma = [], na = [], oa, pa, qa, ra, sa, ta, ua, va, wa, xa, ya, za, ab;\n    function bb() {\n        var sb = ob;\n        function tb() {\n            sb.defer();\n        };\n    ;\n        var ub = p.scry(ra, \"img.img\");\n        ub.forEach(function(vb) {\n            if (!vb.complete) {\n                v.listen(vb, {\n                    load: tb,\n                    error: tb,\n                    abort: tb\n                });\n            }\n        ;\n        ;\n        });\n        tb();\n    };\n;\n    function cb() {\n        na = [l.subscribe(\"page_transition\", fb),l.subscribe(\"netego_loaded\", ob),l.subscribe(\"Ticker/storiesInserted\", ob),l.subscribe(u.INSERT_STORIES, ob),];\n        if (w.enableSidebar) {\n            na.push(l.subscribe(\"sidebar/hide\", pb));\n            na.push(l.subscribe(\"sidebar/show\", qb));\n        }\n    ;\n    ;\n    };\n;\n    function db() {\n        if (ra) {\n            var sb = p.scry(ra, \"div._4u8\");\n            for (var tb = 0; ((tb < sb.length)); tb++) {\n                var ub = JSON.parse(sb[tb].getAttribute(\"data-ad\")).segment;\n                if (((ub === \"premium\"))) {\n                    return true;\n                }\n            ;\n            ;\n            };\n        ;\n        }\n    ;\n    ;\n        return false;\n    };\n;\n    function eb() {\n        ab = p.scry(JSBNG__document, \"div.fbRemindersContent\");\n        va = p.scry(h(\"rightCol\"), \"div.home_right_column\")[0];\n        wa = p.JSBNG__find(va, \"div.rightColumnWrapper\");\n        ra = ((h(\"pagelet_ego_pane_w\") || h(\"pagelet_ego_pane_m\")));\n        fa = !db();\n        v.listen(ra, \"mouseenter\", function() {\n            aa = true;\n        });\n        v.listen(ra, \"mouseleave\", function() {\n            aa = false;\n        });\n        sa = h(\"pagelet_rhc_ticker\");\n        if (!sa) {\n            return false;\n        }\n    ;\n    ;\n        ta = p.scry(sa, \".ticker_container\")[0];\n        ua = p.scry(sa, \".ticker_stream\")[0];\n        return ((ta && ua));\n    };\n;\n    function fb(sb, tb) {\n        if (((((((sb === \"page_transition\")) && tb)) && tb.uri))) {\n            var ub = tb.uri;\n            if (((ub.path === \"/photo.php\"))) {\n                ba = true;\n                return;\n            }\n        ;\n        ;\n            if (((ba && ((ub.path === \"/\"))))) {\n                ba = false;\n                return;\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n        na.forEach(l.unsubscribe);\n        na = [];\n        ma.forEach(function(vb) {\n            vb.remove();\n        });\n        ma = [];\n        oa.reset();\n    };\n;\n    function gb() {\n        if (((ja || !ca))) {\n            ka = ((q.getElementPosition(ra, \"viewport\").y - q.getElementPosition(wa, \"viewport\").y));\n        }\n    ;\n    ;\n    };\n;\n    function hb() {\n        gb();\n        var sb = la;\n        lb();\n        if (((sb != la))) {\n            ja = true;\n            mb();\n        }\n    ;\n    ;\n        za = ((xa + q.getElementPosition(qa, \"viewport\").y));\n        var tb = za, ub = q.getElementPosition(va, \"viewport\").y;\n        for (var vb = 0; ((vb < ab.length)); vb++) {\n            var wb = s.getInstance(ab[vb]);\n            wb.hide();\n        };\n    ;\n        if (((da || !ua))) {\n            if (((ia !== null))) {\n                var xb = ((ub + ka)), yb = ((xb <= ((tb - ia))));\n                if (((ja || ((yb !== ca))))) {\n                    ja = false;\n                    var zb = ((((tb - ia)) - ka));\n                    nb(yb, zb);\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            return;\n        }\n    ;\n    ;\n        var ac = ((ub <= ((tb + z))));\n        if (((ac !== ca))) {\n            nb(ac);\n        }\n    ;\n    ;\n    };\n;\n    function ib() {\n        var sb = JSBNG__Date.now();\n        if (((((((fa && !aa)) && w.adsRefreshInterval)) && ((((sb - ga)) >= w.adsRefreshInterval))))) {\n            jb();\n        }\n    ;\n    ;\n    };\n;\n    function jb() {\n        ga = JSBNG__Date.now();\n        k.loadFromEndpoint(\"WebEgoPane\", ra, {\n            pid: 27,\n            data: {\n                organic_only: false,\n                ads_only: false,\n                refresh_num: ++ha\n            }\n        }, {\n            bundle: false,\n            crossPage: false,\n            handler: bb\n        });\n    };\n;\n    function kb() {\n        ja = true;\n        gb();\n        lb();\n        mb();\n        hb();\n    };\n;\n    function lb() {\n        var sb = ((q.getDocumentDimensions().y - ((q.getScrollPosition(\"JSBNG__document\").y + q.getViewportDimensions().y))));\n        la = ((((sb > ya)) ? y : x));\n    };\n;\n    function mb() {\n        var sb = ((((q.getViewportDimensions().y - xa)) - la)), tb = q.getElementDimensions(wa).y;\n        if (((tb <= sb))) {\n            ia = ((((0 - ka)) - z));\n            return;\n        }\n    ;\n    ;\n        var ub = ((tb - ka)), vb = p.scry(ra, \"div.egoOrganicColumn\")[0];\n        if (((((ub <= sb)) && vb))) {\n            ia = 0;\n        }\n         else {\n            var wb = p.scry(ra, \"div.ego_unit\").reverse(), xb = p.scry(ra, \"div._4u8\").length, yb = w.maxFixedAds;\n            if (((xb <= w.maxFixedAds))) {\n                yb = wb.length;\n            }\n        ;\n        ;\n            var zb = null;\n            for (var ac = 0; ((ac < yb)); ac++) {\n                var bc = wb[ac], cc = ((q.getElementPosition(bc, \"viewport\").y - q.getElementPosition(wa, \"viewport\").y)), dc = ((q.getElementDimensions(wa).y - cc));\n                if (((dc > sb))) {\n                    if (((ac > 0))) {\n                        zb = wb[((ac - 1))];\n                    }\n                ;\n                ;\n                    break;\n                }\n            ;\n            ;\n                if (((ac == ((yb - 1))))) {\n                    zb = bc;\n                }\n            ;\n            ;\n            };\n        ;\n            if (((zb == null))) {\n                ia = null;\n            }\n             else ia = ((q.getElementPosition(zb, \"viewport\").y - q.getElementPosition(ra, \"viewport\").y));\n        ;\n        ;\n        }\n    ;\n    ;\n    };\n;\n    function nb(sb, tb) {\n        ca = sb;\n        tb = ((tb || za));\n        var ub = ((sb ? ((tb + \"px\")) : \"\"));\n        m.set(wa, \"JSBNG__top\", ub);\n        o.conditionClass(wa, \"fixed_elem\", sb);\n        var vb = p.scry(wa, \"div.displayedTickerToggleWrapper\")[0];\n        ((vb && o.conditionClass(vb, \"toggleWrapperWithoutMargin\", ((sb && !ua)))));\n        if (ea) {\n            var wb = ((sb ? \"Ticker/fixed\" : \"Ticker/unfixed\"));\n            l.inform(wb);\n        }\n    ;\n    ;\n    };\n;\n    function ob() {\n        if (((((!ea || !ua)) || o.hasClass(JSBNG__document.documentElement, \"tinyViewport\")))) {\n            kb();\n            return;\n        }\n    ;\n    ;\n        hb();\n        var sb = q.getViewportDimensions().y, tb = 61, ub = ((q.getElementDimensions(wa).y - q.getElementDimensions(ta).y)), vb = q.getElementDimensions(ua).y, wb = ((((((((sb - ub)) - x)) - za)) - tb)), xb = ((w.tickerAbsMinHeight || 120)), yb = ((w.tickerMinHeight || 225));\n        da = false;\n        if (((wb < xb))) {\n            da = true;\n            nb(false);\n            wb = xb;\n        }\n         else if (((wb < yb))) {\n            if (((wb > ((yb - tb))))) {\n                wb = yb;\n            }\n             else wb += tb;\n        ;\n        }\n        \n    ;\n    ;\n        var zb = Math.min(wb, vb, ((w.tickerMaxHeight || 425)));\n        m.set(ta, \"height\", ((zb + \"px\")));\n    };\n;\n    function pb() {\n        ea = true;\n        eb();\n        var sb = function() {\n            if (eb()) {\n                da = false;\n                hb();\n                ob();\n            }\n        ;\n        ;\n        };\n        ((sa && t.show(sa, sb)));\n    };\n;\n    function qb() {\n        ea = false;\n        eb();\n        kb();\n        ((sa && t.hide(sa)));\n    };\n;\n    var rb = {\n        init: function(sb) {\n            w = sb;\n            pa = g(\"contentCol\");\n            qa = g(\"blueBar\");\n            ha = 0;\n            ga = Infinity;\n            ga = JSBNG__Date.now();\n            oa = i(ib, w.adsRefreshDelay);\n            if (w.adsRefreshOnmove) {\n                ma.push(v.listen(window, \"mousemove\", oa));\n            }\n        ;\n        ;\n            ma.push(v.listen(window, \"JSBNG__scroll\", oa));\n            ma.push(v.listen(window, \"resize\", oa));\n            ma.push(v.listen(window, \"resize\", j(ob)));\n            xa = q.getElementDimensions(qa).y;\n            ya = q.getElementDimensions(g(\"pageFooter\")).y;\n            eb();\n            cb();\n            r.onLeave(fb);\n            ma.push(v.listen(window, \"JSBNG__scroll\", j(hb)));\n            if (!o.hasClass(JSBNG__document.documentElement, \"sidebarMode\")) {\n                pb();\n            }\n             else if (w.enableSidebar) {\n                qb();\n            }\n            \n        ;\n        ;\n            bb();\n        }\n    };\n    e.exports = rb;\n});\n__d(\"AsyncLayout\", [\"AjaxPipeRequest\",\"Arbiter\",\"AsyncRequest\",\"AsyncResponse\",\"CSS\",\"DOM\",\"HTML\",\"NavigationMessage\",\"PageTransitions\",\"URI\",\"$\",\"copyProperties\",\"emptyFunction\",\"ge\",\"goURI\",], function(a, b, c, d, e, f) {\n    var g = b(\"AjaxPipeRequest\"), h = b(\"Arbiter\"), i = b(\"AsyncRequest\"), j = b(\"AsyncResponse\"), k = b(\"CSS\"), l = b(\"DOM\"), m = b(\"HTML\"), n = b(\"NavigationMessage\"), o = b(\"PageTransitions\"), p = b(\"URI\"), q = b(\"$\"), r = b(\"copyProperties\"), s = b(\"emptyFunction\"), t = b(\"ge\"), u = b(\"goURI\");\n    function v(w) {\n        this.canvasID = w;\n        if (t(\"rightCol\")) {\n            this.auxiliaryID = \"rightCol\";\n        }\n    ;\n    ;\n        if (t(\"headerArea\")) {\n            this.headerID = \"headerArea\";\n        }\n    ;\n    ;\n        if (t(\"toolbarContainer\")) {\n            this.toolbarID = \"toolbarContainer\";\n        }\n    ;\n    ;\n        this.waitingForAux = false;\n        o.registerHandler(this.catchPageTransition.bind(this));\n        this.subscription = h.subscribe(n.NAVIGATION_BEGIN, this.onNavigate.bind(this));\n    };\n;\n    r(v.prototype, {\n        catchPageTransition: function(w) {\n            this.subscription.unsubscribe();\n            return false;\n        },\n        getCanvasID: function(w) {\n            return ((w.sidecol ? \"contentCol\" : \"contentArea\"));\n        },\n        onNavigate: function(w, x) {\n            var y = x.useAjaxPipe;\n            x = x.params;\n            if (x.endpoint) {\n                if (this.request) {\n                    this.request.setFinallyHandler(s);\n                    this.request.abort();\n                }\n            ;\n            ;\n                if (this.sideRequest) {\n                    this.sideRequest.abort();\n                }\n            ;\n            ;\n                if (y) {\n                    this.request = new g().setURI(x.endpoint).setData(x).setCanvasId(this.getCanvasID(x)).setFinallyHandler(this.finallyHandler.bind(this)).setErrorHandler(this.errorHandler.bind(this)).setFirstResponseCallback(this.firstResponseCallback.bind(this)).send();\n                }\n                 else {\n                    x.handled = true;\n                    this.waitingForAux = x.sidecol;\n                    var z = !!x.iframe, aa = new i().setOption(\"useIframeTransport\", z).setURI(new p(x.endpoint)).setReadOnly(true).setMethod(\"GET\").setData(x).setHandler(this.onResponse.bind(this)).setErrorHandler(this.errorHandler.bind(this)).setFinallyHandler(this.finallyHandler.bind(this));\n                    this.request = aa;\n                    aa.send();\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n        },\n        onSideResponse: function(w) {\n            var x = w.getPayload();\n            if (((x && this.auxiliaryID))) {\n                this.receivedAux(x);\n            }\n        ;\n        ;\n        },\n        receivedAux: function(w) {\n            !this.waitingForAux;\n            this.waitingForAux = false;\n            l.setContent(q(this.auxiliaryID), m(w));\n        },\n        onResponse: function(w) {\n            var x = w.getPayload();\n            if (x.redirect) {\n                u(x.redirect);\n            }\n             else {\n                var y = ((x.html || x));\n                l.setContent(q(this.canvasID), m(y));\n                if (((x.side_html && this.auxiliaryID))) {\n                    this.receivedAux(x.side_html);\n                }\n            ;\n            ;\n                if (((this.headerID && !x.keep_header))) {\n                    var z = q(this.headerID);\n                    l.setContent(z, m(((x.header_html || \"\"))));\n                    k.conditionShow(z, x.header_html);\n                }\n            ;\n            ;\n                if (((x.toolbar_html && this.toolbarID))) {\n                    l.setContent(q(this.toolbarID), m(x.toolbar_html));\n                }\n            ;\n            ;\n                if (x.js) {\n                    (new Function(x.js))();\n                }\n            ;\n            ;\n                k.conditionClass(\"contentCol\", \"hasRightCol\", ((this.auxiliaryID && !x.noRightSide)));\n                var aa = t(\"rightCol\");\n                if (((aa && x.noRightSide))) {\n                    l.empty(aa);\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            var ba = w.getRequest().getData();\n            h.inform(n.NAVIGATION_COMPLETED, ba.key);\n        },\n        errorHandler: function(w) {\n            j.verboseErrorHandler(w);\n            h.inform(n.NAVIGATION_FAILED);\n            this.request = null;\n        },\n        firstResponseCallback: function(w) {\n            window.JSBNG__scrollTo(0, 0);\n            h.inform(n.NAVIGATION_FIRST_RESPONSE);\n        },\n        finallyHandler: function(w) {\n            this.request = null;\n            o.transitionComplete(true);\n            h.inform(n.NAVIGATION_COMPLETED);\n        }\n    });\n    e.exports = v;\n});\n__d(\"legacy:adware-scanner\", [\"AdwareScaner\",], function(a, b, c, d) {\n    a.AdwareScaner = b(\"AdwareScaner\");\n}, 3);");
// 2738
geval("if (JSBNG__self.CavalryLogger) {\n    CavalryLogger.start_js([\"5dFET\",]);\n}\n;\n;\n__d(\"TickerReadStateTracking\", [\"Style\",\"clickRefAction\",], function(a, b, c, d, e, f) {\n    var g = b(\"Style\"), h = b(\"clickRefAction\"), i = 73, j = \"ticker_hover\", k = [];\n    function l(n) {\n        var o = JSON.parse(n.getAttribute(\"data-ft\"));\n        if (!o) {\n            return null;\n        }\n    ;\n    ;\n        if (o.mf_story_key) {\n            return o.mf_story_key;\n        }\n    ;\n    ;\n        if (o.fbid) {\n            return o.fbid;\n        }\n    ;\n    ;\n        return null;\n    };\n;\n    function m(n) {\n        var o = l(n);\n        if (((!o || ((o in k))))) {\n            return;\n        }\n    ;\n    ;\n        k[o] = true;\n        var p = {\n            evt: i\n        };\n        h(j, n, null, \"FORCE\", {\n            ft: p\n        });\n    };\n;\n    e.exports.log = m;\n});\n__d(\"TickerRightHideController\", [\"CSS\",\"DOM\",\"ge\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSS\"), h = b(\"DOM\"), i = b(\"ge\");\n    function j() {\n    \n    };\n;\n    j._markAsClosedHelper = function(k) {\n        var l = i(\"pagelet_reminders\");\n        if (l) {\n            var m = h.scry(l, \"div.tickerToggleWrapper\")[0];\n            if (m) {\n                g.conditionClass(m, \"displayedTickerToggleWrapper\", k);\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n        var n = i(\"pagelet_moments\");\n        if (n) {\n            var o = h.scry(n, \"div.tickerToggleWrapper\")[0];\n            if (o) {\n                g.conditionClass(o, \"displayedTickerToggleWrapper\", k);\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n        var p = i(\"pagelet_rhc_ticker\");\n        if (p) {\n            var q = h.scry(p, \"div.tickerToggleWrapper\")[0];\n            if (q) {\n                g.conditionClass(q, \"displayedTickerToggleWrapper\", !k);\n            }\n        ;\n        ;\n            g.conditionClass(p, \"hidden_rhc_ticker\", k);\n        }\n    ;\n    ;\n    };\n    j.markAsClosed = function() {\n        j._markAsClosedHelper(true);\n    };\n    j.markAsUnclosed = function() {\n        j._markAsClosedHelper(false);\n    };\n    e.exports = j;\n});\n__d(\"legacy:TickerRightHideController\", [\"TickerRightHideController\",], function(a, b, c, d) {\n    a.TickerRightHideController = b(\"TickerRightHideController\");\n}, 3);\n__d(\"TickerController\", [\"JSBNG__Event\",\"Animation\",\"Arbiter\",\"AsyncRequest\",\"AsyncSignal\",\"Bootloader\",\"ChannelConstants\",\"LegacyContextualDialog\",\"CSS\",\"DOM\",\"HTML\",\"JSLogger\",\"Keys\",\"LayerFadeOnHide\",\"LiveTimer\",\"NavigationMessage\",\"Parent\",\"Run\",\"ScrollableArea\",\"SelectorDeprecated\",\"Style\",\"TickerReadStateTracking\",\"Toggler\",\"UIPagelet\",\"URI\",\"UserActivity\",\"UserAgent\",\"Vector\",\"$\",\"clickRefAction\",\"collectDataAttributes\",\"copyProperties\",\"cx\",\"emptyFunction\",\"ge\",\"goURI\",\"throttle\",\"userAction\",\"TickerRHCPageletByGK\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"Animation\"), i = b(\"Arbiter\"), j = b(\"AsyncRequest\"), k = b(\"AsyncSignal\"), l = b(\"Bootloader\"), m = b(\"ChannelConstants\"), n = b(\"LegacyContextualDialog\"), o = b(\"CSS\"), p = b(\"DOM\"), q = b(\"HTML\"), r = b(\"JSLogger\"), s = b(\"Keys\"), t = b(\"LayerFadeOnHide\"), u = b(\"LiveTimer\"), v = b(\"NavigationMessage\"), w = b(\"Parent\"), x = b(\"Run\"), y = b(\"ScrollableArea\"), z = b(\"SelectorDeprecated\"), aa = b(\"Style\"), ba = b(\"TickerReadStateTracking\"), ca = b(\"Toggler\"), da = b(\"UIPagelet\"), ea = b(\"URI\"), fa = b(\"UserActivity\"), ga = b(\"UserAgent\"), ha = b(\"Vector\"), ia = b(\"$\"), ja = b(\"clickRefAction\"), ka = b(\"collectDataAttributes\"), la = b(\"copyProperties\"), ma = b(\"cx\"), na = b(\"emptyFunction\"), oa = b(\"ge\"), pa = b(\"goURI\"), qa = b(\"throttle\"), ra = b(\"userAction\"), sa = 1, ta = 2, ua = 3, va = 4, wa = r.create(\"ticker_controller\");\n    function xa() {\n    \n    };\n;\n    la(xa, {\n        _instances: {\n        },\n        _activeInstance: null,\n        _placeholders: {\n        },\n        _logPositionChange: false,\n        getInstance: function(ya) {\n            var za = w.byClass(ia(ya), \"fbFeedTicker\");\n            return ((za ? xa._instances[za.id] : null));\n        },\n        isLoaded: function(ya) {\n            var za = xa._placeholders[ya.id];\n            return ((!za || ((za.JSBNG__status == ua))));\n        },\n        show: function(ya, za) {\n            za = ((za || na));\n            {\n                var fin141keys = ((window.top.JSBNG_Replay.forInKeys)((xa._instances))), fin141i = (0);\n                var ab;\n                for (; (fin141i < fin141keys.length); (fin141i++)) {\n                    ((ab) = (fin141keys[fin141i]));\n                    {\n                        var bb = oa(ab);\n                        if (((!bb || ((bb.parentNode.id == ya.id))))) {\n                            continue;\n                        }\n                    ;\n                    ;\n                        xa.hide(bb.parentNode);\n                    };\n                };\n            };\n        ;\n            xa._doPositionChange(ya);\n            o.show(ya);\n            var cb = xa._placeholders[ya.id];\n            if (((cb && ((cb.JSBNG__status == sa))))) {\n                xa._fetchTickerForPlaceholder(ya, za);\n            }\n             else {\n                var db = p.scry(ya, \".fbFeedTicker\")[0], eb = ((db && xa.getInstance(db)));\n                xa._activeInstance = eb;\n                ((eb && eb._poll()));\n                xa._placeholders[ya.id] = {\n                    JSBNG__status: va,\n                    callback: za\n                };\n                za();\n            }\n        ;\n        ;\n        },\n        _doPositionChange: function(ya) {\n            if (((!xa._logPositionChange || o.shown(ya)))) {\n                return;\n            }\n        ;\n        ;\n            new k(\"/common/ods_endpoint.php\", {\n                k: ((\"ticker.render.switch.\" + ya.id))\n            }).send();\n        },\n        hide: function(ya) {\n            var za = p.scry(ya, \".fbFeedTicker\")[0], ab = ((za && xa.getInstance(za)));\n            ((ab && ab.hideActiveStory()));\n            o.hide(ya);\n        },\n        hideStoriesByClass: function(ya) {\n            {\n                var fin142keys = ((window.top.JSBNG_Replay.forInKeys)((xa._instances))), fin142i = (0);\n                var za;\n                for (; (fin142i < fin142keys.length); (fin142i++)) {\n                    ((za) = (fin142keys[fin142i]));\n                    {\n                        p.scry(ia(za), ya).forEach(o.hide);\n                    ;\n                    };\n                };\n            };\n        ;\n        },\n        hideStory: function(ya) {\n            var za = ((ya && xa.getInstance(ya)));\n            ((za && za.hideStory(ya)));\n        },\n        undoHideStory: function(ya) {\n            var za = ((ya && xa.getInstance(ya)));\n            ((za && za.undoHideStory(ya)));\n        },\n        insertStoriesAtBottom: function(ya) {\n            xa._activeInstance.insertStoriesAtBottom(ya);\n        },\n        _fetchTickerForPlaceholder: function(ya, za) {\n            var ab = {\n                handler: function() {\n                    xa._placeholders[ya.id].JSBNG__status = ua;\n                    za();\n                }\n            }, bb = b(\"TickerRHCPageletByGK\"), cb = bb.pagelet_name;\n            da.loadFromEndpoint(cb, ya.id, xa._placeholders[ya.id].pageletData, ab);\n            xa._placeholders[ya.id].JSBNG__status = ta;\n        },\n        registerStoryDialog: function(ya, za) {\n            i.subscribe(\"ticker/init\", function() {\n                var ab = oa(ya), bb = ((ab && xa.getInstance(ab)));\n                ((bb && bb.registerStoryDialog(ab, za)));\n            }, i.SUBSCRIBE_ALL);\n        },\n        registerPlaceholder: function(ya, za) {\n            var ab = xa._placeholders[ya];\n            xa._placeholders[ya] = {\n                JSBNG__status: sa,\n                pageletData: za\n            };\n            if (((ab && ((ab.JSBNG__status == va))))) {\n                xa.show(ia(ya));\n                ab.callback();\n            }\n        ;\n        ;\n        }\n    });\n    la(xa.prototype, {\n        ADS_IDLE_MS: 300000,\n        FLYOUT_MAX_HEIGHT: 450,\n        FLYOUT_OFFSET_THRESHOLD: 20,\n        FLYOUT_COMMENT_OFFSET: 15,\n        FLYOUT_VIEWPORT_PADDING: 75,\n        FLYOUT_TARGET_HEIGHT_OFFSET: 25,\n        init: function(ya, za, ab) {\n            xa._instances[ya.id] = this;\n            xa._activeInstance = this;\n            this._root = ya;\n            this._content = p.JSBNG__find(ya, \".ticker_stream\");\n            this._stories = p.JSBNG__find(this._root, \".tickerActivityStories\");\n            this._scrollableArea = za;\n            this._container = p.JSBNG__find(ya, \"div.uiScrollableAreaWrap\");\n            this._newestStory = {\n            };\n            this._storyIDs = [];\n            this._objectIDs = [];\n            this._fetchedStories = {\n            };\n            this._removedStoryIDs = [];\n            this._storiesToRemove = [];\n            var bb = JSBNG__Date.now();\n            this._initTime = bb;\n            this._lastUpdate = bb;\n            this._lastPull = bb;\n            this._lastInsert = bb;\n            this._lastCustomStory = 0;\n            this._pollOnly = false;\n            this._needNonCustomStoryNum = 0;\n            this._doCustomUpdate = true;\n            this._autoloadStoryIndex = 1;\n            this._scrollTopThreshold = 100;\n            this._scrollTopPrompt = p.JSBNG__find(this._root, \".scrollTopPrompt\");\n            this._scrollTopPromptVisible = false;\n            this._maxStoriesToKeep = 50;\n            this._minStoriesToKeep = 25;\n            this._tickerInSidebarMode = !!w.byClass(this._root, \"fbChatSidebar\");\n            this._loadStoriesWithActions();\n            ja(\"ticker_flyout\");\n            ja(\"ticker_flyout_prefetch\");\n            ja(\"ticker_flyout_loadtime\");\n            ja(\"ticker_stream\");\n            this._ua = {\n                flyout: ra(\"ticker\").uai(\"flyout\", \"flyout\", false),\n                flyout_prefetch: ra(\"ticker\").uai(\"flyout_prefetch\", \"flyout_prefetch\", false),\n                flyout_loadtime: ra(\"ticker\").uai(\"ticker_flyout_loadtime\", \"flyout_loadtime\", false),\n                stream: ra(\"ticker\").uai(\"ticker_stream\", \"stream\", false)\n            };\n            this._uaCurStoryIDFetch = null;\n            this._uaCurStoryIDPrefetch = null;\n            var cb = p.create(\"div\", {\n                className: \"storyQueue hidden_elem\"\n            });\n            this._storyQueue = cb;\n            p.appendContent(this._root, cb);\n            this._initObjectIDs();\n            this._initConfig(ab);\n            this._resetMorePager();\n            this._initListeners();\n            this._initSubscriptions(ab);\n            i.inform(\"ticker/init\", this, i.BEHAVIOR_PERSISTENT);\n            this._poll();\n            if (this._prefetchAfterLoad) {\n                this._logUserEvent(\"stream\", \"prefetch\");\n                this._fetchStories(this._getInsertedStories().slice(0, 5));\n            }\n        ;\n        ;\n        },\n        _loadStoriesWithActions: function() {\n            var ya = oa(\"rightCol\");\n            if (!ya) {\n                return;\n            }\n        ;\n        ;\n            this._toggleWrapper = p.scry(ya, \".tickerToggleWrapper\")[0];\n            if (this._toggleWrapper) {\n                var za = p.scry(this._stories, \".tickerStoryWithButton\");\n                this._storiesWithActions = {\n                };\n                for (var ab = 0; ((ab < za.length)); ab++) {\n                    var bb = za[ab];\n                    this._storiesWithActions[bb.getAttribute(\"data-story-key\")] = bb;\n                };\n            ;\n            }\n        ;\n        ;\n        },\n        _initConfig: function(ya) {\n            la(this, {\n                _newest: ya.newest,\n                _page_newest: ya.newest,\n                _timeout: ya.timeout,\n                _heartbeatTimeout: Math.min(5000, ya.heartbeatTimeout),\n                _maxHeartbeatTimeout: Math.max(30000, ya.maxHeartbeatTimeout),\n                _pullTimeout: Math.max(30000, ya.pullTimeout),\n                _insertTimeout: ya.insertTimeout,\n                _friendCount: ya.friendCount,\n                _maxQueueLength: ya.maxQueueLength,\n                _heartbeatEndpoint: ya.heartbeatEndpoint,\n                _noPoll: ya.nopoll,\n                _maxCustomQueueLength: ya.maxCustomQueueLength,\n                _customStoryInsertTimeout: Math.max(5000, ya.customStoryInsertTimeout),\n                _nonCustomToCustomStoryRatio: ya.nonCustomToCustomStoryRatio,\n                _minForceUpdateInterval: Math.max(ya.insertTimeout, ya.minForceUpdateInterval),\n                _popupOnHover: ya.popupOnHover,\n                _priorityAppId: ya.priorityAppId,\n                _prefetchOnHover: ya.prefetchStoriesOnHover,\n                _userIdleTimeout: ya.userIdleTimeout,\n                _firstCustomStoryDelay: ya.firstCustomStoryDelay,\n                _pollOnly: ya.pollOnly,\n                _tickerSource: ya.tickerSource,\n                _prefetchAfterLoad: ya.prefetchAfterLoad,\n                _logFlyouts: ya.logFlyouts,\n                _userScrollGaurdDelay: ya.userScrollGaurdDelay,\n                _rescheduleScrollToTopDelay: ya.rescheduleScrollToTopDelay,\n                _aggressiveRegulator: ya.aggressiveRegulator\n            });\n            this._queueCustomStories(ya.customStories);\n        },\n        _initListeners: function() {\n            this._listeners = g.listen(this._root, {\n                click: this._handleClick.bind(this),\n                keydown: this._handleKeydown.bind(this),\n                mouseout: this._handleMouseout.bind(this),\n                mouseover: this._handleMouseover.bind(this),\n                mousedown: this._tickerDeClicker.bind(this),\n                mouseup: this._handleMouseup.bind(this)\n            });\n            this._listeners.JSBNG__scroll = g.listen(this._container, \"JSBNG__scroll\", this._handleScroll.bind(this));\n            this._initInfiniteScrollListener.bind(this).defer();\n        },\n        _initSubscriptions: function(ya) {\n            x.onLeave(this._cleanup.bind(this));\n            this._subscriptions = [i.subscribe(v.NAVIGATION_BEGIN, this._onNavHandler.bind(this)),i.subscribe(\"composer/publish\", this._handleComposerPublish.bind(this)),i.subscribe(\"Ticker/storiesInserted\", this._handleStoriesInserted.bind(this)),i.subscribe(\"Ticker/fixed\", this._setFixed.bind(this, true)),i.subscribe(\"Ticker/unfixed\", this._setFixed.bind(this, false)),i.subscribe(\"Ticker/resized\", this._checkInfiniteScroll.bind(this)),i.subscribe(\"ufi/comment\", this._scrollDialogToBottom.bind(this)),i.subscribe(\"Ticker/chatOpened\", this._handleChatOpened.bind(this)),];\n            if (!ya.pollOnly) {\n                this._subscriptions.push(i.subscribe(m.getArbiterType(\"ticker_update\"), this._handleTickerPush.bind(this)));\n            }\n        ;\n        ;\n            if (((ya.pushChannel && !ya.pollOnly))) {\n                this.setPushChannel(ya.pushChannel);\n            }\n        ;\n        ;\n        },\n        _handleClick: function(JSBNG__event) {\n            var ya = JSBNG__event.getTarget();\n            if (this._getButtonFromNode(ya)) {\n                this._logUserAction(ya, \"click\", JSBNG__event);\n                this._handleActionButton(JSBNG__event);\n                return;\n            }\n        ;\n        ;\n            var za = this._getStoryFromNode(ya), ab = w.byClass(ya, \"tickerStoryAllowClick\");\n            if (((((!za || ((za == this._selectedStory)))) || ab))) {\n                return;\n            }\n        ;\n        ;\n            if (this._storyIsHidden(za)) {\n                return;\n            }\n        ;\n        ;\n            if (((((za == this._activeStory)) && !this._selectedStory))) {\n                this._selecting = true;\n            }\n        ;\n        ;\n            this._clearNux();\n            this._logUserEvent(\"flyout\", \"click\");\n            this._logUserEvent(\"flyout_loadtime\", \"open\");\n            if (this._storyCanOpenExternally(za)) {\n                var bb = za.getAttribute(\"data-href\");\n                if (((bb && !ya.getAttribute(\"href\")))) {\n                    var cb = {\n                        href: bb\n                    }, db = ka(ya, [\"ft\",\"gt\",]);\n                    ja(\"click\", cb, JSBNG__event, \"FORCE\", db);\n                    ra(\"ticker\", cb, JSBNG__event).uai(\"click\");\n                }\n                 else this._logUserAction(ya, \"click\", JSBNG__event);\n            ;\n            ;\n                this._openStoryExternally(za, JSBNG__event);\n                return;\n            }\n        ;\n        ;\n            this._logUserAction(ya, \"flyout\", JSBNG__event);\n            this._activateStory(za, \"click\");\n            this._selectStory(za);\n        },\n        _handleMouseover: function(JSBNG__event) {\n            this._setLocked(true);\n            var ya = JSBNG__event.getTarget(), za = this._getOpenableStory(ya);\n            if (!za) {\n                return;\n            }\n        ;\n        ;\n            JSBNG__event.kill();\n            if (((this._prefetchOnHover || this._popupOnHover))) {\n                if (!((za.id in this._fetchedStories))) {\n                    this._logUserEvent(\"flyout_prefetch\", \"prefetch_on_hover\");\n                    this._uaCurStoryIDPrefetch = za.id;\n                }\n            ;\n            ;\n                this._fetchStory(za);\n            }\n        ;\n        ;\n            if (this._selectedStory) {\n                return;\n            }\n        ;\n        ;\n            if (this._popupOnHover) {\n                this._clearHoverTimeouts();\n                var ab = ((this._storyCanOpenExternally(za) ? 500 : 1000)), bb = ((this._activeStory ? 75 : ab));\n                this._hoverShowTimeout = this._setTimeout(function() {\n                    this._logUserEvent(\"flyout\", \"hover\", bb);\n                    this._logUserEvent(\"flyout_loadtime\", \"open\");\n                    this._activateStory(za, \"hover\");\n                    this._logUserAction(ya, \"flyout\", JSBNG__event);\n                }.bind(this), bb);\n            }\n        ;\n        ;\n        },\n        _handleMouseout: function(JSBNG__event) {\n            var ya = JSBNG__event.getTarget();\n            this._setLocked(false);\n            if (((ya == this._getStoryFromNode(ya)))) {\n                var za = p.scry(ya.parentNode, \".openToggler\");\n                for (var ab = 0; ((ab < za.length)); ab++) {\n                    z.toggle(za[ab]);\n                ;\n                };\n            ;\n            }\n        ;\n        ;\n            this._clearClickedStory();\n            this._scheduleHide();\n        },\n        _handleKeydown: function(JSBNG__event) {\n            this._tickerDeClicker(JSBNG__event);\n            var ya = this._activeStory;\n            if (!ya) {\n                return;\n            }\n        ;\n        ;\n            var za = g.getKeyCode(JSBNG__event);\n            switch (za) {\n              case s.UP:\n            \n              case s.DOWN:\n                var ab = this._getInsertedStories(), bb;\n                if (JSBNG__event.getModifiers().any) {\n                    bb = ((((za === s.UP)) ? 0 : ((ab.length - 1))));\n                }\n                 else bb = ((ab.indexOf(ya) + ((((za === s.UP)) ? -1 : 1))));\n            ;\n            ;\n                ya = ab[bb];\n                break;\n              case s.ESC:\n                this._deactivateStory(true);\n                return;\n              default:\n                return;\n            };\n        ;\n            JSBNG__event.kill();\n            if (!ya) {\n                return;\n            }\n        ;\n        ;\n            this._activateStory(ya, \"keypress\");\n            this._selectStory(ya);\n        },\n        _fadeTopmostStoryButton: function() {\n            var ya = 0, za = 15;\n            if (this._storiesWithActions) {\n                {\n                    var fin143keys = ((window.top.JSBNG_Replay.forInKeys)((this._storiesWithActions))), fin143i = (0);\n                    var ab;\n                    for (; (fin143i < fin143keys.length); (fin143i++)) {\n                        ((ab) = (fin143keys[fin143i]));\n                        {\n                            var bb = this._storiesWithActions[ab], cb = p.scry(bb, \".tickerInlineActionButton\")[0], db = p.scry(cb, \".tickerActionIcon\")[0], eb = ((ha.getElementPosition(cb).y - ha.getElementPosition(this._toggleWrapper).y));\n                            if (((eb < ya))) {\n                                aa.set(cb, \"opacity\", 0);\n                                aa.set(db, \"opacity\", 0);\n                            }\n                             else if (((((eb >= ya)) && ((eb < za))))) {\n                                var fb = ((((eb - ya)) / ((za - ya))));\n                                aa.set(cb, \"opacity\", fb);\n                                aa.set(db, \"opacity\", fb);\n                                break;\n                            }\n                             else {\n                                aa.set(cb, \"opacity\", 1);\n                                aa.set(db, \"opacity\", 1);\n                            }\n                            \n                        ;\n                        ;\n                        };\n                    };\n                };\n            }\n        ;\n        ;\n        },\n        _handleScroll: function() {\n            if (!this._preventScrollDismiss) {\n                this._deactivateStory(true);\n            }\n             else this._preventScrollDismiss = false;\n        ;\n        ;\n            if (!this._handleScrollThrottled) {\n                this._handleScrollThrottled = qa(this._handleScrollInner.bind(this));\n            }\n        ;\n        ;\n            this._handleScrollThrottled();\n        },\n        _handleScrollInner: function() {\n            this._fadeTopmostStoryButton();\n            this._checkInfiniteScroll();\n            this._setIsUserScrolling();\n            if (!this._scrollLogged) {\n                this._scrollLogged = true;\n                var ya = this._stories.childNodes.length, za = this._stories.getAttribute(\"data-gt\"), ab = {\n                    ticker_scroll: 1,\n                    number_stories: ya,\n                    source: za\n                };\n                ja(\"JSBNG__scroll\", null, null, \"FORCE\", {\n                    gt: ab\n                });\n                ra(\"ticker\").uai(\"JSBNG__scroll\");\n            }\n        ;\n        ;\n        },\n        _setIsUserScrolling: function() {\n            JSBNG__clearTimeout(this._userScrollingToken);\n            if (this._isScrolledToTop()) {\n                this._userScrolling = false;\n                return;\n            }\n        ;\n        ;\n            this._userScrolling = true;\n            this._userScrollingToken = JSBNG__setTimeout(function() {\n                this._userScrolling = false;\n                this._userScrollingToken = null;\n            }.bind(this), this._userScrollGaurdDelay);\n        },\n        _isUserScrolling: function() {\n            return this._userScrolling;\n        },\n        _handleStoriesInserted: function() {\n            this._initInfiniteScrollListener();\n            if (((this._scrollableArea instanceof y))) {\n                this._scrollableArea.adjustGripper();\n            }\n             else wa.error(\"wrong_scrollable_area\", {\n                JSBNG__dump: this\n            });\n        ;\n        ;\n            this._logUserEvent(\"stream\", \"insert\");\n        },\n        _handleActionButton: function(JSBNG__event) {\n            var ya = JSBNG__event.getTarget(), za = this._getOpenableStory(ya), ab = this._getStoryDialog(za);\n            if (ab) {\n                var bb = ab.subscribe(\"beforehide\", function() {\n                    ab.unsubscribe(bb);\n                    return false;\n                });\n            }\n        ;\n        ;\n        },\n        _handleScrollToTopClick: function() {\n            this._scrollToTop(this._poll.bind(this));\n        },\n        _scheduleScrollToTop: function() {\n            ((this._scrollToTopToken && JSBNG__clearTimeout(this._scrollToTopToken)));\n            this._scrollToTopToken = JSBNG__setTimeout(function() {\n                if (((this._isLocked() || this._isUserScrolling()))) {\n                    this._scheduleScrollToTop();\n                }\n                 else {\n                    this._scrollToTopToken = null;\n                    this._scrollToTop();\n                }\n            ;\n            ;\n            }.bind(this), this._rescheduleScrollToTopDelay);\n        },\n        _scrollToTop: function(ya) {\n            new h(this._container).to(\"scrollTop\", 0).ease(h.ease.end).ondone(ya).go();\n        },\n        _clearHoverTimeouts: function() {\n            JSBNG__clearTimeout(this._hoverShowTimeout);\n            JSBNG__clearTimeout(this._hoverHideTimeout);\n        },\n        _getAllStories: function() {\n            return p.scry(this._root, \"div.fbFeedTickerStory\");\n        },\n        _getInsertedStories: function() {\n            return this._getAllStories().filter(function(ya) {\n                return ((!o.hasClass(ya, \"queuedStory\") && !o.hasClass(ya, \"customStory\")));\n            });\n        },\n        _getQueuedStories: function() {\n            return p.scry(this._storyQueue, \".fbFeedTickerStory.queuedStory\");\n        },\n        _getQueuedCustomStories: function() {\n            return p.scry(this._storyQueue, \".fbFeedTickerStory.customStory\");\n        },\n        _getButtonFromNode: function(ya) {\n            return w.byClass(ya, \"tickerInlineOverlay\");\n        },\n        _getStoryFromNode: function(ya) {\n            return w.byClass(ya, \"fbFeedTickerStory\");\n        },\n        _getActionButtonFromStory: function(ya) {\n            return p.scry(ya, \".tickerInlineActionButton\")[0];\n        },\n        _getOpenableStory: function(ya) {\n            var za = this._getStoryFromNode(ya);\n            return ((this._storyCanOpenDialog(za) ? za : null));\n        },\n        _getStoryDialog: function(ya) {\n            return n.getInstance(ya);\n        },\n        _getStoryDialogEndpoint: function(ya) {\n            return ((((((ya && ((ya.getAttribute(\"data-rel\") == \"async\")))) && ya.getAttribute(\"data-ajaxify\"))) || null));\n        },\n        _storyCanOpenDialog: function(ya) {\n            return ((!!this._getStoryDialogEndpoint(ya) && !this._storyIsHidden(ya)));\n        },\n        _storyCanOpenExternally: function(ya) {\n            return ((!!ya.getAttribute(\"data-href\") || !this._storyCanOpenDialog(ya)));\n        },\n        _storyIsHidden: function(ya) {\n            return o.hasClass(ya, \"tickerStoryHidden\");\n        },\n        hideActiveStory: function() {\n            ((this._activeStory && this.hideStory(this._activeStory)));\n        },\n        hideStory: function(ya) {\n            this._deactivateStory();\n            if (((p.getText(ya) === \"\"))) {\n                p.remove(ya);\n            }\n        ;\n        ;\n            o.addClass(ya, \"tickerStoryHidden\");\n            o.removeClass(ya, \"tickerStoryClickable\");\n        },\n        undoHideStory: function(ya) {\n            o.addClass(ya, \"tickerStoryClickable\");\n            o.removeClass(ya, \"tickerStoryHidden\");\n        },\n        insertStoriesAtBottom: function(ya) {\n            if (!ya) {\n                return;\n            }\n        ;\n        ;\n            var za = p.create(\"div\");\n            za.appendChild(ya);\n            var ab = p.scry(za, \".fbFeedTickerStory\"), bb = p.JSBNG__find(za, \".tickerMorePager\"), cb = [];\n            for (var db = 0; ((db < ab.length)); db++) {\n                if (!this.dedupeStory(ab[db])) {\n                    cb.push(ab[db]);\n                }\n            ;\n            ;\n            };\n        ;\n            if (cb.length) {\n                cb.push(bb);\n                p.replace(p.JSBNG__find(this._root, \".tickerMorePager\"), cb);\n            }\n        ;\n        ;\n            i.inform(\"Ticker/storiesInserted\");\n        },\n        _scheduleHide: function() {\n            if (((this._popupOnHover && !this._selectedStory))) {\n                this._clearHoverTimeouts();\n                this._hoverHideTimeout = this._setTimeout(this._deactivateStory.bind(this), 100);\n            }\n        ;\n        ;\n        },\n        _setScrollTopPromptVisible: function(ya) {\n            this._scrollTopPromptVisible = ya;\n            o.conditionShow(this._scrollTopPrompt, ya);\n            if (((ya && !this._listeners.scrollTop))) {\n                this._listeners.scrollTop = g.listen(this._scrollTopPrompt, {\n                    click: this._handleScrollToTopClick.bind(this)\n                });\n            }\n             else if (((!ya && this._listeners.scrollTop))) {\n                this._listeners.scrollTop.click.remove();\n                this._listeners.scrollTop = null;\n            }\n            \n        ;\n        ;\n        },\n        _isUserIdle: function() {\n            return !fa.isActive(this._userIdleTimeout);\n        },\n        _schedulePoll: function() {\n            JSBNG__clearTimeout(this._pollToken);\n            this._pollToken = this._setTimeout(this._poll.bind(this), this._timeout);\n        },\n        _poll: function() {\n            if (!this._isTickerVisible()) {\n                return;\n            }\n        ;\n        ;\n            if (((this._storiesToRemove.length > 0))) {\n                if (this._isInsertingStory) {\n                    return this._schedulePoll();\n                }\n            ;\n            ;\n                var ya = this._storiesToRemove.pop();\n                this.removeStory(ya);\n            }\n        ;\n        ;\n            var za = ((!this._isScrolledToTop() && this._getQueuedStories().length));\n            this._setScrollTopPromptVisible(za);\n            var ab = JSBNG__Date.now(), bb = ((ab - this._lastInsert));\n            if (((((bb < this._insertTimeout)) || this._isLocked()))) {\n                return this._schedulePoll();\n            }\n        ;\n        ;\n            var cb = this._getQueuedStories(), db = this._getQueuedCustomStories(), eb = this._isUserIdle(), fb = ((cb.length > 0)), gb = ((((((((db.length > 0)) && !eb)) && ((((ab - this._initTime)) > this._firstCustomStoryDelay)))) && ((((this._needNonCustomStoryNum === 0)) || ((!fb && ((((ab - this._lastCustomStory)) > this._customStoryInsertTimeout))))))));\n            if (gb) {\n                this.insertStory(db.shift());\n                this._lastCustomStory = ab;\n                this._needNonCustomStoryNum = this._nonCustomToCustomStoryRatio;\n                return this._schedulePoll();\n            }\n        ;\n        ;\n            if (fb) {\n                this.insertStory(cb.shift());\n                this._needNonCustomStoryNum--;\n                if (((this._needNonCustomStoryNum < 0))) {\n                    this._needNonCustomStoryNum = 0;\n                }\n            ;\n            ;\n                return this._schedulePoll();\n            }\n        ;\n        ;\n            if (eb) {\n                return fa.subscribeOnce(this._poll.bind(this));\n            }\n        ;\n        ;\n            var hb = ((((((((((db.length === 0)) && ((this._needNonCustomStoryNum === 0)))) && ((this._nonCustomToCustomStoryRatio > 0)))) && fa.isActive(this.ADS_IDLE_MS))) && ((((ab - this._lastUpdate)) > this._minForceUpdateInterval)))), ib = false, jb = false;\n            if (this._pollOnly) {\n                jb = ((((ab - this._lastUpdate)) > this._heartbeatTimeout));\n            }\n             else ib = ((((ab - this._lastPull)) > this._pullTimeout));\n        ;\n        ;\n            var kb = ((((((hb && this._doCustomUpdate)) || ib)) || jb));\n            if (!kb) {\n                return this._schedulePoll();\n            }\n        ;\n        ;\n            if (hb) {\n                this._doCustomUpdate = false;\n            }\n        ;\n        ;\n            this.update({\n                pull: ib,\n                fullpoll: jb,\n                needcustomstory: hb\n            });\n        },\n        _updatePollOnlyHeartbeatTimeout: function() {\n            if (((this._pollOnly && ((this._heartbeatTimeout < this._maxHeartbeatTimeout))))) {\n                this._heartbeatTimeout = Math.min(((this._heartbeatTimeout + 5000)), this._maxHeartbeatTimeout);\n            }\n        ;\n        ;\n        },\n        update: function(ya) {\n            this._updatePollOnlyHeartbeatTimeout();\n            if (((this._noPoll && !this._pollOnly))) {\n                return this._schedulePoll();\n            }\n        ;\n        ;\n            var za = {\n                newest: ((((ya.fullpoll || ya.cache_update)) ? this._newest : this._page_newest)),\n                storyids: this._storyIDs,\n                friendcount: this._friendCount,\n                priorityappid: this._priorityAppId,\n                source: this._tickerSource,\n                needcustomstory: ((this._nonCustomToCustomStoryRatio > 0))\n            };\n            la(za, ya);\n            new j().setURI(this._heartbeatEndpoint).setReadOnly(true).setOption(\"retries\", 0).setData(za).setHandler(this._handleResponse.bind(this)).setFinallyHandler(this._poll.bind(this)).setAllowCrossPageTransition(true).send();\n            this._lastUpdate = JSBNG__Date.now();\n            if (za.pull) {\n                this._lastPull = this._lastUpdate;\n            }\n        ;\n        ;\n            this._storyIDs = [];\n        },\n        insertStory: function(ya, za, ab) {\n            this._lastInsert = JSBNG__Date.now();\n            ((window.LiveTimer && u.addTimeStamps(ya)));\n            o.removeClass(ya, \"queuedStory\");\n            o.removeClass(ya, \"customStory\");\n            if (((za !== false))) {\n                var bb = ((ab ? this._fadeStoryIn : this._flyStoryIn));\n                if (this._isUserScrolling()) {\n                    var cb = function() {\n                        this._container.scrollTop = ((this._container.scrollTop + this._stories.firstChild.offsetHeight));\n                        this._scheduleScrollToTop();\n                    }.bind(this);\n                    this._fadeStoryIn(ya, cb);\n                }\n                 else this._scrollToTop(bb.bind(this, ya));\n            ;\n            ;\n            }\n             else p.prependContent(this._stories, ya);\n        ;\n        ;\n            if (((this._storiesWithActions && o.hasClass(ya, \"tickerStoryWithButton\")))) {\n                this._storiesWithActions[ya.getAttribute(\"data-story-key\")] = ya;\n            }\n        ;\n        ;\n            this._removeOldStories();\n        },\n        _removeOldStories: function() {\n            var ya = this._getInsertedStories();\n            if (((ya.length <= this._maxStoriesToKeep))) {\n                return;\n            }\n        ;\n        ;\n            var za = this._minStoriesToKeep, ab = ya.slice(za);\n            ab.forEach(p.remove);\n            if (this._storiesWithActions) {\n                for (var bb = 0; ((bb < ab.length)); bb++) {\n                    delete this._storiesWithActions[ab[bb].getAttribute(\"data-story-key\")];\n                ;\n                };\n            }\n        ;\n        ;\n            this._resetMorePager();\n        },\n        _resetMorePager: function() {\n            var ya = this._getInsertedStories();\n            if (((!ya || !ya.length))) {\n                return;\n            }\n        ;\n        ;\n            var za = ya[((ya.length - 1))].getAttribute(\"data-ticker-timestamp\"), ab = p.scry(this._root, \".tickerMorePager a\")[0];\n            if (((!ab || !za))) {\n                return;\n            }\n        ;\n        ;\n            var bb = new ea(ab.getAttribute(\"ajaxify\"));\n            bb.addQueryData({\n                oldest: za\n            });\n            ab.setAttribute(\"ajaxify\", bb);\n        },\n        _setLocked: function(ya) {\n            this._locked = ya;\n        },\n        _isLocked: function() {\n            return !!((this._locked || this._activeStory));\n        },\n        informAndRemoveStory: function(ya, za, ab) {\n            var bb = this._getStoryFromNode(ya), cb = bb.getAttribute(\"data-story-key\");\n            p.setContent(bb, za);\n            o.addClass(bb, \"highlightedStory\");\n            this._setTimeout(this.removeStory.bind(this, cb), ((ab || 6000)));\n        },\n        _getStoryByStoryKey: function(ya) {\n            var za = this._getAllStories();\n            for (var ab = 0; ((ab < za.length)); ab++) {\n                var bb = za[ab];\n                if (((bb.getAttribute(\"data-story-key\") == ya))) {\n                    return bb;\n                }\n            ;\n            ;\n            };\n        ;\n            return null;\n        },\n        removeStory: function(ya) {\n            this._removedStoryIDs[ya] = true;\n            var za = this._getStoryByStoryKey(ya);\n            if (!za) {\n                return;\n            }\n        ;\n        ;\n            if (this._storiesWithActions) {\n                delete this._storiesWithActions[ya];\n            }\n        ;\n        ;\n            if (((za == this._activeStory))) {\n                this._deactivateStory();\n            }\n        ;\n        ;\n            var ab = this._getStoryDialog(za);\n            ((ab && ab.destroy()));\n            if (o.hasClass(za, \"queuedStory\")) {\n                p.remove(za);\n                return;\n            }\n        ;\n        ;\n            this._animateStoryOut(za);\n        },\n        _isScrolledToTop: function() {\n            return ((this._container.scrollTop <= this._scrollTopThreshold));\n        },\n        _flyStoryIn: function(ya) {\n            var za = p.create(\"div\", {\n                style: {\n                    marginTop: \"-1000px\"\n                }\n            }, ya);\n            aa.set(za, \"opacity\", 0);\n            p.prependContent(this._stories, za);\n            var ab = ha.getElementDimensions(za).y;\n            aa.set(za, \"marginTop\", ((((\"-\" + ab)) + \"px\")));\n            this._isInsertingStory = true;\n            new h(za).to(\"marginTop\", 0).ease(h.ease.end).checkpoint(21801).to(\"opacity\", 1).ondone(function() {\n                p.replace(za, ya);\n                this._afterInsert(ya);\n                this._isInsertingStory = false;\n            }.bind(this)).go();\n        },\n        _fadeStoryIn: function(ya, za) {\n            new h(this._stories).to(\"opacity\", 21991).ondone(function() {\n                p.prependContent(this._stories, ya);\n                if (za) {\n                    za();\n                }\n            ;\n            ;\n                new h(this._stories).to(\"opacity\", 1).ondone(function() {\n                    this._afterInsert(ya);\n                }.bind(this)).go();\n            }.bind(this)).go();\n        },\n        _animateStoryOut: function(ya) {\n            var za = p.create(\"div\", {\n                style: {\n                    overflow: \"hidden\",\n                    position: \"relative\"\n                }\n            });\n            p.insertBefore(ya, za);\n            p.appendContent(za, ya);\n            new h(za).to(\"JSBNG__top\", 20).to(\"height\", 0).to(\"opacity\", 0).ease(h.ease.end).ondone(function() {\n                p.remove(za);\n                i.inform(\"Ticker/animateOut\");\n            }.bind(this)).go();\n        },\n        _afterInsert: function(ya) {\n            i.inform(\"Ticker/afterInsert\");\n        },\n        setPushChannel: function(ya) {\n            ((this._pushSubscription && this._pushSubscription.unsubscribe()));\n            this._pushSubscription = i.subscribe(m.getArbiterType(ya), this._handleTickerPush.bind(this));\n            d([\"ChatConfig\",\"ChannelConnection\",], function(za, ab) {\n                this._channelConnection = ab;\n                this._checkChannelConnection();\n                this._channelConnectionSubscription = this._channelConnection.subscribe([this._channelConnection.CONNECTED,this._channelConnection.RECONNECTING,this._channelConnection.SHUTDOWN,this._channelConnection.MUTE_WARNING,this._channelConnection.UNMUTE_WARNING,], this._handleChannelConnection.bind(this));\n            }.bind(this));\n        },\n        _checkChannelConnection: function() {\n            o.conditionClass(this._root, \"disconnected\", this._channelConnection.disconnected());\n        },\n        setCurrentAppId: function(ya) {\n            this._priorityAppId = ya;\n        },\n        _handleTickerPush: function(ya, za) {\n            var ab = za.obj;\n            if (ab.delete_id) {\n                this._storiesToRemove.push(ab.delete_id);\n                return;\n            }\n        ;\n        ;\n            if (ab.fromups) {\n                if (ab.do_logging) {\n                    this._logDarkLaunch(ab);\n                }\n            ;\n            }\n        ;\n        ;\n            var bb = ab.story_xhp;\n            if (!bb) {\n                return;\n            }\n        ;\n        ;\n            this._newest = ab.story_time;\n            var cb = q(bb).getRootNode();\n            this.queueStory(cb, ab.flyout_js_cmds);\n            if (((this._aggressiveRegulator && ((ab.actor == this._newestStory.actorID))))) {\n                this.removeStory(this._newestStory.storyKey);\n                new k(\"/common/ods_endpoint.php\", {\n                    k: \"ticker.aggr.remove\"\n                }).send();\n            }\n        ;\n        ;\n            this._newestStory = {\n                actorID: ab.actor,\n                storyKey: cb.getAttribute(\"data-story-key\")\n            };\n        },\n        _handleComposerPublish: function(ya, za) {\n            ((za.tickerMarkup && this.insertStory(za.tickerMarkup)));\n        },\n        _clearNux: function() {\n            var ya = p.scry(JSBNG__document.body, \"div.tickerNUXContainer\");\n            if (ya.length) {\n                ya.forEach(function(za) {\n                    var ab = n.getInstance(za);\n                    ((ab && ab.hide()));\n                });\n                new j().setURI(\"/ajax/feed/ticker/nux.php\").send();\n            }\n        ;\n        ;\n            this._clearNux = na;\n        },\n        _logDarkLaunch: function(ya) {\n            var za = {\n                actor: ya.actor,\n                story_time: ya.story_time,\n                key: ya.story_obj_id,\n                dark: 1\n            };\n            new j().setURI(\"/alite/push/log.php\").setData({\n                msg: JSON.stringify(za)\n            }).send();\n        },\n        _logRender: function() {\n            if (this._loggedRender) {\n                return;\n            }\n        ;\n        ;\n            var ya = this._tickerInSidebarMode;\n            if (((ya || w.byClass(this._content, \"home_right_column\")))) {\n                new k(\"/ajax/log_ticker_render.php\", {\n                    sidebar_mode: ya\n                }).send();\n                this._loggedRender = true;\n            }\n        ;\n        ;\n        },\n        _isTickerVisible: function() {\n            var ya = ((xa._activeInstance == this));\n            ((ya && this._logRender()));\n            return ya;\n        },\n        _handleResponse: function(ya) {\n            var za = ya.getPayload();\n            if (za.newest) {\n                this._newest = this._page_newest = za.newest;\n            }\n        ;\n        ;\n            if (za.JSBNG__content) {\n                if (((za.JSBNG__content instanceof Array))) {\n                    for (var ab = 0; ((ab < za.JSBNG__content.length)); ab++) {\n                        this.queueStoryMarkup(za.JSBNG__content[ab]);\n                    ;\n                    };\n                ;\n                }\n                 else this.queueStoryMarkup(za.JSBNG__content);\n            ;\n            }\n        ;\n        ;\n            if (((za.custom_stories && za.custom_stories.length))) {\n                this._queueCustomStories(za.custom_stories);\n                this._doCustomUpdate = true;\n            }\n        ;\n        ;\n        },\n        queueStoryMarkup: function(ya) {\n            var za = q(ya).getRootNode();\n            this.queueStory(za);\n        },\n        dedupeStory: function(ya) {\n            var za = ya.getAttribute(\"data-story-key\"), ab = ((za && ((!!this._objectIDs[za] || !!this._removedStoryIDs[za]))));\n            ((za && (this._objectIDs[za] = true)));\n            return ab;\n        },\n        queueStory: function(ya, za) {\n            if (this.dedupeStory(ya)) {\n                return;\n            }\n        ;\n        ;\n            o.addClass(ya, \"queuedStory\");\n            p.appendContent(this._storyQueue, ya);\n            var ab = ((za && za.length));\n            if (ab) {\n                za.forEach(function(cb) {\n                    new Function(cb).apply();\n                });\n            }\n        ;\n        ;\n            ya.setAttribute(\"id\", ((((ya.id + \"_\")) + this._root.id)));\n            var bb = this._getQueuedStories();\n            bb.slice(0, -this._maxQueueLength).forEach(p.remove);\n            if (ab) {\n                this._fetchedStories[ya.id] = true;\n            }\n        ;\n        ;\n        },\n        _queueCustomStories: function(ya) {\n            while (ya.length) {\n                var za = ya.shift();\n                za = q(za).getRootNode();\n                if (this.dedupeStory(za)) {\n                    continue;\n                }\n            ;\n            ;\n                o.addClass(za, \"customStory\");\n                p.appendContent(this._storyQueue, za);\n            };\n        ;\n            var ab = this._getQueuedCustomStories();\n            ab.slice(0, -this._maxQueueLength).forEach(p.remove);\n        },\n        _cleanup: function() {\n            xa._placeholders.pagelet_rhc_ticker = null;\n            if (!w.byClass(this._content, \"hasRightCol\")) {\n                return;\n            }\n        ;\n        ;\n            this._objectIDs = [];\n            this._subscriptions.forEach(i.unsubscribe);\n            ((this._channelConnectionSubscription && this._channelConnection.unsubscribe(this._channelConnectionSubscription)));\n            ((this._pushSubscription && this._pushSubscription.unsubscribe()));\n            {\n                var fin144keys = ((window.top.JSBNG_Replay.forInKeys)((this._listeners))), fin144i = (0);\n                var ya;\n                for (; (fin144i < fin144keys.length); (fin144i++)) {\n                    ((ya) = (fin144keys[fin144i]));\n                    {\n                        ((this._listeners[ya] && this._listeners[ya].remove()));\n                    ;\n                    };\n                };\n            };\n        ;\n            JSBNG__clearTimeout(this._pollToken);\n            this._pollToken = null;\n            this._cleanupInputFocusListener();\n            this._cleanupContentResizeListener();\n            i.inform(\"Ticker/cleanup\");\n        },\n        _onNavHandler: function(ya, za) {\n            var ab = za.params.key;\n            if (((((ab != \"lf\")) && ((ab != \"h\"))))) {\n                this._cleanup();\n            }\n        ;\n        ;\n        },\n        _getPositionForDialog: function() {\n            if (((this._tickerInSidebarMode && o.hasClass(JSBNG__document.body, \"_58v4\")))) {\n                return \"right\";\n            }\n        ;\n        ;\n            return \"left\";\n        },\n        registerStoryDialog: function(ya, za) {\n            if (((this._uaCurStoryIDFetch == ya.id))) {\n                this._uaCurStoryIDFetch = null;\n                this._logUserEvent(\"flyout\", \"fetch_success\");\n            }\n        ;\n        ;\n            if (((this._uaCurStoryIDPrefetch == ya.id))) {\n                this._uaCurStoryIDPrefetch = null;\n                this._logUserEvent(\"flyout_prefetch\", \"prefetch_success\");\n            }\n        ;\n        ;\n            this._fetchedStories[ya.id] = true;\n            za.setContext(ya);\n            za.setPosition(this._getPositionForDialog());\n            za.subscribe(\"hide\", this._deactivateStory.bind(this, true));\n            za.subscribe(\"success\", this._focusStory.bind(this, ya));\n            za.subscribe(\"beforehide\", function() {\n                if (this._selecting) {\n                    this._selecting = false;\n                    return false;\n                }\n            ;\n            ;\n            }.bind(this));\n            if (this._popupOnHover) {\n                za.subscribe(\"mouseenter\", this._clearHoverTimeouts.bind(this));\n                za.subscribe(\"mouseleave\", this._scheduleHide.bind(this));\n                za.subscribe(\"show\", function() {\n                    this._highlightDialogScrollbar.bind(this, za).defer();\n                    var ab = g.listen(za.getContent(), \"mousedown\", function() {\n                        this._selectStory(ya);\n                        ab.remove();\n                    }.bind(this));\n                }.bind(this));\n            }\n        ;\n        ;\n            if (((ya == this._activeStory))) {\n                this._logUserEvent(\"flyout_loadtime\", \"show_fetched\");\n                this._logUserEvent(\"flyout\", \"show\");\n                this._openDialog(za);\n            }\n        ;\n        ;\n        },\n        _highlightDialogScrollbar: function(ya) {\n            var za = p.scry(ya.getContent(), \".uiScrollableArea\")[0];\n            ((za && y.poke(za)));\n        },\n        _openStoryExternally: function(ya, JSBNG__event) {\n            var za = ya.getAttribute(\"data-href\");\n            if (((!za || ((za == \"#\"))))) {\n                return;\n            }\n        ;\n        ;\n            var ab = ya.getAttribute(\"data-story-rel\");\n            switch (ab) {\n              case \"theater\":\n                this._deactivateAndClearStory();\n                l.loadModules([\"PhotoViewer\",], function(db) {\n                    db.bootstrap(za, ya);\n                });\n                return;\n              case \"async\":\n                this._deactivateAndClearStory();\n                j.bootstrap(za, ya);\n                return;\n            };\n        ;\n            var bb = ya.getAttribute(\"data-target\"), cb = ((((((JSBNG__event.which != 1)) || JSBNG__event.getModifiers().any)) || ((bb == \"_blank\"))));\n            ((cb ? window.open(za, \"_blank\") : pa(za)));\n        },\n        _deactivateAndClearStory: function() {\n            this._clearHoverTimeouts();\n            this._deactivateStory();\n        },\n        _focusStoryWillTriggerScroll: function(ya) {\n            var za = this._container, ab = za.clientHeight, bb = ya.offsetHeight, cb = za.scrollTop, db = ((cb + ab)), eb = ya.offsetTop, fb = ((eb + bb));\n            return ((((eb < cb)) || ((fb > db))));\n        },\n        _focusStory: function(ya) {\n            if (this._focusStoryWillTriggerScroll(ya)) {\n                this._preventScrollDismiss = true;\n            }\n        ;\n        ;\n            ya.JSBNG__focus();\n        },\n        _selectStory: function(ya) {\n            this._selectedStory = ya;\n            o.addClass(ya, \"tickerStorySelected\");\n            o.addClass(this._root, \"tickerChildSelected\");\n        },\n        _activateStory: function(ya, za) {\n            this._clearHoverTimeouts();\n            if (((((ya == this._activeStory)) || !this._storyCanOpenDialog(ya)))) {\n                return;\n            }\n        ;\n        ;\n            this._deactivateStory();\n            this._focusStory(ya);\n            this._activeStory = ya;\n            o.addClass(ya, \"tickerStoryActive\");\n            ((window.Toggler && ca.hide()));\n            if (this._logFlyouts) {\n                za = ((za || \"unknown\"));\n                new k(\"/ajax/feed/ticker/flyout.php\", {\n                    src: za\n                }).send();\n            }\n        ;\n        ;\n            ba.log(ya);\n            var ab = this._getStoryDialog(ya);\n            if (ab) {\n                this._logUserEvent(\"flyout_loadtime\", \"show_prefetched\");\n                this._logUserEvent(\"flyout\", \"show\");\n                this._openDialog(ab);\n                return;\n            }\n        ;\n        ;\n            if (!((ya.id in this._fetchedStories))) {\n                this._uaCurStoryIDFetch = ya.id;\n                this._logUserEvent(\"flyout\", \"fetch\");\n            }\n        ;\n        ;\n            this._fetchStory(ya);\n        },\n        _deactivateStory: function(ya) {\n            if (((this._activeStory === this._deactivatingStory))) {\n                return;\n            }\n        ;\n        ;\n            this._deactivatingStory = this._activeStory;\n            if (this._dialog) {\n                if (((ya === true))) {\n                    this._dialog.enableBehavior(t);\n                }\n                 else this._dialog.disableBehavior(t);\n            ;\n            ;\n                this._dialog.hide();\n                this._logUserEvent(\"flyout\", \"close\");\n            }\n        ;\n        ;\n            if (this._activeStory) {\n                o.removeClass(this._activeStory, \"tickerStoryActive\");\n                o.removeClass(this._activeStory, \"tickerStorySelected\");\n                o.removeClass(this._root, \"tickerChildSelected\");\n            }\n        ;\n        ;\n            this._dialog = this._selectedStory = this._activeStory = null;\n            this._cleanupInputFocusListener();\n            this._cleanupContentResizeListener();\n            this._deactivatingStory = null;\n        },\n        _logUserAction: function(ya, za, JSBNG__event) {\n            ja(za, ya, JSBNG__event, \"FORCE\");\n            ra(\"ticker\", ya, JSBNG__event).uai(za);\n        },\n        _logUserEvent: function(ya, JSBNG__event) {\n            if (this._ua[ya]) {\n                this._ua[ya].add_event(JSBNG__event);\n            }\n        ;\n        ;\n        },\n        _fetchStory: function(ya) {\n            JSBNG__clearTimeout(this._fetchToken);\n            var za = [], ab = this._getInsertedStories(), bb = ab.indexOf(ya);\n            [-1,0,1,].forEach(function(cb) {\n                var db = ab[((bb + cb))];\n                ((db && za.push(db)));\n            }, this);\n            this._fetchToken = JSBNG__setTimeout(this._fetchStories.bind(this, za), 100);\n        },\n        _fetchStories: function(ya) {\n            var za = [], ab, bb = function(cb) {\n                JSBNG__clearTimeout(ab);\n                ya.forEach(function(db) {\n                    o.conditionClass(db, \"tickerStoryFetching\", cb);\n                });\n            };\n            ya = ya.filter(function(cb) {\n                if (((cb.id in this._fetchedStories))) {\n                    return false;\n                }\n            ;\n            ;\n                this._fetchedStories[cb.id] = true;\n                var db = this._getStoryDialogEndpoint(cb), eb = ea(db).getQueryData();\n                if (((!db || !eb))) {\n                    return false;\n                }\n            ;\n            ;\n                eb.uniq_id = cb.getAttribute(\"id\");\n                eb.referrer = this._tickerSource;\n                za.push(eb);\n                return true;\n            }, this);\n            if (!za.length) {\n                return;\n            }\n        ;\n        ;\n            ab = this._setTimeout(bb.curry(true), 500);\n            new j(\"/ajax/feed/ticker/multi_story\").setFinallyHandler(bb.curry(false)).setErrorHandler(na).setData({\n                stories: za\n            }).setAllowCrossPageTransition(this._tickerInSidebarMode).send();\n        },\n        _tickerDeClicker: function(JSBNG__event) {\n            var ya = JSBNG__event.getTarget(), za = w.byTag(ya, \"a\"), ab = this._getStoryFromNode(ya), bb = this._getButtonFromNode(ya);\n            if (((((((((((ab && za)) && !bb)) && o.hasClass(ab, \"tickerStoryClickable\"))) && !o.hasClass(za, \"tickerStoryAllowClick\"))) && !this._storyIsHidden(ab)))) {\n                za.setAttribute(\"rel\", \"ignore\");\n                za.removeAttribute(\"JSBNG__onclick\");\n                za.removeAttribute(\"ajaxify\");\n                za.removeAttribute(\"href\");\n            }\n        ;\n        ;\n            var cb = ((JSBNG__event.button == 2)), db = ((JSBNG__event.type === \"keydown\")), eb = ((ab && this._getActionButtonFromStory(ab)));\n            if (((((!cb && eb)) && !db))) {\n                this._setClickedStory(ab);\n            }\n        ;\n        ;\n        },\n        _handleMouseup: function(JSBNG__event) {\n            this._clearClickedStory();\n        },\n        _setClickedStory: function(ya) {\n            this._clearClickedStory();\n            o.addClass(ya, \"tickerStoryClicked\");\n            this._clickedStory = ya;\n        },\n        _clearClickedStory: function() {\n            if (this._clickedStory) {\n                o.removeClass(this._clickedStory, \"tickerStoryClicked\");\n                this._clickedStory = null;\n            }\n        ;\n        ;\n        },\n        _initInfiniteScrollListener: function() {\n            var ya = this._getInsertedStories();\n            if (this._storiesWithActions) {\n                for (var za = 0; ((za < ya.length)); za++) {\n                    var ab = ya[za];\n                    if (o.hasClass(ab, \"tickerStoryWithButton\")) {\n                        this._storiesWithActions[ab.getAttribute(\"data-story-key\")] = ab;\n                    }\n                ;\n                ;\n                };\n            }\n        ;\n        ;\n            var bb = Math.max(0, ((ya.length - this._autoloadStoryIndex)));\n            this._infiniteScrollStory = ya[bb];\n            this._checkInfiniteScroll();\n        },\n        _checkInfiniteScroll: function() {\n            if (this._infiniteScrollStory) {\n                var ya = ha.getElementPosition(this._infiniteScrollStory).y, za = ((ha.getElementPosition(this._container).y + ha.getElementDimensions(this._container).y));\n                if (((ya < za))) {\n                    var ab = p.scry(this._root, \".tickerMorePager a\")[0];\n                    if (ab) {\n                        var bb = ((w.byClass(ab, \"stat_elem\") || ab));\n                        new j(ab.getAttribute(\"ajaxify\")).setReadOnly(true).setRelativeTo(ab).setStatusElement(bb).setAllowCrossPageTransition(true).send();\n                        this._logUserEvent(\"stream\", \"JSBNG__scroll\");\n                    }\n                ;\n                ;\n                    this._infiniteScrollStory = null;\n                    this._autoloadStoryIndex = 5;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n        },\n        _setFixed: function(ya) {\n            if (!this._selectedStory) {\n                return;\n            }\n        ;\n        ;\n            var za = this._getStoryDialog(this._selectedStory);\n            if (za) {\n                za.setPosition(this._getPositionForDialog());\n                za.setFixed(ya);\n                za.updatePosition();\n            }\n        ;\n        ;\n        },\n        _setTimeout: function(ya, za) {\n            return JSBNG__setTimeout(ya, za, !this._tickerInSidebarMode);\n        },\n        _scrollDialogToBottom: function() {\n            var ya = ((this._dialog && this._dialog.getContent())), za = ((ya && p.scry(ya, \".uiScrollableAreaWrap\")[0])), ab = ((za && y.getInstance(za)));\n            ((ab && ab.scrollToBottom()));\n        },\n        _openDialog: function(ya) {\n            if (!this._tickerInSidebarMode) {\n                o.addClass(ya.getRoot(), \"tickerStoryOverlayOnTop\");\n            }\n        ;\n        ;\n            this._dialog = ya.show();\n            this._updateDialogPosition();\n            this._writeSwfFrame(ya);\n            this._initCommentFocusListener.bind(this).defer();\n            this._initContentResizeListener.bind(this).defer();\n            this._stupidIE7VideoResizeHack(ya);\n        },\n        _stupidIE7VideoResizeHack: function(ya) {\n            if (((ga.ie() === 7))) {\n                var za = p.scry(ya.getContent(), \".uiVideoThumb .img\");\n                za.forEach(function(ab) {\n                    aa.set(ab, \"width\", \"\");\n                });\n            }\n        ;\n        ;\n        },\n        _updateDialogPosition: function() {\n            var ya = ((this._tickerInSidebarMode || !!w.byClass(this._root, \"fixed_elem\")));\n            this._dialog.setPosition(this._getPositionForDialog());\n            this._dialog.setFixed(ya);\n            this._adjustFlyoutContentHeight();\n            this._dialog.updatePosition();\n        },\n        _writeSwfFrame: function(ya) {\n            var za = ((this._dialog && this._dialog.getContent())), ab = p.scry(za, \".swfObject\")[0];\n            if (!ab) {\n                return;\n            }\n        ;\n        ;\n            var bb = ab.getAttribute(\"data-swfid\");\n            if (((bb && window[bb]))) {\n                var cb = window[bb];\n                cb.write(ab);\n            }\n        ;\n        ;\n        },\n        _initCommentFocusListener: function() {\n            var ya = ((this._dialog && this._dialog.getContent())), za = ((ya && p.scry(ya, \".tickerDialogFooter textarea\")[0]));\n            if (!za) {\n                return;\n            }\n        ;\n        ;\n            this._listeners.inputFocus = g.listen(za, \"JSBNG__focus\", this._scrollDialogToBottom.bind(this));\n        },\n        _cleanupInputFocusListener: function() {\n            if (this._listeners.inputFocus) {\n                this._listeners.inputFocus.remove();\n                this._listeners.inputFocus = null;\n            }\n        ;\n        ;\n        },\n        _initContentResizeListener: function() {\n            var ya = ((this._dialog && this._dialog.getContent()));\n            if (!ya) {\n                return;\n            }\n        ;\n        ;\n            this._listeners.contentResize = g.listen(ya, \"click\", function() {\n                this._dialog.updatePosition.bind(this._dialog).defer();\n            }.bind(this));\n        },\n        _cleanupContentResizeListener: function() {\n            if (this._listeners.contentResize) {\n                this._listeners.contentResize.remove();\n                this._listeners.contentResize = null;\n            }\n        ;\n        ;\n        },\n        _adjustFlyoutContentHeight: function() {\n            var ya = ((this._dialog && this._dialog.getContent())), za = ((ya && p.scry(ya, \".uiScrollableAreaWrap\")[0]));\n            if (!za) {\n                return;\n            }\n        ;\n        ;\n            var ab = ha.getElementDimensions(za), bb = ha.getElementPosition(za), cb = p.scry(za, \".uiUfi .uiUfiComment\"), db = ((ha.getViewportDimensions().y - this.FLYOUT_VIEWPORT_PADDING)), eb = Math.min(this.FLYOUT_MAX_HEIGHT, db), fb = ((eb - this.FLYOUT_TARGET_HEIGHT_OFFSET));\n            for (var gb = 0; ((gb < cb.length)); gb++) {\n                var hb = cb[gb], ib = ha.getElementPosition(hb), jb = ((ib.y - bb.y));\n                if (((Math.abs(((jb - fb))) <= this.FLYOUT_OFFSET_THRESHOLD))) {\n                    fb = ((jb + this.FLYOUT_COMMENT_OFFSET));\n                    break;\n                }\n            ;\n            ;\n            };\n        ;\n            if (((ab.y > fb))) {\n                aa.set(za, \"height\", ((fb + \"px\")));\n                aa.set(za, \"max-height\", null);\n            }\n             else {\n                aa.set(za, \"max-height\", ((eb + \"px\")));\n                aa.set(za, \"height\", null);\n            }\n        ;\n        ;\n        },\n        _initObjectIDs: function() {\n            var ya = this._getAllStories();\n            for (var za = 0; ((za < ya.length)); ++za) {\n                var ab = ya[za].getAttribute(\"data-story-key\");\n                ((ab && (this._objectIDs[ab] = true)));\n            };\n        ;\n        },\n        _handleChatOpened: function() {\n            this._deactivateStory(true);\n        },\n        _handleChannelConnection: function() {\n            this._checkChannelConnection();\n        },\n        getNewest: function() {\n            return this._newest;\n        }\n    });\n    e.exports = xa;\n});\n__d(\"legacy:TickerController\", [\"TickerController\",], function(a, b, c, d) {\n    a.TickerController = b(\"TickerController\");\n}, 3);\n__d(\"HomeTickerFirstRightColumnController\", [\"$\",\"ge\",\"debounceAcrossTransitions\",\"throttle\",\"UIPagelet\",\"Arbiter\",\"Style\",\"csx\",\"CSS\",\"DOM\",\"Vector\",\"Run\",\"LegacyContextualDialog\",\"TickerController\",\"UIIntentionalStreamMessage\",\"JSBNG__Event\",], function(a, b, c, d, e, f) {\n    var g = b(\"$\"), h = b(\"ge\"), i = b(\"debounceAcrossTransitions\"), j = b(\"throttle\"), k = b(\"UIPagelet\"), l = b(\"Arbiter\"), m = b(\"Style\"), n = b(\"csx\"), o = b(\"CSS\"), p = b(\"DOM\"), q = b(\"Vector\"), r = b(\"Run\"), s = b(\"LegacyContextualDialog\"), t = b(\"TickerController\"), u = b(\"UIIntentionalStreamMessage\"), v = b(\"JSBNG__Event\"), w = null, x = 75, y = 50, z = 15, aa = false, ba = false, ca, da, ea, fa, ga, ha, ia, ja, ka, la = y, ma = [], na = [], oa, pa, qa, ra, sa, ta, ua, va, wa, xa, ya, za, ab;\n    function bb() {\n        var sb = ob;\n        function tb() {\n            sb.defer();\n        };\n    ;\n        var ub = p.scry(ra, \"img.img\");\n        ub.forEach(function(vb) {\n            if (!vb.complete) {\n                v.listen(vb, {\n                    load: tb,\n                    error: tb,\n                    abort: tb\n                });\n            }\n        ;\n        ;\n        });\n        tb();\n    };\n;\n    function cb() {\n        na = [l.subscribe(\"page_transition\", fb),l.subscribe(\"netego_loaded\", ob),l.subscribe(\"Ticker/storiesInserted\", ob),l.subscribe(u.INSERT_STORIES, ob),];\n        if (w.enableSidebar) {\n            na.push(l.subscribe(\"sidebar/hide\", pb));\n            na.push(l.subscribe(\"sidebar/show\", qb));\n        }\n    ;\n    ;\n    };\n;\n    function db() {\n        if (ra) {\n            var sb = p.scry(ra, \"div._4u8\");\n            for (var tb = 0; ((tb < sb.length)); tb++) {\n                var ub = JSON.parse(sb[tb].getAttribute(\"data-ad\")).segment;\n                if (((ub === \"premium\"))) {\n                    return true;\n                }\n            ;\n            ;\n            };\n        ;\n        }\n    ;\n    ;\n        return false;\n    };\n;\n    function eb() {\n        ab = p.scry(JSBNG__document, \"div.fbRemindersContent\");\n        va = p.scry(h(\"rightCol\"), \"div.home_right_column\")[0];\n        wa = p.JSBNG__find(va, \"div.rightColumnWrapper\");\n        ra = ((h(\"pagelet_ego_pane_w\") || h(\"pagelet_ego_pane_m\")));\n        fa = !db();\n        v.listen(ra, \"mouseenter\", function() {\n            aa = true;\n        });\n        v.listen(ra, \"mouseleave\", function() {\n            aa = false;\n        });\n        sa = h(\"pagelet_rhc_ticker\");\n        if (!sa) {\n            return false;\n        }\n    ;\n    ;\n        ta = p.scry(sa, \".ticker_container\")[0];\n        ua = p.scry(sa, \".ticker_stream\")[0];\n        return ((ta && ua));\n    };\n;\n    function fb(sb, tb) {\n        if (((((((sb === \"page_transition\")) && tb)) && tb.uri))) {\n            var ub = tb.uri;\n            if (((ub.path === \"/photo.php\"))) {\n                ba = true;\n                return;\n            }\n        ;\n        ;\n            if (((ba && ((ub.path === \"/\"))))) {\n                ba = false;\n                return;\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n        na.forEach(l.unsubscribe);\n        na = [];\n        ma.forEach(function(vb) {\n            vb.remove();\n        });\n        ma = [];\n        oa.reset();\n    };\n;\n    function gb() {\n        if (((ja || !ca))) {\n            ka = ((q.getElementPosition(ra, \"viewport\").y - q.getElementPosition(wa, \"viewport\").y));\n        }\n    ;\n    ;\n    };\n;\n    function hb() {\n        gb();\n        var sb = la;\n        lb();\n        if (((sb != la))) {\n            ja = true;\n            mb();\n        }\n    ;\n    ;\n        za = ((xa + q.getElementPosition(qa, \"viewport\").y));\n        var tb = za, ub = q.getElementPosition(va, \"viewport\").y;\n        for (var vb = 0; ((vb < ab.length)); vb++) {\n            var wb = s.getInstance(ab[vb]);\n            wb.hide();\n        };\n    ;\n        if (((da || !ua))) {\n            if (((ia !== null))) {\n                var xb = ((ub + ka)), yb = ((xb <= ((tb - ia))));\n                if (((ja || ((yb !== ca))))) {\n                    ja = false;\n                    var zb = ((((tb - ia)) - ka));\n                    nb(yb, zb);\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            return;\n        }\n    ;\n    ;\n        var ac = ((ub <= ((tb + z))));\n        if (((ac !== ca))) {\n            nb(ac);\n        }\n    ;\n    ;\n    };\n;\n    function ib() {\n        var sb = JSBNG__Date.now();\n        if (((((((fa && !aa)) && w.adsRefreshInterval)) && ((((sb - ga)) >= w.adsRefreshInterval))))) {\n            jb();\n        }\n    ;\n    ;\n    };\n;\n    function jb() {\n        ga = JSBNG__Date.now();\n        k.loadFromEndpoint(\"WebEgoPane\", ra, {\n            pid: 27,\n            data: {\n                organic_only: false,\n                ads_only: false,\n                refresh_num: ++ha\n            }\n        }, {\n            bundle: false,\n            crossPage: false,\n            handler: bb\n        });\n    };\n;\n    function kb() {\n        ja = true;\n        gb();\n        lb();\n        mb();\n        hb();\n    };\n;\n    function lb() {\n        var sb = ((q.getDocumentDimensions().y - ((q.getScrollPosition(\"JSBNG__document\").y + q.getViewportDimensions().y))));\n        la = ((((sb > ya)) ? y : x));\n    };\n;\n    function mb() {\n        var sb = ((((q.getViewportDimensions().y - xa)) - la)), tb = q.getElementDimensions(wa).y;\n        if (((tb <= sb))) {\n            ia = ((((0 - ka)) - z));\n            return;\n        }\n    ;\n    ;\n        var ub = ((tb - ka)), vb = p.scry(ra, \"div.egoOrganicColumn\")[0];\n        if (((((ub <= sb)) && vb))) {\n            ia = 0;\n        }\n         else {\n            var wb = p.scry(ra, \"div.ego_unit\").reverse(), xb = p.scry(ra, \"div._4u8\").length, yb = w.maxFixedAds;\n            if (((xb <= w.maxFixedAds))) {\n                yb = wb.length;\n            }\n        ;\n        ;\n            var zb = null;\n            for (var ac = 0; ((ac < yb)); ac++) {\n                var bc = wb[ac], cc = ((q.getElementPosition(bc, \"viewport\").y - q.getElementPosition(wa, \"viewport\").y)), dc = ((q.getElementDimensions(wa).y - cc));\n                if (((dc > sb))) {\n                    if (((ac > 0))) {\n                        zb = wb[((ac - 1))];\n                    }\n                ;\n                ;\n                    break;\n                }\n            ;\n            ;\n                if (((ac == ((yb - 1))))) {\n                    zb = bc;\n                }\n            ;\n            ;\n            };\n        ;\n            if (((zb == null))) {\n                ia = null;\n            }\n             else ia = ((q.getElementPosition(zb, \"viewport\").y - q.getElementPosition(ra, \"viewport\").y));\n        ;\n        ;\n        }\n    ;\n    ;\n    };\n;\n    function nb(sb, tb) {\n        ca = sb;\n        tb = ((tb || za));\n        var ub = ((sb ? ((tb + \"px\")) : \"\"));\n        m.set(wa, \"JSBNG__top\", ub);\n        o.conditionClass(wa, \"fixed_elem\", sb);\n        var vb = p.scry(wa, \"div.displayedTickerToggleWrapper\")[0];\n        ((vb && o.conditionClass(vb, \"toggleWrapperWithoutMargin\", ((sb && !ua)))));\n        if (ea) {\n            var wb = ((sb ? \"Ticker/fixed\" : \"Ticker/unfixed\"));\n            l.inform(wb);\n        }\n    ;\n    ;\n    };\n;\n    function ob() {\n        if (((((!ea || !ua)) || o.hasClass(JSBNG__document.documentElement, \"tinyViewport\")))) {\n            kb();\n            return;\n        }\n    ;\n    ;\n        hb();\n        var sb = q.getViewportDimensions().y, tb = 61, ub = ((q.getElementDimensions(wa).y - q.getElementDimensions(ta).y)), vb = q.getElementDimensions(ua).y, wb = ((((((((sb - ub)) - x)) - za)) - tb)), xb = ((w.tickerAbsMinHeight || 120)), yb = ((w.tickerMinHeight || 225));\n        da = false;\n        if (((wb < xb))) {\n            da = true;\n            nb(false);\n            wb = xb;\n        }\n         else if (((wb < yb))) {\n            if (((wb > ((yb - tb))))) {\n                wb = yb;\n            }\n             else wb += tb;\n        ;\n        }\n        \n    ;\n    ;\n        var zb = Math.min(wb, vb, ((w.tickerMaxHeight || 425)));\n        m.set(ta, \"height\", ((zb + \"px\")));\n    };\n;\n    function pb() {\n        ea = true;\n        eb();\n        var sb = function() {\n            if (eb()) {\n                da = false;\n                hb();\n                ob();\n            }\n        ;\n        ;\n        };\n        ((sa && t.show(sa, sb)));\n    };\n;\n    function qb() {\n        ea = false;\n        eb();\n        kb();\n        ((sa && t.hide(sa)));\n    };\n;\n    var rb = {\n        init: function(sb) {\n            w = sb;\n            pa = g(\"contentCol\");\n            qa = g(\"blueBar\");\n            ha = 0;\n            ga = Infinity;\n            ga = JSBNG__Date.now();\n            oa = i(ib, w.adsRefreshDelay);\n            if (w.adsRefreshOnmove) {\n                ma.push(v.listen(window, \"mousemove\", oa));\n            }\n        ;\n        ;\n            ma.push(v.listen(window, \"JSBNG__scroll\", oa));\n            ma.push(v.listen(window, \"resize\", oa));\n            ma.push(v.listen(window, \"resize\", j(ob)));\n            xa = q.getElementDimensions(qa).y;\n            ya = q.getElementDimensions(g(\"pageFooter\")).y;\n            eb();\n            cb();\n            r.onLeave(fb);\n            ma.push(v.listen(window, \"JSBNG__scroll\", j(hb)));\n            if (!o.hasClass(JSBNG__document.documentElement, \"sidebarMode\")) {\n                pb();\n            }\n             else if (w.enableSidebar) {\n                qb();\n            }\n            \n        ;\n        ;\n            bb();\n        }\n    };\n    e.exports = rb;\n});\n__d(\"AsyncLayout\", [\"AjaxPipeRequest\",\"Arbiter\",\"AsyncRequest\",\"AsyncResponse\",\"CSS\",\"DOM\",\"HTML\",\"NavigationMessage\",\"PageTransitions\",\"URI\",\"$\",\"copyProperties\",\"emptyFunction\",\"ge\",\"goURI\",], function(a, b, c, d, e, f) {\n    var g = b(\"AjaxPipeRequest\"), h = b(\"Arbiter\"), i = b(\"AsyncRequest\"), j = b(\"AsyncResponse\"), k = b(\"CSS\"), l = b(\"DOM\"), m = b(\"HTML\"), n = b(\"NavigationMessage\"), o = b(\"PageTransitions\"), p = b(\"URI\"), q = b(\"$\"), r = b(\"copyProperties\"), s = b(\"emptyFunction\"), t = b(\"ge\"), u = b(\"goURI\");\n    function v(w) {\n        this.canvasID = w;\n        if (t(\"rightCol\")) {\n            this.auxiliaryID = \"rightCol\";\n        }\n    ;\n    ;\n        if (t(\"headerArea\")) {\n            this.headerID = \"headerArea\";\n        }\n    ;\n    ;\n        if (t(\"toolbarContainer\")) {\n            this.toolbarID = \"toolbarContainer\";\n        }\n    ;\n    ;\n        this.waitingForAux = false;\n        o.registerHandler(this.catchPageTransition.bind(this));\n        this.subscription = h.subscribe(n.NAVIGATION_BEGIN, this.onNavigate.bind(this));\n    };\n;\n    r(v.prototype, {\n        catchPageTransition: function(w) {\n            this.subscription.unsubscribe();\n            return false;\n        },\n        getCanvasID: function(w) {\n            return ((w.sidecol ? \"contentCol\" : \"contentArea\"));\n        },\n        onNavigate: function(w, x) {\n            var y = x.useAjaxPipe;\n            x = x.params;\n            if (x.endpoint) {\n                if (this.request) {\n                    this.request.setFinallyHandler(s);\n                    this.request.abort();\n                }\n            ;\n            ;\n                if (this.sideRequest) {\n                    this.sideRequest.abort();\n                }\n            ;\n            ;\n                if (y) {\n                    this.request = new g().setURI(x.endpoint).setData(x).setCanvasId(this.getCanvasID(x)).setFinallyHandler(this.finallyHandler.bind(this)).setErrorHandler(this.errorHandler.bind(this)).setFirstResponseCallback(this.firstResponseCallback.bind(this)).send();\n                }\n                 else {\n                    x.handled = true;\n                    this.waitingForAux = x.sidecol;\n                    var z = !!x.iframe, aa = new i().setOption(\"useIframeTransport\", z).setURI(new p(x.endpoint)).setReadOnly(true).setMethod(\"GET\").setData(x).setHandler(this.onResponse.bind(this)).setErrorHandler(this.errorHandler.bind(this)).setFinallyHandler(this.finallyHandler.bind(this));\n                    this.request = aa;\n                    aa.send();\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n        },\n        onSideResponse: function(w) {\n            var x = w.getPayload();\n            if (((x && this.auxiliaryID))) {\n                this.receivedAux(x);\n            }\n        ;\n        ;\n        },\n        receivedAux: function(w) {\n            !this.waitingForAux;\n            this.waitingForAux = false;\n            l.setContent(q(this.auxiliaryID), m(w));\n        },\n        onResponse: function(w) {\n            var x = w.getPayload();\n            if (x.redirect) {\n                u(x.redirect);\n            }\n             else {\n                var y = ((x.html || x));\n                l.setContent(q(this.canvasID), m(y));\n                if (((x.side_html && this.auxiliaryID))) {\n                    this.receivedAux(x.side_html);\n                }\n            ;\n            ;\n                if (((this.headerID && !x.keep_header))) {\n                    var z = q(this.headerID);\n                    l.setContent(z, m(((x.header_html || \"\"))));\n                    k.conditionShow(z, x.header_html);\n                }\n            ;\n            ;\n                if (((x.toolbar_html && this.toolbarID))) {\n                    l.setContent(q(this.toolbarID), m(x.toolbar_html));\n                }\n            ;\n            ;\n                if (x.js) {\n                    (new Function(x.js))();\n                }\n            ;\n            ;\n                k.conditionClass(\"contentCol\", \"hasRightCol\", ((this.auxiliaryID && !x.noRightSide)));\n                var aa = t(\"rightCol\");\n                if (((aa && x.noRightSide))) {\n                    l.empty(aa);\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            var ba = w.getRequest().getData();\n            h.inform(n.NAVIGATION_COMPLETED, ba.key);\n        },\n        errorHandler: function(w) {\n            j.verboseErrorHandler(w);\n            h.inform(n.NAVIGATION_FAILED);\n            this.request = null;\n        },\n        firstResponseCallback: function(w) {\n            window.JSBNG__scrollTo(0, 0);\n            h.inform(n.NAVIGATION_FIRST_RESPONSE);\n        },\n        finallyHandler: function(w) {\n            this.request = null;\n            o.transitionComplete(true);\n            h.inform(n.NAVIGATION_COMPLETED);\n        }\n    });\n    e.exports = v;\n});\n__d(\"legacy:adware-scanner\", [\"AdwareScaner\",], function(a, b, c, d) {\n    a.AdwareScaner = b(\"AdwareScaner\");\n}, 3);");
// 2739
geval("if (JSBNG__self.CavalryLogger) {\n    CavalryLogger.start_js([\"u//Ut\",]);\n}\n;\n;\n__d(\"MercuryAPIArgsSource\", [], function(a, b, c, d, e, f) {\n    e.exports = {\n        JEWEL: \"jewel\",\n        CHAT: \"chat\",\n        MERCURY: \"mercury\",\n        WEBMESSENGER: \"web_messenger\"\n    };\n});\n__d(\"MercuryActionStatus\", [], function(a, b, c, d, e, f) {\n    e.exports = {\n        UNCONFIRMED: 3,\n        UNSENT: 0,\n        RESENDING: 7,\n        RESENT: 6,\n        UNABLE_TO_CONFIRM: 5,\n        FAILED_UNKNOWN_REASON: 4,\n        SUCCESS: 1,\n        ERROR: 10\n    };\n});\n__d(\"MercuryActionTypeConstants\", [], function(a, b, c, d, e, f) {\n    e.exports = {\n        LOG_MESSAGE: \"ma-type:log-message\",\n        CLEAR_CHAT: \"ma-type:clear_chat\",\n        UPDATE_ACTION_ID: \"ma-type:update-action-id\",\n        DELETE_MESSAGES: \"ma-type:delete-messages\",\n        CHANGE_FOLDER: \"ma-type:change-folder\",\n        SEND_MESSAGE: \"ma-type:send-message\",\n        CHANGE_ARCHIVED_STATUS: \"ma-type:change-archived-status\",\n        DELETE_THREAD: \"ma-type:delete-thread\",\n        USER_GENERATED_MESSAGE: \"ma-type:user-generated-message\",\n        CHANGE_READ_STATUS: \"ma-type:change_read_status\",\n        CHANGE_MUTE_SETTINGS: \"ma-type:change-mute-settings\"\n    };\n});\n__d(\"MercuryAttachmentContentType\", [], function(a, b, c, d, e, f) {\n    e.exports = {\n        UNKNOWN: \"attach:unknown\",\n        PHOTO: \"attach:image\",\n        VIDEO: \"attach:video\",\n        MSWORD: \"attach:ms:word\",\n        VOICE: \"attach:voice\",\n        MSPPT: \"attach:ms:ppt\",\n        TEXT: \"attach:text\",\n        MUSIC: \"attach:music\",\n        MSXLS: \"attach:ms:xls\"\n    };\n});\n__d(\"MercuryAttachmentType\", [], function(a, b, c, d, e, f) {\n    e.exports = {\n        STICKER: \"sticker\",\n        PHOTO: \"photo\",\n        FILE: \"file\",\n        SHARE: \"share\",\n        ERROR: \"error\"\n    };\n});\n__d(\"MercuryErrorType\", [], function(a, b, c, d, e, f) {\n    e.exports = {\n        SERVER: 1,\n        TRANSPORT: 2,\n        TIMEOUT: 3\n    };\n});\n__d(\"MercuryGenericConstants\", [], function(a, b, c, d, e, f) {\n    e.exports = {\n        PENDING_THREAD_ID: \"pending:pending\"\n    };\n});\n__d(\"MercuryGlobalActionType\", [], function(a, b, c, d, e, f) {\n    e.exports = {\n        MARK_ALL_READ: \"mga-type:mark-all-read\"\n    };\n});\n__d(\"MercuryLogMessageType\", [], function(a, b, c, d, e, f) {\n    e.exports = {\n        SERVER_ERROR: \"log:error-msg\",\n        UNSUBSCRIBE: \"log:unsubscribe\",\n        JOINABLE_JOINED: \"log:joinable-joined\",\n        JOINABLE_CREATED: \"log:joinable-created\",\n        LIVE_LISTEN: \"log:live-listen\",\n        PHONE_CALL: \"log:phone-call\",\n        THREAD_IMAGE: \"log:thread-image\",\n        THREAD_NAME: \"log:thread-name\",\n        VIDEO_CALL: \"log:video-call\",\n        SUBSCRIBE: \"log:subscribe\"\n    };\n});\n__d(\"MercuryMessageSourceTags\", [], function(a, b, c, d, e, f) {\n    e.exports = {\n        CHAT: \"source:chat\",\n        MOBILE: \"source:mobile\",\n        MESSENGER: \"source:messenger\",\n        EMAIL: \"source:email\"\n    };\n});\n__d(\"MercuryParticipantTypes\", [], function(a, b, c, d, e, f) {\n    e.exports = {\n        FRIEND: \"friend\",\n        USER: \"user\",\n        THREAD: \"thread\",\n        EVENT: \"JSBNG__event\",\n        PAGE: \"page\"\n    };\n});\n__d(\"MercuryPayloadSource\", [], function(a, b, c, d, e, f) {\n    e.exports = {\n        SERVER_INITIAL_DATA: \"server_initial_data\",\n        CLIENT_DELETE_THREAD: \"client_delete_thread\",\n        SERVER_ZAP: \"server_zap\",\n        SERVER_SAVE_DRAFT: \"server_save_draft\",\n        SERVER_CHANGE_ARCHIVED_STATUS: \"server_change_archived_status\",\n        SERVER_SEARCH: \"server_search\",\n        CLIENT_CHANGE_MUTE_SETTINGS: \"client_change_mute_settings\",\n        SERVER_UNREAD_THREADS: \"server_unread_threads\",\n        SERVER_MARK_SEEN: \"server_mark_seen\",\n        SERVER_THREAD_SYNC: \"server_thread_sync\",\n        CLIENT_DELETE_MESSAGES: \"client_delete_messages\",\n        SERVER_FETCH_THREADLIST_INFO: \"server_fetch_threadlist_info\",\n        CLIENT_CHANNEL_MESSAGE: \"client_channel_message\",\n        CLIENT_CHANGE_FOLDER: \"client_change_folder\",\n        CLIENT_CHANGE_READ_STATUS: \"client_change_read_status\",\n        CLIENT_CLEAR_CHAT: \"client_clear_chat\",\n        SERVER_FETCH_THREAD_INFO: \"server_fetch_thread_info\",\n        SERVER_CHANGE_READ_STATUS: \"server_change_read_status\",\n        SERVER_SEND_MESSAGE: \"server_send_message\",\n        CLIENT_SAVE_DRAFT: \"client_save_draft\",\n        UNKNOWN: \"unknown\",\n        SERVER_MARK_FOLDER_READ: \"server_mark_folder_read\",\n        SERVER_CONFIRM_MESSAGES: \"server_confirm_messages\",\n        SERVER_TAB_PRESENCE: \"server_tab_presence\",\n        CLIENT_CHANGE_ARCHIVED_STATUS: \"client_change-archived_status\",\n        CLIENT_SEND_MESSAGE: \"client_send_message\",\n        CLIENT_HANDLE_ERROR: \"client_handle_error\"\n    };\n});\n__d(\"MercurySourceType\", [], function(a, b, c, d, e, f) {\n    e.exports = {\n        GIGABOXX_BLAST: \"source:gigaboxx:blast\",\n        TITAN_FACEWEB_BUFFY: \"source:titan:faceweb_buffy\",\n        TITAN_FACEWEB_UNKNOWN: \"source:titan:faceweb_unknown\",\n        CHAT_WEB: \"source:chat:web\",\n        WEBRTC_MOBILE: \"source:webrtc:mobile\",\n        GIGABOXX_API: \"source:gigaboxx:api\",\n        TITAN_M_JAPAN: \"source:titan:m_japan\",\n        BUFFY_SMS: \"source:buffy:sms\",\n        SEND_PLUGIN: \"source:sendplugin\",\n        CHAT_MEEBO: \"source:chat:meebo\",\n        TITAN_FACEWEB_IPAD: \"source:titan:faceweb_ipad\",\n        TITAN_FACEWEB_IPHONE: \"source:titan:faceweb_iphone\",\n        TEST: \"source:test\",\n        WEB: \"source:web\",\n        SOCIALFOX: \"source:socialfox\",\n        EMAIL: \"source:email\",\n        TITAN_API: \"source:titan:api\",\n        GIGABOXX_WEB: \"source:gigaboxx:web\",\n        DESKTOP: \"source:desktop\",\n        TITAN_FACEWEB_ANDROID: \"source:titan:faceweb_android\",\n        LEIA: \"source:leia\",\n        CHAT_JABBER: \"source:chat:jabber\",\n        CHAT_TEST: \"source:chat:test\",\n        SHARE_DIALOG: \"source:share:dialog\",\n        GIGABOXX_WAP: \"source:gigaboxx:wap\",\n        CHAT: \"source:chat\",\n        TITAN_M_APP: \"source:titan:m_app\",\n        TITAN_M_TOUCH: \"source:titan:m_touch\",\n        TITAN_ORCA: \"source:titan:orca\",\n        TITAN_WAP: \"source:titan:wap\",\n        TITAN_EMAIL_REPLY: \"source:titan:emailreply\",\n        CHAT_IPHONE: \"source:chat:iphone\",\n        SMS: \"source:sms\",\n        TITAN_M_BASIC: \"source:titan:m_basic\",\n        TITAN_M_MINI: \"source:titan:m_mini\",\n        GIGABOXX_MOBILE: \"source:gigaboxx:mobile\",\n        UNKNOWN: \"source:unknown\",\n        TITAN_WEB: \"source:titan:web\",\n        TITAN_M_ZERO: \"source:titan:m_zero\",\n        MOBILE: \"source:mobile\",\n        PAID_PROMOTION: \"source:paid_promotion\",\n        TITAN_API_MOBILE: \"source:titan:api_mobile\",\n        HELPCENTER: \"source:helpcenter\",\n        GIGABOXX_EMAIL_REPLY: \"source:gigaboxx:emailreply\",\n        CHAT_ORCA: \"source:chat:orca\",\n        TITAN_M_TALK: \"source:titan:m_talk\",\n        NEW_SHARE_DIALOG: \"source:share:dialog:new\"\n    };\n});\n__d(\"MercuryThreadMode\", [], function(a, b, c, d, e, f) {\n    e.exports = {\n        EMAIL_ORIGINATED: 1,\n        OBJECT_ORIGINATED: 3,\n        TITAN_ORIGINATED: 2\n    };\n});\n__d(\"MercuryTimePassed\", [], function(a, b, c, d, e, f) {\n    e.exports = {\n        TODAY: 0,\n        WEEK_AGO: 1,\n        CURRENT_YEAR: 3,\n        OTHER_YEAR: 4,\n        MONTH_AGO: 2\n    };\n});\n__d(\"MessagingEvent\", [], function(a, b, c, d, e, f) {\n    e.exports = {\n        UNSUBSCRIBE: \"unsubscribe\",\n        DELIVERY_RECEIPT: \"delivery_receipt\",\n        REPORT_SPAM_MESSAGES: \"report_spam_messages\",\n        DELIVER_FAST_PAST: \"deliver_fast_path\",\n        DELETE_MESSAGES: \"delete_messages\",\n        READ_RECEIPT: \"read_receipt\",\n        SENT_PUSH: \"sent_push\",\n        READ: \"read\",\n        CHANGE_MUTE_SETTINGS: \"change_mute_settings\",\n        ERROR: \"error\",\n        UNMARK_SPAM: \"unmark_spam\",\n        UNREAD: \"unread\",\n        DELIVER_LOG: \"deliver_log\",\n        DELIVER: \"deliver\",\n        READ_ALL: \"read_all\",\n        TAG: \"tag\",\n        MORE_THREADS: \"more_threads\",\n        DELETE: \"delete\",\n        REPORT_SPAM: \"report_spam\",\n        SUBSCRIBE: \"subscribe\"\n    };\n});\n__d(\"MessagingTag\", [], function(a, b, c, d, e, f) {\n    e.exports = {\n        MTA_SYSTEM_MESSAGE: \"MTA:system_message\",\n        SENT: \"sent\",\n        INBOX: \"inbox\",\n        SMS_TAG_ROOT: \"SMSShortcode:\",\n        UPDATES: \"broadcasts_inbox\",\n        OTHER: \"other\",\n        GROUPS: \"groups\",\n        FILTERED_CONTENT: \"filtered_content\",\n        ACTION_ARCHIVED: \"action:archived\",\n        UNREAD: \"unread\",\n        BCC: \"header:bcc\",\n        SMS_MUTE: \"sms_mute\",\n        ARCHIVED: \"archived\",\n        DOMAIN_AUTH_PASS: \"MTA:dmarc:pass\",\n        EVENT: \"JSBNG__event\",\n        VOICEMAIL: \"voicemail\",\n        DOMAIN_AUTH_FAIL: \"MTA:dmarc:fail\",\n        SPAM_SPOOFING: \"spam:spoofing\",\n        SPOOF_WARNING: \"MTA:spoof_warning\",\n        SPAM: \"spam\",\n        EMAIL_MESSAGE: \"source:email\",\n        EMAIL: \"email\",\n        APP_ID_ROOT: \"app_id:\"\n    };\n});\n__d(\"AvailableListConstants\", [], function(a, b, c, d, e, f) {\n    var g = {\n        ON_AVAILABILITY_CHANGED: \"buddylist/availability-changed\",\n        ON_UPDATE_ERROR: \"buddylist/update-error\",\n        ON_UPDATED: \"buddylist/updated\",\n        ON_CHAT_NOTIFICATION_CHANGED: \"chat-notification-changed\",\n        OFFLINE: 0,\n        IDLE: 1,\n        ACTIVE: 2,\n        MOBILE: 3,\n        LEGACY_OVERLAY_OFFLINE: -1,\n        LEGACY_OVERLAY_ONLINE: 0,\n        LEGACY_OVERLAY_IDLE: 1,\n        legacyStatusMap: {\n            0: 2,\n            1: 1,\n            \"-1\": 0,\n            2: 3\n        },\n        reverseLegacyStatusMap: {\n            0: -1,\n            1: 1,\n            2: 0,\n            3: 2\n        }\n    };\n    a.AvailableListConstants = e.exports = g;\n});\n__d(\"PresenceUtil\", [\"Cookie\",\"Env\",\"randomInt\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Cookie\"), h = b(\"Env\"), i = b(\"randomInt\"), j = b(\"tx\"), k = ((i(0, 4294967295) + 1)), l = {\n        checkMaintenanceError: function(m) {\n            if (((m.getError() == 1356007))) {\n                return true;\n            }\n        ;\n        ;\n            return false;\n        },\n        getErrorDescription: function(m) {\n            var n = m.getError(), o = m.getErrorDescription();\n            if (!o) {\n                o = \"An error occurred.\";\n            }\n        ;\n        ;\n            if (((n == 1357001))) {\n                o = \"Your session has timed out. Please log in.\";\n            }\n        ;\n        ;\n            return o;\n        },\n        getSessionID: function() {\n            return k;\n        },\n        hasUserCookie: function() {\n            return ((h.user === g.get(\"c_user\")));\n        }\n    };\n    e.exports = l;\n});\n__d(\"PresencePrivacy\", [\"hasArrayNature\",\"Arbiter\",\"AsyncRequest\",\"ChannelConstants\",\"copyProperties\",\"Env\",\"JSLogger\",\"PresenceUtil\",\"PresencePrivacyInitialData\",], function(a, b, c, d, e, f) {\n    var g = b(\"hasArrayNature\"), h = b(\"Arbiter\"), i = b(\"AsyncRequest\"), j = b(\"ChannelConstants\"), k = b(\"copyProperties\"), l = b(\"Env\"), m = b(\"JSLogger\"), n = b(\"PresenceUtil\"), o = b(\"PresencePrivacyInitialData\"), p = \"/ajax/chat/privacy/settings.php\", q = \"/ajax/chat/privacy/online_policy.php\", r = \"/ajax/chat/privacy/visibility.php\", s = \"friend_visibility\", t = \"visibility\", u = \"online_policy\", v = k({\n    }, o.privacyData), w = o.visibility, x = k({\n    }, o.privacyData), y = w, z = o.onlinePolicy, aa = z, ba = [], ca = false;\n    function da() {\n        return m.create(\"blackbird\");\n    };\n;\n    var ea = k(new h(), {\n        WHITELISTED: 1,\n        BLACKLISTED: -1,\n        UNLISTED: 0,\n        ONLINE: 1,\n        OFFLINE: 0,\n        ONLINE_TO_WHITELIST: 0,\n        ONLINE_TO_BLACKLIST: 1\n    });\n    function fa(ra) {\n        var sa;\n        {\n            var fin145keys = ((window.top.JSBNG_Replay.forInKeys)((ra))), fin145i = (0);\n            (0);\n            for (; (fin145i < fin145keys.length); (fin145i++)) {\n                ((sa) = (fin145keys[fin145i]));\n                {\n                    var ta = ra[sa];\n                    if (((sa == l.user))) {\n                        da().error(\"set_viewer_visibility\");\n                        throw new Error(\"Invalid to set current user's visibility\");\n                    }\n                ;\n                ;\n                    switch (ta) {\n                      case ea.WHITELISTED:\n                    \n                      case ea.BLACKLISTED:\n                    \n                      case ea.UNLISTED:\n                        break;\n                      default:\n                        da().error(\"set_invalid_friend_visibility\", {\n                            id: sa,\n                            value: ta\n                        });\n                        throw new Error(((\"Invalid state: \" + ta)));\n                    };\n                ;\n                };\n            };\n        };\n    ;\n        {\n            var fin146keys = ((window.top.JSBNG_Replay.forInKeys)((ra))), fin146i = (0);\n            (0);\n            for (; (fin146i < fin146keys.length); (fin146i++)) {\n                ((sa) = (fin146keys[fin146i]));\n                {\n                    v[sa] = ra[sa];\n                ;\n                };\n            };\n        };\n    ;\n        ea.inform(\"privacy-changed\");\n    };\n;\n    function ga(ra, sa) {\n        var ta = {\n        };\n        ta[ra] = sa;\n        fa(ta);\n    };\n;\n    function ha(ra) {\n        switch (ra) {\n          case ea.ONLINE:\n        \n          case ea.OFFLINE:\n            break;\n          default:\n            da().error(\"set_invalid_visibility\", {\n                value: ra\n            });\n            throw new Error(((\"Invalid visibility: \" + ra)));\n        };\n    ;\n        w = ra;\n        ea.inform(\"privacy-changed\");\n        ea.inform(\"privacy-user-presence-changed\");\n        h.inform(\"chat/visibility-changed\", {\n            sender: this\n        });\n    };\n;\n    function ia(ra) {\n        switch (ra) {\n          case ea.ONLINE_TO_WHITELIST:\n        \n          case ea.ONLINE_TO_BLACKLIST:\n            break;\n          default:\n            throw new Error(((\"Invalid default online policy: \" + ra)));\n        };\n    ;\n        z = ra;\n        ea.inform(\"privacy-user-presence-changed\");\n        ea.inform(\"privacy-changed\");\n    };\n;\n    function ja(ra, sa) {\n        ca = true;\n        ra.send();\n    };\n;\n    function ka(ra, sa) {\n        ba.push({\n            request: ra,\n            data: sa\n        });\n        if (!ca) {\n            var ta = ba.shift();\n            ja(ta.request, ta.data);\n        }\n    ;\n    ;\n    };\n;\n    function la(ra, sa) {\n        var ta = ra.type;\n        if (((ta === s))) {\n            var ua = sa.payload.user_availabilities;\n            if (!g(ua)) {\n                ea.inform(\"privacy-availability-changed\", {\n                    user_availabilities: ua\n                });\n                {\n                    var fin147keys = ((window.top.JSBNG_Replay.forInKeys)((ra.settings))), fin147i = (0);\n                    var va;\n                    for (; (fin147i < fin147keys.length); (fin147i++)) {\n                        ((va) = (fin147keys[fin147i]));\n                        {\n                            x[va] = ra.settings[va];\n                        ;\n                        };\n                    };\n                };\n            ;\n            }\n        ;\n        ;\n        }\n         else {\n            if (((ta === t))) {\n                y = ra.visibility;\n            }\n             else if (((ta === u))) {\n                aa = ra.online_policy;\n            }\n            \n        ;\n        ;\n            ea.inform(\"privacy-user-presence-response\");\n        }\n    ;\n    ;\n        da().log(\"set_update_response\", {\n            data: ra,\n            response: sa\n        });\n    };\n;\n    function ma(ra, sa) {\n        if (((w !== y))) {\n            ha(y);\n        }\n    ;\n    ;\n        if (((z !== aa))) {\n            ia(aa);\n        }\n    ;\n    ;\n        k(v, x);\n        ea.inform(\"privacy-changed\");\n        ba = [];\n        da().log(\"set_error_response\", {\n            data: ra,\n            response: sa\n        });\n    };\n;\n    function na(ra) {\n        ca = false;\n        if (((ba.length > 0))) {\n            var sa = ba.shift();\n            ja(sa.request, sa.data);\n        }\n    ;\n    ;\n    };\n;\n    function oa(ra, sa) {\n        if (((n != null))) {\n            var ta = ra.getData();\n            ta.window_id = n.getSessionID();\n            ra.setData(ta);\n        }\n    ;\n    ;\n        ra.setHandler(la.bind(this, sa)).setErrorHandler(ma.bind(this, sa)).setTransportErrorHandler(ma.bind(this, sa)).setFinallyHandler(na.bind(this)).setAllowCrossPageTransition(true);\n        return ra;\n    };\n;\n    function pa(ra, sa, ta) {\n        return oa(new i(ra).setData(sa), ta);\n    };\n;\n    function qa(ra, sa) {\n        var ta = sa.obj;\n        if (((ta.viewer_id != l.user))) {\n            da().error(\"invalid_viewer_for_channel_message\", {\n                type: ra,\n                data: sa\n            });\n            throw new Error(\"Viewer got from the channel is not the real viewer\");\n        }\n    ;\n    ;\n        if (((ta.window_id === n.getSessionID()))) {\n            return;\n        }\n    ;\n    ;\n        var ua = ta.data;\n        if (((ta.JSBNG__event == \"access_control_entry\"))) {\n            ua.target_ids.forEach(function(wa) {\n                ga(wa, ua.setting);\n                x[wa] = ua.setting;\n            });\n        }\n         else {\n            if (((ta.JSBNG__event == \"visibility_update\"))) {\n                var va = ((!!ua.visibility ? ea.ONLINE : ea.OFFLINE));\n                ha(va);\n                y = va;\n            }\n             else if (((ta.JSBNG__event == \"online_policy_update\"))) {\n                ia(ua.online_policy);\n                aa = ua.online_policy;\n            }\n            \n        ;\n        ;\n            ea.inform(\"privacy-user-presence-response\");\n        }\n    ;\n    ;\n        da().log(\"channel_message_received\", {\n            data: sa.obj\n        });\n    };\n;\n    k(ea, {\n        WHITELISTED: 1,\n        BLACKLISTED: -1,\n        UNLISTED: 0,\n        ONLINE: 1,\n        OFFLINE: 0,\n        ONLINE_TO_WHITELIST: 0,\n        ONLINE_TO_BLACKLIST: 1,\n        init: function(ra, sa, ta) {\n        \n        },\n        setVisibility: function(ra) {\n            y = w;\n            ha(ra);\n            var sa = {\n                visibility: ra\n            }, ta = {\n                type: t,\n                visibility: ra\n            }, ua = pa(r, sa, ta);\n            ka(ua, ta);\n            da().log(\"set_visibility\", {\n                data: sa\n            });\n            return ra;\n        },\n        getVisibility: function() {\n            return w;\n        },\n        setOnlinePolicy: function(ra) {\n            aa = z;\n            ia(ra);\n            var sa = {\n                online_policy: ra\n            }, ta = {\n                type: u,\n                online_policy: ra\n            }, ua = pa(q, sa, ta);\n            ka(ua, ta);\n            da().log(\"set_online_policy\", {\n                data: sa\n            });\n            return ra;\n        },\n        getOnlinePolicy: function() {\n            return z;\n        },\n        getFriendVisibility: function(ra) {\n            return ((v[ra] || ea.UNLISTED));\n        },\n        allows: function(ra) {\n            if (((this.getVisibility() === ea.OFFLINE))) {\n                return false;\n            }\n        ;\n        ;\n            var sa = this.getOnlinePolicy();\n            return ((((sa === ea.ONLINE_TO_WHITELIST)) ? ((v[ra] == ea.WHITELISTED)) : ((v[ra] != ea.BLACKLISTED))));\n        },\n        setFriendsVisibility: function(ra, sa) {\n            if (((ra.length > 0))) {\n                var ta = {\n                };\n                for (var ua = 0; ((ua < ra.length)); ua++) {\n                    var va = ra[ua];\n                    x[va] = v[va];\n                    ta[va] = sa;\n                };\n            ;\n                fa(ta);\n                var wa = sa;\n                if (((wa == ea.UNLISTED))) {\n                    wa = x[ra[0]];\n                }\n            ;\n            ;\n                var xa = {\n                    users: ra,\n                    setting: sa,\n                    setting_type: wa\n                }, ya = {\n                    type: s,\n                    settings: ta\n                }, za = pa(p, xa, ya);\n                ka(za, ya);\n                da().log(\"set_friend_visibility\", {\n                    data: xa\n                });\n            }\n        ;\n        ;\n            return sa;\n        },\n        setFriendVisibilityMap: function(ra, sa) {\n            {\n                var fin148keys = ((window.top.JSBNG_Replay.forInKeys)((ra))), fin148i = (0);\n                var ta;\n                for (; (fin148i < fin148keys.length); (fin148i++)) {\n                    ((ta) = (fin148keys[fin148i]));\n                    {\n                        x[ta] = v[ta];\n                    ;\n                    };\n                };\n            };\n        ;\n            fa(ra);\n            var ua = {\n                type: s,\n                settings: ra\n            };\n            ka(oa(sa, ua), ua);\n            da().log(\"set_friend_visibility_from_map\", {\n                data: ra\n            });\n        },\n        allow: function(ra) {\n            if (this.allows(ra)) {\n                da().error(\"allow_already_allowed\");\n                throw new Error(((\"allow() should only be called for users that \" + \"are not already allowed\")));\n            }\n        ;\n        ;\n            if (((this.getVisibility() === ea.OFFLINE))) {\n                da().error(\"allow_called_while_offline\");\n                throw new Error(\"allow() should only be called when the user is already online\");\n            }\n        ;\n        ;\n            var sa = ((((this.getOnlinePolicy() === ea.ONLINE_TO_WHITELIST)) ? ea.WHITELISTED : ea.UNLISTED));\n            return this.setFriendsVisibility([ra,], sa);\n        },\n        disallow: function(ra) {\n            if (!this.allows(ra)) {\n                da().error(\"disallow_already_disallowed\");\n                throw new Error(((\"disallow() should only be called for users that \" + \"are not already disallowed\")));\n            }\n        ;\n        ;\n            if (((this.getVisibility() === ea.OFFLINE))) {\n                da().error(\"disallow_called_while_offline\");\n                throw new Error(\"disallow() should only be called when the user is already online\");\n            }\n        ;\n        ;\n            var sa = ((((this.getOnlinePolicy() === ea.ONLINE_TO_BLACKLIST)) ? ea.BLACKLISTED : ea.UNLISTED));\n            return this.setFriendsVisibility([ra,], sa);\n        },\n        getBlacklist: function() {\n            var ra = [];\n            {\n                var fin149keys = ((window.top.JSBNG_Replay.forInKeys)((v))), fin149i = (0);\n                var sa;\n                for (; (fin149i < fin149keys.length); (fin149i++)) {\n                    ((sa) = (fin149keys[fin149i]));\n                    {\n                        if (((v[sa] === ea.BLACKLISTED))) {\n                            ra.push(sa);\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            return ra;\n        },\n        getWhitelist: function() {\n            var ra = [];\n            {\n                var fin150keys = ((window.top.JSBNG_Replay.forInKeys)((v))), fin150i = (0);\n                var sa;\n                for (; (fin150i < fin150keys.length); (fin150i++)) {\n                    ((sa) = (fin150keys[fin150i]));\n                    {\n                        if (((v[sa] === ea.WHITELISTED))) {\n                            ra.push(sa);\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            return ra;\n        },\n        getMapForTest: function() {\n            return v;\n        },\n        setMapForTest: function(ra) {\n            v = ra;\n        }\n    });\n    ea.inform(\"privacy-changed\");\n    ea.inform(\"privacy-user-presence-changed\");\n    da().log(\"initialized\", {\n        visibility: w,\n        policy: z\n    });\n    h.subscribe(j.getArbiterType(\"privacy_changed\"), qa.bind(this));\n    h.subscribe(j.ON_CONFIG, function(ra, sa) {\n        var ta = sa.getConfig(\"visibility\", null);\n        if (((((ta !== null)) && ((typeof (ta) !== \"undefined\"))))) {\n            var ua = ((ta ? ea.ONLINE : ea.OFFLINE));\n            ha(ua);\n            da().log(\"config_visibility\", {\n                vis: ua\n            });\n        }\n    ;\n    ;\n    }.bind(this));\n    a.PresencePrivacy = e.exports = ea;\n}, 3);\n__d(\"ChatVisibility\", [\"Arbiter\",\"JSLogger\",\"PresencePrivacy\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"JSLogger\"), i = b(\"PresencePrivacy\"), j = {\n        isOnline: function() {\n            return ((i.getVisibility() === i.ONLINE));\n        },\n        hasBlackbirdEnabled: function() {\n            return ((this.isVisibleToMostFriends() || this.isVisibleToSomeFriends()));\n        },\n        isVisibleToMostFriends: function() {\n            return ((((i.getOnlinePolicy() === i.ONLINE_TO_BLACKLIST)) && ((i.getBlacklist().length > 0))));\n        },\n        isVisibleToSomeFriends: function() {\n            return ((((i.getOnlinePolicy() === i.ONLINE_TO_WHITELIST)) && ((i.getWhitelist().length > 0))));\n        },\n        goOnline: function(k) {\n            if (((i.getVisibility() === i.OFFLINE))) {\n                h.create(\"blackbird\").log(\"chat_go_online\");\n                i.setVisibility(i.ONLINE);\n                g.inform(\"chat-visibility/go-online\");\n            }\n        ;\n        ;\n            ((k && k()));\n        },\n        goOffline: function(k) {\n            if (((i.getVisibility() === i.ONLINE))) {\n                h.create(\"blackbird\").log(\"chat_go_offline\");\n                i.setVisibility(i.OFFLINE);\n                g.inform(\"chat-visibility/go-offline\");\n            }\n        ;\n        ;\n            ((k && k()));\n        },\n        toggleVisibility: function() {\n            if (j.isOnline()) {\n                j.goOffline();\n            }\n             else j.goOnline();\n        ;\n        ;\n        }\n    };\n    a.ChatVisibility = e.exports = j;\n}, 3);\n__d(\"MercuryIDs\", [], function(a, b, c, d, e, f) {\n    function g(i) {\n        return ((((typeof i === \"string\")) && ((i.indexOf(\":\") !== -1))));\n    };\n;\n    var h = {\n        isValid: function(i) {\n            if (!i) {\n                return false;\n            }\n        ;\n        ;\n            return g(i);\n        },\n        isValidThreadID: function(i) {\n            if (!h.isValid(i)) {\n                return false;\n            }\n        ;\n        ;\n            var j = h.tokenize(i);\n            switch (j.type) {\n              case \"user\":\n            \n              case \"group\":\n            \n              case \"thread\":\n            \n              case \"root\":\n            \n              case \"pending\":\n                return true;\n              default:\n                return false;\n            };\n        ;\n        },\n        tokenize: function(i) {\n            if (!this.isValid(i)) {\n                throw \"bad_id_format\";\n            }\n        ;\n        ;\n            var j = i.indexOf(\":\");\n            return {\n                type: i.substr(0, j),\n                value: i.substr(((j + 1)))\n            };\n        },\n        getUserIDFromParticipantID: function(i) {\n            if (!h.isValid(i)) {\n                return null;\n            }\n        ;\n        ;\n            var j = h.tokenize(i);\n            if (((j.type != \"fbid\"))) {\n                return null;\n            }\n        ;\n        ;\n            return j.value;\n        }\n    };\n    e.exports = h;\n});\n__d(\"MercuryAssert\", [\"MercuryIDs\",], function(a, b, c, d, e, f) {\n    var g = b(\"MercuryIDs\");\n    e.exports = {\n        isParticipantID: function(h) {\n            if (!g.isValid(h)) {\n                throw \"bad_participant_id\";\n            }\n        ;\n        ;\n        },\n        allParticipantIDs: function(h) {\n            h.forEach(this.isParticipantID);\n        },\n        isUserParticipantID: function(h) {\n            var i = g.tokenize(h);\n            if (((i.type != \"fbid\"))) {\n                throw \"bad_user_id\";\n            }\n        ;\n        ;\n        },\n        isEmailParticipantID: function(h) {\n            var i = g.tokenize(h);\n            if (((i.type != \"email\"))) {\n                throw \"bad_email_id\";\n            }\n        ;\n        ;\n        },\n        allThreadID: function(h) {\n            h.forEach(this.isThreadID);\n        },\n        isThreadID: function(h) {\n            if (!g.isValid(h)) {\n                throw \"bad_thread_id\";\n            }\n        ;\n        ;\n        }\n    };\n});\n__d(\"MercurySingletonMixin\", [\"Env\",], function(a, b, c, d, e, f) {\n    var g = b(\"Env\"), h = {\n        _getInstances: function() {\n            if (!this._instances) {\n                this._instances = {\n                };\n            }\n        ;\n        ;\n            return this._instances;\n        },\n        get: function() {\n            return this.getForFBID(g.user);\n        },\n        getForFBID: function(i) {\n            var j = this._getInstances();\n            if (!j[i]) {\n                j[i] = new this(i);\n            }\n        ;\n        ;\n            return j[i];\n        }\n    };\n    e.exports = h;\n});\n__d(\"MercuryMessageIDs\", [\"KeyedCallbackManager\",], function(a, b, c, d, e, f) {\n    var g = b(\"KeyedCallbackManager\"), h = new g(), i = {\n        getServerIDs: function(j, k) {\n            var l = j.filter(function(n) {\n                return ((n.indexOf(\"mail.projektitan.com\") !== -1));\n            }), m = function(n) {\n                var o = j.map(function(p) {\n                    return ((n[p] ? n[p] : p));\n                });\n                k(o);\n            };\n            return h.executeOrEnqueue(l, m);\n        },\n        addServerID: function(j, k) {\n            h.setResource(j, k);\n        }\n    };\n    e.exports = i;\n});\n__d(\"ImageSourceType\", [], function(a, b, c, d, e, f) {\n    var g = {\n        PROFILE_PICTURE: \"profile_picture\",\n        IMAGE: \"image\"\n    };\n    e.exports = g;\n});\n__d(\"PhotoResizeModeConst\", [], function(a, b, c, d, e, f) {\n    var g = {\n        COVER: \"s\",\n        CONTAIN: \"p\"\n    };\n    e.exports = g;\n});\n__d(\"ImageSourceRequest\", [\"arrayContains\",\"extendArray\",\"copyProperties\",\"Env\",\"KeyedCallbackManager\",\"ImageSourceType\",\"PhotoResizeModeConst\",\"MercuryServerDispatcher\",], function(a, b, c, d, e, f) {\n    var g = b(\"arrayContains\"), h = b(\"extendArray\"), i = b(\"copyProperties\"), j = b(\"Env\"), k = b(\"KeyedCallbackManager\"), l = b(\"ImageSourceType\"), m = b(\"PhotoResizeModeConst\"), n = b(\"MercuryServerDispatcher\");\n    function o() {\n        this._request = {\n            fbid: null,\n            type: null,\n            width: null,\n            height: null,\n            resize_mode: null\n        };\n        this._callback = null;\n    };\n;\n    i(o.prototype, {\n        setFBID: function(s) {\n            this._request.fbid = s;\n            return this;\n        },\n        setType: function(s) {\n            if (!g([l.PROFILE_PICTURE,l.IMAGE,], s)) {\n                throw new TypeError(((\"ImageSourceRequest.setType: invalid type \" + s)));\n            }\n        ;\n        ;\n            this._request.type = s;\n            return this;\n        },\n        setDimensions: function(s, t) {\n            this._request.width = s;\n            this._request.height = t;\n            return this;\n        },\n        setResizeMode: function(s) {\n            if (!g([m.COVER,m.CONTAIN,], s)) {\n                throw new TypeError(((\"ImageSourceRequest.setResizeMode: invalid resize mode \" + s)));\n            }\n        ;\n        ;\n            this._request.resize_mode = s;\n            return this;\n        },\n        setCallback: function(s) {\n            this._callback = s;\n            return this;\n        },\n        send: function() {\n            if (((((((((((!this._request.fbid || !this._request.width)) || !this._request.height)) || !this._request.type)) || !this._request.resize_mode)) || !this._callback))) {\n                throw new Error(\"ImageSourceRequest: You must set all the fields\");\n            }\n        ;\n        ;\n            var s = q(), t = r(this._request);\n            s.executeOrEnqueue(t, this._callback);\n            if (((s.getUnavailableResourcesFromRequest(t).length === 1))) {\n                n.trySend(\"/ajax/image_source.php\", {\n                    requests: [this._request,]\n                });\n                return true;\n            }\n        ;\n        ;\n            return false;\n        }\n    });\n    var p = null;\n    function q() {\n        if (p) {\n            return p;\n        }\n    ;\n    ;\n        var s = new k();\n        p = s;\n        n.registerEndpoints({\n            \"/ajax/image_source.php\": {\n                request_user_id: j.user,\n                mode: n.BATCH_DEFERRED_MULTI,\n                batch_function: function(t, u) {\n                    h(t.requests, u.requests);\n                    return t;\n                },\n                handler: function(t, u) {\n                    var v = u.getData().requests;\n                    for (var w = 0; ((w < v.length)); ++w) {\n                        s.setResource(r(v[w]), t[w]);\n                    ;\n                    };\n                ;\n                }\n            }\n        });\n        return s;\n    };\n;\n    function r(s) {\n        return [s.fbid,s.type,s.width,s.height,s.resize_mode,].join(\"|\");\n    };\n;\n    e.exports = o;\n});\n__d(\"TimestampConverter\", [\"JSLogger\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSLogger\"), h = g.create(\"timestamp_converter\");\n    function i(k) {\n        return ((((typeof (k) == \"string\")) && ((k.length > 6))));\n    };\n;\n    var j = {\n        convertActionIDToTimestamp: function(k) {\n            if (i(k)) {\n                var l = k.slice(0, -6);\n                return parseInt(l, 10);\n            }\n        ;\n        ;\n        },\n        maxValidActionID: function(k, l) {\n            if (!i(k)) {\n                return l;\n            }\n        ;\n        ;\n            if (!i(l)) {\n                return k;\n            }\n        ;\n        ;\n            return ((this.isGreaterThan(k, l) ? k : l));\n        },\n        isGreaterThan: function(k, l) {\n            if (((!i(k) || !i(l)))) {\n                return false;\n            }\n        ;\n        ;\n            return ((this.convertActionIDToTimestamp(k) > this.convertActionIDToTimestamp(l)));\n        }\n    };\n    e.exports = j;\n});\n__d(\"MessagingReliabilityLogger\", [\"function-extensions\",\"PresenceUtil\",\"MercuryServerDispatcher\",\"MessagingReliabilityLoggerInitialData\",\"isEmpty\",\"setTimeoutAcrossTransitions\",], function(a, b, c, d, e, f) {\n    b(\"function-extensions\");\n    var g = b(\"PresenceUtil\"), h = b(\"MercuryServerDispatcher\"), i = b(\"MessagingReliabilityLoggerInitialData\"), j = b(\"isEmpty\"), k = b(\"setTimeoutAcrossTransitions\"), l = \"/ajax/mercury/client_reliability.php\", m = 60000;\n    function n(t, u) {\n        var v = {\n            app: i.app,\n            categories: JSON.stringify(t)\n        };\n        if (!j(u)) {\n            v.extra = JSON.stringify(u);\n        }\n    ;\n    ;\n        return v;\n    };\n;\n    function o(t, u, v, w) {\n        if (((t[u] === undefined))) {\n            t[u] = {\n            };\n        }\n    ;\n    ;\n        if (((t[u][v] === undefined))) {\n            t[u][v] = 0;\n        }\n    ;\n    ;\n        t[u][v] += w;\n    };\n;\n    function p(t, u, v, w) {\n        if (((t[u] === undefined))) {\n            t[u] = {\n            };\n        }\n    ;\n    ;\n        if (((t[u][v] === undefined))) {\n            t[u][v] = [];\n        }\n    ;\n    ;\n        for (var x = 0; ((x < w.length)); ++x) {\n            t[u][v].push(w[x]);\n        ;\n        };\n    ;\n    };\n;\n    function q(t, u) {\n        if (((((t && !t.categories)) || ((u && !u.categories))))) {\n            return;\n        }\n    ;\n    ;\n        var v = ((t ? JSON.parse(t.categories) : {\n        })), w = ((((t && t.extra)) ? JSON.parse(t.extra) : {\n        })), x = JSON.parse(u.categories), y = ((u.extra ? JSON.parse(u.extra) : {\n        }));\n        {\n            var fin151keys = ((window.top.JSBNG_Replay.forInKeys)((x))), fin151i = (0);\n            var z;\n            for (; (fin151i < fin151keys.length); (fin151i++)) {\n                ((z) = (fin151keys[fin151i]));\n                {\n                    var aa = x[z], ba = y[z];\n                    {\n                        var fin152keys = ((window.top.JSBNG_Replay.forInKeys)((aa))), fin152i = (0);\n                        var ca;\n                        for (; (fin152i < fin152keys.length); (fin152i++)) {\n                            ((ca) = (fin152keys[fin152i]));\n                            {\n                                o(v, z, ca, aa[ca]);\n                                if (((ba !== undefined))) {\n                                    var da = ba[ca];\n                                    if (((da !== undefined))) {\n                                        p(w, z, ca, da);\n                                    }\n                                ;\n                                ;\n                                }\n                            ;\n                            ;\n                            };\n                        };\n                    };\n                ;\n                };\n            };\n        };\n    ;\n        return n(v, w);\n    };\n;\n    var r = {\n    };\n    r[l] = {\n        mode: h.BATCH_SUCCESSIVE_PIGGYBACK_ON_ERROR,\n        batch_function: q\n    };\n    h.registerEndpoints(r);\n    var s = {\n        addEntry: function(t, u, v) {\n            if (!i.enabled) {\n                return;\n            }\n        ;\n        ;\n            var w = {\n            };\n            o(w, t, u, 1);\n            var x = {\n            };\n            if (((v !== undefined))) {\n                p(x, t, u, [v,]);\n            }\n        ;\n        ;\n            h.trySend(l, n(w, x));\n        }\n    };\n    (function t() {\n        s.addEntry(\"page_event\", \"active\", g.getSessionID());\n        k(t, m);\n    })();\n    e.exports = s;\n});\n__d(\"MercuryThreadInformer\", [\"ArbiterMixin\",\"copyProperties\",\"MercuryAssert\",\"MercurySingletonMixin\",], function(a, b, c, d, e, f) {\n    var g = b(\"ArbiterMixin\"), h = b(\"copyProperties\"), i = b(\"MercuryAssert\"), j = b(\"MercurySingletonMixin\");\n    function k(m) {\n        if (!m._locked) {\n            var n = m._threadDeletions, o = m._threadChanges, p = m._threadReadChanges, q = m._threadlistChanged, r = m._unseenStateChanged, s = m._unreadStateChanged, t = m._receivedMessages, u = m._reorderedMessages, v = m._updatedMessages;\n            m._threadDeletions = {\n            };\n            m._threadChanges = {\n            };\n            m._threadReadChanges = {\n            };\n            m._threadlistChanged = false;\n            m._unseenStateChanged = false;\n            m._unreadStateChanged = false;\n            m._receivedMessages = {\n            };\n            m._reorderedMessages = {\n            };\n            m._updatedMessages = {\n            };\n            var w = Object.keys(o);\n            if (((w.length || q))) {\n                m.inform(\"threadlist-updated\", w);\n            }\n        ;\n        ;\n            if (w.length) {\n                m.inform(\"threads-updated\", o);\n            }\n        ;\n        ;\n            {\n                var fin153keys = ((window.top.JSBNG_Replay.forInKeys)((p))), fin153i = (0);\n                var x;\n                for (; (fin153i < fin153keys.length); (fin153i++)) {\n                    ((x) = (fin153keys[fin153i]));\n                    {\n                        m.inform(\"thread-read-changed\", p);\n                        break;\n                    };\n                };\n            };\n        ;\n            {\n                var fin154keys = ((window.top.JSBNG_Replay.forInKeys)((n))), fin154i = (0);\n                var x;\n                for (; (fin154i < fin154keys.length); (fin154i++)) {\n                    ((x) = (fin154keys[fin154i]));\n                    {\n                        m.inform(\"threads-deleted\", n);\n                        break;\n                    };\n                };\n            };\n        ;\n            if (r) {\n                m.inform(\"unseen-updated\", null);\n            }\n        ;\n        ;\n            if (s) {\n                m.inform(\"unread-updated\", null);\n            }\n        ;\n        ;\n            {\n                var fin155keys = ((window.top.JSBNG_Replay.forInKeys)((t))), fin155i = (0);\n                (0);\n                for (; (fin155i < fin155keys.length); (fin155i++)) {\n                    ((x) = (fin155keys[fin155i]));\n                    {\n                        m.inform(\"messages-received\", t);\n                        break;\n                    };\n                };\n            };\n        ;\n            {\n                var fin156keys = ((window.top.JSBNG_Replay.forInKeys)((u))), fin156i = (0);\n                (0);\n                for (; (fin156i < fin156keys.length); (fin156i++)) {\n                    ((x) = (fin156keys[fin156i]));\n                    {\n                        m.inform(\"messages-reordered\", u);\n                        break;\n                    };\n                };\n            };\n        ;\n            {\n                var fin157keys = ((window.top.JSBNG_Replay.forInKeys)((v))), fin157i = (0);\n                (0);\n                for (; (fin157i < fin157keys.length); (fin157i++)) {\n                    ((x) = (fin157keys[fin157i]));\n                    {\n                        m.inform(\"messages-updated\", v);\n                        break;\n                    };\n                };\n            };\n        ;\n        }\n    ;\n    ;\n    };\n;\n    function l(m) {\n        this._fbid = m;\n        this._threadDeletions = {\n        };\n        this._threadChanges = {\n        };\n        this._threadReadChanges = {\n        };\n        this._threadlistChanged = false;\n        this._unseenStateChanged = false;\n        this._unreadStateChanged = false;\n        this._receivedMessages = {\n        };\n        this._reorderedMessages = {\n        };\n        this._updatedMessages = {\n        };\n        this._locked = 0;\n    };\n;\n    h(l.prototype, g, {\n        updatedThread: function(m) {\n            this._threadChanges[m] = true;\n            k(this);\n        },\n        deletedThread: function(m) {\n            this._threadDeletions[m] = true;\n            k(this);\n        },\n        updatedThreadlist: function() {\n            this._threadlistChanged = true;\n            k(this);\n        },\n        updatedUnseenState: function() {\n            this._unseenStateChanged = true;\n            k(this);\n        },\n        updatedUnreadState: function() {\n            this._unreadStateChanged = true;\n            k(this);\n        },\n        changedThreadReadState: function(m, n, o) {\n            if (((!this._threadReadChanges[m] || ((this._threadReadChanges[m].timestamp < o))))) {\n                this._threadReadChanges[m] = {\n                    mark_as_read: n,\n                    timestamp: o\n                };\n            }\n        ;\n        ;\n            k(this);\n        },\n        receivedMessage: function(m) {\n            i.isThreadID(m.thread_id);\n            var n = m.thread_id;\n            if (!this._receivedMessages[n]) {\n                this._receivedMessages[n] = [];\n            }\n        ;\n        ;\n            this._receivedMessages[n].push(m);\n            this.updatedThread(n);\n        },\n        reorderedMessages: function(m, n) {\n            this._reorderedMessages[m] = {\n                source: n\n            };\n            k(this);\n        },\n        updatedMessage: function(m, n, o) {\n            if (!this._updatedMessages[m]) {\n                this._updatedMessages[m] = {\n                };\n            }\n        ;\n        ;\n            this._updatedMessages[m][n] = {\n                source: o\n            };\n            this.updatedThread(m);\n        },\n        synchronizeInforms: function(m) {\n            this._locked++;\n            try {\n                m();\n            } catch (n) {\n                throw n;\n            } finally {\n                this._locked--;\n                k(this);\n            };\n        ;\n        },\n        listen: function(m, n) {\n            return this.subscribe(\"threads-updated\", function(o, p) {\n                if (p[m]) {\n                    n(m);\n                }\n            ;\n            ;\n            });\n        }\n    });\n    h(l, j);\n    e.exports = l;\n});\n__d(\"MercuryServerRequests\", [\"ArbiterMixin\",\"AsyncResponse\",\"TimestampConverter\",\"Env\",\"JSLogger\",\"KeyedCallbackManager\",\"MercuryActionTypeConstants\",\"MercuryActionStatus\",\"MercuryAPIArgsSource\",\"MercuryAssert\",\"MercuryErrorType\",\"MercuryGenericConstants\",\"MercuryGlobalActionType\",\"MercuryIDs\",\"MercuryLogMessageType\",\"MercuryPayloadSource\",\"MercuryServerRequestsConfig\",\"MercurySourceType\",\"MercuryThreadlistConstants\",\"MercuryMessageIDs\",\"MessagingConfig\",\"MessagingReliabilityLogger\",\"MessagingTag\",\"MercurySingletonMixin\",\"MercuryServerDispatcher\",\"MercuryThreadInformer\",\"copyProperties\",\"createObjectFrom\",], function(a, b, c, d, e, f) {\n    var g = b(\"ArbiterMixin\"), h = b(\"AsyncResponse\"), i = b(\"TimestampConverter\"), j = b(\"Env\"), k = b(\"JSLogger\"), l = b(\"KeyedCallbackManager\"), m = b(\"MercuryActionTypeConstants\"), n = b(\"MercuryActionStatus\"), o = b(\"MercuryAPIArgsSource\"), p = b(\"MercuryAssert\"), q = b(\"MercuryErrorType\"), r = b(\"MercuryGenericConstants\"), s = b(\"MercuryGlobalActionType\"), t = b(\"MercuryIDs\"), u = b(\"MercuryLogMessageType\"), v = b(\"MercuryPayloadSource\"), w = b(\"MercuryServerRequestsConfig\"), x = b(\"MercurySourceType\"), y = b(\"MercuryThreadlistConstants\"), z = b(\"MercuryMessageIDs\"), aa = b(\"MessagingConfig\"), ba = b(\"MessagingReliabilityLogger\"), ca = b(\"MessagingTag\"), da = b(\"MercurySingletonMixin\"), ea = b(\"MercuryServerDispatcher\"), fa = b(\"MercuryThreadInformer\"), ga = b(\"copyProperties\"), ha = b(\"createObjectFrom\"), ia = k.create(\"mercury_server\"), ja = o.MERCURY;\n    function ka(sb, tb) {\n        if (tb) {\n            sb._lastActionId = i.maxValidActionID(sb._lastActionId, tb);\n        }\n    ;\n    ;\n    };\n;\n    function la(sb, tb) {\n        var ub = tb.thread_id, vb = sb._serverToClientIDs.getResource(ub);\n        if (!vb) {\n            if (tb.canonical_fbid) {\n                vb = ((\"user:\" + tb.canonical_fbid));\n            }\n             else if (tb.root_message_threading_id) {\n                vb = ((\"root:\" + tb.root_message_threading_id));\n            }\n            \n        ;\n        ;\n            vb = ((vb || ((\"thread:\" + ub))));\n            ma(sb, ub, vb);\n        }\n    ;\n    ;\n        tb.thread_id = vb;\n    };\n;\n    function ma(sb, tb, ub) {\n        sb._serverToClientIDs.setResource(tb, ub);\n        sb._clientToServerIDs.setResource(ub, tb);\n        sb._newlyAddedClientIDs[tb] = ub;\n    };\n;\n    function na(sb, tb, ub) {\n        var vb = sb._clientToServerIDs.executeOrEnqueue(tb, ub), wb = sb._clientToServerIDs.getUnavailableResources(vb), xb = sb.tokenizeThreadID(tb);\n        if (((wb.length && ((xb.type != \"root\"))))) {\n            sb.fetchThreadData(wb);\n        }\n    ;\n    ;\n    };\n;\n    function oa(sb, tb) {\n        return sb._clientToServerIDs.getResource(tb);\n    };\n;\n    function pa(sb, tb) {\n        return !!sb._serverToClientIDs.getResource(tb);\n    };\n;\n    function qa(sb, tb) {\n        var ub = sb._serverToClientIDs.getResource(tb);\n        if (((typeof ub == \"undefined\"))) {\n            ia.warn(\"no_client_thread_id\", {\n                server_id: tb\n            });\n        }\n    ;\n    ;\n        return ub;\n    };\n;\n    function ra(sb, tb, ub) {\n        sb._serverToClientIDs.executeOrEnqueue(tb, ub);\n        sb.ensureThreadIsFetched(tb);\n    };\n;\n    function sa(sb, tb, ub) {\n        if (((tb.action_type != m.SEND_MESSAGE))) {\n            return;\n        }\n    ;\n    ;\n        var vb = tb.client_thread_id;\n        if (!vb) {\n            vb = qa(sb, tb.thread_id);\n        }\n    ;\n    ;\n        var wb = null;\n        if (vb) {\n            wb = t.tokenize(vb).type;\n        }\n    ;\n    ;\n        ba.addEntry(((\"send_\" + wb)), ub, ((((tb.thread_id + \",\")) + tb.message_id)));\n    };\n;\n    function ta(sb) {\n        return ((sb.getError() ? ((\"_\" + sb.getError())) : \"\"));\n    };\n;\n    function ua(sb, tb) {\n        var ub = null;\n        switch (tb.JSBNG__status) {\n          case n.SUCCESS:\n            ub = \"success\";\n            break;\n          case n.FAILED_UNKNOWN_REASON:\n            ub = \"confirmed_error\";\n            break;\n          case n.UNABLE_TO_CONFIRM:\n            ub = \"confirm_error\";\n            break;\n          default:\n            return;\n        };\n    ;\n        sa(sb, tb, ub);\n    };\n;\n    function va(sb, tb) {\n        ((tb.message_counts || [])).forEach(function(cc) {\n            ka(sb, cc.last_action_id);\n        });\n        ((tb.threads || [])).forEach(function(cc) {\n            la(sb, cc);\n            delete sb._fetchingThreads[cc.thread_id];\n            var dc = oa(sb, cc.thread_id);\n            delete sb._fetchingThreads[dc];\n            ka(sb, cc.last_action_id);\n        });\n        ((tb.ordered_threadlists || [])).forEach(function(cc) {\n            cc.thread_ids = cc.thread_ids.map(qa.curry(sb));\n        });\n        tb.actions = ((tb.actions || []));\n        tb.actions.forEach(function(cc) {\n            ua(sb, cc);\n            if (((((cc.JSBNG__status && ((cc.JSBNG__status != n.SUCCESS)))) && !cc.thread_id))) {\n                cc.thread_id = cc.client_thread_id;\n                return;\n            }\n        ;\n        ;\n            if (((((((cc.action_type == m.SEND_MESSAGE)) && cc.client_thread_id)) && ((cc.client_thread_id != r.PENDING_THREAD_ID))))) {\n                ma(sb, cc.thread_id, cc.client_thread_id);\n            }\n        ;\n        ;\n            cc.server_thread_id = cc.thread_id;\n            cc.thread_id = ((pa(sb, cc.thread_id) ? qa(sb, cc.thread_id) : null));\n            ka(sb, cc.action_id);\n        });\n        if (tb.end_of_history) {\n            var ub = [];\n            for (var vb = 0; ((vb < tb.end_of_history.length)); vb++) {\n                var wb = tb.end_of_history[vb];\n                if (((wb.type == \"user\"))) {\n                    ub.push(((\"user:\" + wb.id)));\n                }\n                 else if (((((wb.type == \"thread\")) && pa(sb, wb.id)))) {\n                    ub.push(qa(sb, wb.id));\n                }\n                \n            ;\n            ;\n            };\n        ;\n            tb.end_of_history = ub;\n        }\n    ;\n    ;\n        if (tb.roger) {\n            var xb = {\n            };\n            {\n                var fin158keys = ((window.top.JSBNG_Replay.forInKeys)((tb.roger))), fin158i = (0);\n                var yb;\n                for (; (fin158i < fin158keys.length); (fin158i++)) {\n                    ((yb) = (fin158keys[fin158i]));\n                    {\n                        var zb = sb._serverToClientIDs.getResource(yb);\n                        if (zb) {\n                            var ac = tb.roger[yb];\n                            xb[zb] = {\n                            };\n                            {\n                                var fin159keys = ((window.top.JSBNG_Replay.forInKeys)((ac))), fin159i = (0);\n                                var bc;\n                                for (; (fin159i < fin159keys.length); (fin159i++)) {\n                                    ((bc) = (fin159keys[fin159i]));\n                                    {\n                                        xb[zb][((\"fbid:\" + bc))] = ac[bc];\n                                    ;\n                                    };\n                                };\n                            };\n                        ;\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            tb.roger = xb;\n        }\n    ;\n    ;\n    };\n;\n    function wa(sb) {\n        if (((sb._pendingUpdates && sb._pendingUpdates.length))) {\n            var tb = sb._pendingUpdates[0];\n            sb._pendingUpdates = sb._pendingUpdates.slice(1);\n            sb.handleUpdate(tb);\n        }\n    ;\n    ;\n    };\n;\n    function xa(sb, tb) {\n        var ub = ga({\n        }, sb), vb;\n        if (tb.threads) {\n            if (!ub.threads) {\n                ub.threads = {\n                };\n            }\n        ;\n        ;\n            {\n                var fin160keys = ((window.top.JSBNG_Replay.forInKeys)((tb.threads))), fin160i = (0);\n                (0);\n                for (; (fin160i < fin160keys.length); (fin160i++)) {\n                    ((vb) = (fin160keys[fin160i]));\n                    {\n                        ub.threads[vb] = Object.keys(ha(((ub.threads[vb] || [])).concat(tb.threads[vb])));\n                    ;\n                    };\n                };\n            };\n        ;\n        }\n    ;\n    ;\n        if (tb.messages) {\n            if (!ub.messages) {\n                ub.messages = {\n                };\n            }\n        ;\n        ;\n            {\n                var fin161keys = ((window.top.JSBNG_Replay.forInKeys)((tb.messages))), fin161i = (0);\n                (0);\n                for (; (fin161i < fin161keys.length); (fin161i++)) {\n                    ((vb) = (fin161keys[fin161i]));\n                    {\n                        if (!ub.messages[vb]) {\n                            ub.messages[vb] = {\n                            };\n                        }\n                    ;\n                    ;\n                        {\n                            var fin162keys = ((window.top.JSBNG_Replay.forInKeys)((tb.messages[vb]))), fin162i = (0);\n                            var wb;\n                            for (; (fin162i < fin162keys.length); (fin162i++)) {\n                                ((wb) = (fin162keys[fin162i]));\n                                {\n                                    if (ub.messages[vb][wb]) {\n                                        ub.messages[vb][wb] = ab(ub.messages[vb][wb], tb.messages[vb][wb]);\n                                    }\n                                     else ub.messages[vb][wb] = tb.messages[vb][wb];\n                                ;\n                                ;\n                                };\n                            };\n                        };\n                    ;\n                    };\n                };\n            };\n        ;\n        }\n    ;\n    ;\n        ub.client = ((sb.client || tb.client));\n        return ub;\n    };\n;\n    function ya(sb, tb) {\n        var ub = ga(ha(sb.folders, true), ha(tb.folders, true)), vb = ((sb.client || tb.client));\n        return {\n            folders: Object.keys(ub),\n            client: vb\n        };\n    };\n;\n    function za(sb, tb) {\n        {\n            var fin163keys = ((window.top.JSBNG_Replay.forInKeys)((tb))), fin163i = (0);\n            var ub;\n            for (; (fin163i < fin163keys.length); (fin163i++)) {\n                ((ub) = (fin163keys[fin163i]));\n                {\n                    if (((sb[ub] && ((typeof sb[ub] === \"object\"))))) {\n                        sb[ub] = ab(sb[ub], tb[ub]);\n                    }\n                     else if (((tb[ub] && ((typeof tb[ub] === \"object\"))))) {\n                        var vb = {\n                        };\n                        ga(vb, tb[ub]);\n                        sb[ub] = vb;\n                    }\n                    \n                ;\n                ;\n                };\n            };\n        };\n    ;\n        return sb;\n    };\n;\n    function ab(sb, tb) {\n        var ub = ((((sb.offset < tb.offset)) ? sb.offset : tb.offset)), vb = ((sb.offset + sb.limit)), wb = ((tb.offset + tb.limit)), xb = ((((vb > wb)) ? vb : wb)), yb = ((xb - ub));\n        return {\n            offset: ub,\n            limit: yb\n        };\n    };\n;\n    function bb(sb, tb) {\n        var ub = ((sb.client || tb.client)), vb = {\n            ids: {\n            },\n            client: ub\n        };\n        ga(vb.ids, sb.ids);\n        ga(vb.ids, tb.ids);\n        return vb;\n    };\n;\n    function cb(sb, tb) {\n        var ub = {\n        }, vb, wb = ((sb.client || tb.client));\n        delete sb.client;\n        delete tb.client;\n        {\n            var fin164keys = ((window.top.JSBNG_Replay.forInKeys)((sb))), fin164i = (0);\n            (0);\n            for (; (fin164i < fin164keys.length); (fin164i++)) {\n                ((vb) = (fin164keys[fin164i]));\n                {\n                    ga(ub, ha(sb[vb], vb));\n                ;\n                };\n            };\n        };\n    ;\n        {\n            var fin165keys = ((window.top.JSBNG_Replay.forInKeys)((tb))), fin165i = (0);\n            (0);\n            for (; (fin165i < fin165keys.length); (fin165i++)) {\n                ((vb) = (fin165keys[fin165i]));\n                {\n                    ga(ub, ha(tb[vb], vb));\n                ;\n                };\n            };\n        };\n    ;\n        var xb = {\n            client: wb\n        };\n        {\n            var fin166keys = ((window.top.JSBNG_Replay.forInKeys)((ub))), fin166i = (0);\n            var yb;\n            for (; (fin166i < fin166keys.length); (fin166i++)) {\n                ((yb) = (fin166keys[fin166i]));\n                {\n                    vb = ub[yb];\n                    if (!xb[vb]) {\n                        xb[vb] = [];\n                    }\n                ;\n                ;\n                    xb[vb].push(yb);\n                };\n            };\n        };\n    ;\n        return xb;\n    };\n;\n    function db(sb, tb) {\n        var ub = ((sb.client || tb.client)), vb = ha(sb.ids, true), wb = ha(tb.ids, true), xb = ga(vb, wb);\n        return {\n            ids: Object.keys(xb),\n            client: ub\n        };\n    };\n;\n    function eb(sb) {\n        this._fbid = sb;\n        this._lastActionId = 0;\n        this._serverToClientIDs = new l();\n        this._clientToServerIDs = new l();\n        this._pendingUpdates = [];\n        this._fetchingThreads = {\n        };\n        this._newlyAddedClientIDs = {\n        };\n        qb(this);\n    };\n;\n    ga(eb.prototype, g, {\n        tokenizeThreadID: function(sb) {\n            p.isThreadID(sb);\n            return t.tokenize(sb);\n        },\n        getServerThreadID: function(sb, tb) {\n            p.isThreadID(sb);\n            na(this, sb, tb);\n        },\n        getClientThreadID: function(sb, tb) {\n            ra(this, sb, tb);\n        },\n        getClientThreadIDNow: function(sb) {\n            return qa(this, sb);\n        },\n        getServerThreadIDNow: function(sb) {\n            return oa(this, sb);\n        },\n        convertThreadIDIfAvailable: function(sb) {\n            var tb = this._serverToClientIDs.getResource(sb);\n            if (((tb === undefined))) {\n                return sb;\n            }\n             else return tb\n        ;\n        },\n        canLinkExternally: function(sb) {\n            p.isThreadID(sb);\n            var tb = this.tokenizeThreadID(sb);\n            return ((((tb.type == \"user\")) || !!oa(this, sb)));\n        },\n        fetchThreadlistInfo: function(sb, tb, ub, vb, wb) {\n            ub = ((ub || ca.INBOX));\n            wb = ((wb || ja));\n            var xb = ((vb ? ea.IMMEDIATE : null)), yb = {\n                client: wb\n            };\n            yb[ub] = {\n                offset: sb,\n                limit: tb,\n                filter: vb\n            };\n            rb(this, \"/ajax/mercury/threadlist_info.php\", yb, xb);\n        },\n        fetchUnseenThreadIDs: function(sb, tb) {\n            tb = ((tb || ja));\n            this.fetchThreadlistInfo(y.RECENT_THREAD_OFFSET, y.JEWEL_THREAD_COUNT, sb, null, tb);\n        },\n        fetchUnreadThreadIDs: function(sb, tb) {\n            tb = ((tb || ja));\n            rb(this, \"/ajax/mercury/unread_threads.php\", {\n                folders: [sb,],\n                client: tb\n            });\n        },\n        fetchMissedMessages: function(sb, tb) {\n            tb = ((tb || ja));\n            rb(this, \"/ajax/mercury/thread_sync.php\", {\n                last_action_id: this._lastActionId,\n                folders: sb,\n                client: tb\n            });\n        },\n        fetchThreadData: function(sb, tb) {\n            tb = ((tb || ja));\n            p.allThreadID(sb);\n            var ub = {\n                threads: {\n                },\n                client: tb\n            }, vb = [], wb = [];\n            sb.forEach(function(yb) {\n                if (this._fetchingThreads[yb]) {\n                    return;\n                }\n            ;\n            ;\n                this._fetchingThreads[yb] = true;\n                var zb = oa(this, yb);\n                if (zb) {\n                    wb.push(zb);\n                    ub.threads.thread_ids = wb;\n                }\n                 else {\n                    var ac = this.tokenizeThreadID(yb);\n                    if (((ac.type == \"user\"))) {\n                        vb.push(ac.value);\n                        ub.threads.user_ids = vb;\n                    }\n                     else if (((ac.type == \"thread\"))) {\n                        wb.push(ac.value);\n                        ub.threads.thread_ids = wb;\n                    }\n                     else if (((((ac.type != \"root\")) && ((ac.type != \"pending\"))))) {\n                        throw new Error(\"Unknown thread type\", ac);\n                    }\n                    \n                    \n                ;\n                ;\n                }\n            ;\n            ;\n            }.bind(this));\n            this.inform(\"fetch-thread-data\", ub);\n            {\n                var fin167keys = ((window.top.JSBNG_Replay.forInKeys)((ub.threads))), fin167i = (0);\n                var xb;\n                for (; (fin167i < fin167keys.length); (fin167i++)) {\n                    ((xb) = (fin167keys[fin167i]));\n                    {\n                        rb(this, \"/ajax/mercury/thread_info.php\", ub);\n                        break;\n                    };\n                };\n            };\n        ;\n        },\n        ensureThreadIsFetched: function(sb, tb) {\n            tb = ((tb || ja));\n            if (((!this._serverToClientIDs.getResource(sb) && !this._fetchingThreads[sb]))) {\n                this._fetchingThreads[sb] = true;\n                rb(this, \"/ajax/mercury/thread_info.php\", {\n                    threads: {\n                        thread_ids: [sb,]\n                    },\n                    client: tb\n                });\n            }\n        ;\n        ;\n        },\n        fetchThreadMessages: function(sb, tb, ub, vb, wb) {\n            p.isThreadID(sb);\n            wb = ((wb || ja));\n            var xb, yb, zb = this.tokenizeThreadID(sb), ac = oa(this, sb), bc = false;\n            if (((ac && ((zb.type != \"group\"))))) {\n                yb = \"thread_ids\";\n                xb = ac;\n            }\n             else {\n                xb = zb.value;\n                switch (zb.type) {\n                  case \"user\":\n                    yb = \"user_ids\";\n                    bc = true;\n                    break;\n                  case \"group\":\n                    yb = \"group_ids\";\n                    break;\n                  case \"thread\":\n                    yb = \"thread_ids\";\n                    break;\n                };\n            ;\n            }\n        ;\n        ;\n            var cc = {\n                messages: {\n                },\n                threads: {\n                },\n                client: wb\n            };\n            if (yb) {\n                cc.messages[yb] = {\n                };\n                cc.messages[yb][xb] = {\n                    offset: tb,\n                    limit: ub\n                };\n                if (bc) {\n                    cc.threads[yb] = [xb,];\n                }\n            ;\n            ;\n                rb(this, \"/ajax/mercury/thread_info.php\", cc, vb);\n            }\n             else na(this, sb, function(dc) {\n                cc.messages.thread_ids = {\n                };\n                cc.messages.thread_ids[dc] = {\n                    offset: tb,\n                    limit: ub\n                };\n                rb(this, \"/ajax/mercury/thread_info.php\", cc, vb);\n            }.bind(this));\n        ;\n        ;\n        },\n        handleThreadInfoError: function(sb) {\n            var tb = sb.getRequest().getData(), ub = [];\n            if (tb.messages) {\n                {\n                    var fin168keys = ((window.top.JSBNG_Replay.forInKeys)((tb.messages.thread_ids))), fin168i = (0);\n                    var vb;\n                    for (; (fin168i < fin168keys.length); (fin168i++)) {\n                        ((vb) = (fin168keys[fin168i]));\n                        {\n                            ub.push(fb(qa(this, vb)));\n                        ;\n                        };\n                    };\n                };\n            ;\n                {\n                    var fin169keys = ((window.top.JSBNG_Replay.forInKeys)((tb.messages.user_ids))), fin169i = (0);\n                    var wb;\n                    for (; (fin169i < fin169keys.length); (fin169i++)) {\n                        ((wb) = (fin169keys[fin169i]));\n                        {\n                            ub.push(fb(((\"user:\" + wb))));\n                        ;\n                        };\n                    };\n                };\n            ;\n                {\n                    var fin170keys = ((window.top.JSBNG_Replay.forInKeys)((tb.messages.group_ids))), fin170i = (0);\n                    var xb;\n                    for (; (fin170i < fin170keys.length); (fin170i++)) {\n                        ((xb) = (fin170keys[fin170i]));\n                        {\n                            ub.push(fb(((\"group:\" + xb))));\n                        ;\n                        };\n                    };\n                };\n            ;\n            }\n        ;\n        ;\n            if (ub.length) {\n                this.handleUpdate({\n                    actions: ub,\n                    from_client: true,\n                    payload_source: v.CLIENT_CHANNEL_MESSAGE\n                });\n            }\n        ;\n        ;\n            if (((tb.threads && ((((tb.threads.user_ids || tb.threads.group_ids)) || tb.threads.thread_ids))))) {\n                var yb = 5, zb = true;\n                if (!tb.retry_count) {\n                    tb.retry_count = 0;\n                    if (tb.messages) {\n                        delete tb.messages;\n                    }\n                ;\n                ;\n                }\n                 else if (((tb.retry_count >= yb))) {\n                    zb = false;\n                    ((tb.threads.thread_ids || [])).forEach(function(bc) {\n                        if (((bc in this._fetchingThreads))) {\n                            delete this._fetchingThreads[bc];\n                        }\n                    ;\n                    ;\n                    }.bind(this));\n                }\n                \n            ;\n            ;\n                if (zb) {\n                    var ac = ((tb.retry_count * 1000));\n                    (function() {\n                        ia.log(\"retry_thread\", tb);\n                        rb(this, \"/ajax/mercury/thread_info.php\", tb);\n                    }.bind(this)).defer(ac, false);\n                    tb.retry_count++;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n        },\n        markFolderAsRead: function(sb) {\n            rb(this, \"/ajax/mercury/mark_folder_as_read.php\", {\n                folder: sb\n            });\n            var tb = [{\n                action_type: s.MARK_ALL_READ,\n                action_id: null,\n                folder: sb\n            },];\n            this.handleUpdate({\n                global_actions: tb,\n                from_client: true,\n                payload_source: v.CLIENT_CHANGE_READ_STATUS\n            });\n        },\n        changeThreadReadStatus: function(sb, tb, ub) {\n            p.isThreadID(sb);\n            na(this, sb, function(wb) {\n                var xb = {\n                    ids: {\n                    }\n                };\n                xb.ids[wb] = tb;\n                rb(this, \"/ajax/mercury/change_read_status.php\", xb);\n            }.bind(this));\n            var vb = [{\n                action_type: m.CHANGE_READ_STATUS,\n                action_id: null,\n                thread_id: sb,\n                mark_as_read: tb,\n                folder: ub\n            },];\n            this.handleUpdate({\n                actions: vb,\n                from_client: true,\n                payload_source: v.CLIENT_CHANGE_READ_STATUS\n            });\n        },\n        changeThreadArchivedStatus: function(sb, tb) {\n            p.isThreadID(sb);\n            na(this, sb, function(wb) {\n                var xb = {\n                    ids: {\n                    }\n                };\n                xb.ids[wb] = tb;\n                rb(this, \"/ajax/mercury/change_archived_status.php\", xb);\n            }.bind(this));\n            var ub = {\n                action_type: m.CHANGE_ARCHIVED_STATUS,\n                action_id: null,\n                thread_id: sb,\n                archived: tb\n            }, vb = {\n                actions: [ub,],\n                from_client: true,\n                payload_source: v.CLIENT_CHANGE_ARCHIVED_STATUS\n            };\n            this.handleUpdate(vb);\n        },\n        changeThreadFolder: function(sb, tb) {\n            p.isThreadID(sb);\n            na(this, sb, function(wb) {\n                var xb = {\n                };\n                xb[tb] = [wb,];\n                rb(this, \"/ajax/mercury/move_thread.php\", xb);\n            }.bind(this));\n            var ub = {\n                action_type: m.CHANGE_FOLDER,\n                action_id: null,\n                thread_id: sb,\n                new_folder: tb\n            }, vb = {\n                actions: [ub,],\n                from_client: true,\n                payload_source: v.CLIENT_CHANGE_FOLDER\n            };\n            this.handleUpdate(vb);\n        },\n        changeMutingOnThread: function(sb, tb) {\n            p.isThreadID(sb);\n            na(this, sb, function(wb) {\n                rb(this, \"/ajax/mercury/change_mute_thread.php\", {\n                    thread_id: wb,\n                    mute_settings: tb,\n                    payload_source: ja\n                });\n            }.bind(this));\n            var ub = {\n                action_type: m.CHANGE_MUTE_SETTINGS,\n                action_id: null,\n                thread_id: sb,\n                mute_settings: tb\n            }, vb = {\n                actions: [ub,],\n                from_client: true,\n                payload_source: v.CLIENT_CHANGE_MUTE_SETTINGS\n            };\n            this.handleUpdate(vb);\n        },\n        markThreadSpam: function(sb) {\n            p.isThreadID(sb);\n            na(this, sb, function(vb) {\n                rb(this, \"/ajax/mercury/mark_spam.php\", {\n                    id: vb\n                });\n            }.bind(this));\n            var tb = {\n                action_type: m.CHANGE_FOLDER,\n                action_id: null,\n                thread_id: sb,\n                new_folder: ca.SPAM\n            }, ub = {\n                actions: [tb,],\n                from_client: true,\n                payload_source: v.CLIENT_CHANGE_FOLDER\n            };\n            this.handleUpdate(ub);\n        },\n        markMessagesSpam: function(sb, tb) {\n            z.getServerIDs(((tb || [])), function(vb) {\n                rb(this, \"/ajax/mercury/mark_spam_messages.php\", {\n                    message_ids: vb\n                });\n            }.bind(this));\n            var ub = {\n                action_type: m.DELETE_MESSAGES,\n                action_id: null,\n                thread_id: sb,\n                message_ids: tb\n            };\n            this.handleUpdate({\n                actions: [ub,],\n                from_client: true,\n                payload_source: v.CLIENT_DELETE_MESSAGES\n            });\n        },\n        unmarkThreadSpam: function(sb) {\n            p.isThreadID(sb);\n            na(this, sb, function(vb) {\n                rb(this, \"/ajax/mercury/unmark_spam.php\", {\n                    id: vb\n                });\n            }.bind(this));\n            var tb = {\n                action_type: m.CHANGE_FOLDER,\n                action_id: null,\n                thread_id: sb,\n                new_folder: ca.INBOX\n            }, ub = {\n                actions: [tb,],\n                from_client: true,\n                payload_source: v.CLIENT_CHANGE_FOLDER\n            };\n            this.handleUpdate(ub);\n        },\n        deleteThread: function(sb) {\n            p.isThreadID(sb);\n            na(this, sb, function(vb) {\n                var wb = {\n                    ids: [vb,]\n                };\n                rb(this, \"/ajax/mercury/delete_thread.php\", wb);\n            }.bind(this));\n            var tb = {\n                action_type: m.DELETE_THREAD,\n                action_id: null,\n                thread_id: sb\n            }, ub = {\n                actions: [tb,],\n                from_client: true,\n                payload_source: v.CLIENT_DELETE_THREAD\n            };\n            this.handleUpdate(ub);\n        },\n        deleteMessages: function(sb, tb, ub) {\n            z.getServerIDs(((tb || [])), function(wb) {\n                rb(this, \"/ajax/mercury/delete_messages.php\", {\n                    message_ids: wb\n                });\n            }.bind(this));\n            var vb;\n            if (ub) {\n                vb = {\n                    action_type: m.DELETE_THREAD,\n                    action_id: null,\n                    thread_id: sb\n                };\n            }\n             else vb = {\n                action_type: m.DELETE_MESSAGES,\n                action_id: null,\n                thread_id: sb,\n                message_ids: tb\n            };\n        ;\n        ;\n            this.handleUpdate({\n                actions: [vb,],\n                from_client: true,\n                payload_source: v.CLIENT_DELETE_MESSAGES\n            });\n        },\n        clearChat: function(sb, tb, ub) {\n            p.isThreadID(sb);\n            rb(this, \"/ajax/chat/settings.php\", {\n                clear_history_id: tb\n            });\n            var vb = [{\n                action_type: m.CLEAR_CHAT,\n                action_id: null,\n                thread_id: sb,\n                clear_time: ub\n            },];\n            this.handleUpdate({\n                actions: vb,\n                from_client: true,\n                payload_source: v.CLIENT_CLEAR_CHAT\n            });\n        },\n        sendNewMessage: function(sb, tb) {\n            tb = ((tb || ja));\n            if (!sb.do_not_send_to_server) {\n                z.getServerIDs(((sb.forward_message_ids || [])), function(vb) {\n                    var wb = sb.thread_id, xb = this.tokenizeThreadID(sb.thread_id), yb = xb.type, zb = ga({\n                    }, sb);\n                    zb.forward_message_ids = vb;\n                    if (((((((((yb == \"root\")) && ((xb.value == zb.message_id)))) || ((((yb == \"user\")) && !oa(this, wb))))) || ((sb.thread_id == r.PENDING_THREAD_ID))))) {\n                        zb.client_thread_id = zb.thread_id;\n                        zb.thread_id = null;\n                        this._sendNewMessageToServer(zb, tb);\n                    }\n                     else na(this, zb.thread_id, function(ac) {\n                        zb.thread_id = ac;\n                        this._sendNewMessageToServer(zb);\n                    }.bind(this));\n                ;\n                ;\n                }.bind(this));\n            }\n        ;\n        ;\n            if (((sb.thread_id != r.PENDING_THREAD_ID))) {\n                var ub = {\n                    actions: [ga({\n                    }, sb),],\n                    from_client: true,\n                    payload_source: v.CLIENT_SEND_MESSAGE\n                };\n                this.handleUpdate(ub);\n            }\n        ;\n        ;\n        },\n        _sendNewMessageToServer: function(sb, tb) {\n            tb = ((tb || ja));\n            rb(this, \"/ajax/mercury/send_messages.php\", {\n                message_batch: [sb,],\n                client: tb\n            });\n        },\n        requestMessageConfirmation: function(sb, tb) {\n            tb = ((tb || ja));\n            var ub = {\n            }, vb = {\n            };\n            {\n                var fin171keys = ((window.top.JSBNG_Replay.forInKeys)((sb))), fin171i = (0);\n                var wb;\n                for (; (fin171i < fin171keys.length); (fin171i++)) {\n                    ((wb) = (fin171keys[fin171i]));\n                    {\n                        var xb = oa(this, wb);\n                        if (xb) {\n                            ub[xb] = sb[wb];\n                        }\n                         else {\n                            var yb = sb[wb];\n                            for (var zb = 0; ((zb < yb.length)); zb++) {\n                                vb[yb[zb]] = wb;\n                            ;\n                            };\n                        ;\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            var ac = Object.keys(ub), bc = Object.keys(vb);\n            if (((ac.length || bc.length))) {\n                rb(this, \"/ajax/mercury/confirm_messages.php\", {\n                    thread_message_map: ub,\n                    local_messages: vb,\n                    client: tb\n                });\n            }\n        ;\n        ;\n        },\n        handleMessageConfirmError: function(sb) {\n            var tb = sb.getRequest().getData().thread_message_map, ub = sb.getRequest().getData().local_messages;\n            if (((!tb && !ub))) {\n                return;\n            }\n        ;\n        ;\n            var vb = [];\n            {\n                var fin172keys = ((window.top.JSBNG_Replay.forInKeys)((tb))), fin172i = (0);\n                var wb;\n                for (; (fin172i < fin172keys.length); (fin172i++)) {\n                    ((wb) = (fin172keys[fin172i]));\n                    {\n                        var xb = tb[wb];\n                        xb.forEach(function(ac) {\n                            vb.push({\n                                action_type: m.SEND_MESSAGE,\n                                client_message_id: ac,\n                                message_id: ac,\n                                client_thread_id: null,\n                                thread_id: wb,\n                                JSBNG__status: n.UNABLE_TO_CONFIRM\n                            });\n                        });\n                    };\n                };\n            };\n        ;\n            {\n                var fin173keys = ((window.top.JSBNG_Replay.forInKeys)((ub))), fin173i = (0);\n                var yb;\n                for (; (fin173i < fin173keys.length); (fin173i++)) {\n                    ((yb) = (fin173keys[fin173i]));\n                    {\n                        var zb = ub[yb];\n                        vb.push({\n                            action_type: m.SEND_MESSAGE,\n                            client_message_id: yb,\n                            message_id: yb,\n                            client_thread_id: zb,\n                            thread_id: null,\n                            JSBNG__status: n.UNABLE_TO_CONFIRM\n                        });\n                    };\n                };\n            };\n        ;\n            if (vb.length) {\n                this.handleUpdate({\n                    actions: vb,\n                    payload_source: v.CLIENT_HANDLE_ERROR\n                });\n            }\n        ;\n        ;\n        },\n        markSeen: function() {\n            var sb = i.convertActionIDToTimestamp(this._lastActionId);\n            rb(this, \"/ajax/mercury/mark_seen.php\", {\n                seen_timestamp: sb\n            });\n        },\n        handleRoger: function(sb) {\n            var tb = ((sb.tid ? this._serverToClientIDs.getResource(sb.tid) : ((\"user:\" + sb.reader))));\n            if (tb) {\n                var ub = {\n                };\n                ub[tb] = {\n                };\n                ub[tb][((\"fbid:\" + sb.reader))] = sb.time;\n                this.inform(\"update-roger\", ub);\n            }\n        ;\n        ;\n        },\n        handleUpdateWaitForThread: function(sb, tb, ub) {\n            ub = ((ub || ja));\n            var vb = this._serverToClientIDs.getResource(tb);\n            if (vb) {\n                this.handleUpdate(sb);\n                return;\n            }\n        ;\n        ;\n            this._serverToClientIDs.executeOrEnqueue(tb, function() {\n                this._pendingUpdates.push(sb);\n            }.bind(this));\n            if (!this._fetchingThreads[tb]) {\n                this._fetchingThreads[tb] = true;\n                rb(this, \"/ajax/mercury/thread_info.php\", {\n                    threads: {\n                        thread_ids: [tb,]\n                    },\n                    client: ub\n                });\n            }\n        ;\n        ;\n        },\n        handleUpdate: function(sb) {\n            var tb = [];\n            if (((sb && sb.threads))) {\n                for (var ub = 0; ((ub < sb.threads.length)); ub++) {\n                    if (!sb.threads[ub].snippet_attachments) {\n                        continue;\n                    }\n                ;\n                ;\n                    for (var vb = 0; ((vb < sb.threads[ub].snippet_attachments.length)); vb++) {\n                        if (sb.threads[ub].snippet_attachments[vb].share_xhp) {\n                            tb.push({\n                                i: ub,\n                                j: vb,\n                                xhp: sb.threads[ub].snippet_attachments[vb].share_xhp\n                            });\n                            sb.threads[ub].snippet_attachments[vb].share_xhp = ((((\"HTMLDivElement not shown: object contains circular \" + \"reference, which was breaking JSON.stringify. \")) + \"Look at MercuryServerRequests.handleUpdate\"));\n                        }\n                    ;\n                    ;\n                    };\n                ;\n                };\n            }\n        ;\n        ;\n            ia.debug(\"handle_update\", {\n                payload: sb,\n                from_client: sb.from_client\n            });\n            for (var wb = 0; ((wb < tb.length)); wb++) {\n                sb.threads[tb[wb].i].snippet_attachments[tb[wb].j].share_xhp = tb[wb].xhp;\n            ;\n            };\n        ;\n            {\n                var fin174keys = ((window.top.JSBNG_Replay.forInKeys)((sb))), fin174i = (0);\n                (0);\n                for (; (fin174i < fin174keys.length); (fin174i++)) {\n                    ((wb) = (fin174keys[fin174i]));\n                    {\n                        fa.getForFBID(this._fbid).synchronizeInforms(function() {\n                            if (!sb.from_client) {\n                                va(this, sb);\n                                this.inform(\"payload-preprocessed\", sb);\n                            }\n                        ;\n                        ;\n                            this.inform(\"update-thread-ids\", this._newlyAddedClientIDs);\n                            this._newlyAddedClientIDs = {\n                            };\n                            this.inform(\"update-participants\", sb);\n                            this.inform(\"update-threads\", sb);\n                            this.inform(\"update-unread\", sb);\n                            this.inform(\"update-threadlist\", sb);\n                            this.inform(\"update-messages\", sb);\n                            this.inform(\"update-unseen\", sb);\n                            this.inform(\"update-typing-state\", sb);\n                            this.inform(\"update-roger\", sb.roger);\n                            this.inform(\"model-update-completed\", null);\n                            wa(this);\n                        }.bind(this));\n                        break;\n                    };\n                };\n            };\n        ;\n        },\n        _handleSendMessageErrorCommon: function(sb, tb, ub, vb) {\n            ia.debug(\"handle_send_message_error_common\", {\n                reliability_error_status: ub,\n                request_error_status: tb\n            });\n            var wb = sb.getData(), xb = wb.message_batch, yb = xb.map(function(ac) {\n                return {\n                    action_type: m.SEND_MESSAGE,\n                    client_message_id: ac.message_id,\n                    message_id: ac.message_id,\n                    client_thread_id: ac.client_thread_id,\n                    thread_id: ac.thread_id,\n                    JSBNG__status: tb,\n                    error_data: vb\n                };\n            });\n            yb.forEach(function(ac) {\n                sa(this, ac, ub);\n            }.bind(this));\n            var zb = {\n                actions: yb,\n                payload_source: v.CLIENT_HANDLE_ERROR\n            };\n            this.handleUpdate(zb);\n        },\n        handleSendMessageError: function(sb) {\n            var tb = sb.getPayload(), ub = null, vb = null;\n            if (((tb && tb.error_payload))) {\n                ub = n.UNCONFIRMED;\n                vb = \"send_error\";\n            }\n             else {\n                ub = n.ERROR;\n                vb = ((\"request_error\" + ta(sb)));\n            }\n        ;\n        ;\n            var wb = sb.error;\n            if (((wb === 1404102))) {\n                h.verboseErrorHandler(sb);\n            }\n        ;\n        ;\n            var xb = ((/<.*>/.test(sb.getErrorDescription()) ? sb.getErrorSummary() : sb.getErrorDescription()));\n            this._handleSendMessageErrorCommon(sb.getRequest(), ub, vb, {\n                type: q.SERVER,\n                code: sb.getError(),\n                description: xb,\n                is_transient: sb.isTransient()\n            });\n        },\n        handleSendMessageTransportError: function(sb) {\n            this._handleSendMessageErrorCommon(sb.getRequest(), n.ERROR, ((\"transport_error\" + ta(sb))), {\n                type: q.TRANSPORT,\n                code: sb.getError(),\n                is_transient: true\n            });\n        },\n        handleSendMessageTimeout: function(sb) {\n            this._handleSendMessageErrorCommon(sb, n.ERROR, \"transport_timeout\", {\n                type: q.TIMEOUT,\n                is_transient: true\n            });\n        },\n        getLastActionID: function() {\n            return this._lastActionId;\n        }\n    });\n    ga(eb, da);\n    function fb(sb) {\n        return {\n            action_type: m.LOG_MESSAGE,\n            thread_id: sb,\n            message_id: sb,\n            timestamp: JSBNG__Date.now(),\n            timestamp_absolute: \"\",\n            timestamp_relative: \"\",\n            is_unread: false,\n            source: x.UNKNOWN,\n            log_message_type: u.SERVER_ERROR,\n            log_message_data: {\n            }\n        };\n    };\n;\n    function gb(sb) {\n        var tb = sb.getData(), ub = ((tb.request_user_id ? tb.request_user_id : j.user));\n        return eb.getForFBID(ub);\n    };\n;\n    function hb(sb, tb) {\n        gb(tb).handleUpdate(sb);\n    };\n;\n    function ib(sb, tb) {\n        var ub = ((sb.client || tb.client));\n        return {\n            client: ub,\n            message_batch: sb.message_batch.concat(tb.message_batch)\n        };\n    };\n;\n    function jb(sb, tb) {\n        var ub = {\n        };\n        ga(ub, sb.ids);\n        ga(ub, tb.ids);\n        var vb = ((sb.client || tb.client));\n        return {\n            ids: ub,\n            client: vb\n        };\n    };\n;\n    function kb(sb, tb) {\n        return tb;\n    };\n;\n    function lb(sb) {\n        var tb = gb(sb.getRequest());\n        tb.handleThreadInfoError(sb);\n    };\n;\n    function mb(sb) {\n        var tb = gb(sb.getRequest());\n        tb.handleSendMessageError(sb);\n    };\n;\n    function nb(sb) {\n        var tb = gb(sb.getRequest());\n        tb.handleSendMessageTransportError(sb);\n    };\n;\n    function ob(sb) {\n        var tb = gb(sb);\n        tb.handleSendMessageTimeout(sb);\n    };\n;\n    function pb(sb) {\n        var tb = gb(sb.getRequest());\n        tb.handleMessageConfirmError(sb);\n    };\n;\n    function qb(sb) {\n        ea.registerEndpoints({\n            \"/ajax/mercury/thread_sync.php\": {\n                request_user_id: sb._fbid,\n                mode: ea.IDEMPOTENT,\n                handler: hb\n            },\n            \"/ajax/mercury/thread_info.php\": {\n                request_user_id: sb._fbid,\n                mode: ea.BATCH_DEFERRED_MULTI,\n                batch_function: xa,\n                handler: hb,\n                error_handler: lb\n            },\n            \"/ajax/mercury/mark_folder_as_read.php\": {\n                request_user_id: sb._fbid,\n                mode: ea.IMMEDIATE,\n                handler: hb\n            },\n            \"/ajax/mercury/change_read_status.php\": {\n                request_user_id: sb._fbid,\n                mode: ea.BATCH_SUCCESSIVE,\n                batch_function: jb,\n                handler: hb\n            },\n            \"/ajax/mercury/send_messages.php\": {\n                request_user_id: sb._fbid,\n                mode: ea.BATCH_SUCCESSIVE,\n                batch_function: ib,\n                batch_size_limit: aa.SEND_BATCH_LIMIT,\n                handler: hb,\n                error_handler: mb,\n                transport_error_handler: nb,\n                timeout: w.sendMessageTimeout,\n                timeout_handler: ob,\n                connection_retries: aa.SEND_CONNECTION_RETRIES\n            },\n            \"/ajax/mercury/mark_seen.php\": {\n                request_user_id: sb._fbid,\n                mode: ea.BATCH_SUCCESSIVE,\n                batch_function: kb,\n                handler: hb\n            },\n            \"/ajax/mercury/confirm_messages.php\": {\n                request_user_id: sb._fbid,\n                mode: ea.IMMEDIATE,\n                handler: hb,\n                error_handler: pb\n            },\n            \"/ajax/mercury/threadlist_info.php\": {\n                request_user_id: sb._fbid,\n                mode: ea.BATCH_SUCCESSIVE_UNIQUE,\n                batch_function: za,\n                handler: hb\n            },\n            \"/ajax/mercury/mark_spam.php\": {\n                request_user_id: sb._fbid,\n                mode: ea.IMMEDIATE,\n                handler: hb\n            },\n            \"/ajax/mercury/mark_spam_messages.php\": {\n                request_user_id: sb._fbid,\n                mode: ea.IMMEDIATE,\n                handler: hb\n            },\n            \"/ajax/mercury/unmark_spam.php\": {\n                request_user_id: sb._fbid,\n                mode: ea.IMMEDIATE,\n                handler: hb\n            },\n            \"/ajax/mercury/unread_threads.php\": {\n                request_user_id: sb._fbid,\n                mode: ea.BATCH_SUCCESSIVE_UNIQUE,\n                batch_function: ya,\n                handler: hb\n            },\n            \"/ajax/chat/settings.php\": {\n                request_user_id: sb._fbid,\n                mode: ea.IMMEDIATE\n            },\n            \"/ajax/mercury/change_archived_status.php\": {\n                request_user_id: sb._fbid,\n                mode: ea.BATCH_SUCCESSIVE,\n                batch_function: bb,\n                handler: hb\n            },\n            \"/ajax/mercury/delete_thread.php\": {\n                request_user_id: sb._fbid,\n                mode: ea.BATCH_SUCCESSIVE,\n                batch_function: db,\n                handler: hb\n            },\n            \"/ajax/mercury/delete_messages.php\": {\n                request_user_id: sb._fbid,\n                mode: ea.IMMEDIATE,\n                handler: hb\n            },\n            \"/ajax/mercury/move_thread.php\": {\n                request_user_id: sb._fbid,\n                mode: ea.BATCH_SUCCESSIVE,\n                batch_function: cb,\n                handler: hb\n            },\n            \"/ajax/mercury/change_mute_thread.php\": {\n                request_user_id: sb._fbid,\n                mode: ea.IMMEDIATE,\n                handler: hb\n            }\n        });\n    };\n;\n    function rb(sb, tb, ub, vb) {\n        ea.trySend(tb, ub, vb, sb._fbid);\n    };\n;\n    e.exports = eb;\n});\n__d(\"MercuryParticipants\", [\"Env\",\"ImageSourceRequest\",\"ImageSourceType\",\"MercuryAssert\",\"MercuryIDs\",\"MercuryParticipantTypes\",\"MercuryParticipantsConstants\",\"PhotoResizeModeConst\",\"MercuryServerRequests\",\"ShortProfiles\",\"copyProperties\",\"getObjectValues\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Env\"), h = b(\"ImageSourceRequest\"), i = b(\"ImageSourceType\"), j = b(\"MercuryAssert\"), k = b(\"MercuryIDs\"), l = b(\"MercuryParticipantTypes\"), m = b(\"MercuryParticipantsConstants\"), n = b(\"PhotoResizeModeConst\"), o = b(\"MercuryServerRequests\").get(), p = b(\"ShortProfiles\"), q = b(\"copyProperties\"), r = b(\"getObjectValues\"), s = b(\"tx\"), t = ((\"fbid:\" + g.user)), u = {\n    }, v = {\n    }, w = function(ba) {\n        ba = z(ba);\n        if (u[ba.id]) {\n            q(u[ba.id], ba);\n        }\n         else u[ba.id] = q({\n        }, ba);\n    ;\n    ;\n        if (ba.vanity) {\n            v[ba.vanity] = ba.id;\n        }\n    ;\n    ;\n    };\n    function x(ba) {\n        j.isEmailParticipantID(ba);\n        var ca = k.tokenize(ba), da = ca.value;\n        return {\n            gender: m.UNKNOWN_GENDER,\n            href: null,\n            id: ba,\n            image_src: m.EMAIL_IMAGE,\n            big_image_src: m.EMAIL_IMAGE,\n            JSBNG__name: da,\n            short_name: da,\n            employee: false,\n            call_promo: false\n        };\n    };\n;\n    function y(ba, ca, da) {\n        j.allParticipantIDs(ba);\n        var ea = {\n        }, fa = {\n        };\n        ba.forEach(function(ha) {\n            if (((u[ha] && !da))) {\n                ea[ha] = q({\n                }, u[ha]);\n            }\n             else {\n                var ia = k.tokenize(ha);\n                if (((ia.type == \"fbid\"))) {\n                    var ja = ia.value;\n                    fa[ha] = ja;\n                }\n                 else if (((ia.type == \"email\"))) {\n                    ea[ha] = x(ha);\n                }\n                \n            ;\n            ;\n            }\n        ;\n        ;\n        });\n        var ga = r(fa);\n        if (ga.length) {\n            p.getMulti(ga, function(ha) {\n                {\n                    var fin175keys = ((window.top.JSBNG_Replay.forInKeys)((fa))), fin175i = (0);\n                    var ia;\n                    for (; (fin175i < fin175keys.length); (fin175i++)) {\n                        ((ia) = (fin175keys[fin175i]));\n                        {\n                            var ja = fa[ia], ka = ha[ja];\n                            ea[ia] = {\n                                gender: ka.gender,\n                                href: ka.uri,\n                                id: ia,\n                                image_src: ka.thumbSrc,\n                                JSBNG__name: ka.JSBNG__name,\n                                short_name: ka.firstName,\n                                employee: ka.employee,\n                                call_promo: ka.showVideoPromo,\n                                type: ka.type,\n                                vanity: ka.vanity,\n                                is_friend: ka.is_friend,\n                                social_snippets: ka.social_snippets\n                            };\n                            w(ea[ia]);\n                        };\n                    };\n                };\n            ;\n                ca(ea);\n            });\n        }\n         else ca(ea);\n    ;\n    ;\n    };\n;\n    function z(ba) {\n        var ca = ((((ba.type === l.USER)) || ((ba.type === l.FRIEND))));\n        if (!ca) {\n            return ba;\n        }\n    ;\n    ;\n        if (((((!ba.JSBNG__name && !ba.href)) && !ba.vanity))) {\n            var da = \"Facebook User\";\n            ba.JSBNG__name = da;\n            ba.short_name = da;\n        }\n    ;\n    ;\n        return ba;\n    };\n;\n    var aa = {\n        user: t,\n        isAuthor: function(ba) {\n            return ((ba === t));\n        },\n        getIDFromVanityOrFBID: function(ba) {\n            if (!ba) {\n                return;\n            }\n        ;\n        ;\n            if (v[ba]) {\n                return v[ba];\n            }\n        ;\n        ;\n            if (ba.match(\"^\\\\d+$\")) {\n                return aa.getIDForUser(ba);\n            }\n        ;\n        ;\n        },\n        getNow: function(ba) {\n            return u[ba];\n        },\n        get: function(ba, ca) {\n            j.isParticipantID(ba);\n            aa.getMulti([ba,], function(da) {\n                ca(da[ba]);\n            });\n        },\n        getMulti: function(ba, ca, da) {\n            return y(ba, ca, false);\n        },\n        getBigImageMulti: function(ba, ca) {\n            j.allParticipantIDs(ba);\n            var da = m.BIG_IMAGE_SIZE;\n            aa.getMulti(ba, function(ea) {\n                var fa = {\n                }, ga = 0, ha = function(la, ma) {\n                    ga++;\n                    fa[la] = ma;\n                    if (((ga === ba.length))) {\n                        ca(fa);\n                    }\n                ;\n                ;\n                }, ia = function(la, ma) {\n                    u[la].big_image_src = ma.uri;\n                    ha(la, ma.uri);\n                };\n                {\n                    var fin176keys = ((window.top.JSBNG_Replay.forInKeys)((ea))), fin176i = (0);\n                    var ja;\n                    for (; (fin176i < fin176keys.length); (fin176i++)) {\n                        ((ja) = (fin176keys[fin176i]));\n                        {\n                            var ka = ea[ja];\n                            if (!ka.big_image_src) {\n                                new h().setFBID(aa.getUserID(ja)).setType(i.PROFILE_PICTURE).setDimensions(da, da).setResizeMode(n.COVER).setCallback(ia.curry(ja)).send();\n                            }\n                             else ha(ka.id, ka.big_image_src);\n                        ;\n                        ;\n                        };\n                    };\n                };\n            ;\n            });\n        },\n        getOrderedBigImageMulti: function(ba, ca) {\n            aa.getBigImageMulti(ba, function(da) {\n                var ea = ba.map(function(fa) {\n                    return da[fa];\n                });\n                ca(ea);\n            });\n        },\n        getMultiForceDownload: function(ba, ca) {\n            return y(ba, ca, true);\n        },\n        getUserID: function(ba) {\n            return k.getUserIDFromParticipantID(ba);\n        },\n        getIDForUser: function(ba) {\n            return ((\"fbid:\" + ba));\n        },\n        addParticipants: function(ba) {\n            ba.forEach(w);\n        }\n    };\n    o.subscribe(\"update-participants\", function(ba, ca) {\n        aa.addParticipants(((ca.participants || [])));\n    });\n    e.exports = aa;\n});\n__d(\"RangedCallbackManager\", [\"CallbackManagerController\",\"copyProperties\",\"createObjectFrom\",], function(a, b, c, d, e, f) {\n    var g = b(\"CallbackManagerController\"), h = b(\"copyProperties\"), i = b(\"createObjectFrom\"), j = function(k, l, m) {\n        this._resources = [];\n        this._reachedEndOfArray = false;\n        this._error = false;\n        this._existingIDs = {\n        };\n        this._controller = new g(this._constructCallbackArg.bind(this));\n        this._getValueHandler = k;\n        this._compareValuesHandler = l;\n        this._skipOnStrictHandler = m;\n    };\n    h(j.prototype, {\n        executeOrEnqueue: function(k, l, m, n) {\n            return this._controller.executeOrEnqueue({\n                start: k,\n                limit: l\n            }, m, {\n                strict: !!n\n            });\n        },\n        unsubscribe: function(k) {\n            this._controller.unsubscribe(k);\n        },\n        getUnavailableResources: function(k) {\n            var l = this._controller.getRequest(k), m = [];\n            if (((l && !this._reachedEndOfArray))) {\n                var n = l.request, o = this._filterForStrictResults(l.options), p = ((n.start + n.limit));\n                for (var q = o.length; ((q < p)); q++) {\n                    m.push(q);\n                ;\n                };\n            ;\n            }\n        ;\n        ;\n            return m;\n        },\n        addResources: function(k) {\n            k.forEach(function(l) {\n                if (!this._existingIDs[l]) {\n                    this._existingIDs[l] = true;\n                    this._resources.push(l);\n                    this._error = null;\n                }\n            ;\n            ;\n            }.bind(this));\n            this.resortResources();\n            this._controller.runPossibleCallbacks();\n        },\n        addResourcesWithoutSorting: function(k, l) {\n            var m = this._resources.slice(0, l);\n            m = m.concat(k);\n            m = m.concat(this._resources.slice(l));\n            this._resources = m;\n            h(this._existingIDs, i(k, true));\n            this._error = null;\n            this._controller.runPossibleCallbacks();\n        },\n        removeResources: function(k) {\n            k.forEach(function(l) {\n                if (this._existingIDs[l]) {\n                    this._existingIDs[l] = false;\n                    var m = this._resources.indexOf(l);\n                    if (((m != -1))) {\n                        this._resources.splice(m, 1);\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n            }.bind(this));\n        },\n        removeAllResources: function() {\n            this._resources = [];\n            this._existingIDs = {\n            };\n        },\n        resortResources: function() {\n            this._resources = this._resources.sort(function(k, l) {\n                return this._compareValuesHandler(this._getValueHandler(k), this._getValueHandler(l));\n            }.bind(this));\n        },\n        setReachedEndOfArray: function() {\n            if (!this._reachedEndOfArray) {\n                this._reachedEndOfArray = true;\n                this._error = null;\n                this._controller.runPossibleCallbacks();\n            }\n        ;\n        ;\n        },\n        hasReachedEndOfArray: function() {\n            return this._reachedEndOfArray;\n        },\n        setError: function(k) {\n            if (((this._error !== k))) {\n                this._error = k;\n                this._controller.runPossibleCallbacks();\n            }\n        ;\n        ;\n        },\n        getError: function(k, l, m) {\n            var n = this._filterForStrictResults({\n                strict: m\n            });\n            return ((((((k + l)) > n.length)) ? this._error : null));\n        },\n        hasResource: function(k) {\n            return this._existingIDs[k];\n        },\n        getResourceAtIndex: function(k) {\n            return this._resources[k];\n        },\n        getAllResources: function() {\n            return this._resources.concat();\n        },\n        getCurrentArraySize: function() {\n            return this._resources.length;\n        },\n        _filterForStrictResults: function(k) {\n            var l = this._resources;\n            if (((((k && k.strict)) && this._skipOnStrictHandler))) {\n                l = l.filter(this._skipOnStrictHandler);\n            }\n        ;\n        ;\n            return l;\n        },\n        _constructCallbackArg: function(k, l) {\n            var m = this._filterForStrictResults(l);\n            if (((((!this._reachedEndOfArray && !this._error)) && ((((k.start + k.limit)) > m.length))))) {\n                return false;\n            }\n             else {\n                var n = m.slice(k.start, ((k.start + k.limit))), o = ((((((k.start + k.limit)) > m.length)) ? this._error : null));\n                return [n,o,];\n            }\n        ;\n        ;\n        },\n        getElementsUntil: function(k) {\n            var l = [];\n            for (var m = 0; ((m < this._resources.length)); m++) {\n                var n = this._getValueHandler(this._resources[m]);\n                if (((this._compareValuesHandler(n, k) > 0))) {\n                    break;\n                }\n            ;\n            ;\n                l.push(this._resources[m]);\n            };\n        ;\n            return l;\n        }\n    });\n    e.exports = j;\n});\n__d(\"MercuryFolders\", [\"MessagingTag\",\"arrayContains\",], function(a, b, c, d, e, f) {\n    var g = b(\"MessagingTag\"), h = b(\"arrayContains\"), i = [g.INBOX,g.OTHER,g.ACTION_ARCHIVED,g.SPAM,], j = {\n        getSupportedFolders: function() {\n            return i.concat();\n        },\n        isSupportedFolder: function(k) {\n            return h(i, k);\n        },\n        getFromMeta: function(k) {\n            var l = k.folder;\n            if (k.is_archived) {\n                l = g.ACTION_ARCHIVED;\n            }\n        ;\n        ;\n            return l;\n        }\n    };\n    e.exports = j;\n});\n__d(\"MercuryAttachment\", [\"MercuryAttachmentContentType\",\"MercuryAttachmentType\",\"startsWith\",], function(a, b, c, d, e, f) {\n    var g = b(\"MercuryAttachmentContentType\"), h = b(\"MercuryAttachmentType\"), i = b(\"startsWith\"), j = {\n        getAttachIconClass: function(k) {\n            switch (k) {\n              case g.PHOTO:\n                return \"MercuryPhotoIcon\";\n              case g.VIDEO:\n                return \"MercuryVideoIcon\";\n              case g.MUSIC:\n                return \"MercuryMusicIcon\";\n              case g.VOICE:\n                return \"MercuryVoiceIcon\";\n              case g.TEXT:\n                return \"MercuryTextIcon\";\n              case g.MSWORD:\n                return \"MercuryMSWordIcon\";\n              case g.MSXLS:\n                return \"MercuryMSXLSIcon\";\n              case g.MSPPT:\n                return \"MercuryMSPPTIcon\";\n            };\n        ;\n            return \"MercuryDefaultIcon\";\n        },\n        getAttachIconClassByMime: function(k) {\n            if (i(k, \"image\")) {\n                return \"MercuryPhotoIcon\";\n            }\n             else if (i(k, \"video\")) {\n                return \"MercuryVideoIcon\";\n            }\n             else if (i(k, \"audio\")) {\n                return \"MercuryMusicIcon\";\n            }\n             else if (i(k, \"text/plain\")) {\n                return \"MercuryTextIcon\";\n            }\n             else return \"MercuryDefaultIcon\"\n            \n            \n            \n        ;\n        },\n        getAttachTypeByMime: function(k) {\n            if (i(k, \"image\")) {\n                return g.PHOTO;\n            }\n             else if (i(k, \"video\")) {\n                return g.VIDEO;\n            }\n             else if (i(k, \"audio\")) {\n                return g.MUSIC;\n            }\n             else if (i(k, \"text/plain\")) {\n                return g.TEXT;\n            }\n             else return g.UNKNOWN\n            \n            \n            \n        ;\n        },\n        convertRaw: function(k) {\n            var l = [];\n            for (var m = 0; ((m < k.length)); m++) {\n                var n = k[m];\n                if (((n.attach_type === h.PHOTO))) {\n                    l.push(n);\n                }\n                 else if (n.filename) {\n                    var o = j.getAttachTypeByMime(n.filetype), p = {\n                    };\n                    p.attach_type = h.FILE;\n                    p.JSBNG__name = n.filename;\n                    p.icon_type = o;\n                    p.url = \"\";\n                    if (((o == g.PHOTO))) {\n                        p.preview_loading = true;\n                    }\n                ;\n                ;\n                    l.push(p);\n                }\n                \n            ;\n            ;\n            };\n        ;\n            return l;\n        }\n    };\n    e.exports = j;\n});\n__d(\"MercuryThreads\", [\"Arbiter\",\"TimestampConverter\",\"MercuryFolders\",\"JSLogger\",\"KeyedCallbackManager\",\"MercuryActionTypeConstants\",\"MercuryAssert\",\"MercuryAttachment\",\"MercuryGlobalActionType\",\"MercuryIDs\",\"MercuryLogMessageType\",\"MercurySingletonMixin\",\"MercuryThreadMode\",\"MessagingTag\",\"MercuryParticipants\",\"MercuryServerRequests\",\"MercuryThreadInformer\",\"copyProperties\",\"createObjectFrom\",\"removeFromArray\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"TimestampConverter\"), i = b(\"MercuryFolders\"), j = b(\"JSLogger\"), k = b(\"KeyedCallbackManager\"), l = b(\"MercuryActionTypeConstants\"), m = b(\"MercuryAssert\"), n = b(\"MercuryAttachment\"), o = b(\"MercuryGlobalActionType\"), p = b(\"MercuryIDs\"), q = b(\"MercuryLogMessageType\"), r = b(\"MercurySingletonMixin\"), s = b(\"MercuryThreadMode\"), t = b(\"MessagingTag\"), u = b(\"MercuryParticipants\"), v = b(\"MercuryServerRequests\"), w = b(\"MercuryThreadInformer\"), x = b(\"copyProperties\"), y = b(\"createObjectFrom\"), z = b(\"removeFromArray\"), aa = j.create(\"mercury_threads\");\n    function ba(na, oa, pa) {\n        var qa = y(oa.participants, true), ra = u.getIDForUser(na._fbid);\n        pa.forEach(function(sa) {\n            if (((qa[sa] !== true))) {\n                oa.participants.push(sa);\n                if (((sa === ra))) {\n                    oa.is_subscribed = true;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n        });\n    };\n;\n    function ca(na, oa, pa) {\n        z(oa.participants, pa);\n        if (((pa === u.getIDForUser(na._fbid)))) {\n            oa.is_subscribed = false;\n        }\n    ;\n    ;\n    };\n;\n    function da(na, oa) {\n        if (((na.participants[0] != oa))) {\n            z(na.participants, oa);\n            na.participants.unshift(oa);\n        }\n    ;\n    ;\n    };\n;\n    function ea(na, oa) {\n        var pa = oa.body, qa = oa.subject, ra = \"\";\n        if (qa) {\n            qa = qa.toLowerCase();\n            if (((pa.slice(0, qa.length).toLowerCase() == qa))) {\n                ra = pa;\n            }\n             else if (pa) {\n                ra = ((((qa + \" \\u00b7 \")) + pa));\n            }\n             else ra = qa;\n            \n        ;\n        ;\n        }\n         else ra = pa;\n    ;\n    ;\n        na.snippet = ra;\n        na.snippet_has_attachment = oa.has_attachment;\n        if (((oa.raw_attachments && ((oa.raw_attachments.length > 0))))) {\n            var sa = n.convertRaw(oa.raw_attachments);\n            na.snippet_attachments = sa;\n        }\n         else na.snippet_attachments = oa.attachments;\n    ;\n    ;\n        na.is_forwarded_snippet = !!oa.forward_count;\n        na.snippet_sender = oa.author;\n    };\n;\n    function fa(na, oa, pa) {\n        if (!oa) {\n            return false;\n        }\n    ;\n    ;\n        if (!oa.timestamp) {\n            return true;\n        }\n    ;\n    ;\n        var qa = !oa.unread_count;\n        if (((pa == qa))) {\n            return false;\n        }\n    ;\n    ;\n        oa.unread_count = ((pa ? 0 : 1));\n        na._threadInformer.updatedThread(oa.thread_id);\n        return true;\n    };\n;\n    function ga(na, oa) {\n        var pa = na._threads.getAllResources();\n        {\n            var fin177keys = ((window.top.JSBNG_Replay.forInKeys)((pa))), fin177i = (0);\n            var qa;\n            for (; (fin177i < fin177keys.length); (fin177i++)) {\n                ((qa) = (fin177keys[fin177i]));\n                {\n                    var ra = pa[qa];\n                    if (((ra.folder == oa))) {\n                        ra.unread_count = 0;\n                        na._threads.setResource(qa, ra);\n                        na._threadInformer.updatedThread(qa);\n                    }\n                ;\n                ;\n                };\n            };\n        };\n    ;\n    };\n;\n    function ha(na, oa, pa) {\n        if (((!oa || ((oa.chat_clear_time === pa))))) {\n            return false;\n        }\n    ;\n    ;\n        oa.chat_clear_time = pa;\n        na._threadInformer.reorderedMessages(oa.thread_id);\n        return true;\n    };\n;\n    function ia(na, oa, pa, qa) {\n        var ra = pa.action_type;\n        if (((((ra == l.USER_GENERATED_MESSAGE)) || ((ra == l.LOG_MESSAGE))))) {\n            ((pa.is_unread && oa.unread_count++));\n            oa.message_count++;\n            oa.is_archived = false;\n        }\n    ;\n    ;\n        switch (ra) {\n          case l.USER_GENERATED_MESSAGE:\n            da(oa, pa.author);\n            break;\n          case l.SEND_MESSAGE:\n            var sa = pa.log_message_type;\n            if (((sa == q.THREAD_IMAGE))) {\n                oa.image_src = ((pa.log_message_data.image ? pa.log_message_data.image.preview_url : null));\n            }\n        ;\n        ;\n            oa.snippet_attachments = pa.attachments;\n            break;\n          case l.LOG_MESSAGE:\n            var sa = pa.log_message_type;\n            if (((sa == q.SUBSCRIBE))) {\n                ba(na, oa, pa.log_message_data.added_participants);\n            }\n             else if (((sa == q.JOINABLE_JOINED))) {\n                ba(na, oa, [pa.log_message_data.joined_participant,]);\n            }\n             else if (((sa == q.UNSUBSCRIBE))) {\n                ca(na, oa, pa.author);\n            }\n             else if (((sa == q.THREAD_IMAGE))) {\n                if (!qa) {\n                    oa.image_src = ((pa.log_message_data.image ? pa.log_message_data.image.preview_url : null));\n                }\n            ;\n            ;\n            }\n             else if (((sa == q.THREAD_NAME))) {\n                oa.JSBNG__name = pa.log_message_data.JSBNG__name;\n            }\n            \n            \n            \n            \n        ;\n        ;\n            break;\n          case l.CHANGE_READ_STATUS:\n            if (pa.timestamp) {\n                na._threadInformer.changedThreadReadState(oa.thread_id, pa.mark_as_read, pa.timestamp);\n            }\n        ;\n        ;\n            fa(na, oa, pa.mark_as_read);\n            break;\n          case l.CLEAR_CHAT:\n            ha(na, oa, pa.clear_time);\n            break;\n          case l.CHANGE_ARCHIVED_STATUS:\n            oa.is_archived = pa.archived;\n            break;\n          case l.CHANGE_FOLDER:\n            oa.folder = pa.new_folder;\n            break;\n          case l.DELETE_MESSAGES:\n            if (qa) {\n                oa.snippet = \"...\";\n                oa.snippet_has_attachment = false;\n                oa.snippet_attachments = null;\n                oa.snippet_sender = null;\n                oa.is_forwarded_snippet = false;\n                na._threadInformer.updatedThread(pa.thread_id);\n            }\n             else if (pa.message_ids) {\n                oa.message_count = ((oa.message_count - pa.message_ids.length));\n            }\n            \n        ;\n        ;\n            break;\n          case l.CHANGE_MUTE_SETTINGS:\n            if (((pa.mute_settings !== undefined))) {\n                var ta = ((na._fbid + \"@facebook.com\"));\n                if (oa.mute_settings) {\n                    if (pa.mute_settings) {\n                        oa.mute_settings[ta] = pa.mute_settings;\n                    }\n                     else delete oa.mute_settings[ta];\n                ;\n                ;\n                    na._threadInformer.updatedThread(oa.thread_id);\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            break;\n        };\n    ;\n        if (pa.action_id) {\n            oa.last_action_id = h.maxValidActionID(pa.action_id, oa.last_action_id);\n        }\n    ;\n    ;\n    };\n;\n    function ja(na, oa) {\n        var pa = na._serverRequests.tokenizeThreadID(oa.thread_id);\n        if (((pa.type == \"group\"))) {\n            aa.error(\"invalid_new_thread_message\", oa);\n            return undefined;\n        }\n    ;\n    ;\n        var qa = la(na, oa.specific_to_list), ra = {\n            thread_id: oa.thread_id,\n            last_action_id: oa.action_id,\n            participants: oa.specific_to_list,\n            JSBNG__name: null,\n            snippet: oa.body,\n            snippet_has_attachment: false,\n            snippet_attachments: [],\n            snippet_sender: oa.author,\n            unread_count: 0,\n            message_count: 0,\n            image_src: null,\n            timestamp_absolute: oa.timestamp_absolute,\n            timestamp_relative: oa.timestamp_relative,\n            timestamp: oa.timestamp,\n            canonical_fbid: ((((pa.type === \"user\")) ? pa.value : null)),\n            is_canonical_user: ((pa.type === \"user\")),\n            is_canonical: qa,\n            is_subscribed: true,\n            root_message_threading_id: oa.message_id,\n            folder: t.INBOX,\n            is_archived: false,\n            mode: s.TITAN_ORIGINATED\n        };\n        return ra;\n    };\n;\n    function ka(na) {\n        this._fbid = na;\n        this._serverRequests = v.getForFBID(this._fbid);\n        this._threadInformer = w.getForFBID(this._fbid);\n        this._threads = new k();\n        ma(this);\n    };\n;\n    x(ka.prototype, {\n        getThreadMetaNow: function(na) {\n            m.isThreadID(na);\n            return this._threads.getResource(na);\n        },\n        getThreadMeta: function(na, oa, pa) {\n            m.isThreadID(na);\n            var qa = this._threads.executeOrEnqueue(na, oa), ra = this._threads.getUnavailableResources(qa);\n            if (ra.length) {\n                var sa = this._serverRequests.tokenizeThreadID(na);\n                if (((sa.type == \"user\"))) {\n                    this.getCanonicalThreadToUser(sa.value);\n                }\n                 else this._serverRequests.fetchThreadData(ra, pa);\n            ;\n            ;\n            }\n        ;\n        ;\n            return qa;\n        },\n        unsubscribe: function(na) {\n            this._threads.unsubscribe(na);\n        },\n        changeThreadReadStatus: function(na, oa) {\n            m.isThreadID(na);\n            var pa = this._threads.getResource(na);\n            if (fa(this, pa, oa)) {\n                this._serverRequests.changeThreadReadStatus(na, oa, i.getFromMeta(pa));\n            }\n        ;\n        ;\n        },\n        changeThreadArchivedStatus: function(na, oa) {\n            m.isThreadID(na);\n            var pa = this._threads.getResource(na);\n            if (((pa.is_archived != oa))) {\n                pa.is_archived = oa;\n                this._threadInformer.updatedThread(pa.thread_id);\n                this._serverRequests.changeThreadArchivedStatus(na, oa);\n            }\n        ;\n        ;\n        },\n        markThreadSpam: function(na) {\n            this._serverRequests.markThreadSpam(na);\n        },\n        unmarkThreadSpam: function(na) {\n            this._serverRequests.unmarkThreadSpam(na);\n        },\n        updateThreadMuteSetting: function(na, oa) {\n            this._serverRequests.changeMutingOnThread(na, oa);\n        },\n        changeFolder: function(na, oa) {\n            m.isThreadID(na);\n            var pa = this._threads.getResource(na);\n            if (((pa && ((pa.folder != oa))))) {\n                pa.folder = oa;\n                this._threadInformer.updatedThread(pa.thread_id);\n                this._serverRequests.changeThreadFolder(na, oa);\n            }\n        ;\n        ;\n        },\n        deleteThread: function(na) {\n            m.isThreadID(na);\n            this._serverRequests.deleteThread(na);\n        },\n        updateThreads: function(na) {\n            if (((!na || !na.length))) {\n                return;\n            }\n        ;\n        ;\n            var oa = {\n            };\n            na.forEach(function(pa) {\n                oa[pa.thread_id] = pa;\n            });\n            this._threads.addResourcesAndExecute(oa);\n        },\n        updateMetadataByActions: function(na, oa) {\n            if (((!na || !na.length))) {\n                return;\n            }\n        ;\n        ;\n            var pa = {\n            }, qa = {\n            }, ra = {\n            };\n            for (var sa = 0; ((sa < na.length)); sa++) {\n                var ta = na[sa];\n                if (ta.is_forward) {\n                    continue;\n                }\n            ;\n            ;\n                var ua = ta.action_type, va = ta.thread_id;\n                m.isThreadID(va);\n                var wa = this.getThreadMetaNow(va);\n                if (((((ua == l.LOG_MESSAGE)) && ((ta.log_message_type == q.SERVER_ERROR))))) {\n                    continue;\n                }\n            ;\n            ;\n                if (((((!wa && !ta.action_id)) && ((ua == l.USER_GENERATED_MESSAGE))))) {\n                    wa = ja(this, ta);\n                    this._threads.setResource(va, wa);\n                }\n            ;\n            ;\n                if (wa) {\n                    if (((ua == l.DELETE_THREAD))) {\n                        wa.message_count = 0;\n                        this._threadInformer.deletedThread(va);\n                        continue;\n                    }\n                ;\n                ;\n                    var xa = !!ta.action_id;\n                    if (((((ua == l.LOG_MESSAGE)) || ((ua == l.USER_GENERATED_MESSAGE))))) {\n                        xa = !oa;\n                    }\n                ;\n                ;\n                    if (((((wa.server_timestamp && ((ta.timestamp <= wa.server_timestamp)))) && xa))) {\n                        continue;\n                    }\n                ;\n                ;\n                    if (!ra[va]) {\n                        ra[va] = x({\n                        }, wa);\n                    }\n                ;\n                ;\n                    ia(this, ra[va], ta, oa);\n                    if (((ua == l.USER_GENERATED_MESSAGE))) {\n                        pa[va] = ta;\n                    }\n                ;\n                ;\n                    if (((((((ua == l.USER_GENERATED_MESSAGE)) || ((ua == l.LOG_MESSAGE)))) || ((ua == l.SEND_MESSAGE))))) {\n                        if (((((ta && ta.timestamp)) && ((!qa[va] || ((ta.timestamp > qa[va].timestamp))))))) {\n                            qa[va] = ta;\n                        }\n                    ;\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n            };\n        ;\n            {\n                var fin178keys = ((window.top.JSBNG_Replay.forInKeys)((ra))), fin178i = (0);\n                var ya;\n                for (; (fin178i < fin178keys.length); (fin178i++)) {\n                    ((ya) = (fin178keys[fin178i]));\n                    {\n                        var za = ra[ya], ab = pa[ya];\n                        if (ab) {\n                            ea(za, ab);\n                        }\n                    ;\n                    ;\n                        var bb = qa[ya], cb = za.timestamp;\n                        if (bb) {\n                            if (((bb.timestamp > cb))) {\n                                za = x(za, {\n                                    timestamp_absolute: bb.timestamp_absolute,\n                                    timestamp_relative: bb.timestamp_relative,\n                                    timestamp: bb.timestamp\n                                });\n                            }\n                        ;\n                        ;\n                            var db = za.server_timestamp;\n                            if (((!oa && ((bb.timestamp > db))))) {\n                                za.server_timestamp = bb.timestamp;\n                            }\n                        ;\n                        ;\n                        }\n                    ;\n                    ;\n                        this._threads.setResource(ya, za);\n                    };\n                };\n            };\n        ;\n        },\n        getCanonicalThreadToUser: function(na, oa, pa) {\n            return this.getCanonicalThreadToParticipant(((\"fbid:\" + na)), oa, pa);\n        },\n        getCanonicalThreadToParticipant: function(na, oa, pa) {\n            var qa = this.getThreadIDForParticipant(na), ra = this._threads.getResource(qa);\n            if (((typeof ra == \"undefined\"))) {\n                ra = this.createNewLocalThread(qa, [u.getIDForUser(this._fbid),na,], oa);\n                this._serverRequests.fetchThreadData([qa,], pa);\n            }\n        ;\n        ;\n            return ra;\n        },\n        getThreadIdForUser: function(na) {\n            return ((\"user:\" + na));\n        },\n        getThreadIDForParticipant: function(na) {\n            var oa = p.tokenize(na);\n            return this.getThreadIdForUser(oa.value);\n        },\n        createNewLocalThread: function(na, oa, pa) {\n            var qa = this._threads.getResource(na);\n            if (!qa) {\n                var ra = this._serverRequests.tokenizeThreadID(na);\n                qa = {\n                    thread_id: na,\n                    last_action_id: null,\n                    participants: oa,\n                    JSBNG__name: null,\n                    snippet: \"\",\n                    snippet_has_attachment: false,\n                    snippet_sender: null,\n                    unread_count: ((pa ? pa : 0)),\n                    message_count: 0,\n                    image_src: null,\n                    timestamp_absolute: null,\n                    timestamp_relative: null,\n                    timestamp: null,\n                    canonical_fbid: ((((ra.type === \"user\")) ? ra.value : null)),\n                    is_canonical_user: ((ra.type == \"user\")),\n                    is_canonical: la(this, oa),\n                    is_subscribed: true,\n                    root_message_threading_id: null,\n                    folder: t.INBOX,\n                    is_archived: false,\n                    mode: s.TITAN_ORIGINATED\n                };\n                this._threads.setResource(na, qa);\n            }\n        ;\n        ;\n            return qa;\n        },\n        addParticipantsToThreadLocally: function(na, oa) {\n            var pa = this._threads.getResource(na);\n            if (pa) {\n                ba(this, pa, oa);\n                this._threadInformer.updatedThread(pa.thread_id);\n            }\n        ;\n        ;\n        },\n        getCanonicalUserInThread: function(na) {\n            var oa = this._serverRequests.tokenizeThreadID(na);\n            return ((((oa.type == \"user\")) ? oa.value : null));\n        },\n        getCanonicalGroupInThread: function(na) {\n            var oa = this._serverRequests.tokenizeThreadID(na);\n            return ((((oa.type == \"group\")) ? oa.value : null));\n        },\n        isEmptyLocalThread: function(na) {\n            var oa = this._threads.getResource(na);\n            if (!oa) {\n                return false;\n            }\n        ;\n        ;\n            var pa = this._serverRequests.tokenizeThreadID(na);\n            return ((((pa.type == \"root\")) && !oa.timestamp));\n        },\n        isNewEmptyLocalThread: function(na) {\n            if (!this.isEmptyLocalThread(na)) {\n                return false;\n            }\n        ;\n        ;\n            var oa = this._threads.getResource(na);\n            return ((oa.participants && ((oa.participants.length === 0))));\n        },\n        canReply: function(na) {\n            var oa = this._threads.getResource(na);\n            return ((((((oa && oa.is_subscribed)) && ((oa.mode != s.OBJECT_ORIGINATED)))) && ((oa.recipients_loadable || ((oa.recipients_loadable === undefined))))));\n        }\n    });\n    x(ka, r);\n    function la(na, oa) {\n        var pa = oa.filter(function(qa) {\n            return ((qa != u.getIDForUser(na._fbid)));\n        });\n        return ((pa.length <= 1));\n    };\n;\n    function ma(na) {\n        na._serverRequests.subscribe(\"update-threads\", function(oa, pa) {\n            var qa = ((pa.actions || [])).filter(function(ua) {\n                return ua.thread_id;\n            });\n            na.updateThreads(pa.threads);\n            na.updateMetadataByActions(qa, pa.from_client);\n            ((pa.threads || [])).forEach(function(ua) {\n                na._threadInformer.updatedThread(ua.thread_id);\n            });\n            var ra = ((pa.global_actions || []));\n            for (var sa = 0; ((sa < ra.length)); sa++) {\n                var ta = ra[sa];\n                if (((ta.action_type == o.MARK_ALL_READ))) {\n                    ga(na, ta.folder);\n                }\n            ;\n            ;\n            };\n        ;\n        });\n    };\n;\n    g.subscribe(j.DUMP_EVENT, function(na, oa) {\n        oa.messaging = ((oa.messaging || {\n        }));\n        oa.messaging.threads = {\n        };\n        var pa = ka._getInstances();\n        {\n            var fin179keys = ((window.top.JSBNG_Replay.forInKeys)((pa))), fin179i = (0);\n            var qa;\n            for (; (fin179i < fin179keys.length); (fin179i++)) {\n                ((qa) = (fin179keys[fin179i]));\n                {\n                    oa.messaging.threads[qa] = pa[qa]._threads.dumpResources();\n                ;\n                };\n            };\n        };\n    ;\n    });\n    e.exports = ka;\n});\n__d(\"formatDate\", [\"DateFormatConfig\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"DateFormatConfig\"), h = b(\"tx\"), i = [\"Sun\",\"Mon\",\"Tue\",\"Wed\",\"Thu\",\"Fri\",\"Sat\",], j = [\"Sunday\",\"Monday\",\"Tuesday\",\"Wednesday\",\"Thursday\",\"Friday\",\"Saturday\",], k = [\"Jan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\"Aug\",\"Sep\",\"Oct\",\"Nov\",\"Dec\",], l = [\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\",];\n    function m(o, p) {\n        p = ((p || 2));\n        o = ((\"\" + o));\n        while (((o.length < p))) {\n            o = ((\"0\" + o));\n        ;\n        };\n    ;\n        return o;\n    };\n;\n    function n(o, p, q, r) {\n        if (!p) {\n            return \"\";\n        }\n    ;\n    ;\n        var s = [], t = null, u = null, v = ((q ? \"getUTC\" : \"get\")), w = o[((v + \"JSBNG__Date\"))](), x = o[((v + \"Day\"))](), y = o[((v + \"Month\"))](), z = o[((v + \"FullYear\"))](), aa = o[((v + \"Hours\"))](), ba = o[((v + \"Minutes\"))](), ca = o[((v + \"Seconds\"))](), da = o[((v + \"Milliseconds\"))]();\n        for (var ea = 0; ((ea < p.length)); ea++) {\n            u = p.charAt(ea);\n            if (((u == \"\\\\\"))) {\n                ea++;\n                s.push(p.charAt(ea));\n                continue;\n            }\n        ;\n        ;\n            switch (u) {\n              case \"d\":\n                t = m(w);\n                break;\n              case \"D\":\n                t = i[x];\n                break;\n              case \"j\":\n                t = w;\n                break;\n              case \"l\":\n                t = j[x];\n                break;\n              case \"F\":\n            \n              case \"f\":\n                t = l[y];\n                break;\n              case \"m\":\n                t = m(((y + 1)));\n                break;\n              case \"M\":\n                t = k[y];\n                break;\n              case \"n\":\n                t = ((y + 1));\n                break;\n              case \"Y\":\n                t = z;\n                break;\n              case \"y\":\n                t = ((\"\" + z)).slice(2);\n                break;\n              case \"a\":\n                t = ((((aa < 12)) ? \"am\" : \"pm\"));\n                break;\n              case \"A\":\n                t = ((((aa < 12)) ? \"AM\" : \"PM\"));\n                break;\n              case \"g\":\n                t = ((((((aa == 0)) || ((aa == 12)))) ? 12 : ((aa % 12))));\n                break;\n              case \"G\":\n                t = aa;\n                break;\n              case \"h\":\n                t = ((((((aa == 0)) || ((aa == 12)))) ? 12 : m(((aa % 12)))));\n                break;\n              case \"H\":\n                t = m(aa);\n                break;\n              case \"i\":\n                t = m(ba);\n                break;\n              case \"s\":\n                t = m(ca);\n                break;\n              case \"S\":\n                if (r) {\n                    t = g.ordinalSuffixes[w];\n                }\n                 else t = m(da, 3);\n            ;\n            ;\n                break;\n              default:\n                t = u;\n            };\n        ;\n            s.push(t);\n        };\n    ;\n        return s.join(\"\");\n    };\n;\n    e.exports = n;\n});\n__d(\"MercuryMessages\", [\"Arbiter\",\"AsyncRequest\",\"Env\",\"JSLogger\",\"KeyedCallbackManager\",\"MercuryActionTypeConstants\",\"MercuryActionStatus\",\"MercuryAssert\",\"MercuryAttachmentType\",\"MercuryConfig\",\"MercuryGenericConstants\",\"MercuryIDs\",\"MercuryLogMessageType\",\"MercuryMessageSourceTags\",\"MercuryPayloadSource\",\"MercurySingletonMixin\",\"MercurySourceType\",\"MercuryTimePassed\",\"MercuryMessageIDs\",\"MercuryParticipants\",\"PresenceUtil\",\"RangedCallbackManager\",\"MercuryServerRequests\",\"MercuryThreadInformer\",\"MercuryThreads\",\"copyProperties\",\"debounce\",\"formatDate\",\"randomInt\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"AsyncRequest\"), i = b(\"Env\"), j = b(\"JSLogger\"), k = b(\"KeyedCallbackManager\"), l = b(\"MercuryActionTypeConstants\"), m = b(\"MercuryActionStatus\"), n = b(\"MercuryAssert\"), o = b(\"MercuryAttachmentType\"), p = b(\"MercuryConfig\"), q = b(\"MercuryGenericConstants\"), r = b(\"MercuryIDs\"), s = b(\"MercuryLogMessageType\"), t = b(\"MercuryMessageSourceTags\"), u = b(\"MercuryPayloadSource\"), v = b(\"MercurySingletonMixin\"), w = b(\"MercurySourceType\"), x = b(\"MercuryTimePassed\"), y = b(\"MercuryMessageIDs\"), z = b(\"MercuryParticipants\"), aa = b(\"PresenceUtil\"), ba = b(\"RangedCallbackManager\"), ca = b(\"MercuryServerRequests\"), da = b(\"MercuryThreadInformer\"), ea = b(\"MercuryThreads\"), fa = b(\"copyProperties\"), ga = b(\"debounce\"), ha = b(\"formatDate\"), ia = b(\"randomInt\"), ja = b(\"tx\");\n    function ka(bb, cb) {\n        var db = cb;\n        if (bb._localIdsMap[cb]) {\n            db = bb._localIdsMap[cb];\n        }\n    ;\n    ;\n        return bb._messages[db];\n    };\n;\n    var la = new k();\n    function ma(bb, cb) {\n        if (((cb.JSBNG__status === undefined))) {\n            cb.JSBNG__status = m.UNSENT;\n        }\n    ;\n    ;\n        cb.timestamp_absolute = \"Today\";\n        cb.message_id = ((cb.message_id || bb.generateNewClientMessageID(cb.timestamp)));\n        var db = z.getIDForUser(bb._fbid);\n        cb.specific_to_list = ((cb.specific_to_list || []));\n        if (((cb.specific_to_list.length && ((cb.specific_to_list.indexOf(db) === -1))))) {\n            cb.specific_to_list.push(db);\n        }\n    ;\n    ;\n        if (!cb.thread_id) {\n            if (((cb.specific_to_list.length == 1))) {\n                cb.thread_id = ((\"user:\" + bb._fbid));\n            }\n             else if (((cb.specific_to_list.length == 2))) {\n                var eb = ((((cb.specific_to_list[0] == db)) ? cb.specific_to_list[1] : cb.specific_to_list[0]));\n                if (((r.tokenize(eb).type == \"email\"))) {\n                    cb.thread_id = q.PENDING_THREAD_ID;\n                }\n                 else cb.thread_id = bb._threads.getThreadIDForParticipant(eb);\n            ;\n            ;\n            }\n            \n        ;\n        ;\n            cb.thread_id = ((cb.thread_id || ((\"root:\" + cb.message_id))));\n        }\n    ;\n    ;\n        if (!cb.specific_to_list.length) {\n            var fb = bb._serverRequests.tokenizeThreadID(cb.thread_id);\n            if (((fb.type == \"user\"))) {\n                cb.specific_to_list = [((\"fbid:\" + fb.value)),db,];\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n    };\n;\n    function na(bb, cb, db, eb) {\n        var fb = ((xa(db) ? [t.CHAT,] : [])), gb = JSBNG__Date.now(), hb = ha(new JSBNG__Date(gb), ((p[\"24h_times\"] ? \"H:i\" : \"g:ia\"))), ib = {\n            action_type: cb,\n            thread_id: eb,\n            author: z.getIDForUser(bb._fbid),\n            author_email: null,\n            coordinates: null,\n            timestamp: gb,\n            timestamp_absolute: (new JSBNG__Date(gb)).toLocaleDateString(),\n            timestamp_relative: hb,\n            timestamp_time_passed: x.TODAY,\n            is_unread: false,\n            is_cleared: false,\n            is_forward: false,\n            is_filtered_content: false,\n            spoof_warning: false,\n            source: db,\n            source_tags: fb\n        };\n        return ib;\n    };\n;\n    function oa(bb) {\n        switch (bb) {\n          case u.UNKNOWN:\n        \n          case u.SERVER_INITIAL_DATA:\n        \n          case u.SERVER_FETCH_THREAD_INFO:\n        \n          case u.SERVER_THREAD_SYNC:\n            return true;\n        };\n    ;\n        return false;\n    };\n;\n    function pa(bb) {\n        return ((bb && ((bb.substr(0, 6) === \"server\"))));\n    };\n;\n    function qa(bb, cb) {\n        if (!bb._threadsToMessages[cb]) {\n            bb._threadsToMessages[cb] = new ba(function(db) {\n                return ka(bb, db).timestamp;\n            }, function(db, eb) {\n                return ((eb - db));\n            });\n        }\n    ;\n    ;\n        return bb._threadsToMessages[cb];\n    };\n;\n    g.subscribe(j.DUMP_EVENT, function(bb, cb) {\n        var db = {\n        }, eb = {\n        }, fb = sa._getInstances();\n        {\n            var fin180keys = ((window.top.JSBNG_Replay.forInKeys)((fb))), fin180i = (0);\n            var gb;\n            for (; (fin180i < fin180keys.length); (fin180i++)) {\n                ((gb) = (fin180keys[fin180i]));\n                {\n                    db[gb] = {\n                    };\n                    {\n                        var fin181keys = ((window.top.JSBNG_Replay.forInKeys)((fb[gb]._messages))), fin181i = (0);\n                        var hb;\n                        for (; (fin181i < fin181keys.length); (fin181i++)) {\n                            ((hb) = (fin181keys[fin181i]));\n                            {\n                                var ib = fb[gb]._messages[hb];\n                                if (((Object.keys(ib).length === 0))) {\n                                    continue;\n                                }\n                            ;\n                            ;\n                                var jb = ib.thread_id;\n                                db[gb][jb] = ((db[gb][jb] || {\n                                }));\n                                db[gb][jb][ib.message_id] = {\n                                    action_type: ib.action_type,\n                                    author: ib.author,\n                                    is_unread: ib.is_unread,\n                                    timestamp: ib.timestamp\n                                };\n                            };\n                        };\n                    };\n                ;\n                    eb[gb] = fa({\n                    }, fb[gb]._localIdsMap);\n                };\n            };\n        };\n    ;\n        cb.messaging = ((cb.messaging || {\n        }));\n        cb.messaging.local_message_ids = eb;\n        cb.messaging.messages = db;\n    });\n    function ra(bb, cb, db) {\n        cb.forEach(function(eb) {\n            var fb = qa(bb, eb);\n            fb.setReachedEndOfArray();\n            bb._threadInformer.reorderedMessages(eb, db);\n        });\n    };\n;\n    function sa(bb) {\n        this._fbid = bb;\n        this._serverRequests = ca.getForFBID(this._fbid);\n        this._threadInformer = da.getForFBID(this._fbid);\n        this._threads = ea.getForFBID(this._fbid);\n        this._failedHistoryFetchThreads = {\n        };\n        this._threadsToMessages = {\n        };\n        this._titanMessagesCount = {\n        };\n        this._localTitanMessagesCount = {\n        };\n        this._messages = {\n        };\n        this._attachmentData = {\n        };\n        this._messagesNeedingAttachmentData = {\n        };\n        this._localIdsMap = {\n        };\n        this._serverRequests.subscribe(\"update-messages\", function(cb, db) {\n            var eb = ((db.actions || [])).filter(function(gb) {\n                var hb = gb.action_type;\n                return ((((gb.is_forward || gb.thread_id)) && ((((((((((((hb == l.LOG_MESSAGE)) || ((hb == l.USER_GENERATED_MESSAGE)))) || ((hb == l.SEND_MESSAGE)))) || ((hb == l.CLEAR_CHAT)))) || ((hb == l.DELETE_THREAD)))) || ((hb == l.DELETE_MESSAGES))))));\n            }), fb = oa(db.payload_source);\n            if (pa(db.payload_source)) {\n                eb.forEach(function(gb) {\n                    if (!gb.is_forward) {\n                        var hb = this._threads.getThreadMetaNow(gb.thread_id);\n                        if (hb) {\n                            gb.is_cleared = ((gb.timestamp < hb.chat_clear_time));\n                        }\n                    ;\n                    ;\n                    }\n                ;\n                ;\n                }.bind(this));\n            }\n        ;\n        ;\n            this.handleUpdates(eb, fb, db.payload_source, db.from_client);\n            if (db.end_of_history) {\n                ra(this, db.end_of_history, db.payload_source);\n            }\n        ;\n        ;\n        }.bind(this));\n    };\n;\n    fa(sa.prototype, {\n        getMessagesFromIDs: function(bb) {\n            return ((bb || [])).map(ka.curry(this)).filter(function(cb) {\n                return cb;\n            });\n        },\n        hasLoadedNMessages: function(bb, cb) {\n            var db = qa(this, bb);\n            return ((db.hasReachedEndOfArray() || ((db.getCurrentArraySize() >= cb))));\n        },\n        hasLoadedExactlyNMessages: function(bb, cb) {\n            var db = qa(this, bb);\n            return ((db.getCurrentArraySize() == cb));\n        },\n        getThreadMessagesRange: function(bb, cb, db, eb, fb, gb) {\n            var hb = qa(this, bb), ib = function(ob) {\n                eb(ta(this, ob));\n            }.bind(this), jb = hb.executeOrEnqueue(cb, db, ib), kb = hb.getUnavailableResources(jb), lb = this._failedHistoryFetchThreads[bb];\n            if (((kb.length && !lb))) {\n                var mb = ((((this._titanMessagesCount[bb] || 0)) - ((this._localTitanMessagesCount[bb] || 0)))), nb = ((kb.length + ((this._localTitanMessagesCount[bb] || 0))));\n                this._serverRequests.fetchThreadMessages(bb, mb, nb, fb, gb);\n            }\n             else this._failedHistoryFetchThreads[bb] = false;\n        ;\n        ;\n            return jb;\n        },\n        getThreadMessagesSinceTimestamp: function(bb, cb) {\n            var db = qa(this, bb), eb = db.getElementsUntil(cb);\n            return ta(this, eb);\n        },\n        hasLoadedAllMessages: function(bb) {\n            return qa(this, bb).hasReachedEndOfArray();\n        },\n        getCurrentlyLoadedMessages: function(bb) {\n            var cb = qa(this, bb).getAllResources();\n            return ta(this, cb);\n        },\n        unsubscribe: function(bb, cb) {\n            n.isThreadID(cb);\n            var db = qa(this, cb);\n            db.unsubscribe(bb);\n        },\n        addAttachmentData: function(bb, cb, db) {\n            var eb = ka(this, bb);\n            if (eb) {\n                var fb = eb.attachments.indexOf(cb);\n                if (((fb != -1))) {\n                    eb.attachments[fb] = db;\n                    this._threadInformer.updatedMessage(eb.thread_id, eb.message_id, \"attach\");\n                }\n            ;\n            ;\n            }\n             else {\n                if (!this._attachmentData[bb]) {\n                    this._attachmentData[bb] = [];\n                }\n            ;\n            ;\n                this._attachmentData[bb].push({\n                    attach_key: cb,\n                    data: db\n                });\n            }\n        ;\n        ;\n        },\n        handleUpdates: function(bb, cb, db, eb) {\n            var fb, gb = {\n            }, hb = {\n            };\n            for (var ib = 0; ((ib < bb.length)); ib++) {\n                var jb = bb[ib];\n                if (((jb.is_forward || ((db == u.SERVER_SEARCH))))) {\n                    if (!this._messages[jb.message_id]) {\n                        this._messages[jb.message_id] = jb;\n                        ya(this, jb);\n                    }\n                ;\n                ;\n                    continue;\n                }\n            ;\n            ;\n                var kb = jb.action_type;\n                if (((kb == l.SEND_MESSAGE))) {\n                    var lb = jb.client_message_id;\n                    if (((((lb && this._localIdsMap[lb])) && jb.JSBNG__status))) {\n                        if (((jb.JSBNG__status == m.UNCONFIRMED))) {\n                            if (!hb[jb.thread_id]) {\n                                hb[jb.thread_id] = [];\n                            }\n                        ;\n                        ;\n                            hb[jb.thread_id].push(jb.client_message_id);\n                        }\n                         else if (!gb[jb.thread_id]) {\n                            gb[jb.thread_id] = [];\n                        }\n                        \n                    ;\n                    ;\n                        var mb = ka(this, jb.client_message_id), nb = mb.JSBNG__status;\n                        mb.JSBNG__status = jb.JSBNG__status;\n                        if (((((jb.JSBNG__status === m.SUCCESS)) || jb.error_data))) {\n                            mb.error_data = jb.error_data;\n                        }\n                    ;\n                    ;\n                        if (((jb.JSBNG__status == m.SUCCESS))) {\n                            this.updateLocalMessage(jb, db);\n                            if (((jb.client_thread_id == q.PENDING_THREAD_ID))) {\n                                mb.thread_id = jb.thread_id;\n                                gb[jb.thread_id].push(mb.message_id);\n                                la.setResource(mb.message_id, mb.thread_id);\n                            }\n                        ;\n                        ;\n                        }\n                    ;\n                    ;\n                        if (((((((((((typeof nb != \"undefined\")) || ((jb.JSBNG__status == m.FAILED_UNKNOWN_REASON)))) || ((jb.JSBNG__status == m.UNABLE_TO_CONFIRM)))) || ((jb.JSBNG__status == m.SUCCESS)))) || ((jb.JSBNG__status == m.ERROR))))) {\n                            this._threadInformer.updatedMessage(jb.thread_id, ka(this, jb.client_message_id).message_id, db);\n                        }\n                    ;\n                    ;\n                    }\n                ;\n                ;\n                    continue;\n                }\n                 else if (((kb == l.DELETE_THREAD))) {\n                    qa(this, jb.thread_id).removeAllResources();\n                    continue;\n                }\n                 else if (((kb == l.DELETE_MESSAGES))) {\n                    var ob = jb.message_ids.map(function(wb) {\n                        return ka(this, wb).message_id;\n                    }.bind(this));\n                    fb = qa(this, jb.thread_id);\n                    fb.removeResources(ob);\n                    this._threadInformer.reorderedMessages(jb.thread_id, db);\n                    continue;\n                }\n                 else if (((kb == l.LOG_MESSAGE))) {\n                    if (((jb.log_message_type == s.SERVER_ERROR))) {\n                        this._failedHistoryFetchThreads[jb.thread_id] = true;\n                    }\n                ;\n                ;\n                }\n                 else if (((kb == l.CLEAR_CHAT))) {\n                    var pb = qa(this, jb.thread_id).getAllResources();\n                    pb.map(ka.curry(this)).forEach(function(wb) {\n                        wb.is_cleared = true;\n                    });\n                    continue;\n                }\n                \n                \n                \n                \n            ;\n            ;\n                if (((jb.threading_id && this._localIdsMap[jb.threading_id]))) {\n                    var qb = ka(this, jb.threading_id);\n                    if (((qb && qb.is_zap))) {\n                        fb = qa(this, jb.thread_id);\n                        fb.removeResources([qb.message_id,]);\n                        this._localIdsMap[jb.threading_id] = null;\n                        this._threadInformer.reorderedMessages(jb.thread_id, db);\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n                var rb = ka(this, jb.message_id);\n                if (((((jb.threading_id && this._localIdsMap[jb.threading_id])) || ((rb && !rb.is_forward))))) {\n                    continue;\n                }\n            ;\n            ;\n                if (!gb[jb.thread_id]) {\n                    gb[jb.thread_id] = [];\n                }\n            ;\n            ;\n                gb[jb.thread_id].push(jb.message_id);\n                this._messages[jb.message_id] = jb;\n                ya(this, jb);\n                if (((jb.threading_id && ((jb.threading_id != jb.message_id))))) {\n                    y.addServerID(jb.threading_id, jb.message_id);\n                }\n            ;\n            ;\n                if (!cb) {\n                    this._threadInformer.receivedMessage(jb);\n                }\n            ;\n            ;\n            };\n        ;\n            {\n                var fin182keys = ((window.top.JSBNG_Replay.forInKeys)((gb))), fin182i = (0);\n                var sb;\n                for (; (fin182i < fin182keys.length); (fin182i++)) {\n                    ((sb) = (fin182keys[fin182i]));\n                    {\n                        fb = qa(this, sb);\n                        var tb = fb.getAllResources(), ub = tb.filter(function(wb) {\n                            var xb = this._messages[wb];\n                            return ((((xb.action_type == l.LOG_MESSAGE)) && ((xb.log_message_type == s.SERVER_ERROR))));\n                        }.bind(this));\n                        fb.removeResources(ub);\n                        ua(this, sb, gb[sb]);\n                        if (eb) {\n                            va(this, sb, gb[sb]);\n                        }\n                    ;\n                    ;\n                        if (cb) {\n                            fb.addResources(gb[sb]);\n                            this._threadInformer.reorderedMessages(sb, db);\n                        }\n                         else fb.addResourcesWithoutSorting(gb[sb].reverse(), 0);\n                    ;\n                    ;\n                        this._threadInformer.updatedThread(sb);\n                    };\n                };\n            };\n        ;\n            var vb = Object.keys(hb);\n            if (vb.length) {\n                this._serverRequests.requestMessageConfirmation(hb);\n            }\n        ;\n        ;\n        },\n        sendMessage: function(bb, cb, db) {\n            cb = ((cb || Function.prototype));\n            ma(this, bb);\n            this._localIdsMap[bb.message_id] = bb.message_id;\n            if (((bb.thread_id == ((\"root:\" + bb.message_id))))) {\n                qa(this, bb.thread_id).setReachedEndOfArray();\n            }\n        ;\n        ;\n            this._serverRequests.sendNewMessage(bb, db);\n            if (((bb.thread_id == q.PENDING_THREAD_ID))) {\n                this._messages[bb.message_id] = bb;\n                return la.executeOrEnqueue(bb.message_id, cb);\n            }\n             else cb(bb.thread_id);\n        ;\n        ;\n        },\n        zapMessage: function(bb, cb, db) {\n            if (((bb.thread_id == q.PENDING_THREAD_ID))) {\n                return;\n            }\n        ;\n        ;\n            this._localIdsMap[bb.message_id] = bb.message_id;\n            this._serverRequests.handleUpdate({\n                actions: [fa({\n                }, bb),],\n                from_client: true,\n                payload_source: u.SERVER_ZAP\n            });\n        },\n        isFirstMessage: function(bb) {\n            var cb = qa(this, bb.thread_id);\n            if (((cb.getCurrentArraySize() === 0))) {\n                return false;\n            }\n        ;\n        ;\n            var db = cb.getResourceAtIndex(((cb.getCurrentArraySize() - 1))), eb = ka(this, db).message_id, fb = ka(this, bb.message_id).message_id;\n            return ((cb.hasReachedEndOfArray() && ((eb == fb))));\n        },\n        unsubscribeSend: function(bb) {\n            la.unsubscribe(bb);\n        },\n        resendMessage: function(bb, cb) {\n            var db = fa({\n            }, bb);\n            db.JSBNG__status = m.RESENDING;\n            db.timestamp = JSBNG__Date.now();\n            db.message_id = bb.message_id;\n            this._messages[bb.message_id] = db;\n            var eb = qa(this, bb.thread_id);\n            eb.resortResources([bb.message_id,]);\n            this.sendMessage(db, null, cb);\n            this._threadInformer.reorderedMessages(bb.thread_id, u.CLIENT_SEND_MESSAGE);\n        },\n        deleteMessages: function(bb, cb) {\n            if (cb.length) {\n                var db = qa(this, bb), eb = ((((db.getCurrentArraySize() == cb.length)) && db.hasReachedEndOfArray()));\n                this._serverRequests.deleteMessages(bb, cb, eb);\n            }\n        ;\n        ;\n        },\n        markMessagesSpam: function(bb, cb) {\n            if (cb.length) {\n                var db = qa(this, bb), eb = ((((db.getCurrentArraySize() == cb.length)) && db.hasReachedEndOfArray()));\n                if (eb) {\n                    this._serverRequests.markThreadSpam(bb);\n                }\n                 else this._serverRequests.markMessagesSpam(bb, cb);\n            ;\n            ;\n            }\n        ;\n        ;\n        },\n        updateLocalMessage: function(bb, cb) {\n            var db = bb.message_id, eb = bb.client_message_id;\n            this._localIdsMap[eb] = db;\n            this._messages[db] = this._messages[eb];\n            y.addServerID(eb, db);\n            this._messages[eb] = {\n            };\n            var fb = ka(this, eb);\n            if (bb.timestamp) {\n                fb.timestamp = bb.timestamp;\n            }\n        ;\n        ;\n            if (((bb.attachments && bb.attachments.length))) {\n                fb.raw_attachments = null;\n                fb.attachments = bb.attachments;\n                ya(this, fb, db);\n            }\n        ;\n        ;\n            if (bb.log_message_data) {\n                fb.log_message_data = bb.log_message_data;\n            }\n        ;\n        ;\n            if (wa(fb)) {\n                this._localTitanMessagesCount[fb.thread_id]--;\n            }\n        ;\n        ;\n        },\n        constructUserGeneratedMessageObject: function(bb, cb, db, eb) {\n            var fb = na(this, l.USER_GENERATED_MESSAGE, cb, db);\n            fb.body = bb;\n            fb.has_attachment = false;\n            fb.html_body = false;\n            fb.attachments = [];\n            fb.specific_to_list = ((eb || []));\n            return fb;\n        },\n        constructLogMessageObject: function(bb, cb, db, eb) {\n            var fb = na(this, l.LOG_MESSAGE, bb, cb);\n            fb.log_message_type = db;\n            fb.log_message_data = eb;\n            return fb;\n        },\n        generateNewClientMessageID: function(bb) {\n            var cb = ((((((((bb + \":\")) + ((ia(0, 4294967295) + 1)))) + \"-\")) + aa.getSessionID()));\n            return ((((\"\\u003C\" + cb)) + \"@mail.projektitan.com\\u003E\"));\n        },\n        getNumberLocalMessages: function(bb) {\n            return ((this._localTitanMessagesCount[bb] || 0));\n        }\n    });\n    fa(sa, v, {\n        addAttachmentData: function(bb, cb, db, eb) {\n            eb = ((eb || i.user));\n            sa.getForFBID(eb).addAttachmentData(bb, cb, db);\n        }\n    });\n    function ta(bb, cb) {\n        var db = cb.map(ka.curry(bb));\n        return db.reverse();\n    };\n;\n    function ua(bb, cb, db) {\n        var eb = db.filter(function(fb) {\n            return wa(ka(bb, fb));\n        });\n        if (!bb._titanMessagesCount[cb]) {\n            bb._titanMessagesCount[cb] = 0;\n        }\n    ;\n    ;\n        bb._titanMessagesCount[cb] += eb.length;\n    };\n;\n    function va(bb, cb, db) {\n        var eb = db.filter(function(fb) {\n            return wa(ka(bb, fb));\n        });\n        if (!bb._localTitanMessagesCount[cb]) {\n            bb._localTitanMessagesCount[cb] = 0;\n        }\n    ;\n    ;\n        bb._localTitanMessagesCount[cb] += eb.length;\n    };\n;\n    function wa(bb) {\n        var cb = bb.action_type;\n        if (((cb == l.USER_GENERATED_MESSAGE))) {\n            return !bb.is_zap;\n        }\n    ;\n    ;\n        switch (bb.log_message_type) {\n          case s.SUBSCRIBE:\n        \n          case s.UNSUBSCRIBE:\n        \n          case s.SERVER_ERROR:\n        \n          case s.LIVE_LISTEN:\n            return false;\n          default:\n            return true;\n        };\n    ;\n    };\n;\n    function xa(bb) {\n        switch (bb) {\n          case w.CHAT_WEB:\n        \n          case w.CHAT_JABBER:\n        \n          case w.CHAT_IPHONE:\n        \n          case w.CHAT_MEEBO:\n        \n          case w.CHAT_ORCA:\n        \n          case w.CHAT_TEST:\n        \n          case w.CHAT:\n        \n          case w.DESKTOP:\n            return true;\n          default:\n            return false;\n        };\n    ;\n    };\n;\n    function ya(bb, cb, db) {\n        db = ((db || cb.message_id));\n        var eb = bb._attachmentData[db];\n        if (eb) {\n            eb.forEach(function(fb) {\n                var gb = cb.attachments.indexOf(fb.attach_key);\n                if (((gb !== -1))) {\n                    cb.attachments[gb] = fb.data;\n                }\n            ;\n            ;\n            });\n            delete bb._attachmentData[db];\n        }\n         else if (((!cb.is_forward && za(bb, cb)))) {\n            bb._messagesNeedingAttachmentData[db] = true;\n            ab(bb);\n        }\n        \n    ;\n    ;\n    };\n;\n    function za(bb, cb) {\n        if (((!cb || !cb.attachments))) {\n            return false;\n        }\n    ;\n    ;\n        for (var db = 0; ((db < cb.attachments.length)); db++) {\n            var eb = cb.attachments[db];\n            if (((((typeof eb === \"string\")) && ((eb.indexOf(o.SHARE) === 0))))) {\n                return true;\n            }\n        ;\n        ;\n        };\n    ;\n        var fb = ((cb.forward_message_ids || []));\n        for (db = 0; ((db < fb.length)); db++) {\n            var gb = ka(bb, fb[db]);\n            if (za(bb, gb)) {\n                return true;\n            }\n        ;\n        ;\n        };\n    ;\n        return false;\n    };\n;\n    var ab = ga(function(bb) {\n        var cb = {\n        };\n        {\n            var fin183keys = ((window.top.JSBNG_Replay.forInKeys)((bb._messagesNeedingAttachmentData))), fin183i = (0);\n            var db;\n            for (; (fin183i < fin183keys.length); (fin183i++)) {\n                ((db) = (fin183keys[fin183i]));\n                {\n                    var eb = ka(bb, db);\n                    if (za(bb, eb)) {\n                        cb[db] = true;\n                    }\n                ;\n                ;\n                };\n            };\n        };\n    ;\n        var fb = Object.keys(cb);\n        if (fb.length) {\n            new h(\"/ajax/mercury/attachments/fetch_shares.php\").setData({\n                message_ids: fb\n            }).setAllowCrossPageTransition(true).send();\n        }\n    ;\n    ;\n        bb._messagesNeedingAttachmentData = {\n        };\n    }, 0, this, true);\n    e.exports = sa;\n});\n__d(\"ChatOpenTab\", [\"Arbiter\",\"Banzai\",\"Bootloader\",\"ChatVisibility\",\"JSBNG__Event\",\"MercuryIDs\",\"MercuryMessages\",\"MercuryServerRequests\",\"MercuryThreads\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"Banzai\"), i = b(\"Bootloader\"), j = b(\"ChatVisibility\"), k = b(\"JSBNG__Event\"), l = b(\"MercuryIDs\"), m = b(\"MercuryMessages\").get(), n = b(\"MercuryServerRequests\").get(), o = b(\"MercuryThreads\").get(), p = \"messaging_tracking\";\n    function q(u) {\n        o.getThreadMeta(u, function() {\n            g.inform(\"chat/open-tab\", {\n                thread_id: u\n            });\n        });\n    };\n;\n    function r(u, v, w, x) {\n        k.listen(u, \"click\", function(y) {\n            if (x(v, w)) {\n                return;\n            }\n        ;\n        ;\n            return y.kill();\n        });\n    };\n;\n    function s(u, v, w) {\n        var x = {\n            referrer: ((u || \"\")),\n            message_thread_id: v,\n            message_view: \"chat\",\n            timestamp_send: JSBNG__Date.now()\n        };\n        if (((w !== undefined))) {\n            x.message_target_ids = [w,];\n        }\n    ;\n    ;\n        h.post(p, x, {\n            delay: 0,\n            retry: true\n        });\n    };\n;\n    var t = {\n        openEmptyTab: function(u, v) {\n            if (((!window.Chat || !j.isOnline()))) {\n                return true;\n            }\n        ;\n        ;\n            i.loadModules([\"ChatTabModel\",], function(w) {\n                var x = w.getEmptyTab();\n                if (!x) {\n                    x = ((\"root:\" + m.generateNewClientMessageID(JSBNG__Date.now())));\n                    o.createNewLocalThread(x, []);\n                }\n            ;\n            ;\n                q(x);\n                s(v, x);\n            });\n        },\n        listenOpenEmptyTab: function(u, v) {\n            r(u, null, v, t.openEmptyTab);\n        },\n        openThread: function(u, v) {\n            if (l.isValid(u)) {\n                q(u);\n            }\n             else n.getClientThreadID(u, q);\n        ;\n        ;\n            s(v, u);\n        },\n        listenOpenThread: function(u, v, w) {\n            r(u, v, w, t.openThread);\n        },\n        openUserTab: function(u, v) {\n            var w = o.getCanonicalThreadToUser(u);\n            q(w.thread_id);\n            s(v, w.thread_id, u);\n        },\n        listenOpenUserTab: function(u, v, w) {\n            r(u, v, w, t.openUserTab);\n        }\n    };\n    e.exports = t;\n});\n__d(\"SplitImage.react\", [\"React\",\"JSBNG__Image.react\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"React\"), h = b(\"JSBNG__Image.react\"), i = b(\"cx\"), j = g.createClass({\n        displayName: \"SplitImage\",\n        render: function() {\n            var k = this.props.size;\n            return this.transferPropsTo(g.DOM.div({\n                className: \"_55lt\",\n                style: {\n                    width: k,\n                    height: k\n                }\n            }, this.renderImages()));\n        },\n        renderImages: function() {\n            if (!this.props.srcs) {\n                return null;\n            }\n        ;\n        ;\n            if (!((this.props.srcs instanceof Array))) {\n                return (h({\n                    src: this.props.srcs,\n                    height: this.props.size,\n                    width: this.props.size\n                }));\n            }\n        ;\n        ;\n            switch (this.props.srcs.length) {\n              case 1:\n                return (h({\n                    src: this.props.srcs[0],\n                    height: this.props.size,\n                    width: this.props.size\n                }));\n              case 2:\n                return this.renderTwo();\n              default:\n                return this.renderThree();\n            };\n        ;\n        },\n        renderTwo: function() {\n            var k = Math.floor(((this.props.size / 2))), l = -Math.floor(((k / 2))), m = (((\"_55lu\") + ((this.props.border ? ((\" \" + \"_57xo\")) : \"\"))));\n            return (g.DOM.div(null, g.DOM.div({\n                className: \"_55lu\",\n                style: {\n                    width: k\n                }\n            }, h({\n                src: this.props.srcs[0],\n                width: this.props.size,\n                height: this.props.size,\n                style: {\n                    marginLeft: l\n                }\n            })), g.DOM.div({\n                className: m,\n                style: {\n                    width: k\n                }\n            }, h({\n                src: this.props.srcs[1],\n                width: this.props.size,\n                height: this.props.size,\n                style: {\n                    marginLeft: l\n                }\n            }))));\n        },\n        renderThree: function() {\n            var k = Math.floor(((((this.props.size / 3)) * 2))), l = -Math.floor(((((this.props.size - k)) / 2))), m = Math.floor(((this.props.size / 2))), n = ((this.props.size - k)), o = -Math.floor(((((m - n)) / 2))), p = (((\"_55lu\") + ((this.props.border ? ((\" \" + \"_57pl\")) : \"\")))), q = (((\"_55lu\") + ((this.props.border ? ((\" \" + \"_57pm\")) : \"\"))));\n            return (g.DOM.div(null, g.DOM.div({\n                className: p,\n                style: {\n                    width: k\n                }\n            }, h({\n                src: this.props.srcs[0],\n                width: this.props.size,\n                height: this.props.size,\n                style: {\n                    marginLeft: l\n                }\n            })), g.DOM.div({\n                className: q,\n                style: {\n                    width: n,\n                    height: m\n                }\n            }, h({\n                src: this.props.srcs[1],\n                width: m,\n                height: m,\n                style: {\n                    marginLeft: o\n                }\n            })), g.DOM.div({\n                className: \"_55lu\",\n                style: {\n                    width: n,\n                    height: m\n                }\n            }, h({\n                src: this.props.srcs[2],\n                width: m,\n                height: m,\n                style: {\n                    marginLeft: o\n                }\n            }))));\n        }\n    });\n    e.exports = j;\n});\n__d(\"TypeaheadFacepile\", [\"DOM\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOM\");\n    function h() {\n    \n    };\n;\n    h.render = function(i) {\n        var j = [g.create(\"span\", {\n            className: \"splitpic leftpic\"\n        }, [g.create(\"img\", {\n            alt: \"\",\n            src: i[0]\n        }),]),g.create(\"span\", {\n            className: ((\"splitpic\" + ((i[2] ? \" toppic\" : \"\"))))\n        }, [g.create(\"img\", {\n            alt: \"\",\n            src: i[1]\n        }),]),];\n        if (i[2]) {\n            j.push(g.create(\"span\", {\n                className: \"splitpic bottompic\"\n            }, [g.create(\"img\", {\n                alt: \"\",\n                src: i[2]\n            }),]));\n        }\n    ;\n    ;\n        return g.create(\"span\", {\n            className: \"splitpics clearfix\"\n        }, j);\n    };\n    e.exports = h;\n});\n__d(\"ModalMask\", [\"DOM\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOM\"), h = null, i = 0, j = {\n        show: function() {\n            i++;\n            if (!h) {\n                h = g.create(\"div\", {\n                    id: \"modalMaskOverlay\"\n                });\n                g.appendContent(JSBNG__document.body, h);\n            }\n        ;\n        ;\n        },\n        hide: function() {\n            if (i) {\n                i--;\n                if (((!i && h))) {\n                    g.remove(h);\n                    h = null;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n        }\n    };\n    e.exports = j;\n});\n__d(\"LitestandMessages\", [], function(a, b, c, d, e, f) {\n    var g = {\n        FILTER_SWITCH_BEGIN: \"LitestandMessages/FilterSwitchBegin\",\n        NEWSFEED_LOAD: \"LitestandMessages/NewsFeedLoad\",\n        LEAVE_HOME: \"LitestandMessages/LeaveHome\",\n        UPDATE_HOME_COUNT: \"LitestandMessages/UpdateHomeCount\",\n        STORIES_INSERTED: \"LitestandMessages/StoriesInserted\",\n        STORIES_REMOVED: \"LitestandMessages/StoriesRemoved\",\n        NEWER_STORIES_INSERTED: \"LitestandMessages/NewerStoriesInserted\",\n        EXPAND_FILTER_SWITCHER: \"LitestandMessages/ExpandFilterSwitcher\",\n        RESTORE_FILTER_SWITCHER: \"LitestandMessages/RestoreFilterSwitcher\",\n        NEW_STORY_BAR_CLICK: \"LitestandMessages/NewStoryBarClick\",\n        COLLAPSE_FILTER_SWITCHER: \"LitestandMessages/CollapseFilterSwitcher\",\n        TOUR_BEGIN: \"LitestandMessages/TourBegin\",\n        TOUR_END: \"LitestandMessages/TourEnd\",\n        TOUR_SIDEBAR_HIGHLIGHT: \"LitestandMessages/TourSidebarHighlight\",\n        TOUR_SIDEBAR_UNHIGHLIGHT: \"LitestandMessages/TourSidebarUnhighlight\",\n        RHC_RELOADED: \"LitestandMessages/RHCReloaded\",\n        UNLOCK_FILTER_SWITCHER: \"LitestandMessage/UnlockFilterSwitcher\"\n    };\n    e.exports = g;\n});\n__d(\"WebMessengerPermalinkConstants\", [\"URI\",], function(a, b, c, d, e, f) {\n    var g = b(\"URI\"), h = {\n        ARCHIVED_PATH: \"/messages/archived\",\n        BASE_PATH: \"/messages\",\n        OTHER_PATH: \"/messages/other\",\n        SPAM_PATH: \"/messages/spam\",\n        COMPOSE_POSTFIX_PATH: \"/new\",\n        SEARCH_POSTFIX_PATH: \"/search\",\n        TID_POSTFIX_PARTIAL_PATH: \"/conversation-\",\n        overriddenVanities: \"(archived|other|spam|new|search|conversation-.*)\",\n        getURIPathForThreadID: function(i, j) {\n            return ((((((j || h.BASE_PATH)) + h.TID_POSTFIX_PARTIAL_PATH)) + g.encodeComponent(g.encodeComponent(i))));\n        },\n        getThreadIDFromURI: function(i) {\n            var j = i.getPath().match(((((((h.BASE_PATH + \"(/[^/]*)*\")) + h.TID_POSTFIX_PARTIAL_PATH)) + \"([^/]+)\")));\n            if (j) {\n                var k = g.decodeComponent(g.decodeComponent(j[2]));\n                return k;\n            }\n        ;\n        ;\n        },\n        getURIPathForIDOrVanity: function(i, j) {\n            if (i.match(((((\"^\" + h.overriddenVanities)) + \"$\")))) {\n                i = ((\".\" + i));\n            }\n        ;\n        ;\n            return ((((((j || h.BASE_PATH)) + \"/\")) + i));\n        },\n        getUserIDOrVanity: function(i) {\n            var j = i.match(((h.BASE_PATH + \".*/([^/]+)/?$\"))), k = ((j && j[1])), l = h.overriddenVanities;\n            if (((!k || k.match(((((\"^\" + l)) + \"$\")))))) {\n                return false;\n            }\n             else if (k.match(((((\"^\\\\.\" + l)) + \"$\")))) {\n                return k.substr(1);\n            }\n             else return k\n            \n        ;\n        }\n    };\n    e.exports = h;\n});\n__d(\"MercuryEmoji\", [\"MercuryConfig\",\"Emoji\",\"Emote\",], function(a, b, c, d, e, f) {\n    var g = b(\"MercuryConfig\"), h = b(\"Emoji\"), i = b(\"Emote\"), j = {\n        htmlEmojiAndEmote: function(k, l) {\n            if (g.MessagingDisplayEmojiGK) {\n                return h.htmlEmojiAndEmote(k, l);\n            }\n             else return i.htmlEmote(k, l)\n        ;\n        }\n    };\n    e.exports = j;\n});\n__d(\"MercuryErrorInfo\", [\"MercuryErrorType\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"MercuryErrorType\"), h = b(\"tx\"), i = {\n        getMessage: function(j) {\n            var k = \"This message failed to send.\";\n            if (i.isConnectionError(j)) {\n                k = \"Unable to connect to Facebook. This message failed to send. \";\n            }\n             else if (j.description) {\n                k = j.description;\n            }\n            \n        ;\n        ;\n            return k;\n        },\n        isConnectionError: function(j) {\n            if (((j && ((j.type == g.TRANSPORT))))) {\n                return ((((((j.code === 1001)) || ((j.code === 1004)))) || ((j.code === 1006))));\n            }\n        ;\n        ;\n            return false;\n        }\n    };\n    e.exports = i;\n});\n__d(\"MercuryChannelHandler\", [\"Arbiter\",\"ChannelConstants\",\"Env\",\"MercuryActionTypeConstants\",\"MercuryGlobalActionType\",\"MercuryMessages\",\"MercuryPayloadSource\",\"MessagingReliabilityLogger\",\"MessagingEvent\",\"MessagingTag\",\"MercuryParticipants\",\"PresenceUtil\",\"MercuryServerRequests\",\"MercuryThreadInformer\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ChannelConstants\"), i = b(\"Env\"), j = b(\"MercuryActionTypeConstants\"), k = b(\"MercuryGlobalActionType\"), l = b(\"MercuryMessages\").get(), m = b(\"MercuryPayloadSource\"), n = b(\"MessagingReliabilityLogger\"), o = b(\"MessagingEvent\"), p = b(\"MessagingTag\"), q = b(\"MercuryParticipants\"), r = b(\"PresenceUtil\"), s = b(\"MercuryServerRequests\").get(), t = b(\"MercuryThreadInformer\").get(), u = b(\"copyProperties\");\n    function v(la, ma) {\n        if (((((((la != h.getArbiterType(\"messaging\"))) || !ma.obj)) || !ma.obj.message))) {\n            n.addEntry(\"channel_receive\", \"invalid_data\");\n            return;\n        }\n    ;\n    ;\n        var na = ma.obj.message, oa = {\n            author: na.mercury_author_id,\n            author_email: na.mercury_author_email,\n            body: na.body,\n            subject: na.subject,\n            has_attachment: na.has_attachment,\n            attachments: na.attachments,\n            html_body: na.html_body,\n            thread_id: na.tid,\n            message_id: na.mid,\n            coordinates: na.mercury_coordinates,\n            spoof_warning: na.mercury_spoof_warning,\n            source: na.mercury_source,\n            source_tags: na.mercury_source_tags,\n            threading_id: na.threading_id,\n            timestamp: na.timestamp,\n            timestamp_absolute: na.timestamp_absolute,\n            timestamp_relative: na.timestamp_relative,\n            timestamp_time_passed: na.timestamp_time_passed,\n            action_type: j.USER_GENERATED_MESSAGE,\n            is_unread: na.is_unread,\n            action_id: na.action_id,\n            is_forward: false,\n            forward_count: ((na.forward_count || na.JSBNG__forward)),\n            forward_message_ids: na.forward_msg_ids,\n            location_text: na.location_text,\n            folder: ma.obj.folder\n        }, pa = [u({\n        }, oa),];\n        pa = pa.concat(((na.forward_actions || [])));\n        var qa = m.CLIENT_CHANNEL_MESSAGE;\n        s.handleUpdateWaitForThread({\n            actions: pa,\n            payload_source: qa\n        }, na.tid);\n        if (((!na.is_unread && ((na.mercury_author_id === q.user))))) {\n            var ra = {\n            };\n            ra[na.tid] = ma.obj.folder;\n            w(h.getArbiterType(\"messaging\"), {\n                obj: {\n                    JSBNG__event: o.READ,\n                    tids: [na.tid,],\n                    folder_info: ra,\n                    timestamp: na.timestamp\n                }\n            });\n        }\n    ;\n    ;\n        n.addEntry(\"channel_receive\", \"success\", [oa.thread_id,oa.message_id,r.getSessionID(),]);\n    };\n;\n    function w(la, ma) {\n        if (((((((la != h.getArbiterType(\"messaging\"))) || !ma.obj)) || !ma.obj.tids))) {\n            return;\n        }\n    ;\n    ;\n        var na = [], oa = ((ma.obj.JSBNG__event == o.READ));\n        ma.obj.tids.forEach(function(pa) {\n            na.push({\n                action_type: j.CHANGE_READ_STATUS,\n                action_id: null,\n                thread_id: pa,\n                mark_as_read: oa,\n                timestamp: ((ma.obj.timestamp || 0)),\n                folder: ma.obj.folder_info[pa]\n            });\n        });\n        s.handleUpdate({\n            actions: na,\n            payload_source: m.CLIENT_CHANNEL_MESSAGE\n        });\n    };\n;\n    function x(la, ma) {\n        if (((((((la != h.getArbiterType(\"messaging\"))) || !ma.obj)) || !ma.obj.tids))) {\n            return;\n        }\n    ;\n    ;\n        var na = [];\n        ma.obj.tids.forEach(function(oa) {\n            na.push({\n                action_type: j.DELETE_THREAD,\n                action_id: null,\n                thread_id: oa\n            });\n        });\n        s.handleUpdate({\n            actions: na,\n            payload_source: m.CLIENT_CHANNEL_MESSAGE\n        });\n    };\n;\n    function y(la, ma) {\n        if (((((((((la != h.getArbiterType(\"messaging\"))) || !ma.obj)) || !ma.obj.tids)) || !ma.obj.mids))) {\n            return;\n        }\n    ;\n    ;\n        var na = ma.obj.tids[0], oa = {\n            action_type: j.DELETE_MESSAGES,\n            action_id: null,\n            thread_id: na,\n            message_ids: ma.obj.mids\n        };\n        s.handleUpdate({\n            actions: [oa,],\n            threads: [ma.obj.updated_thread,],\n            payload_source: m.CLIENT_CHANNEL_MESSAGE\n        });\n    };\n;\n    function z(la, ma) {\n        if (((((((la != h.getArbiterType(\"messaging\"))) || !ma.obj)) || !ma.obj.folder))) {\n            return;\n        }\n    ;\n    ;\n        var na = {\n            action_type: k.MARK_ALL_READ,\n            action_id: ma.obj.action_id,\n            folder: ma.obj.folder\n        };\n        s.handleUpdate({\n            global_actions: [na,]\n        });\n    };\n;\n    function aa(la, ma) {\n        if (((((la != h.getArbiterType(\"messaging\"))) || !ma.obj.tids))) {\n            return;\n        }\n    ;\n    ;\n        var na = m.CLIENT_CHANNEL_MESSAGE;\n        ma.obj.tids.forEach(function(oa) {\n            var pa = {\n                action_type: j.CHANGE_ARCHIVED_STATUS,\n                action_id: null,\n                thread_id: oa,\n                archived: ma.obj.state\n            };\n            s.handleUpdateWaitForThread({\n                actions: [u({\n                }, pa),],\n                payload_source: na\n            }, oa);\n        });\n    };\n;\n    function ba(la, ma) {\n        if (((((la != h.getArbiterType(\"messaging\"))) || !ma.obj.tids))) {\n            return;\n        }\n    ;\n    ;\n        var na = m.CLIENT_CHANNEL_MESSAGE, oa;\n        ma.obj.tids.forEach(function(pa) {\n            if (((ma.obj.JSBNG__event == o.TAG))) {\n                oa = ma.obj.tag;\n            }\n             else oa = ((ma.obj.marked_as_spam ? p.SPAM : p.INBOX));\n        ;\n        ;\n            var qa = {\n                action_type: j.CHANGE_FOLDER,\n                action_id: null,\n                thread_id: pa,\n                new_folder: oa\n            };\n            s.handleUpdateWaitForThread({\n                actions: [u({\n                }, qa),],\n                payload_source: na\n            }, pa);\n        });\n    };\n;\n    function ca(la, ma) {\n        if (((((la != h.getArbiterType(\"messaging\"))) || !ma.obj.tag))) {\n            return;\n        }\n    ;\n    ;\n        switch (ma.obj.tag) {\n          case p.ACTION_ARCHIVED:\n            aa(la, ma);\n            break;\n          case p.INBOX:\n        \n          case p.OTHER:\n            ba(la, ma);\n            break;\n        };\n    ;\n    };\n;\n    function da(la, ma) {\n        if (((((((la != h.getArbiterType(\"inbox\"))) || !ma.obj)) || !ma.obj.seen_timestamp))) {\n            return;\n        }\n    ;\n    ;\n        s.handleUpdate({\n            message_counts: [{\n                seen_timestamp: ma.obj.seen_timestamp,\n                folder: p.INBOX\n            },],\n            unseen_thread_ids: [{\n                thread_ids: [],\n                folder: p.INBOX\n            },],\n            payload_source: m.CLIENT_CHANNEL_MESSAGE\n        });\n    };\n;\n    function ea(la, ma) {\n        if (((((la != h.getArbiterType(\"mercury\"))) || !ma.obj))) {\n            return;\n        }\n    ;\n    ;\n        t.synchronizeInforms(function() {\n            var na = ma.obj, oa = [];\n            ((na.actions || [])).forEach(function(pa) {\n                var qa = j.USER_GENERATED_MESSAGE;\n                if (((pa.action_type == j.LOG_MESSAGE))) {\n                    var ra = m.CLIENT_CHANNEL_MESSAGE;\n                    s.handleUpdateWaitForThread({\n                        actions: [u({\n                        }, pa),],\n                        payload_source: ra\n                    }, pa.thread_id);\n                }\n                 else if (((pa.action_type != qa))) {\n                    oa.push(pa);\n                }\n                \n            ;\n            ;\n            });\n            na.actions = oa;\n            na.payload_source = m.CLIENT_CHANNEL_MESSAGE;\n            s.handleUpdate(na);\n        });\n    };\n;\n    function fa(la, ma) {\n        s.handleRoger(ma.obj);\n    };\n;\n    function ga(la, ma) {\n        if (((((((((la != h.getArbiterType(\"messaging\"))) || !ma.obj)) || ((ma.obj.mute_settings === undefined)))) || !ma.obj.thread_id))) {\n            return;\n        }\n    ;\n    ;\n        var na = j.CHANGE_MUTE_SETTINGS, oa = [{\n            action_type: na,\n            action_id: null,\n            thread_id: ma.obj.thread_id,\n            mute_settings: ma.obj.mute_settings\n        },];\n        s.handleUpdate({\n            actions: oa,\n            payload_source: m.CLIENT_CHANNEL_MESSAGE\n        });\n    };\n;\n    function ha(la, ma) {\n        switch (ma.obj.JSBNG__event) {\n          case o.DELIVER:\n            v(la, ma);\n            break;\n          case o.READ:\n        \n          case o.UNREAD:\n            w(la, ma);\n            break;\n          case o.READ_ALL:\n            z(la, ma);\n            break;\n          case o.DELETE:\n            x(la, ma);\n            break;\n          case o.DELETE_MESSAGES:\n            y(la, ma);\n            break;\n          case o.TAG:\n            ca(la, ma);\n            break;\n          case o.REPORT_SPAM:\n            ba(la, ma);\n            break;\n          case o.READ_RECEIPT:\n            fa(la, ma);\n            break;\n          case o.CHANGE_MUTE_SETTINGS:\n            ga(la, ma);\n            break;\n        };\n    ;\n    };\n;\n    function ia(la, ma) {\n        if (((((la != h.getArbiterType(\"messaging_zap\"))) || !ma.obj))) {\n            n.addEntry(\"channel_receive_zap\", \"invalid_data\");\n            return;\n        }\n    ;\n    ;\n        if (!ma.obj.is_canonical) {\n            return;\n        }\n    ;\n    ;\n        var na = ma.obj.sender_id;\n        if (((na == i.user))) {\n            na = ma.obj.recipient_id;\n        }\n    ;\n    ;\n        na = ((\"user:\" + na));\n        var oa = {\n            action_type: j.USER_GENERATED_MESSAGE,\n            author: ((\"fbid:\" + ma.obj.sender_id)),\n            body: ma.obj.body,\n            source: ma.obj.source,\n            timestamp: ma.obj.timestamp,\n            message_id: ma.obj.message_id,\n            thread_id: na,\n            specific_to_list: [((\"fbid:\" + ma.obj.sender_id)),((\"fbid:\" + ma.obj.recipient_id)),],\n            spoof_warning: false,\n            is_unread: true,\n            is_zap: true\n        };\n        l.zapMessage(oa);\n    };\n;\n    var ja = [], ka = {\n        turnOn: function() {\n            if (!ja.length) {\n                var la = {\n                    mercury: ea,\n                    messaging: ha,\n                    messaging_zap: ia,\n                    inbox: da\n                };\n                {\n                    var fin184keys = ((window.top.JSBNG_Replay.forInKeys)((la))), fin184i = (0);\n                    var ma;\n                    for (; (fin184i < fin184keys.length); (fin184i++)) {\n                        ((ma) = (fin184keys[fin184i]));\n                        {\n                            ja.push(g.subscribe(h.getArbiterType(ma), la[ma]));\n                        ;\n                        };\n                    };\n                };\n            ;\n            }\n        ;\n        ;\n        },\n        turnOff: function() {\n            if (ja.length) {\n                ja.forEach(g.unsubscribe);\n                ja = [];\n            }\n        ;\n        ;\n        }\n    };\n    ka.turnOn();\n    e.exports = ka;\n});\n__d(\"MercuryRoger\", [\"ArbiterMixin\",\"MercuryActionStatus\",\"MercuryServerRequests\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"ArbiterMixin\"), h = b(\"MercuryActionStatus\"), i = b(\"MercuryServerRequests\").get(), j = b(\"copyProperties\"), k = {\n    }, l = {\n        getSeenBy: function(m, n) {\n            if (!m) {\n                return [];\n            }\n        ;\n        ;\n            var o = [], p = k[m.thread_id], q = h.SUCCESS;\n            {\n                var fin185keys = ((window.top.JSBNG_Replay.forInKeys)((p))), fin185i = (0);\n                var r;\n                for (; (fin185i < fin185keys.length); (fin185i++)) {\n                    ((r) = (fin185keys[fin185i]));\n                    {\n                        if (((((((p[r] > m.timestamp)) && ((((m.JSBNG__status === undefined)) || ((m.JSBNG__status === q)))))) && ((!n || ((r != m.author))))))) {\n                            o.push(r);\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            return o;\n        },\n        getSeenTimestamp: function(m, n) {\n            var o = k[m];\n            return ((o ? o[n] : null));\n        }\n    };\n    j(l, g);\n    i.subscribe(\"update-roger\", function(m, n) {\n        {\n            var fin186keys = ((window.top.JSBNG_Replay.forInKeys)((n))), fin186i = (0);\n            var o;\n            for (; (fin186i < fin186keys.length); (fin186i++)) {\n                ((o) = (fin186keys[fin186i]));\n                {\n                    if (!k[o]) {\n                        k[o] = {\n                        };\n                    }\n                ;\n                ;\n                    {\n                        var fin187keys = ((window.top.JSBNG_Replay.forInKeys)((n[o]))), fin187i = (0);\n                        var p;\n                        for (; (fin187i < fin187keys.length); (fin187i++)) {\n                            ((p) = (fin187keys[fin187i]));\n                            {\n                                var q = k[o][p], r = n[o][p];\n                                if (((!q || ((r > q))))) {\n                                    k[o][p] = r;\n                                }\n                            ;\n                            ;\n                            };\n                        };\n                    };\n                ;\n                };\n            };\n        };\n    ;\n        if (n) {\n            l.inform(\"state-changed\", n);\n        }\n    ;\n    ;\n    });\n    e.exports = l;\n});\n__d(\"MercuryDelayedRoger\", [\"ArbiterMixin\",\"LiveTimer\",\"MercuryActionStatus\",\"MercuryConfig\",\"MercuryMessages\",\"MercuryRoger\",\"MercuryThreadInformer\",\"MercuryThreads\",\"copyProperties\",\"setTimeoutAcrossTransitions\",], function(a, b, c, d, e, f) {\n    var g = b(\"ArbiterMixin\"), h = b(\"LiveTimer\"), i = b(\"MercuryActionStatus\"), j = b(\"MercuryConfig\"), k = b(\"MercuryMessages\").get(), l = b(\"MercuryRoger\"), m = b(\"MercuryThreadInformer\").get(), n = b(\"MercuryThreads\").get(), o = b(\"copyProperties\"), p = b(\"setTimeoutAcrossTransitions\"), q = {\n    }, r = {\n    }, s = j[\"roger.seen_delay\"], t = o({\n        getSeenBy: function(x, y) {\n            if (r[x]) {\n                return [];\n            }\n        ;\n        ;\n            if (!q[x]) {\n                var z = n.getThreadMetaNow(x);\n                if (z) {\n                    q[x] = {\n                        thread_id: x,\n                        author: z.participants[0],\n                        timestamp: z.timestamp\n                    };\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            return l.getSeenBy(q[x], y);\n        }\n    }, g);\n    function u(x) {\n        var y = false;\n        k.getThreadMessagesRange(x, 0, 1, function(z) {\n            var aa = z[0];\n            if (!aa) {\n                return;\n            }\n        ;\n        ;\n            var ba = aa.timestamp;\n            if (((aa.action_id || ((aa.JSBNG__status == i.SUCCESS))))) {\n                ba -= h.getServerTimeOffset();\n            }\n        ;\n        ;\n            var ca = t.getSeenBy(x);\n            if (r[x]) {\n                JSBNG__clearTimeout(r[x]);\n                delete r[x];\n            }\n        ;\n        ;\n            var da = ((ba + s)), ea = ((da - JSBNG__Date.now()));\n            if (((ea > 0))) {\n                r[x] = p(function() {\n                    delete r[x];\n                    v(x);\n                }, ea);\n            }\n        ;\n        ;\n            q[x] = aa;\n            var fa = t.getSeenBy(x);\n            if (((ca.length || fa.length))) {\n                y = true;\n            }\n        ;\n        ;\n        });\n        return y;\n    };\n;\n    function v(x) {\n        var y = {\n        };\n        y[x] = true;\n        t.inform(\"state-changed\", y);\n    };\n;\n    function w(JSBNG__event, x) {\n        var y = {\n        };\n        {\n            var fin188keys = ((window.top.JSBNG_Replay.forInKeys)((x))), fin188i = (0);\n            var z;\n            for (; (fin188i < fin188keys.length); (fin188i++)) {\n                ((z) = (fin188keys[fin188i]));\n                {\n                    if (u(z)) {\n                        y[z] = true;\n                    }\n                ;\n                ;\n                };\n            };\n        };\n    ;\n        {\n            var fin189keys = ((window.top.JSBNG_Replay.forInKeys)((y))), fin189i = (0);\n            var aa;\n            for (; (fin189i < fin189keys.length); (fin189i++)) {\n                ((aa) = (fin189keys[fin189i]));\n                {\n                    t.inform(\"state-changed\", y);\n                    break;\n                };\n            };\n        };\n    ;\n    };\n;\n    l.subscribe(\"state-changed\", function(x, y) {\n        {\n            var fin190keys = ((window.top.JSBNG_Replay.forInKeys)((y))), fin190i = (0);\n            var z;\n            for (; (fin190i < fin190keys.length); (fin190i++)) {\n                ((z) = (fin190keys[fin190i]));\n                {\n                    ((!r[z] && v(z)));\n                ;\n                };\n            };\n        };\n    ;\n    });\n    m.subscribe(\"messages-received\", w);\n    m.subscribe(\"messages-reordered\", w);\n    m.subscribe(\"messages-updated\", w);\n    e.exports = t;\n});\n__d(\"MercuryFilters\", [\"MessagingTag\",\"arrayContains\",], function(a, b, c, d, e, f) {\n    var g = b(\"MessagingTag\"), h = b(\"arrayContains\"), i = [g.UNREAD,], j = {\n        ALL: \"all\",\n        getSupportedFilters: function() {\n            return i.concat();\n        },\n        isSupportedFilter: function(k) {\n            return h(i, k);\n        }\n    };\n    e.exports = j;\n});\n__d(\"MercuryOrderedThreadlist\", [\"JSLogger\",\"MercuryActionTypeConstants\",\"MercuryFilters\",\"MercuryFolders\",\"MercuryPayloadSource\",\"MercurySingletonMixin\",\"MessagingTag\",\"RangedCallbackManager\",\"MercuryServerRequests\",\"MercuryThreadInformer\",\"MercuryThreads\",\"arrayContains\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSLogger\"), h = b(\"MercuryActionTypeConstants\"), i = b(\"MercuryFilters\"), j = b(\"MercuryFolders\"), k = b(\"MercuryPayloadSource\"), l = b(\"MercurySingletonMixin\"), m = b(\"MessagingTag\"), n = b(\"RangedCallbackManager\"), o = b(\"MercuryServerRequests\"), p = b(\"MercuryThreadInformer\"), q = b(\"MercuryThreads\"), r = b(\"arrayContains\"), s = b(\"copyProperties\"), t = g.create(\"ordered_threadlist_model\"), u = i.getSupportedFilters().concat([i.ALL,m.GROUPS,]), v = j.getSupportedFolders();\n    function w(ga, ha, ia, ja) {\n        var ka = [], la = false, ma = false, na = ((ha || [])).filter(function(ua) {\n            var va = ((ua.filter || i.ALL));\n            return ((((((ua.folder == ia)) || ((!ua.folder && ((ia == m.INBOX)))))) && ((va == ja))));\n        }), oa = ga._threadlistOrderMap[ia][ja].getAllResources(), pa;\n        na.forEach(function(ua) {\n            ka = ka.concat(ua.thread_ids);\n            if (ua.error) {\n                if (((ua.end > oa.length))) {\n                    ma = ua.error;\n                }\n            ;\n            ;\n            }\n             else {\n                var va = ((ua.end - ua.start));\n                if (((ua.thread_ids.length < va))) {\n                    la = true;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            if (((!pa || ((ua.end > pa))))) {\n                pa = ua.end;\n            }\n        ;\n        ;\n        });\n        aa(ga, ka, ia, ja);\n        if (la) {\n            ga._threadlistOrderMap[ia][ja].setReachedEndOfArray();\n        }\n         else if (ma) {\n            ga._threadlistOrderMap[ia][ja].setError(ma);\n        }\n         else {\n            var qa = ga._threadlistOrderMap[ia][ja].getCurrentArraySize();\n            if (((pa && ((qa < pa))))) {\n                var ra = {\n                }, sa = oa.concat(ka), ta = sa.filter(function(ua) {\n                    var va = ra[ua];\n                    ra[ua] = true;\n                    return va;\n                });\n                if (ta.length) {\n                    t.warn(\"duplicate_threads\", {\n                        folder: ia,\n                        expected_final_size: pa,\n                        actual_final_size: qa,\n                        duplicate_thread_ids: ta\n                    });\n                    ga._serverRequests.fetchThreadlistInfo(pa, ta.length, ia, ((((ja == i.ALL)) ? null : ja)));\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n        }\n        \n    ;\n    ;\n    };\n;\n    function x(ga, ha) {\n        v.forEach(function(ia) {\n            u.forEach(function(ja) {\n                w(ga, ha, ia, ja);\n            });\n        });\n    };\n;\n    function y(ga, ha) {\n        var ia = {\n        };\n        v.forEach(function(ja) {\n            ia[ja] = {\n            };\n            u.forEach(function(ka) {\n                ia[ja][ka] = {\n                    to_add: [],\n                    to_remove: [],\n                    to_remove_if_last_after_add: {\n                    }\n                };\n            });\n        });\n        ha.forEach(function(ja) {\n            if (ja.is_forward) {\n                return;\n            }\n        ;\n        ;\n            var ka = ja.thread_id, la = ba(ga, ka), ma = ca(ga, ka);\n            function na() {\n                ma.forEach(function(pa) {\n                    ia[la][pa].to_add.push(ka);\n                    if (((!ga._threadlistOrderMap[la][pa].hasReachedEndOfArray() && !ga._threadlistOrderMap[la][pa].hasResource(ka)))) {\n                        ia[la][pa].to_remove_if_last_after_add[ka] = true;\n                    }\n                ;\n                ;\n                });\n            };\n        ;\n            function oa(pa) {\n                if (r(u, pa)) {\n                    if (r(ma, pa)) {\n                        ia[la][pa].to_add.push(ka);\n                    }\n                     else ia[la][pa].to_remove.push(ka);\n                ;\n                }\n            ;\n            ;\n            };\n        ;\n            if (!la) {\n                if (((((ja.action_type === h.CHANGE_FOLDER)) || ((ja.action_type === h.CHANGE_ARCHIVED_STATUS))))) {\n                    v.forEach(function(pa) {\n                        if (((pa !== la))) {\n                            u.forEach(function(qa) {\n                                ga._threadlistOrderMap[pa][qa].removeResources([ka,]);\n                            });\n                        }\n                    ;\n                    ;\n                    });\n                }\n            ;\n            ;\n                return;\n            }\n        ;\n        ;\n            switch (ja.action_type) {\n              case h.DELETE_THREAD:\n                ma.forEach(function(pa) {\n                    ia[la][pa].to_remove.push(ka);\n                });\n                break;\n              case h.CHANGE_ARCHIVED_STATUS:\n            \n              case h.CHANGE_FOLDER:\n                na();\n                break;\n              case h.CHANGE_READ_STATUS:\n                oa(m.UNREAD);\n                break;\n              case h.USER_GENERATED_MESSAGE:\n            \n              case h.LOG_MESSAGE:\n                ma.forEach(function(pa) {\n                    if (da(ga, ka, la, pa)) {\n                        ia[la][pa].to_add.push(ka);\n                    }\n                ;\n                ;\n                });\n                break;\n            };\n        ;\n        });\n        v.forEach(function(ja) {\n            u.forEach(function(ka) {\n                var la = ga._threadlistOrderMap[ja][ka];\n                aa(ga, ia[ja][ka].to_add, ja, ka);\n                for (var ma = ((la.getCurrentArraySize() - 1)); ((ma >= 0)); ma--) {\n                    var na = la.getResourceAtIndex(ma);\n                    if (!ia[ja][ka].to_remove_if_last_after_add[na]) {\n                        break;\n                    }\n                ;\n                ;\n                    ia[ja][ka].to_remove.push(na);\n                };\n            ;\n                la.removeResources(ia[ja][ka].to_remove);\n            });\n        });\n    };\n;\n    function z(ga, ha) {\n        var ia = {\n        };\n        v.forEach(function(ja) {\n            ia[ja] = {\n            };\n            u.forEach(function(ka) {\n                ia[ja][ka] = [];\n            });\n        });\n        ha.forEach(function(ja) {\n            var ka = ba(ga, ja.thread_id), la = ca(ga, ja.thread_id);\n            if (ka) {\n                la.forEach(function(ma) {\n                    if (da(ga, ja.thread_id, ka, ma)) {\n                        ia[ka][ma].push(ja.thread_id);\n                    }\n                ;\n                ;\n                });\n            }\n        ;\n        ;\n        });\n        v.forEach(function(ja) {\n            u.forEach(function(ka) {\n                if (((ia[ja][ka].length > 0))) {\n                    aa(ga, ia[ja][ka], ja, ka);\n                }\n            ;\n            ;\n            });\n        });\n    };\n;\n    function aa(ga, ha, ia, ja) {\n        ja = ((ja || i.ALL));\n        ga._threadlistOrderMap[ia][ja].addResources(ha);\n        v.forEach(function(ka) {\n            if (((ka != ia))) {\n                ga._threadlistOrderMap[ka][ja].removeResources(ha);\n            }\n        ;\n        ;\n        });\n    };\n;\n    function ba(ga, ha) {\n        var ia = ga._threads.getThreadMetaNow(ha), ja = null;\n        if (!ia) {\n            ja = \"No thread metadata\";\n        }\n         else if (!ia.folder) {\n            ja = \"No thread folder\";\n        }\n        \n    ;\n    ;\n        if (ja) {\n            var ka = {\n                error: ja,\n                tid: ha\n            };\n            t.warn(\"no_thread_folder\", ka);\n            return null;\n        }\n    ;\n    ;\n        var la = ia.folder;\n        if (ia.is_archived) {\n            la = m.ACTION_ARCHIVED;\n        }\n    ;\n    ;\n        if (ga._threadlistOrderMap[la]) {\n            return la;\n        }\n         else return null\n    ;\n    };\n;\n    function ca(ga, ha) {\n        var ia = ga._threads.getThreadMetaNow(ha), ja = [i.ALL,];\n        if (!ia) {\n            var ka = {\n                error: \"no_thread_metadata\",\n                tid: ha\n            };\n            t.warn(\"no_thread_metadata\", ka);\n            return [];\n        }\n    ;\n    ;\n        if (ia.unread_count) {\n            ja.push(m.UNREAD);\n        }\n    ;\n    ;\n        if (!ia.is_canonical) {\n            ja.push(m.GROUPS);\n        }\n    ;\n    ;\n        return ja;\n    };\n;\n    function da(ga, ha, ia, ja) {\n        var ka = ga._threads.getThreadMetaNow(ha);\n        return ((((((ka && ka.timestamp)) && ((ba(ga, ha) == ia)))) && r(ca(ga, ha), ja)));\n    };\n;\n    function ea(ga) {\n        this._fbid = ga;\n        this._serverRequests = o.getForFBID(this._fbid);\n        this._threadInformer = p.getForFBID(this._fbid);\n        this._threads = q.getForFBID(this._fbid);\n        this._threadlistOrderMap = {\n        };\n        v.forEach(function(ha) {\n            this._threadlistOrderMap[ha] = {\n            };\n            u.forEach(function(ia) {\n                this._threadlistOrderMap[ha][ia] = new n(function(ja) {\n                    return this._threads.getThreadMetaNow(ja).timestamp;\n                }.bind(this), function(ja, ka) {\n                    return ((ka - ja));\n                }, this._serverRequests.canLinkExternally.bind(this._serverRequests));\n            }.bind(this));\n        }.bind(this));\n        this._serverRequests.subscribe(\"update-threadlist\", function(ha, ia) {\n            if (!fa(ia)) {\n                return;\n            }\n        ;\n        ;\n            var ja = ia.ordered_threadlists;\n            if (((ja && ja.length))) {\n                x(this, ja);\n            }\n             else {\n                var ka = ((ia.actions || [])).filter(function(la) {\n                    return la.thread_id;\n                });\n                z(this, ((ia.threads || [])));\n                y(this, ka);\n            }\n        ;\n        ;\n            this._threadInformer.updatedThreadlist();\n        }.bind(this));\n    };\n;\n    s(ea.prototype, {\n        getThreadlist: function(ga, ha, ia, ja, ka, la) {\n            return this.getFilteredThreadlist(ga, ha, ia, i.ALL, ja, ka, la);\n        },\n        getFilteredThreadlist: function(ga, ha, ia, ja, ka, la, ma) {\n            var na = this._threadlistOrderMap[ia][ja], oa = na.executeOrEnqueue(ga, ha, ka, la), pa = na.getUnavailableResources(oa), qa = na.getError(ga, ha, la);\n            if (((pa.length || qa))) {\n                if (((na.getCurrentArraySize() < ga))) {\n                    var ra = {\n                        start: ga,\n                        limit: ha,\n                        filter: ja,\n                        resources_size: na.getCurrentArraySize()\n                    };\n                    t.warn(\"range_with_gap\", ra);\n                }\n            ;\n            ;\n                na.setError(false);\n                this._serverRequests.fetchThreadlistInfo(na.getCurrentArraySize(), pa.length, ia, ((((ja == i.ALL)) ? null : ja)), ma);\n            }\n        ;\n        ;\n            return oa;\n        },\n        getThreadlistUntilTimestamp: function(ga, ha, ia) {\n            ia = ((ia || i.ALL));\n            return this._threadlistOrderMap[ha][ia].getElementsUntil(ga);\n        },\n        unsubscribe: function(ga, ha, ia) {\n            ia = ((ia || i.ALL));\n            this._threadlistOrderMap[ha][ia].unsubscribe(ga);\n        }\n    });\n    s(ea, l);\n    function fa(ga) {\n        switch (ga.payload_source) {\n          case k.CLIENT_CHANGE_ARCHIVED_STATUS:\n        \n          case k.CLIENT_CHANGE_READ_STATUS:\n        \n          case k.CLIENT_CHANGE_FOLDER:\n        \n          case k.CLIENT_CHANNEL_MESSAGE:\n        \n          case k.CLIENT_DELETE_MESSAGES:\n        \n          case k.CLIENT_DELETE_THREAD:\n        \n          case k.CLIENT_SEND_MESSAGE:\n        \n          case k.SERVER_SEND_MESSAGE:\n        \n          case k.SERVER_CONFIRM_MESSAGES:\n        \n          case k.SERVER_FETCH_THREADLIST_INFO:\n        \n          case k.SERVER_THREAD_SYNC:\n        \n          case k.SERVER_ZAP:\n            return true;\n          case k.SERVER_INITIAL_DATA:\n            return ga.ordered_threadlists;\n          default:\n            return false;\n        };\n    ;\n    };\n;\n    e.exports = ea;\n});\n__d(\"MercuryUnreadState\", [\"Arbiter\",\"MercuryFolders\",\"JSLogger\",\"KeyedCallbackManager\",\"MercuryActionTypeConstants\",\"MercuryGlobalActionType\",\"MercurySingletonMixin\",\"MercuryThreadlistConstants\",\"MessagingTag\",\"MercuryServerRequests\",\"MercuryThreadInformer\",\"MercuryThreads\",\"arrayContains\",\"copyProperties\",\"createObjectFrom\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"MercuryFolders\"), i = b(\"JSLogger\"), j = b(\"KeyedCallbackManager\"), k = b(\"MercuryActionTypeConstants\"), l = b(\"MercuryGlobalActionType\"), m = b(\"MercurySingletonMixin\"), n = b(\"MercuryThreadlistConstants\"), o = b(\"MessagingTag\"), p = b(\"MercuryServerRequests\"), q = b(\"MercuryThreadInformer\"), r = b(\"MercuryThreads\"), s = b(\"arrayContains\"), t = b(\"copyProperties\"), u = b(\"createObjectFrom\"), v = ((h.getSupportedFolders() || [])).filter(function(ma) {\n        return ((ma != o.ACTION_ARCHIVED));\n    }), w = \"unread_thread_hash\", x = \"unseen_thread_list\", y = n.MAX_UNREAD_COUNT, z = i.create(\"mercury_unread_state\");\n    function aa(ma) {\n        this._fbid = ma;\n        this._serverRequests = p.getForFBID(this._fbid);\n        this._threadInformer = q.getForFBID(this._fbid);\n        this._threads = r.getForFBID(this._fbid);\n        this._allReadTimestamp = {\n        };\n        this._threadReadTimestamp = {\n        };\n        this._initialUnreadCount = {\n        };\n        this._maxCount = {\n        };\n        this._unreadResources = {\n        };\n        v.forEach(function(na) {\n            this._initialUnreadCount[na] = 0;\n            this._maxCount[na] = false;\n            this._unreadResources[na] = new j();\n        }.bind(this));\n        this._serverRequests.subscribe(\"update-unread\", function(na, oa) {\n            fa(this, oa);\n            var pa = ((oa.global_actions || []));\n            for (var qa = 0; ((qa < pa.length)); qa++) {\n                var ra = pa[qa];\n                if (((ra.action_type == l.MARK_ALL_READ))) {\n                    ia(this, ra.folder, ra.timestamp);\n                }\n            ;\n            ;\n            };\n        ;\n        }.bind(this));\n        this._serverRequests.subscribe(\"update-thread-ids\", function(na, oa) {\n            ka(this, oa);\n        }.bind(this));\n    };\n;\n    t(aa.prototype, {\n        getUnreadCount: function(ma) {\n            if (this.exceedsMaxCount(ma)) {\n                z.error(\"unguarded_unread_count_fetch\", {\n                });\n                return 0;\n            }\n        ;\n        ;\n            return ea(this, ma);\n        },\n        exceedsMaxCount: function(ma) {\n            return ((this._maxCount[ma] || ((ea(this, ma) > y))));\n        },\n        markFolderAsRead: function(ma) {\n            if (((this._maxCount[ma] || ((ea(this, ma) > 0))))) {\n                this._serverRequests.markFolderAsRead(ma);\n            }\n        ;\n        ;\n        }\n    });\n    t(aa, m);\n    function ba(ma, na, oa) {\n        ma._unreadResources[na].setResource(w, oa);\n        ma._unreadResources[na].setResource(x, Object.keys(oa));\n    };\n;\n    function ca(ma, na, oa) {\n        var pa = ma._unreadResources[na].executeOrEnqueue(w, oa), qa = ma._unreadResources[na].getUnavailableResources(pa);\n        if (qa.length) {\n            ma._serverRequests.fetchUnreadThreadIDs(na);\n        }\n    ;\n    ;\n    };\n;\n    function da(ma, na) {\n        return ma._unreadResources[na].getResource(w);\n    };\n;\n    function ea(ma, na) {\n        var oa = ma._unreadResources[na].getResource(x);\n        if (oa) {\n            return oa.length;\n        }\n         else return ma._initialUnreadCount[na]\n    ;\n    };\n;\n    function fa(ma, na) {\n        var oa;\n        ((na.unread_thread_ids || [])).forEach(function(pa) {\n            oa = pa.folder;\n            if (!la(oa)) {\n                return;\n            }\n        ;\n        ;\n            var qa = ja(ma, pa.thread_ids);\n            ba(ma, oa, u(qa, true));\n            if (((qa.length > y))) {\n                ma._maxCount[oa] = true;\n            }\n        ;\n        ;\n            ma._threadInformer.updatedUnreadState();\n        });\n        ((na.message_counts || [])).forEach(function(pa) {\n            if (((pa.unread_count === undefined))) {\n                return;\n            }\n        ;\n        ;\n            oa = pa.folder;\n            if (((pa.unread_count > y))) {\n                ma._maxCount[oa] = true;\n                ba(ma, oa, {\n                });\n                ma._threadInformer.updatedUnreadState();\n            }\n             else {\n                ma._initialUnreadCount[oa] = pa.unread_count;\n                if (((ma._initialUnreadCount[oa] === 0))) {\n                    ba(ma, oa, {\n                    });\n                }\n            ;\n            ;\n                ma._threadInformer.updatedUnreadState();\n            }\n        ;\n        ;\n        });\n        ((na.actions || [])).forEach(function(pa) {\n            if (pa.is_forward) {\n                return;\n            }\n        ;\n        ;\n            var qa = k, ra = ((pa.thread_id ? pa.thread_id : pa.server_thread_id));\n            if (((pa.action_type == qa.DELETE_THREAD))) {\n                v.forEach(function(ta) {\n                    ha(ma, ta, ra);\n                });\n            }\n             else if (((((pa.action_type == qa.CHANGE_ARCHIVED_STATUS)) || ((pa.action_type == qa.CHANGE_FOLDER))))) {\n                var sa = ma._threads.getThreadMetaNow(pa.thread_id);\n                oa = h.getFromMeta(sa);\n                if (((la(oa) && ((sa.unread_count > 0))))) {\n                    ga(ma, oa, ra);\n                }\n            ;\n            ;\n                v.forEach(function(ta) {\n                    if (((ta != oa))) {\n                        ha(ma, ta, ra);\n                    }\n                ;\n                ;\n                });\n            }\n             else {\n                oa = pa.folder;\n                if (!la(oa)) {\n                    return;\n                }\n            ;\n            ;\n                if (((pa.action_type == qa.CHANGE_READ_STATUS))) {\n                    if (pa.mark_as_read) {\n                        ha(ma, oa, ra, pa.timestamp);\n                    }\n                     else ga(ma, oa, ra, pa.timestamp);\n                ;\n                ;\n                }\n                 else if (((((pa.action_type == qa.USER_GENERATED_MESSAGE)) || ((pa.action_type == qa.LOG_MESSAGE))))) {\n                    if (pa.is_unread) {\n                        ga(ma, oa, ra, pa.timestamp);\n                    }\n                ;\n                }\n                \n            ;\n            ;\n            }\n            \n        ;\n        ;\n        });\n    };\n;\n    function ga(ma, na, oa, pa) {\n        if (ma._maxCount[na]) {\n            return;\n        }\n    ;\n    ;\n        ca(ma, na, function(qa) {\n            var ra = ((ma._allReadTimestamp[na] || 0)), sa = ((ma._threadReadTimestamp[oa] || 0)), ta = ((pa || Number.POSITIVE_INFINITY));\n            if (((((((ta >= ra)) && ((ta >= sa)))) && !qa[oa]))) {\n                qa[oa] = ((pa || 0));\n                ba(ma, na, qa);\n                ma._threadInformer.updatedUnreadState();\n            }\n        ;\n        ;\n        });\n    };\n;\n    function ha(ma, na, oa, pa) {\n        if (ma._maxCount[na]) {\n            return;\n        }\n    ;\n    ;\n        ca(ma, na, function(qa) {\n            if (pa) {\n                var ra = ma._threadReadTimestamp[oa];\n                if (((!ra || ((ra < pa))))) {\n                    ma._threadReadTimestamp[oa] = pa;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            var sa = qa[oa];\n            if (((((pa && ((typeof sa == \"number\")))) && ((pa < sa))))) {\n                return;\n            }\n        ;\n        ;\n            if (((oa in qa))) {\n                delete qa[oa];\n                ba(ma, na, qa);\n                ma._threadInformer.updatedUnreadState();\n            }\n        ;\n        ;\n        });\n    };\n;\n    function ia(ma, na, oa) {\n        ma._maxCount[na] = false;\n        ba(ma, na, {\n        });\n        ma._allReadTimestamp[na] = Math.max(((ma._allReadTimestamp[na] || 0)), ((oa || 0)));\n        ma._threadInformer.updatedUnreadState();\n    };\n;\n    function ja(ma, na) {\n        return na.map(ma._serverRequests.convertThreadIDIfAvailable.bind(ma._serverRequests));\n    };\n;\n    function ka(ma, na) {\n        v.forEach(function(oa) {\n            var pa = da(ma, oa);\n            if (!pa) {\n                return;\n            }\n        ;\n        ;\n            {\n                var fin191keys = ((window.top.JSBNG_Replay.forInKeys)((na))), fin191i = (0);\n                var qa;\n                for (; (fin191i < fin191keys.length); (fin191i++)) {\n                    ((qa) = (fin191keys[fin191i]));\n                    {\n                        var ra = na[qa];\n                        if (pa[qa]) {\n                            pa[ra] = pa[qa];\n                            delete pa[qa];\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            ba(ma, oa, pa);\n        });\n    };\n;\n    function la(ma) {\n        return s(v, ma);\n    };\n;\n    g.subscribe(i.DUMP_EVENT, function(ma, na) {\n        na.messaging = ((na.messaging || {\n        }));\n        na.messaging.unread = {\n        };\n        na.messaging.unread_max_count = {\n        };\n        var oa = aa._getInstances();\n        {\n            var fin192keys = ((window.top.JSBNG_Replay.forInKeys)((oa))), fin192i = (0);\n            var pa;\n            for (; (fin192i < fin192keys.length); (fin192i++)) {\n                ((pa) = (fin192keys[fin192i]));\n                {\n                    na.messaging.unread[pa] = {\n                    };\n                    na.messaging.unread_max_count[pa] = {\n                    };\n                    v.forEach(function(qa) {\n                        na.messaging.unread[pa][qa] = t({\n                        }, da(oa[pa], qa));\n                        na.messaging.unread_max_count[pa][qa] = oa[pa]._maxCount[qa];\n                    });\n                };\n            };\n        };\n    ;\n    });\n    e.exports = aa;\n});\n__d(\"MercuryUnseenState\", [\"Arbiter\",\"TimestampConverter\",\"JSLogger\",\"KeyedCallbackManager\",\"MercuryActionTypeConstants\",\"MercurySingletonMixin\",\"MercuryThreadlistConstants\",\"MessagingTag\",\"MercuryServerRequests\",\"MercuryThreadInformer\",\"copyProperties\",\"createObjectFrom\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"TimestampConverter\"), i = b(\"JSLogger\"), j = b(\"KeyedCallbackManager\"), k = b(\"MercuryActionTypeConstants\"), l = b(\"MercurySingletonMixin\"), m = b(\"MercuryThreadlistConstants\"), n = b(\"MessagingTag\"), o = b(\"MercuryServerRequests\"), p = b(\"MercuryThreadInformer\"), q = b(\"copyProperties\"), r = b(\"createObjectFrom\"), s = m.MAX_UNSEEN_COUNT, t = \"unseen_thread_hash\", u = \"unseen_thread_list\", v = i.create(\"mercury_unseen_state\");\n    function w(ja) {\n        this._fbid = ja;\n        this._serverRequests = o.getForFBID(this._fbid);\n        this._threadInformer = p.getForFBID(this._fbid);\n        this._initialUnseenCount = 0;\n        this._lastSeenTimestamp = 0;\n        this._maxCount = false;\n        this._unseenResources = new j();\n        this._serverRequests.subscribe(\"update-unseen\", function(ka, la) {\n            ba(this, la);\n        }.bind(this));\n        this._serverRequests.subscribe(\"update-thread-ids\", function(ka, la) {\n            ha(this, la);\n        }.bind(this));\n    };\n;\n    q(w.prototype, {\n        getUnseenCount: function() {\n            if (this.exceedsMaxCount()) {\n                v.error(\"unguarded_unseen_count_fetch\", {\n                });\n                return 0;\n            }\n        ;\n        ;\n            return aa(this);\n        },\n        exceedsMaxCount: function() {\n            return ((this._maxCount || ((aa(this) > s))));\n        },\n        markAsSeen: function() {\n            if (((((aa(this) > 0)) || this._maxCount))) {\n                this._serverRequests.markSeen();\n                ca(this, h.convertActionIDToTimestamp(this._serverRequests.getLastActionID()), []);\n            }\n        ;\n        ;\n        },\n        markThreadSeen: function(ja, ka) {\n            var la = {\n            };\n            la[ja] = null;\n            ea(this, la, ka);\n        }\n    });\n    q(w, l);\n    function x(ja, ka) {\n        ja._unseenResources.setResource(t, ka);\n        ja._unseenResources.setResource(u, Object.keys(ka));\n    };\n;\n    function y(ja, ka) {\n        var la = ja._unseenResources.executeOrEnqueue(t, ka), ma = ja._unseenResources.getUnavailableResources(la);\n        if (ma.length) {\n            ja._serverRequests.fetchUnseenThreadIDs();\n        }\n    ;\n    ;\n    };\n;\n    function z(ja) {\n        return ja._unseenResources.getResource(t);\n    };\n;\n    function aa(ja) {\n        var ka = ja._unseenResources.getResource(u);\n        if (ka) {\n            return ka.length;\n        }\n         else return ja._initialUnseenCount\n    ;\n    };\n;\n    function ba(ja, ka) {\n        var la = ia(ka);\n        if (ka.unseen_thread_ids) {\n            ka.unseen_thread_ids.forEach(function(wa) {\n                if (((wa.folder != n.INBOX))) {\n                    return;\n                }\n            ;\n            ;\n                var xa = ga(ja, wa.thread_ids), ya = ja._lastSeenTimestamp;\n                if (((la && la.seen_timestamp))) {\n                    ya = la.seen_timestamp;\n                }\n            ;\n            ;\n                ca(ja, ya, xa);\n                if (((la && ((la.unseen_count > s))))) {\n                    ja._maxCount = true;\n                }\n            ;\n            ;\n            });\n        }\n         else if (((la && la.seen_timestamp))) {\n            ja._lastSeenTimestamp = la.seen_timestamp;\n            if (((la.unseen_count > s))) {\n                ja._maxCount = true;\n                x(ja, {\n                });\n            }\n             else {\n                ja._initialUnseenCount = la.unseen_count;\n                if (((ja._initialUnseenCount === 0))) {\n                    x(ja, {\n                    });\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n        }\n         else {\n            if (ja._maxCount) {\n                return;\n            }\n        ;\n        ;\n            var ma = ka.actions;\n            if (((!ma || !(ma.length)))) {\n                return;\n            }\n        ;\n        ;\n            var na = {\n            }, oa = {\n            };\n            for (var pa = 0; ((pa < ma.length)); pa++) {\n                var qa = ma[pa];\n                if (qa.is_forward) {\n                    continue;\n                }\n            ;\n            ;\n                var ra = qa.action_type, sa = qa.action_id, ta = ((qa.thread_id ? qa.thread_id : qa.server_thread_id)), ua = ((((qa.folder === undefined)) || ((qa.folder == n.INBOX))));\n                if (!ua) {\n                    continue;\n                }\n            ;\n            ;\n                if (((((ra == k.USER_GENERATED_MESSAGE)) || ((ra == k.LOG_MESSAGE))))) {\n                    var va = h.isGreaterThan(sa, na[ta]);\n                    if (((qa.is_unread && ((!na[ta] || va))))) {\n                        na[ta] = sa;\n                    }\n                ;\n                ;\n                }\n                 else if (((((ra == k.CHANGE_READ_STATUS)) && qa.mark_as_read))) {\n                    oa[ta] = sa;\n                }\n                \n            ;\n            ;\n            };\n        ;\n            da(ja, na);\n            ea(ja, oa);\n        }\n        \n    ;\n    ;\n    };\n;\n    function ca(ja, ka, la) {\n        var ma = z(ja);\n        if (((((((ma === undefined)) || ((ka > ja._lastSeenTimestamp)))) || ja._maxCount))) {\n            ja._lastSeenTimestamp = ka;\n            la = ((la || []));\n            if (((la.length <= s))) {\n                ja._maxCount = false;\n            }\n        ;\n        ;\n            var na = {\n            }, oa = ((z(ja) || {\n            }));\n            {\n                var fin193keys = ((window.top.JSBNG_Replay.forInKeys)((oa))), fin193i = (0);\n                var pa;\n                for (; (fin193i < fin193keys.length); (fin193i++)) {\n                    ((pa) = (fin193keys[fin193i]));\n                    {\n                        if (((oa[pa] !== true))) {\n                            var qa = oa[pa];\n                            if (fa(ja, qa)) {\n                                na[pa] = qa;\n                            }\n                        ;\n                        ;\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            var ra = q(r(la, true), na);\n            x(ja, ra);\n            ja._threadInformer.updatedUnseenState();\n        }\n    ;\n    ;\n    };\n;\n    function da(ja, ka) {\n        if (ja._maxCount) {\n            return;\n        }\n    ;\n    ;\n        var la = {\n        }, ma = false;\n        {\n            var fin194keys = ((window.top.JSBNG_Replay.forInKeys)((ka))), fin194i = (0);\n            var na;\n            for (; (fin194i < fin194keys.length); (fin194i++)) {\n                ((na) = (fin194keys[fin194i]));\n                {\n                    var oa = ka[na];\n                    if (fa(ja, oa)) {\n                        la[na] = oa;\n                        ma = true;\n                    }\n                ;\n                ;\n                };\n            };\n        };\n    ;\n        if (!ma) {\n            return;\n        }\n    ;\n    ;\n        y(ja, function(pa) {\n            {\n                var fin195keys = ((window.top.JSBNG_Replay.forInKeys)((la))), fin195i = (0);\n                var qa;\n                for (; (fin195i < fin195keys.length); (fin195i++)) {\n                    ((qa) = (fin195keys[fin195i]));\n                    {\n                        var ra = la[qa];\n                        if (((!pa[qa] && fa(ja, ra)))) {\n                            pa[qa] = la[qa];\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            x(ja, pa);\n            ja._threadInformer.updatedUnseenState();\n        });\n    };\n;\n    function ea(ja, ka, la) {\n        var ma = false;\n        {\n            var fin196keys = ((window.top.JSBNG_Replay.forInKeys)((ka))), fin196i = (0);\n            var na;\n            for (; (fin196i < fin196keys.length); (fin196i++)) {\n                ((na) = (fin196keys[fin196i]));\n                {\n                    ma = true;\n                    break;\n                };\n            };\n        };\n    ;\n        if (ma) {\n            y(ja, function(oa) {\n                var pa = false;\n                {\n                    var fin197keys = ((window.top.JSBNG_Replay.forInKeys)((ka))), fin197i = (0);\n                    var qa;\n                    for (; (fin197i < fin197keys.length); (fin197i++)) {\n                        ((qa) = (fin197keys[fin197i]));\n                        {\n                            var ra = ka[qa], sa = h.isGreaterThan(ra, oa[qa]);\n                            if (((oa[qa] && ((!ra || sa))))) {\n                                delete oa[qa];\n                                pa = true;\n                            }\n                        ;\n                        ;\n                        };\n                    };\n                };\n            ;\n                if (pa) {\n                    x(ja, oa);\n                    ja._threadInformer.updatedUnseenState();\n                    if (((la && ((aa(ja) === 0))))) {\n                        ja._serverRequests.markSeen();\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n            });\n        }\n    ;\n    ;\n    };\n;\n    function fa(ja, ka) {\n        var la = h.convertActionIDToTimestamp(ka);\n        return ((la > ja._lastSeenTimestamp));\n    };\n;\n    function ga(ja, ka) {\n        return ka.map(ja._serverRequests.convertThreadIDIfAvailable.bind(ja._serverRequests));\n    };\n;\n    function ha(ja, ka) {\n        var la = z(ja);\n        if (!la) {\n            return;\n        }\n    ;\n    ;\n        {\n            var fin198keys = ((window.top.JSBNG_Replay.forInKeys)((ka))), fin198i = (0);\n            var ma;\n            for (; (fin198i < fin198keys.length); (fin198i++)) {\n                ((ma) = (fin198keys[fin198i]));\n                {\n                    var na = ka[ma];\n                    if (la[ma]) {\n                        la[na] = la[ma];\n                        delete la[ma];\n                    }\n                ;\n                ;\n                };\n            };\n        };\n    ;\n        x(ja, la);\n    };\n;\n    function ia(ja) {\n        var ka = ((ja.message_counts || []));\n        for (var la = 0; ((la < ka.length)); la++) {\n            if (((ka[la].folder == n.INBOX))) {\n                return ka[la];\n            }\n        ;\n        ;\n        };\n    ;\n        return null;\n    };\n;\n    g.subscribe(i.DUMP_EVENT, function(ja, ka) {\n        ka.messaging = ((ka.messaging || {\n        }));\n        ka.messaging.unseen = {\n        };\n        ka.messaging.unseen_max_count = {\n        };\n        ka.messaging.unseen_time = {\n        };\n        var la = w._getInstances();\n        {\n            var fin199keys = ((window.top.JSBNG_Replay.forInKeys)((la))), fin199i = (0);\n            var ma;\n            for (; (fin199i < fin199keys.length); (fin199i++)) {\n                ((ma) = (fin199keys[fin199i]));\n                {\n                    ka.messaging.unseen[ma] = q({\n                    }, z(la[ma]));\n                    ka.messaging.unseen_max_count[ma] = la[ma]._maxCount;\n                    ka.messaging.unseen_time[ma] = la[ma]._lastSeenTimestamp;\n                };\n            };\n        };\n    ;\n    });\n    e.exports = w;\n});\n__d(\"MercuryThreadMetadataRawRenderer\", [\"JSBNG__Event\",\"CSS\",\"DOM\",\"MercuryActionStatus\",\"MercuryErrorInfo\",\"MessagingTag\",\"MercuryStatusTemplates\",\"Tooltip\",\"URI\",\"WebMessengerPermalinkConstants\",\"cx\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"CSS\"), i = b(\"DOM\"), j = b(\"MercuryActionStatus\"), k = b(\"MercuryErrorInfo\"), l = b(\"MessagingTag\"), m = b(\"MercuryStatusTemplates\"), n = b(\"Tooltip\"), o = b(\"URI\"), p = b(\"WebMessengerPermalinkConstants\"), q = b(\"cx\"), r = b(\"tx\"), s = {\n        renderParticipantListWithNoThreadName: function(u, v, w, x, y, z) {\n            var aa = {\n                callback: true,\n                check_length: true,\n                show_unread_count: true\n            };\n            z = ((z || {\n            }));\n            var ba = {\n            };\n            {\n                var fin200keys = ((window.top.JSBNG_Replay.forInKeys)((z))), fin200i = (0);\n                var ca;\n                for (; (fin200i < fin200keys.length); (fin200i++)) {\n                    ((ca) = (fin200keys[fin200i]));\n                    {\n                        if (aa[ca]) {\n                            ba[ca] = z[ca];\n                            delete z[ca];\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            var da = w.map(function(ia) {\n                return x[ia];\n            }), ea = this.renderRawParticipantList(u, da, w.length, z);\n            ea = this.renderRawTitleWithUnreadCount(ea, ((ba.show_unread_count ? v.unread_count : 0)));\n            var fa = z.abbr_mode, ga = {\n            };\n            {\n                var fin201keys = ((window.top.JSBNG_Replay.forInKeys)((z))), fin201i = (0);\n                var ha;\n                for (; (fin201i < fin201keys.length); (fin201i++)) {\n                    ((ha) = (fin201keys[fin201i]));\n                    {\n                        ga[ha] = z[ha];\n                    ;\n                    };\n                };\n            };\n        ;\n            ga.abbr_mode = true;\n            y.forEach(function(ia) {\n                var ja = ((((y.length > 1)) ? this._cloneIfDOMElement(ea) : ea));\n                i.setContent(ia, ja);\n                if (((((ba.check_length && !fa)) && ((ia.scrollWidth > ia.clientWidth))))) {\n                    var ka = this.renderRawParticipantList(u, da, w.length, ga), la = this.renderRawTitleWithUnreadCount(ka, ((ba.show_unread_count ? v.unread_count : 0)));\n                    i.setContent(ia, la);\n                }\n            ;\n            ;\n            }.bind(this));\n            ((ba.callback && ba.callback(ea)));\n        },\n        renderRawParticipantList: function(u, v, w, x) {\n            var y = {\n                abbr_mode: true,\n                last_separator_uses_and: true,\n                names_renderer: true\n            };\n            x = ((x || {\n            }));\n            var z = null;\n            if (x.names_renderer) {\n                z = x.names_renderer(v);\n            }\n             else z = v.map(function(ca) {\n                return ca.JSBNG__name;\n            });\n        ;\n        ;\n            var aa = null;\n            if (((z.length === 0))) {\n                if (!u) {\n                    aa = \"New Message\";\n                }\n                 else aa = \"No Participants\";\n            ;\n            ;\n            }\n             else if (((z.length == 1))) {\n                aa = z[0];\n            }\n             else if (((z.length == 2))) {\n                var ba = {\n                    participant1: z[0],\n                    participant2: z[1]\n                };\n                if (x.last_separator_uses_and) {\n                    aa = r._(\"{participant1} and {participant2}\", ba);\n                }\n                 else aa = r._(\"{participant1}, {participant2}\", ba);\n            ;\n            ;\n            }\n             else if (x.last_separator_uses_and) {\n                if (x.abbr_mode) {\n                    aa = r._(\"{participant1} and {others_link}\", {\n                        participant1: z[0],\n                        others_link: this.renderRawParticipantCount(u, {\n                            render_subset: true,\n                            count: ((w - 1))\n                        })\n                    });\n                }\n                 else if (((z.length == 3))) {\n                    aa = r._(\"{participant1}, {participant2} and {participant3}\", {\n                        participant1: z[0],\n                        participant2: z[1],\n                        participant3: z[2]\n                    });\n                }\n                 else aa = r._(\"{participant1}, {participant2} and {others_link}\", {\n                    participant1: z[0],\n                    participant2: z[1],\n                    others_link: this.renderRawParticipantCount(u, {\n                        render_subset: true,\n                        count: ((w - 2))\n                    })\n                });\n                \n            ;\n            ;\n            }\n             else if (((z.length == 3))) {\n                aa = r._(\"{participant1}, {participant2}, {participant3}\", {\n                    participant1: z[0],\n                    participant2: z[1],\n                    participant3: z[2]\n                });\n            }\n             else aa = r._(\"{participant1}, {participant2}, {participant3}, {others_link}\", {\n                participant1: z[0],\n                participant2: z[1],\n                participant3: z[2],\n                others_link: this.renderRawParticipantCount(u, {\n                    render_subset: true,\n                    count: ((w - 3))\n                })\n            });\n            \n            \n            \n            \n        ;\n        ;\n            if (Array.isArray(aa)) {\n                aa = i.create(\"span\", {\n                }, aa);\n            }\n        ;\n        ;\n            return aa;\n        },\n        renderRawTitleWithUnreadCount: function(u, v) {\n            var w = u;\n            if (((v && ((v > 1))))) {\n                w = i.create(\"span\", {\n                }, r._(\"{conversation_title} ({unread_count})\", {\n                    conversation_title: u,\n                    unread_count: v\n                }));\n            }\n        ;\n        ;\n            return w;\n        },\n        renderRawParticipantCount: function(u, v) {\n            var w = v.render_subset, x;\n            if (!w) {\n                x = ((((v.count > 1)) ? r._(\"{num} people\", {\n                    num: v.count\n                }) : \"1 person\"));\n            }\n             else x = ((((v.count > 1)) ? r._(\"{others_count} others\", {\n                others_count: v.count\n            }) : \"1 other\"));\n        ;\n        ;\n            return x;\n        },\n        renderShortNames: function(u) {\n            if (((u.length == 1))) {\n                return [u[0].JSBNG__name,];\n            }\n        ;\n        ;\n            return u.map(function(v) {\n                return v.short_name;\n            });\n        },\n        getUserCanonicalTitanURL: function(u, v, w) {\n            var x = new o().setSubdomain(\"www\"), y = u.substr(((u.indexOf(\":\") + 1)));\n            x.setPath(((((t(w) + \"/\")) + y)));\n            ((v && v(x.toString())));\n            return x.toString();\n        },\n        getTitanURLWithServerID: function(u, v, w) {\n            var x = new o().setSubdomain(\"www\");\n            x.setPath(p.getURIPathForThreadID(u, t(w)));\n            ((v && v(x.toString())));\n            return x.toString();\n        },\n        renderUserCanonicalTitanLink: function(u, v, w, x) {\n            var y = this.getUserCanonicalTitanURL(u, null, x);\n            v.setAttribute(\"href\", y);\n            ((w && w()));\n        },\n        renderTitanLinkWithServerID: function(u, v, w, x) {\n            var y = this.getTitanURLWithServerID(u, null, x);\n            v.setAttribute(\"href\", y);\n            ((w && w()));\n        },\n        renderStatusIndicator: function(u, v, w) {\n            var x;\n            if (((u == j.RESENDING))) {\n                x = this.renderResendIndicator();\n            }\n             else if (((((((((u !== undefined)) && ((u != j.UNSENT)))) && ((u != j.UNCONFIRMED)))) && ((u != j.SUCCESS))))) {\n                x = this.renderErrorIndicator(v, w);\n            }\n            \n        ;\n        ;\n            return x;\n        },\n        renderResendIndicator: function() {\n            return m[\":fb:mercury:resend-indicator\"].render();\n        },\n        renderErrorIndicator: function(u, v) {\n            if (!u) {\n                return null;\n            }\n        ;\n        ;\n            var w = m[\":fb:mercury:error-indicator\"].render(), x = u.is_transient, y = k.getMessage(u);\n            if (x) {\n                if (k.isConnectionError(u)) {\n                    y = r._(\"{message} Check your network connection or click to try again.\", {\n                        message: y\n                    });\n                }\n                 else y = r._(\"{message} Click to send again.\", {\n                    message: y\n                });\n            ;\n            }\n        ;\n        ;\n            n.set(w, y, \"above\", \"center\");\n            if (((v && x))) {\n                g.listen(w, \"click\", v);\n                w.setAttribute(\"tabindex\", \"0\");\n                h.addClass(w, \"_55q-\");\n            }\n        ;\n        ;\n            return w;\n        },\n        _cloneIfDOMElement: function(u) {\n            if (u.cloneNode) {\n                return u.cloneNode();\n            }\n             else return u\n        ;\n        }\n    };\n    function t(u) {\n        var v = p.BASE_PATH;\n        if (((u && ((u != l.INBOX))))) {\n            v += ((\"/\" + u));\n        }\n    ;\n    ;\n        return v;\n    };\n;\n    e.exports = s;\n});\n__d(\"MercurySeenByAll\", [\"CSS\",\"DataStore\",\"DOM\",\"MercuryParticipants\",\"MercuryDelayedRoger\",\"MercuryThreads\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSS\"), h = b(\"DataStore\"), i = b(\"DOM\"), j = b(\"MercuryParticipants\"), k = b(\"MercuryDelayedRoger\"), l = b(\"MercuryThreads\").get(), m = {\n    }, n = {\n        updateOnSeenChange: function(p, q) {\n            m[p.tagName] = true;\n            h.set(p, \"thread-id\", q.thread_id);\n            g.addClass(p, \"seenByListener\");\n            o(p, q);\n        }\n    };\n    function o(p, q) {\n        var r = q.participants.filter(function(t) {\n            return ((t !== j.user));\n        }), s = ((((q.participants.length > 0)) && ((q.participants[0] === j.user))));\n        g.conditionClass(p, \"repliedLast\", s);\n        g.conditionClass(p, \"seenByAll\", ((s && ((k.getSeenBy(q.thread_id).length === r.length)))));\n    };\n;\n    k.subscribe(\"state-changed\", function(p, q) {\n        {\n            var fin202keys = ((window.top.JSBNG_Replay.forInKeys)((m))), fin202i = (0);\n            var r;\n            for (; (fin202i < fin202keys.length); (fin202i++)) {\n                ((r) = (fin202keys[fin202i]));\n                {\n                    var s = i.scry(JSBNG__document.body, ((r + \".seenByListener\")));\n                    for (var t = 0; ((t < s.length)); t++) {\n                        var u = s[t], v = h.get(u, \"thread-id\");\n                        if (q[v]) {\n                            l.getThreadMeta(v, function(w) {\n                                o(u, w);\n                            });\n                        }\n                    ;\n                    ;\n                    };\n                ;\n                };\n            };\n        };\n    ;\n    });\n    e.exports = n;\n});\n__d(\"MercuryThreadMetadataRenderer\", [\"MercuryConfig\",\"CSS\",\"DOM\",\"HTML\",\"JSLogger\",\"MercuryAttachment\",\"MercuryAttachmentType\",\"MercuryEmoji\",\"MercuryMessageSourceTags\",\"MercurySingletonMixin\",\"MercuryThreadMetadataRawRenderer\",\"MercuryParticipants\",\"MercuryParticipantsConstants\",\"React\",\"MercurySeenByAll\",\"MercuryServerRequests\",\"SplitImage.react\",\"Style\",\"MercuryThreadlistIconTemplates\",\"MercuryThreads\",\"Tooltip\",\"URI\",\"arrayContains\",\"createArrayFrom\",\"copyProperties\",\"cx\",\"formatDate\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"MercuryConfig\"), h = b(\"CSS\"), i = b(\"DOM\"), j = b(\"HTML\"), k = b(\"JSLogger\"), l = b(\"MercuryAttachment\"), m = b(\"MercuryAttachmentType\"), n = b(\"MercuryEmoji\"), o = b(\"MercuryMessageSourceTags\"), p = b(\"MercurySingletonMixin\"), q = b(\"MercuryThreadMetadataRawRenderer\"), r = b(\"MercuryParticipants\"), s = b(\"MercuryParticipantsConstants\"), t = b(\"React\"), u = b(\"MercurySeenByAll\"), v = b(\"MercuryServerRequests\"), w = b(\"SplitImage.react\"), x = b(\"Style\"), y = b(\"MercuryThreadlistIconTemplates\"), z = b(\"MercuryThreads\"), aa = b(\"Tooltip\"), ba = b(\"URI\"), ca = b(\"arrayContains\"), da = b(\"createArrayFrom\"), ea = b(\"copyProperties\"), fa = b(\"cx\"), ga = b(\"formatDate\"), ha = b(\"tx\"), ia = k.create(\"wm_timestamp\");\n    function ja(pa) {\n        this._fbid = pa;\n        this._serverRequests = v.getForFBID(pa);\n        this._threads = z.getForFBID(pa);\n    };\n;\n    ea(ja, p);\n    ea(ja.prototype, {\n        renderTimestamp: function(pa, qa, ra, sa) {\n            if (sa) {\n                if (!qa) {\n                    ia.warn(\"no_title\");\n                    qa = (new JSBNG__Date(sa)).toLocaleDateString();\n                }\n            ;\n            ;\n                pa.setAttribute(\"title\", qa);\n                pa.setAttribute(\"data-utime\", ((sa / 1000)));\n                if (!ra) {\n                    ia.warn(\"no_display\");\n                    ra = ga(new JSBNG__Date(sa), ((g[\"24h_times\"] ? \"H:i\" : \"g:ia\")));\n                }\n            ;\n            ;\n                i.setContent(pa, ra);\n                h.show(pa);\n            }\n        ;\n        ;\n        },\n        renderMessageSourceTags: function(pa, qa, ra, sa) {\n            var ta = \"\", ua = \"\", va = \"\";\n            if (ca(ra, o.MESSENGER)) {\n                ta = \"Sent from Messenger\";\n                ua = new ba(\"/mobile/messenger\");\n                va = \"_9g\";\n            }\n             else if (ca(ra, o.MOBILE)) {\n                ta = \"Sent from Mobile\";\n                ua = new ba(\"/mobile/\");\n                va = \"_9j\";\n            }\n             else if (ca(ra, o.CHAT)) {\n                ta = \"Sent from chat\";\n                va = \"_9h\";\n            }\n             else if (ca(ra, o.EMAIL)) {\n                if (sa) {\n                    ta = ha._(\"Sent from {email}\", {\n                        email: sa\n                    });\n                }\n                 else ta = \"Sent from email\";\n            ;\n            ;\n                va = \"_9i\";\n            }\n            \n            \n            \n        ;\n        ;\n            if (va) {\n                aa.set(pa, ta);\n                h.addClass(qa, va);\n                if (ua) {\n                    pa.setAttribute(\"href\", ua);\n                }\n                 else pa.removeAttribute(\"href\");\n            ;\n            ;\n            }\n             else h.hide(pa);\n        ;\n        ;\n        },\n        renderMessageLocation: function(pa, qa, ra) {\n            var sa = ba(\"/ajax/messaging/hovercard/map.php\").setQueryData(ra);\n            pa.setAttribute(\"data-hovercard\", sa);\n            h.removeClass(pa, \"_b9\");\n            h.show(qa);\n        },\n        renderSpoofWarning: function(pa, qa, ra) {\n            if (qa) {\n                h.addClass(pa, \"_sa\");\n                aa.set(pa, ha._(\"Unable to confirm {name_or_email} as the sender.\", {\n                    name_or_email: ra.JSBNG__name\n                }));\n            }\n        ;\n        ;\n        },\n        renderChatSpoofWarning: function(pa, qa, ra) {\n            if (qa) {\n                i.appendContent(pa, ha._(\"Unable to confirm {name_or_email} as the sender.\", {\n                    name_or_email: ra.JSBNG__name\n                }));\n            }\n        ;\n        ;\n        },\n        renderCoreThreadlist: function(pa, qa, ra, sa, ta) {\n            sa = ((sa || {\n            }));\n            this.renderThreadImage(pa, qa.getNode(\"image\"));\n            var ua = qa.getNode(\"accessibleName\"), va = [qa.getNode(\"JSBNG__name\"),];\n            if (ua) {\n                va.push(ua);\n            }\n        ;\n        ;\n            oa(this, pa, va, sa);\n            if (((pa.folder && ta))) {\n                na(qa.getNode(\"folderBadge\"), pa.folder);\n            }\n        ;\n        ;\n            var wa = qa.getNode(\"timestamp\");\n            this.renderTimestamp(wa, pa.timestamp_absolute, pa.timestamp_relative, pa.timestamp);\n            this.renderSnippet(pa, qa.getNode(\"snippet\"));\n            la(qa, pa);\n            ra(qa, pa);\n        },\n        renderAndSeparatedParticipantList: function(pa, qa, ra) {\n            ra = ((ra || {\n            }));\n            ra.last_separator_uses_and = true;\n            this._threads.getThreadMeta(pa, function(sa) {\n                oa(this, sa, qa, ra);\n            }.bind(this));\n        },\n        renderSnippet: function(pa, qa) {\n            var ra = false, sa = i.create(\"span\");\n            h.addClass(sa, \"MercuryRepliedIndicator\");\n            i.appendContent(qa, sa);\n            u.updateOnSeenChange(sa, pa);\n            var ta = pa.snippet;\n            if (ta) {\n                if (pa.snippet_has_attachment) {\n                    i.appendContent(qa, i.create(\"span\", {\n                        className: \"MercuryAttachmentIndicator\"\n                    }));\n                }\n            ;\n            ;\n                if (pa.is_forwarded_snippet) {\n                    i.appendContent(qa, i.create(\"strong\", {\n                        className: \"_55q_\"\n                    }, \"Forwarded Message:\"));\n                }\n            ;\n            ;\n                if (((ta.substr(0, 4) == \"?OTR\"))) {\n                    ta = \"[encrypted message]\";\n                }\n                 else ta = ta.replace(/\\r\\n|[\\r\\n]/g, \" \");\n            ;\n            ;\n                ta = j(n.htmlEmojiAndEmote(ta));\n            }\n             else {\n                if (pa.is_forwarded_snippet) {\n                    i.appendContent(qa, i.create(\"strong\", {\n                        className: \"_55q_\"\n                    }, \"Forwarded Message\"));\n                }\n            ;\n            ;\n                if (((((pa.snippet_has_attachment && pa.snippet_attachments)) && pa.snippet_attachments.length))) {\n                    ra = true;\n                    ta = i.create(\"span\");\n                    ma(this, pa, ta);\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            var ua = pa.participants.length;\n            if (pa.is_subscribed) {\n                ua--;\n            }\n        ;\n        ;\n            if (((((((!ra && pa.snippet_sender)) && ((r.getIDForUser(this._fbid) != pa.snippet_sender)))) && ((ua > 1))))) {\n                r.get(pa.snippet_sender, function(va) {\n                    if (va.short_name) {\n                        i.appendContent(qa, ha._(\"{name}: {conversation_snippet}\", {\n                            JSBNG__name: va.short_name,\n                            conversation_snippet: ta\n                        }));\n                    }\n                     else i.appendContent(qa, ta);\n                ;\n                ;\n                });\n            }\n             else i.appendContent(qa, ta);\n        ;\n        ;\n        },\n        getTitanURL: function(pa, qa, ra) {\n            if (((pa.substr(0, pa.indexOf(\":\")) == \"user\"))) {\n                q.getUserCanonicalTitanURL(pa, qa, ra);\n            }\n             else this._serverRequests.getServerThreadID(pa, function(sa) {\n                q.getTitanURLWithServerID(sa, qa, ra);\n            });\n        ;\n        ;\n        },\n        renderTitanLink: function(pa, qa, ra, sa) {\n            if (((pa.substr(0, pa.indexOf(\":\")) == \"user\"))) {\n                q.renderUserCanonicalTitanLink(pa, qa, ra, sa);\n            }\n             else this._serverRequests.getServerThreadID(pa, function(ta) {\n                q.renderTitanLinkWithServerID(ta, qa, ra, sa);\n            });\n        ;\n        ;\n        },\n        renderThreadImage: function(pa, qa) {\n            if (pa.image_src) {\n                var ra = w({\n                    srcs: pa.image_src,\n                    size: s.BIG_IMAGE_SIZE\n                });\n                t.renderComponent(ra, qa);\n                return;\n            }\n        ;\n        ;\n            var sa = r.getIDForUser(this._fbid), ta = [], ua = pa.participants.filter(function(va) {\n                return ((va != sa));\n            });\n            if (!ua.length) {\n                ta = [sa,];\n            }\n             else if (((ua.length == 1))) {\n                ta = [ua[0],];\n            }\n             else ta = ua.slice(0, 3);\n            \n        ;\n        ;\n            this.renderParticipantImages(ta, qa);\n        },\n        renderParticipantImages: function(pa, qa) {\n            r.getOrderedBigImageMulti(pa, function(ra) {\n                var sa = w({\n                    srcs: ra,\n                    border: true,\n                    size: s.BIG_IMAGE_SIZE\n                });\n                t.renderComponent(sa, qa);\n            });\n        },\n        renderParticipantList: function(pa, qa, ra, sa) {\n            return q.renderRawParticipantList(this._serverRequests.getServerThreadIDNow(pa), qa, ra, sa);\n        },\n        renderThreadNameAndParticipantList: function(pa, qa, ra, sa) {\n            var ta = q.renderRawParticipantList(this._serverRequests.getServerThreadIDNow(pa), qa, ra, sa), ua = this._threads.getThreadMetaNow(pa);\n            if (!ua.JSBNG__name) {\n                return ta;\n            }\n        ;\n        ;\n            return ha._(\"{conversation_name} [with {participant_list}]\", {\n                conversation_name: ua.JSBNG__name,\n                participant_list: ta\n            });\n        },\n        renderParticipantCount: function(pa, qa) {\n            return q.renderRawParticipantCount(this._serverRequests.getServerThreadIDNow(pa), qa);\n        }\n    });\n    function ka(pa) {\n        if (!pa.snippet_attachments) {\n            return [];\n        }\n    ;\n    ;\n        return pa.snippet_attachments.filter(function(qa) {\n            return ((qa.attach_type === m.PHOTO));\n        });\n    };\n;\n    function la(pa, qa) {\n        var ra = ka(qa);\n        if (((ra.length === 0))) {\n            return;\n        }\n    ;\n    ;\n        var sa = ra[0].thumbnail_url;\n        if (!sa) {\n            return;\n        }\n    ;\n    ;\n        var ta = ((((ra.length == 1)) ? \"snippet-thumbnail-single\" : \"snippet-thumbnail-multiple\")), ua = pa.getNode(ta);\n        if (!ua) {\n            return;\n        }\n    ;\n    ;\n        var va = i.JSBNG__find(ua, \"i\");\n        x.set(va, \"background-image\", ((((\"url(\" + sa)) + \")\")));\n        h.show(ua);\n    };\n;\n    function ma(pa, qa, ra) {\n        var sa = ((qa.snippet_sender && ((r.getIDForUser(pa._fbid) == qa.snippet_sender)))), ta = function(ya) {\n            if (((!qa.snippet_sender || sa))) {\n                ya(null);\n                return;\n            }\n        ;\n        ;\n            r.get(qa.snippet_sender, function(za) {\n                ya(za.short_name);\n            });\n        }, ua = ka(qa), va = ((ua.length == qa.snippet_attachments.length)), wa = ((((((qa.snippet_attachments.length === 1)) && qa.snippet_attachments[0].metadata)) && ((qa.snippet_attachments[0].metadata.type == \"fb_voice_message\")))), xa = ((((qa.snippet_attachments.length === 1)) && ((qa.snippet_attachments[0].attach_type === m.STICKER))));\n        ta(function(ya) {\n            var za = null;\n            if (va) {\n                var ab = y[\":fb:mercury:attachment-icon-text\"].build().getRoot();\n                if (((ua.length === 1))) {\n                    za = ((sa ? \"You sent a photo.\" : ha._(\"{name} sent a photo.\", {\n                        JSBNG__name: ya\n                    })));\n                }\n                 else za = ((sa ? ha._(\"You sent {num_photos} photos.\", {\n                    num_photos: ua.length\n                }) : ha._(\"{name} sent {num_photos} photos.\", {\n                    JSBNG__name: ya,\n                    num_photos: ua.length\n                })));\n            ;\n            ;\n                h.addClass(ab, l.getAttachIconClass(ua[0].icon_type));\n                i.appendContent(ab, za);\n                i.appendContent(ra, ab);\n            }\n             else if (wa) {\n                var bb = y[\":fb:mercury:attachment-icon-text\"].build().getRoot();\n                za = ((sa ? \"You sent a voice message.\" : ha._(\"{name} sent a voice message.\", {\n                    JSBNG__name: ya\n                })));\n                h.addClass(bb, l.getAttachIconClass(qa.snippet_attachments[0].icon_type));\n                i.appendContent(bb, za);\n                i.appendContent(ra, bb);\n            }\n             else if (xa) {\n                za = ((sa ? \"You sent a sticker.\" : ha._(\"{name} sent a sticker.\", {\n                    JSBNG__name: ya\n                })));\n                i.appendContent(ra, za);\n            }\n             else qa.snippet_attachments.filter(function(cb) {\n                return ((((cb.attach_type == m.FILE)) || ((cb.attach_type == m.PHOTO))));\n            }).forEach(function(cb) {\n                var db = y[\":fb:mercury:attachment-icon-text\"].build().getRoot();\n                i.appendContent(db, cb.JSBNG__name);\n                h.addClass(db, l.getAttachIconClass(cb.icon_type));\n                i.appendContent(ra, db);\n            });\n            \n            \n        ;\n        ;\n        });\n    };\n;\n    function na(pa, qa) {\n        da(pa).forEach(function(ra) {\n            i.setContent(ra, qa);\n        });\n    };\n;\n    function oa(pa, qa, ra, sa) {\n        ra = da(ra);\n        if (qa.JSBNG__name) {\n            var ta = q.renderRawTitleWithUnreadCount(qa.JSBNG__name, ((sa.show_unread_count ? qa.unread_count : 0)));\n            ra.forEach(function(va) {\n                i.setContent(va, ta);\n            });\n            ((sa.callback && sa.callback(ta)));\n            return;\n        }\n    ;\n    ;\n        var ua = qa.participants;\n        if (((qa.participants.length > 1))) {\n            ua = qa.participants.filter(function(va) {\n                return ((va != r.getIDForUser(pa._fbid)));\n            });\n        }\n    ;\n    ;\n        r.getMulti(ua, function(va) {\n            q.renderParticipantListWithNoThreadName(pa._serverRequests.getServerThreadIDNow(qa.thread_id), qa, ua, va, ra, sa);\n        });\n    };\n;\n    e.exports = ja;\n});\n__d(\"MercuryChatUtils\", [\"Env\",], function(a, b, c, d, e, f) {\n    var g = b(\"Env\"), h = {\n        canOpenChatTab: function(i) {\n            var j = ((i.is_canonical && !i.is_canonical_user));\n            return ((((i.is_subscribed && !j)) && ((i.canonical_fbid != g.user))));\n        }\n    };\n    e.exports = h;\n});\n__d(\"RenderManager\", [\"function-extensions\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    b(\"function-extensions\");\n    var g = b(\"copyProperties\");\n    function h(i) {\n        this._isDirty = false;\n        this._obj = i;\n    };\n;\n    g(h.prototype, {\n        dirty: function() {\n            if (!this._isDirty) {\n                this._isDirty = true;\n                this._doPaint.bind(this).defer();\n            }\n        ;\n        ;\n        },\n        _doPaint: function() {\n            this._isDirty = false;\n            this._obj.paint();\n        }\n    });\n    e.exports = h;\n});\n__d(\"CounterDisplay\", [\"Arbiter\",\"CSS\",\"DOM\",\"RenderManager\",\"Run\",\"$\",\"copyProperties\",\"removeFromArray\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"CSS\"), i = b(\"DOM\"), j = b(\"RenderManager\"), k = b(\"Run\"), l = b(\"$\"), m = b(\"copyProperties\"), n = b(\"removeFromArray\");\n    function o(p, q, r, s, t, u) {\n        m(this, {\n            _name: p,\n            _valueNode: l(q),\n            _wrapperNode: ((l(r) || null)),\n            _statusClass: t,\n            _rm: new j(this),\n            _arbiterSubscription: null,\n            _count: 0\n        });\n        var v = this._valueNode.firstChild;\n        if (v) {\n            var w = parseInt(v.nodeValue, 10);\n            if (!isNaN(w)) {\n                this._count = w;\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n        this._statusNode = ((s ? l(s) : null));\n        this._subscribeAll();\n        o.instances.push(this);\n        if (!u) {\n            k.onLeave(this._destroy.bind(this), true);\n        }\n    ;\n    ;\n    };\n;\n    m(o, {\n        EVENT_TYPE_ADJUST: \"CounterDisplay/adjust\",\n        EVENT_TYPE_UPDATE: \"CounterDisplay/update\",\n        instances: [],\n        adjustCount: function(p, q) {\n            g.inform(((((o.EVENT_TYPE_ADJUST + \"/\")) + p)), q);\n        },\n        setCount: function(p, q) {\n            g.inform(((((o.EVENT_TYPE_UPDATE + \"/\")) + p)), q);\n        }\n    });\n    m(o.prototype, {\n        _destroy: function() {\n            delete this._valueNode;\n            delete this._wrapperNode;\n            if (this._arbiterSubscription) {\n                this._arbiterSubscription.unsubscribe();\n                delete this._arbiterSubscription;\n            }\n        ;\n        ;\n            n(o.instances, this);\n        },\n        adjustCount: function(p) {\n            this._count = Math.max(0, ((this._count + p)));\n            this._rm.dirty();\n            return this;\n        },\n        setCount: function(p) {\n            this._count = Math.max(0, p);\n            this._rm.dirty();\n            return this;\n        },\n        paint: function() {\n            i.setContent(this._valueNode, this._count);\n            this._toggleNodes();\n        },\n        _toggleNodes: function() {\n            if (this._wrapperNode) {\n                h.conditionClass(this._wrapperNode, \"hidden_elem\", ((this._count <= 0)));\n            }\n        ;\n        ;\n            if (((this._statusClass && this._statusNode))) {\n                h.conditionClass(this._statusNode, this._statusClass, ((this._count > 0)));\n            }\n        ;\n        ;\n        },\n        _subscribeAll: function() {\n            var p = [((((o.EVENT_TYPE_ADJUST + \"/\")) + this._name)),((((o.EVENT_TYPE_UPDATE + \"/\")) + this._name)),];\n            this._arbiterSubscription = g.subscribe(p, this._onInform.bind(this), g.SUBSCRIBE_NEW);\n        },\n        _onInform: function(p, q) {\n            q = parseInt(q);\n            if (isNaN(q)) {\n                return;\n            }\n        ;\n        ;\n            if (((p.indexOf(o.EVENT_TYPE_ADJUST) != -1))) {\n                this.adjustCount(q);\n            }\n             else if (((p.indexOf(o.EVENT_TYPE_UPDATE) != -1))) {\n                this.setCount(q);\n            }\n             else return\n            \n        ;\n            return;\n        }\n    });\n    e.exports = o;\n});\n__d(\"CacheStorage\", [\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"copyProperties\"), h = {\n        memory: k,\n        localstorage: i,\n        sessionstorage: j\n    };\n    function i() {\n        this._store = a.JSBNG__localStorage;\n    };\n;\n    i.available = function() {\n        try {\n            return !!a.JSBNG__localStorage;\n        } catch (m) {\n            return false;\n        };\n    ;\n    };\n    g(i.prototype, {\n        keys: function() {\n            var m = [];\n            for (var n = 0; ((n < this._store.length)); n++) {\n                m.push(this._store.key(n));\n            ;\n            };\n        ;\n            return m;\n        },\n        get: function(m) {\n            return this._store.getItem(m);\n        },\n        set: function(m, n) {\n            this._store.setItem(m, n);\n        },\n        remove: function(m) {\n            this._store.removeItem(m);\n        },\n        clear: function() {\n            this._store.clear();\n        }\n    });\n    function j() {\n        this._store = a.JSBNG__sessionStorage;\n    };\n;\n    j.available = function() {\n        try {\n            return !!a.JSBNG__sessionStorage;\n        } catch (m) {\n            return false;\n        };\n    ;\n    };\n    g(j.prototype, {\n        keys: function() {\n            var m = [];\n            for (var n = 0; ((n < this._store.length)); n++) {\n                m.push(this._store.key(n));\n            ;\n            };\n        ;\n            return m;\n        },\n        get: function(m) {\n            return this._store.getItem(m);\n        },\n        set: function(m, n) {\n            this._store.setItem(m, n);\n        },\n        remove: function(m) {\n            this._store.removeItem(m);\n        },\n        clear: function() {\n            this._store.clear();\n        }\n    });\n    function k() {\n        this._store = {\n        };\n    };\n;\n    k.available = function() {\n        return true;\n    };\n    g(k.prototype, {\n        keys: function() {\n            return Object.keys(this._store);\n        },\n        get: function(m) {\n            if (((this._store[m] === undefined))) {\n                return null;\n            }\n        ;\n        ;\n            return this._store[m];\n        },\n        set: function(m, n) {\n            this._store[m] = n;\n        },\n        remove: function(m) {\n            if (((m in this._store))) {\n                delete this._store[m];\n            }\n        ;\n        ;\n        },\n        clear: function() {\n            this._store = {\n            };\n        }\n    });\n    function l(m, n) {\n        this._key_prefix = ((n || \"_cs_\"));\n        this._magic_prefix = \"_@_\";\n        if (((((m == \"AUTO\")) || !m))) {\n            {\n                var fin203keys = ((window.top.JSBNG_Replay.forInKeys)((h))), fin203i = (0);\n                var o;\n                for (; (fin203i < fin203keys.length); (fin203i++)) {\n                    ((o) = (fin203keys[fin203i]));\n                    {\n                        var p = h[o];\n                        if (p.available()) {\n                            m = o;\n                            break;\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        }\n    ;\n    ;\n        if (m) {\n            if (((typeof m == \"string\"))) {\n                if (((!h[m] || !h[m].available()))) {\n                    this._backend = new k();\n                }\n                 else this._backend = new h[m]();\n            ;\n            ;\n            }\n             else if (((!m.available || !m.available()))) {\n                this._backend = new k();\n            }\n             else this._backend = m;\n            \n        ;\n        }\n    ;\n    ;\n    };\n;\n    g(l, {\n        getAllStorageTypes: function() {\n            return Object.keys(h);\n        }\n    });\n    g(l.prototype, {\n        keys: function() {\n            var m = [];\n            try {\n                if (this._backend) {\n                    var o = this._backend.keys();\n                    for (var p = 0; ((p < o.length)); p++) {\n                        if (((o[p].substr(0, this._key_prefix.length) == this._key_prefix))) {\n                            m.push(o[p].substr(this._key_prefix.length));\n                        }\n                    ;\n                    ;\n                    };\n                ;\n                }\n            ;\n            ;\n            } catch (n) {\n            \n            };\n        ;\n            return m;\n        },\n        set: function(m, n) {\n            if (this._backend) {\n                if (((typeof n == \"string\"))) {\n                    n = ((this._magic_prefix + n));\n                }\n                 else n = JSON.stringify(n);\n            ;\n            ;\n                try {\n                    this._backend.set(((this._key_prefix + m)), n);\n                } catch (o) {\n                \n                };\n            ;\n            }\n        ;\n        ;\n        },\n        get: function(m, n) {\n            var o;\n            if (this._backend) {\n                try {\n                    o = this._backend.get(((this._key_prefix + m)));\n                } catch (p) {\n                    o = null;\n                };\n            ;\n                if (((o !== null))) {\n                    if (((o.substr(0, this._magic_prefix.length) == this._magic_prefix))) {\n                        o = o.substr(this._magic_prefix.length);\n                    }\n                     else try {\n                        o = JSON.parse(o);\n                    } catch (q) {\n                        o = undefined;\n                    }\n                ;\n                ;\n                }\n                 else o = undefined;\n            ;\n            ;\n            }\n        ;\n        ;\n            if (((((o === undefined)) && ((n !== undefined))))) {\n                o = n;\n                if (this._backend) {\n                    var r;\n                    if (((typeof o == \"string\"))) {\n                        r = ((this._magic_prefix + o));\n                    }\n                     else r = JSON.stringify(o);\n                ;\n                ;\n                    try {\n                        this._backend.set(((this._key_prefix + m)), r);\n                    } catch (p) {\n                    \n                    };\n                ;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            return o;\n        },\n        remove: function(m) {\n            if (this._backend) {\n                try {\n                    this._backend.remove(((this._key_prefix + m)));\n                } catch (n) {\n                \n                };\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = l;\n});\n__d(\"Badge\", [\"DOM\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOM\"), h = b(\"cx\"), i = function(j) {\n        var k;\n        switch (j) {\n          case \"xsmall\":\n            k = \"_56_g _58to\";\n            break;\n          case \"small\":\n            k = \"_56_g _56_h\";\n            break;\n          case \"medium\":\n            k = \"_56_g _56_j\";\n            break;\n          case \"large\":\n            k = \"_56_g _56_k\";\n            break;\n          case \"xlarge\":\n            k = \"_56_g _57s-\";\n            break;\n        };\n    ;\n        if (k) {\n            return g.create(\"span\", {\n                className: k\n            });\n        }\n    ;\n    ;\n        return null;\n    };\n    e.exports = i;\n});\n__d(\"BasicTypeaheadRenderer\", [\"Badge\",\"DOM\",], function(a, b, c, d, e, f) {\n    var g = b(\"Badge\"), h = b(\"DOM\");\n    function i(j, k) {\n        var l = [];\n        if (j.icon) {\n            l.push(h.create(\"img\", {\n                alt: \"\",\n                src: j.icon\n            }));\n        }\n    ;\n    ;\n        if (j.text) {\n            var m = [j.text,];\n            if (j.verified) {\n                m.push(g(\"xsmall\"));\n            }\n        ;\n        ;\n            l.push(h.create(\"span\", {\n                className: \"text\"\n            }, m));\n        }\n    ;\n    ;\n        if (j.subtext) {\n            l.push(h.create(\"span\", {\n                className: \"subtext\"\n            }, [j.subtext,]));\n        }\n    ;\n    ;\n        var n = h.create(\"li\", {\n            className: ((j.type || \"\"))\n        }, l);\n        if (j.text) {\n            n.setAttribute(\"aria-label\", j.text);\n        }\n    ;\n    ;\n        return n;\n    };\n;\n    i.className = \"basic\";\n    e.exports = i;\n});\n__d(\"TypeaheadView\", [\"JSBNG__Event\",\"ArbiterMixin\",\"BasicTypeaheadRenderer\",\"CSS\",\"DOM\",\"Parent\",\"$\",\"copyProperties\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"ArbiterMixin\"), i = b(\"BasicTypeaheadRenderer\"), j = b(\"CSS\"), k = b(\"DOM\"), l = b(\"Parent\"), m = b(\"$\"), n = b(\"copyProperties\"), o = b(\"emptyFunction\");\n    function p(q, r) {\n        this.element = this.JSBNG__content = m(q);\n        this.showBadges = r.showBadges;\n        n(this, r);\n    };\n;\n    n(p.prototype, h, {\n        events: [\"highlight\",\"render\",\"reset\",\"select\",\"beforeRender\",\"next\",\"prev\",],\n        renderer: i,\n        autoSelect: false,\n        ignoreMouseover: false,\n        init: function() {\n            this.init = o;\n            this.initializeEvents();\n            this.reset();\n        },\n        initializeEvents: function() {\n            g.listen(this.element, {\n                mouseup: this.mouseup.bind(this),\n                mouseover: this.mouseover.bind(this)\n            });\n        },\n        setTypeahead: function(q) {\n            this.typeahead = q;\n        },\n        setAccessibilityControlElement: function(q) {\n            this.accessibilityElement = q;\n        },\n        getElement: function() {\n            return this.element;\n        },\n        mouseup: function(JSBNG__event) {\n            if (((JSBNG__event.button != 2))) {\n                this.select(true);\n                JSBNG__event.kill();\n            }\n        ;\n        ;\n        },\n        mouseover: function(JSBNG__event) {\n            if (this.ignoreMouseover) {\n                this.ignoreMouseover = false;\n                return;\n            }\n        ;\n        ;\n            if (this.visible) {\n                this.highlight(this.getIndex(JSBNG__event));\n            }\n        ;\n        ;\n        },\n        reset: function(q) {\n            if (!q) {\n                this.disableAutoSelect = false;\n            }\n        ;\n        ;\n            this.justRendered = false;\n            this.justShown = false;\n            this.index = -1;\n            this.items = [];\n            this.results = [];\n            this.value = \"\";\n            this.JSBNG__content.innerHTML = \"\";\n            this.inform(\"reset\");\n            return this;\n        },\n        getIndex: function(JSBNG__event) {\n            return this.items.indexOf(l.byTag(JSBNG__event.getTarget(), \"li\"));\n        },\n        JSBNG__getSelection: function() {\n            var q = ((this.results[this.index] || null));\n            return ((this.visible ? q : null));\n        },\n        isEmpty: function() {\n            return !this.results.length;\n        },\n        isVisible: function() {\n            return this.visible;\n        },\n        show: function() {\n            j.show(this.element);\n            if (((this.results && this.results.length))) {\n                if (((((this.autoSelect && this.accessibilityElement)) && this.selected))) {\n                    this.accessibilityElement.setAttribute(\"aria-activedescendant\", k.getID(this.selected));\n                }\n            ;\n            }\n        ;\n        ;\n            ((this.accessibilityElement && this.accessibilityElement.setAttribute(\"aria-expanded\", \"true\")));\n            this.visible = true;\n            return this;\n        },\n        hide: function() {\n            j.hide(this.element);\n            if (this.accessibilityElement) {\n                this.accessibilityElement.setAttribute(\"aria-expanded\", \"false\");\n                this.accessibilityElement.removeAttribute(\"aria-activedescendant\");\n            }\n        ;\n        ;\n            this.visible = false;\n            return this;\n        },\n        render: function(q, r, s) {\n            this.value = q;\n            if (!r.length) {\n                ((this.accessibilityElement && this.accessibilityElement.removeAttribute(\"aria-activedescendant\")));\n                this.reset(true);\n                return;\n            }\n        ;\n        ;\n            this.justRendered = true;\n            if (!this.results.length) {\n                this.justShown = true;\n            }\n        ;\n        ;\n            var t = {\n                results: r,\n                value: q\n            };\n            this.inform(\"beforeRender\", t);\n            r = t.results;\n            var u = this.getDefaultIndex(r);\n            if (((((this.index > 0)) && ((this.index !== this.getDefaultIndex(this.results)))))) {\n                var v = this.results[this.index];\n                for (var w = 0, x = r.length; ((w < x)); ++w) {\n                    if (((v.uid == r[w].uid))) {\n                        u = w;\n                        break;\n                    }\n                ;\n                ;\n                };\n            ;\n            }\n        ;\n        ;\n            this.results = r;\n            k.setContent(this.JSBNG__content, this.buildResults(r));\n            this.items = this.getItems();\n            this.highlight(u, false);\n            this.inform(\"render\", r);\n        },\n        getItems: function() {\n            return k.scry(this.JSBNG__content, \"li\");\n        },\n        buildResults: function(q) {\n            var r, s = null;\n            if (((typeof this.renderer == \"function\"))) {\n                r = this.renderer;\n                s = ((this.renderer.className || \"\"));\n            }\n             else {\n                r = a.TypeaheadRenderers[this.renderer];\n                s = this.renderer;\n            }\n        ;\n        ;\n            r = r.bind(this);\n            var t = this.showBadges, u = q.map(function(w, x) {\n                if (!t) {\n                    w.verified = null;\n                }\n            ;\n            ;\n                var y = ((w.node || r(w, x)));\n                y.setAttribute(\"role\", \"option\");\n                return y;\n            }), v = k.create(\"ul\", {\n                className: s,\n                id: ((\"typeahead_list_\" + ((this.typeahead ? k.getID(this.typeahead) : k.getID(this.element)))))\n            }, u);\n            v.setAttribute(\"role\", \"listbox\");\n            return v;\n        },\n        getDefaultIndex: function(q) {\n            var r = ((this.autoSelect && !this.disableAutoSelect));\n            return ((((((this.index < 0)) && !r)) ? -1 : 0));\n        },\n        next: function() {\n            this.highlight(((this.index + 1)));\n            this.inform(\"next\", this.selected);\n        },\n        prev: function() {\n            this.highlight(((this.index - 1)));\n            this.inform(\"prev\", this.selected);\n        },\n        getItemText: function(q) {\n            var r = \"\";\n            if (q) {\n                r = q.getAttribute(\"aria-label\");\n                if (!r) {\n                    r = k.getText(q);\n                    q.setAttribute(\"aria-label\", r);\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            return r;\n        },\n        setIsViewingSelectedItems: function(q) {\n            this.viewingSelected = q;\n            return this;\n        },\n        getIsViewingSelectedItems: function() {\n            return this.viewingSelected;\n        },\n        highlight: function(q, r) {\n            var s = true;\n            if (this.selected) {\n                j.removeClass(this.selected, \"selected\");\n                this.selected.setAttribute(\"aria-selected\", \"false\");\n            }\n        ;\n        ;\n            if (((q > ((this.items.length - 1))))) {\n                q = -1;\n            }\n             else if (((q < -1))) {\n                q = ((this.items.length - 1));\n            }\n            \n        ;\n        ;\n            if (((((q >= 0)) && ((q < this.items.length))))) {\n                if (((this.selected && ((this.getItemText(this.items[q]) === this.getItemText(this.selected)))))) {\n                    s = false;\n                }\n            ;\n            ;\n                this.selected = this.items[q];\n                j.addClass(this.selected, \"selected\");\n                this.selected.setAttribute(\"aria-selected\", \"true\");\n                if (this.accessibilityElement) {\n                    (function() {\n                        this.accessibilityElement.setAttribute(\"aria-activedescendant\", k.getID(this.selected));\n                    }).bind(this).defer();\n                }\n            ;\n            ;\n            }\n             else ((this.accessibilityElement && this.accessibilityElement.removeAttribute(\"aria-activedescendant\")));\n        ;\n        ;\n            this.index = q;\n            this.disableAutoSelect = ((q == -1));\n            var t = ((q !== -1)), u = this.getItemText(this.selected);\n            if (((((((((q !== -1)) && this.isVisible())) && u)) && this.autoSelect))) {\n                if (this.justShown) {\n                    this.justRendered = false;\n                    this.justShown = false;\n                    t = false;\n                }\n                 else if (((s && this.justRendered))) {\n                    this.justRendered = false;\n                    t = false;\n                }\n                \n            ;\n            }\n        ;\n        ;\n            if (((r !== false))) {\n                this.inform(\"highlight\", {\n                    index: q,\n                    selected: this.results[q],\n                    element: this.selected\n                });\n            }\n        ;\n        ;\n        },\n        select: function(q) {\n            var r = this.index, s = this.results[r], t = this.element.getAttribute(\"id\");\n            if (s) {\n                this.inform(\"select\", {\n                    index: r,\n                    clicked: !!q,\n                    selected: s,\n                    id: t,\n                    query: this.value\n                });\n                this.inform(\"afterSelect\");\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = p;\n});\n__d(\"BucketedTypeaheadView\", [\"Class\",\"DOM\",\"tx\",\"TypeaheadView\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Class\"), h = b(\"DOM\"), i = b(\"tx\"), j = b(\"TypeaheadView\"), k = b(\"copyProperties\");\n    function l(m, n) {\n        this.parent.construct(this, m, n);\n    };\n;\n    g.extend(l, j);\n    k(l.prototype, {\n        render: function(m, n, o) {\n            n = this.buildBuckets(m, n);\n            return this.parent.render(m, n, o);\n        },\n        highlight: function(m, n) {\n            if (((((m == -1)) && ((this.index !== 0))))) {\n                m = this.index;\n            }\n        ;\n        ;\n            while (((((((m >= 0)) && ((m < this.items.length)))) && !this.isHighlightable(this.results[m])))) {\n                m = ((m + 1));\n            ;\n            };\n        ;\n            this.parent.highlight(m, n);\n        },\n        buildBuckets: function(m, n) {\n            if (((((!this.typeObjects || !n)) || !n.length))) {\n                return n;\n            }\n        ;\n        ;\n            var o = [], p = {\n            };\n            for (var q = 0; ((q < n.length)); ++q) {\n                var r = n[q], s = ((r.render_type || r.type));\n                if (!p.hasOwnProperty(s)) {\n                    p[s] = o.length;\n                    o.push([this.buildBucketHeader(s),]);\n                }\n            ;\n            ;\n                r.classNames = s;\n                r.groupIndex = p[s];\n                r.indexInGroup = ((o[r.groupIndex].length - 1));\n                o[r.groupIndex].push(r);\n            };\n        ;\n            {\n                var fin204keys = ((window.top.JSBNG_Replay.forInKeys)((this.typeObjects))), fin204i = (0);\n                (0);\n                for (; (fin204i < fin204keys.length); (fin204i++)) {\n                    ((s) = (fin204keys[fin204i]));\n                    {\n                        if (((!p.hasOwnProperty(s) && this.typeObjects[s].show_always))) {\n                            p[s] = o.length;\n                            o.push([this.buildBucketHeader(s),]);\n                            r = this.buildNoResultsEntry();\n                            r.classNames = r.type;\n                            r.groupIndex = p[s];\n                            r.indexInGroup = ((o[r.groupIndex].length - 1));\n                            o[r.groupIndex].push(r);\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            var t = [];\n            if (this.typeObjectsOrder) {\n                for (var u = 0; ((u < this.typeObjectsOrder.length)); ++u) {\n                    var v = this.typeObjectsOrder[u];\n                    if (p.hasOwnProperty(v)) {\n                        t = t.concat(o[p[v]]);\n                    }\n                ;\n                ;\n                };\n            ;\n            }\n             else for (var w = 0; ((w < o.length)); ++w) {\n                t = t.concat(o[w]);\n            ;\n            }\n        ;\n        ;\n            return t;\n        },\n        buildNoResultsEntry: function() {\n            return {\n                uid: \"disabled_result\",\n                type: \"disabled_result\",\n                text: \"No Results\"\n            };\n        },\n        buildBucketHeader: function(m) {\n            var n = this.typeObjects[m];\n            if (((n === undefined))) {\n                throw new Error(((((m + \" is undefined in \")) + JSON.stringify(this.typeObjects))));\n            }\n        ;\n        ;\n            if (n.markup) {\n                n.text = n.markup;\n                delete n.markup;\n            }\n        ;\n        ;\n            return this.typeObjects[m];\n        },\n        buildResults: function(m) {\n            var n = this.parent.buildResults(m);\n            if (this.typeObjects) {\n                return h.create(\"div\", {\n                    className: \"bucketed\"\n                }, [n,]);\n            }\n             else return n\n        ;\n        },\n        isHighlightable: function(m) {\n            return ((((m.type != \"header\")) && ((m.type != \"disabled_result\"))));\n        },\n        select: function(m) {\n            var n = this.results[this.index];\n            if (((n && this.isHighlightable(n)))) {\n                this.parent.select(m);\n            }\n        ;\n        ;\n        },\n        normalizeIndex: function(m) {\n            var n = this.results.length;\n            if (((n === 0))) {\n                return -1;\n            }\n             else if (((m < -1))) {\n                return ((((((m % n)) + n)) + 1));\n            }\n             else if (((m >= n))) {\n                return ((((m % n)) - 1));\n            }\n             else return m\n            \n            \n        ;\n        },\n        getDefaultIndex: function(m) {\n            var n = ((this.autoSelect && !this.disableAutoSelect));\n            if (((((this.index < 0)) && !n))) {\n                return -1;\n            }\n        ;\n        ;\n            if (((m.length === 0))) {\n                return -1;\n            }\n        ;\n        ;\n            var o = 0;\n            while (((!this.isHighlightable(m) && ((o < m.length))))) {\n                o++;\n            ;\n            };\n        ;\n            return o;\n        },\n        prev: function() {\n            var m = this.results[this.normalizeIndex(((this.index - 1)))];\n            while (((m && !this.isHighlightable(m)))) {\n                this.index = this.normalizeIndex(((this.index - 1)));\n                m = this.results[this.normalizeIndex(((this.index - 1)))];\n            };\n        ;\n            return this.parent.prev();\n        },\n        next: function() {\n            var m = this.results[this.normalizeIndex(((this.index + 1)))];\n            while (((m && !this.isHighlightable(m)))) {\n                this.index = this.normalizeIndex(((this.index + 1)));\n                m = this.results[this.normalizeIndex(((this.index + 1)))];\n            };\n        ;\n            return this.parent.next();\n        }\n    });\n    e.exports = l;\n});\n__d(\"ContextualTypeaheadView\", [\"BucketedTypeaheadView\",\"CSS\",\"Class\",\"ContextualLayer\",\"ContextualLayerAutoFlip\",\"ContextualLayerHideOnScroll\",\"DOM\",\"DOMDimensions\",\"Style\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"BucketedTypeaheadView\"), h = b(\"CSS\"), i = b(\"Class\"), j = b(\"ContextualLayer\"), k = b(\"ContextualLayerAutoFlip\"), l = b(\"ContextualLayerHideOnScroll\"), m = b(\"DOM\"), n = b(\"DOMDimensions\"), o = b(\"Style\"), p = b(\"copyProperties\");\n    function q(r, s) {\n        this.parent.construct(this, r, s);\n    };\n;\n    i.extend(q, g);\n    p(q.prototype, {\n        init: function() {\n            this.initializeLayer();\n            this.parent.init();\n        },\n        initializeLayer: function() {\n            this.context = this.getContext();\n            this.wrapper = m.create(\"div\");\n            m.appendContent(this.wrapper, this.element);\n            h.addClass(this.element, \"uiContextualTypeaheadView\");\n            this.layer = new j({\n                context: this.context,\n                position: \"below\",\n                alignment: this.alignment,\n                causalElement: this.causalElement,\n                permanent: true\n            }, this.wrapper);\n            this.layer.enableBehavior(l);\n            if (((o.isFixed(this.context) || this.autoflip))) {\n                this.layer.enableBehavior(k);\n            }\n        ;\n        ;\n            this.subscribe(\"render\", this.renderLayer.bind(this));\n        },\n        show: function() {\n            if (this.minWidth) {\n                o.set(this.wrapper, \"min-width\", ((this.minWidth + \"px\")));\n            }\n             else if (this.width) {\n                o.set(this.wrapper, \"width\", ((this.width + \"px\")));\n            }\n             else o.set(this.wrapper, \"width\", ((n.getElementDimensions(this.context).width + \"px\")));\n            \n        ;\n        ;\n            var r = this.parent.show();\n            this.layer.show();\n            return r;\n        },\n        hide: function() {\n            this.layer.hide();\n            return this.parent.hide();\n        },\n        renderLayer: function() {\n            if (!this.isVisible()) {\n                return;\n            }\n        ;\n        ;\n            if (this.layer.isShown()) {\n                this.layer.updatePosition();\n            }\n             else this.layer.show();\n        ;\n        ;\n        },\n        clearText: function() {\n            this.layer.getCausalElement().value = \"\";\n        },\n        getContext: function() {\n            return this.element.parentNode;\n        }\n    });\n    e.exports = q;\n});\n__d(\"DOMClone\", [], function(a, b, c, d, e, f) {\n    var g = {\n        shallowClone: function(i) {\n            return h(i, false);\n        },\n        deepClone: function(i) {\n            return h(i, true);\n        }\n    };\n    function h(i, j) {\n        var k = i.cloneNode(j);\n        if (((typeof k.__FB_TOKEN !== \"undefined\"))) {\n            delete k.__FB_TOKEN;\n        }\n    ;\n    ;\n        return k;\n    };\n;\n    e.exports = g;\n});\n__d(\"Dcode\", [], function(a, b, c, d, e, f) {\n    var g, h = {\n    }, i = {\n        _: \"%\",\n        A: \"%2\",\n        B: \"000\",\n        C: \"%7d\",\n        D: \"%7b%22\",\n        E: \"%2c%22\",\n        F: \"%22%3a\",\n        G: \"%2c%22ut%22%3a1\",\n        H: \"%2c%22bls%22%3a\",\n        I: \"%2c%22n%22%3a%22%\",\n        J: \"%22%3a%7b%22i%22%3a0%7d\",\n        K: \"%2c%22pt%22%3a0%2c%22vis%22%3a\",\n        L: \"%2c%22ch%22%3a%7b%22h%22%3a%22\",\n        M: \"%7b%22v%22%3a2%2c%22time%22%3a1\",\n        N: \".channel%22%2c%22sub%22%3a%5b\",\n        O: \"%2c%22sb%22%3a1%2c%22t%22%3a%5b\",\n        P: \"%2c%22ud%22%3a100%2c%22lc%22%3a0\",\n        Q: \"%5d%2c%22f%22%3anull%2c%22uct%22%3a\",\n        R: \".channel%22%2c%22sub%22%3a%5b1%5d\",\n        S: \"%22%2c%22m%22%3a0%7d%2c%7b%22i%22%3a\",\n        T: \"%2c%22blc%22%3a1%2c%22snd%22%3a1%2c%22ct%22%3a\",\n        U: \"%2c%22blc%22%3a0%2c%22snd%22%3a1%2c%22ct%22%3a\",\n        V: \"%2c%22blc%22%3a0%2c%22snd%22%3a0%2c%22ct%22%3a\",\n        W: \"%2c%22s%22%3a0%2c%22blo%22%3a0%7d%2c%22bl%22%3a%7b%22ac%22%3a\",\n        X: \"%2c%22ri%22%3a0%7d%2c%22state%22%3a%7b%22p%22%3a0%2c%22ut%22%3a1\",\n        Y: \"%2c%22pt%22%3a0%2c%22vis%22%3a1%2c%22bls%22%3a0%2c%22blc%22%3a0%2c%22snd%22%3a1%2c%22ct%22%3a\",\n        Z: \"%2c%22sb%22%3a1%2c%22t%22%3a%5b%5d%2c%22f%22%3anull%2c%22uct%22%3a0%2c%22s%22%3a0%2c%22blo%22%3a0%7d%2c%22bl%22%3a%7b%22ac%22%3a\"\n    };\n    (function() {\n        var k = [];\n        {\n            var fin205keys = ((window.top.JSBNG_Replay.forInKeys)((i))), fin205i = (0);\n            var l;\n            for (; (fin205i < fin205keys.length); (fin205i++)) {\n                ((l) = (fin205keys[fin205i]));\n                {\n                    h[i[l]] = l;\n                    k.push(i[l]);\n                };\n            };\n        };\n    ;\n        k.reverse();\n        g = new RegExp(k.join(\"|\"), \"g\");\n    })();\n    var j = {\n        encode: function(k) {\n            return encodeURIComponent(k).replace(/([_A-Z])|%../g, function(l, m) {\n                return ((m ? ((\"%\" + m.charCodeAt(0).toString(16))) : l));\n            }).toLowerCase().replace(g, function(l) {\n                return h[l];\n            });\n        },\n        decode: function(k) {\n            return decodeURIComponent(k.replace(/[_A-Z]/g, function(l) {\n                return i[l];\n            }));\n        }\n    };\n    e.exports = j;\n});\n__d(\"FileInput\", [\"JSBNG__Event\",\"ArbiterMixin\",\"DOM\",\"DOMClone\",\"Focus\",\"UserAgent\",\"copyProperties\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"ArbiterMixin\"), i = b(\"DOM\"), j = b(\"DOMClone\"), k = b(\"Focus\"), l = b(\"UserAgent\"), m = b(\"copyProperties\"), n = b(\"cx\"), o = l.ie();\n    function p(q, r, s) {\n        this.container = q;\n        this.control = r;\n        this.input = s;\n        var t = i.scry(this.container, \"a\")[0];\n        ((t && t.removeAttribute(\"href\")));\n        var u = i.create(\"div\", {\n            className: \"_3jk\"\n        }, this.input);\n        i.appendContent(this.control, u);\n        this._initListeners();\n    };\n;\n    m(p.prototype, h, {\n        getValue: function() {\n            return this.input.value;\n        },\n        getInput: function() {\n            return this.input;\n        },\n        clear: function() {\n            if (o) {\n                var q = j.deepClone(this.input);\n                i.replace(this.input, q);\n                this.input = q;\n                while (this._listeners.length) {\n                    this._listeners.pop().remove();\n                ;\n                };\n            ;\n                this._initListeners();\n            }\n             else {\n                this.input.value = \"\";\n                this.input.files = null;\n            }\n        ;\n        ;\n        },\n        _initListeners: function() {\n            k.relocate(this.input, this.control);\n            this._listeners = [g.listen(this.input, \"change\", this._handleChange.bind(this)),];\n        },\n        _handleChange: function(JSBNG__event) {\n            this.inform(\"change\", JSBNG__event);\n            var q = this.input.form;\n            if (((q && ((o < 9))))) {\n                g.fire(q, \"change\", JSBNG__event);\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = p;\n});\n__d(\"Poller\", [\"ArbiterMixin\",\"AsyncRequest\",\"Cookie\",\"Env\",\"copyProperties\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"ArbiterMixin\"), h = b(\"AsyncRequest\"), i = b(\"Cookie\"), j = b(\"Env\"), k = b(\"copyProperties\"), l = b(\"emptyFunction\");\n    function m(p) {\n        this._config = k({\n            clearOnQuicklingEvents: true,\n            setupRequest: l,\n            interval: null,\n            maxRequests: Infinity,\n            dontStart: false\n        }, p);\n        if (!this._config.dontStart) {\n            this.start();\n        }\n    ;\n    ;\n    };\n;\n    m.MIN_INTERVAL = 2000;\n    k(m.prototype, g, {\n        start: function() {\n            if (this._polling) {\n                return this;\n            }\n        ;\n        ;\n            this._requests = 0;\n            this.request();\n            return this;\n        },\n        JSBNG__stop: function() {\n            this._cancelRequest();\n            return this;\n        },\n        mute: function() {\n            this._muted = true;\n            return this;\n        },\n        resume: function() {\n            if (this._muted) {\n                this._muted = false;\n                if (((!this._handle && this._polling))) {\n                    return this.request();\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            return this;\n        },\n        skip: function() {\n            this._skip = true;\n            return this;\n        },\n        reset: function() {\n            return this.JSBNG__stop().start();\n        },\n        request: function() {\n            this._cancelRequest();\n            this._polling = true;\n            if (!o()) {\n                return this._done();\n            }\n        ;\n        ;\n            if (this._muted) {\n                return this;\n            }\n        ;\n        ;\n            if (((++this._requests > this._config.maxRequests))) {\n                return this._done();\n            }\n        ;\n        ;\n            var p = new h(), q = false;\n            p.setInitialHandler(function() {\n                return !q;\n            });\n            this._cancelRequest = function() {\n                q = true;\n                this._cleanup();\n            }.bind(this);\n            p.setFinallyHandler(n.bind(this));\n            p.setInitialHandler = l;\n            p.setFinallyHandler = l;\n            this._config.setupRequest(p, this);\n            if (this._skip) {\n                this._skip = false;\n                n.bind(this).defer();\n            }\n             else p.send();\n        ;\n        ;\n            return this;\n        },\n        isPolling: function() {\n            return this._polling;\n        },\n        isMuted: function() {\n            return this._muted;\n        },\n        JSBNG__setInterval: function(p) {\n            if (p) {\n                this._config.interval = p;\n                this.start();\n            }\n        ;\n        ;\n        },\n        getInterval: function() {\n            return this._config.interval;\n        },\n        _cleanup: function() {\n            if (this._handle) {\n                JSBNG__clearTimeout(this._handle);\n            }\n        ;\n        ;\n            this._handle = null;\n            this._cancelRequest = l;\n            this._polling = false;\n        },\n        _done: function() {\n            this._cleanup();\n            this.inform(\"done\", {\n                sender: this\n            });\n            return this;\n        },\n        _config: null,\n        _requests: 0,\n        _muted: false,\n        _polling: false,\n        _skip: false,\n        _cancelRequest: l\n    });\n    function n() {\n        if (!this._polling) {\n            return;\n        }\n    ;\n    ;\n        if (((this._requests < this._config.maxRequests))) {\n            var p = this._config.interval;\n            p = ((((typeof p === \"function\")) ? p(this._requests) : p));\n            this._handle = this.request.bind(this).defer(((((p > m.MIN_INTERVAL)) ? p : m.MIN_INTERVAL)), this._config.clearOnQuicklingEvents);\n        }\n         else this._done();\n    ;\n    ;\n    };\n;\n    function o() {\n        return ((j.user == i.get(\"c_user\")));\n    };\n;\n    e.exports = m;\n});\n__d(\"SystemEvents\", [\"Arbiter\",\"Env\",\"ErrorUtils\",\"UserAgent\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"Env\"), i = b(\"ErrorUtils\"), j = b(\"UserAgent\"), k = b(\"copyProperties\"), l = new g(), m = [], n = 1000;\n    JSBNG__setInterval(function() {\n        for (var w = 0; ((w < m.length)); w++) {\n            m[w]();\n        ;\n        };\n    ;\n    }, n, false);\n    function o() {\n        return ((((/c_user=(\\d+)/.test(JSBNG__document.cookie) && RegExp.$1)) || 0));\n    };\n;\n    var p = h.user, q = JSBNG__navigator.onLine;\n    function r() {\n        if (!q) {\n            q = true;\n            l.inform(l.ONLINE, q);\n        }\n    ;\n    ;\n    };\n;\n    function s() {\n        if (q) {\n            q = false;\n            l.inform(l.ONLINE, q);\n        }\n    ;\n    ;\n    };\n;\n    if (j.ie()) {\n        if (((j.ie() >= 8))) {\n            window.JSBNG__attachEvent(\"JSBNG__onload\", function() {\n                JSBNG__document.body.JSBNG__ononline = r;\n                JSBNG__document.body.JSBNG__onoffline = s;\n            });\n        }\n         else m.push(function() {\n            ((JSBNG__navigator.onLine ? r : s))();\n        });\n    ;\n    ;\n    }\n     else if (window.JSBNG__addEventListener) {\n        if (!j.chrome()) {\n            window.JSBNG__addEventListener(\"online\", r, false);\n            window.JSBNG__addEventListener(\"offline\", s, false);\n        }\n    ;\n    }\n    \n;\n;\n    var t = p;\n    m.push(function() {\n        var w = o();\n        if (((t != w))) {\n            l.inform(l.USER, w);\n            t = w;\n        }\n    ;\n    ;\n    });\n    var u = JSBNG__Date.now();\n    function v() {\n        var w = JSBNG__Date.now(), x = ((w - u)), y = ((((x < 0)) || ((x > 10000))));\n        u = w;\n        if (y) {\n            l.inform(l.TIME_TRAVEL, x);\n        }\n    ;\n    ;\n        return y;\n    };\n;\n    m.push(v);\n    m.push(function() {\n        if (((window.JSBNG__onerror != i.JSBNG__onerror))) {\n            window.JSBNG__onerror = i.JSBNG__onerror;\n        }\n    ;\n    ;\n    });\n    k(l, {\n        USER: \"SystemEvents/USER\",\n        ONLINE: \"SystemEvents/ONLINE\",\n        TIME_TRAVEL: \"SystemEvents/TIME_TRAVEL\",\n        isPageOwner: function(w) {\n            return ((((w || o())) == p));\n        },\n        isOnline: function() {\n            return ((j.chrome() || q));\n        },\n        checkTimeTravel: v\n    });\n    e.exports = l;\n});\n__d(\"Typeahead\", [\"ArbiterMixin\",\"BehaviorsMixin\",\"DOM\",\"DataStore\",\"JSBNG__Event\",\"Parent\",\"Run\",\"copyProperties\",\"emptyFunction\",\"ge\",], function(a, b, c, d, e, f) {\n    var g = b(\"ArbiterMixin\"), h = b(\"BehaviorsMixin\"), i = b(\"DOM\"), j = b(\"DataStore\"), k = b(\"JSBNG__Event\"), l = b(\"Parent\"), m = b(\"Run\"), n = b(\"copyProperties\"), o = b(\"emptyFunction\"), p = b(\"ge\");\n    function q(r, s, t, u) {\n        this.args = {\n            data: r,\n            view: s,\n            core: t\n        };\n        j.set(u, \"Typeahead\", this);\n        this.element = u;\n    };\n;\n    q.getInstance = function(r) {\n        var s = l.byClass(r, \"uiTypeahead\");\n        return ((s ? j.get(s, \"Typeahead\") : null));\n    };\n    n(q.prototype, g, h, {\n        init: function(r) {\n            this.init = o;\n            this.getCore();\n            this.getView().setAccessibilityControlElement(this.getCore().getElement());\n            this.proxyEvents();\n            this.initBehaviors(((r || [])));\n            this.inform(\"init\", this);\n            this.data.bootstrap();\n            this.core.JSBNG__focus();\n        },\n        getData: function() {\n            if (!this.data) {\n                var r = this.args.data;\n                this.data = r;\n                this.data.init();\n            }\n        ;\n        ;\n            return this.data;\n        },\n        getView: function() {\n            if (!this.view) {\n                var r = this.args.view, s = ((r.node || p(r.node_id)));\n                if (!s) {\n                    s = i.create(\"div\", {\n                        className: \"uiTypeaheadView\"\n                    });\n                    i.appendContent(this.element, s);\n                }\n            ;\n            ;\n                if (((typeof r.ctor === \"string\"))) {\n                    this.view = new window[r.ctor](s, ((r.options || {\n                    })));\n                }\n                 else this.view = new r.ctor(s, ((r.options || {\n                })));\n            ;\n            ;\n                this.view.init();\n                this.view.setTypeahead(this.element);\n            }\n        ;\n        ;\n            return this.view;\n        },\n        getCore: function() {\n            if (!this.core) {\n                var r = this.args.core;\n                if (((typeof r.ctor === \"string\"))) {\n                    this.core = new window[r.ctor](((r.options || {\n                    })));\n                }\n                 else this.core = new r.ctor(((r.options || {\n                })));\n            ;\n            ;\n                this.core.init(this.getData(), this.getView(), this.getElement());\n            }\n        ;\n        ;\n            return this.core;\n        },\n        getElement: function() {\n            return this.element;\n        },\n        swapData: function(r) {\n            var s = this.core;\n            this.data = this.args.data = r;\n            r.init();\n            if (s) {\n                s.data = r;\n                s.initData();\n                s.reset();\n            }\n        ;\n        ;\n            r.bootstrap();\n            return r;\n        },\n        proxyEvents: function() {\n            [this.data,this.view,this.core,].forEach(function(r) {\n                r.subscribe(r.events, this.inform.bind(this));\n            }, this);\n        },\n        initBehaviors: function(r) {\n            r.forEach(function(s) {\n                if (((typeof s === \"string\"))) {\n                    if (((a.TypeaheadBehaviors && a.TypeaheadBehaviors[s]))) {\n                        a.TypeaheadBehaviors[s](this);\n                    }\n                     else m.onLoad(function() {\n                        if (a.TypeaheadBehaviors) {\n                            ((a.TypeaheadBehaviors[s] || o))(this);\n                        }\n                    ;\n                    ;\n                    }.bind(this));\n                ;\n                ;\n                }\n                 else this.enableBehavior(s);\n            ;\n            ;\n            }, this);\n        }\n    });\n    q.initNow = function(r, s, t) {\n        if (t) {\n            t.init(r);\n        }\n    ;\n    ;\n        r.init(s);\n    };\n    q.init = function(r, s, t, u) {\n        if (!i.isNodeOfType(r, [\"input\",\"textarea\",])) {\n            r = ((i.scry(r, \"input\")[0] || i.scry(r, \"textarea\")[0]));\n        }\n    ;\n    ;\n        var v = false;\n        try {\n            v = ((JSBNG__document.activeElement === r));\n        } catch (w) {\n        \n        };\n    ;\n        if (v) {\n            q.initNow(s, t, u);\n        }\n         else var x = k.listen(r, \"JSBNG__focus\", function() {\n            q.initNow(s, t, u);\n            x.remove();\n        })\n    ;\n    };\n    e.exports = q;\n});\n__d(\"TypeaheadCore\", [\"JSBNG__Event\",\"Arbiter\",\"ArbiterMixin\",\"CSS\",\"DOM\",\"Focus\",\"Input\",\"InputSelection\",\"Keys\",\"StickyPlaceholderInput\",\"UserAgent\",\"bind\",\"copyProperties\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"Arbiter\"), i = b(\"ArbiterMixin\"), j = b(\"CSS\"), k = b(\"DOM\"), l = b(\"Focus\"), m = b(\"Input\"), n = b(\"InputSelection\"), o = b(\"Keys\"), p = b(\"StickyPlaceholderInput\"), q = b(\"UserAgent\"), r = b(\"bind\"), s = b(\"copyProperties\"), t = b(\"emptyFunction\");\n    function u(v) {\n        s(this, v);\n    };\n;\n    s(u.prototype, i, {\n        events: [\"JSBNG__blur\",\"JSBNG__focus\",\"click\",\"unselect\",\"loading\",],\n        keepFocused: true,\n        resetOnSelect: false,\n        resetOnKeyup: true,\n        setValueOnSelect: false,\n        queryTimeout: 250,\n        preventFocusChangeOnTab: false,\n        init: function(v, w, x) {\n            this.init = t;\n            this.data = v;\n            this.view = w;\n            this.root = x;\n            this.initInput();\n            this.inputWrap = k.JSBNG__find(x, \"div.wrap\");\n            this.hiddenInput = k.JSBNG__find(x, \"input.hiddenInput\");\n            this.value = \"\";\n            this.nextQuery = null;\n            this.selectedText = null;\n            if (((this.setValueOnSelect && j.hasClass(this.inputWrap, \"selected\")))) {\n                this.selectedText = this.getValue();\n            }\n        ;\n        ;\n            this.initView();\n            this.initData();\n            this.initEvents();\n            this.initToggle();\n            this._exclusions = [];\n        },\n        initInput: function() {\n            this.element = k.JSBNG__find(this.root, \".textInput\");\n            var v = k.scry(this.element, \"input\")[0];\n            if (v) {\n                this.element = v;\n            }\n        ;\n        ;\n        },\n        initView: function() {\n            this.view.subscribe(\"highlight\", l.set.curry(this.element));\n            this.view.subscribe(\"select\", function(v, w) {\n                this.select(w.selected);\n            }.bind(this));\n            this.view.subscribe(\"afterSelect\", function() {\n                this.afterSelect();\n            }.bind(this));\n        },\n        initData: function() {\n            this.data.subscribe(\"respond\", function(v, w) {\n                if (((w.forceDisplay || ((((w.value == this.getValue())) && !this.element.disabled))))) {\n                    this.view.render(w.value, w.results, w.isAsync);\n                }\n            ;\n            ;\n            }.bind(this));\n            this.data.subscribe(\"activity\", function(v, w) {\n                this.fetching = w.activity;\n                if (!this.fetching) {\n                    ((this.nextQuery && this.performQuery()));\n                }\n            ;\n            ;\n                if (((this.loading != this.fetching))) {\n                    this.loading = this.fetching;\n                    this.inform(\"loading\", {\n                        loading: this.loading\n                    });\n                }\n            ;\n            ;\n            }.bind(this));\n        },\n        initEvents: function() {\n            g.listen(this.view.getElement(), {\n                mouseup: this.viewMouseup.bind(this),\n                mousedown: this.viewMousedown.bind(this)\n            });\n            var v = {\n                JSBNG__blur: r(this, \"JSBNG__blur\"),\n                JSBNG__focus: r(this, \"JSBNG__focus\"),\n                click: r(this, \"click\"),\n                keyup: r(this, \"keyup\"),\n                keydown: r(this, \"keydown\")\n            };\n            if (q.firefox()) {\n                v.text = v.keyup;\n            }\n        ;\n        ;\n            if (((q.firefox() < 4))) {\n                v.keypress = v.keydown;\n                delete v.keydown;\n            }\n        ;\n        ;\n            g.listen(this.element, v);\n            g.listen(this.element, \"keypress\", r(this, \"keypress\"));\n        },\n        initToggle: function() {\n            this.subscribe(\"JSBNG__blur\", this.view.hide.bind(this.view));\n            this.subscribe(\"JSBNG__focus\", this.view.show.bind(this.view));\n        },\n        viewMousedown: function() {\n            this.selecting = true;\n        },\n        viewMouseup: function() {\n            this.selecting = false;\n        },\n        JSBNG__blur: function() {\n            if (this.selecting) {\n                this.selecting = false;\n                return;\n            }\n        ;\n        ;\n            this.inform(\"JSBNG__blur\");\n        },\n        click: function() {\n            var v = n.get(this.element);\n            if (((v.start == v.end))) {\n                this.element.select();\n            }\n        ;\n        ;\n            this.inform(\"click\");\n        },\n        JSBNG__focus: function() {\n            this.checkValue();\n            this.inform(\"JSBNG__focus\");\n        },\n        keyup: function() {\n            if (((this.resetOnKeyup && !this.getValue()))) {\n                this.view.reset();\n            }\n        ;\n        ;\n            this.checkValue();\n        },\n        keydown: function(JSBNG__event) {\n            if (((!this.view.isVisible() || this.view.isEmpty()))) {\n                this.checkValue.bind(this).defer();\n                return;\n            }\n        ;\n        ;\n            switch (g.getKeyCode(JSBNG__event)) {\n              case o.TAB:\n                this.handleTab(JSBNG__event);\n                return;\n              case o.UP:\n                this.view.prev();\n                break;\n              case o.DOWN:\n                this.view.next();\n                break;\n              case o.ESC:\n                this.view.reset();\n                break;\n              default:\n                this.checkValue.bind(this).defer();\n                return;\n            };\n        ;\n            JSBNG__event.kill();\n        },\n        keypress: function(JSBNG__event) {\n            if (((this.view.JSBNG__getSelection() && ((g.getKeyCode(JSBNG__event) == o.RETURN))))) {\n                this.view.select();\n                JSBNG__event.kill();\n            }\n        ;\n        ;\n        },\n        handleTab: function(JSBNG__event) {\n            if (this.preventFocusChangeOnTab) {\n                if (this.view.JSBNG__getSelection()) {\n                    JSBNG__event.kill();\n                }\n                 else JSBNG__event.prevent();\n            ;\n            }\n        ;\n        ;\n            this.view.select();\n        },\n        select: function(v) {\n            if (((v && this.setValueOnSelect))) {\n                this.setValue(v.text);\n                this.setHiddenValue(v.uid);\n                this.selectedText = v.text;\n                j.addClass(this.inputWrap, \"selected\");\n            }\n        ;\n        ;\n        },\n        afterSelect: function() {\n            ((this.keepFocused ? l.set(this.element) : this.element.JSBNG__blur()));\n            ((this.resetOnSelect ? this.reset() : this.view.reset()));\n        },\n        unselect: function() {\n            if (this.setValueOnSelect) {\n                this.selectedText = null;\n                j.removeClass(this.inputWrap, \"selected\");\n            }\n        ;\n        ;\n            this.setHiddenValue();\n            this.inform(\"unselect\", this);\n        },\n        setEnabled: function(v) {\n            var w = ((v === false));\n            this.element.disabled = w;\n            j.conditionClass(this.root, \"uiTypeaheadDisabled\", w);\n        },\n        reset: function() {\n            this.unselect();\n            this.setValue();\n            ((!this.keepFocused && m.reset(this.element)));\n            this.view.reset();\n            this.inform(\"reset\");\n        },\n        getElement: function() {\n            return this.element;\n        },\n        setExclusions: function(v) {\n            this._exclusions = v;\n        },\n        getExclusions: function() {\n            return this._exclusions;\n        },\n        setValue: function(v) {\n            this.value = this.nextQuery = ((v || \"\"));\n            m.setValue(this.element, this.value);\n            p.update(this.element);\n        },\n        setHiddenValue: function(v) {\n            this.hiddenInput.value = ((((v || ((v === 0)))) ? v : \"\"));\n            h.inform(\"Form/change\", {\n                node: this.hiddenInput\n            });\n        },\n        getValue: function() {\n            return m.getValue(this.element);\n        },\n        getHiddenValue: function() {\n            return ((this.hiddenInput.value || \"\"));\n        },\n        checkValue: function() {\n            var v = this.getValue();\n            if (((v == this.value))) {\n                return;\n            }\n        ;\n        ;\n            if (((this.selectedText && ((this.selectedText != v))))) {\n                this.unselect();\n            }\n        ;\n        ;\n            var w = JSBNG__Date.now(), x = ((w - this.time));\n            this.time = w;\n            this.value = this.nextQuery = v;\n            this.performQuery(x);\n        },\n        performQuery: function(v) {\n            if (this.selectedText) {\n                return;\n            }\n        ;\n        ;\n            v = ((v || 0));\n            if (((this.fetching && ((v < this.queryTimeout))))) {\n                this.data.query(this.nextQuery, true, this._exclusions, v);\n            }\n             else {\n                this.data.query(this.nextQuery, false, this._exclusions, v);\n                this.nextQuery = null;\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = u;\n});\n__d(\"setIntervalAcrossTransitions\", [], function(a, b, c, d, e, f) {\n    function g(h, i) {\n        return JSBNG__setInterval(h, i, false);\n    };\n;\n    e.exports = g;\n});\n__d(\"PresenceCookieManager\", [\"Cookie\",\"Dcode\",\"ErrorUtils\",\"Env\",\"JSLogger\",\"PresenceUtil\",\"URI\",\"PresenceInitialData\",], function(a, b, c, d, e, f) {\n    var g = b(\"Cookie\"), h = b(\"Dcode\"), i = b(\"ErrorUtils\"), j = b(\"Env\"), k = b(\"JSLogger\"), l = b(\"PresenceUtil\"), m = b(\"URI\"), n = b(\"PresenceInitialData\"), o = n.cookieVersion, p = n.dictEncode, q = \"presence\", r = {\n    }, s = null, t = null, u = k.create(\"presence_cookie\");\n    function v() {\n        try {\n            var z = g.get(q);\n            if (((s !== z))) {\n                s = z;\n                t = null;\n                if (((z && ((z.charAt(0) == \"E\"))))) {\n                    z = h.decode(z.substring(1));\n                }\n            ;\n            ;\n                if (z) {\n                    t = JSON.parse(z);\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            if (((t && ((!t.user || ((t.user === j.user))))))) {\n                return t;\n            }\n        ;\n        ;\n        } catch (y) {\n            u.warn(\"getcookie_error\");\n        };\n    ;\n        return null;\n    };\n;\n    function w() {\n        return parseInt(((JSBNG__Date.now() / 1000)), 10);\n    };\n;\n    var x = {\n        register: function(y, z) {\n            r[y] = z;\n        },\n        store: function() {\n            var y = v();\n            if (((((y && y.v)) && ((o < y.v))))) {\n                return;\n            }\n        ;\n        ;\n            var z = {\n                v: o,\n                time: w(),\n                user: j.user\n            };\n            {\n                var fin206keys = ((window.top.JSBNG_Replay.forInKeys)((r))), fin206i = (0);\n                var aa;\n                for (; (fin206i < fin206keys.length); (fin206i++)) {\n                    ((aa) = (fin206keys[fin206i]));\n                    {\n                        z[aa] = i.applyWithGuard(r[aa], r, [((y && y[aa])),], function(ea) {\n                            ea.presence_subcookie = aa;\n                        });\n                    ;\n                    };\n                };\n            };\n        ;\n            var ba = JSON.stringify(z);\n            if (p) {\n                ba = ((\"E\" + h.encode(ba)));\n            }\n        ;\n        ;\n            if (l.hasUserCookie()) {\n                var ca = ba.length;\n                if (((ca > 1024))) {\n                    u.warn(\"big_cookie\", ca);\n                }\n            ;\n            ;\n                var da = ((m.getRequestURI(false).isSecure() && !!g.get(\"csm\")));\n                g.set(q, ba, null, null, da);\n            }\n        ;\n        ;\n        },\n        clear: function() {\n            g.clear(q);\n        },\n        getSubCookie: function(y) {\n            var z = v();\n            if (!z) {\n                return null;\n            }\n        ;\n        ;\n            return z[y];\n        }\n    };\n    e.exports = x;\n});\n__d(\"PresenceState\", [\"Arbiter\",\"ErrorUtils\",\"JSLogger\",\"PresenceCookieManager\",\"copyProperties\",\"debounceAcrossTransitions\",\"setIntervalAcrossTransitions\",\"PresenceInitialData\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ErrorUtils\"), i = b(\"JSLogger\"), j = b(\"PresenceCookieManager\"), k = b(\"copyProperties\"), l = b(\"debounceAcrossTransitions\"), m = b(\"setIntervalAcrossTransitions\"), n = b(\"PresenceInitialData\"), o = ((n.cookiePollInterval || 2000)), p = [], q = [], r = null, s = null, t = 0, u = null, v = 0, w = [\"sb2\",\"t2\",\"lm2\",\"uct2\",\"tr\",\"tw\",\"at\",\"wml\",], x = i.create(\"presence_state\");\n    function y() {\n        return j.getSubCookie(\"state\");\n    };\n;\n    function z() {\n        t = JSBNG__Date.now();\n        j.store();\n        da(s);\n    };\n;\n    var aa = l(z, 0);\n    function ba(ia) {\n        if (((((((((typeof ia == \"undefined\")) || isNaN(ia))) || ((ia == Number.POSITIVE_INFINITY)))) || ((ia == Number.NEGATIVE_INFINITY))))) {\n            ia = 0;\n        }\n    ;\n    ;\n        return ia;\n    };\n;\n    function ca(ia) {\n        var ja = {\n        };\n        if (ia) {\n            w.forEach(function(ma) {\n                ja[ma] = ia[ma];\n            });\n            if (((t < ia.ut))) {\n                x.error(\"new_cookie\", {\n                    cookie_time: ia.ut,\n                    local_time: t\n                });\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n        ja.ut = t;\n        for (var ka = 0, la = p.length; ((ka < la)); ka++) {\n            h.applyWithGuard(p[ka], null, [ja,]);\n        ;\n        };\n    ;\n        s = ja;\n        return s;\n    };\n;\n    function da(ia) {\n        v++;\n        t = ba(ia.ut);\n        if (!r) {\n            r = m(ga, o);\n        }\n    ;\n    ;\n        s = ia;\n        if (((u === null))) {\n            u = ia;\n        }\n    ;\n    ;\n        for (var ja = 0, ka = q.length; ((ja < ka)); ja++) {\n            h.applyWithGuard(q[ja], null, [ia,]);\n        ;\n        };\n    ;\n        v--;\n    };\n;\n    function ea(ia) {\n        if (((ia && ia.ut))) {\n            if (((t < ia.ut))) {\n                return true;\n            }\n             else if (((ia.ut < t))) {\n                x.error(\"old_cookie\", {\n                    cookie_time: ia.ut,\n                    local_time: t\n                });\n            }\n            \n        ;\n        }\n    ;\n    ;\n        return false;\n    };\n;\n    function fa() {\n        var ia = y();\n        if (ea(ia)) {\n            s = ia;\n        }\n    ;\n    ;\n        return s;\n    };\n;\n    function ga() {\n        var ia = y();\n        if (ea(ia)) {\n            da(ia);\n        }\n    ;\n    ;\n    };\n;\n    j.register(\"state\", ca);\n    g.subscribe(i.DUMP_EVENT, function(ia, ja) {\n        ja.presence_state = {\n            initial: k({\n            }, u),\n            state: k({\n            }, s),\n            update_time: t,\n            sync_paused: v,\n            poll_time: o\n        };\n    });\n    (function() {\n        var ia = fa();\n        if (ia) {\n            da(ia);\n        }\n         else {\n            x.debug(\"no_cookie_initial\");\n            da(ca());\n            return;\n        }\n    ;\n    ;\n    })();\n    var ha = {\n        doSync: function(ia) {\n            if (v) {\n                return;\n            }\n        ;\n        ;\n            if (ia) {\n                z();\n            }\n             else aa();\n        ;\n        ;\n        },\n        registerStateStorer: function(ia) {\n            p.push(ia);\n        },\n        registerStateLoader: function(ia) {\n            q.push(ia);\n        },\n        get: function() {\n            return fa();\n        },\n        getInitial: function() {\n            return u;\n        },\n        verifyNumber: ba\n    };\n    e.exports = ha;\n});\n__d(\"TypeaheadBestName\", [\"TypeaheadUtil\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"TypeaheadUtil\"), h = b(\"copyProperties\");\n    function i(j) {\n        this._typeahead = j;\n    };\n;\n    i.prototype.enable = function() {\n        var j = this._typeahead.getView();\n        this._subscription = j.subscribe(\"beforeRender\", function(k, l) {\n            var m = l.value;\n            for (var n = 0; ((n < l.results.length)); ++n) {\n                var o = l.results[n];\n                if (((o.alternate_names == null))) {\n                    continue;\n                }\n            ;\n            ;\n                if (g.isQueryMatch(m, o.default_name)) {\n                    o.text = o.default_name;\n                    return;\n                }\n            ;\n            ;\n                for (var p = 0; ((p < o.alternate_names.length)); p++) {\n                    if (g.isQueryMatch(m, o.alternate_names[p])) {\n                        o.text = o.alternate_names[p];\n                        return;\n                    }\n                ;\n                ;\n                };\n            ;\n                o.text = o.default_name;\n            };\n        ;\n        });\n    };\n    i.prototype.disable = function() {\n        this._typeahead.getView().unsubscribe(this._subscription);\n        this._subscription = null;\n    };\n    h(i.prototype, {\n        _subscription: null\n    });\n    e.exports = i;\n});\n__d(\"legacy:BestNameTypeaheadBehavior\", [\"TypeaheadBestName\",], function(a, b, c, d) {\n    var e = b(\"TypeaheadBestName\");\n    if (!a.TypeaheadBehaviors) {\n        a.TypeaheadBehaviors = {\n        };\n    }\n;\n;\n    a.TypeaheadBehaviors.buildBestAvailableNames = function(f) {\n        f.enableBehavior(e);\n    };\n}, 3);\n__d(\"TypingDetector\", [\"JSBNG__Event\",\"function-extensions\",\"ArbiterMixin\",\"Input\",\"Run\",\"copyProperties\",\"createObjectFrom\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\");\n    b(\"function-extensions\");\n    var h = b(\"ArbiterMixin\"), i = b(\"Input\"), j = b(\"Run\"), k = b(\"copyProperties\"), l = b(\"createObjectFrom\"), m = b(\"emptyFunction\");\n    function n(o) {\n        this._input = o;\n        this._ignoreKeys = {\n        };\n    };\n;\n    n.INACTIVE = 0;\n    n.TYPING = 1;\n    n.QUITTING = 2;\n    k(n.prototype, h, {\n        _timeout: 7000,\n        _currentState: n.INACTIVE,\n        init: function() {\n            this.init = m;\n            this.reset();\n            g.listen(this._input, \"keyup\", this._update.bind(this));\n            j.onUnload(this._onunload.bind(this));\n        },\n        reset: function() {\n            JSBNG__clearTimeout(this._checkTimer);\n            this._checkTimer = null;\n            this._lastKeystrokeAt = null;\n            this._currentState = n.INACTIVE;\n        },\n        setIgnoreKeys: function(o) {\n            this._ignoreKeys = l(o);\n        },\n        _onunload: function() {\n            if (((this._currentState == n.TYPING))) {\n                this._transition(n.QUITTING);\n            }\n        ;\n        ;\n        },\n        _update: function(JSBNG__event) {\n            var o = g.getKeyCode(JSBNG__event), p = this._currentState;\n            if (!this._ignoreKeys[o]) {\n                if (((i.getValue(this._input).trim().length === 0))) {\n                    if (((p == n.TYPING))) {\n                        this._transition(n.INACTIVE);\n                    }\n                ;\n                ;\n                }\n                 else if (((p == n.TYPING))) {\n                    this._recordKeystroke();\n                }\n                 else if (((p == n.INACTIVE))) {\n                    this._transition(n.TYPING);\n                    this._recordKeystroke();\n                }\n                \n                \n            ;\n            }\n        ;\n        ;\n        },\n        _transition: function(o) {\n            this.reset();\n            this._currentState = o;\n            this.inform(\"change\", o);\n        },\n        _recordKeystroke: function() {\n            this._lastKeystrokeTime = JSBNG__Date.now();\n            if (!this._checkTimer) {\n                this._checkTimer = this._checkTyping.bind(this).defer(this._timeout);\n            }\n        ;\n        ;\n        },\n        _checkTyping: function() {\n            var o = ((this._lastKeystrokeTime + this._timeout)), p = JSBNG__Date.now();\n            if (((p > o))) {\n                this._transition(n.INACTIVE);\n            }\n             else {\n                JSBNG__clearTimeout(this._checkTimer);\n                this._checkTimer = this._checkTyping.bind(this).defer(((((o - p)) + 10)));\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = n;\n});\n__d(\"ClearableTypeahead\", [\"JSBNG__Event\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = {\n        resetOnCloseButtonClick: function(i, j) {\n            g.listen(j, \"click\", function() {\n                var k = i.getCore();\n                k.getElement().JSBNG__focus();\n                k.reset();\n            });\n        }\n    };\n    e.exports = h;\n});\n__d(\"TypeaheadShowLoadingIndicator\", [\"CSS\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSS\"), h = b(\"copyProperties\");\n    function i(j) {\n        this._typeahead = j;\n    };\n;\n    h(i.prototype, {\n        _subscription: null,\n        enable: function() {\n            this._subscription = this._typeahead.subscribe(\"loading\", function(j, k) {\n                g.conditionClass(this._typeahead.getElement(), \"typeaheadLoading\", k.loading);\n                g.conditionClass(this._typeahead.getView().getElement(), \"typeaheadViewLoading\", k.loading);\n            }.bind(this));\n        },\n        disable: function() {\n            this._typeahead.unsubscribe(this._subscription);\n            this._subscription = null;\n        }\n    });\n    e.exports = i;\n});\n__d(\"legacy:ShowLoadingIndicatorTypeaheadBehavior\", [\"TypeaheadShowLoadingIndicator\",], function(a, b, c, d) {\n    var e = b(\"TypeaheadShowLoadingIndicator\");\n    if (!a.TypeaheadBehaviors) {\n        a.TypeaheadBehaviors = {\n        };\n    }\n;\n;\n    a.TypeaheadBehaviors.showLoadingIndicator = function(f) {\n        f.enableBehavior(e);\n    };\n}, 3);\n__d(\"CompactTypeaheadRenderer\", [\"Badge\",\"DOM\",\"TypeaheadFacepile\",], function(a, b, c, d, e, f) {\n    var g = b(\"Badge\"), h = b(\"DOM\"), i = b(\"TypeaheadFacepile\");\n    function j(k, l) {\n        var m = [];\n        if (k.xhp) {\n            return h.create(\"li\", {\n                className: \"raw\"\n            }, k.xhp);\n        }\n    ;\n    ;\n        var n = ((k.photos || k.photo));\n        if (n) {\n            if (((n instanceof Array))) {\n                n = i.render(n);\n            }\n             else n = h.create(\"img\", {\n                alt: \"\",\n                src: n\n            });\n        ;\n        ;\n            m.push(n);\n        }\n    ;\n    ;\n        if (k.text) {\n            var o = [k.text,];\n            if (k.verified) {\n                o.push(g(\"xsmall\"));\n            }\n        ;\n        ;\n            m.push(h.create(\"span\", {\n                className: \"text\"\n            }, o));\n        }\n    ;\n    ;\n        var p = k.subtext, q = k.category;\n        if (((p || q))) {\n            var r = [];\n            ((p && r.push(p)));\n            ((((p && q)) && r.push(\" \\u00b7 \")));\n            ((q && r.push(q)));\n            m.push(h.create(\"span\", {\n                className: \"subtext\"\n            }, r));\n        }\n    ;\n    ;\n        var s = h.create(\"li\", {\n            className: ((k.type || \"\"))\n        }, m);\n        if (k.text) {\n            s.setAttribute(\"aria-label\", k.text);\n        }\n    ;\n    ;\n        return s;\n    };\n;\n    j.className = \"compact\";\n    e.exports = j;\n});\n__d(\"URLMatcher\", [], function(a, b, c, d, e, f) {\n    var g = \"!\\\"#%&'()*,-./:;\\u003C\\u003E?@[\\\\]^_`{|}\", h = \"\\u2000-\\u206f\\u00ab\\u00bb\\uff08\\uff09\", i = \"(?:25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])\", j = \"(?:(?:ht|f)tps?)://\", k = ((((((((\"(?:(?:\" + i)) + \"[.]){3}\")) + i)) + \")\")), l = \"\\\\[(?:(?:[A-Za-z0-9]{1,4}::?){1,7}[A-Za-z0-9]{1,4})\\\\]\", m = \"(?:\\\\b)www\\\\d{0,3}[.]\", n = ((((((\"[^\\\\s\" + g)) + h)) + \"]\")), o = ((((((((((((\"(?:(?:(?:[.:\\\\-_%@]|\" + n)) + \")*\")) + n)) + \")|\")) + l)) + \")\")), p = \"(?:[.][a-z]{2,4})\", q = \"(?::\\\\d+){0,1}\", r = \"(?=[/?#])\", s = ((((((((((((((((((((((((((((((((((((((((((((((((((((\"(?:\" + \"(?:\")) + j)) + o)) + q)) + \")|\")) + \"(?:\")) + k)) + q)) + \")|\")) + \"(?:\")) + l)) + q)) + \")|\")) + \"(?:\")) + m)) + o)) + p)) + q)) + \")|\")) + \"(?:\")) + o)) + p)) + q)) + r)) + \")\")) + \")\")), t = \"[/#?]\", u = \"\\\\([^\\\\s()\\u003C\\u003E]+\\\\)\", v = \"[^\\\\s()\\u003C\\u003E?#]+\", w = new RegExp(s, \"im\"), x = ((((((((((((((((((((((\"(?:\" + \"(?:\")) + t)) + \")\")) + \"(?:\")) + \"(?:\")) + u)) + \"|\")) + v)) + \")*\")) + \")*\")) + \")*\")), y = new RegExp(((((((((((((((\"(\" + \"(?:\")) + s)) + \")\")) + \"(?:\")) + x)) + \")\")) + \")\")), \"im\"), z = new RegExp(((((((((((((((((((((((((\"(\" + \"(?:\")) + j)) + o)) + q)) + \")|\")) + \"(?:\")) + m)) + o)) + p)) + q)) + \")\")) + \")\"))), aa = /[\\s'\";]/, ba = new RegExp(t, \"im\"), ca = new RegExp(\"[\\\\s!\\\"#%&'()*,-./:;\\u003C\\u003E?@[\\\\]^_`{|}\\u00ab\\u00bb\\u2000-\\u206f\\uff08\\uff09]\", \"im\"), da = new RegExp(\"[\\\\s()\\u003C\\u003E?#]\", \"im\"), ea = new RegExp(\"\\\\s()\\u003C\\u003E\"), fa = function(ma) {\n        if (((ma && ((ma.indexOf(\"@\") != -1))))) {\n            return (((z.exec(ma)) ? ma : null));\n        }\n         else return ma\n    ;\n    }, ga = function(ma) {\n        return ha(ma, y);\n    }, ha = function(ma, na) {\n        var oa = ((((na.exec(ma) || []))[1] || null));\n        return fa(oa);\n    }, ia = function(ma) {\n        return w.exec(ma);\n    }, ja = function(ma) {\n        return !aa.test(ma.charAt(((ma.length - 1))));\n    }, ka = function(ma) {\n        var na = w.exec(ma);\n        if (!na) {\n            return null;\n        }\n    ;\n    ;\n        var oa = ma.substr(((na.index + na[0].length)));\n        if (((((oa.length === 0)) || !(ba.test(oa[0]))))) {\n            return fa(na[0]);\n        }\n    ;\n    ;\n        var pa = 0, qa = 0, ra = 1, sa = 0, ta = qa;\n        for (var ua = 1; ((ua < oa.length)); ua++) {\n            var va = oa[ua];\n            if (((ta === qa))) {\n                if (((va === \"(\"))) {\n                    sa = ((sa + 1));\n                    ta = ra;\n                }\n                 else if (((ba.test(va) || !(ca.test(va))))) {\n                    pa = ua;\n                }\n                 else if (da.test(va)) {\n                    break;\n                }\n                \n                \n            ;\n            ;\n            }\n             else if (((va === \"(\"))) {\n                sa = ((sa + 1));\n            }\n             else if (((va === \")\"))) {\n                sa = ((sa - 1));\n                if (((sa === 0))) {\n                    ta = qa;\n                    pa = ua;\n                }\n            ;\n            ;\n            }\n             else if (ea.test(va)) {\n                break;\n            }\n            \n            \n            \n        ;\n        ;\n        };\n    ;\n        return fa(((na[0] + oa.substring(0, ((pa + 1))))));\n    }, la = {\n    };\n    la.permissiveMatch = ga;\n    la.matchToPattern = ha;\n    la.matchHost = ia;\n    la.trigger = ja;\n    la.match = ka;\n    e.exports = la;\n});");
// 2863
geval("if (JSBNG__self.CavalryLogger) {\n    CavalryLogger.start_js([\"5dFET\",]);\n}\n;\n;\n__d(\"TickerReadStateTracking\", [\"Style\",\"clickRefAction\",], function(a, b, c, d, e, f) {\n    var g = b(\"Style\"), h = b(\"clickRefAction\"), i = 73, j = \"ticker_hover\", k = [];\n    function l(n) {\n        var o = JSON.parse(n.getAttribute(\"data-ft\"));\n        if (!o) {\n            return null;\n        }\n    ;\n    ;\n        if (o.mf_story_key) {\n            return o.mf_story_key;\n        }\n    ;\n    ;\n        if (o.fbid) {\n            return o.fbid;\n        }\n    ;\n    ;\n        return null;\n    };\n;\n    function m(n) {\n        var o = l(n);\n        if (((!o || ((o in k))))) {\n            return;\n        }\n    ;\n    ;\n        k[o] = true;\n        var p = {\n            evt: i\n        };\n        h(j, n, null, \"FORCE\", {\n            ft: p\n        });\n    };\n;\n    e.exports.log = m;\n});\n__d(\"TickerRightHideController\", [\"CSS\",\"DOM\",\"ge\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSS\"), h = b(\"DOM\"), i = b(\"ge\");\n    function j() {\n    \n    };\n;\n    j._markAsClosedHelper = function(k) {\n        var l = i(\"pagelet_reminders\");\n        if (l) {\n            var m = h.scry(l, \"div.tickerToggleWrapper\")[0];\n            if (m) {\n                g.conditionClass(m, \"displayedTickerToggleWrapper\", k);\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n        var n = i(\"pagelet_moments\");\n        if (n) {\n            var o = h.scry(n, \"div.tickerToggleWrapper\")[0];\n            if (o) {\n                g.conditionClass(o, \"displayedTickerToggleWrapper\", k);\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n        var p = i(\"pagelet_rhc_ticker\");\n        if (p) {\n            var q = h.scry(p, \"div.tickerToggleWrapper\")[0];\n            if (q) {\n                g.conditionClass(q, \"displayedTickerToggleWrapper\", !k);\n            }\n        ;\n        ;\n            g.conditionClass(p, \"hidden_rhc_ticker\", k);\n        }\n    ;\n    ;\n    };\n    j.markAsClosed = function() {\n        j._markAsClosedHelper(true);\n    };\n    j.markAsUnclosed = function() {\n        j._markAsClosedHelper(false);\n    };\n    e.exports = j;\n});\n__d(\"legacy:TickerRightHideController\", [\"TickerRightHideController\",], function(a, b, c, d) {\n    a.TickerRightHideController = b(\"TickerRightHideController\");\n}, 3);\n__d(\"TickerController\", [\"JSBNG__Event\",\"Animation\",\"Arbiter\",\"AsyncRequest\",\"AsyncSignal\",\"Bootloader\",\"ChannelConstants\",\"LegacyContextualDialog\",\"CSS\",\"DOM\",\"HTML\",\"JSLogger\",\"Keys\",\"LayerFadeOnHide\",\"LiveTimer\",\"NavigationMessage\",\"Parent\",\"Run\",\"ScrollableArea\",\"SelectorDeprecated\",\"Style\",\"TickerReadStateTracking\",\"Toggler\",\"UIPagelet\",\"URI\",\"UserActivity\",\"UserAgent\",\"Vector\",\"$\",\"clickRefAction\",\"collectDataAttributes\",\"copyProperties\",\"cx\",\"emptyFunction\",\"ge\",\"goURI\",\"throttle\",\"userAction\",\"TickerRHCPageletByGK\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"Animation\"), i = b(\"Arbiter\"), j = b(\"AsyncRequest\"), k = b(\"AsyncSignal\"), l = b(\"Bootloader\"), m = b(\"ChannelConstants\"), n = b(\"LegacyContextualDialog\"), o = b(\"CSS\"), p = b(\"DOM\"), q = b(\"HTML\"), r = b(\"JSLogger\"), s = b(\"Keys\"), t = b(\"LayerFadeOnHide\"), u = b(\"LiveTimer\"), v = b(\"NavigationMessage\"), w = b(\"Parent\"), x = b(\"Run\"), y = b(\"ScrollableArea\"), z = b(\"SelectorDeprecated\"), aa = b(\"Style\"), ba = b(\"TickerReadStateTracking\"), ca = b(\"Toggler\"), da = b(\"UIPagelet\"), ea = b(\"URI\"), fa = b(\"UserActivity\"), ga = b(\"UserAgent\"), ha = b(\"Vector\"), ia = b(\"$\"), ja = b(\"clickRefAction\"), ka = b(\"collectDataAttributes\"), la = b(\"copyProperties\"), ma = b(\"cx\"), na = b(\"emptyFunction\"), oa = b(\"ge\"), pa = b(\"goURI\"), qa = b(\"throttle\"), ra = b(\"userAction\"), sa = 1, ta = 2, ua = 3, va = 4, wa = r.create(\"ticker_controller\");\n    function xa() {\n    \n    };\n;\n    la(xa, {\n        _instances: {\n        },\n        _activeInstance: null,\n        _placeholders: {\n        },\n        _logPositionChange: false,\n        getInstance: function(ya) {\n            var za = w.byClass(ia(ya), \"fbFeedTicker\");\n            return ((za ? xa._instances[za.id] : null));\n        },\n        isLoaded: function(ya) {\n            var za = xa._placeholders[ya.id];\n            return ((!za || ((za.JSBNG__status == ua))));\n        },\n        show: function(ya, za) {\n            za = ((za || na));\n            {\n                var fin207keys = ((window.top.JSBNG_Replay.forInKeys)((xa._instances))), fin207i = (0);\n                var ab;\n                for (; (fin207i < fin207keys.length); (fin207i++)) {\n                    ((ab) = (fin207keys[fin207i]));\n                    {\n                        var bb = oa(ab);\n                        if (((!bb || ((bb.parentNode.id == ya.id))))) {\n                            continue;\n                        }\n                    ;\n                    ;\n                        xa.hide(bb.parentNode);\n                    };\n                };\n            };\n        ;\n            xa._doPositionChange(ya);\n            o.show(ya);\n            var cb = xa._placeholders[ya.id];\n            if (((cb && ((cb.JSBNG__status == sa))))) {\n                xa._fetchTickerForPlaceholder(ya, za);\n            }\n             else {\n                var db = p.scry(ya, \".fbFeedTicker\")[0], eb = ((db && xa.getInstance(db)));\n                xa._activeInstance = eb;\n                ((eb && eb._poll()));\n                xa._placeholders[ya.id] = {\n                    JSBNG__status: va,\n                    callback: za\n                };\n                za();\n            }\n        ;\n        ;\n        },\n        _doPositionChange: function(ya) {\n            if (((!xa._logPositionChange || o.shown(ya)))) {\n                return;\n            }\n        ;\n        ;\n            new k(\"/common/ods_endpoint.php\", {\n                k: ((\"ticker.render.switch.\" + ya.id))\n            }).send();\n        },\n        hide: function(ya) {\n            var za = p.scry(ya, \".fbFeedTicker\")[0], ab = ((za && xa.getInstance(za)));\n            ((ab && ab.hideActiveStory()));\n            o.hide(ya);\n        },\n        hideStoriesByClass: function(ya) {\n            {\n                var fin208keys = ((window.top.JSBNG_Replay.forInKeys)((xa._instances))), fin208i = (0);\n                var za;\n                for (; (fin208i < fin208keys.length); (fin208i++)) {\n                    ((za) = (fin208keys[fin208i]));\n                    {\n                        p.scry(ia(za), ya).forEach(o.hide);\n                    ;\n                    };\n                };\n            };\n        ;\n        },\n        hideStory: function(ya) {\n            var za = ((ya && xa.getInstance(ya)));\n            ((za && za.hideStory(ya)));\n        },\n        undoHideStory: function(ya) {\n            var za = ((ya && xa.getInstance(ya)));\n            ((za && za.undoHideStory(ya)));\n        },\n        insertStoriesAtBottom: function(ya) {\n            xa._activeInstance.insertStoriesAtBottom(ya);\n        },\n        _fetchTickerForPlaceholder: function(ya, za) {\n            var ab = {\n                handler: function() {\n                    xa._placeholders[ya.id].JSBNG__status = ua;\n                    za();\n                }\n            }, bb = b(\"TickerRHCPageletByGK\"), cb = bb.pagelet_name;\n            da.loadFromEndpoint(cb, ya.id, xa._placeholders[ya.id].pageletData, ab);\n            xa._placeholders[ya.id].JSBNG__status = ta;\n        },\n        registerStoryDialog: function(ya, za) {\n            i.subscribe(\"ticker/init\", function() {\n                var ab = oa(ya), bb = ((ab && xa.getInstance(ab)));\n                ((bb && bb.registerStoryDialog(ab, za)));\n            }, i.SUBSCRIBE_ALL);\n        },\n        registerPlaceholder: function(ya, za) {\n            var ab = xa._placeholders[ya];\n            xa._placeholders[ya] = {\n                JSBNG__status: sa,\n                pageletData: za\n            };\n            if (((ab && ((ab.JSBNG__status == va))))) {\n                xa.show(ia(ya));\n                ab.callback();\n            }\n        ;\n        ;\n        }\n    });\n    la(xa.prototype, {\n        ADS_IDLE_MS: 300000,\n        FLYOUT_MAX_HEIGHT: 450,\n        FLYOUT_OFFSET_THRESHOLD: 20,\n        FLYOUT_COMMENT_OFFSET: 15,\n        FLYOUT_VIEWPORT_PADDING: 75,\n        FLYOUT_TARGET_HEIGHT_OFFSET: 25,\n        init: function(ya, za, ab) {\n            xa._instances[ya.id] = this;\n            xa._activeInstance = this;\n            this._root = ya;\n            this._content = p.JSBNG__find(ya, \".ticker_stream\");\n            this._stories = p.JSBNG__find(this._root, \".tickerActivityStories\");\n            this._scrollableArea = za;\n            this._container = p.JSBNG__find(ya, \"div.uiScrollableAreaWrap\");\n            this._newestStory = {\n            };\n            this._storyIDs = [];\n            this._objectIDs = [];\n            this._fetchedStories = {\n            };\n            this._removedStoryIDs = [];\n            this._storiesToRemove = [];\n            var bb = JSBNG__Date.now();\n            this._initTime = bb;\n            this._lastUpdate = bb;\n            this._lastPull = bb;\n            this._lastInsert = bb;\n            this._lastCustomStory = 0;\n            this._pollOnly = false;\n            this._needNonCustomStoryNum = 0;\n            this._doCustomUpdate = true;\n            this._autoloadStoryIndex = 1;\n            this._scrollTopThreshold = 100;\n            this._scrollTopPrompt = p.JSBNG__find(this._root, \".scrollTopPrompt\");\n            this._scrollTopPromptVisible = false;\n            this._maxStoriesToKeep = 50;\n            this._minStoriesToKeep = 25;\n            this._tickerInSidebarMode = !!w.byClass(this._root, \"fbChatSidebar\");\n            this._loadStoriesWithActions();\n            ja(\"ticker_flyout\");\n            ja(\"ticker_flyout_prefetch\");\n            ja(\"ticker_flyout_loadtime\");\n            ja(\"ticker_stream\");\n            this._ua = {\n                flyout: ra(\"ticker\").uai(\"flyout\", \"flyout\", false),\n                flyout_prefetch: ra(\"ticker\").uai(\"flyout_prefetch\", \"flyout_prefetch\", false),\n                flyout_loadtime: ra(\"ticker\").uai(\"ticker_flyout_loadtime\", \"flyout_loadtime\", false),\n                stream: ra(\"ticker\").uai(\"ticker_stream\", \"stream\", false)\n            };\n            this._uaCurStoryIDFetch = null;\n            this._uaCurStoryIDPrefetch = null;\n            var cb = p.create(\"div\", {\n                className: \"storyQueue hidden_elem\"\n            });\n            this._storyQueue = cb;\n            p.appendContent(this._root, cb);\n            this._initObjectIDs();\n            this._initConfig(ab);\n            this._resetMorePager();\n            this._initListeners();\n            this._initSubscriptions(ab);\n            i.inform(\"ticker/init\", this, i.BEHAVIOR_PERSISTENT);\n            this._poll();\n            if (this._prefetchAfterLoad) {\n                this._logUserEvent(\"stream\", \"prefetch\");\n                this._fetchStories(this._getInsertedStories().slice(0, 5));\n            }\n        ;\n        ;\n        },\n        _loadStoriesWithActions: function() {\n            var ya = oa(\"rightCol\");\n            if (!ya) {\n                return;\n            }\n        ;\n        ;\n            this._toggleWrapper = p.scry(ya, \".tickerToggleWrapper\")[0];\n            if (this._toggleWrapper) {\n                var za = p.scry(this._stories, \".tickerStoryWithButton\");\n                this._storiesWithActions = {\n                };\n                for (var ab = 0; ((ab < za.length)); ab++) {\n                    var bb = za[ab];\n                    this._storiesWithActions[bb.getAttribute(\"data-story-key\")] = bb;\n                };\n            ;\n            }\n        ;\n        ;\n        },\n        _initConfig: function(ya) {\n            la(this, {\n                _newest: ya.newest,\n                _page_newest: ya.newest,\n                _timeout: ya.timeout,\n                _heartbeatTimeout: Math.min(5000, ya.heartbeatTimeout),\n                _maxHeartbeatTimeout: Math.max(30000, ya.maxHeartbeatTimeout),\n                _pullTimeout: Math.max(30000, ya.pullTimeout),\n                _insertTimeout: ya.insertTimeout,\n                _friendCount: ya.friendCount,\n                _maxQueueLength: ya.maxQueueLength,\n                _heartbeatEndpoint: ya.heartbeatEndpoint,\n                _noPoll: ya.nopoll,\n                _maxCustomQueueLength: ya.maxCustomQueueLength,\n                _customStoryInsertTimeout: Math.max(5000, ya.customStoryInsertTimeout),\n                _nonCustomToCustomStoryRatio: ya.nonCustomToCustomStoryRatio,\n                _minForceUpdateInterval: Math.max(ya.insertTimeout, ya.minForceUpdateInterval),\n                _popupOnHover: ya.popupOnHover,\n                _priorityAppId: ya.priorityAppId,\n                _prefetchOnHover: ya.prefetchStoriesOnHover,\n                _userIdleTimeout: ya.userIdleTimeout,\n                _firstCustomStoryDelay: ya.firstCustomStoryDelay,\n                _pollOnly: ya.pollOnly,\n                _tickerSource: ya.tickerSource,\n                _prefetchAfterLoad: ya.prefetchAfterLoad,\n                _logFlyouts: ya.logFlyouts,\n                _userScrollGaurdDelay: ya.userScrollGaurdDelay,\n                _rescheduleScrollToTopDelay: ya.rescheduleScrollToTopDelay,\n                _aggressiveRegulator: ya.aggressiveRegulator\n            });\n            this._queueCustomStories(ya.customStories);\n        },\n        _initListeners: function() {\n            this._listeners = g.listen(this._root, {\n                click: this._handleClick.bind(this),\n                keydown: this._handleKeydown.bind(this),\n                mouseout: this._handleMouseout.bind(this),\n                mouseover: this._handleMouseover.bind(this),\n                mousedown: this._tickerDeClicker.bind(this),\n                mouseup: this._handleMouseup.bind(this)\n            });\n            this._listeners.JSBNG__scroll = g.listen(this._container, \"JSBNG__scroll\", this._handleScroll.bind(this));\n            this._initInfiniteScrollListener.bind(this).defer();\n        },\n        _initSubscriptions: function(ya) {\n            x.onLeave(this._cleanup.bind(this));\n            this._subscriptions = [i.subscribe(v.NAVIGATION_BEGIN, this._onNavHandler.bind(this)),i.subscribe(\"composer/publish\", this._handleComposerPublish.bind(this)),i.subscribe(\"Ticker/storiesInserted\", this._handleStoriesInserted.bind(this)),i.subscribe(\"Ticker/fixed\", this._setFixed.bind(this, true)),i.subscribe(\"Ticker/unfixed\", this._setFixed.bind(this, false)),i.subscribe(\"Ticker/resized\", this._checkInfiniteScroll.bind(this)),i.subscribe(\"ufi/comment\", this._scrollDialogToBottom.bind(this)),i.subscribe(\"Ticker/chatOpened\", this._handleChatOpened.bind(this)),];\n            if (!ya.pollOnly) {\n                this._subscriptions.push(i.subscribe(m.getArbiterType(\"ticker_update\"), this._handleTickerPush.bind(this)));\n            }\n        ;\n        ;\n            if (((ya.pushChannel && !ya.pollOnly))) {\n                this.setPushChannel(ya.pushChannel);\n            }\n        ;\n        ;\n        },\n        _handleClick: function(JSBNG__event) {\n            var ya = JSBNG__event.getTarget();\n            if (this._getButtonFromNode(ya)) {\n                this._logUserAction(ya, \"click\", JSBNG__event);\n                this._handleActionButton(JSBNG__event);\n                return;\n            }\n        ;\n        ;\n            var za = this._getStoryFromNode(ya), ab = w.byClass(ya, \"tickerStoryAllowClick\");\n            if (((((!za || ((za == this._selectedStory)))) || ab))) {\n                return;\n            }\n        ;\n        ;\n            if (this._storyIsHidden(za)) {\n                return;\n            }\n        ;\n        ;\n            if (((((za == this._activeStory)) && !this._selectedStory))) {\n                this._selecting = true;\n            }\n        ;\n        ;\n            this._clearNux();\n            this._logUserEvent(\"flyout\", \"click\");\n            this._logUserEvent(\"flyout_loadtime\", \"open\");\n            if (this._storyCanOpenExternally(za)) {\n                var bb = za.getAttribute(\"data-href\");\n                if (((bb && !ya.getAttribute(\"href\")))) {\n                    var cb = {\n                        href: bb\n                    }, db = ka(ya, [\"ft\",\"gt\",]);\n                    ja(\"click\", cb, JSBNG__event, \"FORCE\", db);\n                    ra(\"ticker\", cb, JSBNG__event).uai(\"click\");\n                }\n                 else this._logUserAction(ya, \"click\", JSBNG__event);\n            ;\n            ;\n                this._openStoryExternally(za, JSBNG__event);\n                return;\n            }\n        ;\n        ;\n            this._logUserAction(ya, \"flyout\", JSBNG__event);\n            this._activateStory(za, \"click\");\n            this._selectStory(za);\n        },\n        _handleMouseover: function(JSBNG__event) {\n            this._setLocked(true);\n            var ya = JSBNG__event.getTarget(), za = this._getOpenableStory(ya);\n            if (!za) {\n                return;\n            }\n        ;\n        ;\n            JSBNG__event.kill();\n            if (((this._prefetchOnHover || this._popupOnHover))) {\n                if (!((za.id in this._fetchedStories))) {\n                    this._logUserEvent(\"flyout_prefetch\", \"prefetch_on_hover\");\n                    this._uaCurStoryIDPrefetch = za.id;\n                }\n            ;\n            ;\n                this._fetchStory(za);\n            }\n        ;\n        ;\n            if (this._selectedStory) {\n                return;\n            }\n        ;\n        ;\n            if (this._popupOnHover) {\n                this._clearHoverTimeouts();\n                var ab = ((this._storyCanOpenExternally(za) ? 500 : 1000)), bb = ((this._activeStory ? 75 : ab));\n                this._hoverShowTimeout = this._setTimeout(function() {\n                    this._logUserEvent(\"flyout\", \"hover\", bb);\n                    this._logUserEvent(\"flyout_loadtime\", \"open\");\n                    this._activateStory(za, \"hover\");\n                    this._logUserAction(ya, \"flyout\", JSBNG__event);\n                }.bind(this), bb);\n            }\n        ;\n        ;\n        },\n        _handleMouseout: function(JSBNG__event) {\n            var ya = JSBNG__event.getTarget();\n            this._setLocked(false);\n            if (((ya == this._getStoryFromNode(ya)))) {\n                var za = p.scry(ya.parentNode, \".openToggler\");\n                for (var ab = 0; ((ab < za.length)); ab++) {\n                    z.toggle(za[ab]);\n                ;\n                };\n            ;\n            }\n        ;\n        ;\n            this._clearClickedStory();\n            this._scheduleHide();\n        },\n        _handleKeydown: function(JSBNG__event) {\n            this._tickerDeClicker(JSBNG__event);\n            var ya = this._activeStory;\n            if (!ya) {\n                return;\n            }\n        ;\n        ;\n            var za = g.getKeyCode(JSBNG__event);\n            switch (za) {\n              case s.UP:\n            \n              case s.DOWN:\n                var ab = this._getInsertedStories(), bb;\n                if (JSBNG__event.getModifiers().any) {\n                    bb = ((((za === s.UP)) ? 0 : ((ab.length - 1))));\n                }\n                 else bb = ((ab.indexOf(ya) + ((((za === s.UP)) ? -1 : 1))));\n            ;\n            ;\n                ya = ab[bb];\n                break;\n              case s.ESC:\n                this._deactivateStory(true);\n                return;\n              default:\n                return;\n            };\n        ;\n            JSBNG__event.kill();\n            if (!ya) {\n                return;\n            }\n        ;\n        ;\n            this._activateStory(ya, \"keypress\");\n            this._selectStory(ya);\n        },\n        _fadeTopmostStoryButton: function() {\n            var ya = 0, za = 15;\n            if (this._storiesWithActions) {\n                {\n                    var fin209keys = ((window.top.JSBNG_Replay.forInKeys)((this._storiesWithActions))), fin209i = (0);\n                    var ab;\n                    for (; (fin209i < fin209keys.length); (fin209i++)) {\n                        ((ab) = (fin209keys[fin209i]));\n                        {\n                            var bb = this._storiesWithActions[ab], cb = p.scry(bb, \".tickerInlineActionButton\")[0], db = p.scry(cb, \".tickerActionIcon\")[0], eb = ((ha.getElementPosition(cb).y - ha.getElementPosition(this._toggleWrapper).y));\n                            if (((eb < ya))) {\n                                aa.set(cb, \"opacity\", 0);\n                                aa.set(db, \"opacity\", 0);\n                            }\n                             else if (((((eb >= ya)) && ((eb < za))))) {\n                                var fb = ((((eb - ya)) / ((za - ya))));\n                                aa.set(cb, \"opacity\", fb);\n                                aa.set(db, \"opacity\", fb);\n                                break;\n                            }\n                             else {\n                                aa.set(cb, \"opacity\", 1);\n                                aa.set(db, \"opacity\", 1);\n                            }\n                            \n                        ;\n                        ;\n                        };\n                    };\n                };\n            }\n        ;\n        ;\n        },\n        _handleScroll: function() {\n            if (!this._preventScrollDismiss) {\n                this._deactivateStory(true);\n            }\n             else this._preventScrollDismiss = false;\n        ;\n        ;\n            if (!this._handleScrollThrottled) {\n                this._handleScrollThrottled = qa(this._handleScrollInner.bind(this));\n            }\n        ;\n        ;\n            this._handleScrollThrottled();\n        },\n        _handleScrollInner: function() {\n            this._fadeTopmostStoryButton();\n            this._checkInfiniteScroll();\n            this._setIsUserScrolling();\n            if (!this._scrollLogged) {\n                this._scrollLogged = true;\n                var ya = this._stories.childNodes.length, za = this._stories.getAttribute(\"data-gt\"), ab = {\n                    ticker_scroll: 1,\n                    number_stories: ya,\n                    source: za\n                };\n                ja(\"JSBNG__scroll\", null, null, \"FORCE\", {\n                    gt: ab\n                });\n                ra(\"ticker\").uai(\"JSBNG__scroll\");\n            }\n        ;\n        ;\n        },\n        _setIsUserScrolling: function() {\n            JSBNG__clearTimeout(this._userScrollingToken);\n            if (this._isScrolledToTop()) {\n                this._userScrolling = false;\n                return;\n            }\n        ;\n        ;\n            this._userScrolling = true;\n            this._userScrollingToken = JSBNG__setTimeout(function() {\n                this._userScrolling = false;\n                this._userScrollingToken = null;\n            }.bind(this), this._userScrollGaurdDelay);\n        },\n        _isUserScrolling: function() {\n            return this._userScrolling;\n        },\n        _handleStoriesInserted: function() {\n            this._initInfiniteScrollListener();\n            if (((this._scrollableArea instanceof y))) {\n                this._scrollableArea.adjustGripper();\n            }\n             else wa.error(\"wrong_scrollable_area\", {\n                JSBNG__dump: this\n            });\n        ;\n        ;\n            this._logUserEvent(\"stream\", \"insert\");\n        },\n        _handleActionButton: function(JSBNG__event) {\n            var ya = JSBNG__event.getTarget(), za = this._getOpenableStory(ya), ab = this._getStoryDialog(za);\n            if (ab) {\n                var bb = ab.subscribe(\"beforehide\", function() {\n                    ab.unsubscribe(bb);\n                    return false;\n                });\n            }\n        ;\n        ;\n        },\n        _handleScrollToTopClick: function() {\n            this._scrollToTop(this._poll.bind(this));\n        },\n        _scheduleScrollToTop: function() {\n            ((this._scrollToTopToken && JSBNG__clearTimeout(this._scrollToTopToken)));\n            this._scrollToTopToken = JSBNG__setTimeout(function() {\n                if (((this._isLocked() || this._isUserScrolling()))) {\n                    this._scheduleScrollToTop();\n                }\n                 else {\n                    this._scrollToTopToken = null;\n                    this._scrollToTop();\n                }\n            ;\n            ;\n            }.bind(this), this._rescheduleScrollToTopDelay);\n        },\n        _scrollToTop: function(ya) {\n            new h(this._container).to(\"scrollTop\", 0).ease(h.ease.end).ondone(ya).go();\n        },\n        _clearHoverTimeouts: function() {\n            JSBNG__clearTimeout(this._hoverShowTimeout);\n            JSBNG__clearTimeout(this._hoverHideTimeout);\n        },\n        _getAllStories: function() {\n            return p.scry(this._root, \"div.fbFeedTickerStory\");\n        },\n        _getInsertedStories: function() {\n            return this._getAllStories().filter(function(ya) {\n                return ((!o.hasClass(ya, \"queuedStory\") && !o.hasClass(ya, \"customStory\")));\n            });\n        },\n        _getQueuedStories: function() {\n            return p.scry(this._storyQueue, \".fbFeedTickerStory.queuedStory\");\n        },\n        _getQueuedCustomStories: function() {\n            return p.scry(this._storyQueue, \".fbFeedTickerStory.customStory\");\n        },\n        _getButtonFromNode: function(ya) {\n            return w.byClass(ya, \"tickerInlineOverlay\");\n        },\n        _getStoryFromNode: function(ya) {\n            return w.byClass(ya, \"fbFeedTickerStory\");\n        },\n        _getActionButtonFromStory: function(ya) {\n            return p.scry(ya, \".tickerInlineActionButton\")[0];\n        },\n        _getOpenableStory: function(ya) {\n            var za = this._getStoryFromNode(ya);\n            return ((this._storyCanOpenDialog(za) ? za : null));\n        },\n        _getStoryDialog: function(ya) {\n            return n.getInstance(ya);\n        },\n        _getStoryDialogEndpoint: function(ya) {\n            return ((((((ya && ((ya.getAttribute(\"data-rel\") == \"async\")))) && ya.getAttribute(\"data-ajaxify\"))) || null));\n        },\n        _storyCanOpenDialog: function(ya) {\n            return ((!!this._getStoryDialogEndpoint(ya) && !this._storyIsHidden(ya)));\n        },\n        _storyCanOpenExternally: function(ya) {\n            return ((!!ya.getAttribute(\"data-href\") || !this._storyCanOpenDialog(ya)));\n        },\n        _storyIsHidden: function(ya) {\n            return o.hasClass(ya, \"tickerStoryHidden\");\n        },\n        hideActiveStory: function() {\n            ((this._activeStory && this.hideStory(this._activeStory)));\n        },\n        hideStory: function(ya) {\n            this._deactivateStory();\n            if (((p.getText(ya) === \"\"))) {\n                p.remove(ya);\n            }\n        ;\n        ;\n            o.addClass(ya, \"tickerStoryHidden\");\n            o.removeClass(ya, \"tickerStoryClickable\");\n        },\n        undoHideStory: function(ya) {\n            o.addClass(ya, \"tickerStoryClickable\");\n            o.removeClass(ya, \"tickerStoryHidden\");\n        },\n        insertStoriesAtBottom: function(ya) {\n            if (!ya) {\n                return;\n            }\n        ;\n        ;\n            var za = p.create(\"div\");\n            za.appendChild(ya);\n            var ab = p.scry(za, \".fbFeedTickerStory\"), bb = p.JSBNG__find(za, \".tickerMorePager\"), cb = [];\n            for (var db = 0; ((db < ab.length)); db++) {\n                if (!this.dedupeStory(ab[db])) {\n                    cb.push(ab[db]);\n                }\n            ;\n            ;\n            };\n        ;\n            if (cb.length) {\n                cb.push(bb);\n                p.replace(p.JSBNG__find(this._root, \".tickerMorePager\"), cb);\n            }\n        ;\n        ;\n            i.inform(\"Ticker/storiesInserted\");\n        },\n        _scheduleHide: function() {\n            if (((this._popupOnHover && !this._selectedStory))) {\n                this._clearHoverTimeouts();\n                this._hoverHideTimeout = this._setTimeout(this._deactivateStory.bind(this), 100);\n            }\n        ;\n        ;\n        },\n        _setScrollTopPromptVisible: function(ya) {\n            this._scrollTopPromptVisible = ya;\n            o.conditionShow(this._scrollTopPrompt, ya);\n            if (((ya && !this._listeners.scrollTop))) {\n                this._listeners.scrollTop = g.listen(this._scrollTopPrompt, {\n                    click: this._handleScrollToTopClick.bind(this)\n                });\n            }\n             else if (((!ya && this._listeners.scrollTop))) {\n                this._listeners.scrollTop.click.remove();\n                this._listeners.scrollTop = null;\n            }\n            \n        ;\n        ;\n        },\n        _isUserIdle: function() {\n            return !fa.isActive(this._userIdleTimeout);\n        },\n        _schedulePoll: function() {\n            JSBNG__clearTimeout(this._pollToken);\n            this._pollToken = this._setTimeout(this._poll.bind(this), this._timeout);\n        },\n        _poll: function() {\n            if (!this._isTickerVisible()) {\n                return;\n            }\n        ;\n        ;\n            if (((this._storiesToRemove.length > 0))) {\n                if (this._isInsertingStory) {\n                    return this._schedulePoll();\n                }\n            ;\n            ;\n                var ya = this._storiesToRemove.pop();\n                this.removeStory(ya);\n            }\n        ;\n        ;\n            var za = ((!this._isScrolledToTop() && this._getQueuedStories().length));\n            this._setScrollTopPromptVisible(za);\n            var ab = JSBNG__Date.now(), bb = ((ab - this._lastInsert));\n            if (((((bb < this._insertTimeout)) || this._isLocked()))) {\n                return this._schedulePoll();\n            }\n        ;\n        ;\n            var cb = this._getQueuedStories(), db = this._getQueuedCustomStories(), eb = this._isUserIdle(), fb = ((cb.length > 0)), gb = ((((((((db.length > 0)) && !eb)) && ((((ab - this._initTime)) > this._firstCustomStoryDelay)))) && ((((this._needNonCustomStoryNum === 0)) || ((!fb && ((((ab - this._lastCustomStory)) > this._customStoryInsertTimeout))))))));\n            if (gb) {\n                this.insertStory(db.shift());\n                this._lastCustomStory = ab;\n                this._needNonCustomStoryNum = this._nonCustomToCustomStoryRatio;\n                return this._schedulePoll();\n            }\n        ;\n        ;\n            if (fb) {\n                this.insertStory(cb.shift());\n                this._needNonCustomStoryNum--;\n                if (((this._needNonCustomStoryNum < 0))) {\n                    this._needNonCustomStoryNum = 0;\n                }\n            ;\n            ;\n                return this._schedulePoll();\n            }\n        ;\n        ;\n            if (eb) {\n                return fa.subscribeOnce(this._poll.bind(this));\n            }\n        ;\n        ;\n            var hb = ((((((((((db.length === 0)) && ((this._needNonCustomStoryNum === 0)))) && ((this._nonCustomToCustomStoryRatio > 0)))) && fa.isActive(this.ADS_IDLE_MS))) && ((((ab - this._lastUpdate)) > this._minForceUpdateInterval)))), ib = false, jb = false;\n            if (this._pollOnly) {\n                jb = ((((ab - this._lastUpdate)) > this._heartbeatTimeout));\n            }\n             else ib = ((((ab - this._lastPull)) > this._pullTimeout));\n        ;\n        ;\n            var kb = ((((((hb && this._doCustomUpdate)) || ib)) || jb));\n            if (!kb) {\n                return this._schedulePoll();\n            }\n        ;\n        ;\n            if (hb) {\n                this._doCustomUpdate = false;\n            }\n        ;\n        ;\n            this.update({\n                pull: ib,\n                fullpoll: jb,\n                needcustomstory: hb\n            });\n        },\n        _updatePollOnlyHeartbeatTimeout: function() {\n            if (((this._pollOnly && ((this._heartbeatTimeout < this._maxHeartbeatTimeout))))) {\n                this._heartbeatTimeout = Math.min(((this._heartbeatTimeout + 5000)), this._maxHeartbeatTimeout);\n            }\n        ;\n        ;\n        },\n        update: function(ya) {\n            this._updatePollOnlyHeartbeatTimeout();\n            if (((this._noPoll && !this._pollOnly))) {\n                return this._schedulePoll();\n            }\n        ;\n        ;\n            var za = {\n                newest: ((((ya.fullpoll || ya.cache_update)) ? this._newest : this._page_newest)),\n                storyids: this._storyIDs,\n                friendcount: this._friendCount,\n                priorityappid: this._priorityAppId,\n                source: this._tickerSource,\n                needcustomstory: ((this._nonCustomToCustomStoryRatio > 0))\n            };\n            la(za, ya);\n            new j().setURI(this._heartbeatEndpoint).setReadOnly(true).setOption(\"retries\", 0).setData(za).setHandler(this._handleResponse.bind(this)).setFinallyHandler(this._poll.bind(this)).setAllowCrossPageTransition(true).send();\n            this._lastUpdate = JSBNG__Date.now();\n            if (za.pull) {\n                this._lastPull = this._lastUpdate;\n            }\n        ;\n        ;\n            this._storyIDs = [];\n        },\n        insertStory: function(ya, za, ab) {\n            this._lastInsert = JSBNG__Date.now();\n            ((window.LiveTimer && u.addTimeStamps(ya)));\n            o.removeClass(ya, \"queuedStory\");\n            o.removeClass(ya, \"customStory\");\n            if (((za !== false))) {\n                var bb = ((ab ? this._fadeStoryIn : this._flyStoryIn));\n                if (this._isUserScrolling()) {\n                    var cb = function() {\n                        this._container.scrollTop = ((this._container.scrollTop + this._stories.firstChild.offsetHeight));\n                        this._scheduleScrollToTop();\n                    }.bind(this);\n                    this._fadeStoryIn(ya, cb);\n                }\n                 else this._scrollToTop(bb.bind(this, ya));\n            ;\n            ;\n            }\n             else p.prependContent(this._stories, ya);\n        ;\n        ;\n            if (((this._storiesWithActions && o.hasClass(ya, \"tickerStoryWithButton\")))) {\n                this._storiesWithActions[ya.getAttribute(\"data-story-key\")] = ya;\n            }\n        ;\n        ;\n            this._removeOldStories();\n        },\n        _removeOldStories: function() {\n            var ya = this._getInsertedStories();\n            if (((ya.length <= this._maxStoriesToKeep))) {\n                return;\n            }\n        ;\n        ;\n            var za = this._minStoriesToKeep, ab = ya.slice(za);\n            ab.forEach(p.remove);\n            if (this._storiesWithActions) {\n                for (var bb = 0; ((bb < ab.length)); bb++) {\n                    delete this._storiesWithActions[ab[bb].getAttribute(\"data-story-key\")];\n                ;\n                };\n            }\n        ;\n        ;\n            this._resetMorePager();\n        },\n        _resetMorePager: function() {\n            var ya = this._getInsertedStories();\n            if (((!ya || !ya.length))) {\n                return;\n            }\n        ;\n        ;\n            var za = ya[((ya.length - 1))].getAttribute(\"data-ticker-timestamp\"), ab = p.scry(this._root, \".tickerMorePager a\")[0];\n            if (((!ab || !za))) {\n                return;\n            }\n        ;\n        ;\n            var bb = new ea(ab.getAttribute(\"ajaxify\"));\n            bb.addQueryData({\n                oldest: za\n            });\n            ab.setAttribute(\"ajaxify\", bb);\n        },\n        _setLocked: function(ya) {\n            this._locked = ya;\n        },\n        _isLocked: function() {\n            return !!((this._locked || this._activeStory));\n        },\n        informAndRemoveStory: function(ya, za, ab) {\n            var bb = this._getStoryFromNode(ya), cb = bb.getAttribute(\"data-story-key\");\n            p.setContent(bb, za);\n            o.addClass(bb, \"highlightedStory\");\n            this._setTimeout(this.removeStory.bind(this, cb), ((ab || 6000)));\n        },\n        _getStoryByStoryKey: function(ya) {\n            var za = this._getAllStories();\n            for (var ab = 0; ((ab < za.length)); ab++) {\n                var bb = za[ab];\n                if (((bb.getAttribute(\"data-story-key\") == ya))) {\n                    return bb;\n                }\n            ;\n            ;\n            };\n        ;\n            return null;\n        },\n        removeStory: function(ya) {\n            this._removedStoryIDs[ya] = true;\n            var za = this._getStoryByStoryKey(ya);\n            if (!za) {\n                return;\n            }\n        ;\n        ;\n            if (this._storiesWithActions) {\n                delete this._storiesWithActions[ya];\n            }\n        ;\n        ;\n            if (((za == this._activeStory))) {\n                this._deactivateStory();\n            }\n        ;\n        ;\n            var ab = this._getStoryDialog(za);\n            ((ab && ab.destroy()));\n            if (o.hasClass(za, \"queuedStory\")) {\n                p.remove(za);\n                return;\n            }\n        ;\n        ;\n            this._animateStoryOut(za);\n        },\n        _isScrolledToTop: function() {\n            return ((this._container.scrollTop <= this._scrollTopThreshold));\n        },\n        _flyStoryIn: function(ya) {\n            var za = p.create(\"div\", {\n                style: {\n                    marginTop: \"-1000px\"\n                }\n            }, ya);\n            aa.set(za, \"opacity\", 0);\n            p.prependContent(this._stories, za);\n            var ab = ha.getElementDimensions(za).y;\n            aa.set(za, \"marginTop\", ((((\"-\" + ab)) + \"px\")));\n            this._isInsertingStory = true;\n            new h(za).to(\"marginTop\", 0).ease(h.ease.end).checkpoint(21801).to(\"opacity\", 1).ondone(function() {\n                p.replace(za, ya);\n                this._afterInsert(ya);\n                this._isInsertingStory = false;\n            }.bind(this)).go();\n        },\n        _fadeStoryIn: function(ya, za) {\n            new h(this._stories).to(\"opacity\", 21991).ondone(function() {\n                p.prependContent(this._stories, ya);\n                if (za) {\n                    za();\n                }\n            ;\n            ;\n                new h(this._stories).to(\"opacity\", 1).ondone(function() {\n                    this._afterInsert(ya);\n                }.bind(this)).go();\n            }.bind(this)).go();\n        },\n        _animateStoryOut: function(ya) {\n            var za = p.create(\"div\", {\n                style: {\n                    overflow: \"hidden\",\n                    position: \"relative\"\n                }\n            });\n            p.insertBefore(ya, za);\n            p.appendContent(za, ya);\n            new h(za).to(\"JSBNG__top\", 20).to(\"height\", 0).to(\"opacity\", 0).ease(h.ease.end).ondone(function() {\n                p.remove(za);\n                i.inform(\"Ticker/animateOut\");\n            }.bind(this)).go();\n        },\n        _afterInsert: function(ya) {\n            i.inform(\"Ticker/afterInsert\");\n        },\n        setPushChannel: function(ya) {\n            ((this._pushSubscription && this._pushSubscription.unsubscribe()));\n            this._pushSubscription = i.subscribe(m.getArbiterType(ya), this._handleTickerPush.bind(this));\n            d([\"ChatConfig\",\"ChannelConnection\",], function(za, ab) {\n                this._channelConnection = ab;\n                this._checkChannelConnection();\n                this._channelConnectionSubscription = this._channelConnection.subscribe([this._channelConnection.CONNECTED,this._channelConnection.RECONNECTING,this._channelConnection.SHUTDOWN,this._channelConnection.MUTE_WARNING,this._channelConnection.UNMUTE_WARNING,], this._handleChannelConnection.bind(this));\n            }.bind(this));\n        },\n        _checkChannelConnection: function() {\n            o.conditionClass(this._root, \"disconnected\", this._channelConnection.disconnected());\n        },\n        setCurrentAppId: function(ya) {\n            this._priorityAppId = ya;\n        },\n        _handleTickerPush: function(ya, za) {\n            var ab = za.obj;\n            if (ab.delete_id) {\n                this._storiesToRemove.push(ab.delete_id);\n                return;\n            }\n        ;\n        ;\n            if (ab.fromups) {\n                if (ab.do_logging) {\n                    this._logDarkLaunch(ab);\n                }\n            ;\n            }\n        ;\n        ;\n            var bb = ab.story_xhp;\n            if (!bb) {\n                return;\n            }\n        ;\n        ;\n            this._newest = ab.story_time;\n            var cb = q(bb).getRootNode();\n            this.queueStory(cb, ab.flyout_js_cmds);\n            if (((this._aggressiveRegulator && ((ab.actor == this._newestStory.actorID))))) {\n                this.removeStory(this._newestStory.storyKey);\n                new k(\"/common/ods_endpoint.php\", {\n                    k: \"ticker.aggr.remove\"\n                }).send();\n            }\n        ;\n        ;\n            this._newestStory = {\n                actorID: ab.actor,\n                storyKey: cb.getAttribute(\"data-story-key\")\n            };\n        },\n        _handleComposerPublish: function(ya, za) {\n            ((za.tickerMarkup && this.insertStory(za.tickerMarkup)));\n        },\n        _clearNux: function() {\n            var ya = p.scry(JSBNG__document.body, \"div.tickerNUXContainer\");\n            if (ya.length) {\n                ya.forEach(function(za) {\n                    var ab = n.getInstance(za);\n                    ((ab && ab.hide()));\n                });\n                new j().setURI(\"/ajax/feed/ticker/nux.php\").send();\n            }\n        ;\n        ;\n            this._clearNux = na;\n        },\n        _logDarkLaunch: function(ya) {\n            var za = {\n                actor: ya.actor,\n                story_time: ya.story_time,\n                key: ya.story_obj_id,\n                dark: 1\n            };\n            new j().setURI(\"/alite/push/log.php\").setData({\n                msg: JSON.stringify(za)\n            }).send();\n        },\n        _logRender: function() {\n            if (this._loggedRender) {\n                return;\n            }\n        ;\n        ;\n            var ya = this._tickerInSidebarMode;\n            if (((ya || w.byClass(this._content, \"home_right_column\")))) {\n                new k(\"/ajax/log_ticker_render.php\", {\n                    sidebar_mode: ya\n                }).send();\n                this._loggedRender = true;\n            }\n        ;\n        ;\n        },\n        _isTickerVisible: function() {\n            var ya = ((xa._activeInstance == this));\n            ((ya && this._logRender()));\n            return ya;\n        },\n        _handleResponse: function(ya) {\n            var za = ya.getPayload();\n            if (za.newest) {\n                this._newest = this._page_newest = za.newest;\n            }\n        ;\n        ;\n            if (za.JSBNG__content) {\n                if (((za.JSBNG__content instanceof Array))) {\n                    for (var ab = 0; ((ab < za.JSBNG__content.length)); ab++) {\n                        this.queueStoryMarkup(za.JSBNG__content[ab]);\n                    ;\n                    };\n                ;\n                }\n                 else this.queueStoryMarkup(za.JSBNG__content);\n            ;\n            }\n        ;\n        ;\n            if (((za.custom_stories && za.custom_stories.length))) {\n                this._queueCustomStories(za.custom_stories);\n                this._doCustomUpdate = true;\n            }\n        ;\n        ;\n        },\n        queueStoryMarkup: function(ya) {\n            var za = q(ya).getRootNode();\n            this.queueStory(za);\n        },\n        dedupeStory: function(ya) {\n            var za = ya.getAttribute(\"data-story-key\"), ab = ((za && ((!!this._objectIDs[za] || !!this._removedStoryIDs[za]))));\n            ((za && (this._objectIDs[za] = true)));\n            return ab;\n        },\n        queueStory: function(ya, za) {\n            if (this.dedupeStory(ya)) {\n                return;\n            }\n        ;\n        ;\n            o.addClass(ya, \"queuedStory\");\n            p.appendContent(this._storyQueue, ya);\n            var ab = ((za && za.length));\n            if (ab) {\n                za.forEach(function(cb) {\n                    new Function(cb).apply();\n                });\n            }\n        ;\n        ;\n            ya.setAttribute(\"id\", ((((ya.id + \"_\")) + this._root.id)));\n            var bb = this._getQueuedStories();\n            bb.slice(0, -this._maxQueueLength).forEach(p.remove);\n            if (ab) {\n                this._fetchedStories[ya.id] = true;\n            }\n        ;\n        ;\n        },\n        _queueCustomStories: function(ya) {\n            while (ya.length) {\n                var za = ya.shift();\n                za = q(za).getRootNode();\n                if (this.dedupeStory(za)) {\n                    continue;\n                }\n            ;\n            ;\n                o.addClass(za, \"customStory\");\n                p.appendContent(this._storyQueue, za);\n            };\n        ;\n            var ab = this._getQueuedCustomStories();\n            ab.slice(0, -this._maxQueueLength).forEach(p.remove);\n        },\n        _cleanup: function() {\n            xa._placeholders.pagelet_rhc_ticker = null;\n            if (!w.byClass(this._content, \"hasRightCol\")) {\n                return;\n            }\n        ;\n        ;\n            this._objectIDs = [];\n            this._subscriptions.forEach(i.unsubscribe);\n            ((this._channelConnectionSubscription && this._channelConnection.unsubscribe(this._channelConnectionSubscription)));\n            ((this._pushSubscription && this._pushSubscription.unsubscribe()));\n            {\n                var fin210keys = ((window.top.JSBNG_Replay.forInKeys)((this._listeners))), fin210i = (0);\n                var ya;\n                for (; (fin210i < fin210keys.length); (fin210i++)) {\n                    ((ya) = (fin210keys[fin210i]));\n                    {\n                        ((this._listeners[ya] && this._listeners[ya].remove()));\n                    ;\n                    };\n                };\n            };\n        ;\n            JSBNG__clearTimeout(this._pollToken);\n            this._pollToken = null;\n            this._cleanupInputFocusListener();\n            this._cleanupContentResizeListener();\n            i.inform(\"Ticker/cleanup\");\n        },\n        _onNavHandler: function(ya, za) {\n            var ab = za.params.key;\n            if (((((ab != \"lf\")) && ((ab != \"h\"))))) {\n                this._cleanup();\n            }\n        ;\n        ;\n        },\n        _getPositionForDialog: function() {\n            if (((this._tickerInSidebarMode && o.hasClass(JSBNG__document.body, \"_58v4\")))) {\n                return \"right\";\n            }\n        ;\n        ;\n            return \"left\";\n        },\n        registerStoryDialog: function(ya, za) {\n            if (((this._uaCurStoryIDFetch == ya.id))) {\n                this._uaCurStoryIDFetch = null;\n                this._logUserEvent(\"flyout\", \"fetch_success\");\n            }\n        ;\n        ;\n            if (((this._uaCurStoryIDPrefetch == ya.id))) {\n                this._uaCurStoryIDPrefetch = null;\n                this._logUserEvent(\"flyout_prefetch\", \"prefetch_success\");\n            }\n        ;\n        ;\n            this._fetchedStories[ya.id] = true;\n            za.setContext(ya);\n            za.setPosition(this._getPositionForDialog());\n            za.subscribe(\"hide\", this._deactivateStory.bind(this, true));\n            za.subscribe(\"success\", this._focusStory.bind(this, ya));\n            za.subscribe(\"beforehide\", function() {\n                if (this._selecting) {\n                    this._selecting = false;\n                    return false;\n                }\n            ;\n            ;\n            }.bind(this));\n            if (this._popupOnHover) {\n                za.subscribe(\"mouseenter\", this._clearHoverTimeouts.bind(this));\n                za.subscribe(\"mouseleave\", this._scheduleHide.bind(this));\n                za.subscribe(\"show\", function() {\n                    this._highlightDialogScrollbar.bind(this, za).defer();\n                    var ab = g.listen(za.getContent(), \"mousedown\", function() {\n                        this._selectStory(ya);\n                        ab.remove();\n                    }.bind(this));\n                }.bind(this));\n            }\n        ;\n        ;\n            if (((ya == this._activeStory))) {\n                this._logUserEvent(\"flyout_loadtime\", \"show_fetched\");\n                this._logUserEvent(\"flyout\", \"show\");\n                this._openDialog(za);\n            }\n        ;\n        ;\n        },\n        _highlightDialogScrollbar: function(ya) {\n            var za = p.scry(ya.getContent(), \".uiScrollableArea\")[0];\n            ((za && y.poke(za)));\n        },\n        _openStoryExternally: function(ya, JSBNG__event) {\n            var za = ya.getAttribute(\"data-href\");\n            if (((!za || ((za == \"#\"))))) {\n                return;\n            }\n        ;\n        ;\n            var ab = ya.getAttribute(\"data-story-rel\");\n            switch (ab) {\n              case \"theater\":\n                this._deactivateAndClearStory();\n                l.loadModules([\"PhotoViewer\",], function(db) {\n                    db.bootstrap(za, ya);\n                });\n                return;\n              case \"async\":\n                this._deactivateAndClearStory();\n                j.bootstrap(za, ya);\n                return;\n            };\n        ;\n            var bb = ya.getAttribute(\"data-target\"), cb = ((((((JSBNG__event.which != 1)) || JSBNG__event.getModifiers().any)) || ((bb == \"_blank\"))));\n            ((cb ? window.open(za, \"_blank\") : pa(za)));\n        },\n        _deactivateAndClearStory: function() {\n            this._clearHoverTimeouts();\n            this._deactivateStory();\n        },\n        _focusStoryWillTriggerScroll: function(ya) {\n            var za = this._container, ab = za.clientHeight, bb = ya.offsetHeight, cb = za.scrollTop, db = ((cb + ab)), eb = ya.offsetTop, fb = ((eb + bb));\n            return ((((eb < cb)) || ((fb > db))));\n        },\n        _focusStory: function(ya) {\n            if (this._focusStoryWillTriggerScroll(ya)) {\n                this._preventScrollDismiss = true;\n            }\n        ;\n        ;\n            ya.JSBNG__focus();\n        },\n        _selectStory: function(ya) {\n            this._selectedStory = ya;\n            o.addClass(ya, \"tickerStorySelected\");\n            o.addClass(this._root, \"tickerChildSelected\");\n        },\n        _activateStory: function(ya, za) {\n            this._clearHoverTimeouts();\n            if (((((ya == this._activeStory)) || !this._storyCanOpenDialog(ya)))) {\n                return;\n            }\n        ;\n        ;\n            this._deactivateStory();\n            this._focusStory(ya);\n            this._activeStory = ya;\n            o.addClass(ya, \"tickerStoryActive\");\n            ((window.Toggler && ca.hide()));\n            if (this._logFlyouts) {\n                za = ((za || \"unknown\"));\n                new k(\"/ajax/feed/ticker/flyout.php\", {\n                    src: za\n                }).send();\n            }\n        ;\n        ;\n            ba.log(ya);\n            var ab = this._getStoryDialog(ya);\n            if (ab) {\n                this._logUserEvent(\"flyout_loadtime\", \"show_prefetched\");\n                this._logUserEvent(\"flyout\", \"show\");\n                this._openDialog(ab);\n                return;\n            }\n        ;\n        ;\n            if (!((ya.id in this._fetchedStories))) {\n                this._uaCurStoryIDFetch = ya.id;\n                this._logUserEvent(\"flyout\", \"fetch\");\n            }\n        ;\n        ;\n            this._fetchStory(ya);\n        },\n        _deactivateStory: function(ya) {\n            if (((this._activeStory === this._deactivatingStory))) {\n                return;\n            }\n        ;\n        ;\n            this._deactivatingStory = this._activeStory;\n            if (this._dialog) {\n                if (((ya === true))) {\n                    this._dialog.enableBehavior(t);\n                }\n                 else this._dialog.disableBehavior(t);\n            ;\n            ;\n                this._dialog.hide();\n                this._logUserEvent(\"flyout\", \"close\");\n            }\n        ;\n        ;\n            if (this._activeStory) {\n                o.removeClass(this._activeStory, \"tickerStoryActive\");\n                o.removeClass(this._activeStory, \"tickerStorySelected\");\n                o.removeClass(this._root, \"tickerChildSelected\");\n            }\n        ;\n        ;\n            this._dialog = this._selectedStory = this._activeStory = null;\n            this._cleanupInputFocusListener();\n            this._cleanupContentResizeListener();\n            this._deactivatingStory = null;\n        },\n        _logUserAction: function(ya, za, JSBNG__event) {\n            ja(za, ya, JSBNG__event, \"FORCE\");\n            ra(\"ticker\", ya, JSBNG__event).uai(za);\n        },\n        _logUserEvent: function(ya, JSBNG__event) {\n            if (this._ua[ya]) {\n                this._ua[ya].add_event(JSBNG__event);\n            }\n        ;\n        ;\n        },\n        _fetchStory: function(ya) {\n            JSBNG__clearTimeout(this._fetchToken);\n            var za = [], ab = this._getInsertedStories(), bb = ab.indexOf(ya);\n            [-1,0,1,].forEach(function(cb) {\n                var db = ab[((bb + cb))];\n                ((db && za.push(db)));\n            }, this);\n            this._fetchToken = JSBNG__setTimeout(this._fetchStories.bind(this, za), 100);\n        },\n        _fetchStories: function(ya) {\n            var za = [], ab, bb = function(cb) {\n                JSBNG__clearTimeout(ab);\n                ya.forEach(function(db) {\n                    o.conditionClass(db, \"tickerStoryFetching\", cb);\n                });\n            };\n            ya = ya.filter(function(cb) {\n                if (((cb.id in this._fetchedStories))) {\n                    return false;\n                }\n            ;\n            ;\n                this._fetchedStories[cb.id] = true;\n                var db = this._getStoryDialogEndpoint(cb), eb = ea(db).getQueryData();\n                if (((!db || !eb))) {\n                    return false;\n                }\n            ;\n            ;\n                eb.uniq_id = cb.getAttribute(\"id\");\n                eb.referrer = this._tickerSource;\n                za.push(eb);\n                return true;\n            }, this);\n            if (!za.length) {\n                return;\n            }\n        ;\n        ;\n            ab = this._setTimeout(bb.curry(true), 500);\n            new j(\"/ajax/feed/ticker/multi_story\").setFinallyHandler(bb.curry(false)).setErrorHandler(na).setData({\n                stories: za\n            }).setAllowCrossPageTransition(this._tickerInSidebarMode).send();\n        },\n        _tickerDeClicker: function(JSBNG__event) {\n            var ya = JSBNG__event.getTarget(), za = w.byTag(ya, \"a\"), ab = this._getStoryFromNode(ya), bb = this._getButtonFromNode(ya);\n            if (((((((((((ab && za)) && !bb)) && o.hasClass(ab, \"tickerStoryClickable\"))) && !o.hasClass(za, \"tickerStoryAllowClick\"))) && !this._storyIsHidden(ab)))) {\n                za.setAttribute(\"rel\", \"ignore\");\n                za.removeAttribute(\"JSBNG__onclick\");\n                za.removeAttribute(\"ajaxify\");\n                za.removeAttribute(\"href\");\n            }\n        ;\n        ;\n            var cb = ((JSBNG__event.button == 2)), db = ((JSBNG__event.type === \"keydown\")), eb = ((ab && this._getActionButtonFromStory(ab)));\n            if (((((!cb && eb)) && !db))) {\n                this._setClickedStory(ab);\n            }\n        ;\n        ;\n        },\n        _handleMouseup: function(JSBNG__event) {\n            this._clearClickedStory();\n        },\n        _setClickedStory: function(ya) {\n            this._clearClickedStory();\n            o.addClass(ya, \"tickerStoryClicked\");\n            this._clickedStory = ya;\n        },\n        _clearClickedStory: function() {\n            if (this._clickedStory) {\n                o.removeClass(this._clickedStory, \"tickerStoryClicked\");\n                this._clickedStory = null;\n            }\n        ;\n        ;\n        },\n        _initInfiniteScrollListener: function() {\n            var ya = this._getInsertedStories();\n            if (this._storiesWithActions) {\n                for (var za = 0; ((za < ya.length)); za++) {\n                    var ab = ya[za];\n                    if (o.hasClass(ab, \"tickerStoryWithButton\")) {\n                        this._storiesWithActions[ab.getAttribute(\"data-story-key\")] = ab;\n                    }\n                ;\n                ;\n                };\n            }\n        ;\n        ;\n            var bb = Math.max(0, ((ya.length - this._autoloadStoryIndex)));\n            this._infiniteScrollStory = ya[bb];\n            this._checkInfiniteScroll();\n        },\n        _checkInfiniteScroll: function() {\n            if (this._infiniteScrollStory) {\n                var ya = ha.getElementPosition(this._infiniteScrollStory).y, za = ((ha.getElementPosition(this._container).y + ha.getElementDimensions(this._container).y));\n                if (((ya < za))) {\n                    var ab = p.scry(this._root, \".tickerMorePager a\")[0];\n                    if (ab) {\n                        var bb = ((w.byClass(ab, \"stat_elem\") || ab));\n                        new j(ab.getAttribute(\"ajaxify\")).setReadOnly(true).setRelativeTo(ab).setStatusElement(bb).setAllowCrossPageTransition(true).send();\n                        this._logUserEvent(\"stream\", \"JSBNG__scroll\");\n                    }\n                ;\n                ;\n                    this._infiniteScrollStory = null;\n                    this._autoloadStoryIndex = 5;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n        },\n        _setFixed: function(ya) {\n            if (!this._selectedStory) {\n                return;\n            }\n        ;\n        ;\n            var za = this._getStoryDialog(this._selectedStory);\n            if (za) {\n                za.setPosition(this._getPositionForDialog());\n                za.setFixed(ya);\n                za.updatePosition();\n            }\n        ;\n        ;\n        },\n        _setTimeout: function(ya, za) {\n            return JSBNG__setTimeout(ya, za, !this._tickerInSidebarMode);\n        },\n        _scrollDialogToBottom: function() {\n            var ya = ((this._dialog && this._dialog.getContent())), za = ((ya && p.scry(ya, \".uiScrollableAreaWrap\")[0])), ab = ((za && y.getInstance(za)));\n            ((ab && ab.scrollToBottom()));\n        },\n        _openDialog: function(ya) {\n            if (!this._tickerInSidebarMode) {\n                o.addClass(ya.getRoot(), \"tickerStoryOverlayOnTop\");\n            }\n        ;\n        ;\n            this._dialog = ya.show();\n            this._updateDialogPosition();\n            this._writeSwfFrame(ya);\n            this._initCommentFocusListener.bind(this).defer();\n            this._initContentResizeListener.bind(this).defer();\n            this._stupidIE7VideoResizeHack(ya);\n        },\n        _stupidIE7VideoResizeHack: function(ya) {\n            if (((ga.ie() === 7))) {\n                var za = p.scry(ya.getContent(), \".uiVideoThumb .img\");\n                za.forEach(function(ab) {\n                    aa.set(ab, \"width\", \"\");\n                });\n            }\n        ;\n        ;\n        },\n        _updateDialogPosition: function() {\n            var ya = ((this._tickerInSidebarMode || !!w.byClass(this._root, \"fixed_elem\")));\n            this._dialog.setPosition(this._getPositionForDialog());\n            this._dialog.setFixed(ya);\n            this._adjustFlyoutContentHeight();\n            this._dialog.updatePosition();\n        },\n        _writeSwfFrame: function(ya) {\n            var za = ((this._dialog && this._dialog.getContent())), ab = p.scry(za, \".swfObject\")[0];\n            if (!ab) {\n                return;\n            }\n        ;\n        ;\n            var bb = ab.getAttribute(\"data-swfid\");\n            if (((bb && window[bb]))) {\n                var cb = window[bb];\n                cb.write(ab);\n            }\n        ;\n        ;\n        },\n        _initCommentFocusListener: function() {\n            var ya = ((this._dialog && this._dialog.getContent())), za = ((ya && p.scry(ya, \".tickerDialogFooter textarea\")[0]));\n            if (!za) {\n                return;\n            }\n        ;\n        ;\n            this._listeners.inputFocus = g.listen(za, \"JSBNG__focus\", this._scrollDialogToBottom.bind(this));\n        },\n        _cleanupInputFocusListener: function() {\n            if (this._listeners.inputFocus) {\n                this._listeners.inputFocus.remove();\n                this._listeners.inputFocus = null;\n            }\n        ;\n        ;\n        },\n        _initContentResizeListener: function() {\n            var ya = ((this._dialog && this._dialog.getContent()));\n            if (!ya) {\n                return;\n            }\n        ;\n        ;\n            this._listeners.contentResize = g.listen(ya, \"click\", function() {\n                this._dialog.updatePosition.bind(this._dialog).defer();\n            }.bind(this));\n        },\n        _cleanupContentResizeListener: function() {\n            if (this._listeners.contentResize) {\n                this._listeners.contentResize.remove();\n                this._listeners.contentResize = null;\n            }\n        ;\n        ;\n        },\n        _adjustFlyoutContentHeight: function() {\n            var ya = ((this._dialog && this._dialog.getContent())), za = ((ya && p.scry(ya, \".uiScrollableAreaWrap\")[0]));\n            if (!za) {\n                return;\n            }\n        ;\n        ;\n            var ab = ha.getElementDimensions(za), bb = ha.getElementPosition(za), cb = p.scry(za, \".uiUfi .uiUfiComment\"), db = ((ha.getViewportDimensions().y - this.FLYOUT_VIEWPORT_PADDING)), eb = Math.min(this.FLYOUT_MAX_HEIGHT, db), fb = ((eb - this.FLYOUT_TARGET_HEIGHT_OFFSET));\n            for (var gb = 0; ((gb < cb.length)); gb++) {\n                var hb = cb[gb], ib = ha.getElementPosition(hb), jb = ((ib.y - bb.y));\n                if (((Math.abs(((jb - fb))) <= this.FLYOUT_OFFSET_THRESHOLD))) {\n                    fb = ((jb + this.FLYOUT_COMMENT_OFFSET));\n                    break;\n                }\n            ;\n            ;\n            };\n        ;\n            if (((ab.y > fb))) {\n                aa.set(za, \"height\", ((fb + \"px\")));\n                aa.set(za, \"max-height\", null);\n            }\n             else {\n                aa.set(za, \"max-height\", ((eb + \"px\")));\n                aa.set(za, \"height\", null);\n            }\n        ;\n        ;\n        },\n        _initObjectIDs: function() {\n            var ya = this._getAllStories();\n            for (var za = 0; ((za < ya.length)); ++za) {\n                var ab = ya[za].getAttribute(\"data-story-key\");\n                ((ab && (this._objectIDs[ab] = true)));\n            };\n        ;\n        },\n        _handleChatOpened: function() {\n            this._deactivateStory(true);\n        },\n        _handleChannelConnection: function() {\n            this._checkChannelConnection();\n        },\n        getNewest: function() {\n            return this._newest;\n        }\n    });\n    e.exports = xa;\n});\n__d(\"legacy:TickerController\", [\"TickerController\",], function(a, b, c, d) {\n    a.TickerController = b(\"TickerController\");\n}, 3);\n__d(\"HomeTickerFirstRightColumnController\", [\"$\",\"ge\",\"debounceAcrossTransitions\",\"throttle\",\"UIPagelet\",\"Arbiter\",\"Style\",\"csx\",\"CSS\",\"DOM\",\"Vector\",\"Run\",\"LegacyContextualDialog\",\"TickerController\",\"UIIntentionalStreamMessage\",\"JSBNG__Event\",], function(a, b, c, d, e, f) {\n    var g = b(\"$\"), h = b(\"ge\"), i = b(\"debounceAcrossTransitions\"), j = b(\"throttle\"), k = b(\"UIPagelet\"), l = b(\"Arbiter\"), m = b(\"Style\"), n = b(\"csx\"), o = b(\"CSS\"), p = b(\"DOM\"), q = b(\"Vector\"), r = b(\"Run\"), s = b(\"LegacyContextualDialog\"), t = b(\"TickerController\"), u = b(\"UIIntentionalStreamMessage\"), v = b(\"JSBNG__Event\"), w = null, x = 75, y = 50, z = 15, aa = false, ba = false, ca, da, ea, fa, ga, ha, ia, ja, ka, la = y, ma = [], na = [], oa, pa, qa, ra, sa, ta, ua, va, wa, xa, ya, za, ab;\n    function bb() {\n        var sb = ob;\n        function tb() {\n            sb.defer();\n        };\n    ;\n        var ub = p.scry(ra, \"img.img\");\n        ub.forEach(function(vb) {\n            if (!vb.complete) {\n                v.listen(vb, {\n                    load: tb,\n                    error: tb,\n                    abort: tb\n                });\n            }\n        ;\n        ;\n        });\n        tb();\n    };\n;\n    function cb() {\n        na = [l.subscribe(\"page_transition\", fb),l.subscribe(\"netego_loaded\", ob),l.subscribe(\"Ticker/storiesInserted\", ob),l.subscribe(u.INSERT_STORIES, ob),];\n        if (w.enableSidebar) {\n            na.push(l.subscribe(\"sidebar/hide\", pb));\n            na.push(l.subscribe(\"sidebar/show\", qb));\n        }\n    ;\n    ;\n    };\n;\n    function db() {\n        if (ra) {\n            var sb = p.scry(ra, \"div._4u8\");\n            for (var tb = 0; ((tb < sb.length)); tb++) {\n                var ub = JSON.parse(sb[tb].getAttribute(\"data-ad\")).segment;\n                if (((ub === \"premium\"))) {\n                    return true;\n                }\n            ;\n            ;\n            };\n        ;\n        }\n    ;\n    ;\n        return false;\n    };\n;\n    function eb() {\n        ab = p.scry(JSBNG__document, \"div.fbRemindersContent\");\n        va = p.scry(h(\"rightCol\"), \"div.home_right_column\")[0];\n        wa = p.JSBNG__find(va, \"div.rightColumnWrapper\");\n        ra = ((h(\"pagelet_ego_pane_w\") || h(\"pagelet_ego_pane_m\")));\n        fa = !db();\n        v.listen(ra, \"mouseenter\", function() {\n            aa = true;\n        });\n        v.listen(ra, \"mouseleave\", function() {\n            aa = false;\n        });\n        sa = h(\"pagelet_rhc_ticker\");\n        if (!sa) {\n            return false;\n        }\n    ;\n    ;\n        ta = p.scry(sa, \".ticker_container\")[0];\n        ua = p.scry(sa, \".ticker_stream\")[0];\n        return ((ta && ua));\n    };\n;\n    function fb(sb, tb) {\n        if (((((((sb === \"page_transition\")) && tb)) && tb.uri))) {\n            var ub = tb.uri;\n            if (((ub.path === \"/photo.php\"))) {\n                ba = true;\n                return;\n            }\n        ;\n        ;\n            if (((ba && ((ub.path === \"/\"))))) {\n                ba = false;\n                return;\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n        na.forEach(l.unsubscribe);\n        na = [];\n        ma.forEach(function(vb) {\n            vb.remove();\n        });\n        ma = [];\n        oa.reset();\n    };\n;\n    function gb() {\n        if (((ja || !ca))) {\n            ka = ((q.getElementPosition(ra, \"viewport\").y - q.getElementPosition(wa, \"viewport\").y));\n        }\n    ;\n    ;\n    };\n;\n    function hb() {\n        gb();\n        var sb = la;\n        lb();\n        if (((sb != la))) {\n            ja = true;\n            mb();\n        }\n    ;\n    ;\n        za = ((xa + q.getElementPosition(qa, \"viewport\").y));\n        var tb = za, ub = q.getElementPosition(va, \"viewport\").y;\n        for (var vb = 0; ((vb < ab.length)); vb++) {\n            var wb = s.getInstance(ab[vb]);\n            wb.hide();\n        };\n    ;\n        if (((da || !ua))) {\n            if (((ia !== null))) {\n                var xb = ((ub + ka)), yb = ((xb <= ((tb - ia))));\n                if (((ja || ((yb !== ca))))) {\n                    ja = false;\n                    var zb = ((((tb - ia)) - ka));\n                    nb(yb, zb);\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            return;\n        }\n    ;\n    ;\n        var ac = ((ub <= ((tb + z))));\n        if (((ac !== ca))) {\n            nb(ac);\n        }\n    ;\n    ;\n    };\n;\n    function ib() {\n        var sb = JSBNG__Date.now();\n        if (((((((fa && !aa)) && w.adsRefreshInterval)) && ((((sb - ga)) >= w.adsRefreshInterval))))) {\n            jb();\n        }\n    ;\n    ;\n    };\n;\n    function jb() {\n        ga = JSBNG__Date.now();\n        k.loadFromEndpoint(\"WebEgoPane\", ra, {\n            pid: 27,\n            data: {\n                organic_only: false,\n                ads_only: false,\n                refresh_num: ++ha\n            }\n        }, {\n            bundle: false,\n            crossPage: false,\n            handler: bb\n        });\n    };\n;\n    function kb() {\n        ja = true;\n        gb();\n        lb();\n        mb();\n        hb();\n    };\n;\n    function lb() {\n        var sb = ((q.getDocumentDimensions().y - ((q.getScrollPosition(\"JSBNG__document\").y + q.getViewportDimensions().y))));\n        la = ((((sb > ya)) ? y : x));\n    };\n;\n    function mb() {\n        var sb = ((((q.getViewportDimensions().y - xa)) - la)), tb = q.getElementDimensions(wa).y;\n        if (((tb <= sb))) {\n            ia = ((((0 - ka)) - z));\n            return;\n        }\n    ;\n    ;\n        var ub = ((tb - ka)), vb = p.scry(ra, \"div.egoOrganicColumn\")[0];\n        if (((((ub <= sb)) && vb))) {\n            ia = 0;\n        }\n         else {\n            var wb = p.scry(ra, \"div.ego_unit\").reverse(), xb = p.scry(ra, \"div._4u8\").length, yb = w.maxFixedAds;\n            if (((xb <= w.maxFixedAds))) {\n                yb = wb.length;\n            }\n        ;\n        ;\n            var zb = null;\n            for (var ac = 0; ((ac < yb)); ac++) {\n                var bc = wb[ac], cc = ((q.getElementPosition(bc, \"viewport\").y - q.getElementPosition(wa, \"viewport\").y)), dc = ((q.getElementDimensions(wa).y - cc));\n                if (((dc > sb))) {\n                    if (((ac > 0))) {\n                        zb = wb[((ac - 1))];\n                    }\n                ;\n                ;\n                    break;\n                }\n            ;\n            ;\n                if (((ac == ((yb - 1))))) {\n                    zb = bc;\n                }\n            ;\n            ;\n            };\n        ;\n            if (((zb == null))) {\n                ia = null;\n            }\n             else ia = ((q.getElementPosition(zb, \"viewport\").y - q.getElementPosition(ra, \"viewport\").y));\n        ;\n        ;\n        }\n    ;\n    ;\n    };\n;\n    function nb(sb, tb) {\n        ca = sb;\n        tb = ((tb || za));\n        var ub = ((sb ? ((tb + \"px\")) : \"\"));\n        m.set(wa, \"JSBNG__top\", ub);\n        o.conditionClass(wa, \"fixed_elem\", sb);\n        var vb = p.scry(wa, \"div.displayedTickerToggleWrapper\")[0];\n        ((vb && o.conditionClass(vb, \"toggleWrapperWithoutMargin\", ((sb && !ua)))));\n        if (ea) {\n            var wb = ((sb ? \"Ticker/fixed\" : \"Ticker/unfixed\"));\n            l.inform(wb);\n        }\n    ;\n    ;\n    };\n;\n    function ob() {\n        if (((((!ea || !ua)) || o.hasClass(JSBNG__document.documentElement, \"tinyViewport\")))) {\n            kb();\n            return;\n        }\n    ;\n    ;\n        hb();\n        var sb = q.getViewportDimensions().y, tb = 61, ub = ((q.getElementDimensions(wa).y - q.getElementDimensions(ta).y)), vb = q.getElementDimensions(ua).y, wb = ((((((((sb - ub)) - x)) - za)) - tb)), xb = ((w.tickerAbsMinHeight || 120)), yb = ((w.tickerMinHeight || 225));\n        da = false;\n        if (((wb < xb))) {\n            da = true;\n            nb(false);\n            wb = xb;\n        }\n         else if (((wb < yb))) {\n            if (((wb > ((yb - tb))))) {\n                wb = yb;\n            }\n             else wb += tb;\n        ;\n        }\n        \n    ;\n    ;\n        var zb = Math.min(wb, vb, ((w.tickerMaxHeight || 425)));\n        m.set(ta, \"height\", ((zb + \"px\")));\n    };\n;\n    function pb() {\n        ea = true;\n        eb();\n        var sb = function() {\n            if (eb()) {\n                da = false;\n                hb();\n                ob();\n            }\n        ;\n        ;\n        };\n        ((sa && t.show(sa, sb)));\n    };\n;\n    function qb() {\n        ea = false;\n        eb();\n        kb();\n        ((sa && t.hide(sa)));\n    };\n;\n    var rb = {\n        init: function(sb) {\n            w = sb;\n            pa = g(\"contentCol\");\n            qa = g(\"blueBar\");\n            ha = 0;\n            ga = Infinity;\n            ga = JSBNG__Date.now();\n            oa = i(ib, w.adsRefreshDelay);\n            if (w.adsRefreshOnmove) {\n                ma.push(v.listen(window, \"mousemove\", oa));\n            }\n        ;\n        ;\n            ma.push(v.listen(window, \"JSBNG__scroll\", oa));\n            ma.push(v.listen(window, \"resize\", oa));\n            ma.push(v.listen(window, \"resize\", j(ob)));\n            xa = q.getElementDimensions(qa).y;\n            ya = q.getElementDimensions(g(\"pageFooter\")).y;\n            eb();\n            cb();\n            r.onLeave(fb);\n            ma.push(v.listen(window, \"JSBNG__scroll\", j(hb)));\n            if (!o.hasClass(JSBNG__document.documentElement, \"sidebarMode\")) {\n                pb();\n            }\n             else if (w.enableSidebar) {\n                qb();\n            }\n            \n        ;\n        ;\n            bb();\n        }\n    };\n    e.exports = rb;\n});\n__d(\"AsyncLayout\", [\"AjaxPipeRequest\",\"Arbiter\",\"AsyncRequest\",\"AsyncResponse\",\"CSS\",\"DOM\",\"HTML\",\"NavigationMessage\",\"PageTransitions\",\"URI\",\"$\",\"copyProperties\",\"emptyFunction\",\"ge\",\"goURI\",], function(a, b, c, d, e, f) {\n    var g = b(\"AjaxPipeRequest\"), h = b(\"Arbiter\"), i = b(\"AsyncRequest\"), j = b(\"AsyncResponse\"), k = b(\"CSS\"), l = b(\"DOM\"), m = b(\"HTML\"), n = b(\"NavigationMessage\"), o = b(\"PageTransitions\"), p = b(\"URI\"), q = b(\"$\"), r = b(\"copyProperties\"), s = b(\"emptyFunction\"), t = b(\"ge\"), u = b(\"goURI\");\n    function v(w) {\n        this.canvasID = w;\n        if (t(\"rightCol\")) {\n            this.auxiliaryID = \"rightCol\";\n        }\n    ;\n    ;\n        if (t(\"headerArea\")) {\n            this.headerID = \"headerArea\";\n        }\n    ;\n    ;\n        if (t(\"toolbarContainer\")) {\n            this.toolbarID = \"toolbarContainer\";\n        }\n    ;\n    ;\n        this.waitingForAux = false;\n        o.registerHandler(this.catchPageTransition.bind(this));\n        this.subscription = h.subscribe(n.NAVIGATION_BEGIN, this.onNavigate.bind(this));\n    };\n;\n    r(v.prototype, {\n        catchPageTransition: function(w) {\n            this.subscription.unsubscribe();\n            return false;\n        },\n        getCanvasID: function(w) {\n            return ((w.sidecol ? \"contentCol\" : \"contentArea\"));\n        },\n        onNavigate: function(w, x) {\n            var y = x.useAjaxPipe;\n            x = x.params;\n            if (x.endpoint) {\n                if (this.request) {\n                    this.request.setFinallyHandler(s);\n                    this.request.abort();\n                }\n            ;\n            ;\n                if (this.sideRequest) {\n                    this.sideRequest.abort();\n                }\n            ;\n            ;\n                if (y) {\n                    this.request = new g().setURI(x.endpoint).setData(x).setCanvasId(this.getCanvasID(x)).setFinallyHandler(this.finallyHandler.bind(this)).setErrorHandler(this.errorHandler.bind(this)).setFirstResponseCallback(this.firstResponseCallback.bind(this)).send();\n                }\n                 else {\n                    x.handled = true;\n                    this.waitingForAux = x.sidecol;\n                    var z = !!x.iframe, aa = new i().setOption(\"useIframeTransport\", z).setURI(new p(x.endpoint)).setReadOnly(true).setMethod(\"GET\").setData(x).setHandler(this.onResponse.bind(this)).setErrorHandler(this.errorHandler.bind(this)).setFinallyHandler(this.finallyHandler.bind(this));\n                    this.request = aa;\n                    aa.send();\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n        },\n        onSideResponse: function(w) {\n            var x = w.getPayload();\n            if (((x && this.auxiliaryID))) {\n                this.receivedAux(x);\n            }\n        ;\n        ;\n        },\n        receivedAux: function(w) {\n            !this.waitingForAux;\n            this.waitingForAux = false;\n            l.setContent(q(this.auxiliaryID), m(w));\n        },\n        onResponse: function(w) {\n            var x = w.getPayload();\n            if (x.redirect) {\n                u(x.redirect);\n            }\n             else {\n                var y = ((x.html || x));\n                l.setContent(q(this.canvasID), m(y));\n                if (((x.side_html && this.auxiliaryID))) {\n                    this.receivedAux(x.side_html);\n                }\n            ;\n            ;\n                if (((this.headerID && !x.keep_header))) {\n                    var z = q(this.headerID);\n                    l.setContent(z, m(((x.header_html || \"\"))));\n                    k.conditionShow(z, x.header_html);\n                }\n            ;\n            ;\n                if (((x.toolbar_html && this.toolbarID))) {\n                    l.setContent(q(this.toolbarID), m(x.toolbar_html));\n                }\n            ;\n            ;\n                if (x.js) {\n                    (new Function(x.js))();\n                }\n            ;\n            ;\n                k.conditionClass(\"contentCol\", \"hasRightCol\", ((this.auxiliaryID && !x.noRightSide)));\n                var aa = t(\"rightCol\");\n                if (((aa && x.noRightSide))) {\n                    l.empty(aa);\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            var ba = w.getRequest().getData();\n            h.inform(n.NAVIGATION_COMPLETED, ba.key);\n        },\n        errorHandler: function(w) {\n            j.verboseErrorHandler(w);\n            h.inform(n.NAVIGATION_FAILED);\n            this.request = null;\n        },\n        firstResponseCallback: function(w) {\n            window.JSBNG__scrollTo(0, 0);\n            h.inform(n.NAVIGATION_FIRST_RESPONSE);\n        },\n        finallyHandler: function(w) {\n            this.request = null;\n            o.transitionComplete(true);\n            h.inform(n.NAVIGATION_COMPLETED);\n        }\n    });\n    e.exports = v;\n});\n__d(\"legacy:adware-scanner\", [\"AdwareScaner\",], function(a, b, c, d) {\n    a.AdwareScaner = b(\"AdwareScaner\");\n}, 3);");
// 2864
geval("if (JSBNG__self.CavalryLogger) {\n    CavalryLogger.start_js([\"u//Ut\",]);\n}\n;\n;\n__d(\"MercuryAPIArgsSource\", [], function(a, b, c, d, e, f) {\n    e.exports = {\n        JEWEL: \"jewel\",\n        CHAT: \"chat\",\n        MERCURY: \"mercury\",\n        WEBMESSENGER: \"web_messenger\"\n    };\n});\n__d(\"MercuryActionStatus\", [], function(a, b, c, d, e, f) {\n    e.exports = {\n        UNCONFIRMED: 3,\n        UNSENT: 0,\n        RESENDING: 7,\n        RESENT: 6,\n        UNABLE_TO_CONFIRM: 5,\n        FAILED_UNKNOWN_REASON: 4,\n        SUCCESS: 1,\n        ERROR: 10\n    };\n});\n__d(\"MercuryActionTypeConstants\", [], function(a, b, c, d, e, f) {\n    e.exports = {\n        LOG_MESSAGE: \"ma-type:log-message\",\n        CLEAR_CHAT: \"ma-type:clear_chat\",\n        UPDATE_ACTION_ID: \"ma-type:update-action-id\",\n        DELETE_MESSAGES: \"ma-type:delete-messages\",\n        CHANGE_FOLDER: \"ma-type:change-folder\",\n        SEND_MESSAGE: \"ma-type:send-message\",\n        CHANGE_ARCHIVED_STATUS: \"ma-type:change-archived-status\",\n        DELETE_THREAD: \"ma-type:delete-thread\",\n        USER_GENERATED_MESSAGE: \"ma-type:user-generated-message\",\n        CHANGE_READ_STATUS: \"ma-type:change_read_status\",\n        CHANGE_MUTE_SETTINGS: \"ma-type:change-mute-settings\"\n    };\n});\n__d(\"MercuryAttachmentContentType\", [], function(a, b, c, d, e, f) {\n    e.exports = {\n        UNKNOWN: \"attach:unknown\",\n        PHOTO: \"attach:image\",\n        VIDEO: \"attach:video\",\n        MSWORD: \"attach:ms:word\",\n        VOICE: \"attach:voice\",\n        MSPPT: \"attach:ms:ppt\",\n        TEXT: \"attach:text\",\n        MUSIC: \"attach:music\",\n        MSXLS: \"attach:ms:xls\"\n    };\n});\n__d(\"MercuryAttachmentType\", [], function(a, b, c, d, e, f) {\n    e.exports = {\n        STICKER: \"sticker\",\n        PHOTO: \"photo\",\n        FILE: \"file\",\n        SHARE: \"share\",\n        ERROR: \"error\"\n    };\n});\n__d(\"MercuryErrorType\", [], function(a, b, c, d, e, f) {\n    e.exports = {\n        SERVER: 1,\n        TRANSPORT: 2,\n        TIMEOUT: 3\n    };\n});\n__d(\"MercuryGenericConstants\", [], function(a, b, c, d, e, f) {\n    e.exports = {\n        PENDING_THREAD_ID: \"pending:pending\"\n    };\n});\n__d(\"MercuryGlobalActionType\", [], function(a, b, c, d, e, f) {\n    e.exports = {\n        MARK_ALL_READ: \"mga-type:mark-all-read\"\n    };\n});\n__d(\"MercuryLogMessageType\", [], function(a, b, c, d, e, f) {\n    e.exports = {\n        SERVER_ERROR: \"log:error-msg\",\n        UNSUBSCRIBE: \"log:unsubscribe\",\n        JOINABLE_JOINED: \"log:joinable-joined\",\n        JOINABLE_CREATED: \"log:joinable-created\",\n        LIVE_LISTEN: \"log:live-listen\",\n        PHONE_CALL: \"log:phone-call\",\n        THREAD_IMAGE: \"log:thread-image\",\n        THREAD_NAME: \"log:thread-name\",\n        VIDEO_CALL: \"log:video-call\",\n        SUBSCRIBE: \"log:subscribe\"\n    };\n});\n__d(\"MercuryMessageSourceTags\", [], function(a, b, c, d, e, f) {\n    e.exports = {\n        CHAT: \"source:chat\",\n        MOBILE: \"source:mobile\",\n        MESSENGER: \"source:messenger\",\n        EMAIL: \"source:email\"\n    };\n});\n__d(\"MercuryParticipantTypes\", [], function(a, b, c, d, e, f) {\n    e.exports = {\n        FRIEND: \"friend\",\n        USER: \"user\",\n        THREAD: \"thread\",\n        EVENT: \"JSBNG__event\",\n        PAGE: \"page\"\n    };\n});\n__d(\"MercuryPayloadSource\", [], function(a, b, c, d, e, f) {\n    e.exports = {\n        SERVER_INITIAL_DATA: \"server_initial_data\",\n        CLIENT_DELETE_THREAD: \"client_delete_thread\",\n        SERVER_ZAP: \"server_zap\",\n        SERVER_SAVE_DRAFT: \"server_save_draft\",\n        SERVER_CHANGE_ARCHIVED_STATUS: \"server_change_archived_status\",\n        SERVER_SEARCH: \"server_search\",\n        CLIENT_CHANGE_MUTE_SETTINGS: \"client_change_mute_settings\",\n        SERVER_UNREAD_THREADS: \"server_unread_threads\",\n        SERVER_MARK_SEEN: \"server_mark_seen\",\n        SERVER_THREAD_SYNC: \"server_thread_sync\",\n        CLIENT_DELETE_MESSAGES: \"client_delete_messages\",\n        SERVER_FETCH_THREADLIST_INFO: \"server_fetch_threadlist_info\",\n        CLIENT_CHANNEL_MESSAGE: \"client_channel_message\",\n        CLIENT_CHANGE_FOLDER: \"client_change_folder\",\n        CLIENT_CHANGE_READ_STATUS: \"client_change_read_status\",\n        CLIENT_CLEAR_CHAT: \"client_clear_chat\",\n        SERVER_FETCH_THREAD_INFO: \"server_fetch_thread_info\",\n        SERVER_CHANGE_READ_STATUS: \"server_change_read_status\",\n        SERVER_SEND_MESSAGE: \"server_send_message\",\n        CLIENT_SAVE_DRAFT: \"client_save_draft\",\n        UNKNOWN: \"unknown\",\n        SERVER_MARK_FOLDER_READ: \"server_mark_folder_read\",\n        SERVER_CONFIRM_MESSAGES: \"server_confirm_messages\",\n        SERVER_TAB_PRESENCE: \"server_tab_presence\",\n        CLIENT_CHANGE_ARCHIVED_STATUS: \"client_change-archived_status\",\n        CLIENT_SEND_MESSAGE: \"client_send_message\",\n        CLIENT_HANDLE_ERROR: \"client_handle_error\"\n    };\n});\n__d(\"MercurySourceType\", [], function(a, b, c, d, e, f) {\n    e.exports = {\n        GIGABOXX_BLAST: \"source:gigaboxx:blast\",\n        TITAN_FACEWEB_BUFFY: \"source:titan:faceweb_buffy\",\n        TITAN_FACEWEB_UNKNOWN: \"source:titan:faceweb_unknown\",\n        CHAT_WEB: \"source:chat:web\",\n        WEBRTC_MOBILE: \"source:webrtc:mobile\",\n        GIGABOXX_API: \"source:gigaboxx:api\",\n        TITAN_M_JAPAN: \"source:titan:m_japan\",\n        BUFFY_SMS: \"source:buffy:sms\",\n        SEND_PLUGIN: \"source:sendplugin\",\n        CHAT_MEEBO: \"source:chat:meebo\",\n        TITAN_FACEWEB_IPAD: \"source:titan:faceweb_ipad\",\n        TITAN_FACEWEB_IPHONE: \"source:titan:faceweb_iphone\",\n        TEST: \"source:test\",\n        WEB: \"source:web\",\n        SOCIALFOX: \"source:socialfox\",\n        EMAIL: \"source:email\",\n        TITAN_API: \"source:titan:api\",\n        GIGABOXX_WEB: \"source:gigaboxx:web\",\n        DESKTOP: \"source:desktop\",\n        TITAN_FACEWEB_ANDROID: \"source:titan:faceweb_android\",\n        LEIA: \"source:leia\",\n        CHAT_JABBER: \"source:chat:jabber\",\n        CHAT_TEST: \"source:chat:test\",\n        SHARE_DIALOG: \"source:share:dialog\",\n        GIGABOXX_WAP: \"source:gigaboxx:wap\",\n        CHAT: \"source:chat\",\n        TITAN_M_APP: \"source:titan:m_app\",\n        TITAN_M_TOUCH: \"source:titan:m_touch\",\n        TITAN_ORCA: \"source:titan:orca\",\n        TITAN_WAP: \"source:titan:wap\",\n        TITAN_EMAIL_REPLY: \"source:titan:emailreply\",\n        CHAT_IPHONE: \"source:chat:iphone\",\n        SMS: \"source:sms\",\n        TITAN_M_BASIC: \"source:titan:m_basic\",\n        TITAN_M_MINI: \"source:titan:m_mini\",\n        GIGABOXX_MOBILE: \"source:gigaboxx:mobile\",\n        UNKNOWN: \"source:unknown\",\n        TITAN_WEB: \"source:titan:web\",\n        TITAN_M_ZERO: \"source:titan:m_zero\",\n        MOBILE: \"source:mobile\",\n        PAID_PROMOTION: \"source:paid_promotion\",\n        TITAN_API_MOBILE: \"source:titan:api_mobile\",\n        HELPCENTER: \"source:helpcenter\",\n        GIGABOXX_EMAIL_REPLY: \"source:gigaboxx:emailreply\",\n        CHAT_ORCA: \"source:chat:orca\",\n        TITAN_M_TALK: \"source:titan:m_talk\",\n        NEW_SHARE_DIALOG: \"source:share:dialog:new\"\n    };\n});\n__d(\"MercuryThreadMode\", [], function(a, b, c, d, e, f) {\n    e.exports = {\n        EMAIL_ORIGINATED: 1,\n        OBJECT_ORIGINATED: 3,\n        TITAN_ORIGINATED: 2\n    };\n});\n__d(\"MercuryTimePassed\", [], function(a, b, c, d, e, f) {\n    e.exports = {\n        TODAY: 0,\n        WEEK_AGO: 1,\n        CURRENT_YEAR: 3,\n        OTHER_YEAR: 4,\n        MONTH_AGO: 2\n    };\n});\n__d(\"MessagingEvent\", [], function(a, b, c, d, e, f) {\n    e.exports = {\n        UNSUBSCRIBE: \"unsubscribe\",\n        DELIVERY_RECEIPT: \"delivery_receipt\",\n        REPORT_SPAM_MESSAGES: \"report_spam_messages\",\n        DELIVER_FAST_PAST: \"deliver_fast_path\",\n        DELETE_MESSAGES: \"delete_messages\",\n        READ_RECEIPT: \"read_receipt\",\n        SENT_PUSH: \"sent_push\",\n        READ: \"read\",\n        CHANGE_MUTE_SETTINGS: \"change_mute_settings\",\n        ERROR: \"error\",\n        UNMARK_SPAM: \"unmark_spam\",\n        UNREAD: \"unread\",\n        DELIVER_LOG: \"deliver_log\",\n        DELIVER: \"deliver\",\n        READ_ALL: \"read_all\",\n        TAG: \"tag\",\n        MORE_THREADS: \"more_threads\",\n        DELETE: \"delete\",\n        REPORT_SPAM: \"report_spam\",\n        SUBSCRIBE: \"subscribe\"\n    };\n});\n__d(\"MessagingTag\", [], function(a, b, c, d, e, f) {\n    e.exports = {\n        MTA_SYSTEM_MESSAGE: \"MTA:system_message\",\n        SENT: \"sent\",\n        INBOX: \"inbox\",\n        SMS_TAG_ROOT: \"SMSShortcode:\",\n        UPDATES: \"broadcasts_inbox\",\n        OTHER: \"other\",\n        GROUPS: \"groups\",\n        FILTERED_CONTENT: \"filtered_content\",\n        ACTION_ARCHIVED: \"action:archived\",\n        UNREAD: \"unread\",\n        BCC: \"header:bcc\",\n        SMS_MUTE: \"sms_mute\",\n        ARCHIVED: \"archived\",\n        DOMAIN_AUTH_PASS: \"MTA:dmarc:pass\",\n        EVENT: \"JSBNG__event\",\n        VOICEMAIL: \"voicemail\",\n        DOMAIN_AUTH_FAIL: \"MTA:dmarc:fail\",\n        SPAM_SPOOFING: \"spam:spoofing\",\n        SPOOF_WARNING: \"MTA:spoof_warning\",\n        SPAM: \"spam\",\n        EMAIL_MESSAGE: \"source:email\",\n        EMAIL: \"email\",\n        APP_ID_ROOT: \"app_id:\"\n    };\n});\n__d(\"AvailableListConstants\", [], function(a, b, c, d, e, f) {\n    var g = {\n        ON_AVAILABILITY_CHANGED: \"buddylist/availability-changed\",\n        ON_UPDATE_ERROR: \"buddylist/update-error\",\n        ON_UPDATED: \"buddylist/updated\",\n        ON_CHAT_NOTIFICATION_CHANGED: \"chat-notification-changed\",\n        OFFLINE: 0,\n        IDLE: 1,\n        ACTIVE: 2,\n        MOBILE: 3,\n        LEGACY_OVERLAY_OFFLINE: -1,\n        LEGACY_OVERLAY_ONLINE: 0,\n        LEGACY_OVERLAY_IDLE: 1,\n        legacyStatusMap: {\n            0: 2,\n            1: 1,\n            \"-1\": 0,\n            2: 3\n        },\n        reverseLegacyStatusMap: {\n            0: -1,\n            1: 1,\n            2: 0,\n            3: 2\n        }\n    };\n    a.AvailableListConstants = e.exports = g;\n});\n__d(\"PresenceUtil\", [\"Cookie\",\"Env\",\"randomInt\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Cookie\"), h = b(\"Env\"), i = b(\"randomInt\"), j = b(\"tx\"), k = ((i(0, 4294967295) + 1)), l = {\n        checkMaintenanceError: function(m) {\n            if (((m.getError() == 1356007))) {\n                return true;\n            }\n        ;\n        ;\n            return false;\n        },\n        getErrorDescription: function(m) {\n            var n = m.getError(), o = m.getErrorDescription();\n            if (!o) {\n                o = \"An error occurred.\";\n            }\n        ;\n        ;\n            if (((n == 1357001))) {\n                o = \"Your session has timed out. Please log in.\";\n            }\n        ;\n        ;\n            return o;\n        },\n        getSessionID: function() {\n            return k;\n        },\n        hasUserCookie: function() {\n            return ((h.user === g.get(\"c_user\")));\n        }\n    };\n    e.exports = l;\n});\n__d(\"PresencePrivacy\", [\"hasArrayNature\",\"Arbiter\",\"AsyncRequest\",\"ChannelConstants\",\"copyProperties\",\"Env\",\"JSLogger\",\"PresenceUtil\",\"PresencePrivacyInitialData\",], function(a, b, c, d, e, f) {\n    var g = b(\"hasArrayNature\"), h = b(\"Arbiter\"), i = b(\"AsyncRequest\"), j = b(\"ChannelConstants\"), k = b(\"copyProperties\"), l = b(\"Env\"), m = b(\"JSLogger\"), n = b(\"PresenceUtil\"), o = b(\"PresencePrivacyInitialData\"), p = \"/ajax/chat/privacy/settings.php\", q = \"/ajax/chat/privacy/online_policy.php\", r = \"/ajax/chat/privacy/visibility.php\", s = \"friend_visibility\", t = \"visibility\", u = \"online_policy\", v = k({\n    }, o.privacyData), w = o.visibility, x = k({\n    }, o.privacyData), y = w, z = o.onlinePolicy, aa = z, ba = [], ca = false;\n    function da() {\n        return m.create(\"blackbird\");\n    };\n;\n    var ea = k(new h(), {\n        WHITELISTED: 1,\n        BLACKLISTED: -1,\n        UNLISTED: 0,\n        ONLINE: 1,\n        OFFLINE: 0,\n        ONLINE_TO_WHITELIST: 0,\n        ONLINE_TO_BLACKLIST: 1\n    });\n    function fa(ra) {\n        var sa;\n        {\n            var fin211keys = ((window.top.JSBNG_Replay.forInKeys)((ra))), fin211i = (0);\n            (0);\n            for (; (fin211i < fin211keys.length); (fin211i++)) {\n                ((sa) = (fin211keys[fin211i]));\n                {\n                    var ta = ra[sa];\n                    if (((sa == l.user))) {\n                        da().error(\"set_viewer_visibility\");\n                        throw new Error(\"Invalid to set current user's visibility\");\n                    }\n                ;\n                ;\n                    switch (ta) {\n                      case ea.WHITELISTED:\n                    \n                      case ea.BLACKLISTED:\n                    \n                      case ea.UNLISTED:\n                        break;\n                      default:\n                        da().error(\"set_invalid_friend_visibility\", {\n                            id: sa,\n                            value: ta\n                        });\n                        throw new Error(((\"Invalid state: \" + ta)));\n                    };\n                ;\n                };\n            };\n        };\n    ;\n        {\n            var fin212keys = ((window.top.JSBNG_Replay.forInKeys)((ra))), fin212i = (0);\n            (0);\n            for (; (fin212i < fin212keys.length); (fin212i++)) {\n                ((sa) = (fin212keys[fin212i]));\n                {\n                    v[sa] = ra[sa];\n                ;\n                };\n            };\n        };\n    ;\n        ea.inform(\"privacy-changed\");\n    };\n;\n    function ga(ra, sa) {\n        var ta = {\n        };\n        ta[ra] = sa;\n        fa(ta);\n    };\n;\n    function ha(ra) {\n        switch (ra) {\n          case ea.ONLINE:\n        \n          case ea.OFFLINE:\n            break;\n          default:\n            da().error(\"set_invalid_visibility\", {\n                value: ra\n            });\n            throw new Error(((\"Invalid visibility: \" + ra)));\n        };\n    ;\n        w = ra;\n        ea.inform(\"privacy-changed\");\n        ea.inform(\"privacy-user-presence-changed\");\n        h.inform(\"chat/visibility-changed\", {\n            sender: this\n        });\n    };\n;\n    function ia(ra) {\n        switch (ra) {\n          case ea.ONLINE_TO_WHITELIST:\n        \n          case ea.ONLINE_TO_BLACKLIST:\n            break;\n          default:\n            throw new Error(((\"Invalid default online policy: \" + ra)));\n        };\n    ;\n        z = ra;\n        ea.inform(\"privacy-user-presence-changed\");\n        ea.inform(\"privacy-changed\");\n    };\n;\n    function ja(ra, sa) {\n        ca = true;\n        ra.send();\n    };\n;\n    function ka(ra, sa) {\n        ba.push({\n            request: ra,\n            data: sa\n        });\n        if (!ca) {\n            var ta = ba.shift();\n            ja(ta.request, ta.data);\n        }\n    ;\n    ;\n    };\n;\n    function la(ra, sa) {\n        var ta = ra.type;\n        if (((ta === s))) {\n            var ua = sa.payload.user_availabilities;\n            if (!g(ua)) {\n                ea.inform(\"privacy-availability-changed\", {\n                    user_availabilities: ua\n                });\n                {\n                    var fin213keys = ((window.top.JSBNG_Replay.forInKeys)((ra.settings))), fin213i = (0);\n                    var va;\n                    for (; (fin213i < fin213keys.length); (fin213i++)) {\n                        ((va) = (fin213keys[fin213i]));\n                        {\n                            x[va] = ra.settings[va];\n                        ;\n                        };\n                    };\n                };\n            ;\n            }\n        ;\n        ;\n        }\n         else {\n            if (((ta === t))) {\n                y = ra.visibility;\n            }\n             else if (((ta === u))) {\n                aa = ra.online_policy;\n            }\n            \n        ;\n        ;\n            ea.inform(\"privacy-user-presence-response\");\n        }\n    ;\n    ;\n        da().log(\"set_update_response\", {\n            data: ra,\n            response: sa\n        });\n    };\n;\n    function ma(ra, sa) {\n        if (((w !== y))) {\n            ha(y);\n        }\n    ;\n    ;\n        if (((z !== aa))) {\n            ia(aa);\n        }\n    ;\n    ;\n        k(v, x);\n        ea.inform(\"privacy-changed\");\n        ba = [];\n        da().log(\"set_error_response\", {\n            data: ra,\n            response: sa\n        });\n    };\n;\n    function na(ra) {\n        ca = false;\n        if (((ba.length > 0))) {\n            var sa = ba.shift();\n            ja(sa.request, sa.data);\n        }\n    ;\n    ;\n    };\n;\n    function oa(ra, sa) {\n        if (((n != null))) {\n            var ta = ra.getData();\n            ta.window_id = n.getSessionID();\n            ra.setData(ta);\n        }\n    ;\n    ;\n        ra.setHandler(la.bind(this, sa)).setErrorHandler(ma.bind(this, sa)).setTransportErrorHandler(ma.bind(this, sa)).setFinallyHandler(na.bind(this)).setAllowCrossPageTransition(true);\n        return ra;\n    };\n;\n    function pa(ra, sa, ta) {\n        return oa(new i(ra).setData(sa), ta);\n    };\n;\n    function qa(ra, sa) {\n        var ta = sa.obj;\n        if (((ta.viewer_id != l.user))) {\n            da().error(\"invalid_viewer_for_channel_message\", {\n                type: ra,\n                data: sa\n            });\n            throw new Error(\"Viewer got from the channel is not the real viewer\");\n        }\n    ;\n    ;\n        if (((ta.window_id === n.getSessionID()))) {\n            return;\n        }\n    ;\n    ;\n        var ua = ta.data;\n        if (((ta.JSBNG__event == \"access_control_entry\"))) {\n            ua.target_ids.forEach(function(wa) {\n                ga(wa, ua.setting);\n                x[wa] = ua.setting;\n            });\n        }\n         else {\n            if (((ta.JSBNG__event == \"visibility_update\"))) {\n                var va = ((!!ua.visibility ? ea.ONLINE : ea.OFFLINE));\n                ha(va);\n                y = va;\n            }\n             else if (((ta.JSBNG__event == \"online_policy_update\"))) {\n                ia(ua.online_policy);\n                aa = ua.online_policy;\n            }\n            \n        ;\n        ;\n            ea.inform(\"privacy-user-presence-response\");\n        }\n    ;\n    ;\n        da().log(\"channel_message_received\", {\n            data: sa.obj\n        });\n    };\n;\n    k(ea, {\n        WHITELISTED: 1,\n        BLACKLISTED: -1,\n        UNLISTED: 0,\n        ONLINE: 1,\n        OFFLINE: 0,\n        ONLINE_TO_WHITELIST: 0,\n        ONLINE_TO_BLACKLIST: 1,\n        init: function(ra, sa, ta) {\n        \n        },\n        setVisibility: function(ra) {\n            y = w;\n            ha(ra);\n            var sa = {\n                visibility: ra\n            }, ta = {\n                type: t,\n                visibility: ra\n            }, ua = pa(r, sa, ta);\n            ka(ua, ta);\n            da().log(\"set_visibility\", {\n                data: sa\n            });\n            return ra;\n        },\n        getVisibility: function() {\n            return w;\n        },\n        setOnlinePolicy: function(ra) {\n            aa = z;\n            ia(ra);\n            var sa = {\n                online_policy: ra\n            }, ta = {\n                type: u,\n                online_policy: ra\n            }, ua = pa(q, sa, ta);\n            ka(ua, ta);\n            da().log(\"set_online_policy\", {\n                data: sa\n            });\n            return ra;\n        },\n        getOnlinePolicy: function() {\n            return z;\n        },\n        getFriendVisibility: function(ra) {\n            return ((v[ra] || ea.UNLISTED));\n        },\n        allows: function(ra) {\n            if (((this.getVisibility() === ea.OFFLINE))) {\n                return false;\n            }\n        ;\n        ;\n            var sa = this.getOnlinePolicy();\n            return ((((sa === ea.ONLINE_TO_WHITELIST)) ? ((v[ra] == ea.WHITELISTED)) : ((v[ra] != ea.BLACKLISTED))));\n        },\n        setFriendsVisibility: function(ra, sa) {\n            if (((ra.length > 0))) {\n                var ta = {\n                };\n                for (var ua = 0; ((ua < ra.length)); ua++) {\n                    var va = ra[ua];\n                    x[va] = v[va];\n                    ta[va] = sa;\n                };\n            ;\n                fa(ta);\n                var wa = sa;\n                if (((wa == ea.UNLISTED))) {\n                    wa = x[ra[0]];\n                }\n            ;\n            ;\n                var xa = {\n                    users: ra,\n                    setting: sa,\n                    setting_type: wa\n                }, ya = {\n                    type: s,\n                    settings: ta\n                }, za = pa(p, xa, ya);\n                ka(za, ya);\n                da().log(\"set_friend_visibility\", {\n                    data: xa\n                });\n            }\n        ;\n        ;\n            return sa;\n        },\n        setFriendVisibilityMap: function(ra, sa) {\n            {\n                var fin214keys = ((window.top.JSBNG_Replay.forInKeys)((ra))), fin214i = (0);\n                var ta;\n                for (; (fin214i < fin214keys.length); (fin214i++)) {\n                    ((ta) = (fin214keys[fin214i]));\n                    {\n                        x[ta] = v[ta];\n                    ;\n                    };\n                };\n            };\n        ;\n            fa(ra);\n            var ua = {\n                type: s,\n                settings: ra\n            };\n            ka(oa(sa, ua), ua);\n            da().log(\"set_friend_visibility_from_map\", {\n                data: ra\n            });\n        },\n        allow: function(ra) {\n            if (this.allows(ra)) {\n                da().error(\"allow_already_allowed\");\n                throw new Error(((\"allow() should only be called for users that \" + \"are not already allowed\")));\n            }\n        ;\n        ;\n            if (((this.getVisibility() === ea.OFFLINE))) {\n                da().error(\"allow_called_while_offline\");\n                throw new Error(\"allow() should only be called when the user is already online\");\n            }\n        ;\n        ;\n            var sa = ((((this.getOnlinePolicy() === ea.ONLINE_TO_WHITELIST)) ? ea.WHITELISTED : ea.UNLISTED));\n            return this.setFriendsVisibility([ra,], sa);\n        },\n        disallow: function(ra) {\n            if (!this.allows(ra)) {\n                da().error(\"disallow_already_disallowed\");\n                throw new Error(((\"disallow() should only be called for users that \" + \"are not already disallowed\")));\n            }\n        ;\n        ;\n            if (((this.getVisibility() === ea.OFFLINE))) {\n                da().error(\"disallow_called_while_offline\");\n                throw new Error(\"disallow() should only be called when the user is already online\");\n            }\n        ;\n        ;\n            var sa = ((((this.getOnlinePolicy() === ea.ONLINE_TO_BLACKLIST)) ? ea.BLACKLISTED : ea.UNLISTED));\n            return this.setFriendsVisibility([ra,], sa);\n        },\n        getBlacklist: function() {\n            var ra = [];\n            {\n                var fin215keys = ((window.top.JSBNG_Replay.forInKeys)((v))), fin215i = (0);\n                var sa;\n                for (; (fin215i < fin215keys.length); (fin215i++)) {\n                    ((sa) = (fin215keys[fin215i]));\n                    {\n                        if (((v[sa] === ea.BLACKLISTED))) {\n                            ra.push(sa);\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            return ra;\n        },\n        getWhitelist: function() {\n            var ra = [];\n            {\n                var fin216keys = ((window.top.JSBNG_Replay.forInKeys)((v))), fin216i = (0);\n                var sa;\n                for (; (fin216i < fin216keys.length); (fin216i++)) {\n                    ((sa) = (fin216keys[fin216i]));\n                    {\n                        if (((v[sa] === ea.WHITELISTED))) {\n                            ra.push(sa);\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            return ra;\n        },\n        getMapForTest: function() {\n            return v;\n        },\n        setMapForTest: function(ra) {\n            v = ra;\n        }\n    });\n    ea.inform(\"privacy-changed\");\n    ea.inform(\"privacy-user-presence-changed\");\n    da().log(\"initialized\", {\n        visibility: w,\n        policy: z\n    });\n    h.subscribe(j.getArbiterType(\"privacy_changed\"), qa.bind(this));\n    h.subscribe(j.ON_CONFIG, function(ra, sa) {\n        var ta = sa.getConfig(\"visibility\", null);\n        if (((((ta !== null)) && ((typeof (ta) !== \"undefined\"))))) {\n            var ua = ((ta ? ea.ONLINE : ea.OFFLINE));\n            ha(ua);\n            da().log(\"config_visibility\", {\n                vis: ua\n            });\n        }\n    ;\n    ;\n    }.bind(this));\n    a.PresencePrivacy = e.exports = ea;\n}, 3);\n__d(\"ChatVisibility\", [\"Arbiter\",\"JSLogger\",\"PresencePrivacy\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"JSLogger\"), i = b(\"PresencePrivacy\"), j = {\n        isOnline: function() {\n            return ((i.getVisibility() === i.ONLINE));\n        },\n        hasBlackbirdEnabled: function() {\n            return ((this.isVisibleToMostFriends() || this.isVisibleToSomeFriends()));\n        },\n        isVisibleToMostFriends: function() {\n            return ((((i.getOnlinePolicy() === i.ONLINE_TO_BLACKLIST)) && ((i.getBlacklist().length > 0))));\n        },\n        isVisibleToSomeFriends: function() {\n            return ((((i.getOnlinePolicy() === i.ONLINE_TO_WHITELIST)) && ((i.getWhitelist().length > 0))));\n        },\n        goOnline: function(k) {\n            if (((i.getVisibility() === i.OFFLINE))) {\n                h.create(\"blackbird\").log(\"chat_go_online\");\n                i.setVisibility(i.ONLINE);\n                g.inform(\"chat-visibility/go-online\");\n            }\n        ;\n        ;\n            ((k && k()));\n        },\n        goOffline: function(k) {\n            if (((i.getVisibility() === i.ONLINE))) {\n                h.create(\"blackbird\").log(\"chat_go_offline\");\n                i.setVisibility(i.OFFLINE);\n                g.inform(\"chat-visibility/go-offline\");\n            }\n        ;\n        ;\n            ((k && k()));\n        },\n        toggleVisibility: function() {\n            if (j.isOnline()) {\n                j.goOffline();\n            }\n             else j.goOnline();\n        ;\n        ;\n        }\n    };\n    a.ChatVisibility = e.exports = j;\n}, 3);\n__d(\"MercuryIDs\", [], function(a, b, c, d, e, f) {\n    function g(i) {\n        return ((((typeof i === \"string\")) && ((i.indexOf(\":\") !== -1))));\n    };\n;\n    var h = {\n        isValid: function(i) {\n            if (!i) {\n                return false;\n            }\n        ;\n        ;\n            return g(i);\n        },\n        isValidThreadID: function(i) {\n            if (!h.isValid(i)) {\n                return false;\n            }\n        ;\n        ;\n            var j = h.tokenize(i);\n            switch (j.type) {\n              case \"user\":\n            \n              case \"group\":\n            \n              case \"thread\":\n            \n              case \"root\":\n            \n              case \"pending\":\n                return true;\n              default:\n                return false;\n            };\n        ;\n        },\n        tokenize: function(i) {\n            if (!this.isValid(i)) {\n                throw \"bad_id_format\";\n            }\n        ;\n        ;\n            var j = i.indexOf(\":\");\n            return {\n                type: i.substr(0, j),\n                value: i.substr(((j + 1)))\n            };\n        },\n        getUserIDFromParticipantID: function(i) {\n            if (!h.isValid(i)) {\n                return null;\n            }\n        ;\n        ;\n            var j = h.tokenize(i);\n            if (((j.type != \"fbid\"))) {\n                return null;\n            }\n        ;\n        ;\n            return j.value;\n        }\n    };\n    e.exports = h;\n});\n__d(\"MercuryAssert\", [\"MercuryIDs\",], function(a, b, c, d, e, f) {\n    var g = b(\"MercuryIDs\");\n    e.exports = {\n        isParticipantID: function(h) {\n            if (!g.isValid(h)) {\n                throw \"bad_participant_id\";\n            }\n        ;\n        ;\n        },\n        allParticipantIDs: function(h) {\n            h.forEach(this.isParticipantID);\n        },\n        isUserParticipantID: function(h) {\n            var i = g.tokenize(h);\n            if (((i.type != \"fbid\"))) {\n                throw \"bad_user_id\";\n            }\n        ;\n        ;\n        },\n        isEmailParticipantID: function(h) {\n            var i = g.tokenize(h);\n            if (((i.type != \"email\"))) {\n                throw \"bad_email_id\";\n            }\n        ;\n        ;\n        },\n        allThreadID: function(h) {\n            h.forEach(this.isThreadID);\n        },\n        isThreadID: function(h) {\n            if (!g.isValid(h)) {\n                throw \"bad_thread_id\";\n            }\n        ;\n        ;\n        }\n    };\n});\n__d(\"MercurySingletonMixin\", [\"Env\",], function(a, b, c, d, e, f) {\n    var g = b(\"Env\"), h = {\n        _getInstances: function() {\n            if (!this._instances) {\n                this._instances = {\n                };\n            }\n        ;\n        ;\n            return this._instances;\n        },\n        get: function() {\n            return this.getForFBID(g.user);\n        },\n        getForFBID: function(i) {\n            var j = this._getInstances();\n            if (!j[i]) {\n                j[i] = new this(i);\n            }\n        ;\n        ;\n            return j[i];\n        }\n    };\n    e.exports = h;\n});\n__d(\"MercuryMessageIDs\", [\"KeyedCallbackManager\",], function(a, b, c, d, e, f) {\n    var g = b(\"KeyedCallbackManager\"), h = new g(), i = {\n        getServerIDs: function(j, k) {\n            var l = j.filter(function(n) {\n                return ((n.indexOf(\"mail.projektitan.com\") !== -1));\n            }), m = function(n) {\n                var o = j.map(function(p) {\n                    return ((n[p] ? n[p] : p));\n                });\n                k(o);\n            };\n            return h.executeOrEnqueue(l, m);\n        },\n        addServerID: function(j, k) {\n            h.setResource(j, k);\n        }\n    };\n    e.exports = i;\n});\n__d(\"ImageSourceType\", [], function(a, b, c, d, e, f) {\n    var g = {\n        PROFILE_PICTURE: \"profile_picture\",\n        IMAGE: \"image\"\n    };\n    e.exports = g;\n});\n__d(\"PhotoResizeModeConst\", [], function(a, b, c, d, e, f) {\n    var g = {\n        COVER: \"s\",\n        CONTAIN: \"p\"\n    };\n    e.exports = g;\n});\n__d(\"ImageSourceRequest\", [\"arrayContains\",\"extendArray\",\"copyProperties\",\"Env\",\"KeyedCallbackManager\",\"ImageSourceType\",\"PhotoResizeModeConst\",\"MercuryServerDispatcher\",], function(a, b, c, d, e, f) {\n    var g = b(\"arrayContains\"), h = b(\"extendArray\"), i = b(\"copyProperties\"), j = b(\"Env\"), k = b(\"KeyedCallbackManager\"), l = b(\"ImageSourceType\"), m = b(\"PhotoResizeModeConst\"), n = b(\"MercuryServerDispatcher\");\n    function o() {\n        this._request = {\n            fbid: null,\n            type: null,\n            width: null,\n            height: null,\n            resize_mode: null\n        };\n        this._callback = null;\n    };\n;\n    i(o.prototype, {\n        setFBID: function(s) {\n            this._request.fbid = s;\n            return this;\n        },\n        setType: function(s) {\n            if (!g([l.PROFILE_PICTURE,l.IMAGE,], s)) {\n                throw new TypeError(((\"ImageSourceRequest.setType: invalid type \" + s)));\n            }\n        ;\n        ;\n            this._request.type = s;\n            return this;\n        },\n        setDimensions: function(s, t) {\n            this._request.width = s;\n            this._request.height = t;\n            return this;\n        },\n        setResizeMode: function(s) {\n            if (!g([m.COVER,m.CONTAIN,], s)) {\n                throw new TypeError(((\"ImageSourceRequest.setResizeMode: invalid resize mode \" + s)));\n            }\n        ;\n        ;\n            this._request.resize_mode = s;\n            return this;\n        },\n        setCallback: function(s) {\n            this._callback = s;\n            return this;\n        },\n        send: function() {\n            if (((((((((((!this._request.fbid || !this._request.width)) || !this._request.height)) || !this._request.type)) || !this._request.resize_mode)) || !this._callback))) {\n                throw new Error(\"ImageSourceRequest: You must set all the fields\");\n            }\n        ;\n        ;\n            var s = q(), t = r(this._request);\n            s.executeOrEnqueue(t, this._callback);\n            if (((s.getUnavailableResourcesFromRequest(t).length === 1))) {\n                n.trySend(\"/ajax/image_source.php\", {\n                    requests: [this._request,]\n                });\n                return true;\n            }\n        ;\n        ;\n            return false;\n        }\n    });\n    var p = null;\n    function q() {\n        if (p) {\n            return p;\n        }\n    ;\n    ;\n        var s = new k();\n        p = s;\n        n.registerEndpoints({\n            \"/ajax/image_source.php\": {\n                request_user_id: j.user,\n                mode: n.BATCH_DEFERRED_MULTI,\n                batch_function: function(t, u) {\n                    h(t.requests, u.requests);\n                    return t;\n                },\n                handler: function(t, u) {\n                    var v = u.getData().requests;\n                    for (var w = 0; ((w < v.length)); ++w) {\n                        s.setResource(r(v[w]), t[w]);\n                    ;\n                    };\n                ;\n                }\n            }\n        });\n        return s;\n    };\n;\n    function r(s) {\n        return [s.fbid,s.type,s.width,s.height,s.resize_mode,].join(\"|\");\n    };\n;\n    e.exports = o;\n});\n__d(\"TimestampConverter\", [\"JSLogger\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSLogger\"), h = g.create(\"timestamp_converter\");\n    function i(k) {\n        return ((((typeof (k) == \"string\")) && ((k.length > 6))));\n    };\n;\n    var j = {\n        convertActionIDToTimestamp: function(k) {\n            if (i(k)) {\n                var l = k.slice(0, -6);\n                return parseInt(l, 10);\n            }\n        ;\n        ;\n        },\n        maxValidActionID: function(k, l) {\n            if (!i(k)) {\n                return l;\n            }\n        ;\n        ;\n            if (!i(l)) {\n                return k;\n            }\n        ;\n        ;\n            return ((this.isGreaterThan(k, l) ? k : l));\n        },\n        isGreaterThan: function(k, l) {\n            if (((!i(k) || !i(l)))) {\n                return false;\n            }\n        ;\n        ;\n            return ((this.convertActionIDToTimestamp(k) > this.convertActionIDToTimestamp(l)));\n        }\n    };\n    e.exports = j;\n});\n__d(\"MessagingReliabilityLogger\", [\"function-extensions\",\"PresenceUtil\",\"MercuryServerDispatcher\",\"MessagingReliabilityLoggerInitialData\",\"isEmpty\",\"setTimeoutAcrossTransitions\",], function(a, b, c, d, e, f) {\n    b(\"function-extensions\");\n    var g = b(\"PresenceUtil\"), h = b(\"MercuryServerDispatcher\"), i = b(\"MessagingReliabilityLoggerInitialData\"), j = b(\"isEmpty\"), k = b(\"setTimeoutAcrossTransitions\"), l = \"/ajax/mercury/client_reliability.php\", m = 60000;\n    function n(t, u) {\n        var v = {\n            app: i.app,\n            categories: JSON.stringify(t)\n        };\n        if (!j(u)) {\n            v.extra = JSON.stringify(u);\n        }\n    ;\n    ;\n        return v;\n    };\n;\n    function o(t, u, v, w) {\n        if (((t[u] === undefined))) {\n            t[u] = {\n            };\n        }\n    ;\n    ;\n        if (((t[u][v] === undefined))) {\n            t[u][v] = 0;\n        }\n    ;\n    ;\n        t[u][v] += w;\n    };\n;\n    function p(t, u, v, w) {\n        if (((t[u] === undefined))) {\n            t[u] = {\n            };\n        }\n    ;\n    ;\n        if (((t[u][v] === undefined))) {\n            t[u][v] = [];\n        }\n    ;\n    ;\n        for (var x = 0; ((x < w.length)); ++x) {\n            t[u][v].push(w[x]);\n        ;\n        };\n    ;\n    };\n;\n    function q(t, u) {\n        if (((((t && !t.categories)) || ((u && !u.categories))))) {\n            return;\n        }\n    ;\n    ;\n        var v = ((t ? JSON.parse(t.categories) : {\n        })), w = ((((t && t.extra)) ? JSON.parse(t.extra) : {\n        })), x = JSON.parse(u.categories), y = ((u.extra ? JSON.parse(u.extra) : {\n        }));\n        {\n            var fin217keys = ((window.top.JSBNG_Replay.forInKeys)((x))), fin217i = (0);\n            var z;\n            for (; (fin217i < fin217keys.length); (fin217i++)) {\n                ((z) = (fin217keys[fin217i]));\n                {\n                    var aa = x[z], ba = y[z];\n                    {\n                        var fin218keys = ((window.top.JSBNG_Replay.forInKeys)((aa))), fin218i = (0);\n                        var ca;\n                        for (; (fin218i < fin218keys.length); (fin218i++)) {\n                            ((ca) = (fin218keys[fin218i]));\n                            {\n                                o(v, z, ca, aa[ca]);\n                                if (((ba !== undefined))) {\n                                    var da = ba[ca];\n                                    if (((da !== undefined))) {\n                                        p(w, z, ca, da);\n                                    }\n                                ;\n                                ;\n                                }\n                            ;\n                            ;\n                            };\n                        };\n                    };\n                ;\n                };\n            };\n        };\n    ;\n        return n(v, w);\n    };\n;\n    var r = {\n    };\n    r[l] = {\n        mode: h.BATCH_SUCCESSIVE_PIGGYBACK_ON_ERROR,\n        batch_function: q\n    };\n    h.registerEndpoints(r);\n    var s = {\n        addEntry: function(t, u, v) {\n            if (!i.enabled) {\n                return;\n            }\n        ;\n        ;\n            var w = {\n            };\n            o(w, t, u, 1);\n            var x = {\n            };\n            if (((v !== undefined))) {\n                p(x, t, u, [v,]);\n            }\n        ;\n        ;\n            h.trySend(l, n(w, x));\n        }\n    };\n    (function t() {\n        s.addEntry(\"page_event\", \"active\", g.getSessionID());\n        k(t, m);\n    })();\n    e.exports = s;\n});\n__d(\"MercuryThreadInformer\", [\"ArbiterMixin\",\"copyProperties\",\"MercuryAssert\",\"MercurySingletonMixin\",], function(a, b, c, d, e, f) {\n    var g = b(\"ArbiterMixin\"), h = b(\"copyProperties\"), i = b(\"MercuryAssert\"), j = b(\"MercurySingletonMixin\");\n    function k(m) {\n        if (!m._locked) {\n            var n = m._threadDeletions, o = m._threadChanges, p = m._threadReadChanges, q = m._threadlistChanged, r = m._unseenStateChanged, s = m._unreadStateChanged, t = m._receivedMessages, u = m._reorderedMessages, v = m._updatedMessages;\n            m._threadDeletions = {\n            };\n            m._threadChanges = {\n            };\n            m._threadReadChanges = {\n            };\n            m._threadlistChanged = false;\n            m._unseenStateChanged = false;\n            m._unreadStateChanged = false;\n            m._receivedMessages = {\n            };\n            m._reorderedMessages = {\n            };\n            m._updatedMessages = {\n            };\n            var w = Object.keys(o);\n            if (((w.length || q))) {\n                m.inform(\"threadlist-updated\", w);\n            }\n        ;\n        ;\n            if (w.length) {\n                m.inform(\"threads-updated\", o);\n            }\n        ;\n        ;\n            {\n                var fin219keys = ((window.top.JSBNG_Replay.forInKeys)((p))), fin219i = (0);\n                var x;\n                for (; (fin219i < fin219keys.length); (fin219i++)) {\n                    ((x) = (fin219keys[fin219i]));\n                    {\n                        m.inform(\"thread-read-changed\", p);\n                        break;\n                    };\n                };\n            };\n        ;\n            {\n                var fin220keys = ((window.top.JSBNG_Replay.forInKeys)((n))), fin220i = (0);\n                var x;\n                for (; (fin220i < fin220keys.length); (fin220i++)) {\n                    ((x) = (fin220keys[fin220i]));\n                    {\n                        m.inform(\"threads-deleted\", n);\n                        break;\n                    };\n                };\n            };\n        ;\n            if (r) {\n                m.inform(\"unseen-updated\", null);\n            }\n        ;\n        ;\n            if (s) {\n                m.inform(\"unread-updated\", null);\n            }\n        ;\n        ;\n            {\n                var fin221keys = ((window.top.JSBNG_Replay.forInKeys)((t))), fin221i = (0);\n                (0);\n                for (; (fin221i < fin221keys.length); (fin221i++)) {\n                    ((x) = (fin221keys[fin221i]));\n                    {\n                        m.inform(\"messages-received\", t);\n                        break;\n                    };\n                };\n            };\n        ;\n            {\n                var fin222keys = ((window.top.JSBNG_Replay.forInKeys)((u))), fin222i = (0);\n                (0);\n                for (; (fin222i < fin222keys.length); (fin222i++)) {\n                    ((x) = (fin222keys[fin222i]));\n                    {\n                        m.inform(\"messages-reordered\", u);\n                        break;\n                    };\n                };\n            };\n        ;\n            {\n                var fin223keys = ((window.top.JSBNG_Replay.forInKeys)((v))), fin223i = (0);\n                (0);\n                for (; (fin223i < fin223keys.length); (fin223i++)) {\n                    ((x) = (fin223keys[fin223i]));\n                    {\n                        m.inform(\"messages-updated\", v);\n                        break;\n                    };\n                };\n            };\n        ;\n        }\n    ;\n    ;\n    };\n;\n    function l(m) {\n        this._fbid = m;\n        this._threadDeletions = {\n        };\n        this._threadChanges = {\n        };\n        this._threadReadChanges = {\n        };\n        this._threadlistChanged = false;\n        this._unseenStateChanged = false;\n        this._unreadStateChanged = false;\n        this._receivedMessages = {\n        };\n        this._reorderedMessages = {\n        };\n        this._updatedMessages = {\n        };\n        this._locked = 0;\n    };\n;\n    h(l.prototype, g, {\n        updatedThread: function(m) {\n            this._threadChanges[m] = true;\n            k(this);\n        },\n        deletedThread: function(m) {\n            this._threadDeletions[m] = true;\n            k(this);\n        },\n        updatedThreadlist: function() {\n            this._threadlistChanged = true;\n            k(this);\n        },\n        updatedUnseenState: function() {\n            this._unseenStateChanged = true;\n            k(this);\n        },\n        updatedUnreadState: function() {\n            this._unreadStateChanged = true;\n            k(this);\n        },\n        changedThreadReadState: function(m, n, o) {\n            if (((!this._threadReadChanges[m] || ((this._threadReadChanges[m].timestamp < o))))) {\n                this._threadReadChanges[m] = {\n                    mark_as_read: n,\n                    timestamp: o\n                };\n            }\n        ;\n        ;\n            k(this);\n        },\n        receivedMessage: function(m) {\n            i.isThreadID(m.thread_id);\n            var n = m.thread_id;\n            if (!this._receivedMessages[n]) {\n                this._receivedMessages[n] = [];\n            }\n        ;\n        ;\n            this._receivedMessages[n].push(m);\n            this.updatedThread(n);\n        },\n        reorderedMessages: function(m, n) {\n            this._reorderedMessages[m] = {\n                source: n\n            };\n            k(this);\n        },\n        updatedMessage: function(m, n, o) {\n            if (!this._updatedMessages[m]) {\n                this._updatedMessages[m] = {\n                };\n            }\n        ;\n        ;\n            this._updatedMessages[m][n] = {\n                source: o\n            };\n            this.updatedThread(m);\n        },\n        synchronizeInforms: function(m) {\n            this._locked++;\n            try {\n                m();\n            } catch (n) {\n                throw n;\n            } finally {\n                this._locked--;\n                k(this);\n            };\n        ;\n        },\n        listen: function(m, n) {\n            return this.subscribe(\"threads-updated\", function(o, p) {\n                if (p[m]) {\n                    n(m);\n                }\n            ;\n            ;\n            });\n        }\n    });\n    h(l, j);\n    e.exports = l;\n});\n__d(\"MercuryServerRequests\", [\"ArbiterMixin\",\"AsyncResponse\",\"TimestampConverter\",\"Env\",\"JSLogger\",\"KeyedCallbackManager\",\"MercuryActionTypeConstants\",\"MercuryActionStatus\",\"MercuryAPIArgsSource\",\"MercuryAssert\",\"MercuryErrorType\",\"MercuryGenericConstants\",\"MercuryGlobalActionType\",\"MercuryIDs\",\"MercuryLogMessageType\",\"MercuryPayloadSource\",\"MercuryServerRequestsConfig\",\"MercurySourceType\",\"MercuryThreadlistConstants\",\"MercuryMessageIDs\",\"MessagingConfig\",\"MessagingReliabilityLogger\",\"MessagingTag\",\"MercurySingletonMixin\",\"MercuryServerDispatcher\",\"MercuryThreadInformer\",\"copyProperties\",\"createObjectFrom\",], function(a, b, c, d, e, f) {\n    var g = b(\"ArbiterMixin\"), h = b(\"AsyncResponse\"), i = b(\"TimestampConverter\"), j = b(\"Env\"), k = b(\"JSLogger\"), l = b(\"KeyedCallbackManager\"), m = b(\"MercuryActionTypeConstants\"), n = b(\"MercuryActionStatus\"), o = b(\"MercuryAPIArgsSource\"), p = b(\"MercuryAssert\"), q = b(\"MercuryErrorType\"), r = b(\"MercuryGenericConstants\"), s = b(\"MercuryGlobalActionType\"), t = b(\"MercuryIDs\"), u = b(\"MercuryLogMessageType\"), v = b(\"MercuryPayloadSource\"), w = b(\"MercuryServerRequestsConfig\"), x = b(\"MercurySourceType\"), y = b(\"MercuryThreadlistConstants\"), z = b(\"MercuryMessageIDs\"), aa = b(\"MessagingConfig\"), ba = b(\"MessagingReliabilityLogger\"), ca = b(\"MessagingTag\"), da = b(\"MercurySingletonMixin\"), ea = b(\"MercuryServerDispatcher\"), fa = b(\"MercuryThreadInformer\"), ga = b(\"copyProperties\"), ha = b(\"createObjectFrom\"), ia = k.create(\"mercury_server\"), ja = o.MERCURY;\n    function ka(sb, tb) {\n        if (tb) {\n            sb._lastActionId = i.maxValidActionID(sb._lastActionId, tb);\n        }\n    ;\n    ;\n    };\n;\n    function la(sb, tb) {\n        var ub = tb.thread_id, vb = sb._serverToClientIDs.getResource(ub);\n        if (!vb) {\n            if (tb.canonical_fbid) {\n                vb = ((\"user:\" + tb.canonical_fbid));\n            }\n             else if (tb.root_message_threading_id) {\n                vb = ((\"root:\" + tb.root_message_threading_id));\n            }\n            \n        ;\n        ;\n            vb = ((vb || ((\"thread:\" + ub))));\n            ma(sb, ub, vb);\n        }\n    ;\n    ;\n        tb.thread_id = vb;\n    };\n;\n    function ma(sb, tb, ub) {\n        sb._serverToClientIDs.setResource(tb, ub);\n        sb._clientToServerIDs.setResource(ub, tb);\n        sb._newlyAddedClientIDs[tb] = ub;\n    };\n;\n    function na(sb, tb, ub) {\n        var vb = sb._clientToServerIDs.executeOrEnqueue(tb, ub), wb = sb._clientToServerIDs.getUnavailableResources(vb), xb = sb.tokenizeThreadID(tb);\n        if (((wb.length && ((xb.type != \"root\"))))) {\n            sb.fetchThreadData(wb);\n        }\n    ;\n    ;\n    };\n;\n    function oa(sb, tb) {\n        return sb._clientToServerIDs.getResource(tb);\n    };\n;\n    function pa(sb, tb) {\n        return !!sb._serverToClientIDs.getResource(tb);\n    };\n;\n    function qa(sb, tb) {\n        var ub = sb._serverToClientIDs.getResource(tb);\n        if (((typeof ub == \"undefined\"))) {\n            ia.warn(\"no_client_thread_id\", {\n                server_id: tb\n            });\n        }\n    ;\n    ;\n        return ub;\n    };\n;\n    function ra(sb, tb, ub) {\n        sb._serverToClientIDs.executeOrEnqueue(tb, ub);\n        sb.ensureThreadIsFetched(tb);\n    };\n;\n    function sa(sb, tb, ub) {\n        if (((tb.action_type != m.SEND_MESSAGE))) {\n            return;\n        }\n    ;\n    ;\n        var vb = tb.client_thread_id;\n        if (!vb) {\n            vb = qa(sb, tb.thread_id);\n        }\n    ;\n    ;\n        var wb = null;\n        if (vb) {\n            wb = t.tokenize(vb).type;\n        }\n    ;\n    ;\n        ba.addEntry(((\"send_\" + wb)), ub, ((((tb.thread_id + \",\")) + tb.message_id)));\n    };\n;\n    function ta(sb) {\n        return ((sb.getError() ? ((\"_\" + sb.getError())) : \"\"));\n    };\n;\n    function ua(sb, tb) {\n        var ub = null;\n        switch (tb.JSBNG__status) {\n          case n.SUCCESS:\n            ub = \"success\";\n            break;\n          case n.FAILED_UNKNOWN_REASON:\n            ub = \"confirmed_error\";\n            break;\n          case n.UNABLE_TO_CONFIRM:\n            ub = \"confirm_error\";\n            break;\n          default:\n            return;\n        };\n    ;\n        sa(sb, tb, ub);\n    };\n;\n    function va(sb, tb) {\n        ((tb.message_counts || [])).forEach(function(cc) {\n            ka(sb, cc.last_action_id);\n        });\n        ((tb.threads || [])).forEach(function(cc) {\n            la(sb, cc);\n            delete sb._fetchingThreads[cc.thread_id];\n            var dc = oa(sb, cc.thread_id);\n            delete sb._fetchingThreads[dc];\n            ka(sb, cc.last_action_id);\n        });\n        ((tb.ordered_threadlists || [])).forEach(function(cc) {\n            cc.thread_ids = cc.thread_ids.map(qa.curry(sb));\n        });\n        tb.actions = ((tb.actions || []));\n        tb.actions.forEach(function(cc) {\n            ua(sb, cc);\n            if (((((cc.JSBNG__status && ((cc.JSBNG__status != n.SUCCESS)))) && !cc.thread_id))) {\n                cc.thread_id = cc.client_thread_id;\n                return;\n            }\n        ;\n        ;\n            if (((((((cc.action_type == m.SEND_MESSAGE)) && cc.client_thread_id)) && ((cc.client_thread_id != r.PENDING_THREAD_ID))))) {\n                ma(sb, cc.thread_id, cc.client_thread_id);\n            }\n        ;\n        ;\n            cc.server_thread_id = cc.thread_id;\n            cc.thread_id = ((pa(sb, cc.thread_id) ? qa(sb, cc.thread_id) : null));\n            ka(sb, cc.action_id);\n        });\n        if (tb.end_of_history) {\n            var ub = [];\n            for (var vb = 0; ((vb < tb.end_of_history.length)); vb++) {\n                var wb = tb.end_of_history[vb];\n                if (((wb.type == \"user\"))) {\n                    ub.push(((\"user:\" + wb.id)));\n                }\n                 else if (((((wb.type == \"thread\")) && pa(sb, wb.id)))) {\n                    ub.push(qa(sb, wb.id));\n                }\n                \n            ;\n            ;\n            };\n        ;\n            tb.end_of_history = ub;\n        }\n    ;\n    ;\n        if (tb.roger) {\n            var xb = {\n            };\n            {\n                var fin224keys = ((window.top.JSBNG_Replay.forInKeys)((tb.roger))), fin224i = (0);\n                var yb;\n                for (; (fin224i < fin224keys.length); (fin224i++)) {\n                    ((yb) = (fin224keys[fin224i]));\n                    {\n                        var zb = sb._serverToClientIDs.getResource(yb);\n                        if (zb) {\n                            var ac = tb.roger[yb];\n                            xb[zb] = {\n                            };\n                            {\n                                var fin225keys = ((window.top.JSBNG_Replay.forInKeys)((ac))), fin225i = (0);\n                                var bc;\n                                for (; (fin225i < fin225keys.length); (fin225i++)) {\n                                    ((bc) = (fin225keys[fin225i]));\n                                    {\n                                        xb[zb][((\"fbid:\" + bc))] = ac[bc];\n                                    ;\n                                    };\n                                };\n                            };\n                        ;\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            tb.roger = xb;\n        }\n    ;\n    ;\n    };\n;\n    function wa(sb) {\n        if (((sb._pendingUpdates && sb._pendingUpdates.length))) {\n            var tb = sb._pendingUpdates[0];\n            sb._pendingUpdates = sb._pendingUpdates.slice(1);\n            sb.handleUpdate(tb);\n        }\n    ;\n    ;\n    };\n;\n    function xa(sb, tb) {\n        var ub = ga({\n        }, sb), vb;\n        if (tb.threads) {\n            if (!ub.threads) {\n                ub.threads = {\n                };\n            }\n        ;\n        ;\n            {\n                var fin226keys = ((window.top.JSBNG_Replay.forInKeys)((tb.threads))), fin226i = (0);\n                (0);\n                for (; (fin226i < fin226keys.length); (fin226i++)) {\n                    ((vb) = (fin226keys[fin226i]));\n                    {\n                        ub.threads[vb] = Object.keys(ha(((ub.threads[vb] || [])).concat(tb.threads[vb])));\n                    ;\n                    };\n                };\n            };\n        ;\n        }\n    ;\n    ;\n        if (tb.messages) {\n            if (!ub.messages) {\n                ub.messages = {\n                };\n            }\n        ;\n        ;\n            {\n                var fin227keys = ((window.top.JSBNG_Replay.forInKeys)((tb.messages))), fin227i = (0);\n                (0);\n                for (; (fin227i < fin227keys.length); (fin227i++)) {\n                    ((vb) = (fin227keys[fin227i]));\n                    {\n                        if (!ub.messages[vb]) {\n                            ub.messages[vb] = {\n                            };\n                        }\n                    ;\n                    ;\n                        {\n                            var fin228keys = ((window.top.JSBNG_Replay.forInKeys)((tb.messages[vb]))), fin228i = (0);\n                            var wb;\n                            for (; (fin228i < fin228keys.length); (fin228i++)) {\n                                ((wb) = (fin228keys[fin228i]));\n                                {\n                                    if (ub.messages[vb][wb]) {\n                                        ub.messages[vb][wb] = ab(ub.messages[vb][wb], tb.messages[vb][wb]);\n                                    }\n                                     else ub.messages[vb][wb] = tb.messages[vb][wb];\n                                ;\n                                ;\n                                };\n                            };\n                        };\n                    ;\n                    };\n                };\n            };\n        ;\n        }\n    ;\n    ;\n        ub.client = ((sb.client || tb.client));\n        return ub;\n    };\n;\n    function ya(sb, tb) {\n        var ub = ga(ha(sb.folders, true), ha(tb.folders, true)), vb = ((sb.client || tb.client));\n        return {\n            folders: Object.keys(ub),\n            client: vb\n        };\n    };\n;\n    function za(sb, tb) {\n        {\n            var fin229keys = ((window.top.JSBNG_Replay.forInKeys)((tb))), fin229i = (0);\n            var ub;\n            for (; (fin229i < fin229keys.length); (fin229i++)) {\n                ((ub) = (fin229keys[fin229i]));\n                {\n                    if (((sb[ub] && ((typeof sb[ub] === \"object\"))))) {\n                        sb[ub] = ab(sb[ub], tb[ub]);\n                    }\n                     else if (((tb[ub] && ((typeof tb[ub] === \"object\"))))) {\n                        var vb = {\n                        };\n                        ga(vb, tb[ub]);\n                        sb[ub] = vb;\n                    }\n                    \n                ;\n                ;\n                };\n            };\n        };\n    ;\n        return sb;\n    };\n;\n    function ab(sb, tb) {\n        var ub = ((((sb.offset < tb.offset)) ? sb.offset : tb.offset)), vb = ((sb.offset + sb.limit)), wb = ((tb.offset + tb.limit)), xb = ((((vb > wb)) ? vb : wb)), yb = ((xb - ub));\n        return {\n            offset: ub,\n            limit: yb\n        };\n    };\n;\n    function bb(sb, tb) {\n        var ub = ((sb.client || tb.client)), vb = {\n            ids: {\n            },\n            client: ub\n        };\n        ga(vb.ids, sb.ids);\n        ga(vb.ids, tb.ids);\n        return vb;\n    };\n;\n    function cb(sb, tb) {\n        var ub = {\n        }, vb, wb = ((sb.client || tb.client));\n        delete sb.client;\n        delete tb.client;\n        {\n            var fin230keys = ((window.top.JSBNG_Replay.forInKeys)((sb))), fin230i = (0);\n            (0);\n            for (; (fin230i < fin230keys.length); (fin230i++)) {\n                ((vb) = (fin230keys[fin230i]));\n                {\n                    ga(ub, ha(sb[vb], vb));\n                ;\n                };\n            };\n        };\n    ;\n        {\n            var fin231keys = ((window.top.JSBNG_Replay.forInKeys)((tb))), fin231i = (0);\n            (0);\n            for (; (fin231i < fin231keys.length); (fin231i++)) {\n                ((vb) = (fin231keys[fin231i]));\n                {\n                    ga(ub, ha(tb[vb], vb));\n                ;\n                };\n            };\n        };\n    ;\n        var xb = {\n            client: wb\n        };\n        {\n            var fin232keys = ((window.top.JSBNG_Replay.forInKeys)((ub))), fin232i = (0);\n            var yb;\n            for (; (fin232i < fin232keys.length); (fin232i++)) {\n                ((yb) = (fin232keys[fin232i]));\n                {\n                    vb = ub[yb];\n                    if (!xb[vb]) {\n                        xb[vb] = [];\n                    }\n                ;\n                ;\n                    xb[vb].push(yb);\n                };\n            };\n        };\n    ;\n        return xb;\n    };\n;\n    function db(sb, tb) {\n        var ub = ((sb.client || tb.client)), vb = ha(sb.ids, true), wb = ha(tb.ids, true), xb = ga(vb, wb);\n        return {\n            ids: Object.keys(xb),\n            client: ub\n        };\n    };\n;\n    function eb(sb) {\n        this._fbid = sb;\n        this._lastActionId = 0;\n        this._serverToClientIDs = new l();\n        this._clientToServerIDs = new l();\n        this._pendingUpdates = [];\n        this._fetchingThreads = {\n        };\n        this._newlyAddedClientIDs = {\n        };\n        qb(this);\n    };\n;\n    ga(eb.prototype, g, {\n        tokenizeThreadID: function(sb) {\n            p.isThreadID(sb);\n            return t.tokenize(sb);\n        },\n        getServerThreadID: function(sb, tb) {\n            p.isThreadID(sb);\n            na(this, sb, tb);\n        },\n        getClientThreadID: function(sb, tb) {\n            ra(this, sb, tb);\n        },\n        getClientThreadIDNow: function(sb) {\n            return qa(this, sb);\n        },\n        getServerThreadIDNow: function(sb) {\n            return oa(this, sb);\n        },\n        convertThreadIDIfAvailable: function(sb) {\n            var tb = this._serverToClientIDs.getResource(sb);\n            if (((tb === undefined))) {\n                return sb;\n            }\n             else return tb\n        ;\n        },\n        canLinkExternally: function(sb) {\n            p.isThreadID(sb);\n            var tb = this.tokenizeThreadID(sb);\n            return ((((tb.type == \"user\")) || !!oa(this, sb)));\n        },\n        fetchThreadlistInfo: function(sb, tb, ub, vb, wb) {\n            ub = ((ub || ca.INBOX));\n            wb = ((wb || ja));\n            var xb = ((vb ? ea.IMMEDIATE : null)), yb = {\n                client: wb\n            };\n            yb[ub] = {\n                offset: sb,\n                limit: tb,\n                filter: vb\n            };\n            rb(this, \"/ajax/mercury/threadlist_info.php\", yb, xb);\n        },\n        fetchUnseenThreadIDs: function(sb, tb) {\n            tb = ((tb || ja));\n            this.fetchThreadlistInfo(y.RECENT_THREAD_OFFSET, y.JEWEL_THREAD_COUNT, sb, null, tb);\n        },\n        fetchUnreadThreadIDs: function(sb, tb) {\n            tb = ((tb || ja));\n            rb(this, \"/ajax/mercury/unread_threads.php\", {\n                folders: [sb,],\n                client: tb\n            });\n        },\n        fetchMissedMessages: function(sb, tb) {\n            tb = ((tb || ja));\n            rb(this, \"/ajax/mercury/thread_sync.php\", {\n                last_action_id: this._lastActionId,\n                folders: sb,\n                client: tb\n            });\n        },\n        fetchThreadData: function(sb, tb) {\n            tb = ((tb || ja));\n            p.allThreadID(sb);\n            var ub = {\n                threads: {\n                },\n                client: tb\n            }, vb = [], wb = [];\n            sb.forEach(function(yb) {\n                if (this._fetchingThreads[yb]) {\n                    return;\n                }\n            ;\n            ;\n                this._fetchingThreads[yb] = true;\n                var zb = oa(this, yb);\n                if (zb) {\n                    wb.push(zb);\n                    ub.threads.thread_ids = wb;\n                }\n                 else {\n                    var ac = this.tokenizeThreadID(yb);\n                    if (((ac.type == \"user\"))) {\n                        vb.push(ac.value);\n                        ub.threads.user_ids = vb;\n                    }\n                     else if (((ac.type == \"thread\"))) {\n                        wb.push(ac.value);\n                        ub.threads.thread_ids = wb;\n                    }\n                     else if (((((ac.type != \"root\")) && ((ac.type != \"pending\"))))) {\n                        throw new Error(\"Unknown thread type\", ac);\n                    }\n                    \n                    \n                ;\n                ;\n                }\n            ;\n            ;\n            }.bind(this));\n            this.inform(\"fetch-thread-data\", ub);\n            {\n                var fin233keys = ((window.top.JSBNG_Replay.forInKeys)((ub.threads))), fin233i = (0);\n                var xb;\n                for (; (fin233i < fin233keys.length); (fin233i++)) {\n                    ((xb) = (fin233keys[fin233i]));\n                    {\n                        rb(this, \"/ajax/mercury/thread_info.php\", ub);\n                        break;\n                    };\n                };\n            };\n        ;\n        },\n        ensureThreadIsFetched: function(sb, tb) {\n            tb = ((tb || ja));\n            if (((!this._serverToClientIDs.getResource(sb) && !this._fetchingThreads[sb]))) {\n                this._fetchingThreads[sb] = true;\n                rb(this, \"/ajax/mercury/thread_info.php\", {\n                    threads: {\n                        thread_ids: [sb,]\n                    },\n                    client: tb\n                });\n            }\n        ;\n        ;\n        },\n        fetchThreadMessages: function(sb, tb, ub, vb, wb) {\n            p.isThreadID(sb);\n            wb = ((wb || ja));\n            var xb, yb, zb = this.tokenizeThreadID(sb), ac = oa(this, sb), bc = false;\n            if (((ac && ((zb.type != \"group\"))))) {\n                yb = \"thread_ids\";\n                xb = ac;\n            }\n             else {\n                xb = zb.value;\n                switch (zb.type) {\n                  case \"user\":\n                    yb = \"user_ids\";\n                    bc = true;\n                    break;\n                  case \"group\":\n                    yb = \"group_ids\";\n                    break;\n                  case \"thread\":\n                    yb = \"thread_ids\";\n                    break;\n                };\n            ;\n            }\n        ;\n        ;\n            var cc = {\n                messages: {\n                },\n                threads: {\n                },\n                client: wb\n            };\n            if (yb) {\n                cc.messages[yb] = {\n                };\n                cc.messages[yb][xb] = {\n                    offset: tb,\n                    limit: ub\n                };\n                if (bc) {\n                    cc.threads[yb] = [xb,];\n                }\n            ;\n            ;\n                rb(this, \"/ajax/mercury/thread_info.php\", cc, vb);\n            }\n             else na(this, sb, function(dc) {\n                cc.messages.thread_ids = {\n                };\n                cc.messages.thread_ids[dc] = {\n                    offset: tb,\n                    limit: ub\n                };\n                rb(this, \"/ajax/mercury/thread_info.php\", cc, vb);\n            }.bind(this));\n        ;\n        ;\n        },\n        handleThreadInfoError: function(sb) {\n            var tb = sb.getRequest().getData(), ub = [];\n            if (tb.messages) {\n                {\n                    var fin234keys = ((window.top.JSBNG_Replay.forInKeys)((tb.messages.thread_ids))), fin234i = (0);\n                    var vb;\n                    for (; (fin234i < fin234keys.length); (fin234i++)) {\n                        ((vb) = (fin234keys[fin234i]));\n                        {\n                            ub.push(fb(qa(this, vb)));\n                        ;\n                        };\n                    };\n                };\n            ;\n                {\n                    var fin235keys = ((window.top.JSBNG_Replay.forInKeys)((tb.messages.user_ids))), fin235i = (0);\n                    var wb;\n                    for (; (fin235i < fin235keys.length); (fin235i++)) {\n                        ((wb) = (fin235keys[fin235i]));\n                        {\n                            ub.push(fb(((\"user:\" + wb))));\n                        ;\n                        };\n                    };\n                };\n            ;\n                {\n                    var fin236keys = ((window.top.JSBNG_Replay.forInKeys)((tb.messages.group_ids))), fin236i = (0);\n                    var xb;\n                    for (; (fin236i < fin236keys.length); (fin236i++)) {\n                        ((xb) = (fin236keys[fin236i]));\n                        {\n                            ub.push(fb(((\"group:\" + xb))));\n                        ;\n                        };\n                    };\n                };\n            ;\n            }\n        ;\n        ;\n            if (ub.length) {\n                this.handleUpdate({\n                    actions: ub,\n                    from_client: true,\n                    payload_source: v.CLIENT_CHANNEL_MESSAGE\n                });\n            }\n        ;\n        ;\n            if (((tb.threads && ((((tb.threads.user_ids || tb.threads.group_ids)) || tb.threads.thread_ids))))) {\n                var yb = 5, zb = true;\n                if (!tb.retry_count) {\n                    tb.retry_count = 0;\n                    if (tb.messages) {\n                        delete tb.messages;\n                    }\n                ;\n                ;\n                }\n                 else if (((tb.retry_count >= yb))) {\n                    zb = false;\n                    ((tb.threads.thread_ids || [])).forEach(function(bc) {\n                        if (((bc in this._fetchingThreads))) {\n                            delete this._fetchingThreads[bc];\n                        }\n                    ;\n                    ;\n                    }.bind(this));\n                }\n                \n            ;\n            ;\n                if (zb) {\n                    var ac = ((tb.retry_count * 1000));\n                    (function() {\n                        ia.log(\"retry_thread\", tb);\n                        rb(this, \"/ajax/mercury/thread_info.php\", tb);\n                    }.bind(this)).defer(ac, false);\n                    tb.retry_count++;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n        },\n        markFolderAsRead: function(sb) {\n            rb(this, \"/ajax/mercury/mark_folder_as_read.php\", {\n                folder: sb\n            });\n            var tb = [{\n                action_type: s.MARK_ALL_READ,\n                action_id: null,\n                folder: sb\n            },];\n            this.handleUpdate({\n                global_actions: tb,\n                from_client: true,\n                payload_source: v.CLIENT_CHANGE_READ_STATUS\n            });\n        },\n        changeThreadReadStatus: function(sb, tb, ub) {\n            p.isThreadID(sb);\n            na(this, sb, function(wb) {\n                var xb = {\n                    ids: {\n                    }\n                };\n                xb.ids[wb] = tb;\n                rb(this, \"/ajax/mercury/change_read_status.php\", xb);\n            }.bind(this));\n            var vb = [{\n                action_type: m.CHANGE_READ_STATUS,\n                action_id: null,\n                thread_id: sb,\n                mark_as_read: tb,\n                folder: ub\n            },];\n            this.handleUpdate({\n                actions: vb,\n                from_client: true,\n                payload_source: v.CLIENT_CHANGE_READ_STATUS\n            });\n        },\n        changeThreadArchivedStatus: function(sb, tb) {\n            p.isThreadID(sb);\n            na(this, sb, function(wb) {\n                var xb = {\n                    ids: {\n                    }\n                };\n                xb.ids[wb] = tb;\n                rb(this, \"/ajax/mercury/change_archived_status.php\", xb);\n            }.bind(this));\n            var ub = {\n                action_type: m.CHANGE_ARCHIVED_STATUS,\n                action_id: null,\n                thread_id: sb,\n                archived: tb\n            }, vb = {\n                actions: [ub,],\n                from_client: true,\n                payload_source: v.CLIENT_CHANGE_ARCHIVED_STATUS\n            };\n            this.handleUpdate(vb);\n        },\n        changeThreadFolder: function(sb, tb) {\n            p.isThreadID(sb);\n            na(this, sb, function(wb) {\n                var xb = {\n                };\n                xb[tb] = [wb,];\n                rb(this, \"/ajax/mercury/move_thread.php\", xb);\n            }.bind(this));\n            var ub = {\n                action_type: m.CHANGE_FOLDER,\n                action_id: null,\n                thread_id: sb,\n                new_folder: tb\n            }, vb = {\n                actions: [ub,],\n                from_client: true,\n                payload_source: v.CLIENT_CHANGE_FOLDER\n            };\n            this.handleUpdate(vb);\n        },\n        changeMutingOnThread: function(sb, tb) {\n            p.isThreadID(sb);\n            na(this, sb, function(wb) {\n                rb(this, \"/ajax/mercury/change_mute_thread.php\", {\n                    thread_id: wb,\n                    mute_settings: tb,\n                    payload_source: ja\n                });\n            }.bind(this));\n            var ub = {\n                action_type: m.CHANGE_MUTE_SETTINGS,\n                action_id: null,\n                thread_id: sb,\n                mute_settings: tb\n            }, vb = {\n                actions: [ub,],\n                from_client: true,\n                payload_source: v.CLIENT_CHANGE_MUTE_SETTINGS\n            };\n            this.handleUpdate(vb);\n        },\n        markThreadSpam: function(sb) {\n            p.isThreadID(sb);\n            na(this, sb, function(vb) {\n                rb(this, \"/ajax/mercury/mark_spam.php\", {\n                    id: vb\n                });\n            }.bind(this));\n            var tb = {\n                action_type: m.CHANGE_FOLDER,\n                action_id: null,\n                thread_id: sb,\n                new_folder: ca.SPAM\n            }, ub = {\n                actions: [tb,],\n                from_client: true,\n                payload_source: v.CLIENT_CHANGE_FOLDER\n            };\n            this.handleUpdate(ub);\n        },\n        markMessagesSpam: function(sb, tb) {\n            z.getServerIDs(((tb || [])), function(vb) {\n                rb(this, \"/ajax/mercury/mark_spam_messages.php\", {\n                    message_ids: vb\n                });\n            }.bind(this));\n            var ub = {\n                action_type: m.DELETE_MESSAGES,\n                action_id: null,\n                thread_id: sb,\n                message_ids: tb\n            };\n            this.handleUpdate({\n                actions: [ub,],\n                from_client: true,\n                payload_source: v.CLIENT_DELETE_MESSAGES\n            });\n        },\n        unmarkThreadSpam: function(sb) {\n            p.isThreadID(sb);\n            na(this, sb, function(vb) {\n                rb(this, \"/ajax/mercury/unmark_spam.php\", {\n                    id: vb\n                });\n            }.bind(this));\n            var tb = {\n                action_type: m.CHANGE_FOLDER,\n                action_id: null,\n                thread_id: sb,\n                new_folder: ca.INBOX\n            }, ub = {\n                actions: [tb,],\n                from_client: true,\n                payload_source: v.CLIENT_CHANGE_FOLDER\n            };\n            this.handleUpdate(ub);\n        },\n        deleteThread: function(sb) {\n            p.isThreadID(sb);\n            na(this, sb, function(vb) {\n                var wb = {\n                    ids: [vb,]\n                };\n                rb(this, \"/ajax/mercury/delete_thread.php\", wb);\n            }.bind(this));\n            var tb = {\n                action_type: m.DELETE_THREAD,\n                action_id: null,\n                thread_id: sb\n            }, ub = {\n                actions: [tb,],\n                from_client: true,\n                payload_source: v.CLIENT_DELETE_THREAD\n            };\n            this.handleUpdate(ub);\n        },\n        deleteMessages: function(sb, tb, ub) {\n            z.getServerIDs(((tb || [])), function(wb) {\n                rb(this, \"/ajax/mercury/delete_messages.php\", {\n                    message_ids: wb\n                });\n            }.bind(this));\n            var vb;\n            if (ub) {\n                vb = {\n                    action_type: m.DELETE_THREAD,\n                    action_id: null,\n                    thread_id: sb\n                };\n            }\n             else vb = {\n                action_type: m.DELETE_MESSAGES,\n                action_id: null,\n                thread_id: sb,\n                message_ids: tb\n            };\n        ;\n        ;\n            this.handleUpdate({\n                actions: [vb,],\n                from_client: true,\n                payload_source: v.CLIENT_DELETE_MESSAGES\n            });\n        },\n        clearChat: function(sb, tb, ub) {\n            p.isThreadID(sb);\n            rb(this, \"/ajax/chat/settings.php\", {\n                clear_history_id: tb\n            });\n            var vb = [{\n                action_type: m.CLEAR_CHAT,\n                action_id: null,\n                thread_id: sb,\n                clear_time: ub\n            },];\n            this.handleUpdate({\n                actions: vb,\n                from_client: true,\n                payload_source: v.CLIENT_CLEAR_CHAT\n            });\n        },\n        sendNewMessage: function(sb, tb) {\n            tb = ((tb || ja));\n            if (!sb.do_not_send_to_server) {\n                z.getServerIDs(((sb.forward_message_ids || [])), function(vb) {\n                    var wb = sb.thread_id, xb = this.tokenizeThreadID(sb.thread_id), yb = xb.type, zb = ga({\n                    }, sb);\n                    zb.forward_message_ids = vb;\n                    if (((((((((yb == \"root\")) && ((xb.value == zb.message_id)))) || ((((yb == \"user\")) && !oa(this, wb))))) || ((sb.thread_id == r.PENDING_THREAD_ID))))) {\n                        zb.client_thread_id = zb.thread_id;\n                        zb.thread_id = null;\n                        this._sendNewMessageToServer(zb, tb);\n                    }\n                     else na(this, zb.thread_id, function(ac) {\n                        zb.thread_id = ac;\n                        this._sendNewMessageToServer(zb);\n                    }.bind(this));\n                ;\n                ;\n                }.bind(this));\n            }\n        ;\n        ;\n            if (((sb.thread_id != r.PENDING_THREAD_ID))) {\n                var ub = {\n                    actions: [ga({\n                    }, sb),],\n                    from_client: true,\n                    payload_source: v.CLIENT_SEND_MESSAGE\n                };\n                this.handleUpdate(ub);\n            }\n        ;\n        ;\n        },\n        _sendNewMessageToServer: function(sb, tb) {\n            tb = ((tb || ja));\n            rb(this, \"/ajax/mercury/send_messages.php\", {\n                message_batch: [sb,],\n                client: tb\n            });\n        },\n        requestMessageConfirmation: function(sb, tb) {\n            tb = ((tb || ja));\n            var ub = {\n            }, vb = {\n            };\n            {\n                var fin237keys = ((window.top.JSBNG_Replay.forInKeys)((sb))), fin237i = (0);\n                var wb;\n                for (; (fin237i < fin237keys.length); (fin237i++)) {\n                    ((wb) = (fin237keys[fin237i]));\n                    {\n                        var xb = oa(this, wb);\n                        if (xb) {\n                            ub[xb] = sb[wb];\n                        }\n                         else {\n                            var yb = sb[wb];\n                            for (var zb = 0; ((zb < yb.length)); zb++) {\n                                vb[yb[zb]] = wb;\n                            ;\n                            };\n                        ;\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            var ac = Object.keys(ub), bc = Object.keys(vb);\n            if (((ac.length || bc.length))) {\n                rb(this, \"/ajax/mercury/confirm_messages.php\", {\n                    thread_message_map: ub,\n                    local_messages: vb,\n                    client: tb\n                });\n            }\n        ;\n        ;\n        },\n        handleMessageConfirmError: function(sb) {\n            var tb = sb.getRequest().getData().thread_message_map, ub = sb.getRequest().getData().local_messages;\n            if (((!tb && !ub))) {\n                return;\n            }\n        ;\n        ;\n            var vb = [];\n            {\n                var fin238keys = ((window.top.JSBNG_Replay.forInKeys)((tb))), fin238i = (0);\n                var wb;\n                for (; (fin238i < fin238keys.length); (fin238i++)) {\n                    ((wb) = (fin238keys[fin238i]));\n                    {\n                        var xb = tb[wb];\n                        xb.forEach(function(ac) {\n                            vb.push({\n                                action_type: m.SEND_MESSAGE,\n                                client_message_id: ac,\n                                message_id: ac,\n                                client_thread_id: null,\n                                thread_id: wb,\n                                JSBNG__status: n.UNABLE_TO_CONFIRM\n                            });\n                        });\n                    };\n                };\n            };\n        ;\n            {\n                var fin239keys = ((window.top.JSBNG_Replay.forInKeys)((ub))), fin239i = (0);\n                var yb;\n                for (; (fin239i < fin239keys.length); (fin239i++)) {\n                    ((yb) = (fin239keys[fin239i]));\n                    {\n                        var zb = ub[yb];\n                        vb.push({\n                            action_type: m.SEND_MESSAGE,\n                            client_message_id: yb,\n                            message_id: yb,\n                            client_thread_id: zb,\n                            thread_id: null,\n                            JSBNG__status: n.UNABLE_TO_CONFIRM\n                        });\n                    };\n                };\n            };\n        ;\n            if (vb.length) {\n                this.handleUpdate({\n                    actions: vb,\n                    payload_source: v.CLIENT_HANDLE_ERROR\n                });\n            }\n        ;\n        ;\n        },\n        markSeen: function() {\n            var sb = i.convertActionIDToTimestamp(this._lastActionId);\n            rb(this, \"/ajax/mercury/mark_seen.php\", {\n                seen_timestamp: sb\n            });\n        },\n        handleRoger: function(sb) {\n            var tb = ((sb.tid ? this._serverToClientIDs.getResource(sb.tid) : ((\"user:\" + sb.reader))));\n            if (tb) {\n                var ub = {\n                };\n                ub[tb] = {\n                };\n                ub[tb][((\"fbid:\" + sb.reader))] = sb.time;\n                this.inform(\"update-roger\", ub);\n            }\n        ;\n        ;\n        },\n        handleUpdateWaitForThread: function(sb, tb, ub) {\n            ub = ((ub || ja));\n            var vb = this._serverToClientIDs.getResource(tb);\n            if (vb) {\n                this.handleUpdate(sb);\n                return;\n            }\n        ;\n        ;\n            this._serverToClientIDs.executeOrEnqueue(tb, function() {\n                this._pendingUpdates.push(sb);\n            }.bind(this));\n            if (!this._fetchingThreads[tb]) {\n                this._fetchingThreads[tb] = true;\n                rb(this, \"/ajax/mercury/thread_info.php\", {\n                    threads: {\n                        thread_ids: [tb,]\n                    },\n                    client: ub\n                });\n            }\n        ;\n        ;\n        },\n        handleUpdate: function(sb) {\n            var tb = [];\n            if (((sb && sb.threads))) {\n                for (var ub = 0; ((ub < sb.threads.length)); ub++) {\n                    if (!sb.threads[ub].snippet_attachments) {\n                        continue;\n                    }\n                ;\n                ;\n                    for (var vb = 0; ((vb < sb.threads[ub].snippet_attachments.length)); vb++) {\n                        if (sb.threads[ub].snippet_attachments[vb].share_xhp) {\n                            tb.push({\n                                i: ub,\n                                j: vb,\n                                xhp: sb.threads[ub].snippet_attachments[vb].share_xhp\n                            });\n                            sb.threads[ub].snippet_attachments[vb].share_xhp = ((((\"HTMLDivElement not shown: object contains circular \" + \"reference, which was breaking JSON.stringify. \")) + \"Look at MercuryServerRequests.handleUpdate\"));\n                        }\n                    ;\n                    ;\n                    };\n                ;\n                };\n            }\n        ;\n        ;\n            ia.debug(\"handle_update\", {\n                payload: sb,\n                from_client: sb.from_client\n            });\n            for (var wb = 0; ((wb < tb.length)); wb++) {\n                sb.threads[tb[wb].i].snippet_attachments[tb[wb].j].share_xhp = tb[wb].xhp;\n            ;\n            };\n        ;\n            {\n                var fin240keys = ((window.top.JSBNG_Replay.forInKeys)((sb))), fin240i = (0);\n                (0);\n                for (; (fin240i < fin240keys.length); (fin240i++)) {\n                    ((wb) = (fin240keys[fin240i]));\n                    {\n                        fa.getForFBID(this._fbid).synchronizeInforms(function() {\n                            if (!sb.from_client) {\n                                va(this, sb);\n                                this.inform(\"payload-preprocessed\", sb);\n                            }\n                        ;\n                        ;\n                            this.inform(\"update-thread-ids\", this._newlyAddedClientIDs);\n                            this._newlyAddedClientIDs = {\n                            };\n                            this.inform(\"update-participants\", sb);\n                            this.inform(\"update-threads\", sb);\n                            this.inform(\"update-unread\", sb);\n                            this.inform(\"update-threadlist\", sb);\n                            this.inform(\"update-messages\", sb);\n                            this.inform(\"update-unseen\", sb);\n                            this.inform(\"update-typing-state\", sb);\n                            this.inform(\"update-roger\", sb.roger);\n                            this.inform(\"model-update-completed\", null);\n                            wa(this);\n                        }.bind(this));\n                        break;\n                    };\n                };\n            };\n        ;\n        },\n        _handleSendMessageErrorCommon: function(sb, tb, ub, vb) {\n            ia.debug(\"handle_send_message_error_common\", {\n                reliability_error_status: ub,\n                request_error_status: tb\n            });\n            var wb = sb.getData(), xb = wb.message_batch, yb = xb.map(function(ac) {\n                return {\n                    action_type: m.SEND_MESSAGE,\n                    client_message_id: ac.message_id,\n                    message_id: ac.message_id,\n                    client_thread_id: ac.client_thread_id,\n                    thread_id: ac.thread_id,\n                    JSBNG__status: tb,\n                    error_data: vb\n                };\n            });\n            yb.forEach(function(ac) {\n                sa(this, ac, ub);\n            }.bind(this));\n            var zb = {\n                actions: yb,\n                payload_source: v.CLIENT_HANDLE_ERROR\n            };\n            this.handleUpdate(zb);\n        },\n        handleSendMessageError: function(sb) {\n            var tb = sb.getPayload(), ub = null, vb = null;\n            if (((tb && tb.error_payload))) {\n                ub = n.UNCONFIRMED;\n                vb = \"send_error\";\n            }\n             else {\n                ub = n.ERROR;\n                vb = ((\"request_error\" + ta(sb)));\n            }\n        ;\n        ;\n            var wb = sb.error;\n            if (((wb === 1404102))) {\n                h.verboseErrorHandler(sb);\n            }\n        ;\n        ;\n            var xb = ((/<.*>/.test(sb.getErrorDescription()) ? sb.getErrorSummary() : sb.getErrorDescription()));\n            this._handleSendMessageErrorCommon(sb.getRequest(), ub, vb, {\n                type: q.SERVER,\n                code: sb.getError(),\n                description: xb,\n                is_transient: sb.isTransient()\n            });\n        },\n        handleSendMessageTransportError: function(sb) {\n            this._handleSendMessageErrorCommon(sb.getRequest(), n.ERROR, ((\"transport_error\" + ta(sb))), {\n                type: q.TRANSPORT,\n                code: sb.getError(),\n                is_transient: true\n            });\n        },\n        handleSendMessageTimeout: function(sb) {\n            this._handleSendMessageErrorCommon(sb, n.ERROR, \"transport_timeout\", {\n                type: q.TIMEOUT,\n                is_transient: true\n            });\n        },\n        getLastActionID: function() {\n            return this._lastActionId;\n        }\n    });\n    ga(eb, da);\n    function fb(sb) {\n        return {\n            action_type: m.LOG_MESSAGE,\n            thread_id: sb,\n            message_id: sb,\n            timestamp: JSBNG__Date.now(),\n            timestamp_absolute: \"\",\n            timestamp_relative: \"\",\n            is_unread: false,\n            source: x.UNKNOWN,\n            log_message_type: u.SERVER_ERROR,\n            log_message_data: {\n            }\n        };\n    };\n;\n    function gb(sb) {\n        var tb = sb.getData(), ub = ((tb.request_user_id ? tb.request_user_id : j.user));\n        return eb.getForFBID(ub);\n    };\n;\n    function hb(sb, tb) {\n        gb(tb).handleUpdate(sb);\n    };\n;\n    function ib(sb, tb) {\n        var ub = ((sb.client || tb.client));\n        return {\n            client: ub,\n            message_batch: sb.message_batch.concat(tb.message_batch)\n        };\n    };\n;\n    function jb(sb, tb) {\n        var ub = {\n        };\n        ga(ub, sb.ids);\n        ga(ub, tb.ids);\n        var vb = ((sb.client || tb.client));\n        return {\n            ids: ub,\n            client: vb\n        };\n    };\n;\n    function kb(sb, tb) {\n        return tb;\n    };\n;\n    function lb(sb) {\n        var tb = gb(sb.getRequest());\n        tb.handleThreadInfoError(sb);\n    };\n;\n    function mb(sb) {\n        var tb = gb(sb.getRequest());\n        tb.handleSendMessageError(sb);\n    };\n;\n    function nb(sb) {\n        var tb = gb(sb.getRequest());\n        tb.handleSendMessageTransportError(sb);\n    };\n;\n    function ob(sb) {\n        var tb = gb(sb);\n        tb.handleSendMessageTimeout(sb);\n    };\n;\n    function pb(sb) {\n        var tb = gb(sb.getRequest());\n        tb.handleMessageConfirmError(sb);\n    };\n;\n    function qb(sb) {\n        ea.registerEndpoints({\n            \"/ajax/mercury/thread_sync.php\": {\n                request_user_id: sb._fbid,\n                mode: ea.IDEMPOTENT,\n                handler: hb\n            },\n            \"/ajax/mercury/thread_info.php\": {\n                request_user_id: sb._fbid,\n                mode: ea.BATCH_DEFERRED_MULTI,\n                batch_function: xa,\n                handler: hb,\n                error_handler: lb\n            },\n            \"/ajax/mercury/mark_folder_as_read.php\": {\n                request_user_id: sb._fbid,\n                mode: ea.IMMEDIATE,\n                handler: hb\n            },\n            \"/ajax/mercury/change_read_status.php\": {\n                request_user_id: sb._fbid,\n                mode: ea.BATCH_SUCCESSIVE,\n                batch_function: jb,\n                handler: hb\n            },\n            \"/ajax/mercury/send_messages.php\": {\n                request_user_id: sb._fbid,\n                mode: ea.BATCH_SUCCESSIVE,\n                batch_function: ib,\n                batch_size_limit: aa.SEND_BATCH_LIMIT,\n                handler: hb,\n                error_handler: mb,\n                transport_error_handler: nb,\n                timeout: w.sendMessageTimeout,\n                timeout_handler: ob,\n                connection_retries: aa.SEND_CONNECTION_RETRIES\n            },\n            \"/ajax/mercury/mark_seen.php\": {\n                request_user_id: sb._fbid,\n                mode: ea.BATCH_SUCCESSIVE,\n                batch_function: kb,\n                handler: hb\n            },\n            \"/ajax/mercury/confirm_messages.php\": {\n                request_user_id: sb._fbid,\n                mode: ea.IMMEDIATE,\n                handler: hb,\n                error_handler: pb\n            },\n            \"/ajax/mercury/threadlist_info.php\": {\n                request_user_id: sb._fbid,\n                mode: ea.BATCH_SUCCESSIVE_UNIQUE,\n                batch_function: za,\n                handler: hb\n            },\n            \"/ajax/mercury/mark_spam.php\": {\n                request_user_id: sb._fbid,\n                mode: ea.IMMEDIATE,\n                handler: hb\n            },\n            \"/ajax/mercury/mark_spam_messages.php\": {\n                request_user_id: sb._fbid,\n                mode: ea.IMMEDIATE,\n                handler: hb\n            },\n            \"/ajax/mercury/unmark_spam.php\": {\n                request_user_id: sb._fbid,\n                mode: ea.IMMEDIATE,\n                handler: hb\n            },\n            \"/ajax/mercury/unread_threads.php\": {\n                request_user_id: sb._fbid,\n                mode: ea.BATCH_SUCCESSIVE_UNIQUE,\n                batch_function: ya,\n                handler: hb\n            },\n            \"/ajax/chat/settings.php\": {\n                request_user_id: sb._fbid,\n                mode: ea.IMMEDIATE\n            },\n            \"/ajax/mercury/change_archived_status.php\": {\n                request_user_id: sb._fbid,\n                mode: ea.BATCH_SUCCESSIVE,\n                batch_function: bb,\n                handler: hb\n            },\n            \"/ajax/mercury/delete_thread.php\": {\n                request_user_id: sb._fbid,\n                mode: ea.BATCH_SUCCESSIVE,\n                batch_function: db,\n                handler: hb\n            },\n            \"/ajax/mercury/delete_messages.php\": {\n                request_user_id: sb._fbid,\n                mode: ea.IMMEDIATE,\n                handler: hb\n            },\n            \"/ajax/mercury/move_thread.php\": {\n                request_user_id: sb._fbid,\n                mode: ea.BATCH_SUCCESSIVE,\n                batch_function: cb,\n                handler: hb\n            },\n            \"/ajax/mercury/change_mute_thread.php\": {\n                request_user_id: sb._fbid,\n                mode: ea.IMMEDIATE,\n                handler: hb\n            }\n        });\n    };\n;\n    function rb(sb, tb, ub, vb) {\n        ea.trySend(tb, ub, vb, sb._fbid);\n    };\n;\n    e.exports = eb;\n});\n__d(\"MercuryParticipants\", [\"Env\",\"ImageSourceRequest\",\"ImageSourceType\",\"MercuryAssert\",\"MercuryIDs\",\"MercuryParticipantTypes\",\"MercuryParticipantsConstants\",\"PhotoResizeModeConst\",\"MercuryServerRequests\",\"ShortProfiles\",\"copyProperties\",\"getObjectValues\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Env\"), h = b(\"ImageSourceRequest\"), i = b(\"ImageSourceType\"), j = b(\"MercuryAssert\"), k = b(\"MercuryIDs\"), l = b(\"MercuryParticipantTypes\"), m = b(\"MercuryParticipantsConstants\"), n = b(\"PhotoResizeModeConst\"), o = b(\"MercuryServerRequests\").get(), p = b(\"ShortProfiles\"), q = b(\"copyProperties\"), r = b(\"getObjectValues\"), s = b(\"tx\"), t = ((\"fbid:\" + g.user)), u = {\n    }, v = {\n    }, w = function(ba) {\n        ba = z(ba);\n        if (u[ba.id]) {\n            q(u[ba.id], ba);\n        }\n         else u[ba.id] = q({\n        }, ba);\n    ;\n    ;\n        if (ba.vanity) {\n            v[ba.vanity] = ba.id;\n        }\n    ;\n    ;\n    };\n    function x(ba) {\n        j.isEmailParticipantID(ba);\n        var ca = k.tokenize(ba), da = ca.value;\n        return {\n            gender: m.UNKNOWN_GENDER,\n            href: null,\n            id: ba,\n            image_src: m.EMAIL_IMAGE,\n            big_image_src: m.EMAIL_IMAGE,\n            JSBNG__name: da,\n            short_name: da,\n            employee: false,\n            call_promo: false\n        };\n    };\n;\n    function y(ba, ca, da) {\n        j.allParticipantIDs(ba);\n        var ea = {\n        }, fa = {\n        };\n        ba.forEach(function(ha) {\n            if (((u[ha] && !da))) {\n                ea[ha] = q({\n                }, u[ha]);\n            }\n             else {\n                var ia = k.tokenize(ha);\n                if (((ia.type == \"fbid\"))) {\n                    var ja = ia.value;\n                    fa[ha] = ja;\n                }\n                 else if (((ia.type == \"email\"))) {\n                    ea[ha] = x(ha);\n                }\n                \n            ;\n            ;\n            }\n        ;\n        ;\n        });\n        var ga = r(fa);\n        if (ga.length) {\n            p.getMulti(ga, function(ha) {\n                {\n                    var fin241keys = ((window.top.JSBNG_Replay.forInKeys)((fa))), fin241i = (0);\n                    var ia;\n                    for (; (fin241i < fin241keys.length); (fin241i++)) {\n                        ((ia) = (fin241keys[fin241i]));\n                        {\n                            var ja = fa[ia], ka = ha[ja];\n                            ea[ia] = {\n                                gender: ka.gender,\n                                href: ka.uri,\n                                id: ia,\n                                image_src: ka.thumbSrc,\n                                JSBNG__name: ka.JSBNG__name,\n                                short_name: ka.firstName,\n                                employee: ka.employee,\n                                call_promo: ka.showVideoPromo,\n                                type: ka.type,\n                                vanity: ka.vanity,\n                                is_friend: ka.is_friend,\n                                social_snippets: ka.social_snippets\n                            };\n                            w(ea[ia]);\n                        };\n                    };\n                };\n            ;\n                ca(ea);\n            });\n        }\n         else ca(ea);\n    ;\n    ;\n    };\n;\n    function z(ba) {\n        var ca = ((((ba.type === l.USER)) || ((ba.type === l.FRIEND))));\n        if (!ca) {\n            return ba;\n        }\n    ;\n    ;\n        if (((((!ba.JSBNG__name && !ba.href)) && !ba.vanity))) {\n            var da = \"Facebook User\";\n            ba.JSBNG__name = da;\n            ba.short_name = da;\n        }\n    ;\n    ;\n        return ba;\n    };\n;\n    var aa = {\n        user: t,\n        isAuthor: function(ba) {\n            return ((ba === t));\n        },\n        getIDFromVanityOrFBID: function(ba) {\n            if (!ba) {\n                return;\n            }\n        ;\n        ;\n            if (v[ba]) {\n                return v[ba];\n            }\n        ;\n        ;\n            if (ba.match(\"^\\\\d+$\")) {\n                return aa.getIDForUser(ba);\n            }\n        ;\n        ;\n        },\n        getNow: function(ba) {\n            return u[ba];\n        },\n        get: function(ba, ca) {\n            j.isParticipantID(ba);\n            aa.getMulti([ba,], function(da) {\n                ca(da[ba]);\n            });\n        },\n        getMulti: function(ba, ca, da) {\n            return y(ba, ca, false);\n        },\n        getBigImageMulti: function(ba, ca) {\n            j.allParticipantIDs(ba);\n            var da = m.BIG_IMAGE_SIZE;\n            aa.getMulti(ba, function(ea) {\n                var fa = {\n                }, ga = 0, ha = function(la, ma) {\n                    ga++;\n                    fa[la] = ma;\n                    if (((ga === ba.length))) {\n                        ca(fa);\n                    }\n                ;\n                ;\n                }, ia = function(la, ma) {\n                    u[la].big_image_src = ma.uri;\n                    ha(la, ma.uri);\n                };\n                {\n                    var fin242keys = ((window.top.JSBNG_Replay.forInKeys)((ea))), fin242i = (0);\n                    var ja;\n                    for (; (fin242i < fin242keys.length); (fin242i++)) {\n                        ((ja) = (fin242keys[fin242i]));\n                        {\n                            var ka = ea[ja];\n                            if (!ka.big_image_src) {\n                                new h().setFBID(aa.getUserID(ja)).setType(i.PROFILE_PICTURE).setDimensions(da, da).setResizeMode(n.COVER).setCallback(ia.curry(ja)).send();\n                            }\n                             else ha(ka.id, ka.big_image_src);\n                        ;\n                        ;\n                        };\n                    };\n                };\n            ;\n            });\n        },\n        getOrderedBigImageMulti: function(ba, ca) {\n            aa.getBigImageMulti(ba, function(da) {\n                var ea = ba.map(function(fa) {\n                    return da[fa];\n                });\n                ca(ea);\n            });\n        },\n        getMultiForceDownload: function(ba, ca) {\n            return y(ba, ca, true);\n        },\n        getUserID: function(ba) {\n            return k.getUserIDFromParticipantID(ba);\n        },\n        getIDForUser: function(ba) {\n            return ((\"fbid:\" + ba));\n        },\n        addParticipants: function(ba) {\n            ba.forEach(w);\n        }\n    };\n    o.subscribe(\"update-participants\", function(ba, ca) {\n        aa.addParticipants(((ca.participants || [])));\n    });\n    e.exports = aa;\n});\n__d(\"RangedCallbackManager\", [\"CallbackManagerController\",\"copyProperties\",\"createObjectFrom\",], function(a, b, c, d, e, f) {\n    var g = b(\"CallbackManagerController\"), h = b(\"copyProperties\"), i = b(\"createObjectFrom\"), j = function(k, l, m) {\n        this._resources = [];\n        this._reachedEndOfArray = false;\n        this._error = false;\n        this._existingIDs = {\n        };\n        this._controller = new g(this._constructCallbackArg.bind(this));\n        this._getValueHandler = k;\n        this._compareValuesHandler = l;\n        this._skipOnStrictHandler = m;\n    };\n    h(j.prototype, {\n        executeOrEnqueue: function(k, l, m, n) {\n            return this._controller.executeOrEnqueue({\n                start: k,\n                limit: l\n            }, m, {\n                strict: !!n\n            });\n        },\n        unsubscribe: function(k) {\n            this._controller.unsubscribe(k);\n        },\n        getUnavailableResources: function(k) {\n            var l = this._controller.getRequest(k), m = [];\n            if (((l && !this._reachedEndOfArray))) {\n                var n = l.request, o = this._filterForStrictResults(l.options), p = ((n.start + n.limit));\n                for (var q = o.length; ((q < p)); q++) {\n                    m.push(q);\n                ;\n                };\n            ;\n            }\n        ;\n        ;\n            return m;\n        },\n        addResources: function(k) {\n            k.forEach(function(l) {\n                if (!this._existingIDs[l]) {\n                    this._existingIDs[l] = true;\n                    this._resources.push(l);\n                    this._error = null;\n                }\n            ;\n            ;\n            }.bind(this));\n            this.resortResources();\n            this._controller.runPossibleCallbacks();\n        },\n        addResourcesWithoutSorting: function(k, l) {\n            var m = this._resources.slice(0, l);\n            m = m.concat(k);\n            m = m.concat(this._resources.slice(l));\n            this._resources = m;\n            h(this._existingIDs, i(k, true));\n            this._error = null;\n            this._controller.runPossibleCallbacks();\n        },\n        removeResources: function(k) {\n            k.forEach(function(l) {\n                if (this._existingIDs[l]) {\n                    this._existingIDs[l] = false;\n                    var m = this._resources.indexOf(l);\n                    if (((m != -1))) {\n                        this._resources.splice(m, 1);\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n            }.bind(this));\n        },\n        removeAllResources: function() {\n            this._resources = [];\n            this._existingIDs = {\n            };\n        },\n        resortResources: function() {\n            this._resources = this._resources.sort(function(k, l) {\n                return this._compareValuesHandler(this._getValueHandler(k), this._getValueHandler(l));\n            }.bind(this));\n        },\n        setReachedEndOfArray: function() {\n            if (!this._reachedEndOfArray) {\n                this._reachedEndOfArray = true;\n                this._error = null;\n                this._controller.runPossibleCallbacks();\n            }\n        ;\n        ;\n        },\n        hasReachedEndOfArray: function() {\n            return this._reachedEndOfArray;\n        },\n        setError: function(k) {\n            if (((this._error !== k))) {\n                this._error = k;\n                this._controller.runPossibleCallbacks();\n            }\n        ;\n        ;\n        },\n        getError: function(k, l, m) {\n            var n = this._filterForStrictResults({\n                strict: m\n            });\n            return ((((((k + l)) > n.length)) ? this._error : null));\n        },\n        hasResource: function(k) {\n            return this._existingIDs[k];\n        },\n        getResourceAtIndex: function(k) {\n            return this._resources[k];\n        },\n        getAllResources: function() {\n            return this._resources.concat();\n        },\n        getCurrentArraySize: function() {\n            return this._resources.length;\n        },\n        _filterForStrictResults: function(k) {\n            var l = this._resources;\n            if (((((k && k.strict)) && this._skipOnStrictHandler))) {\n                l = l.filter(this._skipOnStrictHandler);\n            }\n        ;\n        ;\n            return l;\n        },\n        _constructCallbackArg: function(k, l) {\n            var m = this._filterForStrictResults(l);\n            if (((((!this._reachedEndOfArray && !this._error)) && ((((k.start + k.limit)) > m.length))))) {\n                return false;\n            }\n             else {\n                var n = m.slice(k.start, ((k.start + k.limit))), o = ((((((k.start + k.limit)) > m.length)) ? this._error : null));\n                return [n,o,];\n            }\n        ;\n        ;\n        },\n        getElementsUntil: function(k) {\n            var l = [];\n            for (var m = 0; ((m < this._resources.length)); m++) {\n                var n = this._getValueHandler(this._resources[m]);\n                if (((this._compareValuesHandler(n, k) > 0))) {\n                    break;\n                }\n            ;\n            ;\n                l.push(this._resources[m]);\n            };\n        ;\n            return l;\n        }\n    });\n    e.exports = j;\n});\n__d(\"MercuryFolders\", [\"MessagingTag\",\"arrayContains\",], function(a, b, c, d, e, f) {\n    var g = b(\"MessagingTag\"), h = b(\"arrayContains\"), i = [g.INBOX,g.OTHER,g.ACTION_ARCHIVED,g.SPAM,], j = {\n        getSupportedFolders: function() {\n            return i.concat();\n        },\n        isSupportedFolder: function(k) {\n            return h(i, k);\n        },\n        getFromMeta: function(k) {\n            var l = k.folder;\n            if (k.is_archived) {\n                l = g.ACTION_ARCHIVED;\n            }\n        ;\n        ;\n            return l;\n        }\n    };\n    e.exports = j;\n});\n__d(\"MercuryAttachment\", [\"MercuryAttachmentContentType\",\"MercuryAttachmentType\",\"startsWith\",], function(a, b, c, d, e, f) {\n    var g = b(\"MercuryAttachmentContentType\"), h = b(\"MercuryAttachmentType\"), i = b(\"startsWith\"), j = {\n        getAttachIconClass: function(k) {\n            switch (k) {\n              case g.PHOTO:\n                return \"MercuryPhotoIcon\";\n              case g.VIDEO:\n                return \"MercuryVideoIcon\";\n              case g.MUSIC:\n                return \"MercuryMusicIcon\";\n              case g.VOICE:\n                return \"MercuryVoiceIcon\";\n              case g.TEXT:\n                return \"MercuryTextIcon\";\n              case g.MSWORD:\n                return \"MercuryMSWordIcon\";\n              case g.MSXLS:\n                return \"MercuryMSXLSIcon\";\n              case g.MSPPT:\n                return \"MercuryMSPPTIcon\";\n            };\n        ;\n            return \"MercuryDefaultIcon\";\n        },\n        getAttachIconClassByMime: function(k) {\n            if (i(k, \"image\")) {\n                return \"MercuryPhotoIcon\";\n            }\n             else if (i(k, \"video\")) {\n                return \"MercuryVideoIcon\";\n            }\n             else if (i(k, \"audio\")) {\n                return \"MercuryMusicIcon\";\n            }\n             else if (i(k, \"text/plain\")) {\n                return \"MercuryTextIcon\";\n            }\n             else return \"MercuryDefaultIcon\"\n            \n            \n            \n        ;\n        },\n        getAttachTypeByMime: function(k) {\n            if (i(k, \"image\")) {\n                return g.PHOTO;\n            }\n             else if (i(k, \"video\")) {\n                return g.VIDEO;\n            }\n             else if (i(k, \"audio\")) {\n                return g.MUSIC;\n            }\n             else if (i(k, \"text/plain\")) {\n                return g.TEXT;\n            }\n             else return g.UNKNOWN\n            \n            \n            \n        ;\n        },\n        convertRaw: function(k) {\n            var l = [];\n            for (var m = 0; ((m < k.length)); m++) {\n                var n = k[m];\n                if (((n.attach_type === h.PHOTO))) {\n                    l.push(n);\n                }\n                 else if (n.filename) {\n                    var o = j.getAttachTypeByMime(n.filetype), p = {\n                    };\n                    p.attach_type = h.FILE;\n                    p.JSBNG__name = n.filename;\n                    p.icon_type = o;\n                    p.url = \"\";\n                    if (((o == g.PHOTO))) {\n                        p.preview_loading = true;\n                    }\n                ;\n                ;\n                    l.push(p);\n                }\n                \n            ;\n            ;\n            };\n        ;\n            return l;\n        }\n    };\n    e.exports = j;\n});\n__d(\"MercuryThreads\", [\"Arbiter\",\"TimestampConverter\",\"MercuryFolders\",\"JSLogger\",\"KeyedCallbackManager\",\"MercuryActionTypeConstants\",\"MercuryAssert\",\"MercuryAttachment\",\"MercuryGlobalActionType\",\"MercuryIDs\",\"MercuryLogMessageType\",\"MercurySingletonMixin\",\"MercuryThreadMode\",\"MessagingTag\",\"MercuryParticipants\",\"MercuryServerRequests\",\"MercuryThreadInformer\",\"copyProperties\",\"createObjectFrom\",\"removeFromArray\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"TimestampConverter\"), i = b(\"MercuryFolders\"), j = b(\"JSLogger\"), k = b(\"KeyedCallbackManager\"), l = b(\"MercuryActionTypeConstants\"), m = b(\"MercuryAssert\"), n = b(\"MercuryAttachment\"), o = b(\"MercuryGlobalActionType\"), p = b(\"MercuryIDs\"), q = b(\"MercuryLogMessageType\"), r = b(\"MercurySingletonMixin\"), s = b(\"MercuryThreadMode\"), t = b(\"MessagingTag\"), u = b(\"MercuryParticipants\"), v = b(\"MercuryServerRequests\"), w = b(\"MercuryThreadInformer\"), x = b(\"copyProperties\"), y = b(\"createObjectFrom\"), z = b(\"removeFromArray\"), aa = j.create(\"mercury_threads\");\n    function ba(na, oa, pa) {\n        var qa = y(oa.participants, true), ra = u.getIDForUser(na._fbid);\n        pa.forEach(function(sa) {\n            if (((qa[sa] !== true))) {\n                oa.participants.push(sa);\n                if (((sa === ra))) {\n                    oa.is_subscribed = true;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n        });\n    };\n;\n    function ca(na, oa, pa) {\n        z(oa.participants, pa);\n        if (((pa === u.getIDForUser(na._fbid)))) {\n            oa.is_subscribed = false;\n        }\n    ;\n    ;\n    };\n;\n    function da(na, oa) {\n        if (((na.participants[0] != oa))) {\n            z(na.participants, oa);\n            na.participants.unshift(oa);\n        }\n    ;\n    ;\n    };\n;\n    function ea(na, oa) {\n        var pa = oa.body, qa = oa.subject, ra = \"\";\n        if (qa) {\n            qa = qa.toLowerCase();\n            if (((pa.slice(0, qa.length).toLowerCase() == qa))) {\n                ra = pa;\n            }\n             else if (pa) {\n                ra = ((((qa + \" \\u00b7 \")) + pa));\n            }\n             else ra = qa;\n            \n        ;\n        ;\n        }\n         else ra = pa;\n    ;\n    ;\n        na.snippet = ra;\n        na.snippet_has_attachment = oa.has_attachment;\n        if (((oa.raw_attachments && ((oa.raw_attachments.length > 0))))) {\n            var sa = n.convertRaw(oa.raw_attachments);\n            na.snippet_attachments = sa;\n        }\n         else na.snippet_attachments = oa.attachments;\n    ;\n    ;\n        na.is_forwarded_snippet = !!oa.forward_count;\n        na.snippet_sender = oa.author;\n    };\n;\n    function fa(na, oa, pa) {\n        if (!oa) {\n            return false;\n        }\n    ;\n    ;\n        if (!oa.timestamp) {\n            return true;\n        }\n    ;\n    ;\n        var qa = !oa.unread_count;\n        if (((pa == qa))) {\n            return false;\n        }\n    ;\n    ;\n        oa.unread_count = ((pa ? 0 : 1));\n        na._threadInformer.updatedThread(oa.thread_id);\n        return true;\n    };\n;\n    function ga(na, oa) {\n        var pa = na._threads.getAllResources();\n        {\n            var fin243keys = ((window.top.JSBNG_Replay.forInKeys)((pa))), fin243i = (0);\n            var qa;\n            for (; (fin243i < fin243keys.length); (fin243i++)) {\n                ((qa) = (fin243keys[fin243i]));\n                {\n                    var ra = pa[qa];\n                    if (((ra.folder == oa))) {\n                        ra.unread_count = 0;\n                        na._threads.setResource(qa, ra);\n                        na._threadInformer.updatedThread(qa);\n                    }\n                ;\n                ;\n                };\n            };\n        };\n    ;\n    };\n;\n    function ha(na, oa, pa) {\n        if (((!oa || ((oa.chat_clear_time === pa))))) {\n            return false;\n        }\n    ;\n    ;\n        oa.chat_clear_time = pa;\n        na._threadInformer.reorderedMessages(oa.thread_id);\n        return true;\n    };\n;\n    function ia(na, oa, pa, qa) {\n        var ra = pa.action_type;\n        if (((((ra == l.USER_GENERATED_MESSAGE)) || ((ra == l.LOG_MESSAGE))))) {\n            ((pa.is_unread && oa.unread_count++));\n            oa.message_count++;\n            oa.is_archived = false;\n        }\n    ;\n    ;\n        switch (ra) {\n          case l.USER_GENERATED_MESSAGE:\n            da(oa, pa.author);\n            break;\n          case l.SEND_MESSAGE:\n            var sa = pa.log_message_type;\n            if (((sa == q.THREAD_IMAGE))) {\n                oa.image_src = ((pa.log_message_data.image ? pa.log_message_data.image.preview_url : null));\n            }\n        ;\n        ;\n            oa.snippet_attachments = pa.attachments;\n            break;\n          case l.LOG_MESSAGE:\n            var sa = pa.log_message_type;\n            if (((sa == q.SUBSCRIBE))) {\n                ba(na, oa, pa.log_message_data.added_participants);\n            }\n             else if (((sa == q.JOINABLE_JOINED))) {\n                ba(na, oa, [pa.log_message_data.joined_participant,]);\n            }\n             else if (((sa == q.UNSUBSCRIBE))) {\n                ca(na, oa, pa.author);\n            }\n             else if (((sa == q.THREAD_IMAGE))) {\n                if (!qa) {\n                    oa.image_src = ((pa.log_message_data.image ? pa.log_message_data.image.preview_url : null));\n                }\n            ;\n            ;\n            }\n             else if (((sa == q.THREAD_NAME))) {\n                oa.JSBNG__name = pa.log_message_data.JSBNG__name;\n            }\n            \n            \n            \n            \n        ;\n        ;\n            break;\n          case l.CHANGE_READ_STATUS:\n            if (pa.timestamp) {\n                na._threadInformer.changedThreadReadState(oa.thread_id, pa.mark_as_read, pa.timestamp);\n            }\n        ;\n        ;\n            fa(na, oa, pa.mark_as_read);\n            break;\n          case l.CLEAR_CHAT:\n            ha(na, oa, pa.clear_time);\n            break;\n          case l.CHANGE_ARCHIVED_STATUS:\n            oa.is_archived = pa.archived;\n            break;\n          case l.CHANGE_FOLDER:\n            oa.folder = pa.new_folder;\n            break;\n          case l.DELETE_MESSAGES:\n            if (qa) {\n                oa.snippet = \"...\";\n                oa.snippet_has_attachment = false;\n                oa.snippet_attachments = null;\n                oa.snippet_sender = null;\n                oa.is_forwarded_snippet = false;\n                na._threadInformer.updatedThread(pa.thread_id);\n            }\n             else if (pa.message_ids) {\n                oa.message_count = ((oa.message_count - pa.message_ids.length));\n            }\n            \n        ;\n        ;\n            break;\n          case l.CHANGE_MUTE_SETTINGS:\n            if (((pa.mute_settings !== undefined))) {\n                var ta = ((na._fbid + \"@facebook.com\"));\n                if (oa.mute_settings) {\n                    if (pa.mute_settings) {\n                        oa.mute_settings[ta] = pa.mute_settings;\n                    }\n                     else delete oa.mute_settings[ta];\n                ;\n                ;\n                    na._threadInformer.updatedThread(oa.thread_id);\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            break;\n        };\n    ;\n        if (pa.action_id) {\n            oa.last_action_id = h.maxValidActionID(pa.action_id, oa.last_action_id);\n        }\n    ;\n    ;\n    };\n;\n    function ja(na, oa) {\n        var pa = na._serverRequests.tokenizeThreadID(oa.thread_id);\n        if (((pa.type == \"group\"))) {\n            aa.error(\"invalid_new_thread_message\", oa);\n            return undefined;\n        }\n    ;\n    ;\n        var qa = la(na, oa.specific_to_list), ra = {\n            thread_id: oa.thread_id,\n            last_action_id: oa.action_id,\n            participants: oa.specific_to_list,\n            JSBNG__name: null,\n            snippet: oa.body,\n            snippet_has_attachment: false,\n            snippet_attachments: [],\n            snippet_sender: oa.author,\n            unread_count: 0,\n            message_count: 0,\n            image_src: null,\n            timestamp_absolute: oa.timestamp_absolute,\n            timestamp_relative: oa.timestamp_relative,\n            timestamp: oa.timestamp,\n            canonical_fbid: ((((pa.type === \"user\")) ? pa.value : null)),\n            is_canonical_user: ((pa.type === \"user\")),\n            is_canonical: qa,\n            is_subscribed: true,\n            root_message_threading_id: oa.message_id,\n            folder: t.INBOX,\n            is_archived: false,\n            mode: s.TITAN_ORIGINATED\n        };\n        return ra;\n    };\n;\n    function ka(na) {\n        this._fbid = na;\n        this._serverRequests = v.getForFBID(this._fbid);\n        this._threadInformer = w.getForFBID(this._fbid);\n        this._threads = new k();\n        ma(this);\n    };\n;\n    x(ka.prototype, {\n        getThreadMetaNow: function(na) {\n            m.isThreadID(na);\n            return this._threads.getResource(na);\n        },\n        getThreadMeta: function(na, oa, pa) {\n            m.isThreadID(na);\n            var qa = this._threads.executeOrEnqueue(na, oa), ra = this._threads.getUnavailableResources(qa);\n            if (ra.length) {\n                var sa = this._serverRequests.tokenizeThreadID(na);\n                if (((sa.type == \"user\"))) {\n                    this.getCanonicalThreadToUser(sa.value);\n                }\n                 else this._serverRequests.fetchThreadData(ra, pa);\n            ;\n            ;\n            }\n        ;\n        ;\n            return qa;\n        },\n        unsubscribe: function(na) {\n            this._threads.unsubscribe(na);\n        },\n        changeThreadReadStatus: function(na, oa) {\n            m.isThreadID(na);\n            var pa = this._threads.getResource(na);\n            if (fa(this, pa, oa)) {\n                this._serverRequests.changeThreadReadStatus(na, oa, i.getFromMeta(pa));\n            }\n        ;\n        ;\n        },\n        changeThreadArchivedStatus: function(na, oa) {\n            m.isThreadID(na);\n            var pa = this._threads.getResource(na);\n            if (((pa.is_archived != oa))) {\n                pa.is_archived = oa;\n                this._threadInformer.updatedThread(pa.thread_id);\n                this._serverRequests.changeThreadArchivedStatus(na, oa);\n            }\n        ;\n        ;\n        },\n        markThreadSpam: function(na) {\n            this._serverRequests.markThreadSpam(na);\n        },\n        unmarkThreadSpam: function(na) {\n            this._serverRequests.unmarkThreadSpam(na);\n        },\n        updateThreadMuteSetting: function(na, oa) {\n            this._serverRequests.changeMutingOnThread(na, oa);\n        },\n        changeFolder: function(na, oa) {\n            m.isThreadID(na);\n            var pa = this._threads.getResource(na);\n            if (((pa && ((pa.folder != oa))))) {\n                pa.folder = oa;\n                this._threadInformer.updatedThread(pa.thread_id);\n                this._serverRequests.changeThreadFolder(na, oa);\n            }\n        ;\n        ;\n        },\n        deleteThread: function(na) {\n            m.isThreadID(na);\n            this._serverRequests.deleteThread(na);\n        },\n        updateThreads: function(na) {\n            if (((!na || !na.length))) {\n                return;\n            }\n        ;\n        ;\n            var oa = {\n            };\n            na.forEach(function(pa) {\n                oa[pa.thread_id] = pa;\n            });\n            this._threads.addResourcesAndExecute(oa);\n        },\n        updateMetadataByActions: function(na, oa) {\n            if (((!na || !na.length))) {\n                return;\n            }\n        ;\n        ;\n            var pa = {\n            }, qa = {\n            }, ra = {\n            };\n            for (var sa = 0; ((sa < na.length)); sa++) {\n                var ta = na[sa];\n                if (ta.is_forward) {\n                    continue;\n                }\n            ;\n            ;\n                var ua = ta.action_type, va = ta.thread_id;\n                m.isThreadID(va);\n                var wa = this.getThreadMetaNow(va);\n                if (((((ua == l.LOG_MESSAGE)) && ((ta.log_message_type == q.SERVER_ERROR))))) {\n                    continue;\n                }\n            ;\n            ;\n                if (((((!wa && !ta.action_id)) && ((ua == l.USER_GENERATED_MESSAGE))))) {\n                    wa = ja(this, ta);\n                    this._threads.setResource(va, wa);\n                }\n            ;\n            ;\n                if (wa) {\n                    if (((ua == l.DELETE_THREAD))) {\n                        wa.message_count = 0;\n                        this._threadInformer.deletedThread(va);\n                        continue;\n                    }\n                ;\n                ;\n                    var xa = !!ta.action_id;\n                    if (((((ua == l.LOG_MESSAGE)) || ((ua == l.USER_GENERATED_MESSAGE))))) {\n                        xa = !oa;\n                    }\n                ;\n                ;\n                    if (((((wa.server_timestamp && ((ta.timestamp <= wa.server_timestamp)))) && xa))) {\n                        continue;\n                    }\n                ;\n                ;\n                    if (!ra[va]) {\n                        ra[va] = x({\n                        }, wa);\n                    }\n                ;\n                ;\n                    ia(this, ra[va], ta, oa);\n                    if (((ua == l.USER_GENERATED_MESSAGE))) {\n                        pa[va] = ta;\n                    }\n                ;\n                ;\n                    if (((((((ua == l.USER_GENERATED_MESSAGE)) || ((ua == l.LOG_MESSAGE)))) || ((ua == l.SEND_MESSAGE))))) {\n                        if (((((ta && ta.timestamp)) && ((!qa[va] || ((ta.timestamp > qa[va].timestamp))))))) {\n                            qa[va] = ta;\n                        }\n                    ;\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n            };\n        ;\n            {\n                var fin244keys = ((window.top.JSBNG_Replay.forInKeys)((ra))), fin244i = (0);\n                var ya;\n                for (; (fin244i < fin244keys.length); (fin244i++)) {\n                    ((ya) = (fin244keys[fin244i]));\n                    {\n                        var za = ra[ya], ab = pa[ya];\n                        if (ab) {\n                            ea(za, ab);\n                        }\n                    ;\n                    ;\n                        var bb = qa[ya], cb = za.timestamp;\n                        if (bb) {\n                            if (((bb.timestamp > cb))) {\n                                za = x(za, {\n                                    timestamp_absolute: bb.timestamp_absolute,\n                                    timestamp_relative: bb.timestamp_relative,\n                                    timestamp: bb.timestamp\n                                });\n                            }\n                        ;\n                        ;\n                            var db = za.server_timestamp;\n                            if (((!oa && ((bb.timestamp > db))))) {\n                                za.server_timestamp = bb.timestamp;\n                            }\n                        ;\n                        ;\n                        }\n                    ;\n                    ;\n                        this._threads.setResource(ya, za);\n                    };\n                };\n            };\n        ;\n        },\n        getCanonicalThreadToUser: function(na, oa, pa) {\n            return this.getCanonicalThreadToParticipant(((\"fbid:\" + na)), oa, pa);\n        },\n        getCanonicalThreadToParticipant: function(na, oa, pa) {\n            var qa = this.getThreadIDForParticipant(na), ra = this._threads.getResource(qa);\n            if (((typeof ra == \"undefined\"))) {\n                ra = this.createNewLocalThread(qa, [u.getIDForUser(this._fbid),na,], oa);\n                this._serverRequests.fetchThreadData([qa,], pa);\n            }\n        ;\n        ;\n            return ra;\n        },\n        getThreadIdForUser: function(na) {\n            return ((\"user:\" + na));\n        },\n        getThreadIDForParticipant: function(na) {\n            var oa = p.tokenize(na);\n            return this.getThreadIdForUser(oa.value);\n        },\n        createNewLocalThread: function(na, oa, pa) {\n            var qa = this._threads.getResource(na);\n            if (!qa) {\n                var ra = this._serverRequests.tokenizeThreadID(na);\n                qa = {\n                    thread_id: na,\n                    last_action_id: null,\n                    participants: oa,\n                    JSBNG__name: null,\n                    snippet: \"\",\n                    snippet_has_attachment: false,\n                    snippet_sender: null,\n                    unread_count: ((pa ? pa : 0)),\n                    message_count: 0,\n                    image_src: null,\n                    timestamp_absolute: null,\n                    timestamp_relative: null,\n                    timestamp: null,\n                    canonical_fbid: ((((ra.type === \"user\")) ? ra.value : null)),\n                    is_canonical_user: ((ra.type == \"user\")),\n                    is_canonical: la(this, oa),\n                    is_subscribed: true,\n                    root_message_threading_id: null,\n                    folder: t.INBOX,\n                    is_archived: false,\n                    mode: s.TITAN_ORIGINATED\n                };\n                this._threads.setResource(na, qa);\n            }\n        ;\n        ;\n            return qa;\n        },\n        addParticipantsToThreadLocally: function(na, oa) {\n            var pa = this._threads.getResource(na);\n            if (pa) {\n                ba(this, pa, oa);\n                this._threadInformer.updatedThread(pa.thread_id);\n            }\n        ;\n        ;\n        },\n        getCanonicalUserInThread: function(na) {\n            var oa = this._serverRequests.tokenizeThreadID(na);\n            return ((((oa.type == \"user\")) ? oa.value : null));\n        },\n        getCanonicalGroupInThread: function(na) {\n            var oa = this._serverRequests.tokenizeThreadID(na);\n            return ((((oa.type == \"group\")) ? oa.value : null));\n        },\n        isEmptyLocalThread: function(na) {\n            var oa = this._threads.getResource(na);\n            if (!oa) {\n                return false;\n            }\n        ;\n        ;\n            var pa = this._serverRequests.tokenizeThreadID(na);\n            return ((((pa.type == \"root\")) && !oa.timestamp));\n        },\n        isNewEmptyLocalThread: function(na) {\n            if (!this.isEmptyLocalThread(na)) {\n                return false;\n            }\n        ;\n        ;\n            var oa = this._threads.getResource(na);\n            return ((oa.participants && ((oa.participants.length === 0))));\n        },\n        canReply: function(na) {\n            var oa = this._threads.getResource(na);\n            return ((((((oa && oa.is_subscribed)) && ((oa.mode != s.OBJECT_ORIGINATED)))) && ((oa.recipients_loadable || ((oa.recipients_loadable === undefined))))));\n        }\n    });\n    x(ka, r);\n    function la(na, oa) {\n        var pa = oa.filter(function(qa) {\n            return ((qa != u.getIDForUser(na._fbid)));\n        });\n        return ((pa.length <= 1));\n    };\n;\n    function ma(na) {\n        na._serverRequests.subscribe(\"update-threads\", function(oa, pa) {\n            var qa = ((pa.actions || [])).filter(function(ua) {\n                return ua.thread_id;\n            });\n            na.updateThreads(pa.threads);\n            na.updateMetadataByActions(qa, pa.from_client);\n            ((pa.threads || [])).forEach(function(ua) {\n                na._threadInformer.updatedThread(ua.thread_id);\n            });\n            var ra = ((pa.global_actions || []));\n            for (var sa = 0; ((sa < ra.length)); sa++) {\n                var ta = ra[sa];\n                if (((ta.action_type == o.MARK_ALL_READ))) {\n                    ga(na, ta.folder);\n                }\n            ;\n            ;\n            };\n        ;\n        });\n    };\n;\n    g.subscribe(j.DUMP_EVENT, function(na, oa) {\n        oa.messaging = ((oa.messaging || {\n        }));\n        oa.messaging.threads = {\n        };\n        var pa = ka._getInstances();\n        {\n            var fin245keys = ((window.top.JSBNG_Replay.forInKeys)((pa))), fin245i = (0);\n            var qa;\n            for (; (fin245i < fin245keys.length); (fin245i++)) {\n                ((qa) = (fin245keys[fin245i]));\n                {\n                    oa.messaging.threads[qa] = pa[qa]._threads.dumpResources();\n                ;\n                };\n            };\n        };\n    ;\n    });\n    e.exports = ka;\n});\n__d(\"formatDate\", [\"DateFormatConfig\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"DateFormatConfig\"), h = b(\"tx\"), i = [\"Sun\",\"Mon\",\"Tue\",\"Wed\",\"Thu\",\"Fri\",\"Sat\",], j = [\"Sunday\",\"Monday\",\"Tuesday\",\"Wednesday\",\"Thursday\",\"Friday\",\"Saturday\",], k = [\"Jan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\"Aug\",\"Sep\",\"Oct\",\"Nov\",\"Dec\",], l = [\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\",];\n    function m(o, p) {\n        p = ((p || 2));\n        o = ((\"\" + o));\n        while (((o.length < p))) {\n            o = ((\"0\" + o));\n        ;\n        };\n    ;\n        return o;\n    };\n;\n    function n(o, p, q, r) {\n        if (!p) {\n            return \"\";\n        }\n    ;\n    ;\n        var s = [], t = null, u = null, v = ((q ? \"getUTC\" : \"get\")), w = o[((v + \"JSBNG__Date\"))](), x = o[((v + \"Day\"))](), y = o[((v + \"Month\"))](), z = o[((v + \"FullYear\"))](), aa = o[((v + \"Hours\"))](), ba = o[((v + \"Minutes\"))](), ca = o[((v + \"Seconds\"))](), da = o[((v + \"Milliseconds\"))]();\n        for (var ea = 0; ((ea < p.length)); ea++) {\n            u = p.charAt(ea);\n            if (((u == \"\\\\\"))) {\n                ea++;\n                s.push(p.charAt(ea));\n                continue;\n            }\n        ;\n        ;\n            switch (u) {\n              case \"d\":\n                t = m(w);\n                break;\n              case \"D\":\n                t = i[x];\n                break;\n              case \"j\":\n                t = w;\n                break;\n              case \"l\":\n                t = j[x];\n                break;\n              case \"F\":\n            \n              case \"f\":\n                t = l[y];\n                break;\n              case \"m\":\n                t = m(((y + 1)));\n                break;\n              case \"M\":\n                t = k[y];\n                break;\n              case \"n\":\n                t = ((y + 1));\n                break;\n              case \"Y\":\n                t = z;\n                break;\n              case \"y\":\n                t = ((\"\" + z)).slice(2);\n                break;\n              case \"a\":\n                t = ((((aa < 12)) ? \"am\" : \"pm\"));\n                break;\n              case \"A\":\n                t = ((((aa < 12)) ? \"AM\" : \"PM\"));\n                break;\n              case \"g\":\n                t = ((((((aa == 0)) || ((aa == 12)))) ? 12 : ((aa % 12))));\n                break;\n              case \"G\":\n                t = aa;\n                break;\n              case \"h\":\n                t = ((((((aa == 0)) || ((aa == 12)))) ? 12 : m(((aa % 12)))));\n                break;\n              case \"H\":\n                t = m(aa);\n                break;\n              case \"i\":\n                t = m(ba);\n                break;\n              case \"s\":\n                t = m(ca);\n                break;\n              case \"S\":\n                if (r) {\n                    t = g.ordinalSuffixes[w];\n                }\n                 else t = m(da, 3);\n            ;\n            ;\n                break;\n              default:\n                t = u;\n            };\n        ;\n            s.push(t);\n        };\n    ;\n        return s.join(\"\");\n    };\n;\n    e.exports = n;\n});\n__d(\"MercuryMessages\", [\"Arbiter\",\"AsyncRequest\",\"Env\",\"JSLogger\",\"KeyedCallbackManager\",\"MercuryActionTypeConstants\",\"MercuryActionStatus\",\"MercuryAssert\",\"MercuryAttachmentType\",\"MercuryConfig\",\"MercuryGenericConstants\",\"MercuryIDs\",\"MercuryLogMessageType\",\"MercuryMessageSourceTags\",\"MercuryPayloadSource\",\"MercurySingletonMixin\",\"MercurySourceType\",\"MercuryTimePassed\",\"MercuryMessageIDs\",\"MercuryParticipants\",\"PresenceUtil\",\"RangedCallbackManager\",\"MercuryServerRequests\",\"MercuryThreadInformer\",\"MercuryThreads\",\"copyProperties\",\"debounce\",\"formatDate\",\"randomInt\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"AsyncRequest\"), i = b(\"Env\"), j = b(\"JSLogger\"), k = b(\"KeyedCallbackManager\"), l = b(\"MercuryActionTypeConstants\"), m = b(\"MercuryActionStatus\"), n = b(\"MercuryAssert\"), o = b(\"MercuryAttachmentType\"), p = b(\"MercuryConfig\"), q = b(\"MercuryGenericConstants\"), r = b(\"MercuryIDs\"), s = b(\"MercuryLogMessageType\"), t = b(\"MercuryMessageSourceTags\"), u = b(\"MercuryPayloadSource\"), v = b(\"MercurySingletonMixin\"), w = b(\"MercurySourceType\"), x = b(\"MercuryTimePassed\"), y = b(\"MercuryMessageIDs\"), z = b(\"MercuryParticipants\"), aa = b(\"PresenceUtil\"), ba = b(\"RangedCallbackManager\"), ca = b(\"MercuryServerRequests\"), da = b(\"MercuryThreadInformer\"), ea = b(\"MercuryThreads\"), fa = b(\"copyProperties\"), ga = b(\"debounce\"), ha = b(\"formatDate\"), ia = b(\"randomInt\"), ja = b(\"tx\");\n    function ka(bb, cb) {\n        var db = cb;\n        if (bb._localIdsMap[cb]) {\n            db = bb._localIdsMap[cb];\n        }\n    ;\n    ;\n        return bb._messages[db];\n    };\n;\n    var la = new k();\n    function ma(bb, cb) {\n        if (((cb.JSBNG__status === undefined))) {\n            cb.JSBNG__status = m.UNSENT;\n        }\n    ;\n    ;\n        cb.timestamp_absolute = \"Today\";\n        cb.message_id = ((cb.message_id || bb.generateNewClientMessageID(cb.timestamp)));\n        var db = z.getIDForUser(bb._fbid);\n        cb.specific_to_list = ((cb.specific_to_list || []));\n        if (((cb.specific_to_list.length && ((cb.specific_to_list.indexOf(db) === -1))))) {\n            cb.specific_to_list.push(db);\n        }\n    ;\n    ;\n        if (!cb.thread_id) {\n            if (((cb.specific_to_list.length == 1))) {\n                cb.thread_id = ((\"user:\" + bb._fbid));\n            }\n             else if (((cb.specific_to_list.length == 2))) {\n                var eb = ((((cb.specific_to_list[0] == db)) ? cb.specific_to_list[1] : cb.specific_to_list[0]));\n                if (((r.tokenize(eb).type == \"email\"))) {\n                    cb.thread_id = q.PENDING_THREAD_ID;\n                }\n                 else cb.thread_id = bb._threads.getThreadIDForParticipant(eb);\n            ;\n            ;\n            }\n            \n        ;\n        ;\n            cb.thread_id = ((cb.thread_id || ((\"root:\" + cb.message_id))));\n        }\n    ;\n    ;\n        if (!cb.specific_to_list.length) {\n            var fb = bb._serverRequests.tokenizeThreadID(cb.thread_id);\n            if (((fb.type == \"user\"))) {\n                cb.specific_to_list = [((\"fbid:\" + fb.value)),db,];\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n    };\n;\n    function na(bb, cb, db, eb) {\n        var fb = ((xa(db) ? [t.CHAT,] : [])), gb = JSBNG__Date.now(), hb = ha(new JSBNG__Date(gb), ((p[\"24h_times\"] ? \"H:i\" : \"g:ia\"))), ib = {\n            action_type: cb,\n            thread_id: eb,\n            author: z.getIDForUser(bb._fbid),\n            author_email: null,\n            coordinates: null,\n            timestamp: gb,\n            timestamp_absolute: (new JSBNG__Date(gb)).toLocaleDateString(),\n            timestamp_relative: hb,\n            timestamp_time_passed: x.TODAY,\n            is_unread: false,\n            is_cleared: false,\n            is_forward: false,\n            is_filtered_content: false,\n            spoof_warning: false,\n            source: db,\n            source_tags: fb\n        };\n        return ib;\n    };\n;\n    function oa(bb) {\n        switch (bb) {\n          case u.UNKNOWN:\n        \n          case u.SERVER_INITIAL_DATA:\n        \n          case u.SERVER_FETCH_THREAD_INFO:\n        \n          case u.SERVER_THREAD_SYNC:\n            return true;\n        };\n    ;\n        return false;\n    };\n;\n    function pa(bb) {\n        return ((bb && ((bb.substr(0, 6) === \"server\"))));\n    };\n;\n    function qa(bb, cb) {\n        if (!bb._threadsToMessages[cb]) {\n            bb._threadsToMessages[cb] = new ba(function(db) {\n                return ka(bb, db).timestamp;\n            }, function(db, eb) {\n                return ((eb - db));\n            });\n        }\n    ;\n    ;\n        return bb._threadsToMessages[cb];\n    };\n;\n    g.subscribe(j.DUMP_EVENT, function(bb, cb) {\n        var db = {\n        }, eb = {\n        }, fb = sa._getInstances();\n        {\n            var fin246keys = ((window.top.JSBNG_Replay.forInKeys)((fb))), fin246i = (0);\n            var gb;\n            for (; (fin246i < fin246keys.length); (fin246i++)) {\n                ((gb) = (fin246keys[fin246i]));\n                {\n                    db[gb] = {\n                    };\n                    {\n                        var fin247keys = ((window.top.JSBNG_Replay.forInKeys)((fb[gb]._messages))), fin247i = (0);\n                        var hb;\n                        for (; (fin247i < fin247keys.length); (fin247i++)) {\n                            ((hb) = (fin247keys[fin247i]));\n                            {\n                                var ib = fb[gb]._messages[hb];\n                                if (((Object.keys(ib).length === 0))) {\n                                    continue;\n                                }\n                            ;\n                            ;\n                                var jb = ib.thread_id;\n                                db[gb][jb] = ((db[gb][jb] || {\n                                }));\n                                db[gb][jb][ib.message_id] = {\n                                    action_type: ib.action_type,\n                                    author: ib.author,\n                                    is_unread: ib.is_unread,\n                                    timestamp: ib.timestamp\n                                };\n                            };\n                        };\n                    };\n                ;\n                    eb[gb] = fa({\n                    }, fb[gb]._localIdsMap);\n                };\n            };\n        };\n    ;\n        cb.messaging = ((cb.messaging || {\n        }));\n        cb.messaging.local_message_ids = eb;\n        cb.messaging.messages = db;\n    });\n    function ra(bb, cb, db) {\n        cb.forEach(function(eb) {\n            var fb = qa(bb, eb);\n            fb.setReachedEndOfArray();\n            bb._threadInformer.reorderedMessages(eb, db);\n        });\n    };\n;\n    function sa(bb) {\n        this._fbid = bb;\n        this._serverRequests = ca.getForFBID(this._fbid);\n        this._threadInformer = da.getForFBID(this._fbid);\n        this._threads = ea.getForFBID(this._fbid);\n        this._failedHistoryFetchThreads = {\n        };\n        this._threadsToMessages = {\n        };\n        this._titanMessagesCount = {\n        };\n        this._localTitanMessagesCount = {\n        };\n        this._messages = {\n        };\n        this._attachmentData = {\n        };\n        this._messagesNeedingAttachmentData = {\n        };\n        this._localIdsMap = {\n        };\n        this._serverRequests.subscribe(\"update-messages\", function(cb, db) {\n            var eb = ((db.actions || [])).filter(function(gb) {\n                var hb = gb.action_type;\n                return ((((gb.is_forward || gb.thread_id)) && ((((((((((((hb == l.LOG_MESSAGE)) || ((hb == l.USER_GENERATED_MESSAGE)))) || ((hb == l.SEND_MESSAGE)))) || ((hb == l.CLEAR_CHAT)))) || ((hb == l.DELETE_THREAD)))) || ((hb == l.DELETE_MESSAGES))))));\n            }), fb = oa(db.payload_source);\n            if (pa(db.payload_source)) {\n                eb.forEach(function(gb) {\n                    if (!gb.is_forward) {\n                        var hb = this._threads.getThreadMetaNow(gb.thread_id);\n                        if (hb) {\n                            gb.is_cleared = ((gb.timestamp < hb.chat_clear_time));\n                        }\n                    ;\n                    ;\n                    }\n                ;\n                ;\n                }.bind(this));\n            }\n        ;\n        ;\n            this.handleUpdates(eb, fb, db.payload_source, db.from_client);\n            if (db.end_of_history) {\n                ra(this, db.end_of_history, db.payload_source);\n            }\n        ;\n        ;\n        }.bind(this));\n    };\n;\n    fa(sa.prototype, {\n        getMessagesFromIDs: function(bb) {\n            return ((bb || [])).map(ka.curry(this)).filter(function(cb) {\n                return cb;\n            });\n        },\n        hasLoadedNMessages: function(bb, cb) {\n            var db = qa(this, bb);\n            return ((db.hasReachedEndOfArray() || ((db.getCurrentArraySize() >= cb))));\n        },\n        hasLoadedExactlyNMessages: function(bb, cb) {\n            var db = qa(this, bb);\n            return ((db.getCurrentArraySize() == cb));\n        },\n        getThreadMessagesRange: function(bb, cb, db, eb, fb, gb) {\n            var hb = qa(this, bb), ib = function(ob) {\n                eb(ta(this, ob));\n            }.bind(this), jb = hb.executeOrEnqueue(cb, db, ib), kb = hb.getUnavailableResources(jb), lb = this._failedHistoryFetchThreads[bb];\n            if (((kb.length && !lb))) {\n                var mb = ((((this._titanMessagesCount[bb] || 0)) - ((this._localTitanMessagesCount[bb] || 0)))), nb = ((kb.length + ((this._localTitanMessagesCount[bb] || 0))));\n                this._serverRequests.fetchThreadMessages(bb, mb, nb, fb, gb);\n            }\n             else this._failedHistoryFetchThreads[bb] = false;\n        ;\n        ;\n            return jb;\n        },\n        getThreadMessagesSinceTimestamp: function(bb, cb) {\n            var db = qa(this, bb), eb = db.getElementsUntil(cb);\n            return ta(this, eb);\n        },\n        hasLoadedAllMessages: function(bb) {\n            return qa(this, bb).hasReachedEndOfArray();\n        },\n        getCurrentlyLoadedMessages: function(bb) {\n            var cb = qa(this, bb).getAllResources();\n            return ta(this, cb);\n        },\n        unsubscribe: function(bb, cb) {\n            n.isThreadID(cb);\n            var db = qa(this, cb);\n            db.unsubscribe(bb);\n        },\n        addAttachmentData: function(bb, cb, db) {\n            var eb = ka(this, bb);\n            if (eb) {\n                var fb = eb.attachments.indexOf(cb);\n                if (((fb != -1))) {\n                    eb.attachments[fb] = db;\n                    this._threadInformer.updatedMessage(eb.thread_id, eb.message_id, \"attach\");\n                }\n            ;\n            ;\n            }\n             else {\n                if (!this._attachmentData[bb]) {\n                    this._attachmentData[bb] = [];\n                }\n            ;\n            ;\n                this._attachmentData[bb].push({\n                    attach_key: cb,\n                    data: db\n                });\n            }\n        ;\n        ;\n        },\n        handleUpdates: function(bb, cb, db, eb) {\n            var fb, gb = {\n            }, hb = {\n            };\n            for (var ib = 0; ((ib < bb.length)); ib++) {\n                var jb = bb[ib];\n                if (((jb.is_forward || ((db == u.SERVER_SEARCH))))) {\n                    if (!this._messages[jb.message_id]) {\n                        this._messages[jb.message_id] = jb;\n                        ya(this, jb);\n                    }\n                ;\n                ;\n                    continue;\n                }\n            ;\n            ;\n                var kb = jb.action_type;\n                if (((kb == l.SEND_MESSAGE))) {\n                    var lb = jb.client_message_id;\n                    if (((((lb && this._localIdsMap[lb])) && jb.JSBNG__status))) {\n                        if (((jb.JSBNG__status == m.UNCONFIRMED))) {\n                            if (!hb[jb.thread_id]) {\n                                hb[jb.thread_id] = [];\n                            }\n                        ;\n                        ;\n                            hb[jb.thread_id].push(jb.client_message_id);\n                        }\n                         else if (!gb[jb.thread_id]) {\n                            gb[jb.thread_id] = [];\n                        }\n                        \n                    ;\n                    ;\n                        var mb = ka(this, jb.client_message_id), nb = mb.JSBNG__status;\n                        mb.JSBNG__status = jb.JSBNG__status;\n                        if (((((jb.JSBNG__status === m.SUCCESS)) || jb.error_data))) {\n                            mb.error_data = jb.error_data;\n                        }\n                    ;\n                    ;\n                        if (((jb.JSBNG__status == m.SUCCESS))) {\n                            this.updateLocalMessage(jb, db);\n                            if (((jb.client_thread_id == q.PENDING_THREAD_ID))) {\n                                mb.thread_id = jb.thread_id;\n                                gb[jb.thread_id].push(mb.message_id);\n                                la.setResource(mb.message_id, mb.thread_id);\n                            }\n                        ;\n                        ;\n                        }\n                    ;\n                    ;\n                        if (((((((((((typeof nb != \"undefined\")) || ((jb.JSBNG__status == m.FAILED_UNKNOWN_REASON)))) || ((jb.JSBNG__status == m.UNABLE_TO_CONFIRM)))) || ((jb.JSBNG__status == m.SUCCESS)))) || ((jb.JSBNG__status == m.ERROR))))) {\n                            this._threadInformer.updatedMessage(jb.thread_id, ka(this, jb.client_message_id).message_id, db);\n                        }\n                    ;\n                    ;\n                    }\n                ;\n                ;\n                    continue;\n                }\n                 else if (((kb == l.DELETE_THREAD))) {\n                    qa(this, jb.thread_id).removeAllResources();\n                    continue;\n                }\n                 else if (((kb == l.DELETE_MESSAGES))) {\n                    var ob = jb.message_ids.map(function(wb) {\n                        return ka(this, wb).message_id;\n                    }.bind(this));\n                    fb = qa(this, jb.thread_id);\n                    fb.removeResources(ob);\n                    this._threadInformer.reorderedMessages(jb.thread_id, db);\n                    continue;\n                }\n                 else if (((kb == l.LOG_MESSAGE))) {\n                    if (((jb.log_message_type == s.SERVER_ERROR))) {\n                        this._failedHistoryFetchThreads[jb.thread_id] = true;\n                    }\n                ;\n                ;\n                }\n                 else if (((kb == l.CLEAR_CHAT))) {\n                    var pb = qa(this, jb.thread_id).getAllResources();\n                    pb.map(ka.curry(this)).forEach(function(wb) {\n                        wb.is_cleared = true;\n                    });\n                    continue;\n                }\n                \n                \n                \n                \n            ;\n            ;\n                if (((jb.threading_id && this._localIdsMap[jb.threading_id]))) {\n                    var qb = ka(this, jb.threading_id);\n                    if (((qb && qb.is_zap))) {\n                        fb = qa(this, jb.thread_id);\n                        fb.removeResources([qb.message_id,]);\n                        this._localIdsMap[jb.threading_id] = null;\n                        this._threadInformer.reorderedMessages(jb.thread_id, db);\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n                var rb = ka(this, jb.message_id);\n                if (((((jb.threading_id && this._localIdsMap[jb.threading_id])) || ((rb && !rb.is_forward))))) {\n                    continue;\n                }\n            ;\n            ;\n                if (!gb[jb.thread_id]) {\n                    gb[jb.thread_id] = [];\n                }\n            ;\n            ;\n                gb[jb.thread_id].push(jb.message_id);\n                this._messages[jb.message_id] = jb;\n                ya(this, jb);\n                if (((jb.threading_id && ((jb.threading_id != jb.message_id))))) {\n                    y.addServerID(jb.threading_id, jb.message_id);\n                }\n            ;\n            ;\n                if (!cb) {\n                    this._threadInformer.receivedMessage(jb);\n                }\n            ;\n            ;\n            };\n        ;\n            {\n                var fin248keys = ((window.top.JSBNG_Replay.forInKeys)((gb))), fin248i = (0);\n                var sb;\n                for (; (fin248i < fin248keys.length); (fin248i++)) {\n                    ((sb) = (fin248keys[fin248i]));\n                    {\n                        fb = qa(this, sb);\n                        var tb = fb.getAllResources(), ub = tb.filter(function(wb) {\n                            var xb = this._messages[wb];\n                            return ((((xb.action_type == l.LOG_MESSAGE)) && ((xb.log_message_type == s.SERVER_ERROR))));\n                        }.bind(this));\n                        fb.removeResources(ub);\n                        ua(this, sb, gb[sb]);\n                        if (eb) {\n                            va(this, sb, gb[sb]);\n                        }\n                    ;\n                    ;\n                        if (cb) {\n                            fb.addResources(gb[sb]);\n                            this._threadInformer.reorderedMessages(sb, db);\n                        }\n                         else fb.addResourcesWithoutSorting(gb[sb].reverse(), 0);\n                    ;\n                    ;\n                        this._threadInformer.updatedThread(sb);\n                    };\n                };\n            };\n        ;\n            var vb = Object.keys(hb);\n            if (vb.length) {\n                this._serverRequests.requestMessageConfirmation(hb);\n            }\n        ;\n        ;\n        },\n        sendMessage: function(bb, cb, db) {\n            cb = ((cb || Function.prototype));\n            ma(this, bb);\n            this._localIdsMap[bb.message_id] = bb.message_id;\n            if (((bb.thread_id == ((\"root:\" + bb.message_id))))) {\n                qa(this, bb.thread_id).setReachedEndOfArray();\n            }\n        ;\n        ;\n            this._serverRequests.sendNewMessage(bb, db);\n            if (((bb.thread_id == q.PENDING_THREAD_ID))) {\n                this._messages[bb.message_id] = bb;\n                return la.executeOrEnqueue(bb.message_id, cb);\n            }\n             else cb(bb.thread_id);\n        ;\n        ;\n        },\n        zapMessage: function(bb, cb, db) {\n            if (((bb.thread_id == q.PENDING_THREAD_ID))) {\n                return;\n            }\n        ;\n        ;\n            this._localIdsMap[bb.message_id] = bb.message_id;\n            this._serverRequests.handleUpdate({\n                actions: [fa({\n                }, bb),],\n                from_client: true,\n                payload_source: u.SERVER_ZAP\n            });\n        },\n        isFirstMessage: function(bb) {\n            var cb = qa(this, bb.thread_id);\n            if (((cb.getCurrentArraySize() === 0))) {\n                return false;\n            }\n        ;\n        ;\n            var db = cb.getResourceAtIndex(((cb.getCurrentArraySize() - 1))), eb = ka(this, db).message_id, fb = ka(this, bb.message_id).message_id;\n            return ((cb.hasReachedEndOfArray() && ((eb == fb))));\n        },\n        unsubscribeSend: function(bb) {\n            la.unsubscribe(bb);\n        },\n        resendMessage: function(bb, cb) {\n            var db = fa({\n            }, bb);\n            db.JSBNG__status = m.RESENDING;\n            db.timestamp = JSBNG__Date.now();\n            db.message_id = bb.message_id;\n            this._messages[bb.message_id] = db;\n            var eb = qa(this, bb.thread_id);\n            eb.resortResources([bb.message_id,]);\n            this.sendMessage(db, null, cb);\n            this._threadInformer.reorderedMessages(bb.thread_id, u.CLIENT_SEND_MESSAGE);\n        },\n        deleteMessages: function(bb, cb) {\n            if (cb.length) {\n                var db = qa(this, bb), eb = ((((db.getCurrentArraySize() == cb.length)) && db.hasReachedEndOfArray()));\n                this._serverRequests.deleteMessages(bb, cb, eb);\n            }\n        ;\n        ;\n        },\n        markMessagesSpam: function(bb, cb) {\n            if (cb.length) {\n                var db = qa(this, bb), eb = ((((db.getCurrentArraySize() == cb.length)) && db.hasReachedEndOfArray()));\n                if (eb) {\n                    this._serverRequests.markThreadSpam(bb);\n                }\n                 else this._serverRequests.markMessagesSpam(bb, cb);\n            ;\n            ;\n            }\n        ;\n        ;\n        },\n        updateLocalMessage: function(bb, cb) {\n            var db = bb.message_id, eb = bb.client_message_id;\n            this._localIdsMap[eb] = db;\n            this._messages[db] = this._messages[eb];\n            y.addServerID(eb, db);\n            this._messages[eb] = {\n            };\n            var fb = ka(this, eb);\n            if (bb.timestamp) {\n                fb.timestamp = bb.timestamp;\n            }\n        ;\n        ;\n            if (((bb.attachments && bb.attachments.length))) {\n                fb.raw_attachments = null;\n                fb.attachments = bb.attachments;\n                ya(this, fb, db);\n            }\n        ;\n        ;\n            if (bb.log_message_data) {\n                fb.log_message_data = bb.log_message_data;\n            }\n        ;\n        ;\n            if (wa(fb)) {\n                this._localTitanMessagesCount[fb.thread_id]--;\n            }\n        ;\n        ;\n        },\n        constructUserGeneratedMessageObject: function(bb, cb, db, eb) {\n            var fb = na(this, l.USER_GENERATED_MESSAGE, cb, db);\n            fb.body = bb;\n            fb.has_attachment = false;\n            fb.html_body = false;\n            fb.attachments = [];\n            fb.specific_to_list = ((eb || []));\n            return fb;\n        },\n        constructLogMessageObject: function(bb, cb, db, eb) {\n            var fb = na(this, l.LOG_MESSAGE, bb, cb);\n            fb.log_message_type = db;\n            fb.log_message_data = eb;\n            return fb;\n        },\n        generateNewClientMessageID: function(bb) {\n            var cb = ((((((((bb + \":\")) + ((ia(0, 4294967295) + 1)))) + \"-\")) + aa.getSessionID()));\n            return ((((\"\\u003C\" + cb)) + \"@mail.projektitan.com\\u003E\"));\n        },\n        getNumberLocalMessages: function(bb) {\n            return ((this._localTitanMessagesCount[bb] || 0));\n        }\n    });\n    fa(sa, v, {\n        addAttachmentData: function(bb, cb, db, eb) {\n            eb = ((eb || i.user));\n            sa.getForFBID(eb).addAttachmentData(bb, cb, db);\n        }\n    });\n    function ta(bb, cb) {\n        var db = cb.map(ka.curry(bb));\n        return db.reverse();\n    };\n;\n    function ua(bb, cb, db) {\n        var eb = db.filter(function(fb) {\n            return wa(ka(bb, fb));\n        });\n        if (!bb._titanMessagesCount[cb]) {\n            bb._titanMessagesCount[cb] = 0;\n        }\n    ;\n    ;\n        bb._titanMessagesCount[cb] += eb.length;\n    };\n;\n    function va(bb, cb, db) {\n        var eb = db.filter(function(fb) {\n            return wa(ka(bb, fb));\n        });\n        if (!bb._localTitanMessagesCount[cb]) {\n            bb._localTitanMessagesCount[cb] = 0;\n        }\n    ;\n    ;\n        bb._localTitanMessagesCount[cb] += eb.length;\n    };\n;\n    function wa(bb) {\n        var cb = bb.action_type;\n        if (((cb == l.USER_GENERATED_MESSAGE))) {\n            return !bb.is_zap;\n        }\n    ;\n    ;\n        switch (bb.log_message_type) {\n          case s.SUBSCRIBE:\n        \n          case s.UNSUBSCRIBE:\n        \n          case s.SERVER_ERROR:\n        \n          case s.LIVE_LISTEN:\n            return false;\n          default:\n            return true;\n        };\n    ;\n    };\n;\n    function xa(bb) {\n        switch (bb) {\n          case w.CHAT_WEB:\n        \n          case w.CHAT_JABBER:\n        \n          case w.CHAT_IPHONE:\n        \n          case w.CHAT_MEEBO:\n        \n          case w.CHAT_ORCA:\n        \n          case w.CHAT_TEST:\n        \n          case w.CHAT:\n        \n          case w.DESKTOP:\n            return true;\n          default:\n            return false;\n        };\n    ;\n    };\n;\n    function ya(bb, cb, db) {\n        db = ((db || cb.message_id));\n        var eb = bb._attachmentData[db];\n        if (eb) {\n            eb.forEach(function(fb) {\n                var gb = cb.attachments.indexOf(fb.attach_key);\n                if (((gb !== -1))) {\n                    cb.attachments[gb] = fb.data;\n                }\n            ;\n            ;\n            });\n            delete bb._attachmentData[db];\n        }\n         else if (((!cb.is_forward && za(bb, cb)))) {\n            bb._messagesNeedingAttachmentData[db] = true;\n            ab(bb);\n        }\n        \n    ;\n    ;\n    };\n;\n    function za(bb, cb) {\n        if (((!cb || !cb.attachments))) {\n            return false;\n        }\n    ;\n    ;\n        for (var db = 0; ((db < cb.attachments.length)); db++) {\n            var eb = cb.attachments[db];\n            if (((((typeof eb === \"string\")) && ((eb.indexOf(o.SHARE) === 0))))) {\n                return true;\n            }\n        ;\n        ;\n        };\n    ;\n        var fb = ((cb.forward_message_ids || []));\n        for (db = 0; ((db < fb.length)); db++) {\n            var gb = ka(bb, fb[db]);\n            if (za(bb, gb)) {\n                return true;\n            }\n        ;\n        ;\n        };\n    ;\n        return false;\n    };\n;\n    var ab = ga(function(bb) {\n        var cb = {\n        };\n        {\n            var fin249keys = ((window.top.JSBNG_Replay.forInKeys)((bb._messagesNeedingAttachmentData))), fin249i = (0);\n            var db;\n            for (; (fin249i < fin249keys.length); (fin249i++)) {\n                ((db) = (fin249keys[fin249i]));\n                {\n                    var eb = ka(bb, db);\n                    if (za(bb, eb)) {\n                        cb[db] = true;\n                    }\n                ;\n                ;\n                };\n            };\n        };\n    ;\n        var fb = Object.keys(cb);\n        if (fb.length) {\n            new h(\"/ajax/mercury/attachments/fetch_shares.php\").setData({\n                message_ids: fb\n            }).setAllowCrossPageTransition(true).send();\n        }\n    ;\n    ;\n        bb._messagesNeedingAttachmentData = {\n        };\n    }, 0, this, true);\n    e.exports = sa;\n});\n__d(\"ChatOpenTab\", [\"Arbiter\",\"Banzai\",\"Bootloader\",\"ChatVisibility\",\"JSBNG__Event\",\"MercuryIDs\",\"MercuryMessages\",\"MercuryServerRequests\",\"MercuryThreads\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"Banzai\"), i = b(\"Bootloader\"), j = b(\"ChatVisibility\"), k = b(\"JSBNG__Event\"), l = b(\"MercuryIDs\"), m = b(\"MercuryMessages\").get(), n = b(\"MercuryServerRequests\").get(), o = b(\"MercuryThreads\").get(), p = \"messaging_tracking\";\n    function q(u) {\n        o.getThreadMeta(u, function() {\n            g.inform(\"chat/open-tab\", {\n                thread_id: u\n            });\n        });\n    };\n;\n    function r(u, v, w, x) {\n        k.listen(u, \"click\", function(y) {\n            if (x(v, w)) {\n                return;\n            }\n        ;\n        ;\n            return y.kill();\n        });\n    };\n;\n    function s(u, v, w) {\n        var x = {\n            referrer: ((u || \"\")),\n            message_thread_id: v,\n            message_view: \"chat\",\n            timestamp_send: JSBNG__Date.now()\n        };\n        if (((w !== undefined))) {\n            x.message_target_ids = [w,];\n        }\n    ;\n    ;\n        h.post(p, x, {\n            delay: 0,\n            retry: true\n        });\n    };\n;\n    var t = {\n        openEmptyTab: function(u, v) {\n            if (((!window.Chat || !j.isOnline()))) {\n                return true;\n            }\n        ;\n        ;\n            i.loadModules([\"ChatTabModel\",], function(w) {\n                var x = w.getEmptyTab();\n                if (!x) {\n                    x = ((\"root:\" + m.generateNewClientMessageID(JSBNG__Date.now())));\n                    o.createNewLocalThread(x, []);\n                }\n            ;\n            ;\n                q(x);\n                s(v, x);\n            });\n        },\n        listenOpenEmptyTab: function(u, v) {\n            r(u, null, v, t.openEmptyTab);\n        },\n        openThread: function(u, v) {\n            if (l.isValid(u)) {\n                q(u);\n            }\n             else n.getClientThreadID(u, q);\n        ;\n        ;\n            s(v, u);\n        },\n        listenOpenThread: function(u, v, w) {\n            r(u, v, w, t.openThread);\n        },\n        openUserTab: function(u, v) {\n            var w = o.getCanonicalThreadToUser(u);\n            q(w.thread_id);\n            s(v, w.thread_id, u);\n        },\n        listenOpenUserTab: function(u, v, w) {\n            r(u, v, w, t.openUserTab);\n        }\n    };\n    e.exports = t;\n});\n__d(\"SplitImage.react\", [\"React\",\"JSBNG__Image.react\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"React\"), h = b(\"JSBNG__Image.react\"), i = b(\"cx\"), j = g.createClass({\n        displayName: \"SplitImage\",\n        render: function() {\n            var k = this.props.size;\n            return this.transferPropsTo(g.DOM.div({\n                className: \"_55lt\",\n                style: {\n                    width: k,\n                    height: k\n                }\n            }, this.renderImages()));\n        },\n        renderImages: function() {\n            if (!this.props.srcs) {\n                return null;\n            }\n        ;\n        ;\n            if (!((this.props.srcs instanceof Array))) {\n                return (h({\n                    src: this.props.srcs,\n                    height: this.props.size,\n                    width: this.props.size\n                }));\n            }\n        ;\n        ;\n            switch (this.props.srcs.length) {\n              case 1:\n                return (h({\n                    src: this.props.srcs[0],\n                    height: this.props.size,\n                    width: this.props.size\n                }));\n              case 2:\n                return this.renderTwo();\n              default:\n                return this.renderThree();\n            };\n        ;\n        },\n        renderTwo: function() {\n            var k = Math.floor(((this.props.size / 2))), l = -Math.floor(((k / 2))), m = (((\"_55lu\") + ((this.props.border ? ((\" \" + \"_57xo\")) : \"\"))));\n            return (g.DOM.div(null, g.DOM.div({\n                className: \"_55lu\",\n                style: {\n                    width: k\n                }\n            }, h({\n                src: this.props.srcs[0],\n                width: this.props.size,\n                height: this.props.size,\n                style: {\n                    marginLeft: l\n                }\n            })), g.DOM.div({\n                className: m,\n                style: {\n                    width: k\n                }\n            }, h({\n                src: this.props.srcs[1],\n                width: this.props.size,\n                height: this.props.size,\n                style: {\n                    marginLeft: l\n                }\n            }))));\n        },\n        renderThree: function() {\n            var k = Math.floor(((((this.props.size / 3)) * 2))), l = -Math.floor(((((this.props.size - k)) / 2))), m = Math.floor(((this.props.size / 2))), n = ((this.props.size - k)), o = -Math.floor(((((m - n)) / 2))), p = (((\"_55lu\") + ((this.props.border ? ((\" \" + \"_57pl\")) : \"\")))), q = (((\"_55lu\") + ((this.props.border ? ((\" \" + \"_57pm\")) : \"\"))));\n            return (g.DOM.div(null, g.DOM.div({\n                className: p,\n                style: {\n                    width: k\n                }\n            }, h({\n                src: this.props.srcs[0],\n                width: this.props.size,\n                height: this.props.size,\n                style: {\n                    marginLeft: l\n                }\n            })), g.DOM.div({\n                className: q,\n                style: {\n                    width: n,\n                    height: m\n                }\n            }, h({\n                src: this.props.srcs[1],\n                width: m,\n                height: m,\n                style: {\n                    marginLeft: o\n                }\n            })), g.DOM.div({\n                className: \"_55lu\",\n                style: {\n                    width: n,\n                    height: m\n                }\n            }, h({\n                src: this.props.srcs[2],\n                width: m,\n                height: m,\n                style: {\n                    marginLeft: o\n                }\n            }))));\n        }\n    });\n    e.exports = j;\n});\n__d(\"TypeaheadFacepile\", [\"DOM\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOM\");\n    function h() {\n    \n    };\n;\n    h.render = function(i) {\n        var j = [g.create(\"span\", {\n            className: \"splitpic leftpic\"\n        }, [g.create(\"img\", {\n            alt: \"\",\n            src: i[0]\n        }),]),g.create(\"span\", {\n            className: ((\"splitpic\" + ((i[2] ? \" toppic\" : \"\"))))\n        }, [g.create(\"img\", {\n            alt: \"\",\n            src: i[1]\n        }),]),];\n        if (i[2]) {\n            j.push(g.create(\"span\", {\n                className: \"splitpic bottompic\"\n            }, [g.create(\"img\", {\n                alt: \"\",\n                src: i[2]\n            }),]));\n        }\n    ;\n    ;\n        return g.create(\"span\", {\n            className: \"splitpics clearfix\"\n        }, j);\n    };\n    e.exports = h;\n});\n__d(\"ModalMask\", [\"DOM\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOM\"), h = null, i = 0, j = {\n        show: function() {\n            i++;\n            if (!h) {\n                h = g.create(\"div\", {\n                    id: \"modalMaskOverlay\"\n                });\n                g.appendContent(JSBNG__document.body, h);\n            }\n        ;\n        ;\n        },\n        hide: function() {\n            if (i) {\n                i--;\n                if (((!i && h))) {\n                    g.remove(h);\n                    h = null;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n        }\n    };\n    e.exports = j;\n});\n__d(\"LitestandMessages\", [], function(a, b, c, d, e, f) {\n    var g = {\n        FILTER_SWITCH_BEGIN: \"LitestandMessages/FilterSwitchBegin\",\n        NEWSFEED_LOAD: \"LitestandMessages/NewsFeedLoad\",\n        LEAVE_HOME: \"LitestandMessages/LeaveHome\",\n        UPDATE_HOME_COUNT: \"LitestandMessages/UpdateHomeCount\",\n        STORIES_INSERTED: \"LitestandMessages/StoriesInserted\",\n        STORIES_REMOVED: \"LitestandMessages/StoriesRemoved\",\n        NEWER_STORIES_INSERTED: \"LitestandMessages/NewerStoriesInserted\",\n        EXPAND_FILTER_SWITCHER: \"LitestandMessages/ExpandFilterSwitcher\",\n        RESTORE_FILTER_SWITCHER: \"LitestandMessages/RestoreFilterSwitcher\",\n        NEW_STORY_BAR_CLICK: \"LitestandMessages/NewStoryBarClick\",\n        COLLAPSE_FILTER_SWITCHER: \"LitestandMessages/CollapseFilterSwitcher\",\n        TOUR_BEGIN: \"LitestandMessages/TourBegin\",\n        TOUR_END: \"LitestandMessages/TourEnd\",\n        TOUR_SIDEBAR_HIGHLIGHT: \"LitestandMessages/TourSidebarHighlight\",\n        TOUR_SIDEBAR_UNHIGHLIGHT: \"LitestandMessages/TourSidebarUnhighlight\",\n        RHC_RELOADED: \"LitestandMessages/RHCReloaded\",\n        UNLOCK_FILTER_SWITCHER: \"LitestandMessage/UnlockFilterSwitcher\"\n    };\n    e.exports = g;\n});\n__d(\"WebMessengerPermalinkConstants\", [\"URI\",], function(a, b, c, d, e, f) {\n    var g = b(\"URI\"), h = {\n        ARCHIVED_PATH: \"/messages/archived\",\n        BASE_PATH: \"/messages\",\n        OTHER_PATH: \"/messages/other\",\n        SPAM_PATH: \"/messages/spam\",\n        COMPOSE_POSTFIX_PATH: \"/new\",\n        SEARCH_POSTFIX_PATH: \"/search\",\n        TID_POSTFIX_PARTIAL_PATH: \"/conversation-\",\n        overriddenVanities: \"(archived|other|spam|new|search|conversation-.*)\",\n        getURIPathForThreadID: function(i, j) {\n            return ((((((j || h.BASE_PATH)) + h.TID_POSTFIX_PARTIAL_PATH)) + g.encodeComponent(g.encodeComponent(i))));\n        },\n        getThreadIDFromURI: function(i) {\n            var j = i.getPath().match(((((((h.BASE_PATH + \"(/[^/]*)*\")) + h.TID_POSTFIX_PARTIAL_PATH)) + \"([^/]+)\")));\n            if (j) {\n                var k = g.decodeComponent(g.decodeComponent(j[2]));\n                return k;\n            }\n        ;\n        ;\n        },\n        getURIPathForIDOrVanity: function(i, j) {\n            if (i.match(((((\"^\" + h.overriddenVanities)) + \"$\")))) {\n                i = ((\".\" + i));\n            }\n        ;\n        ;\n            return ((((((j || h.BASE_PATH)) + \"/\")) + i));\n        },\n        getUserIDOrVanity: function(i) {\n            var j = i.match(((h.BASE_PATH + \".*/([^/]+)/?$\"))), k = ((j && j[1])), l = h.overriddenVanities;\n            if (((!k || k.match(((((\"^\" + l)) + \"$\")))))) {\n                return false;\n            }\n             else if (k.match(((((\"^\\\\.\" + l)) + \"$\")))) {\n                return k.substr(1);\n            }\n             else return k\n            \n        ;\n        }\n    };\n    e.exports = h;\n});\n__d(\"MercuryEmoji\", [\"MercuryConfig\",\"Emoji\",\"Emote\",], function(a, b, c, d, e, f) {\n    var g = b(\"MercuryConfig\"), h = b(\"Emoji\"), i = b(\"Emote\"), j = {\n        htmlEmojiAndEmote: function(k, l) {\n            if (g.MessagingDisplayEmojiGK) {\n                return h.htmlEmojiAndEmote(k, l);\n            }\n             else return i.htmlEmote(k, l)\n        ;\n        }\n    };\n    e.exports = j;\n});\n__d(\"MercuryErrorInfo\", [\"MercuryErrorType\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"MercuryErrorType\"), h = b(\"tx\"), i = {\n        getMessage: function(j) {\n            var k = \"This message failed to send.\";\n            if (i.isConnectionError(j)) {\n                k = \"Unable to connect to Facebook. This message failed to send. \";\n            }\n             else if (j.description) {\n                k = j.description;\n            }\n            \n        ;\n        ;\n            return k;\n        },\n        isConnectionError: function(j) {\n            if (((j && ((j.type == g.TRANSPORT))))) {\n                return ((((((j.code === 1001)) || ((j.code === 1004)))) || ((j.code === 1006))));\n            }\n        ;\n        ;\n            return false;\n        }\n    };\n    e.exports = i;\n});\n__d(\"MercuryChannelHandler\", [\"Arbiter\",\"ChannelConstants\",\"Env\",\"MercuryActionTypeConstants\",\"MercuryGlobalActionType\",\"MercuryMessages\",\"MercuryPayloadSource\",\"MessagingReliabilityLogger\",\"MessagingEvent\",\"MessagingTag\",\"MercuryParticipants\",\"PresenceUtil\",\"MercuryServerRequests\",\"MercuryThreadInformer\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ChannelConstants\"), i = b(\"Env\"), j = b(\"MercuryActionTypeConstants\"), k = b(\"MercuryGlobalActionType\"), l = b(\"MercuryMessages\").get(), m = b(\"MercuryPayloadSource\"), n = b(\"MessagingReliabilityLogger\"), o = b(\"MessagingEvent\"), p = b(\"MessagingTag\"), q = b(\"MercuryParticipants\"), r = b(\"PresenceUtil\"), s = b(\"MercuryServerRequests\").get(), t = b(\"MercuryThreadInformer\").get(), u = b(\"copyProperties\");\n    function v(la, ma) {\n        if (((((((la != h.getArbiterType(\"messaging\"))) || !ma.obj)) || !ma.obj.message))) {\n            n.addEntry(\"channel_receive\", \"invalid_data\");\n            return;\n        }\n    ;\n    ;\n        var na = ma.obj.message, oa = {\n            author: na.mercury_author_id,\n            author_email: na.mercury_author_email,\n            body: na.body,\n            subject: na.subject,\n            has_attachment: na.has_attachment,\n            attachments: na.attachments,\n            html_body: na.html_body,\n            thread_id: na.tid,\n            message_id: na.mid,\n            coordinates: na.mercury_coordinates,\n            spoof_warning: na.mercury_spoof_warning,\n            source: na.mercury_source,\n            source_tags: na.mercury_source_tags,\n            threading_id: na.threading_id,\n            timestamp: na.timestamp,\n            timestamp_absolute: na.timestamp_absolute,\n            timestamp_relative: na.timestamp_relative,\n            timestamp_time_passed: na.timestamp_time_passed,\n            action_type: j.USER_GENERATED_MESSAGE,\n            is_unread: na.is_unread,\n            action_id: na.action_id,\n            is_forward: false,\n            forward_count: ((na.forward_count || na.JSBNG__forward)),\n            forward_message_ids: na.forward_msg_ids,\n            location_text: na.location_text,\n            folder: ma.obj.folder\n        }, pa = [u({\n        }, oa),];\n        pa = pa.concat(((na.forward_actions || [])));\n        var qa = m.CLIENT_CHANNEL_MESSAGE;\n        s.handleUpdateWaitForThread({\n            actions: pa,\n            payload_source: qa\n        }, na.tid);\n        if (((!na.is_unread && ((na.mercury_author_id === q.user))))) {\n            var ra = {\n            };\n            ra[na.tid] = ma.obj.folder;\n            w(h.getArbiterType(\"messaging\"), {\n                obj: {\n                    JSBNG__event: o.READ,\n                    tids: [na.tid,],\n                    folder_info: ra,\n                    timestamp: na.timestamp\n                }\n            });\n        }\n    ;\n    ;\n        n.addEntry(\"channel_receive\", \"success\", [oa.thread_id,oa.message_id,r.getSessionID(),]);\n    };\n;\n    function w(la, ma) {\n        if (((((((la != h.getArbiterType(\"messaging\"))) || !ma.obj)) || !ma.obj.tids))) {\n            return;\n        }\n    ;\n    ;\n        var na = [], oa = ((ma.obj.JSBNG__event == o.READ));\n        ma.obj.tids.forEach(function(pa) {\n            na.push({\n                action_type: j.CHANGE_READ_STATUS,\n                action_id: null,\n                thread_id: pa,\n                mark_as_read: oa,\n                timestamp: ((ma.obj.timestamp || 0)),\n                folder: ma.obj.folder_info[pa]\n            });\n        });\n        s.handleUpdate({\n            actions: na,\n            payload_source: m.CLIENT_CHANNEL_MESSAGE\n        });\n    };\n;\n    function x(la, ma) {\n        if (((((((la != h.getArbiterType(\"messaging\"))) || !ma.obj)) || !ma.obj.tids))) {\n            return;\n        }\n    ;\n    ;\n        var na = [];\n        ma.obj.tids.forEach(function(oa) {\n            na.push({\n                action_type: j.DELETE_THREAD,\n                action_id: null,\n                thread_id: oa\n            });\n        });\n        s.handleUpdate({\n            actions: na,\n            payload_source: m.CLIENT_CHANNEL_MESSAGE\n        });\n    };\n;\n    function y(la, ma) {\n        if (((((((((la != h.getArbiterType(\"messaging\"))) || !ma.obj)) || !ma.obj.tids)) || !ma.obj.mids))) {\n            return;\n        }\n    ;\n    ;\n        var na = ma.obj.tids[0], oa = {\n            action_type: j.DELETE_MESSAGES,\n            action_id: null,\n            thread_id: na,\n            message_ids: ma.obj.mids\n        };\n        s.handleUpdate({\n            actions: [oa,],\n            threads: [ma.obj.updated_thread,],\n            payload_source: m.CLIENT_CHANNEL_MESSAGE\n        });\n    };\n;\n    function z(la, ma) {\n        if (((((((la != h.getArbiterType(\"messaging\"))) || !ma.obj)) || !ma.obj.folder))) {\n            return;\n        }\n    ;\n    ;\n        var na = {\n            action_type: k.MARK_ALL_READ,\n            action_id: ma.obj.action_id,\n            folder: ma.obj.folder\n        };\n        s.handleUpdate({\n            global_actions: [na,]\n        });\n    };\n;\n    function aa(la, ma) {\n        if (((((la != h.getArbiterType(\"messaging\"))) || !ma.obj.tids))) {\n            return;\n        }\n    ;\n    ;\n        var na = m.CLIENT_CHANNEL_MESSAGE;\n        ma.obj.tids.forEach(function(oa) {\n            var pa = {\n                action_type: j.CHANGE_ARCHIVED_STATUS,\n                action_id: null,\n                thread_id: oa,\n                archived: ma.obj.state\n            };\n            s.handleUpdateWaitForThread({\n                actions: [u({\n                }, pa),],\n                payload_source: na\n            }, oa);\n        });\n    };\n;\n    function ba(la, ma) {\n        if (((((la != h.getArbiterType(\"messaging\"))) || !ma.obj.tids))) {\n            return;\n        }\n    ;\n    ;\n        var na = m.CLIENT_CHANNEL_MESSAGE, oa;\n        ma.obj.tids.forEach(function(pa) {\n            if (((ma.obj.JSBNG__event == o.TAG))) {\n                oa = ma.obj.tag;\n            }\n             else oa = ((ma.obj.marked_as_spam ? p.SPAM : p.INBOX));\n        ;\n        ;\n            var qa = {\n                action_type: j.CHANGE_FOLDER,\n                action_id: null,\n                thread_id: pa,\n                new_folder: oa\n            };\n            s.handleUpdateWaitForThread({\n                actions: [u({\n                }, qa),],\n                payload_source: na\n            }, pa);\n        });\n    };\n;\n    function ca(la, ma) {\n        if (((((la != h.getArbiterType(\"messaging\"))) || !ma.obj.tag))) {\n            return;\n        }\n    ;\n    ;\n        switch (ma.obj.tag) {\n          case p.ACTION_ARCHIVED:\n            aa(la, ma);\n            break;\n          case p.INBOX:\n        \n          case p.OTHER:\n            ba(la, ma);\n            break;\n        };\n    ;\n    };\n;\n    function da(la, ma) {\n        if (((((((la != h.getArbiterType(\"inbox\"))) || !ma.obj)) || !ma.obj.seen_timestamp))) {\n            return;\n        }\n    ;\n    ;\n        s.handleUpdate({\n            message_counts: [{\n                seen_timestamp: ma.obj.seen_timestamp,\n                folder: p.INBOX\n            },],\n            unseen_thread_ids: [{\n                thread_ids: [],\n                folder: p.INBOX\n            },],\n            payload_source: m.CLIENT_CHANNEL_MESSAGE\n        });\n    };\n;\n    function ea(la, ma) {\n        if (((((la != h.getArbiterType(\"mercury\"))) || !ma.obj))) {\n            return;\n        }\n    ;\n    ;\n        t.synchronizeInforms(function() {\n            var na = ma.obj, oa = [];\n            ((na.actions || [])).forEach(function(pa) {\n                var qa = j.USER_GENERATED_MESSAGE;\n                if (((pa.action_type == j.LOG_MESSAGE))) {\n                    var ra = m.CLIENT_CHANNEL_MESSAGE;\n                    s.handleUpdateWaitForThread({\n                        actions: [u({\n                        }, pa),],\n                        payload_source: ra\n                    }, pa.thread_id);\n                }\n                 else if (((pa.action_type != qa))) {\n                    oa.push(pa);\n                }\n                \n            ;\n            ;\n            });\n            na.actions = oa;\n            na.payload_source = m.CLIENT_CHANNEL_MESSAGE;\n            s.handleUpdate(na);\n        });\n    };\n;\n    function fa(la, ma) {\n        s.handleRoger(ma.obj);\n    };\n;\n    function ga(la, ma) {\n        if (((((((((la != h.getArbiterType(\"messaging\"))) || !ma.obj)) || ((ma.obj.mute_settings === undefined)))) || !ma.obj.thread_id))) {\n            return;\n        }\n    ;\n    ;\n        var na = j.CHANGE_MUTE_SETTINGS, oa = [{\n            action_type: na,\n            action_id: null,\n            thread_id: ma.obj.thread_id,\n            mute_settings: ma.obj.mute_settings\n        },];\n        s.handleUpdate({\n            actions: oa,\n            payload_source: m.CLIENT_CHANNEL_MESSAGE\n        });\n    };\n;\n    function ha(la, ma) {\n        switch (ma.obj.JSBNG__event) {\n          case o.DELIVER:\n            v(la, ma);\n            break;\n          case o.READ:\n        \n          case o.UNREAD:\n            w(la, ma);\n            break;\n          case o.READ_ALL:\n            z(la, ma);\n            break;\n          case o.DELETE:\n            x(la, ma);\n            break;\n          case o.DELETE_MESSAGES:\n            y(la, ma);\n            break;\n          case o.TAG:\n            ca(la, ma);\n            break;\n          case o.REPORT_SPAM:\n            ba(la, ma);\n            break;\n          case o.READ_RECEIPT:\n            fa(la, ma);\n            break;\n          case o.CHANGE_MUTE_SETTINGS:\n            ga(la, ma);\n            break;\n        };\n    ;\n    };\n;\n    function ia(la, ma) {\n        if (((((la != h.getArbiterType(\"messaging_zap\"))) || !ma.obj))) {\n            n.addEntry(\"channel_receive_zap\", \"invalid_data\");\n            return;\n        }\n    ;\n    ;\n        if (!ma.obj.is_canonical) {\n            return;\n        }\n    ;\n    ;\n        var na = ma.obj.sender_id;\n        if (((na == i.user))) {\n            na = ma.obj.recipient_id;\n        }\n    ;\n    ;\n        na = ((\"user:\" + na));\n        var oa = {\n            action_type: j.USER_GENERATED_MESSAGE,\n            author: ((\"fbid:\" + ma.obj.sender_id)),\n            body: ma.obj.body,\n            source: ma.obj.source,\n            timestamp: ma.obj.timestamp,\n            message_id: ma.obj.message_id,\n            thread_id: na,\n            specific_to_list: [((\"fbid:\" + ma.obj.sender_id)),((\"fbid:\" + ma.obj.recipient_id)),],\n            spoof_warning: false,\n            is_unread: true,\n            is_zap: true\n        };\n        l.zapMessage(oa);\n    };\n;\n    var ja = [], ka = {\n        turnOn: function() {\n            if (!ja.length) {\n                var la = {\n                    mercury: ea,\n                    messaging: ha,\n                    messaging_zap: ia,\n                    inbox: da\n                };\n                {\n                    var fin250keys = ((window.top.JSBNG_Replay.forInKeys)((la))), fin250i = (0);\n                    var ma;\n                    for (; (fin250i < fin250keys.length); (fin250i++)) {\n                        ((ma) = (fin250keys[fin250i]));\n                        {\n                            ja.push(g.subscribe(h.getArbiterType(ma), la[ma]));\n                        ;\n                        };\n                    };\n                };\n            ;\n            }\n        ;\n        ;\n        },\n        turnOff: function() {\n            if (ja.length) {\n                ja.forEach(g.unsubscribe);\n                ja = [];\n            }\n        ;\n        ;\n        }\n    };\n    ka.turnOn();\n    e.exports = ka;\n});\n__d(\"MercuryRoger\", [\"ArbiterMixin\",\"MercuryActionStatus\",\"MercuryServerRequests\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"ArbiterMixin\"), h = b(\"MercuryActionStatus\"), i = b(\"MercuryServerRequests\").get(), j = b(\"copyProperties\"), k = {\n    }, l = {\n        getSeenBy: function(m, n) {\n            if (!m) {\n                return [];\n            }\n        ;\n        ;\n            var o = [], p = k[m.thread_id], q = h.SUCCESS;\n            {\n                var fin251keys = ((window.top.JSBNG_Replay.forInKeys)((p))), fin251i = (0);\n                var r;\n                for (; (fin251i < fin251keys.length); (fin251i++)) {\n                    ((r) = (fin251keys[fin251i]));\n                    {\n                        if (((((((p[r] > m.timestamp)) && ((((m.JSBNG__status === undefined)) || ((m.JSBNG__status === q)))))) && ((!n || ((r != m.author))))))) {\n                            o.push(r);\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            return o;\n        },\n        getSeenTimestamp: function(m, n) {\n            var o = k[m];\n            return ((o ? o[n] : null));\n        }\n    };\n    j(l, g);\n    i.subscribe(\"update-roger\", function(m, n) {\n        {\n            var fin252keys = ((window.top.JSBNG_Replay.forInKeys)((n))), fin252i = (0);\n            var o;\n            for (; (fin252i < fin252keys.length); (fin252i++)) {\n                ((o) = (fin252keys[fin252i]));\n                {\n                    if (!k[o]) {\n                        k[o] = {\n                        };\n                    }\n                ;\n                ;\n                    {\n                        var fin253keys = ((window.top.JSBNG_Replay.forInKeys)((n[o]))), fin253i = (0);\n                        var p;\n                        for (; (fin253i < fin253keys.length); (fin253i++)) {\n                            ((p) = (fin253keys[fin253i]));\n                            {\n                                var q = k[o][p], r = n[o][p];\n                                if (((!q || ((r > q))))) {\n                                    k[o][p] = r;\n                                }\n                            ;\n                            ;\n                            };\n                        };\n                    };\n                ;\n                };\n            };\n        };\n    ;\n        if (n) {\n            l.inform(\"state-changed\", n);\n        }\n    ;\n    ;\n    });\n    e.exports = l;\n});\n__d(\"MercuryDelayedRoger\", [\"ArbiterMixin\",\"LiveTimer\",\"MercuryActionStatus\",\"MercuryConfig\",\"MercuryMessages\",\"MercuryRoger\",\"MercuryThreadInformer\",\"MercuryThreads\",\"copyProperties\",\"setTimeoutAcrossTransitions\",], function(a, b, c, d, e, f) {\n    var g = b(\"ArbiterMixin\"), h = b(\"LiveTimer\"), i = b(\"MercuryActionStatus\"), j = b(\"MercuryConfig\"), k = b(\"MercuryMessages\").get(), l = b(\"MercuryRoger\"), m = b(\"MercuryThreadInformer\").get(), n = b(\"MercuryThreads\").get(), o = b(\"copyProperties\"), p = b(\"setTimeoutAcrossTransitions\"), q = {\n    }, r = {\n    }, s = j[\"roger.seen_delay\"], t = o({\n        getSeenBy: function(x, y) {\n            if (r[x]) {\n                return [];\n            }\n        ;\n        ;\n            if (!q[x]) {\n                var z = n.getThreadMetaNow(x);\n                if (z) {\n                    q[x] = {\n                        thread_id: x,\n                        author: z.participants[0],\n                        timestamp: z.timestamp\n                    };\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            return l.getSeenBy(q[x], y);\n        }\n    }, g);\n    function u(x) {\n        var y = false;\n        k.getThreadMessagesRange(x, 0, 1, function(z) {\n            var aa = z[0];\n            if (!aa) {\n                return;\n            }\n        ;\n        ;\n            var ba = aa.timestamp;\n            if (((aa.action_id || ((aa.JSBNG__status == i.SUCCESS))))) {\n                ba -= h.getServerTimeOffset();\n            }\n        ;\n        ;\n            var ca = t.getSeenBy(x);\n            if (r[x]) {\n                JSBNG__clearTimeout(r[x]);\n                delete r[x];\n            }\n        ;\n        ;\n            var da = ((ba + s)), ea = ((da - JSBNG__Date.now()));\n            if (((ea > 0))) {\n                r[x] = p(function() {\n                    delete r[x];\n                    v(x);\n                }, ea);\n            }\n        ;\n        ;\n            q[x] = aa;\n            var fa = t.getSeenBy(x);\n            if (((ca.length || fa.length))) {\n                y = true;\n            }\n        ;\n        ;\n        });\n        return y;\n    };\n;\n    function v(x) {\n        var y = {\n        };\n        y[x] = true;\n        t.inform(\"state-changed\", y);\n    };\n;\n    function w(JSBNG__event, x) {\n        var y = {\n        };\n        {\n            var fin254keys = ((window.top.JSBNG_Replay.forInKeys)((x))), fin254i = (0);\n            var z;\n            for (; (fin254i < fin254keys.length); (fin254i++)) {\n                ((z) = (fin254keys[fin254i]));\n                {\n                    if (u(z)) {\n                        y[z] = true;\n                    }\n                ;\n                ;\n                };\n            };\n        };\n    ;\n        {\n            var fin255keys = ((window.top.JSBNG_Replay.forInKeys)((y))), fin255i = (0);\n            var aa;\n            for (; (fin255i < fin255keys.length); (fin255i++)) {\n                ((aa) = (fin255keys[fin255i]));\n                {\n                    t.inform(\"state-changed\", y);\n                    break;\n                };\n            };\n        };\n    ;\n    };\n;\n    l.subscribe(\"state-changed\", function(x, y) {\n        {\n            var fin256keys = ((window.top.JSBNG_Replay.forInKeys)((y))), fin256i = (0);\n            var z;\n            for (; (fin256i < fin256keys.length); (fin256i++)) {\n                ((z) = (fin256keys[fin256i]));\n                {\n                    ((!r[z] && v(z)));\n                ;\n                };\n            };\n        };\n    ;\n    });\n    m.subscribe(\"messages-received\", w);\n    m.subscribe(\"messages-reordered\", w);\n    m.subscribe(\"messages-updated\", w);\n    e.exports = t;\n});\n__d(\"MercuryFilters\", [\"MessagingTag\",\"arrayContains\",], function(a, b, c, d, e, f) {\n    var g = b(\"MessagingTag\"), h = b(\"arrayContains\"), i = [g.UNREAD,], j = {\n        ALL: \"all\",\n        getSupportedFilters: function() {\n            return i.concat();\n        },\n        isSupportedFilter: function(k) {\n            return h(i, k);\n        }\n    };\n    e.exports = j;\n});\n__d(\"MercuryOrderedThreadlist\", [\"JSLogger\",\"MercuryActionTypeConstants\",\"MercuryFilters\",\"MercuryFolders\",\"MercuryPayloadSource\",\"MercurySingletonMixin\",\"MessagingTag\",\"RangedCallbackManager\",\"MercuryServerRequests\",\"MercuryThreadInformer\",\"MercuryThreads\",\"arrayContains\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSLogger\"), h = b(\"MercuryActionTypeConstants\"), i = b(\"MercuryFilters\"), j = b(\"MercuryFolders\"), k = b(\"MercuryPayloadSource\"), l = b(\"MercurySingletonMixin\"), m = b(\"MessagingTag\"), n = b(\"RangedCallbackManager\"), o = b(\"MercuryServerRequests\"), p = b(\"MercuryThreadInformer\"), q = b(\"MercuryThreads\"), r = b(\"arrayContains\"), s = b(\"copyProperties\"), t = g.create(\"ordered_threadlist_model\"), u = i.getSupportedFilters().concat([i.ALL,m.GROUPS,]), v = j.getSupportedFolders();\n    function w(ga, ha, ia, ja) {\n        var ka = [], la = false, ma = false, na = ((ha || [])).filter(function(ua) {\n            var va = ((ua.filter || i.ALL));\n            return ((((((ua.folder == ia)) || ((!ua.folder && ((ia == m.INBOX)))))) && ((va == ja))));\n        }), oa = ga._threadlistOrderMap[ia][ja].getAllResources(), pa;\n        na.forEach(function(ua) {\n            ka = ka.concat(ua.thread_ids);\n            if (ua.error) {\n                if (((ua.end > oa.length))) {\n                    ma = ua.error;\n                }\n            ;\n            ;\n            }\n             else {\n                var va = ((ua.end - ua.start));\n                if (((ua.thread_ids.length < va))) {\n                    la = true;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            if (((!pa || ((ua.end > pa))))) {\n                pa = ua.end;\n            }\n        ;\n        ;\n        });\n        aa(ga, ka, ia, ja);\n        if (la) {\n            ga._threadlistOrderMap[ia][ja].setReachedEndOfArray();\n        }\n         else if (ma) {\n            ga._threadlistOrderMap[ia][ja].setError(ma);\n        }\n         else {\n            var qa = ga._threadlistOrderMap[ia][ja].getCurrentArraySize();\n            if (((pa && ((qa < pa))))) {\n                var ra = {\n                }, sa = oa.concat(ka), ta = sa.filter(function(ua) {\n                    var va = ra[ua];\n                    ra[ua] = true;\n                    return va;\n                });\n                if (ta.length) {\n                    t.warn(\"duplicate_threads\", {\n                        folder: ia,\n                        expected_final_size: pa,\n                        actual_final_size: qa,\n                        duplicate_thread_ids: ta\n                    });\n                    ga._serverRequests.fetchThreadlistInfo(pa, ta.length, ia, ((((ja == i.ALL)) ? null : ja)));\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n        }\n        \n    ;\n    ;\n    };\n;\n    function x(ga, ha) {\n        v.forEach(function(ia) {\n            u.forEach(function(ja) {\n                w(ga, ha, ia, ja);\n            });\n        });\n    };\n;\n    function y(ga, ha) {\n        var ia = {\n        };\n        v.forEach(function(ja) {\n            ia[ja] = {\n            };\n            u.forEach(function(ka) {\n                ia[ja][ka] = {\n                    to_add: [],\n                    to_remove: [],\n                    to_remove_if_last_after_add: {\n                    }\n                };\n            });\n        });\n        ha.forEach(function(ja) {\n            if (ja.is_forward) {\n                return;\n            }\n        ;\n        ;\n            var ka = ja.thread_id, la = ba(ga, ka), ma = ca(ga, ka);\n            function na() {\n                ma.forEach(function(pa) {\n                    ia[la][pa].to_add.push(ka);\n                    if (((!ga._threadlistOrderMap[la][pa].hasReachedEndOfArray() && !ga._threadlistOrderMap[la][pa].hasResource(ka)))) {\n                        ia[la][pa].to_remove_if_last_after_add[ka] = true;\n                    }\n                ;\n                ;\n                });\n            };\n        ;\n            function oa(pa) {\n                if (r(u, pa)) {\n                    if (r(ma, pa)) {\n                        ia[la][pa].to_add.push(ka);\n                    }\n                     else ia[la][pa].to_remove.push(ka);\n                ;\n                }\n            ;\n            ;\n            };\n        ;\n            if (!la) {\n                if (((((ja.action_type === h.CHANGE_FOLDER)) || ((ja.action_type === h.CHANGE_ARCHIVED_STATUS))))) {\n                    v.forEach(function(pa) {\n                        if (((pa !== la))) {\n                            u.forEach(function(qa) {\n                                ga._threadlistOrderMap[pa][qa].removeResources([ka,]);\n                            });\n                        }\n                    ;\n                    ;\n                    });\n                }\n            ;\n            ;\n                return;\n            }\n        ;\n        ;\n            switch (ja.action_type) {\n              case h.DELETE_THREAD:\n                ma.forEach(function(pa) {\n                    ia[la][pa].to_remove.push(ka);\n                });\n                break;\n              case h.CHANGE_ARCHIVED_STATUS:\n            \n              case h.CHANGE_FOLDER:\n                na();\n                break;\n              case h.CHANGE_READ_STATUS:\n                oa(m.UNREAD);\n                break;\n              case h.USER_GENERATED_MESSAGE:\n            \n              case h.LOG_MESSAGE:\n                ma.forEach(function(pa) {\n                    if (da(ga, ka, la, pa)) {\n                        ia[la][pa].to_add.push(ka);\n                    }\n                ;\n                ;\n                });\n                break;\n            };\n        ;\n        });\n        v.forEach(function(ja) {\n            u.forEach(function(ka) {\n                var la = ga._threadlistOrderMap[ja][ka];\n                aa(ga, ia[ja][ka].to_add, ja, ka);\n                for (var ma = ((la.getCurrentArraySize() - 1)); ((ma >= 0)); ma--) {\n                    var na = la.getResourceAtIndex(ma);\n                    if (!ia[ja][ka].to_remove_if_last_after_add[na]) {\n                        break;\n                    }\n                ;\n                ;\n                    ia[ja][ka].to_remove.push(na);\n                };\n            ;\n                la.removeResources(ia[ja][ka].to_remove);\n            });\n        });\n    };\n;\n    function z(ga, ha) {\n        var ia = {\n        };\n        v.forEach(function(ja) {\n            ia[ja] = {\n            };\n            u.forEach(function(ka) {\n                ia[ja][ka] = [];\n            });\n        });\n        ha.forEach(function(ja) {\n            var ka = ba(ga, ja.thread_id), la = ca(ga, ja.thread_id);\n            if (ka) {\n                la.forEach(function(ma) {\n                    if (da(ga, ja.thread_id, ka, ma)) {\n                        ia[ka][ma].push(ja.thread_id);\n                    }\n                ;\n                ;\n                });\n            }\n        ;\n        ;\n        });\n        v.forEach(function(ja) {\n            u.forEach(function(ka) {\n                if (((ia[ja][ka].length > 0))) {\n                    aa(ga, ia[ja][ka], ja, ka);\n                }\n            ;\n            ;\n            });\n        });\n    };\n;\n    function aa(ga, ha, ia, ja) {\n        ja = ((ja || i.ALL));\n        ga._threadlistOrderMap[ia][ja].addResources(ha);\n        v.forEach(function(ka) {\n            if (((ka != ia))) {\n                ga._threadlistOrderMap[ka][ja].removeResources(ha);\n            }\n        ;\n        ;\n        });\n    };\n;\n    function ba(ga, ha) {\n        var ia = ga._threads.getThreadMetaNow(ha), ja = null;\n        if (!ia) {\n            ja = \"No thread metadata\";\n        }\n         else if (!ia.folder) {\n            ja = \"No thread folder\";\n        }\n        \n    ;\n    ;\n        if (ja) {\n            var ka = {\n                error: ja,\n                tid: ha\n            };\n            t.warn(\"no_thread_folder\", ka);\n            return null;\n        }\n    ;\n    ;\n        var la = ia.folder;\n        if (ia.is_archived) {\n            la = m.ACTION_ARCHIVED;\n        }\n    ;\n    ;\n        if (ga._threadlistOrderMap[la]) {\n            return la;\n        }\n         else return null\n    ;\n    };\n;\n    function ca(ga, ha) {\n        var ia = ga._threads.getThreadMetaNow(ha), ja = [i.ALL,];\n        if (!ia) {\n            var ka = {\n                error: \"no_thread_metadata\",\n                tid: ha\n            };\n            t.warn(\"no_thread_metadata\", ka);\n            return [];\n        }\n    ;\n    ;\n        if (ia.unread_count) {\n            ja.push(m.UNREAD);\n        }\n    ;\n    ;\n        if (!ia.is_canonical) {\n            ja.push(m.GROUPS);\n        }\n    ;\n    ;\n        return ja;\n    };\n;\n    function da(ga, ha, ia, ja) {\n        var ka = ga._threads.getThreadMetaNow(ha);\n        return ((((((ka && ka.timestamp)) && ((ba(ga, ha) == ia)))) && r(ca(ga, ha), ja)));\n    };\n;\n    function ea(ga) {\n        this._fbid = ga;\n        this._serverRequests = o.getForFBID(this._fbid);\n        this._threadInformer = p.getForFBID(this._fbid);\n        this._threads = q.getForFBID(this._fbid);\n        this._threadlistOrderMap = {\n        };\n        v.forEach(function(ha) {\n            this._threadlistOrderMap[ha] = {\n            };\n            u.forEach(function(ia) {\n                this._threadlistOrderMap[ha][ia] = new n(function(ja) {\n                    return this._threads.getThreadMetaNow(ja).timestamp;\n                }.bind(this), function(ja, ka) {\n                    return ((ka - ja));\n                }, this._serverRequests.canLinkExternally.bind(this._serverRequests));\n            }.bind(this));\n        }.bind(this));\n        this._serverRequests.subscribe(\"update-threadlist\", function(ha, ia) {\n            if (!fa(ia)) {\n                return;\n            }\n        ;\n        ;\n            var ja = ia.ordered_threadlists;\n            if (((ja && ja.length))) {\n                x(this, ja);\n            }\n             else {\n                var ka = ((ia.actions || [])).filter(function(la) {\n                    return la.thread_id;\n                });\n                z(this, ((ia.threads || [])));\n                y(this, ka);\n            }\n        ;\n        ;\n            this._threadInformer.updatedThreadlist();\n        }.bind(this));\n    };\n;\n    s(ea.prototype, {\n        getThreadlist: function(ga, ha, ia, ja, ka, la) {\n            return this.getFilteredThreadlist(ga, ha, ia, i.ALL, ja, ka, la);\n        },\n        getFilteredThreadlist: function(ga, ha, ia, ja, ka, la, ma) {\n            var na = this._threadlistOrderMap[ia][ja], oa = na.executeOrEnqueue(ga, ha, ka, la), pa = na.getUnavailableResources(oa), qa = na.getError(ga, ha, la);\n            if (((pa.length || qa))) {\n                if (((na.getCurrentArraySize() < ga))) {\n                    var ra = {\n                        start: ga,\n                        limit: ha,\n                        filter: ja,\n                        resources_size: na.getCurrentArraySize()\n                    };\n                    t.warn(\"range_with_gap\", ra);\n                }\n            ;\n            ;\n                na.setError(false);\n                this._serverRequests.fetchThreadlistInfo(na.getCurrentArraySize(), pa.length, ia, ((((ja == i.ALL)) ? null : ja)), ma);\n            }\n        ;\n        ;\n            return oa;\n        },\n        getThreadlistUntilTimestamp: function(ga, ha, ia) {\n            ia = ((ia || i.ALL));\n            return this._threadlistOrderMap[ha][ia].getElementsUntil(ga);\n        },\n        unsubscribe: function(ga, ha, ia) {\n            ia = ((ia || i.ALL));\n            this._threadlistOrderMap[ha][ia].unsubscribe(ga);\n        }\n    });\n    s(ea, l);\n    function fa(ga) {\n        switch (ga.payload_source) {\n          case k.CLIENT_CHANGE_ARCHIVED_STATUS:\n        \n          case k.CLIENT_CHANGE_READ_STATUS:\n        \n          case k.CLIENT_CHANGE_FOLDER:\n        \n          case k.CLIENT_CHANNEL_MESSAGE:\n        \n          case k.CLIENT_DELETE_MESSAGES:\n        \n          case k.CLIENT_DELETE_THREAD:\n        \n          case k.CLIENT_SEND_MESSAGE:\n        \n          case k.SERVER_SEND_MESSAGE:\n        \n          case k.SERVER_CONFIRM_MESSAGES:\n        \n          case k.SERVER_FETCH_THREADLIST_INFO:\n        \n          case k.SERVER_THREAD_SYNC:\n        \n          case k.SERVER_ZAP:\n            return true;\n          case k.SERVER_INITIAL_DATA:\n            return ga.ordered_threadlists;\n          default:\n            return false;\n        };\n    ;\n    };\n;\n    e.exports = ea;\n});\n__d(\"MercuryUnreadState\", [\"Arbiter\",\"MercuryFolders\",\"JSLogger\",\"KeyedCallbackManager\",\"MercuryActionTypeConstants\",\"MercuryGlobalActionType\",\"MercurySingletonMixin\",\"MercuryThreadlistConstants\",\"MessagingTag\",\"MercuryServerRequests\",\"MercuryThreadInformer\",\"MercuryThreads\",\"arrayContains\",\"copyProperties\",\"createObjectFrom\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"MercuryFolders\"), i = b(\"JSLogger\"), j = b(\"KeyedCallbackManager\"), k = b(\"MercuryActionTypeConstants\"), l = b(\"MercuryGlobalActionType\"), m = b(\"MercurySingletonMixin\"), n = b(\"MercuryThreadlistConstants\"), o = b(\"MessagingTag\"), p = b(\"MercuryServerRequests\"), q = b(\"MercuryThreadInformer\"), r = b(\"MercuryThreads\"), s = b(\"arrayContains\"), t = b(\"copyProperties\"), u = b(\"createObjectFrom\"), v = ((h.getSupportedFolders() || [])).filter(function(ma) {\n        return ((ma != o.ACTION_ARCHIVED));\n    }), w = \"unread_thread_hash\", x = \"unseen_thread_list\", y = n.MAX_UNREAD_COUNT, z = i.create(\"mercury_unread_state\");\n    function aa(ma) {\n        this._fbid = ma;\n        this._serverRequests = p.getForFBID(this._fbid);\n        this._threadInformer = q.getForFBID(this._fbid);\n        this._threads = r.getForFBID(this._fbid);\n        this._allReadTimestamp = {\n        };\n        this._threadReadTimestamp = {\n        };\n        this._initialUnreadCount = {\n        };\n        this._maxCount = {\n        };\n        this._unreadResources = {\n        };\n        v.forEach(function(na) {\n            this._initialUnreadCount[na] = 0;\n            this._maxCount[na] = false;\n            this._unreadResources[na] = new j();\n        }.bind(this));\n        this._serverRequests.subscribe(\"update-unread\", function(na, oa) {\n            fa(this, oa);\n            var pa = ((oa.global_actions || []));\n            for (var qa = 0; ((qa < pa.length)); qa++) {\n                var ra = pa[qa];\n                if (((ra.action_type == l.MARK_ALL_READ))) {\n                    ia(this, ra.folder, ra.timestamp);\n                }\n            ;\n            ;\n            };\n        ;\n        }.bind(this));\n        this._serverRequests.subscribe(\"update-thread-ids\", function(na, oa) {\n            ka(this, oa);\n        }.bind(this));\n    };\n;\n    t(aa.prototype, {\n        getUnreadCount: function(ma) {\n            if (this.exceedsMaxCount(ma)) {\n                z.error(\"unguarded_unread_count_fetch\", {\n                });\n                return 0;\n            }\n        ;\n        ;\n            return ea(this, ma);\n        },\n        exceedsMaxCount: function(ma) {\n            return ((this._maxCount[ma] || ((ea(this, ma) > y))));\n        },\n        markFolderAsRead: function(ma) {\n            if (((this._maxCount[ma] || ((ea(this, ma) > 0))))) {\n                this._serverRequests.markFolderAsRead(ma);\n            }\n        ;\n        ;\n        }\n    });\n    t(aa, m);\n    function ba(ma, na, oa) {\n        ma._unreadResources[na].setResource(w, oa);\n        ma._unreadResources[na].setResource(x, Object.keys(oa));\n    };\n;\n    function ca(ma, na, oa) {\n        var pa = ma._unreadResources[na].executeOrEnqueue(w, oa), qa = ma._unreadResources[na].getUnavailableResources(pa);\n        if (qa.length) {\n            ma._serverRequests.fetchUnreadThreadIDs(na);\n        }\n    ;\n    ;\n    };\n;\n    function da(ma, na) {\n        return ma._unreadResources[na].getResource(w);\n    };\n;\n    function ea(ma, na) {\n        var oa = ma._unreadResources[na].getResource(x);\n        if (oa) {\n            return oa.length;\n        }\n         else return ma._initialUnreadCount[na]\n    ;\n    };\n;\n    function fa(ma, na) {\n        var oa;\n        ((na.unread_thread_ids || [])).forEach(function(pa) {\n            oa = pa.folder;\n            if (!la(oa)) {\n                return;\n            }\n        ;\n        ;\n            var qa = ja(ma, pa.thread_ids);\n            ba(ma, oa, u(qa, true));\n            if (((qa.length > y))) {\n                ma._maxCount[oa] = true;\n            }\n        ;\n        ;\n            ma._threadInformer.updatedUnreadState();\n        });\n        ((na.message_counts || [])).forEach(function(pa) {\n            if (((pa.unread_count === undefined))) {\n                return;\n            }\n        ;\n        ;\n            oa = pa.folder;\n            if (((pa.unread_count > y))) {\n                ma._maxCount[oa] = true;\n                ba(ma, oa, {\n                });\n                ma._threadInformer.updatedUnreadState();\n            }\n             else {\n                ma._initialUnreadCount[oa] = pa.unread_count;\n                if (((ma._initialUnreadCount[oa] === 0))) {\n                    ba(ma, oa, {\n                    });\n                }\n            ;\n            ;\n                ma._threadInformer.updatedUnreadState();\n            }\n        ;\n        ;\n        });\n        ((na.actions || [])).forEach(function(pa) {\n            if (pa.is_forward) {\n                return;\n            }\n        ;\n        ;\n            var qa = k, ra = ((pa.thread_id ? pa.thread_id : pa.server_thread_id));\n            if (((pa.action_type == qa.DELETE_THREAD))) {\n                v.forEach(function(ta) {\n                    ha(ma, ta, ra);\n                });\n            }\n             else if (((((pa.action_type == qa.CHANGE_ARCHIVED_STATUS)) || ((pa.action_type == qa.CHANGE_FOLDER))))) {\n                var sa = ma._threads.getThreadMetaNow(pa.thread_id);\n                oa = h.getFromMeta(sa);\n                if (((la(oa) && ((sa.unread_count > 0))))) {\n                    ga(ma, oa, ra);\n                }\n            ;\n            ;\n                v.forEach(function(ta) {\n                    if (((ta != oa))) {\n                        ha(ma, ta, ra);\n                    }\n                ;\n                ;\n                });\n            }\n             else {\n                oa = pa.folder;\n                if (!la(oa)) {\n                    return;\n                }\n            ;\n            ;\n                if (((pa.action_type == qa.CHANGE_READ_STATUS))) {\n                    if (pa.mark_as_read) {\n                        ha(ma, oa, ra, pa.timestamp);\n                    }\n                     else ga(ma, oa, ra, pa.timestamp);\n                ;\n                ;\n                }\n                 else if (((((pa.action_type == qa.USER_GENERATED_MESSAGE)) || ((pa.action_type == qa.LOG_MESSAGE))))) {\n                    if (pa.is_unread) {\n                        ga(ma, oa, ra, pa.timestamp);\n                    }\n                ;\n                }\n                \n            ;\n            ;\n            }\n            \n        ;\n        ;\n        });\n    };\n;\n    function ga(ma, na, oa, pa) {\n        if (ma._maxCount[na]) {\n            return;\n        }\n    ;\n    ;\n        ca(ma, na, function(qa) {\n            var ra = ((ma._allReadTimestamp[na] || 0)), sa = ((ma._threadReadTimestamp[oa] || 0)), ta = ((pa || Number.POSITIVE_INFINITY));\n            if (((((((ta >= ra)) && ((ta >= sa)))) && !qa[oa]))) {\n                qa[oa] = ((pa || 0));\n                ba(ma, na, qa);\n                ma._threadInformer.updatedUnreadState();\n            }\n        ;\n        ;\n        });\n    };\n;\n    function ha(ma, na, oa, pa) {\n        if (ma._maxCount[na]) {\n            return;\n        }\n    ;\n    ;\n        ca(ma, na, function(qa) {\n            if (pa) {\n                var ra = ma._threadReadTimestamp[oa];\n                if (((!ra || ((ra < pa))))) {\n                    ma._threadReadTimestamp[oa] = pa;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            var sa = qa[oa];\n            if (((((pa && ((typeof sa == \"number\")))) && ((pa < sa))))) {\n                return;\n            }\n        ;\n        ;\n            if (((oa in qa))) {\n                delete qa[oa];\n                ba(ma, na, qa);\n                ma._threadInformer.updatedUnreadState();\n            }\n        ;\n        ;\n        });\n    };\n;\n    function ia(ma, na, oa) {\n        ma._maxCount[na] = false;\n        ba(ma, na, {\n        });\n        ma._allReadTimestamp[na] = Math.max(((ma._allReadTimestamp[na] || 0)), ((oa || 0)));\n        ma._threadInformer.updatedUnreadState();\n    };\n;\n    function ja(ma, na) {\n        return na.map(ma._serverRequests.convertThreadIDIfAvailable.bind(ma._serverRequests));\n    };\n;\n    function ka(ma, na) {\n        v.forEach(function(oa) {\n            var pa = da(ma, oa);\n            if (!pa) {\n                return;\n            }\n        ;\n        ;\n            {\n                var fin257keys = ((window.top.JSBNG_Replay.forInKeys)((na))), fin257i = (0);\n                var qa;\n                for (; (fin257i < fin257keys.length); (fin257i++)) {\n                    ((qa) = (fin257keys[fin257i]));\n                    {\n                        var ra = na[qa];\n                        if (pa[qa]) {\n                            pa[ra] = pa[qa];\n                            delete pa[qa];\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            ba(ma, oa, pa);\n        });\n    };\n;\n    function la(ma) {\n        return s(v, ma);\n    };\n;\n    g.subscribe(i.DUMP_EVENT, function(ma, na) {\n        na.messaging = ((na.messaging || {\n        }));\n        na.messaging.unread = {\n        };\n        na.messaging.unread_max_count = {\n        };\n        var oa = aa._getInstances();\n        {\n            var fin258keys = ((window.top.JSBNG_Replay.forInKeys)((oa))), fin258i = (0);\n            var pa;\n            for (; (fin258i < fin258keys.length); (fin258i++)) {\n                ((pa) = (fin258keys[fin258i]));\n                {\n                    na.messaging.unread[pa] = {\n                    };\n                    na.messaging.unread_max_count[pa] = {\n                    };\n                    v.forEach(function(qa) {\n                        na.messaging.unread[pa][qa] = t({\n                        }, da(oa[pa], qa));\n                        na.messaging.unread_max_count[pa][qa] = oa[pa]._maxCount[qa];\n                    });\n                };\n            };\n        };\n    ;\n    });\n    e.exports = aa;\n});\n__d(\"MercuryUnseenState\", [\"Arbiter\",\"TimestampConverter\",\"JSLogger\",\"KeyedCallbackManager\",\"MercuryActionTypeConstants\",\"MercurySingletonMixin\",\"MercuryThreadlistConstants\",\"MessagingTag\",\"MercuryServerRequests\",\"MercuryThreadInformer\",\"copyProperties\",\"createObjectFrom\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"TimestampConverter\"), i = b(\"JSLogger\"), j = b(\"KeyedCallbackManager\"), k = b(\"MercuryActionTypeConstants\"), l = b(\"MercurySingletonMixin\"), m = b(\"MercuryThreadlistConstants\"), n = b(\"MessagingTag\"), o = b(\"MercuryServerRequests\"), p = b(\"MercuryThreadInformer\"), q = b(\"copyProperties\"), r = b(\"createObjectFrom\"), s = m.MAX_UNSEEN_COUNT, t = \"unseen_thread_hash\", u = \"unseen_thread_list\", v = i.create(\"mercury_unseen_state\");\n    function w(ja) {\n        this._fbid = ja;\n        this._serverRequests = o.getForFBID(this._fbid);\n        this._threadInformer = p.getForFBID(this._fbid);\n        this._initialUnseenCount = 0;\n        this._lastSeenTimestamp = 0;\n        this._maxCount = false;\n        this._unseenResources = new j();\n        this._serverRequests.subscribe(\"update-unseen\", function(ka, la) {\n            ba(this, la);\n        }.bind(this));\n        this._serverRequests.subscribe(\"update-thread-ids\", function(ka, la) {\n            ha(this, la);\n        }.bind(this));\n    };\n;\n    q(w.prototype, {\n        getUnseenCount: function() {\n            if (this.exceedsMaxCount()) {\n                v.error(\"unguarded_unseen_count_fetch\", {\n                });\n                return 0;\n            }\n        ;\n        ;\n            return aa(this);\n        },\n        exceedsMaxCount: function() {\n            return ((this._maxCount || ((aa(this) > s))));\n        },\n        markAsSeen: function() {\n            if (((((aa(this) > 0)) || this._maxCount))) {\n                this._serverRequests.markSeen();\n                ca(this, h.convertActionIDToTimestamp(this._serverRequests.getLastActionID()), []);\n            }\n        ;\n        ;\n        },\n        markThreadSeen: function(ja, ka) {\n            var la = {\n            };\n            la[ja] = null;\n            ea(this, la, ka);\n        }\n    });\n    q(w, l);\n    function x(ja, ka) {\n        ja._unseenResources.setResource(t, ka);\n        ja._unseenResources.setResource(u, Object.keys(ka));\n    };\n;\n    function y(ja, ka) {\n        var la = ja._unseenResources.executeOrEnqueue(t, ka), ma = ja._unseenResources.getUnavailableResources(la);\n        if (ma.length) {\n            ja._serverRequests.fetchUnseenThreadIDs();\n        }\n    ;\n    ;\n    };\n;\n    function z(ja) {\n        return ja._unseenResources.getResource(t);\n    };\n;\n    function aa(ja) {\n        var ka = ja._unseenResources.getResource(u);\n        if (ka) {\n            return ka.length;\n        }\n         else return ja._initialUnseenCount\n    ;\n    };\n;\n    function ba(ja, ka) {\n        var la = ia(ka);\n        if (ka.unseen_thread_ids) {\n            ka.unseen_thread_ids.forEach(function(wa) {\n                if (((wa.folder != n.INBOX))) {\n                    return;\n                }\n            ;\n            ;\n                var xa = ga(ja, wa.thread_ids), ya = ja._lastSeenTimestamp;\n                if (((la && la.seen_timestamp))) {\n                    ya = la.seen_timestamp;\n                }\n            ;\n            ;\n                ca(ja, ya, xa);\n                if (((la && ((la.unseen_count > s))))) {\n                    ja._maxCount = true;\n                }\n            ;\n            ;\n            });\n        }\n         else if (((la && la.seen_timestamp))) {\n            ja._lastSeenTimestamp = la.seen_timestamp;\n            if (((la.unseen_count > s))) {\n                ja._maxCount = true;\n                x(ja, {\n                });\n            }\n             else {\n                ja._initialUnseenCount = la.unseen_count;\n                if (((ja._initialUnseenCount === 0))) {\n                    x(ja, {\n                    });\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n        }\n         else {\n            if (ja._maxCount) {\n                return;\n            }\n        ;\n        ;\n            var ma = ka.actions;\n            if (((!ma || !(ma.length)))) {\n                return;\n            }\n        ;\n        ;\n            var na = {\n            }, oa = {\n            };\n            for (var pa = 0; ((pa < ma.length)); pa++) {\n                var qa = ma[pa];\n                if (qa.is_forward) {\n                    continue;\n                }\n            ;\n            ;\n                var ra = qa.action_type, sa = qa.action_id, ta = ((qa.thread_id ? qa.thread_id : qa.server_thread_id)), ua = ((((qa.folder === undefined)) || ((qa.folder == n.INBOX))));\n                if (!ua) {\n                    continue;\n                }\n            ;\n            ;\n                if (((((ra == k.USER_GENERATED_MESSAGE)) || ((ra == k.LOG_MESSAGE))))) {\n                    var va = h.isGreaterThan(sa, na[ta]);\n                    if (((qa.is_unread && ((!na[ta] || va))))) {\n                        na[ta] = sa;\n                    }\n                ;\n                ;\n                }\n                 else if (((((ra == k.CHANGE_READ_STATUS)) && qa.mark_as_read))) {\n                    oa[ta] = sa;\n                }\n                \n            ;\n            ;\n            };\n        ;\n            da(ja, na);\n            ea(ja, oa);\n        }\n        \n    ;\n    ;\n    };\n;\n    function ca(ja, ka, la) {\n        var ma = z(ja);\n        if (((((((ma === undefined)) || ((ka > ja._lastSeenTimestamp)))) || ja._maxCount))) {\n            ja._lastSeenTimestamp = ka;\n            la = ((la || []));\n            if (((la.length <= s))) {\n                ja._maxCount = false;\n            }\n        ;\n        ;\n            var na = {\n            }, oa = ((z(ja) || {\n            }));\n            {\n                var fin259keys = ((window.top.JSBNG_Replay.forInKeys)((oa))), fin259i = (0);\n                var pa;\n                for (; (fin259i < fin259keys.length); (fin259i++)) {\n                    ((pa) = (fin259keys[fin259i]));\n                    {\n                        if (((oa[pa] !== true))) {\n                            var qa = oa[pa];\n                            if (fa(ja, qa)) {\n                                na[pa] = qa;\n                            }\n                        ;\n                        ;\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            var ra = q(r(la, true), na);\n            x(ja, ra);\n            ja._threadInformer.updatedUnseenState();\n        }\n    ;\n    ;\n    };\n;\n    function da(ja, ka) {\n        if (ja._maxCount) {\n            return;\n        }\n    ;\n    ;\n        var la = {\n        }, ma = false;\n        {\n            var fin260keys = ((window.top.JSBNG_Replay.forInKeys)((ka))), fin260i = (0);\n            var na;\n            for (; (fin260i < fin260keys.length); (fin260i++)) {\n                ((na) = (fin260keys[fin260i]));\n                {\n                    var oa = ka[na];\n                    if (fa(ja, oa)) {\n                        la[na] = oa;\n                        ma = true;\n                    }\n                ;\n                ;\n                };\n            };\n        };\n    ;\n        if (!ma) {\n            return;\n        }\n    ;\n    ;\n        y(ja, function(pa) {\n            {\n                var fin261keys = ((window.top.JSBNG_Replay.forInKeys)((la))), fin261i = (0);\n                var qa;\n                for (; (fin261i < fin261keys.length); (fin261i++)) {\n                    ((qa) = (fin261keys[fin261i]));\n                    {\n                        var ra = la[qa];\n                        if (((!pa[qa] && fa(ja, ra)))) {\n                            pa[qa] = la[qa];\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            x(ja, pa);\n            ja._threadInformer.updatedUnseenState();\n        });\n    };\n;\n    function ea(ja, ka, la) {\n        var ma = false;\n        {\n            var fin262keys = ((window.top.JSBNG_Replay.forInKeys)((ka))), fin262i = (0);\n            var na;\n            for (; (fin262i < fin262keys.length); (fin262i++)) {\n                ((na) = (fin262keys[fin262i]));\n                {\n                    ma = true;\n                    break;\n                };\n            };\n        };\n    ;\n        if (ma) {\n            y(ja, function(oa) {\n                var pa = false;\n                {\n                    var fin263keys = ((window.top.JSBNG_Replay.forInKeys)((ka))), fin263i = (0);\n                    var qa;\n                    for (; (fin263i < fin263keys.length); (fin263i++)) {\n                        ((qa) = (fin263keys[fin263i]));\n                        {\n                            var ra = ka[qa], sa = h.isGreaterThan(ra, oa[qa]);\n                            if (((oa[qa] && ((!ra || sa))))) {\n                                delete oa[qa];\n                                pa = true;\n                            }\n                        ;\n                        ;\n                        };\n                    };\n                };\n            ;\n                if (pa) {\n                    x(ja, oa);\n                    ja._threadInformer.updatedUnseenState();\n                    if (((la && ((aa(ja) === 0))))) {\n                        ja._serverRequests.markSeen();\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n            });\n        }\n    ;\n    ;\n    };\n;\n    function fa(ja, ka) {\n        var la = h.convertActionIDToTimestamp(ka);\n        return ((la > ja._lastSeenTimestamp));\n    };\n;\n    function ga(ja, ka) {\n        return ka.map(ja._serverRequests.convertThreadIDIfAvailable.bind(ja._serverRequests));\n    };\n;\n    function ha(ja, ka) {\n        var la = z(ja);\n        if (!la) {\n            return;\n        }\n    ;\n    ;\n        {\n            var fin264keys = ((window.top.JSBNG_Replay.forInKeys)((ka))), fin264i = (0);\n            var ma;\n            for (; (fin264i < fin264keys.length); (fin264i++)) {\n                ((ma) = (fin264keys[fin264i]));\n                {\n                    var na = ka[ma];\n                    if (la[ma]) {\n                        la[na] = la[ma];\n                        delete la[ma];\n                    }\n                ;\n                ;\n                };\n            };\n        };\n    ;\n        x(ja, la);\n    };\n;\n    function ia(ja) {\n        var ka = ((ja.message_counts || []));\n        for (var la = 0; ((la < ka.length)); la++) {\n            if (((ka[la].folder == n.INBOX))) {\n                return ka[la];\n            }\n        ;\n        ;\n        };\n    ;\n        return null;\n    };\n;\n    g.subscribe(i.DUMP_EVENT, function(ja, ka) {\n        ka.messaging = ((ka.messaging || {\n        }));\n        ka.messaging.unseen = {\n        };\n        ka.messaging.unseen_max_count = {\n        };\n        ka.messaging.unseen_time = {\n        };\n        var la = w._getInstances();\n        {\n            var fin265keys = ((window.top.JSBNG_Replay.forInKeys)((la))), fin265i = (0);\n            var ma;\n            for (; (fin265i < fin265keys.length); (fin265i++)) {\n                ((ma) = (fin265keys[fin265i]));\n                {\n                    ka.messaging.unseen[ma] = q({\n                    }, z(la[ma]));\n                    ka.messaging.unseen_max_count[ma] = la[ma]._maxCount;\n                    ka.messaging.unseen_time[ma] = la[ma]._lastSeenTimestamp;\n                };\n            };\n        };\n    ;\n    });\n    e.exports = w;\n});\n__d(\"MercuryThreadMetadataRawRenderer\", [\"JSBNG__Event\",\"CSS\",\"DOM\",\"MercuryActionStatus\",\"MercuryErrorInfo\",\"MessagingTag\",\"MercuryStatusTemplates\",\"Tooltip\",\"URI\",\"WebMessengerPermalinkConstants\",\"cx\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"CSS\"), i = b(\"DOM\"), j = b(\"MercuryActionStatus\"), k = b(\"MercuryErrorInfo\"), l = b(\"MessagingTag\"), m = b(\"MercuryStatusTemplates\"), n = b(\"Tooltip\"), o = b(\"URI\"), p = b(\"WebMessengerPermalinkConstants\"), q = b(\"cx\"), r = b(\"tx\"), s = {\n        renderParticipantListWithNoThreadName: function(u, v, w, x, y, z) {\n            var aa = {\n                callback: true,\n                check_length: true,\n                show_unread_count: true\n            };\n            z = ((z || {\n            }));\n            var ba = {\n            };\n            {\n                var fin266keys = ((window.top.JSBNG_Replay.forInKeys)((z))), fin266i = (0);\n                var ca;\n                for (; (fin266i < fin266keys.length); (fin266i++)) {\n                    ((ca) = (fin266keys[fin266i]));\n                    {\n                        if (aa[ca]) {\n                            ba[ca] = z[ca];\n                            delete z[ca];\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            var da = w.map(function(ia) {\n                return x[ia];\n            }), ea = this.renderRawParticipantList(u, da, w.length, z);\n            ea = this.renderRawTitleWithUnreadCount(ea, ((ba.show_unread_count ? v.unread_count : 0)));\n            var fa = z.abbr_mode, ga = {\n            };\n            {\n                var fin267keys = ((window.top.JSBNG_Replay.forInKeys)((z))), fin267i = (0);\n                var ha;\n                for (; (fin267i < fin267keys.length); (fin267i++)) {\n                    ((ha) = (fin267keys[fin267i]));\n                    {\n                        ga[ha] = z[ha];\n                    ;\n                    };\n                };\n            };\n        ;\n            ga.abbr_mode = true;\n            y.forEach(function(ia) {\n                var ja = ((((y.length > 1)) ? this._cloneIfDOMElement(ea) : ea));\n                i.setContent(ia, ja);\n                if (((((ba.check_length && !fa)) && ((ia.scrollWidth > ia.clientWidth))))) {\n                    var ka = this.renderRawParticipantList(u, da, w.length, ga), la = this.renderRawTitleWithUnreadCount(ka, ((ba.show_unread_count ? v.unread_count : 0)));\n                    i.setContent(ia, la);\n                }\n            ;\n            ;\n            }.bind(this));\n            ((ba.callback && ba.callback(ea)));\n        },\n        renderRawParticipantList: function(u, v, w, x) {\n            var y = {\n                abbr_mode: true,\n                last_separator_uses_and: true,\n                names_renderer: true\n            };\n            x = ((x || {\n            }));\n            var z = null;\n            if (x.names_renderer) {\n                z = x.names_renderer(v);\n            }\n             else z = v.map(function(ca) {\n                return ca.JSBNG__name;\n            });\n        ;\n        ;\n            var aa = null;\n            if (((z.length === 0))) {\n                if (!u) {\n                    aa = \"New Message\";\n                }\n                 else aa = \"No Participants\";\n            ;\n            ;\n            }\n             else if (((z.length == 1))) {\n                aa = z[0];\n            }\n             else if (((z.length == 2))) {\n                var ba = {\n                    participant1: z[0],\n                    participant2: z[1]\n                };\n                if (x.last_separator_uses_and) {\n                    aa = r._(\"{participant1} and {participant2}\", ba);\n                }\n                 else aa = r._(\"{participant1}, {participant2}\", ba);\n            ;\n            ;\n            }\n             else if (x.last_separator_uses_and) {\n                if (x.abbr_mode) {\n                    aa = r._(\"{participant1} and {others_link}\", {\n                        participant1: z[0],\n                        others_link: this.renderRawParticipantCount(u, {\n                            render_subset: true,\n                            count: ((w - 1))\n                        })\n                    });\n                }\n                 else if (((z.length == 3))) {\n                    aa = r._(\"{participant1}, {participant2} and {participant3}\", {\n                        participant1: z[0],\n                        participant2: z[1],\n                        participant3: z[2]\n                    });\n                }\n                 else aa = r._(\"{participant1}, {participant2} and {others_link}\", {\n                    participant1: z[0],\n                    participant2: z[1],\n                    others_link: this.renderRawParticipantCount(u, {\n                        render_subset: true,\n                        count: ((w - 2))\n                    })\n                });\n                \n            ;\n            ;\n            }\n             else if (((z.length == 3))) {\n                aa = r._(\"{participant1}, {participant2}, {participant3}\", {\n                    participant1: z[0],\n                    participant2: z[1],\n                    participant3: z[2]\n                });\n            }\n             else aa = r._(\"{participant1}, {participant2}, {participant3}, {others_link}\", {\n                participant1: z[0],\n                participant2: z[1],\n                participant3: z[2],\n                others_link: this.renderRawParticipantCount(u, {\n                    render_subset: true,\n                    count: ((w - 3))\n                })\n            });\n            \n            \n            \n            \n        ;\n        ;\n            if (Array.isArray(aa)) {\n                aa = i.create(\"span\", {\n                }, aa);\n            }\n        ;\n        ;\n            return aa;\n        },\n        renderRawTitleWithUnreadCount: function(u, v) {\n            var w = u;\n            if (((v && ((v > 1))))) {\n                w = i.create(\"span\", {\n                }, r._(\"{conversation_title} ({unread_count})\", {\n                    conversation_title: u,\n                    unread_count: v\n                }));\n            }\n        ;\n        ;\n            return w;\n        },\n        renderRawParticipantCount: function(u, v) {\n            var w = v.render_subset, x;\n            if (!w) {\n                x = ((((v.count > 1)) ? r._(\"{num} people\", {\n                    num: v.count\n                }) : \"1 person\"));\n            }\n             else x = ((((v.count > 1)) ? r._(\"{others_count} others\", {\n                others_count: v.count\n            }) : \"1 other\"));\n        ;\n        ;\n            return x;\n        },\n        renderShortNames: function(u) {\n            if (((u.length == 1))) {\n                return [u[0].JSBNG__name,];\n            }\n        ;\n        ;\n            return u.map(function(v) {\n                return v.short_name;\n            });\n        },\n        getUserCanonicalTitanURL: function(u, v, w) {\n            var x = new o().setSubdomain(\"www\"), y = u.substr(((u.indexOf(\":\") + 1)));\n            x.setPath(((((t(w) + \"/\")) + y)));\n            ((v && v(x.toString())));\n            return x.toString();\n        },\n        getTitanURLWithServerID: function(u, v, w) {\n            var x = new o().setSubdomain(\"www\");\n            x.setPath(p.getURIPathForThreadID(u, t(w)));\n            ((v && v(x.toString())));\n            return x.toString();\n        },\n        renderUserCanonicalTitanLink: function(u, v, w, x) {\n            var y = this.getUserCanonicalTitanURL(u, null, x);\n            v.setAttribute(\"href\", y);\n            ((w && w()));\n        },\n        renderTitanLinkWithServerID: function(u, v, w, x) {\n            var y = this.getTitanURLWithServerID(u, null, x);\n            v.setAttribute(\"href\", y);\n            ((w && w()));\n        },\n        renderStatusIndicator: function(u, v, w) {\n            var x;\n            if (((u == j.RESENDING))) {\n                x = this.renderResendIndicator();\n            }\n             else if (((((((((u !== undefined)) && ((u != j.UNSENT)))) && ((u != j.UNCONFIRMED)))) && ((u != j.SUCCESS))))) {\n                x = this.renderErrorIndicator(v, w);\n            }\n            \n        ;\n        ;\n            return x;\n        },\n        renderResendIndicator: function() {\n            return m[\":fb:mercury:resend-indicator\"].render();\n        },\n        renderErrorIndicator: function(u, v) {\n            if (!u) {\n                return null;\n            }\n        ;\n        ;\n            var w = m[\":fb:mercury:error-indicator\"].render(), x = u.is_transient, y = k.getMessage(u);\n            if (x) {\n                if (k.isConnectionError(u)) {\n                    y = r._(\"{message} Check your network connection or click to try again.\", {\n                        message: y\n                    });\n                }\n                 else y = r._(\"{message} Click to send again.\", {\n                    message: y\n                });\n            ;\n            }\n        ;\n        ;\n            n.set(w, y, \"above\", \"center\");\n            if (((v && x))) {\n                g.listen(w, \"click\", v);\n                w.setAttribute(\"tabindex\", \"0\");\n                h.addClass(w, \"_55q-\");\n            }\n        ;\n        ;\n            return w;\n        },\n        _cloneIfDOMElement: function(u) {\n            if (u.cloneNode) {\n                return u.cloneNode();\n            }\n             else return u\n        ;\n        }\n    };\n    function t(u) {\n        var v = p.BASE_PATH;\n        if (((u && ((u != l.INBOX))))) {\n            v += ((\"/\" + u));\n        }\n    ;\n    ;\n        return v;\n    };\n;\n    e.exports = s;\n});\n__d(\"MercurySeenByAll\", [\"CSS\",\"DataStore\",\"DOM\",\"MercuryParticipants\",\"MercuryDelayedRoger\",\"MercuryThreads\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSS\"), h = b(\"DataStore\"), i = b(\"DOM\"), j = b(\"MercuryParticipants\"), k = b(\"MercuryDelayedRoger\"), l = b(\"MercuryThreads\").get(), m = {\n    }, n = {\n        updateOnSeenChange: function(p, q) {\n            m[p.tagName] = true;\n            h.set(p, \"thread-id\", q.thread_id);\n            g.addClass(p, \"seenByListener\");\n            o(p, q);\n        }\n    };\n    function o(p, q) {\n        var r = q.participants.filter(function(t) {\n            return ((t !== j.user));\n        }), s = ((((q.participants.length > 0)) && ((q.participants[0] === j.user))));\n        g.conditionClass(p, \"repliedLast\", s);\n        g.conditionClass(p, \"seenByAll\", ((s && ((k.getSeenBy(q.thread_id).length === r.length)))));\n    };\n;\n    k.subscribe(\"state-changed\", function(p, q) {\n        {\n            var fin268keys = ((window.top.JSBNG_Replay.forInKeys)((m))), fin268i = (0);\n            var r;\n            for (; (fin268i < fin268keys.length); (fin268i++)) {\n                ((r) = (fin268keys[fin268i]));\n                {\n                    var s = i.scry(JSBNG__document.body, ((r + \".seenByListener\")));\n                    for (var t = 0; ((t < s.length)); t++) {\n                        var u = s[t], v = h.get(u, \"thread-id\");\n                        if (q[v]) {\n                            l.getThreadMeta(v, function(w) {\n                                o(u, w);\n                            });\n                        }\n                    ;\n                    ;\n                    };\n                ;\n                };\n            };\n        };\n    ;\n    });\n    e.exports = n;\n});\n__d(\"MercuryThreadMetadataRenderer\", [\"MercuryConfig\",\"CSS\",\"DOM\",\"HTML\",\"JSLogger\",\"MercuryAttachment\",\"MercuryAttachmentType\",\"MercuryEmoji\",\"MercuryMessageSourceTags\",\"MercurySingletonMixin\",\"MercuryThreadMetadataRawRenderer\",\"MercuryParticipants\",\"MercuryParticipantsConstants\",\"React\",\"MercurySeenByAll\",\"MercuryServerRequests\",\"SplitImage.react\",\"Style\",\"MercuryThreadlistIconTemplates\",\"MercuryThreads\",\"Tooltip\",\"URI\",\"arrayContains\",\"createArrayFrom\",\"copyProperties\",\"cx\",\"formatDate\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"MercuryConfig\"), h = b(\"CSS\"), i = b(\"DOM\"), j = b(\"HTML\"), k = b(\"JSLogger\"), l = b(\"MercuryAttachment\"), m = b(\"MercuryAttachmentType\"), n = b(\"MercuryEmoji\"), o = b(\"MercuryMessageSourceTags\"), p = b(\"MercurySingletonMixin\"), q = b(\"MercuryThreadMetadataRawRenderer\"), r = b(\"MercuryParticipants\"), s = b(\"MercuryParticipantsConstants\"), t = b(\"React\"), u = b(\"MercurySeenByAll\"), v = b(\"MercuryServerRequests\"), w = b(\"SplitImage.react\"), x = b(\"Style\"), y = b(\"MercuryThreadlistIconTemplates\"), z = b(\"MercuryThreads\"), aa = b(\"Tooltip\"), ba = b(\"URI\"), ca = b(\"arrayContains\"), da = b(\"createArrayFrom\"), ea = b(\"copyProperties\"), fa = b(\"cx\"), ga = b(\"formatDate\"), ha = b(\"tx\"), ia = k.create(\"wm_timestamp\");\n    function ja(pa) {\n        this._fbid = pa;\n        this._serverRequests = v.getForFBID(pa);\n        this._threads = z.getForFBID(pa);\n    };\n;\n    ea(ja, p);\n    ea(ja.prototype, {\n        renderTimestamp: function(pa, qa, ra, sa) {\n            if (sa) {\n                if (!qa) {\n                    ia.warn(\"no_title\");\n                    qa = (new JSBNG__Date(sa)).toLocaleDateString();\n                }\n            ;\n            ;\n                pa.setAttribute(\"title\", qa);\n                pa.setAttribute(\"data-utime\", ((sa / 1000)));\n                if (!ra) {\n                    ia.warn(\"no_display\");\n                    ra = ga(new JSBNG__Date(sa), ((g[\"24h_times\"] ? \"H:i\" : \"g:ia\")));\n                }\n            ;\n            ;\n                i.setContent(pa, ra);\n                h.show(pa);\n            }\n        ;\n        ;\n        },\n        renderMessageSourceTags: function(pa, qa, ra, sa) {\n            var ta = \"\", ua = \"\", va = \"\";\n            if (ca(ra, o.MESSENGER)) {\n                ta = \"Sent from Messenger\";\n                ua = new ba(\"/mobile/messenger\");\n                va = \"_9g\";\n            }\n             else if (ca(ra, o.MOBILE)) {\n                ta = \"Sent from Mobile\";\n                ua = new ba(\"/mobile/\");\n                va = \"_9j\";\n            }\n             else if (ca(ra, o.CHAT)) {\n                ta = \"Sent from chat\";\n                va = \"_9h\";\n            }\n             else if (ca(ra, o.EMAIL)) {\n                if (sa) {\n                    ta = ha._(\"Sent from {email}\", {\n                        email: sa\n                    });\n                }\n                 else ta = \"Sent from email\";\n            ;\n            ;\n                va = \"_9i\";\n            }\n            \n            \n            \n        ;\n        ;\n            if (va) {\n                aa.set(pa, ta);\n                h.addClass(qa, va);\n                if (ua) {\n                    pa.setAttribute(\"href\", ua);\n                }\n                 else pa.removeAttribute(\"href\");\n            ;\n            ;\n            }\n             else h.hide(pa);\n        ;\n        ;\n        },\n        renderMessageLocation: function(pa, qa, ra) {\n            var sa = ba(\"/ajax/messaging/hovercard/map.php\").setQueryData(ra);\n            pa.setAttribute(\"data-hovercard\", sa);\n            h.removeClass(pa, \"_b9\");\n            h.show(qa);\n        },\n        renderSpoofWarning: function(pa, qa, ra) {\n            if (qa) {\n                h.addClass(pa, \"_sa\");\n                aa.set(pa, ha._(\"Unable to confirm {name_or_email} as the sender.\", {\n                    name_or_email: ra.JSBNG__name\n                }));\n            }\n        ;\n        ;\n        },\n        renderChatSpoofWarning: function(pa, qa, ra) {\n            if (qa) {\n                i.appendContent(pa, ha._(\"Unable to confirm {name_or_email} as the sender.\", {\n                    name_or_email: ra.JSBNG__name\n                }));\n            }\n        ;\n        ;\n        },\n        renderCoreThreadlist: function(pa, qa, ra, sa, ta) {\n            sa = ((sa || {\n            }));\n            this.renderThreadImage(pa, qa.getNode(\"image\"));\n            var ua = qa.getNode(\"accessibleName\"), va = [qa.getNode(\"JSBNG__name\"),];\n            if (ua) {\n                va.push(ua);\n            }\n        ;\n        ;\n            oa(this, pa, va, sa);\n            if (((pa.folder && ta))) {\n                na(qa.getNode(\"folderBadge\"), pa.folder);\n            }\n        ;\n        ;\n            var wa = qa.getNode(\"timestamp\");\n            this.renderTimestamp(wa, pa.timestamp_absolute, pa.timestamp_relative, pa.timestamp);\n            this.renderSnippet(pa, qa.getNode(\"snippet\"));\n            la(qa, pa);\n            ra(qa, pa);\n        },\n        renderAndSeparatedParticipantList: function(pa, qa, ra) {\n            ra = ((ra || {\n            }));\n            ra.last_separator_uses_and = true;\n            this._threads.getThreadMeta(pa, function(sa) {\n                oa(this, sa, qa, ra);\n            }.bind(this));\n        },\n        renderSnippet: function(pa, qa) {\n            var ra = false, sa = i.create(\"span\");\n            h.addClass(sa, \"MercuryRepliedIndicator\");\n            i.appendContent(qa, sa);\n            u.updateOnSeenChange(sa, pa);\n            var ta = pa.snippet;\n            if (ta) {\n                if (pa.snippet_has_attachment) {\n                    i.appendContent(qa, i.create(\"span\", {\n                        className: \"MercuryAttachmentIndicator\"\n                    }));\n                }\n            ;\n            ;\n                if (pa.is_forwarded_snippet) {\n                    i.appendContent(qa, i.create(\"strong\", {\n                        className: \"_55q_\"\n                    }, \"Forwarded Message:\"));\n                }\n            ;\n            ;\n                if (((ta.substr(0, 4) == \"?OTR\"))) {\n                    ta = \"[encrypted message]\";\n                }\n                 else ta = ta.replace(/\\r\\n|[\\r\\n]/g, \" \");\n            ;\n            ;\n                ta = j(n.htmlEmojiAndEmote(ta));\n            }\n             else {\n                if (pa.is_forwarded_snippet) {\n                    i.appendContent(qa, i.create(\"strong\", {\n                        className: \"_55q_\"\n                    }, \"Forwarded Message\"));\n                }\n            ;\n            ;\n                if (((((pa.snippet_has_attachment && pa.snippet_attachments)) && pa.snippet_attachments.length))) {\n                    ra = true;\n                    ta = i.create(\"span\");\n                    ma(this, pa, ta);\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            var ua = pa.participants.length;\n            if (pa.is_subscribed) {\n                ua--;\n            }\n        ;\n        ;\n            if (((((((!ra && pa.snippet_sender)) && ((r.getIDForUser(this._fbid) != pa.snippet_sender)))) && ((ua > 1))))) {\n                r.get(pa.snippet_sender, function(va) {\n                    if (va.short_name) {\n                        i.appendContent(qa, ha._(\"{name}: {conversation_snippet}\", {\n                            JSBNG__name: va.short_name,\n                            conversation_snippet: ta\n                        }));\n                    }\n                     else i.appendContent(qa, ta);\n                ;\n                ;\n                });\n            }\n             else i.appendContent(qa, ta);\n        ;\n        ;\n        },\n        getTitanURL: function(pa, qa, ra) {\n            if (((pa.substr(0, pa.indexOf(\":\")) == \"user\"))) {\n                q.getUserCanonicalTitanURL(pa, qa, ra);\n            }\n             else this._serverRequests.getServerThreadID(pa, function(sa) {\n                q.getTitanURLWithServerID(sa, qa, ra);\n            });\n        ;\n        ;\n        },\n        renderTitanLink: function(pa, qa, ra, sa) {\n            if (((pa.substr(0, pa.indexOf(\":\")) == \"user\"))) {\n                q.renderUserCanonicalTitanLink(pa, qa, ra, sa);\n            }\n             else this._serverRequests.getServerThreadID(pa, function(ta) {\n                q.renderTitanLinkWithServerID(ta, qa, ra, sa);\n            });\n        ;\n        ;\n        },\n        renderThreadImage: function(pa, qa) {\n            if (pa.image_src) {\n                var ra = w({\n                    srcs: pa.image_src,\n                    size: s.BIG_IMAGE_SIZE\n                });\n                t.renderComponent(ra, qa);\n                return;\n            }\n        ;\n        ;\n            var sa = r.getIDForUser(this._fbid), ta = [], ua = pa.participants.filter(function(va) {\n                return ((va != sa));\n            });\n            if (!ua.length) {\n                ta = [sa,];\n            }\n             else if (((ua.length == 1))) {\n                ta = [ua[0],];\n            }\n             else ta = ua.slice(0, 3);\n            \n        ;\n        ;\n            this.renderParticipantImages(ta, qa);\n        },\n        renderParticipantImages: function(pa, qa) {\n            r.getOrderedBigImageMulti(pa, function(ra) {\n                var sa = w({\n                    srcs: ra,\n                    border: true,\n                    size: s.BIG_IMAGE_SIZE\n                });\n                t.renderComponent(sa, qa);\n            });\n        },\n        renderParticipantList: function(pa, qa, ra, sa) {\n            return q.renderRawParticipantList(this._serverRequests.getServerThreadIDNow(pa), qa, ra, sa);\n        },\n        renderThreadNameAndParticipantList: function(pa, qa, ra, sa) {\n            var ta = q.renderRawParticipantList(this._serverRequests.getServerThreadIDNow(pa), qa, ra, sa), ua = this._threads.getThreadMetaNow(pa);\n            if (!ua.JSBNG__name) {\n                return ta;\n            }\n        ;\n        ;\n            return ha._(\"{conversation_name} [with {participant_list}]\", {\n                conversation_name: ua.JSBNG__name,\n                participant_list: ta\n            });\n        },\n        renderParticipantCount: function(pa, qa) {\n            return q.renderRawParticipantCount(this._serverRequests.getServerThreadIDNow(pa), qa);\n        }\n    });\n    function ka(pa) {\n        if (!pa.snippet_attachments) {\n            return [];\n        }\n    ;\n    ;\n        return pa.snippet_attachments.filter(function(qa) {\n            return ((qa.attach_type === m.PHOTO));\n        });\n    };\n;\n    function la(pa, qa) {\n        var ra = ka(qa);\n        if (((ra.length === 0))) {\n            return;\n        }\n    ;\n    ;\n        var sa = ra[0].thumbnail_url;\n        if (!sa) {\n            return;\n        }\n    ;\n    ;\n        var ta = ((((ra.length == 1)) ? \"snippet-thumbnail-single\" : \"snippet-thumbnail-multiple\")), ua = pa.getNode(ta);\n        if (!ua) {\n            return;\n        }\n    ;\n    ;\n        var va = i.JSBNG__find(ua, \"i\");\n        x.set(va, \"background-image\", ((((\"url(\" + sa)) + \")\")));\n        h.show(ua);\n    };\n;\n    function ma(pa, qa, ra) {\n        var sa = ((qa.snippet_sender && ((r.getIDForUser(pa._fbid) == qa.snippet_sender)))), ta = function(ya) {\n            if (((!qa.snippet_sender || sa))) {\n                ya(null);\n                return;\n            }\n        ;\n        ;\n            r.get(qa.snippet_sender, function(za) {\n                ya(za.short_name);\n            });\n        }, ua = ka(qa), va = ((ua.length == qa.snippet_attachments.length)), wa = ((((((qa.snippet_attachments.length === 1)) && qa.snippet_attachments[0].metadata)) && ((qa.snippet_attachments[0].metadata.type == \"fb_voice_message\")))), xa = ((((qa.snippet_attachments.length === 1)) && ((qa.snippet_attachments[0].attach_type === m.STICKER))));\n        ta(function(ya) {\n            var za = null;\n            if (va) {\n                var ab = y[\":fb:mercury:attachment-icon-text\"].build().getRoot();\n                if (((ua.length === 1))) {\n                    za = ((sa ? \"You sent a photo.\" : ha._(\"{name} sent a photo.\", {\n                        JSBNG__name: ya\n                    })));\n                }\n                 else za = ((sa ? ha._(\"You sent {num_photos} photos.\", {\n                    num_photos: ua.length\n                }) : ha._(\"{name} sent {num_photos} photos.\", {\n                    JSBNG__name: ya,\n                    num_photos: ua.length\n                })));\n            ;\n            ;\n                h.addClass(ab, l.getAttachIconClass(ua[0].icon_type));\n                i.appendContent(ab, za);\n                i.appendContent(ra, ab);\n            }\n             else if (wa) {\n                var bb = y[\":fb:mercury:attachment-icon-text\"].build().getRoot();\n                za = ((sa ? \"You sent a voice message.\" : ha._(\"{name} sent a voice message.\", {\n                    JSBNG__name: ya\n                })));\n                h.addClass(bb, l.getAttachIconClass(qa.snippet_attachments[0].icon_type));\n                i.appendContent(bb, za);\n                i.appendContent(ra, bb);\n            }\n             else if (xa) {\n                za = ((sa ? \"You sent a sticker.\" : ha._(\"{name} sent a sticker.\", {\n                    JSBNG__name: ya\n                })));\n                i.appendContent(ra, za);\n            }\n             else qa.snippet_attachments.filter(function(cb) {\n                return ((((cb.attach_type == m.FILE)) || ((cb.attach_type == m.PHOTO))));\n            }).forEach(function(cb) {\n                var db = y[\":fb:mercury:attachment-icon-text\"].build().getRoot();\n                i.appendContent(db, cb.JSBNG__name);\n                h.addClass(db, l.getAttachIconClass(cb.icon_type));\n                i.appendContent(ra, db);\n            });\n            \n            \n        ;\n        ;\n        });\n    };\n;\n    function na(pa, qa) {\n        da(pa).forEach(function(ra) {\n            i.setContent(ra, qa);\n        });\n    };\n;\n    function oa(pa, qa, ra, sa) {\n        ra = da(ra);\n        if (qa.JSBNG__name) {\n            var ta = q.renderRawTitleWithUnreadCount(qa.JSBNG__name, ((sa.show_unread_count ? qa.unread_count : 0)));\n            ra.forEach(function(va) {\n                i.setContent(va, ta);\n            });\n            ((sa.callback && sa.callback(ta)));\n            return;\n        }\n    ;\n    ;\n        var ua = qa.participants;\n        if (((qa.participants.length > 1))) {\n            ua = qa.participants.filter(function(va) {\n                return ((va != r.getIDForUser(pa._fbid)));\n            });\n        }\n    ;\n    ;\n        r.getMulti(ua, function(va) {\n            q.renderParticipantListWithNoThreadName(pa._serverRequests.getServerThreadIDNow(qa.thread_id), qa, ua, va, ra, sa);\n        });\n    };\n;\n    e.exports = ja;\n});\n__d(\"MercuryChatUtils\", [\"Env\",], function(a, b, c, d, e, f) {\n    var g = b(\"Env\"), h = {\n        canOpenChatTab: function(i) {\n            var j = ((i.is_canonical && !i.is_canonical_user));\n            return ((((i.is_subscribed && !j)) && ((i.canonical_fbid != g.user))));\n        }\n    };\n    e.exports = h;\n});\n__d(\"RenderManager\", [\"function-extensions\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    b(\"function-extensions\");\n    var g = b(\"copyProperties\");\n    function h(i) {\n        this._isDirty = false;\n        this._obj = i;\n    };\n;\n    g(h.prototype, {\n        dirty: function() {\n            if (!this._isDirty) {\n                this._isDirty = true;\n                this._doPaint.bind(this).defer();\n            }\n        ;\n        ;\n        },\n        _doPaint: function() {\n            this._isDirty = false;\n            this._obj.paint();\n        }\n    });\n    e.exports = h;\n});\n__d(\"CounterDisplay\", [\"Arbiter\",\"CSS\",\"DOM\",\"RenderManager\",\"Run\",\"$\",\"copyProperties\",\"removeFromArray\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"CSS\"), i = b(\"DOM\"), j = b(\"RenderManager\"), k = b(\"Run\"), l = b(\"$\"), m = b(\"copyProperties\"), n = b(\"removeFromArray\");\n    function o(p, q, r, s, t, u) {\n        m(this, {\n            _name: p,\n            _valueNode: l(q),\n            _wrapperNode: ((l(r) || null)),\n            _statusClass: t,\n            _rm: new j(this),\n            _arbiterSubscription: null,\n            _count: 0\n        });\n        var v = this._valueNode.firstChild;\n        if (v) {\n            var w = parseInt(v.nodeValue, 10);\n            if (!isNaN(w)) {\n                this._count = w;\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n        this._statusNode = ((s ? l(s) : null));\n        this._subscribeAll();\n        o.instances.push(this);\n        if (!u) {\n            k.onLeave(this._destroy.bind(this), true);\n        }\n    ;\n    ;\n    };\n;\n    m(o, {\n        EVENT_TYPE_ADJUST: \"CounterDisplay/adjust\",\n        EVENT_TYPE_UPDATE: \"CounterDisplay/update\",\n        instances: [],\n        adjustCount: function(p, q) {\n            g.inform(((((o.EVENT_TYPE_ADJUST + \"/\")) + p)), q);\n        },\n        setCount: function(p, q) {\n            g.inform(((((o.EVENT_TYPE_UPDATE + \"/\")) + p)), q);\n        }\n    });\n    m(o.prototype, {\n        _destroy: function() {\n            delete this._valueNode;\n            delete this._wrapperNode;\n            if (this._arbiterSubscription) {\n                this._arbiterSubscription.unsubscribe();\n                delete this._arbiterSubscription;\n            }\n        ;\n        ;\n            n(o.instances, this);\n        },\n        adjustCount: function(p) {\n            this._count = Math.max(0, ((this._count + p)));\n            this._rm.dirty();\n            return this;\n        },\n        setCount: function(p) {\n            this._count = Math.max(0, p);\n            this._rm.dirty();\n            return this;\n        },\n        paint: function() {\n            i.setContent(this._valueNode, this._count);\n            this._toggleNodes();\n        },\n        _toggleNodes: function() {\n            if (this._wrapperNode) {\n                h.conditionClass(this._wrapperNode, \"hidden_elem\", ((this._count <= 0)));\n            }\n        ;\n        ;\n            if (((this._statusClass && this._statusNode))) {\n                h.conditionClass(this._statusNode, this._statusClass, ((this._count > 0)));\n            }\n        ;\n        ;\n        },\n        _subscribeAll: function() {\n            var p = [((((o.EVENT_TYPE_ADJUST + \"/\")) + this._name)),((((o.EVENT_TYPE_UPDATE + \"/\")) + this._name)),];\n            this._arbiterSubscription = g.subscribe(p, this._onInform.bind(this), g.SUBSCRIBE_NEW);\n        },\n        _onInform: function(p, q) {\n            q = parseInt(q);\n            if (isNaN(q)) {\n                return;\n            }\n        ;\n        ;\n            if (((p.indexOf(o.EVENT_TYPE_ADJUST) != -1))) {\n                this.adjustCount(q);\n            }\n             else if (((p.indexOf(o.EVENT_TYPE_UPDATE) != -1))) {\n                this.setCount(q);\n            }\n             else return\n            \n        ;\n            return;\n        }\n    });\n    e.exports = o;\n});\n__d(\"CacheStorage\", [\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"copyProperties\"), h = {\n        memory: k,\n        localstorage: i,\n        sessionstorage: j\n    };\n    function i() {\n        this._store = a.JSBNG__localStorage;\n    };\n;\n    i.available = function() {\n        try {\n            return !!a.JSBNG__localStorage;\n        } catch (m) {\n            return false;\n        };\n    ;\n    };\n    g(i.prototype, {\n        keys: function() {\n            var m = [];\n            for (var n = 0; ((n < this._store.length)); n++) {\n                m.push(this._store.key(n));\n            ;\n            };\n        ;\n            return m;\n        },\n        get: function(m) {\n            return this._store.getItem(m);\n        },\n        set: function(m, n) {\n            this._store.setItem(m, n);\n        },\n        remove: function(m) {\n            this._store.removeItem(m);\n        },\n        clear: function() {\n            this._store.clear();\n        }\n    });\n    function j() {\n        this._store = a.JSBNG__sessionStorage;\n    };\n;\n    j.available = function() {\n        try {\n            return !!a.JSBNG__sessionStorage;\n        } catch (m) {\n            return false;\n        };\n    ;\n    };\n    g(j.prototype, {\n        keys: function() {\n            var m = [];\n            for (var n = 0; ((n < this._store.length)); n++) {\n                m.push(this._store.key(n));\n            ;\n            };\n        ;\n            return m;\n        },\n        get: function(m) {\n            return this._store.getItem(m);\n        },\n        set: function(m, n) {\n            this._store.setItem(m, n);\n        },\n        remove: function(m) {\n            this._store.removeItem(m);\n        },\n        clear: function() {\n            this._store.clear();\n        }\n    });\n    function k() {\n        this._store = {\n        };\n    };\n;\n    k.available = function() {\n        return true;\n    };\n    g(k.prototype, {\n        keys: function() {\n            return Object.keys(this._store);\n        },\n        get: function(m) {\n            if (((this._store[m] === undefined))) {\n                return null;\n            }\n        ;\n        ;\n            return this._store[m];\n        },\n        set: function(m, n) {\n            this._store[m] = n;\n        },\n        remove: function(m) {\n            if (((m in this._store))) {\n                delete this._store[m];\n            }\n        ;\n        ;\n        },\n        clear: function() {\n            this._store = {\n            };\n        }\n    });\n    function l(m, n) {\n        this._key_prefix = ((n || \"_cs_\"));\n        this._magic_prefix = \"_@_\";\n        if (((((m == \"AUTO\")) || !m))) {\n            {\n                var fin269keys = ((window.top.JSBNG_Replay.forInKeys)((h))), fin269i = (0);\n                var o;\n                for (; (fin269i < fin269keys.length); (fin269i++)) {\n                    ((o) = (fin269keys[fin269i]));\n                    {\n                        var p = h[o];\n                        if (p.available()) {\n                            m = o;\n                            break;\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        }\n    ;\n    ;\n        if (m) {\n            if (((typeof m == \"string\"))) {\n                if (((!h[m] || !h[m].available()))) {\n                    this._backend = new k();\n                }\n                 else this._backend = new h[m]();\n            ;\n            ;\n            }\n             else if (((!m.available || !m.available()))) {\n                this._backend = new k();\n            }\n             else this._backend = m;\n            \n        ;\n        }\n    ;\n    ;\n    };\n;\n    g(l, {\n        getAllStorageTypes: function() {\n            return Object.keys(h);\n        }\n    });\n    g(l.prototype, {\n        keys: function() {\n            var m = [];\n            try {\n                if (this._backend) {\n                    var o = this._backend.keys();\n                    for (var p = 0; ((p < o.length)); p++) {\n                        if (((o[p].substr(0, this._key_prefix.length) == this._key_prefix))) {\n                            m.push(o[p].substr(this._key_prefix.length));\n                        }\n                    ;\n                    ;\n                    };\n                ;\n                }\n            ;\n            ;\n            } catch (n) {\n            \n            };\n        ;\n            return m;\n        },\n        set: function(m, n) {\n            if (this._backend) {\n                if (((typeof n == \"string\"))) {\n                    n = ((this._magic_prefix + n));\n                }\n                 else n = JSON.stringify(n);\n            ;\n            ;\n                try {\n                    this._backend.set(((this._key_prefix + m)), n);\n                } catch (o) {\n                \n                };\n            ;\n            }\n        ;\n        ;\n        },\n        get: function(m, n) {\n            var o;\n            if (this._backend) {\n                try {\n                    o = this._backend.get(((this._key_prefix + m)));\n                } catch (p) {\n                    o = null;\n                };\n            ;\n                if (((o !== null))) {\n                    if (((o.substr(0, this._magic_prefix.length) == this._magic_prefix))) {\n                        o = o.substr(this._magic_prefix.length);\n                    }\n                     else try {\n                        o = JSON.parse(o);\n                    } catch (q) {\n                        o = undefined;\n                    }\n                ;\n                ;\n                }\n                 else o = undefined;\n            ;\n            ;\n            }\n        ;\n        ;\n            if (((((o === undefined)) && ((n !== undefined))))) {\n                o = n;\n                if (this._backend) {\n                    var r;\n                    if (((typeof o == \"string\"))) {\n                        r = ((this._magic_prefix + o));\n                    }\n                     else r = JSON.stringify(o);\n                ;\n                ;\n                    try {\n                        this._backend.set(((this._key_prefix + m)), r);\n                    } catch (p) {\n                    \n                    };\n                ;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            return o;\n        },\n        remove: function(m) {\n            if (this._backend) {\n                try {\n                    this._backend.remove(((this._key_prefix + m)));\n                } catch (n) {\n                \n                };\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = l;\n});\n__d(\"Badge\", [\"DOM\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOM\"), h = b(\"cx\"), i = function(j) {\n        var k;\n        switch (j) {\n          case \"xsmall\":\n            k = \"_56_g _58to\";\n            break;\n          case \"small\":\n            k = \"_56_g _56_h\";\n            break;\n          case \"medium\":\n            k = \"_56_g _56_j\";\n            break;\n          case \"large\":\n            k = \"_56_g _56_k\";\n            break;\n          case \"xlarge\":\n            k = \"_56_g _57s-\";\n            break;\n        };\n    ;\n        if (k) {\n            return g.create(\"span\", {\n                className: k\n            });\n        }\n    ;\n    ;\n        return null;\n    };\n    e.exports = i;\n});\n__d(\"BasicTypeaheadRenderer\", [\"Badge\",\"DOM\",], function(a, b, c, d, e, f) {\n    var g = b(\"Badge\"), h = b(\"DOM\");\n    function i(j, k) {\n        var l = [];\n        if (j.icon) {\n            l.push(h.create(\"img\", {\n                alt: \"\",\n                src: j.icon\n            }));\n        }\n    ;\n    ;\n        if (j.text) {\n            var m = [j.text,];\n            if (j.verified) {\n                m.push(g(\"xsmall\"));\n            }\n        ;\n        ;\n            l.push(h.create(\"span\", {\n                className: \"text\"\n            }, m));\n        }\n    ;\n    ;\n        if (j.subtext) {\n            l.push(h.create(\"span\", {\n                className: \"subtext\"\n            }, [j.subtext,]));\n        }\n    ;\n    ;\n        var n = h.create(\"li\", {\n            className: ((j.type || \"\"))\n        }, l);\n        if (j.text) {\n            n.setAttribute(\"aria-label\", j.text);\n        }\n    ;\n    ;\n        return n;\n    };\n;\n    i.className = \"basic\";\n    e.exports = i;\n});\n__d(\"TypeaheadView\", [\"JSBNG__Event\",\"ArbiterMixin\",\"BasicTypeaheadRenderer\",\"CSS\",\"DOM\",\"Parent\",\"$\",\"copyProperties\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"ArbiterMixin\"), i = b(\"BasicTypeaheadRenderer\"), j = b(\"CSS\"), k = b(\"DOM\"), l = b(\"Parent\"), m = b(\"$\"), n = b(\"copyProperties\"), o = b(\"emptyFunction\");\n    function p(q, r) {\n        this.element = this.JSBNG__content = m(q);\n        this.showBadges = r.showBadges;\n        n(this, r);\n    };\n;\n    n(p.prototype, h, {\n        events: [\"highlight\",\"render\",\"reset\",\"select\",\"beforeRender\",\"next\",\"prev\",],\n        renderer: i,\n        autoSelect: false,\n        ignoreMouseover: false,\n        init: function() {\n            this.init = o;\n            this.initializeEvents();\n            this.reset();\n        },\n        initializeEvents: function() {\n            g.listen(this.element, {\n                mouseup: this.mouseup.bind(this),\n                mouseover: this.mouseover.bind(this)\n            });\n        },\n        setTypeahead: function(q) {\n            this.typeahead = q;\n        },\n        setAccessibilityControlElement: function(q) {\n            this.accessibilityElement = q;\n        },\n        getElement: function() {\n            return this.element;\n        },\n        mouseup: function(JSBNG__event) {\n            if (((JSBNG__event.button != 2))) {\n                this.select(true);\n                JSBNG__event.kill();\n            }\n        ;\n        ;\n        },\n        mouseover: function(JSBNG__event) {\n            if (this.ignoreMouseover) {\n                this.ignoreMouseover = false;\n                return;\n            }\n        ;\n        ;\n            if (this.visible) {\n                this.highlight(this.getIndex(JSBNG__event));\n            }\n        ;\n        ;\n        },\n        reset: function(q) {\n            if (!q) {\n                this.disableAutoSelect = false;\n            }\n        ;\n        ;\n            this.justRendered = false;\n            this.justShown = false;\n            this.index = -1;\n            this.items = [];\n            this.results = [];\n            this.value = \"\";\n            this.JSBNG__content.innerHTML = \"\";\n            this.inform(\"reset\");\n            return this;\n        },\n        getIndex: function(JSBNG__event) {\n            return this.items.indexOf(l.byTag(JSBNG__event.getTarget(), \"li\"));\n        },\n        JSBNG__getSelection: function() {\n            var q = ((this.results[this.index] || null));\n            return ((this.visible ? q : null));\n        },\n        isEmpty: function() {\n            return !this.results.length;\n        },\n        isVisible: function() {\n            return this.visible;\n        },\n        show: function() {\n            j.show(this.element);\n            if (((this.results && this.results.length))) {\n                if (((((this.autoSelect && this.accessibilityElement)) && this.selected))) {\n                    this.accessibilityElement.setAttribute(\"aria-activedescendant\", k.getID(this.selected));\n                }\n            ;\n            }\n        ;\n        ;\n            ((this.accessibilityElement && this.accessibilityElement.setAttribute(\"aria-expanded\", \"true\")));\n            this.visible = true;\n            return this;\n        },\n        hide: function() {\n            j.hide(this.element);\n            if (this.accessibilityElement) {\n                this.accessibilityElement.setAttribute(\"aria-expanded\", \"false\");\n                this.accessibilityElement.removeAttribute(\"aria-activedescendant\");\n            }\n        ;\n        ;\n            this.visible = false;\n            return this;\n        },\n        render: function(q, r, s) {\n            this.value = q;\n            if (!r.length) {\n                ((this.accessibilityElement && this.accessibilityElement.removeAttribute(\"aria-activedescendant\")));\n                this.reset(true);\n                return;\n            }\n        ;\n        ;\n            this.justRendered = true;\n            if (!this.results.length) {\n                this.justShown = true;\n            }\n        ;\n        ;\n            var t = {\n                results: r,\n                value: q\n            };\n            this.inform(\"beforeRender\", t);\n            r = t.results;\n            var u = this.getDefaultIndex(r);\n            if (((((this.index > 0)) && ((this.index !== this.getDefaultIndex(this.results)))))) {\n                var v = this.results[this.index];\n                for (var w = 0, x = r.length; ((w < x)); ++w) {\n                    if (((v.uid == r[w].uid))) {\n                        u = w;\n                        break;\n                    }\n                ;\n                ;\n                };\n            ;\n            }\n        ;\n        ;\n            this.results = r;\n            k.setContent(this.JSBNG__content, this.buildResults(r));\n            this.items = this.getItems();\n            this.highlight(u, false);\n            this.inform(\"render\", r);\n        },\n        getItems: function() {\n            return k.scry(this.JSBNG__content, \"li\");\n        },\n        buildResults: function(q) {\n            var r, s = null;\n            if (((typeof this.renderer == \"function\"))) {\n                r = this.renderer;\n                s = ((this.renderer.className || \"\"));\n            }\n             else {\n                r = a.TypeaheadRenderers[this.renderer];\n                s = this.renderer;\n            }\n        ;\n        ;\n            r = r.bind(this);\n            var t = this.showBadges, u = q.map(function(w, x) {\n                if (!t) {\n                    w.verified = null;\n                }\n            ;\n            ;\n                var y = ((w.node || r(w, x)));\n                y.setAttribute(\"role\", \"option\");\n                return y;\n            }), v = k.create(\"ul\", {\n                className: s,\n                id: ((\"typeahead_list_\" + ((this.typeahead ? k.getID(this.typeahead) : k.getID(this.element)))))\n            }, u);\n            v.setAttribute(\"role\", \"listbox\");\n            return v;\n        },\n        getDefaultIndex: function(q) {\n            var r = ((this.autoSelect && !this.disableAutoSelect));\n            return ((((((this.index < 0)) && !r)) ? -1 : 0));\n        },\n        next: function() {\n            this.highlight(((this.index + 1)));\n            this.inform(\"next\", this.selected);\n        },\n        prev: function() {\n            this.highlight(((this.index - 1)));\n            this.inform(\"prev\", this.selected);\n        },\n        getItemText: function(q) {\n            var r = \"\";\n            if (q) {\n                r = q.getAttribute(\"aria-label\");\n                if (!r) {\n                    r = k.getText(q);\n                    q.setAttribute(\"aria-label\", r);\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            return r;\n        },\n        setIsViewingSelectedItems: function(q) {\n            this.viewingSelected = q;\n            return this;\n        },\n        getIsViewingSelectedItems: function() {\n            return this.viewingSelected;\n        },\n        highlight: function(q, r) {\n            var s = true;\n            if (this.selected) {\n                j.removeClass(this.selected, \"selected\");\n                this.selected.setAttribute(\"aria-selected\", \"false\");\n            }\n        ;\n        ;\n            if (((q > ((this.items.length - 1))))) {\n                q = -1;\n            }\n             else if (((q < -1))) {\n                q = ((this.items.length - 1));\n            }\n            \n        ;\n        ;\n            if (((((q >= 0)) && ((q < this.items.length))))) {\n                if (((this.selected && ((this.getItemText(this.items[q]) === this.getItemText(this.selected)))))) {\n                    s = false;\n                }\n            ;\n            ;\n                this.selected = this.items[q];\n                j.addClass(this.selected, \"selected\");\n                this.selected.setAttribute(\"aria-selected\", \"true\");\n                if (this.accessibilityElement) {\n                    (function() {\n                        this.accessibilityElement.setAttribute(\"aria-activedescendant\", k.getID(this.selected));\n                    }).bind(this).defer();\n                }\n            ;\n            ;\n            }\n             else ((this.accessibilityElement && this.accessibilityElement.removeAttribute(\"aria-activedescendant\")));\n        ;\n        ;\n            this.index = q;\n            this.disableAutoSelect = ((q == -1));\n            var t = ((q !== -1)), u = this.getItemText(this.selected);\n            if (((((((((q !== -1)) && this.isVisible())) && u)) && this.autoSelect))) {\n                if (this.justShown) {\n                    this.justRendered = false;\n                    this.justShown = false;\n                    t = false;\n                }\n                 else if (((s && this.justRendered))) {\n                    this.justRendered = false;\n                    t = false;\n                }\n                \n            ;\n            }\n        ;\n        ;\n            if (((r !== false))) {\n                this.inform(\"highlight\", {\n                    index: q,\n                    selected: this.results[q],\n                    element: this.selected\n                });\n            }\n        ;\n        ;\n        },\n        select: function(q) {\n            var r = this.index, s = this.results[r], t = this.element.getAttribute(\"id\");\n            if (s) {\n                this.inform(\"select\", {\n                    index: r,\n                    clicked: !!q,\n                    selected: s,\n                    id: t,\n                    query: this.value\n                });\n                this.inform(\"afterSelect\");\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = p;\n});\n__d(\"BucketedTypeaheadView\", [\"Class\",\"DOM\",\"tx\",\"TypeaheadView\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Class\"), h = b(\"DOM\"), i = b(\"tx\"), j = b(\"TypeaheadView\"), k = b(\"copyProperties\");\n    function l(m, n) {\n        this.parent.construct(this, m, n);\n    };\n;\n    g.extend(l, j);\n    k(l.prototype, {\n        render: function(m, n, o) {\n            n = this.buildBuckets(m, n);\n            return this.parent.render(m, n, o);\n        },\n        highlight: function(m, n) {\n            if (((((m == -1)) && ((this.index !== 0))))) {\n                m = this.index;\n            }\n        ;\n        ;\n            while (((((((m >= 0)) && ((m < this.items.length)))) && !this.isHighlightable(this.results[m])))) {\n                m = ((m + 1));\n            ;\n            };\n        ;\n            this.parent.highlight(m, n);\n        },\n        buildBuckets: function(m, n) {\n            if (((((!this.typeObjects || !n)) || !n.length))) {\n                return n;\n            }\n        ;\n        ;\n            var o = [], p = {\n            };\n            for (var q = 0; ((q < n.length)); ++q) {\n                var r = n[q], s = ((r.render_type || r.type));\n                if (!p.hasOwnProperty(s)) {\n                    p[s] = o.length;\n                    o.push([this.buildBucketHeader(s),]);\n                }\n            ;\n            ;\n                r.classNames = s;\n                r.groupIndex = p[s];\n                r.indexInGroup = ((o[r.groupIndex].length - 1));\n                o[r.groupIndex].push(r);\n            };\n        ;\n            {\n                var fin270keys = ((window.top.JSBNG_Replay.forInKeys)((this.typeObjects))), fin270i = (0);\n                (0);\n                for (; (fin270i < fin270keys.length); (fin270i++)) {\n                    ((s) = (fin270keys[fin270i]));\n                    {\n                        if (((!p.hasOwnProperty(s) && this.typeObjects[s].show_always))) {\n                            p[s] = o.length;\n                            o.push([this.buildBucketHeader(s),]);\n                            r = this.buildNoResultsEntry();\n                            r.classNames = r.type;\n                            r.groupIndex = p[s];\n                            r.indexInGroup = ((o[r.groupIndex].length - 1));\n                            o[r.groupIndex].push(r);\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            var t = [];\n            if (this.typeObjectsOrder) {\n                for (var u = 0; ((u < this.typeObjectsOrder.length)); ++u) {\n                    var v = this.typeObjectsOrder[u];\n                    if (p.hasOwnProperty(v)) {\n                        t = t.concat(o[p[v]]);\n                    }\n                ;\n                ;\n                };\n            ;\n            }\n             else for (var w = 0; ((w < o.length)); ++w) {\n                t = t.concat(o[w]);\n            ;\n            }\n        ;\n        ;\n            return t;\n        },\n        buildNoResultsEntry: function() {\n            return {\n                uid: \"disabled_result\",\n                type: \"disabled_result\",\n                text: \"No Results\"\n            };\n        },\n        buildBucketHeader: function(m) {\n            var n = this.typeObjects[m];\n            if (((n === undefined))) {\n                throw new Error(((((m + \" is undefined in \")) + JSON.stringify(this.typeObjects))));\n            }\n        ;\n        ;\n            if (n.markup) {\n                n.text = n.markup;\n                delete n.markup;\n            }\n        ;\n        ;\n            return this.typeObjects[m];\n        },\n        buildResults: function(m) {\n            var n = this.parent.buildResults(m);\n            if (this.typeObjects) {\n                return h.create(\"div\", {\n                    className: \"bucketed\"\n                }, [n,]);\n            }\n             else return n\n        ;\n        },\n        isHighlightable: function(m) {\n            return ((((m.type != \"header\")) && ((m.type != \"disabled_result\"))));\n        },\n        select: function(m) {\n            var n = this.results[this.index];\n            if (((n && this.isHighlightable(n)))) {\n                this.parent.select(m);\n            }\n        ;\n        ;\n        },\n        normalizeIndex: function(m) {\n            var n = this.results.length;\n            if (((n === 0))) {\n                return -1;\n            }\n             else if (((m < -1))) {\n                return ((((((m % n)) + n)) + 1));\n            }\n             else if (((m >= n))) {\n                return ((((m % n)) - 1));\n            }\n             else return m\n            \n            \n        ;\n        },\n        getDefaultIndex: function(m) {\n            var n = ((this.autoSelect && !this.disableAutoSelect));\n            if (((((this.index < 0)) && !n))) {\n                return -1;\n            }\n        ;\n        ;\n            if (((m.length === 0))) {\n                return -1;\n            }\n        ;\n        ;\n            var o = 0;\n            while (((!this.isHighlightable(m) && ((o < m.length))))) {\n                o++;\n            ;\n            };\n        ;\n            return o;\n        },\n        prev: function() {\n            var m = this.results[this.normalizeIndex(((this.index - 1)))];\n            while (((m && !this.isHighlightable(m)))) {\n                this.index = this.normalizeIndex(((this.index - 1)));\n                m = this.results[this.normalizeIndex(((this.index - 1)))];\n            };\n        ;\n            return this.parent.prev();\n        },\n        next: function() {\n            var m = this.results[this.normalizeIndex(((this.index + 1)))];\n            while (((m && !this.isHighlightable(m)))) {\n                this.index = this.normalizeIndex(((this.index + 1)));\n                m = this.results[this.normalizeIndex(((this.index + 1)))];\n            };\n        ;\n            return this.parent.next();\n        }\n    });\n    e.exports = l;\n});\n__d(\"ContextualTypeaheadView\", [\"BucketedTypeaheadView\",\"CSS\",\"Class\",\"ContextualLayer\",\"ContextualLayerAutoFlip\",\"ContextualLayerHideOnScroll\",\"DOM\",\"DOMDimensions\",\"Style\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"BucketedTypeaheadView\"), h = b(\"CSS\"), i = b(\"Class\"), j = b(\"ContextualLayer\"), k = b(\"ContextualLayerAutoFlip\"), l = b(\"ContextualLayerHideOnScroll\"), m = b(\"DOM\"), n = b(\"DOMDimensions\"), o = b(\"Style\"), p = b(\"copyProperties\");\n    function q(r, s) {\n        this.parent.construct(this, r, s);\n    };\n;\n    i.extend(q, g);\n    p(q.prototype, {\n        init: function() {\n            this.initializeLayer();\n            this.parent.init();\n        },\n        initializeLayer: function() {\n            this.context = this.getContext();\n            this.wrapper = m.create(\"div\");\n            m.appendContent(this.wrapper, this.element);\n            h.addClass(this.element, \"uiContextualTypeaheadView\");\n            this.layer = new j({\n                context: this.context,\n                position: \"below\",\n                alignment: this.alignment,\n                causalElement: this.causalElement,\n                permanent: true\n            }, this.wrapper);\n            this.layer.enableBehavior(l);\n            if (((o.isFixed(this.context) || this.autoflip))) {\n                this.layer.enableBehavior(k);\n            }\n        ;\n        ;\n            this.subscribe(\"render\", this.renderLayer.bind(this));\n        },\n        show: function() {\n            if (this.minWidth) {\n                o.set(this.wrapper, \"min-width\", ((this.minWidth + \"px\")));\n            }\n             else if (this.width) {\n                o.set(this.wrapper, \"width\", ((this.width + \"px\")));\n            }\n             else o.set(this.wrapper, \"width\", ((n.getElementDimensions(this.context).width + \"px\")));\n            \n        ;\n        ;\n            var r = this.parent.show();\n            this.layer.show();\n            return r;\n        },\n        hide: function() {\n            this.layer.hide();\n            return this.parent.hide();\n        },\n        renderLayer: function() {\n            if (!this.isVisible()) {\n                return;\n            }\n        ;\n        ;\n            if (this.layer.isShown()) {\n                this.layer.updatePosition();\n            }\n             else this.layer.show();\n        ;\n        ;\n        },\n        clearText: function() {\n            this.layer.getCausalElement().value = \"\";\n        },\n        getContext: function() {\n            return this.element.parentNode;\n        }\n    });\n    e.exports = q;\n});\n__d(\"DOMClone\", [], function(a, b, c, d, e, f) {\n    var g = {\n        shallowClone: function(i) {\n            return h(i, false);\n        },\n        deepClone: function(i) {\n            return h(i, true);\n        }\n    };\n    function h(i, j) {\n        var k = i.cloneNode(j);\n        if (((typeof k.__FB_TOKEN !== \"undefined\"))) {\n            delete k.__FB_TOKEN;\n        }\n    ;\n    ;\n        return k;\n    };\n;\n    e.exports = g;\n});\n__d(\"Dcode\", [], function(a, b, c, d, e, f) {\n    var g, h = {\n    }, i = {\n        _: \"%\",\n        A: \"%2\",\n        B: \"000\",\n        C: \"%7d\",\n        D: \"%7b%22\",\n        E: \"%2c%22\",\n        F: \"%22%3a\",\n        G: \"%2c%22ut%22%3a1\",\n        H: \"%2c%22bls%22%3a\",\n        I: \"%2c%22n%22%3a%22%\",\n        J: \"%22%3a%7b%22i%22%3a0%7d\",\n        K: \"%2c%22pt%22%3a0%2c%22vis%22%3a\",\n        L: \"%2c%22ch%22%3a%7b%22h%22%3a%22\",\n        M: \"%7b%22v%22%3a2%2c%22time%22%3a1\",\n        N: \".channel%22%2c%22sub%22%3a%5b\",\n        O: \"%2c%22sb%22%3a1%2c%22t%22%3a%5b\",\n        P: \"%2c%22ud%22%3a100%2c%22lc%22%3a0\",\n        Q: \"%5d%2c%22f%22%3anull%2c%22uct%22%3a\",\n        R: \".channel%22%2c%22sub%22%3a%5b1%5d\",\n        S: \"%22%2c%22m%22%3a0%7d%2c%7b%22i%22%3a\",\n        T: \"%2c%22blc%22%3a1%2c%22snd%22%3a1%2c%22ct%22%3a\",\n        U: \"%2c%22blc%22%3a0%2c%22snd%22%3a1%2c%22ct%22%3a\",\n        V: \"%2c%22blc%22%3a0%2c%22snd%22%3a0%2c%22ct%22%3a\",\n        W: \"%2c%22s%22%3a0%2c%22blo%22%3a0%7d%2c%22bl%22%3a%7b%22ac%22%3a\",\n        X: \"%2c%22ri%22%3a0%7d%2c%22state%22%3a%7b%22p%22%3a0%2c%22ut%22%3a1\",\n        Y: \"%2c%22pt%22%3a0%2c%22vis%22%3a1%2c%22bls%22%3a0%2c%22blc%22%3a0%2c%22snd%22%3a1%2c%22ct%22%3a\",\n        Z: \"%2c%22sb%22%3a1%2c%22t%22%3a%5b%5d%2c%22f%22%3anull%2c%22uct%22%3a0%2c%22s%22%3a0%2c%22blo%22%3a0%7d%2c%22bl%22%3a%7b%22ac%22%3a\"\n    };\n    (function() {\n        var k = [];\n        {\n            var fin271keys = ((window.top.JSBNG_Replay.forInKeys)((i))), fin271i = (0);\n            var l;\n            for (; (fin271i < fin271keys.length); (fin271i++)) {\n                ((l) = (fin271keys[fin271i]));\n                {\n                    h[i[l]] = l;\n                    k.push(i[l]);\n                };\n            };\n        };\n    ;\n        k.reverse();\n        g = new RegExp(k.join(\"|\"), \"g\");\n    })();\n    var j = {\n        encode: function(k) {\n            return encodeURIComponent(k).replace(/([_A-Z])|%../g, function(l, m) {\n                return ((m ? ((\"%\" + m.charCodeAt(0).toString(16))) : l));\n            }).toLowerCase().replace(g, function(l) {\n                return h[l];\n            });\n        },\n        decode: function(k) {\n            return decodeURIComponent(k.replace(/[_A-Z]/g, function(l) {\n                return i[l];\n            }));\n        }\n    };\n    e.exports = j;\n});\n__d(\"FileInput\", [\"JSBNG__Event\",\"ArbiterMixin\",\"DOM\",\"DOMClone\",\"Focus\",\"UserAgent\",\"copyProperties\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"ArbiterMixin\"), i = b(\"DOM\"), j = b(\"DOMClone\"), k = b(\"Focus\"), l = b(\"UserAgent\"), m = b(\"copyProperties\"), n = b(\"cx\"), o = l.ie();\n    function p(q, r, s) {\n        this.container = q;\n        this.control = r;\n        this.input = s;\n        var t = i.scry(this.container, \"a\")[0];\n        ((t && t.removeAttribute(\"href\")));\n        var u = i.create(\"div\", {\n            className: \"_3jk\"\n        }, this.input);\n        i.appendContent(this.control, u);\n        this._initListeners();\n    };\n;\n    m(p.prototype, h, {\n        getValue: function() {\n            return this.input.value;\n        },\n        getInput: function() {\n            return this.input;\n        },\n        clear: function() {\n            if (o) {\n                var q = j.deepClone(this.input);\n                i.replace(this.input, q);\n                this.input = q;\n                while (this._listeners.length) {\n                    this._listeners.pop().remove();\n                ;\n                };\n            ;\n                this._initListeners();\n            }\n             else {\n                this.input.value = \"\";\n                this.input.files = null;\n            }\n        ;\n        ;\n        },\n        _initListeners: function() {\n            k.relocate(this.input, this.control);\n            this._listeners = [g.listen(this.input, \"change\", this._handleChange.bind(this)),];\n        },\n        _handleChange: function(JSBNG__event) {\n            this.inform(\"change\", JSBNG__event);\n            var q = this.input.form;\n            if (((q && ((o < 9))))) {\n                g.fire(q, \"change\", JSBNG__event);\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = p;\n});\n__d(\"Poller\", [\"ArbiterMixin\",\"AsyncRequest\",\"Cookie\",\"Env\",\"copyProperties\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"ArbiterMixin\"), h = b(\"AsyncRequest\"), i = b(\"Cookie\"), j = b(\"Env\"), k = b(\"copyProperties\"), l = b(\"emptyFunction\");\n    function m(p) {\n        this._config = k({\n            clearOnQuicklingEvents: true,\n            setupRequest: l,\n            interval: null,\n            maxRequests: Infinity,\n            dontStart: false\n        }, p);\n        if (!this._config.dontStart) {\n            this.start();\n        }\n    ;\n    ;\n    };\n;\n    m.MIN_INTERVAL = 2000;\n    k(m.prototype, g, {\n        start: function() {\n            if (this._polling) {\n                return this;\n            }\n        ;\n        ;\n            this._requests = 0;\n            this.request();\n            return this;\n        },\n        JSBNG__stop: function() {\n            this._cancelRequest();\n            return this;\n        },\n        mute: function() {\n            this._muted = true;\n            return this;\n        },\n        resume: function() {\n            if (this._muted) {\n                this._muted = false;\n                if (((!this._handle && this._polling))) {\n                    return this.request();\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            return this;\n        },\n        skip: function() {\n            this._skip = true;\n            return this;\n        },\n        reset: function() {\n            return this.JSBNG__stop().start();\n        },\n        request: function() {\n            this._cancelRequest();\n            this._polling = true;\n            if (!o()) {\n                return this._done();\n            }\n        ;\n        ;\n            if (this._muted) {\n                return this;\n            }\n        ;\n        ;\n            if (((++this._requests > this._config.maxRequests))) {\n                return this._done();\n            }\n        ;\n        ;\n            var p = new h(), q = false;\n            p.setInitialHandler(function() {\n                return !q;\n            });\n            this._cancelRequest = function() {\n                q = true;\n                this._cleanup();\n            }.bind(this);\n            p.setFinallyHandler(n.bind(this));\n            p.setInitialHandler = l;\n            p.setFinallyHandler = l;\n            this._config.setupRequest(p, this);\n            if (this._skip) {\n                this._skip = false;\n                n.bind(this).defer();\n            }\n             else p.send();\n        ;\n        ;\n            return this;\n        },\n        isPolling: function() {\n            return this._polling;\n        },\n        isMuted: function() {\n            return this._muted;\n        },\n        JSBNG__setInterval: function(p) {\n            if (p) {\n                this._config.interval = p;\n                this.start();\n            }\n        ;\n        ;\n        },\n        getInterval: function() {\n            return this._config.interval;\n        },\n        _cleanup: function() {\n            if (this._handle) {\n                JSBNG__clearTimeout(this._handle);\n            }\n        ;\n        ;\n            this._handle = null;\n            this._cancelRequest = l;\n            this._polling = false;\n        },\n        _done: function() {\n            this._cleanup();\n            this.inform(\"done\", {\n                sender: this\n            });\n            return this;\n        },\n        _config: null,\n        _requests: 0,\n        _muted: false,\n        _polling: false,\n        _skip: false,\n        _cancelRequest: l\n    });\n    function n() {\n        if (!this._polling) {\n            return;\n        }\n    ;\n    ;\n        if (((this._requests < this._config.maxRequests))) {\n            var p = this._config.interval;\n            p = ((((typeof p === \"function\")) ? p(this._requests) : p));\n            this._handle = this.request.bind(this).defer(((((p > m.MIN_INTERVAL)) ? p : m.MIN_INTERVAL)), this._config.clearOnQuicklingEvents);\n        }\n         else this._done();\n    ;\n    ;\n    };\n;\n    function o() {\n        return ((j.user == i.get(\"c_user\")));\n    };\n;\n    e.exports = m;\n});\n__d(\"SystemEvents\", [\"Arbiter\",\"Env\",\"ErrorUtils\",\"UserAgent\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"Env\"), i = b(\"ErrorUtils\"), j = b(\"UserAgent\"), k = b(\"copyProperties\"), l = new g(), m = [], n = 1000;\n    JSBNG__setInterval(function() {\n        for (var w = 0; ((w < m.length)); w++) {\n            m[w]();\n        ;\n        };\n    ;\n    }, n, false);\n    function o() {\n        return ((((/c_user=(\\d+)/.test(JSBNG__document.cookie) && RegExp.$1)) || 0));\n    };\n;\n    var p = h.user, q = JSBNG__navigator.onLine;\n    function r() {\n        if (!q) {\n            q = true;\n            l.inform(l.ONLINE, q);\n        }\n    ;\n    ;\n    };\n;\n    function s() {\n        if (q) {\n            q = false;\n            l.inform(l.ONLINE, q);\n        }\n    ;\n    ;\n    };\n;\n    if (j.ie()) {\n        if (((j.ie() >= 8))) {\n            window.JSBNG__attachEvent(\"JSBNG__onload\", function() {\n                JSBNG__document.body.JSBNG__ononline = r;\n                JSBNG__document.body.JSBNG__onoffline = s;\n            });\n        }\n         else m.push(function() {\n            ((JSBNG__navigator.onLine ? r : s))();\n        });\n    ;\n    ;\n    }\n     else if (window.JSBNG__addEventListener) {\n        if (!j.chrome()) {\n            window.JSBNG__addEventListener(\"online\", r, false);\n            window.JSBNG__addEventListener(\"offline\", s, false);\n        }\n    ;\n    }\n    \n;\n;\n    var t = p;\n    m.push(function() {\n        var w = o();\n        if (((t != w))) {\n            l.inform(l.USER, w);\n            t = w;\n        }\n    ;\n    ;\n    });\n    var u = JSBNG__Date.now();\n    function v() {\n        var w = JSBNG__Date.now(), x = ((w - u)), y = ((((x < 0)) || ((x > 10000))));\n        u = w;\n        if (y) {\n            l.inform(l.TIME_TRAVEL, x);\n        }\n    ;\n    ;\n        return y;\n    };\n;\n    m.push(v);\n    m.push(function() {\n        if (((window.JSBNG__onerror != i.JSBNG__onerror))) {\n            window.JSBNG__onerror = i.JSBNG__onerror;\n        }\n    ;\n    ;\n    });\n    k(l, {\n        USER: \"SystemEvents/USER\",\n        ONLINE: \"SystemEvents/ONLINE\",\n        TIME_TRAVEL: \"SystemEvents/TIME_TRAVEL\",\n        isPageOwner: function(w) {\n            return ((((w || o())) == p));\n        },\n        isOnline: function() {\n            return ((j.chrome() || q));\n        },\n        checkTimeTravel: v\n    });\n    e.exports = l;\n});\n__d(\"Typeahead\", [\"ArbiterMixin\",\"BehaviorsMixin\",\"DOM\",\"DataStore\",\"JSBNG__Event\",\"Parent\",\"Run\",\"copyProperties\",\"emptyFunction\",\"ge\",], function(a, b, c, d, e, f) {\n    var g = b(\"ArbiterMixin\"), h = b(\"BehaviorsMixin\"), i = b(\"DOM\"), j = b(\"DataStore\"), k = b(\"JSBNG__Event\"), l = b(\"Parent\"), m = b(\"Run\"), n = b(\"copyProperties\"), o = b(\"emptyFunction\"), p = b(\"ge\");\n    function q(r, s, t, u) {\n        this.args = {\n            data: r,\n            view: s,\n            core: t\n        };\n        j.set(u, \"Typeahead\", this);\n        this.element = u;\n    };\n;\n    q.getInstance = function(r) {\n        var s = l.byClass(r, \"uiTypeahead\");\n        return ((s ? j.get(s, \"Typeahead\") : null));\n    };\n    n(q.prototype, g, h, {\n        init: function(r) {\n            this.init = o;\n            this.getCore();\n            this.getView().setAccessibilityControlElement(this.getCore().getElement());\n            this.proxyEvents();\n            this.initBehaviors(((r || [])));\n            this.inform(\"init\", this);\n            this.data.bootstrap();\n            this.core.JSBNG__focus();\n        },\n        getData: function() {\n            if (!this.data) {\n                var r = this.args.data;\n                this.data = r;\n                this.data.init();\n            }\n        ;\n        ;\n            return this.data;\n        },\n        getView: function() {\n            if (!this.view) {\n                var r = this.args.view, s = ((r.node || p(r.node_id)));\n                if (!s) {\n                    s = i.create(\"div\", {\n                        className: \"uiTypeaheadView\"\n                    });\n                    i.appendContent(this.element, s);\n                }\n            ;\n            ;\n                if (((typeof r.ctor === \"string\"))) {\n                    this.view = new window[r.ctor](s, ((r.options || {\n                    })));\n                }\n                 else this.view = new r.ctor(s, ((r.options || {\n                })));\n            ;\n            ;\n                this.view.init();\n                this.view.setTypeahead(this.element);\n            }\n        ;\n        ;\n            return this.view;\n        },\n        getCore: function() {\n            if (!this.core) {\n                var r = this.args.core;\n                if (((typeof r.ctor === \"string\"))) {\n                    this.core = new window[r.ctor](((r.options || {\n                    })));\n                }\n                 else this.core = new r.ctor(((r.options || {\n                })));\n            ;\n            ;\n                this.core.init(this.getData(), this.getView(), this.getElement());\n            }\n        ;\n        ;\n            return this.core;\n        },\n        getElement: function() {\n            return this.element;\n        },\n        swapData: function(r) {\n            var s = this.core;\n            this.data = this.args.data = r;\n            r.init();\n            if (s) {\n                s.data = r;\n                s.initData();\n                s.reset();\n            }\n        ;\n        ;\n            r.bootstrap();\n            return r;\n        },\n        proxyEvents: function() {\n            [this.data,this.view,this.core,].forEach(function(r) {\n                r.subscribe(r.events, this.inform.bind(this));\n            }, this);\n        },\n        initBehaviors: function(r) {\n            r.forEach(function(s) {\n                if (((typeof s === \"string\"))) {\n                    if (((a.TypeaheadBehaviors && a.TypeaheadBehaviors[s]))) {\n                        a.TypeaheadBehaviors[s](this);\n                    }\n                     else m.onLoad(function() {\n                        if (a.TypeaheadBehaviors) {\n                            ((a.TypeaheadBehaviors[s] || o))(this);\n                        }\n                    ;\n                    ;\n                    }.bind(this));\n                ;\n                ;\n                }\n                 else this.enableBehavior(s);\n            ;\n            ;\n            }, this);\n        }\n    });\n    q.initNow = function(r, s, t) {\n        if (t) {\n            t.init(r);\n        }\n    ;\n    ;\n        r.init(s);\n    };\n    q.init = function(r, s, t, u) {\n        if (!i.isNodeOfType(r, [\"input\",\"textarea\",])) {\n            r = ((i.scry(r, \"input\")[0] || i.scry(r, \"textarea\")[0]));\n        }\n    ;\n    ;\n        var v = false;\n        try {\n            v = ((JSBNG__document.activeElement === r));\n        } catch (w) {\n        \n        };\n    ;\n        if (v) {\n            q.initNow(s, t, u);\n        }\n         else var x = k.listen(r, \"JSBNG__focus\", function() {\n            q.initNow(s, t, u);\n            x.remove();\n        })\n    ;\n    };\n    e.exports = q;\n});\n__d(\"TypeaheadCore\", [\"JSBNG__Event\",\"Arbiter\",\"ArbiterMixin\",\"CSS\",\"DOM\",\"Focus\",\"Input\",\"InputSelection\",\"Keys\",\"StickyPlaceholderInput\",\"UserAgent\",\"bind\",\"copyProperties\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"Arbiter\"), i = b(\"ArbiterMixin\"), j = b(\"CSS\"), k = b(\"DOM\"), l = b(\"Focus\"), m = b(\"Input\"), n = b(\"InputSelection\"), o = b(\"Keys\"), p = b(\"StickyPlaceholderInput\"), q = b(\"UserAgent\"), r = b(\"bind\"), s = b(\"copyProperties\"), t = b(\"emptyFunction\");\n    function u(v) {\n        s(this, v);\n    };\n;\n    s(u.prototype, i, {\n        events: [\"JSBNG__blur\",\"JSBNG__focus\",\"click\",\"unselect\",\"loading\",],\n        keepFocused: true,\n        resetOnSelect: false,\n        resetOnKeyup: true,\n        setValueOnSelect: false,\n        queryTimeout: 250,\n        preventFocusChangeOnTab: false,\n        init: function(v, w, x) {\n            this.init = t;\n            this.data = v;\n            this.view = w;\n            this.root = x;\n            this.initInput();\n            this.inputWrap = k.JSBNG__find(x, \"div.wrap\");\n            this.hiddenInput = k.JSBNG__find(x, \"input.hiddenInput\");\n            this.value = \"\";\n            this.nextQuery = null;\n            this.selectedText = null;\n            if (((this.setValueOnSelect && j.hasClass(this.inputWrap, \"selected\")))) {\n                this.selectedText = this.getValue();\n            }\n        ;\n        ;\n            this.initView();\n            this.initData();\n            this.initEvents();\n            this.initToggle();\n            this._exclusions = [];\n        },\n        initInput: function() {\n            this.element = k.JSBNG__find(this.root, \".textInput\");\n            var v = k.scry(this.element, \"input\")[0];\n            if (v) {\n                this.element = v;\n            }\n        ;\n        ;\n        },\n        initView: function() {\n            this.view.subscribe(\"highlight\", l.set.curry(this.element));\n            this.view.subscribe(\"select\", function(v, w) {\n                this.select(w.selected);\n            }.bind(this));\n            this.view.subscribe(\"afterSelect\", function() {\n                this.afterSelect();\n            }.bind(this));\n        },\n        initData: function() {\n            this.data.subscribe(\"respond\", function(v, w) {\n                if (((w.forceDisplay || ((((w.value == this.getValue())) && !this.element.disabled))))) {\n                    this.view.render(w.value, w.results, w.isAsync);\n                }\n            ;\n            ;\n            }.bind(this));\n            this.data.subscribe(\"activity\", function(v, w) {\n                this.fetching = w.activity;\n                if (!this.fetching) {\n                    ((this.nextQuery && this.performQuery()));\n                }\n            ;\n            ;\n                if (((this.loading != this.fetching))) {\n                    this.loading = this.fetching;\n                    this.inform(\"loading\", {\n                        loading: this.loading\n                    });\n                }\n            ;\n            ;\n            }.bind(this));\n        },\n        initEvents: function() {\n            g.listen(this.view.getElement(), {\n                mouseup: this.viewMouseup.bind(this),\n                mousedown: this.viewMousedown.bind(this)\n            });\n            var v = {\n                JSBNG__blur: r(this, \"JSBNG__blur\"),\n                JSBNG__focus: r(this, \"JSBNG__focus\"),\n                click: r(this, \"click\"),\n                keyup: r(this, \"keyup\"),\n                keydown: r(this, \"keydown\")\n            };\n            if (q.firefox()) {\n                v.text = v.keyup;\n            }\n        ;\n        ;\n            if (((q.firefox() < 4))) {\n                v.keypress = v.keydown;\n                delete v.keydown;\n            }\n        ;\n        ;\n            g.listen(this.element, v);\n            g.listen(this.element, \"keypress\", r(this, \"keypress\"));\n        },\n        initToggle: function() {\n            this.subscribe(\"JSBNG__blur\", this.view.hide.bind(this.view));\n            this.subscribe(\"JSBNG__focus\", this.view.show.bind(this.view));\n        },\n        viewMousedown: function() {\n            this.selecting = true;\n        },\n        viewMouseup: function() {\n            this.selecting = false;\n        },\n        JSBNG__blur: function() {\n            if (this.selecting) {\n                this.selecting = false;\n                return;\n            }\n        ;\n        ;\n            this.inform(\"JSBNG__blur\");\n        },\n        click: function() {\n            var v = n.get(this.element);\n            if (((v.start == v.end))) {\n                this.element.select();\n            }\n        ;\n        ;\n            this.inform(\"click\");\n        },\n        JSBNG__focus: function() {\n            this.checkValue();\n            this.inform(\"JSBNG__focus\");\n        },\n        keyup: function() {\n            if (((this.resetOnKeyup && !this.getValue()))) {\n                this.view.reset();\n            }\n        ;\n        ;\n            this.checkValue();\n        },\n        keydown: function(JSBNG__event) {\n            if (((!this.view.isVisible() || this.view.isEmpty()))) {\n                this.checkValue.bind(this).defer();\n                return;\n            }\n        ;\n        ;\n            switch (g.getKeyCode(JSBNG__event)) {\n              case o.TAB:\n                this.handleTab(JSBNG__event);\n                return;\n              case o.UP:\n                this.view.prev();\n                break;\n              case o.DOWN:\n                this.view.next();\n                break;\n              case o.ESC:\n                this.view.reset();\n                break;\n              default:\n                this.checkValue.bind(this).defer();\n                return;\n            };\n        ;\n            JSBNG__event.kill();\n        },\n        keypress: function(JSBNG__event) {\n            if (((this.view.JSBNG__getSelection() && ((g.getKeyCode(JSBNG__event) == o.RETURN))))) {\n                this.view.select();\n                JSBNG__event.kill();\n            }\n        ;\n        ;\n        },\n        handleTab: function(JSBNG__event) {\n            if (this.preventFocusChangeOnTab) {\n                if (this.view.JSBNG__getSelection()) {\n                    JSBNG__event.kill();\n                }\n                 else JSBNG__event.prevent();\n            ;\n            }\n        ;\n        ;\n            this.view.select();\n        },\n        select: function(v) {\n            if (((v && this.setValueOnSelect))) {\n                this.setValue(v.text);\n                this.setHiddenValue(v.uid);\n                this.selectedText = v.text;\n                j.addClass(this.inputWrap, \"selected\");\n            }\n        ;\n        ;\n        },\n        afterSelect: function() {\n            ((this.keepFocused ? l.set(this.element) : this.element.JSBNG__blur()));\n            ((this.resetOnSelect ? this.reset() : this.view.reset()));\n        },\n        unselect: function() {\n            if (this.setValueOnSelect) {\n                this.selectedText = null;\n                j.removeClass(this.inputWrap, \"selected\");\n            }\n        ;\n        ;\n            this.setHiddenValue();\n            this.inform(\"unselect\", this);\n        },\n        setEnabled: function(v) {\n            var w = ((v === false));\n            this.element.disabled = w;\n            j.conditionClass(this.root, \"uiTypeaheadDisabled\", w);\n        },\n        reset: function() {\n            this.unselect();\n            this.setValue();\n            ((!this.keepFocused && m.reset(this.element)));\n            this.view.reset();\n            this.inform(\"reset\");\n        },\n        getElement: function() {\n            return this.element;\n        },\n        setExclusions: function(v) {\n            this._exclusions = v;\n        },\n        getExclusions: function() {\n            return this._exclusions;\n        },\n        setValue: function(v) {\n            this.value = this.nextQuery = ((v || \"\"));\n            m.setValue(this.element, this.value);\n            p.update(this.element);\n        },\n        setHiddenValue: function(v) {\n            this.hiddenInput.value = ((((v || ((v === 0)))) ? v : \"\"));\n            h.inform(\"Form/change\", {\n                node: this.hiddenInput\n            });\n        },\n        getValue: function() {\n            return m.getValue(this.element);\n        },\n        getHiddenValue: function() {\n            return ((this.hiddenInput.value || \"\"));\n        },\n        checkValue: function() {\n            var v = this.getValue();\n            if (((v == this.value))) {\n                return;\n            }\n        ;\n        ;\n            if (((this.selectedText && ((this.selectedText != v))))) {\n                this.unselect();\n            }\n        ;\n        ;\n            var w = JSBNG__Date.now(), x = ((w - this.time));\n            this.time = w;\n            this.value = this.nextQuery = v;\n            this.performQuery(x);\n        },\n        performQuery: function(v) {\n            if (this.selectedText) {\n                return;\n            }\n        ;\n        ;\n            v = ((v || 0));\n            if (((this.fetching && ((v < this.queryTimeout))))) {\n                this.data.query(this.nextQuery, true, this._exclusions, v);\n            }\n             else {\n                this.data.query(this.nextQuery, false, this._exclusions, v);\n                this.nextQuery = null;\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = u;\n});\n__d(\"setIntervalAcrossTransitions\", [], function(a, b, c, d, e, f) {\n    function g(h, i) {\n        return JSBNG__setInterval(h, i, false);\n    };\n;\n    e.exports = g;\n});\n__d(\"PresenceCookieManager\", [\"Cookie\",\"Dcode\",\"ErrorUtils\",\"Env\",\"JSLogger\",\"PresenceUtil\",\"URI\",\"PresenceInitialData\",], function(a, b, c, d, e, f) {\n    var g = b(\"Cookie\"), h = b(\"Dcode\"), i = b(\"ErrorUtils\"), j = b(\"Env\"), k = b(\"JSLogger\"), l = b(\"PresenceUtil\"), m = b(\"URI\"), n = b(\"PresenceInitialData\"), o = n.cookieVersion, p = n.dictEncode, q = \"presence\", r = {\n    }, s = null, t = null, u = k.create(\"presence_cookie\");\n    function v() {\n        try {\n            var z = g.get(q);\n            if (((s !== z))) {\n                s = z;\n                t = null;\n                if (((z && ((z.charAt(0) == \"E\"))))) {\n                    z = h.decode(z.substring(1));\n                }\n            ;\n            ;\n                if (z) {\n                    t = JSON.parse(z);\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            if (((t && ((!t.user || ((t.user === j.user))))))) {\n                return t;\n            }\n        ;\n        ;\n        } catch (y) {\n            u.warn(\"getcookie_error\");\n        };\n    ;\n        return null;\n    };\n;\n    function w() {\n        return parseInt(((JSBNG__Date.now() / 1000)), 10);\n    };\n;\n    var x = {\n        register: function(y, z) {\n            r[y] = z;\n        },\n        store: function() {\n            var y = v();\n            if (((((y && y.v)) && ((o < y.v))))) {\n                return;\n            }\n        ;\n        ;\n            var z = {\n                v: o,\n                time: w(),\n                user: j.user\n            };\n            {\n                var fin272keys = ((window.top.JSBNG_Replay.forInKeys)((r))), fin272i = (0);\n                var aa;\n                for (; (fin272i < fin272keys.length); (fin272i++)) {\n                    ((aa) = (fin272keys[fin272i]));\n                    {\n                        z[aa] = i.applyWithGuard(r[aa], r, [((y && y[aa])),], function(ea) {\n                            ea.presence_subcookie = aa;\n                        });\n                    ;\n                    };\n                };\n            };\n        ;\n            var ba = JSON.stringify(z);\n            if (p) {\n                ba = ((\"E\" + h.encode(ba)));\n            }\n        ;\n        ;\n            if (l.hasUserCookie()) {\n                var ca = ba.length;\n                if (((ca > 1024))) {\n                    u.warn(\"big_cookie\", ca);\n                }\n            ;\n            ;\n                var da = ((m.getRequestURI(false).isSecure() && !!g.get(\"csm\")));\n                g.set(q, ba, null, null, da);\n            }\n        ;\n        ;\n        },\n        clear: function() {\n            g.clear(q);\n        },\n        getSubCookie: function(y) {\n            var z = v();\n            if (!z) {\n                return null;\n            }\n        ;\n        ;\n            return z[y];\n        }\n    };\n    e.exports = x;\n});\n__d(\"PresenceState\", [\"Arbiter\",\"ErrorUtils\",\"JSLogger\",\"PresenceCookieManager\",\"copyProperties\",\"debounceAcrossTransitions\",\"setIntervalAcrossTransitions\",\"PresenceInitialData\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ErrorUtils\"), i = b(\"JSLogger\"), j = b(\"PresenceCookieManager\"), k = b(\"copyProperties\"), l = b(\"debounceAcrossTransitions\"), m = b(\"setIntervalAcrossTransitions\"), n = b(\"PresenceInitialData\"), o = ((n.cookiePollInterval || 2000)), p = [], q = [], r = null, s = null, t = 0, u = null, v = 0, w = [\"sb2\",\"t2\",\"lm2\",\"uct2\",\"tr\",\"tw\",\"at\",\"wml\",], x = i.create(\"presence_state\");\n    function y() {\n        return j.getSubCookie(\"state\");\n    };\n;\n    function z() {\n        t = JSBNG__Date.now();\n        j.store();\n        da(s);\n    };\n;\n    var aa = l(z, 0);\n    function ba(ia) {\n        if (((((((((typeof ia == \"undefined\")) || isNaN(ia))) || ((ia == Number.POSITIVE_INFINITY)))) || ((ia == Number.NEGATIVE_INFINITY))))) {\n            ia = 0;\n        }\n    ;\n    ;\n        return ia;\n    };\n;\n    function ca(ia) {\n        var ja = {\n        };\n        if (ia) {\n            w.forEach(function(ma) {\n                ja[ma] = ia[ma];\n            });\n            if (((t < ia.ut))) {\n                x.error(\"new_cookie\", {\n                    cookie_time: ia.ut,\n                    local_time: t\n                });\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n        ja.ut = t;\n        for (var ka = 0, la = p.length; ((ka < la)); ka++) {\n            h.applyWithGuard(p[ka], null, [ja,]);\n        ;\n        };\n    ;\n        s = ja;\n        return s;\n    };\n;\n    function da(ia) {\n        v++;\n        t = ba(ia.ut);\n        if (!r) {\n            r = m(ga, o);\n        }\n    ;\n    ;\n        s = ia;\n        if (((u === null))) {\n            u = ia;\n        }\n    ;\n    ;\n        for (var ja = 0, ka = q.length; ((ja < ka)); ja++) {\n            h.applyWithGuard(q[ja], null, [ia,]);\n        ;\n        };\n    ;\n        v--;\n    };\n;\n    function ea(ia) {\n        if (((ia && ia.ut))) {\n            if (((t < ia.ut))) {\n                return true;\n            }\n             else if (((ia.ut < t))) {\n                x.error(\"old_cookie\", {\n                    cookie_time: ia.ut,\n                    local_time: t\n                });\n            }\n            \n        ;\n        }\n    ;\n    ;\n        return false;\n    };\n;\n    function fa() {\n        var ia = y();\n        if (ea(ia)) {\n            s = ia;\n        }\n    ;\n    ;\n        return s;\n    };\n;\n    function ga() {\n        var ia = y();\n        if (ea(ia)) {\n            da(ia);\n        }\n    ;\n    ;\n    };\n;\n    j.register(\"state\", ca);\n    g.subscribe(i.DUMP_EVENT, function(ia, ja) {\n        ja.presence_state = {\n            initial: k({\n            }, u),\n            state: k({\n            }, s),\n            update_time: t,\n            sync_paused: v,\n            poll_time: o\n        };\n    });\n    (function() {\n        var ia = fa();\n        if (ia) {\n            da(ia);\n        }\n         else {\n            x.debug(\"no_cookie_initial\");\n            da(ca());\n            return;\n        }\n    ;\n    ;\n    })();\n    var ha = {\n        doSync: function(ia) {\n            if (v) {\n                return;\n            }\n        ;\n        ;\n            if (ia) {\n                z();\n            }\n             else aa();\n        ;\n        ;\n        },\n        registerStateStorer: function(ia) {\n            p.push(ia);\n        },\n        registerStateLoader: function(ia) {\n            q.push(ia);\n        },\n        get: function() {\n            return fa();\n        },\n        getInitial: function() {\n            return u;\n        },\n        verifyNumber: ba\n    };\n    e.exports = ha;\n});\n__d(\"TypeaheadBestName\", [\"TypeaheadUtil\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"TypeaheadUtil\"), h = b(\"copyProperties\");\n    function i(j) {\n        this._typeahead = j;\n    };\n;\n    i.prototype.enable = function() {\n        var j = this._typeahead.getView();\n        this._subscription = j.subscribe(\"beforeRender\", function(k, l) {\n            var m = l.value;\n            for (var n = 0; ((n < l.results.length)); ++n) {\n                var o = l.results[n];\n                if (((o.alternate_names == null))) {\n                    continue;\n                }\n            ;\n            ;\n                if (g.isQueryMatch(m, o.default_name)) {\n                    o.text = o.default_name;\n                    return;\n                }\n            ;\n            ;\n                for (var p = 0; ((p < o.alternate_names.length)); p++) {\n                    if (g.isQueryMatch(m, o.alternate_names[p])) {\n                        o.text = o.alternate_names[p];\n                        return;\n                    }\n                ;\n                ;\n                };\n            ;\n                o.text = o.default_name;\n            };\n        ;\n        });\n    };\n    i.prototype.disable = function() {\n        this._typeahead.getView().unsubscribe(this._subscription);\n        this._subscription = null;\n    };\n    h(i.prototype, {\n        _subscription: null\n    });\n    e.exports = i;\n});\n__d(\"legacy:BestNameTypeaheadBehavior\", [\"TypeaheadBestName\",], function(a, b, c, d) {\n    var e = b(\"TypeaheadBestName\");\n    if (!a.TypeaheadBehaviors) {\n        a.TypeaheadBehaviors = {\n        };\n    }\n;\n;\n    a.TypeaheadBehaviors.buildBestAvailableNames = function(f) {\n        f.enableBehavior(e);\n    };\n}, 3);\n__d(\"TypingDetector\", [\"JSBNG__Event\",\"function-extensions\",\"ArbiterMixin\",\"Input\",\"Run\",\"copyProperties\",\"createObjectFrom\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\");\n    b(\"function-extensions\");\n    var h = b(\"ArbiterMixin\"), i = b(\"Input\"), j = b(\"Run\"), k = b(\"copyProperties\"), l = b(\"createObjectFrom\"), m = b(\"emptyFunction\");\n    function n(o) {\n        this._input = o;\n        this._ignoreKeys = {\n        };\n    };\n;\n    n.INACTIVE = 0;\n    n.TYPING = 1;\n    n.QUITTING = 2;\n    k(n.prototype, h, {\n        _timeout: 7000,\n        _currentState: n.INACTIVE,\n        init: function() {\n            this.init = m;\n            this.reset();\n            g.listen(this._input, \"keyup\", this._update.bind(this));\n            j.onUnload(this._onunload.bind(this));\n        },\n        reset: function() {\n            JSBNG__clearTimeout(this._checkTimer);\n            this._checkTimer = null;\n            this._lastKeystrokeAt = null;\n            this._currentState = n.INACTIVE;\n        },\n        setIgnoreKeys: function(o) {\n            this._ignoreKeys = l(o);\n        },\n        _onunload: function() {\n            if (((this._currentState == n.TYPING))) {\n                this._transition(n.QUITTING);\n            }\n        ;\n        ;\n        },\n        _update: function(JSBNG__event) {\n            var o = g.getKeyCode(JSBNG__event), p = this._currentState;\n            if (!this._ignoreKeys[o]) {\n                if (((i.getValue(this._input).trim().length === 0))) {\n                    if (((p == n.TYPING))) {\n                        this._transition(n.INACTIVE);\n                    }\n                ;\n                ;\n                }\n                 else if (((p == n.TYPING))) {\n                    this._recordKeystroke();\n                }\n                 else if (((p == n.INACTIVE))) {\n                    this._transition(n.TYPING);\n                    this._recordKeystroke();\n                }\n                \n                \n            ;\n            }\n        ;\n        ;\n        },\n        _transition: function(o) {\n            this.reset();\n            this._currentState = o;\n            this.inform(\"change\", o);\n        },\n        _recordKeystroke: function() {\n            this._lastKeystrokeTime = JSBNG__Date.now();\n            if (!this._checkTimer) {\n                this._checkTimer = this._checkTyping.bind(this).defer(this._timeout);\n            }\n        ;\n        ;\n        },\n        _checkTyping: function() {\n            var o = ((this._lastKeystrokeTime + this._timeout)), p = JSBNG__Date.now();\n            if (((p > o))) {\n                this._transition(n.INACTIVE);\n            }\n             else {\n                JSBNG__clearTimeout(this._checkTimer);\n                this._checkTimer = this._checkTyping.bind(this).defer(((((o - p)) + 10)));\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = n;\n});\n__d(\"ClearableTypeahead\", [\"JSBNG__Event\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = {\n        resetOnCloseButtonClick: function(i, j) {\n            g.listen(j, \"click\", function() {\n                var k = i.getCore();\n                k.getElement().JSBNG__focus();\n                k.reset();\n            });\n        }\n    };\n    e.exports = h;\n});\n__d(\"TypeaheadShowLoadingIndicator\", [\"CSS\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSS\"), h = b(\"copyProperties\");\n    function i(j) {\n        this._typeahead = j;\n    };\n;\n    h(i.prototype, {\n        _subscription: null,\n        enable: function() {\n            this._subscription = this._typeahead.subscribe(\"loading\", function(j, k) {\n                g.conditionClass(this._typeahead.getElement(), \"typeaheadLoading\", k.loading);\n                g.conditionClass(this._typeahead.getView().getElement(), \"typeaheadViewLoading\", k.loading);\n            }.bind(this));\n        },\n        disable: function() {\n            this._typeahead.unsubscribe(this._subscription);\n            this._subscription = null;\n        }\n    });\n    e.exports = i;\n});\n__d(\"legacy:ShowLoadingIndicatorTypeaheadBehavior\", [\"TypeaheadShowLoadingIndicator\",], function(a, b, c, d) {\n    var e = b(\"TypeaheadShowLoadingIndicator\");\n    if (!a.TypeaheadBehaviors) {\n        a.TypeaheadBehaviors = {\n        };\n    }\n;\n;\n    a.TypeaheadBehaviors.showLoadingIndicator = function(f) {\n        f.enableBehavior(e);\n    };\n}, 3);\n__d(\"CompactTypeaheadRenderer\", [\"Badge\",\"DOM\",\"TypeaheadFacepile\",], function(a, b, c, d, e, f) {\n    var g = b(\"Badge\"), h = b(\"DOM\"), i = b(\"TypeaheadFacepile\");\n    function j(k, l) {\n        var m = [];\n        if (k.xhp) {\n            return h.create(\"li\", {\n                className: \"raw\"\n            }, k.xhp);\n        }\n    ;\n    ;\n        var n = ((k.photos || k.photo));\n        if (n) {\n            if (((n instanceof Array))) {\n                n = i.render(n);\n            }\n             else n = h.create(\"img\", {\n                alt: \"\",\n                src: n\n            });\n        ;\n        ;\n            m.push(n);\n        }\n    ;\n    ;\n        if (k.text) {\n            var o = [k.text,];\n            if (k.verified) {\n                o.push(g(\"xsmall\"));\n            }\n        ;\n        ;\n            m.push(h.create(\"span\", {\n                className: \"text\"\n            }, o));\n        }\n    ;\n    ;\n        var p = k.subtext, q = k.category;\n        if (((p || q))) {\n            var r = [];\n            ((p && r.push(p)));\n            ((((p && q)) && r.push(\" \\u00b7 \")));\n            ((q && r.push(q)));\n            m.push(h.create(\"span\", {\n                className: \"subtext\"\n            }, r));\n        }\n    ;\n    ;\n        var s = h.create(\"li\", {\n            className: ((k.type || \"\"))\n        }, m);\n        if (k.text) {\n            s.setAttribute(\"aria-label\", k.text);\n        }\n    ;\n    ;\n        return s;\n    };\n;\n    j.className = \"compact\";\n    e.exports = j;\n});\n__d(\"URLMatcher\", [], function(a, b, c, d, e, f) {\n    var g = \"!\\\"#%&'()*,-./:;\\u003C\\u003E?@[\\\\]^_`{|}\", h = \"\\u2000-\\u206f\\u00ab\\u00bb\\uff08\\uff09\", i = \"(?:25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])\", j = \"(?:(?:ht|f)tps?)://\", k = ((((((((\"(?:(?:\" + i)) + \"[.]){3}\")) + i)) + \")\")), l = \"\\\\[(?:(?:[A-Za-z0-9]{1,4}::?){1,7}[A-Za-z0-9]{1,4})\\\\]\", m = \"(?:\\\\b)www\\\\d{0,3}[.]\", n = ((((((\"[^\\\\s\" + g)) + h)) + \"]\")), o = ((((((((((((\"(?:(?:(?:[.:\\\\-_%@]|\" + n)) + \")*\")) + n)) + \")|\")) + l)) + \")\")), p = \"(?:[.][a-z]{2,4})\", q = \"(?::\\\\d+){0,1}\", r = \"(?=[/?#])\", s = ((((((((((((((((((((((((((((((((((((((((((((((((((((\"(?:\" + \"(?:\")) + j)) + o)) + q)) + \")|\")) + \"(?:\")) + k)) + q)) + \")|\")) + \"(?:\")) + l)) + q)) + \")|\")) + \"(?:\")) + m)) + o)) + p)) + q)) + \")|\")) + \"(?:\")) + o)) + p)) + q)) + r)) + \")\")) + \")\")), t = \"[/#?]\", u = \"\\\\([^\\\\s()\\u003C\\u003E]+\\\\)\", v = \"[^\\\\s()\\u003C\\u003E?#]+\", w = new RegExp(s, \"im\"), x = ((((((((((((((((((((((\"(?:\" + \"(?:\")) + t)) + \")\")) + \"(?:\")) + \"(?:\")) + u)) + \"|\")) + v)) + \")*\")) + \")*\")) + \")*\")), y = new RegExp(((((((((((((((\"(\" + \"(?:\")) + s)) + \")\")) + \"(?:\")) + x)) + \")\")) + \")\")), \"im\"), z = new RegExp(((((((((((((((((((((((((\"(\" + \"(?:\")) + j)) + o)) + q)) + \")|\")) + \"(?:\")) + m)) + o)) + p)) + q)) + \")\")) + \")\"))), aa = /[\\s'\";]/, ba = new RegExp(t, \"im\"), ca = new RegExp(\"[\\\\s!\\\"#%&'()*,-./:;\\u003C\\u003E?@[\\\\]^_`{|}\\u00ab\\u00bb\\u2000-\\u206f\\uff08\\uff09]\", \"im\"), da = new RegExp(\"[\\\\s()\\u003C\\u003E?#]\", \"im\"), ea = new RegExp(\"\\\\s()\\u003C\\u003E\"), fa = function(ma) {\n        if (((ma && ((ma.indexOf(\"@\") != -1))))) {\n            return (((z.exec(ma)) ? ma : null));\n        }\n         else return ma\n    ;\n    }, ga = function(ma) {\n        return ha(ma, y);\n    }, ha = function(ma, na) {\n        var oa = ((((na.exec(ma) || []))[1] || null));\n        return fa(oa);\n    }, ia = function(ma) {\n        return w.exec(ma);\n    }, ja = function(ma) {\n        return !aa.test(ma.charAt(((ma.length - 1))));\n    }, ka = function(ma) {\n        var na = w.exec(ma);\n        if (!na) {\n            return null;\n        }\n    ;\n    ;\n        var oa = ma.substr(((na.index + na[0].length)));\n        if (((((oa.length === 0)) || !(ba.test(oa[0]))))) {\n            return fa(na[0]);\n        }\n    ;\n    ;\n        var pa = 0, qa = 0, ra = 1, sa = 0, ta = qa;\n        for (var ua = 1; ((ua < oa.length)); ua++) {\n            var va = oa[ua];\n            if (((ta === qa))) {\n                if (((va === \"(\"))) {\n                    sa = ((sa + 1));\n                    ta = ra;\n                }\n                 else if (((ba.test(va) || !(ca.test(va))))) {\n                    pa = ua;\n                }\n                 else if (da.test(va)) {\n                    break;\n                }\n                \n                \n            ;\n            ;\n            }\n             else if (((va === \"(\"))) {\n                sa = ((sa + 1));\n            }\n             else if (((va === \")\"))) {\n                sa = ((sa - 1));\n                if (((sa === 0))) {\n                    ta = qa;\n                    pa = ua;\n                }\n            ;\n            ;\n            }\n             else if (ea.test(va)) {\n                break;\n            }\n            \n            \n            \n        ;\n        ;\n        };\n    ;\n        return fa(((na[0] + oa.substring(0, ((pa + 1))))));\n    }, la = {\n    };\n    la.permissiveMatch = ga;\n    la.matchToPattern = ha;\n    la.matchHost = ia;\n    la.trigger = ja;\n    la.match = ka;\n    e.exports = la;\n});");
// 2865
geval("if (JSBNG__self.CavalryLogger) {\n    CavalryLogger.start_js([\"hfrQl\",]);\n}\n;\n;\n__d(\"FriendBrowserCheckboxController\", [\"AsyncRequest\",\"CSS\",\"DOM\",\"JSBNG__Event\",\"Form\",\"OnVisible\",\"$\",\"bind\",\"copyProperties\",\"ge\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = b(\"CSS\"), i = b(\"DOM\"), j = b(\"JSBNG__Event\"), k = b(\"Form\"), l = b(\"OnVisible\"), m = b(\"$\"), n = b(\"bind\"), o = b(\"copyProperties\"), p = b(\"ge\");\n    function q() {\n    \n    };\n;\n    o(q, {\n        instances: {\n        },\n        getInstance: function(r) {\n            return this.instances[r];\n        }\n    });\n    o(q.prototype, {\n        init: function(r, s, t, u) {\n            q.instances[r] = this;\n            this._id = r;\n            this._simplified = t;\n            this._infiniteScroll = u;\n            this._form = s;\n            this._contentGrid = i.JSBNG__find(s, \".friendBrowserCheckboxContentGrid\");\n            this._loadingIndicator = i.JSBNG__find(s, \".friendBrowsingCheckboxContentLoadingIndicator\");\n            this._checkboxResults = i.JSBNG__find(s, \".friendBrowserCheckboxResults\");\n            this._contentPager = i.JSBNG__find(s, \".friendBrowserCheckboxContentPager\");\n            this.numGetNewRequests = 0;\n            this.queuedRequests = {\n            };\n            j.listen(this._form, \"submit\", this.onFormSubmit.bind(this));\n        },\n        addTypeahead: function(r, s) {\n            r.subscribe(\"select\", this.onHubSelect.bind(this, r, s));\n            if (this._simplified) {\n                r.subscribe(\"unselect\", this.onHubSelect.bind(this, r, s));\n            }\n        ;\n        ;\n        },\n        onFormSubmit: function() {\n            this.getNew(true);\n            return false;\n        },\n        addSelector: function(r) {\n            r.subscribe(\"change\", this.getNew.bind(this, false));\n        },\n        onHubSelect: function(r, s, JSBNG__event, t) {\n            if (this._simplified) {\n                this.getNew(true);\n                return;\n            }\n        ;\n        ;\n            if (!((((JSBNG__event == \"select\")) && t.selected))) {\n                return;\n            }\n        ;\n        ;\n            var u = this.buildNewCheckbox(s, t.selected.text, t.selected.uid), v = i.JSBNG__find(this._form, ((\".checkboxes_\" + s)));\n            i.appendContent(v.firstChild, u);\n            var w = i.scry(r.getElement(), \"input[type=\\\"button\\\"]\");\n            if (((w && w[0]))) {\n                w[0].click();\n            }\n        ;\n        ;\n            this.getNew(true);\n        },\n        buildNewCheckbox: function(r, s, t) {\n            var u = ((((r + \"_ids_\")) + t)), v = ((r + \"_ids[]\")), w = i.create(\"input\", {\n                id: u,\n                type: \"checkbox\",\n                value: t,\n                JSBNG__name: v,\n                checked: true\n            });\n            j.listen(w, \"click\", n(this, \"getNew\", false));\n            var x = i.create(\"td\", null, w);\n            h.addClass(x, \"vTop\");\n            h.addClass(x, \"hLeft\");\n            var y = i.create(\"label\", null, s), z = i.create(\"td\", null, y);\n            h.addClass(z, \"vMid\");\n            h.addClass(z, \"hLeft\");\n            var aa = i.create(\"tr\");\n            aa.appendChild(x);\n            aa.appendChild(z);\n            return aa;\n        },\n        showMore: function() {\n            var r = i.scry(this._contentPager, \".friendBrowserMorePager\")[0];\n            if (!r) {\n                return false;\n            }\n        ;\n        ;\n            if (h.hasClass(r, \"async_saving\")) {\n                return false;\n            }\n        ;\n        ;\n            var s = this.numGetNewRequests, t = k.serialize(this._form);\n            t.show_more = true;\n            var u = new g().setURI(\"/ajax/growth/friend_browser/checkbox.php\").setData(t).setHandler(n(this, function(v) {\n                this.showMoreHandler(v, s);\n            })).setStatusElement(r).send();\n        },\n        showMoreHandler: function(r, s) {\n            if (((s == this.numGetNewRequests))) {\n                var t = r.payload;\n                i.appendContent(this._contentGrid, t.results);\n                this.updatePagerAndExtraData(t.pager, t.extra_data);\n            }\n        ;\n        ;\n        },\n        getNew: function(r) {\n            this.numGetNewRequests++;\n            var s = this.numGetNewRequests;\n            h.addClass(this._checkboxResults, \"friendBrowserCheckboxContentOnload\");\n            if (p(\"friendBrowserCI\")) {\n                h.addClass(m(\"friendBrowserCI\"), \"friendBrowserCheckboxContentOnload\");\n            }\n        ;\n        ;\n            h.show(this._loadingIndicator);\n            var t = k.serialize(this._form);\n            t.used_typeahead = r;\n            new g().setURI(\"/ajax/growth/friend_browser/checkbox.php\").setData(t).setHandler(n(this, function(u) {\n                this.getNewHandler(u, s);\n            })).send();\n        },\n        getNewHandler: function(r, s) {\n            if (((s == this.numGetNewRequests))) {\n                var t = r.payload;\n                i.setContent(this._contentGrid, t.results);\n                h.removeClass(this._checkboxResults, \"friendBrowserCheckboxContentOnload\");\n                if (p(\"friendBrowserCI\")) {\n                    h.hide(m(\"friendBrowserCI\"));\n                }\n            ;\n            ;\n                h.hide(this._loadingIndicator);\n                this.updatePagerAndExtraData(t.pager, t.extra_data);\n            }\n        ;\n        ;\n        },\n        updatePagerAndExtraData: function(r, s) {\n            i.setContent(this._contentPager, r);\n            if (this._infiniteScroll) {\n                this.setupOnVisible();\n            }\n        ;\n        ;\n            i.replace(this._form.elements.extra_data, s);\n        },\n        setupOnVisible: function() {\n            var r = i.scry(this._contentPager, \".friendBrowserMorePager\")[0];\n            if (((r && ((this._id != \"jewel\"))))) {\n                ((this._onVisible && this._onVisible.remove()));\n                this._onVisible = new l(r, n(this, \"showMore\"), false, 1000);\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = q;\n});\n__d(\"legacy:friend-browser-checkbox-js\", [\"FriendBrowserCheckboxController\",], function(a, b, c, d) {\n    a.FriendBrowserCheckboxController = b(\"FriendBrowserCheckboxController\");\n}, 3);\n__d(\"FacebarResultStoreUtils\", [], function(a, b, c, d, e, f) {\n    var g = {\n        processEntityResult: function(h, i, j, k) {\n            var l = {\n                semantic: i.toString(),\n                structure: [{\n                    type: ((\"ent:\" + h)),\n                    text: j,\n                    uid: i\n                },],\n                type: ((((\"{\" + h)) + \"}\")),\n                cost: k,\n                cache_id_length: 0,\n                bolding: []\n            };\n            l.tuid = JSON.stringify({\n                semantic: l.semantic,\n                structure: l.structure\n            });\n            return l;\n        }\n    };\n    e.exports = g;\n});\n__d(\"HashtagParser\", [\"URLMatcher\",], function(a, b, c, d, e, f) {\n    var g = b(\"URLMatcher\"), h = 100, i = 30, j = /@\\[([0-9]+):([0-9]+):((?:[^\\\\\\]]*(?:\\\\.)*)*)\\]/g;\n    function k() {\n        var da = ((((((((((((((((((((((((((((((((\"\\u00c0-\\u00d6\" + \"\\u00d8-\\u00f6\")) + \"\\u00f8-\\u00ff\")) + \"\\u0100-\\u024f\")) + \"\\u0253-\\u0254\")) + \"\\u0256-\\u0257\")) + \"\\u0259\")) + \"\\u025b\")) + \"\\u0263\")) + \"\\u0268\")) + \"\\u026f\")) + \"\\u0272\")) + \"\\u0289\")) + \"\\u028b\")) + \"\\u02bb\")) + \"\\u0300-\\u036f\")) + \"\\u1e00-\\u1eff\")), ea = ((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((\"\\u0400-\\u04ff\" + \"\\u0500-\\u0527\")) + \"\\u2de0-\\u2dff\")) + \"\\ua640-\\ua69f\")) + \"\\u0591-\\u05bf\")) + \"\\u05c1-\\u05c2\")) + \"\\u05c4-\\u05c5\")) + \"\\u05c7\")) + \"\\u05d0-\\u05ea\")) + \"\\u05f0-\\u05f4\")) + \"\\ufb12-\\ufb28\")) + \"\\ufb2a-\\ufb36\")) + \"\\ufb38-\\ufb3c\")) + \"\\ufb3e\")) + \"\\ufb40-\\ufb41\")) + \"\\ufb43-\\ufb44\")) + \"\\ufb46-\\ufb4f\")) + \"\\u0610-\\u061a\")) + \"\\u0620-\\u065f\")) + \"\\u066e-\\u06d3\")) + \"\\u06d5-\\u06dc\")) + \"\\u06de-\\u06e8\")) + \"\\u06ea-\\u06ef\")) + \"\\u06fa-\\u06fc\")) + \"\\u06ff\")) + \"\\u0750-\\u077f\")) + \"\\u08a0\")) + \"\\u08a2-\\u08ac\")) + \"\\u08e4-\\u08fe\")) + \"\\ufb50-\\ufbb1\")) + \"\\ufbd3-\\ufd3d\")) + \"\\ufd50-\\ufd8f\")) + \"\\ufd92-\\ufdc7\")) + \"\\ufdf0-\\ufdfb\")) + \"\\ufe70-\\ufe74\")) + \"\\ufe76-\\ufefc\")) + \"\\u200c-\\u200c\")) + \"\\u0e01-\\u0e3a\")) + \"\\u0e40-\\u0e4e\")) + \"\\u1100-\\u11ff\")) + \"\\u3130-\\u3185\")) + \"\\ua960-\\ua97f\")) + \"\\uac00-\\ud7af\")) + \"\\ud7b0-\\ud7ff\")) + \"\\uffa1-\\uffdc\")), fa = String.fromCharCode, ga = ((((((((((((((((((((((((((((((((\"\\u30a1-\\u30fa\\u30fc-\\u30fe\" + \"\\uff66-\\uff9f\")) + \"\\uff10-\\uff19\\uff21-\\uff3a\")) + \"\\uff41-\\uff5a\")) + \"\\u3041-\\u3096\\u3099-\\u309e\")) + \"\\u3400-\\u4dbf\")) + \"\\u4e00-\\u9fff\")) + fa(173824))) + \"-\")) + fa(177983))) + fa(177984))) + \"-\")) + fa(178207))) + fa(194560))) + \"-\")) + fa(195103))) + \"\\u3003\\u3005\\u303b\")), ha = ((((da + ea)) + ga)), ia = ((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((\"A-Za-z\\u00aa\\u00b5\\u00ba\\u00c0-\\u00d6\\u00d8-\\u00f6\" + \"\\u00f8-\\u0241\\u0250-\\u02c1\\u02c6-\\u02d1\\u02e0-\\u02e4\\u02ee\\u037a\\u0386\")) + \"\\u0388-\\u038a\\u038c\\u038e-\\u03a1\\u03a3-\\u03ce\\u03d0-\\u03f5\\u03f7-\\u0481\")) + \"\\u048a-\\u04ce\\u04d0-\\u04f9\\u0500-\\u050f\\u0531-\\u0556\\u0559\\u0561-\\u0587\")) + \"\\u05d0-\\u05ea\\u05f0-\\u05f2\\u0621-\\u063a\\u0640-\\u064a\\u066e-\\u066f\")) + \"\\u0671-\\u06d3\\u06d5\\u06e5-\\u06e6\\u06ee-\\u06ef\\u06fa-\\u06fc\\u06ff\\u0710\")) + \"\\u0712-\\u072f\\u074d-\\u076d\\u0780-\\u07a5\\u07b1\\u0904-\\u0939\\u093d\\u0950\")) + \"\\u0958-\\u0961\\u097d\\u0985-\\u098c\\u098f-\\u0990\\u0993-\\u09a8\\u09aa-\\u09b0\")) + \"\\u09b2\\u09b6-\\u09b9\\u09bd\\u09ce\\u09dc-\\u09dd\\u09df-\\u09e1\\u09f0-\\u09f1\")) + \"\\u0a05-\\u0a0a\\u0a0f-\\u0a10\\u0a13-\\u0a28\\u0a2a-\\u0a30\\u0a32-\\u0a33\")) + \"\\u0a35-\\u0a36\\u0a38-\\u0a39\\u0a59-\\u0a5c\\u0a5e\\u0a72-\\u0a74\\u0a85-\\u0a8d\")) + \"\\u0a8f-\\u0a91\\u0a93-\\u0aa8\\u0aaa-\\u0ab0\\u0ab2-\\u0ab3\\u0ab5-\\u0ab9\\u0abd\")) + \"\\u0ad0\\u0ae0-\\u0ae1\\u0b05-\\u0b0c\\u0b0f-\\u0b10\\u0b13-\\u0b28\\u0b2a-\\u0b30\")) + \"\\u0b32-\\u0b33\\u0b35-\\u0b39\\u0b3d\\u0b5c-\\u0b5d\\u0b5f-\\u0b61\\u0b71\\u0b83\")) + \"\\u0b85-\\u0b8a\\u0b8e-\\u0b90\\u0b92-\\u0b95\\u0b99-\\u0b9a\\u0b9c\\u0b9e-\\u0b9f\")) + \"\\u0ba3-\\u0ba4\\u0ba8-\\u0baa\\u0bae-\\u0bb9\\u0c05-\\u0c0c\\u0c0e-\\u0c10\")) + \"\\u0c12-\\u0c28\\u0c2a-\\u0c33\\u0c35-\\u0c39\\u0c60-\\u0c61\\u0c85-\\u0c8c\")) + \"\\u0c8e-\\u0c90\\u0c92-\\u0ca8\\u0caa-\\u0cb3\\u0cb5-\\u0cb9\\u0cbd\\u0cde\")) + \"\\u0ce0-\\u0ce1\\u0d05-\\u0d0c\\u0d0e-\\u0d10\\u0d12-\\u0d28\\u0d2a-\\u0d39\")) + \"\\u0d60-\\u0d61\\u0d85-\\u0d96\\u0d9a-\\u0db1\\u0db3-\\u0dbb\\u0dbd\\u0dc0-\\u0dc6\")) + \"\\u0e01-\\u0e30\\u0e32-\\u0e33\\u0e40-\\u0e46\\u0e81-\\u0e82\\u0e84\\u0e87-\\u0e88\")) + \"\\u0e8a\\u0e8d\\u0e94-\\u0e97\\u0e99-\\u0e9f\\u0ea1-\\u0ea3\\u0ea5\\u0ea7\")) + \"\\u0eaa-\\u0eab\\u0ead-\\u0eb0\\u0eb2-\\u0eb3\\u0ebd\\u0ec0-\\u0ec4\\u0ec6\")) + \"\\u0edc-\\u0edd\\u0f00\\u0f40-\\u0f47\\u0f49-\\u0f6a\\u0f88-\\u0f8b\\u1000-\\u1021\")) + \"\\u1023-\\u1027\\u1029-\\u102a\\u1050-\\u1055\\u10a0-\\u10c5\\u10d0-\\u10fa\\u10fc\")) + \"\\u1100-\\u1159\\u115f-\\u11a2\\u11a8-\\u11f9\\u1200-\\u1248\\u124a-\\u124d\")) + \"\\u1250-\\u1256\\u1258\\u125a-\\u125d\\u1260-\\u1288\\u128a-\\u128d\\u1290-\\u12b0\")) + \"\\u12b2-\\u12b5\\u12b8-\\u12be\\u12c0\\u12c2-\\u12c5\\u12c8-\\u12d6\\u12d8-\\u1310\")) + \"\\u1312-\\u1315\\u1318-\\u135a\\u1380-\\u138f\\u13a0-\\u13f4\\u1401-\\u166c\")) + \"\\u166f-\\u1676\\u1681-\\u169a\\u16a0-\\u16ea\\u1700-\\u170c\\u170e-\\u1711\")) + \"\\u1720-\\u1731\\u1740-\\u1751\\u1760-\\u176c\\u176e-\\u1770\\u1780-\\u17b3\\u17d7\")) + \"\\u17dc\\u1820-\\u1877\\u1880-\\u18a8\\u1900-\\u191c\\u1950-\\u196d\\u1970-\\u1974\")) + \"\\u1980-\\u19a9\\u19c1-\\u19c7\\u1a00-\\u1a16\\u1d00-\\u1dbf\\u1e00-\\u1e9b\")) + \"\\u1ea0-\\u1ef9\\u1f00-\\u1f15\\u1f18-\\u1f1d\\u1f20-\\u1f45\\u1f48-\\u1f4d\")) + \"\\u1f50-\\u1f57\\u1f59\\u1f5b\\u1f5d\\u1f5f-\\u1f7d\\u1f80-\\u1fb4\\u1fb6-\\u1fbc\")) + \"\\u1fbe\\u1fc2-\\u1fc4\\u1fc6-\\u1fcc\\u1fd0-\\u1fd3\\u1fd6-\\u1fdb\\u1fe0-\\u1fec\")) + \"\\u1ff2-\\u1ff4\\u1ff6-\\u1ffc\\u2071\\u207f\\u2090-\\u2094\\u2102\\u2107\")) + \"\\u210a-\\u2113\\u2115\\u2119-\\u211d\\u2124\\u2126\\u2128\\u212a-\\u212d\")) + \"\\u212f-\\u2131\\u2133-\\u2139\\u213c-\\u213f\\u2145-\\u2149\\u2c00-\\u2c2e\")) + \"\\u2c30-\\u2c5e\\u2c80-\\u2ce4\\u2d00-\\u2d25\\u2d30-\\u2d65\\u2d6f\\u2d80-\\u2d96\")) + \"\\u2da0-\\u2da6\\u2da8-\\u2dae\\u2db0-\\u2db6\\u2db8-\\u2dbe\\u2dc0-\\u2dc6\")) + \"\\u2dc8-\\u2dce\\u2dd0-\\u2dd6\\u2dd8-\\u2dde\\u3005-\\u3006\\u3031-\\u3035\")) + \"\\u303b-\\u303c\\u3041-\\u3096\\u309d-\\u309f\\u30a1-\\u30fa\\u30fc-\\u30ff\")) + \"\\u3105-\\u312c\\u3131-\\u318e\\u31a0-\\u31b7\\u31f0-\\u31ff\\u3400-\\u4db5\")) + \"\\u4e00-\\u9fbb\\ua000-\\ua48c\\ua800-\\ua801\\ua803-\\ua805\\ua807-\\ua80a\")) + \"\\ua80c-\\ua822\\uac00-\\ud7a3\\uf900-\\ufa2d\\ufa30-\\ufa6a\\ufa70-\\ufad9\")) + \"\\ufb00-\\ufb06\\ufb13-\\ufb17\\ufb1d\\ufb1f-\\ufb28\\ufb2a-\\ufb36\\ufb38-\\ufb3c\")) + \"\\ufb3e\\ufb40-\\ufb41\\ufb43-\\ufb44\\ufb46-\\ufbb1\\ufbd3-\\ufd3d\\ufd50-\\ufd8f\")) + \"\\ufd92-\\ufdc7\\ufdf0-\\ufdfb\\ufe70-\\ufe74\\ufe76-\\ufefc\\uff21-\\uff3a\")) + \"\\uff41-\\uff5a\\uff66-\\uffbe\\uffc2-\\uffc7\\uffca-\\uffcf\\uffd2-\\uffd7\")) + \"\\uffda-\\uffdc\")), ja = ((((((((((((((((((((((((((((((((((((((((\"\\u0300-\\u036f\\u0483-\\u0486\\u0591-\\u05b9\\u05bb-\\u05bd\\u05bf\" + \"\\u05c1-\\u05c2\\u05c4-\\u05c5\\u05c7\\u0610-\\u0615\\u064b-\\u065e\\u0670\")) + \"\\u06d6-\\u06dc\\u06df-\\u06e4\\u06e7-\\u06e8\\u06ea-\\u06ed\\u0711\\u0730-\\u074a\")) + \"\\u07a6-\\u07b0\\u0901-\\u0903\\u093c\\u093e-\\u094d\\u0951-\\u0954\\u0962-\\u0963\")) + \"\\u0981-\\u0983\\u09bc\\u09be-\\u09c4\\u09c7-\\u09c8\\u09cb-\\u09cd\\u09d7\")) + \"\\u09e2-\\u09e3\\u0a01-\\u0a03\\u0a3c\\u0a3e-\\u0a42\\u0a47-\\u0a48\\u0a4b-\\u0a4d\")) + \"\\u0a70-\\u0a71\\u0a81-\\u0a83\\u0abc\\u0abe-\\u0ac5\\u0ac7-\\u0ac9\\u0acb-\\u0acd\")) + \"\\u0ae2-\\u0ae3\\u0b01-\\u0b03\\u0b3c\\u0b3e-\\u0b43\\u0b47-\\u0b48\\u0b4b-\\u0b4d\")) + \"\\u0b56-\\u0b57\\u0b82\\u0bbe-\\u0bc2\\u0bc6-\\u0bc8\\u0bca-\\u0bcd\\u0bd7\")) + \"\\u0c01-\\u0c03\\u0c3e-\\u0c44\\u0c46-\\u0c48\\u0c4a-\\u0c4d\\u0c55-\\u0c56\")) + \"\\u0c82-\\u0c83\\u0cbc\\u0cbe-\\u0cc4\\u0cc6-\\u0cc8\\u0cca-\\u0ccd\\u0cd5-\\u0cd6\")) + \"\\u0d02-\\u0d03\\u0d3e-\\u0d43\\u0d46-\\u0d48\\u0d4a-\\u0d4d\\u0d57\\u0d82-\\u0d83\")) + \"\\u0dca\\u0dcf-\\u0dd4\\u0dd6\\u0dd8-\\u0ddf\\u0df2-\\u0df3\\u0e31\\u0e34-\\u0e3a\")) + \"\\u0e47-\\u0e4e\\u0eb1\\u0eb4-\\u0eb9\\u0ebb-\\u0ebc\\u0ec8-\\u0ecd\\u0f18-\\u0f19\")) + \"\\u0f35\\u0f37\\u0f39\\u0f3e-\\u0f3f\\u0f71-\\u0f84\\u0f86-\\u0f87\\u0f90-\\u0f97\")) + \"\\u0f99-\\u0fbc\\u0fc6\\u102c-\\u1032\\u1036-\\u1039\\u1056-\\u1059\\u135f\")) + \"\\u1712-\\u1714\\u1732-\\u1734\\u1752-\\u1753\\u1772-\\u1773\\u17b6-\\u17d3\\u17dd\")) + \"\\u180b-\\u180d\\u18a9\\u1920-\\u192b\\u1930-\\u193b\\u19b0-\\u19c0\\u19c8-\\u19c9\")) + \"\\u1a17-\\u1a1b\\u1dc0-\\u1dc3\\u20d0-\\u20dc\\u20e1\\u20e5-\\u20eb\\u302a-\\u302f\")) + \"\\u3099-\\u309a\\ua802\\ua806\\ua80b\\ua823-\\ua827\\ufb1e\\ufe00-\\ufe0f\")) + \"\\ufe20-\\ufe23\")), ka = ((((((((\"0-9\\u0660-\\u0669\\u06f0-\\u06f9\\u0966-\\u096f\\u09e6-\\u09ef\" + \"\\u0a66-\\u0a6f\\u0ae6-\\u0aef\\u0b66-\\u0b6f\\u0be6-\\u0bef\\u0c66-\\u0c6f\")) + \"\\u0ce6-\\u0cef\\u0d66-\\u0d6f\\u0e50-\\u0e59\\u0ed0-\\u0ed9\\u0f20-\\u0f29\")) + \"\\u1040-\\u1049\\u17e0-\\u17e9\\u1810-\\u1819\\u1946-\\u194f\\u19d0-\\u19d9\")) + \"\\uff10-\\uff19\")), la = ((((ia + ja)) + ha)), ma = ((ka + \"_\")), na = ((la + ma)), oa = ((((\"[\" + la)) + \"]\")), pa = ((((\"[\" + na)) + \"]\")), qa = ((((\"^|$|[^&\" + na)) + \"]\")), ra = \"[#\\\\uFF03]\", sa = ((((((((((((((((((\"(\" + qa)) + \")(\")) + ra)) + \")(\")) + pa)) + \"*\")) + oa)) + pa)) + \"*)\"));\n        return new RegExp(sa, \"ig\");\n    };\n;\n    function l(da) {\n        var ea = y(da), fa = 0, ga = 0;\n        return n(da).map(function(ha) {\n            while (((fa < ea.length))) {\n                var ia = ea[fa], ja = ((ia.offset - ga));\n                if (((ja < ha.offset))) {\n                    ga += ((ia.token.length - ia.JSBNG__name.length));\n                    fa++;\n                }\n                 else break;\n            ;\n            ;\n            };\n        ;\n            return {\n                marker: ha.marker,\n                tag: ha.hashtag,\n                rawOffset: ((ha.offset + ga)),\n                offset: ha.offset\n            };\n        });\n    };\n;\n    function m(da) {\n        return o(da, t(da));\n    };\n;\n    function n(da) {\n        var ea = aa(da);\n        return o(ea, p(da, ea));\n    };\n;\n    function o(da, ea) {\n        return r(da).slice(0, i).filter(function(fa) {\n            var ga = v(fa.offset, fa.hashtag.length, ea);\n            return ((!ga && ((fa.hashtag.length <= h))));\n        });\n    };\n;\n    function p(da, ea) {\n        return u(s(da), t(ea));\n    };\n;\n    var q = k();\n    function r(da) {\n        var ea = [];\n        da.replace(q, function(fa, ga, ha, ia, ja) {\n            ea.push({\n                marker: ha,\n                hashtag: ia,\n                offset: ((ja + ga.length))\n            });\n        });\n        return ea;\n    };\n;\n    function s(da) {\n        return ba(da).map(function(ea) {\n            return [ea.offset,ea.JSBNG__name.length,];\n        });\n    };\n;\n    function t(da) {\n        var ea = [], fa, ga = 0;\n        while ((fa = g.permissiveMatch(da))) {\n            var ha = da.indexOf(fa);\n            ea.push([((ga + ha)),fa.length,]);\n            da = da.substring(((ha + fa.length)));\n            ga += ((ha + fa.length));\n        };\n    ;\n        return ea;\n    };\n;\n    function u(da, ea) {\n        var fa = [], ga = 0, ha = 0, ia = 0;\n        while (((((ga < da.length)) && ((ha < ea.length))))) {\n            if (((da[ga][0] > ea[ha][0]))) {\n                fa[ia++] = ea[ha++];\n            }\n             else fa[ia++] = da[ga++];\n        ;\n        ;\n        };\n    ;\n        return fa.concat(da.slice(ga), ea.slice(ha));\n    };\n;\n    function v(da, ea, fa) {\n        if (!fa) {\n            return false;\n        }\n    ;\n    ;\n        var ga = x(fa, da);\n        return ((w(da, ea, fa, ga) || w(da, ea, fa, ((ga + 1)))));\n    };\n;\n    function w(da, ea, fa, ga) {\n        if (!fa[ga]) {\n            return false;\n        }\n    ;\n    ;\n        var ha = fa[ga][0], ia = fa[ga][1];\n        return !((((((((da + ea)) - 1)) < ha)) || ((da > ((((ha + ia)) - 1))))));\n    };\n;\n    function x(da, ea) {\n        var fa = 0, ga = ((da.length - 1));\n        while (((fa <= ga))) {\n            var ha = Math.floor(((((fa + ga)) / 2))), ia = da[ha][0];\n            if (((ia == ea))) {\n                return ha;\n            }\n             else if (((ia < ea))) {\n                fa = ((ha + 1));\n            }\n             else ga = ((ha - 1));\n            \n        ;\n        ;\n        };\n    ;\n        return ga;\n    };\n;\n    function y(da) {\n        var ea = [];\n        da.replace(j, function(fa, ga, ha, ia, ja) {\n            ea.push({\n                token: fa,\n                id: ga,\n                type: ha,\n                JSBNG__name: ia,\n                offset: ja\n            });\n        });\n        return ea;\n    };\n;\n    function z(da) {\n        return ((da ? da.replace(/\\\\([^\\\\])/g, \"$1\").replace(/\\\\\\\\/g, \"\\\\\") : null));\n    };\n;\n    function aa(da) {\n        return da.replace(j, function(ea, fa, ga, ha, ia) {\n            return z(ha);\n        });\n    };\n;\n    function ba(da) {\n        var ea = 0, fa = 0;\n        return y(da).map(function(ga) {\n            var ha = da.indexOf(ga.token, fa);\n            fa = ((ha + 1));\n            ha -= ea;\n            var ia = z(ga.JSBNG__name);\n            ea += ((ga.token.length - ia.length));\n            if (((ha >= 0))) {\n                return {\n                    id: ga.id,\n                    JSBNG__name: ia,\n                    type: ga.type,\n                    offset: ha\n                };\n            }\n        ;\n        ;\n        });\n    };\n;\n    var ca = {\n    };\n    ca.parse = l;\n    ca.parseWithoutMentions = m;\n    e.exports = ca;\n});\n__d(\"HashtagSearchResultUtils\", [\"FacebarResultStoreUtils\",\"HashtagParser\",\"HashtagSearchResultConfig\",\"URI\",], function(a, b, c, d, e, f) {\n    var g = b(\"FacebarResultStoreUtils\"), h = b(\"HashtagParser\"), i = b(\"HashtagSearchResultConfig\"), j = b(\"URI\"), k = {\n        getHashtagFromQuery: function(l) {\n            var m = h.parse(l);\n            if (((((m && ((m.length === 1)))) && ((m[0].offset === 0))))) {\n                return m[0].tag;\n            }\n        ;\n        ;\n            return false;\n        },\n        makeTypeaheadResult: function(l) {\n            return {\n                category: \"Hashtag\",\n                path: j(((\"/hashtag/\" + l))).toString(),\n                photo: i.image_url,\n                rankType: null,\n                replace_results: ((i.boost_result ? true : false)),\n                scaled_score: 1,\n                score: 0,\n                text: ((\"#\" + l)),\n                type: \"hashtag_exact\",\n                uid: ((\"hashtag:\" + l))\n            };\n        },\n        makeFacebarEntry: function(l) {\n            return {\n                category: \"Hashtag\",\n                path: j(((\"/hashtag/\" + l))).toString(),\n                photo: i.image_url,\n                replace_results: ((i.boost_result ? true : false)),\n                text: ((\"#\" + l)),\n                type: \"hashtag_exact\",\n                uid: ((\"hashtag:\" + l))\n            };\n        },\n        makeFacebarResult: function(l) {\n            var m = g.processEntityResult(\"hashtag_exact\", ((\"hashtag:\" + l)), ((\"#\" + l)), i.hashtag_cost);\n            m.parse = {\n                display: [{\n                    type: \"ent:hashtag_exact\",\n                    uid: ((\"hashtag:\" + l))\n                },],\n                remTokens: [],\n                suffix: \"\",\n                unmatch: []\n            };\n            return m;\n        }\n    };\n    e.exports = k;\n});\n__d(\"ContextualHelpSearchController\", [\"JSBNG__Event\",\"AsyncRequest\",\"DOM\",\"CSS\",\"Focus\",\"Input\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"AsyncRequest\"), i = b(\"DOM\"), j = b(\"CSS\"), k = b(\"Focus\"), l = b(\"Input\"), m = b(\"copyProperties\"), n = 400;\n    function o() {\n        this._token = null;\n        this._timerID = 0;\n        this._lastQuery = null;\n        this.typing_listener = null;\n        this.clear_listener = null;\n        this.async_request = null;\n    };\n;\n    m(o.prototype, {\n        init: function(p, q, r, s, t) {\n            this.loader = p;\n            this.search_box = q;\n            this.topics_area = r;\n            this.results_area = s;\n            this.clear_button = t;\n            this.typing_listener = g.listen(this.search_box, \"keyup\", this.setTimer.bind(this));\n            this.clear_listener = g.listen(this.clear_button, \"click\", this.clearResults.bind(this));\n            k.set(this.search_box);\n        },\n        source: \"contextual_help\",\n        clearResults: function() {\n            this.show(this.topics_area);\n            this._lastQuery = \"\";\n            l.reset(this.search_box);\n            k.set(this.search_box);\n            if (((this.async_request !== null))) {\n                this.async_request.abort();\n                this.async_request = null;\n            }\n        ;\n        ;\n            j.addClass(this.clear_button, \"hidden_elem\");\n        },\n        update: function() {\n            var p = l.getValue(this.search_box);\n            if (((p === this._lastQuery))) {\n                return;\n            }\n        ;\n        ;\n            this._lastQuery = p;\n            if (((p === \"\"))) {\n                this.clearResults();\n                return;\n            }\n        ;\n        ;\n            this.show(this.loader);\n            var q = {\n                query: p,\n                width: ((this._width || n)),\n                source: this.source\n            };\n            this.async_request = new h(\"/help/ajax/search/\").setData(q).setHandler(function(r) {\n                this._update(r);\n            }.bind(this));\n            this.async_request.send();\n        },\n        _update: function(p) {\n            this.async_request = null;\n            var q = p.getPayload().results;\n            i.setContent(this.results_area, q);\n            this.show(this.results_area);\n            if (((l.getValue(this.search_box) === \"\"))) {\n                this.clearResults();\n            }\n             else j.removeClass(this.clear_button, \"hidden_elem\");\n        ;\n        ;\n        },\n        setTimer: function() {\n            if (((this._timerID !== 0))) {\n                JSBNG__clearTimeout(this._timerID);\n            }\n        ;\n        ;\n            this._timerID = JSBNG__setTimeout(this.update.bind(this), 300);\n            if (((this.async_request != null))) {\n                this.async_request.abort();\n                this.async_request = null;\n            }\n        ;\n        ;\n        },\n        show: function(p) {\n            var q = [this.loader,this.topics_area,this.results_area,];\n            for (var r = 0; ((r < q.length)); r++) {\n                j.addClass(q[r], \"hidden_elem\");\n            ;\n            };\n        ;\n            j.removeClass(p, \"hidden_elem\");\n        }\n    });\n    e.exports = o;\n});\n__d(\"RequestsJewel\", [\"Arbiter\",\"AsyncRequest\",\"AsyncSignal\",\"ChannelConstants\",\"CSS\",\"DOM\",\"JSBNG__Event\",\"FriendBrowserCheckboxController\",\"LinkController\",\"Parent\",\"ScrollableArea\",\"Vector\",\"copyProperties\",\"ge\",\"shield\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"AsyncRequest\"), i = b(\"AsyncSignal\"), j = b(\"ChannelConstants\"), k = b(\"CSS\"), l = b(\"DOM\"), m = b(\"JSBNG__Event\"), n = b(\"FriendBrowserCheckboxController\"), o = b(\"LinkController\"), p = b(\"Parent\"), q = b(\"ScrollableArea\"), r = b(\"Vector\"), s = b(\"copyProperties\"), t = b(\"ge\"), u = b(\"shield\"), v = b(\"tx\");\n    function w() {\n    \n    };\n;\n    s(w, {\n        instance: null,\n        getInstance: function() {\n            return this.instance;\n        }\n    });\n    s(w.prototype, {\n        init: function(x, y, z) {\n            w.instance = this;\n            this.countNew = 0;\n            this.jewel = x;\n            this.jewelFlyoutCase = x.getRoot();\n            this.jewelFlyout = t(\"fbRequestsFlyout\");\n            this.newCountSpan = t(\"newRequestCount\");\n            this.folder = y;\n            this.doNewMarkRead = z;\n            this.openTimestamp = 0;\n            this._requestList = {\n            };\n            this._requestCount = 0;\n            this.egoPredictedCount = 0;\n            this.pendingCount = 0;\n            this.shouldLogEgoClick = false;\n            this.shouldClearPredictionAssocOnClick = false;\n            var aa = t(\"requestsMarkReadButton\");\n            if (aa) {\n                m.listen(aa, \"click\", u(this._markRead, this));\n            }\n        ;\n        ;\n            this.jewel.subscribe(\"marked-seen\", u(this._markSeenCallback, this));\n            this.jewel.subscribe(\"JSBNG__closed\", u(this._clearNewItems, this));\n            this.jewel.subscribe(\"updated\", this._updateCount.bind(this));\n            this.jewel.subscribe(\"opened\", this._openHandler.bind(this));\n            o.registerHandler(this._handleLink.bind(this));\n            g.subscribe(j.getArbiterType(\"jewel_requests_add\"), this._addRequest.bind(this));\n            g.subscribe(j.getArbiterType(\"jewel_requests_remove_old\"), this._removeOldRequest.bind(this));\n            g.subscribe(j.getArbiterType(\"friend_requests_seen\"), this._markSeenFromMessage.bind(this));\n            g.subscribe(\"jewel/ego_predicted_count\", function(ba, ca) {\n                this.egoPredictedCount = ca.ego_predicted_count;\n                this.pendingCount = ca.pending_count;\n                this.egoUnseenTimestamp = ca.unseen_timestamp;\n                this.shouldLogEgoClick = ca.should_log_ego_click;\n                this.actionContext = ca.action_context;\n            }.bind(this));\n            m.listen(this.jewelFlyout, \"submit\", function(ba) {\n                var ca = p.byClass(ba.getTarget(), \"objectListItem\");\n                if (ca) {\n                    k.removeClass(ca, \"jewelItemNew\");\n                    k.addClass(ca, \"jewelItemResponded\");\n                    this.pageInCollapsedRequests();\n                }\n            ;\n            ;\n            }.bind(this));\n            this.setupScroll();\n            return this;\n        },\n        setupScroll: function() {\n            var x = l.scry(this.jewelFlyout, \".uiScrollableAreaWrap\")[0];\n            if (x) {\n                this._scrollableWrap = x;\n                this._lastLinkPosition = 0;\n                this._scrollListener = m.listen(x, \"JSBNG__scroll\", this._handleScroll.bind(this), m.Priority._BUBBLE);\n            }\n        ;\n        ;\n        },\n        fromDom: function() {\n            l.scry(this.jewelFlyout, \".jewelItemList li.objectListItem\").forEach(function(x) {\n                var y = x.getAttribute(\"id\");\n                if (y) {\n                    var z = this._parseIDToInts(y);\n                    if (z.requester) {\n                        this._requestList[z.requester] = y;\n                    }\n                ;\n                ;\n                    ++this._requestCount;\n                }\n            ;\n            ;\n            }.bind(this));\n            this._conditionShowEmptyMessage();\n        },\n        _parseID: function(x) {\n            var y = x.match(/^(\\d+)_(\\d+)/);\n            return (((y) ? {\n                requester: y[1],\n                type: y[2]\n            } : undefined));\n        },\n        _parseIDToInts: function(x) {\n            var y = ((x ? this._parseID(x) : undefined)), z;\n            if (((y && y.requester))) {\n                z = parseInt(y.requester, 10);\n                if (isNaN(z)) {\n                    z = undefined;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            var aa;\n            if (((y && y.type))) {\n                aa = parseInt(y.type, 10);\n                if (isNaN(aa)) {\n                    aa = undefined;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            return {\n                requester: z,\n                type: aa\n            };\n        },\n        _handleLink: function(x, JSBNG__event) {\n            var y = p.byClass(x, \"jewelItemNew\");\n            if (((((y && p.byClass(y, \"fbRequestList\"))) && p.byClass(y, \"beeperEnabled\")))) {\n                var z = this._parseID(y.id);\n                ((z && this._markSeenCallback(z.requester, z.type)));\n                g.inform(\"jewel/count-updated\", {\n                    jewel: \"requests\",\n                    count: --this.countNew\n                });\n                k.removeClass(y, \"jewelItemNew\");\n            }\n        ;\n        ;\n            return true;\n        },\n        _handleScroll: function() {\n            var x = l.scry(this._scrollableWrap, \".uiMorePager\");\n            if (((!x || ((t(\"fbRequestsJewelManualPager\") && ((x.length < 2))))))) {\n                return;\n            }\n        ;\n        ;\n            var y = x.pop();\n            if (y) {\n                var z = r.getElementPosition(y, \"viewport\").y;\n                if (((z > 0))) {\n                    k.addClass(p.byClass(this._scrollableWrap, \"uiScrollableArea\"), \"contentAfter\");\n                }\n            ;\n            ;\n                var aa = l.JSBNG__find(y, \"a\");\n                if (!aa) {\n                    return;\n                }\n            ;\n            ;\n                var ba = r.getElementPosition(aa, \"viewport\").y;\n                if (((ba == this._lastLinkPosition))) {\n                    return;\n                }\n            ;\n            ;\n                var ca = ((r.getElementPosition(this._scrollableWrap, \"viewport\").y + r.getElementDimensions(this._scrollableWrap).y));\n                if (((((((ba - 300)) < ca)) && ((ba > 0))))) {\n                    this._lastLinkPosition = ba;\n                    var da = aa.getAttribute(\"ajaxify\");\n                    if (da) {\n                        new h(da).setRelativeTo(aa).setStatusElement(p.byClass(aa, \"stat_elem\")).send();\n                    }\n                     else n.getInstance(\"jewel\").showMore();\n                ;\n                ;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n        },\n        _addRequest: function(x, y) {\n            if (!y) {\n                return;\n            }\n        ;\n        ;\n            var z = y.obj.from, aa = y.obj.suggester, ba = this._parseIDToInts(this._requestList[z]).type, ca = ((((ba === 19)) && !aa));\n            if (((!ca && ((ba || this.jewel.isOpen()))))) {\n                return;\n            }\n        ;\n        ;\n            if (t(\"fbRequestsJewelLoading\")) {\n                new h().setURI(\"/ajax/requests/loader/\").send();\n            }\n             else {\n                var da = this._onMarkupCallback.bind(this, z, !!aa), ea = {\n                    from: z\n                };\n                if (aa) {\n                    ea.suggester = aa;\n                }\n            ;\n            ;\n                new h().setURI(\"/ajax/friends/jewel/request_markup\").setData(ea).setHandler(da).send();\n            }\n        ;\n        ;\n        },\n        _onMarkupCallback: function(x, y, z) {\n            var aa = z.getPayload();\n            if (!aa) {\n                return;\n            }\n        ;\n        ;\n            var ba = this._requestList[x], ca = this._parseIDToInts(ba).type;\n            if (((((ca === 19)) && !y))) {\n                var da = ((ba && t(ba)));\n                ((da && l.replace(da, aa.markup)));\n            }\n             else {\n                var ea = l.scry(this.jewelFlyout, \".fbRequestList .uiList\")[0];\n                if (!ea) {\n                    return;\n                }\n            ;\n            ;\n                l.prependContent(ea, aa.markup);\n                var fa = {\n                    jewel: \"requests\",\n                    count: ++this.countNew\n                };\n                g.inform(\"jewel/count-updated\", fa);\n                ++this._requestCount;\n                this._conditionShowEmptyMessage();\n            }\n        ;\n        ;\n            this._requestList[x] = aa.item_id;\n        },\n        _removeOldRequest: function(x, y) {\n            if (((((!y || this.jewel.isOpen())) || ((t(\"fbRequestsJewelLoading\") !== null))))) {\n                return;\n            }\n        ;\n        ;\n            var z = this._requestList[y.obj.from], aa = ((z && t(z)));\n            if (aa) {\n                ((k.hasClass(aa, \"jewelItemNew\") && g.inform(\"jewel/count-updated\", {\n                    jewel: \"requests\",\n                    count: --this.countNew\n                })));\n                if (!k.hasClass(aa, \"jewelItemResponded\")) {\n                    l.remove(aa);\n                    delete this._requestList[y.obj.from];\n                    --this._requestCount;\n                    this._conditionShowEmptyMessage();\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n        },\n        pageInCollapsedRequests: function() {\n            var x = t(\"fbRequestsJewelManualPager\");\n            if (x) {\n                var y = l.scry(x, \".uiMorePagerPrimary\")[0];\n                if (((y.style && ((y.style.display != \"none\"))))) {\n                    JSBNG__setTimeout(function() {\n                        y.click();\n                    }, 100);\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n        },\n        _markRead: function() {\n            this.jewel.markSeen();\n            this._clearNewItems();\n        },\n        _markSeenCallback: function(x, y) {\n            var z = l.scry(this.jewelFlyout, \"li\");\n            new i(\"/ajax/gigaboxx/endpoint/UpdateLastSeenTime.php\", {\n                folder: this.folder,\n                first_item: z[0].id\n            }).send();\n            new h().setURI(\"/ajax/friends/jewel/predicted_count_logging\").setData({\n                ego_predicted_count: this.egoPredictedCount,\n                pending_count: this.pendingCount,\n                unseen_timestamp: this.egoUnseenTimestamp,\n                action_context: this.actionContext,\n                should_log_ego_click: this.shouldLogEgoClick\n            }).send();\n            var aa = ((((((typeof x != \"undefined\")) && ((typeof y != \"undefined\")))) ? {\n                requester: x,\n                type: y\n            } : {\n            }));\n            ((this.doNewMarkRead && new i(\"/ajax/requests/mark_read/\", aa).send()));\n        },\n        _markSeenFromMessage: function(x, y) {\n            g.inform(\"jewel/count-updated\", {\n                jewel: \"requests\",\n                count: 0\n            });\n        },\n        _removeRequest: function(x, y) {\n            var z = y.obj.item_id;\n            if (z) {\n                var aa = t(z), ba = ((aa && k.hasClass(aa, \"jewelItemNew\")));\n                ((aa ? l.remove(aa) : ((ba && g.inform(\"jewel/count-updated\", {\n                    jewel: \"requests\",\n                    count: --this.countNew\n                })))));\n            }\n        ;\n        ;\n        },\n        _clearNewItems: function(x, y) {\n            l.scry(this.jewel.root, \"li.jewelItemNew\").forEach(function(z) {\n                k.removeClass(z, \"jewelItemNew\");\n            });\n        },\n        _updateCount: function(x, y) {\n            this.countNew = y.count;\n            k.conditionClass(this.jewelFlyout, \"beeperUnread\", ((this.countNew > 0)));\n            k.conditionClass(this.jewelFlyoutCase, \"showRequests\", ((this.countNew > 0)));\n            if (this.newCountSpan) {\n                var z = ((((this.countNew == 1)) ? v._(\"{num} NEW REQUEST\", {\n                    num: this.countNew\n                }) : v._(\"{num} NEW REQUESTS\", {\n                    num: this.countNew\n                })));\n                l.setContent(this.newCountSpan, z);\n            }\n        ;\n        ;\n        },\n        _conditionShowEmptyMessage: function() {\n            l.scry(this.jewelFlyout, \"li.empty\").forEach(function(x) {\n                k.conditionShow(x, ((this._requestCount <= 0)));\n            }.bind(this));\n        },\n        _openHandler: function() {\n            var x = l.scry(this.jewelFlyout, \".uiScrollableArea\")[0];\n            if (t(\"fbRequestsJewelLoading\")) {\n                var y = JSBNG__Date.now();\n                if (((((this.openTimestamp + 5000)) < y))) {\n                    this.openTimestamp = y;\n                    new h().setURI(\"/ajax/requests/loader/\").setData({\n                        log_impressions: true\n                    }).send();\n                }\n            ;\n            ;\n            }\n             else {\n                var z = Object.keys(this._requestList);\n                if (((z.length > 0))) {\n                    new h().setURI(\"/friends/requests/log_impressions\").setData({\n                        ids: z.join(\",\"),\n                        ref: \"jewel\"\n                    }).send();\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            ((x && q.poke(x)));\n        }\n    });\n    e.exports = w;\n});\n__d(\"legacy:RequestsJewel\", [\"RequestsJewel\",], function(a, b, c, d) {\n    a.RequestsJewel = b(\"RequestsJewel\");\n}, 3);\n__d(\"JewelX\", [\"JSBNG__Event\",\"Arbiter\",\"ArbiterMixin\",\"CSS\",\"DOM\",\"HTML\",\"Keys\",\"TabIsolation\",\"Toggler\",\"copyProperties\",\"emptyFunction\",\"reportData\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"Arbiter\"), i = b(\"ArbiterMixin\"), j = b(\"CSS\"), k = b(\"DOM\"), l = b(\"HTML\"), m = b(\"Keys\"), n = b(\"TabIsolation\"), o = b(\"Toggler\"), p = b(\"copyProperties\"), q = b(\"emptyFunction\"), r = b(\"reportData\"), s = function(t, u) {\n        ((((t && u)) && this.init(t, u)));\n    };\n    p(s, {\n        _instancesByName: {\n        },\n        _resizeListener: null\n    });\n    p(s.prototype, i, {\n        init: function(t, u) {\n            this.JSBNG__name = u.JSBNG__name;\n            this.root = t;\n            this.countNew = 0;\n            this.initialCount = 0;\n            this.escHandler = null;\n            s._instancesByName[this.JSBNG__name] = this;\n            var v = k.JSBNG__find(t, \".jewelFlyout\"), w = new n(v);\n            o.listen(\"show\", this.root, function(x) {\n                this._logFirstClick();\n                ((this.hasNew() && this.markSeen()));\n                this.reset();\n                this.inform(\"opened\");\n                h.inform(\"layer_shown\", {\n                    type: \"Jewel\"\n                });\n                w.enable();\n                this.setupEvents();\n            }.bind(this));\n            o.listen(\"hide\", this.root, function(x, y) {\n                ((this.hasNew() && this.markSeen()));\n                this.reset();\n                this.inform(\"JSBNG__closed\");\n                h.inform(\"layer_hidden\", {\n                    type: \"Jewel\"\n                });\n                w.disable();\n                this.removeEvents();\n            }.bind(this));\n            h.subscribe(\"jewel/count-updated\", function(x, y) {\n                ((((y.jewel == this.JSBNG__name)) && this.update(y)));\n            }.bind(this));\n            h.subscribe(\"jewel/count-initial\", function(x, y) {\n                ((((y.jewel == this.JSBNG__name)) && this.setInitial(y)));\n            }.bind(this));\n            h.subscribe(\"jewel/reset\", function(x, y) {\n                ((((y.jewel == this.JSBNG__name)) && this.reset()));\n            }.bind(this));\n            s._resizeListener = ((s._resizeListener || (function() {\n                var x = null;\n                return g.listen(window, \"resize\", function() {\n                    JSBNG__clearTimeout(x);\n                    x = h.inform.bind(h, \"jewel/resize\").defer(100, false);\n                });\n            })()));\n        },\n        getRoot: function() {\n            return this.root;\n        },\n        hasNew: function() {\n            return j.hasClass(this.root, \"hasNew\");\n        },\n        isOpen: function() {\n            return j.hasClass(this.root, \"openToggler\");\n        },\n        reset: function() {\n            j.removeClass(this.root, \"hasNew\");\n        },\n        setContent: function(t) {\n            var u = k.JSBNG__find(this.root, \"ul.jewelItemList\");\n            k.setContent(u, l(t));\n        },\n        update: function(t) {\n            this.countNew = t.count;\n            var u = k.JSBNG__find(this.root, \"span.jewelCount span\");\n            k.setContent(u, this.countNew);\n            var v = ((isNaN(this.countNew) || ((this.countNew > 0))));\n            j.conditionClass(this.root, \"hasNew\", v);\n            if (v) {\n                var w = ((\"\" + this.countNew)).length;\n                j.conditionClass(this.root, \"hasCountSmall\", ((w === 1)));\n                j.conditionClass(this.root, \"hasCountMedium\", ((w === 2)));\n                j.conditionClass(this.root, \"hasCountLarge\", ((w > 2)));\n            }\n        ;\n        ;\n            this.inform(\"updated\", t);\n        },\n        setInitial: function(t) {\n            this.initialCount = t;\n        },\n        setupEvents: function() {\n            this.escHandler = g.listen(JSBNG__document.documentElement, \"keydown\", function(t) {\n                if (((((t.keyCode === m.ESC)) && this.isOpen()))) {\n                    o.hide(this.root);\n                }\n            ;\n            ;\n            }.bind(this));\n        },\n        removeEvents: function() {\n            if (this.escHandler) {\n                this.escHandler.remove();\n            }\n        ;\n        ;\n        },\n        markSeen: function() {\n            h.inform(\"jewel/count-updated\", {\n                jewel: this.JSBNG__name,\n                count: 0\n            }, h.BEHAVIOR_STATE);\n            this.inform(\"marked-seen\");\n        },\n        _logFirstClick: function() {\n            this._logFirstClick = q;\n            r(\"jewel_click\", {\n                gt: {\n                    count: this.countNew,\n                    initial: this.initialCount,\n                    jewel: this.JSBNG__name\n                }\n            });\n        }\n    });\n    e.exports = s;\n});\n__d(\"MercuryJewelCountControl\", [\"Arbiter\",\"DOM\",\"MercuryThreadlistConstants\",\"copyProperties\",\"shield\",\"tx\",\"MercuryServerRequests\",\"MercuryThreadInformer\",\"MercuryUnseenState\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"DOM\"), i = b(\"MercuryThreadlistConstants\"), j = b(\"copyProperties\"), k = b(\"shield\"), l = b(\"tx\"), m = b(\"MercuryServerRequests\").get(), n = b(\"MercuryThreadInformer\").get(), o = b(\"MercuryUnseenState\").get(), p, q, r, s = function(u) {\n        if (((u || r.isOpen()))) {\n            o.markAsSeen();\n        }\n    ;\n    ;\n    }, t = function(u, v) {\n        p = u;\n        q = h.JSBNG__find(p, \"#mercurymessagesCountValue\");\n        r = v;\n        this.render();\n        m.subscribe(\"model-update-completed\", function(w, x) {\n            s(false);\n        });\n        n.subscribe(\"unseen-updated\", this.render.bind(this));\n        r.subscribe(\"marked-seen\", k(s, this, true));\n    };\n    j(t.prototype, {\n        render: function() {\n            var u = \"\";\n            if (o.exceedsMaxCount()) {\n                u = l._(\"{count}+\", {\n                    count: i.MAX_UNSEEN_COUNT\n                });\n            }\n             else u = o.getUnseenCount().toString();\n        ;\n        ;\n            g.inform(\"jewel/count-updated\", {\n                jewel: \"mercurymessages\",\n                count: u\n            }, g.BEHAVIOR_STATE);\n        }\n    });\n    e.exports = t;\n});\n__d(\"MercuryJewelThreadlistControl\", [\"Arbiter\",\"ArbiterMixin\",\"MercuryChatUtils\",\"MercuryConfig\",\"CSS\",\"DOM\",\"JSBNG__Event\",\"JSLogger\",\"JSXDOM\",\"MercuryAPIArgsSource\",\"MercuryThreadlistConstants\",\"MessagingTag\",\"MercuryOrderedThreadlist\",\"Parent\",\"MercuryJewelTemplates\",\"MercuryThreadInformer\",\"MercuryThreadMetadataRenderer\",\"MercuryThreads\",\"Tooltip\",\"MercuryUnreadState\",\"copyProperties\",\"csx\",\"cx\",\"throttle\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ArbiterMixin\"), i = b(\"MercuryChatUtils\"), j = b(\"MercuryConfig\"), k = b(\"CSS\"), l = b(\"DOM\"), m = b(\"JSBNG__Event\"), n = b(\"JSLogger\"), o = b(\"JSXDOM\"), p = b(\"MercuryAPIArgsSource\"), q = b(\"MercuryThreadlistConstants\"), r = b(\"MessagingTag\"), s = b(\"MercuryOrderedThreadlist\").get(), t = b(\"Parent\"), u = b(\"MercuryJewelTemplates\"), v = b(\"MercuryThreadInformer\").get(), w = b(\"MercuryThreadMetadataRenderer\").get(), x = b(\"MercuryThreads\").get(), y = b(\"Tooltip\"), z = b(\"MercuryUnreadState\").get(), aa = b(\"copyProperties\"), ba = b(\"csx\"), ca = b(\"cx\"), da = b(\"throttle\"), ea = b(\"tx\"), fa = n.create(\"mercury_jewel\");\n    function ga(na, oa) {\n        this._contentArea = ((l.scry(na, \".scrollable\")[0] || na));\n        this._contentElement = l.JSBNG__find(this._contentArea, \".jewelContent\");\n        this._loadingElement = l.JSBNG__find(this._contentArea, \".jewelLoading\");\n        this._loadMoreButton = l.JSBNG__find(this._contentArea, \"._8y5\");\n        this._loadMoreLink = l.JSBNG__find(this._contentArea, \"a._8y6\");\n        this._currentFolder = r.INBOX;\n        this._jewelFolderLinks = [];\n        this._jewelFolderLinks[r.INBOX] = l.JSBNG__find(oa, \"._1sde\");\n        this._jewelFolderLinks[r.OTHER] = l.JSBNG__find(oa, \"._1sdf\");\n        this._jewelFolderCounts = [];\n        this._jewelFolderCounts[r.INBOX] = l.JSBNG__find(oa, \"._1sdg\");\n        this._jewelFolderCounts[r.OTHER] = l.JSBNG__find(oa, \"._1sdh\");\n        la.bind(this)();\n        m.listen(this._jewelFolderLinks[r.INBOX], \"click\", ka.bind(this, r.INBOX));\n        m.listen(this._jewelFolderLinks[r.OTHER], \"click\", ka.bind(this, r.OTHER));\n        this._curCount = [];\n        this._curCount[r.INBOX] = ((q.JEWEL_THREAD_COUNT + 1));\n        this._curCount[r.OTHER] = ((q.JEWEL_THREAD_COUNT + 1));\n        this._isFolderLoaded = [];\n        this._isFolderLoaded[r.INBOX] = false;\n        this._isFolderLoaded[r.OTHER] = false;\n        this._folderIsLoading = [];\n        this._folderIsLoading[r.INBOX] = false;\n        this._folderIsLoading[r.OTHER] = false;\n        v.subscribe(\"threadlist-updated\", this.render.bind(this));\n        v.subscribe(\"unread-updated\", la.bind(this));\n        this.render();\n        fa.bump(((\"opened_threadlist_\" + this._currentFolder)));\n        m.listen(this._contentArea, \"JSBNG__scroll\", da(ha, 50, this));\n        m.listen(this._loadMoreLink, \"click\", this.renderMoreThreads.bind(this));\n    };\n;\n    aa(ga, {\n        EVENT_THREADS_LOADED: \"threads-loaded\",\n        EVENT_THREADS_RENDERED: \"threads-rendered\"\n    });\n    aa(ga.prototype, h);\n    aa(ga.prototype, {\n        render: function() {\n            l.empty(this._contentElement);\n            k.show(this._loadingElement);\n            k.hide(this._loadMoreButton);\n            var na = l.create(\"div\");\n            l.appendContent(this._contentElement, na);\n            s.getThreadlist(q.RECENT_THREAD_OFFSET, this._curCount[this._currentFolder], this._currentFolder, this.renderThreads.bind(this, na), true);\n        },\n        renderThreads: function(na, oa) {\n            this.inform(ga.EVENT_THREADS_LOADED);\n            if (oa.length) {\n                oa.forEach(function(pa) {\n                    var qa = u[\":fb:mercury:jewel:threadlist-row\"].build();\n                    x.getThreadMeta(pa, function(ra) {\n                        w.renderCoreThreadlist(ra, qa, this.renderSingleThread.bind(this), {\n                            show_unread_count: true\n                        });\n                    }.bind(this));\n                    l.appendContent(na, qa.getRoot());\n                }.bind(this));\n            }\n             else l.setContent(this._contentElement, this.renderEmptyThreadlist());\n        ;\n        ;\n            k.hide(this._loadingElement);\n            k.conditionShow(this._loadMoreButton, !this._isFolderLoaded[this._currentFolder]);\n            this.inform(ga.EVENT_THREADS_RENDERED);\n        },\n        renderSingleThread: function(na, oa) {\n            var pa = ((oa.unread_count > 0));\n            if (pa) {\n                k.addClass(na.getRoot(), \"jewelItemNew\");\n            }\n        ;\n        ;\n            if (j.MessagesJewelToggleReadGK) {\n                var qa = o.div({\n                    className: \"x_div\"\n                }), ra = o.div({\n                    className: \"_5c9q\"\n                }), sa = \"Mark as Unread\";\n                if (pa) {\n                    sa = \"Mark as Read\";\n                }\n            ;\n            ;\n                y.set(ra, sa, \"above\", \"right\");\n                m.listen(ra, \"click\", function(JSBNG__event) {\n                    x.changeThreadReadStatus(oa.thread_id, ((oa.unread_count > 0)));\n                    return false;\n                });\n                qa.appendChild(ra);\n                na.getNode(\"link\").appendChild(qa);\n            }\n        ;\n        ;\n            if (((j.MessagesJewelOpenInChat && i.canOpenChatTab(oa)))) {\n                m.listen(na.getRoot(), \"click\", function(JSBNG__event) {\n                    g.inform(\"chat/open-tab\", {\n                        thread_id: oa.thread_id\n                    });\n                });\n            }\n             else w.renderTitanLink(oa.thread_id, na.getNode(\"link\"), null, this._currentFolder);\n        ;\n        ;\n            m.listen(na.getRoot(), \"mouseover\", function(JSBNG__event) {\n                var ta = na.getRoot();\n                if (!t.byClass(ta, \"notifNegativeBase\")) {\n                    k.addClass(ta, \"selected\");\n                }\n            ;\n            ;\n            });\n            m.listen(na.getRoot(), \"mouseout\", function(JSBNG__event) {\n                k.removeClass(na.getRoot(), \"selected\");\n            });\n        },\n        renderMoreThreads: function() {\n            k.addClass(this._loadMoreButton, \"async_saving\");\n            this._folderIsLoading[this._currentFolder] = true;\n            var na = ((this._curCount[this._currentFolder] + q.JEWEL_MORE_COUNT));\n            s.getThreadlist(q.RECENT_THREAD_OFFSET, ((na + 1)), this._currentFolder, ja.bind(this, na, this._currentFolder), true, p.JEWEL);\n        },\n        renderEmptyThreadlist: function() {\n            return l.create(\"li\", {\n                className: \"empty\"\n            }, \"No messages\");\n        }\n    });\n    function ha() {\n        if (((((!this._isFolderLoaded[this._currentFolder] && !this._folderIsLoading[this._currentFolder])) && ia.bind(this)()))) {\n            this.renderMoreThreads();\n        }\n    ;\n    ;\n    };\n;\n    function ia() {\n        return ((((this._contentArea.scrollTop + this._contentArea.clientHeight)) >= ((this._contentArea.scrollHeight - 1))));\n    };\n;\n    function ja(na, oa, pa) {\n        this._curCount[oa] = na;\n        if (((!this._isFolderLoaded[oa] && ((pa.length < ((this._curCount[oa] + 1))))))) {\n            this._isFolderLoaded[oa] = true;\n        }\n    ;\n    ;\n        this._folderIsLoading[oa] = false;\n        k.removeClass(this._loadMoreButton, \"async_saving\");\n        this.render();\n    };\n;\n    function ka(na) {\n        if (((this._currentFolder != na))) {\n            fa.bump(((\"opened_threadlist_\" + na)));\n            k.addClass(this._jewelFolderLinks[na], \"_1sdd\");\n            k.removeClass(this._jewelFolderLinks[this._currentFolder], \"_1sdd\");\n            this._currentFolder = na;\n            this.render();\n        }\n    ;\n    ;\n    };\n;\n    function la() {\n        ma.bind(this)(r.INBOX);\n        ma.bind(this)(r.OTHER);\n    };\n;\n    function ma(na) {\n        var oa;\n        if (z.exceedsMaxCount(na)) {\n            oa = q.MAX_UNREAD_COUNT;\n        }\n         else oa = z.getUnreadCount(na);\n    ;\n    ;\n        var pa = this._jewelFolderCounts[na];\n        if (((oa > 0))) {\n            if (((oa == q.MAX_UNREAD_COUNT))) {\n                oa += \"+\";\n            }\n        ;\n        ;\n            l.setContent(pa, ea._(\"({unread_count})\", {\n                unread_count: oa\n            }));\n        }\n         else l.setContent(pa, \"\");\n    ;\n    ;\n    };\n;\n    e.exports = ga;\n});\n__d(\"MercuryJewel\", [\"MercuryChannelHandler\",\"MercuryJewelCountControl\",\"DOM\",\"MercuryJewelThreadlistControl\",\"MercuryServerRequests\",\"userAction\",], function(a, b, c, d, e, f) {\n    b(\"MercuryChannelHandler\");\n    var g = b(\"MercuryJewelCountControl\"), h = b(\"DOM\"), i = b(\"MercuryJewelThreadlistControl\"), j = b(\"MercuryServerRequests\").get(), k = b(\"userAction\"), l = false;\n    function m(q, r, s, t) {\n        j.handleUpdate(t);\n        var u = new g(r, s), v = h.JSBNG__find(q, \"#MercuryJewelThreadList\");\n        if (((s.getRoot() && s.isOpen()))) {\n            n.call(this, v, q);\n        }\n         else s.subscribe(\"opened\", n.bind(this, v, q));\n    ;\n    ;\n    };\n;\n    e.exports = m;\n    function n(q, r) {\n        this._ua = k(\"messages\").uai(\"click\", \"jewel\");\n        this._listenForLoad = this._listenForRender = true;\n        if (!l) {\n            var s = new i(q, r);\n            s.subscribe(i.EVENT_THREADS_LOADED, o.bind(this));\n            s.subscribe(i.EVENT_THREADS_RENDERED, p.bind(this));\n            l = true;\n        }\n    ;\n    ;\n    };\n;\n    function o() {\n        if (this._listenForLoad) {\n            this._ua.add_event(\"loaded\");\n            this._listenForLoad = false;\n        }\n    ;\n    ;\n    };\n;\n    function p() {\n        if (this._listenForRender) {\n            this._ua.add_event(\"rendered\");\n            this._listenForRender = false;\n        }\n    ;\n    ;\n    };\n;\n});\n__d(\"MessagingEvents\", [\"Arbiter\",\"ChannelConstants\",\"arrayContains\",\"copyProperties\",\"isEmpty\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ChannelConstants\"), i = b(\"arrayContains\"), j = b(\"copyProperties\"), k = b(\"isEmpty\"), l = {\n    }, m = new g();\n    function n(o) {\n        if (!k(l)) {\n            return;\n        }\n    ;\n    ;\n        {\n            var fin273keys = ((window.top.JSBNG_Replay.forInKeys)((o))), fin273i = (0);\n            var p;\n            for (; (fin273i < fin273keys.length); (fin273i++)) {\n                ((p) = (fin273keys[fin273i]));\n                {\n                    m.inform(((\"count/\" + p)), o[p]);\n                ;\n                };\n            };\n        };\n    ;\n    };\n;\n    m.subscribe(\"mark-as-read\", function(o, p) {\n        ((((p.tids || p.chat_ids)) || [])).forEach(function(q) {\n            q = ((\"\" + q));\n            if (!((q in l))) {\n                l[q] = true;\n                var r = function() {\n                    m.unsubscribe(s);\n                    JSBNG__clearTimeout(t);\n                    delete l[q];\n                }, s = m.subscribe(\"read\", function(u, v) {\n                    if (((i(((v.tids || [])), q) || i(((v.chat_ids || [])), q)))) {\n                        r();\n                    }\n                ;\n                ;\n                }), t = r.defer(60000);\n            }\n        ;\n        ;\n        });\n    });\n    g.subscribe(h.getArbiterType(\"messaging\"), function(o, p) {\n        var q = j({\n        }, p.obj), JSBNG__event = ((q.JSBNG__event || \"\"));\n        delete q.type;\n        delete q.JSBNG__event;\n        m.inform(JSBNG__event, q);\n        if (((\"unread_counts\" in q))) {\n            var r = q.unread_counts;\n            n({\n                unread: r.inbox,\n                other_unseen: r.other\n            });\n        }\n    ;\n    ;\n    });\n    g.subscribe(h.getArbiterType(\"inbox\"), function(o, p) {\n        var q = j(p.obj);\n        delete q.type;\n        n(q);\n    });\n    a.MessagingEvents = e.exports = m;\n}, 3);\n__d(\"TitanLeftNav\", [\"CounterDisplay\",\"MessagingEvents\",], function(a, b, c, d, e, f) {\n    var g = b(\"CounterDisplay\"), h = b(\"MessagingEvents\"), i = {\n        initialize: function() {\n            h.subscribe(\"count/other_unseen\", function(j, k) {\n                g.setCount(\"other_unseen\", k);\n            });\n        }\n    };\n    e.exports = i;\n});\n__d(\"AccessibleMenu\", [\"JSBNG__Event\",\"CSS\",\"DOM\",\"Keys\",\"TabbableElements\",\"Toggler\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"CSS\"), i = b(\"DOM\"), j = b(\"Keys\"), k = b(\"TabbableElements\"), l = b(\"Toggler\"), m, n, o;\n    function p() {\n        var x = i.scry(m, \"a[rel=\\\"toggle\\\"]\")[0];\n        ((x && x.JSBNG__focus()));\n        l.getInstance(m).hide();\n    };\n;\n    function q(x) {\n        if (!x) {\n            return false;\n        }\n    ;\n    ;\n        h.removeClass(x, \"selected\");\n        x.setAttribute(\"aria-selected\", \"false\");\n    };\n;\n    function r(x) {\n        if (!x) {\n            return false;\n        }\n    ;\n    ;\n        h.addClass(x, \"selected\");\n        x.setAttribute(\"aria-selected\", \"true\");\n        var y = k.JSBNG__find(x);\n        if (y[0]) {\n            y[0].JSBNG__focus();\n        }\n    ;\n    ;\n    };\n;\n    function s(x) {\n        var y = i.scry(m, \".selected\")[0], z = ((n.indexOf(y) + x)), aa = n[z];\n        if (!aa) {\n            return false;\n        }\n    ;\n    ;\n        q(y);\n        r(aa);\n    };\n;\n    function t(x) {\n        if (((!l.isShown() || ((l.getActive() !== m))))) {\n            return true;\n        }\n    ;\n    ;\n        var y = g.getKeyCode(x);\n        switch (y) {\n          case j.TAB:\n            s(((x.shiftKey ? -1 : 1)));\n            g.prevent(x);\n            break;\n          case j.ESC:\n            p();\n            g.prevent(x);\n            break;\n          case j.UP:\n        \n          case j.DOWN:\n            s(((((y === j.UP)) ? -1 : 1)));\n            g.prevent(x);\n            break;\n        };\n    ;\n    };\n;\n    function u(x, y) {\n        m = y.getActive();\n        n = i.scry(m, \"[role=\\\"menuitem\\\"]\");\n        if (!o) {\n            o = g.listen(JSBNG__document.documentElement, \"keydown\", t);\n        }\n    ;\n    ;\n    };\n;\n    function v() {\n        if (((l.getActive() == m))) {\n            q(i.scry(m, \".selected\")[0]);\n        }\n    ;\n    ;\n    };\n;\n    var w = {\n        init: function(x) {\n            l.listen(\"show\", x, u);\n            l.listen(\"hide\", x, v);\n        }\n    };\n    e.exports = w;\n});\n__d(\"UserNoOp\", [\"copyProperties\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"copyProperties\"), h = b(\"emptyFunction\"), i = function() {\n    \n    };\n    g(i.prototype, {\n        add_event: h.thatReturnsThis,\n        add_data: h.thatReturnsThis,\n        uai: h.thatReturnsThis,\n        uai_fallback: h.thatReturnsThis\n    });\n    e.exports = i;\n});\n__d(\"isEmail\", [], function(a, b, c, d, e, f) {\n    var g = /^[\\w!#\\$%&'\\*\\+\\/\\=\\?\\^`\\{\\|\\}~\\-]+(:?\\.[\\w!#\\$%&`\\*\\+\\/\\=\\?\\^`\\{\\|\\}~\\-]+)*@(?:[a-z0-9](?:[a-z0-9\\-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9\\-]*[a-z0-9])?$/i;\n    function h(i) {\n        return g.test(i);\n    };\n;\n    e.exports = h;\n});\n__d(\"NegativeNotif\", [\"Animation\",\"AsyncRequest\",\"CSS\",\"DataStore\",\"DOM\",\"JSBNG__Event\",\"Parent\",\"Tooltip\",\"NotifXList\",\"$\",\"clickRefAction\",\"copyProperties\",\"userAction\",], function(a, b, c, d, e, f) {\n    var g = b(\"Animation\"), h = b(\"AsyncRequest\"), i = b(\"CSS\"), j = b(\"DataStore\"), k = b(\"DOM\"), l = b(\"JSBNG__Event\"), m = b(\"Parent\"), n = b(\"Tooltip\"), o = b(\"NotifXList\"), p = b(\"$\"), q = b(\"clickRefAction\"), r = b(\"copyProperties\"), s = b(\"userAction\");\n    function t(u, v) {\n        r(this, v);\n        this.owner = u;\n        this.xLink = k.JSBNG__find(this.obj, \".notif_x\");\n        this.confirmingMsg = k.JSBNG__find(this.obj, \".confirmingMsg\");\n        this.mainLink = k.JSBNG__find(this.obj, \".notifMainLink\");\n        this.userXClicked = false;\n        this.userUnsubscribed = false;\n        l.listen(this.xLink, \"click\", this.xClick.bind(this));\n        if (((i.hasClass(this.obj, \"first_receipt\") && i.hasClass(p(\"jewelContainer\"), \"notifGentleAppReceipt\")))) {\n            this.gentleFirstReceiptHoverEventHandler = l.listen(this.obj, \"mouseover\", this.gentleFirstReceiptNotifHover.bind(this));\n        }\n    ;\n    ;\n    };\n;\n    r(t.prototype, {\n        FADE_AWAY_DURATION: 2500,\n        X_OUT_DURATION: 100,\n        X_OUT_DURATION_SHORT: 2,\n        GENTLE_FRUI_MIN_HOVER_DURATION: 500,\n        GENTLE_FRUI_FADE_DURATION_FAST: 200,\n        GENTLE_FRUI_FADE_DURATION_SLOW: 2500,\n        GENTLE_FRUI_DELAY_FADE_TIME: 60000,\n        xClick: function(JSBNG__event) {\n            this._activateX();\n            var u = this.xLink.getAttribute(\"data-gt\"), v = ((u ? {\n                gt: JSON.parse(u)\n            } : {\n            }));\n            s(\"xbutton\", this.xLink, JSBNG__event).uai(\"click\");\n            q(\"click\", this.xLink, JSBNG__event, null, v);\n            return false;\n        },\n        gentleFirstReceiptNotifHover: function(JSBNG__event) {\n            JSBNG__event.JSBNG__stop();\n            var u = k.JSBNG__find(this.obj, \".first_receipt_no_button\"), v = j.get(u, \"notif_fr_prompt\");\n            n.set(u, v, \"above\", \"center\");\n            n.show(u);\n            this._gentleFirstReceiptTooltipFadeIn();\n            if (!this.gentleFirstReceiptUnhoverEventHandler) {\n                this.hoverTime = new JSBNG__Date();\n                this.gentleFirstReceiptUnhoverEventHandler = l.listen(JSBNG__document.documentElement, \"mouseover\", this.gentleFirstReceiptNotifUnhover.bind(this));\n            }\n        ;\n        ;\n            if (!this.gentleFirstReceiptNoClickEventHandler) {\n                this.gentleFirstReceiptNoClickEventHandler = l.listen(u, \"click\", this.gentleFirstReceiptNoClick.bind(this));\n            }\n        ;\n        ;\n        },\n        gentleFirstReceiptNotifUnhover: function(JSBNG__event) {\n            if (((m.byClass(JSBNG__event.getTarget(), \"uiContextualLayer\") || m.byClass(JSBNG__event.getTarget(), \"uiScrollableAreaTrack\")))) {\n                return false;\n            }\n        ;\n        ;\n            var u = new JSBNG__Date();\n            if (((this.hoverTime && ((((u - this.hoverTime)) < this.GENTLE_FRUI_MIN_HOVER_DURATION))))) {\n                this.gentleFirstReceiptUnhoverEventHandler.remove();\n                this.gentleFirstReceiptUnhoverEventHandler = null;\n                this._gentleFirstReceiptTooltipAlreadyFadedIn = false;\n                return;\n            }\n        ;\n        ;\n            this._removeGentleFirstReceiptListeners();\n            this._gentleFirstReceiptTooltipFadeAway();\n            this._gentleFirstReceiptXButtonFadeAway();\n            var v = this;\n            JSBNG__setTimeout(function() {\n                v._gentleFirstReceiptUIFadeAway();\n            }, this.GENTLE_FRUI_DELAY_FADE_TIME);\n            this._sendFirstReceiptYesToServer();\n        },\n        gentleFirstReceiptNoClick: function(JSBNG__event) {\n            this._removeGentleFirstReceiptListeners();\n        },\n        restore: function() {\n            if (o.newNotifExist(this.id)) {\n                o.resumeInsert(this.id);\n            }\n             else o.removeNotif(this.id);\n        ;\n        ;\n            this._confirmingMsgFadeAway(this.confirmingMsg);\n            this._notifMainLinkShowUp(this.mainLink);\n            this._buttonShowUp(this.xLink);\n            this._adjustContainer(this.obj);\n        },\n        reset: function() {\n            if (((this.userXClicked && !this.userUnsubscribed))) {\n                this.userXClicked = false;\n                this.restore();\n            }\n        ;\n        ;\n        },\n        onTurnedOff: function() {\n            this.userUnsubscribed = true;\n            i.hide(this.confirmingMsg);\n            this._notifMainLinkShowUp(k.JSBNG__find(this.obj, \".confirmedMsg\"));\n            this._adjustContainer(this.obj);\n        },\n        onUndid: function() {\n            this.userXClicked = false;\n            this.userUnsubscribed = false;\n            this.restore();\n            i.show(this.confirmingMsg);\n            this._notifMainLinkFadeAway(k.JSBNG__find(this.obj, \".confirmedMsg\"));\n            k.remove(k.JSBNG__find(this.obj, \".confirmedMsg\"));\n        },\n        onMarkedSpam: function() {\n            k.remove(k.JSBNG__find(this.obj, \".confirmedMsg\"));\n            this._fadeAway(k.JSBNG__find(this.obj, \".spamMsg\"));\n        },\n        onFirstReceiptYes: function() {\n            this._hideFirstReceiptDiv();\n            this._fadeAway(k.JSBNG__find(this.obj, \".firstConfirmedMsg\"));\n        },\n        onFirstReceiptNo: function() {\n            this._hideFirstReceiptDiv();\n            i.hide(this.confirmingMsg);\n            this._activateX();\n            new h().setURI(\"/ajax/notifications/negative_req.php\").setData({\n                request_type: \"turn_off\",\n                notification_id: this.id\n            }).send();\n        },\n        _sendFirstReceiptYesToServer: function() {\n            new h().setURI(\"/ajax/notifications/negative_req.php\").setData({\n                request_type: \"first_receipt_yes\",\n                notification_id: this.id\n            }).send();\n        },\n        _gentleFirstReceiptTooltipFadeIn: function() {\n            if (this._gentleFirstReceiptTooltipAlreadyFadedIn) {\n                return;\n            }\n        ;\n        ;\n            var u = k.JSBNG__find(JSBNG__document.documentElement, \".uiLayer .uiContextualLayer .uiTooltipX\");\n            new g(u).from(\"opacity\", \"0\").to(\"opacity\", \"1\").duration(this.GENTLE_FRUI_FADE_DURATION_FAST).go();\n            this._gentleFirstReceiptTooltipAlreadyFadedIn = true;\n        },\n        _gentleFirstReceiptTooltipFadeAway: function() {\n            if (!this._gentleFirstReceiptTooltipAlreadyFadedIn) {\n                return;\n            }\n        ;\n        ;\n            var u = k.JSBNG__find(JSBNG__document.documentElement, \".uiLayer .uiContextualLayer .uiTooltipX\"), v = m.byClass(u, \"uiLayer\"), w = v.cloneNode(true);\n            k.insertAfter(v, w);\n            new g(w).from(\"opacity\", \"1\").to(\"opacity\", \"0\").duration(this.GENTLE_FRUI_FADE_DURATION_FAST).ondone(function() {\n                k.remove(w);\n            }).go();\n            this._gentleFirstReceiptTooltipAlreadyFadedIn = false;\n        },\n        _gentleFirstReceiptXButtonFadeAway: function() {\n            var u = k.JSBNG__find(this.obj, \".first_receipt_no_button\");\n            new g(u).from(\"opacity\", \"1\").to(\"opacity\", \"0\").duration(this.GENTLE_FRUI_FADE_DURATION_FAST).hide().go();\n            i.addClass(this.obj, \"show_original_x\");\n        },\n        _gentleFirstReceiptUIFadeAway: function() {\n            var u = this.obj;\n            this.new_label = k.JSBNG__find(this.obj, \".notif_new_label\");\n            new g(this.new_label).to(\"opacity\", \"0\").duration(this.GENTLE_FRUI_FADE_DURATION_SLOW).ondone(function() {\n                i.removeClass(u, \"first_receipt\");\n            }).go();\n            if (!i.hasClass(this.obj, \"jewelItemNew\")) {\n                new g(this.obj).from(\"backgroundColor\", \"#ECEFF5\").to(\"backgroundColor\", \"#FFFFFF\").duration(this.GENTLE_FRUI_FADE_DURATION_SLOW).go();\n            }\n        ;\n        ;\n        },\n        _removeGentleFirstReceiptListeners: function() {\n            if (this.gentleFirstReceiptHoverEventHandler) {\n                this.gentleFirstReceiptHoverEventHandler.remove();\n            }\n        ;\n        ;\n            if (this.gentleFirstReceiptUnhoverEventHandler) {\n                this.gentleFirstReceiptUnhoverEventHandler.remove();\n            }\n        ;\n        ;\n            if (this.gentleFirstReceiptNoClickEventHandler) {\n                this.gentleFirstReceiptNoClickEventHandler.remove();\n            }\n        ;\n        ;\n        },\n        _activateX: function() {\n            i.addClass(this.obj, \"forPushSafety\");\n            this.userXClicked = true;\n            o.userXClick(this.id);\n            this._notifMainLinkFadeAway(this.mainLink);\n            this._buttonFadeAway(this.xLink);\n            if (i.shown(this.confirmingMsg)) {\n                this._confirmingMsgShowUp(this.confirmingMsg);\n            }\n        ;\n        ;\n            this._adjustContainer(this.obj);\n        },\n        _hideFirstReceiptDiv: function() {\n            i.removeClass(this.obj, \"first_receipt\");\n            i.hide(k.JSBNG__find(this.obj, \".first_receipt_div\"));\n        },\n        _fadeAway: function(u) {\n            new g(u).from(\"backgroundColor\", \"#FFF9D7\").to(\"backgroundColor\", \"#FFFFFF\").duration(this.FADE_AWAY_DURATION).checkpoint().to(\"opacity\", \"0\").blind().duration(this.X_OUT_DURATION).checkpoint().to(\"height\", \"0px\").to(\"paddingTop\", \"0px\").to(\"paddingBottom\", \"0px\").blind().hide().duration(this.X_OUT_DURATION).go();\n        },\n        _adjustContainer: function(u) {\n            new g(u).by(\"height\", \"0px\").duration(this.X_OUT_DURATION).checkpoint().by(\"height\", \"0px\").duration(this.X_OUT_DURATION_SHORT).checkpoint().to(\"height\", \"auto\").duration(this.X_OUT_DURATION).go();\n        },\n        _notifMainLinkShowUp: function(u) {\n            new g(u).duration(this.X_OUT_DURATION).checkpoint().to(\"height\", \"auto\").to(\"paddingTop\", \"4px\").to(\"paddingBottom\", \"4px\").blind().show().duration(this.X_OUT_DURATION_SHORT).checkpoint().to(\"opacity\", \"1\").blind().duration(this.X_OUT_DURATION).go();\n        },\n        _confirmingMsgShowUp: function(u) {\n            new g(u).duration(this.X_OUT_DURATION).checkpoint().to(\"height\", \"auto\").to(\"paddingTop\", \"10px\").to(\"paddingBottom\", \"10px\").blind().show().duration(this.X_OUT_DURATION_SHORT).checkpoint().to(\"opacity\", \"1\").blind().duration(this.X_OUT_DURATION).go();\n        },\n        _notifMainLinkFadeAway: function(u) {\n            new g(u).to(\"opacity\", \"0\").blind().duration(this.X_OUT_DURATION).checkpoint().to(\"height\", \"0px\").to(\"paddingTop\", \"0px\").to(\"paddingBottom\", \"0px\").blind().hide().duration(this.X_OUT_DURATION_SHORT).go();\n        },\n        _confirmingMsgFadeAway: function(u) {\n            new g(u).to(\"opacity\", \"0\").blind().duration(this.X_OUT_DURATION).checkpoint().to(\"height\", \"0px\").to(\"paddingTop\", \"0px\").to(\"paddingBottom\", \"0px\").blind().duration(this.X_OUT_DURATION_SHORT).go();\n        },\n        _buttonShowUp: function(u) {\n            new g(u).duration(this.X_OUT_DURATION).checkpoint().show().duration(this.X_OUT_DURATION_SHORT).checkpoint().to(\"opacity\", \"1\").blind().duration(this.X_OUT_DURATION).go();\n        },\n        _buttonFadeAway: function(u) {\n            new g(u).to(\"opacity\", \"0\").blind().duration(this.X_OUT_DURATION).checkpoint().hide().duration(this.X_OUT_DURATION_SHORT).go();\n        }\n    });\n    e.exports = t;\n});\n__d(\"NotificationCounter\", [\"Arbiter\",\"DocumentTitle\",\"JSLogger\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"DocumentTitle\"), i = b(\"JSLogger\"), j = {\n        messages: 0,\n        notifications: 0,\n        requests: 0\n    }, k = {\n        init: function(l) {\n            g.subscribe(\"update_title\", this._handleUpdate.bind(this));\n            g.subscribe(\"jewel/count-updated\", this._handleCountUpdate.bind(this));\n        },\n        getCount: function() {\n            var l = 0;\n            {\n                var fin274keys = ((window.top.JSBNG_Replay.forInKeys)((j))), fin274i = (0);\n                var m;\n                for (; (fin274i < fin274keys.length); (fin274i++)) {\n                    ((m) = (fin274keys[fin274i]));\n                    {\n                        var n = Number(j[m]);\n                        if (((((typeof j[m] == \"string\")) && isNaN(n)))) {\n                            return j[m];\n                        }\n                    ;\n                    ;\n                        if (((isNaN(n) || ((n < 0))))) {\n                            i.create(\"jewels\").error(\"bad_count\", {\n                                jewel: m,\n                                count: j[m]\n                            });\n                            continue;\n                        }\n                    ;\n                    ;\n                        l += n;\n                    };\n                };\n            };\n        ;\n            return l;\n        },\n        updateTitle: function() {\n            var l = this.getCount(), m = h.get();\n            m = ((l ? ((((((\"(\" + l)) + \") \")) + m)) : m));\n            h.set(m, true);\n        },\n        _handleCountUpdate: function(l, m) {\n            j[m.jewel] = m.count;\n            this.updateTitle();\n        },\n        _handleUpdate: function(l, m) {\n            this.updateTitle();\n        }\n    };\n    e.exports = k;\n});\n__d(\"NotificationList\", [\"Animation\",\"ArbiterMixin\",\"CSS\",\"DOM\",\"DoublyLinkedListMap\",\"HTML\",\"NotificationURI\",\"Tooltip\",\"JSBNG__Event\",\"$\",\"copyProperties\",\"cx\",\"csx\",\"ge\",\"isEmpty\",\"tx\",\"hasArrayNature\",], function(a, b, c, d, e, f) {\n    var g = b(\"Animation\"), h = b(\"ArbiterMixin\"), i = b(\"CSS\"), j = b(\"DOM\"), k = b(\"DoublyLinkedListMap\"), l = b(\"HTML\"), m = b(\"NotificationURI\"), n = b(\"Tooltip\"), o = b(\"JSBNG__Event\"), p = b(\"$\"), q = b(\"copyProperties\"), r = b(\"cx\"), s = b(\"csx\"), t = b(\"ge\"), u = b(\"isEmpty\"), v = b(\"tx\"), w = b(\"hasArrayNature\"), x = \"0\", y = \"1\", z = \"2\";\n    function aa(da) {\n        return ((((da == y)) || ((da == z))));\n    };\n;\n    function ba(da) {\n        return ((da == y));\n    };\n;\n    function ca(da, ea) {\n        this._list = new k();\n        this._filter_func = null;\n        this.unseenCount = 0;\n        this.contentRoot = da;\n        this.noItemsElement = null;\n        this.ITEM_TAG = \"li\";\n        this.ITEM_CLASS = \"notification\";\n        this.NO_ITEMS_ID = \"jewelNoNotifications\";\n        this.NO_ITEMS_CLASS = \"empty\";\n        this.compare = ((ea.compare || this.compare));\n        this.shouldBlockAnimation = ((ea.shouldBlockAnimation || null));\n        this.unseenVsUnread = ((ea.unseenVsUnread || false));\n        this.markReadSignalServer = ea.markReadSignalServer;\n        this.animations = {\n        };\n    };\n;\n    q(ca, {\n        ITEM_UNREAD_CLASS: \"jewelItemNew\",\n        MARK_READ_TYPE: \"mark_read\",\n        UNREAD_COUNT_CHANGE_TYPE: \"unread_count_change\",\n        INSERTION_TYPE: \"insert\",\n        REMOVAL_TYPE: \"remove\",\n        getIdFromDom: function(da) {\n            return da.getAttribute(\"id\").replace(\"notification_\", \"\");\n        },\n        localizeUrls: function(da) {\n            j.scry(da, \"a\").forEach(function(ea) {\n                ea.href = m.localize(ea.href);\n            });\n        }\n    });\n    q(ca.prototype, h, {\n        FADE_DURATION: 250,\n        RESIZE_DURATION: 200,\n        _getField: function(da, ea) {\n            var fa = this._list.get(da);\n            return ((fa && fa[ea]));\n        },\n        getDomObj: function(da) {\n            return this._getField(da, \"obj\");\n        },\n        fromDom: function() {\n            var da = ((((this.ITEM_TAG + \".\")) + this.ITEM_CLASS)), ea = j.scry(this.contentRoot, da);\n            for (var fa = 0; ((fa < ea.length)); ++fa) {\n                var ga = ea[fa], ha = ca.getIdFromDom(ga);\n                this.insert(ha, ga.getAttribute(\"data-notiftime\"), null);\n            };\n        ;\n        },\n        compare: function(da, ea) {\n            return ((((da.time < ea.time)) || ((((da.time === ea.time)) && ((da.id < ea.id))))));\n        },\n        insert: function(da, ea, fa, ga, ha, ia) {\n            var ja = y, ka = 0, la = this._list.exists(da), ma = ((ia && this._list.exists(ia))), na = null, oa;\n            if (((la || ma))) {\n                if (!((ga && fa))) {\n                    return false;\n                }\n                 else {\n                    if (this._filter_func) {\n                        oa = {\n                            notif_id: da,\n                            notif_time: ea,\n                            notif_markup: fa,\n                            replace: ga,\n                            ignoreUnread: ha,\n                            notif_alt_id: ia\n                        };\n                        if (this._filter_func(oa)) {\n                            return false;\n                        }\n                    ;\n                    ;\n                    }\n                ;\n                ;\n                    ja = this._getField(da, \"readness\");\n                    ka = this._getField(da, \"time\");\n                    if (((ka > ea))) {\n                        return false;\n                    }\n                ;\n                ;\n                    na = ((la ? da : ia));\n                    this._remove(na);\n                }\n            ;\n            }\n        ;\n        ;\n            var pa = ((((fa && l(fa).getRootNode())) || p(((\"notification_\" + da))))), qa = Math.max(ea, ka), ra = pa.getAttribute(\"data-readness\");\n            if (((!this.unseenVsUnread && ((z == ra))))) {\n                ra = x;\n            }\n        ;\n        ;\n            oa = {\n                id: da,\n                obj: pa,\n                time: qa,\n                readness: ra,\n                app_id: pa.getAttribute(\"data-appid\")\n            };\n            this._insert(oa);\n            this._setUpReadStateToggle(da, pa);\n            ca.localizeUrls(pa);\n            ((this.noItemsElement && i.hide(this.noItemsElement)));\n            if (ba(ra)) {\n                ((((ha && !aa(ja))) && this.markRead([da,])));\n                this.unseenCount = this.getUnseenIds().length;\n                this.inform(ca.UNREAD_COUNT_CHANGE_TYPE);\n            }\n        ;\n        ;\n            var sa = ((((!na || ((ka < qa)))) || ((((ra && !ja)) && !ha))));\n            this.inform(ca.INSERTION_TYPE, {\n                id: da,\n                is_new: sa,\n                obj: pa,\n                replaced_id: na,\n                time: qa\n            });\n            return true;\n        },\n        _setReadStateToggleReadness: function(da, ea) {\n            var fa;\n            if (ea) {\n                fa = ((this.unseenVsUnread ? \"Mark as Read\" : \"Unread\"));\n            }\n             else fa = \"Read\";\n        ;\n        ;\n            if (!((ea && this.unseenVsUnread))) {\n                i.removeClass(da, \"_5c9q\");\n                i.addClass(da, \"_5c9_\");\n            }\n        ;\n        ;\n            n.set(da, fa, \"above\", \"center\");\n        },\n        _setUpReadStateToggle: function(da, ea) {\n            var fa = this.isUnreadId(da), ga = j.scry(ea, \"._5c9q\")[0];\n            if (!ga) {\n                return;\n            }\n        ;\n        ;\n            this._setReadStateToggleReadness(ga, fa);\n            var ha = function(JSBNG__event) {\n                if (((this.unseenVsUnread && this.isUnreadId(da)))) {\n                    this.markReadSignalServer([da,]);\n                }\n            ;\n            ;\n                o.kill(JSBNG__event);\n                return false;\n            };\n            o.listen(ga, \"click\", ha.bind(this));\n        },\n        showNoNotifications: function() {\n            if (((null == this.noItemsElement))) {\n                this.noItemsElement = t(this.NO_ITEMS_ID);\n            }\n        ;\n        ;\n            if (((null == this.noItemsElement))) {\n                this.noItemsElement = j.create(this.ITEM_TAG, {\n                    id: this.NO_ITEMS_ID,\n                    className: this.NO_ITEMS_CLASS\n                }, \"No new notifications\");\n                j.appendContent(this.contentRoot, this.noItemsElement);\n            }\n        ;\n        ;\n            i.show(this.noItemsElement);\n        },\n        _insert: function(da) {\n            this._list.remove(da.id);\n            var ea = null;\n            this._list.JSBNG__find(function(ga) {\n                var ha = this.compare(ga, da);\n                ((!ha && (ea = ga.id)));\n                return ha;\n            }.bind(this));\n            var fa = this.getDomObj(ea);\n            if (fa) {\n                this._list.insertAfter(da.id, da, ea);\n                j.insertAfter(fa, da.obj);\n            }\n             else {\n                this._list.prepend(da.id, da);\n                j.prependContent(this.contentRoot, da.obj);\n            }\n        ;\n        ;\n        },\n        _remove: function(da) {\n            var ea = this._getField(da, \"obj\");\n            if (!ea) {\n                return false;\n            }\n        ;\n        ;\n            this.inform(ca.REMOVAL_TYPE, {\n                id: da\n            });\n            this._list.remove(da);\n            j.remove(ea);\n            ((this.isEmpty() && this.showNoNotifications()));\n            return true;\n        },\n        getUnreadIds: function() {\n            return this._list.reduce(function(da, ea) {\n                ((aa(da.readness) && ea.push(da.id)));\n                return ea;\n            }, []);\n        },\n        getUnseenIds: function() {\n            return this._list.reduce(function(da, ea) {\n                ((ba(da.readness) && ea.push(da.id)));\n                return ea;\n            }, []);\n        },\n        getIds: function() {\n            return this._list.reduce(function(da, ea) {\n                ea.push(da.id);\n                return ea;\n            }, []);\n        },\n        isUnreadId: function(da) {\n            var ea = this.getDomObj(da);\n            return ((aa(this._getField(da, \"readness\")) || ((ea && i.hasClass(ea, ca.ITEM_UNREAD_CLASS)))));\n        },\n        isUnseenId: function(da) {\n            return ba(this._getField(da, \"readness\"));\n        },\n        markRead: function(da, ea) {\n            da = ((da ? da.filter(this.isUnreadId.bind(this)) : this.getUnreadIds()));\n            var fa = false;\n            for (var ga = 0; ((ga < da.length)); ga++) {\n                var ha = this._list.get(da[ga]);\n                if (ha) {\n                    if (this._setReadness(da[ga], x)) {\n                        fa = true;\n                    }\n                ;\n                ;\n                    if (ea) {\n                        this._markReadInDom(da[ga], ha.obj);\n                    }\n                     else this.animateMarkRead(ha.obj);\n                ;\n                ;\n                }\n            ;\n            ;\n            };\n        ;\n            if (fa) {\n                this.unseenCount = this.getUnseenIds().length;\n                this.inform(ca.UNREAD_COUNT_CHANGE_TYPE);\n            }\n        ;\n        ;\n        },\n        markSeen: function(da) {\n            if (!w(da)) {\n                return;\n            }\n        ;\n        ;\n            if (!this.unseenVsUnread) {\n                this.markRead(da);\n                return;\n            }\n        ;\n        ;\n            da = da.filter(this.isUnseenId.bind(this));\n            var ea = false;\n            for (var fa = 0; ((fa < da.length)); fa++) {\n                if (this._setReadness(da[fa], z)) {\n                    ea = true;\n                }\n            ;\n            ;\n            };\n        ;\n            if (ea) {\n                this.unseenCount = this.getUnseenIds().length;\n                this.inform(ca.UNREAD_COUNT_CHANGE_TYPE);\n            }\n        ;\n        ;\n        },\n        _setReadness: function(da, ea) {\n            var fa = this._list.get(da);\n            if (((!fa || ((fa.readness == ea))))) {\n                return false;\n            }\n        ;\n        ;\n            if (((((fa.readness == x)) && ((ea == z))))) {\n                return false;\n            }\n        ;\n        ;\n            fa.readness = ea;\n            fa.obj.setAttribute(\"data-readness\", ea);\n            return true;\n        },\n        _markReadInDom: function(da, ea) {\n            if (!this.isUnreadId(da)) {\n                return;\n            }\n        ;\n        ;\n            var fa = p(ea);\n            if (fa) {\n                this.stopAnimation(da);\n                i.removeClass(fa, ca.ITEM_UNREAD_CLASS);\n                var ga = j.scry(fa, \".read_toggle\")[0];\n                ((ga && this._setReadStateToggleReadness(ga, false)));\n            }\n        ;\n        ;\n        },\n        animateMarkRead: function(da) {\n            if (!i.hasClass(da, ca.ITEM_UNREAD_CLASS)) {\n                return;\n            }\n        ;\n        ;\n            var ea = ca.getIdFromDom(da), fa = this._markReadInDom.bind(this, ea, da);\n            if (i.hasClass(da, \"fbJewelBeep\")) {\n                fa();\n                return;\n            }\n        ;\n        ;\n            if (((this.shouldBlockAnimation && this.shouldBlockAnimation(da)))) {\n                return;\n            }\n        ;\n        ;\n            fa.defer(10000);\n        },\n        stopAnimation: function(da) {\n            ((((da in this.animations)) && this.animations[da].JSBNG__stop()));\n            delete this.animations[da];\n            return true;\n        },\n        insertMany: function(da, ea) {\n            if (((((\"object\" == typeof da)) && !u(da)))) {\n                {\n                    var fin275keys = ((window.top.JSBNG_Replay.forInKeys)((da))), fin275i = (0);\n                    var fa;\n                    for (; (fin275i < fin275keys.length); (fin275i++)) {\n                        ((fa) = (fin275keys[fin275i]));\n                        {\n                            var ga = da[fa];\n                            this.insert(fa, ga.time, ga.markup, true, ea, ((ga.alt_id || null)));\n                        };\n                    };\n                };\n            ;\n                ((this.noItemsElement && i.hide(this.noItemsElement)));\n            }\n             else ((this.isEmpty() && this.showNoNotifications()));\n        ;\n        ;\n        },\n        isEmpty: function() {\n            return this._list.isEmpty();\n        },\n        getEarliestNotifTime: function() {\n            return ((this._list.isEmpty() ? 0 : Math.min.apply(null, this.getIds().map(function(da) {\n                return this._getField(da, \"time\");\n            }.bind(this)))));\n        },\n        setFilterFn: function(da) {\n            this._filter_func = da;\n        },\n        toggleNotifsSimilarTo: function(da, ea, fa) {\n            var ga = this._getField(da, \"app_id\");\n            if (ga) {\n                var ha = this.getIds();\n                for (var ia = 0; ((ia < ha.length)); ++ia) {\n                    if (((ga == this._getField(ha[ia], \"app_id\")))) {\n                        var ja = this.getDomObj(ha[ia]);\n                        if (((da != ha[ia]))) {\n                            ((ea ? this._hideWithAnimation(ja) : this._showWithAnimation(ja)));\n                        }\n                    ;\n                    ;\n                        var ka = j.scry(ja, \".first_receipt_div\");\n                        if (((ka.length == 1))) {\n                            if (fa) {\n                                i.hide(ka[0]);\n                                i.removeClass(ja, \"first_receipt\");\n                            }\n                             else {\n                                i.show(ka[0]);\n                                i.addClass(ja, \"first_receipt\");\n                            }\n                        ;\n                        }\n                    ;\n                    ;\n                    }\n                ;\n                ;\n                };\n            ;\n            }\n        ;\n        ;\n        },\n        _hideWithAnimation: function(da) {\n            new g(da).to(\"opacity\", \"0\").blind().duration(this.FADE_DURATION).checkpoint().to(\"height\", \"0px\").to(\"paddingTop\", \"0px\").to(\"paddingBottom\", \"0px\").blind().hide().duration(this.RESIZE_DURATION).go();\n        },\n        _showWithAnimation: function(da) {\n            new g(da).to(\"height\", \"auto\").to(\"paddingTop\", \"auto\").to(\"paddingBottom\", \"auto\").blind().show().duration(this.RESIZE_DURATION).checkpoint().to(\"opacity\", \"1\").blind().duration(this.FADE_DURATION).go();\n        }\n    });\n    e.exports = ca;\n});\n__d(\"Notifications\", [\"Animation\",\"Arbiter\",\"AsyncRequest\",\"AsyncSignal\",\"Bootloader\",\"ChannelConstants\",\"CSS\",\"DOM\",\"Env\",\"JSBNG__Event\",\"JSLogger\",\"NegativeNotif\",\"NotificationCounter\",\"NotificationList\",\"NotifXList\",\"Parent\",\"Poller\",\"ScrollableArea\",\"Style\",\"SystemEvents\",\"Toggler\",\"URI\",\"UserActivity\",\"UserNoOp\",\"Vector\",\"$\",\"copyProperties\",\"emptyFunction\",\"ge\",\"hasArrayNature\",\"isEmpty\",\"shield\",\"throttle\",\"userAction\",], function(a, b, c, d, e, f) {\n    var g = b(\"Animation\"), h = b(\"Arbiter\"), i = b(\"AsyncRequest\"), j = b(\"AsyncSignal\"), k = b(\"Bootloader\"), l = b(\"ChannelConstants\"), m = b(\"CSS\"), n = b(\"DOM\"), o = b(\"Env\"), p = b(\"JSBNG__Event\"), q = b(\"JSLogger\"), r = b(\"NegativeNotif\"), s = b(\"NotificationCounter\"), t = b(\"NotificationList\"), u = b(\"NotifXList\"), v = b(\"Parent\"), w = b(\"Poller\"), x = b(\"ScrollableArea\"), y = b(\"Style\"), z = b(\"SystemEvents\"), aa = b(\"Toggler\"), ba = b(\"URI\"), ca = b(\"UserActivity\"), da = b(\"UserNoOp\"), ea = b(\"Vector\"), fa = b(\"$\"), ga = b(\"copyProperties\"), ha = b(\"emptyFunction\"), ia = b(\"ge\"), ja = b(\"hasArrayNature\"), ka = b(\"isEmpty\"), la = b(\"shield\"), ma = b(\"throttle\"), na = b(\"userAction\");\n    function oa(pa) {\n        this.updateTime = ((pa.updateTime || JSBNG__Date.now()));\n        this.update_period = ((pa.updatePeriod || 60000));\n        this.latest_notif_time = ((pa.latestNotif || 0));\n        this.latest_read_notif_time = ((pa.latestReadNotif || 0));\n        this.cache_version = ((pa.cacheVersion || 0));\n        this.notifReceivedType = ((pa.notifReceivedType || \"notification\"));\n        this.wrapperID = ((pa.wrapperID || \"notificationsWrapper\"));\n        this.contentID = ((pa.contentID || \"jewelNotifs\"));\n        this.shouldLogImpressions = ((pa.shouldLogImpressions || false));\n        this.allowDesktopNotifications = ((pa.allowDesktopNotifications || false));\n        this.logAutoShutOffImpression = true;\n        this.useInfiniteScroll = ((pa.useInfiniteScroll || false));\n        this.unseenVsUnread = ((pa.unseenVsUnread || false));\n        this.scrollableAreaNode = null;\n        this.firstReceiptMap = {\n        };\n        this.user = o.user;\n        this.queuedNotifications = [];\n        this.timeElement = \"small.time\";\n        this.ua = new da();\n        this._init();\n    };\n;\n    ga(oa.prototype, {\n        TIME_TRAVEL: \"time_travel\",\n        ONLINE: \"online\",\n        SCROLL_OFF_TINY: \"scroll_off_tiny\",\n        INACTIVE_REFRESH: \"inactive_refresh\",\n        _init: function() {\n            this.cookieName = ((\"notifications_\" + this.user));\n            this.updateCheckCount = 0;\n            this.fetchListeners = [];\n            this.currentFetchRequest = null;\n            this.wrapper = ia(this.wrapperID);\n            this.JSBNG__content = ia(this.contentID);\n            this.jewelFlyout = ia(\"fbNotificationsFlyout\");\n            this.footer = n.JSBNG__find(this.jewelFlyout, \".jewelFooter\");\n            this.loadingIndicator = ia(((this.contentID + \"_loading_indicator\")));\n            this.NOTIF_JEWEL_REF = \"notif_jewel\";\n            this.notifLogger = q.create(\"notifications\");\n            s.init();\n            this.alertList = new t(this.JSBNG__content, this._getListParams());\n            this._updateCount();\n            ((((a.MinNotifications && a.MinNotifications.fetchSent())) && (this.fetch = ha)));\n            h.subscribe(l.getArbiterType(this.notifReceivedType), this._handleNotificationMsg.bind(this));\n            h.subscribe(l.getArbiterType(\"notifications_read\"), this._handleNotificationsReadMsg.bind(this));\n            h.subscribe(l.getArbiterType(\"notifications_seen\"), this._handleNotificationsSeenMsg.bind(this));\n            h.subscribe(\"jewel/resize\", la(this._hideOverflow, this));\n            this.alertList.subscribe(t.UNREAD_COUNT_CHANGE_TYPE, this._updateCount.bind(this));\n            this._poller = new w({\n                interval: this.update_period,\n                setupRequest: this._update.bind(this),\n                clearOnQuicklingEvents: false,\n                dontStart: true\n            });\n            this._poller.start.bind(this._poller).defer(this.update_period, false);\n            if (this.wrapper) {\n                this.countSpan = n.JSBNG__find(this.wrapper, \"span.jewelCount span\");\n            }\n        ;\n        ;\n            this.initializeEvents();\n            this.fromDom();\n            if (this.useInfiniteScroll) {\n                this._autoLoadNotifIndex = 1;\n                this._truncate = false;\n                this.alertList.subscribe(t.INSERTION_TYPE, this._handleInsert.bind(this));\n            }\n        ;\n        ;\n        },\n        _getListParams: function() {\n            return {\n                shouldBlockAnimation: function(pa) {\n                    return this.isNotifJewelOpen();\n                }.bind(this),\n                unseenVsUnread: this.unseenVsUnread,\n                markReadSignalServer: this.markRead.bind(this).curry(true)\n            };\n        },\n        fromDom: function() {\n            this.alertList.fromDom();\n            ((((((a.MinNotifications && a.MinNotifications.fetched())) && this.alertList.isEmpty())) && this.alertList.showNoNotifications()));\n        },\n        initializeEvents: function() {\n            var pa = this.alertList.ITEM_TAG, qa = null;\n            p.listen(this.JSBNG__content, {\n                mouseover: function(JSBNG__event) {\n                    var ta = JSBNG__event.getTarget();\n                    qa = v.byTag(ta, pa);\n                    if (((qa && ((ta != qa))))) {\n                        if (v.byClass(qa, \"notifNegativeBase\")) {\n                            m.addClass(qa, \"notifHover\");\n                        }\n                         else m.addClass(qa, \"selected\");\n                    ;\n                    }\n                ;\n                ;\n                },\n                mouseout: function(JSBNG__event) {\n                    ((qa && m.removeClass(qa, \"selected\")));\n                    ((qa && m.removeClass(qa, \"notifHover\")));\n                    qa = null;\n                },\n                mousedown: this.onContentMouseDown.bind(this)\n            });\n            p.listen(this.wrapper, \"mouseover\", this.onMouseOver.bind(this));\n            aa.listen(\"show\", this.wrapper, this.onClick.bind(this));\n            aa.listen(\"hide\", this.wrapper, this.onHide.bind(this));\n            ((this.shouldLogImpressions && aa.listen(\"show\", this.wrapper, this._logImpression.bind(this))));\n            var ra = function(ta) {\n                this._poller.request();\n                this.notifLogger.bump(ta);\n            }.bind(this);\n            z.subscribe(z.TIME_TRAVEL, ra.curry(this.TIME_TRAVEL));\n            z.subscribe(z.ONLINE, function(ta, ua) {\n                ((ua && ra(this.ONLINE)));\n            });\n            var sa = ((((1000 * 60)) * 60));\n            ca.subscribe(function(ta, ua) {\n                ((((ua.idleness > sa)) && ra(this.INACTIVE_REFRESH)));\n            }.bind(this));\n            this.negativeNotifs = {\n            };\n            this._initNotifNegativeFeedback();\n            if (this.useInfiniteScroll) {\n                this._setupScroll();\n                this._initializeScrollEvents();\n                this._updateScrollDataStructures.bind(this).defer();\n                this._hideOverflow();\n            }\n        ;\n        ;\n        },\n        _setupScroll: function() {\n            this._scrollArea = n.scry(this.jewelFlyout, \"div.uiScrollableAreaWrap\")[0];\n            this._morePagerLink = n.JSBNG__find(this.jewelFlyout, \".notifMorePager a\");\n            this._morePager = ((v.byClass(this._morePagerLink, \"notifMorePager\") || this._morePagerLink));\n            this._infiniteScrollNotif = null;\n            this.afterFirstFetch = false;\n            this.animate = false;\n            if (((a.MinNotifications && a.MinNotifications.fetched()))) {\n                this.afterFirstFetch = true;\n                m.show(this._morePager);\n            }\n        ;\n        ;\n        },\n        _initializeScrollEvents: function() {\n            p.listen(this._scrollArea, \"JSBNG__scroll\", ma(this._handleScroll.bind(this)));\n            p.listen(this._morePagerLink, \"success\", function(pa) {\n                this.fetchHandler(pa.getData().response);\n            }.bind(this));\n        },\n        _updateScrollDataStructures: function() {\n            var pa = this.alertList.getIds(), qa = Math.max(0, ((pa.length - this._autoLoadNotifIndex)));\n            this._infiniteScrollNotif = this.alertList.getDomObj(pa[qa]);\n            this._annotateMorePagerURI();\n        },\n        _annotateMorePagerURI: function() {\n            this._morePagerLink.setAttribute(\"ajaxify\", new ba(this._morePagerLink.getAttribute(\"ajaxify\")).addQueryData({\n                earliest_time: this.alertList.getEarliestNotifTime()\n            }));\n        },\n        onContentMouseDown: function(JSBNG__event) {\n            var pa = v.byTag(JSBNG__event.getTarget(), this.alertList.ITEM_TAG), qa = ((pa && t.getIdFromDom(pa)));\n            if (((qa && this.alertList.isUnreadId(qa)))) {\n                this.markRead(true, [qa,]);\n            }\n        ;\n        ;\n        },\n        onMouseOver: function(JSBNG__event) {\n            if (m.hasClass(JSBNG__event.getTarget(), \"jewelButton\")) {\n                this.ua = na(\"notifs\", JSBNG__event.target, JSBNG__event, {\n                    mode: \"DEDUP\"\n                }).uai(\"mouseover\", \"jewel\").add_event(\"hover\");\n            }\n        ;\n        ;\n            this.fetch();\n        },\n        onClick: function() {\n            ((((a.ArbiterMonitor && ((this.fetch != ha)))) && h.registerCallback(ha, [\"notifs/fetched\",])));\n            this.ua.add_event(\"show\");\n            this.fetch();\n            this.markRead(true);\n            this._hideOverflow();\n            if (this.scrollableAreaNode) {\n                var pa = x.getInstance(this.scrollableAreaNode);\n                ((pa && pa.poke()));\n            }\n        ;\n        ;\n        },\n        onHide: function() {\n            this.animate = false;\n            ((this.animation && this.animation.JSBNG__stop()));\n            this.ua.add_event(\"hide\");\n            this.markRead(true);\n            this._dequeueNotifications();\n        },\n        _dequeueNotifications: function() {\n            this.queuedNotifications.forEach(function(pa) {\n                this._displayNotification(pa.type, pa.data);\n            }, this);\n            this.queuedNotifications.length = 0;\n        },\n        _handleScroll: function() {\n            if (this._checkInfiniteScroll()) {\n                this._autoLoadNotifIndex = 5;\n                this._sendFetchRequest(this._morePager);\n            }\n        ;\n        ;\n        },\n        _handleInsert: function(pa, qa) {\n            if (qa.is_new) {\n                this._newDataFromInsert = true;\n            }\n        ;\n        ;\n            this._updateScrollDataStructures();\n        },\n        _checkInfiniteScroll: function() {\n            if (((this._infiniteScrollNotif && this._scrollArea))) {\n                var pa = ea.getElementPosition(this._infiniteScrollNotif).y, qa = ((ea.getElementPosition(this._scrollArea).y + ea.getElementDimensions(this._scrollArea).y));\n                return ((pa < qa));\n            }\n        ;\n        ;\n            return false;\n        },\n        _initNotifNegativeFeedback: function() {\n            u.init(this);\n            this.alertList.setFilterFn(u.filterStoreClicked);\n            aa.listen(\"hide\", fa(this.wrapperID), function() {\n                {\n                    var fin276keys = ((window.top.JSBNG_Replay.forInKeys)((this.negativeNotifs))), fin276i = (0);\n                    var pa;\n                    for (; (fin276i < fin276keys.length); (fin276i++)) {\n                        ((pa) = (fin276keys[fin276i]));\n                        {\n                            if (pa) {\n                                ((((this.negativeNotifs[pa] instanceof r)) && this.negativeNotifs[pa].reset()));\n                            }\n                        ;\n                        ;\n                        };\n                    };\n                };\n            ;\n            }.bind(this));\n            h.subscribe(\"notif/negativeCancel\", function(pa, qa) {\n                ((this.negativeNotifs[qa.id] && this.negativeNotifs[qa.id].restore()));\n            }.bind(this));\n            h.subscribe(\"notif/negativeConfirmed\", function(pa, qa) {\n                ((this.negativeNotifs[qa.id] && this.negativeNotifs[qa.id].onTurnedOff()));\n                this.alertList.toggleNotifsSimilarTo(qa.id, true, true);\n                this._hideOverflow();\n                this._handleScroll();\n            }.bind(this));\n            h.subscribe(\"notif/negativeUndid\", function(pa, qa) {\n                ((this.negativeNotifs[qa.id] && this.negativeNotifs[qa.id].onUndid()));\n                this.alertList.toggleNotifsSimilarTo(qa.id, false, true);\n                this._hideOverflow();\n            }.bind(this));\n            h.subscribe(\"notif/negativeMarkedSpam\", function(pa, qa) {\n                ((this.negativeNotifs[qa.id] && this.negativeNotifs[qa.id].onMarkedSpam()));\n            }.bind(this));\n            h.subscribe(\"notif/negativeFirstReceiptYes\", function(pa, qa) {\n                ((this.negativeNotifs[qa.id] && this.negativeNotifs[qa.id].onFirstReceiptYes()));\n                this.alertList.toggleNotifsSimilarTo(qa.id, false, true);\n            }.bind(this));\n            h.subscribe(\"notif/negativeFirstReceiptNo\", function(pa, qa) {\n                ((this.negativeNotifs[qa.id] && this.negativeNotifs[qa.id].onFirstReceiptNo()));\n                this.alertList.toggleNotifsSimilarTo(qa.id, false, true);\n            }.bind(this));\n            this.alertList.subscribe(t.INSERTION_TYPE, function(pa, qa) {\n                this._updateFirstReceipt(qa);\n                var ra = n.scry(qa.obj, \".notif_x\");\n                if (((ra.length == 1))) {\n                    this.negativeNotifs[qa.id] = new r(this, qa);\n                }\n            ;\n            ;\n            }.bind(this));\n        },\n        _sendIDs: function(pa, qa, ra) {\n            var sa = ((ra || {\n            }));\n            for (var ta = 0; ((ta < pa.length)); ++ta) {\n                sa[((((\"alert_ids[\" + ta)) + \"]\"))] = pa[ta];\n            ;\n            };\n        ;\n            new j(ba(qa).getQualifiedURI().toString(), sa).send();\n        },\n        _waitForFetch: function(pa) {\n            return ((this.currentFetchRequest && this.fetchListeners.push(pa.bind(this))));\n        },\n        _logImpression: function() {\n            var pa = this.alertList.getIds();\n            if (((((pa.length === 0)) && this._waitForFetch(this._logImpression)))) {\n                return;\n            }\n        ;\n        ;\n            this.logImpressionIds(pa, this.NOTIF_JEWEL_REF);\n        },\n        logImpressionIds: function(pa, qa) {\n            ((this.shouldLogImpressions && this._sendIDs(pa, \"/ajax/notifications/impression.php\", {\n                ref: qa\n            })));\n        },\n        markRead: function(pa, qa) {\n            var ra = !ja(qa);\n            qa = ((ra ? this.alertList.getUnseenIds() : qa.filter(this.alertList.isUnreadId.bind(this.alertList))));\n            if (qa.length) {\n                ((pa && this._sendIDs(qa, \"/ajax/notifications/mark_read.php\", {\n                    seen: ((ra ? 1 : 0))\n                })));\n                if (((ia(\"jewelNoticeMessage\") && this.logAutoShutOffImpression))) {\n                    new j(\"/ajax/notifications/auto_shutoff_seen.php\").send();\n                    this.logAutoShutOffImpression = false;\n                }\n            ;\n            ;\n                var sa = pa;\n                ((ra ? this.alertList.markSeen(qa) : this.alertList.markRead(qa, sa)));\n            }\n        ;\n        ;\n            ((ra && this._waitForFetch(this.markRead.bind(this, pa))));\n        },\n        markAllRead: function() {\n            var pa = this.alertList.getUnreadIds();\n            this.markRead(true, pa);\n        },\n        _updateErrorHandler: function(pa) {\n        \n        },\n        _updateURI: \"/ajax/presence/update.php\",\n        _update: function(pa) {\n            pa.setHandler(this._handleUpdate.bind(this)).setOption(\"suppressErrorAlerts\", true).setErrorHandler(this._updateErrorHandler.bind(this)).setData({\n                notif_latest: this.latest_notif_time,\n                notif_latest_read: this.latest_read_notif_time\n            }).setURI(this._updateURI).setAllowCrossPageTransition(true);\n        },\n        _handleUpdate: function(pa) {\n            var qa = pa.payload.notifications;\n            if (!qa.no_change) {\n                this.updateTime = pa.payload.time;\n                this.latest_notif_time = qa.latest_notif;\n                this.latest_read_notif_time = qa.latest_read_notif;\n                this._updateDisplay();\n                this.alertList.insertMany(qa.notifications);\n            }\n        ;\n        ;\n        },\n        _updateDisplay: function() {\n            if (!this.JSBNG__content) {\n                return;\n            }\n        ;\n        ;\n            this._updateCount();\n        },\n        _updateCount: function() {\n            h.inform(\"jewel/count-updated\", {\n                jewel: \"notifications\",\n                count: this.alertList.unseenCount\n            }, h.BEHAVIOR_STATE);\n            this._hideOverflow();\n        },\n        fetch: function(pa) {\n            this._sendFetchRequest(pa);\n        },\n        _getFetchQueryData: function() {\n            var pa = {\n                time: this.latest_notif_time,\n                user: this.user,\n                version: this.cache_version,\n                locale: o.locale\n            };\n            if (this.useInfiniteScroll) {\n                pa.earliest_time = this.alertList.getEarliestNotifTime();\n            }\n        ;\n        ;\n            return pa;\n        },\n        _sendFetchRequest: function(pa) {\n            if (this.useInfiniteScroll) {\n                this._infiniteScrollNotif = null;\n                this._newDataFromInsert = false;\n                this._truncate = true;\n            }\n        ;\n        ;\n            var qa = ba(\"/ajax/notifications/get.php\"), ra = ((pa || this.loadingIndicator));\n            if (this.currentFetchRequest) {\n                return true;\n            }\n        ;\n        ;\n            this.ua.add_event(\"fetch\");\n            qa.setQueryData(this._getFetchQueryData());\n            this.currentFetchRequest = new i().setURI(qa).setStatusElement(ra).setMethod(\"GET\").setReadOnly(true).setTimeoutHandler(30000, this.fetchErrorHandler.bind(this)).setHandler(this.fetchHandler.bind(this)).setErrorHandler(this.fetchErrorHandler.bind(this)).setAllowCrossPageTransition(true);\n            ((!this.currentFetchRequest.send() && this.fetchErrorHandler()));\n            return true;\n        },\n        fetchErrorHandler: function(pa) {\n            this.currentFetchRequest = null;\n            this.ua.add_event(\"fetch_error\");\n            ((this.loadingIndicator && m.hide(this.loadingIndicator)));\n            ((this.useInfiniteScroll && this._updateScrollDataStructures()));\n        },\n        fetchHandler: function(pa) {\n            this.ua.add_event(\"fetch_success\");\n            var qa = pa.getPayload();\n            this.alertList.insertMany(qa.notifications, true);\n            ((this.loadingIndicator && m.hide(this.loadingIndicator)));\n            this.loadingIndicator = null;\n            this.currentFetchRequest = null;\n            this.fetch = ha;\n            if (this.fetchListeners) {\n                for (var ra = 0; ((ra < this.fetchListeners.length)); ra++) {\n                    this.fetchListeners[ra]();\n                ;\n                };\n            ;\n                this.fetchListeners = [];\n            }\n        ;\n        ;\n            ((a.ArbiterMonitor && h.inform(\"notifs/fetched\", \"\", h.BEHAVIOR_STATE)));\n            var sa = qa.generated, ta = Math.round(((JSBNG__Date.now() / 1000)));\n            if (((((ta - sa)) > 15))) {\n                sa = ta;\n            }\n        ;\n        ;\n            k.loadModules([\"LiveTimer\",], function(ua) {\n                ua.restart(sa);\n                ua.startLoop(0);\n            });\n            if (this.useInfiniteScroll) {\n                if (((ka(qa.notifications) || !this._newDataFromInsert))) {\n                    this._noMoreNotifications();\n                }\n                 else m.show(this._morePager);\n            ;\n            ;\n                this._updateScrollDataStructures();\n                if (((this.isNotifJewelOpen() && this.afterFirstFetch))) {\n                    this.animate = true;\n                }\n            ;\n            ;\n                this.afterFirstFetch = true;\n            }\n        ;\n        ;\n            this._hideOverflow();\n        },\n        _noMoreNotifications: function() {\n            m.hide(this._morePager);\n            this.useInfiniteScroll = false;\n        },\n        _mergeNotification: function(pa, qa, ra, sa) {\n            var ta = !this.alertList.isUnreadId(pa);\n            this.alertList.insert(pa, qa, ra, true, null, ((sa || null)));\n            this.latest_notif_time = 0;\n            if (ta) {\n                this._updateCount();\n            }\n        ;\n        ;\n            var ua = this.alertList.getDomObj(pa);\n            if (ua) {\n                k.loadModules([\"LiveTimer\",], function(va) {\n                    va.addTimeStamps(ua);\n                });\n            }\n        ;\n        ;\n        },\n        _handleNotificationMsg: function(pa, qa) {\n            if (this.isNotifJewelOpen()) {\n                var ra = {\n                    type: pa,\n                    data: qa\n                };\n                this.queuedNotifications.push(ra);\n            }\n             else this._displayNotification(pa, qa);\n        ;\n        ;\n        },\n        _displayNotification: function(pa, qa) {\n            var ra = qa.obj;\n            if (((typeof this.useDesktopNotifications == \"undefined\"))) {\n                this.useDesktopNotifications = ((((this.allowDesktopNotifications && window.JSBNG__webkitNotifications)) && ((window.JSBNG__webkitNotifications.checkPermission() === 0))));\n            }\n        ;\n        ;\n            if (this.useDesktopNotifications) {\n                k.loadModules([\"DesktopNotifications\",], function(sa) {\n                    sa.addNotification(ra.alert_id);\n                });\n            }\n        ;\n        ;\n            if (ra.markup) {\n                this._mergeNotification(ra.alert_id, ra.time, ra.markup, ((ra.alt_id || null)));\n            }\n             else this._poller.request();\n        ;\n        ;\n        },\n        _handleNotificationsReadMsg: function(pa, qa) {\n            var ra = qa.obj;\n            this.markRead(false, ra.alert_ids);\n        },\n        _handleNotificationsSeenMsg: function(pa, qa) {\n            if (!this.unseenVsUnread) {\n                this._handleNotificationsReadMsg(pa, qa);\n                return;\n            }\n        ;\n        ;\n            var ra = qa.obj;\n            this.alertList.markSeen(ra.alert_ids);\n        },\n        _hideOverflow: function() {\n            if (!this.isNotifJewelOpen()) {\n                return;\n            }\n        ;\n        ;\n            var pa = n.scry(fa(\"fbNotificationsList\"), \".notification\");\n            this.scrollableAreaNode = ((this.scrollableAreaNode || n.scry(this.jewelFlyout, \".uiScrollableArea\")[0]));\n            var qa = 20, ra = ((m.hasClass(JSBNG__document.documentElement, \"tinyViewport\") && !m.hasClass(JSBNG__document.body, \"fixedBody\")));\n            if (((!pa.length || ra))) {\n                y.set(this.scrollableAreaNode, \"height\", \"100%\");\n                this.notifLogger.rate(this.SCROLL_OFF_TINY, ra);\n                return;\n            }\n        ;\n        ;\n            var sa = ((this.scrollableAreaNode || pa[0])), ta = ((((((ea.getViewportDimensions().y - ea.getElementPosition(sa, \"viewport\").y)) - ea.getElementDimensions(this.footer).y)) - 5)), ua = ta, va = 0;\n            for (; ((((va < pa.length)) && ((ua > 0)))); ++va) {\n                if (m.shown(pa[va])) {\n                    ua -= ea.getElementDimensions(pa[va]).y;\n                }\n            ;\n            ;\n            };\n        ;\n            var wa = 530, xa = Math.min(wa, ((ta - Math.max(ua, 0))));\n            if (((((ua >= 0)) && ((xa < wa))))) {\n                if (!this.useInfiniteScroll) {\n                    xa = \"100%\";\n                }\n                 else {\n                    if (((this._truncate && ((pa.length >= 5))))) {\n                        xa -= qa;\n                    }\n                ;\n                ;\n                    xa += \"px\";\n                }\n            ;\n            ;\n            }\n             else xa += \"px\";\n        ;\n        ;\n            if (((((this.useInfiniteScroll && this.animate)) && ((xa != \"100%\"))))) {\n                ((this.animation && this.animation.JSBNG__stop()));\n                this.animation = new g(this.scrollableAreaNode).to(\"height\", xa).duration(200).go();\n            }\n             else {\n                var ya = x.getInstance(this.scrollableAreaNode);\n                ((ya && ya.showScrollbar.bind(ya).defer()));\n                y.set(this.scrollableAreaNode, \"height\", xa);\n            }\n        ;\n        ;\n        },\n        _updateFirstReceipt: function(pa) {\n            var qa = pa.obj.getAttribute(\"data-appid\"), ra = n.scry(pa.obj, \".first_receipt_div\");\n            if (((qa && ((ra.length == 1))))) {\n                if (this.firstReceiptMap[qa]) {\n                    if (((((pa.id != this.firstReceiptMap[qa].id)) && ((this.firstReceiptMap[qa].time > pa.time))))) {\n                        return;\n                    }\n                ;\n                ;\n                    m.removeClass(this.firstReceiptMap[qa].obj, \"first_receipt\");\n                }\n            ;\n            ;\n                this.firstReceiptMap[qa] = pa;\n                m.addClass(pa.obj, \"first_receipt\");\n            }\n        ;\n        ;\n        },\n        isNotifJewelOpen: function() {\n            var pa = aa.getInstance(this.wrapper).getActive();\n            return ((((pa === this.wrapper)) && m.hasClass(pa, \"openToggler\")));\n        }\n    });\n    e.exports = oa;\n});\n__d(\"legacy:original-notifications-jewel\", [\"Notifications\",], function(a, b, c, d) {\n    a.Notifications = b(\"Notifications\");\n}, 3);\n__d(\"legacy:onvisible\", [\"OnVisible\",], function(a, b, c, d) {\n    a.OnVisible = b(\"OnVisible\");\n}, 3);\n__d(\"PagesVoiceBar\", [\"$\",\"Arbiter\",\"AsyncRequest\",\"CSS\",\"ChannelConstants\",\"DOM\",\"PageTransitions\",], function(a, b, c, d, e, f) {\n    var g = b(\"$\"), h = b(\"Arbiter\"), i = b(\"AsyncRequest\"), j = b(\"CSS\"), k = b(\"ChannelConstants\"), l = b(\"DOM\"), m = b(\"PageTransitions\"), n = \"PagesVoiceBar/toggle\", o = \"PagesVoiceBar/initialized\", p = \"PagesVoiceBar/switchVoice\", q = \"page_transition\", r = \"pages_voice_bar_sync\", s = null, t = null, u = false, v = false;\n    function w() {\n        v = !v;\n        j.conditionClass(JSBNG__document.body, \"hasVoiceBar\", v);\n    };\n;\n    function x(da, ea) {\n        new i(\"/ajax/pages/switch_voice.php\").setData(ea).setHandler(function(fa) {\n            ba();\n        }).send();\n    };\n;\n    function y() {\n        s = null;\n    };\n;\n    function z(da, ea) {\n        if (((ea.obj.profile_id && ((ea.obj.profile_id == s))))) {\n            ba();\n        }\n    ;\n    ;\n    };\n;\n    function aa(da) {\n        h.subscribe(o, da);\n    };\n;\n    function ba() {\n        m.getNextURI().go();\n    };\n;\n    var ca = {\n        initVoiceBar: function() {\n            if (u) {\n                return;\n            }\n        ;\n        ;\n            t = g(\"pagesVoiceBarContent\");\n            v = j.hasClass(JSBNG__document.body, \"hasVoiceBar\");\n            h.subscribe(n, w);\n            h.subscribe(p, x);\n            h.subscribe(q, y);\n            h.subscribe(k.getArbiterType(r), z);\n            u = true;\n            h.inform(o, null, h.BEHAVIOR_STATE);\n        },\n        update: function(da, ea) {\n            aa(function() {\n                s = ea;\n                l.setContent(t, da);\n            });\n        }\n    };\n    e.exports = ca;\n});\n__d(\"PrivacyLiteFlyout\", [\"JSBNG__Event\",\"function-extensions\",\"$\",\"Animation\",\"Arbiter\",\"ArbiterMixin\",\"AsyncRequest\",\"CSS\",\"DOM\",\"Ease\",\"Parent\",\"SelectorDeprecated\",\"Style\",\"Toggler\",\"copyProperties\",\"cx\",\"csx\",\"ge\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\");\n    b(\"function-extensions\");\n    var h = b(\"$\"), i = b(\"Animation\"), j = b(\"Arbiter\"), k = b(\"ArbiterMixin\"), l = b(\"AsyncRequest\"), m = b(\"CSS\"), n = b(\"DOM\"), o = b(\"Ease\"), p = b(\"Parent\"), q = b(\"SelectorDeprecated\"), r = b(\"Style\"), s = b(\"Toggler\"), t = b(\"copyProperties\"), u = b(\"cx\"), v = b(\"csx\"), w = b(\"ge\"), x = \"PrivacyLiteFlyout/expandingSection\", y = {\n    }, z = {\n    };\n    function aa() {\n        switch (window.JSBNG__location.pathname) {\n          case \"/\":\n        \n          case \"/home.php\":\n        \n          case \"/index.php\":\n            return true;\n          default:\n            return false;\n        };\n    ;\n    };\n;\n    function ba(ka) {\n        var la = \"._59fb\";\n        return ((!p.byClass(ka, \"hasSmurfbar\") && n.scry(h(\"blueBar\"), la).length));\n    };\n;\n    function ca(ka, la, ma) {\n        var na = ((la ? 0 : ka.offsetHeight));\n        r.set(ka, \"height\", ((na + \"px\")));\n        r.set(ka, \"overflow\", \"hidden\");\n        m.show(ka);\n        var oa = ((la ? ka.scrollHeight : 0)), pa = n.getID(ka);\n        ((y[pa] && y[pa].JSBNG__stop()));\n        y[pa] = new i(ka).to(\"height\", oa).ondone(function() {\n            y[pa] = null;\n            r.set(ka, \"height\", \"\");\n            r.set(ka, \"overflow\", \"\");\n            ((oa || m.hide(ka)));\n            ma();\n        }).duration(((Math.abs(((oa - na))) * 1.5))).ease(o.sineOut).go();\n    };\n;\n    function da(ka) {\n        return new l().setURI(ka).send();\n    };\n;\n    function ea() {\n        return da(\"/ajax/privacy/privacy_lite/increment_masher_tip_count\");\n    };\n;\n    function fa() {\n        return da(\"/ajax/privacy/privacy_lite/dismiss_masher_tip\");\n    };\n;\n    var ga = null, ha = false, ia = false, ja = t({\n        loadBody: function(ka) {\n            if (((!ha && w(\"fbPrivacyLiteFlyoutLoading\")))) {\n                ha = true;\n                if (!ka) {\n                    ka = false;\n                }\n            ;\n            ;\n                new l(\"/ajax/privacy/privacy_lite/loader\").setData({\n                    from_megaphone: ka\n                }).send();\n            }\n        ;\n        ;\n        },\n        renderBody: function(ka) {\n            var la = w(\"fbPrivacyLiteFlyoutLoading\");\n            if (la) {\n                n.replace(la, ka);\n                ja.inform(\"load\", null, j.BEHAVIOR_STATE);\n            }\n        ;\n        ;\n        },\n        hideCleanup: function(ka) {\n            j.inform(x);\n            var la = n.scry(ka, \"._2va0\").forEach(function(ma) {\n                m.removeClass(ma, \"_2va0\");\n            });\n        },\n        registerFlyoutToggler: function(ka, la) {\n            ga = la;\n            var ma = s.createInstance(ka);\n            ma.setSticky(false);\n            s.listen([\"show\",\"hide\",], la, function(na) {\n                ja.inform(na);\n                ia = ((na === \"show\"));\n                if (!ia) {\n                    ja.hideCleanup(ka);\n                    ma.hide();\n                    j.inform(\"layer_hidden\", {\n                        type: \"PrivacyShortcutsFlyout\"\n                    });\n                }\n                 else j.inform(\"layer_shown\", {\n                    type: \"PrivacyShortcutsFlyout\"\n                });\n            ;\n            ;\n            });\n        },\n        registerFinalReminderFlyout: function(ka) {\n            if (((ia || !aa()))) {\n                return;\n            }\n        ;\n        ;\n            var la = n.JSBNG__find(ka.getRoot(), \"._57bk\"), ma = ka.getContext();\n            if (ba(ma)) {\n                ka.setOffsetY(-5);\n            }\n        ;\n        ;\n            ja.subscribe(\"show\", function() {\n                ka.hide();\n            });\n            var na = g.listen(la, \"click\", function() {\n                ka.hide();\n                da(\"/ajax/privacy/privacy_lite/dismiss_rollout_reminder\");\n                na.remove();\n            });\n            da(\"/ajax/privacy/privacy_lite/increment_rollout_reminder\");\n            ka.show();\n        },\n        isFlyoutVisible: function() {\n            return ((ga && ((s.getActive() === ga))));\n        },\n        exists: function() {\n            return !!n.scry(JSBNG__document.body, \"._59fc\")[0];\n        },\n        setFlyoutVisible: function(ka) {\n            ((ka ? s.show(ga) : s.hide(ga)));\n        },\n        showSection: function(ka) {\n            var la = z[ka], ma = la.chevron, na = la.sublist_container;\n            j.inform(x, ma);\n            if (((ja.inform(\"expand\", ka) !== false))) {\n                m.removeClass(ma, \"_9or\");\n                m.addClass(ma, \"_9os\");\n                ca(na, true, function() {\n                    ja.inform(\"expanded\", ka);\n                });\n            }\n        ;\n        ;\n        },\n        hideSection: function(ka, la, ma) {\n            var na = z[ka], oa = na.chevron, pa = na.sublist_container;\n            if (((ma === oa))) {\n                return;\n            }\n        ;\n        ;\n            if (((ja.inform(\"collapse\", ka) !== false))) {\n                m.addClass(oa, \"_9or\");\n                m.removeClass(oa, \"_9os\");\n                ca(pa, false, function() {\n                    ja.inform(\"collapsed\", ka);\n                });\n            }\n        ;\n        ;\n        },\n        toggleSection: function(ka) {\n            var la = z[ka].chevron;\n            s.getInstance(la).hide();\n            if (m.hasClass(la, \"_9or\")) {\n                ja.showSection(ka);\n                new l(\"/ajax/privacy/privacy_lite/log_section_expand\").setData({\n                    section: ka\n                }).send();\n            }\n             else ja.hideSection(ka);\n        ;\n        ;\n        },\n        registerSection: function(ka, la) {\n            z[ka] = la;\n            j.subscribe(x, ja.hideSection.curry(ka));\n            g.listen(la.section_block, \"click\", ja.toggleSection.curry(ka));\n        },\n        registerInlineHelpOnAudienceChange: function(ka, la, ma) {\n            q.subscribe(\"select\", function(na, oa) {\n                if (((oa.selector != ka))) {\n                    return;\n                }\n            ;\n            ;\n                m.addClass(la, \"_2va0\");\n                if (ma) {\n                    new l(\"/ajax/privacy/privacy_lite/kill_intro\").send();\n                }\n            ;\n            ;\n            });\n        },\n        registerInlineHelpXOutOnClick: function(ka, la) {\n            g.listen(ka, \"click\", m.addClass.curry(la, \"_9p0\"));\n        },\n        registerBlockUnhideOnFocus: function(ka, la) {\n            g.listen(ka, \"JSBNG__focus\", m.show.curry(la));\n        },\n        registerMessageFilterSettingOnClick: function(ka, la) {\n            var ma = n.JSBNG__find(ka, \"._fv0\");\n            g.listen(ka, \"click\", function() {\n                if (ma.checked) {\n                    new l(\"/ajax/mercury/change_filtering_type.php\").setData({\n                        filtering_type: la,\n                        source: \"privacy_lite\"\n                    }).send();\n                }\n            ;\n            ;\n            });\n        },\n        registerGraphSearchPrivacyReminder: function(ka, la) {\n            g.listen(la, \"click\", function() {\n                n.remove(ka);\n                da(\"/ajax/privacy/privacy_lite/dismiss_gs_privacy_reminder\");\n            });\n        },\n        registerMasher: function(ka, la) {\n            var ma = false;\n            j.subscribe(x, function(na, oa) {\n                var pa = n.scry(p.byTag(oa, \"li\"), \"._571t\").length;\n                if (((ma || !pa))) {\n                    return;\n                }\n            ;\n            ;\n                ma = Boolean(ea());\n            });\n            g.listen(la, \"click\", function() {\n                n.remove(ka);\n                fa();\n            });\n        }\n    }, k);\n    e.exports = ja;\n});\n__d(\"PrivacyLiteFlyoutHelp\", [\"JSBNG__Event\",\"Arbiter\",\"AsyncRequest\",\"ContextualHelpSearchController\",\"CSS\",\"DOM\",\"Parent\",\"copyProperties\",\"csx\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"Arbiter\"), i = b(\"AsyncRequest\"), j = b(\"ContextualHelpSearchController\"), k = b(\"CSS\"), l = b(\"DOM\"), m = b(\"Parent\"), n = b(\"copyProperties\"), o = b(\"csx\"), p = b(\"cx\"), q, r;\n    function s(t, u, v, w, x) {\n        this._width = 315;\n        r = l.JSBNG__find(u, \"input\");\n        var y = l.create(\"div\");\n        this.init(t, r, y, v, w);\n        q = m.byClass(u, \"_8-a\");\n        g.listen(x, \"click\", this._hideSearch.bind(this));\n        h.subscribe(\"PrivacyLiteFlyout/expandingSection\", this._hideSearch.bind(this));\n        var z = l.scry(q, \"._d1r\")[0];\n        ((z && g.listen(z, \"click\", function() {\n            k.addClass(q, \"_aw6\");\n            r.JSBNG__focus();\n            if (!this.suggestedResults) {\n                new i(\"/ajax/privacy/privacy_lite/help_suggestions\").setHandler(function(aa) {\n                    var ba = aa.getPayload().searchSuggestions, ca = l.JSBNG__find(q, \"._4_8m\");\n                    l.setContent(ca, ba);\n                    k.addClass(q, \"_4_8l\");\n                }.bind(this)).send();\n            }\n        ;\n        ;\n        }.bind(this))));\n    };\n;\n    n(s.prototype, new j(), {\n        source: \"privacy_shortcuts\",\n        _hideSearch: function() {\n            this.clearResults();\n            k.removeClass(q, \"_aw6\");\n        },\n        show: function(t) {\n            if (((t === this.topics_area))) {\n                k.removeClass(q, \"_aw7\");\n                return;\n            }\n             else if (((t === this.loader))) {\n                k.addClass(q, \"_aw7\");\n                k.hide(this.results_area);\n            }\n             else k.hide(this.loader);\n            \n        ;\n        ;\n            k.show(t);\n        }\n    });\n    e.exports = s;\n});\n__d(\"LayerSlowlyFadeOnShow\", [\"Class\",\"LayerFadeOnShow\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"Class\"), h = b(\"LayerFadeOnShow\"), i = b(\"emptyFunction\");\n    function j(k) {\n        this.parent.construct(this, k);\n    };\n;\n    g.extend(j, h);\n    j.prototype._getDuration = i.thatReturns(500);\n    e.exports = j;\n});\n__d(\"PrivacyLiteNUXController\", [\"AsyncRequest\",\"CSS\",\"JSBNG__Event\",\"LayerSlowlyFadeOnShow\",\"Locale\",\"ModalMask\",\"PageTransitions\",\"Parent\",\"PrivacyLiteFlyout\",\"Toggler\",\"$\",\"copyProperties\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = b(\"CSS\"), i = b(\"JSBNG__Event\"), j = b(\"LayerSlowlyFadeOnShow\"), k = b(\"Locale\"), l = b(\"ModalMask\"), m = b(\"PageTransitions\"), n = b(\"Parent\"), o = b(\"PrivacyLiteFlyout\"), p = b(\"Toggler\"), q = b(\"$\"), r = b(\"copyProperties\"), s = b(\"cx\"), t = \"_3oye\", u = \"_1luv\", v = [], w = {\n        bootload: function() {\n        \n        },\n        init: function(y) {\n            if (!w.initialized) {\n                r(this, {\n                    dialog: y.dialog,\n                    sectionID: y.sectionID,\n                    subsectionID: y.subsectionID,\n                    initialized: true,\n                    tourStarted: false\n                });\n            }\n        ;\n        ;\n            if (y.showOnExpand) {\n                w._attachFlyoutListener();\n            }\n             else w._detachFlyoutListener();\n        ;\n        ;\n        },\n        startTourFromAnywhere: function() {\n            w._startTour(false);\n        },\n        startTourFromMegaphone: function() {\n            w._startTour(true);\n        },\n        _startTour: function(y) {\n            if (w.tourStarted) {\n                return;\n            }\n        ;\n        ;\n            w.tourStarted = true;\n            w._detachFlyoutListener();\n            new g(\"/ajax/privacy/privacy_lite/log_nux_imp\").setData({\n                from_megaphone: y\n            }).send();\n            l.show();\n            h.conditionClass(w.dialog.getRoot(), t, y);\n            if (!y) {\n                w._maskListener = i.listen(q(\"modalMaskOverlay\"), \"click\", w._cleanup);\n            }\n        ;\n        ;\n            p.setSticky(true);\n            JSBNG__setTimeout(w._showFlyout);\n            m.registerHandler(function() {\n                w._cleanup();\n                o.setFlyoutVisible(false);\n            }, 10);\n        },\n        _showFlyout: function() {\n            o.loadBody(true);\n            o.setFlyoutVisible(true);\n            w._initDialog();\n            x(\"load\", w._showTour);\n        },\n        _showTour: function() {\n            o.showSection(w.sectionID);\n            x(\"expanded\", function(y, z) {\n                if (((z === w.sectionID))) {\n                    w.dialog.setContext(q(w.subsectionID)).setOffsetY(20).show();\n                }\n            ;\n            ;\n            });\n            x([\"collapse\",\"hide\",], w._cleanup);\n        },\n        _initDialog: function() {\n            var y = w.dialog.getRoot(), z = w.dialog.getContent();\n            h.addClass(y, \"_1luy\");\n            h.conditionClass(y, \"_3qz8\", k.isRTL());\n            h.addClass(z, \"_1luz\");\n            w.dialog.enableBehavior(j);\n            i.listen(y, \"click\", function(JSBNG__event) {\n                if (n.byClass(JSBNG__event.getTarget(), u)) {\n                    w._cleanup();\n                }\n            ;\n            ;\n            });\n        },\n        _attachFlyoutListener: function() {\n            if (!w.flyoutSubscription) {\n                if (o.isFlyoutVisible()) {\n                    w.startTourFromAnywhere();\n                }\n                 else w.flyoutSubscription = o.subscribe(\"show\", w.startTourFromAnywhere);\n            ;\n            }\n        ;\n        ;\n        },\n        _detachFlyoutListener: function() {\n            if (w.flyoutSubscription) {\n                w.flyoutSubscription.unsubscribe();\n                w.flyoutSubscription = null;\n            }\n        ;\n        ;\n        },\n        _cleanup: function() {\n            if (!w.tourStarted) {\n                return;\n            }\n        ;\n        ;\n            w.tourStarted = false;\n            p.setSticky(false);\n            l.hide();\n            w.dialog.hide();\n            while (v.length) {\n                v.pop().unsubscribe();\n            ;\n            };\n        ;\n            if (w._maskListener) {\n                w._maskListener.remove();\n                w._maskListener = null;\n            }\n        ;\n        ;\n        }\n    };\n    function x(y, z) {\n        v.push(o.subscribe(y, z));\n    };\n;\n    e.exports = w;\n});\n__d(\"ViewasChromeBar\", [\"JSBNG__Event\",\"Arbiter\",\"AsyncRequest\",\"CSS\",\"DOM\",\"Focus\",\"ModalMask\",\"PageTransitions\",\"Parent\",\"cx\",\"csx\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"Arbiter\"), i = b(\"AsyncRequest\"), j = b(\"CSS\"), k = b(\"DOM\"), l = b(\"Focus\"), m = b(\"ModalMask\"), n = b(\"PageTransitions\"), o = b(\"Parent\"), p = b(\"cx\"), q = b(\"csx\"), r = \"ViewasChromeBar/initialized\", s = null, t = false;\n    function u(x) {\n        h.subscribe(r, x);\n    };\n;\n    function v(x) {\n        j.addClass(x, \"_7g7\");\n        var y = k.JSBNG__find(x, \"._7g0\");\n        l.set(k.JSBNG__find(y, \".textInput\"));\n    };\n;\n    var w = {\n        initChromeBar: function(x) {\n            if (t) {\n                return;\n            }\n        ;\n        ;\n            s = x;\n            t = true;\n            h.inform(r, null, h.BEHAVIOR_STATE);\n        },\n        update: function(x, y) {\n            u(function() {\n                k.setContent(s, x);\n                if (y) {\n                    new i(\"/ajax/privacy/glasgow/viewas_bar_flyout_open\").send();\n                }\n            ;\n            ;\n            });\n        },\n        registerSpecificModeOnClick: function(x) {\n            g.listen(x, \"click\", v.curry(o.byClass(x, \"_7f-\")));\n        },\n        registerFlyoutModalMask: function() {\n            m.show();\n            n.registerHandler(m.hide, 10);\n        }\n    };\n    e.exports = w;\n});\n__d(\"BingScalingCommon\", [], function(a, b, c, d, e, f) {\n    var g = {\n        integrateWebsuggestions: function(h, i, j, k, l) {\n            var m = [], n = ((i ? m : [])), o = [], p = 0, q = 0, r = j;\n            k = Math.floor(((j * k)));\n            for (var s = 0; ((s < h.length)); s++) {\n                var t = h[s];\n                if (((((t.type === \"websuggestion\")) && !t.isSeeMore))) {\n                    if (((((((r > 0)) && ((p < k)))) || ((((p > 0)) && ((p < l))))))) {\n                        n.push(t);\n                        p++;\n                        r--;\n                    }\n                     else if (((r > 0))) {\n                        o.push(t);\n                    }\n                    \n                ;\n                ;\n                }\n                 else {\n                    if (((((r <= 0)) && !i))) {\n                        continue;\n                    }\n                ;\n                ;\n                    m.push(t);\n                    q++;\n                    r--;\n                }\n            ;\n            ;\n            };\n        ;\n            if (((((r > 0)) && ((o.length > 0))))) {\n                n = n.concat(o.slice(0, r));\n            }\n        ;\n        ;\n            if (!i) {\n                return m.concat(n);\n            }\n        ;\n        ;\n            return n;\n        }\n    };\n    e.exports = g;\n});\n__d(\"TypeaheadSearchSponsoredUtils\", [], function(a, b, c, d, e, f) {\n    function g(o) {\n        return ((o.selected_target_id != o.s_target));\n    };\n;\n    function h(o, p) {\n        return Math.min(p.maxNumberAds, ((((p.maxNumberRemovedResults + p.maxNumberResultsAndAds)) - o)));\n    };\n;\n    function i(o, p) {\n        var q = {\n        };\n        for (var r = ((o.length - 1)); ((r >= 0)); --r) {\n            var s = o[r];\n            q[s] = s;\n            if (p.hasOwnProperty(s)) {\n                p[s].forEach(function(t) {\n                    q[t] = s;\n                });\n            }\n        ;\n        ;\n        };\n    ;\n        return q;\n    };\n;\n    function j(o, p, q) {\n        for (var r = p; ((r < o.length)); r++) {\n            ((o[r].setDebugString && o[r].setDebugString(q)));\n        ;\n        };\n    ;\n    };\n;\n    function k(o, p) {\n        return ((p.indexOf(String(o)) != -1));\n    };\n;\n    function l(o, p, q, r) {\n        if (n.isSelfPromoted(o)) {\n            return false;\n        }\n    ;\n    ;\n        if (((((q + p.length)) < r.maxNumberResultsAndAds))) {\n            return false;\n        }\n    ;\n    ;\n        return true;\n    };\n;\n    function m(o, p, q, r) {\n        var s = o[((o.length - 1))];\n        if (p.hasOwnProperty(s)) {\n            return false;\n        }\n    ;\n    ;\n        if (((s == q))) {\n            return false;\n        }\n    ;\n    ;\n        if (((s == r))) {\n            return false;\n        }\n    ;\n    ;\n        return true;\n    };\n;\n    var n = {\n        isSelfPromoted: function(o) {\n            return ((o.uid == o.s_target));\n        },\n        prepareAndSortAds: function(o, p, q) {\n            if (!p) {\n                return [];\n            }\n        ;\n        ;\n            var r = [], s = o.length, t = {\n            };\n            for (var u = 0; ((u < s)); u++) {\n                var v = o[u];\n                t[v.uid] = true;\n                if (v.s_categories) {\n                    v.s_categories.forEach(function(z) {\n                        t[z] = true;\n                    });\n                }\n            ;\n            ;\n            };\n        ;\n            {\n                var fin277keys = ((window.top.JSBNG_Replay.forInKeys)((t))), fin277i = (0);\n                var w;\n                for (; (fin277i < fin277keys.length); (fin277i++)) {\n                    ((w) = (fin277keys[fin277i]));\n                    {\n                        if (p[w]) {\n                            {\n                                var fin278keys = ((window.top.JSBNG_Replay.forInKeys)((p[w]))), fin278i = (0);\n                                var x;\n                                for (; (fin278i < fin278keys.length); (fin278i++)) {\n                                    ((x) = (fin278keys[fin278i]));\n                                    {\n                                        var y = p[w][x];\n                                        if (((q && q.hasOwnProperty(y.uid)))) {\n                                            continue;\n                                        }\n                                    ;\n                                    ;\n                                        r.push(y);\n                                    };\n                                };\n                            };\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            r.sort(function(z, aa) {\n                return ((aa.s_value - z.s_value));\n            });\n            return r;\n        },\n        selectAds: function(o, p, q, r, s) {\n            var t = [], u = {\n            }, v = {\n            }, w = {\n            }, x = 0, y = h(o.length, r), z = i(o, p);\n            for (var aa = 0; ((aa < q.length)); aa++) {\n                if (((t.length >= y))) {\n                    j(q, aa, ((((\"filtered: \" + y)) + \" ads already selected\")));\n                    break;\n                }\n            ;\n            ;\n                var ba = q[aa], ca = ((z[ba.s_target] || ba.s_target));\n                ba.selected_target_id = ca;\n                if (!k(ca, o)) {\n                    ((ba.setDebugString && ba.setDebugString(((((((((\"filtered: targeted organic \" + ca)) + \" does not exist. \")) + \"promoted id \")) + ba.uid)))));\n                    continue;\n                }\n            ;\n            ;\n                if (((l(ba, o, x, r) && !m(o, v, ca, s)))) {\n                    ((ba.setDebugString && ba.setDebugString(\"filtered: last organic need but cannot be removed\")));\n                    continue;\n                }\n            ;\n            ;\n                if (((!n.isSelfPromoted(ba) && ((o.indexOf(String(ba.uid)) != -1))))) {\n                    ((ba.setDebugString && ba.setDebugString(((((((\"filtered: organic \" + ba.uid)) + \" targets another organic \")) + ca)))));\n                    continue;\n                }\n            ;\n            ;\n                if (u.hasOwnProperty(ba.s_account)) {\n                    ((ba.setDebugString && ba.setDebugString(((((\"filtered: ad account \" + ba.s_account)) + \" already selected\")))));\n                    continue;\n                }\n            ;\n            ;\n                if (w.hasOwnProperty(ba.uid)) {\n                    ((ba.setDebugString && ba.setDebugString(((((\"filtered: ad promoted id \" + ba.uid)) + \" already selected\")))));\n                    continue;\n                }\n            ;\n            ;\n                ((ba.setDebugString && ba.setDebugString(\"selected\")));\n                t.push(ba);\n                u[ba.s_account] = true;\n                v[ca] = true;\n                w[ba.uid] = true;\n                if (!n.isSelfPromoted(ba)) {\n                    ++x;\n                    if (((((x + o.length)) > r.maxNumberResultsAndAds))) {\n                        o.pop();\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n            };\n        ;\n            return t;\n        },\n        hasTopResult: function(o, p, q) {\n            if (((o == null))) {\n                return false;\n            }\n        ;\n        ;\n            if (((o.type == \"user\"))) {\n                return false;\n            }\n        ;\n        ;\n            if (((o.type == \"grammar\"))) {\n                return false;\n            }\n        ;\n        ;\n            if (((o.score > q.v0))) {\n                return true;\n            }\n        ;\n        ;\n            if (((o.s_value > q.v3))) {\n                return true;\n            }\n        ;\n        ;\n            if (((o.s_value > p.s_value))) {\n                return true;\n            }\n        ;\n        ;\n            var r = ((g(p) ? q.v4 : ((o.bootstrapped ? q.v1 : q.v2))));\n            if (((r < p.s_value))) {\n                return false;\n            }\n        ;\n        ;\n            return true;\n        },\n        setOrganicECPM: function(o, p) {\n            if (((o == null))) {\n                return;\n            }\n        ;\n        ;\n            for (var q = 0; ((q < p.length)); q++) {\n                if (o.hasOwnProperty(p[q].uid)) {\n                    p[q].s_value = o[p[q].uid];\n                }\n            ;\n            ;\n            };\n        ;\n            return;\n        },\n        buildResultIndices: function(o) {\n            var p = {\n            }, q = o.length;\n            for (var r = 0; ((r < q)); r++) {\n                p[o[r].uid] = r;\n            ;\n            };\n        ;\n            return p;\n        },\n        getTopAdPosition: function(o, p, q) {\n            if (((o.length < 1))) {\n                return null;\n            }\n        ;\n        ;\n            if (((p.length < 1))) {\n                return null;\n            }\n        ;\n        ;\n            if (((((o[0].type == \"user\")) || ((o[0].type == \"grammar\"))))) {\n                for (var r = 1; ((r < o.length)); ++r) {\n                    if (((o[r].type != o[0].type))) {\n                        return r;\n                    }\n                ;\n                ;\n                };\n            ;\n                return o.length;\n            }\n        ;\n        ;\n            if (n.hasTopResult(o[0], p[0], q)) {\n                return 1;\n            }\n        ;\n        ;\n            return 0;\n        }\n    };\n    e.exports = n;\n});\n__d(\"TypeaheadSearchSponsored\", [\"JSBNG__Event\",\"Arbiter\",\"CSS\",\"DOM\",\"URI\",\"copyProperties\",\"TypeaheadSearchSponsoredUtils\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"Arbiter\"), i = b(\"CSS\"), j = b(\"DOM\"), k = b(\"URI\"), l = b(\"copyProperties\"), m = b(\"TypeaheadSearchSponsoredUtils\"), n = b(\"tx\");\n    function o(p) {\n        this._typeahead = p;\n    };\n;\n    o.prototype.enable = function() {\n        this._data = this._typeahead.getData();\n        this._dataSubscriptions = [this._data.subscribe(\"beginFetchHandler\", function(p, q) {\n            var r = q.response.getPayload();\n            if (r.s_entries) {\n                this._sponsoredEntries = ((this._sponsoredEntries || {\n                }));\n                var s = r.s_entries.length;\n                for (var t = 0; ((t < s)); t++) {\n                    var u = new o.Ad();\n                    l(u, r.s_entries[t]);\n                    var v = u.s_target;\n                    if (!this._sponsoredEntries[v]) {\n                        this._sponsoredEntries[v] = {\n                        };\n                    }\n                ;\n                ;\n                    this._sponsoredEntries[v][u.uid] = u;\n                };\n            ;\n                if (r.s_bootstrap_id) {\n                    this._sBootstrapID = r.s_bootstrap_id;\n                }\n            ;\n            ;\n                if (r.organic_s_value) {\n                    this._organicECPM = l(this._organicECPM, r.organic_s_value);\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n        }.bind(this)),];\n        if (o.auctionOptions.bootstrap) {\n            this._dataSubscriptions.push(this._data.subscribe(\"JSBNG__onload\", function(p, q) {\n                var r = l(this.bootstrapData, {\n                    no_cache: 1,\n                    options: [\"sponsored\",]\n                });\n                this.fetch(this.bootstrapEndpoint, r, {\n                    type: \"sponsored\"\n                });\n            }.bind(this._data)));\n        }\n    ;\n    ;\n        this._view = this._typeahead.getView();\n        this._viewSubscriptions = [this._view.subscribe(\"finalResultsReordering\", function(p, q) {\n            o.query = q.value;\n            m.setOrganicECPM(this._organicECPM, q.results);\n            var r = o.getOriginalOrganics(q.results);\n            o.setAuctionOptions({\n                maxNumberResultsAndAds: Math.max(q.results.length, ((((this._data && this._data._maxResults)) || o.auctionOptions.maxNumberResultsAndAds)))\n            });\n            var s = this.runAuction(q.results, this._sponsoredEntries, this._hiddenSponsoredEntities, o.auctionOptions), t = m.prepareAndSortAds(q.results, this._sponsoredEntries, this._hiddenSponsoredEntities), u = t.map(function(y) {\n                return y.s_token;\n            }), v = [];\n            for (var w = 0; ((w < s.length)); w++) {\n                var x = s[w];\n                if (x.s_token) {\n                    v.push({\n                        position: w,\n                        is_self: x.is_self\n                    });\n                }\n            ;\n            ;\n            };\n        ;\n            this._view.inform(\"recordAfterReorder\", {\n                organic: r,\n                tokens: u,\n                position_data: v,\n                s_bootstrap_id: this._sBootstrapID,\n                options: o.auctionOptions,\n                variant: o.auctionOptions.rerankingStrategy\n            });\n            q.results = s;\n            this._data.inform(\"recordAuctionState\", {\n                organic: r,\n                auctionOptions: o.auctionOptions,\n                event_data: q\n            });\n        }.bind(this)),this._view.subscribe(\"highlight\", function(p, q) {\n            if (this._view.JSBNG__content) {\n                j.scry(this._view.JSBNG__content, \"a.report\").forEach(i.hide);\n            }\n        ;\n        ;\n            if (((((!q.element || !q.selected)) || !q.selected.s_token))) {\n                return;\n            }\n        ;\n        ;\n            var r = j.scry(q.element, \"a.report\");\n            if (r.length) {\n                i.show(r[0]);\n            }\n             else j.appendContent(q.element, this._createHideAdLink(q.selected));\n        ;\n        ;\n        }.bind(this)),];\n        this._globalSubscriptions = [h.subscribe(\"TypeaheadSearchSponsored/hideAdResult\", function(p, q) {\n            this._hiddenSponsoredEntities = ((this._hiddenSponsoredEntities || {\n            }));\n            this._hiddenSponsoredEntities[q.uid] = true;\n            this._hideReasonDialog = q.reason_dialog;\n            this._forceRefreshResults();\n        }.bind(this)),h.subscribe(\"TypeaheadSearchSponsored/undoHideAdResult\", function(p, q) {\n            if (this._hiddenSponsoredEntities) {\n                delete this._hiddenSponsoredEntities[q.uid];\n            }\n        ;\n        ;\n            if (this._hideReasonDialog) {\n                this._hideReasonDialog.hide();\n                this._hideReasonDialog = null;\n            }\n        ;\n        ;\n            this._forceRefreshResults();\n        }.bind(this)),];\n    };\n    o.prototype.disable = function() {\n        this._dataSubscriptions.forEach(this._data.unsubscribe.bind(this._data));\n        this._dataSubscriptions = null;\n        this._viewSubscriptions.forEach(this._view.unsubscribe.bind(this._view));\n        this._viewSubscriptions = null;\n        this._globalSubscriptions.forEach(h.unsubscribe.bind(h));\n        this._globalSubscriptions = null;\n        this._data = null;\n        this._view = null;\n        this._sponsoredEntries = null;\n    };\n    o.prototype.runAuction = function(p, q, r, s) {\n        if (((p.length === 0))) {\n            return p;\n        }\n    ;\n    ;\n        p = o.initResults(p);\n        if (!q) {\n            return p;\n        }\n    ;\n    ;\n        var t = m.prepareAndSortAds(p, q, r);\n        if (this._typeahead) {\n            var u = this._typeahead.getData();\n            u.inform(\"recordAuctionState\", {\n                sorted_ads: t\n            });\n        }\n    ;\n    ;\n        var v = {\n        }, w = p.map(function(ba) {\n            if (ba.s_categories) {\n                v[ba.uid] = ba.s_categories;\n            }\n        ;\n        ;\n            return String(ba.uid);\n        }), x = m.selectAds(w, v, t, s);\n        if (((x.length === 0))) {\n            return p;\n        }\n    ;\n    ;\n        if (m.hasTopResult(p[0], x[0], s)) {\n            o.setTopResult(p);\n        }\n    ;\n    ;\n        var y = 0;\n        for (var z = 0; ((z < x.length)); ++z) {\n            if (!m.isSelfPromoted(x[z])) {\n                y++;\n            }\n        ;\n        ;\n        };\n    ;\n        p.length = Math.min(p.length, ((s.maxNumberResultsAndAds - y)));\n        var aa = o.rerankAds(p, x, s);\n        return aa;\n    };\n    o.prototype._forceRefreshResults = function() {\n        if (((this._data && this._data.value))) {\n            this._data.respond(this._data.value, this._data.buildUids(this._data.value));\n        }\n    ;\n    ;\n    };\n    o.prototype._createHideAdLink = function(p) {\n        var q = new k(\"/ajax/emu/end.php\").addQueryData({\n            eid: p.s_token,\n            f: 0,\n            ui: ((\"typeahead_\" + p.s_token.replace(\".\", \"_\"))),\n            en: \"fad_hide\",\n            ed: \"true\",\n            a: 1\n        }).toString(), r = {\n            className: \"report\",\n            rel: \"dialog-post\",\n            href: \"#\",\n            ajaxify: q,\n            title: \"Hide the ad\"\n        }, s = j.create(\"a\", r);\n        g.listen(s, \"mouseover\", function(JSBNG__event) {\n            this._view.index = -1;\n            this._view.highlight(-1, false);\n            JSBNG__event.kill();\n        }.bind(this));\n        return s;\n    };\n    o.auctionOptions = {\n    };\n    o.query = null;\n    o.getOriginalOrganics = function(p) {\n        return p.map(function(q) {\n            return {\n                uid: q.uid,\n                text: q.text,\n                type: o.getRealType(q),\n                source: ((q.bootstrapped ? 1 : 0)),\n                index: q.index,\n                s_value: ((q.s_value || 0)),\n                s_categories: ((q.s_categories || [])),\n                score: q.score\n            };\n        });\n    };\n    o.setTopResult = function(p) {\n        p[0].renderTypeOverride = true;\n        p[0].orig_render_type = p[0].render_type;\n        p[0].render_type = \"tophit\";\n    };\n    o.finalizeAd = function(p, q, r) {\n        var s = \"Sponsored\";\n        p.rankType = ((((p.rankType || p.render_type)) || p.type));\n        if (m.isSelfPromoted(p)) {\n            q.s_token = p.s_token;\n            q.message = p.s_message;\n            if (((r.rerankingStrategy === 0))) {\n                q.subtextOverride = ((q.subtext ? ((((q.subtext + \" \\u00b7 \")) + s)) : s));\n            }\n        ;\n        ;\n            if (p.path) {\n                q.pathOverride = true;\n                q.orig_path = q.path;\n                q.path = p.path;\n            }\n        ;\n        ;\n            q.is_self = true;\n        }\n         else {\n            p.message = p.s_message;\n            p.subtextOverride = null;\n            if (((r.rerankingStrategy === 0))) {\n                p.subtextOverride = ((p.subtext ? ((((p.subtext + \" \\u00b7 \")) + s)) : s));\n            }\n        ;\n        ;\n            if (r.debug) {\n                if (((!p.subtextOverride && p.subtext))) {\n                    p.subtextOverride = p.subtext;\n                }\n            ;\n            ;\n                if (p.subtextOverride) {\n                    p.subtextOverride += ((((\" \\u00b7 (Debug: \" + q.text)) + \")\"));\n                }\n                 else p.subtextOverride = ((((\"(Debug: \" + q.text)) + \")\"));\n            ;\n            ;\n            }\n        ;\n        ;\n            p.type = q.type;\n            p.render_type = q.render_type;\n            p.is_self = false;\n        }\n    ;\n    ;\n    };\n    o.promoteSelfPromotedResultToTop = function(p, q, r, s) {\n        var t = p[q];\n        if (((q < r))) {\n            var u = \"Sponsored\";\n            t.subtextOverride = ((t.subtext ? ((((t.subtext + \" \\u00b7 \")) + u)) : u));\n            return;\n        }\n    ;\n    ;\n        if (((q > r))) {\n            p.splice(r, 0, p.splice(q, 1)[0]);\n        }\n    ;\n    ;\n        t = p[r];\n        t.renderTypeOverride = true;\n        t.orig_render_type = t.render_type;\n        t.render_type = \"ownsection\";\n    };\n    o.insertAdToTop = function(p, q, r, s) {\n        p.splice(r, 0, q);\n        q.render_type = \"ownsection\";\n    };\n    o.rerankMethod5 = function(p, q, r) {\n        if (((r.rerankingStrategy != 5))) {\n            return;\n        }\n    ;\n    ;\n        var s = m.getTopAdPosition(p, q, r), t = m.buildResultIndices(p);\n        for (var u = ((q.length - 1)); ((u >= 0)); u--) {\n            var v = q[u], w = t[v.selected_target_id], x = p[w];\n            o.finalizeAd(v, x, r);\n            if (m.isSelfPromoted(v)) {\n                o.promoteSelfPromotedResultToTop(p, w, s, r);\n            }\n             else o.insertAdToTop(p, v, s, r);\n        ;\n        ;\n            t = m.buildResultIndices(p);\n        };\n    ;\n    };\n    o.rerankAds = function(p, q, r) {\n        switch (r.rerankingStrategy) {\n          case 5:\n            o.rerankMethod5(p, q, r);\n            break;\n          default:\n            break;\n        };\n    ;\n        p.length = Math.min(p.length, r.maxNumberResultsAndAds);\n        return p;\n    };\n    o.initResults = function(p) {\n        var q = p.length;\n        for (var r = 0; ((r < q)); r++) {\n            var s = p[r];\n            s.is_self = null;\n            s.s_token = null;\n            s.message = null;\n            s.subtextOverride = null;\n            if (s.pathOverride) {\n                s.path = s.orig_path;\n                s.pathOverride = false;\n            }\n        ;\n        ;\n            if (s.renderTypeOverride) {\n                s.render_type = s.orig_render_type;\n                s.renderTypeOverride = false;\n            }\n        ;\n        ;\n            s.rankType = ((((s.rankType || s.render_type)) || s.type));\n        };\n    ;\n        return p;\n    };\n    o.setAuctionOptions = function(p) {\n        l(o.auctionOptions, p);\n    };\n    o.getRealType = function(p) {\n        if (p.renderTypeOverride) {\n            return ((p.orig_render_type || p.type));\n        }\n    ;\n    ;\n        return ((p.render_type || p.type));\n    };\n    o.hideAdResult = function(p, q) {\n        h.inform(\"TypeaheadSearchSponsored/hideAdResult\", {\n            uid: p,\n            reason_dialog: q\n        });\n    };\n    o.undoHideAdResult = function(p) {\n        h.inform(\"TypeaheadSearchSponsored/undoHideAdResult\", {\n            uid: p\n        });\n    };\n    o.Ad = function() {\n    \n    };\n    l(o.prototype, {\n        _dataSubscriptions: null,\n        _viewSubscriptions: null,\n        _globalSubscriptions: null,\n        _data: null,\n        _view: null,\n        _sponsoredEntries: null,\n        _hiddenSponsoredEntities: null,\n        _hideReasonDialog: null,\n        _sBootstrapID: null,\n        _organicECPM: null\n    });\n    e.exports = o;\n});\n__d(\"legacy:SearchSponsoredTypeaheadBehavior\", [\"TypeaheadSearchSponsored\",], function(a, b, c, d) {\n    var e = b(\"TypeaheadSearchSponsored\");\n    if (!a.TypeaheadBehaviors) {\n        a.TypeaheadBehaviors = {\n        };\n    }\n;\n;\n    a.TypeaheadBehaviors.searchSponsored = function(f) {\n        f.enableBehavior(e);\n    };\n}, 3);\n__d(\"legacy:TypeaheadSearchSponsored\", [\"TypeaheadSearchSponsored\",], function(a, b, c, d) {\n    a.TypeaheadSearchSponsored = b(\"TypeaheadSearchSponsored\");\n}, 3);\n__d(\"SearchDataSource\", [\"JSBNG__Event\",\"Arbiter\",\"AsyncResponse\",\"DataSource\",\"HashtagSearchResultUtils\",\"copyProperties\",\"createArrayFrom\",\"BingScalingCommon\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"Arbiter\"), i = b(\"AsyncResponse\"), j = b(\"DataSource\"), k = b(\"HashtagSearchResultUtils\"), l = b(\"copyProperties\"), m = b(\"createArrayFrom\"), n = b(\"BingScalingCommon\"), o = ((((j === null)) ? null : j.prototype));\n    p.prototype = Object.create(o);\n    p.prototype.constructor = p;\n    p.__superConstructor__ = j;\n    function p(q) {\n        this._token = ((q.token || \"\"));\n        this._lazyonload = ((((q.lazyonload === false)) ? false : true));\n        this._extraTypes = q.extraTypes;\n        this._buckets = q.buckets;\n        this._noMultiFetch = ((q.noMultiFetch || false));\n        this._maxWebSuggToCountFetchMore = ((q.maxWebSuggToCountFetchMore || 0));\n        var r = ((q.maxResults || 8));\n        j.call(this, q);\n        this._numResults = {\n            min: 3,\n            max: r\n        };\n        this.recordingRoute = ((q.recordingRoute || \"non_banzai\"));\n        this._enabledHashtag = ((q.enabledHashtag || false));\n        this.logBackendQueriesWindow = ((q.logBackendQueriesWindow || 25));\n        this._minWebSugg = ((q.minWebSugg || 2));\n        this._queryToWebSuggState = {\n        };\n        this._genTime = q.genTime;\n    };\n;\n    p.prototype.init = function() {\n        o.init.call(this);\n        this._leanPayload = null;\n        this._bootstrapRequestsPending = 0;\n        this._criticalOnly = true;\n        this._updateMaxResults();\n        g.listen(window, \"resize\", this._updateMaxResults.bind(this));\n        this.complexChars = new RegExp(\"[\\uff66-\\uffdd\\u4e00-\\u9fcc\\u3400-\\u4dbf]\");\n    };\n    p.prototype.dirty = function() {\n        o.dirty.call(this);\n        this._fetchOnUseRequests = [];\n    };\n    p.prototype.asyncErrorHandler = function(q) {\n        if (((((window.Dialog && ((window.Dialog.getCurrent() == null)))) && ((q.getError() == 1400003))))) {\n            i.verboseErrorHandler(q);\n        }\n    ;\n    ;\n    };\n    p.prototype.fetch = function(q, r, s) {\n        s = ((s || {\n        }));\n        s.fetch_start = JSBNG__Date.now();\n        o.fetch.call(this, q, r, s);\n    };\n    p.prototype.fetchHandler = function(q, r) {\n        var s = q.getPayload(), t = l({\n            fetch_end: JSBNG__Date.now()\n        }, r), u = ((t.value ? h.BEHAVIOR_EVENT : h.BEHAVIOR_PERSISTENT));\n        this.inform(\"beginFetchHandler\", {\n            response: q\n        });\n        if (((r.type == \"lean\"))) {\n            this._leanPayload = s;\n            this._processLean();\n        }\n         else {\n            if (s.coeff2_ts) {\n                t.coeff2_ts = s.coeff2_ts;\n            }\n        ;\n        ;\n            var v = {\n                limit: ((((typeof s.webSuggLimit !== \"undefined\")) ? s.webSuggLimit : 6)),\n                showOnTop: ((((typeof s.webSuggOnTop !== \"undefined\")) ? s.webSuggOnTop : false))\n            };\n            this._queryToWebSuggState[r.value] = v;\n            o.fetchHandler.call(this, q, r);\n            if (((r.bootstrap && !q.getRequest().getData().no_cache))) {\n                t.browserCacheHit = ((s.timestamp < this._genTime));\n            }\n        ;\n        ;\n            if (((((r.bootstrap && !s.no_data)) && ((this._bootstrapRequestsPending > 0))))) {\n                r.bootstrap = false;\n                --this._bootstrapRequestsPending;\n                ((!this._bootstrapRequestsPending && this._bootstrapPostProcess()));\n            }\n        ;\n        ;\n            if (((((s.no_data || s.stale)) || ((s.token !== this._token))))) {\n                var w = l({\n                }, q.getRequest().getData());\n                if (w.lazy) {\n                    delete w.lazy;\n                    w.token = this._token;\n                    this._fetchOnUse(w, r);\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n        this.inform(\"endpointStats\", t, u);\n    };\n    p.prototype.respond = function(q, r, s) {\n        this.inform(\"respondValidUids\", r);\n        this.inform(\"reorderResults\", r);\n        var t = this.buildData(r, q);\n        t.forEach(function(u, v) {\n            u.origIndex = v;\n        });\n        this.inform(\"respond\", {\n            value: q,\n            results: t,\n            isAsync: !!s\n        });\n        return t;\n    };\n    p.prototype.buildData = function(q, r) {\n        if (((!q || ((q.length === 0))))) {\n            return [];\n        }\n    ;\n    ;\n        var s = this.getWebSuggState(r), t = s.showOnTop, u = n.integrateWebsuggestions(q.map(this.getEntry.bind(this)), Boolean(t), this._maxResults, s.limit);\n        u.length = Math.min(u.length, this._maxResults);\n        return u;\n    };\n    p.prototype.getWebSuggState = function(q) {\n        while (q) {\n            var r = this._queryToWebSuggState[q];\n            if (((typeof r !== \"undefined\"))) {\n                return r;\n            }\n        ;\n        ;\n            q = q.slice(0, ((q.length - 1)));\n        };\n    ;\n        return {\n            limit: 0,\n            showOnTop: false\n        };\n    };\n    p.prototype._isQueryTooShort = function(q) {\n        return ((((q.length < this._minQueryLength)) && !((this.complexChars && this.complexChars.test(q)))));\n    };\n    p.prototype.shouldFetchMoreResults = function(q) {\n        var r = 0, s = 0;\n        q.forEach(function(t) {\n            if (((((t.type !== \"websuggestion\")) || ((s++ < this._maxWebSuggToCountFetchMore))))) {\n                r++;\n            }\n        ;\n        ;\n        }.bind(this));\n        return ((r < this._maxResults));\n    };\n    p.prototype._bootstrapPostProcess = function() {\n        var q = {\n            time: JSBNG__Date.now()\n        };\n        this.inform(\"bootstrapped\", q, h.BEHAVIOR_PERSISTENT);\n        this._processLean();\n    };\n    p.prototype._processLean = function() {\n        if (this._leanPayload) {\n            var q, r = this._leanPayload.entries;\n            {\n                var fin279keys = ((window.top.JSBNG_Replay.forInKeys)((r))), fin279i = (0);\n                var s;\n                for (; (fin279i < fin279keys.length); (fin279i++)) {\n                    ((s) = (fin279keys[fin279i]));\n                    {\n                        q = this.getEntry(s);\n                        ((q && (q.index = r[s])));\n                    };\n                };\n            };\n        ;\n            this.setExclusions(this._leanPayload.blocked);\n            this._leanPayload = null;\n        }\n    ;\n    ;\n    };\n    p.prototype._updateMaxResults = function() {\n        var q = ((window.JSBNG__innerHeight || JSBNG__document.documentElement.clientHeight));\n        this.setMaxResults(Math.max(this._numResults.min, Math.min(this._numResults.max, Math.ceil(((2 + ((((q - 370)) / 56))))))));\n    };\n    p.prototype._bootstrapFetch = function(q, r) {\n        var s = l(r, this.bootstrapData);\n        if (((this._criticalOnly && this._lazyonload))) {\n            s.lazy = 1;\n        }\n    ;\n    ;\n        this.fetch(this.bootstrapEndpoint, s, {\n            bootstrap: true,\n            type: q\n        });\n        ++this._bootstrapRequestsPending;\n    };\n    p.prototype._fetchOnUse = function(q, r) {\n        {\n            var fin280keys = ((window.top.JSBNG_Replay.forInKeys)((this.bootstrapData))), fin280i = (0);\n            var s;\n            for (; (fin280i < fin280keys.length); (fin280i++)) {\n                ((s) = (fin280keys[fin280i]));\n                {\n                    ((!q.hasOwnProperty(s) && (q[s] = this.bootstrapData[s])));\n                ;\n                };\n            };\n        };\n    ;\n        if (this._criticalOnly) {\n            this._fetchOnUseRequests.push({\n                args: q,\n                ctx: r\n            });\n        }\n         else this.fetch(this.bootstrapEndpoint, q, r);\n    ;\n    ;\n    };\n    p.prototype._fetchLean = function() {\n        var q = {\n            no_cache: 1\n        };\n        q.options = m(q.options);\n        q.options.push(\"lean\");\n        this._fetchOnUse(q, {\n            type: \"lean\"\n        });\n    };\n    p.prototype.bootstrap = function(q) {\n        if (!q) {\n            this._criticalOnly = false;\n            this._flushFetchOnUseRequests();\n        }\n    ;\n    ;\n        if (this._bootstrapped) {\n            return;\n        }\n    ;\n    ;\n        var r = {\n            filter: [\"JSBNG__event\",],\n            no_cache: 1\n        };\n        this._fetchOnUse(r, {\n            type: \"JSBNG__event\"\n        });\n        var s = [\"app\",\"page\",\"group\",\"friendlist\",];\n        s = s.concat(((this._extraTypes || [])));\n        if (this._noMultiFetch) {\n            s.push(\"user\");\n            this._bootstrapFetch(\"user\", {\n                filter: s\n            });\n        }\n         else {\n            this._bootstrapFetch(\"other\", {\n                filter: s\n            });\n            if (this._buckets) {\n                for (var t = 0; ((t < this._buckets.length)); ++t) {\n                    var u = {\n                        filter: [\"user\",],\n                        buckets: this._buckets[t]\n                    };\n                    this._bootstrapFetch(\"user\", u);\n                };\n            ;\n            }\n             else this._bootstrapFetch(\"user\", {\n                filter: [\"user\",]\n            });\n        ;\n        ;\n        }\n    ;\n    ;\n        this._fetchLean();\n        this._bootstrapped = true;\n    };\n    p.prototype._flushFetchOnUseRequests = function() {\n        var q = this._fetchOnUseRequests.length;\n        for (var r = 0; ((r < q)); ++r) {\n            var s = this._fetchOnUseRequests[r];\n            this.fetch(this.bootstrapEndpoint, s.args, s.ctx);\n        };\n    ;\n        if (((q > 0))) {\n            this.inform(\"extra_bootstrap\", {\n                time: JSBNG__Date.now()\n            }, h.BEHAVIOR_PERSISTENT);\n        }\n    ;\n    ;\n        this._fetchOnUseRequests = [];\n    };\n    p.prototype.onLoad = function(q, r) {\n        this.inform(\"JSBNG__onload\", {\n            time: JSBNG__Date.now()\n        }, h.BEHAVIOR_PERSISTENT);\n        if (q) {\n            this.bootstrap.bind(this, r).defer();\n        }\n    ;\n    ;\n    };\n    p.prototype.mergeUids = function(q, r, s, t) {\n        var u = this.getDynamicHashtagResult(t);\n        if (((((t && u)) && ((r.indexOf(u) <= 0))))) {\n            r.unshift(u);\n        }\n    ;\n    ;\n        var v = ((s[0] ? this.getEntry(s[0]) : null)), w = ((r[0] ? this.getEntry(r[0]) : null)), x = ((((v && v.replace_results)) ? v : null));\n        x = ((((((!x && w)) && w.replace_results)) ? w : x));\n        var y = o.mergeUids.call(this, q, r, s, t);\n        if (x) {\n            this.inform(\"backend_topreplace\", {\n            });\n            return this.deduplicateByKey([x.uid,].concat(y));\n        }\n    ;\n    ;\n        return y;\n    };\n    p.prototype.getTextToIndexFromFields = function(q, r) {\n        var s = [], t = ((q.tokenVersion === \"v2\"));\n        for (var u = 0; ((u < r.length)); ++u) {\n            if (((t && ((((r[u] === \"text\")) || ((r[u] === \"alias\"))))))) {\n                continue;\n            }\n        ;\n        ;\n            var v = q[r[u]];\n            if (v) {\n                s.push(((v.join ? v.join(\" \") : v)));\n            }\n        ;\n        ;\n        };\n    ;\n        return s.join(\" \");\n    };\n    p.prototype.getDynamicHashtagResult = function(q) {\n        if (((!q || !this._enabledHashtag))) {\n            return;\n        }\n    ;\n    ;\n        var r = k.getHashtagFromQuery(q);\n        if (!r) {\n            return;\n        }\n    ;\n    ;\n        var s = ((\"hashtag:\" + r)), t = this.getEntry(s);\n        if (!t) {\n            this.processEntries([k.makeTypeaheadResult(r),], q);\n        }\n    ;\n    ;\n        return s;\n    };\n    e.exports = p;\n});\n__d(\"legacy:SearchDataSource\", [\"SearchDataSource\",], function(a, b, c, d) {\n    a.SearchDataSource = b(\"SearchDataSource\");\n}, 3);\n__d(\"SearchTypeaheadCore\", [\"JSBNG__Event\",\"function-extensions\",\"Arbiter\",\"Class\",\"DOM\",\"Input\",\"Parent\",\"TypeaheadCore\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\");\n    b(\"function-extensions\");\n    var h = b(\"Arbiter\"), i = b(\"Class\"), j = b(\"DOM\"), k = b(\"Input\"), l = b(\"Parent\"), m = b(\"TypeaheadCore\"), n = b(\"copyProperties\"), o = ((((m === null)) ? null : m.prototype));\n    p.prototype = Object.create(o);\n    p.prototype.constructor = p;\n    p.__superConstructor__ = m;\n    function p(q) {\n        m.call(this, q);\n    };\n;\n    p.prototype.init = function(q, r, s) {\n        o.init.call(this, q, r, s);\n        var t = l.byTag(s, \"form\"), u = this.reset.bind(this);\n        h.subscribe(\"pre_page_transition\", function(JSBNG__event, w) {\n            var x = /^\\/search/, y = x.test(w.from.path), z = x.test(w.to.path);\n            if (((y && !z))) {\n                u.defer();\n            }\n        ;\n        ;\n        });\n        if (t) {\n            var v = j.JSBNG__find(t, \"input.search_sid_input\");\n            g.listen(t, \"submit\", function() {\n                if (((this.data && this.data.queryData))) {\n                    v.value = this.data.queryData.sid;\n                }\n            ;\n            ;\n                u.defer();\n            }.bind(this), g.Priority.URGENT);\n        }\n    ;\n    ;\n    };\n    p.prototype.select = function() {\n        this.reset();\n        this.element.JSBNG__focus();\n        (function() {\n            this.element.JSBNG__blur();\n        }).bind(this).defer();\n    };\n    p.prototype.handleTab = function(JSBNG__event) {\n        var q = this.view.getQuerySuggestion(this.value);\n        if (q) {\n            k.setValue(this.element, q);\n            this.checkValue();\n            JSBNG__event.kill();\n        }\n         else o.handleTab.call(this, JSBNG__event);\n    ;\n    ;\n    };\n    p.prototype.getSearchType = function() {\n        return \"regular\";\n    };\n    e.exports = p;\n});\n__d(\"legacy:SearchTypeaheadCore\", [\"SearchTypeaheadCore\",], function(a, b, c, d) {\n    a.SearchTypeaheadCore = b(\"SearchTypeaheadCore\");\n}, 3);\n__d(\"SearchTypeaheadView\", [\"Arbiter\",\"ContextualTypeaheadView\",\"ContextualLayerUpdateOnScroll\",\"copyProperties\",\"DOM\",\"goURI\",\"MusicConstants\",\"MusicEvents\",\"tx\",\"URI\",\"isEmail\",\"fbt\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ContextualTypeaheadView\"), i = b(\"ContextualLayerUpdateOnScroll\"), j = b(\"copyProperties\"), k = b(\"DOM\"), l = b(\"goURI\"), m = b(\"MusicConstants\"), n = b(\"MusicEvents\"), o = b(\"tx\"), p = b(\"URI\"), q = b(\"isEmail\"), r = b(\"fbt\"), s = ((((h === null)) ? null : h.prototype));\n    t.prototype = Object.create(s);\n    t.prototype.constructor = t;\n    t.__superConstructor__ = h;\n    function t(v, w) {\n        h.call(this, v, w);\n    };\n;\n    t.prototype.initializeLayer = function() {\n        s.initializeLayer.call(this);\n        this.layer.setOffsetY(-1);\n        this.layer.enableBehavior(i);\n    };\n    t.prototype.ignoreClick = function(JSBNG__event) {\n        JSBNG__event.prevent();\n    };\n    t.prototype.render = function(v, w, x) {\n        if (this._bucketize) {\n            w = u(w);\n        }\n    ;\n    ;\n        var y = {\n            results: w,\n            value: v\n        };\n        this.inform(\"finalResultsReordering\", y);\n        return s.render.call(this, v, y.results, x);\n    };\n    t.prototype.disableBucketization = function() {\n        this._bucketize = false;\n    };\n    t.prototype.buildBuckets = function(v, w) {\n        var x = w.length, y = 0, z;\n        for (z = 0; ((z < x)); ++z) {\n            if (((w[z].type == \"user\"))) {\n                y++;\n            }\n        ;\n        ;\n        };\n    ;\n        this._redirectToUsersResultsPage = ((this.showFilterResults && ((y === x))));\n        this.setWebSuggLoggingParams(v, w);\n        if (this._bucketize) {\n            w = s.buildBuckets.call(this, v, w);\n        }\n    ;\n    ;\n        if (((v && this._shouldShowSeeMore))) {\n            w.push(this.buildSeeMore(v, x));\n            if (((q(v) && ((y < 1))))) {\n                w.push(this.buildInvite(v));\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n        return w;\n    };\n    t.prototype.buildSeeMore = function(v, w) {\n        var x = this.getSeeMoreText(v, w), y = ((((w == 1)) ? \"Displaying top result\" : o._(\"Displaying top {number} results\", {\n            number: w\n        }))), z = k.create(\"li\", {\n            className: \"calltoaction\"\n        }, [k.create(\"a\", {\n            href: this.getSeeMoreEndpoint(v),\n            rel: \"ignore\"\n        }, [k.create(\"span\", {\n            className: \"text\"\n        }, [k.create(\"span\", {\n            className: \"seeMore\"\n        }, [x,k.create(\"span\", {\n            className: \"arrow\"\n        }),]),k.create(\"span\", {\n            className: \"subtext\"\n        }, [y,]),]),]),]);\n        z.setAttribute(\"aria-label\", x);\n        return {\n            uid: \"search\",\n            node: z,\n            search: true\n        };\n    };\n    t.prototype.getSeeMoreText = function(v, w) {\n        if (this.showKeywordResultsPage) {\n            return r._(\"Search for {query}\", [r.param(\"query\", v),]);\n        }\n    ;\n    ;\n        if (((w <= 0))) {\n            return o._(\"See results for {query}\", {\n                query: v\n            });\n        }\n    ;\n    ;\n        if (this._redirectToUsersResultsPage) {\n            return r._(\"Filter results for {query}\", [r.param(\"query\", v),]);\n        }\n    ;\n    ;\n        return o._(\"See more results for {query}\", {\n            query: v\n        });\n    };\n    t.prototype.buildInvite = function(v) {\n        var w = o._(\"Invite {query} to Facebook\", {\n            query: v\n        }), x = k.create(\"li\", {\n            className: \"calltoaction\"\n        }, [k.create(\"a\", {\n            href: this.getInviteEndpoint(v),\n            rel: \"ignore\"\n        }, [k.create(\"span\", {\n            className: \"text\"\n        }, [k.create(\"span\", {\n            className: \"invite\"\n        }, [w,]),]),]),]);\n        x.setAttribute(\"aria-label\", w);\n        return {\n            uid: \"invite\",\n            node: x,\n            search: true\n        };\n    };\n    t.prototype.searchPageQueryData = function(v) {\n        return j({\n            q: v\n        }, ((this.queryData || {\n        })));\n    };\n    t.prototype.searchPageTypeData = function() {\n        return ((this._redirectToUsersResultsPage ? {\n            type: \"users\"\n        } : {\n        }));\n    };\n    t.prototype.select = function(v) {\n        var w = this.index, x = this.results[w];\n        if (((!x || ((x.type == \"header\"))))) {\n            return;\n        }\n    ;\n    ;\n        var y = this.items[w], z = k.scry(y, \"a\")[0];\n        if (x.song) {\n            if (z) {\n                n.inform(m.MUSIC_BUTTON.ACTIVATE, z);\n            }\n        ;\n        ;\n            ((v && this.inform(\"highlight\", {\n                index: w,\n                selected: x\n            })));\n        }\n         else {\n            s.select.call(this, v);\n            if (((z && z.href))) {\n                if (((z.target == \"_blank\"))) {\n                    window.open(z.href);\n                }\n                 else l(z.href);\n            ;\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n    };\n    t.prototype.setSid = function(v) {\n        this.queryData.tas = v;\n    };\n    t.prototype.getSeeMoreEndpoint = function(v) {\n        return p(this.seeMoreEndpoint).addQueryData(this.searchPageQueryData(v)).addQueryData(this.searchPageTypeData()).toString();\n    };\n    t.prototype.getInviteEndpoint = function(v) {\n        return p(\"/invite.php\").addQueryData({\n            email_list: v\n        });\n    };\n    t.prototype.show = function() {\n        if (!this.isVisible()) {\n            g.inform(\"layer_shown\", {\n                type: \"SearchTypeahead\"\n            });\n            s.show.call(this);\n        }\n    ;\n    ;\n    };\n    t.prototype.hide = function() {\n        if (this.isVisible()) {\n            g.inform(\"layer_hidden\", {\n                type: \"SearchTypeahead\"\n            });\n            s.hide.call(this);\n        }\n    ;\n    ;\n    };\n    t.prototype.getQuerySuggestion = function(v) {\n        var w = this.results[this.index], x = ((((w && ((w.type != \"header\")))) ? w.text.toLowerCase() : \"\"));\n        return ((((x == v.toLowerCase())) ? \"\" : x));\n    };\n    t.prototype.setWebSuggLoggingParams = function(v, w) {\n        var x = 0, y = 0;\n        for (var z = 0; ((z < w.length)); z++) {\n            if (((w[z].type === \"websuggestion\"))) {\n                if (((y === 0))) {\n                    y = ((z + 1));\n                }\n            ;\n            ;\n                var aa = ((((((\"FR\" + ((z - x)))) + \"AS\")) + x)), ba = ((z + 1));\n                w[z].path += ((((((((((\"&wssk=\" + aa)) + \"&wssp=\")) + ba)) + \"&wspq=\")) + encodeURIComponent(v)));\n                w[z].path += ((\"&wssrc=\" + w[z].websuggestion_source));\n                x++;\n            }\n        ;\n        ;\n        };\n    ;\n        var ca = ((((((((((((((\"&wssc=\" + w.length)) + \"-\")) + v.length)) + \"&wsbp=\")) + x)) + \"-\")) + y));\n        for (z = 0; ((z < w.length)); z++) {\n            if (((w[z].type === \"websuggestion\"))) {\n                w[z].path += ca;\n            }\n        ;\n        ;\n        };\n    ;\n    };\n    function u(v) {\n        var w, x, y, z, aa = [], ba = {\n        };\n        x = v.length;\n        for (w = 0; ((w < x)); w++) {\n            y = v[w];\n            z = ((y.render_type || y.type));\n            if (!ba.hasOwnProperty(z)) {\n                ba[z] = aa.length;\n                aa.push([]);\n            }\n        ;\n        ;\n            aa[ba[z]].push(y);\n        };\n    ;\n        var ca = [];\n        x = aa.length;\n        for (w = 0; ((w < x)); ++w) {\n            y = aa[w][0];\n            z = ((y.render_type || y.type));\n            ca = ca.concat(aa[w]);\n        };\n    ;\n        return ca;\n    };\n;\n    j(t.prototype, {\n        _shouldShowSeeMore: true,\n        _bucketize: true,\n        queryData: {\n            init: \"quick\"\n        }\n    });\n    e.exports = t;\n});\n__d(\"legacy:SearchTypeaheadView\", [\"SearchTypeaheadView\",], function(a, b, c, d) {\n    a.SearchTypeaheadView = b(\"SearchTypeaheadView\");\n}, 3);\n__d(\"legacy:Typeahead\", [\"Typeahead\",], function(a, b, c, d) {\n    a.Typeahead = b(\"Typeahead\");\n}, 3);\n__d(\"SearchTypeaheadRecorder\", [\"JSBNG__Event\",\"AsyncRequest\",\"Banzai\",\"Keys\",\"TypeaheadUtil\",\"Vector\",\"ge\",\"clickRefAction\",\"copyProperties\",\"userAction\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"AsyncRequest\"), i = b(\"Banzai\"), j = b(\"Keys\"), k = b(\"TypeaheadUtil\"), l = b(\"Vector\"), m = b(\"ge\"), n = b(\"clickRefAction\"), o = b(\"copyProperties\"), p = b(\"userAction\");\n    function q(s) {\n        this.init(s);\n        this.initEvents();\n    };\n;\n    q.prototype.init = function(s) {\n        this.core = s.getCore();\n        this.data = s.getData();\n        this.view = s.getView();\n        this.element = this.core.getElement();\n        this.initTime = JSBNG__Date.now();\n        this._onloadTime = 0;\n        this._extraRecorder = [];\n        var t = m(\"search_first_focus\");\n        this.initStartTime = ((t && t.value));\n        this.bootstrapStats = {\n            bootstrapped: 0\n        };\n        this._reset();\n    };\n    q.prototype._reset = function() {\n        this.stats = {\n        };\n        this.avgStats = {\n        };\n        this.appendStats = {\n        };\n        this._backspacing = false;\n        this.backendQueries = [];\n        this._topreplace = false;\n        this._inflightRequests = {\n        };\n        this._reorderInfo = null;\n        var s = Math.JSBNG__random().toString();\n        this.data.setQueryData({\n            sid: s\n        });\n        this.view.setSid(s);\n        this.recordStat(\"sid\", s);\n    };\n    q.prototype.initEvents = function() {\n        this.core.subscribe(\"JSBNG__focus\", function(JSBNG__event) {\n            if (!this.stats.session_start_time) {\n                this.recordStat(\"session_start_time\", JSBNG__Date.now());\n            }\n        ;\n        ;\n        }.bind(this));\n        this.core.subscribe(\"JSBNG__blur\", function(JSBNG__event) {\n            var s = JSBNG__Date.now();\n            {\n                var fin281keys = ((window.top.JSBNG_Replay.forInKeys)((this._inflightRequests))), fin281i = (0);\n                var t;\n                for (; (fin281i < fin281keys.length); (fin281i++)) {\n                    ((t) = (fin281keys[fin281i]));\n                    {\n                        var u = this._inflightRequests[t], v = ((s - u));\n                        this.recordAvgStat(\"search_endpoint_ms_from_js\", v);\n                    };\n                };\n            };\n        ;\n            this.recordStat(\"session_end_time\", s);\n            this.submit();\n        }.bind(this));\n        this.view.subscribe(\"select\", function(s, t) {\n            this.recordSelectInfo(t);\n        }.bind(this));\n        this.view.subscribe(\"render\", function(s, t) {\n            this.recordRender(t);\n        }.bind(this));\n        this.view.subscribe(\"recordAfterReorder\", function(s, t) {\n            this._reorderInfo = o(this._reorderInfo, t);\n        }.bind(this));\n        this.data.subscribe(\"activity\", function(s, t) {\n            this.recordStat(\"pending_request\", t.activity);\n        }.bind(this));\n        this.data.subscribe(\"respondValidUids\", function(s, t) {\n            this.validUids = t.slice(0);\n        }.bind(this));\n        this.data.subscribe(\"beforeQuery\", function(s, t) {\n            if (!t.value) {\n                this.query = \"\";\n                this.results = [];\n                return;\n            }\n        ;\n        ;\n            if (!this.stats.first_query_time) {\n                this.recordStat(\"first_query_time\", JSBNG__Date.now());\n            }\n        ;\n        ;\n            this.query = t.value;\n            this.recordCountStat(\"num_queries\");\n        }.bind(this));\n        this.data.subscribe(\"queryEndpoint\", function(s, t) {\n            this.recordCountStat(\"num_search_ajax_requests\");\n            this.recordAvgStat(\"endpoint_query_length\", t.value.length);\n            this._inflightRequests[t.value] = JSBNG__Date.now();\n        }.bind(this));\n        this.data.subscribe(\"JSBNG__onload\", function(s, t) {\n            this._onloadTime = t.time;\n        }.bind(this));\n        this.data.subscribe(\"bootstrapped\", function(s, t) {\n            this.bootstrapStats.endTime = t.time;\n            this.bootstrapStats.bootstrapped = 1;\n        }.bind(this));\n        this.core.subscribe(\"recordFunction\", function(s, t) {\n            this._extraRecorder.push(t);\n        }.bind(this));\n        this.data.subscribe(\"endpointStats\", function(s, t) {\n            var u = ((t.fetch_end - t.fetch_start));\n            if (t.value) {\n                this.recordAvgStat(\"search_endpoint_ms_from_js\", u);\n            }\n             else this.bootstrapStats[t.type] = u;\n        ;\n        ;\n            if (t.coeff2_ts) {\n                this.bootstrapStats.coeff2_ts = t.coeff2_ts;\n            }\n        ;\n        ;\n            if (((typeof t.browserCacheHit != \"undefined\"))) {\n                this.recordCountStat(((t.browserCacheHit ? \"bootstrap_cachehits\" : \"bootstrap_cachemisses\")));\n            }\n        ;\n        ;\n            if (this._inflightRequests[t.value]) {\n                delete this._inflightRequests[t.value];\n            }\n        ;\n        ;\n        }.bind(this));\n        this.data.subscribe(\"query\", function(s, t) {\n            this.recordAvgStat(\"num_results_from_cache\", t.results.length);\n        }.bind(this));\n        this.data.subscribe(\"backend_topreplace\", function(s, t) {\n            if (((false === this._topreplace))) {\n                this.recordStat(\"backend_topreplace\", 1);\n                this._topreplace = true;\n            }\n        ;\n        ;\n        }.bind(this));\n        g.listen(this.element, \"keydown\", function(JSBNG__event) {\n            if (((g.getKeyCode(JSBNG__event) == j.BACKSPACE))) {\n                if (((!this._backspacing && this.query))) {\n                    this._backspacing = true;\n                    this.recordAppendStat(\"before_backspace_queries\", this.query);\n                }\n            ;\n            ;\n            }\n             else this._backspacing = false;\n        ;\n        ;\n        }.bind(this));\n        this.data.subscribe(\"beforeFetch\", function(s, t) {\n            var u = t.request.data.value;\n            if (!u) {\n                return;\n            }\n        ;\n        ;\n            this.backendQueries.push(u);\n        }.bind(this));\n    };\n    q.prototype.recordStat = function(s, t) {\n        this.stats[s] = t;\n    };\n    q.prototype.recordCountStat = function(s) {\n        var t = this.stats[s];\n        this.stats[s] = ((t ? ((t + 1)) : 1));\n    };\n    q.prototype.recordAvgStat = function(s, t) {\n        if (this.avgStats[s]) {\n            this.avgStats[s][0] += t;\n            ++this.avgStats[s][1];\n        }\n         else this.avgStats[s] = [t,1,];\n    ;\n    ;\n    };\n    q.prototype.recordAppendStat = function(s, t) {\n        if (!this.appendStats.hasOwnProperty(s)) {\n            this.appendStats[s] = [];\n        }\n    ;\n    ;\n        this.appendStats[s].push(t);\n    };\n    q.prototype.recordRender = function(s) {\n        this.results = s.filter(function(u) {\n            return ((((((u.uid != \"search\")) && ((u.type != \"disabled_result\")))) && ((u.type != \"header\"))));\n        }).map(function(u) {\n            return o(null, u);\n        });\n        var t = l.getViewportDimensions();\n        this.recordStat(\"window_size_width\", t.x);\n        this.recordStat(\"window_size_height\", t.y);\n        if (((((this.results.length > 0)) && !this.stats.first_result_time))) {\n            this.recordStat(\"first_result_time\", JSBNG__Date.now());\n        }\n    ;\n    ;\n    };\n    q.prototype.recordSelectInfo = function(s) {\n        var t = s.selected, u = s.index;\n        if (((t.groupIndex !== undefined))) {\n            u = ((((s.index - t.groupIndex)) - 1));\n        }\n    ;\n    ;\n        var v = {\n            href: t.path\n        }, w = ((t.dataGT ? {\n            gt: JSON.parse(t.dataGT)\n        } : {\n        }));\n        n(\"click\", v, null, null, w);\n        p(\"search\").uai(\"click\");\n        if (((t.uid == \"search\"))) {\n            this.recordStat(\"selected_search\", 1);\n        }\n         else if (((t.uid == \"invite\"))) {\n            this.recordStat(\"selected_invite\", 1);\n        }\n         else {\n            var x = ((((t.rankType || t.render_type)) || t.type)), y = ((((x == \"friend\")) ? \"user\" : x));\n            this.recordStat(((\"selected_\" + y)), 1);\n            this.recordStat(\"selected_position\", u);\n            this.recordStat(\"selected_type\", x);\n            this.recordStat(\"selected_name_length\", t.text.length);\n            this.recordStat(\"selected_id\", t.uid);\n            this.recordStat(\"selected_degree\", ((t.bootstrapped ? 1 : 2)));\n            var z = k.parse(this.data.getTextToIndex(t)).tokens, aa = r(z, this.query);\n            if (aa) {\n                this.recordStat(\"matched_terms\", aa);\n            }\n        ;\n        ;\n        }\n        \n    ;\n    ;\n        var ba = {\n        };\n        this._extraRecorder.forEach(function(ca) {\n            ca(s, this.results, ba);\n        }.bind(this));\n        this.recordStat(\"extra_select_info\", JSON.stringify(ba));\n        if (((t.type === \"websuggestion\"))) {\n            this.recordStat(\"selected_memcached_websuggestion\", t.fromMemcache);\n            this.recordStat(\"selected_websuggestion_source\", t.websuggestion_source);\n        }\n    ;\n    ;\n        this.recordStat(\"selected_with_mouse\", ((s.clicked ? 1 : 0)));\n    };\n    q.prototype._dataToSubmit = function() {\n        this.recordStat(\"candidate_results\", this.buildResults());\n        this.recordStat(\"query\", this.query);\n        this.recordStat(\"init_time\", this.initTime);\n        if (this.initStartTime) {\n            this.recordStat(\"init_start_time\", this.initStartTime);\n            this.recordStat(\"onload_time\", this._onloadTime);\n            this.initStartTime = 0;\n        }\n    ;\n    ;\n        this.recordStat(\"bootstrapped\", this.bootstrapStats.bootstrapped);\n        if (this.bootstrapStats.endTime) {\n            this.recordStat(\"bootstrapped_time\", this.bootstrapStats.endTime);\n            this.recordStat(\"user_bootstrap_ms\", this.bootstrapStats.user);\n            this.recordStat(\"other_bootstrap_ms\", this.bootstrapStats.other);\n            this.bootstrapStats.endTime = 0;\n        }\n    ;\n    ;\n        this.recordStat(\"coeff2_ts\", this.bootstrapStats.coeff2_ts);\n        this.recordStat(\"max_results\", this.data._maxResults);\n        if (((this.backendQueries.length > 0))) {\n            if (((this.backendQueries.length > this.data.logBackendQueriesWindow))) {\n                this.backendQueries = this.backendQueries.slice(((this.backendQueries.length - this.data.logBackendQueriesWindow)));\n            }\n        ;\n        ;\n            this.recordStat(\"backend_queries\", this.backendQueries);\n        }\n    ;\n    ;\n        if (this._reorderInfo) {\n            var s = this._reorderInfo;\n            s.organic.forEach(function(x) {\n                delete x.text;\n            });\n            this.recordStat(\"s_count\", s.position_data.length);\n            this.recordStat(\"s_bootstrap_id\", s.s_bootstrap_id);\n            this.recordStat(\"s_organic_results\", JSON.stringify(s.organic));\n            this.recordStat(\"s_candidate_tokens\", JSON.stringify(s.tokens));\n            this.recordStat(\"s_positions\", JSON.stringify(s.position_data));\n            this.recordStat(\"s_options\", JSON.stringify(s.options));\n            this.recordStat(\"s_variant\", JSON.stringify(s.variant));\n        }\n    ;\n    ;\n        var t = this.stats;\n        {\n            var fin282keys = ((window.top.JSBNG_Replay.forInKeys)((this.avgStats))), fin282i = (0);\n            var u;\n            for (; (fin282i < fin282keys.length); (fin282i++)) {\n                ((u) = (fin282keys[fin282i]));\n                {\n                    var v = this.avgStats[u];\n                    t[u] = ((v[0] / v[1]));\n                };\n            };\n        };\n    ;\n        {\n            var fin283keys = ((window.top.JSBNG_Replay.forInKeys)((this.appendStats))), fin283i = (0);\n            var w;\n            for (; (fin283i < fin283keys.length); (fin283i++)) {\n                ((w) = (fin283keys[fin283i]));\n                {\n                    t[w] = JSON.stringify(this.appendStats[w]);\n                ;\n                };\n            };\n        };\n    ;\n        return t;\n    };\n    q.prototype.buildResults = function() {\n        var s = ((this.results || [])).map(function(t, u) {\n            var v = k.parse(this.data.getTextToIndex(t)).tokens, w = ((((t.rankType || t.render_type)) || t.type)), x = ((t.bootstrapped ? 1 : 0)), y = ((t.s_token || \"\")), z = ((r(v, this.query) || this.query)), aa = t.index_rank, ba = t.match_type, ca = t.prefix_match, da = t.prefix_length;\n            if (((typeof t.groupIndex == \"number\"))) {\n                return [t.groupIndex,t.indexInGroup,t.uid,w,x,y,z,aa,ba,ca,da,t.origIndex,];\n            }\n        ;\n        ;\n            return [0,u,t.uid,w,x,y,z,aa,ba,ca,da,t.origIndex,];\n        }.bind(this));\n        return JSON.stringify(s);\n    };\n    q.prototype.submit = function() {\n        var s = this._dataToSubmit();\n        switch (this.data.recordingRoute) {\n          case \"double_recording\":\n            if (((Math.JSBNG__random() > 113062))) {\n                s.recorded_first = \"legacy\";\n                JSBNG__setTimeout(this.submitThroughAsyncRequest.bind(this, s), 0);\n                i.post(this._banzaiRoute, s, {\n                    delay: 0,\n                    retry: true\n                });\n            }\n             else {\n                s.recorded_first = \"banzai\";\n                i.post(this._banzaiRoute, s, {\n                    delay: 0,\n                    retry: true\n                });\n                JSBNG__setTimeout(this.submitThroughAsyncRequest.bind(this, s), 0);\n            }\n        ;\n        ;\n            break;\n          case \"random_recording\":\n            if (((Math.JSBNG__random() > 113386))) {\n                this.submitThroughAsyncRequest(s);\n            }\n             else i.post(this._banzaiRoute, s, {\n                delay: 0,\n                retry: true\n            });\n        ;\n        ;\n            break;\n          case \"banzai_basic\":\n            i.post(this._banzaiRoute, s);\n            break;\n          case \"banzai_vital\":\n            i.post(this._banzaiRoute, s, {\n                delay: 0,\n                retry: true\n            });\n            break;\n          default:\n            this.submitThroughAsyncRequest(s);\n        };\n    ;\n        this._reset();\n    };\n    q.prototype.submitThroughAsyncRequest = function(s) {\n        if (((Object.keys(s).length > 0))) {\n            new h().setURI(this._endPoint).setMethod(\"POST\").setData({\n                stats: s\n            }).setOption(\"handleErrorAfterUnload\", true).setErrorHandler(function(t) {\n                s.retry = true;\n                new h().setURI(this._endPoint).setMethod(\"POST\").setData({\n                    stats: s\n                }).setOption(\"asynchronous\", false).send();\n            }.bind(this)).send();\n        }\n    ;\n    ;\n    };\n    var r = function(s, t) {\n        var u = k.parse(t);\n        if (((u.flatValue[((u.flatValue.length - 1))] === \" \"))) {\n            return u.flatValue;\n        }\n    ;\n    ;\n        var v = u.tokens[((u.tokens.length - 1))], w = {\n        };\n        s.forEach(function(ba) {\n            w[ba] = ((((w[ba] || 0)) + 1));\n        });\n        var x = {\n        }, y = u.tokens.slice(0, ((u.tokens.length - 1)));\n        y.forEach(function(ba) {\n            x[ba] = ((((x[ba] || 0)) + 1));\n        });\n        for (var z = 0; ((z < s.length)); ++z) {\n            var aa = s[z];\n            if (((((aa.indexOf(v) === 0)) && ((((w[aa] - ((x[aa] || 0)))) > 0))))) {\n                y.push(aa);\n                return y.join(\" \");\n            }\n        ;\n        ;\n        };\n    ;\n        return undefined;\n    };\n    o(q.prototype, {\n        _endPoint: \"/ajax/typeahead/record_metrics.php\",\n        _banzaiRoute: \"search\"\n    });\n    e.exports = q;\n});\n__d(\"TypeaheadSearchRecorderBasic\", [\"SearchTypeaheadRecorder\",\"copyProperties\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"SearchTypeaheadRecorder\"), h = b(\"copyProperties\"), i = b(\"emptyFunction\");\n    function j(k) {\n        this._typeahead = k;\n    };\n;\n    j.prototype.enable = function() {\n        new g(this._typeahead);\n    };\n    h(j.prototype, {\n        disable: i\n    });\n    e.exports = j;\n});\n__d(\"legacy:SearchRecorderBasicTypeaheadBehavior\", [\"TypeaheadSearchRecorderBasic\",], function(a, b, c, d) {\n    var e = b(\"TypeaheadSearchRecorderBasic\");\n    if (!a.TypeaheadBehaviors) {\n        a.TypeaheadBehaviors = {\n        };\n    }\n;\n;\n    a.TypeaheadBehaviors.searchRecorderBasic = function(f) {\n        f.enableBehavior(e);\n    };\n}, 3);\n__d(\"SearchTypeaheadRenderer\", [\"Badge\",\"DOM\",\"Env\",\"MusicButtonManager\",\"TypeaheadFacepile\",\"TypeaheadUtil\",], function(a, b, c, d, e, f) {\n    var g = b(\"Badge\"), h = b(\"DOM\"), i = b(\"Env\"), j = b(\"MusicButtonManager\"), k = b(\"TypeaheadFacepile\"), l = b(\"TypeaheadUtil\");\n    function m(n, o) {\n        var p = [], q = ((n.photos || n.photo));\n        if (q) {\n            if (((q instanceof Array))) {\n                q = k.render(q);\n            }\n             else q = h.create(\"img\", {\n                alt: \"\",\n                src: q\n            });\n        ;\n        ;\n            p.push(q);\n            if (n.song) {\n                p.push(h.create(\"span\", {\n                    className: \"playButton\"\n                }));\n                p.push(h.create(\"span\", {\n                    className: \"playLoader\"\n                }));\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n        var r;\n        if (n.text) {\n            var s = n.alias, t = this.value, u = n.text;\n            r = [u,];\n            if (((((s && l.isQueryMatch(t, s))) && !l.isQueryMatch(t, u)))) {\n                r.push(h.create(\"span\", {\n                    className: \"alias\"\n                }, [((\" \\u00b7 \" + s)),]));\n            }\n        ;\n        ;\n            if (n.verified) {\n                r.push(g(\"xsmall\"));\n            }\n        ;\n        ;\n            p.push(h.create(\"span\", {\n                className: \"text\"\n            }, r));\n        }\n    ;\n    ;\n        if (n.category) {\n            var v = [n.category,];\n            if (n.is_external) {\n                v.push(h.create(\"span\", {\n                    className: \"arrow\"\n                }));\n            }\n        ;\n        ;\n            var w = ((n.message ? \"preCategory\" : \"category\"));\n            p.push(h.create(\"span\", {\n                className: w\n            }, v));\n        }\n    ;\n    ;\n        if (n.message) {\n            p.push(h.create(\"span\", {\n                className: \"category\"\n            }, [n.message,]));\n        }\n    ;\n    ;\n        var x = ((n.subtextOverride || n.subtext));\n        if (x) {\n            p.push(h.create(\"span\", {\n                className: \"subtext\"\n            }, [x,]));\n        }\n    ;\n    ;\n        var y = ((((n.classNames || n.type)) || \"\")), z = ((n.is_external ? \"_blank\" : \"\")), aa = ((((!n.song && n.path)) || \"\"));\n        if (aa) {\n            if (!(/^https?\\:\\/\\//).test(aa)) {\n                aa = ((i.www_base + aa.substr(1)));\n            }\n        ;\n        ;\n            aa += ((((((aa.indexOf(\"?\") > 0)) ? \"&\" : \"?\")) + \"ref=ts&fref=ts\"));\n        }\n    ;\n    ;\n        var ba = h.create(\"a\", {\n            href: aa,\n            rel: \"ignore\",\n            target: z\n        }, p);\n        if (n.song) {\n            ba.id = ((\"mb_\" + ((((Math.JSBNG__random() * 1000000)) | 0))));\n            j.addButton.curry(n.song.provider, ba.id, n.song.url, n.song.context, n.song.media_type).defer();\n            ba.JSBNG__onclick = this.ignoreClick;\n        }\n    ;\n    ;\n        var ca = h.create(\"li\", {\n            className: y\n        }, [ba,]);\n        if (n.text) {\n            ca.setAttribute(\"aria-label\", n.text);\n        }\n    ;\n    ;\n        return ca;\n    };\n;\n    m.className = \"search\";\n    e.exports = m;\n});\n__d(\"legacy:SearchTypeaheadRenderer\", [\"SearchTypeaheadRenderer\",], function(a, b, c, d) {\n    if (!a.TypeaheadRenderers) {\n        a.TypeaheadRenderers = {\n        };\n    }\n;\n;\n    a.TypeaheadRenderers.search = b(\"SearchTypeaheadRenderer\");\n}, 3);\nvoid (0);\n__d(\"TypeaheadSearchFilter\", [\"Arbiter\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"copyProperties\");\n    function i(j) {\n        this._typeahead = j;\n    };\n;\n    i.prototype.enable = function() {\n        var j = this._typeahead, k = j.getView().seeMoreEndpoint;\n        this._subscriptions = [g.subscribe(\"search/typeahead/updateFilter\", function(l, m) {\n            if (((m.filter_type == \"web\"))) {\n                j.getView().queryData.form = \"FBKBFR\";\n            }\n        ;\n        ;\n            j.getView().queryData.type = m.filter_type;\n        }),g.subscribe(\"search/typeahead/updateSeeMoreEndpoint\", function(l, m) {\n            j.getView().seeMoreEndpoint = m;\n        }),g.subscribe(\"page_transition\", function(l, m) {\n            if (j.getView().queryData.form) {\n                delete j.getView().queryData.form;\n            }\n        ;\n        ;\n            delete j.getView().queryData.type;\n            j.getView().seeMoreEndpoint = k;\n        }, g.SUBSCRIBE_NEW),];\n    };\n    i.prototype.disable = function() {\n        this._subscriptions.forEach(function(j) {\n            j.unsubscribe();\n        });\n        this._subscriptions = null;\n    };\n    h(i.prototype, {\n        _subscription: null\n    });\n    e.exports = i;\n});\n__d(\"legacy:SearchFilterTypeaheadBehavior\", [\"TypeaheadSearchFilter\",], function(a, b, c, d) {\n    var e = b(\"TypeaheadSearchFilter\");\n    if (!a.TypeaheadBehaviors) {\n        a.TypeaheadBehaviors = {\n        };\n    }\n;\n;\n    a.TypeaheadBehaviors.initFilters = function(f) {\n        f.enableBehavior(e);\n    };\n}, 3);\n__d(\"TypeaheadDetectQueryLocale\", [], function(a, b, c, d, e, f) {\n    function g(h) {\n        this._typeahead = h;\n        this._data = h.getData();\n        this._queryCache = {\n            \"\": this._data.queryCache,\n            ja_JP: {\n            },\n            zh_TW: {\n            }\n        };\n    };\n;\n    g.prototype.enable = function() {\n        this._previousLocale = \"\";\n        this._reset = this._typeahead.subscribe(\"reset\", this._swapQueryCache.bind(this, \"\"));\n        this._beforeQuery = this._data.subscribe(\"beforeQuery\", function(h, i) {\n            var j = i.value;\n            if (((j === \"\"))) {\n                this._swapQueryCache(\"\");\n                return;\n            }\n        ;\n        ;\n            var k = null, l = j.charCodeAt(((j.length - 1)));\n            if (((((12352 <= l)) && ((l <= 12543))))) {\n                k = \"ja_JP\";\n            }\n             else if (((((12544 <= l)) && ((l <= 12735))))) {\n                k = \"zh_TW\";\n            }\n            \n        ;\n        ;\n            this._swapQueryCache(k);\n        }.bind(this));\n    };\n    g.prototype.disable = function() {\n        this._swapQueryCache(\"\");\n        this._data.unsubscribe(this._beforeQuery);\n        this._typeahead.ubsubscribe(this._reset);\n    };\n    g.prototype._swapQueryCache = function(h) {\n        if (((((h === null)) || ((h === this._previousLocale))))) {\n            return;\n        }\n    ;\n    ;\n        this._data.queryCache = this._queryCache[h];\n        this._data.setQueryData({\n            query_locale: h\n        });\n        this._previousLocale = h;\n    };\n    e.exports = g;\n});\n__d(\"TypeaheadDisableBucketization\", [\"copyProperties\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"copyProperties\"), h = b(\"emptyFunction\");\n    function i(j) {\n        this._typeahead = j;\n    };\n;\n    i.prototype.enable = function() {\n        this._typeahead.getView().disableBucketization();\n        this._typeahead.getData().inform(\"recordFunction\", function(j, k, l) {\n            l.bucketization_disabled = 1;\n        });\n    };\n    g(i.prototype, {\n        disable: h.thatReturns\n    });\n    e.exports = i;\n});\n__d(\"TypeaheadExcludeBootstrapFromQueryCache\", [], function(a, b, c, d, e, f) {\n    function g(h) {\n        this._data = h.getData();\n    };\n;\n    g.prototype.enable = function() {\n        this._buildingQueryCache = false;\n        this._buildQueryCache = this._data.subscribe(\"buildQueryCache\", function() {\n            this._buildingQueryCache = true;\n        }.bind(this));\n        this._mergeUids = this._data.subscribe(\"mergeUids\", function(h, i) {\n            if (this._buildingQueryCache) {\n                i.local_uids.splice(0, i.local_uids.length);\n            }\n        ;\n        ;\n        }.bind(this));\n        this._fetchComplete = this._data.subscribe(\"fetchComplete\", function() {\n            this._buildingQueryCache = false;\n        }.bind(this));\n    };\n    g.prototype.disable = function() {\n        this._data.unsubscribe(this._buildQueryCache);\n        this._data.unsubscribe(this._mergeUids);\n        this._data.unsubscribe(this._fetchComplete);\n    };\n    e.exports = g;\n});\n__d(\"TypeaheadSearchBrowseUpsell\", [\"Arbiter\",\"CSS\",\"DOM\",\"JSBNG__Event\",\"copyProperties\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"CSS\"), i = b(\"DOM\"), j = b(\"JSBNG__Event\"), k = b(\"copyProperties\"), l = b(\"emptyFunction\"), m = \"TypeaheadSearchBrowseUpsell/form\";\n    function n(o) {\n        this._typeahead = o;\n        this._form = null;\n        g.subscribe(m, this._registerForm.bind(this));\n    };\n;\n    n.prototype._registerForm = function(o, p) {\n        this._form = p.cloneNode(true);\n        i.scry(this._form, \"button\").forEach(function(q) {\n            h.removeClass(q, \"selected\");\n        });\n        j.listen(this._form, \"success\", function() {\n            this._typeahead.view.hide();\n            h.addClass(this._form, \"browseSuccess\");\n        }.bind(this));\n    };\n    n.prototype.addUpsell = function(o) {\n        if (this._form) {\n            var p = i.create(\"li\", {\n                className: \"browseUpsell\"\n            }, this._form);\n            o.push({\n                type: \"disabled_result\",\n                uid: \"upsell\",\n                node: p\n            });\n        }\n    ;\n    ;\n    };\n    n.prototype.decorateSeeMore = function(o) {\n        var p = o[((o.length - 1))];\n        if (((p && ((p.uid === \"search\"))))) {\n            h.addClass(p.node, \"browseMore\");\n        }\n    ;\n    ;\n    };\n    n.prototype.showUpsell = function() {\n        var o = this._typeahead.view;\n        return ((o._shouldShowSeeMore && !h.hasClass(o.element, \"typeaheadViewLoading\")));\n    };\n    n.prototype.enable = function() {\n        this._typeahead.subscribe(\"beforeRender\", function(o, p) {\n            var q = p.results.length;\n            if (((q && this.showUpsell()))) {\n                this.decorateSeeMore(p.results);\n                this.addUpsell(p.results);\n            }\n        ;\n        ;\n        }.bind(this));\n    };\n    n.registerForm = function(o) {\n        g.inform(m, o, g.BEHAVIOR_STATE);\n    };\n    k(n.prototype, {\n        disable: l\n    });\n    e.exports = n;\n});\n__d(\"TypeaheadRegulateMemorializedUsers\", [\"copyProperties\",\"TypeaheadUtil\",], function(a, b, c, d, e, f) {\n    var g = b(\"copyProperties\"), h = b(\"TypeaheadUtil\");\n    function i(j) {\n        this._typeahead = j;\n    };\n;\n    g(i.prototype, {\n        _filterRegistry: null,\n        _filter: function(j, k) {\n            if (((((j.type !== \"user\")) || !j.memorialized))) {\n                return true;\n            }\n        ;\n        ;\n            var l = h.parse(j.text).tokens;\n            if (((((l.length === 1)) && h.isExactMatch(k, j.text)))) {\n                return true;\n            }\n        ;\n        ;\n            var m = this._typeahead.getData().getTextToIndex(j), n = h.parse(k).tokens;\n            return ((((n.length > 1)) && h.isQueryMatch(k, m)));\n        },\n        enable: function() {\n            this._filterRegistry = this._typeahead.getData().addFilter(this._filter.bind(this));\n        },\n        disable: function() {\n            this._filterRegistry.remove();\n            this._filterRegistry = null;\n        }\n    });\n    e.exports = i;\n});\n__d(\"legacy:RegulateMemorializedUsersTypeaheadBehavior\", [\"TypeaheadRegulateMemorializedUsers\",], function(a, b, c, d) {\n    var e = b(\"TypeaheadRegulateMemorializedUsers\");\n    if (!a.TypeaheadBehaviors) {\n        a.TypeaheadBehaviors = {\n        };\n    }\n;\n;\n    a.TypeaheadBehaviors.regulateMemorializedUsers = function(f) {\n        f.enableBehavior(e);\n    };\n}, 3);");
// 4275
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"o449694821_525");
// 4276
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"o449694821_549");
// 4278
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"");
// 4279
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"o449694821_549");
// 4280
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"src");
// 4281
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"\"\"");
// 4283
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"o449694821_525");
// 4284
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"length");
// 4285
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"44");
// 4287
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"o449694821_785");
// 4289
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"o449694821_525");
// 4290
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"o449694821_785");
// 4292
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"");
// 4293
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"o449694821_785");
// 4294
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"src");
// 4295
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"\"\"");
// 4297
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"o449694821_525");
// 4298
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"length");
// 4299
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"44");
// 4301
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"o449694821_786");
// 4303
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"o449694821_525");
// 4304
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"o449694821_786");
// 4306
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"");
// 4307
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"o449694821_786");
// 4308
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"src");
// 4309
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"\"\"");
// 4311
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"o449694821_525");
// 4312
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"length");
// 4313
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"44");
// 4315
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"o449694821_787");
// 4317
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"o449694821_525");
// 4318
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"o449694821_787");
// 4320
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"");
// 4321
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"o449694821_787");
// 4322
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"src");
// 4323
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"\"\"");
// 4325
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"o449694821_525");
// 4326
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"length");
// 4327
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"44");
// 4329
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"o449694821_788");
// 4331
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"o449694821_525");
// 4332
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"o449694821_788");
// 4334
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"");
// 4335
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"o449694821_788");
// 4336
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"src");
// 4337
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"\"\"");
// 4339
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"o449694821_525");
// 4340
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"length");
// 4341
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"44");
// 4343
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"o449694821_789");
// 4345
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"o449694821_525");
// 4346
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"o449694821_789");
// 4348
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"");
// 4349
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"o449694821_789");
// 4350
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"src");
// 4351
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"\"\"");
// 4353
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"o449694821_525");
// 4354
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"length");
// 4355
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"44");
// 4357
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"o449694821_790");
// 4359
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"o449694821_525");
// 4360
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"o449694821_790");
// 4362
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"");
// 4363
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"o449694821_790");
// 4364
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"src");
// 4365
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"\"\"");
// 4367
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"o449694821_525");
// 4368
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"length");
// 4369
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"44");
// 4371
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"o449694821_791");
// 4373
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"o449694821_525");
// 4374
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"o449694821_791");
// 4376
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"");
// 4377
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"o449694821_791");
// 4378
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"src");
// 4379
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"\"\"");
// 4381
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"o449694821_525");
// 4382
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"length");
// 4383
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"44");
// 4385
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"o449694821_792");
// 4387
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"o449694821_525");
// 4388
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"o449694821_792");
// 4390
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"");
// 4391
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"o449694821_792");
// 4392
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"src");
// 4393
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"\"\"");
// 4395
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"o449694821_525");
// 4396
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"length");
// 4397
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"44");
// 4399
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"o449694821_793");
// 4401
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"o449694821_525");
// 4402
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"o449694821_793");
// 4404
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"");
// 4405
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"o449694821_793");
// 4406
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"src");
// 4407
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"\"\"");
// 4409
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"o449694821_525");
// 4410
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"length");
// 4411
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"44");
// 4413
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"o449694821_794");
// 4415
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"o449694821_525");
// 4416
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"o449694821_794");
// 4418
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"");
// 4419
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"o449694821_794");
// 4420
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"src");
// 4421
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"\"\"");
// 4423
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"o449694821_525");
// 4424
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"length");
// 4425
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"44");
// 4432
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_278[18], o3,o4);
// undefined
o3 = null;
// undefined
o4 = null;
// 4449
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"ow449694821");
// 4450
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"JSBNG__onpopstate");
// 4451
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"f449694821_522");
// 4453
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"o449694821_1");
// 4454
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"documentElement");
// 4455
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"o449694821_401");
// 4457
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"ow449694821");
// 4458
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"JSBNG__onpopstate");
// 4459
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o5,"f449694821_522");
// undefined
o5 = null;
// 4468
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_376[0], o2);
// 4469
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_378[0], o2);
// undefined
o2 = null;
// 4473
o7.toString = f449694821_816;
// 4482
o8.hasOwnProperty = f449694821_818;
// undefined
o8 = null;
// 4471
fpc.call(JSBNG_Replay.s5e7dba3ea700a5261ca8857ec975a807389e8969_42[0], o7);
// undefined
o7 = null;
// 4514
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_96[0], f449694821_826,1373490177573);
// 4574
o0.cookie = "c_user=100006118350059; csm=2; wd=994x603";
// 4533
JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_225[0](o9);
// undefined
o9 = null;
// 4585
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mouseover",o6);
// undefined
o6 = null;
// 4593
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o10);
// undefined
o10 = null;
// 4601
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o11);
// undefined
o11 = null;
// 4609
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o12);
// undefined
o12 = null;
// 4617
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o13);
// undefined
o13 = null;
// 4625
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o14);
// undefined
o14 = null;
// 4633
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o15);
// undefined
o15 = null;
// 4641
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o16);
// undefined
o16 = null;
// 4649
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o17);
// undefined
o17 = null;
// 4657
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o19);
// undefined
o19 = null;
// 4665
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o20);
// undefined
o20 = null;
// 4673
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o21);
// undefined
o21 = null;
// 4681
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o22);
// undefined
o22 = null;
// 4689
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o23);
// undefined
o23 = null;
// 4697
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o24);
// undefined
o24 = null;
// 4705
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o25);
// undefined
o25 = null;
// 4713
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o26);
// undefined
o26 = null;
// 4724
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o27);
// undefined
o27 = null;
// 4732
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o28);
// undefined
o28 = null;
// 4740
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o29);
// undefined
o29 = null;
// 4748
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o30);
// undefined
o30 = null;
// 4756
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o31);
// undefined
o31 = null;
// 4764
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o32);
// undefined
o32 = null;
// 4773
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"DOMMouseScroll",o33);
// undefined
o33 = null;
// 4782
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"DOMMouseScroll",o34);
// undefined
o34 = null;
// 4791
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"DOMMouseScroll",o35);
// undefined
o35 = null;
// 4800
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"DOMMouseScroll",o36);
// undefined
o36 = null;
// 4809
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"DOMMouseScroll",o37);
// undefined
o37 = null;
// 4818
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"DOMMouseScroll",o38);
// undefined
o38 = null;
// 4827
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"DOMMouseScroll",o39);
// undefined
o39 = null;
// 4839
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"DOMMouseScroll",o40);
// undefined
o40 = null;
// 4848
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"DOMMouseScroll",o43);
// undefined
o43 = null;
// 4857
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"DOMMouseScroll",o44);
// undefined
o44 = null;
// 4866
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"DOMMouseScroll",o45);
// undefined
o45 = null;
// 4875
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"DOMMouseScroll",o46);
// undefined
o46 = null;
// 4884
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"DOMMouseScroll",o47);
// undefined
o47 = null;
// 4893
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"DOMMouseScroll",o48);
// undefined
o48 = null;
// 4902
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"DOMMouseScroll",o49);
// undefined
o49 = null;
// 4911
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"DOMMouseScroll",o50);
// undefined
o50 = null;
// 4920
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"DOMMouseScroll",o51);
// undefined
o51 = null;
// 4929
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"DOMMouseScroll",o52);
// undefined
o52 = null;
// 4938
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"DOMMouseScroll",o53);
// undefined
o53 = null;
// 4947
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"DOMMouseScroll",o54);
// undefined
o54 = null;
// 4956
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"DOMMouseScroll",o55);
// undefined
o55 = null;
// 4965
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"DOMMouseScroll",o56);
// undefined
o56 = null;
// 4974
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"DOMMouseScroll",o57);
// undefined
o57 = null;
// 4983
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"DOMMouseScroll",o58);
// undefined
o58 = null;
// 4992
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"DOMMouseScroll",o59);
// undefined
o59 = null;
// 5001
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"DOMMouseScroll",o60);
// undefined
o60 = null;
// 5010
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"DOMMouseScroll",o61);
// undefined
o61 = null;
// 5098
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o65);
// 5107
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"DOMMouseScroll",o67);
// 5122
o62.transport = o63;
// undefined
o62 = null;
// undefined
o63 = null;
// 5116
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"DOMMouseScroll",o69);
// 5197
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o65);
// undefined
o65 = null;
// 5206
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"DOMMouseScroll",o67);
// undefined
o67 = null;
// 5215
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"DOMMouseScroll",o69);
// undefined
o69 = null;
// 5225
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"DOMMouseScroll",o64);
// undefined
o64 = null;
// 5234
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"DOMMouseScroll",o66);
// undefined
o66 = null;
// 5243
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"DOMMouseScroll",o68);
// undefined
o68 = null;
// 5252
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"DOMMouseScroll",o70);
// undefined
o70 = null;
// 5261
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"DOMMouseScroll",o71);
// undefined
o71 = null;
// 5270
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"DOMMouseScroll",o72);
// undefined
o72 = null;
// 5279
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"DOMMouseScroll",o73);
// undefined
o73 = null;
// 5288
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"DOMMouseScroll",o74);
// undefined
o74 = null;
// 5297
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"DOMMouseScroll",o75);
// undefined
o75 = null;
// 5306
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"DOMMouseScroll",o76);
// undefined
o76 = null;
// 5315
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"DOMMouseScroll",o77);
// undefined
o77 = null;
// 5324
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"DOMMouseScroll",o78);
// undefined
o78 = null;
// 5333
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"DOMMouseScroll",o79);
// undefined
o79 = null;
// 5342
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"DOMMouseScroll",o80);
// undefined
o80 = null;
// 5351
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"DOMMouseScroll",o81);
// undefined
o81 = null;
// 5359
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o82);
// undefined
o82 = null;
// 5368
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"DOMMouseScroll",o83);
// undefined
o83 = null;
// 5377
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"DOMMouseScroll",o84);
// undefined
o84 = null;
// 5386
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"DOMMouseScroll",o85);
// undefined
o85 = null;
// 5398
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"DOMMouseScroll",o86);
// undefined
o86 = null;
// 5407
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"DOMMouseScroll",o87);
// undefined
o87 = null;
// 5416
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"DOMMouseScroll",o88);
// undefined
o88 = null;
// 5425
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"DOMMouseScroll",o89);
// undefined
o89 = null;
// 5434
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"DOMMouseScroll",o90);
// undefined
o90 = null;
// 5443
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"DOMMouseScroll",o91);
// undefined
o91 = null;
// 5452
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"DOMMouseScroll",o92);
// undefined
o92 = null;
// 5460
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o93);
// undefined
o93 = null;
// 5469
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"DOMMouseScroll",o94);
// undefined
o94 = null;
// 5478
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"DOMMouseScroll",o95);
// undefined
o95 = null;
// 5487
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"DOMMouseScroll",o96);
// undefined
o96 = null;
// 5496
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"DOMMouseScroll",o97);
// undefined
o97 = null;
// 5504
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o98);
// undefined
o98 = null;
// 5513
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"DOMMouseScroll",o99);
// undefined
o99 = null;
// 5521
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o100);
// undefined
o100 = null;
// 5529
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o101);
// undefined
o101 = null;
// 5537
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o102);
// undefined
o102 = null;
// 5545
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o103);
// undefined
o103 = null;
// 5553
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o104);
// undefined
o104 = null;
// 5561
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o105);
// undefined
o105 = null;
// 5569
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o106);
// undefined
o106 = null;
// 5577
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o107);
// undefined
o107 = null;
// 5585
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o108);
// undefined
o108 = null;
// 5593
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o109);
// undefined
o109 = null;
// 5601
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o110);
// undefined
o110 = null;
// 5609
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o111);
// undefined
o111 = null;
// 5617
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o112);
// undefined
o112 = null;
// 5625
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o113);
// undefined
o113 = null;
// 5633
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o114);
// undefined
o114 = null;
// 5641
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mouseover",o115);
// undefined
o115 = null;
// 5649
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o116);
// undefined
o116 = null;
// 5660
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mouseover",o117);
// undefined
o117 = null;
// 5668
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o118);
// undefined
o118 = null;
// 5676
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o119);
// undefined
o119 = null;
// 5684
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o120);
// undefined
o120 = null;
// 5692
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o121);
// undefined
o121 = null;
// 5700
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o122);
// undefined
o122 = null;
// 5708
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o123);
// undefined
o123 = null;
// 5716
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o124);
// undefined
o124 = null;
// 5724
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o125);
// undefined
o125 = null;
// 5732
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o126);
// undefined
o126 = null;
// 5740
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o127);
// undefined
o127 = null;
// 5748
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o128);
// undefined
o128 = null;
// 5756
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o129);
// undefined
o129 = null;
// 5764
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o130);
// undefined
o130 = null;
// 5772
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o131);
// undefined
o131 = null;
// 5780
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o132);
// undefined
o132 = null;
// 5788
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o133);
// undefined
o133 = null;
// 5796
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o134);
// undefined
o134 = null;
// 5804
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o135);
// undefined
o135 = null;
// 5812
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o136);
// undefined
o136 = null;
// 5820
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o137);
// undefined
o137 = null;
// 5828
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o138);
// undefined
o138 = null;
// 5836
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o139);
// undefined
o139 = null;
// 5844
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o140);
// undefined
o140 = null;
// 5852
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o141);
// undefined
o141 = null;
// 5860
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o142);
// undefined
o142 = null;
// 5868
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o143);
// undefined
o143 = null;
// 5876
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o144);
// undefined
o144 = null;
// 5884
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o145);
// undefined
o145 = null;
// 5892
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o146);
// undefined
o146 = null;
// 5900
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o147);
// undefined
o147 = null;
// 5908
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o148);
// undefined
o148 = null;
// 5916
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o149);
// undefined
o149 = null;
// 5924
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o150);
// undefined
o150 = null;
// 5932
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o151);
// undefined
o151 = null;
// 5940
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o152);
// undefined
o152 = null;
// 5948
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o153);
// undefined
o153 = null;
// 5956
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o154);
// undefined
o154 = null;
// 5964
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o155);
// undefined
o155 = null;
// 5972
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o156);
// undefined
o156 = null;
// 5980
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o157);
// undefined
o157 = null;
// 5988
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o158);
// undefined
o158 = null;
// 5996
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o159);
// undefined
o159 = null;
// 6004
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o160);
// undefined
o160 = null;
// 6012
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o161);
// undefined
o161 = null;
// 6023
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o162);
// undefined
o162 = null;
// 6031
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o163);
// undefined
o163 = null;
// 6039
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o164);
// undefined
o164 = null;
// 6047
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o165);
// undefined
o165 = null;
// 6055
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o166);
// undefined
o166 = null;
// 6063
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o167);
// undefined
o167 = null;
// 6071
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o168);
// undefined
o168 = null;
// 6079
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o169);
// undefined
o169 = null;
// 6087
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o170);
// undefined
o170 = null;
// 6095
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o171);
// undefined
o171 = null;
// 6103
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o172);
// undefined
o172 = null;
// 6111
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o173);
// undefined
o173 = null;
// 6119
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o174);
// undefined
o174 = null;
// 6127
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o175);
// undefined
o175 = null;
// 6135
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o176);
// undefined
o176 = null;
// 6143
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o177);
// undefined
o177 = null;
// 6151
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mouseover",o178);
// undefined
o178 = null;
// 6159
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o179);
// undefined
o179 = null;
// 6167
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o180);
// undefined
o180 = null;
// 6175
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o181);
// undefined
o181 = null;
// 6183
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o182);
// undefined
o182 = null;
// 6191
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o183);
// undefined
o183 = null;
// 6199
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o184);
// undefined
o184 = null;
// 6207
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o185);
// undefined
o185 = null;
// 6215
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mouseover",o186);
// undefined
o186 = null;
// 6223
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o187);
// undefined
o187 = null;
// 6231
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o188);
// undefined
o188 = null;
// 6239
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o189);
// undefined
o189 = null;
// 6247
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o190);
// undefined
o190 = null;
// 6255
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o191);
// undefined
o191 = null;
// 6263
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o192);
// undefined
o192 = null;
// 6271
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o193);
// undefined
o193 = null;
// 6279
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o194);
// undefined
o194 = null;
// 6287
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o195);
// undefined
o195 = null;
// 6336
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mouseover",o196);
// undefined
o196 = null;
// 6344
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o197);
// undefined
o197 = null;
// 6352
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o198);
// undefined
o198 = null;
// 6360
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o199);
// undefined
o199 = null;
// 6368
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o200);
// undefined
o200 = null;
// 6376
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o201);
// undefined
o201 = null;
// 6384
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o202);
// undefined
o202 = null;
// 6392
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o203);
// undefined
o203 = null;
// 6400
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o204);
// undefined
o204 = null;
// 6408
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o205);
// undefined
o205 = null;
// 6416
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mouseover",o206);
// undefined
o206 = null;
// 6424
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o207);
// undefined
o207 = null;
// 6432
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mouseover",o208);
// undefined
o208 = null;
// 6440
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o209);
// undefined
o209 = null;
// 6448
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mouseover",o210);
// undefined
o210 = null;
// 6456
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o211);
// undefined
o211 = null;
// 6464
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mouseover",o212);
// undefined
o212 = null;
// 6472
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o213);
// undefined
o213 = null;
// 6489
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mouseover",o214);
// undefined
o214 = null;
// 6509
o0.cookie = "c_user=100006118350059; csm=2";
// undefined
o0 = null;
// 6503
JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_226[0](o215);
// undefined
o215 = null;
// 6513
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o216);
// undefined
o216 = null;
// 6521
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o217);
// undefined
o217 = null;
// 6529
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o218);
// undefined
o218 = null;
// 6537
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o219);
// undefined
o219 = null;
// 6545
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o220);
// undefined
o220 = null;
// 6553
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o221);
// undefined
o221 = null;
// 6561
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o222);
// undefined
o222 = null;
// 6569
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o223);
// undefined
o223 = null;
// 6577
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mouseover",o224);
// undefined
o224 = null;
// 6585
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o225);
// undefined
o225 = null;
// 6593
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o226);
// undefined
o226 = null;
// 6601
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o227);
// undefined
o227 = null;
// 6609
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o228);
// undefined
o228 = null;
// 6617
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o229);
// undefined
o229 = null;
// 6625
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o230);
// undefined
o230 = null;
// 6633
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o231);
// undefined
o231 = null;
// 6641
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o232);
// undefined
o232 = null;
// 6649
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o233);
// undefined
o233 = null;
// 6657
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o234);
// undefined
o234 = null;
// 6665
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o235);
// undefined
o235 = null;
// 6673
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o236);
// undefined
o236 = null;
// 6681
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o237);
// undefined
o237 = null;
// 6689
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o238);
// undefined
o238 = null;
// 6697
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o239);
// undefined
o239 = null;
// 6705
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o240);
// undefined
o240 = null;
// 6713
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o241);
// undefined
o241 = null;
// 6721
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o242);
// 6729
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o243);
// 6737
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o244);
// 6745
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o245);
// 6753
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o246);
// 6761
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mouseover",o247);
// 6769
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o248);
// 6780
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mouseover",o249);
// 6788
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o250);
// 6796
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o251);
// 6804
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o252);
// 6812
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o253);
// 6824
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o242);
// undefined
o242 = null;
// 6832
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o243);
// undefined
o243 = null;
// 6840
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o244);
// undefined
o244 = null;
// 6848
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o245);
// undefined
o245 = null;
// 6856
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o246);
// undefined
o246 = null;
// 6864
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mouseover",o247);
// undefined
o247 = null;
// 6872
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o248);
// undefined
o248 = null;
// 6883
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mouseover",o249);
// undefined
o249 = null;
// 6891
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o250);
// undefined
o250 = null;
// 6899
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o251);
// undefined
o251 = null;
// 6907
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o252);
// undefined
o252 = null;
// 6915
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_39[0], o1,"mousemove",o253);
// undefined
o1 = null;
// undefined
o253 = null;
// 6924
cb(); return null; }
finalize(); })();
