/* 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 ow974244559 = window;
var f974244559_0;
var o0;
var o1;
var o2;
var f974244559_4;
var f974244559_7;
var f974244559_11;
var f974244559_12;
var f974244559_13;
var f974244559_14;
var f974244559_15;
var o3;
var o4;
var o5;
var f974244559_49;
var o6;
var f974244559_51;
var o7;
var f974244559_53;
var f974244559_54;
var f974244559_57;
var f974244559_59;
var f974244559_60;
var f974244559_61;
var f974244559_62;
var f974244559_70;
var f974244559_157;
var f974244559_272;
var f974244559_420;
var f974244559_468;
var f974244559_470;
var f974244559_471;
var f974244559_472;
var f974244559_473;
var f974244559_475;
var o8;
var o9;
var f974244559_478;
var f974244559_480;
var o10;
var f974244559_482;
var o11;
var o12;
var f974244559_485;
var f974244559_486;
var o13;
var o14;
var o15;
var o16;
var o17;
var o18;
var o19;
var o20;
var o21;
var o22;
var o23;
var f974244559_500;
var f974244559_502;
var o24;
var o25;
var f974244559_507;
var o26;
var o27;
var o28;
var f974244559_514;
var o29;
var f974244559_517;
var f974244559_519;
var f974244559_522;
var f974244559_523;
var f974244559_527;
var o30;
var o31;
var o32;
var o33;
var o34;
var o35;
var o36;
var o37;
var o38;
var o39;
var o40;
var o41;
var o42;
var o43;
var o44;
var o45;
var o46;
var o47;
var fo974244559_632_firstChild;
var f974244559_640;
var f974244559_643;
var f974244559_644;
var o48;
var o49;
var o50;
var fo974244559_651_firstChild;
var f974244559_658;
var o51;
var o52;
var o53;
var o54;
var o55;
var o56;
var f974244559_702;
var o57;
var o58;
var fo974244559_656_firstChild;
var o59;
var o60;
var o61;
var o62;
var fo974244559_928_firstChild;
var o63;
var o64;
var o65;
var o66;
var o67;
var o68;
var o69;
var o70;
var o71;
var o72;
var o73;
var o74;
var o75;
var o76;
var fo974244559_1_cookie;
var f974244559_1087;
var f974244559_1088;
var f974244559_1089;
var o77;
var o78;
var o79;
var o80;
var o81;
var o82;
var o83;
var o84;
var o85;
var f974244559_1110;
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 f974244559_1202;
var o100;
var o101;
var o102;
var f974244559_1240;
var f974244559_1241;
var f974244559_1242;
var o103;
var f974244559_1244;
var o104;
var o105;
var f974244559_1253;
var f974244559_1254;
var f974244559_1257;
var f974244559_1258;
var f974244559_1259;
var f974244559_1262;
var f974244559_1263;
var o106;
var fo974244559_1269_firstChild;
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 fo974244559_1501_firstChild;
var fo974244559_1518_firstChild;
var o134;
var o135;
var f974244559_1564;
var f974244559_1565;
var f974244559_1566;
var f974244559_1568;
var o136;
var o137;
var o138;
var o139;
var o140;
var o141;
var f974244559_1576;
var o142;
var o143;
var o144;
var o145;
var o146;
var o147;
var o148;
var o149;
var f974244559_1617;
var o150;
var o151;
var o152;
var o153;
var o154;
var o155;
var o156;
var o157;
var f974244559_1628;
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 fo974244559_1653_firstChild;
var f974244559_1659;
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 fo974244559_1689_firstChild;
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 f974244559_1727;
var f974244559_1728;
var o205;
var o206;
var o207;
var o208;
var f974244559_1739;
var o209;
var f974244559_1745;
var o210;
var o211;
var o212;
var o213;
var o214;
var o215;
var o216;
var o217;
var f974244559_1858;
var fo974244559_1863_Shockwave_Flash;
var fo974244559_1866_application_x_shockwave_flash;
var f974244559_1874;
var f974244559_1881;
var f974244559_1882;
var o218;
var o219;
var f974244559_1902;
var fo974244559_1903_firstChild;
var f974244559_1909;
var f974244559_2086;
var fo974244559_2090_firstChild;
var f974244559_2097;
var f974244559_2099;
var f974244559_2100;
var f974244559_2101;
var f974244559_2102;
var f974244559_2104;
var f974244559_2105;
var f974244559_2106;
var f974244559_2109;
var f974244559_2110;
var f974244559_2112;
var f974244559_2115;
var f974244559_2116;
var f974244559_2118;
var f974244559_2119;
var f974244559_2123;
var f974244559_2124;
var f974244559_2125;
var f974244559_2127;
var f974244559_2128;
var f974244559_2129;
var f974244559_2130;
var f974244559_2131;
var f974244559_2132;
var f974244559_2133;
var f974244559_2135;
var f974244559_2147;
var f974244559_2148;
var f974244559_2149;
var f974244559_2150;
var f974244559_2151;
var o220;
var f974244559_2157;
var o221;
var o222;
var f974244559_2161;
var f974244559_2162;
var f974244559_2163;
var f974244559_2164;
var o223;
var o224;
var o225;
var fo974244559_2172_style;
var f974244559_2178;
var fo974244559_2174_style;
var f974244559_2468;
var f974244559_2470;
var f974244559_2471;
var f974244559_2472;
var f974244559_2566;
var f974244559_2853;
var f974244559_2864;
var f974244559_2914;
var f974244559_2916;
var fo974244559_2932_readyState;
JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1 = [];
JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_190 = [];
JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_166 = [];
JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_169 = [];
JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_222 = [];
JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_225 = [];
JSBNG_Replay.sf8457e5183159cd46485198114fb31bc4f940d4d_845 = [];
JSBNG_Replay.sf8457e5183159cd46485198114fb31bc4f940d4d_523 = [];
JSBNG_Replay.s5e7dba3ea700a5261ca8857ec975a807389e8969_270 = [];
JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_96 = [];
JSBNG_Replay.sa0cdb1bc3c127a88a086a13f4a6ca1502f98adf1_257 = [];
JSBNG_Replay.s8ead2a036e92884168d3fc8f84e49d83e5bb9b50_757 = [];
JSBNG_Replay.s8ead2a036e92884168d3fc8f84e49d83e5bb9b50_739 = [];
JSBNG_Replay.s5e7dba3ea700a5261ca8857ec975a807389e8969_457 = [];
JSBNG_Replay.s6de57b149b09c494ec606f82771caf93a5a215db_133 = [];
JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_226 = [];
// 1
// record generated by JSBench 8fa236f2f0ec at 2013-07-10T21:19:14.012Z
// 2
// 3
f974244559_0 = function() { return f974244559_0.returns[f974244559_0.inst++]; };
f974244559_0.returns = [];
f974244559_0.inst = 0;
// 4
ow974244559.JSBNG__Date = f974244559_0;
// 5
o0 = {};
// 6
ow974244559.JSBNG__document = o0;
// 7
o1 = {};
// 8
ow974244559.JSBNG__sessionStorage = o1;
// 9
o2 = {};
// 10
ow974244559.JSBNG__localStorage = o2;
// 11
f974244559_4 = function() { return f974244559_4.returns[f974244559_4.inst++]; };
f974244559_4.returns = [];
f974244559_4.inst = 0;
// 12
ow974244559.JSBNG__getComputedStyle = f974244559_4;
// 17
f974244559_7 = function() { return f974244559_7.returns[f974244559_7.inst++]; };
f974244559_7.returns = [];
f974244559_7.inst = 0;
// 18
ow974244559.JSBNG__addEventListener = f974244559_7;
// 19
ow974244559.JSBNG__top = ow974244559;
// 24
ow974244559.JSBNG__scrollX = 0;
// 25
ow974244559.JSBNG__scrollY = 0;
// 28
f974244559_11 = function() { return f974244559_11.returns[f974244559_11.inst++]; };
f974244559_11.returns = [];
f974244559_11.inst = 0;
// 29
ow974244559.JSBNG__scrollBy = f974244559_11;
// 30
f974244559_12 = function() { return f974244559_12.returns[f974244559_12.inst++]; };
f974244559_12.returns = [];
f974244559_12.inst = 0;
// 31
ow974244559.JSBNG__setTimeout = f974244559_12;
// 32
f974244559_13 = function() { return f974244559_13.returns[f974244559_13.inst++]; };
f974244559_13.returns = [];
f974244559_13.inst = 0;
// 33
ow974244559.JSBNG__setInterval = f974244559_13;
// 34
f974244559_14 = function() { return f974244559_14.returns[f974244559_14.inst++]; };
f974244559_14.returns = [];
f974244559_14.inst = 0;
// 35
ow974244559.JSBNG__clearTimeout = f974244559_14;
// 36
f974244559_15 = function() { return f974244559_15.returns[f974244559_15.inst++]; };
f974244559_15.returns = [];
f974244559_15.inst = 0;
// 37
ow974244559.JSBNG__clearInterval = f974244559_15;
// 42
ow974244559.JSBNG__frames = ow974244559;
// 45
ow974244559.JSBNG__self = ow974244559;
// 46
o3 = {};
// 47
ow974244559.JSBNG__navigator = o3;
// 50
o4 = {};
// 51
ow974244559.JSBNG__history = o4;
// 62
ow974244559.JSBNG__closed = false;
// 65
ow974244559.JSBNG__opener = null;
// 66
ow974244559.JSBNG__defaultStatus = "";
// 67
o5 = {};
// 68
ow974244559.JSBNG__location = o5;
// 69
ow974244559.JSBNG__innerWidth = 1050;
// 70
ow974244559.JSBNG__innerHeight = 588;
// 71
ow974244559.JSBNG__outerWidth = 1050;
// 72
ow974244559.JSBNG__outerHeight = 660;
// 73
ow974244559.JSBNG__screenX = 17;
// 74
ow974244559.JSBNG__screenY = 32;
// 75
ow974244559.JSBNG__pageXOffset = 0;
// 76
ow974244559.JSBNG__pageYOffset = 0;
// 101
ow974244559.JSBNG__frameElement = null;
// 118
f974244559_49 = function() { return f974244559_49.returns[f974244559_49.inst++]; };
f974244559_49.returns = [];
f974244559_49.inst = 0;
// 119
ow974244559.JSBNG__webkitIDBTransaction = f974244559_49;
// 120
o6 = {};
// 121
ow974244559.JSBNG__webkitNotifications = o6;
// 122
f974244559_51 = function() { return f974244559_51.returns[f974244559_51.inst++]; };
f974244559_51.returns = [];
f974244559_51.inst = 0;
// 123
ow974244559.JSBNG__webkitIDBIndex = f974244559_51;
// 124
o7 = {};
// 125
ow974244559.JSBNG__webkitIndexedDB = o7;
// 126
ow974244559.JSBNG__screenLeft = 17;
// 127
f974244559_53 = function() { return f974244559_53.returns[f974244559_53.inst++]; };
f974244559_53.returns = [];
f974244559_53.inst = 0;
// 128
ow974244559.JSBNG__webkitIDBFactory = f974244559_53;
// 129
ow974244559.JSBNG__clientInformation = o3;
// 130
f974244559_54 = function() { return f974244559_54.returns[f974244559_54.inst++]; };
f974244559_54.returns = [];
f974244559_54.inst = 0;
// 131
ow974244559.JSBNG__webkitIDBCursor = f974244559_54;
// 132
ow974244559.JSBNG__defaultstatus = "";
// 137
f974244559_57 = function() { return f974244559_57.returns[f974244559_57.inst++]; };
f974244559_57.returns = [];
f974244559_57.inst = 0;
// 138
ow974244559.JSBNG__webkitIDBDatabase = f974244559_57;
// 141
f974244559_59 = function() { return f974244559_59.returns[f974244559_59.inst++]; };
f974244559_59.returns = [];
f974244559_59.inst = 0;
// 142
ow974244559.JSBNG__webkitIDBRequest = f974244559_59;
// 143
f974244559_60 = function() { return f974244559_60.returns[f974244559_60.inst++]; };
f974244559_60.returns = [];
f974244559_60.inst = 0;
// 144
ow974244559.JSBNG__webkitIDBObjectStore = f974244559_60;
// 145
ow974244559.JSBNG__devicePixelRatio = 1;
// 146
f974244559_61 = function() { return f974244559_61.returns[f974244559_61.inst++]; };
f974244559_61.returns = [];
f974244559_61.inst = 0;
// 147
ow974244559.JSBNG__webkitURL = f974244559_61;
// 148
f974244559_62 = function() { return f974244559_62.returns[f974244559_62.inst++]; };
f974244559_62.returns = [];
f974244559_62.inst = 0;
// 149
ow974244559.JSBNG__webkitIDBKeyRange = f974244559_62;
// 150
ow974244559.JSBNG__offscreenBuffering = true;
// 151
ow974244559.JSBNG__screenTop = 32;
// 166
f974244559_70 = function() { return f974244559_70.returns[f974244559_70.inst++]; };
f974244559_70.returns = [];
f974244559_70.inst = 0;
// 167
ow974244559.JSBNG__XMLHttpRequest = f974244559_70;
// 170
ow974244559.JSBNG__URL = f974244559_61;
// 171
ow974244559.JSBNG__name = "";
// 178
ow974244559.JSBNG__status = "";
// 343
f974244559_157 = function() { return f974244559_157.returns[f974244559_157.inst++]; };
f974244559_157.returns = [];
f974244559_157.inst = 0;
// 344
ow974244559.JSBNG__Document = f974244559_157;
// 573
f974244559_272 = function() { return f974244559_272.returns[f974244559_272.inst++]; };
f974244559_272.returns = [];
f974244559_272.inst = 0;
// 574
ow974244559.JSBNG__Event = f974244559_272;
// 619
ow974244559.JSBNG__XMLDocument = f974244559_157;
// 840
ow974244559.JSBNG__TEMPORARY = 0;
// 841
ow974244559.JSBNG__PERSISTENT = 1;
// 872
f974244559_420 = function() { return f974244559_420.returns[f974244559_420.inst++]; };
f974244559_420.returns = [];
f974244559_420.inst = 0;
// 873
ow974244559.JSBNG__WebKitMutationObserver = f974244559_420;
// 892
ow974244559.JSBNG__indexedDB = o7;
// undefined
o7 = null;
// 893
o7 = {};
// 894
ow974244559.JSBNG__Intl = o7;
// 895
ow974244559.JSBNG__v8Intl = o7;
// undefined
o7 = null;
// 946
ow974244559.JSBNG__IDBTransaction = f974244559_49;
// 947
ow974244559.JSBNG__IDBRequest = f974244559_59;
// 950
ow974244559.JSBNG__IDBObjectStore = f974244559_60;
// 951
ow974244559.JSBNG__IDBKeyRange = f974244559_62;
// 952
ow974244559.JSBNG__IDBIndex = f974244559_51;
// 953
ow974244559.JSBNG__IDBFactory = f974244559_53;
// 954
ow974244559.JSBNG__IDBDatabase = f974244559_57;
// 957
ow974244559.JSBNG__IDBCursor = f974244559_54;
// 958
ow974244559.JSBNG__MutationObserver = f974244559_420;
// 979
f974244559_468 = function() { return f974244559_468.returns[f974244559_468.inst++]; };
f974244559_468.returns = [];
f974244559_468.inst = 0;
// 980
ow974244559.JSBNG__requestAnimationFrame = f974244559_468;
// 983
ow974244559.JSBNG__onerror = null;
// 984
f974244559_470 = function() { return f974244559_470.returns[f974244559_470.inst++]; };
f974244559_470.returns = [];
f974244559_470.inst = 0;
// 985
ow974244559.Math.JSBNG__random = f974244559_470;
// 986
// 990
f974244559_471 = function() { return f974244559_471.returns[f974244559_471.inst++]; };
f974244559_471.returns = [];
f974244559_471.inst = 0;
// 991
f974244559_0.now = f974244559_471;
// 992
f974244559_471.returns.push(1373491283044);
// 993
o5.search = "";
// 1009
// 1010
// 1012
f974244559_472 = function() { return f974244559_472.returns[f974244559_472.inst++]; };
f974244559_472.returns = [];
f974244559_472.inst = 0;
// 1013
o0.JSBNG__addEventListener = f974244559_472;
// 1014
o3.userAgent = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.116 Safari/537.36";
// 1016
f974244559_472.returns.push(undefined);
// 1017
f974244559_473 = function() { return f974244559_473.returns[f974244559_473.inst++]; };
f974244559_473.returns = [];
f974244559_473.inst = 0;
// 1018
ow974244559.JSBNG__onload = f974244559_473;
// 1026
o7 = {};
// 1033
o0.documentMode = void 0;
// 1035
f974244559_475 = function() { return f974244559_475.returns[f974244559_475.inst++]; };
f974244559_475.returns = [];
f974244559_475.inst = 0;
// 1036
o0.getElementsByTagName = f974244559_475;
// 1037
o8 = {};
// 1038
f974244559_475.returns.push(o8);
// 1039
o8.length = 1;
// 1040
o9 = {};
// 1041
o8["0"] = o9;
// undefined
o8 = null;
// 1042
f974244559_478 = function() { return f974244559_478.returns[f974244559_478.inst++]; };
f974244559_478.returns = [];
f974244559_478.inst = 0;
// 1043
o0.createDocumentFragment = f974244559_478;
// 1044
o8 = {};
// 1045
f974244559_478.returns.push(o8);
// 1047
f974244559_471.returns.push(1373491283059);
// 1048
f974244559_480 = function() { return f974244559_480.returns[f974244559_480.inst++]; };
f974244559_480.returns = [];
f974244559_480.inst = 0;
// 1049
o0.createElement = f974244559_480;
// 1050
o10 = {};
// 1051
f974244559_480.returns.push(o10);
// 1052
// 1053
// 1054
// 1055
// 1056
// 1057
// 1058
f974244559_482 = function() { return f974244559_482.returns[f974244559_482.inst++]; };
f974244559_482.returns = [];
f974244559_482.inst = 0;
// 1059
o8.appendChild = f974244559_482;
// 1060
f974244559_482.returns.push(o10);
// 1062
f974244559_471.returns.push(1373491283060);
// 1064
o11 = {};
// 1065
f974244559_480.returns.push(o11);
// 1066
// 1067
// 1068
// 1069
// 1070
// 1071
// 1073
f974244559_482.returns.push(o11);
// 1075
f974244559_471.returns.push(1373491283061);
// 1077
o12 = {};
// 1078
f974244559_480.returns.push(o12);
// 1079
// 1080
// 1081
// 1082
// 1083
// 1084
// 1086
f974244559_482.returns.push(o12);
// 1087
o9.appendChild = f974244559_482;
// 1088
f974244559_482.returns.push(o8);
// undefined
o8 = null;
// 1097
f974244559_470.returns.push(0.4609540579840541);
// 1098
f974244559_485 = function() { return f974244559_485.returns[f974244559_485.inst++]; };
f974244559_485.returns = [];
f974244559_485.inst = 0;
// 1099
ow974244559.JSBNG__onunload = f974244559_485;
// 1101
f974244559_471.returns.push(1373491283074);
// 1102
f974244559_486 = function() { return f974244559_486.returns[f974244559_486.inst++]; };
f974244559_486.returns = [];
f974244559_486.inst = 0;
// 1103
o1.getItem = f974244559_486;
// 1104
f974244559_486.returns.push(null);
// 1106
f974244559_471.returns.push(1373491283075);
// 1107
f974244559_14.returns.push(undefined);
// 1108
f974244559_12.returns.push(1);
// 1112
o8 = {};
// 1113
o0.documentElement = o8;
// 1114
o8.className = "highContrast no_js";
// 1115
// 1117
o0.domain = "jsbngssl.www.facebook.com";
// 1118
// 1120
o5.href = "https://www.facebook.com/LawlabeeTheWallaby";
// 1159
o13 = {};
// 1160
f974244559_475.returns.push(o13);
// 1161
o13.length = 10;
// 1162
o14 = {};
// 1163
o13["0"] = o14;
// 1164
o14.rel = "alternate";
// 1166
o15 = {};
// 1167
o13["1"] = o15;
// 1168
o15.rel = "stylesheet";
// 1170
o15.href = "http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yk/r/TvSvrZCKhi2.css";
// 1185
o16 = {};
// 1186
o13["2"] = o16;
// 1187
o16.rel = "stylesheet";
// 1189
o16.href = "http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yr/r/18Su5nrioMP.css";
// 1204
o17 = {};
// 1205
o13["3"] = o17;
// 1206
o17.rel = "stylesheet";
// 1208
o17.href = "http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yR/r/CXfPMMHwvvH.css";
// 1215
o18 = {};
// 1216
o13["4"] = o18;
// 1217
o18.rel = "stylesheet";
// 1219
o18.href = "http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yi/r/4f32cuKS2xy.css";
// 1230
o19 = {};
// 1231
o13["5"] = o19;
// 1232
o19.rel = "stylesheet";
// 1234
o19.href = "http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yS/r/AXbdtQOFsWr.css";
// 1241
o20 = {};
// 1242
o13["6"] = o20;
// 1243
o20.rel = "shortcut icon";
// 1245
o21 = {};
// 1246
o13["7"] = o21;
// 1247
o21.rel = "stylesheet";
// 1249
o21.href = "http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yD/r/OWwnO_yMqhK.css";
// 1252
o22 = {};
// 1253
o13["8"] = o22;
// 1254
o22.rel = "stylesheet";
// 1256
o22.href = "http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yb/r/tOU0wFcLVo_.css";
// 1261
o23 = {};
// 1262
o13["9"] = o23;
// undefined
o13 = null;
// 1263
o23.rel = "stylesheet";
// 1265
o23.href = "http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yO/r/M-qAxLB_sZh.css";
// 1340
f974244559_471.returns.push(1373491283153);
// 1342
f974244559_471.returns.push(1373491283153);
// 1343
f974244559_14.returns.push(undefined);
// 1344
f974244559_12.returns.push(2);
// 1351
o8.clientWidth = 1050;
// 1367
o8.JSBNG__addEventListener = f974244559_472;
// 1369
f974244559_472.returns.push(undefined);
// 1371
f974244559_472.returns.push(undefined);
// 1390
// 1391
// 1392
// 1395
f974244559_472.returns.push(undefined);
// 1397
o13 = {};
// 1399
o13.target = o8;
// undefined
o13 = null;
// 1400
f974244559_500 = function() { return f974244559_500.returns[f974244559_500.inst++]; };
f974244559_500.returns = [];
f974244559_500.inst = 0;
// 1401
o8.getAttribute = f974244559_500;
// 1403
f974244559_500.returns.push(null);
// 1404
o8.parentNode = o0;
// 1405
o0.getAttribute = void 0;
// 1406
o0.parentNode = null;
// 1409
f974244559_500.returns.push(null);
// 1420
f974244559_471.returns.push(1373491287156);
// 1426
f974244559_471.returns.push(1373491287158);
// 1428
f974244559_471.returns.push(1373491287158);
// 1432
f974244559_471.returns.push(1373491287159);
// 1435
f974244559_471.returns.push(1373491287160);
// 1438
f974244559_471.returns.push(1373491287160);
// 1440
f974244559_471.returns.push(1373491287161);
// 1444
o13 = {};
// 1445
f974244559_478.returns.push(o13);
// 1447
f974244559_482.returns.push(o13);
// undefined
o13 = null;
// 1450
f974244559_471.returns.push(1373491287162);
// 1456
f974244559_471.returns.push(1373491287206);
// 1458
f974244559_471.returns.push(1373491287207);
// 1462
f974244559_471.returns.push(1373491287207);
// 1465
f974244559_471.returns.push(1373491287208);
// 1468
f974244559_471.returns.push(1373491287208);
// 1469
f974244559_502 = function() { return f974244559_502.returns[f974244559_502.inst++]; };
f974244559_502.returns = [];
f974244559_502.inst = 0;
// 1470
o0.getElementById = f974244559_502;
// 1471
o13 = {};
// 1472
f974244559_502.returns.push(o13);
// 1474
o24 = {};
// 1475
f974244559_502.returns.push(o24);
// 1476
o25 = {};
// 1477
o24.firstChild = o25;
// 1479
o25.nodeType = 8;
// 1481
o25.nodeValue = " <div id=\"pagelet_main_column_personal\" data-referrer=\"pagelet_main_column_personal_timeline\"></div> ";
// undefined
o25 = null;
// 1482
o25 = {};
// 1483
o24.parentNode = o25;
// 1484
f974244559_507 = function() { return f974244559_507.returns[f974244559_507.inst++]; };
f974244559_507.returns = [];
f974244559_507.inst = 0;
// 1485
o25.removeChild = f974244559_507;
// 1486
f974244559_507.returns.push(o24);
// undefined
o24 = null;
// 1487
// 1488
o13.getAttribute = f974244559_500;
// 1489
f974244559_500.returns.push("pagelet_timeline_main_column");
// 1492
f974244559_471.returns.push(1373491287211);
// 1496
o24 = {};
// 1497
f974244559_478.returns.push(o24);
// 1499
f974244559_482.returns.push(o24);
// undefined
o24 = null;
// 1505
f974244559_471.returns.push(1373491287224);
// 1507
f974244559_471.returns.push(1373491287225);
// 1511
f974244559_471.returns.push(1373491287225);
// 1515
o24 = {};
// 1516
f974244559_478.returns.push(o24);
// 1518
f974244559_471.returns.push(1373491287226);
// 1519
o0.createStyleSheet = void 0;
// 1521
o26 = {};
// 1522
f974244559_480.returns.push(o26);
// 1523
// 1524
// 1525
// 1527
o27 = {};
// 1528
f974244559_480.returns.push(o27);
// 1529
// 1530
o24.appendChild = f974244559_482;
// 1531
f974244559_482.returns.push(o27);
// 1533
f974244559_471.returns.push(1373491287227);
// 1534
f974244559_13.returns.push(3);
// 1536
o28 = {};
// 1537
f974244559_480.returns.push(o28);
// 1538
// 1539
// 1540
// 1542
f974244559_482.returns.push(o28);
// 1544
f974244559_482.returns.push(o26);
// 1546
f974244559_482.returns.push(o24);
// undefined
o24 = null;
// 1552
o24 = {};
// 1553
f974244559_480.returns.push(o24);
// 1554
// 1556
// 1557
f974244559_514 = function() { return f974244559_514.returns[f974244559_514.inst++]; };
f974244559_514.returns = [];
f974244559_514.inst = 0;
// 1558
o24.getElementsByTagName = f974244559_514;
// 1559
o29 = {};
// 1560
f974244559_514.returns.push(o29);
// 1561
o29.length = 0;
// undefined
o29 = null;
// 1563
o29 = {};
// 1564
o24.childNodes = o29;
// undefined
o24 = null;
// 1565
f974244559_517 = function() { return f974244559_517.returns[f974244559_517.inst++]; };
f974244559_517.returns = [];
f974244559_517.inst = 0;
// 1566
o29.item = f974244559_517;
// 1567
o29.length = 1;
// 1568
o24 = {};
// 1569
o29["0"] = o24;
// undefined
o29 = null;
// 1570
f974244559_519 = function() { return f974244559_519.returns[f974244559_519.inst++]; };
f974244559_519.returns = [];
f974244559_519.inst = 0;
// 1571
o24.getAttributeNode = f974244559_519;
// undefined
o24 = null;
// 1573
o24 = {};
// 1574
f974244559_519.returns.push(o24);
// 1575
o24.value = "u_0_1";
// undefined
o24 = null;
// 1578
// 1579
o24 = {};
// 1580
f974244559_272.prototype = o24;
// 1582
// 1583
// 1584
// 1585
// 1586
// 1587
// 1589
// 1590
// 1591
// 1592
// 1593
// 1594
// undefined
o24 = null;
// 1595
// 1596
// 1597
// 1598
// 1599
// 1600
// 1601
// 1602
// 1603
// 1604
// 1605
// 1606
o3.msPointerEnabled = void 0;
// 1607
// 1608
// 1614
f974244559_471.returns.push(1373491287367);
// 1615
o0.body = o25;
// 1616
o25.getElementsByTagName = f974244559_514;
// 1617
f974244559_522 = function() { return f974244559_522.returns[f974244559_522.inst++]; };
f974244559_522.returns = [];
f974244559_522.inst = 0;
// 1618
o0.querySelectorAll = f974244559_522;
// 1619
f974244559_523 = function() { return f974244559_523.returns[f974244559_523.inst++]; };
f974244559_523.returns = [];
f974244559_523.inst = 0;
// 1620
o25.querySelectorAll = f974244559_523;
// 1621
o24 = {};
// 1622
f974244559_523.returns.push(o24);
// 1623
o24.length = 0;
// undefined
o24 = null;
// 1624
f974244559_14.returns.push(undefined);
// 1625
f974244559_12.returns.push(4);
// 1628
o24 = {};
// 1629
o29 = {};
// 1631
o24.length = 1;
// 1632
o24["0"] = "AyUu6";
// 1640
o8.nodeName = "HTML";
// 1641
o8.__FB_TOKEN = void 0;
// 1642
// 1644
f974244559_527 = function() { return f974244559_527.returns[f974244559_527.inst++]; };
f974244559_527.returns = [];
f974244559_527.inst = 0;
// 1645
o8.hasAttribute = f974244559_527;
// 1647
f974244559_527.returns.push(false);
// 1650
f974244559_472.returns.push(undefined);
// 1651
o8.JSBNG__onmousewheel = null;
// 1653
o30 = {};
// 1654
o31 = {};
// 1656
o30.length = 1;
// 1657
o30["0"] = "OJTM4";
// 1662
o32 = {};
// 1663
o33 = {};
// 1665
o32.length = 1;
// 1666
o32["0"] = "KPZ5T";
// 1668
o34 = {};
// 1670
o28.parentNode = o9;
// 1671
o9.removeChild = f974244559_507;
// 1672
f974244559_507.returns.push(o28);
// 1675
f974244559_471.returns.push(1373491287647);
// 1676
o35 = {};
// 1677
f974244559_4.returns.push(o35);
// 1678
o35.height = "auto";
// undefined
o35 = null;
// 1684
f974244559_471.returns.push(1373491287672);
// 1686
f974244559_471.returns.push(1373491287673);
// 1689
f974244559_471.returns.push(1373491287673);
// 1692
f974244559_471.returns.push(1373491287673);
// 1696
o35 = {};
// 1697
f974244559_478.returns.push(o35);
// 1699
f974244559_482.returns.push(o35);
// undefined
o35 = null;
// 1705
f974244559_471.returns.push(1373491287686);
// 1707
f974244559_471.returns.push(1373491287686);
// 1710
f974244559_471.returns.push(1373491287687);
// 1713
f974244559_471.returns.push(1373491287687);
// 1717
o35 = {};
// 1718
f974244559_478.returns.push(o35);
// 1720
f974244559_482.returns.push(o35);
// undefined
o35 = null;
// 1726
f974244559_471.returns.push(1373491287693);
// 1728
f974244559_471.returns.push(1373491287694);
// 1731
f974244559_471.returns.push(1373491287695);
// 1734
f974244559_471.returns.push(1373491287695);
// 1738
o35 = {};
// 1739
f974244559_478.returns.push(o35);
// 1741
f974244559_482.returns.push(o35);
// undefined
o35 = null;
// 1747
f974244559_471.returns.push(1373491287697);
// 1749
f974244559_471.returns.push(1373491287698);
// 1756
f974244559_471.returns.push(1373491287700);
// 1758
f974244559_471.returns.push(1373491287701);
// 1764
f974244559_471.returns.push(1373491287736);
// 1766
f974244559_471.returns.push(1373491287739);
// 1772
f974244559_471.returns.push(1373491287765);
// 1774
f974244559_471.returns.push(1373491287766);
// 1781
f974244559_471.returns.push(1373491287768);
// 1783
f974244559_471.returns.push(1373491287768);
// 1790
f974244559_471.returns.push(1373491287771);
// 1792
f974244559_471.returns.push(1373491287772);
// 1799
f974244559_471.returns.push(1373491287808);
// 1801
f974244559_471.returns.push(1373491287809);
// 1808
f974244559_471.returns.push(1373491287811);
// 1810
f974244559_471.returns.push(1373491287811);
// 1817
f974244559_471.returns.push(1373491287834);
// 1819
f974244559_471.returns.push(1373491287835);
// 1826
f974244559_471.returns.push(1373491287844);
// 1828
f974244559_471.returns.push(1373491287845);
// 1835
f974244559_471.returns.push(1373491287846);
// 1837
f974244559_471.returns.push(1373491287846);
// 1844
f974244559_471.returns.push(1373491287847);
// 1846
f974244559_471.returns.push(1373491287848);
// 1853
f974244559_471.returns.push(1373491287866);
// 1855
f974244559_471.returns.push(1373491287866);
// 1861
f974244559_471.returns.push(1373491287867);
// 1863
f974244559_471.returns.push(1373491287868);
// 1865
o35 = {};
// 1867
o36 = {};
// 1869
f974244559_473.returns.push(undefined);
// 1872
f974244559_471.returns.push(1373491287880);
// 1873
o37 = {};
// 1874
f974244559_4.returns.push(o37);
// 1875
o37.height = "42px";
// undefined
o37 = null;
// 1876
o27.parentNode = o9;
// 1878
f974244559_507.returns.push(o27);
// undefined
o27 = null;
// 1881
f974244559_471.returns.push(1373491287881);
// 1884
f974244559_471.returns.push(1373491287882);
// 1886
o27 = {};
// 1887
f974244559_502.returns.push(o27);
// 1889
o37 = {};
// 1890
f974244559_502.returns.push(o37);
// 1891
o38 = {};
// 1892
o37.firstChild = o38;
// 1894
o38.nodeType = 8;
// 1896
o38.nodeValue = " <div class=\"fbTimelineTopSectionBase _6-d _529n\"><div id=\"pagelet_above_header_timeline\" data-referrer=\"pagelet_above_header_timeline\"></div><div id=\"above_header_timeline_placeholder\"></div><div class=\"fbTimelineSection mtm fbTimelineTopSection\"><div id=\"fbProfileCover\"><div class=\"cover\" id=\"u_0_h\"><a class=\"coverWrap coverImage\" href=\"http://jsbngssl.www.facebook.com/photo.php?fbid=10200268472248551&amp;set=a.3353777797334.2140697.1055580469&amp;type=1\" rel=\"theater\" ajaxify=\"http://jsbngssl.www.facebook.com/photo.php?fbid=10200268472248551&amp;set=a.3353777797334.2140697.1055580469&amp;type=1&amp;src=https%3A%2F%2Fsphotos-a.xx.fbcdn.net%2Fhphotos-ash3%2F1017486_10200268472248551_842609840_n.jpg&amp;size=851%2C315&amp;source=10\" id=\"fbCoverImageContainer\"><img class=\"coverPhotoImg photo img\" src=\"http://jsbngssl.sphotos-a.xx.fbcdn.net/hphotos-ash3/1017486_10200268472248551_842609840_n.jpg\" alt=\"Cover Photo\" style=\"top:0px;width:100%\" data-fbid=\"10200268472248551\" /><div class=\"coverBorder\"></div><img class=\"coverChangeThrobber img\" src=\"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yk/r/LOOn0JtHNzb.gif\" alt=\"\" width=\"16\" height=\"16\" /></a><div class=\"_6-e\"><h2 class=\"_6-f\"><a class=\"_8_2\" href=\"http://jsbngssl.www.facebook.com/LawlabeeTheWallaby\">Gregor Richards</a></h2></div></div><div id=\"fbTimelineHeadline\" class=\"clearfix\"><div class=\"_50zj\"><div class=\"actions _70j\"><div class=\"actionsDropdown\" id=\"pagelet_timeline_profile_actions\" data-referrer=\"pagelet_timeline_profile_actions\"></div></div></div><div class=\"_70k\"><div class=\"_6_7 clearfix\" data-referrer=\"timeline_light_nav_top\" id=\"u_0_i\"><a class=\"_6-6 _6-7\" href=\"http://jsbngssl.www.facebook.com/LawlabeeTheWallaby\">Timeline<span class=\"_513x\"></span></a><a class=\"_6-6\" href=\"http://jsbngssl.www.facebook.com/LawlabeeTheWallaby/about\" data-medley-id=\"pagelet_timeline_medley_about\">About<span class=\"_513x\"></span></a><a class=\"_6-6\" href=\"http://jsbngssl.www.facebook.com/LawlabeeTheWallaby/photos\" data-medley-id=\"pagelet_timeline_medley_photos\">Photos<span class=\"_513x\"></span></a><a class=\"_6-6\" href=\"http://jsbngssl.www.facebook.com/LawlabeeTheWallaby/friends\" data-medley-id=\"pagelet_timeline_medley_friends\">Friends<span class=\"_513x\"></span></a><div class=\"_6a uiPopover _6-6 _9rx\" id=\"u_0_j\"><a class=\"_9ry _p\" href=\"#\" aria-haspopup=\"true\" aria-expanded=\"false\" rel=\"toggle\" role=\"button\" id=\"u_0_k\">More<i class=\"_bxy img sp_4p6kmz sx_4f53fc\"></i></a></div></div></div><div class=\"name\"><div class=\"photoContainer\"><a class=\"profilePicThumb\" id=\"profile_pic_education\" href=\"http://jsbngssl.www.facebook.com/photo.php?fbid=10200268473688587&amp;set=a.1468918877039.2062262.1055580469&amp;type=1&amp;source=11\" rel=\"theater\"><img class=\"profilePic img\" src=\"http://jsbngssl.fbcdn-profile-a.akamaihd.net/hprofile-ak-frc3/c55.0.552.552/s160x160/993004_10200268473688587_517108607_n.jpg\" alt=\"Gregor Richards\" /></a><meta itemprop=\"image\" content=\"http://jsbngssl.fbcdn-profile-a.akamaihd.net/hprofile-ak-prn2/276274_1055580469_962040234_q.jpg\" /></div></div></div><div id=\"timeline_sticky_header\" data-referrer=\"timeline_sticky_header\"></div></div><div id=\"fbSuggestionsPlaceHolder\"></div></div><div id=\"pagelet_escape_hatch\" data-referrer=\"pagelet_escape_hatch\"></div></div><div id=\"timeline_tab_content\"><div id=\"pagelet_timeline_recent\" data-referrer=\"pagelet_timeline_recent\"></div><div id=\"timeline_tab_content_extra\"></div></div> ";
// undefined
o38 = null;
// 1897
o37.parentNode = o25;
// 1899
f974244559_507.returns.push(o37);
// undefined
o37 = null;
// 1900
// 1901
o27.getAttribute = f974244559_500;
// 1902
f974244559_500.returns.push("pagelet_main_column_personal_timeline");
// 1912
o37 = {};
// 1913
f974244559_480.returns.push(o37);
// 1914
// 1915
// 1916
o37.getElementsByTagName = f974244559_514;
// 1917
o38 = {};
// 1918
f974244559_514.returns.push(o38);
// 1919
o38.length = 0;
// undefined
o38 = null;
// 1921
o38 = {};
// 1922
o37.childNodes = o38;
// undefined
o37 = null;
// 1923
o38.item = f974244559_517;
// 1924
o38.length = 1;
// 1925
o37 = {};
// 1926
o38["0"] = o37;
// undefined
o38 = null;
// 1927
o37.getAttributeNode = f974244559_519;
// 1929
f974244559_519.returns.push(null);
// 1930
o37.getElementsByTagName = f974244559_514;
// 1932
o38 = {};
// 1933
f974244559_514.returns.push(o38);
// 1934
o38.length = 73;
// 1935
o39 = {};
// 1936
o38["0"] = o39;
// 1937
o39.getAttributeNode = f974244559_519;
// undefined
o39 = null;
// 1939
f974244559_519.returns.push(null);
// 1941
o39 = {};
// 1942
o38["1"] = o39;
// 1943
o39.getAttributeNode = f974244559_519;
// undefined
o39 = null;
// 1945
f974244559_519.returns.push(null);
// 1947
o39 = {};
// 1948
o38["2"] = o39;
// 1949
o39.getAttributeNode = f974244559_519;
// undefined
o39 = null;
// 1951
f974244559_519.returns.push(null);
// 1953
o39 = {};
// 1954
o38["3"] = o39;
// 1955
o39.getAttributeNode = f974244559_519;
// undefined
o39 = null;
// 1957
o39 = {};
// 1958
f974244559_519.returns.push(o39);
// 1959
o39.value = "fullScreenSwitch";
// undefined
o39 = null;
// 1961
o39 = {};
// 1962
o38["4"] = o39;
// 1963
o39.getAttributeNode = f974244559_519;
// undefined
o39 = null;
// 1965
o39 = {};
// 1966
f974244559_519.returns.push(o39);
// 1967
o39.value = "fbPhotoSnowliftFullScreenSwitch";
// undefined
o39 = null;
// 1969
o39 = {};
// 1970
o38["5"] = o39;
// 1971
o39.getAttributeNode = f974244559_519;
// undefined
o39 = null;
// 1973
o39 = {};
// 1974
f974244559_519.returns.push(o39);
// 1975
o39.value = "fbPhotoSnowliftFullScreenClose";
// undefined
o39 = null;
// 1977
o39 = {};
// 1978
o38["6"] = o39;
// 1979
o39.getAttributeNode = f974244559_519;
// undefined
o39 = null;
// 1981
f974244559_519.returns.push(null);
// 1983
o39 = {};
// 1984
o38["7"] = o39;
// 1985
o39.getAttributeNode = f974244559_519;
// undefined
o39 = null;
// 1987
o39 = {};
// 1988
f974244559_519.returns.push(o39);
// 1989
o39.value = "fbPhotoSnowliftWantButton";
// undefined
o39 = null;
// 1991
o39 = {};
// 1992
o38["8"] = o39;
// 1993
o39.getAttributeNode = f974244559_519;
// undefined
o39 = null;
// 1995
f974244559_519.returns.push(null);
// 1997
o39 = {};
// 1998
o38["9"] = o39;
// 1999
o39.getAttributeNode = f974244559_519;
// undefined
o39 = null;
// 2001
o39 = {};
// 2002
f974244559_519.returns.push(o39);
// 2003
o39.value = "fbPhotoSnowliftTagBoxes";
// undefined
o39 = null;
// 2005
o39 = {};
// 2006
o38["10"] = o39;
// 2007
o39.getAttributeNode = f974244559_519;
// undefined
o39 = null;
// 2009
o39 = {};
// 2010
f974244559_519.returns.push(o39);
// 2011
o39.value = "fbPhotoSnowliftTagApproval";
// undefined
o39 = null;
// 2013
o39 = {};
// 2014
o38["11"] = o39;
// 2015
o39.getAttributeNode = f974244559_519;
// undefined
o39 = null;
// 2017
o39 = {};
// 2018
f974244559_519.returns.push(o39);
// 2019
o39.value = "fbPhotoSnowliftComputerVisionInfo";
// undefined
o39 = null;
// 2021
o39 = {};
// 2022
o38["12"] = o39;
// 2023
o39.getAttributeNode = f974244559_519;
// undefined
o39 = null;
// 2025
f974244559_519.returns.push(null);
// 2027
o39 = {};
// 2028
o38["13"] = o39;
// 2029
o39.getAttributeNode = f974244559_519;
// undefined
o39 = null;
// 2031
o39 = {};
// 2032
f974244559_519.returns.push(o39);
// 2033
o39.value = "snowliftStageActions";
// undefined
o39 = null;
// 2035
o39 = {};
// 2036
o38["14"] = o39;
// 2037
o39.getAttributeNode = f974244559_519;
// undefined
o39 = null;
// 2039
f974244559_519.returns.push(null);
// 2041
o39 = {};
// 2042
o38["15"] = o39;
// 2043
o39.getAttributeNode = f974244559_519;
// undefined
o39 = null;
// 2045
f974244559_519.returns.push(null);
// 2047
o39 = {};
// 2048
o38["16"] = o39;
// 2049
o39.getAttributeNode = f974244559_519;
// undefined
o39 = null;
// 2051
o39 = {};
// 2052
f974244559_519.returns.push(o39);
// 2053
o39.value = "fbPhotoSnowliftActions";
// undefined
o39 = null;
// 2055
o39 = {};
// 2056
o38["17"] = o39;
// 2057
o39.getAttributeNode = f974244559_519;
// undefined
o39 = null;
// 2059
o39 = {};
// 2060
f974244559_519.returns.push(o39);
// 2061
o39.value = "fbPhotoSnowliftButtons";
// undefined
o39 = null;
// 2063
o39 = {};
// 2064
o38["18"] = o39;
// 2065
o39.getAttributeNode = f974244559_519;
// undefined
o39 = null;
// 2067
f974244559_519.returns.push(null);
// 2069
o39 = {};
// 2070
o38["19"] = o39;
// 2071
o39.getAttributeNode = f974244559_519;
// undefined
o39 = null;
// 2073
f974244559_519.returns.push(null);
// 2075
o39 = {};
// 2076
o38["20"] = o39;
// 2077
o39.getAttributeNode = f974244559_519;
// undefined
o39 = null;
// 2079
o39 = {};
// 2080
f974244559_519.returns.push(o39);
// 2081
o39.value = "fbPhotoSnowliftMediaTitle";
// undefined
o39 = null;
// 2083
o39 = {};
// 2084
o38["21"] = o39;
// 2085
o39.getAttributeNode = f974244559_519;
// undefined
o39 = null;
// 2087
o39 = {};
// 2088
f974244559_519.returns.push(o39);
// 2089
o39.value = "fbPhotoSnowliftPositionAndCount";
// undefined
o39 = null;
// 2091
o39 = {};
// 2092
o38["22"] = o39;
// 2093
o39.getAttributeNode = f974244559_519;
// undefined
o39 = null;
// 2095
f974244559_519.returns.push(null);
// 2097
o39 = {};
// 2098
o38["23"] = o39;
// 2099
o39.getAttributeNode = f974244559_519;
// undefined
o39 = null;
// 2101
f974244559_519.returns.push(null);
// 2103
o39 = {};
// 2104
o38["24"] = o39;
// 2105
o39.getAttributeNode = f974244559_519;
// undefined
o39 = null;
// 2107
f974244559_519.returns.push(null);
// 2109
o39 = {};
// 2110
o38["25"] = o39;
// 2111
o39.getAttributeNode = f974244559_519;
// undefined
o39 = null;
// 2113
f974244559_519.returns.push(null);
// 2115
o39 = {};
// 2116
o38["26"] = o39;
// 2117
o39.getAttributeNode = f974244559_519;
// undefined
o39 = null;
// 2119
f974244559_519.returns.push(null);
// 2121
o39 = {};
// 2122
o38["27"] = o39;
// 2123
o39.getAttributeNode = f974244559_519;
// undefined
o39 = null;
// 2125
f974244559_519.returns.push(null);
// 2127
o39 = {};
// 2128
o38["28"] = o39;
// 2129
o39.getAttributeNode = f974244559_519;
// undefined
o39 = null;
// 2131
f974244559_519.returns.push(null);
// 2133
o39 = {};
// 2134
o38["29"] = o39;
// 2135
o39.getAttributeNode = f974244559_519;
// undefined
o39 = null;
// 2137
f974244559_519.returns.push(null);
// 2139
o39 = {};
// 2140
o38["30"] = o39;
// 2141
o39.getAttributeNode = f974244559_519;
// undefined
o39 = null;
// 2143
f974244559_519.returns.push(null);
// 2145
o39 = {};
// 2146
o38["31"] = o39;
// 2147
o39.getAttributeNode = f974244559_519;
// undefined
o39 = null;
// 2149
f974244559_519.returns.push(null);
// 2151
o39 = {};
// 2152
o38["32"] = o39;
// 2153
o39.getAttributeNode = f974244559_519;
// undefined
o39 = null;
// 2155
f974244559_519.returns.push(null);
// 2157
o39 = {};
// 2158
o38["33"] = o39;
// 2159
o39.getAttributeNode = f974244559_519;
// undefined
o39 = null;
// 2161
f974244559_519.returns.push(null);
// 2163
o39 = {};
// 2164
o38["34"] = o39;
// 2165
o39.getAttributeNode = f974244559_519;
// undefined
o39 = null;
// 2167
f974244559_519.returns.push(null);
// 2169
o39 = {};
// 2170
o38["35"] = o39;
// 2171
o39.getAttributeNode = f974244559_519;
// undefined
o39 = null;
// 2173
o39 = {};
// 2174
f974244559_519.returns.push(o39);
// 2175
o39.value = "fbPhotoSnowliftError";
// undefined
o39 = null;
// 2177
o39 = {};
// 2178
o38["36"] = o39;
// 2179
o39.getAttributeNode = f974244559_519;
// undefined
o39 = null;
// 2181
f974244559_519.returns.push(null);
// 2183
o39 = {};
// 2184
o38["37"] = o39;
// 2185
o39.getAttributeNode = f974244559_519;
// undefined
o39 = null;
// 2187
f974244559_519.returns.push(null);
// 2189
o39 = {};
// 2190
o38["38"] = o39;
// 2191
o39.getAttributeNode = f974244559_519;
// undefined
o39 = null;
// 2193
f974244559_519.returns.push(null);
// 2195
o39 = {};
// 2196
o38["39"] = o39;
// 2197
o39.getAttributeNode = f974244559_519;
// undefined
o39 = null;
// 2199
f974244559_519.returns.push(null);
// 2201
o39 = {};
// 2202
o38["40"] = o39;
// 2203
o39.getAttributeNode = f974244559_519;
// undefined
o39 = null;
// 2205
f974244559_519.returns.push(null);
// 2207
o39 = {};
// 2208
o38["41"] = o39;
// 2209
o39.getAttributeNode = f974244559_519;
// undefined
o39 = null;
// 2211
o39 = {};
// 2212
f974244559_519.returns.push(o39);
// 2213
o39.value = "fbPhotoSnowliftInlineEditor";
// undefined
o39 = null;
// 2215
o39 = {};
// 2216
o38["42"] = o39;
// undefined
o38 = null;
// 2217
o39.getAttributeNode = f974244559_519;
// undefined
o39 = null;
// 2219
o38 = {};
// 2220
f974244559_519.returns.push(o38);
// 2221
o38.value = "u_0_m";
// undefined
o38 = null;
// 2232
o38 = {};
// 2233
f974244559_502.returns.push(o38);
// 2237
o25.scrollWidth = 1050;
// 2238
o25.scrollHeight = 588;
// 2240
f974244559_502.returns.push(o13);
// 2241
o39 = {};
// 2242
o13.style = o39;
// 2243
// undefined
o39 = null;
// 2244
f974244559_11.returns.push(undefined);
// 2254
f974244559_471.returns.push(1373491287972);
// 2258
f974244559_471.returns.push(1373491287973);
// 2260
o39 = {};
// 2261
f974244559_502.returns.push(o39);
// 2263
o40 = {};
// 2264
f974244559_502.returns.push(o40);
// 2265
o41 = {};
// 2266
o40.firstChild = o41;
// 2268
o41.nodeType = 8;
// 2270
o41.nodeValue = " <div class=\"escapeHatchMinimal _4__g\"><div class=\"_70l _51sh\"><div class=\"_57fp\" data-ft=\"&#123;&quot;tn&quot;:&quot;C&quot;&#125;\"><div class=\"fsm fwn fcg\"><span class=\"_71u _70n\"><span>Do you know Gregor?</span></span></div></div></div><div class=\"pam uiBoxWhite noborder\"><div><div class=\"_5109\"><div class=\"FriendButton\" id=\"u_0_o\"><label class=\"FriendRequestAdd addButton selected uiButton uiButtonSpecial uiButtonLarge\" for=\"u_0_p\"><i class=\"mrs img sp_3fr8aa sx_ec0c2b\"></i><input value=\"Add Friend\" type=\"button\" id=\"u_0_p\" /></label><a class=\"FriendRequestOutgoing enableFriendListFlyout outgoingButton enableFriendListFlyout hidden_elem selected uiButton uiButtonSpecial uiButtonLarge\" href=\"#\" role=\"button\" data-profileid=\"1055580469\" data-flloc=\"escape_hatch\" data-cansuggestfriends=\"false\"><i class=\"mrs img sp_3fr8aa sx_ec0c2b\"></i><span class=\"uiButtonText\">Friend Request Sent</span></a></div></div><div class=\"phs pbs _5108\"><div class=\"pbs prm fsl\"></div><span class=\"fsl fcg\"><span id=\"u_0_q\"><span class=\"addFriendText\">To see what he shares with friends, <a class=\"addButton\" href=\"#\" role=\"button\">send him a friend request.</a></span><span class=\"hidden_elem enableFriendListFlyout outgoingButton\" data-profileid=\"1055580469\">Request Sent.</span></span></span></div></div></div><div id=\"fbSuggestionsHatchPlaceHolder\"></div></div> ";
// undefined
o41 = null;
// 2271
o40.parentNode = o25;
// 2273
f974244559_507.returns.push(o40);
// undefined
o40 = null;
// 2274
// 2275
o39.getAttribute = f974244559_500;
// 2276
f974244559_500.returns.push("pagelet_escape_hatch");
// 2287
f974244559_471.returns.push(1373491287984);
// 2291
f974244559_471.returns.push(1373491287985);
// 2293
o40 = {};
// 2294
f974244559_502.returns.push(o40);
// 2295
o40.getAttribute = f974244559_500;
// 2296
f974244559_500.returns.push("pagelet_above_header_timeline");
// 2312
f974244559_471.returns.push(1373491287991);
// 2316
f974244559_471.returns.push(1373491287992);
// 2318
o41 = {};
// 2319
f974244559_502.returns.push(o41);
// 2321
o42 = {};
// 2322
f974244559_502.returns.push(o42);
// 2323
o43 = {};
// 2324
o42.firstChild = o43;
// 2326
o43.nodeType = 8;
// 2328
o43.nodeValue = " <span class=\"uiButtonGroup uiButtonGroupOverlay\" id=\"u_0_s\"><span class=\"firstItem lastItem uiButtonGroupItem buttonItem\"><div class=\"profileHeaderButton FriendButton\" id=\"u_0_14\"><label class=\"FriendRequestAdd addButton uiButton uiButtonOverlay uiButtonLarge\" for=\"u_0_15\"><i class=\"mrs img sp_3fr8aa sx_ec0c2b\"></i><input value=\"Add Friend\" type=\"button\" id=\"u_0_15\" /></label><a class=\"FriendRequestOutgoing enableFriendListFlyout outgoingButton enableFriendListFlyout hidden_elem uiButton uiButtonOverlay uiButtonLarge\" href=\"#\" role=\"button\" data-profileid=\"1055580469\" data-flloc=\"fbx_top_bar\" data-cansuggestfriends=\"false\"><i class=\"mrs img sp_3fr8aa sx_ec0c2b\"></i><span class=\"uiButtonText\">Friend Request Sent</span></a></div></span></span><span class=\"uiButtonGroup uiButtonGroupOverlay\" id=\"u_0_t\"><span class=\"firstItem lastItem uiButtonGroupItem buttonItem\"><span class=\"_52m- _3lt profileHeaderButton\"><a class=\"uiButton uiButtonOverlay uiButtonLarge\" href=\"#\" role=\"button\" ajaxify=\"/ajax/follow/follow_profile.php?profile_id=1055580469&amp;location=1\" rel=\"async-post\" id=\"u_0_10\"><i class=\"mrs img sp_3fr8aa sx_3f5e05\"></i><span class=\"uiButtonText\">Follow</span></a><label class=\"profileFollowButton _52nf _3spg hidden_elem uiButton uiButtonOverlay uiButtonLarge\" id=\"u_0_11\" for=\"u_0_13\"><i class=\"mrs img sp_3fr8aa sx_0bef0b\"></i><input value=\"Following\" aria-haspopup=\"1\" data-profileid=\"1055580469\" type=\"submit\" id=\"u_0_13\" /></label></span></span></span><span class=\"uiButtonGroup actionsContents uiButtonGroupOverlay\" id=\"u_0_u\"><span class=\"firstItem uiButtonGroupItem buttonItem\"><a class=\"uiButton uiButtonOverlay uiButtonLarge\" href=\"/messages/LawlabeeTheWallaby\" role=\"button\" ajaxify=\"/ajax/messaging/composer.php?ids%5B0%5D=1055580469&amp;ref=timeline\" rel=\"dialog\"><span class=\"uiButtonText\">Message</span></a></span><span class=\"lastItem uiButtonGroupItem selectorItem\"><div class=\"uiSelector inlineBlock fbTimelineActionSelector uiSelectorRight\"><div class=\"uiToggle wrap\"><a class=\"fbTimelineActionSelectorButton uiSelectorButton uiButton uiButtonOverlay uiButtonLarge uiButtonNoText\" href=\"#\" role=\"button\" aria-label=\"Other actions\" aria-haspopup=\"1\" rel=\"toggle\"><i class=\"mrs img sp_3fr8aa sx_da9635\"></i><span class=\"uiButtonText\"></span></a><div class=\"uiSelectorMenuWrapper uiToggleFlyout\"><div class=\"uiMenuContainer uiSelectorMenu\"><div role=\"menu\" class=\"uiMenu\" id=\"u_0_w\"><ul class=\"uiMenuInner\"><li class=\"uiMenuItem\" data-label=\"Add to Interest Lists...\" id=\"u_0_x\"><a class=\"itemAnchor\" role=\"menuitem\" tabindex=\"0\" href=\"#\"><span class=\"itemLabel fsm\">Add to Interest Lists...</span></a></li><li class=\"uiMenuSeparator\"></li><li class=\"uiMenuItem\" data-label=\"Report/Block...\"><a class=\"itemAnchor\" role=\"menuitem\" tabindex=\"-1\" href=\"/ajax/report/social.php?content_type=0&amp;cid=1055580469&amp;rid=1055580469&amp;from_gear=timeline\" rel=\"dialog\"><span class=\"itemLabel fsm\">Report/Block...</span></a></li></ul></div><div role=\"menu\" class=\"uiMenu hidden_elem\" id=\"u_0_v\"><ul class=\"uiMenuInner\"><li class=\"uiMenuItem\" data-label=\"Go Back\" id=\"u_0_y\"><a class=\"itemAnchor\" role=\"menuitem\" tabindex=\"0\" href=\"#\"><span class=\"itemLabel fsm\">Go Back</span></a></li><li class=\"uiMenuSeparator\"></li><img class=\"mal pal center img\" src=\"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yk/r/LOOn0JtHNzb.gif\" alt=\"\" id=\"u_0_z\" width=\"16\" height=\"16\" /></ul></div></div></div></div></div></span></span> ";
// undefined
o43 = null;
// 2329
o42.parentNode = o25;
// 2331
f974244559_507.returns.push(o42);
// undefined
o42 = null;
// 2332
// 2333
o41.getAttribute = f974244559_500;
// 2334
f974244559_500.returns.push("pagelet_timeline_profile_actions");
// 2344
o42 = {};
// 2345
f974244559_480.returns.push(o42);
// 2346
// 2347
// 2348
o42.getElementsByTagName = f974244559_514;
// 2349
o43 = {};
// 2350
f974244559_514.returns.push(o43);
// 2351
o43.length = 0;
// undefined
o43 = null;
// 2353
o43 = {};
// 2354
o42.childNodes = o43;
// undefined
o42 = null;
// 2355
o43.item = f974244559_517;
// 2356
o43.length = 1;
// 2357
o42 = {};
// 2358
o43["0"] = o42;
// undefined
o43 = null;
// 2359
o42.getAttributeNode = f974244559_519;
// 2361
f974244559_519.returns.push(null);
// 2362
o42.getElementsByTagName = f974244559_514;
// 2364
o43 = {};
// 2365
f974244559_514.returns.push(o43);
// 2366
o43.length = 4;
// 2367
o44 = {};
// 2368
o43["0"] = o44;
// 2369
o44.getAttributeNode = f974244559_519;
// undefined
o44 = null;
// 2371
f974244559_519.returns.push(null);
// 2373
o44 = {};
// 2374
o43["1"] = o44;
// 2375
o44.getAttributeNode = f974244559_519;
// undefined
o44 = null;
// 2377
f974244559_519.returns.push(null);
// 2379
o44 = {};
// 2380
o43["2"] = o44;
// undefined
o43 = null;
// 2381
o44.getAttributeNode = f974244559_519;
// undefined
o44 = null;
// 2383
o43 = {};
// 2384
f974244559_519.returns.push(o43);
// 2385
o43.value = "u_0_12";
// undefined
o43 = null;
// 2410
f974244559_471.returns.push(1373491288015);
// 2413
f974244559_471.returns.push(1373491288016);
// 2416
f974244559_471.returns.push(1373491288017);
// 2419
f974244559_471.returns.push(1373491288018);
// 2422
f974244559_471.returns.push(1373491288018);
// 2424
o43 = {};
// 2425
f974244559_502.returns.push(o43);
// 2427
o44 = {};
// 2428
f974244559_502.returns.push(o44);
// 2429
o45 = {};
// 2430
o44.firstChild = o45;
// 2432
o45.nodeType = 8;
// 2434
o45.nodeValue = " <div class=\"fbTimelineSection fbTimelineCompactSection fbTimelineSectionTransparent\" id=\"u_0_18\"><div class=\"fbTimelineCapsule clearfix\" data-referrer=\"pagelet_timeline_recent_ocm\" data-start=\"1359228987\" data-end=\"1375340399\" id=\"u_0_17\"><div class=\"_4_7u\"><ol class=\"_3rbf clearfix\" data-referrer=\"pagelet_timeline_recent_ocm\" id=\"u_0_17_left\"></ol><div id=\"pagelet_timeline_recent_more_pager\"></div></div><div class=\"_3rbg\"><ol class=\"_3rbh clearfix\" data-referrer=\"pagelet_timeline_recent_ocm\" id=\"u_0_17_right\"></ol></div></div><div class=\"fbTimelineSubSections\"></div></div><div class=\"hidden_elem fbTimelineSectionExpandPager fbTimelineShowOlderSections\" id=\"u_0_18_scroll_trigger\"><div class=\"uiMorePager\"><a class=\"uiMorePagerPrimary\" href=\"#\" role=\"button\">Show Older Stories</a></div></div> ";
// undefined
o45 = null;
// 2435
o44.parentNode = o25;
// 2437
f974244559_507.returns.push(o44);
// undefined
o44 = null;
// 2438
// 2439
o43.getAttribute = f974244559_500;
// 2440
f974244559_500.returns.push("pagelet_timeline_recent");
// 2448
f974244559_471.returns.push(1373491288028);
// 2453
o44 = {};
// 2454
f974244559_478.returns.push(o44);
// 2456
f974244559_482.returns.push(o44);
// undefined
o44 = null;
// 2459
f974244559_471.returns.push(1373491288030);
// 2462
f974244559_471.returns.push(1373491288030);
// 2465
f974244559_471.returns.push(1373491288030);
// 2467
o44 = {};
// 2468
f974244559_502.returns.push(o44);
// 2469
o44.getAttribute = f974244559_500;
// 2470
f974244559_500.returns.push("pagelet_timeline_recent_ocm");
// 2472
f974244559_471.returns.push(1373491288033);
// 2477
o45 = {};
// 2478
f974244559_478.returns.push(o45);
// 2480
f974244559_482.returns.push(o45);
// undefined
o45 = null;
// 2483
f974244559_471.returns.push(1373491288044);
// 2486
f974244559_471.returns.push(1373491288044);
// 2489
f974244559_471.returns.push(1373491288044);
// 2491
f974244559_502.returns.push(o44);
// 2493
o45 = {};
// 2494
f974244559_502.returns.push(o45);
// 2495
o46 = {};
// 2496
o45.firstChild = o46;
// 2498
o46.nodeType = 8;
// 2500
o46.nodeValue = " <li class=\"fbTimelineUnit fbTimelineTwoColumn clearfix\" data-side=\"l\" data-fixed=\"1\" data-size=\"1\" id=\"tl_unit_2953496614934485437\"><div class=\"topBorder\"></div><div class=\"timelineUnitContainer\" id=\"u_0_1l\" data-gt=\"&#123;&quot;eventtime&quot;:&quot;1373491278&quot;,&quot;viewerid&quot;:&quot;100006118350059&quot;,&quot;profileownerid&quot;:&quot;1055580469&quot;,&quot;unitimpressionid&quot;:&quot;856ec6cb&quot;,&quot;contentid&quot;:&quot;2953496614934485437&quot;,&quot;timeline_unit_type&quot;:&quot;StatusMessageUnit&quot;,&quot;timewindowsize&quot;:&quot;3&quot;,&quot;query_type&quot;:&quot;39&quot;,&quot;contextwindowstart&quot;:&quot;0&quot;,&quot;contextwindowend&quot;:&quot;1375340399&quot;&#125;\" data-time=\"1373055341\"><div class=\"\"><div role=\"article\"><div class=\"clearfix mbs pbs _1_m\"><a class=\"_51wa _29h _303\" href=\"http://jsbngssl.www.facebook.com/LawlabeeTheWallaby?hc_location=timeline\" data-ft=\"&#123;&quot;tn&quot;:&quot;\\\\u003C&quot;&#125;\" tabindex=\"-1\" aria-hidden=\"true\" data-hovercard=\"/ajax/hovercard/user.php?id=1055580469&amp;extragetparams=%7B%22hc_location%22%3A%22timeline%22%7D\"><img class=\"_50c7 img\" src=\"http://jsbngssl.fbcdn-profile-a.akamaihd.net/hprofile-ak-prn2/276274_1055580469_962040234_q.jpg\" alt=\"\" /></a><div class=\"_3dp _29k\"><h5 class=\"_1_s\" data-ft=\"&#123;&quot;tn&quot;:&quot;C&quot;&#125;\"><span class=\"fcg\"><span class=\"fwb\" data-ft=\"&#123;&quot;tn&quot;:&quot;;&quot;&#125;\"><a href=\"http://jsbngssl.www.facebook.com/LawlabeeTheWallaby?hc_location=timeline\" data-hovercard=\"/ajax/hovercard/user.php?id=1055580469&amp;extragetparams=%7B%22hc_location%22%3A%22timeline%22%7D\">Gregor Richards</a></span></span> </h5><div class=\"_1_n fsm fwn fcg\"><a class=\"uiLinkSubtle\" href=\"/LawlabeeTheWallaby/posts/10200350995551582\"><abbr title=\"Friday, July 5, 2013 at 4:15pm\" data-utime=\"1373066141\">July 5</abbr></a><a data-hover=\"tooltip\" aria-label=\"Public\" class=\"uiStreamPrivacy inlineBlock fbStreamPrivacy fbPrivacyAudienceIndicator _1_o\" href=\"#\" role=\"button\"><i class=\"lock img sp_3fr8aa sx_3189ab\"></i></a></div></div></div><div class=\"_1x1\"><div class=\"userContentWrapper\"><div class=\"_wk\"><span data-ft=\"&#123;&quot;tn&quot;:&quot;K&quot;&#125;\" class=\"userContent\">In the Place de la Comédie, there was an accordionist with a very nice, presumably authentic French, Musette accordion. A very French scene.<br /> <br /> This man could not play the Musette if his life depended on it. It made me sad. The twit didn&#039;t even TOUCH the bass manual. What an incompetent imbecile.</span></div></div></div></div><div class=\"fbTimelineUFI uiCommentContainer\"><script type=\"text/javascript\">try {\n    ((JSBNG_Record.scriptLoad)((\"function eb6a2852249195ec780e655c74d557240e052db89(event) {\\u000a    return ((window.Event && Event.__inlineSubmit) && Event.__inlineSubmit(this, event));\\u000a};\"), (\"s594a3efa8594ca08485393a46c38b35fe1adb84c\")));\n    ((window.top.JSBNG_Record.callerJS) = (true));\n    function eb6a2852249195ec780e655c74d557240e052db89(JSBNG__event) {\n        if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n            return ((JSBNG_Record.eventCall)((arguments.callee), (\"s594a3efa8594ca08485393a46c38b35fe1adb84c_0\"), (s594a3efa8594ca08485393a46c38b35fe1adb84c_0_instance), (this), (arguments)))\n        };\n        (null);\n        return (((((JSBNG_Record.get)(window, (\"JSBNG__Event\")))[(\"JSBNG__Event\")]) && (((JSBNG_Record.get)(JSBNG__Event, (\"__inlineSubmit\")))[(\"__inlineSubmit\")])) && (((JSBNG_Record.get)(JSBNG__Event, (\"__inlineSubmit\")))[(\"__inlineSubmit\")])(this, JSBNG__event));\n    };\n    var s594a3efa8594ca08485393a46c38b35fe1adb84c_0_instance;\n    ((s594a3efa8594ca08485393a46c38b35fe1adb84c_0_instance) = ((JSBNG_Record.eventInstance)((\"s594a3efa8594ca08485393a46c38b35fe1adb84c_0\"))));\n    ((JSBNG_Record.markFunction)((eb6a2852249195ec780e655c74d557240e052db89)));\n} finally {\n    ((window.top.JSBNG_Record.callerJS) = (false));\n    ((window.top.JSBNG_Record.flushDeferredEvents)());\n};</script><form rel=\"async\" class=\"live_10200350995551582_316526391751760 commentable_item autoexpand_mode\" method=\"post\" action=\"/ajax/ufi/modify.php\" data-live=\"&#123;&quot;seq&quot;:&quot;10200350995551582_4955918&quot;&#125;\" onsubmit=\"return eb6a2852249195ec780e655c74d557240e052db89.call(this, event);\" id=\"u_0_1w\"><input type=\"hidden\" name=\"charset_test\" value=\"&euro;,&acute;,€,´,水,Д,Є\" /><input type=\"hidden\" name=\"fb_dtsg\" value=\"AQCttlPQ\" autocomplete=\"off\" /><input type=\"hidden\" autocomplete=\"off\" name=\"feedback_params\" value=\"&#123;&quot;actor&quot;:&quot;1055580469&quot;,&quot;target_fbid&quot;:&quot;10200350995551582&quot;,&quot;target_profile_id&quot;:&quot;1055580469&quot;,&quot;type_id&quot;:&quot;22&quot;,&quot;assoc_obj_id&quot;:&quot;&quot;,&quot;source_app_id&quot;:&quot;0&quot;,&quot;extra_story_params&quot;:[],&quot;content_timestamp&quot;:&quot;1373055341&quot;,&quot;check_hash&quot;:&quot;AQCBBladrqmNC16S&quot;,&quot;source&quot;:&quot;13&quot;&#125;\" /><input type=\"hidden\" autocomplete=\"off\" name=\"data_only_response\" value=\"1\" /><input type=\"hidden\" autocomplete=\"off\" name=\"timeline_ufi\" value=\"1\" /><input type=\"hidden\" name=\"timeline_log_data\" value=\"AQA0ygLaoIJHgq67aBT-K1c3pj79g5OygMMsHNzDJu-9etibWoq1ZipXxwv_7rDQYnw7mc7OPjKj5Beyr9GBFDeu4VStyKM9XbyP9Aj0vtj__0Id5nF8bZdAch9fYCTA6Z5HXojmLoKLG9dt6tLzGvMXecj0uIKTkMzqQLePPXxpU1B4-db-2-s3Fh99w9DO1plYSzpabaaYcYw8oo-ejXWEvfGXk3p-qv74e-8VozmoKCDL4y2FEvzILcwwHVgt3obElgmRgnkwQkg4hQ2bZ4fl_dlYe6ISRXOiqnQW5-OOfrkLjdMMB5UcaztBff6fxAxyPURkZBzktcfC5m8jKfdWybdGKs1obIlQzJWki5VmoELTY7QMLjC8T-0UJv9q2zVZ0JBGzEGnpjU8NAQYo9FR\" /><div class=\"fbTimelineFeedbackHeader\"><div class=\"fbTimelineFeedbackActions clearfix\"><span></span><span class=\"UIActionLinks UIActionLinks_bottom\" data-ft=\"&#123;&quot;tn&quot;:&quot;=&quot;,&quot;type&quot;:20&#125;\"><button title=\"Like this item\" type=\"submit\" name=\"like\" class=\"like_link stat_elem as_link\" data-ft=\"&#123;&quot;tn&quot;:&quot;&gt;&quot;,&quot;type&quot;:22&#125;\"><span class=\"default_message\">Like</span><span class=\"saving_message\">Unlike</span></button> &#183; <a class=\"share_action_link\" href=\"/ajax/sharer/?s=22&amp;appid=25554907596&amp;p%5B0%5D=1055580469&amp;p%5B1%5D=10200350995551582&amp;profile_id=1055580469&amp;share_source_type=unknown\" rel=\"dialog\" data-ft=\"&#123;&quot;tn&quot;:&quot;J&quot;,&quot;type&quot;:25&#125;\" title=\"Send this to friends or post it on your timeline.\" role=\"button\">Share</a></span></div></div><div><div class=\"uiUfi UFIContainer\" id=\"u_0_1s\"></div></div></form></div><div class=\"_5ce\"><div class=\"_6a _6b mtm mrs uiPopover _6qd lfloat\" id=\"u_0_1m\"><a class=\"_p uiCloseButton\" href=\"#\" role=\"button\" aria-haspopup=\"true\" aria-expanded=\"false\" rel=\"toggle\" title=\"Remove\" id=\"u_0_1n\"></a></div></div></div></div><i class=\"spinePointer\"></i><div class=\"bottomBorder\"></div></li><li class=\"fbTimelineUnit fbTimelineTwoColumn clearfix\" data-side=\"l\" data-fixed=\"1\" data-size=\"1\" id=\"tl_unit_4498726532280095426\"><div class=\"topBorder\"></div><div class=\"timelineUnitContainer\" id=\"u_0_1i\" data-gt=\"&#123;&quot;eventtime&quot;:&quot;1373491278&quot;,&quot;viewerid&quot;:&quot;100006118350059&quot;,&quot;profileownerid&quot;:&quot;1055580469&quot;,&quot;unitimpressionid&quot;:&quot;856ec6cb&quot;,&quot;contentid&quot;:&quot;4498726532280095426&quot;,&quot;timeline_unit_type&quot;:&quot;StatusMessageUnit&quot;,&quot;timewindowsize&quot;:&quot;3&quot;,&quot;query_type&quot;:&quot;39&quot;,&quot;contextwindowstart&quot;:&quot;0&quot;,&quot;contextwindowend&quot;:&quot;1375340399&quot;&#125;\" data-time=\"1372923465\"><div class=\"\"><div role=\"article\"><div class=\"clearfix mbs pbs _1_m\"><a class=\"_51wa _29h _303\" href=\"http://jsbngssl.www.facebook.com/LawlabeeTheWallaby?hc_location=timeline\" data-ft=\"&#123;&quot;tn&quot;:&quot;\\\\u003C&quot;&#125;\" tabindex=\"-1\" aria-hidden=\"true\" data-hovercard=\"/ajax/hovercard/user.php?id=1055580469&amp;extragetparams=%7B%22hc_location%22%3A%22timeline%22%7D\"><img class=\"_50c7 img\" src=\"http://jsbngssl.fbcdn-profile-a.akamaihd.net/hprofile-ak-prn2/276274_1055580469_962040234_q.jpg\" alt=\"\" /></a><div class=\"_3dp _29k\"><h5 class=\"_1_s\" data-ft=\"&#123;&quot;tn&quot;:&quot;C&quot;&#125;\"><span class=\"fcg\"><span class=\"fwb\" data-ft=\"&#123;&quot;tn&quot;:&quot;;&quot;&#125;\"><a href=\"http://jsbngssl.www.facebook.com/LawlabeeTheWallaby?hc_location=timeline\" data-hovercard=\"/ajax/hovercard/user.php?id=1055580469&amp;extragetparams=%7B%22hc_location%22%3A%22timeline%22%7D\">Gregor Richards</a></span></span> </h5><div class=\"_1_n fsm fwn fcg\"><a class=\"uiLinkSubtle\" href=\"/LawlabeeTheWallaby/posts/10200343222477260\"><abbr title=\"Thursday, July 4, 2013 at 3:37am\" data-utime=\"1372934265\">July 4</abbr></a><a data-hover=\"tooltip\" aria-label=\"Public\" class=\"uiStreamPrivacy inlineBlock fbStreamPrivacy fbPrivacyAudienceIndicator _1_o\" href=\"#\" role=\"button\"><i class=\"lock img sp_3fr8aa sx_3189ab\"></i></a></div></div></div><div class=\"_1x1\"><div class=\"userContentWrapper\"><div class=\"_wk\"><span data-ft=\"&#123;&quot;tn&quot;:&quot;K&quot;&#125;\" class=\"userContent\">This is the second time I&#039;ve been in France on American Independence Day...</span></div></div></div></div><div class=\"fbTimelineUFI uiCommentContainer\"><script type=\"text/javascript\">try {\n    ((JSBNG_Record.scriptLoad)((\"function e5efff7e530726e72f73aa5626d50026e791f1c8e(event) {\\u000a    return ((window.Event && Event.__inlineSubmit) && Event.__inlineSubmit(this, event));\\u000a};\"), (\"s6718815e5c18f00d4dd5eac77b0337dbb6edb0d7\")));\n    ((window.top.JSBNG_Record.callerJS) = (true));\n    function e5efff7e530726e72f73aa5626d50026e791f1c8e(JSBNG__event) {\n        if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n            return ((JSBNG_Record.eventCall)((arguments.callee), (\"s6718815e5c18f00d4dd5eac77b0337dbb6edb0d7_0\"), (s6718815e5c18f00d4dd5eac77b0337dbb6edb0d7_0_instance), (this), (arguments)))\n        };\n        (null);\n        return (((((JSBNG_Record.get)(window, (\"JSBNG__Event\")))[(\"JSBNG__Event\")]) && (((JSBNG_Record.get)(JSBNG__Event, (\"__inlineSubmit\")))[(\"__inlineSubmit\")])) && (((JSBNG_Record.get)(JSBNG__Event, (\"__inlineSubmit\")))[(\"__inlineSubmit\")])(this, JSBNG__event));\n    };\n    var s6718815e5c18f00d4dd5eac77b0337dbb6edb0d7_0_instance;\n    ((s6718815e5c18f00d4dd5eac77b0337dbb6edb0d7_0_instance) = ((JSBNG_Record.eventInstance)((\"s6718815e5c18f00d4dd5eac77b0337dbb6edb0d7_0\"))));\n    ((JSBNG_Record.markFunction)((e5efff7e530726e72f73aa5626d50026e791f1c8e)));\n} finally {\n    ((window.top.JSBNG_Record.callerJS) = (false));\n    ((window.top.JSBNG_Record.flushDeferredEvents)());\n};</script><form rel=\"async\" class=\"live_10200343222477260_316526391751760 commentable_item autoexpand_mode\" method=\"post\" action=\"/ajax/ufi/modify.php\" data-live=\"&#123;&quot;seq&quot;:&quot;10200343222477260_4950571&quot;&#125;\" onsubmit=\"return e5efff7e530726e72f73aa5626d50026e791f1c8e.call(this, event);\" id=\"u_0_1x\"><input type=\"hidden\" name=\"charset_test\" value=\"&euro;,&acute;,€,´,水,Д,Є\" /><input type=\"hidden\" name=\"fb_dtsg\" value=\"AQCttlPQ\" autocomplete=\"off\" /><input type=\"hidden\" autocomplete=\"off\" name=\"feedback_params\" value=\"&#123;&quot;actor&quot;:&quot;1055580469&quot;,&quot;target_fbid&quot;:&quot;10200343222477260&quot;,&quot;target_profile_id&quot;:&quot;1055580469&quot;,&quot;type_id&quot;:&quot;22&quot;,&quot;assoc_obj_id&quot;:&quot;&quot;,&quot;source_app_id&quot;:&quot;0&quot;,&quot;extra_story_params&quot;:[],&quot;content_timestamp&quot;:&quot;1372923465&quot;,&quot;check_hash&quot;:&quot;AQA0MfY19rbYGyj6&quot;,&quot;source&quot;:&quot;13&quot;&#125;\" /><input type=\"hidden\" autocomplete=\"off\" name=\"data_only_response\" value=\"1\" /><input type=\"hidden\" autocomplete=\"off\" name=\"timeline_ufi\" value=\"1\" /><input type=\"hidden\" name=\"timeline_log_data\" value=\"AQCrvWaeB11JjIMAytH5Nvv3qmEhQbh5baPerOqkyOPG1prNmmgkQAYqxfM8F4KjqFTD35ePAPwvQDoPrrHJTHSjopTAuw4pc583uhw3meWdTKut8CfMnKQqizqrxNnzYyp4oPdWH66yt7nwLvLnUzUvcvAjMWicEEkiNWbuP3BEi1jT5w2dD7zoCGzxzHY_BeJ1PJ9BPrKJxn6P8TCdhb40KyMbyy0_kaWcpo1sksJl-adSjcOMevAoGosEm8ZiQxjcmpajE_jLfhvKfoYMMW3spYJ_rJby1Js3Q_VW7GswwODSD2FCX_pOREfx3p9VXZfl1eZNupMCx6QKcIGU-ExdJPac8H7Lp4XnIPKIpA49Y5Y9rJADGzQX23L_q5IbjhfIntPu29XD5hzwIEpzA6EL\" /><div class=\"fbTimelineFeedbackHeader\"><div class=\"fbTimelineFeedbackActions clearfix\"><span></span><span class=\"UIActionLinks UIActionLinks_bottom\" data-ft=\"&#123;&quot;tn&quot;:&quot;=&quot;,&quot;type&quot;:20&#125;\"><button title=\"Like this item\" type=\"submit\" name=\"like\" class=\"like_link stat_elem as_link\" data-ft=\"&#123;&quot;tn&quot;:&quot;&gt;&quot;,&quot;type&quot;:22&#125;\"><span class=\"default_message\">Like</span><span class=\"saving_message\">Unlike</span></button> &#183; <a class=\"share_action_link\" href=\"/ajax/sharer/?s=22&amp;appid=25554907596&amp;p%5B0%5D=1055580469&amp;p%5B1%5D=10200343222477260&amp;profile_id=1055580469&amp;share_source_type=unknown\" rel=\"dialog\" data-ft=\"&#123;&quot;tn&quot;:&quot;J&quot;,&quot;type&quot;:25&#125;\" title=\"Send this to friends or post it on your timeline.\" role=\"button\">Share</a></span></div></div><div><div class=\"uiUfi UFIContainer\" id=\"u_0_1v\"></div></div></form></div><div class=\"_5ce\"><div class=\"_6a _6b mtm mrs uiPopover _6qd lfloat\" id=\"u_0_1j\"><a class=\"_p uiCloseButton\" href=\"#\" role=\"button\" aria-haspopup=\"true\" aria-expanded=\"false\" rel=\"toggle\" title=\"Remove\" id=\"u_0_1k\"></a></div></div></div></div><i class=\"spinePointer\"></i><div class=\"bottomBorder\"></div></li><li class=\"fbTimelineUnit fbTimelineTwoColumn clearfix\" data-side=\"l\" data-fixed=\"1\" data-size=\"1\" id=\"tl_unit_-6185676099150237519\"><div class=\"topBorder\"></div><div class=\"timelineUnitContainer\" id=\"u_0_1f\" data-gt=\"&#123;&quot;eventtime&quot;:&quot;1373491278&quot;,&quot;viewerid&quot;:&quot;100006118350059&quot;,&quot;profileownerid&quot;:&quot;1055580469&quot;,&quot;unitimpressionid&quot;:&quot;856ec6cb&quot;,&quot;contentid&quot;:&quot;-6185676099150237519&quot;,&quot;timeline_unit_type&quot;:&quot;BestPostedLinkUnit&quot;,&quot;timewindowsize&quot;:&quot;3&quot;,&quot;query_type&quot;:&quot;39&quot;,&quot;contextwindowstart&quot;:&quot;0&quot;,&quot;contextwindowend&quot;:&quot;1375340399&quot;&#125;\" data-time=\"1372627013\"><div class=\"\"><div role=\"article\"><div class=\"clearfix mbs pbs _1_m\"><a class=\"_51wa _29h _303\" href=\"http://jsbngssl.www.facebook.com/LawlabeeTheWallaby?hc_location=timeline\" data-ft=\"&#123;&quot;tn&quot;:&quot;\\\\u003C&quot;&#125;\" tabindex=\"-1\" aria-hidden=\"true\" data-hovercard=\"/ajax/hovercard/user.php?id=1055580469&amp;extragetparams=%7B%22hc_location%22%3A%22timeline%22%7D\"><img class=\"_50c7 img\" src=\"http://jsbngssl.fbcdn-profile-a.akamaihd.net/hprofile-ak-prn2/276274_1055580469_962040234_q.jpg\" alt=\"\" /></a><div class=\"_3dp _29k\"><h5 class=\"_1_s\" data-ft=\"&#123;&quot;tn&quot;:&quot;C&quot;&#125;\"><span class=\"fcg\"><span class=\"fwb\"><a href=\"http://jsbngssl.www.facebook.com/LawlabeeTheWallaby\" data-hovercard=\"/ajax/hovercard/user.php?id=1055580469\">Gregor Richards</a></span> shared a <script type=\"text/javascript\">try {\n    ((JSBNG_Record.scriptLoad)((\"function ee3d0ebe4afcc8e6eebdc50ba3a034115d6a59f13(event) {\\u000a    LinkshimAsyncLink.swap(this, \\\"https:\\\\\\\\/\\\\\\\\/www.youtube.com\\\\\\\\/watch?v=GWZ0pN_T9AA\\\");\\u000a};\"), (\"sd77ee50bd055f326db005463a73e4f4f0fd4fb58\")));\n    ((window.top.JSBNG_Record.callerJS) = (true));\n    function ee3d0ebe4afcc8e6eebdc50ba3a034115d6a59f13(JSBNG__event) {\n        if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n            return ((JSBNG_Record.eventCall)((arguments.callee), (\"sd77ee50bd055f326db005463a73e4f4f0fd4fb58_0\"), (sd77ee50bd055f326db005463a73e4f4f0fd4fb58_0_instance), (this), (arguments)))\n        };\n        (null);\n        (((JSBNG_Record.get)(LinkshimAsyncLink, (\"swap\")))[(\"swap\")])(this, \"https:\\\\/\\\\/www.youtube.com\\\\/watch?v=GWZ0pN_T9AA\");\n    };\n    var sd77ee50bd055f326db005463a73e4f4f0fd4fb58_0_instance;\n    ((sd77ee50bd055f326db005463a73e4f4f0fd4fb58_0_instance) = ((JSBNG_Record.eventInstance)((\"sd77ee50bd055f326db005463a73e4f4f0fd4fb58_0\"))));\n    ((JSBNG_Record.markFunction)((ee3d0ebe4afcc8e6eebdc50ba3a034115d6a59f13)));\n} finally {\n    ((window.top.JSBNG_Record.callerJS) = (false));\n    ((window.top.JSBNG_Record.flushDeferredEvents)());\n};</script><script type=\"text/javascript\">try {\n    ((JSBNG_Record.scriptLoad)((\"function e3f6f4a434050754b245acc6eed072e9a1bbc671c(event) {\\u000a    LinkshimAsyncLink.referrer_log(this, \\\"https:\\\\\\\\/\\\\\\\\/www.youtube.com\\\\\\\\/watch?v=GWZ0pN_T9AA\\\", \\\"https:\\\\\\\\/\\\\\\\\/www.facebook.com\\\\\\\\/si\\\\\\\\/ajax\\\\\\\\/l\\\\\\\\/render_linkshim_log\\\\\\\\/?u=https\\\\\\\\u00253A\\\\\\\\u00252F\\\\\\\\u00252Fwww.youtube.com\\\\\\\\u00252Fwatch\\\\\\\\u00253Fv\\\\\\\\u00253DGWZ0pN_T9AA&h=xAQFVP3_IAQFjltrQ5JrEAffmnxAOtdY-LtcqHqk-8fzC3w&enc=AZNZoSoyUIaDqrq9Rumystji3uiZj7Jw0JwygIcAyJQnGd-hQP5ASBF4j7J4Y5IpelCzhpm4g3UtU7Aju2xjUaUE&s=1\\\");\\u000a};\"), (\"s9195168ed768a95b714acc3c6de171641a0d6625\")));\n    ((window.top.JSBNG_Record.callerJS) = (true));\n    function e3f6f4a434050754b245acc6eed072e9a1bbc671c(JSBNG__event) {\n        if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n            return ((JSBNG_Record.eventCall)((arguments.callee), (\"s9195168ed768a95b714acc3c6de171641a0d6625_0\"), (s9195168ed768a95b714acc3c6de171641a0d6625_0_instance), (this), (arguments)))\n        };\n        (null);\n        (((JSBNG_Record.get)(LinkshimAsyncLink, (\"referrer_log\")))[(\"referrer_log\")])(this, \"https:\\\\/\\\\/www.youtube.com\\\\/watch?v=GWZ0pN_T9AA\", \"https:\\\\/\\\\/www.facebook.com\\\\/si\\\\/ajax\\\\/l\\\\/render_linkshim_log\\\\/?u=https\\\\u00253A\\\\u00252F\\\\u00252Fwww.youtube.com\\\\u00252Fwatch\\\\u00253Fv\\\\u00253DGWZ0pN_T9AA&h=xAQFVP3_IAQFjltrQ5JrEAffmnxAOtdY-LtcqHqk-8fzC3w&enc=AZNZoSoyUIaDqrq9Rumystji3uiZj7Jw0JwygIcAyJQnGd-hQP5ASBF4j7J4Y5IpelCzhpm4g3UtU7Aju2xjUaUE&s=1\");\n    };\n    var s9195168ed768a95b714acc3c6de171641a0d6625_0_instance;\n    ((s9195168ed768a95b714acc3c6de171641a0d6625_0_instance) = ((JSBNG_Record.eventInstance)((\"s9195168ed768a95b714acc3c6de171641a0d6625_0\"))));\n    ((JSBNG_Record.markFunction)((e3f6f4a434050754b245acc6eed072e9a1bbc671c)));\n} finally {\n    ((window.top.JSBNG_Record.callerJS) = (false));\n    ((window.top.JSBNG_Record.flushDeferredEvents)());\n};</script><a href=\"http://www.facebook.com/l.php?u=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DGWZ0pN_T9AA&amp;h=xAQFVP3_IAQFjltrQ5JrEAffmnxAOtdY-LtcqHqk-8fzC3w&amp;enc=AZNZoSoyUIaDqrq9Rumystji3uiZj7Jw0JwygIcAyJQnGd-hQP5ASBF4j7J4Y5IpelCzhpm4g3UtU7Aju2xjUaUE&amp;s=1\" rel=\"nofollow\" onmouseover=\"return ee3d0ebe4afcc8e6eebdc50ba3a034115d6a59f13.call(this, event);\" onclick=\"return e3f6f4a434050754b245acc6eed072e9a1bbc671c.call(this, event);\" target=\"_blank\">link</a>.</span> </h5><div class=\"_1_n fsm fwn fcg\"><a class=\"uiLinkSubtle\" href=\"/LawlabeeTheWallaby/posts/10200325012062011\"><abbr title=\"Sunday, June 30, 2013 at 5:16pm\" data-utime=\"1372637813\">June 30</abbr></a><a data-hover=\"tooltip\" aria-label=\"Public\" class=\"uiStreamPrivacy inlineBlock fbStreamPrivacy fbPrivacyAudienceIndicator _1_o\" href=\"#\" role=\"button\"><i class=\"lock img sp_3fr8aa sx_3189ab\"></i></a></div></div></div><div class=\"userContentWrapper aboveUnitContent\" data-ft=\"&#123;&quot;tn&quot;:&quot;K&quot;&#125;\"><div class=\"_wk mbm\"><span class=\"userContent\">OK everyone who wants me to talk more about travel, I made a travel vlog JUST FOR YOU: <script type=\"text/javascript\">try {\n    ((JSBNG_Record.scriptLoad)((\"function e9fc90dc518cf60e3014f922fb7a42eb51231285c(event) {\\u000a    LinkshimAsyncLink.swap(this, \\\"https:\\\\\\\\/\\\\\\\\/www.youtube.com\\\\\\\\/watch?v=GWZ0pN_T9AA\\\");\\u000a};\"), (\"sc89231e05f25f6a6e44da33149dffe67a9bbf1d7\")));\n    ((window.top.JSBNG_Record.callerJS) = (true));\n    function e9fc90dc518cf60e3014f922fb7a42eb51231285c(JSBNG__event) {\n        if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n            return ((JSBNG_Record.eventCall)((arguments.callee), (\"sc89231e05f25f6a6e44da33149dffe67a9bbf1d7_0\"), (sc89231e05f25f6a6e44da33149dffe67a9bbf1d7_0_instance), (this), (arguments)))\n        };\n        (null);\n        (((JSBNG_Record.get)(LinkshimAsyncLink, (\"swap\")))[(\"swap\")])(this, \"https:\\\\/\\\\/www.youtube.com\\\\/watch?v=GWZ0pN_T9AA\");\n    };\n    var sc89231e05f25f6a6e44da33149dffe67a9bbf1d7_0_instance;\n    ((sc89231e05f25f6a6e44da33149dffe67a9bbf1d7_0_instance) = ((JSBNG_Record.eventInstance)((\"sc89231e05f25f6a6e44da33149dffe67a9bbf1d7_0\"))));\n    ((JSBNG_Record.markFunction)((e9fc90dc518cf60e3014f922fb7a42eb51231285c)));\n} finally {\n    ((window.top.JSBNG_Record.callerJS) = (false));\n    ((window.top.JSBNG_Record.flushDeferredEvents)());\n};</script><script type=\"text/javascript\">try {\n    ((JSBNG_Record.scriptLoad)((\"function e514ee88504fed2319bd7834f01dbbf1c60b9d76d(event) {\\u000a    LinkshimAsyncLink.referrer_log(this, \\\"https:\\\\\\\\/\\\\\\\\/www.youtube.com\\\\\\\\/watch?v=GWZ0pN_T9AA\\\", \\\"https:\\\\\\\\/\\\\\\\\/www.facebook.com\\\\\\\\/si\\\\\\\\/ajax\\\\\\\\/l\\\\\\\\/render_linkshim_log\\\\\\\\/?u=https\\\\\\\\u00253A\\\\\\\\u00252F\\\\\\\\u00252Fwww.youtube.com\\\\\\\\u00252Fwatch\\\\\\\\u00253Fv\\\\\\\\u00253DGWZ0pN_T9AA&h=RAQFjDDjy&s=1\\\");\\u000a};\"), (\"s5beb46d690b6b29d5d38fc8dde2dbcf672d59845\")));\n    ((window.top.JSBNG_Record.callerJS) = (true));\n    function e514ee88504fed2319bd7834f01dbbf1c60b9d76d(JSBNG__event) {\n        if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n            return ((JSBNG_Record.eventCall)((arguments.callee), (\"s5beb46d690b6b29d5d38fc8dde2dbcf672d59845_0\"), (s5beb46d690b6b29d5d38fc8dde2dbcf672d59845_0_instance), (this), (arguments)))\n        };\n        (null);\n        (((JSBNG_Record.get)(LinkshimAsyncLink, (\"referrer_log\")))[(\"referrer_log\")])(this, \"https:\\\\/\\\\/www.youtube.com\\\\/watch?v=GWZ0pN_T9AA\", \"https:\\\\/\\\\/www.facebook.com\\\\/si\\\\/ajax\\\\/l\\\\/render_linkshim_log\\\\/?u=https\\\\u00253A\\\\u00252F\\\\u00252Fwww.youtube.com\\\\u00252Fwatch\\\\u00253Fv\\\\u00253DGWZ0pN_T9AA&h=RAQFjDDjy&s=1\");\n    };\n    var s5beb46d690b6b29d5d38fc8dde2dbcf672d59845_0_instance;\n    ((s5beb46d690b6b29d5d38fc8dde2dbcf672d59845_0_instance) = ((JSBNG_Record.eventInstance)((\"s5beb46d690b6b29d5d38fc8dde2dbcf672d59845_0\"))));\n    ((JSBNG_Record.markFunction)((e514ee88504fed2319bd7834f01dbbf1c60b9d76d)));\n} finally {\n    ((window.top.JSBNG_Record.callerJS) = (false));\n    ((window.top.JSBNG_Record.flushDeferredEvents)());\n};</script><a href=\"http://www.facebook.com/l.php?u=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DGWZ0pN_T9AA&amp;h=RAQFjDDjy&amp;s=1\" rel=\"nofollow nofollow\" onmouseover=\"return e9fc90dc518cf60e3014f922fb7a42eb51231285c.call(this, event);\" onclick=\"return e514ee88504fed2319bd7834f01dbbf1c60b9d76d.call(this, event);\" target=\"_blank\">http://jsbngssl.www.youtube.com/watch?v=GWZ0pN_T9AA</a></span></div></div><div class=\"shareUnit\"><div class=\"_1y2\"><div><div class=\"_1xw shareLink _1y0\"><script type=\"text/javascript\">try {\n    ((JSBNG_Record.scriptLoad)((\"function e7a83e6f4f1dbd1eacc9499ae51e35922989b5914(event) {\\u000a    CSS.addClass(this, \\\"_1xu\\\");\\u000a    CSS.removeClass(this, \\\"_1xv\\\");\\u000a};\"), (\"sd5b514d447fd18fce31a602babb4c8576ed8cb85\")));\n    ((window.top.JSBNG_Record.callerJS) = (true));\n    function e7a83e6f4f1dbd1eacc9499ae51e35922989b5914(JSBNG__event) {\n        if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n            return ((JSBNG_Record.eventCall)((arguments.callee), (\"sd5b514d447fd18fce31a602babb4c8576ed8cb85_0\"), (sd5b514d447fd18fce31a602babb4c8576ed8cb85_0_instance), (this), (arguments)))\n        };\n        (null);\n        (((JSBNG_Record.get)(CSS, (\"addClass\")))[(\"addClass\")])(this, \"_1xu\");\n        (((JSBNG_Record.get)(CSS, (\"removeClass\")))[(\"removeClass\")])(this, \"_1xv\");\n    };\n    var sd5b514d447fd18fce31a602babb4c8576ed8cb85_0_instance;\n    ((sd5b514d447fd18fce31a602babb4c8576ed8cb85_0_instance) = ((JSBNG_Record.eventInstance)((\"sd5b514d447fd18fce31a602babb4c8576ed8cb85_0\"))));\n    ((JSBNG_Record.markFunction)((e7a83e6f4f1dbd1eacc9499ae51e35922989b5914)));\n} finally {\n    ((window.top.JSBNG_Record.callerJS) = (false));\n    ((window.top.JSBNG_Record.flushDeferredEvents)());\n};</script><a class=\"_1xv _1xy _1xx\" ajaxify=\"/ajax/flash/expand_inline.php?target_div=u_0_1e&amp;share_id=10200325012062011&amp;max_width=504&amp;max_height=378&amp;context=timelineOC\" rel=\"async\" href=\"#\" onclick=\"return e7a83e6f4f1dbd1eacc9499ae51e35922989b5914.call(this, event);\" role=\"button\"><i class=\"_1y4\"></i><img class=\"_42xb img\" src=\"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/y4/r/-PAXP-deijE.gif\" alt=\"\" height=\"116\" width=\"116\" style=\"background-image: url(http://jsbngssl.fbexternal-a.akamaihd.net/safe_image.php?d=AQBNVc6yXNVNFDHH&amp;w=116&amp;h=116&amp;url=http%3A%2F%2Fi1.ytimg.com%2Fvi%2FGWZ0pN_T9AA%2Fmaxresdefault.jpg%3Ffeature%3Dog&amp;cfs=1);\" /></a><script type=\"text/javascript\">try {\n    ((JSBNG_Record.scriptLoad)((\"function e0be9c1771508e91a0645971dd1a79cb7fba019f2(event) {\\u000a    LinkshimAsyncLink.swap(this, \\\"https:\\\\\\\\/\\\\\\\\/www.youtube.com\\\\\\\\/watch?v=GWZ0pN_T9AA\\\");\\u000a};\"), (\"sc0ddf6b9cc4f845bf4be6f78384bf5d631e864ef\")));\n    ((window.top.JSBNG_Record.callerJS) = (true));\n    function e0be9c1771508e91a0645971dd1a79cb7fba019f2(JSBNG__event) {\n        if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n            return ((JSBNG_Record.eventCall)((arguments.callee), (\"sc0ddf6b9cc4f845bf4be6f78384bf5d631e864ef_0\"), (sc0ddf6b9cc4f845bf4be6f78384bf5d631e864ef_0_instance), (this), (arguments)))\n        };\n        (null);\n        (((JSBNG_Record.get)(LinkshimAsyncLink, (\"swap\")))[(\"swap\")])(this, \"https:\\\\/\\\\/www.youtube.com\\\\/watch?v=GWZ0pN_T9AA\");\n    };\n    var sc0ddf6b9cc4f845bf4be6f78384bf5d631e864ef_0_instance;\n    ((sc0ddf6b9cc4f845bf4be6f78384bf5d631e864ef_0_instance) = ((JSBNG_Record.eventInstance)((\"sc0ddf6b9cc4f845bf4be6f78384bf5d631e864ef_0\"))));\n    ((JSBNG_Record.markFunction)((e0be9c1771508e91a0645971dd1a79cb7fba019f2)));\n} finally {\n    ((window.top.JSBNG_Record.callerJS) = (false));\n    ((window.top.JSBNG_Record.flushDeferredEvents)());\n};</script><script type=\"text/javascript\">try {\n    ((JSBNG_Record.scriptLoad)((\"function e61f455b41f8b0f1a9adfb69f823a2478834d7457(event) {\\u000a    LinkshimAsyncLink.referrer_log(this, \\\"https:\\\\\\\\/\\\\\\\\/www.youtube.com\\\\\\\\/watch?v=GWZ0pN_T9AA\\\", \\\"https:\\\\\\\\/\\\\\\\\/www.facebook.com\\\\\\\\/si\\\\\\\\/ajax\\\\\\\\/l\\\\\\\\/render_linkshim_log\\\\\\\\/?u=https\\\\\\\\u00253A\\\\\\\\u00252F\\\\\\\\u00252Fwww.youtube.com\\\\\\\\u00252Fwatch\\\\\\\\u00253Fv\\\\\\\\u00253DGWZ0pN_T9AA&h=MAQE0gpr2AQFcTBPB81lLv_J_4E1FtJZ9A_uMvJWVZQDrjA&enc=AZPxuuvOEOcc87VspV0z-b7YiofwAZtp5oH-Nq2dEGMZ_wCunpn_g0YaEWa6Wk73h99tMIEjH_vOwlQNvNMxiv1D&s=1\\\");\\u000a};\"), (\"s79e22085fd9abc87a23ff36cc37b4704847a1431\")));\n    ((window.top.JSBNG_Record.callerJS) = (true));\n    function e61f455b41f8b0f1a9adfb69f823a2478834d7457(JSBNG__event) {\n        if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n            return ((JSBNG_Record.eventCall)((arguments.callee), (\"s79e22085fd9abc87a23ff36cc37b4704847a1431_0\"), (s79e22085fd9abc87a23ff36cc37b4704847a1431_0_instance), (this), (arguments)))\n        };\n        (null);\n        (((JSBNG_Record.get)(LinkshimAsyncLink, (\"referrer_log\")))[(\"referrer_log\")])(this, \"https:\\\\/\\\\/www.youtube.com\\\\/watch?v=GWZ0pN_T9AA\", \"https:\\\\/\\\\/www.facebook.com\\\\/si\\\\/ajax\\\\/l\\\\/render_linkshim_log\\\\/?u=https\\\\u00253A\\\\u00252F\\\\u00252Fwww.youtube.com\\\\u00252Fwatch\\\\u00253Fv\\\\u00253DGWZ0pN_T9AA&h=MAQE0gpr2AQFcTBPB81lLv_J_4E1FtJZ9A_uMvJWVZQDrjA&enc=AZPxuuvOEOcc87VspV0z-b7YiofwAZtp5oH-Nq2dEGMZ_wCunpn_g0YaEWa6Wk73h99tMIEjH_vOwlQNvNMxiv1D&s=1\");\n    };\n    var s79e22085fd9abc87a23ff36cc37b4704847a1431_0_instance;\n    ((s79e22085fd9abc87a23ff36cc37b4704847a1431_0_instance) = ((JSBNG_Record.eventInstance)((\"s79e22085fd9abc87a23ff36cc37b4704847a1431_0\"))));\n    ((JSBNG_Record.markFunction)((e61f455b41f8b0f1a9adfb69f823a2478834d7457)));\n} finally {\n    ((window.top.JSBNG_Record.callerJS) = (false));\n    ((window.top.JSBNG_Record.flushDeferredEvents)());\n};</script><a class=\"_1xx _1xz\" href=\"http://www.facebook.com/l.php?u=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DGWZ0pN_T9AA&amp;h=MAQE0gpr2AQFcTBPB81lLv_J_4E1FtJZ9A_uMvJWVZQDrjA&amp;enc=AZPxuuvOEOcc87VspV0z-b7YiofwAZtp5oH-Nq2dEGMZ_wCunpn_g0YaEWa6Wk73h99tMIEjH_vOwlQNvNMxiv1D&amp;s=1\" target=\"_blank\" rel=\"nofollow\" onmouseover=\"return e0be9c1771508e91a0645971dd1a79cb7fba019f2.call(this, event);\" onclick=\"return e61f455b41f8b0f1a9adfb69f823a2478834d7457.call(this, event);\"><div class=\"_1x-\"><div class=\"_1x_ fwb\" dir=\"ltr\">My first travel vlog!</div><div class=\"fsm fwn fcg\">www.youtube.com</div><div class=\"_1y1 fsm fwn fcg\" dir=\"ltr\">I hope you enjoy my first travel vlog RATE COMMENT SHARE SUBSCRIBE WORSHIP</div></div></a></div></div></div></div></div><div class=\"fbTimelineUFI uiCommentContainer\"><script type=\"text/javascript\">try {\n    ((JSBNG_Record.scriptLoad)((\"function ea0bba40a2171dce6b66db0ea574193d5faf14eaa(event) {\\u000a    return ((window.Event && Event.__inlineSubmit) && Event.__inlineSubmit(this, event));\\u000a};\"), (\"sffa75441debf600d62e6a6223d3f2bb359d002b8\")));\n    ((window.top.JSBNG_Record.callerJS) = (true));\n    function ea0bba40a2171dce6b66db0ea574193d5faf14eaa(JSBNG__event) {\n        if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n            return ((JSBNG_Record.eventCall)((arguments.callee), (\"sffa75441debf600d62e6a6223d3f2bb359d002b8_0\"), (sffa75441debf600d62e6a6223d3f2bb359d002b8_0_instance), (this), (arguments)))\n        };\n        (null);\n        return (((((JSBNG_Record.get)(window, (\"JSBNG__Event\")))[(\"JSBNG__Event\")]) && (((JSBNG_Record.get)(JSBNG__Event, (\"__inlineSubmit\")))[(\"__inlineSubmit\")])) && (((JSBNG_Record.get)(JSBNG__Event, (\"__inlineSubmit\")))[(\"__inlineSubmit\")])(this, JSBNG__event));\n    };\n    var sffa75441debf600d62e6a6223d3f2bb359d002b8_0_instance;\n    ((sffa75441debf600d62e6a6223d3f2bb359d002b8_0_instance) = ((JSBNG_Record.eventInstance)((\"sffa75441debf600d62e6a6223d3f2bb359d002b8_0\"))));\n    ((JSBNG_Record.markFunction)((ea0bba40a2171dce6b66db0ea574193d5faf14eaa)));\n} finally {\n    ((window.top.JSBNG_Record.callerJS) = (false));\n    ((window.top.JSBNG_Record.flushDeferredEvents)());\n};</script><form rel=\"async\" class=\"live_10200325012062011_316526391751760 commentable_item autoexpand_mode\" method=\"post\" action=\"/ajax/ufi/modify.php\" data-live=\"&#123;&quot;seq&quot;:0&#125;\" onsubmit=\"return ea0bba40a2171dce6b66db0ea574193d5faf14eaa.call(this, event);\" id=\"u_0_1y\"><input type=\"hidden\" name=\"charset_test\" value=\"&euro;,&acute;,€,´,水,Д,Є\" /><input type=\"hidden\" name=\"fb_dtsg\" value=\"AQCttlPQ\" autocomplete=\"off\" /><input type=\"hidden\" autocomplete=\"off\" name=\"feedback_params\" value=\"&#123;&quot;actor&quot;:&quot;1055580469&quot;,&quot;target_fbid&quot;:&quot;10200325012062011&quot;,&quot;target_profile_id&quot;:&quot;1055580469&quot;,&quot;type_id&quot;:&quot;17&quot;,&quot;assoc_obj_id&quot;:&quot;&quot;,&quot;source_app_id&quot;:&quot;0&quot;,&quot;extra_story_params&quot;:[],&quot;content_timestamp&quot;:&quot;1372627013&quot;,&quot;check_hash&quot;:&quot;AQCDUFoJLtB65-Ke&quot;,&quot;source&quot;:&quot;13&quot;&#125;\" /><input type=\"hidden\" autocomplete=\"off\" name=\"data_only_response\" value=\"1\" /><input type=\"hidden\" autocomplete=\"off\" name=\"timeline_ufi\" value=\"1\" /><input type=\"hidden\" name=\"timeline_log_data\" value=\"AQAFUCiLAT5RUcefEz2gKoDEw2y45fki1LQIejQbsCIWgwWsHCHMRqEd6NhhEE3HTJZ2JeWFwNWNGpTentE0x92XazUIAtkX7WDrpyxi9lvRDzK82lTMz_-Mi3SE3WjxflxWWcoKMLrhgXNr8_aZGGFiPZMoR9NNj1x_UacSFZb2GTZ-WXhNFIoMR3XpZ0Pz27lrZweBjs2LJCZhbxVEPWJ_zyMrKnZHkx2FTxMwMZsHcYwye7UenkmczH058RJbpEvmjgxS1Gm_mgug6mBvaekggu2f8o4Rr45al2p3_SqwfDej46LHq_iPe0GGAcI4qqYAbF-p79BSdK-YgegB9yVzvHPCboN8aAtfuzDypVKin-tqTXAmmqLB3xV3C7kjQE4TV1nfDtFW2pWKQZP4YUc1kQmo11w5z3YMFqDxoxibhQ\" /><div class=\"fbTimelineFeedbackHeader\"><div class=\"fbTimelineFeedbackActions clearfix\"><span></span><span class=\"UIActionLinks UIActionLinks_bottom\" data-ft=\"&#123;&quot;tn&quot;:&quot;=&quot;,&quot;type&quot;:20&#125;\"><button title=\"Like this item\" type=\"submit\" name=\"like\" class=\"like_link stat_elem as_link\" data-ft=\"&#123;&quot;tn&quot;:&quot;&gt;&quot;,&quot;type&quot;:22&#125;\"><span class=\"default_message\">Like</span><span class=\"saving_message\">Unlike</span></button> &#183; <a class=\"share_action_link\" href=\"/ajax/sharer/?s=99&amp;appid=2309869772&amp;p%5B0%5D=1055580469&amp;p%5B1%5D=10200325012062011&amp;profile_id=1055580469&amp;share_source_type=unknown\" rel=\"dialog\" data-ft=\"&#123;&quot;tn&quot;:&quot;J&quot;,&quot;type&quot;:25&#125;\" title=\"Send this to friends or post it on your timeline.\" role=\"button\">Share</a></span></div></div><div><div class=\"uiUfi UFIContainer\" id=\"u_0_1t\"></div></div></form></div><div class=\"_5ce\"><div class=\"_6a _6b mtm mrs uiPopover _6qd lfloat\" id=\"u_0_1g\"><a class=\"_p uiCloseButton\" href=\"#\" role=\"button\" aria-haspopup=\"true\" aria-expanded=\"false\" rel=\"toggle\" title=\"Remove\" id=\"u_0_1h\"></a></div></div></div></div><i class=\"spinePointer\"></i><div class=\"bottomBorder\"></div></li><li class=\"fbTimelineUnit fbTimelineTwoColumn clearfix\" data-side=\"l\" data-fixed=\"1\" data-size=\"1\" id=\"tl_unit_3857418892059122853\"><div class=\"topBorder\"></div><div class=\"timelineUnitContainer\" id=\"u_0_1b\" data-gt=\"&#123;&quot;eventtime&quot;:&quot;1373491278&quot;,&quot;viewerid&quot;:&quot;100006118350059&quot;,&quot;profileownerid&quot;:&quot;1055580469&quot;,&quot;unitimpressionid&quot;:&quot;856ec6cb&quot;,&quot;contentid&quot;:&quot;3857418892059122853&quot;,&quot;timeline_unit_type&quot;:&quot;BestPostedLinkUnit&quot;,&quot;timewindowsize&quot;:&quot;3&quot;,&quot;query_type&quot;:&quot;39&quot;,&quot;contextwindowstart&quot;:&quot;0&quot;,&quot;contextwindowend&quot;:&quot;1375340399&quot;&#125;\" data-time=\"1372262734\"><div class=\"\"><div role=\"article\"><div class=\"clearfix mbs pbs _1_m\"><a class=\"_51wa _29h _303\" href=\"http://jsbngssl.www.facebook.com/LawlabeeTheWallaby?hc_location=timeline\" data-ft=\"&#123;&quot;tn&quot;:&quot;\\\\u003C&quot;&#125;\" tabindex=\"-1\" aria-hidden=\"true\" data-hovercard=\"/ajax/hovercard/user.php?id=1055580469&amp;extragetparams=%7B%22hc_location%22%3A%22timeline%22%7D\"><img class=\"_50c7 img\" src=\"http://jsbngssl.fbcdn-profile-a.akamaihd.net/hprofile-ak-prn2/276274_1055580469_962040234_q.jpg\" alt=\"\" /></a><div class=\"_3dp _29k\"><h5 class=\"_1_s\" data-ft=\"&#123;&quot;tn&quot;:&quot;C&quot;&#125;\"><span class=\"fcg\"><span class=\"fwb\"><a href=\"http://jsbngssl.www.facebook.com/LawlabeeTheWallaby\" data-hovercard=\"/ajax/hovercard/user.php?id=1055580469\">Gregor Richards</a></span> shared a <script type=\"text/javascript\">try {\n    ((JSBNG_Record.scriptLoad)((\"function edf90694c2fb016954fd97754fdd7edafeab56d36(event) {\\u000a    LinkshimAsyncLink.swap(this, \\\"http:\\\\\\\\/\\\\\\\\/www.youtube.com\\\\\\\\/watch?v=i6cb0ggl8bQ&feature=share\\\");\\u000a};\"), (\"s5d7faaa135ee9abbc099cd57075302dca3387ac0\")));\n    ((window.top.JSBNG_Record.callerJS) = (true));\n    function edf90694c2fb016954fd97754fdd7edafeab56d36(JSBNG__event) {\n        if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n            return ((JSBNG_Record.eventCall)((arguments.callee), (\"s5d7faaa135ee9abbc099cd57075302dca3387ac0_0\"), (s5d7faaa135ee9abbc099cd57075302dca3387ac0_0_instance), (this), (arguments)))\n        };\n        (null);\n        (((JSBNG_Record.get)(LinkshimAsyncLink, (\"swap\")))[(\"swap\")])(this, \"http:\\\\/\\\\/www.youtube.com\\\\/watch?v=i6cb0ggl8bQ&feature=share\");\n    };\n    var s5d7faaa135ee9abbc099cd57075302dca3387ac0_0_instance;\n    ((s5d7faaa135ee9abbc099cd57075302dca3387ac0_0_instance) = ((JSBNG_Record.eventInstance)((\"s5d7faaa135ee9abbc099cd57075302dca3387ac0_0\"))));\n    ((JSBNG_Record.markFunction)((edf90694c2fb016954fd97754fdd7edafeab56d36)));\n} finally {\n    ((window.top.JSBNG_Record.callerJS) = (false));\n    ((window.top.JSBNG_Record.flushDeferredEvents)());\n};</script><script type=\"text/javascript\">try {\n    ((JSBNG_Record.scriptLoad)((\"function e88c9c8701fdad33a384b8641d79f798a725fb9c6(event) {\\u000a    LinkshimAsyncLink.referrer_log(this, \\\"http:\\\\\\\\/\\\\\\\\/www.youtube.com\\\\\\\\/watch?v=i6cb0ggl8bQ&feature=share\\\", \\\"https:\\\\\\\\/\\\\\\\\/www.facebook.com\\\\\\\\/si\\\\\\\\/ajax\\\\\\\\/l\\\\\\\\/render_linkshim_log\\\\\\\\/?u=http\\\\\\\\u00253A\\\\\\\\u00252F\\\\\\\\u00252Fwww.youtube.com\\\\\\\\u00252Fwatch\\\\\\\\u00253Fv\\\\\\\\u00253Di6cb0ggl8bQ\\\\\\\\u002526feature\\\\\\\\u00253Dshare&h=QAQGqvEwHAQFok9qv6FbCRILarrnpq5kcpFFAm6COU8GhTQ&enc=AZOUDkGNBZ9uDxd85yz_dR0LtIs2EptUAvNYcBxwyR72O6DTYLjM_cuLxV1SHzDa9IawXxyBI-sV7yTZiuwCmjQE&s=1\\\");\\u000a};\"), (\"sc78581c6960d783d046757153630dc256a88b2b3\")));\n    ((window.top.JSBNG_Record.callerJS) = (true));\n    function e88c9c8701fdad33a384b8641d79f798a725fb9c6(JSBNG__event) {\n        if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n            return ((JSBNG_Record.eventCall)((arguments.callee), (\"sc78581c6960d783d046757153630dc256a88b2b3_0\"), (sc78581c6960d783d046757153630dc256a88b2b3_0_instance), (this), (arguments)))\n        };\n        (null);\n        (((JSBNG_Record.get)(LinkshimAsyncLink, (\"referrer_log\")))[(\"referrer_log\")])(this, \"http:\\\\/\\\\/www.youtube.com\\\\/watch?v=i6cb0ggl8bQ&feature=share\", \"https:\\\\/\\\\/www.facebook.com\\\\/si\\\\/ajax\\\\/l\\\\/render_linkshim_log\\\\/?u=http\\\\u00253A\\\\u00252F\\\\u00252Fwww.youtube.com\\\\u00252Fwatch\\\\u00253Fv\\\\u00253Di6cb0ggl8bQ\\\\u002526feature\\\\u00253Dshare&h=QAQGqvEwHAQFok9qv6FbCRILarrnpq5kcpFFAm6COU8GhTQ&enc=AZOUDkGNBZ9uDxd85yz_dR0LtIs2EptUAvNYcBxwyR72O6DTYLjM_cuLxV1SHzDa9IawXxyBI-sV7yTZiuwCmjQE&s=1\");\n    };\n    var sc78581c6960d783d046757153630dc256a88b2b3_0_instance;\n    ((sc78581c6960d783d046757153630dc256a88b2b3_0_instance) = ((JSBNG_Record.eventInstance)((\"sc78581c6960d783d046757153630dc256a88b2b3_0\"))));\n    ((JSBNG_Record.markFunction)((e88c9c8701fdad33a384b8641d79f798a725fb9c6)));\n} finally {\n    ((window.top.JSBNG_Record.callerJS) = (false));\n    ((window.top.JSBNG_Record.flushDeferredEvents)());\n};</script><a href=\"http://www.facebook.com/l.php?u=http%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3Di6cb0ggl8bQ%26feature%3Dshare&amp;h=QAQGqvEwHAQFok9qv6FbCRILarrnpq5kcpFFAm6COU8GhTQ&amp;enc=AZOUDkGNBZ9uDxd85yz_dR0LtIs2EptUAvNYcBxwyR72O6DTYLjM_cuLxV1SHzDa9IawXxyBI-sV7yTZiuwCmjQE&amp;s=1\" rel=\"nofollow\" onmouseover=\"return edf90694c2fb016954fd97754fdd7edafeab56d36.call(this, event);\" onclick=\"return e88c9c8701fdad33a384b8641d79f798a725fb9c6.call(this, event);\" target=\"_blank\">link</a>.</span> </h5><div class=\"_1_n fsm fwn fcg\"><a class=\"uiLinkSubtle\" href=\"/LawlabeeTheWallaby/posts/10200303357400658\"><abbr title=\"Wednesday, June 26, 2013 at 12:05pm\" data-utime=\"1372273534\">June 26</abbr></a><a data-hover=\"tooltip\" aria-label=\"Public\" class=\"uiStreamPrivacy inlineBlock fbStreamPrivacy fbPrivacyAudienceIndicator _1_o\" href=\"#\" role=\"button\"><i class=\"lock img sp_3fr8aa sx_3189ab\"></i></a></div></div></div><div class=\"userContentWrapper aboveUnitContent\" data-ft=\"&#123;&quot;tn&quot;:&quot;K&quot;&#125;\"><div class=\"_wk mbm\"><span class=\"userContent\">Last one&#039;s the best.</span></div></div><div class=\"shareUnit\"><div class=\"_1y2\"><div><div class=\"_1xw shareLink _1y0\"><script type=\"text/javascript\">try {\n    ((JSBNG_Record.scriptLoad)((\"function e4f4461b134c038c43e53741f6c07b135634ad38b(event) {\\u000a    CSS.addClass(this, \\\"_1xu\\\");\\u000a    CSS.removeClass(this, \\\"_1xv\\\");\\u000a};\"), (\"s784b3c9c5f9acc6efc168fe4ec7cd3c3978da0f0\")));\n    ((window.top.JSBNG_Record.callerJS) = (true));\n    function e4f4461b134c038c43e53741f6c07b135634ad38b(JSBNG__event) {\n        if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n            return ((JSBNG_Record.eventCall)((arguments.callee), (\"s784b3c9c5f9acc6efc168fe4ec7cd3c3978da0f0_0\"), (s784b3c9c5f9acc6efc168fe4ec7cd3c3978da0f0_0_instance), (this), (arguments)))\n        };\n        (null);\n        (((JSBNG_Record.get)(CSS, (\"addClass\")))[(\"addClass\")])(this, \"_1xu\");\n        (((JSBNG_Record.get)(CSS, (\"removeClass\")))[(\"removeClass\")])(this, \"_1xv\");\n    };\n    var s784b3c9c5f9acc6efc168fe4ec7cd3c3978da0f0_0_instance;\n    ((s784b3c9c5f9acc6efc168fe4ec7cd3c3978da0f0_0_instance) = ((JSBNG_Record.eventInstance)((\"s784b3c9c5f9acc6efc168fe4ec7cd3c3978da0f0_0\"))));\n    ((JSBNG_Record.markFunction)((e4f4461b134c038c43e53741f6c07b135634ad38b)));\n} finally {\n    ((window.top.JSBNG_Record.callerJS) = (false));\n    ((window.top.JSBNG_Record.flushDeferredEvents)());\n};</script><a class=\"_1xv _1xy _1xx\" ajaxify=\"/ajax/flash/expand_inline.php?target_div=u_0_1a&amp;share_id=10200303357400658&amp;max_width=504&amp;max_height=378&amp;context=timelineOC\" rel=\"async\" href=\"#\" onclick=\"return e4f4461b134c038c43e53741f6c07b135634ad38b.call(this, event);\" role=\"button\"><i class=\"_1y4\"></i><img class=\"_42xb img\" src=\"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/y4/r/-PAXP-deijE.gif\" alt=\"\" height=\"116\" width=\"116\" style=\"background-image: url(http://jsbngssl.fbexternal-a.akamaihd.net/safe_image.php?d=AQA7R5r-YEOUHY7V&amp;w=116&amp;h=116&amp;url=http%3A%2F%2Fi1.ytimg.com%2Fvi%2Fi6cb0ggl8bQ%2Fhqdefault.jpg%3Ffeature%3Dog&amp;cfs=1);\" /></a><script type=\"text/javascript\">try {\n    ((JSBNG_Record.scriptLoad)((\"function e0be9c9e16542d662692007370f966577e73e0028(event) {\\u000a    LinkshimAsyncLink.swap(this, \\\"http:\\\\\\\\/\\\\\\\\/www.youtube.com\\\\\\\\/watch?v=i6cb0ggl8bQ&feature=share\\\");\\u000a};\"), (\"sff234bab37ce76f35ea200104ba85ddfeb76f760\")));\n    ((window.top.JSBNG_Record.callerJS) = (true));\n    function e0be9c9e16542d662692007370f966577e73e0028(JSBNG__event) {\n        if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n            return ((JSBNG_Record.eventCall)((arguments.callee), (\"sff234bab37ce76f35ea200104ba85ddfeb76f760_0\"), (sff234bab37ce76f35ea200104ba85ddfeb76f760_0_instance), (this), (arguments)))\n        };\n        (null);\n        (((JSBNG_Record.get)(LinkshimAsyncLink, (\"swap\")))[(\"swap\")])(this, \"http:\\\\/\\\\/www.youtube.com\\\\/watch?v=i6cb0ggl8bQ&feature=share\");\n    };\n    var sff234bab37ce76f35ea200104ba85ddfeb76f760_0_instance;\n    ((sff234bab37ce76f35ea200104ba85ddfeb76f760_0_instance) = ((JSBNG_Record.eventInstance)((\"sff234bab37ce76f35ea200104ba85ddfeb76f760_0\"))));\n    ((JSBNG_Record.markFunction)((e0be9c9e16542d662692007370f966577e73e0028)));\n} finally {\n    ((window.top.JSBNG_Record.callerJS) = (false));\n    ((window.top.JSBNG_Record.flushDeferredEvents)());\n};</script><script type=\"text/javascript\">try {\n    ((JSBNG_Record.scriptLoad)((\"function ec4b5dd1365a05d888eb861c40bc4ed1c49b09325(event) {\\u000a    LinkshimAsyncLink.referrer_log(this, \\\"http:\\\\\\\\/\\\\\\\\/www.youtube.com\\\\\\\\/watch?v=i6cb0ggl8bQ&feature=share\\\", \\\"https:\\\\\\\\/\\\\\\\\/www.facebook.com\\\\\\\\/si\\\\\\\\/ajax\\\\\\\\/l\\\\\\\\/render_linkshim_log\\\\\\\\/?u=http\\\\\\\\u00253A\\\\\\\\u00252F\\\\\\\\u00252Fwww.youtube.com\\\\\\\\u00252Fwatch\\\\\\\\u00253Fv\\\\\\\\u00253Di6cb0ggl8bQ\\\\\\\\u002526feature\\\\\\\\u00253Dshare&h=bAQEnft5SAQGS-fFhbNsHQPGCuKfDanJb-861l3IOxjcbiA&enc=AZMi2QfZSHchdhApjvjnq4DaTvu3hrCUT0MZm4oPvdEfmHp0kHgQWKUpUEhXcoD58cFKogChmUs3503jYgddfVSS&s=1\\\");\\u000a};\"), (\"sc3a54f2de423962b298d364143f729b1a313d919\")));\n    ((window.top.JSBNG_Record.callerJS) = (true));\n    function ec4b5dd1365a05d888eb861c40bc4ed1c49b09325(JSBNG__event) {\n        if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n            return ((JSBNG_Record.eventCall)((arguments.callee), (\"sc3a54f2de423962b298d364143f729b1a313d919_0\"), (sc3a54f2de423962b298d364143f729b1a313d919_0_instance), (this), (arguments)))\n        };\n        (null);\n        (((JSBNG_Record.get)(LinkshimAsyncLink, (\"referrer_log\")))[(\"referrer_log\")])(this, \"http:\\\\/\\\\/www.youtube.com\\\\/watch?v=i6cb0ggl8bQ&feature=share\", \"https:\\\\/\\\\/www.facebook.com\\\\/si\\\\/ajax\\\\/l\\\\/render_linkshim_log\\\\/?u=http\\\\u00253A\\\\u00252F\\\\u00252Fwww.youtube.com\\\\u00252Fwatch\\\\u00253Fv\\\\u00253Di6cb0ggl8bQ\\\\u002526feature\\\\u00253Dshare&h=bAQEnft5SAQGS-fFhbNsHQPGCuKfDanJb-861l3IOxjcbiA&enc=AZMi2QfZSHchdhApjvjnq4DaTvu3hrCUT0MZm4oPvdEfmHp0kHgQWKUpUEhXcoD58cFKogChmUs3503jYgddfVSS&s=1\");\n    };\n    var sc3a54f2de423962b298d364143f729b1a313d919_0_instance;\n    ((sc3a54f2de423962b298d364143f729b1a313d919_0_instance) = ((JSBNG_Record.eventInstance)((\"sc3a54f2de423962b298d364143f729b1a313d919_0\"))));\n    ((JSBNG_Record.markFunction)((ec4b5dd1365a05d888eb861c40bc4ed1c49b09325)));\n} finally {\n    ((window.top.JSBNG_Record.callerJS) = (false));\n    ((window.top.JSBNG_Record.flushDeferredEvents)());\n};</script><a class=\"_1xx _1xz\" href=\"http://www.facebook.com/l.php?u=http%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3Di6cb0ggl8bQ%26feature%3Dshare&amp;h=bAQEnft5SAQGS-fFhbNsHQPGCuKfDanJb-861l3IOxjcbiA&amp;enc=AZMi2QfZSHchdhApjvjnq4DaTvu3hrCUT0MZm4oPvdEfmHp0kHgQWKUpUEhXcoD58cFKogChmUs3503jYgddfVSS&amp;s=1\" target=\"_blank\" rel=\"nofollow\" onmouseover=\"return e0be9c9e16542d662692007370f966577e73e0028.call(this, event);\" onclick=\"return ec4b5dd1365a05d888eb861c40bc4ed1c49b09325.call(this, event);\"><div class=\"_1x-\"><div class=\"_1x_ fwb\" dir=\"ltr\">Exploding Actresses 03 - Disney Princesses</div><div class=\"fsm fwn fcg\">www.youtube.com</div><div class=\"_1y1 fsm fwn fcg\" dir=\"ltr\">by Simone Rovellini http://explodingactresses.tumblr.com/ info&#064;simonerovellini.com</div></div></a></div></div></div></div></div><div class=\"fbTimelineUFI uiCommentContainer\"><script type=\"text/javascript\">try {\n    ((JSBNG_Record.scriptLoad)((\"function edce47c0fb42833f2f306974f30788c1d51e434be(event) {\\u000a    return ((window.Event && Event.__inlineSubmit) && Event.__inlineSubmit(this, event));\\u000a};\"), (\"s8882c9d4c3aaeb2ece5bdf64d92ba47d1e0f49ba\")));\n    ((window.top.JSBNG_Record.callerJS) = (true));\n    function edce47c0fb42833f2f306974f30788c1d51e434be(JSBNG__event) {\n        if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n            return ((JSBNG_Record.eventCall)((arguments.callee), (\"s8882c9d4c3aaeb2ece5bdf64d92ba47d1e0f49ba_0\"), (s8882c9d4c3aaeb2ece5bdf64d92ba47d1e0f49ba_0_instance), (this), (arguments)))\n        };\n        (null);\n        return (((((JSBNG_Record.get)(window, (\"JSBNG__Event\")))[(\"JSBNG__Event\")]) && (((JSBNG_Record.get)(JSBNG__Event, (\"__inlineSubmit\")))[(\"__inlineSubmit\")])) && (((JSBNG_Record.get)(JSBNG__Event, (\"__inlineSubmit\")))[(\"__inlineSubmit\")])(this, JSBNG__event));\n    };\n    var s8882c9d4c3aaeb2ece5bdf64d92ba47d1e0f49ba_0_instance;\n    ((s8882c9d4c3aaeb2ece5bdf64d92ba47d1e0f49ba_0_instance) = ((JSBNG_Record.eventInstance)((\"s8882c9d4c3aaeb2ece5bdf64d92ba47d1e0f49ba_0\"))));\n    ((JSBNG_Record.markFunction)((edce47c0fb42833f2f306974f30788c1d51e434be)));\n} finally {\n    ((window.top.JSBNG_Record.callerJS) = (false));\n    ((window.top.JSBNG_Record.flushDeferredEvents)());\n};</script><form rel=\"async\" class=\"live_10200303357400658_316526391751760 commentable_item autoexpand_mode\" method=\"post\" action=\"/ajax/ufi/modify.php\" data-live=\"&#123;&quot;seq&quot;:&quot;10200303357400658_4912511&quot;&#125;\" onsubmit=\"return edce47c0fb42833f2f306974f30788c1d51e434be.call(this, event);\" id=\"u_0_1z\"><input type=\"hidden\" name=\"charset_test\" value=\"&euro;,&acute;,€,´,水,Д,Є\" /><input type=\"hidden\" name=\"fb_dtsg\" value=\"AQCttlPQ\" autocomplete=\"off\" /><input type=\"hidden\" autocomplete=\"off\" name=\"feedback_params\" value=\"&#123;&quot;actor&quot;:&quot;1055580469&quot;,&quot;target_fbid&quot;:&quot;10200303357400658&quot;,&quot;target_profile_id&quot;:&quot;1055580469&quot;,&quot;type_id&quot;:&quot;17&quot;,&quot;assoc_obj_id&quot;:&quot;&quot;,&quot;source_app_id&quot;:&quot;0&quot;,&quot;extra_story_params&quot;:[],&quot;content_timestamp&quot;:&quot;1372262734&quot;,&quot;check_hash&quot;:&quot;AQBLYqqsJU1aAE5L&quot;,&quot;source&quot;:&quot;13&quot;&#125;\" /><input type=\"hidden\" autocomplete=\"off\" name=\"data_only_response\" value=\"1\" /><input type=\"hidden\" autocomplete=\"off\" name=\"timeline_ufi\" value=\"1\" /><input type=\"hidden\" name=\"timeline_log_data\" value=\"AQChaL86QisSqs0sUSs8MRUaUotI69G171F9LUzJjbgJ3UzhkCDbngkCSE3LqTXr_kwkpMKYBFjbAFbf3ARkq6WPhwdNggKyVSvV8KV-PNpxpVpn4z-X01gT7qWCefQ74vFJS2ze7QPxN8wBikMPK_87rL9vxxevWGYc6pl6lt9iairELljWGqZ5OVTPh_6betWgKPnueIKl3cfeeu2Wp8JVo_rxtcGLCbGllyAUoOfJQvVl1ip2BW-lSbknT2jNEqF6YODCH8P6runJMeNh1vdnyrKv4tcAfTjIZJTNToVZuwg0_J_mSNRH0A0Pd0n1fwQ7E6tv0rX79Dhg8U_MZ5vNwdHr1A2inl1kF3pwcKlpAKuaPfTvQg9J_b4Er2dOkDYkc_ns-EaFh3HtRioAV4ql\" /><div class=\"fbTimelineFeedbackHeader\"><div class=\"fbTimelineFeedbackActions clearfix\"><span></span><span class=\"UIActionLinks UIActionLinks_bottom\" data-ft=\"&#123;&quot;tn&quot;:&quot;=&quot;,&quot;type&quot;:20&#125;\"><button title=\"Like this item\" type=\"submit\" name=\"like\" class=\"like_link stat_elem as_link\" data-ft=\"&#123;&quot;tn&quot;:&quot;&gt;&quot;,&quot;type&quot;:22&#125;\"><span class=\"default_message\">Like</span><span class=\"saving_message\">Unlike</span></button> &#183; <a class=\"share_action_link\" href=\"/ajax/sharer/?s=99&amp;appid=2309869772&amp;p%5B0%5D=1055580469&amp;p%5B1%5D=10200303357400658&amp;profile_id=1055580469&amp;share_source_type=unknown\" rel=\"dialog\" data-ft=\"&#123;&quot;tn&quot;:&quot;J&quot;,&quot;type&quot;:25&#125;\" title=\"Send this to friends or post it on your timeline.\" role=\"button\">Share</a></span></div></div><div><div class=\"uiUfi UFIContainer\" id=\"u_0_1p\"></div></div></form></div><div class=\"_5ce\"><div class=\"_6a _6b mtm mrs uiPopover _6qd lfloat\" id=\"u_0_1c\"><a class=\"_p uiCloseButton\" href=\"#\" role=\"button\" aria-haspopup=\"true\" aria-expanded=\"false\" rel=\"toggle\" title=\"Remove\" id=\"u_0_1d\"></a></div></div></div></div><i class=\"spinePointer\"></i><div class=\"bottomBorder\"></div></li> ";
// undefined
o46 = null;
// 2501
o45.parentNode = o25;
// 2503
f974244559_507.returns.push(o45);
// undefined
o45 = null;
// 2505
o45 = {};
// 2506
f974244559_480.returns.push(o45);
// 2507
// 2509
o46 = {};
// 2510
f974244559_478.returns.push(o46);
// 2511
o47 = {};
// undefined
fo974244559_632_firstChild = function() { return fo974244559_632_firstChild.returns[fo974244559_632_firstChild.inst++]; };
fo974244559_632_firstChild.returns = [];
fo974244559_632_firstChild.inst = 0;
defineGetter(o45, "firstChild", fo974244559_632_firstChild, undefined);
// undefined
o45 = null;
// undefined
fo974244559_632_firstChild.returns.push(o47);
// 2513
o46.appendChild = f974244559_482;
// undefined
fo974244559_632_firstChild.returns.push(o47);
// 2515
f974244559_482.returns.push(o47);
// undefined
o47 = null;
// 2516
o45 = {};
// undefined
fo974244559_632_firstChild.returns.push(o45);
// undefined
fo974244559_632_firstChild.returns.push(o45);
// 2520
f974244559_482.returns.push(o45);
// undefined
o45 = null;
// 2521
o45 = {};
// undefined
fo974244559_632_firstChild.returns.push(o45);
// undefined
fo974244559_632_firstChild.returns.push(o45);
// 2525
f974244559_482.returns.push(o45);
// undefined
o45 = null;
// 2526
o45 = {};
// undefined
fo974244559_632_firstChild.returns.push(o45);
// undefined
fo974244559_632_firstChild.returns.push(o45);
// 2530
f974244559_482.returns.push(o45);
// undefined
o45 = null;
// undefined
fo974244559_632_firstChild.returns.push(null);
// 2532
o44.appendChild = f974244559_482;
// 2533
f974244559_482.returns.push(o46);
// undefined
o46 = null;
// 2535
f974244559_500.returns.push("pagelet_timeline_recent_ocm");
// 2593
o45 = {};
// 2594
f974244559_480.returns.push(o45);
// 2595
o46 = {};
// 2596
o0.implementation = o46;
// 2598
f974244559_640 = function() { return f974244559_640.returns[f974244559_640.inst++]; };
f974244559_640.returns = [];
f974244559_640.inst = 0;
// 2599
o46.hasFeature = f974244559_640;
// undefined
o46 = null;
// 2602
f974244559_640.returns.push(false);
// 2604
o46 = {};
// 2605
f974244559_480.returns.push(o46);
// undefined
o46 = null;
// 2607
o46 = {};
// 2608
f974244559_480.returns.push(o46);
// 2609
f974244559_643 = function() { return f974244559_643.returns[f974244559_643.inst++]; };
f974244559_643.returns = [];
f974244559_643.inst = 0;
// 2610
o46.setAttribute = f974244559_643;
// 2611
f974244559_643.returns.push(undefined);
// 2612
o46.JSBNG__onchange = null;
// 2614
// 2615
f974244559_644 = function() { return f974244559_644.returns[f974244559_644.inst++]; };
f974244559_644.returns = [];
f974244559_644.inst = 0;
// 2616
o46.removeAttribute = f974244559_644;
// undefined
o46 = null;
// 2617
f974244559_644.returns.push(undefined);
// 2619
o46 = {};
// 2620
f974244559_480.returns.push(o46);
// 2621
o46.setAttribute = f974244559_643;
// 2622
f974244559_643.returns.push(undefined);
// 2623
o46.JSBNG__oninput = null;
// 2625
// 2626
o46.removeAttribute = f974244559_644;
// undefined
o46 = null;
// 2627
f974244559_644.returns.push(undefined);
// 2628
o46 = {};
// 2629
f974244559_70.returns.push(o46);
// undefined
o46 = null;
// 2630
ow974244559.JSBNG__attachEvent = undefined;
// 2631
f974244559_470.returns.push(0.5932048605754972);
// 2633
o46 = {};
// 2634
f974244559_480.returns.push(o46);
// 2635
// 2636
// 2637
o46.getElementsByTagName = f974244559_514;
// 2638
o47 = {};
// 2639
f974244559_514.returns.push(o47);
// 2640
o47.length = 0;
// undefined
o47 = null;
// 2642
o47 = {};
// 2643
o46.childNodes = o47;
// undefined
o46 = null;
// 2644
o47.item = f974244559_517;
// 2645
o47.length = 1;
// 2646
o46 = {};
// 2647
o47["0"] = o46;
// undefined
o47 = null;
// undefined
o46 = null;
// 2649
o46 = {};
// 2650
f974244559_502.returns.push(o46);
// 2651
o46.id = "u_0_1p";
// 2652
o46.getElementsByTagName = f974244559_514;
// 2653
o47 = {};
// 2654
o46.parentNode = o47;
// 2670
f974244559_471.returns.push(1373491288224);
// 2675
o48 = {};
// 2676
f974244559_523.returns.push(o48);
// 2677
o48.length = 0;
// undefined
o48 = null;
// 2678
f974244559_14.returns.push(undefined);
// 2679
f974244559_12.returns.push(5);
// 2686
f974244559_12.returns.push(6);
// 2690
o48 = {};
// 2691
f974244559_478.returns.push(o48);
// 2693
f974244559_471.returns.push(1373491288228);
// 2695
o49 = {};
// 2696
f974244559_480.returns.push(o49);
// 2697
// 2698
// 2699
// 2700
// 2701
// 2702
// 2703
o48.appendChild = f974244559_482;
// 2704
f974244559_482.returns.push(o49);
// 2706
f974244559_482.returns.push(o48);
// undefined
o48 = null;
// 2710
o48 = {};
// 2711
f974244559_502.returns.push(o48);
// 2712
o48.id = "u_0_1s";
// 2713
o48.getElementsByTagName = f974244559_514;
// 2714
o50 = {};
// 2715
o48.parentNode = o50;
// undefined
fo974244559_651_firstChild = function() { return fo974244559_651_firstChild.returns[fo974244559_651_firstChild.inst++]; };
fo974244559_651_firstChild.returns = [];
fo974244559_651_firstChild.inst = 0;
defineGetter(o46, "firstChild", fo974244559_651_firstChild, undefined);
// undefined
fo974244559_651_firstChild.returns.push(null);
// undefined
fo974244559_651_firstChild.returns.push(null);
// 2737
f974244559_7.returns.push(undefined);
// 2738
ow974244559.JSBNG__onJSBNG__scroll = undefined;
// 2739
f974244559_7.returns.push(undefined);
// 2740
f974244559_658 = function() { return f974244559_658.returns[f974244559_658.inst++]; };
f974244559_658.returns = [];
f974244559_658.inst = 0;
// 2741
ow974244559.JSBNG__onresize = f974244559_658;
// 2744
o0.nodeName = "#document";
// 2745
o0.__FB_TOKEN = void 0;
// 2746
// 2750
f974244559_472.returns.push(undefined);
// 2751
o0.JSBNG__onmouseover = null;
// 2756
f974244559_472.returns.push(undefined);
// 2757
o0.JSBNG__onmousedown = null;
// 2762
f974244559_472.returns.push(undefined);
// 2763
o0.JSBNG__onmouseup = null;
// 2768
f974244559_472.returns.push(undefined);
// 2769
o0.JSBNG__onmousemove = null;
// 2774
f974244559_472.returns.push(undefined);
// 2775
o0.JSBNG__onmouseout = null;
// 2780
f974244559_472.returns.push(undefined);
// 2781
o0.JSBNG__onclick = null;
// 2786
f974244559_472.returns.push(undefined);
// 2787
o0.JSBNG__ondblclick = null;
// 2792
f974244559_472.returns.push(undefined);
// 2793
o0.JSBNG__onkeyup = null;
// 2798
f974244559_472.returns.push(undefined);
// 2799
o0.JSBNG__onkeypress = null;
// 2804
f974244559_472.returns.push(undefined);
// 2805
o0.JSBNG__onkeydown = null;
// 2810
f974244559_472.returns.push(undefined);
// 2811
o0.JSBNG__oninput = null;
// 2816
f974244559_472.returns.push(undefined);
// 2817
o0.JSBNG__onchange = null;
// 2822
f974244559_472.returns.push(undefined);
// 2823
o0.JSBNG__onselectionchange = null;
// 2828
f974244559_472.returns.push(undefined);
// 2829
o0.JSBNG__onDOMCharacterDataModified = void 0;
// 2832
o51 = {};
// 2833
f974244559_480.returns.push(o51);
// 2834
o51.setAttribute = f974244559_643;
// 2835
f974244559_643.returns.push(undefined);
// 2836
o51.JSBNG__ondrag = null;
// 2838
// 2839
o51.removeAttribute = f974244559_644;
// undefined
o51 = null;
// 2840
f974244559_644.returns.push(undefined);
// 2842
o51 = {};
// 2843
f974244559_480.returns.push(o51);
// 2844
o51.setAttribute = f974244559_643;
// 2845
f974244559_643.returns.push(undefined);
// 2846
o51.JSBNG__onwheel = void 0;
// 2848
o51.removeAttribute = f974244559_644;
// undefined
o51 = null;
// 2849
f974244559_644.returns.push(undefined);
// 2852
f974244559_640.returns.push(false);
// 2854
o51 = {};
// 2855
f974244559_480.returns.push(o51);
// 2856
o51.setAttribute = f974244559_643;
// 2857
f974244559_643.returns.push(undefined);
// 2858
o51.JSBNG__onmousewheel = null;
// 2860
// 2861
o51.removeAttribute = f974244559_644;
// undefined
o51 = null;
// 2862
f974244559_644.returns.push(undefined);
// 2866
f974244559_472.returns.push(undefined);
// 2867
o0.JSBNG__onDOMMouseScroll = void 0;
// 2869
o45.JSBNG__addEventListener = f974244559_472;
// undefined
o45 = null;
// 2871
o45 = {};
// 2872
f974244559_480.returns.push(o45);
// 2873
o45.setAttribute = f974244559_643;
// 2874
f974244559_643.returns.push(undefined);
// 2875
o45.JSBNG__onJSBNG__scroll = void 0;
// 2877
o45.removeAttribute = f974244559_644;
// undefined
o45 = null;
// 2878
f974244559_644.returns.push(undefined);
// 2884
o45 = {};
// 2885
f974244559_480.returns.push(o45);
// 2886
o45.setAttribute = f974244559_643;
// 2887
f974244559_643.returns.push(undefined);
// 2888
o45.JSBNG__onJSBNG__focus = void 0;
// 2890
o45.removeAttribute = f974244559_644;
// undefined
o45 = null;
// 2891
f974244559_644.returns.push(undefined);
// 2893
o45 = {};
// 2894
f974244559_480.returns.push(o45);
// 2895
o45.setAttribute = f974244559_643;
// 2896
f974244559_643.returns.push(undefined);
// 2897
o45.JSBNG__onfocusin = void 0;
// 2899
o45.removeAttribute = f974244559_644;
// undefined
o45 = null;
// 2900
f974244559_644.returns.push(undefined);
// undefined
fo974244559_651_firstChild.returns.push(null);
// 2902
f974244559_470.returns.push(0.41786139039322734);
// 2904
f974244559_471.returns.push(1373491288299);
// 2906
f974244559_471.returns.push(1373491288299);
// 2907
o0.activeElement = o25;
// 2908
o25.nodeName = "BODY";
// 2910
o25.contentEditable = "inherit";
// 2912
f974244559_471.returns.push(1373491288300);
// 2914
f974244559_471.returns.push(1373491288300);
// 2916
f974244559_471.returns.push(1373491288300);
// 2918
f974244559_471.returns.push(1373491288300);
// 2920
f974244559_471.returns.push(1373491288308);
// 2921
o46.nodeType = 1;
// 2923
f974244559_471.returns.push(1373491288308);
// 2927
o45 = {};
// 2928
f974244559_478.returns.push(o45);
// 2930
f974244559_482.returns.push(o45);
// undefined
o45 = null;
// 2932
f974244559_471.returns.push(1373491288342);
// 2936
o45 = {};
// 2937
f974244559_478.returns.push(o45);
// 2939
f974244559_482.returns.push(o45);
// undefined
o45 = null;
// 2941
f974244559_471.returns.push(1373491288363);
// 2945
o45 = {};
// 2946
f974244559_478.returns.push(o45);
// 2948
f974244559_482.returns.push(o45);
// undefined
o45 = null;
// 2950
f974244559_471.returns.push(1373491288376);
// 2954
o45 = {};
// 2955
f974244559_478.returns.push(o45);
// 2957
f974244559_482.returns.push(o45);
// undefined
o45 = null;
// 2959
f974244559_471.returns.push(1373491288386);
// 2961
f974244559_471.returns.push(1373491288389);
// 2963
f974244559_471.returns.push(1373491288389);
// 2965
o46.nextSibling = null;
// 2966
o47.removeChild = f974244559_507;
// 2967
f974244559_507.returns.push(o46);
// 2968
// 2969
o47.appendChild = f974244559_482;
// 2970
f974244559_482.returns.push(o46);
// 2972
f974244559_471.returns.push(1373491288399);
// 2974
f974244559_471.returns.push(1373491288399);
// 2976
f974244559_471.returns.push(1373491288399);
// 2979
f974244559_471.returns.push(1373491288399);
// 2981
f974244559_471.returns.push(1373491288399);
// 2983
f974244559_471.returns.push(1373491288400);
// 2985
f974244559_471.returns.push(1373491288400);
// 2986
o45 = {};
// undefined
fo974244559_651_firstChild.returns.push(o45);
// 2988
o45.getAttributeNode = f974244559_519;
// 2990
o51 = {};
// 2991
f974244559_519.returns.push(o51);
// 2992
o51.value = ".r[2hk8m]";
// 2993
o52 = {};
// 2994
o45.firstChild = o52;
// 2995
o52.getAttributeNode = f974244559_519;
// 2997
o53 = {};
// 2998
f974244559_519.returns.push(o53);
// 2999
o53.value = ".r[2hk8m].[1][4][0]";
// 3000
o54 = {};
// 3001
o52.firstChild = o54;
// undefined
o54 = null;
// 3002
o54 = {};
// 3003
o52.nextSibling = o54;
// undefined
o52 = null;
// 3004
o54.getAttributeNode = f974244559_519;
// 3006
o52 = {};
// 3007
f974244559_519.returns.push(o52);
// 3008
o52.value = ".r[2hk8m].[1][4][1]{comment10200303357400658_4912489}";
// 3009
o55 = {};
// 3010
o54.firstChild = o55;
// 3011
o55.getAttributeNode = f974244559_519;
// 3013
o56 = {};
// 3014
f974244559_519.returns.push(o56);
// 3015
o56.value = ".r[2hk8m].[1][4][1]{comment10200303357400658_4912489}.[0]";
// undefined
o56 = null;
// 3016
o56 = {};
// 3017
o55.firstChild = o56;
// undefined
o55 = null;
// 3018
o56.getAttributeNode = f974244559_519;
// 3020
o55 = {};
// 3021
f974244559_519.returns.push(o55);
// 3022
o55.value = ".r[2hk8m].[1][4][1]{comment10200303357400658_4912489}.[0].[left]";
// undefined
o55 = null;
// 3023
o55 = {};
// 3024
o56.firstChild = o55;
// undefined
o55 = null;
// 3025
o55 = {};
// 3026
o56.nextSibling = o55;
// undefined
o56 = null;
// 3027
o55.getAttributeNode = f974244559_519;
// 3029
o56 = {};
// 3030
f974244559_519.returns.push(o56);
// 3031
o56.value = ".r[2hk8m].[1][4][1]{comment10200303357400658_4912489}.[0].[right]";
// undefined
o56 = null;
// 3032
o56 = {};
// 3033
o55.firstChild = o56;
// undefined
o55 = null;
// 3034
o56.getAttributeNode = f974244559_519;
// 3036
o55 = {};
// 3037
f974244559_519.returns.push(o55);
// 3038
o55.value = ".r[2hk8m].[1][4][1]{comment10200303357400658_4912489}.[0].[right].[0]";
// undefined
o55 = null;
// 3039
o55 = {};
// 3040
o56.firstChild = o55;
// undefined
o56 = null;
// 3041
o55.getAttributeNode = f974244559_519;
// 3043
o56 = {};
// 3044
f974244559_519.returns.push(o56);
// 3045
o56.value = ".r[2hk8m].[1][4][1]{comment10200303357400658_4912489}.[0].[right].[0].[left]";
// undefined
o56 = null;
// 3046
o56 = {};
// 3047
o55.firstChild = o56;
// undefined
o55 = null;
// 3048
o56.getAttributeNode = f974244559_519;
// 3050
o55 = {};
// 3051
f974244559_519.returns.push(o55);
// 3052
o55.value = ".r[2hk8m].[1][4][1]{comment10200303357400658_4912489}.[0].[right].[0].[left].[0]";
// undefined
o55 = null;
// 3053
o55 = {};
// 3054
o56.firstChild = o55;
// undefined
o56 = null;
// 3055
o55.getAttributeNode = f974244559_519;
// 3057
o56 = {};
// 3058
f974244559_519.returns.push(o56);
// 3059
o56.value = ".r[2hk8m].[1][4][1]{comment10200303357400658_4912489}.[0].[right].[0].[left].[0].[0]";
// undefined
o56 = null;
// 3060
o56 = {};
// 3061
o55.firstChild = o56;
// undefined
o55 = null;
// 3062
o56.getAttributeNode = f974244559_519;
// 3064
o55 = {};
// 3065
f974244559_519.returns.push(o55);
// 3066
o55.value = ".r[2hk8m].[1][4][1]{comment10200303357400658_4912489}.[0].[right].[0].[left].[0].[0].[0][0]";
// undefined
o55 = null;
// 3067
o55 = {};
// 3068
o56.firstChild = o55;
// undefined
o55 = null;
// 3069
o55 = {};
// 3070
o56.nextSibling = o55;
// undefined
o56 = null;
// 3071
o55.getAttributeNode = f974244559_519;
// 3073
o56 = {};
// 3074
f974244559_519.returns.push(o56);
// 3075
o56.value = ".r[2hk8m].[1][4][1]{comment10200303357400658_4912489}.[0].[right].[0].[left].[0].[0].[0][1]";
// undefined
o56 = null;
// 3076
o56 = {};
// 3077
o55.firstChild = o56;
// undefined
o56 = null;
// 3078
o56 = {};
// 3079
o55.nextSibling = o56;
// undefined
o55 = null;
// 3080
o56.getAttributeNode = f974244559_519;
// 3082
o55 = {};
// 3083
f974244559_519.returns.push(o55);
// 3084
o55.value = ".r[2hk8m].[1][4][1]{comment10200303357400658_4912489}.[0].[right].[0].[left].[0].[0].[0][2]";
// undefined
o55 = null;
// 3085
o55 = {};
// 3086
o56.firstChild = o55;
// undefined
o55 = null;
// 3087
o55 = {};
// 3088
o56.nextSibling = o55;
// undefined
o56 = null;
// 3089
o55.getAttributeNode = f974244559_519;
// undefined
o55 = null;
// 3091
o55 = {};
// 3092
f974244559_519.returns.push(o55);
// 3093
o55.value = ".r[2hk8m].[1][4][1]{comment10200303357400658_4912489}.[0].[right].[0].[left].[0].[0].[3]";
// undefined
o55 = null;
// 3096
f974244559_519.returns.push(o52);
// 3098
f974244559_702 = function() { return f974244559_702.returns[f974244559_702.inst++]; };
f974244559_702.returns = [];
f974244559_702.inst = 0;
// 3099
o46.contains = f974244559_702;
// 3101
f974244559_702.returns.push(true);
// undefined
fo974244559_651_firstChild.returns.push(o45);
// 3105
f974244559_519.returns.push(o51);
// 3110
f974244559_519.returns.push(o53);
// 3116
f974244559_519.returns.push(o52);
// 3119
o55 = {};
// 3120
o54.nextSibling = o55;
// undefined
o54 = null;
// 3121
o55.getAttributeNode = f974244559_519;
// 3123
o54 = {};
// 3124
f974244559_519.returns.push(o54);
// 3125
o54.value = ".r[2hk8m].[1][4][1]{comment10200303357400658_4912495}";
// 3126
o56 = {};
// 3127
o55.firstChild = o56;
// 3128
o56.getAttributeNode = f974244559_519;
// 3130
o57 = {};
// 3131
f974244559_519.returns.push(o57);
// 3132
o57.value = ".r[2hk8m].[1][4][1]{comment10200303357400658_4912495}.[0]";
// undefined
o57 = null;
// 3133
o57 = {};
// 3134
o56.firstChild = o57;
// undefined
o56 = null;
// 3135
o57.getAttributeNode = f974244559_519;
// 3137
o56 = {};
// 3138
f974244559_519.returns.push(o56);
// 3139
o56.value = ".r[2hk8m].[1][4][1]{comment10200303357400658_4912495}.[0].[left]";
// undefined
o56 = null;
// 3140
o56 = {};
// 3141
o57.firstChild = o56;
// undefined
o56 = null;
// 3142
o56 = {};
// 3143
o57.nextSibling = o56;
// undefined
o57 = null;
// 3144
o56.getAttributeNode = f974244559_519;
// 3146
o57 = {};
// 3147
f974244559_519.returns.push(o57);
// 3148
o57.value = ".r[2hk8m].[1][4][1]{comment10200303357400658_4912495}.[0].[right]";
// undefined
o57 = null;
// 3149
o57 = {};
// 3150
o56.firstChild = o57;
// undefined
o56 = null;
// 3151
o57.getAttributeNode = f974244559_519;
// 3153
o56 = {};
// 3154
f974244559_519.returns.push(o56);
// 3155
o56.value = ".r[2hk8m].[1][4][1]{comment10200303357400658_4912495}.[0].[right].[0]";
// undefined
o56 = null;
// 3156
o56 = {};
// 3157
o57.firstChild = o56;
// undefined
o57 = null;
// 3158
o56.getAttributeNode = f974244559_519;
// 3160
o57 = {};
// 3161
f974244559_519.returns.push(o57);
// 3162
o57.value = ".r[2hk8m].[1][4][1]{comment10200303357400658_4912495}.[0].[right].[0].[left]";
// undefined
o57 = null;
// 3163
o57 = {};
// 3164
o56.firstChild = o57;
// undefined
o56 = null;
// 3165
o57.getAttributeNode = f974244559_519;
// 3167
o56 = {};
// 3168
f974244559_519.returns.push(o56);
// 3169
o56.value = ".r[2hk8m].[1][4][1]{comment10200303357400658_4912495}.[0].[right].[0].[left].[0]";
// undefined
o56 = null;
// 3170
o56 = {};
// 3171
o57.firstChild = o56;
// undefined
o57 = null;
// 3172
o56.getAttributeNode = f974244559_519;
// 3174
o57 = {};
// 3175
f974244559_519.returns.push(o57);
// 3176
o57.value = ".r[2hk8m].[1][4][1]{comment10200303357400658_4912495}.[0].[right].[0].[left].[0].[0]";
// undefined
o57 = null;
// 3177
o57 = {};
// 3178
o56.firstChild = o57;
// undefined
o56 = null;
// 3179
o57.getAttributeNode = f974244559_519;
// 3181
o56 = {};
// 3182
f974244559_519.returns.push(o56);
// 3183
o56.value = ".r[2hk8m].[1][4][1]{comment10200303357400658_4912495}.[0].[right].[0].[left].[0].[0].[0][0]";
// undefined
o56 = null;
// 3184
o56 = {};
// 3185
o57.firstChild = o56;
// undefined
o56 = null;
// 3186
o56 = {};
// 3187
o57.nextSibling = o56;
// undefined
o57 = null;
// 3188
o56.getAttributeNode = f974244559_519;
// 3190
o57 = {};
// 3191
f974244559_519.returns.push(o57);
// 3192
o57.value = ".r[2hk8m].[1][4][1]{comment10200303357400658_4912495}.[0].[right].[0].[left].[0].[0].[0][1]";
// undefined
o57 = null;
// 3193
o57 = {};
// 3194
o56.firstChild = o57;
// undefined
o57 = null;
// 3195
o57 = {};
// 3196
o56.nextSibling = o57;
// undefined
o56 = null;
// 3197
o57.getAttributeNode = f974244559_519;
// 3199
o56 = {};
// 3200
f974244559_519.returns.push(o56);
// 3201
o56.value = ".r[2hk8m].[1][4][1]{comment10200303357400658_4912495}.[0].[right].[0].[left].[0].[0].[0][2]";
// undefined
o56 = null;
// 3202
o56 = {};
// 3203
o57.firstChild = o56;
// undefined
o56 = null;
// 3204
o56 = {};
// 3205
o57.nextSibling = o56;
// undefined
o57 = null;
// 3206
o56.getAttributeNode = f974244559_519;
// undefined
o56 = null;
// 3208
o56 = {};
// 3209
f974244559_519.returns.push(o56);
// 3210
o56.value = ".r[2hk8m].[1][4][1]{comment10200303357400658_4912495}.[0].[right].[0].[left].[0].[0].[3]";
// undefined
o56 = null;
// 3213
f974244559_519.returns.push(o54);
// 3217
f974244559_702.returns.push(true);
// undefined
fo974244559_651_firstChild.returns.push(o45);
// 3221
f974244559_519.returns.push(o51);
// 3226
f974244559_519.returns.push(o53);
// 3232
f974244559_519.returns.push(o52);
// 3238
f974244559_519.returns.push(o54);
// 3241
o56 = {};
// 3242
o55.nextSibling = o56;
// undefined
o55 = null;
// 3243
o56.getAttributeNode = f974244559_519;
// 3245
o55 = {};
// 3246
f974244559_519.returns.push(o55);
// 3247
o55.value = ".r[2hk8m].[1][4][1]{comment10200303357400658_4912503}";
// 3248
o57 = {};
// 3249
o56.firstChild = o57;
// 3250
o57.getAttributeNode = f974244559_519;
// 3252
o58 = {};
// 3253
f974244559_519.returns.push(o58);
// 3254
o58.value = ".r[2hk8m].[1][4][1]{comment10200303357400658_4912503}.[0]";
// undefined
o58 = null;
// 3255
o58 = {};
// 3256
o57.firstChild = o58;
// undefined
o57 = null;
// 3257
o58.getAttributeNode = f974244559_519;
// 3259
o57 = {};
// 3260
f974244559_519.returns.push(o57);
// 3261
o57.value = ".r[2hk8m].[1][4][1]{comment10200303357400658_4912503}.[0].[left]";
// undefined
o57 = null;
// 3262
o57 = {};
// 3263
o58.firstChild = o57;
// undefined
o57 = null;
// 3264
o57 = {};
// 3265
o58.nextSibling = o57;
// undefined
o58 = null;
// 3266
o57.getAttributeNode = f974244559_519;
// 3268
o58 = {};
// 3269
f974244559_519.returns.push(o58);
// 3270
o58.value = ".r[2hk8m].[1][4][1]{comment10200303357400658_4912503}.[0].[right]";
// undefined
o58 = null;
// 3271
o58 = {};
// 3272
o57.firstChild = o58;
// undefined
o57 = null;
// 3273
o58.getAttributeNode = f974244559_519;
// 3275
o57 = {};
// 3276
f974244559_519.returns.push(o57);
// 3277
o57.value = ".r[2hk8m].[1][4][1]{comment10200303357400658_4912503}.[0].[right].[0]";
// undefined
o57 = null;
// 3278
o57 = {};
// 3279
o58.firstChild = o57;
// undefined
o58 = null;
// 3280
o57.getAttributeNode = f974244559_519;
// 3282
o58 = {};
// 3283
f974244559_519.returns.push(o58);
// 3284
o58.value = ".r[2hk8m].[1][4][1]{comment10200303357400658_4912503}.[0].[right].[0].[left]";
// undefined
o58 = null;
// 3285
o58 = {};
// 3286
o57.firstChild = o58;
// undefined
o57 = null;
// 3287
o58.getAttributeNode = f974244559_519;
// 3289
o57 = {};
// 3290
f974244559_519.returns.push(o57);
// 3291
o57.value = ".r[2hk8m].[1][4][1]{comment10200303357400658_4912503}.[0].[right].[0].[left].[0]";
// undefined
o57 = null;
// 3292
o57 = {};
// 3293
o58.firstChild = o57;
// undefined
o58 = null;
// 3294
o57.getAttributeNode = f974244559_519;
// 3296
o58 = {};
// 3297
f974244559_519.returns.push(o58);
// 3298
o58.value = ".r[2hk8m].[1][4][1]{comment10200303357400658_4912503}.[0].[right].[0].[left].[0].[0]";
// undefined
o58 = null;
// 3299
o58 = {};
// 3300
o57.firstChild = o58;
// undefined
o57 = null;
// 3301
o58.getAttributeNode = f974244559_519;
// 3303
o57 = {};
// 3304
f974244559_519.returns.push(o57);
// 3305
o57.value = ".r[2hk8m].[1][4][1]{comment10200303357400658_4912503}.[0].[right].[0].[left].[0].[0].[0][0]";
// undefined
o57 = null;
// 3306
o57 = {};
// 3307
o58.firstChild = o57;
// undefined
o57 = null;
// 3308
o57 = {};
// 3309
o58.nextSibling = o57;
// undefined
o58 = null;
// 3310
o57.getAttributeNode = f974244559_519;
// 3312
o58 = {};
// 3313
f974244559_519.returns.push(o58);
// 3314
o58.value = ".r[2hk8m].[1][4][1]{comment10200303357400658_4912503}.[0].[right].[0].[left].[0].[0].[0][1]";
// undefined
o58 = null;
// 3315
o58 = {};
// 3316
o57.firstChild = o58;
// undefined
o58 = null;
// 3317
o58 = {};
// 3318
o57.nextSibling = o58;
// undefined
o57 = null;
// 3319
o58.getAttributeNode = f974244559_519;
// 3321
o57 = {};
// 3322
f974244559_519.returns.push(o57);
// 3323
o57.value = ".r[2hk8m].[1][4][1]{comment10200303357400658_4912503}.[0].[right].[0].[left].[0].[0].[0][2]";
// undefined
o57 = null;
// 3324
o57 = {};
// 3325
o58.firstChild = o57;
// undefined
o57 = null;
// 3326
o57 = {};
// 3327
o58.nextSibling = o57;
// undefined
o58 = null;
// 3328
o57.getAttributeNode = f974244559_519;
// undefined
o57 = null;
// 3330
o57 = {};
// 3331
f974244559_519.returns.push(o57);
// 3332
o57.value = ".r[2hk8m].[1][4][1]{comment10200303357400658_4912503}.[0].[right].[0].[left].[0].[0].[3]";
// undefined
o57 = null;
// 3335
f974244559_519.returns.push(o55);
// 3339
f974244559_702.returns.push(true);
// undefined
fo974244559_651_firstChild.returns.push(o45);
// undefined
o45 = null;
// 3343
f974244559_519.returns.push(o51);
// undefined
o51 = null;
// 3348
f974244559_519.returns.push(o53);
// undefined
o53 = null;
// 3354
f974244559_519.returns.push(o52);
// undefined
o52 = null;
// 3360
f974244559_519.returns.push(o54);
// undefined
o54 = null;
// 3366
f974244559_519.returns.push(o55);
// undefined
o55 = null;
// 3369
o45 = {};
// 3370
o56.nextSibling = o45;
// undefined
o56 = null;
// 3371
o45.getAttributeNode = f974244559_519;
// 3373
o51 = {};
// 3374
f974244559_519.returns.push(o51);
// 3375
o51.value = ".r[2hk8m].[1][4][1]{comment10200303357400658_4912511}";
// 3376
o52 = {};
// 3377
o45.firstChild = o52;
// undefined
o45 = null;
// 3378
o52.getAttributeNode = f974244559_519;
// 3380
o45 = {};
// 3381
f974244559_519.returns.push(o45);
// 3382
o45.value = ".r[2hk8m].[1][4][1]{comment10200303357400658_4912511}.[0]";
// undefined
o45 = null;
// 3383
o45 = {};
// 3384
o52.firstChild = o45;
// undefined
o52 = null;
// 3385
o45.getAttributeNode = f974244559_519;
// 3387
o52 = {};
// 3388
f974244559_519.returns.push(o52);
// 3389
o52.value = ".r[2hk8m].[1][4][1]{comment10200303357400658_4912511}.[0].[left]";
// undefined
o52 = null;
// 3390
o52 = {};
// 3391
o45.firstChild = o52;
// undefined
o52 = null;
// 3392
o52 = {};
// 3393
o45.nextSibling = o52;
// undefined
o45 = null;
// 3394
o52.getAttributeNode = f974244559_519;
// 3396
o45 = {};
// 3397
f974244559_519.returns.push(o45);
// 3398
o45.value = ".r[2hk8m].[1][4][1]{comment10200303357400658_4912511}.[0].[right]";
// undefined
o45 = null;
// 3399
o45 = {};
// 3400
o52.firstChild = o45;
// undefined
o52 = null;
// 3401
o45.getAttributeNode = f974244559_519;
// 3403
o52 = {};
// 3404
f974244559_519.returns.push(o52);
// 3405
o52.value = ".r[2hk8m].[1][4][1]{comment10200303357400658_4912511}.[0].[right].[0]";
// undefined
o52 = null;
// 3406
o52 = {};
// 3407
o45.firstChild = o52;
// undefined
o45 = null;
// 3408
o52.getAttributeNode = f974244559_519;
// 3410
o45 = {};
// 3411
f974244559_519.returns.push(o45);
// 3412
o45.value = ".r[2hk8m].[1][4][1]{comment10200303357400658_4912511}.[0].[right].[0].[left]";
// undefined
o45 = null;
// 3413
o45 = {};
// 3414
o52.firstChild = o45;
// undefined
o52 = null;
// 3415
o45.getAttributeNode = f974244559_519;
// 3417
o52 = {};
// 3418
f974244559_519.returns.push(o52);
// 3419
o52.value = ".r[2hk8m].[1][4][1]{comment10200303357400658_4912511}.[0].[right].[0].[left].[0]";
// undefined
o52 = null;
// 3420
o52 = {};
// 3421
o45.firstChild = o52;
// undefined
o45 = null;
// 3422
o52.getAttributeNode = f974244559_519;
// 3424
o45 = {};
// 3425
f974244559_519.returns.push(o45);
// 3426
o45.value = ".r[2hk8m].[1][4][1]{comment10200303357400658_4912511}.[0].[right].[0].[left].[0].[0]";
// undefined
o45 = null;
// 3427
o45 = {};
// 3428
o52.firstChild = o45;
// undefined
o52 = null;
// 3429
o45.getAttributeNode = f974244559_519;
// 3431
o52 = {};
// 3432
f974244559_519.returns.push(o52);
// 3433
o52.value = ".r[2hk8m].[1][4][1]{comment10200303357400658_4912511}.[0].[right].[0].[left].[0].[0].[0][0]";
// undefined
o52 = null;
// 3434
o52 = {};
// 3435
o45.firstChild = o52;
// undefined
o52 = null;
// 3436
o52 = {};
// 3437
o45.nextSibling = o52;
// undefined
o45 = null;
// 3438
o52.getAttributeNode = f974244559_519;
// 3440
o45 = {};
// 3441
f974244559_519.returns.push(o45);
// 3442
o45.value = ".r[2hk8m].[1][4][1]{comment10200303357400658_4912511}.[0].[right].[0].[left].[0].[0].[0][1]";
// undefined
o45 = null;
// 3443
o45 = {};
// 3444
o52.firstChild = o45;
// undefined
o45 = null;
// 3445
o45 = {};
// 3446
o52.nextSibling = o45;
// undefined
o52 = null;
// 3447
o45.getAttributeNode = f974244559_519;
// 3449
o52 = {};
// 3450
f974244559_519.returns.push(o52);
// 3451
o52.value = ".r[2hk8m].[1][4][1]{comment10200303357400658_4912511}.[0].[right].[0].[left].[0].[0].[0][2]";
// undefined
o52 = null;
// 3452
o52 = {};
// 3453
o45.firstChild = o52;
// undefined
o52 = null;
// 3454
o52 = {};
// 3455
o45.nextSibling = o52;
// undefined
o45 = null;
// 3456
o52.getAttributeNode = f974244559_519;
// undefined
o52 = null;
// 3458
o45 = {};
// 3459
f974244559_519.returns.push(o45);
// 3460
o45.value = ".r[2hk8m].[1][4][1]{comment10200303357400658_4912511}.[0].[right].[0].[left].[0].[0].[3]";
// undefined
o45 = null;
// 3463
f974244559_519.returns.push(o51);
// undefined
o51 = null;
// 3467
f974244559_702.returns.push(true);
// 3469
f974244559_471.returns.push(1373491288453);
// 3474
o45 = {};
// 3475
f974244559_523.returns.push(o45);
// 3476
o45.length = 4;
// 3477
o51 = {};
// 3478
o45["0"] = o51;
// 3479
o52 = {};
// 3480
o45["1"] = o52;
// 3481
o53 = {};
// 3482
o45["2"] = o53;
// 3483
o54 = {};
// 3484
o45["3"] = o54;
// undefined
o45 = null;
// 3485
f974244559_14.returns.push(undefined);
// 3486
f974244559_12.returns.push(7);
// 3487
o46.nodeName = "DIV";
// undefined
o46 = null;
// 3489
o47.nodeName = "DIV";
// 3490
o45 = {};
// 3491
o47.parentNode = o45;
// undefined
o47 = null;
// 3492
o45.nodeName = "FORM";
// 3494
f974244559_471.returns.push(1373491288471);
// 3499
o46 = {};
// 3500
f974244559_523.returns.push(o46);
// 3501
o46.length = 4;
// 3502
o46["0"] = o51;
// 3503
o46["1"] = o52;
// 3504
o46["2"] = o53;
// 3505
o46["3"] = o54;
// undefined
o46 = null;
// 3506
f974244559_14.returns.push(undefined);
// 3507
f974244559_12.returns.push(8);
// undefined
fo974244559_656_firstChild = function() { return fo974244559_656_firstChild.returns[fo974244559_656_firstChild.inst++]; };
fo974244559_656_firstChild.returns = [];
fo974244559_656_firstChild.inst = 0;
defineGetter(o48, "firstChild", fo974244559_656_firstChild, undefined);
// undefined
fo974244559_656_firstChild.returns.push(null);
// undefined
fo974244559_656_firstChild.returns.push(null);
// undefined
fo974244559_656_firstChild.returns.push(null);
// 3520
f974244559_470.returns.push(0.08837570110335946);
// 3522
f974244559_471.returns.push(1373491288478);
// 3524
f974244559_471.returns.push(1373491288478);
// 3530
f974244559_471.returns.push(1373491288479);
// 3532
f974244559_471.returns.push(1373491288479);
// 3534
f974244559_471.returns.push(1373491288479);
// 3536
f974244559_471.returns.push(1373491288479);
// 3538
f974244559_471.returns.push(1373491288479);
// 3539
o48.nodeType = 1;
// 3541
f974244559_471.returns.push(1373491288479);
// 3545
o46 = {};
// 3546
f974244559_478.returns.push(o46);
// 3548
f974244559_482.returns.push(o46);
// undefined
o46 = null;
// 3552
o46 = {};
// 3553
f974244559_478.returns.push(o46);
// 3555
f974244559_482.returns.push(o46);
// undefined
o46 = null;
// 3557
f974244559_471.returns.push(1373491288536);
// 3561
o46 = {};
// 3562
f974244559_478.returns.push(o46);
// 3564
f974244559_482.returns.push(o46);
// undefined
o46 = null;
// 3566
f974244559_471.returns.push(1373491288542);
// 3570
o46 = {};
// 3571
f974244559_478.returns.push(o46);
// 3573
f974244559_482.returns.push(o46);
// undefined
o46 = null;
// 3575
f974244559_471.returns.push(1373491288549);
// 3579
o46 = {};
// 3580
f974244559_478.returns.push(o46);
// 3582
f974244559_482.returns.push(o46);
// undefined
o46 = null;
// 3584
f974244559_471.returns.push(1373491288562);
// 3586
f974244559_471.returns.push(1373491288563);
// 3588
f974244559_471.returns.push(1373491288563);
// 3590
o48.nextSibling = null;
// 3591
o50.removeChild = f974244559_507;
// 3592
f974244559_507.returns.push(o48);
// 3593
// 3594
o50.appendChild = f974244559_482;
// 3595
f974244559_482.returns.push(o48);
// 3597
f974244559_471.returns.push(1373491288572);
// 3599
f974244559_471.returns.push(1373491288572);
// 3601
f974244559_471.returns.push(1373491288572);
// 3604
f974244559_471.returns.push(1373491288572);
// 3606
f974244559_471.returns.push(1373491288572);
// 3608
f974244559_471.returns.push(1373491288572);
// 3610
f974244559_471.returns.push(1373491288573);
// 3611
o46 = {};
// undefined
fo974244559_656_firstChild.returns.push(o46);
// 3613
o46.getAttributeNode = f974244559_519;
// 3615
o47 = {};
// 3616
f974244559_519.returns.push(o47);
// 3617
o47.value = ".r[ixwt]";
// 3618
o55 = {};
// 3619
o46.firstChild = o55;
// 3620
o55.getAttributeNode = f974244559_519;
// 3622
o56 = {};
// 3623
f974244559_519.returns.push(o56);
// 3624
o56.value = ".r[ixwt].[1][0]";
// 3625
o57 = {};
// 3626
o55.firstChild = o57;
// undefined
o57 = null;
// 3627
o57 = {};
// 3628
o55.nextSibling = o57;
// undefined
o55 = null;
// 3629
o57.getAttributeNode = f974244559_519;
// 3631
o55 = {};
// 3632
f974244559_519.returns.push(o55);
// 3633
o55.value = ".r[ixwt].[1][4][0]";
// 3634
o58 = {};
// 3635
o57.firstChild = o58;
// undefined
o58 = null;
// 3636
o58 = {};
// 3637
o57.nextSibling = o58;
// undefined
o57 = null;
// 3638
o58.getAttributeNode = f974244559_519;
// 3640
o57 = {};
// 3641
f974244559_519.returns.push(o57);
// 3642
o57.value = ".r[ixwt].[1][4][1]{comment10200350995551582_4954379}";
// 3643
o59 = {};
// 3644
o58.firstChild = o59;
// 3645
o59.getAttributeNode = f974244559_519;
// 3647
o60 = {};
// 3648
f974244559_519.returns.push(o60);
// 3649
o60.value = ".r[ixwt].[1][4][1]{comment10200350995551582_4954379}.[0]";
// undefined
o60 = null;
// 3650
o60 = {};
// 3651
o59.firstChild = o60;
// undefined
o59 = null;
// 3652
o60.getAttributeNode = f974244559_519;
// 3654
o59 = {};
// 3655
f974244559_519.returns.push(o59);
// 3656
o59.value = ".r[ixwt].[1][4][1]{comment10200350995551582_4954379}.[0].[left]";
// undefined
o59 = null;
// 3657
o59 = {};
// 3658
o60.firstChild = o59;
// undefined
o59 = null;
// 3659
o59 = {};
// 3660
o60.nextSibling = o59;
// undefined
o60 = null;
// 3661
o59.getAttributeNode = f974244559_519;
// 3663
o60 = {};
// 3664
f974244559_519.returns.push(o60);
// 3665
o60.value = ".r[ixwt].[1][4][1]{comment10200350995551582_4954379}.[0].[right]";
// undefined
o60 = null;
// 3666
o60 = {};
// 3667
o59.firstChild = o60;
// undefined
o59 = null;
// 3668
o60.getAttributeNode = f974244559_519;
// 3670
o59 = {};
// 3671
f974244559_519.returns.push(o59);
// 3672
o59.value = ".r[ixwt].[1][4][1]{comment10200350995551582_4954379}.[0].[right].[0]";
// undefined
o59 = null;
// 3673
o59 = {};
// 3674
o60.firstChild = o59;
// undefined
o60 = null;
// 3675
o59.getAttributeNode = f974244559_519;
// 3677
o60 = {};
// 3678
f974244559_519.returns.push(o60);
// 3679
o60.value = ".r[ixwt].[1][4][1]{comment10200350995551582_4954379}.[0].[right].[0].[left]";
// undefined
o60 = null;
// 3680
o60 = {};
// 3681
o59.firstChild = o60;
// undefined
o59 = null;
// 3682
o60.getAttributeNode = f974244559_519;
// 3684
o59 = {};
// 3685
f974244559_519.returns.push(o59);
// 3686
o59.value = ".r[ixwt].[1][4][1]{comment10200350995551582_4954379}.[0].[right].[0].[left].[0]";
// undefined
o59 = null;
// 3687
o59 = {};
// 3688
o60.firstChild = o59;
// undefined
o60 = null;
// 3689
o59.getAttributeNode = f974244559_519;
// 3691
o60 = {};
// 3692
f974244559_519.returns.push(o60);
// 3693
o60.value = ".r[ixwt].[1][4][1]{comment10200350995551582_4954379}.[0].[right].[0].[left].[0].[0]";
// undefined
o60 = null;
// 3694
o60 = {};
// 3695
o59.firstChild = o60;
// undefined
o59 = null;
// 3696
o60.getAttributeNode = f974244559_519;
// 3698
o59 = {};
// 3699
f974244559_519.returns.push(o59);
// 3700
o59.value = ".r[ixwt].[1][4][1]{comment10200350995551582_4954379}.[0].[right].[0].[left].[0].[0].[0][0]";
// undefined
o59 = null;
// 3701
o59 = {};
// 3702
o60.firstChild = o59;
// undefined
o59 = null;
// 3703
o59 = {};
// 3704
o60.nextSibling = o59;
// undefined
o60 = null;
// 3705
o59.getAttributeNode = f974244559_519;
// 3707
o60 = {};
// 3708
f974244559_519.returns.push(o60);
// 3709
o60.value = ".r[ixwt].[1][4][1]{comment10200350995551582_4954379}.[0].[right].[0].[left].[0].[0].[0][1]";
// undefined
o60 = null;
// 3710
o60 = {};
// 3711
o59.firstChild = o60;
// undefined
o60 = null;
// 3712
o60 = {};
// 3713
o59.nextSibling = o60;
// undefined
o59 = null;
// 3714
o60.getAttributeNode = f974244559_519;
// 3716
o59 = {};
// 3717
f974244559_519.returns.push(o59);
// 3718
o59.value = ".r[ixwt].[1][4][1]{comment10200350995551582_4954379}.[0].[right].[0].[left].[0].[0].[0][2]";
// undefined
o59 = null;
// 3719
o59 = {};
// 3720
o60.firstChild = o59;
// undefined
o59 = null;
// 3721
o59 = {};
// 3722
o60.nextSibling = o59;
// undefined
o60 = null;
// 3723
o59.getAttributeNode = f974244559_519;
// undefined
o59 = null;
// 3725
o59 = {};
// 3726
f974244559_519.returns.push(o59);
// 3727
o59.value = ".r[ixwt].[1][4][1]{comment10200350995551582_4954379}.[0].[right].[0].[left].[0].[0].[3]";
// undefined
o59 = null;
// 3730
f974244559_519.returns.push(o57);
// 3732
o48.contains = f974244559_702;
// 3734
f974244559_702.returns.push(true);
// undefined
fo974244559_656_firstChild.returns.push(o46);
// 3738
f974244559_519.returns.push(o47);
// 3743
f974244559_519.returns.push(o56);
// 3749
f974244559_519.returns.push(o55);
// 3755
f974244559_519.returns.push(o57);
// 3758
o59 = {};
// 3759
o58.nextSibling = o59;
// undefined
o58 = null;
// 3760
o59.getAttributeNode = f974244559_519;
// 3762
o58 = {};
// 3763
f974244559_519.returns.push(o58);
// 3764
o58.value = ".r[ixwt].[1][4][1]{comment10200350995551582_4955913}";
// 3765
o60 = {};
// 3766
o59.firstChild = o60;
// 3767
o60.getAttributeNode = f974244559_519;
// 3769
o61 = {};
// 3770
f974244559_519.returns.push(o61);
// 3771
o61.value = ".r[ixwt].[1][4][1]{comment10200350995551582_4955913}.[0]";
// undefined
o61 = null;
// 3772
o61 = {};
// 3773
o60.firstChild = o61;
// undefined
o60 = null;
// 3774
o61.getAttributeNode = f974244559_519;
// 3776
o60 = {};
// 3777
f974244559_519.returns.push(o60);
// 3778
o60.value = ".r[ixwt].[1][4][1]{comment10200350995551582_4955913}.[0].[left]";
// undefined
o60 = null;
// 3779
o60 = {};
// 3780
o61.firstChild = o60;
// undefined
o60 = null;
// 3781
o60 = {};
// 3782
o61.nextSibling = o60;
// undefined
o61 = null;
// 3783
o60.getAttributeNode = f974244559_519;
// 3785
o61 = {};
// 3786
f974244559_519.returns.push(o61);
// 3787
o61.value = ".r[ixwt].[1][4][1]{comment10200350995551582_4955913}.[0].[right]";
// undefined
o61 = null;
// 3788
o61 = {};
// 3789
o60.firstChild = o61;
// undefined
o60 = null;
// 3790
o61.getAttributeNode = f974244559_519;
// 3792
o60 = {};
// 3793
f974244559_519.returns.push(o60);
// 3794
o60.value = ".r[ixwt].[1][4][1]{comment10200350995551582_4955913}.[0].[right].[0]";
// undefined
o60 = null;
// 3795
o60 = {};
// 3796
o61.firstChild = o60;
// undefined
o61 = null;
// 3797
o60.getAttributeNode = f974244559_519;
// 3799
o61 = {};
// 3800
f974244559_519.returns.push(o61);
// 3801
o61.value = ".r[ixwt].[1][4][1]{comment10200350995551582_4955913}.[0].[right].[0].[left]";
// undefined
o61 = null;
// 3802
o61 = {};
// 3803
o60.firstChild = o61;
// undefined
o60 = null;
// 3804
o61.getAttributeNode = f974244559_519;
// 3806
o60 = {};
// 3807
f974244559_519.returns.push(o60);
// 3808
o60.value = ".r[ixwt].[1][4][1]{comment10200350995551582_4955913}.[0].[right].[0].[left].[0]";
// undefined
o60 = null;
// 3809
o60 = {};
// 3810
o61.firstChild = o60;
// undefined
o61 = null;
// 3811
o60.getAttributeNode = f974244559_519;
// 3813
o61 = {};
// 3814
f974244559_519.returns.push(o61);
// 3815
o61.value = ".r[ixwt].[1][4][1]{comment10200350995551582_4955913}.[0].[right].[0].[left].[0].[0]";
// undefined
o61 = null;
// 3816
o61 = {};
// 3817
o60.firstChild = o61;
// undefined
o60 = null;
// 3818
o61.getAttributeNode = f974244559_519;
// 3820
o60 = {};
// 3821
f974244559_519.returns.push(o60);
// 3822
o60.value = ".r[ixwt].[1][4][1]{comment10200350995551582_4955913}.[0].[right].[0].[left].[0].[0].[0][0]";
// undefined
o60 = null;
// 3823
o60 = {};
// 3824
o61.firstChild = o60;
// undefined
o60 = null;
// 3825
o60 = {};
// 3826
o61.nextSibling = o60;
// undefined
o61 = null;
// 3827
o60.getAttributeNode = f974244559_519;
// 3829
o61 = {};
// 3830
f974244559_519.returns.push(o61);
// 3831
o61.value = ".r[ixwt].[1][4][1]{comment10200350995551582_4955913}.[0].[right].[0].[left].[0].[0].[0][1]";
// undefined
o61 = null;
// 3832
o61 = {};
// 3833
o60.firstChild = o61;
// undefined
o61 = null;
// 3834
o61 = {};
// 3835
o60.nextSibling = o61;
// undefined
o60 = null;
// 3836
o61.getAttributeNode = f974244559_519;
// 3838
o60 = {};
// 3839
f974244559_519.returns.push(o60);
// 3840
o60.value = ".r[ixwt].[1][4][1]{comment10200350995551582_4955913}.[0].[right].[0].[left].[0].[0].[0][2]";
// undefined
o60 = null;
// 3841
o60 = {};
// 3842
o61.firstChild = o60;
// undefined
o60 = null;
// 3843
o60 = {};
// 3844
o61.nextSibling = o60;
// undefined
o61 = null;
// 3845
o60.getAttributeNode = f974244559_519;
// undefined
o60 = null;
// 3847
o60 = {};
// 3848
f974244559_519.returns.push(o60);
// 3849
o60.value = ".r[ixwt].[1][4][1]{comment10200350995551582_4955913}.[0].[right].[0].[left].[0].[0].[3]";
// undefined
o60 = null;
// 3852
f974244559_519.returns.push(o58);
// 3856
f974244559_702.returns.push(true);
// undefined
fo974244559_656_firstChild.returns.push(o46);
// 3860
f974244559_519.returns.push(o47);
// 3865
f974244559_519.returns.push(o56);
// 3871
f974244559_519.returns.push(o55);
// 3877
f974244559_519.returns.push(o57);
// 3883
f974244559_519.returns.push(o58);
// 3886
o60 = {};
// 3887
o59.nextSibling = o60;
// undefined
o59 = null;
// 3888
o60.getAttributeNode = f974244559_519;
// 3890
o59 = {};
// 3891
f974244559_519.returns.push(o59);
// 3892
o59.value = ".r[ixwt].[1][4][1]{comment10200350995551582_4955915}";
// 3893
o61 = {};
// 3894
o60.firstChild = o61;
// 3895
o61.getAttributeNode = f974244559_519;
// 3897
o62 = {};
// 3898
f974244559_519.returns.push(o62);
// 3899
o62.value = ".r[ixwt].[1][4][1]{comment10200350995551582_4955915}.[0]";
// undefined
o62 = null;
// 3900
o62 = {};
// 3901
o61.firstChild = o62;
// undefined
o61 = null;
// 3902
o62.getAttributeNode = f974244559_519;
// 3904
o61 = {};
// 3905
f974244559_519.returns.push(o61);
// 3906
o61.value = ".r[ixwt].[1][4][1]{comment10200350995551582_4955915}.[0].[left]";
// undefined
o61 = null;
// 3907
o61 = {};
// 3908
o62.firstChild = o61;
// undefined
o61 = null;
// 3909
o61 = {};
// 3910
o62.nextSibling = o61;
// undefined
o62 = null;
// 3911
o61.getAttributeNode = f974244559_519;
// 3913
o62 = {};
// 3914
f974244559_519.returns.push(o62);
// 3915
o62.value = ".r[ixwt].[1][4][1]{comment10200350995551582_4955915}.[0].[right]";
// undefined
o62 = null;
// 3916
o62 = {};
// 3917
o61.firstChild = o62;
// undefined
o61 = null;
// 3918
o62.getAttributeNode = f974244559_519;
// 3920
o61 = {};
// 3921
f974244559_519.returns.push(o61);
// 3922
o61.value = ".r[ixwt].[1][4][1]{comment10200350995551582_4955915}.[0].[right].[0]";
// undefined
o61 = null;
// 3923
o61 = {};
// 3924
o62.firstChild = o61;
// undefined
o62 = null;
// 3925
o61.getAttributeNode = f974244559_519;
// 3927
o62 = {};
// 3928
f974244559_519.returns.push(o62);
// 3929
o62.value = ".r[ixwt].[1][4][1]{comment10200350995551582_4955915}.[0].[right].[0].[left]";
// undefined
o62 = null;
// 3930
o62 = {};
// 3931
o61.firstChild = o62;
// undefined
o61 = null;
// 3932
o62.getAttributeNode = f974244559_519;
// 3934
o61 = {};
// 3935
f974244559_519.returns.push(o61);
// 3936
o61.value = ".r[ixwt].[1][4][1]{comment10200350995551582_4955915}.[0].[right].[0].[left].[0]";
// undefined
o61 = null;
// 3937
o61 = {};
// 3938
o62.firstChild = o61;
// undefined
o62 = null;
// 3939
o61.getAttributeNode = f974244559_519;
// 3941
o62 = {};
// 3942
f974244559_519.returns.push(o62);
// 3943
o62.value = ".r[ixwt].[1][4][1]{comment10200350995551582_4955915}.[0].[right].[0].[left].[0].[0]";
// undefined
o62 = null;
// 3944
o62 = {};
// 3945
o61.firstChild = o62;
// undefined
o61 = null;
// 3946
o62.getAttributeNode = f974244559_519;
// 3948
o61 = {};
// 3949
f974244559_519.returns.push(o61);
// 3950
o61.value = ".r[ixwt].[1][4][1]{comment10200350995551582_4955915}.[0].[right].[0].[left].[0].[0].[0][0]";
// undefined
o61 = null;
// 3951
o61 = {};
// 3952
o62.firstChild = o61;
// undefined
o61 = null;
// 3953
o61 = {};
// 3954
o62.nextSibling = o61;
// undefined
o62 = null;
// 3955
o61.getAttributeNode = f974244559_519;
// 3957
o62 = {};
// 3958
f974244559_519.returns.push(o62);
// 3959
o62.value = ".r[ixwt].[1][4][1]{comment10200350995551582_4955915}.[0].[right].[0].[left].[0].[0].[0][1]";
// undefined
o62 = null;
// 3960
o62 = {};
// 3961
o61.firstChild = o62;
// undefined
o62 = null;
// 3962
o62 = {};
// 3963
o61.nextSibling = o62;
// undefined
o61 = null;
// 3964
o62.getAttributeNode = f974244559_519;
// 3966
o61 = {};
// 3967
f974244559_519.returns.push(o61);
// 3968
o61.value = ".r[ixwt].[1][4][1]{comment10200350995551582_4955915}.[0].[right].[0].[left].[0].[0].[0][2]";
// undefined
o61 = null;
// 3969
o61 = {};
// 3970
o62.firstChild = o61;
// undefined
o61 = null;
// 3971
o61 = {};
// 3972
o62.nextSibling = o61;
// undefined
o62 = null;
// 3973
o61.getAttributeNode = f974244559_519;
// undefined
o61 = null;
// 3975
o61 = {};
// 3976
f974244559_519.returns.push(o61);
// 3977
o61.value = ".r[ixwt].[1][4][1]{comment10200350995551582_4955915}.[0].[right].[0].[left].[0].[0].[3]";
// undefined
o61 = null;
// 3980
f974244559_519.returns.push(o59);
// 3984
f974244559_702.returns.push(true);
// undefined
fo974244559_656_firstChild.returns.push(o46);
// undefined
o46 = null;
// 3988
f974244559_519.returns.push(o47);
// undefined
o47 = null;
// 3993
f974244559_519.returns.push(o56);
// undefined
o56 = null;
// 3999
f974244559_519.returns.push(o55);
// undefined
o55 = null;
// 4005
f974244559_519.returns.push(o57);
// undefined
o57 = null;
// 4011
f974244559_519.returns.push(o58);
// undefined
o58 = null;
// 4017
f974244559_519.returns.push(o59);
// undefined
o59 = null;
// 4020
o46 = {};
// 4021
o60.nextSibling = o46;
// undefined
o60 = null;
// 4022
o46.getAttributeNode = f974244559_519;
// 4024
o47 = {};
// 4025
f974244559_519.returns.push(o47);
// 4026
o47.value = ".r[ixwt].[1][4][1]{comment10200350995551582_4955918}";
// 4027
o55 = {};
// 4028
o46.firstChild = o55;
// undefined
o46 = null;
// 4029
o55.getAttributeNode = f974244559_519;
// 4031
o46 = {};
// 4032
f974244559_519.returns.push(o46);
// 4033
o46.value = ".r[ixwt].[1][4][1]{comment10200350995551582_4955918}.[0]";
// undefined
o46 = null;
// 4034
o46 = {};
// 4035
o55.firstChild = o46;
// undefined
o55 = null;
// 4036
o46.getAttributeNode = f974244559_519;
// 4038
o55 = {};
// 4039
f974244559_519.returns.push(o55);
// 4040
o55.value = ".r[ixwt].[1][4][1]{comment10200350995551582_4955918}.[0].[left]";
// undefined
o55 = null;
// 4041
o55 = {};
// 4042
o46.firstChild = o55;
// undefined
o55 = null;
// 4043
o55 = {};
// 4044
o46.nextSibling = o55;
// undefined
o46 = null;
// 4045
o55.getAttributeNode = f974244559_519;
// 4047
o46 = {};
// 4048
f974244559_519.returns.push(o46);
// 4049
o46.value = ".r[ixwt].[1][4][1]{comment10200350995551582_4955918}.[0].[right]";
// undefined
o46 = null;
// 4050
o46 = {};
// 4051
o55.firstChild = o46;
// undefined
o55 = null;
// 4052
o46.getAttributeNode = f974244559_519;
// 4054
o55 = {};
// 4055
f974244559_519.returns.push(o55);
// 4056
o55.value = ".r[ixwt].[1][4][1]{comment10200350995551582_4955918}.[0].[right].[0]";
// undefined
o55 = null;
// 4057
o55 = {};
// 4058
o46.firstChild = o55;
// undefined
o46 = null;
// 4059
o55.getAttributeNode = f974244559_519;
// 4061
o46 = {};
// 4062
f974244559_519.returns.push(o46);
// 4063
o46.value = ".r[ixwt].[1][4][1]{comment10200350995551582_4955918}.[0].[right].[0].[left]";
// undefined
o46 = null;
// 4064
o46 = {};
// 4065
o55.firstChild = o46;
// undefined
o55 = null;
// 4066
o46.getAttributeNode = f974244559_519;
// 4068
o55 = {};
// 4069
f974244559_519.returns.push(o55);
// 4070
o55.value = ".r[ixwt].[1][4][1]{comment10200350995551582_4955918}.[0].[right].[0].[left].[0]";
// undefined
o55 = null;
// 4071
o55 = {};
// 4072
o46.firstChild = o55;
// undefined
o46 = null;
// 4073
o55.getAttributeNode = f974244559_519;
// 4075
o46 = {};
// 4076
f974244559_519.returns.push(o46);
// 4077
o46.value = ".r[ixwt].[1][4][1]{comment10200350995551582_4955918}.[0].[right].[0].[left].[0].[0]";
// undefined
o46 = null;
// 4078
o46 = {};
// 4079
o55.firstChild = o46;
// undefined
o55 = null;
// 4080
o46.getAttributeNode = f974244559_519;
// 4082
o55 = {};
// 4083
f974244559_519.returns.push(o55);
// 4084
o55.value = ".r[ixwt].[1][4][1]{comment10200350995551582_4955918}.[0].[right].[0].[left].[0].[0].[0][0]";
// undefined
o55 = null;
// 4085
o55 = {};
// 4086
o46.firstChild = o55;
// undefined
o55 = null;
// 4087
o55 = {};
// 4088
o46.nextSibling = o55;
// undefined
o46 = null;
// 4089
o55.getAttributeNode = f974244559_519;
// 4091
o46 = {};
// 4092
f974244559_519.returns.push(o46);
// 4093
o46.value = ".r[ixwt].[1][4][1]{comment10200350995551582_4955918}.[0].[right].[0].[left].[0].[0].[0][1]";
// undefined
o46 = null;
// 4094
o46 = {};
// 4095
o55.firstChild = o46;
// undefined
o46 = null;
// 4096
o46 = {};
// 4097
o55.nextSibling = o46;
// undefined
o55 = null;
// 4098
o46.getAttributeNode = f974244559_519;
// 4100
o55 = {};
// 4101
f974244559_519.returns.push(o55);
// 4102
o55.value = ".r[ixwt].[1][4][1]{comment10200350995551582_4955918}.[0].[right].[0].[left].[0].[0].[0][2]";
// undefined
o55 = null;
// 4103
o55 = {};
// 4104
o46.firstChild = o55;
// undefined
o55 = null;
// 4105
o55 = {};
// 4106
o46.nextSibling = o55;
// undefined
o46 = null;
// 4107
o55.getAttributeNode = f974244559_519;
// undefined
o55 = null;
// 4109
o46 = {};
// 4110
f974244559_519.returns.push(o46);
// 4111
o46.value = ".r[ixwt].[1][4][1]{comment10200350995551582_4955918}.[0].[right].[0].[left].[0].[0].[3]";
// undefined
o46 = null;
// 4114
f974244559_519.returns.push(o47);
// undefined
o47 = null;
// 4118
f974244559_702.returns.push(true);
// 4120
f974244559_471.returns.push(1373491288631);
// 4125
o46 = {};
// 4126
f974244559_523.returns.push(o46);
// 4127
o46.length = 8;
// 4128
o47 = {};
// 4129
o46["0"] = o47;
// 4130
o55 = {};
// 4131
o46["1"] = o55;
// 4132
o56 = {};
// 4133
o46["2"] = o56;
// 4134
o57 = {};
// 4135
o46["3"] = o57;
// 4136
o46["4"] = o51;
// 4137
o46["5"] = o52;
// 4138
o46["6"] = o53;
// 4139
o46["7"] = o54;
// undefined
o46 = null;
// 4140
f974244559_14.returns.push(undefined);
// 4141
f974244559_12.returns.push(9);
// 4142
o48.nodeName = "DIV";
// undefined
o48 = null;
// 4144
o50.nodeName = "DIV";
// 4145
o46 = {};
// 4146
o50.parentNode = o46;
// undefined
o50 = null;
// 4147
o46.nodeName = "FORM";
// 4151
o48 = {};
// 4152
f974244559_478.returns.push(o48);
// 4154
f974244559_482.returns.push(o48);
// undefined
o48 = null;
// 4157
o48 = {};
// 4158
f974244559_502.returns.push(o48);
// 4159
o48.id = "u_0_1t";
// 4160
o48.getElementsByTagName = f974244559_514;
// 4161
o50 = {};
// 4162
o48.parentNode = o50;
// undefined
o48 = null;
// undefined
o50 = null;
// 4167
o48 = {};
// 4168
f974244559_502.returns.push(o48);
// 4169
o48.id = "u_0_1v";
// 4170
o48.getElementsByTagName = f974244559_514;
// 4171
o50 = {};
// 4172
o48.parentNode = o50;
// 4190
f974244559_471.returns.push(1373491288715);
// 4195
o58 = {};
// 4196
f974244559_523.returns.push(o58);
// 4197
o58.length = 8;
// 4198
o58["0"] = o47;
// 4199
o58["1"] = o55;
// 4200
o58["2"] = o56;
// 4201
o58["3"] = o57;
// 4202
o58["4"] = o51;
// 4203
o58["5"] = o52;
// 4204
o58["6"] = o53;
// 4205
o58["7"] = o54;
// undefined
o58 = null;
// 4206
f974244559_14.returns.push(undefined);
// 4207
f974244559_12.returns.push(10);
// undefined
fo974244559_928_firstChild = function() { return fo974244559_928_firstChild.returns[fo974244559_928_firstChild.inst++]; };
fo974244559_928_firstChild.returns = [];
fo974244559_928_firstChild.inst = 0;
defineGetter(o48, "firstChild", fo974244559_928_firstChild, undefined);
// undefined
fo974244559_928_firstChild.returns.push(null);
// undefined
fo974244559_928_firstChild.returns.push(null);
// undefined
fo974244559_928_firstChild.returns.push(null);
// 4223
f974244559_470.returns.push(0.5066393024753779);
// 4225
f974244559_471.returns.push(1373491288721);
// 4227
f974244559_471.returns.push(1373491288721);
// 4233
f974244559_471.returns.push(1373491288721);
// 4235
f974244559_471.returns.push(1373491288721);
// 4237
f974244559_471.returns.push(1373491288721);
// 4239
f974244559_471.returns.push(1373491288721);
// 4241
f974244559_471.returns.push(1373491288721);
// 4242
o48.nodeType = 1;
// 4244
f974244559_471.returns.push(1373491288722);
// 4248
o58 = {};
// 4249
f974244559_478.returns.push(o58);
// 4251
f974244559_482.returns.push(o58);
// undefined
o58 = null;
// 4253
o58 = {};
// 4254
f974244559_480.returns.push(o58);
// 4255
// 4256
// 4258
o59 = {};
// 4259
f974244559_480.returns.push(o59);
// 4260
o59.firstChild = null;
// 4261
o58.__html = void 0;
// undefined
o58 = null;
// 4263
o58 = {};
// 4264
f974244559_478.returns.push(o58);
// 4266
o59.appendChild = f974244559_482;
// 4267
f974244559_482.returns.push(o58);
// undefined
o58 = null;
// 4268
o59.innerHTML = "";
// undefined
o59 = null;
// 4270
f974244559_471.returns.push(1373491288737);
// 4274
o58 = {};
// 4275
f974244559_478.returns.push(o58);
// 4277
f974244559_482.returns.push(o58);
// undefined
o58 = null;
// 4279
f974244559_471.returns.push(1373491288745);
// 4283
o58 = {};
// 4284
f974244559_478.returns.push(o58);
// 4286
f974244559_482.returns.push(o58);
// undefined
o58 = null;
// 4288
f974244559_471.returns.push(1373491288756);
// 4292
o58 = {};
// 4293
f974244559_478.returns.push(o58);
// 4295
f974244559_482.returns.push(o58);
// undefined
o58 = null;
// 4297
f974244559_471.returns.push(1373491288764);
// 4299
f974244559_471.returns.push(1373491288766);
// 4301
f974244559_471.returns.push(1373491288766);
// 4303
o48.nextSibling = null;
// 4304
o50.removeChild = f974244559_507;
// 4305
f974244559_507.returns.push(o48);
// 4306
// 4307
o50.appendChild = f974244559_482;
// 4308
f974244559_482.returns.push(o48);
// 4310
f974244559_471.returns.push(1373491288775);
// 4312
f974244559_471.returns.push(1373491288775);
// 4314
f974244559_471.returns.push(1373491288775);
// 4317
f974244559_471.returns.push(1373491288775);
// 4319
f974244559_471.returns.push(1373491288775);
// 4321
f974244559_471.returns.push(1373491288775);
// 4323
f974244559_471.returns.push(1373491288775);
// 4324
o58 = {};
// undefined
fo974244559_928_firstChild.returns.push(o58);
// 4326
o58.getAttributeNode = f974244559_519;
// 4328
o59 = {};
// 4329
f974244559_519.returns.push(o59);
// 4330
o59.value = ".r[30l95]";
// 4331
o60 = {};
// 4332
o58.firstChild = o60;
// 4333
o60.getAttributeNode = f974244559_519;
// 4335
o61 = {};
// 4336
f974244559_519.returns.push(o61);
// 4337
o61.value = ".r[30l95].[1][0]";
// 4338
o62 = {};
// 4339
o60.firstChild = o62;
// undefined
o62 = null;
// 4340
o62 = {};
// 4341
o60.nextSibling = o62;
// undefined
o60 = null;
// 4342
o62.getAttributeNode = f974244559_519;
// 4344
o60 = {};
// 4345
f974244559_519.returns.push(o60);
// 4346
o60.value = ".r[30l95].[1][4][0]";
// 4347
o63 = {};
// 4348
o62.firstChild = o63;
// undefined
o63 = null;
// 4349
o63 = {};
// 4350
o62.nextSibling = o63;
// undefined
o62 = null;
// 4351
o63.getAttributeNode = f974244559_519;
// 4353
o62 = {};
// 4354
f974244559_519.returns.push(o62);
// 4355
o62.value = ".r[30l95].[1][4][1]{comment10200343222477260_4946958}";
// 4356
o64 = {};
// 4357
o63.firstChild = o64;
// 4358
o64.getAttributeNode = f974244559_519;
// 4360
o65 = {};
// 4361
f974244559_519.returns.push(o65);
// 4362
o65.value = ".r[30l95].[1][4][1]{comment10200343222477260_4946958}.[0]";
// undefined
o65 = null;
// 4363
o65 = {};
// 4364
o64.firstChild = o65;
// undefined
o64 = null;
// 4365
o65.getAttributeNode = f974244559_519;
// 4367
o64 = {};
// 4368
f974244559_519.returns.push(o64);
// 4369
o64.value = ".r[30l95].[1][4][1]{comment10200343222477260_4946958}.[0].[left]";
// undefined
o64 = null;
// 4370
o64 = {};
// 4371
o65.firstChild = o64;
// undefined
o64 = null;
// 4372
o64 = {};
// 4373
o65.nextSibling = o64;
// undefined
o65 = null;
// 4374
o64.getAttributeNode = f974244559_519;
// 4376
o65 = {};
// 4377
f974244559_519.returns.push(o65);
// 4378
o65.value = ".r[30l95].[1][4][1]{comment10200343222477260_4946958}.[0].[right]";
// undefined
o65 = null;
// 4379
o65 = {};
// 4380
o64.firstChild = o65;
// undefined
o64 = null;
// 4381
o65.getAttributeNode = f974244559_519;
// 4383
o64 = {};
// 4384
f974244559_519.returns.push(o64);
// 4385
o64.value = ".r[30l95].[1][4][1]{comment10200343222477260_4946958}.[0].[right].[0]";
// undefined
o64 = null;
// 4386
o64 = {};
// 4387
o65.firstChild = o64;
// undefined
o65 = null;
// 4388
o64.getAttributeNode = f974244559_519;
// 4390
o65 = {};
// 4391
f974244559_519.returns.push(o65);
// 4392
o65.value = ".r[30l95].[1][4][1]{comment10200343222477260_4946958}.[0].[right].[0].[left]";
// undefined
o65 = null;
// 4393
o65 = {};
// 4394
o64.firstChild = o65;
// undefined
o64 = null;
// 4395
o65.getAttributeNode = f974244559_519;
// 4397
o64 = {};
// 4398
f974244559_519.returns.push(o64);
// 4399
o64.value = ".r[30l95].[1][4][1]{comment10200343222477260_4946958}.[0].[right].[0].[left].[0]";
// undefined
o64 = null;
// 4400
o64 = {};
// 4401
o65.firstChild = o64;
// undefined
o65 = null;
// 4402
o64.getAttributeNode = f974244559_519;
// 4404
o65 = {};
// 4405
f974244559_519.returns.push(o65);
// 4406
o65.value = ".r[30l95].[1][4][1]{comment10200343222477260_4946958}.[0].[right].[0].[left].[0].[0]";
// undefined
o65 = null;
// 4407
o65 = {};
// 4408
o64.firstChild = o65;
// undefined
o64 = null;
// 4409
o65.getAttributeNode = f974244559_519;
// 4411
o64 = {};
// 4412
f974244559_519.returns.push(o64);
// 4413
o64.value = ".r[30l95].[1][4][1]{comment10200343222477260_4946958}.[0].[right].[0].[left].[0].[0].[0][0]";
// undefined
o64 = null;
// 4414
o64 = {};
// 4415
o65.firstChild = o64;
// undefined
o64 = null;
// 4416
o64 = {};
// 4417
o65.nextSibling = o64;
// undefined
o65 = null;
// 4418
o64.getAttributeNode = f974244559_519;
// 4420
o65 = {};
// 4421
f974244559_519.returns.push(o65);
// 4422
o65.value = ".r[30l95].[1][4][1]{comment10200343222477260_4946958}.[0].[right].[0].[left].[0].[0].[0][1]";
// undefined
o65 = null;
// 4423
o65 = {};
// 4424
o64.firstChild = o65;
// undefined
o65 = null;
// 4425
o65 = {};
// 4426
o64.nextSibling = o65;
// undefined
o64 = null;
// 4427
o65.getAttributeNode = f974244559_519;
// 4429
o64 = {};
// 4430
f974244559_519.returns.push(o64);
// 4431
o64.value = ".r[30l95].[1][4][1]{comment10200343222477260_4946958}.[0].[right].[0].[left].[0].[0].[0][2]";
// undefined
o64 = null;
// 4432
o64 = {};
// 4433
o65.firstChild = o64;
// undefined
o64 = null;
// 4434
o64 = {};
// 4435
o65.nextSibling = o64;
// undefined
o65 = null;
// 4436
o64.getAttributeNode = f974244559_519;
// undefined
o64 = null;
// 4438
o64 = {};
// 4439
f974244559_519.returns.push(o64);
// 4440
o64.value = ".r[30l95].[1][4][1]{comment10200343222477260_4946958}.[0].[right].[0].[left].[0].[0].[3]";
// undefined
o64 = null;
// 4443
f974244559_519.returns.push(o62);
// 4445
o48.contains = f974244559_702;
// 4447
f974244559_702.returns.push(true);
// undefined
fo974244559_928_firstChild.returns.push(o58);
// 4451
f974244559_519.returns.push(o59);
// 4456
f974244559_519.returns.push(o61);
// 4462
f974244559_519.returns.push(o60);
// 4468
f974244559_519.returns.push(o62);
// 4471
o64 = {};
// 4472
o63.nextSibling = o64;
// undefined
o63 = null;
// 4473
o64.getAttributeNode = f974244559_519;
// 4475
o63 = {};
// 4476
f974244559_519.returns.push(o63);
// 4477
o63.value = ".r[30l95].[1][4][1]{comment10200343222477260_4947623}";
// 4478
o65 = {};
// 4479
o64.firstChild = o65;
// 4480
o65.getAttributeNode = f974244559_519;
// 4482
o66 = {};
// 4483
f974244559_519.returns.push(o66);
// 4484
o66.value = ".r[30l95].[1][4][1]{comment10200343222477260_4947623}.[0]";
// undefined
o66 = null;
// 4485
o66 = {};
// 4486
o65.firstChild = o66;
// undefined
o65 = null;
// 4487
o66.getAttributeNode = f974244559_519;
// 4489
o65 = {};
// 4490
f974244559_519.returns.push(o65);
// 4491
o65.value = ".r[30l95].[1][4][1]{comment10200343222477260_4947623}.[0].[left]";
// undefined
o65 = null;
// 4492
o65 = {};
// 4493
o66.firstChild = o65;
// undefined
o65 = null;
// 4494
o65 = {};
// 4495
o66.nextSibling = o65;
// undefined
o66 = null;
// 4496
o65.getAttributeNode = f974244559_519;
// 4498
o66 = {};
// 4499
f974244559_519.returns.push(o66);
// 4500
o66.value = ".r[30l95].[1][4][1]{comment10200343222477260_4947623}.[0].[right]";
// undefined
o66 = null;
// 4501
o66 = {};
// 4502
o65.firstChild = o66;
// undefined
o65 = null;
// 4503
o66.getAttributeNode = f974244559_519;
// 4505
o65 = {};
// 4506
f974244559_519.returns.push(o65);
// 4507
o65.value = ".r[30l95].[1][4][1]{comment10200343222477260_4947623}.[0].[right].[0]";
// undefined
o65 = null;
// 4508
o65 = {};
// 4509
o66.firstChild = o65;
// undefined
o66 = null;
// 4510
o65.getAttributeNode = f974244559_519;
// 4512
o66 = {};
// 4513
f974244559_519.returns.push(o66);
// 4514
o66.value = ".r[30l95].[1][4][1]{comment10200343222477260_4947623}.[0].[right].[0].[left]";
// undefined
o66 = null;
// 4515
o66 = {};
// 4516
o65.firstChild = o66;
// undefined
o65 = null;
// 4517
o66.getAttributeNode = f974244559_519;
// 4519
o65 = {};
// 4520
f974244559_519.returns.push(o65);
// 4521
o65.value = ".r[30l95].[1][4][1]{comment10200343222477260_4947623}.[0].[right].[0].[left].[0]";
// undefined
o65 = null;
// 4522
o65 = {};
// 4523
o66.firstChild = o65;
// undefined
o66 = null;
// 4524
o65.getAttributeNode = f974244559_519;
// 4526
o66 = {};
// 4527
f974244559_519.returns.push(o66);
// 4528
o66.value = ".r[30l95].[1][4][1]{comment10200343222477260_4947623}.[0].[right].[0].[left].[0].[0]";
// undefined
o66 = null;
// 4529
o66 = {};
// 4530
o65.firstChild = o66;
// undefined
o65 = null;
// 4531
o66.getAttributeNode = f974244559_519;
// 4533
o65 = {};
// 4534
f974244559_519.returns.push(o65);
// 4535
o65.value = ".r[30l95].[1][4][1]{comment10200343222477260_4947623}.[0].[right].[0].[left].[0].[0].[0][0]";
// undefined
o65 = null;
// 4536
o65 = {};
// 4537
o66.firstChild = o65;
// undefined
o65 = null;
// 4538
o65 = {};
// 4539
o66.nextSibling = o65;
// undefined
o66 = null;
// 4540
o65.getAttributeNode = f974244559_519;
// 4542
o66 = {};
// 4543
f974244559_519.returns.push(o66);
// 4544
o66.value = ".r[30l95].[1][4][1]{comment10200343222477260_4947623}.[0].[right].[0].[left].[0].[0].[0][1]";
// undefined
o66 = null;
// 4545
o66 = {};
// 4546
o65.firstChild = o66;
// undefined
o66 = null;
// 4547
o66 = {};
// 4548
o65.nextSibling = o66;
// undefined
o65 = null;
// 4549
o66.getAttributeNode = f974244559_519;
// 4551
o65 = {};
// 4552
f974244559_519.returns.push(o65);
// 4553
o65.value = ".r[30l95].[1][4][1]{comment10200343222477260_4947623}.[0].[right].[0].[left].[0].[0].[0][2]";
// undefined
o65 = null;
// 4554
o65 = {};
// 4555
o66.firstChild = o65;
// undefined
o65 = null;
// 4556
o65 = {};
// 4557
o66.nextSibling = o65;
// undefined
o66 = null;
// 4558
o65.getAttributeNode = f974244559_519;
// undefined
o65 = null;
// 4560
o65 = {};
// 4561
f974244559_519.returns.push(o65);
// 4562
o65.value = ".r[30l95].[1][4][1]{comment10200343222477260_4947623}.[0].[right].[0].[left].[0].[0].[3]";
// undefined
o65 = null;
// 4565
f974244559_519.returns.push(o63);
// 4569
f974244559_702.returns.push(true);
// undefined
fo974244559_928_firstChild.returns.push(o58);
// 4573
f974244559_519.returns.push(o59);
// 4578
f974244559_519.returns.push(o61);
// 4584
f974244559_519.returns.push(o60);
// 4590
f974244559_519.returns.push(o62);
// 4596
f974244559_519.returns.push(o63);
// 4599
o65 = {};
// 4600
o64.nextSibling = o65;
// undefined
o64 = null;
// 4601
o65.getAttributeNode = f974244559_519;
// 4603
o64 = {};
// 4604
f974244559_519.returns.push(o64);
// 4605
o64.value = ".r[30l95].[1][4][1]{comment10200343222477260_4950566}";
// 4606
o66 = {};
// 4607
o65.firstChild = o66;
// 4608
o66.getAttributeNode = f974244559_519;
// 4610
o67 = {};
// 4611
f974244559_519.returns.push(o67);
// 4612
o67.value = ".r[30l95].[1][4][1]{comment10200343222477260_4950566}.[0]";
// undefined
o67 = null;
// 4613
o67 = {};
// 4614
o66.firstChild = o67;
// undefined
o66 = null;
// 4615
o67.getAttributeNode = f974244559_519;
// 4617
o66 = {};
// 4618
f974244559_519.returns.push(o66);
// 4619
o66.value = ".r[30l95].[1][4][1]{comment10200343222477260_4950566}.[0].[left]";
// undefined
o66 = null;
// 4620
o66 = {};
// 4621
o67.firstChild = o66;
// undefined
o66 = null;
// 4622
o66 = {};
// 4623
o67.nextSibling = o66;
// undefined
o67 = null;
// 4624
o66.getAttributeNode = f974244559_519;
// 4626
o67 = {};
// 4627
f974244559_519.returns.push(o67);
// 4628
o67.value = ".r[30l95].[1][4][1]{comment10200343222477260_4950566}.[0].[right]";
// undefined
o67 = null;
// 4629
o67 = {};
// 4630
o66.firstChild = o67;
// undefined
o66 = null;
// 4631
o67.getAttributeNode = f974244559_519;
// 4633
o66 = {};
// 4634
f974244559_519.returns.push(o66);
// 4635
o66.value = ".r[30l95].[1][4][1]{comment10200343222477260_4950566}.[0].[right].[0]";
// undefined
o66 = null;
// 4636
o66 = {};
// 4637
o67.firstChild = o66;
// undefined
o67 = null;
// 4638
o66.getAttributeNode = f974244559_519;
// 4640
o67 = {};
// 4641
f974244559_519.returns.push(o67);
// 4642
o67.value = ".r[30l95].[1][4][1]{comment10200343222477260_4950566}.[0].[right].[0].[left]";
// undefined
o67 = null;
// 4643
o67 = {};
// 4644
o66.firstChild = o67;
// undefined
o66 = null;
// 4645
o67.getAttributeNode = f974244559_519;
// 4647
o66 = {};
// 4648
f974244559_519.returns.push(o66);
// 4649
o66.value = ".r[30l95].[1][4][1]{comment10200343222477260_4950566}.[0].[right].[0].[left].[0]";
// undefined
o66 = null;
// 4650
o66 = {};
// 4651
o67.firstChild = o66;
// undefined
o67 = null;
// 4652
o66.getAttributeNode = f974244559_519;
// 4654
o67 = {};
// 4655
f974244559_519.returns.push(o67);
// 4656
o67.value = ".r[30l95].[1][4][1]{comment10200343222477260_4950566}.[0].[right].[0].[left].[0].[0]";
// undefined
o67 = null;
// 4657
o67 = {};
// 4658
o66.firstChild = o67;
// undefined
o66 = null;
// 4659
o67.getAttributeNode = f974244559_519;
// 4661
o66 = {};
// 4662
f974244559_519.returns.push(o66);
// 4663
o66.value = ".r[30l95].[1][4][1]{comment10200343222477260_4950566}.[0].[right].[0].[left].[0].[0].[0][0]";
// undefined
o66 = null;
// 4664
o66 = {};
// 4665
o67.firstChild = o66;
// undefined
o66 = null;
// 4666
o66 = {};
// 4667
o67.nextSibling = o66;
// undefined
o67 = null;
// 4668
o66.getAttributeNode = f974244559_519;
// 4670
o67 = {};
// 4671
f974244559_519.returns.push(o67);
// 4672
o67.value = ".r[30l95].[1][4][1]{comment10200343222477260_4950566}.[0].[right].[0].[left].[0].[0].[0][1]";
// undefined
o67 = null;
// 4673
o67 = {};
// 4674
o66.firstChild = o67;
// undefined
o67 = null;
// 4675
o67 = {};
// 4676
o66.nextSibling = o67;
// undefined
o66 = null;
// 4677
o67.getAttributeNode = f974244559_519;
// 4679
o66 = {};
// 4680
f974244559_519.returns.push(o66);
// 4681
o66.value = ".r[30l95].[1][4][1]{comment10200343222477260_4950566}.[0].[right].[0].[left].[0].[0].[0][2]";
// undefined
o66 = null;
// 4682
o66 = {};
// 4683
o67.firstChild = o66;
// undefined
o66 = null;
// 4684
o66 = {};
// 4685
o67.nextSibling = o66;
// undefined
o67 = null;
// 4686
o66.getAttributeNode = f974244559_519;
// undefined
o66 = null;
// 4688
o66 = {};
// 4689
f974244559_519.returns.push(o66);
// 4690
o66.value = ".r[30l95].[1][4][1]{comment10200343222477260_4950566}.[0].[right].[0].[left].[0].[0].[3]";
// undefined
o66 = null;
// 4693
f974244559_519.returns.push(o64);
// 4697
f974244559_702.returns.push(true);
// undefined
fo974244559_928_firstChild.returns.push(o58);
// undefined
o58 = null;
// 4701
f974244559_519.returns.push(o59);
// undefined
o59 = null;
// 4706
f974244559_519.returns.push(o61);
// undefined
o61 = null;
// 4712
f974244559_519.returns.push(o60);
// undefined
o60 = null;
// 4718
f974244559_519.returns.push(o62);
// undefined
o62 = null;
// 4724
f974244559_519.returns.push(o63);
// undefined
o63 = null;
// 4730
f974244559_519.returns.push(o64);
// undefined
o64 = null;
// 4733
o58 = {};
// 4734
o65.nextSibling = o58;
// undefined
o65 = null;
// 4735
o58.getAttributeNode = f974244559_519;
// 4737
o59 = {};
// 4738
f974244559_519.returns.push(o59);
// 4739
o59.value = ".r[30l95].[1][4][1]{comment10200343222477260_4950571}";
// 4740
o60 = {};
// 4741
o58.firstChild = o60;
// undefined
o58 = null;
// 4742
o60.getAttributeNode = f974244559_519;
// 4744
o58 = {};
// 4745
f974244559_519.returns.push(o58);
// 4746
o58.value = ".r[30l95].[1][4][1]{comment10200343222477260_4950571}.[0]";
// undefined
o58 = null;
// 4747
o58 = {};
// 4748
o60.firstChild = o58;
// undefined
o60 = null;
// 4749
o58.getAttributeNode = f974244559_519;
// 4751
o60 = {};
// 4752
f974244559_519.returns.push(o60);
// 4753
o60.value = ".r[30l95].[1][4][1]{comment10200343222477260_4950571}.[0].[left]";
// undefined
o60 = null;
// 4754
o60 = {};
// 4755
o58.firstChild = o60;
// undefined
o60 = null;
// 4756
o60 = {};
// 4757
o58.nextSibling = o60;
// undefined
o58 = null;
// 4758
o60.getAttributeNode = f974244559_519;
// 4760
o58 = {};
// 4761
f974244559_519.returns.push(o58);
// 4762
o58.value = ".r[30l95].[1][4][1]{comment10200343222477260_4950571}.[0].[right]";
// undefined
o58 = null;
// 4763
o58 = {};
// 4764
o60.firstChild = o58;
// undefined
o60 = null;
// 4765
o58.getAttributeNode = f974244559_519;
// 4767
o60 = {};
// 4768
f974244559_519.returns.push(o60);
// 4769
o60.value = ".r[30l95].[1][4][1]{comment10200343222477260_4950571}.[0].[right].[0]";
// undefined
o60 = null;
// 4770
o60 = {};
// 4771
o58.firstChild = o60;
// undefined
o58 = null;
// 4772
o60.getAttributeNode = f974244559_519;
// 4774
o58 = {};
// 4775
f974244559_519.returns.push(o58);
// 4776
o58.value = ".r[30l95].[1][4][1]{comment10200343222477260_4950571}.[0].[right].[0].[left]";
// undefined
o58 = null;
// 4777
o58 = {};
// 4778
o60.firstChild = o58;
// undefined
o60 = null;
// 4779
o58.getAttributeNode = f974244559_519;
// 4781
o60 = {};
// 4782
f974244559_519.returns.push(o60);
// 4783
o60.value = ".r[30l95].[1][4][1]{comment10200343222477260_4950571}.[0].[right].[0].[left].[0]";
// undefined
o60 = null;
// 4784
o60 = {};
// 4785
o58.firstChild = o60;
// undefined
o58 = null;
// 4786
o60.getAttributeNode = f974244559_519;
// 4788
o58 = {};
// 4789
f974244559_519.returns.push(o58);
// 4790
o58.value = ".r[30l95].[1][4][1]{comment10200343222477260_4950571}.[0].[right].[0].[left].[0].[0]";
// undefined
o58 = null;
// 4791
o58 = {};
// 4792
o60.firstChild = o58;
// undefined
o60 = null;
// 4793
o58.getAttributeNode = f974244559_519;
// 4795
o60 = {};
// 4796
f974244559_519.returns.push(o60);
// 4797
o60.value = ".r[30l95].[1][4][1]{comment10200343222477260_4950571}.[0].[right].[0].[left].[0].[0].[0][0]";
// undefined
o60 = null;
// 4798
o60 = {};
// 4799
o58.firstChild = o60;
// undefined
o60 = null;
// 4800
o60 = {};
// 4801
o58.nextSibling = o60;
// undefined
o58 = null;
// 4802
o60.getAttributeNode = f974244559_519;
// 4804
o58 = {};
// 4805
f974244559_519.returns.push(o58);
// 4806
o58.value = ".r[30l95].[1][4][1]{comment10200343222477260_4950571}.[0].[right].[0].[left].[0].[0].[0][1]";
// undefined
o58 = null;
// 4807
o58 = {};
// 4808
o60.firstChild = o58;
// undefined
o58 = null;
// 4809
o58 = {};
// 4810
o60.nextSibling = o58;
// undefined
o60 = null;
// 4811
o58.getAttributeNode = f974244559_519;
// 4813
o60 = {};
// 4814
f974244559_519.returns.push(o60);
// 4815
o60.value = ".r[30l95].[1][4][1]{comment10200343222477260_4950571}.[0].[right].[0].[left].[0].[0].[0][2]";
// undefined
o60 = null;
// 4816
o60 = {};
// 4817
o58.firstChild = o60;
// undefined
o60 = null;
// 4818
o60 = {};
// 4819
o58.nextSibling = o60;
// undefined
o58 = null;
// 4820
o60.getAttributeNode = f974244559_519;
// undefined
o60 = null;
// 4822
o58 = {};
// 4823
f974244559_519.returns.push(o58);
// 4824
o58.value = ".r[30l95].[1][4][1]{comment10200343222477260_4950571}.[0].[right].[0].[left].[0].[0].[3]";
// undefined
o58 = null;
// 4827
f974244559_519.returns.push(o59);
// undefined
o59 = null;
// 4831
f974244559_702.returns.push(true);
// 4833
f974244559_471.returns.push(1373491288830);
// 4838
o58 = {};
// 4839
f974244559_523.returns.push(o58);
// 4840
o58.length = 12;
// 4841
o58["0"] = o47;
// 4842
o58["1"] = o55;
// 4843
o58["2"] = o56;
// 4844
o58["3"] = o57;
// 4845
o59 = {};
// 4846
o58["4"] = o59;
// 4847
o60 = {};
// 4848
o58["5"] = o60;
// 4849
o61 = {};
// 4850
o58["6"] = o61;
// 4851
o62 = {};
// 4852
o58["7"] = o62;
// 4853
o58["8"] = o51;
// 4854
o58["9"] = o52;
// 4855
o58["10"] = o53;
// 4856
o58["11"] = o54;
// undefined
o58 = null;
// 4857
f974244559_14.returns.push(undefined);
// 4858
f974244559_12.returns.push(11);
// 4859
o48.nodeName = "DIV";
// undefined
o48 = null;
// 4861
o50.nodeName = "DIV";
// 4862
o48 = {};
// 4863
o50.parentNode = o48;
// undefined
o50 = null;
// 4864
o48.nodeName = "FORM";
// 4868
o50 = {};
// 4869
f974244559_478.returns.push(o50);
// 4871
f974244559_482.returns.push(o50);
// undefined
o50 = null;
// 4873
f974244559_471.returns.push(1373491288832);
// 4876
f974244559_471.returns.push(1373491288833);
// 4878
f974244559_471.returns.push(1373491288833);
// 4881
f974244559_471.returns.push(1373491288833);
// 4885
o50 = {};
// 4886
f974244559_478.returns.push(o50);
// 4888
f974244559_471.returns.push(1373491288834);
// 4891
o58 = {};
// 4892
f974244559_480.returns.push(o58);
// 4893
// 4894
// 4895
// 4896
// 4897
// 4898
o50.appendChild = f974244559_482;
// 4899
f974244559_482.returns.push(o58);
// 4901
f974244559_482.returns.push(o50);
// undefined
o50 = null;
// 4904
f974244559_471.returns.push(1373491288836);
// 4908
o50 = {};
// 4909
f974244559_478.returns.push(o50);
// 4911
f974244559_471.returns.push(1373491288837);
// 4914
o63 = {};
// 4915
f974244559_480.returns.push(o63);
// 4916
// 4917
// 4918
// 4919
// 4920
// 4921
o50.appendChild = f974244559_482;
// 4922
f974244559_482.returns.push(o63);
// 4924
f974244559_482.returns.push(o50);
// undefined
o50 = null;
// 4928
o50 = {};
// 4929
f974244559_478.returns.push(o50);
// 4931
f974244559_482.returns.push(o50);
// undefined
o50 = null;
// 4933
f974244559_471.returns.push(1373491288842);
// 4934
f974244559_15.returns.push(undefined);
// 4935
o50 = {};
// 4938
o50.srcElement = o8;
// 4940
o50.target = o8;
// 4942
o8.nodeType = 1;
// 4945
o8.getAttributeNode = f974244559_519;
// 4947
f974244559_519.returns.push(null);
// 4950
o0.nodeType = 9;
// 4952
o64 = {};
// 4953
o50.relatedTarget = o64;
// 4954
o65 = {};
// 4955
o64.parentNode = o65;
// 4956
o64.nodeType = 1;
// 4957
o64.getAttributeNode = f974244559_519;
// 4959
f974244559_519.returns.push(null);
// 4961
o66 = {};
// 4962
o65.parentNode = o66;
// 4963
o65.nodeType = 1;
// 4964
o65.getAttributeNode = f974244559_519;
// 4966
f974244559_519.returns.push(null);
// 4968
o67 = {};
// 4969
o66.parentNode = o67;
// 4970
o66.nodeType = 1;
// 4971
o66.getAttributeNode = f974244559_519;
// 4973
f974244559_519.returns.push(null);
// 4975
o68 = {};
// 4976
o67.parentNode = o68;
// 4977
o67.nodeType = 1;
// 4978
o67.getAttributeNode = f974244559_519;
// 4980
f974244559_519.returns.push(null);
// 4982
o69 = {};
// 4983
o68.parentNode = o69;
// 4984
o68.nodeType = 1;
// 4985
o68.getAttributeNode = f974244559_519;
// 4987
f974244559_519.returns.push(null);
// 4989
o69.parentNode = o27;
// 4990
o69.nodeType = 1;
// 4991
o69.getAttributeNode = f974244559_519;
// 4993
f974244559_519.returns.push(null);
// 4995
o27.parentNode = o13;
// 4996
o27.nodeType = 1;
// 4997
o27.getAttributeNode = f974244559_519;
// 4999
f974244559_519.returns.push(null);
// 5001
o70 = {};
// 5002
o13.parentNode = o70;
// 5003
o13.nodeType = 1;
// 5004
o13.getAttributeNode = f974244559_519;
// 5006
f974244559_519.returns.push(null);
// 5008
o71 = {};
// 5009
o70.parentNode = o71;
// 5010
o70.nodeType = 1;
// 5011
o70.getAttributeNode = f974244559_519;
// 5013
f974244559_519.returns.push(null);
// 5015
o72 = {};
// 5016
o71.parentNode = o72;
// 5017
o71.nodeType = 1;
// 5018
o71.getAttributeNode = f974244559_519;
// 5020
f974244559_519.returns.push(null);
// 5022
o73 = {};
// 5023
o72.parentNode = o73;
// 5024
o72.nodeType = 1;
// 5025
o72.getAttributeNode = f974244559_519;
// 5027
f974244559_519.returns.push(null);
// 5029
o74 = {};
// 5030
o73.parentNode = o74;
// 5031
o73.nodeType = 1;
// 5032
o73.getAttributeNode = f974244559_519;
// 5034
f974244559_519.returns.push(null);
// 5036
o75 = {};
// 5037
o74.parentNode = o75;
// 5038
o74.nodeType = 1;
// 5039
o74.getAttributeNode = f974244559_519;
// 5041
f974244559_519.returns.push(null);
// 5043
o76 = {};
// 5044
o75.parentNode = o76;
// 5045
o75.nodeType = 1;
// 5046
o75.getAttributeNode = f974244559_519;
// 5048
f974244559_519.returns.push(null);
// 5050
o76.parentNode = o25;
// 5051
o76.nodeType = 1;
// 5052
o76.getAttributeNode = f974244559_519;
// 5054
f974244559_519.returns.push(null);
// 5056
o25.parentNode = o8;
// 5057
o25.nodeType = 1;
// 5058
o25.getAttributeNode = f974244559_519;
// 5060
f974244559_519.returns.push(null);
// 5066
f974244559_519.returns.push(null);
// 5071
o50.cancelBubble = false;
// 5072
o50.returnValue = true;
// undefined
o50 = null;
// 5073
o50 = {};
// 5075
o50.target = o64;
// 5076
o64.getAttribute = f974244559_500;
// 5078
f974244559_500.returns.push(null);
// 5080
o65.getAttribute = f974244559_500;
// 5082
f974244559_500.returns.push(null);
// 5084
o66.getAttribute = f974244559_500;
// 5086
f974244559_500.returns.push(null);
// 5088
o67.getAttribute = f974244559_500;
// 5090
f974244559_500.returns.push(null);
// 5092
o68.getAttribute = f974244559_500;
// 5094
f974244559_500.returns.push(null);
// 5096
o69.getAttribute = f974244559_500;
// 5098
f974244559_500.returns.push(null);
// 5102
f974244559_500.returns.push(null);
// 5106
f974244559_500.returns.push(null);
// 5108
o70.getAttribute = f974244559_500;
// 5110
f974244559_500.returns.push(null);
// 5112
o71.getAttribute = f974244559_500;
// 5114
f974244559_500.returns.push(null);
// 5116
o72.getAttribute = f974244559_500;
// 5118
f974244559_500.returns.push(null);
// 5120
o73.getAttribute = f974244559_500;
// 5122
f974244559_500.returns.push(null);
// 5124
o74.getAttribute = f974244559_500;
// 5126
f974244559_500.returns.push(null);
// 5128
o75.getAttribute = f974244559_500;
// 5130
f974244559_500.returns.push(null);
// 5132
o76.getAttribute = f974244559_500;
// 5134
f974244559_500.returns.push(null);
// 5136
o25.getAttribute = f974244559_500;
// 5138
f974244559_500.returns.push(null);
// 5142
f974244559_500.returns.push(null);
// 5148
f974244559_500.returns.push(null);
// 5152
f974244559_500.returns.push(null);
// 5156
f974244559_500.returns.push(null);
// 5160
f974244559_500.returns.push(null);
// 5164
f974244559_500.returns.push(null);
// 5168
f974244559_500.returns.push(null);
// 5172
f974244559_500.returns.push(null);
// 5176
f974244559_500.returns.push(null);
// 5180
f974244559_500.returns.push(null);
// 5184
f974244559_500.returns.push(null);
// 5188
f974244559_500.returns.push(null);
// 5192
f974244559_500.returns.push(null);
// 5196
f974244559_500.returns.push(null);
// 5200
f974244559_500.returns.push(null);
// 5204
f974244559_500.returns.push(null);
// 5208
f974244559_500.returns.push(null);
// 5212
f974244559_500.returns.push(null);
// 5218
o50.srcElement = o64;
// 5227
f974244559_519.returns.push(null);
// 5233
f974244559_519.returns.push(null);
// 5239
f974244559_519.returns.push(null);
// 5245
f974244559_519.returns.push(null);
// 5251
f974244559_519.returns.push(null);
// 5257
f974244559_519.returns.push(null);
// 5263
f974244559_519.returns.push(null);
// 5269
f974244559_519.returns.push(null);
// 5275
f974244559_519.returns.push(null);
// 5281
f974244559_519.returns.push(null);
// 5287
f974244559_519.returns.push(null);
// 5293
f974244559_519.returns.push(null);
// 5299
f974244559_519.returns.push(null);
// 5305
f974244559_519.returns.push(null);
// 5311
f974244559_519.returns.push(null);
// 5317
f974244559_519.returns.push(null);
// 5323
f974244559_519.returns.push(null);
// 5328
o50.relatedTarget = o8;
// 5329
o50.cancelBubble = false;
// 5330
o50.returnValue = true;
// undefined
o50 = null;
// 5331
o50 = {};
// 5334
o50.srcElement = o64;
// 5336
o50.target = o64;
// 5343
f974244559_519.returns.push(null);
// 5349
f974244559_519.returns.push(null);
// 5355
f974244559_519.returns.push(null);
// 5361
f974244559_519.returns.push(null);
// 5367
f974244559_519.returns.push(null);
// 5373
f974244559_519.returns.push(null);
// 5379
f974244559_519.returns.push(null);
// 5385
f974244559_519.returns.push(null);
// 5391
f974244559_519.returns.push(null);
// 5397
f974244559_519.returns.push(null);
// 5403
f974244559_519.returns.push(null);
// 5409
f974244559_519.returns.push(null);
// 5415
f974244559_519.returns.push(null);
// 5421
f974244559_519.returns.push(null);
// 5427
f974244559_519.returns.push(null);
// 5433
f974244559_519.returns.push(null);
// 5439
f974244559_519.returns.push(null);
// 5444
o50.JSBNG__screenX = 784;
// 5445
o50.JSBNG__screenY = 324;
// 5446
o50.altKey = false;
// 5447
o50.bubbles = true;
// 5448
o50.button = 0;
// 5449
o50.buttons = void 0;
// 5450
o50.cancelable = false;
// 5451
o50.clientX = 767;
// 5452
o50.clientY = 220;
// 5453
o50.ctrlKey = false;
// 5454
o50.currentTarget = o0;
// 5455
o50.defaultPrevented = false;
// 5456
o50.detail = 0;
// 5457
o50.eventPhase = 3;
// 5458
o50.isTrusted = void 0;
// 5459
o50.metaKey = false;
// 5460
o50.pageX = 767;
// 5461
o50.pageY = 379;
// 5462
o50.relatedTarget = null;
// 5463
o50.fromElement = null;
// 5466
o50.shiftKey = false;
// 5469
o50.timeStamp = 1373491288917;
// 5470
o50.type = "mousemove";
// 5471
o50.view = ow974244559;
// 5473
o50.returnValue = true;
// 5474
o50.cancelBubble = false;
// undefined
o50 = null;
// 5481
o5.protocol = "https:";
// undefined
fo974244559_1_cookie = function() { return fo974244559_1_cookie.returns[fo974244559_1_cookie.inst++]; };
fo974244559_1_cookie.returns = [];
fo974244559_1_cookie.inst = 0;
defineGetter(o0, "cookie", fo974244559_1_cookie, undefined);
// undefined
fo974244559_1_cookie.returns.push("c_user=100006118350059; csm=2");
// 5484
f974244559_471.returns.push(1373491289201);
// 5485
o50 = {};
// 5486
f974244559_0.returns.push(o50);
// 5487
f974244559_1087 = function() { return f974244559_1087.returns[f974244559_1087.inst++]; };
f974244559_1087.returns = [];
f974244559_1087.inst = 0;
// 5488
o50.toGMTString = f974244559_1087;
// undefined
o50 = null;
// 5489
f974244559_1087.returns.push("Wed, 17 Jul 2013 21:21:29 GMT");
// 5490
o5.hostname = "jsbngssl.www.facebook.com";
// undefined
fo974244559_1_cookie.returns.push("c_user=100006118350059; csm=2");
// 5493
f974244559_471.returns.push(1373491289203);
// 5495
f974244559_486.returns.push("1;1");
// 5507
f974244559_472.returns.push(undefined);
// 5508
o8.JSBNG__oninput = null;
// 5513
f974244559_472.returns.push(undefined);
// 5514
o8.JSBNG__onkeyup = null;
// 5521
f974244559_472.returns.push(undefined);
// 5522
f974244559_1088 = function() { return f974244559_1088.returns[f974244559_1088.inst++]; };
f974244559_1088.returns = [];
f974244559_1088.inst = 0;
// 5523
o8.JSBNG__onsubmit = f974244559_1088;
// 5526
// 5533
// 5539
f974244559_472.returns.push(undefined);
// 5540
o8.JSBNG__onkeydown = null;
// 5550
f974244559_472.returns.push(undefined);
// 5551
f974244559_1089 = function() { return f974244559_1089.returns[f974244559_1089.inst++]; };
f974244559_1089.returns = [];
f974244559_1089.inst = 0;
// 5552
o8.JSBNG__onclick = f974244559_1089;
// 5555
// 5559
o50 = {};
// 5560
f974244559_480.returns.push(o50);
// 5565
f974244559_472.returns.push(undefined);
// 5566
o8.JSBNG__onmousedown = null;
// 5571
o77 = {};
// 5572
f974244559_502.returns.push(o77);
// 5574
o78 = {};
// 5575
f974244559_502.returns.push(o78);
// 5576
o78.nodeName = "A";
// 5577
o78.rel = "toggle";
// 5579
o78.__FB_TOKEN = void 0;
// 5580
// 5581
o78.getAttribute = f974244559_500;
// 5582
o78.hasAttribute = f974244559_527;
// 5584
f974244559_527.returns.push(false);
// 5585
o78.JSBNG__addEventListener = f974244559_472;
// 5587
f974244559_472.returns.push(undefined);
// 5588
o78.JSBNG__onkeydown = null;
// 5590
o78.setAttribute = f974244559_643;
// 5591
f974244559_643.returns.push(undefined);
// 5592
o77.__FB_TOKEN = void 0;
// 5593
// 5603
o79 = {};
// 5604
f974244559_480.returns.push(o79);
// undefined
o79 = null;
// 5606
o79 = {};
// 5607
f974244559_480.returns.push(o79);
// undefined
o79 = null;
// 5610
o79 = {};
// 5611
f974244559_502.returns.push(o79);
// 5612
o79.getElementsByTagName = f974244559_514;
// 5614
o79.querySelectorAll = f974244559_523;
// 5615
o80 = {};
// 5616
f974244559_523.returns.push(o80);
// 5617
o80.length = 1;
// 5618
o81 = {};
// 5619
o80["0"] = o81;
// undefined
o80 = null;
// 5620
o81.getElementsByTagName = f974244559_514;
// 5622
o81.querySelectorAll = f974244559_523;
// 5623
o80 = {};
// 5624
f974244559_523.returns.push(o80);
// 5625
o80.length = 1;
// 5626
o82 = {};
// 5627
o80["0"] = o82;
// undefined
o80 = null;
// 5628
o82.getElementsByTagName = f974244559_514;
// 5630
o82.querySelectorAll = f974244559_523;
// 5631
o80 = {};
// 5632
f974244559_523.returns.push(o80);
// 5633
o80.length = 1;
// 5634
o83 = {};
// 5635
o80["0"] = o83;
// undefined
o80 = null;
// 5639
o80 = {};
// 5640
f974244559_523.returns.push(o80);
// 5641
o80.length = 1;
// 5642
o84 = {};
// 5643
o80["0"] = o84;
// undefined
o80 = null;
// 5644
o84.getElementsByTagName = f974244559_514;
// 5646
o84.querySelectorAll = f974244559_523;
// 5647
o80 = {};
// 5648
f974244559_523.returns.push(o80);
// 5649
o80.length = 1;
// 5650
o85 = {};
// 5651
o80["0"] = o85;
// undefined
o80 = null;
// 5652
f974244559_12.returns.push(12);
// 5653
o81.nodeName = "DIV";
// 5654
o81.__FB_TOKEN = void 0;
// 5655
// 5656
o81.getAttribute = f974244559_500;
// 5657
o81.hasAttribute = f974244559_527;
// 5659
f974244559_527.returns.push(false);
// 5660
o81.JSBNG__addEventListener = f974244559_472;
// 5662
f974244559_472.returns.push(undefined);
// 5663
o81.JSBNG__onJSBNG__scroll = void 0;
// 5665
o79.nodeName = "DIV";
// 5666
o79.__FB_TOKEN = void 0;
// 5667
// 5668
o79.getAttribute = f974244559_500;
// 5669
o79.hasAttribute = f974244559_527;
// 5671
f974244559_527.returns.push(false);
// 5672
o79.JSBNG__addEventListener = f974244559_472;
// 5674
f974244559_472.returns.push(undefined);
// 5675
o79.JSBNG__onmousemove = null;
// 5677
o84.nodeName = "DIV";
// 5678
o84.__FB_TOKEN = void 0;
// 5679
// 5680
o84.getAttribute = f974244559_500;
// 5681
o84.hasAttribute = f974244559_527;
// 5683
f974244559_527.returns.push(false);
// 5684
o84.JSBNG__addEventListener = f974244559_472;
// 5686
f974244559_472.returns.push(undefined);
// 5687
o84.JSBNG__onclick = null;
// 5689
o80 = {};
// 5690
o50.style = o80;
// 5692
// 5694
// undefined
o80 = null;
// 5696
o50.__html = void 0;
// 5698
o80 = {};
// 5699
f974244559_478.returns.push(o80);
// 5701
o8.appendChild = f974244559_482;
// 5702
f974244559_482.returns.push(o80);
// undefined
o80 = null;
// 5703
o80 = {};
// 5704
f974244559_4.returns.push(o80);
// 5705
o80.pointerEvents = "";
// undefined
o80 = null;
// 5706
o50.parentNode = null;
// 5710
f974244559_472.returns.push(undefined);
// 5711
o79.JSBNG__onmouseover = null;
// 5716
f974244559_472.returns.push(undefined);
// 5717
o79.JSBNG__onmouseout = null;
// 5722
f974244559_472.returns.push(undefined);
// 5723
o79.JSBNG__onfocusin = void 0;
// 5728
f974244559_472.returns.push(undefined);
// 5729
o79.JSBNG__onfocusout = void 0;
// 5734
f974244559_472.returns.push(undefined);
// 5735
o79.JSBNG__onmousedown = null;
// 5737
o85.nodeName = "DIV";
// 5738
o85.__FB_TOKEN = void 0;
// 5739
// 5740
o85.getAttribute = f974244559_500;
// 5741
o85.hasAttribute = f974244559_527;
// 5743
f974244559_527.returns.push(false);
// 5744
o85.JSBNG__addEventListener = f974244559_472;
// 5746
f974244559_472.returns.push(undefined);
// 5747
o85.JSBNG__onmousedown = null;
// 5749
o80 = {};
// 5750
o79.classList = o80;
// 5752
f974244559_1110 = function() { return f974244559_1110.returns[f974244559_1110.inst++]; };
f974244559_1110.returns = [];
f974244559_1110.inst = 0;
// 5753
o80.add = f974244559_1110;
// 5754
f974244559_1110.returns.push(undefined);
// 5757
o86 = {};
// 5758
f974244559_502.returns.push(o86);
// 5759
o86.getElementsByTagName = f974244559_514;
// 5761
o86.querySelectorAll = f974244559_523;
// 5762
o87 = {};
// 5763
f974244559_523.returns.push(o87);
// 5764
o87.length = 1;
// 5765
o88 = {};
// 5766
o87["0"] = o88;
// undefined
o87 = null;
// 5767
o88.getElementsByTagName = f974244559_514;
// 5769
o88.querySelectorAll = f974244559_523;
// 5770
o87 = {};
// 5771
f974244559_523.returns.push(o87);
// 5772
o87.length = 1;
// 5773
o89 = {};
// 5774
o87["0"] = o89;
// undefined
o87 = null;
// 5775
o89.getElementsByTagName = f974244559_514;
// 5777
o89.querySelectorAll = f974244559_523;
// 5778
o87 = {};
// 5779
f974244559_523.returns.push(o87);
// 5780
o87.length = 1;
// 5781
o90 = {};
// 5782
o87["0"] = o90;
// undefined
o87 = null;
// 5786
o87 = {};
// 5787
f974244559_523.returns.push(o87);
// 5788
o87.length = 1;
// 5789
o91 = {};
// 5790
o87["0"] = o91;
// undefined
o87 = null;
// 5791
o91.getElementsByTagName = f974244559_514;
// 5793
o91.querySelectorAll = f974244559_523;
// 5794
o87 = {};
// 5795
f974244559_523.returns.push(o87);
// 5796
o87.length = 1;
// 5797
o92 = {};
// 5798
o87["0"] = o92;
// undefined
o87 = null;
// 5799
f974244559_12.returns.push(13);
// 5800
o88.nodeName = "DIV";
// 5801
o88.__FB_TOKEN = void 0;
// 5802
// 5803
o88.getAttribute = f974244559_500;
// 5804
o88.hasAttribute = f974244559_527;
// 5806
f974244559_527.returns.push(false);
// 5807
o88.JSBNG__addEventListener = f974244559_472;
// 5809
f974244559_472.returns.push(undefined);
// 5810
o88.JSBNG__onJSBNG__scroll = void 0;
// 5812
o86.nodeName = "DIV";
// 5813
o86.__FB_TOKEN = void 0;
// 5814
// 5815
o86.getAttribute = f974244559_500;
// 5816
o86.hasAttribute = f974244559_527;
// 5818
f974244559_527.returns.push(false);
// 5819
o86.JSBNG__addEventListener = f974244559_472;
// 5821
f974244559_472.returns.push(undefined);
// 5822
o86.JSBNG__onmousemove = null;
// 5824
o91.nodeName = "DIV";
// 5825
o91.__FB_TOKEN = void 0;
// 5826
// 5827
o91.getAttribute = f974244559_500;
// 5828
o91.hasAttribute = f974244559_527;
// 5830
f974244559_527.returns.push(false);
// 5831
o91.JSBNG__addEventListener = f974244559_472;
// 5833
f974244559_472.returns.push(undefined);
// 5834
o91.JSBNG__onclick = null;
// 5839
f974244559_472.returns.push(undefined);
// 5840
o86.JSBNG__onmouseover = null;
// 5845
f974244559_472.returns.push(undefined);
// 5846
o86.JSBNG__onmouseout = null;
// 5851
f974244559_472.returns.push(undefined);
// 5852
o86.JSBNG__onfocusin = void 0;
// 5857
f974244559_472.returns.push(undefined);
// 5858
o86.JSBNG__onfocusout = void 0;
// 5863
f974244559_472.returns.push(undefined);
// 5864
o86.JSBNG__onmousedown = null;
// 5866
o92.nodeName = "DIV";
// 5867
o92.__FB_TOKEN = void 0;
// 5868
// 5869
o92.getAttribute = f974244559_500;
// 5870
o92.hasAttribute = f974244559_527;
// 5872
f974244559_527.returns.push(false);
// 5873
o92.JSBNG__addEventListener = f974244559_472;
// 5875
f974244559_472.returns.push(undefined);
// 5876
o92.JSBNG__onmousedown = null;
// 5878
o87 = {};
// 5879
o86.classList = o87;
// 5881
o87.add = f974244559_1110;
// 5882
f974244559_1110.returns.push(undefined);
// 5885
o93 = {};
// 5886
f974244559_502.returns.push(o93);
// 5888
o94 = {};
// 5889
f974244559_502.returns.push(o94);
// 5890
o94.nodeName = "A";
// 5891
o94.rel = "toggle";
// 5893
o94.__FB_TOKEN = void 0;
// 5894
// 5895
o94.getAttribute = f974244559_500;
// 5896
o94.hasAttribute = f974244559_527;
// 5898
f974244559_527.returns.push(false);
// 5899
o94.JSBNG__addEventListener = f974244559_472;
// 5901
f974244559_472.returns.push(undefined);
// 5902
o94.JSBNG__onkeydown = null;
// 5904
o94.setAttribute = f974244559_643;
// 5905
f974244559_643.returns.push(undefined);
// 5906
o93.__FB_TOKEN = void 0;
// 5907
// undefined
o93 = null;
// 5910
o93 = {};
// 5911
f974244559_502.returns.push(o93);
// 5913
o95 = {};
// 5914
f974244559_502.returns.push(o95);
// 5915
o95.nodeName = "A";
// 5916
o95.rel = "toggle";
// 5918
o95.__FB_TOKEN = void 0;
// 5919
// 5920
o95.getAttribute = f974244559_500;
// 5921
o95.hasAttribute = f974244559_527;
// 5923
f974244559_527.returns.push(false);
// 5924
o95.JSBNG__addEventListener = f974244559_472;
// 5926
f974244559_472.returns.push(undefined);
// 5927
o95.JSBNG__onkeydown = null;
// 5929
o95.setAttribute = f974244559_643;
// 5930
f974244559_643.returns.push(undefined);
// 5931
o93.__FB_TOKEN = void 0;
// 5932
// undefined
o93 = null;
// 5935
o93 = {};
// 5936
f974244559_502.returns.push(o93);
// 5938
o96 = {};
// 5939
f974244559_502.returns.push(o96);
// 5940
o96.nodeName = "A";
// 5941
o96.rel = "toggle";
// 5943
o96.__FB_TOKEN = void 0;
// 5944
// 5945
o96.getAttribute = f974244559_500;
// 5946
o96.hasAttribute = f974244559_527;
// 5948
f974244559_527.returns.push(false);
// 5949
o96.JSBNG__addEventListener = f974244559_472;
// 5951
f974244559_472.returns.push(undefined);
// 5952
o96.JSBNG__onkeydown = null;
// 5954
o96.setAttribute = f974244559_643;
// 5955
f974244559_643.returns.push(undefined);
// 5956
o93.__FB_TOKEN = void 0;
// 5957
// undefined
o93 = null;
// 5960
o93 = {};
// 5961
f974244559_502.returns.push(o93);
// 5963
o97 = {};
// 5964
f974244559_502.returns.push(o97);
// 5965
o97.nodeName = "A";
// 5966
o97.rel = "toggle";
// 5968
o97.__FB_TOKEN = void 0;
// 5969
// 5970
o97.getAttribute = f974244559_500;
// 5971
o97.hasAttribute = f974244559_527;
// 5973
f974244559_527.returns.push(false);
// 5974
o97.JSBNG__addEventListener = f974244559_472;
// 5976
f974244559_472.returns.push(undefined);
// 5977
o97.JSBNG__onkeydown = null;
// 5979
o97.setAttribute = f974244559_643;
// 5980
f974244559_643.returns.push(undefined);
// 5981
o93.__FB_TOKEN = void 0;
// 5982
// undefined
o93 = null;
// 5985
o93 = {};
// 5986
f974244559_480.returns.push(o93);
// 5987
// 5988
// 5989
o93.getElementsByTagName = f974244559_514;
// 5990
o98 = {};
// 5991
f974244559_514.returns.push(o98);
// 5992
o98.length = 0;
// undefined
o98 = null;
// 5994
o98 = {};
// 5995
o93.childNodes = o98;
// undefined
o93 = null;
// 5996
o98.item = f974244559_517;
// 5997
o98.length = 1;
// 5998
o93 = {};
// 5999
o98["0"] = o93;
// undefined
o98 = null;
// 6000
o93.getElementsByTagName = f974244559_514;
// 6002
o93.querySelectorAll = f974244559_523;
// 6003
o98 = {};
// 6004
f974244559_523.returns.push(o98);
// 6005
o98.length = 0;
// undefined
o98 = null;
// 6006
o93.__html = void 0;
// 6007
o93.mountComponentIntoNode = void 0;
// 6008
o98 = {};
// 6009
o93.classList = o98;
// undefined
o93 = null;
// 6011
o98.add = f974244559_1110;
// undefined
o98 = null;
// 6012
f974244559_1110.returns.push(undefined);
// 6014
o93 = {};
// 6015
f974244559_480.returns.push(o93);
// 6016
// 6017
o93.firstChild = null;
// 6020
o98 = {};
// 6021
f974244559_478.returns.push(o98);
// 6023
o93.appendChild = f974244559_482;
// 6024
f974244559_482.returns.push(o98);
// undefined
o98 = null;
// 6026
o98 = {};
// 6027
f974244559_480.returns.push(o98);
// 6028
// 6029
o98.firstChild = null;
// 6030
o93.__html = void 0;
// 6032
o99 = {};
// 6033
f974244559_478.returns.push(o99);
// 6035
o98.appendChild = f974244559_482;
// 6036
f974244559_482.returns.push(o99);
// undefined
o99 = null;
// 6037
o99 = {};
// 6038
o98.classList = o99;
// 6040
o99.add = f974244559_1110;
// undefined
o99 = null;
// 6041
f974244559_1110.returns.push(undefined);
// 6042
o99 = {};
// 6043
o93.style = o99;
// undefined
o93 = null;
// 6044
// undefined
o99 = null;
// 6048
f974244559_1110.returns.push(undefined);
// 6049
o98.__FB_TOKEN = void 0;
// 6050
// 6051
o98.nodeName = "DIV";
// 6052
o98.getAttribute = f974244559_500;
// 6053
o98.hasAttribute = f974244559_527;
// 6055
f974244559_527.returns.push(false);
// 6056
o98.JSBNG__addEventListener = f974244559_472;
// 6058
f974244559_472.returns.push(undefined);
// 6059
o98.JSBNG__onclick = null;
// 6064
f974244559_472.returns.push(undefined);
// 6065
o98.JSBNG__onsubmit = null;
// 6070
f974244559_472.returns.push(undefined);
// 6071
o98.JSBNG__onsuccess = void 0;
// 6076
f974244559_472.returns.push(undefined);
// 6077
o98.JSBNG__onerror = null;
// undefined
o98 = null;
// 6079
f974244559_12.returns.push(14);
// 6082
o93 = {};
// 6083
f974244559_480.returns.push(o93);
// 6084
// 6085
// 6086
o93.getElementsByTagName = f974244559_514;
// 6087
o98 = {};
// 6088
f974244559_514.returns.push(o98);
// 6089
o98.length = 0;
// undefined
o98 = null;
// 6091
o98 = {};
// 6092
o93.childNodes = o98;
// undefined
o93 = null;
// 6093
o98.item = f974244559_517;
// 6094
o98.length = 1;
// 6095
o93 = {};
// 6096
o98["0"] = o93;
// undefined
o98 = null;
// 6097
o93.getElementsByTagName = f974244559_514;
// 6099
o93.querySelectorAll = f974244559_523;
// 6100
o98 = {};
// 6101
f974244559_523.returns.push(o98);
// 6102
o98.length = 1;
// 6103
o99 = {};
// 6104
o98["0"] = o99;
// undefined
o98 = null;
// undefined
o99 = null;
// 6105
o93.__html = void 0;
// 6106
o93.mountComponentIntoNode = void 0;
// 6107
o98 = {};
// 6108
o93.classList = o98;
// undefined
o93 = null;
// 6110
o98.add = f974244559_1110;
// undefined
o98 = null;
// 6111
f974244559_1110.returns.push(undefined);
// 6113
o93 = {};
// 6114
f974244559_480.returns.push(o93);
// 6115
// 6116
o93.firstChild = null;
// 6119
o98 = {};
// 6120
f974244559_478.returns.push(o98);
// 6122
o93.appendChild = f974244559_482;
// 6123
f974244559_482.returns.push(o98);
// undefined
o98 = null;
// 6125
o98 = {};
// 6126
f974244559_480.returns.push(o98);
// 6127
// 6128
o98.firstChild = null;
// 6129
o93.__html = void 0;
// 6131
o99 = {};
// 6132
f974244559_478.returns.push(o99);
// 6134
o98.appendChild = f974244559_482;
// 6135
f974244559_482.returns.push(o99);
// undefined
o99 = null;
// 6136
o99 = {};
// 6137
o98.classList = o99;
// 6139
o99.add = f974244559_1110;
// undefined
o99 = null;
// 6140
f974244559_1110.returns.push(undefined);
// 6141
o99 = {};
// 6142
o93.style = o99;
// undefined
o93 = null;
// 6143
// undefined
o99 = null;
// 6147
f974244559_1110.returns.push(undefined);
// 6151
f974244559_1110.returns.push(undefined);
// 6152
o98.__FB_TOKEN = void 0;
// 6153
// 6154
o98.nodeName = "DIV";
// 6155
o98.getAttribute = f974244559_500;
// 6156
o98.hasAttribute = f974244559_527;
// 6158
f974244559_527.returns.push(false);
// 6159
o98.JSBNG__addEventListener = f974244559_472;
// 6161
f974244559_472.returns.push(undefined);
// 6162
o98.JSBNG__onclick = null;
// 6167
f974244559_472.returns.push(undefined);
// 6168
o98.JSBNG__onsubmit = null;
// 6173
f974244559_472.returns.push(undefined);
// 6174
o98.JSBNG__onsuccess = void 0;
// 6179
f974244559_472.returns.push(undefined);
// 6180
o98.JSBNG__onerror = null;
// undefined
o98 = null;
// 6182
f974244559_12.returns.push(15);
// 6185
o93 = {};
// 6186
f974244559_480.returns.push(o93);
// 6187
// 6188
// 6189
o93.getElementsByTagName = f974244559_514;
// 6190
o98 = {};
// 6191
f974244559_514.returns.push(o98);
// 6192
o98.length = 0;
// undefined
o98 = null;
// 6194
o98 = {};
// 6195
o93.childNodes = o98;
// undefined
o93 = null;
// 6196
o98.item = f974244559_517;
// 6197
o98.length = 1;
// 6198
o93 = {};
// 6199
o98["0"] = o93;
// undefined
o98 = null;
// 6200
o93.getElementsByTagName = f974244559_514;
// 6202
o93.querySelectorAll = f974244559_523;
// 6203
o98 = {};
// 6204
f974244559_523.returns.push(o98);
// 6205
o98.length = 0;
// undefined
o98 = null;
// 6206
o93.__html = void 0;
// 6207
o93.mountComponentIntoNode = void 0;
// 6208
o98 = {};
// 6209
o93.classList = o98;
// undefined
o93 = null;
// 6211
o98.add = f974244559_1110;
// undefined
o98 = null;
// 6212
f974244559_1110.returns.push(undefined);
// 6214
o93 = {};
// 6215
f974244559_480.returns.push(o93);
// 6216
// 6217
o93.firstChild = null;
// 6220
o98 = {};
// 6221
f974244559_478.returns.push(o98);
// 6223
o93.appendChild = f974244559_482;
// 6224
f974244559_482.returns.push(o98);
// undefined
o98 = null;
// 6226
o98 = {};
// 6227
f974244559_480.returns.push(o98);
// 6228
// 6229
o98.firstChild = null;
// 6230
o93.__html = void 0;
// 6232
o99 = {};
// 6233
f974244559_478.returns.push(o99);
// 6235
o98.appendChild = f974244559_482;
// 6236
f974244559_482.returns.push(o99);
// undefined
o99 = null;
// 6237
o99 = {};
// 6238
o98.classList = o99;
// 6240
o99.add = f974244559_1110;
// undefined
o99 = null;
// 6241
f974244559_1110.returns.push(undefined);
// 6242
o99 = {};
// 6243
o93.style = o99;
// undefined
o93 = null;
// 6244
// undefined
o99 = null;
// 6248
f974244559_1110.returns.push(undefined);
// 6249
o98.__FB_TOKEN = void 0;
// 6250
// undefined
o98 = null;
// 6253
o93 = {};
// 6254
f974244559_480.returns.push(o93);
// 6255
// 6256
// 6257
o93.getElementsByTagName = f974244559_514;
// 6258
o98 = {};
// 6259
f974244559_514.returns.push(o98);
// 6260
o98.length = 0;
// undefined
o98 = null;
// 6262
o98 = {};
// 6263
o93.childNodes = o98;
// undefined
o93 = null;
// 6264
o98.item = f974244559_517;
// 6265
o98.length = 1;
// 6266
o93 = {};
// 6267
o98["0"] = o93;
// undefined
o98 = null;
// 6268
o93.getElementsByTagName = f974244559_514;
// 6270
o93.querySelectorAll = f974244559_523;
// 6271
o98 = {};
// 6272
f974244559_523.returns.push(o98);
// 6273
o98.length = 1;
// 6274
o99 = {};
// 6275
o98["0"] = o99;
// undefined
o98 = null;
// undefined
o99 = null;
// 6276
o93.__html = void 0;
// 6277
o93.mountComponentIntoNode = void 0;
// 6278
o98 = {};
// 6279
o93.classList = o98;
// undefined
o93 = null;
// 6281
o98.add = f974244559_1110;
// undefined
o98 = null;
// 6282
f974244559_1110.returns.push(undefined);
// 6284
o93 = {};
// 6285
f974244559_480.returns.push(o93);
// 6286
// 6287
o93.firstChild = null;
// 6290
o98 = {};
// 6291
f974244559_478.returns.push(o98);
// 6293
o93.appendChild = f974244559_482;
// 6294
f974244559_482.returns.push(o98);
// undefined
o98 = null;
// 6296
o98 = {};
// 6297
f974244559_480.returns.push(o98);
// 6298
// 6299
o98.firstChild = null;
// 6300
o93.__html = void 0;
// 6302
o99 = {};
// 6303
f974244559_478.returns.push(o99);
// 6305
o98.appendChild = f974244559_482;
// 6306
f974244559_482.returns.push(o99);
// undefined
o99 = null;
// 6307
o99 = {};
// 6308
o98.classList = o99;
// 6310
o99.add = f974244559_1110;
// undefined
o99 = null;
// 6311
f974244559_1110.returns.push(undefined);
// 6312
o99 = {};
// 6313
o93.style = o99;
// undefined
o93 = null;
// 6314
// undefined
o99 = null;
// 6318
f974244559_1110.returns.push(undefined);
// 6319
o98.__FB_TOKEN = void 0;
// 6320
// undefined
o98 = null;
// 6323
o93 = {};
// 6324
f974244559_480.returns.push(o93);
// 6325
// 6326
// 6327
o93.getElementsByTagName = f974244559_514;
// 6328
o98 = {};
// 6329
f974244559_514.returns.push(o98);
// 6330
o98.length = 0;
// undefined
o98 = null;
// 6332
o98 = {};
// 6333
o93.childNodes = o98;
// undefined
o93 = null;
// 6334
o98.item = f974244559_517;
// 6335
o98.length = 1;
// 6336
o93 = {};
// 6337
o98["0"] = o93;
// undefined
o98 = null;
// 6338
o93.getElementsByTagName = f974244559_514;
// 6340
o93.querySelectorAll = f974244559_523;
// 6341
o98 = {};
// 6342
f974244559_523.returns.push(o98);
// 6343
o98.length = 1;
// 6344
o99 = {};
// 6345
o98["0"] = o99;
// undefined
o98 = null;
// undefined
o99 = null;
// 6346
o93.__html = void 0;
// 6347
o93.mountComponentIntoNode = void 0;
// 6348
o98 = {};
// 6349
o93.classList = o98;
// undefined
o93 = null;
// 6351
o98.add = f974244559_1110;
// undefined
o98 = null;
// 6352
f974244559_1110.returns.push(undefined);
// 6354
o93 = {};
// 6355
f974244559_480.returns.push(o93);
// 6356
// 6357
o93.firstChild = null;
// 6360
o98 = {};
// 6361
f974244559_478.returns.push(o98);
// 6363
o93.appendChild = f974244559_482;
// 6364
f974244559_482.returns.push(o98);
// undefined
o98 = null;
// 6366
o98 = {};
// 6367
f974244559_480.returns.push(o98);
// 6368
// 6369
o98.firstChild = null;
// 6370
o93.__html = void 0;
// 6372
o99 = {};
// 6373
f974244559_478.returns.push(o99);
// 6375
o98.appendChild = f974244559_482;
// 6376
f974244559_482.returns.push(o99);
// undefined
o99 = null;
// 6377
o99 = {};
// 6378
o98.classList = o99;
// 6380
o99.add = f974244559_1110;
// undefined
o99 = null;
// 6381
f974244559_1110.returns.push(undefined);
// 6382
o99 = {};
// 6383
o93.style = o99;
// undefined
o93 = null;
// 6384
// undefined
o99 = null;
// 6388
f974244559_1110.returns.push(undefined);
// 6389
o98.__FB_TOKEN = void 0;
// 6390
// undefined
o98 = null;
// 6396
o42.querySelectorAll = f974244559_523;
// 6397
o93 = {};
// 6398
f974244559_523.returns.push(o93);
// 6399
o93.length = 0;
// undefined
o93 = null;
// 6400
o42.__html = void 0;
// 6401
o42.mountComponentIntoNode = void 0;
// 6402
o93 = {};
// 6403
o42.classList = o93;
// undefined
o42 = null;
// 6405
o93.add = f974244559_1110;
// undefined
o93 = null;
// 6406
f974244559_1110.returns.push(undefined);
// 6408
o42 = {};
// 6409
f974244559_480.returns.push(o42);
// 6410
// 6411
o42.firstChild = null;
// 6414
o93 = {};
// 6415
f974244559_478.returns.push(o93);
// 6417
o42.appendChild = f974244559_482;
// 6418
f974244559_482.returns.push(o93);
// undefined
o93 = null;
// 6420
o93 = {};
// 6421
f974244559_480.returns.push(o93);
// 6422
// 6423
o93.firstChild = null;
// 6424
o42.__html = void 0;
// 6426
o98 = {};
// 6427
f974244559_478.returns.push(o98);
// 6429
o93.appendChild = f974244559_482;
// 6430
f974244559_482.returns.push(o98);
// undefined
o98 = null;
// 6431
o98 = {};
// 6432
o93.classList = o98;
// 6434
o98.add = f974244559_1110;
// undefined
o98 = null;
// 6435
f974244559_1110.returns.push(undefined);
// 6436
o98 = {};
// 6437
o42.style = o98;
// undefined
o42 = null;
// 6438
// undefined
o98 = null;
// 6442
f974244559_1110.returns.push(undefined);
// 6443
o93.__FB_TOKEN = void 0;
// 6444
// undefined
o93 = null;
// 6452
f974244559_472.returns.push(undefined);
// 6453
f974244559_1202 = function() { return f974244559_1202.returns[f974244559_1202.inst++]; };
f974244559_1202.returns = [];
f974244559_1202.inst = 0;
// 6454
o8.JSBNG__onmouseover = f974244559_1202;
// 6457
// 6467
f974244559_472.returns.push(undefined);
// 6468
o94.JSBNG__onmouseover = null;
// undefined
o94 = null;
// 6477
f974244559_472.returns.push(undefined);
// 6478
o95.JSBNG__onmouseover = null;
// undefined
o95 = null;
// 6486
f974244559_472.returns.push(undefined);
// 6487
o96.JSBNG__onmouseover = null;
// undefined
o96 = null;
// 6495
f974244559_472.returns.push(undefined);
// 6496
o97.JSBNG__onmouseover = null;
// undefined
o97 = null;
// 6501
o42 = {};
// 6502
o93 = {};
// 6504
o42.length = 1;
// 6505
o42["0"] = "AsDOA";
// 6523
o94 = {};
// 6526
o94.srcElement = o64;
// 6528
o94.target = o64;
// 6535
f974244559_519.returns.push(null);
// 6541
f974244559_519.returns.push(null);
// 6547
f974244559_519.returns.push(null);
// 6553
f974244559_519.returns.push(null);
// 6559
f974244559_519.returns.push(null);
// 6565
f974244559_519.returns.push(null);
// 6571
f974244559_519.returns.push(null);
// 6577
f974244559_519.returns.push(null);
// 6583
f974244559_519.returns.push(null);
// 6589
f974244559_519.returns.push(null);
// 6595
f974244559_519.returns.push(null);
// 6601
f974244559_519.returns.push(null);
// 6607
f974244559_519.returns.push(null);
// 6613
f974244559_519.returns.push(null);
// 6619
f974244559_519.returns.push(null);
// 6625
f974244559_519.returns.push(null);
// 6631
f974244559_519.returns.push(null);
// 6636
o94.relatedTarget = o69;
// 6641
f974244559_519.returns.push(null);
// 6647
f974244559_519.returns.push(null);
// 6653
f974244559_519.returns.push(null);
// 6659
f974244559_519.returns.push(null);
// 6665
f974244559_519.returns.push(null);
// 6671
f974244559_519.returns.push(null);
// 6677
f974244559_519.returns.push(null);
// 6683
f974244559_519.returns.push(null);
// 6689
f974244559_519.returns.push(null);
// 6695
f974244559_519.returns.push(null);
// 6701
f974244559_519.returns.push(null);
// 6707
f974244559_519.returns.push(null);
// 6712
o94.cancelBubble = false;
// 6713
o94.returnValue = true;
// undefined
o94 = null;
// 6714
o94 = {};
// 6717
o94.cancelBubble = false;
// 6719
f974244559_1202.returns.push(undefined);
// 6721
o94.returnValue = true;
// 6724
o94.srcElement = o69;
// 6726
o94.target = o69;
// 6733
f974244559_519.returns.push(null);
// 6739
f974244559_519.returns.push(null);
// 6745
f974244559_519.returns.push(null);
// 6751
f974244559_519.returns.push(null);
// 6757
f974244559_519.returns.push(null);
// 6763
f974244559_519.returns.push(null);
// 6769
f974244559_519.returns.push(null);
// 6775
f974244559_519.returns.push(null);
// 6781
f974244559_519.returns.push(null);
// 6787
f974244559_519.returns.push(null);
// 6793
f974244559_519.returns.push(null);
// 6799
f974244559_519.returns.push(null);
// 6804
o94.relatedTarget = o64;
// undefined
o94 = null;
// 6807
o94 = {};
// 6810
o94.srcElement = o69;
// 6812
o94.target = o69;
// 6819
f974244559_519.returns.push(null);
// 6825
f974244559_519.returns.push(null);
// 6831
f974244559_519.returns.push(null);
// 6837
f974244559_519.returns.push(null);
// 6843
f974244559_519.returns.push(null);
// 6849
f974244559_519.returns.push(null);
// 6855
f974244559_519.returns.push(null);
// 6861
f974244559_519.returns.push(null);
// 6867
f974244559_519.returns.push(null);
// 6873
f974244559_519.returns.push(null);
// 6879
f974244559_519.returns.push(null);
// 6885
f974244559_519.returns.push(null);
// 6890
o94.JSBNG__screenX = 723;
// 6891
o94.JSBNG__screenY = 341;
// 6892
o94.altKey = false;
// 6893
o94.bubbles = true;
// 6894
o94.button = 0;
// 6895
o94.buttons = void 0;
// 6896
o94.cancelable = false;
// 6897
o94.clientX = 706;
// 6898
o94.clientY = 237;
// 6899
o94.ctrlKey = false;
// 6900
o94.currentTarget = o0;
// 6901
o94.defaultPrevented = false;
// 6902
o94.detail = 0;
// 6903
o94.eventPhase = 3;
// 6904
o94.isTrusted = void 0;
// 6905
o94.metaKey = false;
// 6906
o94.pageX = 706;
// 6907
o94.pageY = 396;
// 6908
o94.relatedTarget = null;
// 6909
o94.fromElement = null;
// 6912
o94.shiftKey = false;
// 6915
o94.timeStamp = 1373491289457;
// 6916
o94.type = "mousemove";
// 6917
o94.view = ow974244559;
// 6919
o94.returnValue = true;
// 6920
o94.cancelBubble = false;
// undefined
o94 = null;
// 6922
o94 = {};
// undefined
o94 = null;
// 6923
// 6924
// 6927
f974244559_471.returns.push(1373491289469);
// 6930
f974244559_471.returns.push(1373491289469);
// 6932
o94 = {};
// 6933
f974244559_502.returns.push(o94);
// 6935
o95 = {};
// 6936
f974244559_502.returns.push(o95);
// 6937
o96 = {};
// 6938
o95.firstChild = o96;
// 6940
o96.nodeType = 8;
// 6942
o96.nodeValue = " <div class=\"fbChatSidebar fixed_always hidden_elem\" id=\"u_0_22\"><div class=\"fbChatSidebarBody\"><div class=\"uiScrollableArea scrollableOrderedList fade\" style=\"width:205px;\" id=\"u_0_23\"><div class=\"uiScrollableAreaWrap scrollable\" aria-label=\"Scrollable region\" tabindex=\"0\"><div class=\"uiScrollableAreaBody\" style=\"width:205px;\"><div class=\"uiScrollableAreaContent\"><div id=\"u_0_29\"><ul class=\"fbChatOrderedList clearfix\"><li><div class=\"phs fcg\"><span data-jsid=\"message\">Loading...</span></div></li></ul></div></div></div></div><div class=\"uiScrollableAreaTrack invisible_elem\"><div class=\"uiScrollableAreaGripper\"></div></div></div><div class=\"fbChatTypeaheadView hidden_elem\" id=\"u_0_21\"></div></div><div class=\"fbChatSidebarMessage clearfix\"><img class=\"img\" src=\"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/y4/r/-PAXP-deijE.gif\" alt=\"\" width=\"1\" height=\"1\" /><div class=\"message fcg\"></div></div><table class=\"uiGrid _4oes\" cellspacing=\"0\" cellpadding=\"0\"><tbody><tr><td><div class=\"uiTypeahead uiClearableTypeahead fbChatTypeahead\" id=\"u_0_24\"><div class=\"wrap\"><script type=\"text/javascript\">try {\n    ((JSBNG_Record.scriptLoad)((\"function e3824a9f0927c9599de0727896477430b9d24dc00(event) {\\u000a\\u000a};\"), (\"sbeefa1ae3d68fe41ebf216859a81b85c7525462c\")));\n    ((window.top.JSBNG_Record.callerJS) = (true));\n    function e3824a9f0927c9599de0727896477430b9d24dc00(JSBNG__event) {\n        if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n            return ((JSBNG_Record.eventCall)((arguments.callee), (\"sbeefa1ae3d68fe41ebf216859a81b85c7525462c_0\"), (sbeefa1ae3d68fe41ebf216859a81b85c7525462c_0_instance), (this), (arguments)))\n        };\n        (null);\n    ;\n    };\n    var sbeefa1ae3d68fe41ebf216859a81b85c7525462c_0_instance;\n    ((sbeefa1ae3d68fe41ebf216859a81b85c7525462c_0_instance) = ((JSBNG_Record.eventInstance)((\"sbeefa1ae3d68fe41ebf216859a81b85c7525462c_0\"))));\n    ((JSBNG_Record.markFunction)((e3824a9f0927c9599de0727896477430b9d24dc00)));\n} finally {\n    ((window.top.JSBNG_Record.callerJS) = (false));\n    ((window.top.JSBNG_Record.flushDeferredEvents)());\n};</script><button class=\"_42ft _50zy clear uiTypeaheadCloseButton _50-0 _50z-\" title=\"Remove\" onclick=\"return e3824a9f0927c9599de0727896477430b9d24dc00.call(this, event);\" type=\"button\" id=\"u_0_25\">Remove</button><input type=\"hidden\" autocomplete=\"off\" class=\"hiddenInput\" /><div class=\"innerWrap\"><input type=\"text\" class=\"inputtext inputsearch textInput DOMControl_placeholder\" autocomplete=\"off\" placeholder=\"Search\" aria-autocomplete=\"list\" aria-expanded=\"false\" aria-owns=\"typeahead_list_u_0_24\" role=\"combobox\" spellcheck=\"false\" value=\"Search\" aria-label=\"Search\" id=\"u_0_26\" /></div><img class=\"throbber uiLoadingIndicatorAsync img\" src=\"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yb/r/GsNJNwuI-UM.gif\" alt=\"\" width=\"16\" height=\"11\" /></div></div></td><td><div><div class=\"uiSelector inlineBlock fbChatSidebarDropdown button uiSelectorBottomUp uiSelectorRight\" id=\"u_0_27\" data-multiple=\"1\"><div class=\"uiToggle wrap\"><a data-hover=\"tooltip\" aria-label=\"Options\" class=\"uiSelectorButton uiCloseButton\" href=\"#\" role=\"button\" aria-haspopup=\"1\" rel=\"toggle\"></a><div class=\"uiSelectorMenuWrapper uiToggleFlyout\"><div role=\"menu\" class=\"uiMenu uiSelectorMenu\"><ul class=\"uiMenuInner\"><li class=\"uiMenuItem uiMenuItemCheckbox uiSelectorOption checked\" data-label=\"Chat Sounds\"><a class=\"itemAnchor\" role=\"menuitemcheckbox\" tabindex=\"0\" href=\"#\" aria-checked=\"true\"><span class=\"itemLabel fsm\">Chat Sounds</span></a></li><li class=\"uiMenuItem uiMenuItemCheckbox uiSelectorOption\" data-label=\"Advanced Settings...\"><a class=\"itemAnchor\" role=\"menuitemcheckbox\" tabindex=\"-1\" href=\"/ajax/chat/privacy/settings_dialog.php\" aria-checked=\"false\" rel=\"dialog\"><span class=\"itemLabel fsm\">Advanced Settings...</span></a></li><li class=\"uiMenuSeparator\"></li><li class=\"uiMenuItem uiMenuItemCheckbox uiSelectorOption fbChatGoOnlineItem\" data-label=\"Turn On Chat\"><a class=\"itemAnchor\" role=\"menuitemcheckbox\" tabindex=\"-1\" href=\"#\" aria-checked=\"false\"><span class=\"itemLabel fsm\">Turn On Chat</span></a></li><li class=\"uiMenuItem uiMenuItemCheckbox uiSelectorOption fbChatGoOfflineItem\" data-label=\"Turn Off Chat\"><a class=\"itemAnchor\" role=\"menuitemcheckbox\" tabindex=\"-1\" href=\"#\" aria-checked=\"false\"><span class=\"itemLabel fsm\">Turn Off Chat</span></a></li></ul></div></div></div><select multiple=\"1\"><option value=\"\" disabled=\"1\"></option><option value=\"sound\" selected=\"1\">Chat Sounds</option><option value=\"advanced_settings\">Advanced Settings...</option><option value=\"online\">Turn On Chat</option><option value=\"offline\">Turn Off Chat</option></select></div></div></td><td><div></div></td><td><script type=\"text/javascript\">try {\n    ((JSBNG_Record.scriptLoad)((\"function e2ac4d7d24444ff5918e0077a14f810304f88b623(event) {\\u000a    Chat.toggleSidebar();\\u000a};\"), (\"sf3eb0c08669dec0098a79e26677a137ad0d416ba\")));\n    ((window.top.JSBNG_Record.callerJS) = (true));\n    function e2ac4d7d24444ff5918e0077a14f810304f88b623(JSBNG__event) {\n        if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n            return ((JSBNG_Record.eventCall)((arguments.callee), (\"sf3eb0c08669dec0098a79e26677a137ad0d416ba_0\"), (sf3eb0c08669dec0098a79e26677a137ad0d416ba_0_instance), (this), (arguments)))\n        };\n        (null);\n        (((JSBNG_Record.get)(Chat, (\"toggleSidebar\")))[(\"toggleSidebar\")])();\n    };\n    var sf3eb0c08669dec0098a79e26677a137ad0d416ba_0_instance;\n    ((sf3eb0c08669dec0098a79e26677a137ad0d416ba_0_instance) = ((JSBNG_Record.eventInstance)((\"sf3eb0c08669dec0098a79e26677a137ad0d416ba_0\"))));\n    ((JSBNG_Record.markFunction)((e2ac4d7d24444ff5918e0077a14f810304f88b623)));\n} finally {\n    ((window.top.JSBNG_Record.callerJS) = (false));\n    ((window.top.JSBNG_Record.flushDeferredEvents)());\n};</script><a data-hover=\"tooltip\" aria-label=\"Hide sidebar\" data-tooltip-alignh=\"right\" class=\"toggle button\" href=\"#\" onclick=\"return e2ac4d7d24444ff5918e0077a14f810304f88b623.call(this, event);\" role=\"button\"></a></td></tr></tbody></table></div> ";
// undefined
o96 = null;
// 6943
o95.parentNode = o25;
// 6945
f974244559_507.returns.push(o95);
// undefined
o95 = null;
// 6946
// 6947
o94.getAttribute = f974244559_500;
// 6948
f974244559_500.returns.push("pagelet_sidebar");
// 6977
o95 = {};
// 6978
f974244559_480.returns.push(o95);
// 6979
// 6980
// 6981
o95.getElementsByTagName = f974244559_514;
// 6982
o96 = {};
// 6983
f974244559_514.returns.push(o96);
// 6984
o96.length = 0;
// undefined
o96 = null;
// 6986
o96 = {};
// 6987
o95.childNodes = o96;
// undefined
o95 = null;
// 6988
o96.item = f974244559_517;
// 6989
o96.length = 1;
// 6990
o95 = {};
// 6991
o96["0"] = o95;
// undefined
o96 = null;
// 6992
o95.getAttributeNode = f974244559_519;
// undefined
o95 = null;
// 6994
o95 = {};
// 6995
f974244559_519.returns.push(o95);
// 6996
o95.value = "u_0_2b";
// undefined
o95 = null;
// 6999
o95 = {};
// 7000
f974244559_480.returns.push(o95);
// 7001
// 7002
// 7003
o95.getElementsByTagName = f974244559_514;
// 7004
o96 = {};
// 7005
f974244559_514.returns.push(o96);
// 7006
o96.length = 0;
// undefined
o96 = null;
// 7008
o96 = {};
// 7009
o95.childNodes = o96;
// undefined
o95 = null;
// 7010
o96.item = f974244559_517;
// 7011
o96.length = 1;
// 7012
o95 = {};
// 7013
o96["0"] = o95;
// undefined
o96 = null;
// 7014
o95.getAttributeNode = f974244559_519;
// undefined
o95 = null;
// 7016
o95 = {};
// 7017
f974244559_519.returns.push(o95);
// 7018
o95.value = "u_0_2c";
// undefined
o95 = null;
// 7021
o95 = {};
// 7022
f974244559_480.returns.push(o95);
// 7023
// 7024
// 7025
o95.getElementsByTagName = f974244559_514;
// 7026
o96 = {};
// 7027
f974244559_514.returns.push(o96);
// 7028
o96.length = 0;
// undefined
o96 = null;
// 7030
o96 = {};
// 7031
o95.childNodes = o96;
// undefined
o95 = null;
// 7032
o96.item = f974244559_517;
// 7033
o96.length = 1;
// 7034
o95 = {};
// 7035
o96["0"] = o95;
// undefined
o96 = null;
// 7036
o95.getAttributeNode = f974244559_519;
// undefined
o95 = null;
// 7038
o95 = {};
// 7039
f974244559_519.returns.push(o95);
// 7040
o95.value = "u_0_2d";
// undefined
o95 = null;
// 7059
o95 = {};
// 7060
f974244559_502.returns.push(o95);
// 7061
o95.getElementsByTagName = f974244559_514;
// 7063
o95.querySelectorAll = f974244559_523;
// 7064
o96 = {};
// 7065
f974244559_523.returns.push(o96);
// 7066
o96.length = 1;
// 7067
o97 = {};
// 7068
o96["0"] = o97;
// undefined
o96 = null;
// 7069
o97.getElementsByTagName = f974244559_514;
// 7071
o97.querySelectorAll = f974244559_523;
// 7072
o96 = {};
// 7073
f974244559_523.returns.push(o96);
// 7074
o96.length = 1;
// 7075
o98 = {};
// 7076
o96["0"] = o98;
// undefined
o96 = null;
// 7077
o98.getElementsByTagName = f974244559_514;
// 7079
o98.querySelectorAll = f974244559_523;
// 7080
o96 = {};
// 7081
f974244559_523.returns.push(o96);
// 7082
o96.length = 1;
// 7083
o99 = {};
// 7084
o96["0"] = o99;
// undefined
o96 = null;
// 7088
o96 = {};
// 7089
f974244559_523.returns.push(o96);
// 7090
o96.length = 1;
// 7091
o100 = {};
// 7092
o96["0"] = o100;
// undefined
o96 = null;
// 7093
o100.getElementsByTagName = f974244559_514;
// 7095
o100.querySelectorAll = f974244559_523;
// 7096
o96 = {};
// 7097
f974244559_523.returns.push(o96);
// 7098
o96.length = 1;
// 7099
o101 = {};
// 7100
o96["0"] = o101;
// undefined
o96 = null;
// 7101
f974244559_12.returns.push(16);
// 7102
o97.nodeName = "DIV";
// 7103
o97.__FB_TOKEN = void 0;
// 7104
// 7105
o97.getAttribute = f974244559_500;
// 7106
o97.hasAttribute = f974244559_527;
// 7108
f974244559_527.returns.push(false);
// 7109
o97.JSBNG__addEventListener = f974244559_472;
// 7111
f974244559_472.returns.push(undefined);
// 7112
o97.JSBNG__onJSBNG__scroll = void 0;
// 7114
o95.nodeName = "DIV";
// 7115
o95.__FB_TOKEN = void 0;
// 7116
// 7117
o95.getAttribute = f974244559_500;
// 7118
o95.hasAttribute = f974244559_527;
// 7120
f974244559_527.returns.push(false);
// 7121
o95.JSBNG__addEventListener = f974244559_472;
// 7123
f974244559_472.returns.push(undefined);
// 7124
o95.JSBNG__onmousemove = null;
// 7126
o100.nodeName = "DIV";
// 7127
o100.__FB_TOKEN = void 0;
// 7128
// 7129
o100.getAttribute = f974244559_500;
// 7130
o100.hasAttribute = f974244559_527;
// 7132
f974244559_527.returns.push(false);
// 7133
o100.JSBNG__addEventListener = f974244559_472;
// 7135
f974244559_472.returns.push(undefined);
// 7136
o100.JSBNG__onclick = null;
// 7141
f974244559_472.returns.push(undefined);
// 7142
o95.JSBNG__onmouseover = null;
// 7147
f974244559_472.returns.push(undefined);
// 7148
o95.JSBNG__onmouseout = null;
// 7153
f974244559_472.returns.push(undefined);
// 7154
o95.JSBNG__onfocusin = void 0;
// 7159
f974244559_472.returns.push(undefined);
// 7160
o95.JSBNG__onfocusout = void 0;
// 7165
f974244559_472.returns.push(undefined);
// 7166
o95.JSBNG__onmousedown = null;
// 7168
o101.nodeName = "DIV";
// 7169
o101.__FB_TOKEN = void 0;
// 7170
// 7171
o101.getAttribute = f974244559_500;
// 7172
o101.hasAttribute = f974244559_527;
// 7174
f974244559_527.returns.push(false);
// 7175
o101.JSBNG__addEventListener = f974244559_472;
// 7177
f974244559_472.returns.push(undefined);
// 7178
o101.JSBNG__onmousedown = null;
// 7180
o96 = {};
// 7181
o95.classList = o96;
// 7183
o96.add = f974244559_1110;
// 7184
f974244559_1110.returns.push(undefined);
// 7194
f974244559_471.returns.push(1373491289512);
// 7195
o102 = {};
// 7197
f974244559_1240 = function() { return f974244559_1240.returns[f974244559_1240.inst++]; };
f974244559_1240.returns = [];
f974244559_1240.inst = 0;
// 7198
o102._needsGripper = f974244559_1240;
// 7199
f974244559_1241 = function() { return f974244559_1241.returns[f974244559_1241.inst++]; };
f974244559_1241.returns = [];
f974244559_1241.inst = 0;
// 7200
o102._throttledComputeHeights = f974244559_1241;
// 7202
f974244559_471.returns.push(1373491289513);
// 7203
o86.clientHeight = 0;
// 7204
o90.offsetHeight = 0;
// 7205
o91.offsetHeight = 0;
// 7206
f974244559_12.returns.push(17);
// 7207
f974244559_1241.returns.push(undefined);
// 7208
o102._gripperHeight = NaN;
// 7209
o102._trackHeight = 0;
// 7210
f974244559_1240.returns.push(false);
// 7211
f974244559_1242 = function() { return f974244559_1242.returns[f974244559_1242.inst++]; };
f974244559_1242.returns = [];
f974244559_1242.inst = 0;
// 7212
o102._throttledShowGripperAndShadows = f974244559_1242;
// 7214
f974244559_471.returns.push(1373491289526);
// 7216
f974244559_471.returns.push(1373491289526);
// 7217
o103 = {};
// 7218
o92.classList = o103;
// 7220
o103.add = f974244559_1110;
// undefined
o103 = null;
// 7221
f974244559_1110.returns.push(undefined);
// 7222
o88.scrollTop = 0;
// 7225
f974244559_1244 = function() { return f974244559_1244.returns[f974244559_1244.inst++]; };
f974244559_1244.returns = [];
f974244559_1244.inst = 0;
// 7226
o87.remove = f974244559_1244;
// undefined
o87 = null;
// 7227
f974244559_1244.returns.push(undefined);
// 7232
f974244559_1244.returns.push(undefined);
// 7233
f974244559_12.returns.push(18);
// 7234
f974244559_1242.returns.push(undefined);
// 7235
o87 = {};
// 7238
o87.srcElement = o69;
// 7240
o87.target = o69;
// 7247
f974244559_519.returns.push(null);
// 7253
f974244559_519.returns.push(null);
// 7259
f974244559_519.returns.push(null);
// 7265
f974244559_519.returns.push(null);
// 7271
f974244559_519.returns.push(null);
// 7277
f974244559_519.returns.push(null);
// 7283
f974244559_519.returns.push(null);
// 7289
f974244559_519.returns.push(null);
// 7295
f974244559_519.returns.push(null);
// 7301
f974244559_519.returns.push(null);
// 7307
f974244559_519.returns.push(null);
// 7313
f974244559_519.returns.push(null);
// 7318
o103 = {};
// 7319
o87.relatedTarget = o103;
// 7320
o104 = {};
// 7321
o103.parentNode = o104;
// 7322
o103.nodeType = 1;
// 7323
o103.getAttributeNode = f974244559_519;
// 7325
f974244559_519.returns.push(null);
// 7327
o105 = {};
// 7328
o104.parentNode = o105;
// 7329
o104.nodeType = 1;
// 7330
o104.getAttributeNode = f974244559_519;
// undefined
o104 = null;
// 7332
f974244559_519.returns.push(null);
// 7334
o104 = {};
// 7335
o105.parentNode = o104;
// 7336
o105.nodeType = 1;
// 7337
o105.getAttributeNode = f974244559_519;
// undefined
o105 = null;
// 7339
f974244559_519.returns.push(null);
// 7341
o104.parentNode = o39;
// 7342
o104.nodeType = 1;
// 7343
o104.getAttributeNode = f974244559_519;
// 7345
f974244559_519.returns.push(null);
// 7347
o39.parentNode = o69;
// 7348
o39.nodeType = 1;
// 7349
o39.getAttributeNode = f974244559_519;
// undefined
o39 = null;
// 7351
f974244559_519.returns.push(null);
// 7357
f974244559_519.returns.push(null);
// 7363
f974244559_519.returns.push(null);
// 7369
f974244559_519.returns.push(null);
// 7375
f974244559_519.returns.push(null);
// 7381
f974244559_519.returns.push(null);
// 7387
f974244559_519.returns.push(null);
// 7393
f974244559_519.returns.push(null);
// 7399
f974244559_519.returns.push(null);
// 7405
f974244559_519.returns.push(null);
// 7411
f974244559_519.returns.push(null);
// 7417
f974244559_519.returns.push(null);
// 7423
f974244559_519.returns.push(null);
// 7428
o87.cancelBubble = false;
// 7429
o87.returnValue = true;
// undefined
o87 = null;
// 7430
o39 = {};
// 7433
o39.cancelBubble = false;
// 7435
f974244559_1202.returns.push(undefined);
// 7437
o39.returnValue = true;
// 7440
o39.srcElement = o103;
// 7442
o39.target = o103;
// 7449
f974244559_519.returns.push(null);
// 7455
f974244559_519.returns.push(null);
// 7461
f974244559_519.returns.push(null);
// 7467
f974244559_519.returns.push(null);
// 7473
f974244559_519.returns.push(null);
// 7479
f974244559_519.returns.push(null);
// 7485
f974244559_519.returns.push(null);
// 7491
f974244559_519.returns.push(null);
// 7497
f974244559_519.returns.push(null);
// 7503
f974244559_519.returns.push(null);
// 7509
f974244559_519.returns.push(null);
// 7515
f974244559_519.returns.push(null);
// 7521
f974244559_519.returns.push(null);
// 7527
f974244559_519.returns.push(null);
// 7533
f974244559_519.returns.push(null);
// 7539
f974244559_519.returns.push(null);
// 7545
f974244559_519.returns.push(null);
// 7550
o39.relatedTarget = o69;
// undefined
o39 = null;
// 7553
o39 = {};
// 7556
o39.srcElement = o103;
// 7558
o39.target = o103;
// 7565
f974244559_519.returns.push(null);
// 7571
f974244559_519.returns.push(null);
// 7577
f974244559_519.returns.push(null);
// 7583
f974244559_519.returns.push(null);
// 7589
f974244559_519.returns.push(null);
// 7595
f974244559_519.returns.push(null);
// 7601
f974244559_519.returns.push(null);
// 7607
f974244559_519.returns.push(null);
// 7613
f974244559_519.returns.push(null);
// 7619
f974244559_519.returns.push(null);
// 7625
f974244559_519.returns.push(null);
// 7631
f974244559_519.returns.push(null);
// 7637
f974244559_519.returns.push(null);
// 7643
f974244559_519.returns.push(null);
// 7649
f974244559_519.returns.push(null);
// 7655
f974244559_519.returns.push(null);
// 7661
f974244559_519.returns.push(null);
// 7666
o39.JSBNG__screenX = 681;
// 7667
o39.JSBNG__screenY = 358;
// 7668
o39.altKey = false;
// 7669
o39.bubbles = true;
// 7670
o39.button = 0;
// 7671
o39.buttons = void 0;
// 7672
o39.cancelable = false;
// 7673
o39.clientX = 664;
// 7674
o39.clientY = 254;
// 7675
o39.ctrlKey = false;
// 7676
o39.currentTarget = o0;
// 7677
o39.defaultPrevented = false;
// 7678
o39.detail = 0;
// 7679
o39.eventPhase = 3;
// 7680
o39.isTrusted = void 0;
// 7681
o39.metaKey = false;
// 7682
o39.pageX = 664;
// 7683
o39.pageY = 413;
// 7684
o39.relatedTarget = null;
// 7685
o39.fromElement = null;
// 7688
o39.shiftKey = false;
// 7691
o39.timeStamp = 1373491289568;
// 7692
o39.type = "mousemove";
// 7693
o39.view = ow974244559;
// 7695
o39.returnValue = true;
// 7696
o39.cancelBubble = false;
// undefined
o39 = null;
// 7698
o39 = {};
// 7700
o39._needsGripper = f974244559_1240;
// 7701
f974244559_1253 = function() { return f974244559_1253.returns[f974244559_1253.inst++]; };
f974244559_1253.returns = [];
f974244559_1253.inst = 0;
// 7702
o39._throttledComputeHeights = f974244559_1253;
// 7704
f974244559_471.returns.push(1373491289591);
// 7705
o79.clientHeight = 0;
// 7706
o83.offsetHeight = 0;
// 7707
o84.offsetHeight = 0;
// 7708
f974244559_12.returns.push(19);
// 7709
f974244559_1253.returns.push(undefined);
// 7710
o39._gripperHeight = NaN;
// 7711
o39._trackHeight = 0;
// 7712
f974244559_1240.returns.push(false);
// 7713
f974244559_1254 = function() { return f974244559_1254.returns[f974244559_1254.inst++]; };
f974244559_1254.returns = [];
f974244559_1254.inst = 0;
// 7714
o39._throttledShowGripperAndShadows = f974244559_1254;
// 7716
f974244559_471.returns.push(1373491289592);
// 7718
f974244559_471.returns.push(1373491289592);
// 7719
o87 = {};
// 7720
o85.classList = o87;
// 7722
o87.add = f974244559_1110;
// undefined
o87 = null;
// 7723
f974244559_1110.returns.push(undefined);
// 7724
o81.scrollTop = 0;
// 7727
o80.remove = f974244559_1244;
// undefined
o80 = null;
// 7728
f974244559_1244.returns.push(undefined);
// 7733
f974244559_1244.returns.push(undefined);
// 7734
f974244559_12.returns.push(20);
// 7735
f974244559_1254.returns.push(undefined);
// 7736
o80 = {};
// 7742
f974244559_471.returns.push(1373491289594);
// 7743
f974244559_1257 = function() { return f974244559_1257.returns[f974244559_1257.inst++]; };
f974244559_1257.returns = [];
f974244559_1257.inst = 0;
// 7744
o4.pushState = f974244559_1257;
// 7745
o0.JSBNG__URL = "http://jsbngssl.www.facebook.com/LawlabeeTheWallaby";
// 7746
f974244559_1258 = function() { return f974244559_1258.returns[f974244559_1258.inst++]; };
f974244559_1258.returns = [];
f974244559_1258.inst = 0;
// 7747
o4.replaceState = f974244559_1258;
// undefined
o4 = null;
// 7748
f974244559_1258.returns.push(undefined);
// 7749
f974244559_7.returns.push(undefined);
// 7750
f974244559_1259 = function() { return f974244559_1259.returns[f974244559_1259.inst++]; };
f974244559_1259.returns = [];
f974244559_1259.inst = 0;
// 7751
ow974244559.JSBNG__onpopstate = f974244559_1259;
// 7758
f974244559_472.returns.push(undefined);
// 7759
o0.JSBNG__onsubmit = null;
// 7764
o4 = {};
// 7766
o87 = {};
// 7768
o87._needsGripper = f974244559_1240;
// 7769
f974244559_1262 = function() { return f974244559_1262.returns[f974244559_1262.inst++]; };
f974244559_1262.returns = [];
f974244559_1262.inst = 0;
// 7770
o87._throttledComputeHeights = f974244559_1262;
// 7772
f974244559_471.returns.push(1373491289598);
// 7773
o95.clientHeight = 0;
// 7774
o99.offsetHeight = 0;
// 7775
o100.offsetHeight = 0;
// undefined
o100 = null;
// 7776
f974244559_12.returns.push(21);
// 7777
f974244559_1262.returns.push(undefined);
// 7778
o87._gripperHeight = NaN;
// 7779
o87._trackHeight = 0;
// 7780
f974244559_1240.returns.push(false);
// 7781
f974244559_1263 = function() { return f974244559_1263.returns[f974244559_1263.inst++]; };
f974244559_1263.returns = [];
f974244559_1263.inst = 0;
// 7782
o87._throttledShowGripperAndShadows = f974244559_1263;
// 7784
f974244559_471.returns.push(1373491289605);
// 7786
f974244559_471.returns.push(1373491289605);
// 7787
o100 = {};
// 7788
o101.classList = o100;
// undefined
o101 = null;
// 7790
o100.add = f974244559_1110;
// undefined
o100 = null;
// 7791
f974244559_1110.returns.push(undefined);
// 7792
o97.scrollTop = 0;
// 7795
o96.remove = f974244559_1244;
// 7796
f974244559_1244.returns.push(undefined);
// 7801
f974244559_1244.returns.push(undefined);
// 7802
f974244559_12.returns.push(22);
// 7803
f974244559_1263.returns.push(undefined);
// 7804
o100 = {};
// undefined
o100 = null;
// 7805
// 7806
// 7809
f974244559_471.returns.push(1373491289607);
// 7812
f974244559_471.returns.push(1373491289608);
// 7814
o100 = {};
// 7815
f974244559_502.returns.push(o100);
// 7817
o101 = {};
// 7818
f974244559_502.returns.push(o101);
// 7819
o105 = {};
// 7820
o101.firstChild = o105;
// 7822
o105.nodeType = 8;
// 7824
o105.nodeValue = " <li class=\"fbTimelineUnit fbTimelineTwoColumn clearfix\" data-side=\"r\" data-fixed=\"1\" data-size=\"1\" id=\"tl_unit_380562705353186_recent\"><div class=\"topBorder\"></div><div class=\"timelineReportContainer\" id=\"u_0_2h\" data-gt=\"&#123;&quot;eventtime&quot;:&quot;1373491278&quot;,&quot;viewerid&quot;:&quot;100006118350059&quot;,&quot;profileownerid&quot;:&quot;1055580469&quot;,&quot;unitimpressionid&quot;:&quot;856ec6cb&quot;,&quot;contentid&quot;:&quot;&quot;,&quot;timeline_unit_type&quot;:&quot;TimelineAboutReportUnit&quot;,&quot;timewindowsize&quot;:&quot;3&quot;,&quot;query_type&quot;:&quot;39&quot;,&quot;contextwindowstart&quot;:&quot;0&quot;,&quot;contextwindowend&quot;:&quot;1375340399&quot;&#125;\" role=\"complementary\"><div class=\"\"><div role=\"article\"><div class=\"_70l\"><div class=\"_57fp\" data-ft=\"&#123;&quot;tn&quot;:&quot;C&quot;&#125;\"><a class=\"_57fo\" href=\"http://jsbngssl.www.facebook.com/LawlabeeTheWallaby/info\"></a><div class=\"fsm fwn fcg\"><a class=\"_71u _70n\" href=\"http://jsbngssl.www.facebook.com/LawlabeeTheWallaby/info\">About</a></div></div></div><div class=\"timelineReportContent timelineNoSubheaderReport\"><div class=\"timelineUnitContainer _503z ogProfileLastUnit\" id=\"timeline_about_unit\" data-gt=\"&#123;&quot;eventtime&quot;:&quot;1373491278&quot;,&quot;viewerid&quot;:&quot;100006118350059&quot;,&quot;profileownerid&quot;:&quot;1055580469&quot;,&quot;unitimpressionid&quot;:&quot;856ec6cb&quot;,&quot;contentid&quot;:&quot;&quot;,&quot;timeline_unit_type&quot;:&quot;TimelineAboutUnit&quot;,&quot;timewindowsize&quot;:&quot;3&quot;,&quot;query_type&quot;:&quot;39&quot;,&quot;contextwindowstart&quot;:&quot;0&quot;,&quot;contextwindowend&quot;:&quot;1375340399&quot;&#125;\" data-time=\"0\"><div class=\"\"><div role=\"article\"><div><ul><li data-token=\"1\" class=\"_5bko\" id=\"u_0_2k\"><div class=\"_4_uf\"><div class=\"clearfix\"><img class=\"_s0 _51iw _8o _8r lfloat _54rv img\" src=\"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yw/r/3LFVMmKZeUX.png\" alt=\"\" width=\"16\" height=\"16\" /><div class=\"_8u _42ef\"><ul class=\"uiList _4_vp _4kg\"><li class=\"_4_ug\">Works at <a class=\"profileLink\" href=\"http://jsbngssl.www.facebook.com/PurdueUniversity?ref=br_rs\" data-hovercard=\"/ajax/hovercard/page.php?id=100526673914\">Purdue University</a></li><li class=\"_4_uh\">September 2008 to present</li></ul></div></div></div></li><li data-token=\"2\" class=\"_5bko\" id=\"u_0_2l\"><div class=\"_4_uf\"><div class=\"clearfix\"><img class=\"_s0 _51iw _8o _8r lfloat _54rv img\" src=\"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yb/r/wKvDSXpnqkB.png\" alt=\"\" width=\"16\" height=\"16\" /><div class=\"_8u _42ef\"><ul class=\"uiList _4_vp _4kg\"><li class=\"_4_ug\">Studies Computer Science at <a class=\"profileLink\" href=\"http://jsbngssl.www.facebook.com/PurdueUniversity?ref=br_rs\" data-hovercard=\"/ajax/hovercard/page.php?id=100526673914\">Purdue University</a></li><li class=\"_4_uh\">Past: <a class=\"profileLink\" href=\"http://jsbngssl.www.facebook.com/pages/Portland-State-University/113512491992878\" data-hovercard=\"/ajax/hovercard/page.php?id=113512491992878\">Portland State University</a> and <a class=\"profileLink\" href=\"http://jsbngssl.www.facebook.com/pages/Milwaukie-High-School/109486142404101\" data-hovercard=\"/ajax/hovercard/page.php?id=109486142404101\">Milwaukie High School</a></li></ul></div></div></div></li><li data-token=\"3\" class=\"_5bko\" id=\"u_0_2m\"><div class=\"_4_uf\"><div class=\"clearfix\"><img class=\"_s0 _51iw _8o _8r lfloat _54rv img\" src=\"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yI/r/jg7lQrpjdKk.png\" alt=\"\" width=\"16\" height=\"16\" /><div class=\"_8u _42ef\"><ul class=\"uiList _4_vp _513w _4kg\"><li class=\"_4_ug\">Lives in <a class=\"profileLink\" href=\"http://jsbngssl.www.facebook.com/pages/West-Lafayette-Indiana/112305682116972?ref=br_rs\" data-hovercard=\"/ajax/hovercard/page.php?id=112305682116972\">West Lafayette, Indiana</a></li></ul></div></div></div></li><li data-token=\"4\" class=\"_5bko\" id=\"u_0_2n\"><div class=\"_4_uf\"><div class=\"clearfix\"><img class=\"_s0 _51iw _8o _8r lfloat _54rv img\" src=\"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yZ/r/kBTlO7fdcY0.png\" alt=\"\" width=\"16\" height=\"16\" /><div class=\"_8u _42ef\"><ul class=\"uiList _4_vp _513w _4kg\"><li class=\"_4_ug\">From <a class=\"profileLink\" href=\"http://jsbngssl.www.facebook.com/pages/Portland-Oregon/112548152092705?ref=br_rs\" data-hovercard=\"/ajax/hovercard/page.php?id=112548152092705\">Portland, Oregon</a></li></ul></div></div></div></li><li data-token=\"6\" class=\"_5bko\" id=\"u_0_2o\"><div class=\"_4_uf\"><div class=\"clearfix\"><img class=\"_s0 _51iw _8o _8r lfloat _54rv img\" src=\"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yd/r/kz0_p5XcuSq.png\" alt=\"\" width=\"16\" height=\"16\" /><div class=\"_8u _42ef\"><ul class=\"uiList _4_vp _513w _4kg\"><li class=\"_4_ug\">Followed by <a href=\"http://jsbngssl.www.facebook.com/LawlabeeTheWallaby/followers\">9 people</a></li></ul></div></div></div></li></ul></div></div></div></div></div></div></div></div><i class=\"spinePointer\"></i><div class=\"bottomBorder\"></div></li><li class=\"fbTimelineUnit fbTimelineTwoColumn clearfix\" data-side=\"r\" data-fixed=\"1\" data-size=\"1\" id=\"u_0_2f\"><div class=\"topBorder\"></div><div class=\"timelineReportContainer _w90\" id=\"u_0_2i\" data-gt=\"&#123;&quot;eventtime&quot;:&quot;1373491278&quot;,&quot;viewerid&quot;:&quot;100006118350059&quot;,&quot;profileownerid&quot;:&quot;1055580469&quot;,&quot;unitimpressionid&quot;:&quot;856ec6cb&quot;,&quot;contentid&quot;:&quot;&quot;,&quot;timeline_unit_type&quot;:&quot;AppSectionEgoUnit&quot;,&quot;timewindowsize&quot;:&quot;3&quot;,&quot;query_type&quot;:&quot;39&quot;,&quot;contextwindowstart&quot;:&quot;0&quot;,&quot;contextwindowend&quot;:&quot;1375340399&quot;,&quot;timeline_og_unit_click&quot;:&quot;1&quot;,&quot;unit_id&quot;:&quot;288381481237582&quot;,&quot;event_source&quot;:&quot;38&quot;,&quot;app_id&quot;:&quot;2305272732&quot;,&quot;action_type_id&quot;:&quot;&quot;&#125;\" data-time=\"0\"><div class=\"\"><div role=\"article\"><div class=\"_70l\"><div class=\"_57fp\" data-ft=\"&#123;&quot;tn&quot;:&quot;C&quot;&#125;\"><a class=\"_57fo\" href=\"http://jsbngssl.www.facebook.com/LawlabeeTheWallaby/photos\"></a><div class=\"fsm fwn fcg\"><a class=\"_71u _70n\" href=\"http://jsbngssl.www.facebook.com/LawlabeeTheWallaby/photos\">Photos</a> · <span class=\"_71u\"><a href=\"http://jsbngssl.www.facebook.com/LawlabeeTheWallaby/photos\"><span class=\"fwn fcg\">241</span></a></span></div></div></div><div id=\"pagelet_timeline_app_collection_report_5\" class=\"_w8_\"><div data-referrer=\"photos_ego\"><table class=\"uiGrid _122 _1g2x\" cellspacing=\"0\" cellpadding=\"0\"><tbody><tr><td><a href=\"http://jsbngssl.www.facebook.com/photo.php?fbid=10200268473688587&amp;set=a.1468918877039.2062262.1055580469&amp;type=1\" rel=\"theater\" ajaxify=\"http://jsbngssl.www.facebook.com/photo.php?fbid=10200268473688587&amp;set=a.1468918877039.2062262.1055580469&amp;type=1&amp;src=https%3A%2F%2Ffbcdn-sphotos-b-a.akamaihd.net%2Fhphotos-ak-frc3%2F993004_10200268473688587_517108607_n.jpg&amp;size=640%2C640&amp;source=8\" data-ft=\"&#123;&quot;tn&quot;:&quot;E&quot;&#125;\"><div class=\"uiScaledImageContainer\" style=\"width:103px;height:103px;\"><img class=\"scaledImageFitWidth img\" src=\"http://jsbngssl.fbcdn-photos-b-a.akamaihd.net/hphotos-ak-frc3/p110x80/993004_10200268473688587_517108607_a.jpg\" alt=\"Gregor Richards&#039;s photo.\" width=\"103\" height=\"103\" /></div></a></td><td><a href=\"http://jsbngssl.www.facebook.com/photo.php?fbid=10200268472248551&amp;set=a.3353777797334.2140697.1055580469&amp;type=1\" rel=\"theater\" ajaxify=\"http://jsbngssl.www.facebook.com/photo.php?fbid=10200268472248551&amp;set=a.3353777797334.2140697.1055580469&amp;type=1&amp;src=https%3A%2F%2Fsphotos-a.xx.fbcdn.net%2Fhphotos-ash3%2F1017486_10200268472248551_842609840_n.jpg&amp;size=851%2C315&amp;source=8\" data-ft=\"&#123;&quot;tn&quot;:&quot;E&quot;&#125;\"><div class=\"uiScaledImageContainer\" style=\"width:103px;height:103px;\"><img class=\"img\" src=\"http://jsbngssl.sphotos-a.xx.fbcdn.net/hphotos-ash3/s280x280/1017486_10200268472248551_842609840_n.jpg\" style=\"left:-88px;\" alt=\"Gregor Richards&#039;s photo.\" width=\"280\" height=\"103\" /></div></a></td><td><a href=\"http://jsbngssl.www.facebook.com/photo.php?fbid=4986916864790&amp;set=a.1138433375108.2021456.1055580469&amp;type=1\" rel=\"theater\" ajaxify=\"http://jsbngssl.www.facebook.com/photo.php?fbid=4986916864790&amp;set=a.1138433375108.2021456.1055580469&amp;type=1&amp;src=https%3A%2F%2Fsphotos-b.xx.fbcdn.net%2Fhphotos-frc1%2F913679_4986916864790_91703778_o.jpg&amp;smallsrc=https%3A%2F%2Fsphotos-b.xx.fbcdn.net%2Fhphotos-prn2%2F178992_4986916864790_91703778_n.jpg&amp;size=2048%2C1536&amp;source=8\" data-ft=\"&#123;&quot;tn&quot;:&quot;E&quot;&#125;\"><div class=\"uiScaledImageContainer\" style=\"width:103px;height:103px;\"><img class=\"img\" src=\"http://jsbngssl.sphotos-b.xx.fbcdn.net/hphotos-prn2/p118x118/178992_4986916864790_91703778_n.jpg\" alt=\"Today I learned that Dr. Gorman is actually another alternate identity for Clark Kent.\" width=\"138\" height=\"103\" /></div></a></td></tr><tr><td><a href=\"http://jsbngssl.www.facebook.com/photo.php?fbid=4897864518537&amp;set=a.1138433375108.2021456.1055580469&amp;type=1\" rel=\"theater\" ajaxify=\"http://jsbngssl.www.facebook.com/photo.php?fbid=4897864518537&amp;set=a.1138433375108.2021456.1055580469&amp;type=1&amp;src=https%3A%2F%2Ffbcdn-sphotos-c-a.akamaihd.net%2Fhphotos-ak-frc1%2F422167_4897864518537_1503459754_n.jpg&amp;size=538%2C404&amp;source=8\" data-ft=\"&#123;&quot;tn&quot;:&quot;E&quot;&#125;\"><div class=\"uiScaledImageContainer\" style=\"width:103px;height:103px;\"><img class=\"img\" src=\"http://jsbngssl.fbcdn-sphotos-c-a.akamaihd.net/hphotos-ak-frc1/p118x118/422167_4897864518537_1503459754_n.jpg\" style=\"left:-17px;\" alt=\"No parking gais. For realsies. They&#039;ll tow your boat.\" width=\"138\" height=\"103\" /></div></a></td><td><a href=\"http://jsbngssl.www.facebook.com/photo.php?fbid=4897839437910&amp;set=a.1138433375108.2021456.1055580469&amp;type=1\" rel=\"theater\" ajaxify=\"http://jsbngssl.www.facebook.com/photo.php?fbid=4897839437910&amp;set=a.1138433375108.2021456.1055580469&amp;type=1&amp;src=https%3A%2F%2Ffbcdn-sphotos-h-a.akamaihd.net%2Fhphotos-ak-frc1%2F920971_4897839437910_1063615079_o.jpg&amp;smallsrc=https%3A%2F%2Ffbcdn-sphotos-h-a.akamaihd.net%2Fhphotos-ak-frc1%2F644616_4897839437910_1063615079_n.jpg&amp;size=2048%2C473&amp;source=8\" data-ft=\"&#123;&quot;tn&quot;:&quot;E&quot;&#125;\"><div class=\"uiScaledImageContainer\" style=\"width:103px;height:103px;\"><img class=\"img\" src=\"http://jsbngssl.fbcdn-sphotos-h-a.akamaihd.net/hphotos-ak-frc1/s480x480/644616_4897839437910_1063615079_n.jpg\" style=\"left:-173px;\" alt=\"So yeah, there&#039;s a LITTLE bit of flooding &#039;round these parts.\" width=\"450\" height=\"103\" /></div></a></td><td><a href=\"http://jsbngssl.www.facebook.com/photo.php?fbid=4875948970662&amp;set=a.1138433375108.2021456.1055580469&amp;type=1\" rel=\"theater\" ajaxify=\"http://jsbngssl.www.facebook.com/photo.php?fbid=4875948970662&amp;set=a.1138433375108.2021456.1055580469&amp;type=1&amp;src=https%3A%2F%2Fsphotos-b.xx.fbcdn.net%2Fhphotos-ash3%2F150431_4875948970662_1470457029_n.jpg&amp;size=944%2C834&amp;source=8\" data-ft=\"&#123;&quot;tn&quot;:&quot;E&quot;&#125;\"><div class=\"_46-h\" style=\"width:103px;height:103px;\"><img class=\"_46-i img\" src=\"http://jsbngssl.photos-b.xx.fbcdn.net/hphotos-ash3/p118x90/150431_4875948970662_1470457029_a.jpg\" style=\"left:-7px; top:0px;\" alt=\"Anyone who can spot the delightful (and delicious!) irony in this photo gets ten Internet points.\" width=\"118\" height=\"104\" /></div></a></td></tr><tr><td><a href=\"http://jsbngssl.www.facebook.com/photo.php?fbid=4691723285135&amp;set=a.1138433375108.2021456.1055580469&amp;type=1\" rel=\"theater\" ajaxify=\"http://jsbngssl.www.facebook.com/photo.php?fbid=4691723285135&amp;set=a.1138433375108.2021456.1055580469&amp;type=1&amp;src=https%3A%2F%2Ffbcdn-sphotos-f-a.akamaihd.net%2Fhphotos-ak-ash3%2F577358_4691723285135_528345851_n.jpg&amp;size=600%2C600&amp;source=8\" data-ft=\"&#123;&quot;tn&quot;:&quot;E&quot;&#125;\"><div class=\"uiScaledImageContainer\" style=\"width:103px;height:103px;\"><img class=\"scaledImageFitWidth img\" src=\"http://jsbngssl.fbcdn-photos-f-a.akamaihd.net/hphotos-ak-ash3/p110x80/577358_4691723285135_528345851_a.jpg\" alt=\"I, for one, blame my parents.\" width=\"103\" height=\"103\" /></div></a></td><td><a href=\"http://jsbngssl.www.facebook.com/photo.php?fbid=4441724315317&amp;set=a.1138433375108.2021456.1055580469&amp;type=1\" rel=\"theater\" ajaxify=\"http://jsbngssl.www.facebook.com/photo.php?fbid=4441724315317&amp;set=a.1138433375108.2021456.1055580469&amp;type=1&amp;src=https%3A%2F%2Fsphotos-a.xx.fbcdn.net%2Fhphotos-prn1%2F793914_4441724315317_424104454_o.jpg&amp;smallsrc=https%3A%2F%2Fsphotos-a.xx.fbcdn.net%2Fhphotos-prn1%2F74137_4441724315317_424104454_n.jpg&amp;size=1024%2C1024&amp;source=8\" data-ft=\"&#123;&quot;tn&quot;:&quot;E&quot;&#125;\"><div class=\"uiScaledImageContainer\" style=\"width:103px;height:103px;\"><img class=\"scaledImageFitWidth img\" src=\"http://jsbngssl.photos-a.xx.fbcdn.net/hphotos-prn1/p110x80/74137_4441724315317_424104454_a.jpg\" alt=\"Bought myself some nostalgia in the form of a watch.\" width=\"103\" height=\"103\" /></div></a></td><td><a href=\"http://jsbngssl.www.facebook.com/photo.php?fbid=4158049383621&amp;set=a.3353777797334.2140697.1055580469&amp;type=1\" rel=\"theater\" ajaxify=\"http://jsbngssl.www.facebook.com/photo.php?fbid=4158049383621&amp;set=a.3353777797334.2140697.1055580469&amp;type=1&amp;src=https%3A%2F%2Ffbcdn-sphotos-g-a.akamaihd.net%2Fhphotos-ak-prn1%2F73038_4158049383621_1395344823_n.jpg&amp;size=851%2C315&amp;source=8\" data-ft=\"&#123;&quot;tn&quot;:&quot;E&quot;&#125;\"><div class=\"uiScaledImageContainer\" style=\"width:103px;height:103px;\"><img class=\"img\" src=\"http://jsbngssl.fbcdn-sphotos-g-a.akamaihd.net/hphotos-ak-prn1/s280x280/73038_4158049383621_1395344823_n.jpg\" style=\"left:-88px;\" alt=\"Gregor Richards&#039;s photo.\" width=\"280\" height=\"103\" /></div></a></td></tr></tbody></table></div></div></div></div></div><i class=\"spinePointer\"></i><div class=\"bottomBorder\"></div></li><li class=\"fbTimelineUnit fbTimelineTwoColumn clearfix\" data-side=\"r\" data-fixed=\"1\" data-size=\"1\" id=\"u_0_2g\"><div class=\"topBorder\"></div><div class=\"timelineReportContainer\" id=\"u_0_2j\" data-gt=\"&#123;&quot;eventtime&quot;:&quot;1373491278&quot;,&quot;viewerid&quot;:&quot;100006118350059&quot;,&quot;profileownerid&quot;:&quot;1055580469&quot;,&quot;unitimpressionid&quot;:&quot;856ec6cb&quot;,&quot;contentid&quot;:&quot;&quot;,&quot;timeline_unit_type&quot;:&quot;AppSectionEgoUnit&quot;,&quot;timewindowsize&quot;:&quot;3&quot;,&quot;query_type&quot;:&quot;39&quot;,&quot;contextwindowstart&quot;:&quot;0&quot;,&quot;contextwindowend&quot;:&quot;1375340399&quot;,&quot;timeline_og_unit_click&quot;:&quot;1&quot;,&quot;unit_id&quot;:&quot;288381481237582&quot;,&quot;event_source&quot;:&quot;38&quot;,&quot;app_id&quot;:&quot;2361831622&quot;,&quot;action_type_id&quot;:&quot;&quot;&#125;\" data-time=\"0\"><div class=\"\"><div role=\"article\"><div class=\"_70l\"><div class=\"_57fp\" data-ft=\"&#123;&quot;tn&quot;:&quot;C&quot;&#125;\"><a class=\"_57fo\" href=\"http://jsbngssl.www.facebook.com/LawlabeeTheWallaby/groups\"></a><div class=\"fsm fwn fcg\"><a class=\"_71u _70n\" href=\"http://jsbngssl.www.facebook.com/LawlabeeTheWallaby/groups\">Groups</a> · <span class=\"_71u\"><a href=\"http://jsbngssl.www.facebook.com/LawlabeeTheWallaby/groups\"><span class=\"fwn fcg\">1</span></a></span></div></div></div><div id=\"pagelet_timeline_app_collection_report_66\" class=\"_w8_\"><div class=\"_1ln2\"><ul class=\"uiList _4kg _4kt\"><li><div class=\"clearfix\" data-ft=\"&#123;&quot;tn&quot;:&quot;l&quot;&#125;\"><div class=\"listMemberFacepileLargeCollection listMemberFacepile _8o _8t lfloat\"><img class=\"firstImg img\" src=\"http://jsbngssl.fbcdn-profile-a.akamaihd.net/hprofile-ak-prn2/276274_1055580469_962040234_q.jpg\" alt=\"\" /><img class=\"img\" src=\"http://jsbngssl.fbcdn-profile-a.akamaihd.net/static-ak/rsrc.php/v2/yo/r/UlIqmHJn-SK.gif\" alt=\"\" /><img class=\"img\" src=\"http://jsbngssl.fbcdn-profile-a.akamaihd.net/static-ak/rsrc.php/v2/yo/r/UlIqmHJn-SK.gif\" alt=\"\" /><img class=\"lastImg img\" src=\"http://jsbngssl.fbcdn-profile-a.akamaihd.net/static-ak/rsrc.php/v2/yo/r/UlIqmHJn-SK.gif\" alt=\"\" /></div><div class=\"_42ef\"><div class=\"_6a _ph5\"><div class=\"_6a _6b\" style=\"height:64px\"></div><div class=\"_6a _6b\"><a href=\"/groups/26418081870/\" data-hovercard=\"/ajax/hovercard/group.php?id=26418081870\">Purdue Extreme Croquet</a><div><div class=\"fcg\">1 member</div></div><span class=\"_538r\">Enjoy the civilized and gentlemanly...</span></div></div></div></div></li></ul></div></div></div></div></div><i class=\"spinePointer\"></i><div class=\"bottomBorder\"></div></li><li class=\"_3ram hidden_elem\" data-endmarker=\"recent\" data-pageindex=\"0\"></li> ";
// undefined
o105 = null;
// 7825
o101.parentNode = o25;
// 7827
f974244559_507.returns.push(o101);
// undefined
o101 = null;
// 7829
o101 = {};
// 7830
f974244559_480.returns.push(o101);
// 7831
// 7833
o105 = {};
// 7834
f974244559_478.returns.push(o105);
// 7835
o106 = {};
// undefined
fo974244559_1269_firstChild = function() { return fo974244559_1269_firstChild.returns[fo974244559_1269_firstChild.inst++]; };
fo974244559_1269_firstChild.returns = [];
fo974244559_1269_firstChild.inst = 0;
defineGetter(o101, "firstChild", fo974244559_1269_firstChild, undefined);
// undefined
o101 = null;
// undefined
fo974244559_1269_firstChild.returns.push(o106);
// 7837
o105.appendChild = f974244559_482;
// undefined
fo974244559_1269_firstChild.returns.push(o106);
// 7839
f974244559_482.returns.push(o106);
// undefined
o106 = null;
// 7840
o101 = {};
// undefined
fo974244559_1269_firstChild.returns.push(o101);
// undefined
fo974244559_1269_firstChild.returns.push(o101);
// 7844
f974244559_482.returns.push(o101);
// undefined
o101 = null;
// 7845
o101 = {};
// undefined
fo974244559_1269_firstChild.returns.push(o101);
// undefined
fo974244559_1269_firstChild.returns.push(o101);
// 7849
f974244559_482.returns.push(o101);
// undefined
o101 = null;
// 7850
o101 = {};
// undefined
fo974244559_1269_firstChild.returns.push(o101);
// undefined
fo974244559_1269_firstChild.returns.push(o101);
// 7854
f974244559_482.returns.push(o101);
// undefined
fo974244559_1269_firstChild.returns.push(null);
// 7856
o100.appendChild = f974244559_482;
// 7857
f974244559_482.returns.push(o105);
// undefined
o105 = null;
// 7858
o100.getAttribute = f974244559_500;
// 7859
f974244559_500.returns.push("pagelet_timeline_recent_ocm");
// 7864
f974244559_471.returns.push(1373491289636);
// 7867
f974244559_471.returns.push(1373491289637);
// 7870
f974244559_471.returns.push(1373491289638);
// 7873
f974244559_471.returns.push(1373491289638);
// 7876
f974244559_471.returns.push(1373491289638);
// 7878
o105 = {};
// 7879
f974244559_502.returns.push(o105);
// 7881
o106 = {};
// 7882
f974244559_502.returns.push(o106);
// 7883
o107 = {};
// 7884
o106.firstChild = o107;
// 7886
o107.nodeType = 8;
// 7888
o107.nodeValue = " <div class=\"_22t _22q _22r\" id=\"u_0_2q\" data-referrer=\"u_0_2q\"></div> ";
// undefined
o107 = null;
// 7889
o106.parentNode = o25;
// 7891
f974244559_507.returns.push(o106);
// undefined
o106 = null;
// 7892
// 7893
o105.getAttribute = f974244559_500;
// 7894
f974244559_500.returns.push("pagelet_side_ads");
// 7898
f974244559_471.returns.push(1373491289641);
// 7903
o106 = {};
// 7904
f974244559_478.returns.push(o106);
// 7906
f974244559_482.returns.push(o106);
// undefined
o106 = null;
// 7909
f974244559_471.returns.push(1373491289642);
// 7912
f974244559_471.returns.push(1373491289643);
// 7915
f974244559_471.returns.push(1373491289643);
// 7917
o106 = {};
// 7918
f974244559_502.returns.push(o106);
// 7920
o107 = {};
// 7921
f974244559_502.returns.push(o107);
// 7922
o108 = {};
// 7923
o107.firstChild = o108;
// 7925
o108.nodeType = 8;
// 7927
o108.nodeValue = " <div class=\"_50-\\-\\ fbDockWrapper fbDockWrapperRight\" id=\"u_0_2s\"><div class=\"fbDock clearfix\"><div class=\"clearfix nubContainer rNubContainer\"><div id=\"ChatTabsPagelet\" data-referrer=\"ChatTabsPagelet\"><div class=\"fbNubGroup clearfix _56oy\" id=\"u_0_2t\"><div class=\"fbNubGroup clearfix\" id=\"u_0_2u\"></div></div></div><div id=\"BuddylistPagelet\" data-referrer=\"BuddylistPagelet\"><div class=\"_56ox\"><div class=\"uiToggle _50-v fbNub _4mq3 hide_on_presence_error\" id=\"fbDockChatBuddylistNub\"><a class=\"fbNubButton\" tabindex=\"0\" href=\"#\" rel=\"toggle\" role=\"button\"><span class=\"_5ayx rfloat\"></span><img class=\"icon lfloat img\" src=\"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/y4/r/-PAXP-deijE.gif\" alt=\"\" width=\"1\" height=\"1\" /><span class=\"label\">Chat<span class=\"count\"> (<strong>0</strong>)</span></span></a><div class=\"fbNubFlyout uiToggleFlyout\"><div class=\"fbNubFlyoutOuter\"><div class=\"fbNubFlyoutInner\"><div class=\"clearfix fbNubFlyoutTitlebar\" data-jsid=\"nubFlyoutTitlebar\"><div class=\"uiSelector inlineBlock fbChatSidebarDropdown button rfloat uiSelectorRight\" id=\"u_0_2z\" data-multiple=\"1\"><div class=\"uiToggle wrap\"><a data-hover=\"tooltip\" aria-label=\"Options\" class=\"uiSelectorButton uiCloseButton\" href=\"#\" role=\"button\" aria-haspopup=\"1\" rel=\"toggle\"></a><div class=\"uiSelectorMenuWrapper uiToggleFlyout\"><div role=\"menu\" class=\"uiMenu uiSelectorMenu\"><ul class=\"uiMenuInner\"><li class=\"uiMenuItem uiMenuItemCheckbox uiSelectorOption checked\" data-label=\"Chat Sounds\"><a class=\"itemAnchor\" role=\"menuitemcheckbox\" tabindex=\"0\" href=\"#\" aria-checked=\"true\"><span class=\"itemLabel fsm\">Chat Sounds</span></a></li><li class=\"uiMenuItem uiMenuItemCheckbox uiSelectorOption\" data-label=\"Advanced Settings...\"><a class=\"itemAnchor\" role=\"menuitemcheckbox\" tabindex=\"-1\" href=\"/ajax/chat/privacy/settings_dialog.php\" aria-checked=\"false\" rel=\"dialog\"><span class=\"itemLabel fsm\">Advanced Settings...</span></a></li><li class=\"uiMenuSeparator\"></li><li class=\"uiMenuItem uiMenuItemCheckbox uiSelectorOption fbChatGoOnlineItem\" data-label=\"Turn On Chat\"><a class=\"itemAnchor\" role=\"menuitemcheckbox\" tabindex=\"-1\" href=\"#\" aria-checked=\"false\"><span class=\"itemLabel fsm\">Turn On Chat</span></a></li><li class=\"uiMenuItem uiMenuItemCheckbox uiSelectorOption fbChatGoOfflineItem\" data-label=\"Turn Off Chat\"><a class=\"itemAnchor\" role=\"menuitemcheckbox\" tabindex=\"-1\" href=\"/ajax/chat/privacy/turn_off_dialog.php\" aria-checked=\"false\" rel=\"dialog\"><span class=\"itemLabel fsm\">Turn Off Chat</span></a></li></ul></div></div></div><select multiple=\"1\"><option value=\"\" disabled=\"1\"></option><option value=\"sound\" selected=\"1\">Chat Sounds</option><option value=\"advanced_settings\">Advanced Settings...</option><option value=\"online\">Turn On Chat</option><option value=\"turn_off_dialog\">Turn Off Chat</option></select></div><div class=\"titlebarLabel clearfix\"><div class=\"titlebarTextWrapper\">Chat</div></div></div><div class=\"fbNubFlyoutBody scrollable\"><div class=\"fbNubFlyoutBodyContent\"><div id=\"u_0_31\"><ul class=\"fbChatOrderedList clearfix\"><li><div class=\"phs fcg\"><span data-jsid=\"message\">Loading...</span></div></li></ul></div><div class=\"fbChatTypeaheadView hidden_elem\" id=\"u_0_2v\"></div></div></div><div class=\"fbNubFlyoutFooter\"><div class=\"_4mq7 clearfix\"><img class=\"img\" src=\"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/y4/r/-PAXP-deijE.gif\" alt=\"\" width=\"1\" height=\"1\" /><div class=\"_4mq1 fcg\"></div></div><div class=\"uiTypeahead uiClearableTypeahead fbChatTypeahead\" id=\"u_0_2w\"><div class=\"wrap\"><script type=\"text/javascript\">try {\n    ((JSBNG_Record.scriptLoad)((\"function ecde908e25f2a2f2e82ee2fd34e043030c4d5611d(event) {\\u000a\\u000a};\"), (\"sad475d6e5bd4bb64b387ffbc8ac2e55c88177952\")));\n    ((window.top.JSBNG_Record.callerJS) = (true));\n    function ecde908e25f2a2f2e82ee2fd34e043030c4d5611d(JSBNG__event) {\n        if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n            return ((JSBNG_Record.eventCall)((arguments.callee), (\"sad475d6e5bd4bb64b387ffbc8ac2e55c88177952_0\"), (sad475d6e5bd4bb64b387ffbc8ac2e55c88177952_0_instance), (this), (arguments)))\n        };\n        (null);\n    ;\n    };\n    var sad475d6e5bd4bb64b387ffbc8ac2e55c88177952_0_instance;\n    ((sad475d6e5bd4bb64b387ffbc8ac2e55c88177952_0_instance) = ((JSBNG_Record.eventInstance)((\"sad475d6e5bd4bb64b387ffbc8ac2e55c88177952_0\"))));\n    ((JSBNG_Record.markFunction)((ecde908e25f2a2f2e82ee2fd34e043030c4d5611d)));\n} finally {\n    ((window.top.JSBNG_Record.callerJS) = (false));\n    ((window.top.JSBNG_Record.flushDeferredEvents)());\n};</script><button class=\"_42ft _50zy clear uiTypeaheadCloseButton _50-0 _50z-\" title=\"Remove\" onclick=\"return ecde908e25f2a2f2e82ee2fd34e043030c4d5611d.call(this, event);\" type=\"button\" id=\"u_0_2x\">Remove</button><input type=\"hidden\" autocomplete=\"off\" class=\"hiddenInput\" /><div class=\"innerWrap\"><input type=\"text\" class=\"inputtext inputsearch textInput DOMControl_placeholder\" autocomplete=\"off\" placeholder=\"Search\" aria-autocomplete=\"list\" aria-expanded=\"false\" aria-owns=\"typeahead_list_u_0_2w\" role=\"combobox\" spellcheck=\"false\" value=\"Search\" aria-label=\"Search\" id=\"u_0_2y\" /></div><img class=\"throbber uiLoadingIndicatorAsync img\" src=\"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yb/r/GsNJNwuI-UM.gif\" alt=\"\" width=\"16\" height=\"11\" /></div></div></div></div></div></div></div></div></div></div></div></div><div id=\"u_0_32\"></div> ";
// undefined
o108 = null;
// 7928
o107.parentNode = o25;
// 7930
f974244559_507.returns.push(o107);
// undefined
o107 = null;
// 7931
// 7932
o106.getAttribute = f974244559_500;
// 7933
f974244559_500.returns.push("pagelet_dock");
// 7997
o107 = {};
// 7998
f974244559_480.returns.push(o107);
// 7999
// 8000
// 8001
o107.getElementsByTagName = f974244559_514;
// 8002
o108 = {};
// 8003
f974244559_514.returns.push(o108);
// 8004
o108.length = 0;
// undefined
o108 = null;
// 8006
o108 = {};
// 8007
o107.childNodes = o108;
// undefined
o107 = null;
// 8008
o108.item = f974244559_517;
// 8009
o108.length = 1;
// 8010
o107 = {};
// 8011
o108["0"] = o107;
// undefined
o108 = null;
// 8012
o107.getAttributeNode = f974244559_519;
// 8014
f974244559_519.returns.push(null);
// 8015
o107.getElementsByTagName = f974244559_514;
// undefined
o107 = null;
// 8017
o107 = {};
// 8018
f974244559_514.returns.push(o107);
// 8019
o107.length = 138;
// 8020
o108 = {};
// 8021
o107["0"] = o108;
// 8022
o108.getAttributeNode = f974244559_519;
// 8024
f974244559_519.returns.push(null);
// 8026
o109 = {};
// 8027
o107["1"] = o109;
// 8028
o109.getAttributeNode = f974244559_519;
// 8030
f974244559_519.returns.push(null);
// 8032
o110 = {};
// 8033
o107["2"] = o110;
// 8034
o110.getAttributeNode = f974244559_519;
// 8036
f974244559_519.returns.push(null);
// 8038
o111 = {};
// 8039
o107["3"] = o111;
// 8040
o111.getAttributeNode = f974244559_519;
// 8042
f974244559_519.returns.push(null);
// 8044
o112 = {};
// 8045
o107["4"] = o112;
// 8046
o112.getAttributeNode = f974244559_519;
// 8048
f974244559_519.returns.push(null);
// 8050
o113 = {};
// 8051
o107["5"] = o113;
// 8052
o113.getAttributeNode = f974244559_519;
// 8054
f974244559_519.returns.push(null);
// 8056
o114 = {};
// 8057
o107["6"] = o114;
// 8058
o114.getAttributeNode = f974244559_519;
// 8060
f974244559_519.returns.push(null);
// 8062
o115 = {};
// 8063
o107["7"] = o115;
// 8064
o115.getAttributeNode = f974244559_519;
// 8066
f974244559_519.returns.push(null);
// 8068
o116 = {};
// 8069
o107["8"] = o116;
// 8070
o116.getAttributeNode = f974244559_519;
// 8072
f974244559_519.returns.push(null);
// 8074
o117 = {};
// 8075
o107["9"] = o117;
// 8076
o117.getAttributeNode = f974244559_519;
// 8078
f974244559_519.returns.push(null);
// 8080
o118 = {};
// 8081
o107["10"] = o118;
// 8082
o118.getAttributeNode = f974244559_519;
// 8084
f974244559_519.returns.push(null);
// 8086
o119 = {};
// 8087
o107["11"] = o119;
// 8088
o119.getAttributeNode = f974244559_519;
// 8090
f974244559_519.returns.push(null);
// 8092
o120 = {};
// 8093
o107["12"] = o120;
// 8094
o120.getAttributeNode = f974244559_519;
// 8096
f974244559_519.returns.push(null);
// 8098
o121 = {};
// 8099
o107["13"] = o121;
// 8100
o121.getAttributeNode = f974244559_519;
// 8102
f974244559_519.returns.push(null);
// 8104
o122 = {};
// 8105
o107["14"] = o122;
// 8106
o122.getAttributeNode = f974244559_519;
// 8108
f974244559_519.returns.push(null);
// 8110
o123 = {};
// 8111
o107["15"] = o123;
// 8112
o123.getAttributeNode = f974244559_519;
// 8114
f974244559_519.returns.push(null);
// 8116
o124 = {};
// 8117
o107["16"] = o124;
// 8118
o124.getAttributeNode = f974244559_519;
// 8120
f974244559_519.returns.push(null);
// 8122
o125 = {};
// 8123
o107["17"] = o125;
// 8124
o125.getAttributeNode = f974244559_519;
// 8126
f974244559_519.returns.push(null);
// 8128
o126 = {};
// 8129
o107["18"] = o126;
// 8130
o126.getAttributeNode = f974244559_519;
// 8132
f974244559_519.returns.push(null);
// 8134
o127 = {};
// 8135
o107["19"] = o127;
// 8136
o127.getAttributeNode = f974244559_519;
// 8138
f974244559_519.returns.push(null);
// 8140
o128 = {};
// 8141
o107["20"] = o128;
// 8142
o128.getAttributeNode = f974244559_519;
// 8144
f974244559_519.returns.push(null);
// 8146
o129 = {};
// 8147
o107["21"] = o129;
// 8148
o129.getAttributeNode = f974244559_519;
// 8150
f974244559_519.returns.push(null);
// 8152
o130 = {};
// 8153
o107["22"] = o130;
// 8154
o130.getAttributeNode = f974244559_519;
// 8156
f974244559_519.returns.push(null);
// 8158
o131 = {};
// 8159
o107["23"] = o131;
// 8160
o131.getAttributeNode = f974244559_519;
// 8162
f974244559_519.returns.push(null);
// 8164
o132 = {};
// 8165
o107["24"] = o132;
// undefined
o107 = null;
// 8166
o132.getAttributeNode = f974244559_519;
// 8168
o107 = {};
// 8169
f974244559_519.returns.push(o107);
// 8170
o107.value = "u_0_37";
// 8175
f974244559_519.returns.push(null);
// 8178
o133 = {};
// 8179
f974244559_514.returns.push(o133);
// 8180
o133.length = 138;
// 8181
o133["0"] = o108;
// undefined
o108 = null;
// 8184
f974244559_519.returns.push(null);
// 8186
o133["1"] = o109;
// undefined
o109 = null;
// 8189
f974244559_519.returns.push(null);
// 8191
o133["2"] = o110;
// undefined
o110 = null;
// 8194
f974244559_519.returns.push(null);
// 8196
o133["3"] = o111;
// undefined
o111 = null;
// 8199
f974244559_519.returns.push(null);
// 8201
o133["4"] = o112;
// undefined
o112 = null;
// 8204
f974244559_519.returns.push(null);
// 8206
o133["5"] = o113;
// undefined
o113 = null;
// 8209
f974244559_519.returns.push(null);
// 8211
o133["6"] = o114;
// undefined
o114 = null;
// 8214
f974244559_519.returns.push(null);
// 8216
o133["7"] = o115;
// undefined
o115 = null;
// 8219
f974244559_519.returns.push(null);
// 8221
o133["8"] = o116;
// undefined
o116 = null;
// 8224
f974244559_519.returns.push(null);
// 8226
o133["9"] = o117;
// undefined
o117 = null;
// 8229
f974244559_519.returns.push(null);
// 8231
o133["10"] = o118;
// undefined
o118 = null;
// 8234
f974244559_519.returns.push(null);
// 8236
o133["11"] = o119;
// undefined
o119 = null;
// 8239
f974244559_519.returns.push(null);
// 8241
o133["12"] = o120;
// undefined
o120 = null;
// 8244
f974244559_519.returns.push(null);
// 8246
o133["13"] = o121;
// undefined
o121 = null;
// 8249
f974244559_519.returns.push(null);
// 8251
o133["14"] = o122;
// undefined
o122 = null;
// 8254
f974244559_519.returns.push(null);
// 8256
o133["15"] = o123;
// undefined
o123 = null;
// 8259
f974244559_519.returns.push(null);
// 8261
o133["16"] = o124;
// undefined
o124 = null;
// 8264
f974244559_519.returns.push(null);
// 8266
o133["17"] = o125;
// undefined
o125 = null;
// 8269
f974244559_519.returns.push(null);
// 8271
o133["18"] = o126;
// undefined
o126 = null;
// 8274
f974244559_519.returns.push(null);
// 8276
o133["19"] = o127;
// undefined
o127 = null;
// 8279
f974244559_519.returns.push(null);
// 8281
o133["20"] = o128;
// undefined
o128 = null;
// 8284
f974244559_519.returns.push(null);
// 8286
o133["21"] = o129;
// undefined
o129 = null;
// 8289
f974244559_519.returns.push(null);
// 8291
o133["22"] = o130;
// undefined
o130 = null;
// 8294
f974244559_519.returns.push(null);
// 8296
o133["23"] = o131;
// undefined
o131 = null;
// 8299
f974244559_519.returns.push(null);
// 8301
o133["24"] = o132;
// undefined
o132 = null;
// 8304
f974244559_519.returns.push(o107);
// undefined
o107 = null;
// 8307
o107 = {};
// 8308
o133["25"] = o107;
// 8309
o107.getAttributeNode = f974244559_519;
// undefined
o107 = null;
// 8311
f974244559_519.returns.push(null);
// 8313
o107 = {};
// 8314
o133["26"] = o107;
// 8315
o107.getAttributeNode = f974244559_519;
// undefined
o107 = null;
// 8317
f974244559_519.returns.push(null);
// 8319
o107 = {};
// 8320
o133["27"] = o107;
// 8321
o107.getAttributeNode = f974244559_519;
// undefined
o107 = null;
// 8323
f974244559_519.returns.push(null);
// 8325
o107 = {};
// 8326
o133["28"] = o107;
// 8327
o107.getAttributeNode = f974244559_519;
// undefined
o107 = null;
// 8329
f974244559_519.returns.push(null);
// 8331
o107 = {};
// 8332
o133["29"] = o107;
// 8333
o107.getAttributeNode = f974244559_519;
// undefined
o107 = null;
// 8335
f974244559_519.returns.push(null);
// 8337
o107 = {};
// 8338
o133["30"] = o107;
// 8339
o107.getAttributeNode = f974244559_519;
// undefined
o107 = null;
// 8341
f974244559_519.returns.push(null);
// 8343
o107 = {};
// 8344
o133["31"] = o107;
// 8345
o107.getAttributeNode = f974244559_519;
// undefined
o107 = null;
// 8347
f974244559_519.returns.push(null);
// 8349
o107 = {};
// 8350
o133["32"] = o107;
// 8351
o107.getAttributeNode = f974244559_519;
// undefined
o107 = null;
// 8353
f974244559_519.returns.push(null);
// 8355
o107 = {};
// 8356
o133["33"] = o107;
// 8357
o107.getAttributeNode = f974244559_519;
// undefined
o107 = null;
// 8359
f974244559_519.returns.push(null);
// 8361
o107 = {};
// 8362
o133["34"] = o107;
// 8363
o107.getAttributeNode = f974244559_519;
// undefined
o107 = null;
// 8365
f974244559_519.returns.push(null);
// 8367
o107 = {};
// 8368
o133["35"] = o107;
// 8369
o107.getAttributeNode = f974244559_519;
// undefined
o107 = null;
// 8371
f974244559_519.returns.push(null);
// 8373
o107 = {};
// 8374
o133["36"] = o107;
// 8375
o107.getAttributeNode = f974244559_519;
// undefined
o107 = null;
// 8377
f974244559_519.returns.push(null);
// 8379
o107 = {};
// 8380
o133["37"] = o107;
// 8381
o107.getAttributeNode = f974244559_519;
// undefined
o107 = null;
// 8383
f974244559_519.returns.push(null);
// 8385
o107 = {};
// 8386
o133["38"] = o107;
// 8387
o107.getAttributeNode = f974244559_519;
// undefined
o107 = null;
// 8389
f974244559_519.returns.push(null);
// 8391
o107 = {};
// 8392
o133["39"] = o107;
// 8393
o107.getAttributeNode = f974244559_519;
// undefined
o107 = null;
// 8395
f974244559_519.returns.push(null);
// 8397
o107 = {};
// 8398
o133["40"] = o107;
// 8399
o107.getAttributeNode = f974244559_519;
// undefined
o107 = null;
// 8401
f974244559_519.returns.push(null);
// 8403
o107 = {};
// 8404
o133["41"] = o107;
// 8405
o107.getAttributeNode = f974244559_519;
// undefined
o107 = null;
// 8407
f974244559_519.returns.push(null);
// 8409
o107 = {};
// 8410
o133["42"] = o107;
// 8411
o107.getAttributeNode = f974244559_519;
// undefined
o107 = null;
// 8413
f974244559_519.returns.push(null);
// 8415
o107 = {};
// 8416
o133["43"] = o107;
// 8417
o107.getAttributeNode = f974244559_519;
// undefined
o107 = null;
// 8419
f974244559_519.returns.push(null);
// 8421
o107 = {};
// 8422
o133["44"] = o107;
// 8423
o107.getAttributeNode = f974244559_519;
// undefined
o107 = null;
// 8425
f974244559_519.returns.push(null);
// 8427
o107 = {};
// 8428
o133["45"] = o107;
// 8429
o107.getAttributeNode = f974244559_519;
// undefined
o107 = null;
// 8431
f974244559_519.returns.push(null);
// 8433
o107 = {};
// 8434
o133["46"] = o107;
// 8435
o107.getAttributeNode = f974244559_519;
// undefined
o107 = null;
// 8437
f974244559_519.returns.push(null);
// 8439
o107 = {};
// 8440
o133["47"] = o107;
// 8441
o107.getAttributeNode = f974244559_519;
// undefined
o107 = null;
// 8443
f974244559_519.returns.push(null);
// 8445
o107 = {};
// 8446
o133["48"] = o107;
// 8447
o107.getAttributeNode = f974244559_519;
// undefined
o107 = null;
// 8449
f974244559_519.returns.push(null);
// 8451
o107 = {};
// 8452
o133["49"] = o107;
// 8453
o107.getAttributeNode = f974244559_519;
// undefined
o107 = null;
// 8455
f974244559_519.returns.push(null);
// 8457
o107 = {};
// 8458
o133["50"] = o107;
// 8459
o107.getAttributeNode = f974244559_519;
// undefined
o107 = null;
// 8461
f974244559_519.returns.push(null);
// 8463
o107 = {};
// 8464
o133["51"] = o107;
// 8465
o107.getAttributeNode = f974244559_519;
// undefined
o107 = null;
// 8467
o107 = {};
// 8468
f974244559_519.returns.push(o107);
// 8469
o107.value = "u_0_35";
// undefined
o107 = null;
// 8471
o107 = {};
// 8472
o133["52"] = o107;
// 8473
o107.getAttributeNode = f974244559_519;
// undefined
o107 = null;
// 8475
f974244559_519.returns.push(null);
// 8477
o107 = {};
// 8478
o133["53"] = o107;
// 8479
o107.getAttributeNode = f974244559_519;
// undefined
o107 = null;
// 8481
f974244559_519.returns.push(null);
// 8483
o107 = {};
// 8484
o133["54"] = o107;
// 8485
o107.getAttributeNode = f974244559_519;
// undefined
o107 = null;
// 8487
f974244559_519.returns.push(null);
// 8489
o107 = {};
// 8490
o133["55"] = o107;
// 8491
o107.getAttributeNode = f974244559_519;
// undefined
o107 = null;
// 8493
f974244559_519.returns.push(null);
// 8495
o107 = {};
// 8496
o133["56"] = o107;
// 8497
o107.getAttributeNode = f974244559_519;
// undefined
o107 = null;
// 8499
f974244559_519.returns.push(null);
// 8501
o107 = {};
// 8502
o133["57"] = o107;
// 8503
o107.getAttributeNode = f974244559_519;
// undefined
o107 = null;
// 8505
f974244559_519.returns.push(null);
// 8507
o107 = {};
// 8508
o133["58"] = o107;
// 8509
o107.getAttributeNode = f974244559_519;
// undefined
o107 = null;
// 8511
f974244559_519.returns.push(null);
// 8513
o107 = {};
// 8514
o133["59"] = o107;
// 8515
o107.getAttributeNode = f974244559_519;
// undefined
o107 = null;
// 8517
f974244559_519.returns.push(null);
// 8519
o107 = {};
// 8520
o133["60"] = o107;
// 8521
o107.getAttributeNode = f974244559_519;
// undefined
o107 = null;
// 8523
f974244559_519.returns.push(null);
// 8525
o107 = {};
// 8526
o133["61"] = o107;
// 8527
o107.getAttributeNode = f974244559_519;
// undefined
o107 = null;
// 8529
f974244559_519.returns.push(null);
// 8531
o107 = {};
// 8532
o133["62"] = o107;
// 8533
o107.getAttributeNode = f974244559_519;
// undefined
o107 = null;
// 8535
f974244559_519.returns.push(null);
// 8537
o107 = {};
// 8538
o133["63"] = o107;
// 8539
o107.getAttributeNode = f974244559_519;
// undefined
o107 = null;
// 8541
o107 = {};
// 8542
f974244559_519.returns.push(o107);
// 8543
o107.value = "u_0_36";
// undefined
o107 = null;
// 8545
o107 = {};
// 8546
o133["64"] = o107;
// 8547
o107.getAttributeNode = f974244559_519;
// undefined
o107 = null;
// 8549
f974244559_519.returns.push(null);
// 8551
o107 = {};
// 8552
o133["65"] = o107;
// 8553
o107.getAttributeNode = f974244559_519;
// undefined
o107 = null;
// 8555
f974244559_519.returns.push(null);
// 8557
o107 = {};
// 8558
o133["66"] = o107;
// 8559
o107.getAttributeNode = f974244559_519;
// undefined
o107 = null;
// 8561
f974244559_519.returns.push(null);
// 8563
o107 = {};
// 8564
o133["67"] = o107;
// 8565
o107.getAttributeNode = f974244559_519;
// undefined
o107 = null;
// 8567
f974244559_519.returns.push(null);
// 8569
o107 = {};
// 8570
o133["68"] = o107;
// 8571
o107.getAttributeNode = f974244559_519;
// undefined
o107 = null;
// 8573
f974244559_519.returns.push(null);
// 8575
o107 = {};
// 8576
o133["69"] = o107;
// 8577
o107.getAttributeNode = f974244559_519;
// undefined
o107 = null;
// 8579
f974244559_519.returns.push(null);
// 8581
o107 = {};
// 8582
o133["70"] = o107;
// 8583
o107.getAttributeNode = f974244559_519;
// undefined
o107 = null;
// 8585
f974244559_519.returns.push(null);
// 8587
o107 = {};
// 8588
o133["71"] = o107;
// 8589
o107.getAttributeNode = f974244559_519;
// undefined
o107 = null;
// 8591
f974244559_519.returns.push(null);
// 8593
o107 = {};
// 8594
o133["72"] = o107;
// 8595
o107.getAttributeNode = f974244559_519;
// undefined
o107 = null;
// 8597
f974244559_519.returns.push(null);
// 8599
o107 = {};
// 8600
o133["73"] = o107;
// undefined
o133 = null;
// 8601
o107.getAttributeNode = f974244559_519;
// undefined
o107 = null;
// 8603
o107 = {};
// 8604
f974244559_519.returns.push(o107);
// 8605
o107.value = "u_0_38";
// undefined
o107 = null;
// 8609
o107 = {};
// 8610
f974244559_480.returns.push(o107);
// 8611
// 8612
// 8613
o107.getElementsByTagName = f974244559_514;
// 8614
o108 = {};
// 8615
f974244559_514.returns.push(o108);
// 8616
o108.length = 0;
// undefined
o108 = null;
// 8618
o108 = {};
// 8619
o107.childNodes = o108;
// undefined
o107 = null;
// 8620
o108.item = f974244559_517;
// 8621
o108.length = 1;
// 8622
o107 = {};
// 8623
o108["0"] = o107;
// undefined
o108 = null;
// 8624
o107.getAttributeNode = f974244559_519;
// 8626
f974244559_519.returns.push(null);
// 8627
o107.getElementsByTagName = f974244559_514;
// undefined
o107 = null;
// 8629
o107 = {};
// 8630
f974244559_514.returns.push(o107);
// 8631
o107.length = 11;
// 8632
o108 = {};
// 8633
o107["0"] = o108;
// 8634
o108.getAttributeNode = f974244559_519;
// 8636
f974244559_519.returns.push(null);
// 8638
o109 = {};
// 8639
o107["1"] = o109;
// 8640
o109.getAttributeNode = f974244559_519;
// 8642
f974244559_519.returns.push(null);
// 8644
o110 = {};
// 8645
o107["2"] = o110;
// 8646
o110.getAttributeNode = f974244559_519;
// 8648
f974244559_519.returns.push(null);
// 8650
o111 = {};
// 8651
o107["3"] = o111;
// 8652
o111.getAttributeNode = f974244559_519;
// 8654
f974244559_519.returns.push(null);
// 8656
o112 = {};
// 8657
o107["4"] = o112;
// undefined
o107 = null;
// 8658
o112.getAttributeNode = f974244559_519;
// 8660
o107 = {};
// 8661
f974244559_519.returns.push(o107);
// 8662
o107.value = "u_0_39";
// 8667
f974244559_519.returns.push(null);
// 8670
o113 = {};
// 8671
f974244559_514.returns.push(o113);
// 8672
o113.length = 11;
// 8673
o113["0"] = o108;
// undefined
o108 = null;
// 8676
f974244559_519.returns.push(null);
// 8678
o113["1"] = o109;
// undefined
o109 = null;
// 8681
f974244559_519.returns.push(null);
// 8683
o113["2"] = o110;
// undefined
o110 = null;
// 8686
f974244559_519.returns.push(null);
// 8688
o113["3"] = o111;
// undefined
o111 = null;
// 8691
f974244559_519.returns.push(null);
// 8693
o113["4"] = o112;
// 8696
f974244559_519.returns.push(o107);
// undefined
o107 = null;
// 8699
o107 = {};
// 8700
o113["5"] = o107;
// 8701
o107.getAttributeNode = f974244559_519;
// undefined
o107 = null;
// 8703
f974244559_519.returns.push(null);
// 8705
o107 = {};
// 8706
o113["6"] = o107;
// 8707
o107.getAttributeNode = f974244559_519;
// undefined
o107 = null;
// 8709
f974244559_519.returns.push(null);
// 8711
o107 = {};
// 8712
o113["7"] = o107;
// 8713
o107.getAttributeNode = f974244559_519;
// undefined
o107 = null;
// 8715
f974244559_519.returns.push(null);
// 8717
o107 = {};
// 8718
o113["8"] = o107;
// undefined
o113 = null;
// 8719
o107.getAttributeNode = f974244559_519;
// 8721
o108 = {};
// 8722
f974244559_519.returns.push(o108);
// 8723
o108.value = "u_0_3a";
// undefined
o108 = null;
// 8727
o108 = {};
// 8728
f974244559_480.returns.push(o108);
// 8729
// 8730
// 8731
o108.getElementsByTagName = f974244559_514;
// 8732
o109 = {};
// 8733
f974244559_514.returns.push(o109);
// 8734
o109.length = 0;
// undefined
o109 = null;
// 8736
o109 = {};
// 8737
o108.childNodes = o109;
// undefined
o108 = null;
// 8738
o109.item = f974244559_517;
// 8739
o109.length = 1;
// 8740
o108 = {};
// 8741
o109["0"] = o108;
// undefined
o109 = null;
// 8742
o108.getAttributeNode = f974244559_519;
// 8744
f974244559_519.returns.push(null);
// 8745
o108.getElementsByTagName = f974244559_514;
// undefined
o108 = null;
// 8747
o108 = {};
// 8748
f974244559_514.returns.push(o108);
// 8749
o108.length = 143;
// 8750
o109 = {};
// 8751
o108["0"] = o109;
// 8752
o109.getAttributeNode = f974244559_519;
// 8754
f974244559_519.returns.push(null);
// 8756
o110 = {};
// 8757
o108["1"] = o110;
// 8758
o110.getAttributeNode = f974244559_519;
// 8760
f974244559_519.returns.push(null);
// 8762
o111 = {};
// 8763
o108["2"] = o111;
// 8764
o111.getAttributeNode = f974244559_519;
// 8766
f974244559_519.returns.push(null);
// 8768
o113 = {};
// 8769
o108["3"] = o113;
// 8770
o113.getAttributeNode = f974244559_519;
// 8772
f974244559_519.returns.push(null);
// 8774
o114 = {};
// 8775
o108["4"] = o114;
// 8776
o114.getAttributeNode = f974244559_519;
// 8778
f974244559_519.returns.push(null);
// 8780
o115 = {};
// 8781
o108["5"] = o115;
// 8782
o115.getAttributeNode = f974244559_519;
// 8784
f974244559_519.returns.push(null);
// 8786
o116 = {};
// 8787
o108["6"] = o116;
// 8788
o116.getAttributeNode = f974244559_519;
// 8790
f974244559_519.returns.push(null);
// 8792
o117 = {};
// 8793
o108["7"] = o117;
// 8794
o117.getAttributeNode = f974244559_519;
// 8796
f974244559_519.returns.push(null);
// 8798
o118 = {};
// 8799
o108["8"] = o118;
// 8800
o118.getAttributeNode = f974244559_519;
// 8802
f974244559_519.returns.push(null);
// 8804
o119 = {};
// 8805
o108["9"] = o119;
// 8806
o119.getAttributeNode = f974244559_519;
// 8808
f974244559_519.returns.push(null);
// 8810
o120 = {};
// 8811
o108["10"] = o120;
// 8812
o120.getAttributeNode = f974244559_519;
// 8814
f974244559_519.returns.push(null);
// 8816
o121 = {};
// 8817
o108["11"] = o121;
// 8818
o121.getAttributeNode = f974244559_519;
// 8820
f974244559_519.returns.push(null);
// 8822
o122 = {};
// 8823
o108["12"] = o122;
// 8824
o122.getAttributeNode = f974244559_519;
// 8826
f974244559_519.returns.push(null);
// 8828
o123 = {};
// 8829
o108["13"] = o123;
// 8830
o123.getAttributeNode = f974244559_519;
// 8832
f974244559_519.returns.push(null);
// 8834
o124 = {};
// 8835
o108["14"] = o124;
// 8836
o124.getAttributeNode = f974244559_519;
// 8838
f974244559_519.returns.push(null);
// 8840
o125 = {};
// 8841
o108["15"] = o125;
// 8842
o125.getAttributeNode = f974244559_519;
// 8844
f974244559_519.returns.push(null);
// 8846
o126 = {};
// 8847
o108["16"] = o126;
// 8848
o126.getAttributeNode = f974244559_519;
// 8850
f974244559_519.returns.push(null);
// 8852
o127 = {};
// 8853
o108["17"] = o127;
// 8854
o127.getAttributeNode = f974244559_519;
// 8856
f974244559_519.returns.push(null);
// 8858
o128 = {};
// 8859
o108["18"] = o128;
// 8860
o128.getAttributeNode = f974244559_519;
// 8862
f974244559_519.returns.push(null);
// 8864
o129 = {};
// 8865
o108["19"] = o129;
// 8866
o129.getAttributeNode = f974244559_519;
// 8868
f974244559_519.returns.push(null);
// 8870
o130 = {};
// 8871
o108["20"] = o130;
// 8872
o130.getAttributeNode = f974244559_519;
// 8874
f974244559_519.returns.push(null);
// 8876
o131 = {};
// 8877
o108["21"] = o131;
// 8878
o131.getAttributeNode = f974244559_519;
// 8880
f974244559_519.returns.push(null);
// 8882
o132 = {};
// 8883
o108["22"] = o132;
// undefined
o108 = null;
// 8884
o132.getAttributeNode = f974244559_519;
// 8886
o108 = {};
// 8887
f974244559_519.returns.push(o108);
// 8888
o108.value = "u_0_3e";
// 8893
f974244559_519.returns.push(null);
// 8896
o133 = {};
// 8897
f974244559_514.returns.push(o133);
// 8898
o133.length = 143;
// 8899
o133["0"] = o109;
// undefined
o109 = null;
// 8902
f974244559_519.returns.push(null);
// 8904
o133["1"] = o110;
// undefined
o110 = null;
// 8907
f974244559_519.returns.push(null);
// 8909
o133["2"] = o111;
// undefined
o111 = null;
// 8912
f974244559_519.returns.push(null);
// 8914
o133["3"] = o113;
// undefined
o113 = null;
// 8917
f974244559_519.returns.push(null);
// 8919
o133["4"] = o114;
// undefined
o114 = null;
// 8922
f974244559_519.returns.push(null);
// 8924
o133["5"] = o115;
// undefined
o115 = null;
// 8927
f974244559_519.returns.push(null);
// 8929
o133["6"] = o116;
// undefined
o116 = null;
// 8932
f974244559_519.returns.push(null);
// 8934
o133["7"] = o117;
// undefined
o117 = null;
// 8937
f974244559_519.returns.push(null);
// 8939
o133["8"] = o118;
// undefined
o118 = null;
// 8942
f974244559_519.returns.push(null);
// 8944
o133["9"] = o119;
// undefined
o119 = null;
// 8947
f974244559_519.returns.push(null);
// 8949
o133["10"] = o120;
// undefined
o120 = null;
// 8952
f974244559_519.returns.push(null);
// 8954
o133["11"] = o121;
// undefined
o121 = null;
// 8957
f974244559_519.returns.push(null);
// 8959
o133["12"] = o122;
// undefined
o122 = null;
// 8962
f974244559_519.returns.push(null);
// 8964
o133["13"] = o123;
// undefined
o123 = null;
// 8967
f974244559_519.returns.push(null);
// 8969
o133["14"] = o124;
// undefined
o124 = null;
// 8972
f974244559_519.returns.push(null);
// 8974
o133["15"] = o125;
// undefined
o125 = null;
// 8977
f974244559_519.returns.push(null);
// 8979
o133["16"] = o126;
// undefined
o126 = null;
// 8982
f974244559_519.returns.push(null);
// 8984
o133["17"] = o127;
// undefined
o127 = null;
// 8987
f974244559_519.returns.push(null);
// 8989
o133["18"] = o128;
// undefined
o128 = null;
// 8992
f974244559_519.returns.push(null);
// 8994
o133["19"] = o129;
// undefined
o129 = null;
// 8997
f974244559_519.returns.push(null);
// 8999
o133["20"] = o130;
// undefined
o130 = null;
// 9002
f974244559_519.returns.push(null);
// 9004
o133["21"] = o131;
// undefined
o131 = null;
// 9007
f974244559_519.returns.push(null);
// 9009
o133["22"] = o132;
// undefined
o132 = null;
// 9012
f974244559_519.returns.push(o108);
// undefined
o108 = null;
// 9015
o108 = {};
// 9016
o133["23"] = o108;
// 9017
o108.getAttributeNode = f974244559_519;
// undefined
o108 = null;
// 9019
f974244559_519.returns.push(null);
// 9021
o108 = {};
// 9022
o133["24"] = o108;
// 9023
o108.getAttributeNode = f974244559_519;
// undefined
o108 = null;
// 9025
f974244559_519.returns.push(null);
// 9027
o108 = {};
// 9028
o133["25"] = o108;
// 9029
o108.getAttributeNode = f974244559_519;
// undefined
o108 = null;
// 9031
f974244559_519.returns.push(null);
// 9033
o108 = {};
// 9034
o133["26"] = o108;
// 9035
o108.getAttributeNode = f974244559_519;
// undefined
o108 = null;
// 9037
f974244559_519.returns.push(null);
// 9039
o108 = {};
// 9040
o133["27"] = o108;
// 9041
o108.getAttributeNode = f974244559_519;
// undefined
o108 = null;
// 9043
f974244559_519.returns.push(null);
// 9045
o108 = {};
// 9046
o133["28"] = o108;
// 9047
o108.getAttributeNode = f974244559_519;
// undefined
o108 = null;
// 9049
f974244559_519.returns.push(null);
// 9051
o108 = {};
// 9052
o133["29"] = o108;
// 9053
o108.getAttributeNode = f974244559_519;
// undefined
o108 = null;
// 9055
f974244559_519.returns.push(null);
// 9057
o108 = {};
// 9058
o133["30"] = o108;
// 9059
o108.getAttributeNode = f974244559_519;
// undefined
o108 = null;
// 9061
f974244559_519.returns.push(null);
// 9063
o108 = {};
// 9064
o133["31"] = o108;
// 9065
o108.getAttributeNode = f974244559_519;
// undefined
o108 = null;
// 9067
f974244559_519.returns.push(null);
// 9069
o108 = {};
// 9070
o133["32"] = o108;
// 9071
o108.getAttributeNode = f974244559_519;
// undefined
o108 = null;
// 9073
f974244559_519.returns.push(null);
// 9075
o108 = {};
// 9076
o133["33"] = o108;
// 9077
o108.getAttributeNode = f974244559_519;
// undefined
o108 = null;
// 9079
f974244559_519.returns.push(null);
// 9081
o108 = {};
// 9082
o133["34"] = o108;
// 9083
o108.getAttributeNode = f974244559_519;
// undefined
o108 = null;
// 9085
f974244559_519.returns.push(null);
// 9087
o108 = {};
// 9088
o133["35"] = o108;
// 9089
o108.getAttributeNode = f974244559_519;
// undefined
o108 = null;
// 9091
f974244559_519.returns.push(null);
// 9093
o108 = {};
// 9094
o133["36"] = o108;
// 9095
o108.getAttributeNode = f974244559_519;
// undefined
o108 = null;
// 9097
f974244559_519.returns.push(null);
// 9099
o108 = {};
// 9100
o133["37"] = o108;
// 9101
o108.getAttributeNode = f974244559_519;
// undefined
o108 = null;
// 9103
f974244559_519.returns.push(null);
// 9105
o108 = {};
// 9106
o133["38"] = o108;
// 9107
o108.getAttributeNode = f974244559_519;
// undefined
o108 = null;
// 9109
f974244559_519.returns.push(null);
// 9111
o108 = {};
// 9112
o133["39"] = o108;
// 9113
o108.getAttributeNode = f974244559_519;
// undefined
o108 = null;
// 9115
f974244559_519.returns.push(null);
// 9117
o108 = {};
// 9118
o133["40"] = o108;
// 9119
o108.getAttributeNode = f974244559_519;
// undefined
o108 = null;
// 9121
f974244559_519.returns.push(null);
// 9123
o108 = {};
// 9124
o133["41"] = o108;
// 9125
o108.getAttributeNode = f974244559_519;
// undefined
o108 = null;
// 9127
f974244559_519.returns.push(null);
// 9129
o108 = {};
// 9130
o133["42"] = o108;
// 9131
o108.getAttributeNode = f974244559_519;
// undefined
o108 = null;
// 9133
f974244559_519.returns.push(null);
// 9135
o108 = {};
// 9136
o133["43"] = o108;
// 9137
o108.getAttributeNode = f974244559_519;
// undefined
o108 = null;
// 9139
f974244559_519.returns.push(null);
// 9141
o108 = {};
// 9142
o133["44"] = o108;
// 9143
o108.getAttributeNode = f974244559_519;
// undefined
o108 = null;
// 9145
f974244559_519.returns.push(null);
// 9147
o108 = {};
// 9148
o133["45"] = o108;
// 9149
o108.getAttributeNode = f974244559_519;
// undefined
o108 = null;
// 9151
f974244559_519.returns.push(null);
// 9153
o108 = {};
// 9154
o133["46"] = o108;
// 9155
o108.getAttributeNode = f974244559_519;
// undefined
o108 = null;
// 9157
f974244559_519.returns.push(null);
// 9159
o108 = {};
// 9160
o133["47"] = o108;
// 9161
o108.getAttributeNode = f974244559_519;
// undefined
o108 = null;
// 9163
f974244559_519.returns.push(null);
// 9165
o108 = {};
// 9166
o133["48"] = o108;
// 9167
o108.getAttributeNode = f974244559_519;
// undefined
o108 = null;
// 9169
f974244559_519.returns.push(null);
// 9171
o108 = {};
// 9172
o133["49"] = o108;
// 9173
o108.getAttributeNode = f974244559_519;
// undefined
o108 = null;
// 9175
f974244559_519.returns.push(null);
// 9177
o108 = {};
// 9178
o133["50"] = o108;
// 9179
o108.getAttributeNode = f974244559_519;
// undefined
o108 = null;
// 9181
f974244559_519.returns.push(null);
// 9183
o108 = {};
// 9184
o133["51"] = o108;
// 9185
o108.getAttributeNode = f974244559_519;
// undefined
o108 = null;
// 9187
f974244559_519.returns.push(null);
// 9189
o108 = {};
// 9190
o133["52"] = o108;
// 9191
o108.getAttributeNode = f974244559_519;
// undefined
o108 = null;
// 9193
f974244559_519.returns.push(null);
// 9195
o108 = {};
// 9196
o133["53"] = o108;
// 9197
o108.getAttributeNode = f974244559_519;
// undefined
o108 = null;
// 9199
f974244559_519.returns.push(null);
// 9201
o108 = {};
// 9202
o133["54"] = o108;
// 9203
o108.getAttributeNode = f974244559_519;
// undefined
o108 = null;
// 9205
f974244559_519.returns.push(null);
// 9207
o108 = {};
// 9208
o133["55"] = o108;
// 9209
o108.getAttributeNode = f974244559_519;
// undefined
o108 = null;
// 9211
f974244559_519.returns.push(null);
// 9213
o108 = {};
// 9214
o133["56"] = o108;
// 9215
o108.getAttributeNode = f974244559_519;
// undefined
o108 = null;
// 9217
o108 = {};
// 9218
f974244559_519.returns.push(o108);
// 9219
o108.value = "u_0_3c";
// undefined
o108 = null;
// 9221
o108 = {};
// 9222
o133["57"] = o108;
// 9223
o108.getAttributeNode = f974244559_519;
// undefined
o108 = null;
// 9225
f974244559_519.returns.push(null);
// 9227
o108 = {};
// 9228
o133["58"] = o108;
// 9229
o108.getAttributeNode = f974244559_519;
// undefined
o108 = null;
// 9231
f974244559_519.returns.push(null);
// 9233
o108 = {};
// 9234
o133["59"] = o108;
// 9235
o108.getAttributeNode = f974244559_519;
// undefined
o108 = null;
// 9237
f974244559_519.returns.push(null);
// 9239
o108 = {};
// 9240
o133["60"] = o108;
// 9241
o108.getAttributeNode = f974244559_519;
// undefined
o108 = null;
// 9243
f974244559_519.returns.push(null);
// 9245
o108 = {};
// 9246
o133["61"] = o108;
// 9247
o108.getAttributeNode = f974244559_519;
// undefined
o108 = null;
// 9249
f974244559_519.returns.push(null);
// 9251
o108 = {};
// 9252
o133["62"] = o108;
// 9253
o108.getAttributeNode = f974244559_519;
// undefined
o108 = null;
// 9255
f974244559_519.returns.push(null);
// 9257
o108 = {};
// 9258
o133["63"] = o108;
// 9259
o108.getAttributeNode = f974244559_519;
// undefined
o108 = null;
// 9261
f974244559_519.returns.push(null);
// 9263
o108 = {};
// 9264
o133["64"] = o108;
// 9265
o108.getAttributeNode = f974244559_519;
// undefined
o108 = null;
// 9267
f974244559_519.returns.push(null);
// 9269
o108 = {};
// 9270
o133["65"] = o108;
// 9271
o108.getAttributeNode = f974244559_519;
// undefined
o108 = null;
// 9273
f974244559_519.returns.push(null);
// 9275
o108 = {};
// 9276
o133["66"] = o108;
// 9277
o108.getAttributeNode = f974244559_519;
// undefined
o108 = null;
// 9279
f974244559_519.returns.push(null);
// 9281
o108 = {};
// 9282
o133["67"] = o108;
// 9283
o108.getAttributeNode = f974244559_519;
// undefined
o108 = null;
// 9285
f974244559_519.returns.push(null);
// 9287
o108 = {};
// 9288
o133["68"] = o108;
// 9289
o108.getAttributeNode = f974244559_519;
// undefined
o108 = null;
// 9291
o108 = {};
// 9292
f974244559_519.returns.push(o108);
// 9293
o108.value = "u_0_3d";
// undefined
o108 = null;
// 9295
o108 = {};
// 9296
o133["69"] = o108;
// 9297
o108.getAttributeNode = f974244559_519;
// undefined
o108 = null;
// 9299
f974244559_519.returns.push(null);
// 9301
o108 = {};
// 9302
o133["70"] = o108;
// 9303
o108.getAttributeNode = f974244559_519;
// undefined
o108 = null;
// 9305
f974244559_519.returns.push(null);
// 9307
o108 = {};
// 9308
o133["71"] = o108;
// 9309
o108.getAttributeNode = f974244559_519;
// undefined
o108 = null;
// 9311
f974244559_519.returns.push(null);
// 9313
o108 = {};
// 9314
o133["72"] = o108;
// 9315
o108.getAttributeNode = f974244559_519;
// undefined
o108 = null;
// 9317
f974244559_519.returns.push(null);
// 9319
o108 = {};
// 9320
o133["73"] = o108;
// 9321
o108.getAttributeNode = f974244559_519;
// undefined
o108 = null;
// 9323
f974244559_519.returns.push(null);
// 9325
o108 = {};
// 9326
o133["74"] = o108;
// 9327
o108.getAttributeNode = f974244559_519;
// undefined
o108 = null;
// 9329
f974244559_519.returns.push(null);
// 9331
o108 = {};
// 9332
o133["75"] = o108;
// 9333
o108.getAttributeNode = f974244559_519;
// undefined
o108 = null;
// 9335
f974244559_519.returns.push(null);
// 9337
o108 = {};
// 9338
o133["76"] = o108;
// 9339
o108.getAttributeNode = f974244559_519;
// undefined
o108 = null;
// 9341
f974244559_519.returns.push(null);
// 9343
o108 = {};
// 9344
o133["77"] = o108;
// 9345
o108.getAttributeNode = f974244559_519;
// undefined
o108 = null;
// 9347
f974244559_519.returns.push(null);
// 9349
o108 = {};
// 9350
o133["78"] = o108;
// undefined
o133 = null;
// 9351
o108.getAttributeNode = f974244559_519;
// undefined
o108 = null;
// 9353
o108 = {};
// 9354
f974244559_519.returns.push(o108);
// 9355
o108.value = "u_0_3f";
// undefined
o108 = null;
// 9426
f974244559_471.returns.push(1373491289858);
// 9430
o108 = {};
// 9431
f974244559_478.returns.push(o108);
// 9433
f974244559_482.returns.push(o108);
// undefined
o108 = null;
// 9436
f974244559_471.returns.push(1373491289859);
// 9439
f974244559_471.returns.push(1373491289860);
// 9442
f974244559_471.returns.push(1373491289860);
// 9444
o108 = {};
// 9445
f974244559_502.returns.push(o108);
// 9447
o109 = {};
// 9448
f974244559_502.returns.push(o109);
// 9449
o110 = {};
// 9450
o109.firstChild = o110;
// 9452
o110.nodeType = 8;
// 9454
o110.nodeValue = " <div id=\"fbRequestsJewelLoading\"><div id=\"fbRequestsJewelLoadingContent\"><div class=\"uiHeader uiHeaderBottomBorder jewelHeader\"><div class=\"clearfix uiHeaderTop\"><div class=\"rfloat\"><h3 class=\"accessible_elem\">Friend Requests</h3><div class=\"uiHeaderActions fsm fwn fcg\"><a href=\"http://jsbngssl.www.facebook.com/?sk=ff\" accesskey=\"3\">Find Friends</a> · <a ajaxify=\"/ajax/settings/granular_privacy/can_friend.php\" rel=\"dialog\" href=\"#\" role=\"button\">Settings</a></div></div><div><h3 class=\"uiHeaderTitle\" aria-hidden=\"true\">Friend Requests</h3></div></div></div><img class=\"jewelLoading img\" src=\"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yb/r/GsNJNwuI-UM.gif\" alt=\"\" width=\"16\" height=\"11\" /></div><div class=\"jewelFooter\"><a class=\"seeMore\" href=\"/friends/requests/\"><span>See All</span></a></div></div> ";
// undefined
o110 = null;
// 9455
o109.parentNode = o25;
// 9457
f974244559_507.returns.push(o109);
// undefined
o109 = null;
// 9458
// 9459
o108.getAttribute = f974244559_500;
// 9460
f974244559_500.returns.push(null);
// 9461
o108.setAttribute = f974244559_643;
// 9462
f974244559_643.returns.push(undefined);
// 9464
f974244559_471.returns.push(1373491289862);
// 9468
o109 = {};
// 9469
f974244559_478.returns.push(o109);
// 9471
f974244559_482.returns.push(o109);
// undefined
o109 = null;
// 9474
f974244559_471.returns.push(1373491289863);
// 9477
f974244559_471.returns.push(1373491289871);
// 9480
f974244559_471.returns.push(1373491289871);
// 9482
o109 = {};
// 9483
f974244559_502.returns.push(o109);
// 9485
o110 = {};
// 9486
f974244559_502.returns.push(o110);
// 9487
o111 = {};
// 9488
o110.firstChild = o111;
// 9490
o111.nodeType = 8;
// 9492
o111.nodeValue = " <div class=\"fbTimelineStickyHeader fixed_elem fbTimelineStickyHeaderHidden\" aria-hidden=\"true\" id=\"u_0_3q\"><div class=\"stickyHeaderWrap clearfix\"><div class=\"back\"></div><div class=\"name\"><a class=\"profileThumb\" href=\"http://jsbngssl.www.facebook.com/LawlabeeTheWallaby\"><img class=\"_s0 _rw img\" src=\"http://jsbngssl.fbcdn-profile-a.akamaihd.net/hprofile-ak-prn2/276274_1055580469_962040234_q.jpg\" alt=\"\" /></a><span class=\"uiButtonGroup fbStickyHeaderBreadcrumb uiButtonGroupOverlay\" id=\"u_0_3p\"><span class=\"firstItem uiButtonGroupItem buttonItem\"><a class=\"nameButton uiButton uiButtonOverlay\" href=\"http://jsbngssl.www.facebook.com/LawlabeeTheWallaby\" role=\"button\"><span class=\"uiButtonText\">Gregor Richards</span></a></span><span class=\"uiButtonGroupItem selectorItem\"><div class=\"uiSelector inlineBlock pageMenu uiSelectorNormal uiSelectorDynamicLabel\"><div class=\"uiToggle wrap\"><a class=\"pageMenuButton uiSelectorButton uiButton uiButtonOverlay\" href=\"#\" role=\"button\" aria-haspopup=\"1\" data-label=\"Timeline\" data-length=\"30\" rel=\"toggle\"><span class=\"uiButtonText\">Timeline</span></a><div class=\"uiSelectorMenuWrapper uiToggleFlyout\"><div role=\"menu\" class=\"uiMenu uiSelectorMenu\"><ul class=\"uiMenuInner\"><li class=\"uiMenuItem uiMenuItemCheckbox checked\" data-label=\"Timeline\"><a class=\"itemAnchor itemWithIcon\" role=\"menuitemcheckbox\" tabindex=\"0\" href=\"http://jsbngssl.www.facebook.com/LawlabeeTheWallaby\" aria-checked=\"true\"><i class=\"mrs itemIcon img sp_3fr8aa sx_22ecb2\"></i><span class=\"itemLabel fsm\">Timeline</span></a></li><li class=\"uiMenuItem uiMenuItemCheckbox\" data-label=\"About\"><a class=\"itemAnchor itemWithIcon\" role=\"menuitemcheckbox\" tabindex=\"-1\" href=\"http://jsbngssl.www.facebook.com/LawlabeeTheWallaby/about\" aria-checked=\"false\"><i class=\"mrs itemIcon img sp_4p6kmz sx_fb2987\"></i><span class=\"itemLabel fsm\">About</span></a></li><li class=\"uiMenuSeparator separator hidden_elem\"></li></ul></div></div></div></div></span><span class=\"lastItem uiButtonGroupItem selectorItem\"><div class=\"uiSelector inlineBlock sectionMenu uiSelectorNormal uiSelectorDynamicLabel\"><div class=\"uiToggle wrap\"><a class=\"uiSelectorButton uiButton uiButtonOverlay\" href=\"#\" role=\"button\" aria-haspopup=\"1\" data-length=\"30\" rel=\"toggle\"><span class=\"uiButtonText\">Now</span></a><div class=\"uiSelectorMenuWrapper uiToggleFlyout\"><div role=\"menu\" class=\"uiMenu uiSelectorMenu\"><ul class=\"uiMenuInner\"><li class=\"uiMenuItem uiMenuItemRadio uiSelectorOption checked\" data-label=\"Now\"><a class=\"itemAnchor\" role=\"menuitemradio\" tabindex=\"0\" href=\"#\" aria-checked=\"true\" data-key=\"recent\"><span class=\"itemLabel fsm\">Now</span></a></li><li class=\"uiMenuItem uiMenuItemRadio uiSelectorOption\" data-label=\"2013\"><a class=\"itemAnchor\" role=\"menuitemradio\" tabindex=\"-1\" href=\"#\" aria-checked=\"false\" data-key=\"year_2013\"><span class=\"itemLabel fsm\">2013</span></a></li><li class=\"uiMenuItem uiMenuItemRadio uiSelectorOption\" data-label=\"2012\"><a class=\"itemAnchor\" role=\"menuitemradio\" tabindex=\"-1\" href=\"#\" aria-checked=\"false\" data-key=\"year_2012\"><span class=\"itemLabel fsm\">2012</span></a></li><li class=\"uiMenuItem uiMenuItemRadio uiSelectorOption\" data-label=\"2011\"><a class=\"itemAnchor\" role=\"menuitemradio\" tabindex=\"-1\" href=\"#\" aria-checked=\"false\" data-key=\"year_2011\"><span class=\"itemLabel fsm\">2011</span></a></li><li class=\"uiMenuItem uiMenuItemRadio uiSelectorOption\" data-label=\"2010\"><a class=\"itemAnchor\" role=\"menuitemradio\" tabindex=\"-1\" href=\"#\" aria-checked=\"false\" data-key=\"year_2010\"><span class=\"itemLabel fsm\">2010</span></a></li><li class=\"uiMenuItem uiMenuItemRadio uiSelectorOption\" data-label=\"2009\"><a class=\"itemAnchor\" role=\"menuitemradio\" tabindex=\"-1\" href=\"#\" aria-checked=\"false\" data-key=\"year_2009\"><span class=\"itemLabel fsm\">2009</span></a></li><li class=\"uiMenuItem uiMenuItemRadio uiSelectorOption\" data-label=\"2008\"><a class=\"itemAnchor\" role=\"menuitemradio\" tabindex=\"-1\" href=\"#\" aria-checked=\"false\" data-key=\"year_2008\"><span class=\"itemLabel fsm\">2008</span></a></li><li class=\"uiMenuItem uiMenuItemRadio uiSelectorOption\" data-label=\"Born\"><a class=\"itemAnchor\" role=\"menuitemradio\" tabindex=\"-1\" href=\"#\" aria-checked=\"false\" data-key=\"way_back\"><span class=\"itemLabel fsm\">Born</span></a></li></ul></div></div></div><select><option value=\"\"></option><option value=\"recent\" selected=\"1\">Now</option><option value=\"year_2013\">2013</option><option value=\"year_2012\">2012</option><option value=\"year_2011\">2011</option><option value=\"year_2010\">2010</option><option value=\"year_2009\">2009</option><option value=\"year_2008\">2008</option><option value=\"way_back\">Born</option></select></div></span><span class=\"uiButtonGroupItem selectorItem hidden_elem\"><div class=\"uiSelector inlineBlock subsectionMenu uiSelectorNormal uiSelectorDynamicLabel\"><div class=\"uiToggle wrap\"><a class=\"uiSelectorButton uiButton uiButtonOverlay\" href=\"#\" role=\"button\" aria-haspopup=\"1\" data-length=\"30\" rel=\"toggle\"><span class=\"uiButtonText\">Highlights</span></a><div class=\"uiSelectorMenuWrapper uiToggleFlyout\"><div role=\"menu\" class=\"uiMenu uiSelectorMenu\"><ul class=\"uiMenuInner\"><li class=\"uiMenuItem uiMenuItemRadio uiSelectorOption highlights checked\" data-label=\"Highlights\"><a class=\"itemAnchor\" role=\"menuitemradio\" tabindex=\"0\" href=\"#\" aria-checked=\"true\"><span class=\"itemLabel fsm\">Highlights</span></a></li><li class=\"uiMenuItem uiMenuItemRadio uiSelectorOption allStories\" data-label=\"All Stories\"><a class=\"itemAnchor\" role=\"menuitemradio\" tabindex=\"-1\" href=\"#\" aria-checked=\"false\"><span class=\"itemLabel fsm\">All Stories</span></a></li><li class=\"uiMenuSeparator separator hidden_elem\"></li></ul></div></div></div><select><option value=\"\"></option><option value=\"highlights\" selected=\"1\">Highlights</option><option value=\"allStories\">All Stories</option></select></div></span></span></div><div class=\"actions\"><span class=\"uiButtonGroup fbTimelineConnectButtonGroup uiButtonGroupOverlay\" id=\"u_0_3i\"><span class=\"firstItem uiButtonGroupItem buttonItem\"><div class=\"FriendButton\" id=\"u_0_3n\"><label class=\"FriendRequestAdd addButton uiButton uiButtonOverlay uiButtonLarge\" for=\"u_0_3o\"><i class=\"mrs img sp_3fr8aa sx_ec0c2b\"></i><input value=\"Add Friend\" type=\"button\" id=\"u_0_3o\" /></label><a class=\"FriendRequestOutgoing enableFriendListFlyout outgoingButton enableFriendListFlyout hidden_elem uiButton uiButtonOverlay uiButtonLarge\" href=\"#\" role=\"button\" data-profileid=\"1055580469\" data-flloc=\"sticky_header\" data-cansuggestfriends=\"false\"><i class=\"mrs img sp_3fr8aa sx_ec0c2b\"></i><span class=\"uiButtonText\">Friend Request Sent</span></a></div></span><span class=\"lastItem uiButtonGroupItem buttonItem\"><span class=\"_52m- _3lt\"><a class=\"uiButton uiButtonOverlay uiButtonLarge\" href=\"#\" role=\"button\" ajaxify=\"/ajax/follow/follow_profile.php?profile_id=1055580469&amp;location=1\" rel=\"async-post\" id=\"u_0_3j\"><i class=\"mrs img sp_3fr8aa sx_3f5e05\"></i><span class=\"uiButtonText\">Follow</span></a><label class=\"profileFollowButton _52nf _3spg hidden_elem uiButton uiButtonOverlay uiButtonLarge\" id=\"u_0_3k\" for=\"u_0_3m\"><i class=\"mrs img sp_3fr8aa sx_0bef0b\"></i><input value=\"Following\" aria-haspopup=\"1\" data-profileid=\"1055580469\" type=\"submit\" id=\"u_0_3m\" /></label></span></span></span></div></div></div> ";
// undefined
o111 = null;
// 9493
o110.parentNode = o25;
// 9495
f974244559_507.returns.push(o110);
// undefined
o110 = null;
// 9496
// 9497
o109.getAttribute = f974244559_500;
// undefined
o109 = null;
// 9498
f974244559_500.returns.push("timeline_sticky_header");
// 9505
o109 = {};
// 9506
f974244559_480.returns.push(o109);
// 9507
// 9508
// 9509
o109.getElementsByTagName = f974244559_514;
// 9510
o110 = {};
// 9511
f974244559_514.returns.push(o110);
// 9512
o110.length = 0;
// undefined
o110 = null;
// 9514
o110 = {};
// 9515
o109.childNodes = o110;
// undefined
o109 = null;
// 9516
o110.item = f974244559_517;
// 9517
o110.length = 1;
// 9518
o109 = {};
// 9519
o110["0"] = o109;
// undefined
o110 = null;
// 9520
o109.getAttributeNode = f974244559_519;
// 9522
f974244559_519.returns.push(null);
// 9523
o109.getElementsByTagName = f974244559_514;
// 9525
o110 = {};
// 9526
f974244559_514.returns.push(o110);
// 9527
o110.length = 4;
// 9528
o111 = {};
// 9529
o110["0"] = o111;
// 9530
o111.getAttributeNode = f974244559_519;
// undefined
o111 = null;
// 9532
f974244559_519.returns.push(null);
// 9534
o111 = {};
// 9535
o110["1"] = o111;
// 9536
o111.getAttributeNode = f974244559_519;
// undefined
o111 = null;
// 9538
f974244559_519.returns.push(null);
// 9540
o111 = {};
// 9541
o110["2"] = o111;
// undefined
o110 = null;
// 9542
o111.getAttributeNode = f974244559_519;
// undefined
o111 = null;
// 9544
o110 = {};
// 9545
f974244559_519.returns.push(o110);
// 9546
o110.value = "u_0_3l";
// undefined
o110 = null;
// 9564
o109.querySelectorAll = f974244559_523;
// 9565
o110 = {};
// 9566
f974244559_523.returns.push(o110);
// 9567
o110.length = 0;
// undefined
o110 = null;
// 9568
o109.__html = void 0;
// 9569
o109.mountComponentIntoNode = void 0;
// 9570
o110 = {};
// 9571
o109.classList = o110;
// undefined
o109 = null;
// 9573
o110.add = f974244559_1110;
// undefined
o110 = null;
// 9574
f974244559_1110.returns.push(undefined);
// 9576
o109 = {};
// 9577
f974244559_480.returns.push(o109);
// 9578
// 9579
o109.firstChild = null;
// 9582
o110 = {};
// 9583
f974244559_478.returns.push(o110);
// 9585
o109.appendChild = f974244559_482;
// 9586
f974244559_482.returns.push(o110);
// undefined
o110 = null;
// 9588
o110 = {};
// 9589
f974244559_480.returns.push(o110);
// 9590
// 9591
o110.firstChild = null;
// 9592
o109.__html = void 0;
// 9594
o111 = {};
// 9595
f974244559_478.returns.push(o111);
// 9597
o110.appendChild = f974244559_482;
// 9598
f974244559_482.returns.push(o111);
// undefined
o111 = null;
// 9599
o111 = {};
// 9600
o110.classList = o111;
// 9602
o111.add = f974244559_1110;
// undefined
o111 = null;
// 9603
f974244559_1110.returns.push(undefined);
// 9604
o111 = {};
// 9605
o109.style = o111;
// undefined
o109 = null;
// 9606
// undefined
o111 = null;
// 9610
f974244559_1110.returns.push(undefined);
// 9611
o110.__FB_TOKEN = void 0;
// 9612
// undefined
o110 = null;
// 9618
f974244559_471.returns.push(1373491289948);
// 9622
o109 = {};
// 9623
f974244559_478.returns.push(o109);
// 9625
f974244559_482.returns.push(o109);
// undefined
o109 = null;
// 9628
f974244559_471.returns.push(1373491289961);
// 9631
f974244559_471.returns.push(1373491289961);
// 9634
f974244559_471.returns.push(1373491289962);
// 9636
o109 = {};
// 9637
f974244559_502.returns.push(o109);
// 9639
o110 = {};
// 9640
f974244559_502.returns.push(o110);
// 9641
o111 = {};
// 9642
o110.firstChild = o111;
// 9644
o111.nodeType = 8;
// 9646
o111.nodeValue = " <div class=\"fbTimelineTimePeriod fbTimelineTimePeriodUnexpanded\" id=\"pagelet_timeline_year_current\"><div class=\"fbTimelineSection fbTimelineCompactSection fbTimelineSectionTransparent\"><div class=\"fbTimelinePeriodPlaceholder\"><div class=\"mbm _5vf sectionHeader\"><div class=\"uiHeader\"><div class=\"clearfix uiHeaderTop\"><div><h3 class=\"uiHeaderTitle\">Earlier in 2013</h3></div></div></div><div class=\"_5vg\"></div></div><div class=\"loadingContainer\"><a class=\"mbm phm forceLoad\" href=\"#\" role=\"button\" id=\"u_0_3s\"><span class=\"sectionLabel fwb\" data-year=\"2013\">Show 2013</span></a></div></div></div><img class=\"ptl loadingIndicator img\" src=\"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yb/r/GsNJNwuI-UM.gif\" alt=\"\" width=\"16\" height=\"11\" /></div><div class=\"fbTimelineTimePeriod fbTimelineTimePeriodUnexpanded\" id=\"pagelet_timeline_year_last\"><div class=\"fbTimelineSection fbTimelineCompactSection fbTimelineSectionTransparent\"><div class=\"fbTimelinePeriodPlaceholder\"><div class=\"mbm _5vf sectionHeader\"><div class=\"uiHeader\"><div class=\"clearfix uiHeaderTop\"><div><h3 class=\"uiHeaderTitle\">2012</h3></div></div></div><div class=\"_5vg\"></div></div><div class=\"loadingContainer\"><a class=\"mbm phm forceLoad\" href=\"#\" role=\"button\" id=\"u_0_3t\"><span class=\"sectionLabel fwb\" data-year=\"2012\">Show 2012</span></a></div></div></div><img class=\"ptl loadingIndicator img\" src=\"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yb/r/GsNJNwuI-UM.gif\" alt=\"\" width=\"16\" height=\"11\" /></div><div class=\"fbTimelineTimePeriod fbTimelineTimePeriodUnexpanded\" id=\"pagelet_timeline_year_2011\"><div class=\"fbTimelineSection fbTimelineCompactSection fbTimelineSectionTransparent\"><div class=\"fbTimelinePeriodPlaceholder\"><div class=\"mbm _5vf sectionHeader\"><div class=\"uiHeader\"><div class=\"clearfix uiHeaderTop\"><div><h3 class=\"uiHeaderTitle\">2011</h3></div></div></div><div class=\"_5vg\"></div></div><div class=\"loadingContainer\"><a class=\"mbm phm forceLoad\" href=\"#\" role=\"button\" id=\"u_0_3u\"><span class=\"sectionLabel fwb\" data-year=\"2011\">Show 2011</span></a></div></div></div><img class=\"ptl loadingIndicator img\" src=\"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yb/r/GsNJNwuI-UM.gif\" alt=\"\" width=\"16\" height=\"11\" /></div><div class=\"fbTimelineTimePeriod fbTimelineTimePeriodUnexpanded\" id=\"pagelet_timeline_year_2010\"><div class=\"fbTimelineSection fbTimelineCompactSection fbTimelineSectionTransparent\"><div class=\"fbTimelinePeriodPlaceholder\"><div class=\"mbm _5vf sectionHeader\"><div class=\"uiHeader\"><div class=\"clearfix uiHeaderTop\"><div><h3 class=\"uiHeaderTitle\">2010</h3></div></div></div><div class=\"_5vg\"></div></div><div class=\"loadingContainer\"><a class=\"mbm phm forceLoad\" href=\"#\" role=\"button\" id=\"u_0_3y\"><span class=\"sectionLabel fwb\" data-year=\"2010\">Show 2010</span></a></div></div></div><img class=\"ptl loadingIndicator img\" src=\"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yb/r/GsNJNwuI-UM.gif\" alt=\"\" width=\"16\" height=\"11\" /></div><div class=\"fbTimelineTimePeriod fbTimelineTimePeriodUnexpanded\" id=\"pagelet_timeline_year_2009\"><div class=\"fbTimelineSection fbTimelineCompactSection fbTimelineSectionTransparent\"><div class=\"fbTimelinePeriodPlaceholder\"><div class=\"mbm _5vf sectionHeader\"><div class=\"uiHeader\"><div class=\"clearfix uiHeaderTop\"><div><h3 class=\"uiHeaderTitle\">2009</h3></div></div></div><div class=\"_5vg\"></div></div><div class=\"loadingContainer\"><a class=\"mbm phm forceLoad\" href=\"#\" role=\"button\" id=\"u_0_3x\"><span class=\"sectionLabel fwb\" data-year=\"2009\">Show 2009</span></a></div></div></div><img class=\"ptl loadingIndicator img\" src=\"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yb/r/GsNJNwuI-UM.gif\" alt=\"\" width=\"16\" height=\"11\" /></div><div class=\"fbTimelineTimePeriod fbTimelineTimePeriodUnexpanded\" id=\"pagelet_timeline_year_2008\"><div class=\"fbTimelineSection fbTimelineCompactSection fbTimelineSectionTransparent\"><div class=\"fbTimelinePeriodPlaceholder\"><div class=\"mbm _5vf sectionHeader\"><div class=\"uiHeader\"><div class=\"clearfix uiHeaderTop\"><div><h3 class=\"uiHeaderTitle\">2008</h3></div></div></div><div class=\"_5vg\"></div></div><div class=\"loadingContainer\"><a class=\"mbm phm forceLoad\" href=\"#\" role=\"button\" id=\"u_0_3v\"><span class=\"sectionLabel fwb\" data-year=\"2008\">Show 2008</span></a></div></div></div><img class=\"ptl loadingIndicator img\" src=\"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yb/r/GsNJNwuI-UM.gif\" alt=\"\" width=\"16\" height=\"11\" /></div><div class=\"fbTimelineTimePeriod fbTimelineTimePeriodUnexpanded\" id=\"pagelet_timeline_wayback\"><div class=\"fbTimelineSection fbTimelineCompactSection fbTimelineSectionTransparent\"><div class=\"fbTimelinePeriodPlaceholder\"><div class=\"mbm _5vf sectionHeader\"><div class=\"uiHeader\"><div class=\"clearfix uiHeaderTop\"><div><h3 class=\"uiHeaderTitle\">Born</h3></div></div></div><div class=\"_5vg\"></div></div><div class=\"loadingContainer\"><a class=\"mbm phm forceLoad\" href=\"#\" role=\"button\" id=\"u_0_3w\"><span class=\"sectionLabel fwb\" data-year=\"2007\">Show 2007</span></a></div></div></div><img class=\"ptl loadingIndicator img\" src=\"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yb/r/GsNJNwuI-UM.gif\" alt=\"\" width=\"16\" height=\"11\" /></div> ";
// undefined
o111 = null;
// 9647
o110.parentNode = o25;
// 9649
f974244559_507.returns.push(o110);
// undefined
o110 = null;
// 9651
o110 = {};
// 9652
f974244559_480.returns.push(o110);
// 9653
// 9655
o111 = {};
// 9656
f974244559_478.returns.push(o111);
// 9657
o113 = {};
// undefined
fo974244559_1501_firstChild = function() { return fo974244559_1501_firstChild.returns[fo974244559_1501_firstChild.inst++]; };
fo974244559_1501_firstChild.returns = [];
fo974244559_1501_firstChild.inst = 0;
defineGetter(o110, "firstChild", fo974244559_1501_firstChild, undefined);
// undefined
o110 = null;
// undefined
fo974244559_1501_firstChild.returns.push(o113);
// 9659
o111.appendChild = f974244559_482;
// undefined
fo974244559_1501_firstChild.returns.push(o113);
// 9661
f974244559_482.returns.push(o113);
// 9662
o110 = {};
// undefined
fo974244559_1501_firstChild.returns.push(o110);
// undefined
fo974244559_1501_firstChild.returns.push(o110);
// 9666
f974244559_482.returns.push(o110);
// 9667
o114 = {};
// undefined
fo974244559_1501_firstChild.returns.push(o114);
// undefined
fo974244559_1501_firstChild.returns.push(o114);
// 9671
f974244559_482.returns.push(o114);
// 9672
o115 = {};
// undefined
fo974244559_1501_firstChild.returns.push(o115);
// undefined
fo974244559_1501_firstChild.returns.push(o115);
// 9676
f974244559_482.returns.push(o115);
// 9677
o116 = {};
// undefined
fo974244559_1501_firstChild.returns.push(o116);
// undefined
fo974244559_1501_firstChild.returns.push(o116);
// 9681
f974244559_482.returns.push(o116);
// 9682
o117 = {};
// undefined
fo974244559_1501_firstChild.returns.push(o117);
// undefined
fo974244559_1501_firstChild.returns.push(o117);
// 9686
f974244559_482.returns.push(o117);
// 9687
o118 = {};
// undefined
fo974244559_1501_firstChild.returns.push(o118);
// undefined
fo974244559_1501_firstChild.returns.push(o118);
// 9691
f974244559_482.returns.push(o118);
// undefined
fo974244559_1501_firstChild.returns.push(null);
// 9693
o109.appendChild = f974244559_482;
// 9694
f974244559_482.returns.push(o111);
// undefined
o111 = null;
// 9695
o109.getAttribute = f974244559_500;
// 9696
f974244559_500.returns.push(null);
// 9697
o109.setAttribute = f974244559_643;
// undefined
o109 = null;
// 9698
f974244559_643.returns.push(undefined);
// 9734
f974244559_471.returns.push(1373491289982);
// 9738
o109 = {};
// 9739
f974244559_478.returns.push(o109);
// 9741
f974244559_482.returns.push(o109);
// undefined
o109 = null;
// 9744
f974244559_471.returns.push(1373491289983);
// 9747
f974244559_471.returns.push(1373491289984);
// 9750
f974244559_471.returns.push(1373491289984);
// 9752
o109 = {};
// 9753
f974244559_502.returns.push(o109);
// 9755
o111 = {};
// 9756
f974244559_502.returns.push(o111);
// 9757
o119 = {};
// 9758
o111.firstChild = o119;
// 9760
o119.nodeType = 8;
// 9762
o119.nodeValue = " <div class=\"fbTimelineSectionExpander fbTimelineHiddenPager stat_elem\" id=\"pagelet_timeline_recent_pager_1\"><div class=\"fbTimelineSectionExpandPager fbTimelineShowOlder\" data-gt=\"&#123;&quot;timeline_pager&quot;:&quot;1&quot;,&quot;profile_id&quot;:&quot;1055580469&quot;,&quot;page_index&quot;:&quot;1&quot;,&quot;query_type&quot;:&quot;39&quot;&#125;\" id=\"u_0_40\"><div class=\"clearfix uiMorePager stat_elem\"><a class=\"_5xn uiMorePagerSecondary rfloat\" href=\"#\" role=\"button\"></a><div><script type=\"text/javascript\">try {\n    ((JSBNG_Record.scriptLoad)((\"function ecda3ca27f7c0893c497b8928e68f51a830acf9bb(event) {\\u000a    ((JSCC.get(\\\"jo1YixfNw93Ap09ygDm0\\\") && JSCC.get(\\\"jo1YixfNw93Ap09ygDm0\\\").getHandler()))();\\u000a    return false;\\u000a};\"), (\"s878f4a1c62fa8fc3a3816641defef147a7944494\")));\n    ((window.top.JSBNG_Record.callerJS) = (true));\n    function ecda3ca27f7c0893c497b8928e68f51a830acf9bb(JSBNG__event) {\n        if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n            return ((JSBNG_Record.eventCall)((arguments.callee), (\"s878f4a1c62fa8fc3a3816641defef147a7944494_0\"), (s878f4a1c62fa8fc3a3816641defef147a7944494_0_instance), (this), (arguments)))\n        };\n        (null);\n        (((((JSBNG_Record.get)(JSCC, (\"get\")))[(\"get\")])(\"jo1YixfNw93Ap09ygDm0\") && (((JSBNG_Record.get)((((JSBNG_Record.get)(JSCC, (\"get\")))[(\"get\")])(\"jo1YixfNw93Ap09ygDm0\"), (\"getHandler\")))[(\"getHandler\")])()))();\n        return false;\n    };\n    var s878f4a1c62fa8fc3a3816641defef147a7944494_0_instance;\n    ((s878f4a1c62fa8fc3a3816641defef147a7944494_0_instance) = ((JSBNG_Record.eventInstance)((\"s878f4a1c62fa8fc3a3816641defef147a7944494_0\"))));\n    ((JSBNG_Record.markFunction)((ecda3ca27f7c0893c497b8928e68f51a830acf9bb)));\n} finally {\n    ((window.top.JSBNG_Record.callerJS) = (false));\n    ((window.top.JSBNG_Record.flushDeferredEvents)());\n};</script><a class=\"pam uiBoxLightblue uiMorePagerPrimary\" onclick=\"return ecda3ca27f7c0893c497b8928e68f51a830acf9bb.call(this, event);\" href=\"#\" role=\"button\">See More Recent Stories</a><span class=\"uiMorePagerLoader pam uiBoxLightblue\"><img class=\"img\" src=\"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yb/r/GsNJNwuI-UM.gif\" alt=\"\" width=\"16\" height=\"11\" /></span></div></div></div></div> ";
// undefined
o119 = null;
// 9763
o111.parentNode = o25;
// 9765
f974244559_507.returns.push(o111);
// undefined
o111 = null;
// 9766
// 9767
o109.getAttribute = f974244559_500;
// 9768
f974244559_500.returns.push(null);
// 9769
o109.setAttribute = f974244559_643;
// 9770
f974244559_643.returns.push(undefined);
// 9774
f974244559_471.returns.push(1373491289990);
// 9778
o111 = {};
// 9779
f974244559_478.returns.push(o111);
// 9781
f974244559_482.returns.push(o111);
// undefined
o111 = null;
// 9784
f974244559_471.returns.push(1373491289991);
// 9787
f974244559_471.returns.push(1373491289992);
// 9790
f974244559_471.returns.push(1373491289992);
// 9792
o111 = {};
// 9793
f974244559_502.returns.push(o111);
// 9795
o119 = {};
// 9796
f974244559_502.returns.push(o119);
// 9797
o120 = {};
// 9798
o119.firstChild = o120;
// 9800
o120.nodeType = 8;
// 9802
o120.nodeValue = " <ul class=\"fbTimelineScrubber hidden_elem\" role=\"navigation\" data-gt=\"&#123;&quot;timeline_scrubber&quot;:&quot;1&quot;,&quot;profile_id&quot;:&quot;1055580469&quot;&#125;\" id=\"u_0_42\"><li data-key=\"recent\" class=\"selected\"><a href=\"/LawlabeeTheWallaby/timeline\" rel=\"ignore\">Now</a></li><li data-key=\"year_2013\" class=\"clearfix\" data-rollup=\"2010s\" data-year=\"2013\"><a href=\"/LawlabeeTheWallaby/timeline/2013\" rel=\"ignore\" tabindex=\"-1\">2013</a><ul class=\"clearfix\"><li data-key=\"month_2013_1\"><a href=\"/LawlabeeTheWallaby/timeline/2013/1\" rel=\"ignore\">January</a></li></ul></li><li data-key=\"year_2012\" class=\"clearfix\" data-rollup=\"2010s\" data-year=\"2012\"><a href=\"/LawlabeeTheWallaby/timeline/2012\" rel=\"ignore\" tabindex=\"-1\">2012</a><ul class=\"clearfix\"><li data-key=\"month_2012_12\"><a href=\"/LawlabeeTheWallaby/timeline/2012/12\" rel=\"ignore\">December</a></li><li data-key=\"month_2012_11\"><a href=\"/LawlabeeTheWallaby/timeline/2012/11\" rel=\"ignore\">November</a></li><li data-key=\"month_2012_10\"><a href=\"/LawlabeeTheWallaby/timeline/2012/10\" rel=\"ignore\">October</a></li><li data-key=\"month_2012_9\"><a href=\"/LawlabeeTheWallaby/timeline/2012/9\" rel=\"ignore\">September</a></li><li data-key=\"month_2012_8\"><a href=\"/LawlabeeTheWallaby/timeline/2012/8\" rel=\"ignore\">August</a></li><li data-key=\"month_2012_7\"><a href=\"/LawlabeeTheWallaby/timeline/2012/7\" rel=\"ignore\">July</a></li><li data-key=\"month_2012_6\"><a href=\"/LawlabeeTheWallaby/timeline/2012/6\" rel=\"ignore\">June</a></li><li data-key=\"month_2012_5\"><a href=\"/LawlabeeTheWallaby/timeline/2012/5\" rel=\"ignore\">May</a></li><li data-key=\"month_2012_4\"><a href=\"/LawlabeeTheWallaby/timeline/2012/4\" rel=\"ignore\">April</a></li><li data-key=\"month_2012_3\"><a href=\"/LawlabeeTheWallaby/timeline/2012/3\" rel=\"ignore\">March</a></li><li data-key=\"month_2012_2\"><a href=\"/LawlabeeTheWallaby/timeline/2012/2\" rel=\"ignore\">February</a></li><li data-key=\"month_2012_1\"><a href=\"/LawlabeeTheWallaby/timeline/2012/1\" rel=\"ignore\">January</a></li></ul></li><li data-key=\"year_2011\" class=\"clearfix\" data-rollup=\"2010s\" data-year=\"2011\"><a href=\"/LawlabeeTheWallaby/timeline/2011\" rel=\"ignore\" tabindex=\"-1\">2011</a><ul class=\"clearfix\"><li data-key=\"month_2011_12\"><a href=\"/LawlabeeTheWallaby/timeline/2011/12\" rel=\"ignore\">December</a></li><li data-key=\"month_2011_11\"><a href=\"/LawlabeeTheWallaby/timeline/2011/11\" rel=\"ignore\">November</a></li><li data-key=\"month_2011_10\"><a href=\"/LawlabeeTheWallaby/timeline/2011/10\" rel=\"ignore\">October</a></li><li data-key=\"month_2011_9\"><a href=\"/LawlabeeTheWallaby/timeline/2011/9\" rel=\"ignore\">September</a></li><li data-key=\"month_2011_8\"><a href=\"/LawlabeeTheWallaby/timeline/2011/8\" rel=\"ignore\">August</a></li><li data-key=\"month_2011_7\"><a href=\"/LawlabeeTheWallaby/timeline/2011/7\" rel=\"ignore\">July</a></li><li data-key=\"month_2011_6\"><a href=\"/LawlabeeTheWallaby/timeline/2011/6\" rel=\"ignore\">June</a></li><li data-key=\"month_2011_5\"><a href=\"/LawlabeeTheWallaby/timeline/2011/5\" rel=\"ignore\">May</a></li><li data-key=\"month_2011_4\"><a href=\"/LawlabeeTheWallaby/timeline/2011/4\" rel=\"ignore\">April</a></li><li data-key=\"month_2011_3\"><a href=\"/LawlabeeTheWallaby/timeline/2011/3\" rel=\"ignore\">March</a></li><li data-key=\"month_2011_2\"><a href=\"/LawlabeeTheWallaby/timeline/2011/2\" rel=\"ignore\">February</a></li><li data-key=\"month_2011_1\"><a href=\"/LawlabeeTheWallaby/timeline/2011/1\" rel=\"ignore\">January</a></li></ul></li><li data-key=\"year_2010\" class=\"clearfix\" data-rollup=\"2010s\" data-year=\"2010\"><a href=\"/LawlabeeTheWallaby/timeline/2010\" rel=\"ignore\" tabindex=\"-1\">2010</a><ul class=\"clearfix\"><li data-key=\"month_2010_12\"><a href=\"/LawlabeeTheWallaby/timeline/2010/12\" rel=\"ignore\">December</a></li><li data-key=\"month_2010_11\"><a href=\"/LawlabeeTheWallaby/timeline/2010/11\" rel=\"ignore\">November</a></li><li data-key=\"month_2010_10\"><a href=\"/LawlabeeTheWallaby/timeline/2010/10\" rel=\"ignore\">October</a></li><li data-key=\"month_2010_9\"><a href=\"/LawlabeeTheWallaby/timeline/2010/9\" rel=\"ignore\">September</a></li><li data-key=\"month_2010_8\"><a href=\"/LawlabeeTheWallaby/timeline/2010/8\" rel=\"ignore\">August</a></li><li data-key=\"month_2010_7\"><a href=\"/LawlabeeTheWallaby/timeline/2010/7\" rel=\"ignore\">July</a></li><li data-key=\"month_2010_6\"><a href=\"/LawlabeeTheWallaby/timeline/2010/6\" rel=\"ignore\">June</a></li><li data-key=\"month_2010_5\"><a href=\"/LawlabeeTheWallaby/timeline/2010/5\" rel=\"ignore\">May</a></li><li data-key=\"month_2010_4\"><a href=\"/LawlabeeTheWallaby/timeline/2010/4\" rel=\"ignore\">April</a></li><li data-key=\"month_2010_3\"><a href=\"/LawlabeeTheWallaby/timeline/2010/3\" rel=\"ignore\">March</a></li><li data-key=\"month_2010_2\"><a href=\"/LawlabeeTheWallaby/timeline/2010/2\" rel=\"ignore\">February</a></li><li data-key=\"month_2010_1\"><a href=\"/LawlabeeTheWallaby/timeline/2010/1\" rel=\"ignore\">January</a></li></ul></li><li data-key=\"year_2009\" class=\"clearfix\" data-rollup=\"2000s\" data-year=\"2009\"><a href=\"/LawlabeeTheWallaby/timeline/2009\" rel=\"ignore\" tabindex=\"-1\">2009</a><ul class=\"clearfix\"><li data-key=\"month_2009_12\"><a href=\"/LawlabeeTheWallaby/timeline/2009/12\" rel=\"ignore\">December</a></li><li data-key=\"month_2009_11\"><a href=\"/LawlabeeTheWallaby/timeline/2009/11\" rel=\"ignore\">November</a></li><li data-key=\"month_2009_10\"><a href=\"/LawlabeeTheWallaby/timeline/2009/10\" rel=\"ignore\">October</a></li><li data-key=\"month_2009_9\"><a href=\"/LawlabeeTheWallaby/timeline/2009/9\" rel=\"ignore\">September</a></li><li data-key=\"month_2009_8\"><a href=\"/LawlabeeTheWallaby/timeline/2009/8\" rel=\"ignore\">August</a></li><li data-key=\"month_2009_7\"><a href=\"/LawlabeeTheWallaby/timeline/2009/7\" rel=\"ignore\">July</a></li><li data-key=\"month_2009_6\"><a href=\"/LawlabeeTheWallaby/timeline/2009/6\" rel=\"ignore\">June</a></li><li data-key=\"month_2009_5\"><a href=\"/LawlabeeTheWallaby/timeline/2009/5\" rel=\"ignore\">May</a></li><li data-key=\"month_2009_4\"><a href=\"/LawlabeeTheWallaby/timeline/2009/4\" rel=\"ignore\">April</a></li><li data-key=\"month_2009_3\"><a href=\"/LawlabeeTheWallaby/timeline/2009/3\" rel=\"ignore\">March</a></li><li data-key=\"month_2009_2\"><a href=\"/LawlabeeTheWallaby/timeline/2009/2\" rel=\"ignore\">February</a></li><li data-key=\"month_2009_1\"><a href=\"/LawlabeeTheWallaby/timeline/2009/1\" rel=\"ignore\">January</a></li></ul></li><li data-key=\"year_2008\" class=\"clearfix\" data-rollup=\"2000s\" data-year=\"2008\"><a href=\"/LawlabeeTheWallaby/timeline/2008\" rel=\"ignore\" tabindex=\"-1\">2008</a><ul class=\"clearfix\"><li data-key=\"month_2008_12\"><a href=\"/LawlabeeTheWallaby/timeline/2008/12\" rel=\"ignore\">December</a></li><li data-key=\"month_2008_11\"><a href=\"/LawlabeeTheWallaby/timeline/2008/11\" rel=\"ignore\">November</a></li><li data-key=\"month_2008_10\"><a href=\"/LawlabeeTheWallaby/timeline/2008/10\" rel=\"ignore\">October</a></li><li data-key=\"month_2008_9\"><a href=\"/LawlabeeTheWallaby/timeline/2008/9\" rel=\"ignore\">September</a></li><li data-key=\"month_2008_8\"><a href=\"/LawlabeeTheWallaby/timeline/2008/8\" rel=\"ignore\">August</a></li><li data-key=\"month_2008_7\"><a href=\"/LawlabeeTheWallaby/timeline/2008/7\" rel=\"ignore\">July</a></li><li data-key=\"month_2008_6\"><a href=\"/LawlabeeTheWallaby/timeline/2008/6\" rel=\"ignore\">June</a></li><li data-key=\"month_2008_5\"><a href=\"/LawlabeeTheWallaby/timeline/2008/5\" rel=\"ignore\">May</a></li><li data-key=\"month_2008_4\"><a href=\"/LawlabeeTheWallaby/timeline/2008/4\" rel=\"ignore\">April</a></li><li data-key=\"month_2008_3\"><a href=\"/LawlabeeTheWallaby/timeline/2008/3\" rel=\"ignore\">March</a></li><li data-key=\"month_2008_2\"><a href=\"/LawlabeeTheWallaby/timeline/2008/2\" rel=\"ignore\">February</a></li><li data-key=\"month_2008_1\"><a href=\"/LawlabeeTheWallaby/timeline/2008/1\" rel=\"ignore\">January</a></li></ul></li><li data-key=\"way_back\"><a href=\"/LawlabeeTheWallaby/timeline#way_back\" rel=\"ignore\" tabindex=\"-1\">Born</a></li></ul> ";
// undefined
o120 = null;
// 9803
o119.parentNode = o25;
// 9805
f974244559_507.returns.push(o119);
// undefined
o119 = null;
// 9807
o119 = {};
// 9808
f974244559_480.returns.push(o119);
// 9809
// 9811
o120 = {};
// 9812
f974244559_478.returns.push(o120);
// 9813
o121 = {};
// undefined
fo974244559_1518_firstChild = function() { return fo974244559_1518_firstChild.returns[fo974244559_1518_firstChild.inst++]; };
fo974244559_1518_firstChild.returns = [];
fo974244559_1518_firstChild.inst = 0;
defineGetter(o119, "firstChild", fo974244559_1518_firstChild, undefined);
// undefined
o119 = null;
// undefined
fo974244559_1518_firstChild.returns.push(o121);
// 9815
o120.appendChild = f974244559_482;
// undefined
fo974244559_1518_firstChild.returns.push(o121);
// 9817
f974244559_482.returns.push(o121);
// undefined
fo974244559_1518_firstChild.returns.push(null);
// 9819
o111.appendChild = f974244559_482;
// 9820
f974244559_482.returns.push(o120);
// undefined
o120 = null;
// 9821
o111.getAttribute = f974244559_500;
// 9822
f974244559_500.returns.push(null);
// 9823
o111.setAttribute = f974244559_643;
// 9824
f974244559_643.returns.push(undefined);
// 9826
f974244559_471.returns.push(1373491290008);
// 9830
o119 = {};
// 9831
f974244559_478.returns.push(o119);
// 9833
f974244559_482.returns.push(o119);
// undefined
o119 = null;
// 9836
f974244559_471.returns.push(1373491290011);
// 9839
f974244559_471.returns.push(1373491290012);
// 9842
f974244559_471.returns.push(1373491290013);
// 9844
o119 = {};
// 9845
f974244559_502.returns.push(o119);
// 9847
o120 = {};
// 9848
f974244559_502.returns.push(o120);
// 9849
o122 = {};
// 9850
o120.firstChild = o122;
// 9852
o122.nodeType = 8;
// 9854
o122.nodeValue = " <div class=\"ego_column\"><div class=\"ego_section\" id=\"u_0_44\"><div class=\"uiHeader uiHeaderTopBorder mbs uiSideHeader\"><div class=\"clearfix uiHeaderTop\"><div class=\"rfloat\"><h6 class=\"accessible_elem\"><a href=\"/campaign/landing.php?placement=egot&amp;campaign_id=366925476690229&amp;extra_1=auto\"><span class=\"adsCategoryTitleLink\">Sponsored</span></a></h6><a class=\"uiHeaderActions\" href=\"/ads/adboard/?type=normal\">See All</a></div><div><h6 class=\"uiHeaderTitle\" aria-hidden=\"true\"><a href=\"/campaign/landing.php?placement=egot&amp;campaign_id=366925476690229&amp;extra_1=auto\"><span class=\"adsCategoryTitleLink\">Sponsored</span></a><a href=\"/campaign/landing.php?placement=egot&amp;campaign_id=366925476690229&amp;extra_1=auto\"><i class=\"mls adsCategoryIcon img sp_9kaae3 sx_5f2560\"></i></a></h6></div></div></div><div class=\"ego_unit_container\"><div class=\"ego_unit\" data-ego-fbid=\"6010069360965\"><div class=\"_4u8\" data-ad=\"&#123;&quot;adid&quot;:6010069360965,&quot;segment&quot;:&quot;market&quot;&#125;\" id=\"6010069360965-id_51ddd04f4b2ff8432881967\"><div class=\"_24n _24y\"><div class=\"uiSelector inlineBlock emu_x emuEventfad_hide _24x uiSelectorRight\"><div class=\"uiToggle wrap\"><a class=\"uiSelectorButton uiCloseButton uiCloseButtonSmall\" href=\"#\" role=\"button\" title=\"About Facebook Ads\" rel=\"toggle\" ajaxify=\"/ajax/emu/end.php?eid=AQImwNUhGWEdpxtbkvIo1XeZdXEJCbnUliRgBk-VjzyF9x_sRKX5KkfadkdzeU0OYGCk-6TBWIQSN5KzhOYoKjVlo4kTAXaIrVwpryZutdNpoebhwCxm335cl9OPRfK09xRh4Y0LhYHkwbguwrbCU9Q-xXnQWfSF77ZWyXIVGn1UNoTLBXwEVFVOTa4cx0J1ahfjWT78k25lBrHWBgosZ6OIfarUrONZma0tgqTA23dfX05cx0d2_-hJmyGJ3oi0-j3kuHdF7pqG6w5V5_hkT1FQ3hdSMhZN-w4U-WLh_Y_mcrtwnWDuSl1BRcLv1IutgYQwnxToVQM5ybpIIWLnaArXiPAcoiCaMdG8TUoj_NhJOfabT5OFaqRc0r_h42Jgbbsgw6zmag-qunA9rZmuDukrfz8B2v3Zxe40tDWjZPkflOc86jOu6qXzOhh988Tqm8_1iJ0HE9F1uHJnZ02Ixn2R6W5ufWmZm1qPkkF9fqSwdqjcxe3zHt892q18k9Q3zshsNZKxJ1clp4-eYVxD1G0v-FF66tMfniEWCbrzZHRhHIKBNn-2_0Omah9tD2FvDBiyK2UNQ2j8rLeapu6grh5xaeTTXA4VN2PaupbwY51nqoKgZF5K-OCLLgVOgmg26iYtq0SmvQ-iYZZke3YFfzhmNku9b_uDx5Kybyb3zI9M7ZZb3gBSbIjixin2vCo-KXqCy0QZ9NEGx3N2qY8tdpYSQ771yiMQuVrs4-C202l4rzLoqQ2wb_MmQph6g3gg2XtzNAksclUHD7ow2jObx9XduHIbOoNF97W8DqXbPf155_eeNLApheFI8ylWSFnl054AGnzXB6yM-IcB-1ywdLU2eikQ5HhPrTC0xjlEX1Oa_CJYOnHcoCCYmXWjeAyGPwYC4mA4OA83LUFiGFrY3l7Ktauyjs236xp9fYDl-\\-\\nxDgO1rP8Bm85L4cgE_hJ2xorp56xzHaj23PcAGj96HJwiw5O5TcyN4fJEsdZlXJKKAT0augBxDLo3Kia2tDrSJ5Y41nBmqvaPUnaGLz06VWI_OYm8kWlzzszKL_EwYlzhraKQ79ERahSXdSgX8T83Ssnyx8FZW2HMckb5QDAejgDSon2tNiRDdLSqtnEb4ITvknaS4P6WFxzAiimm_e0Vd7A&amp;f=0&amp;ui=6010069360965-id_51ddd04f4b2ff8432881967&amp;en=fad_hide&amp;ed=true&amp;a=1&amp;__tn__=v\" aria-haspopup=\"1\"></a></div></div><div class=\"title\"><script type=\"text/javascript\">try {\n    ((JSBNG_Record.scriptLoad)((\"function e2b8ac0048076134293fb4a101b110b40df5f7df7(event) {\\u000a    var meta = document.getElementById(\\\"meta_referrer\\\");\\u000a    meta.content = \\\"origin\\\";\\u000a    setTimeout(function() {\\u000a        meta.content = \\\"default\\\";\\u000a    }, 100);\\u000a    var attribute = \\\"href\\\";\\u000a    var ms = this.getAttribute(attribute).match(/([\\\\\\\\?|&]f=)([^&]*)/);\\u000a    if (ms) {\\u000a        this.setAttribute(attribute, this.getAttribute(attribute).replace(/[\\\\\\\\?|&]f=[^&]*/, (ms[1] + 0)));\\u000a    }\\u000a;\\u000a;\\u000a    var attribute = \\\"href\\\";\\u000a    var sig = this.getAttribute(attribute).match(/([\\\\\\\\?|&]sig=)([^&]*)/);\\u000a    if (sig) {\\u000a        this.setAttribute(attribute, this.getAttribute(attribute).replace(/[\\\\\\\\?|&]sig=[^&]*/, (sig[1] + ((Math.floor((Math.random() * 65535)) + 65536)))));\\u000a    }\\u000a;\\u000a;\\u000a};\"), (\"sf08ba6c64ed9e2a9de34f2e3082fa2392a6a515d\")));\n    ((window.top.JSBNG_Record.callerJS) = (true));\n    function e2b8ac0048076134293fb4a101b110b40df5f7df7(JSBNG__event) {\n        if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n            return ((JSBNG_Record.eventCall)((arguments.callee), (\"sf08ba6c64ed9e2a9de34f2e3082fa2392a6a515d_0\"), (sf08ba6c64ed9e2a9de34f2e3082fa2392a6a515d_0_instance), (this), (arguments)))\n        };\n        (null);\n        var meta = (((JSBNG_Record.get)(JSBNG__document, (\"getElementById\")))[(\"getElementById\")])(\"meta_referrer\");\n        ((JSBNG_Record.set)(meta, (\"JSBNG__content\"), \"origin\"));\n        JSBNG__setTimeout(((function() {\n            var sf08ba6c64ed9e2a9de34f2e3082fa2392a6a515d_1_instance;\n            ((sf08ba6c64ed9e2a9de34f2e3082fa2392a6a515d_1_instance) = ((JSBNG_Record.eventInstance)((\"sf08ba6c64ed9e2a9de34f2e3082fa2392a6a515d_1\"))));\n            return ((JSBNG_Record.markFunction)((function() {\n                if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n                    return ((JSBNG_Record.eventCall)((arguments.callee), (\"sf08ba6c64ed9e2a9de34f2e3082fa2392a6a515d_1\"), (sf08ba6c64ed9e2a9de34f2e3082fa2392a6a515d_1_instance), (this), (arguments)))\n                };\n                (null);\n                ((JSBNG_Record.set)(meta, (\"JSBNG__content\"), \"default\"));\n            })));\n        })()), 100);\n        var attribute = \"href\";\n        var ms = (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"match\")))[(\"match\")])(/([\\\\?|&]f=)([^&]*)/);\n        if (ms) {\n            (((JSBNG_Record.get)(this, (\"setAttribute\")))[(\"setAttribute\")])(attribute, (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"replace\")))[(\"replace\")])(/[\\\\?|&]f=[^&]*/, ((((JSBNG_Record.get)(ms, 1))[1]) + 0)));\n        }\n        ;\n        ;\n        var attribute = \"href\";\n        var sig = (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"match\")))[(\"match\")])(/([\\\\?|&]sig=)([^&]*)/);\n        if (sig) {\n            (((JSBNG_Record.get)(this, (\"setAttribute\")))[(\"setAttribute\")])(attribute, (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"replace\")))[(\"replace\")])(/[\\\\?|&]sig=[^&]*/, ((((JSBNG_Record.get)(sig, 1))[1]) + (((((JSBNG_Record.get)(Math, (\"floor\")))[(\"floor\")])(((((JSBNG_Record.get)(Math, (\"JSBNG__random\")))[(\"JSBNG__random\")])() * 65535)) + 65536)))));\n        }\n        ;\n        ;\n    };\n    var sf08ba6c64ed9e2a9de34f2e3082fa2392a6a515d_0_instance;\n    ((sf08ba6c64ed9e2a9de34f2e3082fa2392a6a515d_0_instance) = ((JSBNG_Record.eventInstance)((\"sf08ba6c64ed9e2a9de34f2e3082fa2392a6a515d_0\"))));\n    ((JSBNG_Record.markFunction)((e2b8ac0048076134293fb4a101b110b40df5f7df7)));\n} finally {\n    ((window.top.JSBNG_Record.callerJS) = (false));\n    ((window.top.JSBNG_Record.flushDeferredEvents)());\n};</script><a class=\"forceLTR emuEvent1 _24x\" href=\"/ajax/emu/end.php?eid=AQImwNUhGWEdpxtbkvIo1XeZdXEJCbnUliRgBk-VjzyF9x_sRKX5KkfadkdzeU0OYGCk-6TBWIQSN5KzhOYoKjVlo4kTAXaIrVwpryZutdNpoebhwCxm335cl9OPRfK09xRh4Y0LhYHkwbguwrbCU9Q-xXnQWfSF77ZWyXIVGn1UNoTLBXwEVFVOTa4cx0J1ahfjWT78k25lBrHWBgosZ6OIfarUrONZma0tgqTA23dfX05cx0d2_-hJmyGJ3oi0-j3kuHdF7pqG6w5V5_hkT1FQ3hdSMhZN-w4U-WLh_Y_mcrtwnWDuSl1BRcLv1IutgYQwnxToVQM5ybpIIWLnaArXiPAcoiCaMdG8TUoj_NhJOfabT5OFaqRc0r_h42Jgbbsgw6zmag-qunA9rZmuDukrfz8B2v3Zxe40tDWjZPkflOc86jOu6qXzOhh988Tqm8_1iJ0HE9F1uHJnZ02Ixn2R6W5ufWmZm1qPkkF9fqSwdqjcxe3zHt892q18k9Q3zshsNZKxJ1clp4-eYVxD1G0v-FF66tMfniEWCbrzZHRhHIKBNn-2_0Omah9tD2FvDBiyK2UNQ2j8rLeapu6grh5xaeTTXA4VN2PaupbwY51nqoKgZF5K-OCLLgVOgmg26iYtq0SmvQ-iYZZke3YFfzhmNku9b_uDx5Kybyb3zI9M7ZZb3gBSbIjixin2vCo-KXqCy0QZ9NEGx3N2qY8tdpYSQ771yiMQuVrs4-C202l4rzLoqQ2wb_MmQph6g3gg2XtzNAksclUHD7ow2jObx9XduHIbOoNF97W8DqXbPf155_eeNLApheFI8ylWSFnl054AGnzXB6yM-IcB-1ywdLU2eikQ5HhPrTC0xjlEX1Oa_CJYOnHcoCCYmXWjeAyGPwYC4mA4OA83LUFiGFrY3l7Ktauyjs236xp9fYDl-\\-\\nxDgO1rP8Bm85L4cgE_hJ2xorp56xzHaj23PcAGj96HJwiw5O5TcyN4fJEsdZlXJKKAT0augBxDLo3Kia2tDrSJ5Y41nBmqvaPUnaGLz06VWI_OYm8kWlzzszKL_EwYlzhraKQ79ERahSXdSgX8T83Ssnyx8FZW2HMckb5QDAejgDSon2tNiRDdLSqtnEb4ITvknaS4P6WFxzAiimm_e0Vd7A&amp;f=1&amp;ui=6010069360965-id_51ddd04f4b2ff8432881967&amp;en=1&amp;a=0&amp;sig=121144&amp;__tn__=wv\" onmousedown=\"return e2b8ac0048076134293fb4a101b110b40df5f7df7.call(this, event);\">Check Out SUBWAY®</a></div><div class=\"clearfix image_body_block\"><script type=\"text/javascript\">try {\n    ((JSBNG_Record.scriptLoad)((\"function ee297644d85f8cc7bedd6a8e6f296df633ddd6ca2(event) {\\u000a    var meta = document.getElementById(\\\"meta_referrer\\\");\\u000a    meta.content = \\\"origin\\\";\\u000a    setTimeout(function() {\\u000a        meta.content = \\\"default\\\";\\u000a    }, 100);\\u000a    var attribute = \\\"href\\\";\\u000a    var ms = this.getAttribute(attribute).match(/([\\\\\\\\?|&]f=)([^&]*)/);\\u000a    if (ms) {\\u000a        this.setAttribute(attribute, this.getAttribute(attribute).replace(/[\\\\\\\\?|&]f=[^&]*/, (ms[1] + 0)));\\u000a    }\\u000a;\\u000a;\\u000a    var attribute = \\\"href\\\";\\u000a    var sig = this.getAttribute(attribute).match(/([\\\\\\\\?|&]sig=)([^&]*)/);\\u000a    if (sig) {\\u000a        this.setAttribute(attribute, this.getAttribute(attribute).replace(/[\\\\\\\\?|&]sig=[^&]*/, (sig[1] + ((Math.floor((Math.random() * 65535)) + 65536)))));\\u000a    }\\u000a;\\u000a;\\u000a};\"), (\"seee223a82cd2ca400f4634fd9ef142a96b519b35\")));\n    ((window.top.JSBNG_Record.callerJS) = (true));\n    function ee297644d85f8cc7bedd6a8e6f296df633ddd6ca2(JSBNG__event) {\n        if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n            return ((JSBNG_Record.eventCall)((arguments.callee), (\"seee223a82cd2ca400f4634fd9ef142a96b519b35_0\"), (seee223a82cd2ca400f4634fd9ef142a96b519b35_0_instance), (this), (arguments)))\n        };\n        (null);\n        var meta = (((JSBNG_Record.get)(JSBNG__document, (\"getElementById\")))[(\"getElementById\")])(\"meta_referrer\");\n        ((JSBNG_Record.set)(meta, (\"JSBNG__content\"), \"origin\"));\n        JSBNG__setTimeout(((function() {\n            var seee223a82cd2ca400f4634fd9ef142a96b519b35_1_instance;\n            ((seee223a82cd2ca400f4634fd9ef142a96b519b35_1_instance) = ((JSBNG_Record.eventInstance)((\"seee223a82cd2ca400f4634fd9ef142a96b519b35_1\"))));\n            return ((JSBNG_Record.markFunction)((function() {\n                if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n                    return ((JSBNG_Record.eventCall)((arguments.callee), (\"seee223a82cd2ca400f4634fd9ef142a96b519b35_1\"), (seee223a82cd2ca400f4634fd9ef142a96b519b35_1_instance), (this), (arguments)))\n                };\n                (null);\n                ((JSBNG_Record.set)(meta, (\"JSBNG__content\"), \"default\"));\n            })));\n        })()), 100);\n        var attribute = \"href\";\n        var ms = (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"match\")))[(\"match\")])(/([\\\\?|&]f=)([^&]*)/);\n        if (ms) {\n            (((JSBNG_Record.get)(this, (\"setAttribute\")))[(\"setAttribute\")])(attribute, (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"replace\")))[(\"replace\")])(/[\\\\?|&]f=[^&]*/, ((((JSBNG_Record.get)(ms, 1))[1]) + 0)));\n        }\n        ;\n        ;\n        var attribute = \"href\";\n        var sig = (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"match\")))[(\"match\")])(/([\\\\?|&]sig=)([^&]*)/);\n        if (sig) {\n            (((JSBNG_Record.get)(this, (\"setAttribute\")))[(\"setAttribute\")])(attribute, (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"replace\")))[(\"replace\")])(/[\\\\?|&]sig=[^&]*/, ((((JSBNG_Record.get)(sig, 1))[1]) + (((((JSBNG_Record.get)(Math, (\"floor\")))[(\"floor\")])(((((JSBNG_Record.get)(Math, (\"JSBNG__random\")))[(\"JSBNG__random\")])() * 65535)) + 65536)))));\n        }\n        ;\n        ;\n    };\n    var seee223a82cd2ca400f4634fd9ef142a96b519b35_0_instance;\n    ((seee223a82cd2ca400f4634fd9ef142a96b519b35_0_instance) = ((JSBNG_Record.eventInstance)((\"seee223a82cd2ca400f4634fd9ef142a96b519b35_0\"))));\n    ((JSBNG_Record.markFunction)((ee297644d85f8cc7bedd6a8e6f296df633ddd6ca2)));\n} finally {\n    ((window.top.JSBNG_Record.callerJS) = (false));\n    ((window.top.JSBNG_Record.flushDeferredEvents)());\n};</script><a class=\"forceLTR emuEvent1 _24x image fbEmuImage _8o _8s lfloat\" tabindex=\"-1\" href=\"/ajax/emu/end.php?eid=AQImwNUhGWEdpxtbkvIo1XeZdXEJCbnUliRgBk-VjzyF9x_sRKX5KkfadkdzeU0OYGCk-6TBWIQSN5KzhOYoKjVlo4kTAXaIrVwpryZutdNpoebhwCxm335cl9OPRfK09xRh4Y0LhYHkwbguwrbCU9Q-xXnQWfSF77ZWyXIVGn1UNoTLBXwEVFVOTa4cx0J1ahfjWT78k25lBrHWBgosZ6OIfarUrONZma0tgqTA23dfX05cx0d2_-hJmyGJ3oi0-j3kuHdF7pqG6w5V5_hkT1FQ3hdSMhZN-w4U-WLh_Y_mcrtwnWDuSl1BRcLv1IutgYQwnxToVQM5ybpIIWLnaArXiPAcoiCaMdG8TUoj_NhJOfabT5OFaqRc0r_h42Jgbbsgw6zmag-qunA9rZmuDukrfz8B2v3Zxe40tDWjZPkflOc86jOu6qXzOhh988Tqm8_1iJ0HE9F1uHJnZ02Ixn2R6W5ufWmZm1qPkkF9fqSwdqjcxe3zHt892q18k9Q3zshsNZKxJ1clp4-eYVxD1G0v-FF66tMfniEWCbrzZHRhHIKBNn-2_0Omah9tD2FvDBiyK2UNQ2j8rLeapu6grh5xaeTTXA4VN2PaupbwY51nqoKgZF5K-OCLLgVOgmg26iYtq0SmvQ-iYZZke3YFfzhmNku9b_uDx5Kybyb3zI9M7ZZb3gBSbIjixin2vCo-KXqCy0QZ9NEGx3N2qY8tdpYSQ771yiMQuVrs4-C202l4rzLoqQ2wb_MmQph6g3gg2XtzNAksclUHD7ow2jObx9XduHIbOoNF97W8DqXbPf155_eeNLApheFI8ylWSFnl054AGnzXB6yM-IcB-1ywdLU2eikQ5HhPrTC0xjlEX1Oa_CJYOnHcoCCYmXWjeAyGPwYC4mA4OA83LUFiGFrY3l7Ktauyjs236xp9fYDl-\\-\\nxDgO1rP8Bm85L4cgE_hJ2xorp56xzHaj23PcAGj96HJwiw5O5TcyN4fJEsdZlXJKKAT0augBxDLo3Kia2tDrSJ5Y41nBmqvaPUnaGLz06VWI_OYm8kWlzzszKL_EwYlzhraKQ79ERahSXdSgX8T83Ssnyx8FZW2HMckb5QDAejgDSon2tNiRDdLSqtnEb4ITvknaS4P6WFxzAiimm_e0Vd7A&amp;f=1&amp;ui=6010069360965-id_51ddd04f4b2ff8432881967&amp;en=1&amp;a=0&amp;sig=131071&amp;__tn__=ywv\" onmousedown=\"return ee297644d85f8cc7bedd6a8e6f296df633ddd6ca2.call(this, event);\" aria-hidden=\"true\"><img class=\"img\" src=\"http://jsbngssl.fbcdn-creative-a.akamaihd.net/hads-ak-prn1/s110x80/735333_6010066603965_417420211_n.png\" alt=\"\" /></a><div class=\"_42ef\"><div class=\"body\"><script type=\"text/javascript\">try {\n    ((JSBNG_Record.scriptLoad)((\"function e07e9f7fab52598ed743f8e69b84163d953c06770(event) {\\u000a    var meta = document.getElementById(\\\"meta_referrer\\\");\\u000a    meta.content = \\\"origin\\\";\\u000a    setTimeout(function() {\\u000a        meta.content = \\\"default\\\";\\u000a    }, 100);\\u000a    var attribute = \\\"href\\\";\\u000a    var ms = this.getAttribute(attribute).match(/([\\\\\\\\?|&]f=)([^&]*)/);\\u000a    if (ms) {\\u000a        this.setAttribute(attribute, this.getAttribute(attribute).replace(/[\\\\\\\\?|&]f=[^&]*/, (ms[1] + 0)));\\u000a    }\\u000a;\\u000a;\\u000a    var attribute = \\\"href\\\";\\u000a    var sig = this.getAttribute(attribute).match(/([\\\\\\\\?|&]sig=)([^&]*)/);\\u000a    if (sig) {\\u000a        this.setAttribute(attribute, this.getAttribute(attribute).replace(/[\\\\\\\\?|&]sig=[^&]*/, (sig[1] + ((Math.floor((Math.random() * 65535)) + 65536)))));\\u000a    }\\u000a;\\u000a;\\u000a};\"), (\"s09a76401006d0213dc92759b65ec397fc1a43042\")));\n    ((window.top.JSBNG_Record.callerJS) = (true));\n    function e07e9f7fab52598ed743f8e69b84163d953c06770(JSBNG__event) {\n        if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n            return ((JSBNG_Record.eventCall)((arguments.callee), (\"s09a76401006d0213dc92759b65ec397fc1a43042_0\"), (s09a76401006d0213dc92759b65ec397fc1a43042_0_instance), (this), (arguments)))\n        };\n        (null);\n        var meta = (((JSBNG_Record.get)(JSBNG__document, (\"getElementById\")))[(\"getElementById\")])(\"meta_referrer\");\n        ((JSBNG_Record.set)(meta, (\"JSBNG__content\"), \"origin\"));\n        JSBNG__setTimeout(((function() {\n            var s09a76401006d0213dc92759b65ec397fc1a43042_1_instance;\n            ((s09a76401006d0213dc92759b65ec397fc1a43042_1_instance) = ((JSBNG_Record.eventInstance)((\"s09a76401006d0213dc92759b65ec397fc1a43042_1\"))));\n            return ((JSBNG_Record.markFunction)((function() {\n                if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n                    return ((JSBNG_Record.eventCall)((arguments.callee), (\"s09a76401006d0213dc92759b65ec397fc1a43042_1\"), (s09a76401006d0213dc92759b65ec397fc1a43042_1_instance), (this), (arguments)))\n                };\n                (null);\n                ((JSBNG_Record.set)(meta, (\"JSBNG__content\"), \"default\"));\n            })));\n        })()), 100);\n        var attribute = \"href\";\n        var ms = (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"match\")))[(\"match\")])(/([\\\\?|&]f=)([^&]*)/);\n        if (ms) {\n            (((JSBNG_Record.get)(this, (\"setAttribute\")))[(\"setAttribute\")])(attribute, (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"replace\")))[(\"replace\")])(/[\\\\?|&]f=[^&]*/, ((((JSBNG_Record.get)(ms, 1))[1]) + 0)));\n        }\n        ;\n        ;\n        var attribute = \"href\";\n        var sig = (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"match\")))[(\"match\")])(/([\\\\?|&]sig=)([^&]*)/);\n        if (sig) {\n            (((JSBNG_Record.get)(this, (\"setAttribute\")))[(\"setAttribute\")])(attribute, (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"replace\")))[(\"replace\")])(/[\\\\?|&]sig=[^&]*/, ((((JSBNG_Record.get)(sig, 1))[1]) + (((((JSBNG_Record.get)(Math, (\"floor\")))[(\"floor\")])(((((JSBNG_Record.get)(Math, (\"JSBNG__random\")))[(\"JSBNG__random\")])() * 65535)) + 65536)))));\n        }\n        ;\n        ;\n    };\n    var s09a76401006d0213dc92759b65ec397fc1a43042_0_instance;\n    ((s09a76401006d0213dc92759b65ec397fc1a43042_0_instance) = ((JSBNG_Record.eventInstance)((\"s09a76401006d0213dc92759b65ec397fc1a43042_0\"))));\n    ((JSBNG_Record.markFunction)((e07e9f7fab52598ed743f8e69b84163d953c06770)));\n} finally {\n    ((window.top.JSBNG_Record.callerJS) = (false));\n    ((window.top.JSBNG_Record.flushDeferredEvents)());\n};</script><a class=\"forceLTR emuEvent1 _24x\" href=\"/ajax/emu/end.php?eid=AQImwNUhGWEdpxtbkvIo1XeZdXEJCbnUliRgBk-VjzyF9x_sRKX5KkfadkdzeU0OYGCk-6TBWIQSN5KzhOYoKjVlo4kTAXaIrVwpryZutdNpoebhwCxm335cl9OPRfK09xRh4Y0LhYHkwbguwrbCU9Q-xXnQWfSF77ZWyXIVGn1UNoTLBXwEVFVOTa4cx0J1ahfjWT78k25lBrHWBgosZ6OIfarUrONZma0tgqTA23dfX05cx0d2_-hJmyGJ3oi0-j3kuHdF7pqG6w5V5_hkT1FQ3hdSMhZN-w4U-WLh_Y_mcrtwnWDuSl1BRcLv1IutgYQwnxToVQM5ybpIIWLnaArXiPAcoiCaMdG8TUoj_NhJOfabT5OFaqRc0r_h42Jgbbsgw6zmag-qunA9rZmuDukrfz8B2v3Zxe40tDWjZPkflOc86jOu6qXzOhh988Tqm8_1iJ0HE9F1uHJnZ02Ixn2R6W5ufWmZm1qPkkF9fqSwdqjcxe3zHt892q18k9Q3zshsNZKxJ1clp4-eYVxD1G0v-FF66tMfniEWCbrzZHRhHIKBNn-2_0Omah9tD2FvDBiyK2UNQ2j8rLeapu6grh5xaeTTXA4VN2PaupbwY51nqoKgZF5K-OCLLgVOgmg26iYtq0SmvQ-iYZZke3YFfzhmNku9b_uDx5Kybyb3zI9M7ZZb3gBSbIjixin2vCo-KXqCy0QZ9NEGx3N2qY8tdpYSQ771yiMQuVrs4-C202l4rzLoqQ2wb_MmQph6g3gg2XtzNAksclUHD7ow2jObx9XduHIbOoNF97W8DqXbPf155_eeNLApheFI8ylWSFnl054AGnzXB6yM-IcB-1ywdLU2eikQ5HhPrTC0xjlEX1Oa_CJYOnHcoCCYmXWjeAyGPwYC4mA4OA83LUFiGFrY3l7Ktauyjs236xp9fYDl-\\-\\nxDgO1rP8Bm85L4cgE_hJ2xorp56xzHaj23PcAGj96HJwiw5O5TcyN4fJEsdZlXJKKAT0augBxDLo3Kia2tDrSJ5Y41nBmqvaPUnaGLz06VWI_OYm8kWlzzszKL_EwYlzhraKQ79ERahSXdSgX8T83Ssnyx8FZW2HMckb5QDAejgDSon2tNiRDdLSqtnEb4ITvknaS4P6WFxzAiimm_e0Vd7A&amp;f=1&amp;ui=6010069360965-id_51ddd04f4b2ff8432881967&amp;en=1&amp;a=0&amp;sig=120709&amp;__tn__=xywv\" onmousedown=\"return e07e9f7fab52598ed743f8e69b84163d953c06770.call(this, event);\">Get a 6” sub plus a 21 oz. drink for only $4. We LIKE the sound of that!</a></div></div></div><div class=\"inline\"><div class=\"action\"><a class=\"uiIconText emuEventfad_fan _24x\" href=\"#\" style=\"padding-left: 17px;\" rel=\"async-post\" ajaxify=\"/ajax/emu/end.php?eid=AQImwNUhGWEdpxtbkvIo1XeZdXEJCbnUliRgBk-VjzyF9x_sRKX5KkfadkdzeU0OYGCk-6TBWIQSN5KzhOYoKjVlo4kTAXaIrVwpryZutdNpoebhwCxm335cl9OPRfK09xRh4Y0LhYHkwbguwrbCU9Q-xXnQWfSF77ZWyXIVGn1UNoTLBXwEVFVOTa4cx0J1ahfjWT78k25lBrHWBgosZ6OIfarUrONZma0tgqTA23dfX05cx0d2_-hJmyGJ3oi0-j3kuHdF7pqG6w5V5_hkT1FQ3hdSMhZN-w4U-WLh_Y_mcrtwnWDuSl1BRcLv1IutgYQwnxToVQM5ybpIIWLnaArXiPAcoiCaMdG8TUoj_NhJOfabT5OFaqRc0r_h42Jgbbsgw6zmag-qunA9rZmuDukrfz8B2v3Zxe40tDWjZPkflOc86jOu6qXzOhh988Tqm8_1iJ0HE9F1uHJnZ02Ixn2R6W5ufWmZm1qPkkF9fqSwdqjcxe3zHt892q18k9Q3zshsNZKxJ1clp4-eYVxD1G0v-FF66tMfniEWCbrzZHRhHIKBNn-2_0Omah9tD2FvDBiyK2UNQ2j8rLeapu6grh5xaeTTXA4VN2PaupbwY51nqoKgZF5K-OCLLgVOgmg26iYtq0SmvQ-iYZZke3YFfzhmNku9b_uDx5Kybyb3zI9M7ZZb3gBSbIjixin2vCo-KXqCy0QZ9NEGx3N2qY8tdpYSQ771yiMQuVrs4-C202l4rzLoqQ2wb_MmQph6g3gg2XtzNAksclUHD7ow2jObx9XduHIbOoNF97W8DqXbPf155_eeNLApheFI8ylWSFnl054AGnzXB6yM-IcB-1ywdLU2eikQ5HhPrTC0xjlEX1Oa_CJYOnHcoCCYmXWjeAyGPwYC4mA4OA83LUFiGFrY3l7Ktauyjs236xp9fYDl-\\-\\nxDgO1rP8Bm85L4cgE_hJ2xorp56xzHaj23PcAGj96HJwiw5O5TcyN4fJEsdZlXJKKAT0augBxDLo3Kia2tDrSJ5Y41nBmqvaPUnaGLz06VWI_OYm8kWlzzszKL_EwYlzhraKQ79ERahSXdSgX8T83Ssnyx8FZW2HMckb5QDAejgDSon2tNiRDdLSqtnEb4ITvknaS4P6WFxzAiimm_e0Vd7A&amp;f=0&amp;ui=6010069360965-id_51ddd04f4b2ff8432881967&amp;en=fad_fan&amp;ed=224383614973&amp;a=1&amp;__tn__=wv\" role=\"button\"><i class=\"img sp_4p6kmz sx_bc56c4\" style=\"top: 1px;\"></i>Like</a> · <span class=\"fbEmuContext\">23,400,426 people like <script type=\"text/javascript\">try {\n    ((JSBNG_Record.scriptLoad)((\"function e664100ebff51c05e6dafbc19a2bccf88e62aa45a(event) {\\u000a    var meta = document.getElementById(\\\"meta_referrer\\\");\\u000a    meta.content = \\\"origin\\\";\\u000a    setTimeout(function() {\\u000a        meta.content = \\\"default\\\";\\u000a    }, 100);\\u000a    var attribute = \\\"href\\\";\\u000a    var ms = this.getAttribute(attribute).match(/([\\\\\\\\?|&]f=)([^&]*)/);\\u000a    if (ms) {\\u000a        this.setAttribute(attribute, this.getAttribute(attribute).replace(/[\\\\\\\\?|&]f=[^&]*/, (ms[1] + 0)));\\u000a    }\\u000a;\\u000a;\\u000a    var attribute = \\\"href\\\";\\u000a    var sig = this.getAttribute(attribute).match(/([\\\\\\\\?|&]sig=)([^&]*)/);\\u000a    if (sig) {\\u000a        this.setAttribute(attribute, this.getAttribute(attribute).replace(/[\\\\\\\\?|&]sig=[^&]*/, (sig[1] + ((Math.floor((Math.random() * 65535)) + 65536)))));\\u000a    }\\u000a;\\u000a;\\u000a};\"), (\"s6ebf5856f286bcd9bb382f2d96b287fdbdaf580d\")));\n    ((window.top.JSBNG_Record.callerJS) = (true));\n    function e664100ebff51c05e6dafbc19a2bccf88e62aa45a(JSBNG__event) {\n        if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n            return ((JSBNG_Record.eventCall)((arguments.callee), (\"s6ebf5856f286bcd9bb382f2d96b287fdbdaf580d_0\"), (s6ebf5856f286bcd9bb382f2d96b287fdbdaf580d_0_instance), (this), (arguments)))\n        };\n        (null);\n        var meta = (((JSBNG_Record.get)(JSBNG__document, (\"getElementById\")))[(\"getElementById\")])(\"meta_referrer\");\n        ((JSBNG_Record.set)(meta, (\"JSBNG__content\"), \"origin\"));\n        JSBNG__setTimeout(((function() {\n            var s6ebf5856f286bcd9bb382f2d96b287fdbdaf580d_1_instance;\n            ((s6ebf5856f286bcd9bb382f2d96b287fdbdaf580d_1_instance) = ((JSBNG_Record.eventInstance)((\"s6ebf5856f286bcd9bb382f2d96b287fdbdaf580d_1\"))));\n            return ((JSBNG_Record.markFunction)((function() {\n                if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n                    return ((JSBNG_Record.eventCall)((arguments.callee), (\"s6ebf5856f286bcd9bb382f2d96b287fdbdaf580d_1\"), (s6ebf5856f286bcd9bb382f2d96b287fdbdaf580d_1_instance), (this), (arguments)))\n                };\n                (null);\n                ((JSBNG_Record.set)(meta, (\"JSBNG__content\"), \"default\"));\n            })));\n        })()), 100);\n        var attribute = \"href\";\n        var ms = (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"match\")))[(\"match\")])(/([\\\\?|&]f=)([^&]*)/);\n        if (ms) {\n            (((JSBNG_Record.get)(this, (\"setAttribute\")))[(\"setAttribute\")])(attribute, (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"replace\")))[(\"replace\")])(/[\\\\?|&]f=[^&]*/, ((((JSBNG_Record.get)(ms, 1))[1]) + 0)));\n        }\n        ;\n        ;\n        var attribute = \"href\";\n        var sig = (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"match\")))[(\"match\")])(/([\\\\?|&]sig=)([^&]*)/);\n        if (sig) {\n            (((JSBNG_Record.get)(this, (\"setAttribute\")))[(\"setAttribute\")])(attribute, (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"replace\")))[(\"replace\")])(/[\\\\?|&]sig=[^&]*/, ((((JSBNG_Record.get)(sig, 1))[1]) + (((((JSBNG_Record.get)(Math, (\"floor\")))[(\"floor\")])(((((JSBNG_Record.get)(Math, (\"JSBNG__random\")))[(\"JSBNG__random\")])() * 65535)) + 65536)))));\n        }\n        ;\n        ;\n    };\n    var s6ebf5856f286bcd9bb382f2d96b287fdbdaf580d_0_instance;\n    ((s6ebf5856f286bcd9bb382f2d96b287fdbdaf580d_0_instance) = ((JSBNG_Record.eventInstance)((\"s6ebf5856f286bcd9bb382f2d96b287fdbdaf580d_0\"))));\n    ((JSBNG_Record.markFunction)((e664100ebff51c05e6dafbc19a2bccf88e62aa45a)));\n} finally {\n    ((window.top.JSBNG_Record.callerJS) = (false));\n    ((window.top.JSBNG_Record.flushDeferredEvents)());\n};</script><a class=\"emuEventfad_pageclick _24x\" href=\"/ajax/emu/end.php?eid=AQImwNUhGWEdpxtbkvIo1XeZdXEJCbnUliRgBk-VjzyF9x_sRKX5KkfadkdzeU0OYGCk-6TBWIQSN5KzhOYoKjVlo4kTAXaIrVwpryZutdNpoebhwCxm335cl9OPRfK09xRh4Y0LhYHkwbguwrbCU9Q-xXnQWfSF77ZWyXIVGn1UNoTLBXwEVFVOTa4cx0J1ahfjWT78k25lBrHWBgosZ6OIfarUrONZma0tgqTA23dfX05cx0d2_-hJmyGJ3oi0-j3kuHdF7pqG6w5V5_hkT1FQ3hdSMhZN-w4U-WLh_Y_mcrtwnWDuSl1BRcLv1IutgYQwnxToVQM5ybpIIWLnaArXiPAcoiCaMdG8TUoj_NhJOfabT5OFaqRc0r_h42Jgbbsgw6zmag-qunA9rZmuDukrfz8B2v3Zxe40tDWjZPkflOc86jOu6qXzOhh988Tqm8_1iJ0HE9F1uHJnZ02Ixn2R6W5ufWmZm1qPkkF9fqSwdqjcxe3zHt892q18k9Q3zshsNZKxJ1clp4-eYVxD1G0v-FF66tMfniEWCbrzZHRhHIKBNn-2_0Omah9tD2FvDBiyK2UNQ2j8rLeapu6grh5xaeTTXA4VN2PaupbwY51nqoKgZF5K-OCLLgVOgmg26iYtq0SmvQ-iYZZke3YFfzhmNku9b_uDx5Kybyb3zI9M7ZZb3gBSbIjixin2vCo-KXqCy0QZ9NEGx3N2qY8tdpYSQ771yiMQuVrs4-C202l4rzLoqQ2wb_MmQph6g3gg2XtzNAksclUHD7ow2jObx9XduHIbOoNF97W8DqXbPf155_eeNLApheFI8ylWSFnl054AGnzXB6yM-IcB-1ywdLU2eikQ5HhPrTC0xjlEX1Oa_CJYOnHcoCCYmXWjeAyGPwYC4mA4OA83LUFiGFrY3l7Ktauyjs236xp9fYDl-\\-\\nxDgO1rP8Bm85L4cgE_hJ2xorp56xzHaj23PcAGj96HJwiw5O5TcyN4fJEsdZlXJKKAT0augBxDLo3Kia2tDrSJ5Y41nBmqvaPUnaGLz06VWI_OYm8kWlzzszKL_EwYlzhraKQ79ERahSXdSgX8T83Ssnyx8FZW2HMckb5QDAejgDSon2tNiRDdLSqtnEb4ITvknaS4P6WFxzAiimm_e0Vd7A&amp;f=1&amp;ui=6010069360965-id_51ddd04f4b2ff8432881967&amp;en=fad_pageclick&amp;ed=224383614973&amp;a=0&amp;mac=AQLzHrsk6DRltR9j&amp;sig=121392&amp;__tn__=zwv\" onmousedown=\"return e664100ebff51c05e6dafbc19a2bccf88e62aa45a.call(this, event);\">Subway</a>.</span></div></div></div></div></div><div class=\"ego_unit\" data-ego-fbid=\"6008291652839\"><div class=\"_4u8\" data-ad=\"&#123;&quot;adid&quot;:6008291652839,&quot;segment&quot;:&quot;market&quot;&#125;\" id=\"6008291652839-id_51ddd04f4b40f3b54921268\"><div class=\"_24n _24y\"><div class=\"uiSelector inlineBlock emu_x emuEventfad_hide _24x uiSelectorRight\"><div class=\"uiToggle wrap\"><a class=\"uiSelectorButton uiCloseButton uiCloseButtonSmall\" href=\"#\" role=\"button\" title=\"About Facebook Ads\" rel=\"toggle\" ajaxify=\"/ajax/emu/end.php?eid=AQLU3ia2O2tSXcTyZF1S-m9ygoUHiN3bm1ko05o4JTKBeSUdBGMvDM9NFdb665C7Omjd8pBKRBujLFSfEs2pyk0VuuZULVUDMANj_CxfQ4olt9vV8kPyMKtOdYXzEZhHhTSnPb6x-GRdfaMiJgbCQWTGEMNt_zGVfL9wnfzHkyG7SLjHcj0oYPQIn57OvP-jym7jA_aLhuMMPt2nmJUiZr6oiJioS8zTo_5uRy92fACLirEu1NaVSmHZ6maRJO_wl7fGRFNPABOVagzRGyRDYxDrM3y3at3tIjh85q3g_fZosaZ6do85XNoXrLs7E19IQONnT35cpCsJwcTnufpDUmxzzxwzcn8v_Ljx8iDT6_OB3IHHCx1NSMRXpGcuHLbWEvhYwQ4Zw5cDOfaxO-FM6mdlCNmrwnXSuMOxNeYLh9mrvx0ZauKzEbgW4OM5XPKaXbBeGA_2xk3LvIS2pLyI64ZZ5LhlhNDURh3sxm9KtT71-BDzVN11ub-Ss8dRFHIdgflTiHpEgDCK2Y0EGeEePyk2t5BZSmMU5_VG7cWIfE19SKkgiGdpUvJ589nczcPTSlxzHrOYrUvuAEIOszwO8HQ_c5-C-iyC3oMzyuEpUH-w22Al4tM2rRpVMq7j_lmzWFYfms6qDSpWUuzH_pD1fkXlJ95W68vQkIeHMo8EPchdVBprsdhM6moT_bBuei2OaqthIa075zQoiKGy8992jBq2XnY7ucwiWsPtTu9tkniXf4DOwR4lxw-UuAi4gs0R05wFS2KmlQq8BrJLtQR2n4xP3QZRpt1RVMjNSkScHUg0ijLJTaX8wm2mI35QggY4UZLKy0ge9iYRW-Q5CDjr6IhTJTnnCQsf4WRWgbQmD2BQCDUbSEbLjSCahTyn3vlzvTGNCzdxzvGJQhuH1wvZnrhwlfbeMtf7RatnLXBdVpFn0cn6_y60J7ZnHPsRPs7xNa1rAJyT3je8nZ44pXP6sWX3xOK254R7xy4iLFrbU0Cu3i4DwACvxT7feEwdqffxIqOUgS8yzToxFDMF-39PfWKqblBId2IiHARQu1uzY9QByj7Z4uf0GHK954XZ6-1a_ykWvdVPC_h3sb_2zoHTNK1uR_XNvrq8_xTALaqZNcrbEmo5brUvzkqOqCH5ZsTEwmTyara0pzUHrQdMkTw0_VGav5oQwUq7xD4X3ptEXQMcmQ&amp;f=0&amp;ui=6008291652839-id_51ddd04f4b40f3b54921268&amp;en=fad_hide&amp;ed=true&amp;a=1&amp;__tn__=v\" aria-haspopup=\"1\"></a></div></div><div class=\"title\"><script type=\"text/javascript\">try {\n    ((JSBNG_Record.scriptLoad)((\"function e9f5b9a2bb214f2d447f31c696aa483359e5984ac(event) {\\u000a    var meta = document.getElementById(\\\"meta_referrer\\\");\\u000a    meta.content = \\\"origin\\\";\\u000a    setTimeout(function() {\\u000a        meta.content = \\\"default\\\";\\u000a    }, 100);\\u000a    var attribute = \\\"href\\\";\\u000a    var ms = this.getAttribute(attribute).match(/([\\\\\\\\?|&]f=)([^&]*)/);\\u000a    if (ms) {\\u000a        this.setAttribute(attribute, this.getAttribute(attribute).replace(/[\\\\\\\\?|&]f=[^&]*/, (ms[1] + 0)));\\u000a    }\\u000a;\\u000a;\\u000a    var attribute = \\\"href\\\";\\u000a    var sig = this.getAttribute(attribute).match(/([\\\\\\\\?|&]sig=)([^&]*)/);\\u000a    if (sig) {\\u000a        this.setAttribute(attribute, this.getAttribute(attribute).replace(/[\\\\\\\\?|&]sig=[^&]*/, (sig[1] + ((Math.floor((Math.random() * 65535)) + 65536)))));\\u000a    }\\u000a;\\u000a;\\u000a};\"), (\"s75fe50d6f9bf6ca100345c70e228d1faf3165a0b\")));\n    ((window.top.JSBNG_Record.callerJS) = (true));\n    function e9f5b9a2bb214f2d447f31c696aa483359e5984ac(JSBNG__event) {\n        if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n            return ((JSBNG_Record.eventCall)((arguments.callee), (\"s75fe50d6f9bf6ca100345c70e228d1faf3165a0b_0\"), (s75fe50d6f9bf6ca100345c70e228d1faf3165a0b_0_instance), (this), (arguments)))\n        };\n        (null);\n        var meta = (((JSBNG_Record.get)(JSBNG__document, (\"getElementById\")))[(\"getElementById\")])(\"meta_referrer\");\n        ((JSBNG_Record.set)(meta, (\"JSBNG__content\"), \"origin\"));\n        JSBNG__setTimeout(((function() {\n            var s75fe50d6f9bf6ca100345c70e228d1faf3165a0b_1_instance;\n            ((s75fe50d6f9bf6ca100345c70e228d1faf3165a0b_1_instance) = ((JSBNG_Record.eventInstance)((\"s75fe50d6f9bf6ca100345c70e228d1faf3165a0b_1\"))));\n            return ((JSBNG_Record.markFunction)((function() {\n                if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n                    return ((JSBNG_Record.eventCall)((arguments.callee), (\"s75fe50d6f9bf6ca100345c70e228d1faf3165a0b_1\"), (s75fe50d6f9bf6ca100345c70e228d1faf3165a0b_1_instance), (this), (arguments)))\n                };\n                (null);\n                ((JSBNG_Record.set)(meta, (\"JSBNG__content\"), \"default\"));\n            })));\n        })()), 100);\n        var attribute = \"href\";\n        var ms = (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"match\")))[(\"match\")])(/([\\\\?|&]f=)([^&]*)/);\n        if (ms) {\n            (((JSBNG_Record.get)(this, (\"setAttribute\")))[(\"setAttribute\")])(attribute, (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"replace\")))[(\"replace\")])(/[\\\\?|&]f=[^&]*/, ((((JSBNG_Record.get)(ms, 1))[1]) + 0)));\n        }\n        ;\n        ;\n        var attribute = \"href\";\n        var sig = (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"match\")))[(\"match\")])(/([\\\\?|&]sig=)([^&]*)/);\n        if (sig) {\n            (((JSBNG_Record.get)(this, (\"setAttribute\")))[(\"setAttribute\")])(attribute, (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"replace\")))[(\"replace\")])(/[\\\\?|&]sig=[^&]*/, ((((JSBNG_Record.get)(sig, 1))[1]) + (((((JSBNG_Record.get)(Math, (\"floor\")))[(\"floor\")])(((((JSBNG_Record.get)(Math, (\"JSBNG__random\")))[(\"JSBNG__random\")])() * 65535)) + 65536)))));\n        }\n        ;\n        ;\n    };\n    var s75fe50d6f9bf6ca100345c70e228d1faf3165a0b_0_instance;\n    ((s75fe50d6f9bf6ca100345c70e228d1faf3165a0b_0_instance) = ((JSBNG_Record.eventInstance)((\"s75fe50d6f9bf6ca100345c70e228d1faf3165a0b_0\"))));\n    ((JSBNG_Record.markFunction)((e9f5b9a2bb214f2d447f31c696aa483359e5984ac)));\n} finally {\n    ((window.top.JSBNG_Record.callerJS) = (false));\n    ((window.top.JSBNG_Record.flushDeferredEvents)());\n};</script><a class=\"forceLTR emuEvent1 _24x\" href=\"/ajax/emu/end.php?eid=AQLU3ia2O2tSXcTyZF1S-m9ygoUHiN3bm1ko05o4JTKBeSUdBGMvDM9NFdb665C7Omjd8pBKRBujLFSfEs2pyk0VuuZULVUDMANj_CxfQ4olt9vV8kPyMKtOdYXzEZhHhTSnPb6x-GRdfaMiJgbCQWTGEMNt_zGVfL9wnfzHkyG7SLjHcj0oYPQIn57OvP-jym7jA_aLhuMMPt2nmJUiZr6oiJioS8zTo_5uRy92fACLirEu1NaVSmHZ6maRJO_wl7fGRFNPABOVagzRGyRDYxDrM3y3at3tIjh85q3g_fZosaZ6do85XNoXrLs7E19IQONnT35cpCsJwcTnufpDUmxzzxwzcn8v_Ljx8iDT6_OB3IHHCx1NSMRXpGcuHLbWEvhYwQ4Zw5cDOfaxO-FM6mdlCNmrwnXSuMOxNeYLh9mrvx0ZauKzEbgW4OM5XPKaXbBeGA_2xk3LvIS2pLyI64ZZ5LhlhNDURh3sxm9KtT71-BDzVN11ub-Ss8dRFHIdgflTiHpEgDCK2Y0EGeEePyk2t5BZSmMU5_VG7cWIfE19SKkgiGdpUvJ589nczcPTSlxzHrOYrUvuAEIOszwO8HQ_c5-C-iyC3oMzyuEpUH-w22Al4tM2rRpVMq7j_lmzWFYfms6qDSpWUuzH_pD1fkXlJ95W68vQkIeHMo8EPchdVBprsdhM6moT_bBuei2OaqthIa075zQoiKGy8992jBq2XnY7ucwiWsPtTu9tkniXf4DOwR4lxw-UuAi4gs0R05wFS2KmlQq8BrJLtQR2n4xP3QZRpt1RVMjNSkScHUg0ijLJTaX8wm2mI35QggY4UZLKy0ge9iYRW-Q5CDjr6IhTJTnnCQsf4WRWgbQmD2BQCDUbSEbLjSCahTyn3vlzvTGNCzdxzvGJQhuH1wvZnrhwlfbeMtf7RatnLXBdVpFn0cn6_y60J7ZnHPsRPs7xNa1rAJyT3je8nZ44pXP6sWX3xOK254R7xy4iLFrbU0Cu3i4DwACvxT7feEwdqffxIqOUgS8yzToxFDMF-39PfWKqblBId2IiHARQu1uzY9QByj7Z4uf0GHK954XZ6-1a_ykWvdVPC_h3sb_2zoHTNK1uR_XNvrq8_xTALaqZNcrbEmo5brUvzkqOqCH5ZsTEwmTyara0pzUHrQdMkTw0_VGav5oQwUq7xD4X3ptEXQMcmQ&amp;f=1&amp;ui=6008291652839-id_51ddd04f4b40f3b54921268&amp;en=1&amp;a=0&amp;sig=94408&amp;__tn__=wv\" onmousedown=\"return e9f5b9a2bb214f2d447f31c696aa483359e5984ac.call(this, event);\">Ready for Takeoff</a></div><div class=\"clearfix image_body_block\"><script type=\"text/javascript\">try {\n    ((JSBNG_Record.scriptLoad)((\"function efad42820574618f2786b3ec98d96839ac62061f9(event) {\\u000a    var meta = document.getElementById(\\\"meta_referrer\\\");\\u000a    meta.content = \\\"origin\\\";\\u000a    setTimeout(function() {\\u000a        meta.content = \\\"default\\\";\\u000a    }, 100);\\u000a    var attribute = \\\"href\\\";\\u000a    var ms = this.getAttribute(attribute).match(/([\\\\\\\\?|&]f=)([^&]*)/);\\u000a    if (ms) {\\u000a        this.setAttribute(attribute, this.getAttribute(attribute).replace(/[\\\\\\\\?|&]f=[^&]*/, (ms[1] + 0)));\\u000a    }\\u000a;\\u000a;\\u000a    var attribute = \\\"href\\\";\\u000a    var sig = this.getAttribute(attribute).match(/([\\\\\\\\?|&]sig=)([^&]*)/);\\u000a    if (sig) {\\u000a        this.setAttribute(attribute, this.getAttribute(attribute).replace(/[\\\\\\\\?|&]sig=[^&]*/, (sig[1] + ((Math.floor((Math.random() * 65535)) + 65536)))));\\u000a    }\\u000a;\\u000a;\\u000a};\"), (\"sb370ecceb13cfa756cf10a3884c6106ebe13b492\")));\n    ((window.top.JSBNG_Record.callerJS) = (true));\n    function efad42820574618f2786b3ec98d96839ac62061f9(JSBNG__event) {\n        if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n            return ((JSBNG_Record.eventCall)((arguments.callee), (\"sb370ecceb13cfa756cf10a3884c6106ebe13b492_0\"), (sb370ecceb13cfa756cf10a3884c6106ebe13b492_0_instance), (this), (arguments)))\n        };\n        (null);\n        var meta = (((JSBNG_Record.get)(JSBNG__document, (\"getElementById\")))[(\"getElementById\")])(\"meta_referrer\");\n        ((JSBNG_Record.set)(meta, (\"JSBNG__content\"), \"origin\"));\n        JSBNG__setTimeout(((function() {\n            var sb370ecceb13cfa756cf10a3884c6106ebe13b492_1_instance;\n            ((sb370ecceb13cfa756cf10a3884c6106ebe13b492_1_instance) = ((JSBNG_Record.eventInstance)((\"sb370ecceb13cfa756cf10a3884c6106ebe13b492_1\"))));\n            return ((JSBNG_Record.markFunction)((function() {\n                if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n                    return ((JSBNG_Record.eventCall)((arguments.callee), (\"sb370ecceb13cfa756cf10a3884c6106ebe13b492_1\"), (sb370ecceb13cfa756cf10a3884c6106ebe13b492_1_instance), (this), (arguments)))\n                };\n                (null);\n                ((JSBNG_Record.set)(meta, (\"JSBNG__content\"), \"default\"));\n            })));\n        })()), 100);\n        var attribute = \"href\";\n        var ms = (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"match\")))[(\"match\")])(/([\\\\?|&]f=)([^&]*)/);\n        if (ms) {\n            (((JSBNG_Record.get)(this, (\"setAttribute\")))[(\"setAttribute\")])(attribute, (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"replace\")))[(\"replace\")])(/[\\\\?|&]f=[^&]*/, ((((JSBNG_Record.get)(ms, 1))[1]) + 0)));\n        }\n        ;\n        ;\n        var attribute = \"href\";\n        var sig = (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"match\")))[(\"match\")])(/([\\\\?|&]sig=)([^&]*)/);\n        if (sig) {\n            (((JSBNG_Record.get)(this, (\"setAttribute\")))[(\"setAttribute\")])(attribute, (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"replace\")))[(\"replace\")])(/[\\\\?|&]sig=[^&]*/, ((((JSBNG_Record.get)(sig, 1))[1]) + (((((JSBNG_Record.get)(Math, (\"floor\")))[(\"floor\")])(((((JSBNG_Record.get)(Math, (\"JSBNG__random\")))[(\"JSBNG__random\")])() * 65535)) + 65536)))));\n        }\n        ;\n        ;\n    };\n    var sb370ecceb13cfa756cf10a3884c6106ebe13b492_0_instance;\n    ((sb370ecceb13cfa756cf10a3884c6106ebe13b492_0_instance) = ((JSBNG_Record.eventInstance)((\"sb370ecceb13cfa756cf10a3884c6106ebe13b492_0\"))));\n    ((JSBNG_Record.markFunction)((efad42820574618f2786b3ec98d96839ac62061f9)));\n} finally {\n    ((window.top.JSBNG_Record.callerJS) = (false));\n    ((window.top.JSBNG_Record.flushDeferredEvents)());\n};</script><a class=\"forceLTR emuEvent1 _24x image fbEmuImage _8o _8s lfloat\" tabindex=\"-1\" href=\"/ajax/emu/end.php?eid=AQLU3ia2O2tSXcTyZF1S-m9ygoUHiN3bm1ko05o4JTKBeSUdBGMvDM9NFdb665C7Omjd8pBKRBujLFSfEs2pyk0VuuZULVUDMANj_CxfQ4olt9vV8kPyMKtOdYXzEZhHhTSnPb6x-GRdfaMiJgbCQWTGEMNt_zGVfL9wnfzHkyG7SLjHcj0oYPQIn57OvP-jym7jA_aLhuMMPt2nmJUiZr6oiJioS8zTo_5uRy92fACLirEu1NaVSmHZ6maRJO_wl7fGRFNPABOVagzRGyRDYxDrM3y3at3tIjh85q3g_fZosaZ6do85XNoXrLs7E19IQONnT35cpCsJwcTnufpDUmxzzxwzcn8v_Ljx8iDT6_OB3IHHCx1NSMRXpGcuHLbWEvhYwQ4Zw5cDOfaxO-FM6mdlCNmrwnXSuMOxNeYLh9mrvx0ZauKzEbgW4OM5XPKaXbBeGA_2xk3LvIS2pLyI64ZZ5LhlhNDURh3sxm9KtT71-BDzVN11ub-Ss8dRFHIdgflTiHpEgDCK2Y0EGeEePyk2t5BZSmMU5_VG7cWIfE19SKkgiGdpUvJ589nczcPTSlxzHrOYrUvuAEIOszwO8HQ_c5-C-iyC3oMzyuEpUH-w22Al4tM2rRpVMq7j_lmzWFYfms6qDSpWUuzH_pD1fkXlJ95W68vQkIeHMo8EPchdVBprsdhM6moT_bBuei2OaqthIa075zQoiKGy8992jBq2XnY7ucwiWsPtTu9tkniXf4DOwR4lxw-UuAi4gs0R05wFS2KmlQq8BrJLtQR2n4xP3QZRpt1RVMjNSkScHUg0ijLJTaX8wm2mI35QggY4UZLKy0ge9iYRW-Q5CDjr6IhTJTnnCQsf4WRWgbQmD2BQCDUbSEbLjSCahTyn3vlzvTGNCzdxzvGJQhuH1wvZnrhwlfbeMtf7RatnLXBdVpFn0cn6_y60J7ZnHPsRPs7xNa1rAJyT3je8nZ44pXP6sWX3xOK254R7xy4iLFrbU0Cu3i4DwACvxT7feEwdqffxIqOUgS8yzToxFDMF-39PfWKqblBId2IiHARQu1uzY9QByj7Z4uf0GHK954XZ6-1a_ykWvdVPC_h3sb_2zoHTNK1uR_XNvrq8_xTALaqZNcrbEmo5brUvzkqOqCH5ZsTEwmTyara0pzUHrQdMkTw0_VGav5oQwUq7xD4X3ptEXQMcmQ&amp;f=1&amp;ui=6008291652839-id_51ddd04f4b40f3b54921268&amp;en=1&amp;a=0&amp;sig=119219&amp;__tn__=ywv\" onmousedown=\"return efad42820574618f2786b3ec98d96839ac62061f9.call(this, event);\" aria-hidden=\"true\"><img class=\"img\" src=\"http://jsbngssl.fbcdn-creative-a.akamaihd.net/hads-ak-prn1/s110x80/735355_6008290657639_943178325_n.png\" alt=\"\" /></a><div class=\"_42ef\"><div class=\"body\"><script type=\"text/javascript\">try {\n    ((JSBNG_Record.scriptLoad)((\"function e63e9ebe2ed33002bd5f78cae16e80b40f25418dc(event) {\\u000a    var meta = document.getElementById(\\\"meta_referrer\\\");\\u000a    meta.content = \\\"origin\\\";\\u000a    setTimeout(function() {\\u000a        meta.content = \\\"default\\\";\\u000a    }, 100);\\u000a    var attribute = \\\"href\\\";\\u000a    var ms = this.getAttribute(attribute).match(/([\\\\\\\\?|&]f=)([^&]*)/);\\u000a    if (ms) {\\u000a        this.setAttribute(attribute, this.getAttribute(attribute).replace(/[\\\\\\\\?|&]f=[^&]*/, (ms[1] + 0)));\\u000a    }\\u000a;\\u000a;\\u000a    var attribute = \\\"href\\\";\\u000a    var sig = this.getAttribute(attribute).match(/([\\\\\\\\?|&]sig=)([^&]*)/);\\u000a    if (sig) {\\u000a        this.setAttribute(attribute, this.getAttribute(attribute).replace(/[\\\\\\\\?|&]sig=[^&]*/, (sig[1] + ((Math.floor((Math.random() * 65535)) + 65536)))));\\u000a    }\\u000a;\\u000a;\\u000a};\"), (\"sace79e7de15493d3d3ca9e7d3b33a9b9c7cb1b73\")));\n    ((window.top.JSBNG_Record.callerJS) = (true));\n    function e63e9ebe2ed33002bd5f78cae16e80b40f25418dc(JSBNG__event) {\n        if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n            return ((JSBNG_Record.eventCall)((arguments.callee), (\"sace79e7de15493d3d3ca9e7d3b33a9b9c7cb1b73_0\"), (sace79e7de15493d3d3ca9e7d3b33a9b9c7cb1b73_0_instance), (this), (arguments)))\n        };\n        (null);\n        var meta = (((JSBNG_Record.get)(JSBNG__document, (\"getElementById\")))[(\"getElementById\")])(\"meta_referrer\");\n        ((JSBNG_Record.set)(meta, (\"JSBNG__content\"), \"origin\"));\n        JSBNG__setTimeout(((function() {\n            var sace79e7de15493d3d3ca9e7d3b33a9b9c7cb1b73_1_instance;\n            ((sace79e7de15493d3d3ca9e7d3b33a9b9c7cb1b73_1_instance) = ((JSBNG_Record.eventInstance)((\"sace79e7de15493d3d3ca9e7d3b33a9b9c7cb1b73_1\"))));\n            return ((JSBNG_Record.markFunction)((function() {\n                if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n                    return ((JSBNG_Record.eventCall)((arguments.callee), (\"sace79e7de15493d3d3ca9e7d3b33a9b9c7cb1b73_1\"), (sace79e7de15493d3d3ca9e7d3b33a9b9c7cb1b73_1_instance), (this), (arguments)))\n                };\n                (null);\n                ((JSBNG_Record.set)(meta, (\"JSBNG__content\"), \"default\"));\n            })));\n        })()), 100);\n        var attribute = \"href\";\n        var ms = (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"match\")))[(\"match\")])(/([\\\\?|&]f=)([^&]*)/);\n        if (ms) {\n            (((JSBNG_Record.get)(this, (\"setAttribute\")))[(\"setAttribute\")])(attribute, (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"replace\")))[(\"replace\")])(/[\\\\?|&]f=[^&]*/, ((((JSBNG_Record.get)(ms, 1))[1]) + 0)));\n        }\n        ;\n        ;\n        var attribute = \"href\";\n        var sig = (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"match\")))[(\"match\")])(/([\\\\?|&]sig=)([^&]*)/);\n        if (sig) {\n            (((JSBNG_Record.get)(this, (\"setAttribute\")))[(\"setAttribute\")])(attribute, (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"replace\")))[(\"replace\")])(/[\\\\?|&]sig=[^&]*/, ((((JSBNG_Record.get)(sig, 1))[1]) + (((((JSBNG_Record.get)(Math, (\"floor\")))[(\"floor\")])(((((JSBNG_Record.get)(Math, (\"JSBNG__random\")))[(\"JSBNG__random\")])() * 65535)) + 65536)))));\n        }\n        ;\n        ;\n    };\n    var sace79e7de15493d3d3ca9e7d3b33a9b9c7cb1b73_0_instance;\n    ((sace79e7de15493d3d3ca9e7d3b33a9b9c7cb1b73_0_instance) = ((JSBNG_Record.eventInstance)((\"sace79e7de15493d3d3ca9e7d3b33a9b9c7cb1b73_0\"))));\n    ((JSBNG_Record.markFunction)((e63e9ebe2ed33002bd5f78cae16e80b40f25418dc)));\n} finally {\n    ((window.top.JSBNG_Record.callerJS) = (false));\n    ((window.top.JSBNG_Record.flushDeferredEvents)());\n};</script><a class=\"forceLTR emuEvent1 _24x\" href=\"/ajax/emu/end.php?eid=AQLU3ia2O2tSXcTyZF1S-m9ygoUHiN3bm1ko05o4JTKBeSUdBGMvDM9NFdb665C7Omjd8pBKRBujLFSfEs2pyk0VuuZULVUDMANj_CxfQ4olt9vV8kPyMKtOdYXzEZhHhTSnPb6x-GRdfaMiJgbCQWTGEMNt_zGVfL9wnfzHkyG7SLjHcj0oYPQIn57OvP-jym7jA_aLhuMMPt2nmJUiZr6oiJioS8zTo_5uRy92fACLirEu1NaVSmHZ6maRJO_wl7fGRFNPABOVagzRGyRDYxDrM3y3at3tIjh85q3g_fZosaZ6do85XNoXrLs7E19IQONnT35cpCsJwcTnufpDUmxzzxwzcn8v_Ljx8iDT6_OB3IHHCx1NSMRXpGcuHLbWEvhYwQ4Zw5cDOfaxO-FM6mdlCNmrwnXSuMOxNeYLh9mrvx0ZauKzEbgW4OM5XPKaXbBeGA_2xk3LvIS2pLyI64ZZ5LhlhNDURh3sxm9KtT71-BDzVN11ub-Ss8dRFHIdgflTiHpEgDCK2Y0EGeEePyk2t5BZSmMU5_VG7cWIfE19SKkgiGdpUvJ589nczcPTSlxzHrOYrUvuAEIOszwO8HQ_c5-C-iyC3oMzyuEpUH-w22Al4tM2rRpVMq7j_lmzWFYfms6qDSpWUuzH_pD1fkXlJ95W68vQkIeHMo8EPchdVBprsdhM6moT_bBuei2OaqthIa075zQoiKGy8992jBq2XnY7ucwiWsPtTu9tkniXf4DOwR4lxw-UuAi4gs0R05wFS2KmlQq8BrJLtQR2n4xP3QZRpt1RVMjNSkScHUg0ijLJTaX8wm2mI35QggY4UZLKy0ge9iYRW-Q5CDjr6IhTJTnnCQsf4WRWgbQmD2BQCDUbSEbLjSCahTyn3vlzvTGNCzdxzvGJQhuH1wvZnrhwlfbeMtf7RatnLXBdVpFn0cn6_y60J7ZnHPsRPs7xNa1rAJyT3je8nZ44pXP6sWX3xOK254R7xy4iLFrbU0Cu3i4DwACvxT7feEwdqffxIqOUgS8yzToxFDMF-39PfWKqblBId2IiHARQu1uzY9QByj7Z4uf0GHK954XZ6-1a_ykWvdVPC_h3sb_2zoHTNK1uR_XNvrq8_xTALaqZNcrbEmo5brUvzkqOqCH5ZsTEwmTyara0pzUHrQdMkTw0_VGav5oQwUq7xD4X3ptEXQMcmQ&amp;f=1&amp;ui=6008291652839-id_51ddd04f4b40f3b54921268&amp;en=1&amp;a=0&amp;sig=66210&amp;__tn__=xywv\" onmousedown=\"return e63e9ebe2ed33002bd5f78cae16e80b40f25418dc.call(this, event);\">Let imaginations soar with Walmart toys. &quot;Like&quot; us if you love to see them smile.</a></div></div></div><div class=\"inline\"><div class=\"action\"><a class=\"uiIconText emuEventfad_fan _24x\" href=\"#\" style=\"padding-left: 17px;\" rel=\"async-post\" ajaxify=\"/ajax/emu/end.php?eid=AQLU3ia2O2tSXcTyZF1S-m9ygoUHiN3bm1ko05o4JTKBeSUdBGMvDM9NFdb665C7Omjd8pBKRBujLFSfEs2pyk0VuuZULVUDMANj_CxfQ4olt9vV8kPyMKtOdYXzEZhHhTSnPb6x-GRdfaMiJgbCQWTGEMNt_zGVfL9wnfzHkyG7SLjHcj0oYPQIn57OvP-jym7jA_aLhuMMPt2nmJUiZr6oiJioS8zTo_5uRy92fACLirEu1NaVSmHZ6maRJO_wl7fGRFNPABOVagzRGyRDYxDrM3y3at3tIjh85q3g_fZosaZ6do85XNoXrLs7E19IQONnT35cpCsJwcTnufpDUmxzzxwzcn8v_Ljx8iDT6_OB3IHHCx1NSMRXpGcuHLbWEvhYwQ4Zw5cDOfaxO-FM6mdlCNmrwnXSuMOxNeYLh9mrvx0ZauKzEbgW4OM5XPKaXbBeGA_2xk3LvIS2pLyI64ZZ5LhlhNDURh3sxm9KtT71-BDzVN11ub-Ss8dRFHIdgflTiHpEgDCK2Y0EGeEePyk2t5BZSmMU5_VG7cWIfE19SKkgiGdpUvJ589nczcPTSlxzHrOYrUvuAEIOszwO8HQ_c5-C-iyC3oMzyuEpUH-w22Al4tM2rRpVMq7j_lmzWFYfms6qDSpWUuzH_pD1fkXlJ95W68vQkIeHMo8EPchdVBprsdhM6moT_bBuei2OaqthIa075zQoiKGy8992jBq2XnY7ucwiWsPtTu9tkniXf4DOwR4lxw-UuAi4gs0R05wFS2KmlQq8BrJLtQR2n4xP3QZRpt1RVMjNSkScHUg0ijLJTaX8wm2mI35QggY4UZLKy0ge9iYRW-Q5CDjr6IhTJTnnCQsf4WRWgbQmD2BQCDUbSEbLjSCahTyn3vlzvTGNCzdxzvGJQhuH1wvZnrhwlfbeMtf7RatnLXBdVpFn0cn6_y60J7ZnHPsRPs7xNa1rAJyT3je8nZ44pXP6sWX3xOK254R7xy4iLFrbU0Cu3i4DwACvxT7feEwdqffxIqOUgS8yzToxFDMF-39PfWKqblBId2IiHARQu1uzY9QByj7Z4uf0GHK954XZ6-1a_ykWvdVPC_h3sb_2zoHTNK1uR_XNvrq8_xTALaqZNcrbEmo5brUvzkqOqCH5ZsTEwmTyara0pzUHrQdMkTw0_VGav5oQwUq7xD4X3ptEXQMcmQ&amp;f=0&amp;ui=6008291652839-id_51ddd04f4b40f3b54921268&amp;en=fad_fan&amp;ed=159616034235&amp;a=1&amp;__tn__=wv\" role=\"button\"><i class=\"img sp_4p6kmz sx_bc56c4\" style=\"top: 1px;\"></i>Like</a> · <span class=\"fbEmuContext\">30,985,226 people like <script type=\"text/javascript\">try {\n    ((JSBNG_Record.scriptLoad)((\"function eef522934aeea21d4a13209dbba299f1e37e568d6(event) {\\u000a    var meta = document.getElementById(\\\"meta_referrer\\\");\\u000a    meta.content = \\\"origin\\\";\\u000a    setTimeout(function() {\\u000a        meta.content = \\\"default\\\";\\u000a    }, 100);\\u000a    var attribute = \\\"href\\\";\\u000a    var ms = this.getAttribute(attribute).match(/([\\\\\\\\?|&]f=)([^&]*)/);\\u000a    if (ms) {\\u000a        this.setAttribute(attribute, this.getAttribute(attribute).replace(/[\\\\\\\\?|&]f=[^&]*/, (ms[1] + 0)));\\u000a    }\\u000a;\\u000a;\\u000a    var attribute = \\\"href\\\";\\u000a    var sig = this.getAttribute(attribute).match(/([\\\\\\\\?|&]sig=)([^&]*)/);\\u000a    if (sig) {\\u000a        this.setAttribute(attribute, this.getAttribute(attribute).replace(/[\\\\\\\\?|&]sig=[^&]*/, (sig[1] + ((Math.floor((Math.random() * 65535)) + 65536)))));\\u000a    }\\u000a;\\u000a;\\u000a};\"), (\"s5fca977e4aa2da37b129d8b68584c4dff2d3ca27\")));\n    ((window.top.JSBNG_Record.callerJS) = (true));\n    function eef522934aeea21d4a13209dbba299f1e37e568d6(JSBNG__event) {\n        if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n            return ((JSBNG_Record.eventCall)((arguments.callee), (\"s5fca977e4aa2da37b129d8b68584c4dff2d3ca27_0\"), (s5fca977e4aa2da37b129d8b68584c4dff2d3ca27_0_instance), (this), (arguments)))\n        };\n        (null);\n        var meta = (((JSBNG_Record.get)(JSBNG__document, (\"getElementById\")))[(\"getElementById\")])(\"meta_referrer\");\n        ((JSBNG_Record.set)(meta, (\"JSBNG__content\"), \"origin\"));\n        JSBNG__setTimeout(((function() {\n            var s5fca977e4aa2da37b129d8b68584c4dff2d3ca27_1_instance;\n            ((s5fca977e4aa2da37b129d8b68584c4dff2d3ca27_1_instance) = ((JSBNG_Record.eventInstance)((\"s5fca977e4aa2da37b129d8b68584c4dff2d3ca27_1\"))));\n            return ((JSBNG_Record.markFunction)((function() {\n                if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n                    return ((JSBNG_Record.eventCall)((arguments.callee), (\"s5fca977e4aa2da37b129d8b68584c4dff2d3ca27_1\"), (s5fca977e4aa2da37b129d8b68584c4dff2d3ca27_1_instance), (this), (arguments)))\n                };\n                (null);\n                ((JSBNG_Record.set)(meta, (\"JSBNG__content\"), \"default\"));\n            })));\n        })()), 100);\n        var attribute = \"href\";\n        var ms = (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"match\")))[(\"match\")])(/([\\\\?|&]f=)([^&]*)/);\n        if (ms) {\n            (((JSBNG_Record.get)(this, (\"setAttribute\")))[(\"setAttribute\")])(attribute, (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"replace\")))[(\"replace\")])(/[\\\\?|&]f=[^&]*/, ((((JSBNG_Record.get)(ms, 1))[1]) + 0)));\n        }\n        ;\n        ;\n        var attribute = \"href\";\n        var sig = (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"match\")))[(\"match\")])(/([\\\\?|&]sig=)([^&]*)/);\n        if (sig) {\n            (((JSBNG_Record.get)(this, (\"setAttribute\")))[(\"setAttribute\")])(attribute, (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"replace\")))[(\"replace\")])(/[\\\\?|&]sig=[^&]*/, ((((JSBNG_Record.get)(sig, 1))[1]) + (((((JSBNG_Record.get)(Math, (\"floor\")))[(\"floor\")])(((((JSBNG_Record.get)(Math, (\"JSBNG__random\")))[(\"JSBNG__random\")])() * 65535)) + 65536)))));\n        }\n        ;\n        ;\n    };\n    var s5fca977e4aa2da37b129d8b68584c4dff2d3ca27_0_instance;\n    ((s5fca977e4aa2da37b129d8b68584c4dff2d3ca27_0_instance) = ((JSBNG_Record.eventInstance)((\"s5fca977e4aa2da37b129d8b68584c4dff2d3ca27_0\"))));\n    ((JSBNG_Record.markFunction)((eef522934aeea21d4a13209dbba299f1e37e568d6)));\n} finally {\n    ((window.top.JSBNG_Record.callerJS) = (false));\n    ((window.top.JSBNG_Record.flushDeferredEvents)());\n};</script><a class=\"emuEventfad_pageclick _24x\" href=\"/ajax/emu/end.php?eid=AQLU3ia2O2tSXcTyZF1S-m9ygoUHiN3bm1ko05o4JTKBeSUdBGMvDM9NFdb665C7Omjd8pBKRBujLFSfEs2pyk0VuuZULVUDMANj_CxfQ4olt9vV8kPyMKtOdYXzEZhHhTSnPb6x-GRdfaMiJgbCQWTGEMNt_zGVfL9wnfzHkyG7SLjHcj0oYPQIn57OvP-jym7jA_aLhuMMPt2nmJUiZr6oiJioS8zTo_5uRy92fACLirEu1NaVSmHZ6maRJO_wl7fGRFNPABOVagzRGyRDYxDrM3y3at3tIjh85q3g_fZosaZ6do85XNoXrLs7E19IQONnT35cpCsJwcTnufpDUmxzzxwzcn8v_Ljx8iDT6_OB3IHHCx1NSMRXpGcuHLbWEvhYwQ4Zw5cDOfaxO-FM6mdlCNmrwnXSuMOxNeYLh9mrvx0ZauKzEbgW4OM5XPKaXbBeGA_2xk3LvIS2pLyI64ZZ5LhlhNDURh3sxm9KtT71-BDzVN11ub-Ss8dRFHIdgflTiHpEgDCK2Y0EGeEePyk2t5BZSmMU5_VG7cWIfE19SKkgiGdpUvJ589nczcPTSlxzHrOYrUvuAEIOszwO8HQ_c5-C-iyC3oMzyuEpUH-w22Al4tM2rRpVMq7j_lmzWFYfms6qDSpWUuzH_pD1fkXlJ95W68vQkIeHMo8EPchdVBprsdhM6moT_bBuei2OaqthIa075zQoiKGy8992jBq2XnY7ucwiWsPtTu9tkniXf4DOwR4lxw-UuAi4gs0R05wFS2KmlQq8BrJLtQR2n4xP3QZRpt1RVMjNSkScHUg0ijLJTaX8wm2mI35QggY4UZLKy0ge9iYRW-Q5CDjr6IhTJTnnCQsf4WRWgbQmD2BQCDUbSEbLjSCahTyn3vlzvTGNCzdxzvGJQhuH1wvZnrhwlfbeMtf7RatnLXBdVpFn0cn6_y60J7ZnHPsRPs7xNa1rAJyT3je8nZ44pXP6sWX3xOK254R7xy4iLFrbU0Cu3i4DwACvxT7feEwdqffxIqOUgS8yzToxFDMF-39PfWKqblBId2IiHARQu1uzY9QByj7Z4uf0GHK954XZ6-1a_ykWvdVPC_h3sb_2zoHTNK1uR_XNvrq8_xTALaqZNcrbEmo5brUvzkqOqCH5ZsTEwmTyara0pzUHrQdMkTw0_VGav5oQwUq7xD4X3ptEXQMcmQ&amp;f=1&amp;ui=6008291652839-id_51ddd04f4b40f3b54921268&amp;en=fad_pageclick&amp;ed=159616034235&amp;a=0&amp;mac=AQJORo0vP6aDQiTn&amp;sig=123721&amp;__tn__=zwv\" onmousedown=\"return eef522934aeea21d4a13209dbba299f1e37e568d6.call(this, event);\">Walmart</a>.</span></div></div></div></div></div><div class=\"ego_unit\" data-ego-fbid=\"6008916062318\"><div class=\"_4u8\" data-ad=\"&#123;&quot;adid&quot;:6008916062318,&quot;segment&quot;:&quot;market&quot;&#125;\" id=\"6008916062318-id_51ddd04f4b4974851446951\"><div class=\"_24n _24y\"><div class=\"uiSelector inlineBlock emu_x emuEventfad_hide _24x uiSelectorRight\"><div class=\"uiToggle wrap\"><a class=\"uiSelectorButton uiCloseButton uiCloseButtonSmall\" href=\"#\" role=\"button\" title=\"About Facebook Ads\" rel=\"toggle\" ajaxify=\"/ajax/emu/end.php?eid=AQJGJvOnYZukufXE1r_V1Je4-\\-\\yXbyhh5Q3z3eGIaBR82I_qO9CvM05NtO5v6wk63rBuEWdg8CziEwH64ob6GbBDs5tftO7CTKcsolCZ_-ewPnydNAPt5Toc5Q831MXKSjUJTe1Tixboky_IWQxRzYqFWWiYvyQJ7F02Y9Tam0xYH40Az8lAfEX8jLmCv-zgfGAapedwVz_mhy86fHV_w6skg85CNbutvnpU5J90gkkpLGyn-VYiJ78ICtgHFdkh2EIbR8FOwE8TjB1OBoa02Xl16425PXowjNG7VzR_1-hgx_kflmiqjvYOqGjTrbWiAm31n-MhBI1h8EsafPSC0o831XJw2btIAr-l5Uko5rjDq6M2nEte_s9Dvgu_xoSUZP_msK4DbXD-kZpnRif4QJaixS6ReLDJexDKmai6jgcOGodR9QqOs2LyEcd__V1BW-0btEfHvmfhzQXG5_7aWS5X-OAzFyuoFHVL5lPcDBa3OZ_JOnrUE5k_MEZsauZoeJ58TSVX0yG9o2HfpEGLjcUaKGCkJNNON7vfWxVZUShX-d3mYCKhKMFtihEYKN9VoS13KF_lRMDuz_cGWtaqLrKqxYxTWpwW_ymYFMw1bAOFXNxpMHFlFxaJ3E6IPkWGCcqfOKhCbcLf44md4WdNzRDg0IMWkDH_p9VSUYqB3jYCqo0qZP2hCvDXejEttr7B-VvT1ZAOgThX4s4WPNMpPOKuPL540FE3LhFxMDdfghPDQ4NIlhJjgtXneS9lLWxBS0xHZMY4yxHQMeZbR-KoMs4wxXk9ZjuvTMNh6RDr87V7XJ6MrTJjkE4QG96W_U91wL8u-kFCrs21nSSa0jhoZ9dva0Zgaj4V35lprB20UPEQIuTBo8X-qRoOSeZVMoqgKF7IkZHq2lhkWW_D6MpQRltKnAjsahfWd-sAmtJ8O6W7UjsRMYxY2docYD2XFgi6MPtzVm4X5I8205fsTRS1Z5LP1IuhRA5rw3AOClNyJJga17cFwF_-O_4BaG0sZVOS7XdUubnvhxqjLOoAO9cSIcHgs7BRDswzOr-Pfmfe_JyuQVponbkDRlJut7weddUFG2z_nJ-725A4GL2GNg4q1MjegEFPAfVEnVsi1JL2y_CBvhWd0RXXYb_ccwyCEPCvzDB3lYF5JS-8vL1Ygquo4KfWra8PUDwAziKvqCvJnUVFrOrbjRhvoZi1MWuUmMOjIKAp-tfkt30I3h69iub2fzirkyrK5tJd_Iv22Jxl9xHS22-g4pdzv7af4IPgy2CooVk&amp;f=0&amp;ui=6008916062318-id_51ddd04f4b4974851446951&amp;en=fad_hide&amp;ed=true&amp;a=1&amp;__tn__=v\" aria-haspopup=\"1\"></a></div></div><div class=\"title\"><script type=\"text/javascript\">try {\n    ((JSBNG_Record.scriptLoad)((\"function ecef0d91f7b6fc6359cb2f046e243644d6a01d04e(event) {\\u000a    var meta = document.getElementById(\\\"meta_referrer\\\");\\u000a    meta.content = \\\"origin\\\";\\u000a    setTimeout(function() {\\u000a        meta.content = \\\"default\\\";\\u000a    }, 100);\\u000a    var attribute = \\\"href\\\";\\u000a    var ms = this.getAttribute(attribute).match(/([\\\\\\\\?|&]f=)([^&]*)/);\\u000a    if (ms) {\\u000a        this.setAttribute(attribute, this.getAttribute(attribute).replace(/[\\\\\\\\?|&]f=[^&]*/, (ms[1] + 0)));\\u000a    }\\u000a;\\u000a;\\u000a    var attribute = \\\"href\\\";\\u000a    var sig = this.getAttribute(attribute).match(/([\\\\\\\\?|&]sig=)([^&]*)/);\\u000a    if (sig) {\\u000a        this.setAttribute(attribute, this.getAttribute(attribute).replace(/[\\\\\\\\?|&]sig=[^&]*/, (sig[1] + ((Math.floor((Math.random() * 65535)) + 65536)))));\\u000a    }\\u000a;\\u000a;\\u000a};\"), (\"se8b8c37e7870c69ab3a417f78a21c3517001b80c\")));\n    ((window.top.JSBNG_Record.callerJS) = (true));\n    function ecef0d91f7b6fc6359cb2f046e243644d6a01d04e(JSBNG__event) {\n        if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n            return ((JSBNG_Record.eventCall)((arguments.callee), (\"se8b8c37e7870c69ab3a417f78a21c3517001b80c_0\"), (se8b8c37e7870c69ab3a417f78a21c3517001b80c_0_instance), (this), (arguments)))\n        };\n        (null);\n        var meta = (((JSBNG_Record.get)(JSBNG__document, (\"getElementById\")))[(\"getElementById\")])(\"meta_referrer\");\n        ((JSBNG_Record.set)(meta, (\"JSBNG__content\"), \"origin\"));\n        JSBNG__setTimeout(((function() {\n            var se8b8c37e7870c69ab3a417f78a21c3517001b80c_1_instance;\n            ((se8b8c37e7870c69ab3a417f78a21c3517001b80c_1_instance) = ((JSBNG_Record.eventInstance)((\"se8b8c37e7870c69ab3a417f78a21c3517001b80c_1\"))));\n            return ((JSBNG_Record.markFunction)((function() {\n                if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n                    return ((JSBNG_Record.eventCall)((arguments.callee), (\"se8b8c37e7870c69ab3a417f78a21c3517001b80c_1\"), (se8b8c37e7870c69ab3a417f78a21c3517001b80c_1_instance), (this), (arguments)))\n                };\n                (null);\n                ((JSBNG_Record.set)(meta, (\"JSBNG__content\"), \"default\"));\n            })));\n        })()), 100);\n        var attribute = \"href\";\n        var ms = (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"match\")))[(\"match\")])(/([\\\\?|&]f=)([^&]*)/);\n        if (ms) {\n            (((JSBNG_Record.get)(this, (\"setAttribute\")))[(\"setAttribute\")])(attribute, (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"replace\")))[(\"replace\")])(/[\\\\?|&]f=[^&]*/, ((((JSBNG_Record.get)(ms, 1))[1]) + 0)));\n        }\n        ;\n        ;\n        var attribute = \"href\";\n        var sig = (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"match\")))[(\"match\")])(/([\\\\?|&]sig=)([^&]*)/);\n        if (sig) {\n            (((JSBNG_Record.get)(this, (\"setAttribute\")))[(\"setAttribute\")])(attribute, (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"replace\")))[(\"replace\")])(/[\\\\?|&]sig=[^&]*/, ((((JSBNG_Record.get)(sig, 1))[1]) + (((((JSBNG_Record.get)(Math, (\"floor\")))[(\"floor\")])(((((JSBNG_Record.get)(Math, (\"JSBNG__random\")))[(\"JSBNG__random\")])() * 65535)) + 65536)))));\n        }\n        ;\n        ;\n    };\n    var se8b8c37e7870c69ab3a417f78a21c3517001b80c_0_instance;\n    ((se8b8c37e7870c69ab3a417f78a21c3517001b80c_0_instance) = ((JSBNG_Record.eventInstance)((\"se8b8c37e7870c69ab3a417f78a21c3517001b80c_0\"))));\n    ((JSBNG_Record.markFunction)((ecef0d91f7b6fc6359cb2f046e243644d6a01d04e)));\n} finally {\n    ((window.top.JSBNG_Record.callerJS) = (false));\n    ((window.top.JSBNG_Record.flushDeferredEvents)());\n};</script><a class=\"forceLTR emuEvent1 _24x\" href=\"/ajax/emu/end.php?eid=AQJGJvOnYZukufXE1r_V1Je4-\\-\\yXbyhh5Q3z3eGIaBR82I_qO9CvM05NtO5v6wk63rBuEWdg8CziEwH64ob6GbBDs5tftO7CTKcsolCZ_-ewPnydNAPt5Toc5Q831MXKSjUJTe1Tixboky_IWQxRzYqFWWiYvyQJ7F02Y9Tam0xYH40Az8lAfEX8jLmCv-zgfGAapedwVz_mhy86fHV_w6skg85CNbutvnpU5J90gkkpLGyn-VYiJ78ICtgHFdkh2EIbR8FOwE8TjB1OBoa02Xl16425PXowjNG7VzR_1-hgx_kflmiqjvYOqGjTrbWiAm31n-MhBI1h8EsafPSC0o831XJw2btIAr-l5Uko5rjDq6M2nEte_s9Dvgu_xoSUZP_msK4DbXD-kZpnRif4QJaixS6ReLDJexDKmai6jgcOGodR9QqOs2LyEcd__V1BW-0btEfHvmfhzQXG5_7aWS5X-OAzFyuoFHVL5lPcDBa3OZ_JOnrUE5k_MEZsauZoeJ58TSVX0yG9o2HfpEGLjcUaKGCkJNNON7vfWxVZUShX-d3mYCKhKMFtihEYKN9VoS13KF_lRMDuz_cGWtaqLrKqxYxTWpwW_ymYFMw1bAOFXNxpMHFlFxaJ3E6IPkWGCcqfOKhCbcLf44md4WdNzRDg0IMWkDH_p9VSUYqB3jYCqo0qZP2hCvDXejEttr7B-VvT1ZAOgThX4s4WPNMpPOKuPL540FE3LhFxMDdfghPDQ4NIlhJjgtXneS9lLWxBS0xHZMY4yxHQMeZbR-KoMs4wxXk9ZjuvTMNh6RDr87V7XJ6MrTJjkE4QG96W_U91wL8u-kFCrs21nSSa0jhoZ9dva0Zgaj4V35lprB20UPEQIuTBo8X-qRoOSeZVMoqgKF7IkZHq2lhkWW_D6MpQRltKnAjsahfWd-sAmtJ8O6W7UjsRMYxY2docYD2XFgi6MPtzVm4X5I8205fsTRS1Z5LP1IuhRA5rw3AOClNyJJga17cFwF_-O_4BaG0sZVOS7XdUubnvhxqjLOoAO9cSIcHgs7BRDswzOr-Pfmfe_JyuQVponbkDRlJut7weddUFG2z_nJ-725A4GL2GNg4q1MjegEFPAfVEnVsi1JL2y_CBvhWd0RXXYb_ccwyCEPCvzDB3lYF5JS-8vL1Ygquo4KfWra8PUDwAziKvqCvJnUVFrOrbjRhvoZi1MWuUmMOjIKAp-tfkt30I3h69iub2fzirkyrK5tJd_Iv22Jxl9xHS22-g4pdzv7af4IPgy2CooVk&amp;f=1&amp;ui=6008916062318-id_51ddd04f4b4974851446951&amp;en=1&amp;a=0&amp;sig=119612&amp;__tn__=wv\" onmousedown=\"return ecef0d91f7b6fc6359cb2f046e243644d6a01d04e.call(this, event);\">Stop Obama&#039;s Surveillance</a></div><div class=\"clearfix image_body_block\"><script type=\"text/javascript\">try {\n    ((JSBNG_Record.scriptLoad)((\"function efdc76185b6ca0a2b8922a69f90d2e21786d04658(event) {\\u000a    var meta = document.getElementById(\\\"meta_referrer\\\");\\u000a    meta.content = \\\"origin\\\";\\u000a    setTimeout(function() {\\u000a        meta.content = \\\"default\\\";\\u000a    }, 100);\\u000a    var attribute = \\\"href\\\";\\u000a    var ms = this.getAttribute(attribute).match(/([\\\\\\\\?|&]f=)([^&]*)/);\\u000a    if (ms) {\\u000a        this.setAttribute(attribute, this.getAttribute(attribute).replace(/[\\\\\\\\?|&]f=[^&]*/, (ms[1] + 0)));\\u000a    }\\u000a;\\u000a;\\u000a    var attribute = \\\"href\\\";\\u000a    var sig = this.getAttribute(attribute).match(/([\\\\\\\\?|&]sig=)([^&]*)/);\\u000a    if (sig) {\\u000a        this.setAttribute(attribute, this.getAttribute(attribute).replace(/[\\\\\\\\?|&]sig=[^&]*/, (sig[1] + ((Math.floor((Math.random() * 65535)) + 65536)))));\\u000a    }\\u000a;\\u000a;\\u000a};\"), (\"s47c1e78e99121241496aefc348d453acb571129b\")));\n    ((window.top.JSBNG_Record.callerJS) = (true));\n    function efdc76185b6ca0a2b8922a69f90d2e21786d04658(JSBNG__event) {\n        if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n            return ((JSBNG_Record.eventCall)((arguments.callee), (\"s47c1e78e99121241496aefc348d453acb571129b_0\"), (s47c1e78e99121241496aefc348d453acb571129b_0_instance), (this), (arguments)))\n        };\n        (null);\n        var meta = (((JSBNG_Record.get)(JSBNG__document, (\"getElementById\")))[(\"getElementById\")])(\"meta_referrer\");\n        ((JSBNG_Record.set)(meta, (\"JSBNG__content\"), \"origin\"));\n        JSBNG__setTimeout(((function() {\n            var s47c1e78e99121241496aefc348d453acb571129b_1_instance;\n            ((s47c1e78e99121241496aefc348d453acb571129b_1_instance) = ((JSBNG_Record.eventInstance)((\"s47c1e78e99121241496aefc348d453acb571129b_1\"))));\n            return ((JSBNG_Record.markFunction)((function() {\n                if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n                    return ((JSBNG_Record.eventCall)((arguments.callee), (\"s47c1e78e99121241496aefc348d453acb571129b_1\"), (s47c1e78e99121241496aefc348d453acb571129b_1_instance), (this), (arguments)))\n                };\n                (null);\n                ((JSBNG_Record.set)(meta, (\"JSBNG__content\"), \"default\"));\n            })));\n        })()), 100);\n        var attribute = \"href\";\n        var ms = (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"match\")))[(\"match\")])(/([\\\\?|&]f=)([^&]*)/);\n        if (ms) {\n            (((JSBNG_Record.get)(this, (\"setAttribute\")))[(\"setAttribute\")])(attribute, (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"replace\")))[(\"replace\")])(/[\\\\?|&]f=[^&]*/, ((((JSBNG_Record.get)(ms, 1))[1]) + 0)));\n        }\n        ;\n        ;\n        var attribute = \"href\";\n        var sig = (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"match\")))[(\"match\")])(/([\\\\?|&]sig=)([^&]*)/);\n        if (sig) {\n            (((JSBNG_Record.get)(this, (\"setAttribute\")))[(\"setAttribute\")])(attribute, (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"replace\")))[(\"replace\")])(/[\\\\?|&]sig=[^&]*/, ((((JSBNG_Record.get)(sig, 1))[1]) + (((((JSBNG_Record.get)(Math, (\"floor\")))[(\"floor\")])(((((JSBNG_Record.get)(Math, (\"JSBNG__random\")))[(\"JSBNG__random\")])() * 65535)) + 65536)))));\n        }\n        ;\n        ;\n    };\n    var s47c1e78e99121241496aefc348d453acb571129b_0_instance;\n    ((s47c1e78e99121241496aefc348d453acb571129b_0_instance) = ((JSBNG_Record.eventInstance)((\"s47c1e78e99121241496aefc348d453acb571129b_0\"))));\n    ((JSBNG_Record.markFunction)((efdc76185b6ca0a2b8922a69f90d2e21786d04658)));\n} finally {\n    ((window.top.JSBNG_Record.callerJS) = (false));\n    ((window.top.JSBNG_Record.flushDeferredEvents)());\n};</script><a class=\"forceLTR emuEvent1 _24x image fbEmuImage _8o _8s lfloat\" tabindex=\"-1\" href=\"/ajax/emu/end.php?eid=AQJGJvOnYZukufXE1r_V1Je4-\\-\\yXbyhh5Q3z3eGIaBR82I_qO9CvM05NtO5v6wk63rBuEWdg8CziEwH64ob6GbBDs5tftO7CTKcsolCZ_-ewPnydNAPt5Toc5Q831MXKSjUJTe1Tixboky_IWQxRzYqFWWiYvyQJ7F02Y9Tam0xYH40Az8lAfEX8jLmCv-zgfGAapedwVz_mhy86fHV_w6skg85CNbutvnpU5J90gkkpLGyn-VYiJ78ICtgHFdkh2EIbR8FOwE8TjB1OBoa02Xl16425PXowjNG7VzR_1-hgx_kflmiqjvYOqGjTrbWiAm31n-MhBI1h8EsafPSC0o831XJw2btIAr-l5Uko5rjDq6M2nEte_s9Dvgu_xoSUZP_msK4DbXD-kZpnRif4QJaixS6ReLDJexDKmai6jgcOGodR9QqOs2LyEcd__V1BW-0btEfHvmfhzQXG5_7aWS5X-OAzFyuoFHVL5lPcDBa3OZ_JOnrUE5k_MEZsauZoeJ58TSVX0yG9o2HfpEGLjcUaKGCkJNNON7vfWxVZUShX-d3mYCKhKMFtihEYKN9VoS13KF_lRMDuz_cGWtaqLrKqxYxTWpwW_ymYFMw1bAOFXNxpMHFlFxaJ3E6IPkWGCcqfOKhCbcLf44md4WdNzRDg0IMWkDH_p9VSUYqB3jYCqo0qZP2hCvDXejEttr7B-VvT1ZAOgThX4s4WPNMpPOKuPL540FE3LhFxMDdfghPDQ4NIlhJjgtXneS9lLWxBS0xHZMY4yxHQMeZbR-KoMs4wxXk9ZjuvTMNh6RDr87V7XJ6MrTJjkE4QG96W_U91wL8u-kFCrs21nSSa0jhoZ9dva0Zgaj4V35lprB20UPEQIuTBo8X-qRoOSeZVMoqgKF7IkZHq2lhkWW_D6MpQRltKnAjsahfWd-sAmtJ8O6W7UjsRMYxY2docYD2XFgi6MPtzVm4X5I8205fsTRS1Z5LP1IuhRA5rw3AOClNyJJga17cFwF_-O_4BaG0sZVOS7XdUubnvhxqjLOoAO9cSIcHgs7BRDswzOr-Pfmfe_JyuQVponbkDRlJut7weddUFG2z_nJ-725A4GL2GNg4q1MjegEFPAfVEnVsi1JL2y_CBvhWd0RXXYb_ccwyCEPCvzDB3lYF5JS-8vL1Ygquo4KfWra8PUDwAziKvqCvJnUVFrOrbjRhvoZi1MWuUmMOjIKAp-tfkt30I3h69iub2fzirkyrK5tJd_Iv22Jxl9xHS22-g4pdzv7af4IPgy2CooVk&amp;f=1&amp;ui=6008916062318-id_51ddd04f4b4974851446951&amp;en=1&amp;a=0&amp;sig=109789&amp;__tn__=ywv\" onmousedown=\"return efdc76185b6ca0a2b8922a69f90d2e21786d04658.call(this, event);\" aria-hidden=\"true\"><img class=\"img\" src=\"http://jsbngssl.creative.xx.fbcdn.net/hads-prn1/s110x80/735318_6008915444118_1970152449_n.png\" alt=\"\" /></a><div class=\"_42ef\"><div class=\"body\"><script type=\"text/javascript\">try {\n    ((JSBNG_Record.scriptLoad)((\"function e4707d7392cb429565c42e667235726d4182c9a8c(event) {\\u000a    var meta = document.getElementById(\\\"meta_referrer\\\");\\u000a    meta.content = \\\"origin\\\";\\u000a    setTimeout(function() {\\u000a        meta.content = \\\"default\\\";\\u000a    }, 100);\\u000a    var attribute = \\\"href\\\";\\u000a    var ms = this.getAttribute(attribute).match(/([\\\\\\\\?|&]f=)([^&]*)/);\\u000a    if (ms) {\\u000a        this.setAttribute(attribute, this.getAttribute(attribute).replace(/[\\\\\\\\?|&]f=[^&]*/, (ms[1] + 0)));\\u000a    }\\u000a;\\u000a;\\u000a    var attribute = \\\"href\\\";\\u000a    var sig = this.getAttribute(attribute).match(/([\\\\\\\\?|&]sig=)([^&]*)/);\\u000a    if (sig) {\\u000a        this.setAttribute(attribute, this.getAttribute(attribute).replace(/[\\\\\\\\?|&]sig=[^&]*/, (sig[1] + ((Math.floor((Math.random() * 65535)) + 65536)))));\\u000a    }\\u000a;\\u000a;\\u000a};\"), (\"sdc5c325490e6fbccf397876ee5aa7d45da380cfc\")));\n    ((window.top.JSBNG_Record.callerJS) = (true));\n    function e4707d7392cb429565c42e667235726d4182c9a8c(JSBNG__event) {\n        if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n            return ((JSBNG_Record.eventCall)((arguments.callee), (\"sdc5c325490e6fbccf397876ee5aa7d45da380cfc_0\"), (sdc5c325490e6fbccf397876ee5aa7d45da380cfc_0_instance), (this), (arguments)))\n        };\n        (null);\n        var meta = (((JSBNG_Record.get)(JSBNG__document, (\"getElementById\")))[(\"getElementById\")])(\"meta_referrer\");\n        ((JSBNG_Record.set)(meta, (\"JSBNG__content\"), \"origin\"));\n        JSBNG__setTimeout(((function() {\n            var sdc5c325490e6fbccf397876ee5aa7d45da380cfc_1_instance;\n            ((sdc5c325490e6fbccf397876ee5aa7d45da380cfc_1_instance) = ((JSBNG_Record.eventInstance)((\"sdc5c325490e6fbccf397876ee5aa7d45da380cfc_1\"))));\n            return ((JSBNG_Record.markFunction)((function() {\n                if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n                    return ((JSBNG_Record.eventCall)((arguments.callee), (\"sdc5c325490e6fbccf397876ee5aa7d45da380cfc_1\"), (sdc5c325490e6fbccf397876ee5aa7d45da380cfc_1_instance), (this), (arguments)))\n                };\n                (null);\n                ((JSBNG_Record.set)(meta, (\"JSBNG__content\"), \"default\"));\n            })));\n        })()), 100);\n        var attribute = \"href\";\n        var ms = (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"match\")))[(\"match\")])(/([\\\\?|&]f=)([^&]*)/);\n        if (ms) {\n            (((JSBNG_Record.get)(this, (\"setAttribute\")))[(\"setAttribute\")])(attribute, (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"replace\")))[(\"replace\")])(/[\\\\?|&]f=[^&]*/, ((((JSBNG_Record.get)(ms, 1))[1]) + 0)));\n        }\n        ;\n        ;\n        var attribute = \"href\";\n        var sig = (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"match\")))[(\"match\")])(/([\\\\?|&]sig=)([^&]*)/);\n        if (sig) {\n            (((JSBNG_Record.get)(this, (\"setAttribute\")))[(\"setAttribute\")])(attribute, (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"replace\")))[(\"replace\")])(/[\\\\?|&]sig=[^&]*/, ((((JSBNG_Record.get)(sig, 1))[1]) + (((((JSBNG_Record.get)(Math, (\"floor\")))[(\"floor\")])(((((JSBNG_Record.get)(Math, (\"JSBNG__random\")))[(\"JSBNG__random\")])() * 65535)) + 65536)))));\n        }\n        ;\n        ;\n    };\n    var sdc5c325490e6fbccf397876ee5aa7d45da380cfc_0_instance;\n    ((sdc5c325490e6fbccf397876ee5aa7d45da380cfc_0_instance) = ((JSBNG_Record.eventInstance)((\"sdc5c325490e6fbccf397876ee5aa7d45da380cfc_0\"))));\n    ((JSBNG_Record.markFunction)((e4707d7392cb429565c42e667235726d4182c9a8c)));\n} finally {\n    ((window.top.JSBNG_Record.callerJS) = (false));\n    ((window.top.JSBNG_Record.flushDeferredEvents)());\n};</script><a class=\"forceLTR emuEvent1 _24x\" href=\"/ajax/emu/end.php?eid=AQJGJvOnYZukufXE1r_V1Je4-\\-\\yXbyhh5Q3z3eGIaBR82I_qO9CvM05NtO5v6wk63rBuEWdg8CziEwH64ob6GbBDs5tftO7CTKcsolCZ_-ewPnydNAPt5Toc5Q831MXKSjUJTe1Tixboky_IWQxRzYqFWWiYvyQJ7F02Y9Tam0xYH40Az8lAfEX8jLmCv-zgfGAapedwVz_mhy86fHV_w6skg85CNbutvnpU5J90gkkpLGyn-VYiJ78ICtgHFdkh2EIbR8FOwE8TjB1OBoa02Xl16425PXowjNG7VzR_1-hgx_kflmiqjvYOqGjTrbWiAm31n-MhBI1h8EsafPSC0o831XJw2btIAr-l5Uko5rjDq6M2nEte_s9Dvgu_xoSUZP_msK4DbXD-kZpnRif4QJaixS6ReLDJexDKmai6jgcOGodR9QqOs2LyEcd__V1BW-0btEfHvmfhzQXG5_7aWS5X-OAzFyuoFHVL5lPcDBa3OZ_JOnrUE5k_MEZsauZoeJ58TSVX0yG9o2HfpEGLjcUaKGCkJNNON7vfWxVZUShX-d3mYCKhKMFtihEYKN9VoS13KF_lRMDuz_cGWtaqLrKqxYxTWpwW_ymYFMw1bAOFXNxpMHFlFxaJ3E6IPkWGCcqfOKhCbcLf44md4WdNzRDg0IMWkDH_p9VSUYqB3jYCqo0qZP2hCvDXejEttr7B-VvT1ZAOgThX4s4WPNMpPOKuPL540FE3LhFxMDdfghPDQ4NIlhJjgtXneS9lLWxBS0xHZMY4yxHQMeZbR-KoMs4wxXk9ZjuvTMNh6RDr87V7XJ6MrTJjkE4QG96W_U91wL8u-kFCrs21nSSa0jhoZ9dva0Zgaj4V35lprB20UPEQIuTBo8X-qRoOSeZVMoqgKF7IkZHq2lhkWW_D6MpQRltKnAjsahfWd-sAmtJ8O6W7UjsRMYxY2docYD2XFgi6MPtzVm4X5I8205fsTRS1Z5LP1IuhRA5rw3AOClNyJJga17cFwF_-O_4BaG0sZVOS7XdUubnvhxqjLOoAO9cSIcHgs7BRDswzOr-Pfmfe_JyuQVponbkDRlJut7weddUFG2z_nJ-725A4GL2GNg4q1MjegEFPAfVEnVsi1JL2y_CBvhWd0RXXYb_ccwyCEPCvzDB3lYF5JS-8vL1Ygquo4KfWra8PUDwAziKvqCvJnUVFrOrbjRhvoZi1MWuUmMOjIKAp-tfkt30I3h69iub2fzirkyrK5tJd_Iv22Jxl9xHS22-g4pdzv7af4IPgy2CooVk&amp;f=1&amp;ui=6008916062318-id_51ddd04f4b4974851446951&amp;en=1&amp;a=0&amp;sig=83327&amp;__tn__=xywv\" onmousedown=\"return e4707d7392cb429565c42e667235726d4182c9a8c.call(this, event);\">Do You Support Obama’s Violation of Our Civil Liberties? Restrain the NSA – VOTE NOW!</a></div></div></div><div class=\"inline\"><div class=\"action\"><a class=\"uiIconText emuEventfad_fan _24x\" href=\"#\" style=\"padding-left: 17px;\" rel=\"async-post\" ajaxify=\"/ajax/emu/end.php?eid=AQJGJvOnYZukufXE1r_V1Je4-\\-\\yXbyhh5Q3z3eGIaBR82I_qO9CvM05NtO5v6wk63rBuEWdg8CziEwH64ob6GbBDs5tftO7CTKcsolCZ_-ewPnydNAPt5Toc5Q831MXKSjUJTe1Tixboky_IWQxRzYqFWWiYvyQJ7F02Y9Tam0xYH40Az8lAfEX8jLmCv-zgfGAapedwVz_mhy86fHV_w6skg85CNbutvnpU5J90gkkpLGyn-VYiJ78ICtgHFdkh2EIbR8FOwE8TjB1OBoa02Xl16425PXowjNG7VzR_1-hgx_kflmiqjvYOqGjTrbWiAm31n-MhBI1h8EsafPSC0o831XJw2btIAr-l5Uko5rjDq6M2nEte_s9Dvgu_xoSUZP_msK4DbXD-kZpnRif4QJaixS6ReLDJexDKmai6jgcOGodR9QqOs2LyEcd__V1BW-0btEfHvmfhzQXG5_7aWS5X-OAzFyuoFHVL5lPcDBa3OZ_JOnrUE5k_MEZsauZoeJ58TSVX0yG9o2HfpEGLjcUaKGCkJNNON7vfWxVZUShX-d3mYCKhKMFtihEYKN9VoS13KF_lRMDuz_cGWtaqLrKqxYxTWpwW_ymYFMw1bAOFXNxpMHFlFxaJ3E6IPkWGCcqfOKhCbcLf44md4WdNzRDg0IMWkDH_p9VSUYqB3jYCqo0qZP2hCvDXejEttr7B-VvT1ZAOgThX4s4WPNMpPOKuPL540FE3LhFxMDdfghPDQ4NIlhJjgtXneS9lLWxBS0xHZMY4yxHQMeZbR-KoMs4wxXk9ZjuvTMNh6RDr87V7XJ6MrTJjkE4QG96W_U91wL8u-kFCrs21nSSa0jhoZ9dva0Zgaj4V35lprB20UPEQIuTBo8X-qRoOSeZVMoqgKF7IkZHq2lhkWW_D6MpQRltKnAjsahfWd-sAmtJ8O6W7UjsRMYxY2docYD2XFgi6MPtzVm4X5I8205fsTRS1Z5LP1IuhRA5rw3AOClNyJJga17cFwF_-O_4BaG0sZVOS7XdUubnvhxqjLOoAO9cSIcHgs7BRDswzOr-Pfmfe_JyuQVponbkDRlJut7weddUFG2z_nJ-725A4GL2GNg4q1MjegEFPAfVEnVsi1JL2y_CBvhWd0RXXYb_ccwyCEPCvzDB3lYF5JS-8vL1Ygquo4KfWra8PUDwAziKvqCvJnUVFrOrbjRhvoZi1MWuUmMOjIKAp-tfkt30I3h69iub2fzirkyrK5tJd_Iv22Jxl9xHS22-g4pdzv7af4IPgy2CooVk&amp;f=0&amp;ui=6008916062318-id_51ddd04f4b4974851446951&amp;en=fad_fan&amp;ed=161616200566899&amp;a=1&amp;__tn__=wv\" role=\"button\"><i class=\"img sp_4p6kmz sx_bc56c4\" style=\"top: 1px;\"></i>Like</a> · <span class=\"fbEmuContext\">13,045 people like <script type=\"text/javascript\">try {\n    ((JSBNG_Record.scriptLoad)((\"function e3d3f13bd8ba89d64b1f3b16c685330296d0e66e8(event) {\\u000a    var meta = document.getElementById(\\\"meta_referrer\\\");\\u000a    meta.content = \\\"origin\\\";\\u000a    setTimeout(function() {\\u000a        meta.content = \\\"default\\\";\\u000a    }, 100);\\u000a    var attribute = \\\"href\\\";\\u000a    var ms = this.getAttribute(attribute).match(/([\\\\\\\\?|&]f=)([^&]*)/);\\u000a    if (ms) {\\u000a        this.setAttribute(attribute, this.getAttribute(attribute).replace(/[\\\\\\\\?|&]f=[^&]*/, (ms[1] + 0)));\\u000a    }\\u000a;\\u000a;\\u000a    var attribute = \\\"href\\\";\\u000a    var sig = this.getAttribute(attribute).match(/([\\\\\\\\?|&]sig=)([^&]*)/);\\u000a    if (sig) {\\u000a        this.setAttribute(attribute, this.getAttribute(attribute).replace(/[\\\\\\\\?|&]sig=[^&]*/, (sig[1] + ((Math.floor((Math.random() * 65535)) + 65536)))));\\u000a    }\\u000a;\\u000a;\\u000a};\"), (\"s38e51f310ee263bff2eb42ae552806815f9c2e02\")));\n    ((window.top.JSBNG_Record.callerJS) = (true));\n    function e3d3f13bd8ba89d64b1f3b16c685330296d0e66e8(JSBNG__event) {\n        if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n            return ((JSBNG_Record.eventCall)((arguments.callee), (\"s38e51f310ee263bff2eb42ae552806815f9c2e02_0\"), (s38e51f310ee263bff2eb42ae552806815f9c2e02_0_instance), (this), (arguments)))\n        };\n        (null);\n        var meta = (((JSBNG_Record.get)(JSBNG__document, (\"getElementById\")))[(\"getElementById\")])(\"meta_referrer\");\n        ((JSBNG_Record.set)(meta, (\"JSBNG__content\"), \"origin\"));\n        JSBNG__setTimeout(((function() {\n            var s38e51f310ee263bff2eb42ae552806815f9c2e02_1_instance;\n            ((s38e51f310ee263bff2eb42ae552806815f9c2e02_1_instance) = ((JSBNG_Record.eventInstance)((\"s38e51f310ee263bff2eb42ae552806815f9c2e02_1\"))));\n            return ((JSBNG_Record.markFunction)((function() {\n                if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n                    return ((JSBNG_Record.eventCall)((arguments.callee), (\"s38e51f310ee263bff2eb42ae552806815f9c2e02_1\"), (s38e51f310ee263bff2eb42ae552806815f9c2e02_1_instance), (this), (arguments)))\n                };\n                (null);\n                ((JSBNG_Record.set)(meta, (\"JSBNG__content\"), \"default\"));\n            })));\n        })()), 100);\n        var attribute = \"href\";\n        var ms = (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"match\")))[(\"match\")])(/([\\\\?|&]f=)([^&]*)/);\n        if (ms) {\n            (((JSBNG_Record.get)(this, (\"setAttribute\")))[(\"setAttribute\")])(attribute, (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"replace\")))[(\"replace\")])(/[\\\\?|&]f=[^&]*/, ((((JSBNG_Record.get)(ms, 1))[1]) + 0)));\n        }\n        ;\n        ;\n        var attribute = \"href\";\n        var sig = (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"match\")))[(\"match\")])(/([\\\\?|&]sig=)([^&]*)/);\n        if (sig) {\n            (((JSBNG_Record.get)(this, (\"setAttribute\")))[(\"setAttribute\")])(attribute, (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"replace\")))[(\"replace\")])(/[\\\\?|&]sig=[^&]*/, ((((JSBNG_Record.get)(sig, 1))[1]) + (((((JSBNG_Record.get)(Math, (\"floor\")))[(\"floor\")])(((((JSBNG_Record.get)(Math, (\"JSBNG__random\")))[(\"JSBNG__random\")])() * 65535)) + 65536)))));\n        }\n        ;\n        ;\n    };\n    var s38e51f310ee263bff2eb42ae552806815f9c2e02_0_instance;\n    ((s38e51f310ee263bff2eb42ae552806815f9c2e02_0_instance) = ((JSBNG_Record.eventInstance)((\"s38e51f310ee263bff2eb42ae552806815f9c2e02_0\"))));\n    ((JSBNG_Record.markFunction)((e3d3f13bd8ba89d64b1f3b16c685330296d0e66e8)));\n} finally {\n    ((window.top.JSBNG_Record.callerJS) = (false));\n    ((window.top.JSBNG_Record.flushDeferredEvents)());\n};</script><a class=\"emuEventfad_pageclick _24x\" href=\"/ajax/emu/end.php?eid=AQJGJvOnYZukufXE1r_V1Je4-\\-\\yXbyhh5Q3z3eGIaBR82I_qO9CvM05NtO5v6wk63rBuEWdg8CziEwH64ob6GbBDs5tftO7CTKcsolCZ_-ewPnydNAPt5Toc5Q831MXKSjUJTe1Tixboky_IWQxRzYqFWWiYvyQJ7F02Y9Tam0xYH40Az8lAfEX8jLmCv-zgfGAapedwVz_mhy86fHV_w6skg85CNbutvnpU5J90gkkpLGyn-VYiJ78ICtgHFdkh2EIbR8FOwE8TjB1OBoa02Xl16425PXowjNG7VzR_1-hgx_kflmiqjvYOqGjTrbWiAm31n-MhBI1h8EsafPSC0o831XJw2btIAr-l5Uko5rjDq6M2nEte_s9Dvgu_xoSUZP_msK4DbXD-kZpnRif4QJaixS6ReLDJexDKmai6jgcOGodR9QqOs2LyEcd__V1BW-0btEfHvmfhzQXG5_7aWS5X-OAzFyuoFHVL5lPcDBa3OZ_JOnrUE5k_MEZsauZoeJ58TSVX0yG9o2HfpEGLjcUaKGCkJNNON7vfWxVZUShX-d3mYCKhKMFtihEYKN9VoS13KF_lRMDuz_cGWtaqLrKqxYxTWpwW_ymYFMw1bAOFXNxpMHFlFxaJ3E6IPkWGCcqfOKhCbcLf44md4WdNzRDg0IMWkDH_p9VSUYqB3jYCqo0qZP2hCvDXejEttr7B-VvT1ZAOgThX4s4WPNMpPOKuPL540FE3LhFxMDdfghPDQ4NIlhJjgtXneS9lLWxBS0xHZMY4yxHQMeZbR-KoMs4wxXk9ZjuvTMNh6RDr87V7XJ6MrTJjkE4QG96W_U91wL8u-kFCrs21nSSa0jhoZ9dva0Zgaj4V35lprB20UPEQIuTBo8X-qRoOSeZVMoqgKF7IkZHq2lhkWW_D6MpQRltKnAjsahfWd-sAmtJ8O6W7UjsRMYxY2docYD2XFgi6MPtzVm4X5I8205fsTRS1Z5LP1IuhRA5rw3AOClNyJJga17cFwF_-O_4BaG0sZVOS7XdUubnvhxqjLOoAO9cSIcHgs7BRDswzOr-Pfmfe_JyuQVponbkDRlJut7weddUFG2z_nJ-725A4GL2GNg4q1MjegEFPAfVEnVsi1JL2y_CBvhWd0RXXYb_ccwyCEPCvzDB3lYF5JS-8vL1Ygquo4KfWra8PUDwAziKvqCvJnUVFrOrbjRhvoZi1MWuUmMOjIKAp-tfkt30I3h69iub2fzirkyrK5tJd_Iv22Jxl9xHS22-g4pdzv7af4IPgy2CooVk&amp;f=1&amp;ui=6008916062318-id_51ddd04f4b4974851446951&amp;en=fad_pageclick&amp;ed=161616200566899&amp;a=0&amp;mac=AQLuIcHGeBTdpT86&amp;sig=97550&amp;__tn__=zwv\" onmousedown=\"return e3d3f13bd8ba89d64b1f3b16c685330296d0e66e8.call(this, event);\">Jim Sensenbrenner for Congress</a>.</span></div></div></div></div></div><div class=\"ego_unit\" data-ego-fbid=\"6010037469977\"><div class=\"_4u8\" data-ad=\"&#123;&quot;adid&quot;:6010037469977,&quot;segment&quot;:&quot;market&quot;&#125;\" id=\"6010037469977-id_51ddd04f4b5207180068485\"><div class=\"_24n _24y\"><div class=\"uiSelector inlineBlock emu_x emuEventfad_hide _24x uiSelectorRight\"><div class=\"uiToggle wrap\"><a class=\"uiSelectorButton uiCloseButton uiCloseButtonSmall\" href=\"#\" role=\"button\" title=\"About Facebook Ads\" rel=\"toggle\" ajaxify=\"/ajax/emu/end.php?eid=AQI5MS3p7PmoZOkYz1-g1bhcl_ihn4Me_qxkz6ExYyZ6Ptcc8YBk7zVSepS3t2VJaPYX4hangH0-ljBRqDpoJOa93hz_L9-\\-\\Dht1_ed3yX9GClqUUFM2cqMqxvSVwxS3TfF3eNPJIv9hnQ8X8MgGQ9DaBkdVrQIt-t4kITCIpzoiDPe8F-D8d6sSllyxuQ3GUuk853fOQiwNt8BJkhbx24v0mMGM00G6tNnt99sTwBAlVb94zM23M6SHbMq2rOXBJ063K4L19AI5lZ02BHv_1_EF9dSVwoI9Vp22_oX_p6CDbPtqZJMb3yFp8EoDUOtSgopKSm0STXuLme3ITvV2SrCG0F9tk_atLtgGw8nQgCNkK_hKbs11EdIcVrz0YsVhy0vPaV5AywPLqM1PL_JjFNuPa4AzYOBZQSQvlOvEh-rD4lsQHn5nCZUmhSzjgs8s9lN7kc97LQJko0NUfEpW6A38y_1lhxtU2UdyS1vpiB5_E2fjWasz0sZ-LMCU3w5L2eurooyNpA5lmSlTFCZDw97s4Cl6Ea2MY3yKeG9USM_j__uNDmw-Ky2t5tS73heObkCginQdOzFr0bi570RPHbpIr9gJr1Pz-WxLsmvO7FVHeYJnwSItyNDNZwg9zmZeMNjrbnbvKkAgFu2qiWF_IPdH3etIDGbSco9BXsWTfs313VjaAAkbGcty2xe4MvxiFW4nB8-PkWW_UOjQwepjA8rc6Kw6akeI2Q7jJAvRc9CHdjgafRJxeK4ajl1M84swoGGwWRMtfheU-fO3raIM1S4uOREZCntZ-QAvVH36PuvlDlhyXPQActDMUCiOg-RAo-FoxoWrCkmPfnvFjsiaYfFwr5oZ_QHX5m0rIRjAzav4m7LZgNHpCEqWxbp-m4yQs4cTuZVRVC4Op-\\-\\d4zie7eCZvNnSUvc8OaJs1UPjq9hZuoP1D9k1upnQ9um94jl3Ao3XO_wq7C24Y9WhJWoTo5ruUq0tAcpyr7g4oXAmLYaYaVdz31I_SbWqdxlON1bL5Hh5Jfhq9Y8Oh_txkhyYqUr73X9afte2tSoCDZia4Zszfzi-EQsQX9HMl85aETVtcpZWQTiXlDet_WddSuYkEmOrwNuPqNFCCZmbd8E9NG0XQDwkT4F-2rPgeQORouZ-nTug-uxSZGqOxLkVJb9_aSUTYPUisB9iFggbslTgLu2r3Fgaq0VCeSWGChXNQ6xUJgS2Lo5w4yQJ8AUHnuhqmv8qL8YeyrgFCHkjQWV9M0GzcqHFo409aYD2P7n822yyvoY&amp;f=0&amp;ui=6010037469977-id_51ddd04f4b5207180068485&amp;en=fad_hide&amp;ed=true&amp;a=1&amp;__tn__=v\" aria-haspopup=\"1\"></a></div></div><div class=\"title\"><script type=\"text/javascript\">try {\n    ((JSBNG_Record.scriptLoad)((\"function ef28de477e071720898c6baad2c6b05b12cc4b312(event) {\\u000a    var meta = document.getElementById(\\\"meta_referrer\\\");\\u000a    meta.content = \\\"origin\\\";\\u000a    setTimeout(function() {\\u000a        meta.content = \\\"default\\\";\\u000a    }, 100);\\u000a    var attribute = \\\"href\\\";\\u000a    var ms = this.getAttribute(attribute).match(/([\\\\\\\\?|&]f=)([^&]*)/);\\u000a    if (ms) {\\u000a        this.setAttribute(attribute, this.getAttribute(attribute).replace(/[\\\\\\\\?|&]f=[^&]*/, (ms[1] + 0)));\\u000a    }\\u000a;\\u000a;\\u000a    var attribute = \\\"href\\\";\\u000a    var sig = this.getAttribute(attribute).match(/([\\\\\\\\?|&]sig=)([^&]*)/);\\u000a    if (sig) {\\u000a        this.setAttribute(attribute, this.getAttribute(attribute).replace(/[\\\\\\\\?|&]sig=[^&]*/, (sig[1] + ((Math.floor((Math.random() * 65535)) + 65536)))));\\u000a    }\\u000a;\\u000a;\\u000a};\"), (\"s11f7e5f2458195a59e011735485f15566cf4211d\")));\n    ((window.top.JSBNG_Record.callerJS) = (true));\n    function ef28de477e071720898c6baad2c6b05b12cc4b312(JSBNG__event) {\n        if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n            return ((JSBNG_Record.eventCall)((arguments.callee), (\"s11f7e5f2458195a59e011735485f15566cf4211d_0\"), (s11f7e5f2458195a59e011735485f15566cf4211d_0_instance), (this), (arguments)))\n        };\n        (null);\n        var meta = (((JSBNG_Record.get)(JSBNG__document, (\"getElementById\")))[(\"getElementById\")])(\"meta_referrer\");\n        ((JSBNG_Record.set)(meta, (\"JSBNG__content\"), \"origin\"));\n        JSBNG__setTimeout(((function() {\n            var s11f7e5f2458195a59e011735485f15566cf4211d_1_instance;\n            ((s11f7e5f2458195a59e011735485f15566cf4211d_1_instance) = ((JSBNG_Record.eventInstance)((\"s11f7e5f2458195a59e011735485f15566cf4211d_1\"))));\n            return ((JSBNG_Record.markFunction)((function() {\n                if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n                    return ((JSBNG_Record.eventCall)((arguments.callee), (\"s11f7e5f2458195a59e011735485f15566cf4211d_1\"), (s11f7e5f2458195a59e011735485f15566cf4211d_1_instance), (this), (arguments)))\n                };\n                (null);\n                ((JSBNG_Record.set)(meta, (\"JSBNG__content\"), \"default\"));\n            })));\n        })()), 100);\n        var attribute = \"href\";\n        var ms = (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"match\")))[(\"match\")])(/([\\\\?|&]f=)([^&]*)/);\n        if (ms) {\n            (((JSBNG_Record.get)(this, (\"setAttribute\")))[(\"setAttribute\")])(attribute, (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"replace\")))[(\"replace\")])(/[\\\\?|&]f=[^&]*/, ((((JSBNG_Record.get)(ms, 1))[1]) + 0)));\n        }\n        ;\n        ;\n        var attribute = \"href\";\n        var sig = (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"match\")))[(\"match\")])(/([\\\\?|&]sig=)([^&]*)/);\n        if (sig) {\n            (((JSBNG_Record.get)(this, (\"setAttribute\")))[(\"setAttribute\")])(attribute, (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"replace\")))[(\"replace\")])(/[\\\\?|&]sig=[^&]*/, ((((JSBNG_Record.get)(sig, 1))[1]) + (((((JSBNG_Record.get)(Math, (\"floor\")))[(\"floor\")])(((((JSBNG_Record.get)(Math, (\"JSBNG__random\")))[(\"JSBNG__random\")])() * 65535)) + 65536)))));\n        }\n        ;\n        ;\n    };\n    var s11f7e5f2458195a59e011735485f15566cf4211d_0_instance;\n    ((s11f7e5f2458195a59e011735485f15566cf4211d_0_instance) = ((JSBNG_Record.eventInstance)((\"s11f7e5f2458195a59e011735485f15566cf4211d_0\"))));\n    ((JSBNG_Record.markFunction)((ef28de477e071720898c6baad2c6b05b12cc4b312)));\n} finally {\n    ((window.top.JSBNG_Record.callerJS) = (false));\n    ((window.top.JSBNG_Record.flushDeferredEvents)());\n};</script><a class=\"forceLTR emuEvent1 _24x\" href=\"/ajax/emu/end.php?eid=AQI5MS3p7PmoZOkYz1-g1bhcl_ihn4Me_qxkz6ExYyZ6Ptcc8YBk7zVSepS3t2VJaPYX4hangH0-ljBRqDpoJOa93hz_L9-\\-\\Dht1_ed3yX9GClqUUFM2cqMqxvSVwxS3TfF3eNPJIv9hnQ8X8MgGQ9DaBkdVrQIt-t4kITCIpzoiDPe8F-D8d6sSllyxuQ3GUuk853fOQiwNt8BJkhbx24v0mMGM00G6tNnt99sTwBAlVb94zM23M6SHbMq2rOXBJ063K4L19AI5lZ02BHv_1_EF9dSVwoI9Vp22_oX_p6CDbPtqZJMb3yFp8EoDUOtSgopKSm0STXuLme3ITvV2SrCG0F9tk_atLtgGw8nQgCNkK_hKbs11EdIcVrz0YsVhy0vPaV5AywPLqM1PL_JjFNuPa4AzYOBZQSQvlOvEh-rD4lsQHn5nCZUmhSzjgs8s9lN7kc97LQJko0NUfEpW6A38y_1lhxtU2UdyS1vpiB5_E2fjWasz0sZ-LMCU3w5L2eurooyNpA5lmSlTFCZDw97s4Cl6Ea2MY3yKeG9USM_j__uNDmw-Ky2t5tS73heObkCginQdOzFr0bi570RPHbpIr9gJr1Pz-WxLsmvO7FVHeYJnwSItyNDNZwg9zmZeMNjrbnbvKkAgFu2qiWF_IPdH3etIDGbSco9BXsWTfs313VjaAAkbGcty2xe4MvxiFW4nB8-PkWW_UOjQwepjA8rc6Kw6akeI2Q7jJAvRc9CHdjgafRJxeK4ajl1M84swoGGwWRMtfheU-fO3raIM1S4uOREZCntZ-QAvVH36PuvlDlhyXPQActDMUCiOg-RAo-FoxoWrCkmPfnvFjsiaYfFwr5oZ_QHX5m0rIRjAzav4m7LZgNHpCEqWxbp-m4yQs4cTuZVRVC4Op-\\-\\d4zie7eCZvNnSUvc8OaJs1UPjq9hZuoP1D9k1upnQ9um94jl3Ao3XO_wq7C24Y9WhJWoTo5ruUq0tAcpyr7g4oXAmLYaYaVdz31I_SbWqdxlON1bL5Hh5Jfhq9Y8Oh_txkhyYqUr73X9afte2tSoCDZia4Zszfzi-EQsQX9HMl85aETVtcpZWQTiXlDet_WddSuYkEmOrwNuPqNFCCZmbd8E9NG0XQDwkT4F-2rPgeQORouZ-nTug-uxSZGqOxLkVJb9_aSUTYPUisB9iFggbslTgLu2r3Fgaq0VCeSWGChXNQ6xUJgS2Lo5w4yQJ8AUHnuhqmv8qL8YeyrgFCHkjQWV9M0GzcqHFo409aYD2P7n822yyvoY&amp;f=1&amp;ui=6010037469977-id_51ddd04f4b5207180068485&amp;en=1&amp;a=0&amp;sig=120303&amp;__tn__=wv\" onmousedown=\"return ef28de477e071720898c6baad2c6b05b12cc4b312.call(this, event);\">High energy costs?</a></div><div class=\"clearfix image_body_block\"><script type=\"text/javascript\">try {\n    ((JSBNG_Record.scriptLoad)((\"function ece5eeb2690d177de193f39c0aff43d597740bd67(event) {\\u000a    var meta = document.getElementById(\\\"meta_referrer\\\");\\u000a    meta.content = \\\"origin\\\";\\u000a    setTimeout(function() {\\u000a        meta.content = \\\"default\\\";\\u000a    }, 100);\\u000a    var attribute = \\\"href\\\";\\u000a    var ms = this.getAttribute(attribute).match(/([\\\\\\\\?|&]f=)([^&]*)/);\\u000a    if (ms) {\\u000a        this.setAttribute(attribute, this.getAttribute(attribute).replace(/[\\\\\\\\?|&]f=[^&]*/, (ms[1] + 0)));\\u000a    }\\u000a;\\u000a;\\u000a    var attribute = \\\"href\\\";\\u000a    var sig = this.getAttribute(attribute).match(/([\\\\\\\\?|&]sig=)([^&]*)/);\\u000a    if (sig) {\\u000a        this.setAttribute(attribute, this.getAttribute(attribute).replace(/[\\\\\\\\?|&]sig=[^&]*/, (sig[1] + ((Math.floor((Math.random() * 65535)) + 65536)))));\\u000a    }\\u000a;\\u000a;\\u000a};\"), (\"s4f13be56008e0d69e942d0564f6655f8057b7ba0\")));\n    ((window.top.JSBNG_Record.callerJS) = (true));\n    function ece5eeb2690d177de193f39c0aff43d597740bd67(JSBNG__event) {\n        if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n            return ((JSBNG_Record.eventCall)((arguments.callee), (\"s4f13be56008e0d69e942d0564f6655f8057b7ba0_0\"), (s4f13be56008e0d69e942d0564f6655f8057b7ba0_0_instance), (this), (arguments)))\n        };\n        (null);\n        var meta = (((JSBNG_Record.get)(JSBNG__document, (\"getElementById\")))[(\"getElementById\")])(\"meta_referrer\");\n        ((JSBNG_Record.set)(meta, (\"JSBNG__content\"), \"origin\"));\n        JSBNG__setTimeout(((function() {\n            var s4f13be56008e0d69e942d0564f6655f8057b7ba0_1_instance;\n            ((s4f13be56008e0d69e942d0564f6655f8057b7ba0_1_instance) = ((JSBNG_Record.eventInstance)((\"s4f13be56008e0d69e942d0564f6655f8057b7ba0_1\"))));\n            return ((JSBNG_Record.markFunction)((function() {\n                if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n                    return ((JSBNG_Record.eventCall)((arguments.callee), (\"s4f13be56008e0d69e942d0564f6655f8057b7ba0_1\"), (s4f13be56008e0d69e942d0564f6655f8057b7ba0_1_instance), (this), (arguments)))\n                };\n                (null);\n                ((JSBNG_Record.set)(meta, (\"JSBNG__content\"), \"default\"));\n            })));\n        })()), 100);\n        var attribute = \"href\";\n        var ms = (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"match\")))[(\"match\")])(/([\\\\?|&]f=)([^&]*)/);\n        if (ms) {\n            (((JSBNG_Record.get)(this, (\"setAttribute\")))[(\"setAttribute\")])(attribute, (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"replace\")))[(\"replace\")])(/[\\\\?|&]f=[^&]*/, ((((JSBNG_Record.get)(ms, 1))[1]) + 0)));\n        }\n        ;\n        ;\n        var attribute = \"href\";\n        var sig = (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"match\")))[(\"match\")])(/([\\\\?|&]sig=)([^&]*)/);\n        if (sig) {\n            (((JSBNG_Record.get)(this, (\"setAttribute\")))[(\"setAttribute\")])(attribute, (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"replace\")))[(\"replace\")])(/[\\\\?|&]sig=[^&]*/, ((((JSBNG_Record.get)(sig, 1))[1]) + (((((JSBNG_Record.get)(Math, (\"floor\")))[(\"floor\")])(((((JSBNG_Record.get)(Math, (\"JSBNG__random\")))[(\"JSBNG__random\")])() * 65535)) + 65536)))));\n        }\n        ;\n        ;\n    };\n    var s4f13be56008e0d69e942d0564f6655f8057b7ba0_0_instance;\n    ((s4f13be56008e0d69e942d0564f6655f8057b7ba0_0_instance) = ((JSBNG_Record.eventInstance)((\"s4f13be56008e0d69e942d0564f6655f8057b7ba0_0\"))));\n    ((JSBNG_Record.markFunction)((ece5eeb2690d177de193f39c0aff43d597740bd67)));\n} finally {\n    ((window.top.JSBNG_Record.callerJS) = (false));\n    ((window.top.JSBNG_Record.flushDeferredEvents)());\n};</script><a class=\"forceLTR emuEvent1 _24x image fbEmuImage _8o _8s lfloat\" tabindex=\"-1\" href=\"/ajax/emu/end.php?eid=AQI5MS3p7PmoZOkYz1-g1bhcl_ihn4Me_qxkz6ExYyZ6Ptcc8YBk7zVSepS3t2VJaPYX4hangH0-ljBRqDpoJOa93hz_L9-\\-\\Dht1_ed3yX9GClqUUFM2cqMqxvSVwxS3TfF3eNPJIv9hnQ8X8MgGQ9DaBkdVrQIt-t4kITCIpzoiDPe8F-D8d6sSllyxuQ3GUuk853fOQiwNt8BJkhbx24v0mMGM00G6tNnt99sTwBAlVb94zM23M6SHbMq2rOXBJ063K4L19AI5lZ02BHv_1_EF9dSVwoI9Vp22_oX_p6CDbPtqZJMb3yFp8EoDUOtSgopKSm0STXuLme3ITvV2SrCG0F9tk_atLtgGw8nQgCNkK_hKbs11EdIcVrz0YsVhy0vPaV5AywPLqM1PL_JjFNuPa4AzYOBZQSQvlOvEh-rD4lsQHn5nCZUmhSzjgs8s9lN7kc97LQJko0NUfEpW6A38y_1lhxtU2UdyS1vpiB5_E2fjWasz0sZ-LMCU3w5L2eurooyNpA5lmSlTFCZDw97s4Cl6Ea2MY3yKeG9USM_j__uNDmw-Ky2t5tS73heObkCginQdOzFr0bi570RPHbpIr9gJr1Pz-WxLsmvO7FVHeYJnwSItyNDNZwg9zmZeMNjrbnbvKkAgFu2qiWF_IPdH3etIDGbSco9BXsWTfs313VjaAAkbGcty2xe4MvxiFW4nB8-PkWW_UOjQwepjA8rc6Kw6akeI2Q7jJAvRc9CHdjgafRJxeK4ajl1M84swoGGwWRMtfheU-fO3raIM1S4uOREZCntZ-QAvVH36PuvlDlhyXPQActDMUCiOg-RAo-FoxoWrCkmPfnvFjsiaYfFwr5oZ_QHX5m0rIRjAzav4m7LZgNHpCEqWxbp-m4yQs4cTuZVRVC4Op-\\-\\d4zie7eCZvNnSUvc8OaJs1UPjq9hZuoP1D9k1upnQ9um94jl3Ao3XO_wq7C24Y9WhJWoTo5ruUq0tAcpyr7g4oXAmLYaYaVdz31I_SbWqdxlON1bL5Hh5Jfhq9Y8Oh_txkhyYqUr73X9afte2tSoCDZia4Zszfzi-EQsQX9HMl85aETVtcpZWQTiXlDet_WddSuYkEmOrwNuPqNFCCZmbd8E9NG0XQDwkT4F-2rPgeQORouZ-nTug-uxSZGqOxLkVJb9_aSUTYPUisB9iFggbslTgLu2r3Fgaq0VCeSWGChXNQ6xUJgS2Lo5w4yQJ8AUHnuhqmv8qL8YeyrgFCHkjQWV9M0GzcqHFo409aYD2P7n822yyvoY&amp;f=1&amp;ui=6010037469977-id_51ddd04f4b5207180068485&amp;en=1&amp;a=0&amp;sig=118789&amp;__tn__=ywv\" onmousedown=\"return ece5eeb2690d177de193f39c0aff43d597740bd67.call(this, event);\" aria-hidden=\"true\"><img class=\"img\" src=\"http://jsbngssl.creative.xx.fbcdn.net/hads-prn1/s110x80/735361_6010037447377_1745788505_n.png\" alt=\"\" /></a><div class=\"_42ef\"><div class=\"body\"><script type=\"text/javascript\">try {\n    ((JSBNG_Record.scriptLoad)((\"function edf5d72c8018fb9c0147b9c0883e5beda2fcc645c(event) {\\u000a    var meta = document.getElementById(\\\"meta_referrer\\\");\\u000a    meta.content = \\\"origin\\\";\\u000a    setTimeout(function() {\\u000a        meta.content = \\\"default\\\";\\u000a    }, 100);\\u000a    var attribute = \\\"href\\\";\\u000a    var ms = this.getAttribute(attribute).match(/([\\\\\\\\?|&]f=)([^&]*)/);\\u000a    if (ms) {\\u000a        this.setAttribute(attribute, this.getAttribute(attribute).replace(/[\\\\\\\\?|&]f=[^&]*/, (ms[1] + 0)));\\u000a    }\\u000a;\\u000a;\\u000a    var attribute = \\\"href\\\";\\u000a    var sig = this.getAttribute(attribute).match(/([\\\\\\\\?|&]sig=)([^&]*)/);\\u000a    if (sig) {\\u000a        this.setAttribute(attribute, this.getAttribute(attribute).replace(/[\\\\\\\\?|&]sig=[^&]*/, (sig[1] + ((Math.floor((Math.random() * 65535)) + 65536)))));\\u000a    }\\u000a;\\u000a;\\u000a};\"), (\"s8e1304dcd71fbc8c267299685b79cb5378ae1c5c\")));\n    ((window.top.JSBNG_Record.callerJS) = (true));\n    function edf5d72c8018fb9c0147b9c0883e5beda2fcc645c(JSBNG__event) {\n        if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n            return ((JSBNG_Record.eventCall)((arguments.callee), (\"s8e1304dcd71fbc8c267299685b79cb5378ae1c5c_0\"), (s8e1304dcd71fbc8c267299685b79cb5378ae1c5c_0_instance), (this), (arguments)))\n        };\n        (null);\n        var meta = (((JSBNG_Record.get)(JSBNG__document, (\"getElementById\")))[(\"getElementById\")])(\"meta_referrer\");\n        ((JSBNG_Record.set)(meta, (\"JSBNG__content\"), \"origin\"));\n        JSBNG__setTimeout(((function() {\n            var s8e1304dcd71fbc8c267299685b79cb5378ae1c5c_1_instance;\n            ((s8e1304dcd71fbc8c267299685b79cb5378ae1c5c_1_instance) = ((JSBNG_Record.eventInstance)((\"s8e1304dcd71fbc8c267299685b79cb5378ae1c5c_1\"))));\n            return ((JSBNG_Record.markFunction)((function() {\n                if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n                    return ((JSBNG_Record.eventCall)((arguments.callee), (\"s8e1304dcd71fbc8c267299685b79cb5378ae1c5c_1\"), (s8e1304dcd71fbc8c267299685b79cb5378ae1c5c_1_instance), (this), (arguments)))\n                };\n                (null);\n                ((JSBNG_Record.set)(meta, (\"JSBNG__content\"), \"default\"));\n            })));\n        })()), 100);\n        var attribute = \"href\";\n        var ms = (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"match\")))[(\"match\")])(/([\\\\?|&]f=)([^&]*)/);\n        if (ms) {\n            (((JSBNG_Record.get)(this, (\"setAttribute\")))[(\"setAttribute\")])(attribute, (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"replace\")))[(\"replace\")])(/[\\\\?|&]f=[^&]*/, ((((JSBNG_Record.get)(ms, 1))[1]) + 0)));\n        }\n        ;\n        ;\n        var attribute = \"href\";\n        var sig = (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"match\")))[(\"match\")])(/([\\\\?|&]sig=)([^&]*)/);\n        if (sig) {\n            (((JSBNG_Record.get)(this, (\"setAttribute\")))[(\"setAttribute\")])(attribute, (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"replace\")))[(\"replace\")])(/[\\\\?|&]sig=[^&]*/, ((((JSBNG_Record.get)(sig, 1))[1]) + (((((JSBNG_Record.get)(Math, (\"floor\")))[(\"floor\")])(((((JSBNG_Record.get)(Math, (\"JSBNG__random\")))[(\"JSBNG__random\")])() * 65535)) + 65536)))));\n        }\n        ;\n        ;\n    };\n    var s8e1304dcd71fbc8c267299685b79cb5378ae1c5c_0_instance;\n    ((s8e1304dcd71fbc8c267299685b79cb5378ae1c5c_0_instance) = ((JSBNG_Record.eventInstance)((\"s8e1304dcd71fbc8c267299685b79cb5378ae1c5c_0\"))));\n    ((JSBNG_Record.markFunction)((edf5d72c8018fb9c0147b9c0883e5beda2fcc645c)));\n} finally {\n    ((window.top.JSBNG_Record.callerJS) = (false));\n    ((window.top.JSBNG_Record.flushDeferredEvents)());\n};</script><a class=\"forceLTR emuEvent1 _24x\" href=\"/ajax/emu/end.php?eid=AQI5MS3p7PmoZOkYz1-g1bhcl_ihn4Me_qxkz6ExYyZ6Ptcc8YBk7zVSepS3t2VJaPYX4hangH0-ljBRqDpoJOa93hz_L9-\\-\\Dht1_ed3yX9GClqUUFM2cqMqxvSVwxS3TfF3eNPJIv9hnQ8X8MgGQ9DaBkdVrQIt-t4kITCIpzoiDPe8F-D8d6sSllyxuQ3GUuk853fOQiwNt8BJkhbx24v0mMGM00G6tNnt99sTwBAlVb94zM23M6SHbMq2rOXBJ063K4L19AI5lZ02BHv_1_EF9dSVwoI9Vp22_oX_p6CDbPtqZJMb3yFp8EoDUOtSgopKSm0STXuLme3ITvV2SrCG0F9tk_atLtgGw8nQgCNkK_hKbs11EdIcVrz0YsVhy0vPaV5AywPLqM1PL_JjFNuPa4AzYOBZQSQvlOvEh-rD4lsQHn5nCZUmhSzjgs8s9lN7kc97LQJko0NUfEpW6A38y_1lhxtU2UdyS1vpiB5_E2fjWasz0sZ-LMCU3w5L2eurooyNpA5lmSlTFCZDw97s4Cl6Ea2MY3yKeG9USM_j__uNDmw-Ky2t5tS73heObkCginQdOzFr0bi570RPHbpIr9gJr1Pz-WxLsmvO7FVHeYJnwSItyNDNZwg9zmZeMNjrbnbvKkAgFu2qiWF_IPdH3etIDGbSco9BXsWTfs313VjaAAkbGcty2xe4MvxiFW4nB8-PkWW_UOjQwepjA8rc6Kw6akeI2Q7jJAvRc9CHdjgafRJxeK4ajl1M84swoGGwWRMtfheU-fO3raIM1S4uOREZCntZ-QAvVH36PuvlDlhyXPQActDMUCiOg-RAo-FoxoWrCkmPfnvFjsiaYfFwr5oZ_QHX5m0rIRjAzav4m7LZgNHpCEqWxbp-m4yQs4cTuZVRVC4Op-\\-\\d4zie7eCZvNnSUvc8OaJs1UPjq9hZuoP1D9k1upnQ9um94jl3Ao3XO_wq7C24Y9WhJWoTo5ruUq0tAcpyr7g4oXAmLYaYaVdz31I_SbWqdxlON1bL5Hh5Jfhq9Y8Oh_txkhyYqUr73X9afte2tSoCDZia4Zszfzi-EQsQX9HMl85aETVtcpZWQTiXlDet_WddSuYkEmOrwNuPqNFCCZmbd8E9NG0XQDwkT4F-2rPgeQORouZ-nTug-uxSZGqOxLkVJb9_aSUTYPUisB9iFggbslTgLu2r3Fgaq0VCeSWGChXNQ6xUJgS2Lo5w4yQJ8AUHnuhqmv8qL8YeyrgFCHkjQWV9M0GzcqHFo409aYD2P7n822yyvoY&amp;f=1&amp;ui=6010037469977-id_51ddd04f4b5207180068485&amp;en=1&amp;a=0&amp;sig=100629&amp;__tn__=xywv\" onmousedown=\"return edf5d72c8018fb9c0147b9c0883e5beda2fcc645c.call(this, event);\">You could be paying too much for electricity. We can help you $ave money on energy costs.</a></div></div></div><div class=\"inline\"><div class=\"action\"><a class=\"uiIconText emuEventfad_fan _24x\" href=\"#\" style=\"padding-left: 17px;\" rel=\"async-post\" ajaxify=\"/ajax/emu/end.php?eid=AQI5MS3p7PmoZOkYz1-g1bhcl_ihn4Me_qxkz6ExYyZ6Ptcc8YBk7zVSepS3t2VJaPYX4hangH0-ljBRqDpoJOa93hz_L9-\\-\\Dht1_ed3yX9GClqUUFM2cqMqxvSVwxS3TfF3eNPJIv9hnQ8X8MgGQ9DaBkdVrQIt-t4kITCIpzoiDPe8F-D8d6sSllyxuQ3GUuk853fOQiwNt8BJkhbx24v0mMGM00G6tNnt99sTwBAlVb94zM23M6SHbMq2rOXBJ063K4L19AI5lZ02BHv_1_EF9dSVwoI9Vp22_oX_p6CDbPtqZJMb3yFp8EoDUOtSgopKSm0STXuLme3ITvV2SrCG0F9tk_atLtgGw8nQgCNkK_hKbs11EdIcVrz0YsVhy0vPaV5AywPLqM1PL_JjFNuPa4AzYOBZQSQvlOvEh-rD4lsQHn5nCZUmhSzjgs8s9lN7kc97LQJko0NUfEpW6A38y_1lhxtU2UdyS1vpiB5_E2fjWasz0sZ-LMCU3w5L2eurooyNpA5lmSlTFCZDw97s4Cl6Ea2MY3yKeG9USM_j__uNDmw-Ky2t5tS73heObkCginQdOzFr0bi570RPHbpIr9gJr1Pz-WxLsmvO7FVHeYJnwSItyNDNZwg9zmZeMNjrbnbvKkAgFu2qiWF_IPdH3etIDGbSco9BXsWTfs313VjaAAkbGcty2xe4MvxiFW4nB8-PkWW_UOjQwepjA8rc6Kw6akeI2Q7jJAvRc9CHdjgafRJxeK4ajl1M84swoGGwWRMtfheU-fO3raIM1S4uOREZCntZ-QAvVH36PuvlDlhyXPQActDMUCiOg-RAo-FoxoWrCkmPfnvFjsiaYfFwr5oZ_QHX5m0rIRjAzav4m7LZgNHpCEqWxbp-m4yQs4cTuZVRVC4Op-\\-\\d4zie7eCZvNnSUvc8OaJs1UPjq9hZuoP1D9k1upnQ9um94jl3Ao3XO_wq7C24Y9WhJWoTo5ruUq0tAcpyr7g4oXAmLYaYaVdz31I_SbWqdxlON1bL5Hh5Jfhq9Y8Oh_txkhyYqUr73X9afte2tSoCDZia4Zszfzi-EQsQX9HMl85aETVtcpZWQTiXlDet_WddSuYkEmOrwNuPqNFCCZmbd8E9NG0XQDwkT4F-2rPgeQORouZ-nTug-uxSZGqOxLkVJb9_aSUTYPUisB9iFggbslTgLu2r3Fgaq0VCeSWGChXNQ6xUJgS2Lo5w4yQJ8AUHnuhqmv8qL8YeyrgFCHkjQWV9M0GzcqHFo409aYD2P7n822yyvoY&amp;f=0&amp;ui=6010037469977-id_51ddd04f4b5207180068485&amp;en=fad_fan&amp;ed=149993378445656&amp;a=1&amp;__tn__=wv\" role=\"button\"><i class=\"img sp_4p6kmz sx_bc56c4\" style=\"top: 1px;\"></i>Like</a> · <span class=\"fbEmuContext\">42 people like <script type=\"text/javascript\">try {\n    ((JSBNG_Record.scriptLoad)((\"function e2e06132baab585b35261ab8e15905f80d6deac94(event) {\\u000a    var meta = document.getElementById(\\\"meta_referrer\\\");\\u000a    meta.content = \\\"origin\\\";\\u000a    setTimeout(function() {\\u000a        meta.content = \\\"default\\\";\\u000a    }, 100);\\u000a    var attribute = \\\"href\\\";\\u000a    var ms = this.getAttribute(attribute).match(/([\\\\\\\\?|&]f=)([^&]*)/);\\u000a    if (ms) {\\u000a        this.setAttribute(attribute, this.getAttribute(attribute).replace(/[\\\\\\\\?|&]f=[^&]*/, (ms[1] + 0)));\\u000a    }\\u000a;\\u000a;\\u000a    var attribute = \\\"href\\\";\\u000a    var sig = this.getAttribute(attribute).match(/([\\\\\\\\?|&]sig=)([^&]*)/);\\u000a    if (sig) {\\u000a        this.setAttribute(attribute, this.getAttribute(attribute).replace(/[\\\\\\\\?|&]sig=[^&]*/, (sig[1] + ((Math.floor((Math.random() * 65535)) + 65536)))));\\u000a    }\\u000a;\\u000a;\\u000a};\"), (\"s6d0458d8aa2ef1d31844cdf8ffed9173a2ec3737\")));\n    ((window.top.JSBNG_Record.callerJS) = (true));\n    function e2e06132baab585b35261ab8e15905f80d6deac94(JSBNG__event) {\n        if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n            return ((JSBNG_Record.eventCall)((arguments.callee), (\"s6d0458d8aa2ef1d31844cdf8ffed9173a2ec3737_0\"), (s6d0458d8aa2ef1d31844cdf8ffed9173a2ec3737_0_instance), (this), (arguments)))\n        };\n        (null);\n        var meta = (((JSBNG_Record.get)(JSBNG__document, (\"getElementById\")))[(\"getElementById\")])(\"meta_referrer\");\n        ((JSBNG_Record.set)(meta, (\"JSBNG__content\"), \"origin\"));\n        JSBNG__setTimeout(((function() {\n            var s6d0458d8aa2ef1d31844cdf8ffed9173a2ec3737_1_instance;\n            ((s6d0458d8aa2ef1d31844cdf8ffed9173a2ec3737_1_instance) = ((JSBNG_Record.eventInstance)((\"s6d0458d8aa2ef1d31844cdf8ffed9173a2ec3737_1\"))));\n            return ((JSBNG_Record.markFunction)((function() {\n                if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n                    return ((JSBNG_Record.eventCall)((arguments.callee), (\"s6d0458d8aa2ef1d31844cdf8ffed9173a2ec3737_1\"), (s6d0458d8aa2ef1d31844cdf8ffed9173a2ec3737_1_instance), (this), (arguments)))\n                };\n                (null);\n                ((JSBNG_Record.set)(meta, (\"JSBNG__content\"), \"default\"));\n            })));\n        })()), 100);\n        var attribute = \"href\";\n        var ms = (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"match\")))[(\"match\")])(/([\\\\?|&]f=)([^&]*)/);\n        if (ms) {\n            (((JSBNG_Record.get)(this, (\"setAttribute\")))[(\"setAttribute\")])(attribute, (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"replace\")))[(\"replace\")])(/[\\\\?|&]f=[^&]*/, ((((JSBNG_Record.get)(ms, 1))[1]) + 0)));\n        }\n        ;\n        ;\n        var attribute = \"href\";\n        var sig = (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"match\")))[(\"match\")])(/([\\\\?|&]sig=)([^&]*)/);\n        if (sig) {\n            (((JSBNG_Record.get)(this, (\"setAttribute\")))[(\"setAttribute\")])(attribute, (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"replace\")))[(\"replace\")])(/[\\\\?|&]sig=[^&]*/, ((((JSBNG_Record.get)(sig, 1))[1]) + (((((JSBNG_Record.get)(Math, (\"floor\")))[(\"floor\")])(((((JSBNG_Record.get)(Math, (\"JSBNG__random\")))[(\"JSBNG__random\")])() * 65535)) + 65536)))));\n        }\n        ;\n        ;\n    };\n    var s6d0458d8aa2ef1d31844cdf8ffed9173a2ec3737_0_instance;\n    ((s6d0458d8aa2ef1d31844cdf8ffed9173a2ec3737_0_instance) = ((JSBNG_Record.eventInstance)((\"s6d0458d8aa2ef1d31844cdf8ffed9173a2ec3737_0\"))));\n    ((JSBNG_Record.markFunction)((e2e06132baab585b35261ab8e15905f80d6deac94)));\n} finally {\n    ((window.top.JSBNG_Record.callerJS) = (false));\n    ((window.top.JSBNG_Record.flushDeferredEvents)());\n};</script><a class=\"emuEventfad_pageclick _24x\" href=\"/ajax/emu/end.php?eid=AQI5MS3p7PmoZOkYz1-g1bhcl_ihn4Me_qxkz6ExYyZ6Ptcc8YBk7zVSepS3t2VJaPYX4hangH0-ljBRqDpoJOa93hz_L9-\\-\\Dht1_ed3yX9GClqUUFM2cqMqxvSVwxS3TfF3eNPJIv9hnQ8X8MgGQ9DaBkdVrQIt-t4kITCIpzoiDPe8F-D8d6sSllyxuQ3GUuk853fOQiwNt8BJkhbx24v0mMGM00G6tNnt99sTwBAlVb94zM23M6SHbMq2rOXBJ063K4L19AI5lZ02BHv_1_EF9dSVwoI9Vp22_oX_p6CDbPtqZJMb3yFp8EoDUOtSgopKSm0STXuLme3ITvV2SrCG0F9tk_atLtgGw8nQgCNkK_hKbs11EdIcVrz0YsVhy0vPaV5AywPLqM1PL_JjFNuPa4AzYOBZQSQvlOvEh-rD4lsQHn5nCZUmhSzjgs8s9lN7kc97LQJko0NUfEpW6A38y_1lhxtU2UdyS1vpiB5_E2fjWasz0sZ-LMCU3w5L2eurooyNpA5lmSlTFCZDw97s4Cl6Ea2MY3yKeG9USM_j__uNDmw-Ky2t5tS73heObkCginQdOzFr0bi570RPHbpIr9gJr1Pz-WxLsmvO7FVHeYJnwSItyNDNZwg9zmZeMNjrbnbvKkAgFu2qiWF_IPdH3etIDGbSco9BXsWTfs313VjaAAkbGcty2xe4MvxiFW4nB8-PkWW_UOjQwepjA8rc6Kw6akeI2Q7jJAvRc9CHdjgafRJxeK4ajl1M84swoGGwWRMtfheU-fO3raIM1S4uOREZCntZ-QAvVH36PuvlDlhyXPQActDMUCiOg-RAo-FoxoWrCkmPfnvFjsiaYfFwr5oZ_QHX5m0rIRjAzav4m7LZgNHpCEqWxbp-m4yQs4cTuZVRVC4Op-\\-\\d4zie7eCZvNnSUvc8OaJs1UPjq9hZuoP1D9k1upnQ9um94jl3Ao3XO_wq7C24Y9WhJWoTo5ruUq0tAcpyr7g4oXAmLYaYaVdz31I_SbWqdxlON1bL5Hh5Jfhq9Y8Oh_txkhyYqUr73X9afte2tSoCDZia4Zszfzi-EQsQX9HMl85aETVtcpZWQTiXlDet_WddSuYkEmOrwNuPqNFCCZmbd8E9NG0XQDwkT4F-2rPgeQORouZ-nTug-uxSZGqOxLkVJb9_aSUTYPUisB9iFggbslTgLu2r3Fgaq0VCeSWGChXNQ6xUJgS2Lo5w4yQJ8AUHnuhqmv8qL8YeyrgFCHkjQWV9M0GzcqHFo409aYD2P7n822yyvoY&amp;f=1&amp;ui=6010037469977-id_51ddd04f4b5207180068485&amp;en=fad_pageclick&amp;ed=149993378445656&amp;a=0&amp;mac=AQKFDBvFI3R4T4gq&amp;sig=70006&amp;__tn__=zwv\" onmousedown=\"return e2e06132baab585b35261ab8e15905f80d6deac94.call(this, event);\">Secure Energy Solutions</a>.</span></div></div></div></div></div><div class=\"ego_unit\" data-ego-fbid=\"6008948705864\"><div class=\"_4u8\" data-ad=\"&#123;&quot;adid&quot;:6008948705864,&quot;segment&quot;:&quot;market&quot;&#125;\" id=\"6008948705864-id_51ddd04f4b59a3268404703\"><div class=\"_24n _24y\"><div class=\"uiSelector inlineBlock emu_x emuEventfad_hide _24x uiSelectorRight\"><div class=\"uiToggle wrap\"><a class=\"uiSelectorButton uiCloseButton uiCloseButtonSmall\" href=\"#\" role=\"button\" title=\"About Facebook Ads\" rel=\"toggle\" ajaxify=\"/ajax/emu/end.php?eid=AQJitB_HcoNKErKtrE1sFhSrP-tJFXEaNq2L9DGjGez_P-aWdI7tb3MQm3rKVU8GGq31CKIdLSfV9Da0z9htTnIlE8v0zWpIG2uga9AQ91KRFjegyqUemEZX5TBJfS-gzxI6STRlpJzAduP1XXzH3_GVuf6Q5oDNvMkhG8yRibyI5SMbprQr3A7FNtxCc50MT_Z9Q3uN1CHzijuyo7YzbleWb_kSUVovVvqNdIX0MM8JQ17BRs29aPQuZCi2HmAmgR0P_9k0jVBaKfSFDyAJejchw8vMr6OZLS_0siapgQpdDkZeoGE7aiorw3lnV-6VAdeA3A7aiYU7rnEikQV9eHA96htHndp_8lc3ka8EyV_lRc46WCsa5-SVj3HVWj_I3pfzQeLKQp214smdOUCLGLHKGPGuUiIcKx4PYL-ewY74gOFIN1yxBWMmvJP5GrGFiw7kK45tOgnBQmnfcmMXIcBfXlVVOk1q-5o1w3pYsHZw1ZgbmKpP_hRIj0u0HuN6n9q9moAJ0mfL6iYlELp-PIeAiBzA8THivuMrKRSdSvxW4M9dxBqyI5TwKSdxfIn53KKwrLkRN5tHjhp-XkAjG9VVfCag5xK44A_SwgFd4Y7M1VPb5g5x_CC-7HIRMBm4QCTMVFz2KS4Zk42I6-FhpRmw0RHsrp8erbOzpd11nxmnL-Yf7fK-TPIsnheUbmFRmLjlUNmMeQT_z3rNTyOBj-qqvnK0IG3IonJVtHknSLvhRYmNkS6__8C0kU2cMvm-KJHdc8dX5FQ06y0evFOFKx-qngoiuaIv_AcDzvW4y3ByUnurF-2jE9ju1DQH9HoTPKu4yvlB6ppvMnOQ51fpLMW1xO7bTJlu5stUxLR-2Ijq9nuNTH4qKkwSAHR3U_oaehsFPksTtYxgA0T7o96rP_7tS3IEUwtuIieP0VsReFAAPrfElIQ07QuK2882l3KgRajixpFP0Vv-APJQrBikDlFlaiCuOp5zCV2g-s0B1eoo6cuP6CqKWaX0G6XrT9Y3CtFLCowNTYiQ0sZeMEzH58lBAWvlsCyjX62os4-278WMX3sp8bEV6NPOwWkzpurwm4lYpQ0LuRCjEfnzpDDR6OxNXNBve6pHB1_NP8Xh0vbkYNkQQpi1hxwh__OTpP232_P9wi1pc6yu1suD1Fp2Dm-vADs_5NmxHBT_EwqAwYzti4dbaT6ritCOMJRtX9ngPBes9z1DU2LKG7vLyuanLJ3pai8IKROpgAZRWwdm0MdYudjhpaAQCxVeNjPHpI0LRSE&amp;f=0&amp;ui=6008948705864-id_51ddd04f4b59a3268404703&amp;en=fad_hide&amp;ed=true&amp;a=1&amp;__tn__=v\" aria-haspopup=\"1\"></a></div></div><div class=\"title\"><script type=\"text/javascript\">try {\n    ((JSBNG_Record.scriptLoad)((\"function e2dcff99bc54e497223886312102272d6454a1514(event) {\\u000a    var meta = document.getElementById(\\\"meta_referrer\\\");\\u000a    meta.content = \\\"origin\\\";\\u000a    setTimeout(function() {\\u000a        meta.content = \\\"default\\\";\\u000a    }, 100);\\u000a    var attribute = \\\"href\\\";\\u000a    var ms = this.getAttribute(attribute).match(/([\\\\\\\\?|&]f=)([^&]*)/);\\u000a    if (ms) {\\u000a        this.setAttribute(attribute, this.getAttribute(attribute).replace(/[\\\\\\\\?|&]f=[^&]*/, (ms[1] + 0)));\\u000a    }\\u000a;\\u000a;\\u000a    var attribute = \\\"href\\\";\\u000a    var sig = this.getAttribute(attribute).match(/([\\\\\\\\?|&]sig=)([^&]*)/);\\u000a    if (sig) {\\u000a        this.setAttribute(attribute, this.getAttribute(attribute).replace(/[\\\\\\\\?|&]sig=[^&]*/, (sig[1] + ((Math.floor((Math.random() * 65535)) + 65536)))));\\u000a    }\\u000a;\\u000a;\\u000a};\"), (\"sa0c7005338a14bbd110a7f135140ceb90831af34\")));\n    ((window.top.JSBNG_Record.callerJS) = (true));\n    function e2dcff99bc54e497223886312102272d6454a1514(JSBNG__event) {\n        if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n            return ((JSBNG_Record.eventCall)((arguments.callee), (\"sa0c7005338a14bbd110a7f135140ceb90831af34_0\"), (sa0c7005338a14bbd110a7f135140ceb90831af34_0_instance), (this), (arguments)))\n        };\n        (null);\n        var meta = (((JSBNG_Record.get)(JSBNG__document, (\"getElementById\")))[(\"getElementById\")])(\"meta_referrer\");\n        ((JSBNG_Record.set)(meta, (\"JSBNG__content\"), \"origin\"));\n        JSBNG__setTimeout(((function() {\n            var sa0c7005338a14bbd110a7f135140ceb90831af34_1_instance;\n            ((sa0c7005338a14bbd110a7f135140ceb90831af34_1_instance) = ((JSBNG_Record.eventInstance)((\"sa0c7005338a14bbd110a7f135140ceb90831af34_1\"))));\n            return ((JSBNG_Record.markFunction)((function() {\n                if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n                    return ((JSBNG_Record.eventCall)((arguments.callee), (\"sa0c7005338a14bbd110a7f135140ceb90831af34_1\"), (sa0c7005338a14bbd110a7f135140ceb90831af34_1_instance), (this), (arguments)))\n                };\n                (null);\n                ((JSBNG_Record.set)(meta, (\"JSBNG__content\"), \"default\"));\n            })));\n        })()), 100);\n        var attribute = \"href\";\n        var ms = (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"match\")))[(\"match\")])(/([\\\\?|&]f=)([^&]*)/);\n        if (ms) {\n            (((JSBNG_Record.get)(this, (\"setAttribute\")))[(\"setAttribute\")])(attribute, (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"replace\")))[(\"replace\")])(/[\\\\?|&]f=[^&]*/, ((((JSBNG_Record.get)(ms, 1))[1]) + 0)));\n        }\n        ;\n        ;\n        var attribute = \"href\";\n        var sig = (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"match\")))[(\"match\")])(/([\\\\?|&]sig=)([^&]*)/);\n        if (sig) {\n            (((JSBNG_Record.get)(this, (\"setAttribute\")))[(\"setAttribute\")])(attribute, (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"replace\")))[(\"replace\")])(/[\\\\?|&]sig=[^&]*/, ((((JSBNG_Record.get)(sig, 1))[1]) + (((((JSBNG_Record.get)(Math, (\"floor\")))[(\"floor\")])(((((JSBNG_Record.get)(Math, (\"JSBNG__random\")))[(\"JSBNG__random\")])() * 65535)) + 65536)))));\n        }\n        ;\n        ;\n    };\n    var sa0c7005338a14bbd110a7f135140ceb90831af34_0_instance;\n    ((sa0c7005338a14bbd110a7f135140ceb90831af34_0_instance) = ((JSBNG_Record.eventInstance)((\"sa0c7005338a14bbd110a7f135140ceb90831af34_0\"))));\n    ((JSBNG_Record.markFunction)((e2dcff99bc54e497223886312102272d6454a1514)));\n} finally {\n    ((window.top.JSBNG_Record.callerJS) = (false));\n    ((window.top.JSBNG_Record.flushDeferredEvents)());\n};</script><a class=\"forceLTR emuEvent1 _24x\" href=\"/ajax/emu/end.php?eid=AQJitB_HcoNKErKtrE1sFhSrP-tJFXEaNq2L9DGjGez_P-aWdI7tb3MQm3rKVU8GGq31CKIdLSfV9Da0z9htTnIlE8v0zWpIG2uga9AQ91KRFjegyqUemEZX5TBJfS-gzxI6STRlpJzAduP1XXzH3_GVuf6Q5oDNvMkhG8yRibyI5SMbprQr3A7FNtxCc50MT_Z9Q3uN1CHzijuyo7YzbleWb_kSUVovVvqNdIX0MM8JQ17BRs29aPQuZCi2HmAmgR0P_9k0jVBaKfSFDyAJejchw8vMr6OZLS_0siapgQpdDkZeoGE7aiorw3lnV-6VAdeA3A7aiYU7rnEikQV9eHA96htHndp_8lc3ka8EyV_lRc46WCsa5-SVj3HVWj_I3pfzQeLKQp214smdOUCLGLHKGPGuUiIcKx4PYL-ewY74gOFIN1yxBWMmvJP5GrGFiw7kK45tOgnBQmnfcmMXIcBfXlVVOk1q-5o1w3pYsHZw1ZgbmKpP_hRIj0u0HuN6n9q9moAJ0mfL6iYlELp-PIeAiBzA8THivuMrKRSdSvxW4M9dxBqyI5TwKSdxfIn53KKwrLkRN5tHjhp-XkAjG9VVfCag5xK44A_SwgFd4Y7M1VPb5g5x_CC-7HIRMBm4QCTMVFz2KS4Zk42I6-FhpRmw0RHsrp8erbOzpd11nxmnL-Yf7fK-TPIsnheUbmFRmLjlUNmMeQT_z3rNTyOBj-qqvnK0IG3IonJVtHknSLvhRYmNkS6__8C0kU2cMvm-KJHdc8dX5FQ06y0evFOFKx-qngoiuaIv_AcDzvW4y3ByUnurF-2jE9ju1DQH9HoTPKu4yvlB6ppvMnOQ51fpLMW1xO7bTJlu5stUxLR-2Ijq9nuNTH4qKkwSAHR3U_oaehsFPksTtYxgA0T7o96rP_7tS3IEUwtuIieP0VsReFAAPrfElIQ07QuK2882l3KgRajixpFP0Vv-APJQrBikDlFlaiCuOp5zCV2g-s0B1eoo6cuP6CqKWaX0G6XrT9Y3CtFLCowNTYiQ0sZeMEzH58lBAWvlsCyjX62os4-278WMX3sp8bEV6NPOwWkzpurwm4lYpQ0LuRCjEfnzpDDR6OxNXNBve6pHB1_NP8Xh0vbkYNkQQpi1hxwh__OTpP232_P9wi1pc6yu1suD1Fp2Dm-vADs_5NmxHBT_EwqAwYzti4dbaT6ritCOMJRtX9ngPBes9z1DU2LKG7vLyuanLJ3pai8IKROpgAZRWwdm0MdYudjhpaAQCxVeNjPHpI0LRSE&amp;f=1&amp;ui=6008948705864-id_51ddd04f4b59a3268404703&amp;en=1&amp;a=0&amp;sig=124355&amp;__tn__=wv\" onmousedown=\"return e2dcff99bc54e497223886312102272d6454a1514.call(this, event);\">Bing&#039;s Hallmark</a></div><div class=\"clearfix image_body_block\"><script type=\"text/javascript\">try {\n    ((JSBNG_Record.scriptLoad)((\"function ef17124233d9e1069ffb942c36e3c0f2cb19589c5(event) {\\u000a    var meta = document.getElementById(\\\"meta_referrer\\\");\\u000a    meta.content = \\\"origin\\\";\\u000a    setTimeout(function() {\\u000a        meta.content = \\\"default\\\";\\u000a    }, 100);\\u000a    var attribute = \\\"href\\\";\\u000a    var ms = this.getAttribute(attribute).match(/([\\\\\\\\?|&]f=)([^&]*)/);\\u000a    if (ms) {\\u000a        this.setAttribute(attribute, this.getAttribute(attribute).replace(/[\\\\\\\\?|&]f=[^&]*/, (ms[1] + 0)));\\u000a    }\\u000a;\\u000a;\\u000a    var attribute = \\\"href\\\";\\u000a    var sig = this.getAttribute(attribute).match(/([\\\\\\\\?|&]sig=)([^&]*)/);\\u000a    if (sig) {\\u000a        this.setAttribute(attribute, this.getAttribute(attribute).replace(/[\\\\\\\\?|&]sig=[^&]*/, (sig[1] + ((Math.floor((Math.random() * 65535)) + 65536)))));\\u000a    }\\u000a;\\u000a;\\u000a};\"), (\"sbf5249bbd0fcdd553bc13c221bb1b6e0bb7cb804\")));\n    ((window.top.JSBNG_Record.callerJS) = (true));\n    function ef17124233d9e1069ffb942c36e3c0f2cb19589c5(JSBNG__event) {\n        if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n            return ((JSBNG_Record.eventCall)((arguments.callee), (\"sbf5249bbd0fcdd553bc13c221bb1b6e0bb7cb804_0\"), (sbf5249bbd0fcdd553bc13c221bb1b6e0bb7cb804_0_instance), (this), (arguments)))\n        };\n        (null);\n        var meta = (((JSBNG_Record.get)(JSBNG__document, (\"getElementById\")))[(\"getElementById\")])(\"meta_referrer\");\n        ((JSBNG_Record.set)(meta, (\"JSBNG__content\"), \"origin\"));\n        JSBNG__setTimeout(((function() {\n            var sbf5249bbd0fcdd553bc13c221bb1b6e0bb7cb804_1_instance;\n            ((sbf5249bbd0fcdd553bc13c221bb1b6e0bb7cb804_1_instance) = ((JSBNG_Record.eventInstance)((\"sbf5249bbd0fcdd553bc13c221bb1b6e0bb7cb804_1\"))));\n            return ((JSBNG_Record.markFunction)((function() {\n                if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n                    return ((JSBNG_Record.eventCall)((arguments.callee), (\"sbf5249bbd0fcdd553bc13c221bb1b6e0bb7cb804_1\"), (sbf5249bbd0fcdd553bc13c221bb1b6e0bb7cb804_1_instance), (this), (arguments)))\n                };\n                (null);\n                ((JSBNG_Record.set)(meta, (\"JSBNG__content\"), \"default\"));\n            })));\n        })()), 100);\n        var attribute = \"href\";\n        var ms = (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"match\")))[(\"match\")])(/([\\\\?|&]f=)([^&]*)/);\n        if (ms) {\n            (((JSBNG_Record.get)(this, (\"setAttribute\")))[(\"setAttribute\")])(attribute, (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"replace\")))[(\"replace\")])(/[\\\\?|&]f=[^&]*/, ((((JSBNG_Record.get)(ms, 1))[1]) + 0)));\n        }\n        ;\n        ;\n        var attribute = \"href\";\n        var sig = (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"match\")))[(\"match\")])(/([\\\\?|&]sig=)([^&]*)/);\n        if (sig) {\n            (((JSBNG_Record.get)(this, (\"setAttribute\")))[(\"setAttribute\")])(attribute, (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"replace\")))[(\"replace\")])(/[\\\\?|&]sig=[^&]*/, ((((JSBNG_Record.get)(sig, 1))[1]) + (((((JSBNG_Record.get)(Math, (\"floor\")))[(\"floor\")])(((((JSBNG_Record.get)(Math, (\"JSBNG__random\")))[(\"JSBNG__random\")])() * 65535)) + 65536)))));\n        }\n        ;\n        ;\n    };\n    var sbf5249bbd0fcdd553bc13c221bb1b6e0bb7cb804_0_instance;\n    ((sbf5249bbd0fcdd553bc13c221bb1b6e0bb7cb804_0_instance) = ((JSBNG_Record.eventInstance)((\"sbf5249bbd0fcdd553bc13c221bb1b6e0bb7cb804_0\"))));\n    ((JSBNG_Record.markFunction)((ef17124233d9e1069ffb942c36e3c0f2cb19589c5)));\n} finally {\n    ((window.top.JSBNG_Record.callerJS) = (false));\n    ((window.top.JSBNG_Record.flushDeferredEvents)());\n};</script><a class=\"forceLTR emuEvent1 _24x image fbEmuImage _8o _8s lfloat\" tabindex=\"-1\" href=\"/ajax/emu/end.php?eid=AQJitB_HcoNKErKtrE1sFhSrP-tJFXEaNq2L9DGjGez_P-aWdI7tb3MQm3rKVU8GGq31CKIdLSfV9Da0z9htTnIlE8v0zWpIG2uga9AQ91KRFjegyqUemEZX5TBJfS-gzxI6STRlpJzAduP1XXzH3_GVuf6Q5oDNvMkhG8yRibyI5SMbprQr3A7FNtxCc50MT_Z9Q3uN1CHzijuyo7YzbleWb_kSUVovVvqNdIX0MM8JQ17BRs29aPQuZCi2HmAmgR0P_9k0jVBaKfSFDyAJejchw8vMr6OZLS_0siapgQpdDkZeoGE7aiorw3lnV-6VAdeA3A7aiYU7rnEikQV9eHA96htHndp_8lc3ka8EyV_lRc46WCsa5-SVj3HVWj_I3pfzQeLKQp214smdOUCLGLHKGPGuUiIcKx4PYL-ewY74gOFIN1yxBWMmvJP5GrGFiw7kK45tOgnBQmnfcmMXIcBfXlVVOk1q-5o1w3pYsHZw1ZgbmKpP_hRIj0u0HuN6n9q9moAJ0mfL6iYlELp-PIeAiBzA8THivuMrKRSdSvxW4M9dxBqyI5TwKSdxfIn53KKwrLkRN5tHjhp-XkAjG9VVfCag5xK44A_SwgFd4Y7M1VPb5g5x_CC-7HIRMBm4QCTMVFz2KS4Zk42I6-FhpRmw0RHsrp8erbOzpd11nxmnL-Yf7fK-TPIsnheUbmFRmLjlUNmMeQT_z3rNTyOBj-qqvnK0IG3IonJVtHknSLvhRYmNkS6__8C0kU2cMvm-KJHdc8dX5FQ06y0evFOFKx-qngoiuaIv_AcDzvW4y3ByUnurF-2jE9ju1DQH9HoTPKu4yvlB6ppvMnOQ51fpLMW1xO7bTJlu5stUxLR-2Ijq9nuNTH4qKkwSAHR3U_oaehsFPksTtYxgA0T7o96rP_7tS3IEUwtuIieP0VsReFAAPrfElIQ07QuK2882l3KgRajixpFP0Vv-APJQrBikDlFlaiCuOp5zCV2g-s0B1eoo6cuP6CqKWaX0G6XrT9Y3CtFLCowNTYiQ0sZeMEzH58lBAWvlsCyjX62os4-278WMX3sp8bEV6NPOwWkzpurwm4lYpQ0LuRCjEfnzpDDR6OxNXNBve6pHB1_NP8Xh0vbkYNkQQpi1hxwh__OTpP232_P9wi1pc6yu1suD1Fp2Dm-vADs_5NmxHBT_EwqAwYzti4dbaT6ritCOMJRtX9ngPBes9z1DU2LKG7vLyuanLJ3pai8IKROpgAZRWwdm0MdYudjhpaAQCxVeNjPHpI0LRSE&amp;f=1&amp;ui=6008948705864-id_51ddd04f4b59a3268404703&amp;en=1&amp;a=0&amp;sig=112031&amp;__tn__=ywv\" onmousedown=\"return ef17124233d9e1069ffb942c36e3c0f2cb19589c5.call(this, event);\" aria-hidden=\"true\"><img class=\"img\" src=\"http://jsbngssl.fbcdn-creative-a.akamaihd.net/hads-ak-prn1/s110x80/735350_6008948702864_139308658_n.png\" alt=\"\" /></a><div class=\"_42ef\"><div class=\"body\"><script type=\"text/javascript\">try {\n    ((JSBNG_Record.scriptLoad)((\"function ee6d522bc48f4b1f77a36c2d43ebf87c8779100e5(event) {\\u000a    var meta = document.getElementById(\\\"meta_referrer\\\");\\u000a    meta.content = \\\"origin\\\";\\u000a    setTimeout(function() {\\u000a        meta.content = \\\"default\\\";\\u000a    }, 100);\\u000a    var attribute = \\\"href\\\";\\u000a    var ms = this.getAttribute(attribute).match(/([\\\\\\\\?|&]f=)([^&]*)/);\\u000a    if (ms) {\\u000a        this.setAttribute(attribute, this.getAttribute(attribute).replace(/[\\\\\\\\?|&]f=[^&]*/, (ms[1] + 0)));\\u000a    }\\u000a;\\u000a;\\u000a    var attribute = \\\"href\\\";\\u000a    var sig = this.getAttribute(attribute).match(/([\\\\\\\\?|&]sig=)([^&]*)/);\\u000a    if (sig) {\\u000a        this.setAttribute(attribute, this.getAttribute(attribute).replace(/[\\\\\\\\?|&]sig=[^&]*/, (sig[1] + ((Math.floor((Math.random() * 65535)) + 65536)))));\\u000a    }\\u000a;\\u000a;\\u000a};\"), (\"se86fc6e28238039b0d91ef60bd5e825493292807\")));\n    ((window.top.JSBNG_Record.callerJS) = (true));\n    function ee6d522bc48f4b1f77a36c2d43ebf87c8779100e5(JSBNG__event) {\n        if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n            return ((JSBNG_Record.eventCall)((arguments.callee), (\"se86fc6e28238039b0d91ef60bd5e825493292807_0\"), (se86fc6e28238039b0d91ef60bd5e825493292807_0_instance), (this), (arguments)))\n        };\n        (null);\n        var meta = (((JSBNG_Record.get)(JSBNG__document, (\"getElementById\")))[(\"getElementById\")])(\"meta_referrer\");\n        ((JSBNG_Record.set)(meta, (\"JSBNG__content\"), \"origin\"));\n        JSBNG__setTimeout(((function() {\n            var se86fc6e28238039b0d91ef60bd5e825493292807_1_instance;\n            ((se86fc6e28238039b0d91ef60bd5e825493292807_1_instance) = ((JSBNG_Record.eventInstance)((\"se86fc6e28238039b0d91ef60bd5e825493292807_1\"))));\n            return ((JSBNG_Record.markFunction)((function() {\n                if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n                    return ((JSBNG_Record.eventCall)((arguments.callee), (\"se86fc6e28238039b0d91ef60bd5e825493292807_1\"), (se86fc6e28238039b0d91ef60bd5e825493292807_1_instance), (this), (arguments)))\n                };\n                (null);\n                ((JSBNG_Record.set)(meta, (\"JSBNG__content\"), \"default\"));\n            })));\n        })()), 100);\n        var attribute = \"href\";\n        var ms = (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"match\")))[(\"match\")])(/([\\\\?|&]f=)([^&]*)/);\n        if (ms) {\n            (((JSBNG_Record.get)(this, (\"setAttribute\")))[(\"setAttribute\")])(attribute, (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"replace\")))[(\"replace\")])(/[\\\\?|&]f=[^&]*/, ((((JSBNG_Record.get)(ms, 1))[1]) + 0)));\n        }\n        ;\n        ;\n        var attribute = \"href\";\n        var sig = (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"match\")))[(\"match\")])(/([\\\\?|&]sig=)([^&]*)/);\n        if (sig) {\n            (((JSBNG_Record.get)(this, (\"setAttribute\")))[(\"setAttribute\")])(attribute, (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"replace\")))[(\"replace\")])(/[\\\\?|&]sig=[^&]*/, ((((JSBNG_Record.get)(sig, 1))[1]) + (((((JSBNG_Record.get)(Math, (\"floor\")))[(\"floor\")])(((((JSBNG_Record.get)(Math, (\"JSBNG__random\")))[(\"JSBNG__random\")])() * 65535)) + 65536)))));\n        }\n        ;\n        ;\n    };\n    var se86fc6e28238039b0d91ef60bd5e825493292807_0_instance;\n    ((se86fc6e28238039b0d91ef60bd5e825493292807_0_instance) = ((JSBNG_Record.eventInstance)((\"se86fc6e28238039b0d91ef60bd5e825493292807_0\"))));\n    ((JSBNG_Record.markFunction)((ee6d522bc48f4b1f77a36c2d43ebf87c8779100e5)));\n} finally {\n    ((window.top.JSBNG_Record.callerJS) = (false));\n    ((window.top.JSBNG_Record.flushDeferredEvents)());\n};</script><a class=\"forceLTR emuEvent1 _24x\" href=\"/ajax/emu/end.php?eid=AQJitB_HcoNKErKtrE1sFhSrP-tJFXEaNq2L9DGjGez_P-aWdI7tb3MQm3rKVU8GGq31CKIdLSfV9Da0z9htTnIlE8v0zWpIG2uga9AQ91KRFjegyqUemEZX5TBJfS-gzxI6STRlpJzAduP1XXzH3_GVuf6Q5oDNvMkhG8yRibyI5SMbprQr3A7FNtxCc50MT_Z9Q3uN1CHzijuyo7YzbleWb_kSUVovVvqNdIX0MM8JQ17BRs29aPQuZCi2HmAmgR0P_9k0jVBaKfSFDyAJejchw8vMr6OZLS_0siapgQpdDkZeoGE7aiorw3lnV-6VAdeA3A7aiYU7rnEikQV9eHA96htHndp_8lc3ka8EyV_lRc46WCsa5-SVj3HVWj_I3pfzQeLKQp214smdOUCLGLHKGPGuUiIcKx4PYL-ewY74gOFIN1yxBWMmvJP5GrGFiw7kK45tOgnBQmnfcmMXIcBfXlVVOk1q-5o1w3pYsHZw1ZgbmKpP_hRIj0u0HuN6n9q9moAJ0mfL6iYlELp-PIeAiBzA8THivuMrKRSdSvxW4M9dxBqyI5TwKSdxfIn53KKwrLkRN5tHjhp-XkAjG9VVfCag5xK44A_SwgFd4Y7M1VPb5g5x_CC-7HIRMBm4QCTMVFz2KS4Zk42I6-FhpRmw0RHsrp8erbOzpd11nxmnL-Yf7fK-TPIsnheUbmFRmLjlUNmMeQT_z3rNTyOBj-qqvnK0IG3IonJVtHknSLvhRYmNkS6__8C0kU2cMvm-KJHdc8dX5FQ06y0evFOFKx-qngoiuaIv_AcDzvW4y3ByUnurF-2jE9ju1DQH9HoTPKu4yvlB6ppvMnOQ51fpLMW1xO7bTJlu5stUxLR-2Ijq9nuNTH4qKkwSAHR3U_oaehsFPksTtYxgA0T7o96rP_7tS3IEUwtuIieP0VsReFAAPrfElIQ07QuK2882l3KgRajixpFP0Vv-APJQrBikDlFlaiCuOp5zCV2g-s0B1eoo6cuP6CqKWaX0G6XrT9Y3CtFLCowNTYiQ0sZeMEzH58lBAWvlsCyjX62os4-278WMX3sp8bEV6NPOwWkzpurwm4lYpQ0LuRCjEfnzpDDR6OxNXNBve6pHB1_NP8Xh0vbkYNkQQpi1hxwh__OTpP232_P9wi1pc6yu1suD1Fp2Dm-vADs_5NmxHBT_EwqAwYzti4dbaT6ritCOMJRtX9ngPBes9z1DU2LKG7vLyuanLJ3pai8IKROpgAZRWwdm0MdYudjhpaAQCxVeNjPHpI0LRSE&amp;f=1&amp;ui=6008948705864-id_51ddd04f4b59a3268404703&amp;en=1&amp;a=0&amp;sig=70309&amp;__tn__=xywv\" onmousedown=\"return ee6d522bc48f4b1f77a36c2d43ebf87c8779100e5.call(this, event);\">Shopping/Retail</a></div></div></div><div class=\"inline\"><div class=\"action\"><a class=\"uiIconText emuEventfad_fan _24x\" href=\"#\" style=\"padding-left: 17px;\" rel=\"async-post\" ajaxify=\"/ajax/emu/end.php?eid=AQJitB_HcoNKErKtrE1sFhSrP-tJFXEaNq2L9DGjGez_P-aWdI7tb3MQm3rKVU8GGq31CKIdLSfV9Da0z9htTnIlE8v0zWpIG2uga9AQ91KRFjegyqUemEZX5TBJfS-gzxI6STRlpJzAduP1XXzH3_GVuf6Q5oDNvMkhG8yRibyI5SMbprQr3A7FNtxCc50MT_Z9Q3uN1CHzijuyo7YzbleWb_kSUVovVvqNdIX0MM8JQ17BRs29aPQuZCi2HmAmgR0P_9k0jVBaKfSFDyAJejchw8vMr6OZLS_0siapgQpdDkZeoGE7aiorw3lnV-6VAdeA3A7aiYU7rnEikQV9eHA96htHndp_8lc3ka8EyV_lRc46WCsa5-SVj3HVWj_I3pfzQeLKQp214smdOUCLGLHKGPGuUiIcKx4PYL-ewY74gOFIN1yxBWMmvJP5GrGFiw7kK45tOgnBQmnfcmMXIcBfXlVVOk1q-5o1w3pYsHZw1ZgbmKpP_hRIj0u0HuN6n9q9moAJ0mfL6iYlELp-PIeAiBzA8THivuMrKRSdSvxW4M9dxBqyI5TwKSdxfIn53KKwrLkRN5tHjhp-XkAjG9VVfCag5xK44A_SwgFd4Y7M1VPb5g5x_CC-7HIRMBm4QCTMVFz2KS4Zk42I6-FhpRmw0RHsrp8erbOzpd11nxmnL-Yf7fK-TPIsnheUbmFRmLjlUNmMeQT_z3rNTyOBj-qqvnK0IG3IonJVtHknSLvhRYmNkS6__8C0kU2cMvm-KJHdc8dX5FQ06y0evFOFKx-qngoiuaIv_AcDzvW4y3ByUnurF-2jE9ju1DQH9HoTPKu4yvlB6ppvMnOQ51fpLMW1xO7bTJlu5stUxLR-2Ijq9nuNTH4qKkwSAHR3U_oaehsFPksTtYxgA0T7o96rP_7tS3IEUwtuIieP0VsReFAAPrfElIQ07QuK2882l3KgRajixpFP0Vv-APJQrBikDlFlaiCuOp5zCV2g-s0B1eoo6cuP6CqKWaX0G6XrT9Y3CtFLCowNTYiQ0sZeMEzH58lBAWvlsCyjX62os4-278WMX3sp8bEV6NPOwWkzpurwm4lYpQ0LuRCjEfnzpDDR6OxNXNBve6pHB1_NP8Xh0vbkYNkQQpi1hxwh__OTpP232_P9wi1pc6yu1suD1Fp2Dm-vADs_5NmxHBT_EwqAwYzti4dbaT6ritCOMJRtX9ngPBes9z1DU2LKG7vLyuanLJ3pai8IKROpgAZRWwdm0MdYudjhpaAQCxVeNjPHpI0LRSE&amp;f=0&amp;ui=6008948705864-id_51ddd04f4b59a3268404703&amp;en=fad_fan&amp;ed=214074018662300&amp;a=1&amp;__tn__=wv\" role=\"button\"><i class=\"img sp_4p6kmz sx_bc56c4\" style=\"top: 1px;\"></i>Like</a> · <span class=\"fbEmuContext\">43 people like <script type=\"text/javascript\">try {\n    ((JSBNG_Record.scriptLoad)((\"function e06f21b809f9f18b96528c0ead689415545e55627(event) {\\u000a    var meta = document.getElementById(\\\"meta_referrer\\\");\\u000a    meta.content = \\\"origin\\\";\\u000a    setTimeout(function() {\\u000a        meta.content = \\\"default\\\";\\u000a    }, 100);\\u000a    var attribute = \\\"href\\\";\\u000a    var ms = this.getAttribute(attribute).match(/([\\\\\\\\?|&]f=)([^&]*)/);\\u000a    if (ms) {\\u000a        this.setAttribute(attribute, this.getAttribute(attribute).replace(/[\\\\\\\\?|&]f=[^&]*/, (ms[1] + 0)));\\u000a    }\\u000a;\\u000a;\\u000a    var attribute = \\\"href\\\";\\u000a    var sig = this.getAttribute(attribute).match(/([\\\\\\\\?|&]sig=)([^&]*)/);\\u000a    if (sig) {\\u000a        this.setAttribute(attribute, this.getAttribute(attribute).replace(/[\\\\\\\\?|&]sig=[^&]*/, (sig[1] + ((Math.floor((Math.random() * 65535)) + 65536)))));\\u000a    }\\u000a;\\u000a;\\u000a};\"), (\"s3362573a26f528e075e3d5a3049c53089cb46ada\")));\n    ((window.top.JSBNG_Record.callerJS) = (true));\n    function e06f21b809f9f18b96528c0ead689415545e55627(JSBNG__event) {\n        if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n            return ((JSBNG_Record.eventCall)((arguments.callee), (\"s3362573a26f528e075e3d5a3049c53089cb46ada_0\"), (s3362573a26f528e075e3d5a3049c53089cb46ada_0_instance), (this), (arguments)))\n        };\n        (null);\n        var meta = (((JSBNG_Record.get)(JSBNG__document, (\"getElementById\")))[(\"getElementById\")])(\"meta_referrer\");\n        ((JSBNG_Record.set)(meta, (\"JSBNG__content\"), \"origin\"));\n        JSBNG__setTimeout(((function() {\n            var s3362573a26f528e075e3d5a3049c53089cb46ada_1_instance;\n            ((s3362573a26f528e075e3d5a3049c53089cb46ada_1_instance) = ((JSBNG_Record.eventInstance)((\"s3362573a26f528e075e3d5a3049c53089cb46ada_1\"))));\n            return ((JSBNG_Record.markFunction)((function() {\n                if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n                    return ((JSBNG_Record.eventCall)((arguments.callee), (\"s3362573a26f528e075e3d5a3049c53089cb46ada_1\"), (s3362573a26f528e075e3d5a3049c53089cb46ada_1_instance), (this), (arguments)))\n                };\n                (null);\n                ((JSBNG_Record.set)(meta, (\"JSBNG__content\"), \"default\"));\n            })));\n        })()), 100);\n        var attribute = \"href\";\n        var ms = (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"match\")))[(\"match\")])(/([\\\\?|&]f=)([^&]*)/);\n        if (ms) {\n            (((JSBNG_Record.get)(this, (\"setAttribute\")))[(\"setAttribute\")])(attribute, (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"replace\")))[(\"replace\")])(/[\\\\?|&]f=[^&]*/, ((((JSBNG_Record.get)(ms, 1))[1]) + 0)));\n        }\n        ;\n        ;\n        var attribute = \"href\";\n        var sig = (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"match\")))[(\"match\")])(/([\\\\?|&]sig=)([^&]*)/);\n        if (sig) {\n            (((JSBNG_Record.get)(this, (\"setAttribute\")))[(\"setAttribute\")])(attribute, (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"replace\")))[(\"replace\")])(/[\\\\?|&]sig=[^&]*/, ((((JSBNG_Record.get)(sig, 1))[1]) + (((((JSBNG_Record.get)(Math, (\"floor\")))[(\"floor\")])(((((JSBNG_Record.get)(Math, (\"JSBNG__random\")))[(\"JSBNG__random\")])() * 65535)) + 65536)))));\n        }\n        ;\n        ;\n    };\n    var s3362573a26f528e075e3d5a3049c53089cb46ada_0_instance;\n    ((s3362573a26f528e075e3d5a3049c53089cb46ada_0_instance) = ((JSBNG_Record.eventInstance)((\"s3362573a26f528e075e3d5a3049c53089cb46ada_0\"))));\n    ((JSBNG_Record.markFunction)((e06f21b809f9f18b96528c0ead689415545e55627)));\n} finally {\n    ((window.top.JSBNG_Record.callerJS) = (false));\n    ((window.top.JSBNG_Record.flushDeferredEvents)());\n};</script><a class=\"emuEventfad_pageclick _24x\" href=\"/ajax/emu/end.php?eid=AQJitB_HcoNKErKtrE1sFhSrP-tJFXEaNq2L9DGjGez_P-aWdI7tb3MQm3rKVU8GGq31CKIdLSfV9Da0z9htTnIlE8v0zWpIG2uga9AQ91KRFjegyqUemEZX5TBJfS-gzxI6STRlpJzAduP1XXzH3_GVuf6Q5oDNvMkhG8yRibyI5SMbprQr3A7FNtxCc50MT_Z9Q3uN1CHzijuyo7YzbleWb_kSUVovVvqNdIX0MM8JQ17BRs29aPQuZCi2HmAmgR0P_9k0jVBaKfSFDyAJejchw8vMr6OZLS_0siapgQpdDkZeoGE7aiorw3lnV-6VAdeA3A7aiYU7rnEikQV9eHA96htHndp_8lc3ka8EyV_lRc46WCsa5-SVj3HVWj_I3pfzQeLKQp214smdOUCLGLHKGPGuUiIcKx4PYL-ewY74gOFIN1yxBWMmvJP5GrGFiw7kK45tOgnBQmnfcmMXIcBfXlVVOk1q-5o1w3pYsHZw1ZgbmKpP_hRIj0u0HuN6n9q9moAJ0mfL6iYlELp-PIeAiBzA8THivuMrKRSdSvxW4M9dxBqyI5TwKSdxfIn53KKwrLkRN5tHjhp-XkAjG9VVfCag5xK44A_SwgFd4Y7M1VPb5g5x_CC-7HIRMBm4QCTMVFz2KS4Zk42I6-FhpRmw0RHsrp8erbOzpd11nxmnL-Yf7fK-TPIsnheUbmFRmLjlUNmMeQT_z3rNTyOBj-qqvnK0IG3IonJVtHknSLvhRYmNkS6__8C0kU2cMvm-KJHdc8dX5FQ06y0evFOFKx-qngoiuaIv_AcDzvW4y3ByUnurF-2jE9ju1DQH9HoTPKu4yvlB6ppvMnOQ51fpLMW1xO7bTJlu5stUxLR-2Ijq9nuNTH4qKkwSAHR3U_oaehsFPksTtYxgA0T7o96rP_7tS3IEUwtuIieP0VsReFAAPrfElIQ07QuK2882l3KgRajixpFP0Vv-APJQrBikDlFlaiCuOp5zCV2g-s0B1eoo6cuP6CqKWaX0G6XrT9Y3CtFLCowNTYiQ0sZeMEzH58lBAWvlsCyjX62os4-278WMX3sp8bEV6NPOwWkzpurwm4lYpQ0LuRCjEfnzpDDR6OxNXNBve6pHB1_NP8Xh0vbkYNkQQpi1hxwh__OTpP232_P9wi1pc6yu1suD1Fp2Dm-vADs_5NmxHBT_EwqAwYzti4dbaT6ritCOMJRtX9ngPBes9z1DU2LKG7vLyuanLJ3pai8IKROpgAZRWwdm0MdYudjhpaAQCxVeNjPHpI0LRSE&amp;f=1&amp;ui=6008948705864-id_51ddd04f4b59a3268404703&amp;en=fad_pageclick&amp;ed=214074018662300&amp;a=0&amp;mac=AQK0iMDMI_-EfmLU&amp;sig=77814&amp;__tn__=zwv\" onmousedown=\"return e06f21b809f9f18b96528c0ead689415545e55627.call(this, event);\">Bing&#039;s Hallmark</a>.</span></div></div></div></div></div></div></div></div> ";
// undefined
o122 = null;
// 9855
o120.parentNode = o25;
// 9857
f974244559_507.returns.push(o120);
// undefined
o120 = null;
// 9858
// 9859
o119.getAttribute = f974244559_500;
// 9860
f974244559_500.returns.push("u_0_2q");
// 9870
o120 = {};
// 9871
f974244559_502.returns.push(o120);
// 9872
o120.getAttribute = f974244559_500;
// 9873
f974244559_500.returns.push(null);
// 9874
o120.setAttribute = f974244559_643;
// 9875
f974244559_643.returns.push(undefined);
// 9876
f974244559_12.returns.push(23);
// 9879
f974244559_471.returns.push(1373491290126);
// 9883
o122 = {};
// 9884
f974244559_478.returns.push(o122);
// 9886
f974244559_482.returns.push(o122);
// undefined
o122 = null;
// 9889
f974244559_471.returns.push(1373491290129);
// 9892
f974244559_471.returns.push(1373491290129);
// 9895
f974244559_471.returns.push(1373491290130);
// 9898
f974244559_471.returns.push(1373491290131);
// 9902
f974244559_471.returns.push(1373491290133);
// 9907
o122 = {};
// 9908
f974244559_478.returns.push(o122);
// 9910
f974244559_471.returns.push(1373491290135);
// 9912
o123 = {};
// 9913
f974244559_480.returns.push(o123);
// 9914
// 9915
// 9916
// 9917
// 9918
// 9919
// 9920
o122.appendChild = f974244559_482;
// 9921
f974244559_482.returns.push(o123);
// 9923
f974244559_471.returns.push(1373491290136);
// 9925
o124 = {};
// 9926
f974244559_480.returns.push(o124);
// 9927
// 9928
// 9929
// 9930
// 9931
// 9932
// 9934
f974244559_482.returns.push(o124);
// 9936
f974244559_471.returns.push(1373491290137);
// 9938
o125 = {};
// 9939
f974244559_480.returns.push(o125);
// 9940
// 9941
// 9942
// 9943
// 9944
// 9945
// 9947
f974244559_482.returns.push(o125);
// 9949
f974244559_471.returns.push(1373491290137);
// 9951
o126 = {};
// 9952
f974244559_480.returns.push(o126);
// 9953
// 9954
// 9955
// 9956
// 9957
// 9958
// 9960
f974244559_482.returns.push(o126);
// 9962
f974244559_471.returns.push(1373491290156);
// 9964
o127 = {};
// 9965
f974244559_480.returns.push(o127);
// 9966
// 9967
// 9968
// 9969
// 9970
// 9971
// 9973
f974244559_482.returns.push(o127);
// 9975
f974244559_482.returns.push(o122);
// undefined
o122 = null;
// 9978
f974244559_471.returns.push(1373491290158);
// 9982
o122 = {};
// 9983
f974244559_478.returns.push(o122);
// 9985
f974244559_471.returns.push(1373491290159);
// 9987
o128 = {};
// 9988
f974244559_480.returns.push(o128);
// 9989
// 9990
// 9991
// 9992
// 9993
// 9994
// 9995
o122.appendChild = f974244559_482;
// 9996
f974244559_482.returns.push(o128);
// 9998
f974244559_482.returns.push(o122);
// undefined
o122 = null;
// 10001
f974244559_471.returns.push(1373491290160);
// 10005
o122 = {};
// 10006
f974244559_478.returns.push(o122);
// 10008
f974244559_471.returns.push(1373491290161);
// 10010
o129 = {};
// 10011
f974244559_480.returns.push(o129);
// 10012
// 10013
// 10014
// 10015
// 10016
// 10017
// 10018
o122.appendChild = f974244559_482;
// 10019
f974244559_482.returns.push(o129);
// 10021
f974244559_471.returns.push(1373491290161);
// 10023
o130 = {};
// 10024
f974244559_480.returns.push(o130);
// 10025
// 10026
// 10027
// 10028
// 10029
// 10030
// 10032
f974244559_482.returns.push(o130);
// 10034
f974244559_482.returns.push(o122);
// undefined
o122 = null;
// 10037
f974244559_471.returns.push(1373491290163);
// 10041
o122 = {};
// 10042
f974244559_478.returns.push(o122);
// 10044
f974244559_482.returns.push(o122);
// undefined
o122 = null;
// 10047
f974244559_471.returns.push(1373491290165);
// 10051
o122 = {};
// 10052
f974244559_478.returns.push(o122);
// 10054
f974244559_482.returns.push(o122);
// undefined
o122 = null;
// 10057
f974244559_471.returns.push(1373491290176);
// 10061
o122 = {};
// 10062
f974244559_478.returns.push(o122);
// 10064
f974244559_471.returns.push(1373491290177);
// 10066
o131 = {};
// 10067
f974244559_480.returns.push(o131);
// 10068
// 10069
// 10070
// 10071
// 10072
// 10073
// 10074
o122.appendChild = f974244559_482;
// 10075
f974244559_482.returns.push(o131);
// 10077
f974244559_482.returns.push(o122);
// undefined
o122 = null;
// 10080
f974244559_471.returns.push(1373491290178);
// 10084
o122 = {};
// 10085
f974244559_478.returns.push(o122);
// 10087
f974244559_482.returns.push(o122);
// undefined
o122 = null;
// 10090
f974244559_471.returns.push(1373491290180);
// 10093
f974244559_471.returns.push(1373491290180);
// 10097
o122 = {};
// 10098
f974244559_478.returns.push(o122);
// 10100
f974244559_482.returns.push(o122);
// undefined
o122 = null;
// 10103
f974244559_471.returns.push(1373491290181);
// 10107
o122 = {};
// 10108
f974244559_478.returns.push(o122);
// 10110
f974244559_482.returns.push(o122);
// undefined
o122 = null;
// 10113
f974244559_471.returns.push(1373491290182);
// 10117
o122 = {};
// 10118
f974244559_478.returns.push(o122);
// 10120
f974244559_471.returns.push(1373491290182);
// 10122
o132 = {};
// 10123
f974244559_480.returns.push(o132);
// 10124
// 10125
// 10126
// 10127
// 10128
// 10129
// 10130
o122.appendChild = f974244559_482;
// 10131
f974244559_482.returns.push(o132);
// 10133
f974244559_471.returns.push(1373491290184);
// 10135
o133 = {};
// 10136
f974244559_480.returns.push(o133);
// 10137
// 10138
// 10139
// 10140
// 10141
// 10142
// 10144
f974244559_482.returns.push(o133);
// 10146
f974244559_471.returns.push(1373491290185);
// 10148
o134 = {};
// 10149
f974244559_480.returns.push(o134);
// 10150
// 10151
// 10152
// 10153
// 10154
// 10155
// 10157
f974244559_482.returns.push(o134);
// 10159
f974244559_482.returns.push(o122);
// undefined
o122 = null;
// 10162
f974244559_471.returns.push(1373491290193);
// 10166
o122 = {};
// 10167
f974244559_478.returns.push(o122);
// 10169
f974244559_482.returns.push(o122);
// undefined
o122 = null;
// 10172
f974244559_471.returns.push(1373491290194);
// 10176
o122 = {};
// 10177
f974244559_478.returns.push(o122);
// 10179
f974244559_471.returns.push(1373491290195);
// 10181
o135 = {};
// 10182
f974244559_480.returns.push(o135);
// 10183
// 10184
// 10185
// 10186
// 10187
// 10188
// 10189
o122.appendChild = f974244559_482;
// 10190
f974244559_482.returns.push(o135);
// 10192
f974244559_482.returns.push(o122);
// undefined
o122 = null;
// 10195
f974244559_471.returns.push(1373491290196);
// 10198
f974244559_471.returns.push(1373491290196);
// 10202
o122 = {};
// 10203
f974244559_478.returns.push(o122);
// 10205
f974244559_482.returns.push(o122);
// undefined
o122 = null;
// 10208
f974244559_471.returns.push(1373491290197);
// 10212
o122 = {};
// 10213
f974244559_478.returns.push(o122);
// 10215
f974244559_482.returns.push(o122);
// undefined
o122 = null;
// 10218
f974244559_471.returns.push(1373491290199);
// 10222
o122 = {};
// 10223
f974244559_478.returns.push(o122);
// 10225
f974244559_482.returns.push(o122);
// undefined
o122 = null;
// 10228
f974244559_471.returns.push(1373491290199);
// 10232
o122 = {};
// 10233
f974244559_478.returns.push(o122);
// 10235
f974244559_482.returns.push(o122);
// undefined
o122 = null;
// 10238
f974244559_471.returns.push(1373491290200);
// 10242
o122 = {};
// 10243
f974244559_478.returns.push(o122);
// 10245
f974244559_482.returns.push(o122);
// undefined
o122 = null;
// 10248
f974244559_471.returns.push(1373491290213);
// 10252
o122 = {};
// 10253
f974244559_478.returns.push(o122);
// 10255
f974244559_482.returns.push(o122);
// undefined
o122 = null;
// 10258
f974244559_471.returns.push(1373491290213);
// 10262
o122 = {};
// 10263
f974244559_478.returns.push(o122);
// 10265
f974244559_482.returns.push(o122);
// undefined
o122 = null;
// 10267
f974244559_471.returns.push(1373491290214);
// 10270
f974244559_471.returns.push(1373491290216);
// 10274
o122 = {};
// 10275
f974244559_478.returns.push(o122);
// 10277
f974244559_482.returns.push(o122);
// undefined
o122 = null;
// 10281
o122 = {};
// 10282
f974244559_478.returns.push(o122);
// 10284
f974244559_482.returns.push(o122);
// undefined
o122 = null;
// 10287
f974244559_471.returns.push(1373491290217);
// 10291
o122 = {};
// 10292
f974244559_478.returns.push(o122);
// 10294
f974244559_482.returns.push(o122);
// undefined
o122 = null;
// 10296
f974244559_471.returns.push(1373491290224);
// 10300
f974244559_12.returns.push(24);
// 10302
f974244559_471.returns.push(1373491290225);
// 10304
f974244559_471.returns.push(1373491290225);
// 10306
f974244559_471.returns.push(1373491290225);
// 10310
f974244559_12.returns.push(25);
// 10312
f974244559_471.returns.push(1373491290226);
// 10316
f974244559_12.returns.push(26);
// 10318
f974244559_471.returns.push(1373491290226);
// 10327
o0.title = "Gregor Richards";
// 10329
o1._ua_log = "{\"log\":[{\"ts\":1373491169511,\"path\":\"-\",\"index\":0,\"type\":\"init\",\"iref\":\"-\"},{\"path\":\"/index.php\",\"type\":\"click\",\"ts\":1373491180578,\"iref\":\"bluebar\",\"index\":1},{\"path\":\"/index.php\",\"type\":\"submit\",\"ts\":1373491180618,\"iref\":\"bluebar\",\"index\":2}],\"len\":3}";
// undefined
o1 = null;
// 10332
f974244559_471.returns.push(1373491290296);
// 10336
o25.__FB_TOKEN = void 0;
// 10337
// 10339
o25.hasAttribute = f974244559_527;
// 10341
f974244559_527.returns.push(false);
// 10342
o25.JSBNG__addEventListener = f974244559_472;
// 10344
f974244559_472.returns.push(undefined);
// 10345
o25.JSBNG__onclick = null;
// 10348
f974244559_468.returns.push(1);
// 10350
f974244559_468.returns.push(2);
// 10353
f974244559_471.returns.push(1373491290309);
// 10357
f974244559_7.returns.push(undefined);
// 10358
ow974244559.JSBNG__onJSBNG__focus = undefined;
// 10363
f974244559_472.returns.push(undefined);
// 10364
o8.JSBNG__onDOMMouseScroll = void 0;
// 10371
f974244559_472.returns.push(undefined);
// 10372
o8.JSBNG__onmousemove = null;
// 10376
o1 = {};
// 10377
f974244559_0.returns.push(o1);
// undefined
o1 = null;
// 10379
f974244559_471.returns.push(1373491290317);
// 10381
f974244559_486.returns.push("1;1");
// 10383
f974244559_486.returns.push("{\"log\":[{\"ts\":1373491169511,\"path\":\"-\",\"index\":0,\"type\":\"init\",\"iref\":\"-\"},{\"path\":\"/index.php\",\"type\":\"click\",\"ts\":1373491180578,\"iref\":\"bluebar\",\"index\":1},{\"path\":\"/index.php\",\"type\":\"submit\",\"ts\":1373491180618,\"iref\":\"bluebar\",\"index\":2}],\"len\":3}");
// 10385
f974244559_471.returns.push(1373491290317);
// 10387
o1 = {};
// 10388
f974244559_70.returns.push(o1);
// 10389
// 10390
f974244559_1564 = function() { return f974244559_1564.returns[f974244559_1564.inst++]; };
f974244559_1564.returns = [];
f974244559_1564.inst = 0;
// 10391
o1.open = f974244559_1564;
// 10392
f974244559_1564.returns.push(undefined);
// 10393
f974244559_1565 = function() { return f974244559_1565.returns[f974244559_1565.inst++]; };
f974244559_1565.returns = [];
f974244559_1565.inst = 0;
// 10394
o1.setRequestHeader = f974244559_1565;
// 10395
f974244559_1565.returns.push(undefined);
// 10398
f974244559_1565.returns.push(undefined);
// 10399
f974244559_1566 = function() { return f974244559_1566.returns[f974244559_1566.inst++]; };
f974244559_1566.returns = [];
f974244559_1566.inst = 0;
// 10400
o1.send = f974244559_1566;
// 10401
f974244559_1566.returns.push(undefined);
// 10404
o122 = {};
// 10405
f974244559_502.returns.push(o122);
// 10406
o122.nodeName = "FORM";
// 10407
o122.__FB_TOKEN = void 0;
// 10408
// 10409
o122.getAttribute = f974244559_500;
// 10410
o122.hasAttribute = f974244559_527;
// 10412
f974244559_527.returns.push(false);
// 10413
o122.JSBNG__addEventListener = f974244559_472;
// 10415
f974244559_472.returns.push(undefined);
// 10416
f974244559_1568 = function() { return f974244559_1568.returns[f974244559_1568.inst++]; };
f974244559_1568.returns = [];
f974244559_1568.inst = 0;
// 10417
o122.JSBNG__onsubmit = f974244559_1568;
// 10420
// undefined
o122 = null;
// 10424
o122 = {};
// 10425
o136 = {};
// 10427
o122.transport = o1;
// 10428
o1.readyState = 1;
// 10429
o137 = {};
// 10430
o138 = {};
// 10432
o137.length = 1;
// 10433
o137["0"] = "63VzN";
// 10440
f974244559_471.returns.push(1373491290378);
// 10441
f974244559_12.returns.push(27);
// 10442
o139 = {};
// 10443
o140 = {};
// 10445
o139.length = 1;
// 10446
o139["0"] = "4vv8/";
// 10452
ow974244559.JSBNG__random = undefined;
// 10453
f974244559_470.returns.push(0.825079214759171);
// 10454
o5.pathname = "/LawlabeeTheWallaby";
// 10456
f974244559_471.returns.push(1373491292271);
// 10460
f974244559_12.returns.push(28);
// 10464
o141 = {};
// 10465
f974244559_502.returns.push(o141);
// 10466
o141.nodeName = "A";
// 10467
o141.__FB_TOKEN = void 0;
// 10468
// 10469
o141.getAttribute = f974244559_500;
// 10470
o141.hasAttribute = f974244559_527;
// 10472
f974244559_527.returns.push(false);
// 10473
o141.JSBNG__addEventListener = f974244559_472;
// 10475
f974244559_472.returns.push(undefined);
// 10476
f974244559_1576 = function() { return f974244559_1576.returns[f974244559_1576.inst++]; };
f974244559_1576.returns = [];
f974244559_1576.inst = 0;
// 10477
o141.JSBNG__onclick = f974244559_1576;
// 10480
// 10484
o112.__FB_TOKEN = void 0;
// 10485
// undefined
o112 = null;
// 10486
o107.getElementsByTagName = f974244559_514;
// 10488
o107.querySelectorAll = f974244559_523;
// undefined
o107 = null;
// 10489
o107 = {};
// 10490
f974244559_523.returns.push(o107);
// 10491
o107.length = 0;
// undefined
o107 = null;
// 10495
o107 = {};
// 10496
f974244559_523.returns.push(o107);
// 10497
o107.length = 0;
// undefined
o107 = null;
// 10505
f974244559_471.returns.push(1373491292324);
// 10508
f974244559_1202.returns.push(undefined);
// 10514
f974244559_471.returns.push(1373491292327);
// 10521
f974244559_471.returns.push(1373491292334);
// 10525
o107 = {};
// 10526
o112 = {};
// 10528
o107.length = 1;
// 10529
o107["0"] = "u//Ut";
// 10538
o142 = {};
// 10539
f974244559_502.returns.push(o142);
// 10540
o142.getElementsByTagName = f974244559_514;
// 10542
o142.querySelectorAll = f974244559_523;
// 10543
o143 = {};
// 10544
f974244559_523.returns.push(o143);
// 10545
o143.length = 1;
// 10546
o144 = {};
// 10547
o143["0"] = o144;
// undefined
o143 = null;
// 10550
o143 = {};
// 10551
f974244559_502.returns.push(o143);
// 10552
o143.getElementsByTagName = f974244559_514;
// 10554
o143.querySelectorAll = f974244559_523;
// 10555
o145 = {};
// 10556
f974244559_523.returns.push(o145);
// 10557
o145.length = 1;
// 10558
o146 = {};
// 10559
o145["0"] = o146;
// undefined
o145 = null;
// 10562
o145 = {};
// 10563
f974244559_502.returns.push(o145);
// 10564
o145.getElementsByTagName = f974244559_514;
// 10566
o145.querySelectorAll = f974244559_523;
// 10567
o147 = {};
// 10568
f974244559_523.returns.push(o147);
// 10569
o147.length = 1;
// 10570
o148 = {};
// 10571
o147["0"] = o148;
// undefined
o147 = null;
// 10574
o147 = {};
// 10575
f974244559_480.returns.push(o147);
// 10576
// 10577
// 10578
o147.getElementsByTagName = f974244559_514;
// 10579
o149 = {};
// 10580
f974244559_514.returns.push(o149);
// 10581
o149.length = 0;
// undefined
o149 = null;
// 10583
o149 = {};
// 10584
o147.childNodes = o149;
// undefined
o147 = null;
// 10585
o149.item = f974244559_517;
// 10586
o149.length = 1;
// 10587
o147 = {};
// 10588
o149["0"] = o147;
// undefined
o149 = null;
// undefined
o147 = null;
// 10590
o147 = {};
// 10591
f974244559_480.returns.push(o147);
// 10592
// 10593
// 10594
o147.getElementsByTagName = f974244559_514;
// 10595
o149 = {};
// 10596
f974244559_514.returns.push(o149);
// 10597
o149.length = 0;
// undefined
o149 = null;
// 10599
o149 = {};
// 10600
o147.childNodes = o149;
// undefined
o147 = null;
// 10601
o149.item = f974244559_517;
// 10602
o149.length = 1;
// 10603
o147 = {};
// 10604
o149["0"] = o147;
// undefined
o149 = null;
// undefined
o147 = null;
// 10606
o147 = {};
// 10607
f974244559_480.returns.push(o147);
// 10608
// 10609
// 10610
o147.getElementsByTagName = f974244559_514;
// 10611
o149 = {};
// 10612
f974244559_514.returns.push(o149);
// 10613
o149.length = 0;
// undefined
o149 = null;
// 10615
o149 = {};
// 10616
o147.childNodes = o149;
// undefined
o147 = null;
// 10617
o149.item = f974244559_517;
// 10618
o149.length = 1;
// 10619
o147 = {};
// 10620
o149["0"] = o147;
// undefined
o149 = null;
// undefined
o147 = null;
// 10622
o147 = {};
// 10623
f974244559_480.returns.push(o147);
// 10624
// 10625
// 10626
o147.getElementsByTagName = f974244559_514;
// 10627
o149 = {};
// 10628
f974244559_514.returns.push(o149);
// 10629
o149.length = 0;
// undefined
o149 = null;
// 10631
o149 = {};
// 10632
o147.childNodes = o149;
// undefined
o147 = null;
// 10633
o149.item = f974244559_517;
// 10634
o149.length = 1;
// 10635
o147 = {};
// 10636
o149["0"] = o147;
// undefined
o149 = null;
// undefined
o147 = null;
// 10638
o147 = {};
// 10639
f974244559_480.returns.push(o147);
// 10640
// 10641
// 10642
o147.getElementsByTagName = f974244559_514;
// 10643
o149 = {};
// 10644
f974244559_514.returns.push(o149);
// 10645
o149.length = 0;
// undefined
o149 = null;
// 10647
o149 = {};
// 10648
o147.childNodes = o149;
// undefined
o147 = null;
// 10649
o149.item = f974244559_517;
// 10650
o149.length = 1;
// 10651
o147 = {};
// 10652
o149["0"] = o147;
// undefined
o149 = null;
// undefined
o147 = null;
// 10654
o147 = {};
// 10655
f974244559_480.returns.push(o147);
// 10656
// 10657
// 10658
o147.getElementsByTagName = f974244559_514;
// 10659
o149 = {};
// 10660
f974244559_514.returns.push(o149);
// 10661
o149.length = 0;
// undefined
o149 = null;
// 10663
o149 = {};
// 10664
o147.childNodes = o149;
// undefined
o147 = null;
// 10665
o149.item = f974244559_517;
// 10666
o149.length = 1;
// 10667
o147 = {};
// 10668
o149["0"] = o147;
// undefined
o149 = null;
// undefined
o147 = null;
// 10673
o147 = {};
// 10674
f974244559_502.returns.push(o147);
// 10678
o149 = {};
// 10679
f974244559_502.returns.push(o149);
// undefined
o149 = null;
// 10681
o149 = {};
// 10682
o25.classList = o149;
// 10684
f974244559_1617 = function() { return f974244559_1617.returns[f974244559_1617.inst++]; };
f974244559_1617.returns = [];
f974244559_1617.inst = 0;
// 10685
o149.contains = f974244559_1617;
// undefined
o149 = null;
// 10686
f974244559_1617.returns.push(false);
// 10691
o149 = {};
// 10692
f974244559_502.returns.push(o149);
// 10694
o150 = {};
// 10695
f974244559_502.returns.push(o150);
// 10698
o149.__FB_TOKEN = void 0;
// 10699
// 10702
o151 = {};
// 10703
f974244559_502.returns.push(o151);
// 10705
o152 = {};
// 10706
f974244559_502.returns.push(o152);
// 10708
o153 = {};
// 10709
f974244559_502.returns.push(o153);
// 10711
o154 = {};
// 10712
f974244559_502.returns.push(o154);
// 10714
o155 = {};
// 10715
f974244559_502.returns.push(o155);
// 10716
o152.getElementsByTagName = f974244559_514;
// 10718
o152.querySelectorAll = f974244559_523;
// 10719
o156 = {};
// 10720
f974244559_523.returns.push(o156);
// 10721
o156.length = 1;
// 10722
o157 = {};
// 10723
o156["0"] = o157;
// undefined
o156 = null;
// 10725
o156 = {};
// 10726
f974244559_480.returns.push(o156);
// undefined
o156 = null;
// 10727
o157.nodeName = "INPUT";
// 10728
o157.__FB_TOKEN = void 0;
// 10729
// 10730
o157.getAttribute = f974244559_500;
// 10731
o157.hasAttribute = f974244559_527;
// 10733
f974244559_527.returns.push(false);
// 10734
o157.JSBNG__addEventListener = f974244559_472;
// 10736
f974244559_472.returns.push(undefined);
// 10737
o157.JSBNG__onkeyup = null;
// 10739
o154.nodeName = "A";
// 10740
o154.__FB_TOKEN = void 0;
// 10741
// 10742
o154.getAttribute = f974244559_500;
// 10743
o154.hasAttribute = f974244559_527;
// 10745
f974244559_527.returns.push(false);
// 10746
o154.JSBNG__addEventListener = f974244559_472;
// 10748
f974244559_472.returns.push(undefined);
// 10749
o154.JSBNG__onclick = null;
// 10751
o157.tabIndex = 0;
// 10752
// 10753
f974244559_1628 = function() { return f974244559_1628.returns[f974244559_1628.inst++]; };
f974244559_1628.returns = [];
f974244559_1628.inst = 0;
// 10754
o157.JSBNG__focus = f974244559_1628;
// 10755
f974244559_1628.returns.push(undefined);
// 10756
o156 = {};
// 10757
o152.classList = o156;
// 10759
o156.contains = f974244559_1617;
// undefined
o156 = null;
// 10760
f974244559_1617.returns.push(false);
// 10761
o156 = {};
// 10762
o152.parentNode = o156;
// 10763
o158 = {};
// 10764
o156.classList = o158;
// 10766
o158.contains = f974244559_1617;
// undefined
o158 = null;
// 10767
f974244559_1617.returns.push(false);
// 10768
o158 = {};
// 10769
o156.parentNode = o158;
// 10770
o159 = {};
// 10771
o158.classList = o159;
// 10773
o159.contains = f974244559_1617;
// undefined
o159 = null;
// 10774
f974244559_1617.returns.push(false);
// 10775
o158.parentNode = o149;
// 10776
o159 = {};
// 10777
o149.classList = o159;
// 10779
o159.contains = f974244559_1617;
// undefined
o159 = null;
// 10780
f974244559_1617.returns.push(false);
// 10781
o149.parentNode = o150;
// 10782
o159 = {};
// 10783
o150.classList = o159;
// 10785
o159.contains = f974244559_1617;
// undefined
o159 = null;
// 10786
f974244559_1617.returns.push(true);
// 10787
o155.nodeName = "A";
// 10788
o155.__FB_TOKEN = void 0;
// 10789
// 10790
o155.getAttribute = f974244559_500;
// 10791
o155.hasAttribute = f974244559_527;
// 10793
f974244559_527.returns.push(false);
// 10794
o155.JSBNG__addEventListener = f974244559_472;
// 10796
f974244559_472.returns.push(undefined);
// 10797
o155.JSBNG__onclick = null;
// 10799
o150.getElementsByTagName = f974244559_514;
// 10801
o150.querySelectorAll = f974244559_523;
// 10802
o159 = {};
// 10803
f974244559_523.returns.push(o159);
// 10804
o159.length = 1;
// 10805
o160 = {};
// 10806
o159["0"] = o160;
// undefined
o159 = null;
// 10807
o160.nodeName = "A";
// 10808
o160.__FB_TOKEN = void 0;
// 10809
// 10810
o160.getAttribute = f974244559_500;
// 10811
o160.hasAttribute = f974244559_527;
// 10813
f974244559_527.returns.push(false);
// 10814
o160.JSBNG__addEventListener = f974244559_472;
// 10816
f974244559_472.returns.push(undefined);
// 10817
o160.JSBNG__onclick = null;
// 10822
o159 = {};
// 10823
f974244559_502.returns.push(o159);
// undefined
o159 = null;
// 10834
o159 = {};
// 10835
f974244559_502.returns.push(o159);
// 10837
o161 = {};
// 10838
f974244559_502.returns.push(o161);
// 10839
o161.__FB_TOKEN = void 0;
// 10840
// 10845
o159.getElementsByTagName = f974244559_514;
// 10847
o159.querySelectorAll = f974244559_523;
// 10848
o162 = {};
// 10849
f974244559_523.returns.push(o162);
// 10850
o162.length = 1;
// 10851
o163 = {};
// 10852
o162["0"] = o163;
// undefined
o162 = null;
// 10854
o163.nodeName = "INPUT";
// 10855
o163.__FB_TOKEN = void 0;
// 10856
// 10857
o163.getAttribute = f974244559_500;
// 10858
o163.hasAttribute = f974244559_527;
// 10860
f974244559_527.returns.push(false);
// 10861
o163.JSBNG__addEventListener = f974244559_472;
// 10863
f974244559_472.returns.push(undefined);
// 10864
o163.JSBNG__onJSBNG__focus = void 0;
// 10867
o162 = {};
// 10868
o164 = {};
// 10870
o162.length = 1;
// 10871
o162["0"] = "hfrQl";
// 10877
f974244559_13.returns.push(29);
// 10878
o3.onLine = true;
// 10880
f974244559_471.returns.push(1373491297160);
// 10881
o165 = {};
// 10882
o166 = {};
// 10884
o165.length = 1;
// 10885
o165["0"] = "C6rJk";
// 10890
o167 = {};
// 10891
f974244559_70.returns.push(o167);
// 10892
// 10893
o167.open = f974244559_1564;
// 10894
f974244559_1564.returns.push(undefined);
// 10895
o167.setRequestHeader = f974244559_1565;
// 10896
f974244559_1565.returns.push(undefined);
// 10899
f974244559_1565.returns.push(undefined);
// 10900
o167.send = f974244559_1566;
// 10901
f974244559_1566.returns.push(undefined);
// 10904
f974244559_502.returns.push(o144);
// 10906
f974244559_502.returns.push(o142);
// 10909
f974244559_471.returns.push(1373491297170);
// 10920
o142.getAttributeNode = f974244559_519;
// 10922
o168 = {};
// 10923
f974244559_519.returns.push(o168);
// 10924
o168.value = "fbMessagesJewel";
// undefined
o168 = null;
// 10927
o168 = {};
// 10928
f974244559_514.returns.push(o168);
// 10929
o168.length = 41;
// 10930
o169 = {};
// 10931
o168["0"] = o169;
// 10932
o169.getAttributeNode = f974244559_519;
// 10934
f974244559_519.returns.push(null);
// 10936
o170 = {};
// 10937
o168["1"] = o170;
// 10938
o170.getAttributeNode = f974244559_519;
// 10940
o171 = {};
// 10941
f974244559_519.returns.push(o171);
// 10942
o171.value = "mercurymessagesCountWrapper";
// undefined
o171 = null;
// 10944
o171 = {};
// 10945
o168["2"] = o171;
// undefined
o168 = null;
// 10946
o171.getAttributeNode = f974244559_519;
// 10948
o168 = {};
// 10949
f974244559_519.returns.push(o168);
// 10950
o168.value = "mercurymessagesCountValue";
// undefined
o168 = null;
// 10952
o142.contains = f974244559_702;
// 10954
f974244559_702.returns.push(true);
// 10959
o168 = {};
// 10960
f974244559_523.returns.push(o168);
// 10961
o168.length = 1;
// 10962
o168["0"] = o170;
// undefined
o168 = null;
// 10964
o170.querySelectorAll = f974244559_523;
// 10965
o168 = {};
// 10966
f974244559_523.returns.push(o168);
// 10967
o168.length = 1;
// 10968
o168["0"] = o171;
// undefined
o168 = null;
// 10969
o168 = {};
// undefined
fo974244559_1653_firstChild = function() { return fo974244559_1653_firstChild.returns[fo974244559_1653_firstChild.inst++]; };
fo974244559_1653_firstChild.returns = [];
fo974244559_1653_firstChild.inst = 0;
defineGetter(o171, "firstChild", fo974244559_1653_firstChild, undefined);
// undefined
fo974244559_1653_firstChild.returns.push(o168);
// undefined
fo974244559_1653_firstChild.returns.push(o168);
// 10972
o168.parentNode = o171;
// 10974
o171.removeChild = f974244559_507;
// 10975
f974244559_507.returns.push(o168);
// undefined
o168 = null;
// undefined
fo974244559_1653_firstChild.returns.push(null);
// 10978
o168 = {};
// 10979
f974244559_478.returns.push(o168);
// 10980
f974244559_1659 = function() { return f974244559_1659.returns[f974244559_1659.inst++]; };
f974244559_1659.returns = [];
f974244559_1659.inst = 0;
// 10981
o0.createTextNode = f974244559_1659;
// 10982
o172 = {};
// 10983
f974244559_1659.returns.push(o172);
// 10984
o168.appendChild = f974244559_482;
// 10985
f974244559_482.returns.push(o172);
// undefined
o172 = null;
// 10986
o171.appendChild = f974244559_482;
// 10987
f974244559_482.returns.push(o168);
// undefined
o168 = null;
// 10988
o168 = {};
// 10989
o142.classList = o168;
// 10991
o168.remove = f974244559_1244;
// 10992
f974244559_1244.returns.push(undefined);
// 10995
o144.getElementsByTagName = f974244559_514;
// 10996
o144.getAttributeNode = f974244559_519;
// 10998
o172 = {};
// 10999
f974244559_519.returns.push(o172);
// 11000
o172.value = "fbMessagesFlyout";
// undefined
o172 = null;
// 11003
o172 = {};
// 11004
f974244559_514.returns.push(o172);
// 11005
o172.length = 36;
// 11006
o173 = {};
// 11007
o172["0"] = o173;
// 11008
o173.getAttributeNode = f974244559_519;
// 11010
f974244559_519.returns.push(null);
// 11012
o174 = {};
// 11013
o172["1"] = o174;
// 11014
o174.getAttributeNode = f974244559_519;
// 11016
f974244559_519.returns.push(null);
// 11018
o175 = {};
// 11019
o172["2"] = o175;
// 11020
o175.getAttributeNode = f974244559_519;
// 11022
f974244559_519.returns.push(null);
// 11024
o176 = {};
// 11025
o172["3"] = o176;
// 11026
o176.getAttributeNode = f974244559_519;
// 11028
f974244559_519.returns.push(null);
// 11030
o177 = {};
// 11031
o172["4"] = o177;
// 11032
o177.getAttributeNode = f974244559_519;
// 11034
f974244559_519.returns.push(null);
// 11036
o178 = {};
// 11037
o172["5"] = o178;
// 11038
o178.getAttributeNode = f974244559_519;
// 11040
f974244559_519.returns.push(null);
// 11042
o179 = {};
// 11043
o172["6"] = o179;
// 11044
o179.getAttributeNode = f974244559_519;
// 11046
f974244559_519.returns.push(null);
// 11048
o180 = {};
// 11049
o172["7"] = o180;
// 11050
o180.getAttributeNode = f974244559_519;
// 11052
f974244559_519.returns.push(null);
// 11054
o172["8"] = o141;
// 11055
o141.getAttributeNode = f974244559_519;
// 11057
o181 = {};
// 11058
f974244559_519.returns.push(o181);
// 11059
o181.value = "u_0_4";
// undefined
o181 = null;
// 11061
o181 = {};
// 11062
o172["9"] = o181;
// 11063
o181.getAttributeNode = f974244559_519;
// 11065
f974244559_519.returns.push(null);
// 11067
o182 = {};
// 11068
o172["10"] = o182;
// 11069
o182.getAttributeNode = f974244559_519;
// 11071
f974244559_519.returns.push(null);
// 11073
o183 = {};
// 11074
o172["11"] = o183;
// 11075
o183.getAttributeNode = f974244559_519;
// 11077
f974244559_519.returns.push(null);
// 11079
o184 = {};
// 11080
o172["12"] = o184;
// 11081
o184.getAttributeNode = f974244559_519;
// 11083
f974244559_519.returns.push(null);
// 11085
o185 = {};
// 11086
o172["13"] = o185;
// 11087
o185.getAttributeNode = f974244559_519;
// 11089
f974244559_519.returns.push(null);
// 11091
o186 = {};
// 11092
o172["14"] = o186;
// 11093
o186.getAttributeNode = f974244559_519;
// 11095
f974244559_519.returns.push(null);
// 11097
o187 = {};
// 11098
o172["15"] = o187;
// 11099
o187.getAttributeNode = f974244559_519;
// 11101
f974244559_519.returns.push(null);
// 11103
o172["16"] = o79;
// undefined
o172 = null;
// 11104
o79.getAttributeNode = f974244559_519;
// 11106
o172 = {};
// 11107
f974244559_519.returns.push(o172);
// 11108
o172.value = "MercuryJewelThreadList";
// undefined
o172 = null;
// 11110
o144.contains = f974244559_702;
// 11112
f974244559_702.returns.push(true);
// 11115
o168.contains = f974244559_1617;
// undefined
o168 = null;
// 11116
f974244559_1617.returns.push(false);
// 11120
f974244559_471.returns.push(1373491297225);
// 11123
f974244559_502.returns.push(o146);
// 11125
f974244559_502.returns.push(null);
// 11127
f974244559_502.returns.push(null);
// 11128
o146.nodeName = "DIV";
// 11129
o146.__FB_TOKEN = void 0;
// 11130
// 11131
o146.getAttribute = f974244559_500;
// 11132
o146.hasAttribute = f974244559_527;
// 11134
f974244559_527.returns.push(false);
// 11135
o146.JSBNG__addEventListener = f974244559_472;
// 11137
f974244559_472.returns.push(undefined);
// 11138
o146.JSBNG__onsubmit = null;
// 11140
o146.getElementsByTagName = f974244559_514;
// 11142
o146.querySelectorAll = f974244559_523;
// 11143
o168 = {};
// 11144
f974244559_523.returns.push(o168);
// 11145
o168.length = 0;
// undefined
o168 = null;
// 11148
f974244559_502.returns.push(o145);
// 11150
o168 = {};
// 11151
f974244559_502.returns.push(o168);
// 11153
f974244559_502.returns.push(o148);
// 11154
o148.getElementsByTagName = f974244559_514;
// 11156
o148.querySelectorAll = f974244559_523;
// 11157
o172 = {};
// 11158
f974244559_523.returns.push(o172);
// 11159
o172.length = 1;
// 11160
o188 = {};
// 11161
o172["0"] = o188;
// undefined
o172 = null;
// 11163
o172 = {};
// 11164
f974244559_502.returns.push(o172);
// 11166
// 11173
o189 = {};
// 11174
f974244559_523.returns.push(o189);
// 11175
o189.length = 1;
// 11176
o190 = {};
// 11177
o189["0"] = o190;
// undefined
o189 = null;
// 11179
o190.querySelectorAll = f974244559_523;
// 11180
o189 = {};
// 11181
f974244559_523.returns.push(o189);
// 11182
o189.length = 1;
// 11183
o191 = {};
// 11184
o189["0"] = o191;
// undefined
o189 = null;
// 11185
o189 = {};
// undefined
fo974244559_1689_firstChild = function() { return fo974244559_1689_firstChild.returns[fo974244559_1689_firstChild.inst++]; };
fo974244559_1689_firstChild.returns = [];
fo974244559_1689_firstChild.inst = 0;
defineGetter(o191, "firstChild", fo974244559_1689_firstChild, undefined);
// undefined
fo974244559_1689_firstChild.returns.push(o189);
// undefined
fo974244559_1689_firstChild.returns.push(o189);
// 11188
o189.parentNode = o191;
// 11190
o191.removeChild = f974244559_507;
// 11191
f974244559_507.returns.push(o189);
// undefined
o189 = null;
// undefined
fo974244559_1689_firstChild.returns.push(null);
// 11194
o189 = {};
// 11195
f974244559_478.returns.push(o189);
// 11197
o192 = {};
// 11198
f974244559_1659.returns.push(o192);
// 11199
o189.appendChild = f974244559_482;
// 11200
f974244559_482.returns.push(o192);
// undefined
o192 = null;
// 11201
o191.appendChild = f974244559_482;
// 11202
f974244559_482.returns.push(o189);
// undefined
o189 = null;
// 11203
o189 = {};
// 11204
o145.classList = o189;
// 11206
o189.remove = f974244559_1244;
// 11207
f974244559_1244.returns.push(undefined);
// 11209
// 11210
o145.__FB_TOKEN = void 0;
// 11211
// 11212
o145.getAttribute = f974244559_500;
// 11213
o145.hasAttribute = f974244559_527;
// 11215
f974244559_527.returns.push(false);
// 11218
o189.contains = f974244559_1617;
// undefined
o189 = null;
// 11219
f974244559_1617.returns.push(false);
// 11222
f974244559_500.returns.push(null);
// 11223
o189 = {};
// 11224
o145.parentNode = o189;
// 11225
o189.__FB_TOKEN = void 0;
// 11226
// 11227
o189.getAttribute = f974244559_500;
// 11228
o189.hasAttribute = f974244559_527;
// 11230
f974244559_527.returns.push(false);
// 11231
o192 = {};
// 11232
o189.classList = o192;
// 11234
o192.contains = f974244559_1617;
// undefined
o192 = null;
// 11235
f974244559_1617.returns.push(false);
// 11238
f974244559_500.returns.push(null);
// 11239
o192 = {};
// 11240
o189.parentNode = o192;
// 11241
o192.__FB_TOKEN = void 0;
// 11242
// 11243
o192.getAttribute = f974244559_500;
// 11244
o192.hasAttribute = f974244559_527;
// 11246
f974244559_527.returns.push(false);
// 11247
o193 = {};
// 11248
o192.classList = o193;
// 11250
o193.contains = f974244559_1617;
// undefined
o193 = null;
// 11251
f974244559_1617.returns.push(false);
// 11254
f974244559_500.returns.push(null);
// 11255
o193 = {};
// 11256
o192.parentNode = o193;
// 11257
o193.__FB_TOKEN = void 0;
// 11258
// 11259
o193.getAttribute = f974244559_500;
// 11260
o193.hasAttribute = f974244559_527;
// 11262
f974244559_527.returns.push(false);
// 11263
o194 = {};
// 11264
o193.classList = o194;
// 11266
o194.contains = f974244559_1617;
// undefined
o194 = null;
// 11267
f974244559_1617.returns.push(false);
// 11270
f974244559_500.returns.push(null);
// 11271
o194 = {};
// 11272
o193.parentNode = o194;
// 11273
o194.__FB_TOKEN = void 0;
// 11274
// 11275
o194.getAttribute = f974244559_500;
// 11276
o194.hasAttribute = f974244559_527;
// 11278
f974244559_527.returns.push(false);
// 11279
o195 = {};
// 11280
o194.classList = o195;
// 11282
o195.contains = f974244559_1617;
// undefined
o195 = null;
// 11283
f974244559_1617.returns.push(false);
// 11286
f974244559_500.returns.push(null);
// 11287
o195 = {};
// 11288
o194.parentNode = o195;
// 11289
o195.__FB_TOKEN = void 0;
// 11290
// 11291
o195.getAttribute = f974244559_500;
// 11292
o195.hasAttribute = f974244559_527;
// 11294
f974244559_527.returns.push(false);
// 11295
o196 = {};
// 11296
o195.classList = o196;
// 11298
o196.contains = f974244559_1617;
// undefined
o196 = null;
// 11299
f974244559_1617.returns.push(false);
// 11302
f974244559_500.returns.push(null);
// 11303
o195.parentNode = o76;
// 11304
o76.__FB_TOKEN = void 0;
// 11305
// 11307
o76.hasAttribute = f974244559_527;
// 11309
f974244559_527.returns.push(false);
// 11310
o196 = {};
// 11311
o76.classList = o196;
// 11313
o196.contains = f974244559_1617;
// undefined
o196 = null;
// 11314
f974244559_1617.returns.push(false);
// 11317
f974244559_500.returns.push(null);
// 11322
f974244559_527.returns.push(false);
// 11326
f974244559_1617.returns.push(false);
// 11329
f974244559_500.returns.push(null);
// 11334
f974244559_527.returns.push(false);
// 11335
o196 = {};
// 11336
o8.classList = o196;
// 11338
o196.contains = f974244559_1617;
// 11339
f974244559_1617.returns.push(false);
// 11342
f974244559_500.returns.push(null);
// 11345
o0.classList = void 0;
// 11346
o0.className = void 0;
// 11349
f974244559_12.returns.push(30);
// 11353
o197 = {};
// 11354
f974244559_523.returns.push(o197);
// 11355
o197.length = 1;
// 11356
o197["0"] = o190;
// undefined
o197 = null;
// 11359
o197 = {};
// 11360
f974244559_523.returns.push(o197);
// 11361
o197.length = 1;
// 11362
o197["0"] = o191;
// undefined
o197 = null;
// 11363
o168.nodeName = "UL";
// 11364
o168.__FB_TOKEN = void 0;
// 11365
// 11366
o168.getAttribute = f974244559_500;
// 11367
o168.hasAttribute = f974244559_527;
// 11369
f974244559_527.returns.push(false);
// 11370
o168.JSBNG__addEventListener = f974244559_472;
// 11372
f974244559_472.returns.push(undefined);
// 11373
o168.JSBNG__onmousedown = null;
// 11378
f974244559_472.returns.push(undefined);
// 11379
o168.JSBNG__onmouseout = null;
// 11384
f974244559_472.returns.push(undefined);
// 11385
o168.JSBNG__onmouseover = null;
// 11387
o145.nodeName = "DIV";
// 11391
f974244559_527.returns.push(false);
// 11392
o145.JSBNG__addEventListener = f974244559_472;
// 11394
f974244559_472.returns.push(undefined);
// 11395
o145.JSBNG__onmouseover = null;
// 11398
f974244559_502.returns.push(o145);
// 11402
o197 = {};
// 11403
f974244559_523.returns.push(o197);
// 11404
o197.length = 1;
// 11405
o197["0"] = o88;
// undefined
o197 = null;
// 11409
o197 = {};
// 11410
f974244559_523.returns.push(o197);
// 11411
o197.length = 1;
// 11412
o198 = {};
// 11413
o197["0"] = o198;
// undefined
o197 = null;
// 11415
o198.querySelectorAll = f974244559_523;
// 11416
o197 = {};
// 11417
f974244559_523.returns.push(o197);
// 11418
o197.length = 1;
// 11419
o199 = {};
// 11420
o197["0"] = o199;
// undefined
o197 = null;
// 11421
o197 = {};
// 11422
o199.classList = o197;
// 11424
o197.contains = f974244559_1617;
// undefined
o197 = null;
// 11425
f974244559_1617.returns.push(false);
// 11426
o197 = {};
// 11427
o199.parentNode = o197;
// 11428
o200 = {};
// 11429
o197.classList = o200;
// 11431
o200.contains = f974244559_1617;
// undefined
o200 = null;
// 11432
f974244559_1617.returns.push(false);
// 11433
o197.parentNode = o198;
// 11434
o200 = {};
// 11435
o198.classList = o200;
// 11437
o200.contains = f974244559_1617;
// undefined
o200 = null;
// 11438
f974244559_1617.returns.push(true);
// 11440
o199.nodeName = "A";
// 11441
o199.__FB_TOKEN = void 0;
// 11442
// 11443
o199.getAttribute = f974244559_500;
// 11444
o199.hasAttribute = f974244559_527;
// 11446
f974244559_527.returns.push(false);
// 11447
o199.JSBNG__addEventListener = f974244559_472;
// 11449
f974244559_472.returns.push(undefined);
// 11450
o199.JSBNG__onsuccess = void 0;
// 11452
f974244559_12.returns.push(31);
// 11456
f974244559_527.returns.push(false);
// 11460
f974244559_1617.returns.push(false);
// 11463
f974244559_500.returns.push(null);
// 11468
f974244559_527.returns.push(false);
// 11472
f974244559_1617.returns.push(false);
// 11475
f974244559_500.returns.push(null);
// 11480
f974244559_527.returns.push(false);
// 11484
f974244559_1617.returns.push(false);
// 11487
f974244559_500.returns.push(null);
// 11492
f974244559_527.returns.push(false);
// 11496
f974244559_1617.returns.push(false);
// 11499
f974244559_500.returns.push(null);
// 11504
f974244559_527.returns.push(false);
// 11508
f974244559_1617.returns.push(false);
// 11511
f974244559_500.returns.push(null);
// 11516
f974244559_527.returns.push(false);
// 11520
f974244559_1617.returns.push(false);
// 11523
f974244559_500.returns.push(null);
// 11528
f974244559_527.returns.push(false);
// 11532
f974244559_1617.returns.push(false);
// 11535
f974244559_500.returns.push(null);
// 11540
f974244559_527.returns.push(false);
// 11544
f974244559_1617.returns.push(false);
// 11547
f974244559_500.returns.push(null);
// 11552
f974244559_527.returns.push(false);
// 11556
f974244559_1617.returns.push(false);
// 11559
f974244559_500.returns.push(null);
// 11566
o168.getElementsByTagName = f974244559_514;
// 11568
o168.querySelectorAll = f974244559_523;
// 11569
o200 = {};
// 11570
f974244559_523.returns.push(o200);
// 11571
o200.length = 0;
// undefined
o200 = null;
// 11578
f974244559_471.returns.push(1373491297324);
// 11580
f974244559_471.returns.push(1373491297324);
// 11583
f974244559_471.returns.push(1373491297325);
// 11585
f974244559_471.returns.push(1373491297325);
// 11588
f974244559_471.returns.push(1373491297326);
// 11591
f974244559_471.returns.push(1373491297326);
// 11593
f974244559_471.returns.push(1373491297327);
// 11595
o200 = {};
// 11596
o201 = {};
// 11598
o200.transport = o167;
// 11599
o167.readyState = 1;
// 11605
o202 = {};
// 11606
f974244559_502.returns.push(o202);
// 11608
o203 = {};
// 11609
f974244559_502.returns.push(o203);
// 11610
o202.nodeName = "A";
// 11611
o202.__FB_TOKEN = void 0;
// 11612
// 11613
o202.getAttribute = f974244559_500;
// 11614
o202.hasAttribute = f974244559_527;
// 11616
f974244559_527.returns.push(false);
// 11617
o202.JSBNG__addEventListener = f974244559_472;
// 11619
f974244559_472.returns.push(undefined);
// 11620
o202.JSBNG__onclick = null;
// undefined
o202 = null;
// 11624
o202 = {};
// 11625
f974244559_502.returns.push(o202);
// 11627
o204 = {};
// 11628
f974244559_502.returns.push(o204);
// 11629
o202.nodeName = "A";
// 11630
o202.__FB_TOKEN = void 0;
// 11631
// 11632
o202.getAttribute = f974244559_500;
// 11633
o202.hasAttribute = f974244559_527;
// 11635
f974244559_527.returns.push(false);
// 11636
o202.JSBNG__addEventListener = f974244559_472;
// 11638
f974244559_472.returns.push(undefined);
// 11639
o202.JSBNG__onclick = null;
// undefined
o202 = null;
// 11643
o202 = {};
// 11652
f974244559_502.returns.push(o203);
// undefined
o203 = null;
// 11657
f974244559_471.returns.push(1373491297448);
// 11663
f974244559_471.returns.push(1373491297464);
// 11670
f974244559_471.returns.push(1373491297470);
// 11673
f974244559_502.returns.push(o204);
// undefined
o204 = null;
// 11679
o203 = {};
// 11680
o204 = {};
// 11682
o203.length = 1;
// 11683
o203["0"] = "bUzfU";
// undefined
fo974244559_1_cookie.returns.push("c_user=100006118350059; csm=2");
// 11692
f974244559_471.returns.push(1373491297578);
// 11693
f974244559_13.returns.push(32);
// 11695
f974244559_471.returns.push(1373491297579);
// 11696
f974244559_470.returns.push(0.7455075979232788);
// 11698
f974244559_471.returns.push(1373491297579);
// 11701
f974244559_471.returns.push(1373491297579);
// 11703
f974244559_470.returns.push(0.8785001414362341);
// undefined
fo974244559_1_cookie.returns.push("c_user=100006118350059; csm=2");
// 11706
// 11707
f974244559_1727 = function() { return f974244559_1727.returns[f974244559_1727.inst++]; };
f974244559_1727.returns = [];
f974244559_1727.inst = 0;
// 11708
ow974244559.JSBNG__onpageshow = f974244559_1727;
// 11709
f974244559_7.returns.push(undefined);
// 11710
f974244559_1728 = function() { return f974244559_1728.returns[f974244559_1728.inst++]; };
f974244559_1728.returns = [];
f974244559_1728.inst = 0;
// 11711
ow974244559.JSBNG__onpagehide = f974244559_1728;
// 11714
o205 = {};
// 11715
f974244559_0.returns.push(o205);
// undefined
o205 = null;
// undefined
fo974244559_1_cookie.returns.push("c_user=100006118350059; csm=2; sub=268435456");
// 11717
f974244559_14.returns.push(undefined);
// 11718
o205 = {};
// 11719
f974244559_0.returns.push(o205);
// undefined
o205 = null;
// 11720
o205 = {};
// 11721
f974244559_0.returns.push(o205);
// undefined
o205 = null;
// 11722
o205 = {};
// 11723
f974244559_0.returns.push(o205);
// undefined
o205 = null;
// undefined
fo974244559_1_cookie.returns.push("c_user=100006118350059; csm=2; sub=268435456");
// 11725
o205 = {};
// 11726
f974244559_70.returns.push(o205);
// 11727
o205.open = f974244559_1564;
// 11728
f974244559_1564.returns.push(undefined);
// 11729
// 11730
f974244559_12.returns.push(33);
// 11732
f974244559_471.returns.push(1373491297587);
// 11733
o205.send = f974244559_1566;
// 11734
f974244559_1566.returns.push(undefined);
// 11737
f974244559_471.returns.push(1373491297593);
// 11739
f974244559_471.returns.push(1373491297597);
// 11741
f974244559_471.returns.push(1373491297597);
// 11742
f974244559_13.returns.push(34);
// 11743
f974244559_13.returns.push(35);
// 11745
f974244559_471.returns.push(1373491297599);
// 11746
f974244559_12.returns.push(36);
// 11748
f974244559_12.returns.push(37);
// 11749
f974244559_12.returns.push(38);
// 11750
f974244559_12.returns.push(39);
// 11751
f974244559_12.returns.push(40);
// 11752
f974244559_12.returns.push(41);
// 11754
f974244559_471.returns.push(1373491297606);
// 11756
f974244559_471.returns.push(1373491297608);
// 11758
f974244559_471.returns.push(1373491297608);
// 11760
f974244559_471.returns.push(1373491297608);
// 11761
f974244559_14.returns.push(undefined);
// 11762
f974244559_12.returns.push(42);
// 11763
f974244559_12.returns.push(43);
// 11766
o206 = {};
// 11767
f974244559_502.returns.push(o206);
// 11770
f974244559_471.returns.push(1373491297618);
// 11772
o207 = {};
// 11773
f974244559_502.returns.push(o207);
// 11774
o207.__FB_TOKEN = void 0;
// 11775
// 11776
o206.getElementsByTagName = f974244559_514;
// 11778
o206.querySelectorAll = f974244559_523;
// 11779
o208 = {};
// 11780
f974244559_523.returns.push(o208);
// 11781
o208.length = 0;
// undefined
o208 = null;
// 11785
o208 = {};
// 11786
f974244559_523.returns.push(o208);
// 11787
o208.length = 0;
// undefined
o208 = null;
// 11791
o208 = {};
// 11792
f974244559_502.returns.push(o208);
// 11793
o208.nodeName = "BUTTON";
// 11794
o208.__FB_TOKEN = void 0;
// 11795
// 11796
o208.getAttribute = f974244559_500;
// 11797
o208.hasAttribute = f974244559_527;
// 11799
f974244559_527.returns.push(false);
// 11800
o208.JSBNG__addEventListener = f974244559_472;
// 11802
f974244559_472.returns.push(undefined);
// 11803
f974244559_1739 = function() { return f974244559_1739.returns[f974244559_1739.inst++]; };
f974244559_1739.returns = [];
f974244559_1739.inst = 0;
// 11804
o208.JSBNG__onclick = f974244559_1739;
// 11807
// undefined
o208 = null;
// 11812
o208 = {};
// 11813
f974244559_502.returns.push(o208);
// 11816
f974244559_471.returns.push(1373491297629);
// 11818
o209 = {};
// 11819
f974244559_502.returns.push(o209);
// 11820
o209.__FB_TOKEN = void 0;
// 11821
// undefined
o209 = null;
// 11822
o208.getElementsByTagName = f974244559_514;
// 11824
o208.querySelectorAll = f974244559_523;
// undefined
o208 = null;
// 11825
o208 = {};
// 11826
f974244559_523.returns.push(o208);
// 11827
o208.length = 0;
// undefined
o208 = null;
// 11831
o208 = {};
// 11832
f974244559_523.returns.push(o208);
// 11833
o208.length = 0;
// undefined
o208 = null;
// 11837
o208 = {};
// 11838
f974244559_502.returns.push(o208);
// 11839
o208.nodeName = "BUTTON";
// 11840
o208.__FB_TOKEN = void 0;
// 11841
// 11842
o208.getAttribute = f974244559_500;
// 11843
o208.hasAttribute = f974244559_527;
// 11845
f974244559_527.returns.push(false);
// 11846
o208.JSBNG__addEventListener = f974244559_472;
// 11848
f974244559_472.returns.push(undefined);
// 11849
f974244559_1745 = function() { return f974244559_1745.returns[f974244559_1745.inst++]; };
f974244559_1745.returns = [];
f974244559_1745.inst = 0;
// 11850
o208.JSBNG__onclick = f974244559_1745;
// 11853
// undefined
o208 = null;
// 11862
o208 = {};
// 11863
f974244559_480.returns.push(o208);
// 11864
// 11865
// 11866
o208.getElementsByTagName = f974244559_514;
// 11867
o209 = {};
// 11868
f974244559_514.returns.push(o209);
// 11869
o209.length = 0;
// undefined
o209 = null;
// 11871
o209 = {};
// 11872
o208.childNodes = o209;
// undefined
o208 = null;
// 11873
o209.item = f974244559_517;
// 11874
o209.length = 1;
// 11875
o208 = {};
// 11876
o209["0"] = o208;
// undefined
o209 = null;
// 11877
o208.__html = void 0;
// 11878
o208.mountComponentIntoNode = void 0;
// 11879
o209 = {};
// 11880
o208.classList = o209;
// 11882
o209.add = f974244559_1110;
// 11883
f974244559_1110.returns.push(undefined);
// 11884
o208.__FB_TOKEN = void 0;
// 11885
// 11886
o208.getElementsByTagName = f974244559_514;
// 11888
o208.querySelectorAll = f974244559_523;
// 11889
o210 = {};
// 11890
f974244559_523.returns.push(o210);
// 11891
o210.length = 1;
// 11892
o211 = {};
// 11893
o210["0"] = o211;
// undefined
o210 = null;
// 11897
f974244559_1110.returns.push(undefined);
// 11901
o210 = {};
// 11902
f974244559_478.returns.push(o210);
// 11904
o25.appendChild = f974244559_482;
// 11905
f974244559_482.returns.push(o210);
// undefined
o210 = null;
// 11906
o211.__FB_TOKEN = void 0;
// 11907
// 11908
o211.getAttribute = f974244559_500;
// 11909
o211.hasAttribute = f974244559_527;
// 11911
f974244559_527.returns.push(true);
// 11913
f974244559_500.returns.push("300");
// 11917
f974244559_527.returns.push(false);
// 11920
o209.remove = f974244559_1244;
// undefined
o209 = null;
// 11921
f974244559_1244.returns.push(undefined);
// 11925
f974244559_527.returns.push(false);
// 11929
f974244559_527.returns.push(true);
// 11931
f974244559_500.returns.push("false");
// 11935
f974244559_527.returns.push(false);
// 11939
f974244559_527.returns.push(false);
// 11943
f974244559_527.returns.push(true);
// 11945
f974244559_500.returns.push("false");
// 11946
o208.getAttribute = f974244559_500;
// 11947
o208.hasAttribute = f974244559_527;
// 11949
f974244559_527.returns.push(false);
// 11953
f974244559_1244.returns.push(undefined);
// 11957
f974244559_527.returns.push(false);
// 11961
f974244559_527.returns.push(false);
// 11965
f974244559_527.returns.push(true);
// 11967
f974244559_500.returns.push("left");
// 11971
f974244559_1244.returns.push(undefined);
// 11975
f974244559_1244.returns.push(undefined);
// 11979
f974244559_1110.returns.push(undefined);
// 11983
f974244559_1244.returns.push(undefined);
// 11987
f974244559_1244.returns.push(undefined);
// 11988
o209 = {};
// 11989
o211.classList = o209;
// 11991
o209.remove = f974244559_1244;
// 11992
f974244559_1244.returns.push(undefined);
// 11996
f974244559_1244.returns.push(undefined);
// 12000
f974244559_1244.returns.push(undefined);
// 12003
o209.add = f974244559_1110;
// undefined
o209 = null;
// 12004
f974244559_1110.returns.push(undefined);
// 12008
f974244559_1244.returns.push(undefined);
// 12010
o209 = {};
// 12011
f974244559_480.returns.push(o209);
// 12012
// 12013
o209.__html = void 0;
// 12015
o210 = {};
// 12016
f974244559_478.returns.push(o210);
// 12018
o211.appendChild = f974244559_482;
// undefined
o211 = null;
// 12019
f974244559_482.returns.push(o210);
// undefined
o210 = null;
// 12020
o210 = {};
// 12021
o209.style = o210;
// undefined
o209 = null;
// 12022
// 12024
// 12026
// 12028
// 12030
// 12032
// undefined
o210 = null;
// 12036
f974244559_527.returns.push(false);
// 12040
o209 = {};
// 12041
f974244559_523.returns.push(o209);
// 12042
o209.length = 1;
// 12043
o210 = {};
// 12044
o209["0"] = o210;
// undefined
o209 = null;
// 12045
o210.setAttribute = f974244559_643;
// 12046
f974244559_643.returns.push(undefined);
// 12047
o210.getElementsByTagName = f974244559_514;
// 12049
o210.querySelectorAll = f974244559_523;
// undefined
o210 = null;
// 12050
o209 = {};
// 12051
f974244559_523.returns.push(o209);
// 12052
o209.length = 0;
// undefined
o209 = null;
// 12053
o208.nodeName = "DIV";
// 12057
f974244559_527.returns.push(false);
// 12058
o208.JSBNG__addEventListener = f974244559_472;
// 12060
f974244559_472.returns.push(undefined);
// 12061
o208.JSBNG__onclick = null;
// 12066
f974244559_472.returns.push(undefined);
// 12067
o208.JSBNG__onsubmit = null;
// 12072
f974244559_472.returns.push(undefined);
// 12073
o208.JSBNG__onsuccess = void 0;
// 12078
f974244559_472.returns.push(undefined);
// 12079
o208.JSBNG__onerror = null;
// undefined
o208 = null;
// 12081
f974244559_12.returns.push(44);
// 12084
o208 = {};
// 12085
f974244559_480.returns.push(o208);
// 12086
// 12087
// 12088
o208.getElementsByTagName = f974244559_514;
// 12089
o209 = {};
// 12090
f974244559_514.returns.push(o209);
// 12091
o209.length = 0;
// undefined
o209 = null;
// 12093
o209 = {};
// 12094
o208.childNodes = o209;
// undefined
o208 = null;
// 12095
o209.item = f974244559_517;
// 12096
o209.length = 1;
// 12097
o208 = {};
// 12098
o209["0"] = o208;
// undefined
o209 = null;
// 12099
o208.__html = void 0;
// 12100
o208.mountComponentIntoNode = void 0;
// 12101
o209 = {};
// 12102
o208.classList = o209;
// 12104
o209.add = f974244559_1110;
// 12105
f974244559_1110.returns.push(undefined);
// 12106
o208.__FB_TOKEN = void 0;
// 12107
// 12108
o208.getElementsByTagName = f974244559_514;
// 12110
o208.querySelectorAll = f974244559_523;
// 12111
o210 = {};
// 12112
f974244559_523.returns.push(o210);
// 12113
o210.length = 1;
// 12114
o211 = {};
// 12115
o210["0"] = o211;
// undefined
o210 = null;
// 12119
f974244559_1110.returns.push(undefined);
// 12123
o210 = {};
// 12124
f974244559_478.returns.push(o210);
// 12127
f974244559_482.returns.push(o210);
// undefined
o210 = null;
// 12128
o211.__FB_TOKEN = void 0;
// 12129
// 12130
o211.getAttribute = f974244559_500;
// 12131
o211.hasAttribute = f974244559_527;
// 12133
f974244559_527.returns.push(true);
// 12135
f974244559_500.returns.push("300");
// 12139
f974244559_527.returns.push(false);
// 12142
o209.remove = f974244559_1244;
// undefined
o209 = null;
// 12143
f974244559_1244.returns.push(undefined);
// 12147
f974244559_527.returns.push(false);
// 12151
f974244559_527.returns.push(true);
// 12153
f974244559_500.returns.push("false");
// 12157
f974244559_527.returns.push(false);
// 12161
f974244559_527.returns.push(false);
// 12165
f974244559_527.returns.push(true);
// 12167
f974244559_500.returns.push("false");
// 12168
o208.getAttribute = f974244559_500;
// 12169
o208.hasAttribute = f974244559_527;
// 12171
f974244559_527.returns.push(false);
// 12175
f974244559_1244.returns.push(undefined);
// 12179
f974244559_527.returns.push(false);
// 12183
f974244559_527.returns.push(false);
// 12187
f974244559_527.returns.push(true);
// 12189
f974244559_500.returns.push("left");
// 12193
f974244559_1244.returns.push(undefined);
// 12197
f974244559_1244.returns.push(undefined);
// 12201
f974244559_1110.returns.push(undefined);
// 12205
f974244559_1244.returns.push(undefined);
// 12209
f974244559_1244.returns.push(undefined);
// 12210
o209 = {};
// 12211
o211.classList = o209;
// 12213
o209.remove = f974244559_1244;
// 12214
f974244559_1244.returns.push(undefined);
// 12218
f974244559_1244.returns.push(undefined);
// 12222
f974244559_1244.returns.push(undefined);
// 12225
o209.add = f974244559_1110;
// undefined
o209 = null;
// 12226
f974244559_1110.returns.push(undefined);
// 12230
f974244559_1244.returns.push(undefined);
// 12232
o209 = {};
// 12233
f974244559_480.returns.push(o209);
// 12234
// 12235
o209.__html = void 0;
// 12237
o210 = {};
// 12238
f974244559_478.returns.push(o210);
// 12240
o211.appendChild = f974244559_482;
// undefined
o211 = null;
// 12241
f974244559_482.returns.push(o210);
// undefined
o210 = null;
// 12242
o210 = {};
// 12243
o209.style = o210;
// undefined
o209 = null;
// 12244
// 12246
// 12248
// 12250
// 12252
// 12254
// undefined
o210 = null;
// 12258
f974244559_527.returns.push(false);
// 12262
o209 = {};
// 12263
f974244559_523.returns.push(o209);
// 12264
o209.length = 1;
// 12265
o210 = {};
// 12266
o209["0"] = o210;
// undefined
o209 = null;
// 12267
o210.setAttribute = f974244559_643;
// 12268
f974244559_643.returns.push(undefined);
// 12269
o210.getElementsByTagName = f974244559_514;
// 12271
o210.querySelectorAll = f974244559_523;
// undefined
o210 = null;
// 12272
o209 = {};
// 12273
f974244559_523.returns.push(o209);
// 12274
o209.length = 0;
// undefined
o209 = null;
// 12275
o208.nodeName = "DIV";
// 12279
f974244559_527.returns.push(false);
// 12280
o208.JSBNG__addEventListener = f974244559_472;
// 12282
f974244559_472.returns.push(undefined);
// 12283
o208.JSBNG__onclick = null;
// 12288
f974244559_472.returns.push(undefined);
// 12289
o208.JSBNG__onsubmit = null;
// 12294
f974244559_472.returns.push(undefined);
// 12295
o208.JSBNG__onsuccess = void 0;
// 12300
f974244559_472.returns.push(undefined);
// 12301
o208.JSBNG__onerror = null;
// undefined
o208 = null;
// 12303
f974244559_12.returns.push(45);
// 12306
o208 = {};
// 12307
o209 = {};
// 12309
o208.length = 1;
// 12310
o208["0"] = "EzMPG";
// 12318
f974244559_471.returns.push(1373491297866);
// 12323
o210 = {};
// 12324
f974244559_502.returns.push(o210);
// 12326
o211 = {};
// 12327
f974244559_480.returns.push(o211);
// 12328
// 12329
// 12330
o211.getElementsByTagName = f974244559_514;
// 12331
o212 = {};
// 12332
f974244559_514.returns.push(o212);
// 12333
o212.length = 0;
// undefined
o212 = null;
// 12335
o212 = {};
// 12336
o211.childNodes = o212;
// undefined
o211 = null;
// 12337
o212.item = f974244559_517;
// 12338
o212.length = 1;
// 12339
o211 = {};
// 12340
o212["0"] = o211;
// undefined
o212 = null;
// undefined
o211 = null;
// 12342
o211 = {};
// 12343
f974244559_480.returns.push(o211);
// 12344
// 12345
// 12346
o211.getElementsByTagName = f974244559_514;
// 12347
o212 = {};
// 12348
f974244559_514.returns.push(o212);
// 12349
o212.length = 0;
// undefined
o212 = null;
// 12351
o212 = {};
// 12352
o211.childNodes = o212;
// undefined
o211 = null;
// 12353
o212.item = f974244559_517;
// 12354
o212.length = 1;
// 12355
o211 = {};
// 12356
o212["0"] = o211;
// undefined
o212 = null;
// undefined
o211 = null;
// 12357
o211 = {};
// 12358
o210.classList = o211;
// 12360
o211.contains = f974244559_1617;
// undefined
o211 = null;
// 12361
f974244559_1617.returns.push(false);
// 12362
o210.parentNode = o99;
// 12363
o211 = {};
// 12364
o99.classList = o211;
// 12366
o211.contains = f974244559_1617;
// undefined
o211 = null;
// 12367
f974244559_1617.returns.push(false);
// 12368
o99.parentNode = o98;
// undefined
o99 = null;
// 12369
o99 = {};
// 12370
o98.classList = o99;
// 12372
o99.contains = f974244559_1617;
// undefined
o99 = null;
// 12373
f974244559_1617.returns.push(false);
// 12374
o98.parentNode = o97;
// undefined
o98 = null;
// 12375
o98 = {};
// 12376
o97.classList = o98;
// 12378
o98.contains = f974244559_1617;
// undefined
o98 = null;
// 12379
f974244559_1617.returns.push(false);
// 12380
o97.parentNode = o95;
// 12383
o96.contains = f974244559_1617;
// undefined
o96 = null;
// 12384
f974244559_1617.returns.push(false);
// 12385
o96 = {};
// 12386
o95.parentNode = o96;
// undefined
o95 = null;
// 12387
o95 = {};
// 12388
o96.classList = o95;
// 12390
o95.contains = f974244559_1617;
// undefined
o95 = null;
// 12391
f974244559_1617.returns.push(false);
// 12392
o95 = {};
// 12393
o96.parentNode = o95;
// 12394
o98 = {};
// 12395
o95.classList = o98;
// 12397
o98.contains = f974244559_1617;
// 12398
f974244559_1617.returns.push(false);
// 12399
o95.parentNode = o94;
// 12400
o99 = {};
// 12401
o94.classList = o99;
// 12403
o99.contains = f974244559_1617;
// undefined
o99 = null;
// 12404
f974244559_1617.returns.push(false);
// 12405
o94.parentNode = o76;
// undefined
o94 = null;
// 12409
f974244559_1617.returns.push(false);
// 12414
f974244559_1617.returns.push(false);
// 12419
f974244559_1617.returns.push(false);
// 12427
f974244559_1617.returns.push(false);
// 12432
f974244559_1617.returns.push(false);
// 12437
f974244559_1617.returns.push(false);
// 12442
f974244559_1617.returns.push(false);
// 12447
f974244559_1617.returns.push(false);
// 12452
f974244559_1617.returns.push(false);
// 12457
f974244559_1617.returns.push(false);
// 12462
f974244559_1617.returns.push(false);
// 12467
f974244559_1617.returns.push(false);
// 12472
f974244559_1617.returns.push(false);
// 12477
f974244559_1617.returns.push(false);
// 12482
o210.getElementsByTagName = f974244559_514;
// 12484
o210.querySelectorAll = f974244559_523;
// 12485
o94 = {};
// 12486
f974244559_523.returns.push(o94);
// 12487
o94.length = 1;
// 12488
o99 = {};
// 12489
o94["0"] = o99;
// undefined
o94 = null;
// undefined
o99 = null;
// 12493
f974244559_1617.returns.push(false);
// 12498
f974244559_1617.returns.push(false);
// 12503
f974244559_1617.returns.push(false);
// 12508
f974244559_1617.returns.push(false);
// 12513
f974244559_1617.returns.push(true);
// 12517
f974244559_1617.returns.push(false);
// 12522
f974244559_1617.returns.push(false);
// 12527
f974244559_1617.returns.push(false);
// 12532
f974244559_1617.returns.push(false);
// 12537
f974244559_1617.returns.push(false);
// 12542
f974244559_1617.returns.push(false);
// 12547
f974244559_1617.returns.push(true);
// 12551
f974244559_1617.returns.push(false);
// 12556
f974244559_1617.returns.push(false);
// 12561
f974244559_1617.returns.push(false);
// 12566
f974244559_1617.returns.push(true);
// 12567
o210.nodeName = "DIV";
// 12568
o210.__FB_TOKEN = void 0;
// 12569
// 12570
o210.getAttribute = f974244559_500;
// 12571
o210.hasAttribute = f974244559_527;
// 12573
f974244559_527.returns.push(false);
// 12574
o210.JSBNG__addEventListener = f974244559_472;
// 12576
f974244559_472.returns.push(undefined);
// 12577
o210.JSBNG__onclick = null;
// 12582
f974244559_472.returns.push(undefined);
// 12583
o210.JSBNG__onmouseover = null;
// 12588
f974244559_472.returns.push(undefined);
// 12589
o210.JSBNG__onmouseout = null;
// undefined
o210 = null;
// 12591
f974244559_14.returns.push(undefined);
// 12592
f974244559_12.returns.push(46);
// 12595
o94 = {};
// 12596
f974244559_502.returns.push(o94);
// 12598
o99 = {};
// 12599
f974244559_480.returns.push(o99);
// 12600
// 12601
// 12602
o99.getElementsByTagName = f974244559_514;
// 12603
o210 = {};
// 12604
f974244559_514.returns.push(o210);
// 12605
o210.length = 0;
// undefined
o210 = null;
// 12607
o210 = {};
// 12608
o99.childNodes = o210;
// undefined
o99 = null;
// 12609
o210.item = f974244559_517;
// 12610
o210.length = 1;
// 12611
o99 = {};
// 12612
o210["0"] = o99;
// undefined
o210 = null;
// undefined
o99 = null;
// 12614
o99 = {};
// 12615
f974244559_480.returns.push(o99);
// 12616
// 12617
// 12618
o99.getElementsByTagName = f974244559_514;
// 12619
o210 = {};
// 12620
f974244559_514.returns.push(o210);
// 12621
o210.length = 0;
// undefined
o210 = null;
// 12623
o210 = {};
// 12624
o99.childNodes = o210;
// undefined
o99 = null;
// 12625
o210.item = f974244559_517;
// 12626
o210.length = 1;
// 12627
o99 = {};
// 12628
o210["0"] = o99;
// undefined
o210 = null;
// undefined
o99 = null;
// 12629
o99 = {};
// 12630
o94.classList = o99;
// 12632
o99.contains = f974244559_1617;
// undefined
o99 = null;
// 12633
f974244559_1617.returns.push(false);
// 12634
o99 = {};
// 12635
o94.parentNode = o99;
// 12636
o210 = {};
// 12637
o99.classList = o210;
// 12639
o210.contains = f974244559_1617;
// undefined
o210 = null;
// 12640
f974244559_1617.returns.push(false);
// 12641
o210 = {};
// 12642
o99.parentNode = o210;
// undefined
o99 = null;
// 12643
o99 = {};
// 12644
o210.classList = o99;
// 12646
o99.contains = f974244559_1617;
// undefined
o99 = null;
// 12647
f974244559_1617.returns.push(false);
// 12648
o99 = {};
// 12649
o210.parentNode = o99;
// 12650
o211 = {};
// 12651
o99.classList = o211;
// 12653
o211.contains = f974244559_1617;
// undefined
o211 = null;
// 12654
f974244559_1617.returns.push(false);
// 12655
o211 = {};
// 12656
o99.parentNode = o211;
// undefined
o99 = null;
// 12657
o99 = {};
// 12658
o211.classList = o99;
// 12660
o99.contains = f974244559_1617;
// undefined
o99 = null;
// 12661
f974244559_1617.returns.push(false);
// 12662
o99 = {};
// 12663
o211.parentNode = o99;
// undefined
o211 = null;
// 12664
o211 = {};
// 12665
o99.classList = o211;
// 12667
o211.contains = f974244559_1617;
// undefined
o211 = null;
// 12668
f974244559_1617.returns.push(false);
// 12669
o211 = {};
// 12670
o99.parentNode = o211;
// undefined
o99 = null;
// 12671
o99 = {};
// 12672
o211.classList = o99;
// 12674
o99.contains = f974244559_1617;
// undefined
o99 = null;
// 12675
f974244559_1617.returns.push(false);
// 12676
o99 = {};
// 12677
o211.parentNode = o99;
// 12678
o212 = {};
// 12679
o99.classList = o212;
// 12681
o212.contains = f974244559_1617;
// 12682
f974244559_1617.returns.push(false);
// 12683
o213 = {};
// 12684
o99.parentNode = o213;
// 12685
o214 = {};
// 12686
o213.classList = o214;
// 12688
o214.contains = f974244559_1617;
// undefined
o214 = null;
// 12689
f974244559_1617.returns.push(false);
// 12690
o214 = {};
// 12691
o213.parentNode = o214;
// undefined
o213 = null;
// 12692
o213 = {};
// 12693
o214.classList = o213;
// 12695
o213.contains = f974244559_1617;
// undefined
o213 = null;
// 12696
f974244559_1617.returns.push(false);
// 12697
o213 = {};
// 12698
o214.parentNode = o213;
// 12699
o215 = {};
// 12700
o213.classList = o215;
// 12702
o215.contains = f974244559_1617;
// undefined
o215 = null;
// 12703
f974244559_1617.returns.push(false);
// 12704
o215 = {};
// 12705
o213.parentNode = o215;
// 12706
o216 = {};
// 12707
o215.classList = o216;
// 12709
o216.contains = f974244559_1617;
// undefined
o216 = null;
// 12710
f974244559_1617.returns.push(false);
// 12711
o215.parentNode = o106;
// 12712
o216 = {};
// 12713
o106.classList = o216;
// 12715
o216.contains = f974244559_1617;
// undefined
o216 = null;
// 12716
f974244559_1617.returns.push(false);
// 12717
o106.parentNode = o76;
// 12721
f974244559_1617.returns.push(false);
// 12726
f974244559_1617.returns.push(false);
// 12731
f974244559_1617.returns.push(false);
// 12739
f974244559_1617.returns.push(false);
// 12744
f974244559_1617.returns.push(false);
// 12749
f974244559_1617.returns.push(false);
// 12754
f974244559_1617.returns.push(false);
// 12759
f974244559_1617.returns.push(false);
// 12764
f974244559_1617.returns.push(false);
// 12769
f974244559_1617.returns.push(false);
// 12774
f974244559_1617.returns.push(false);
// 12779
f974244559_1617.returns.push(false);
// 12784
f974244559_1617.returns.push(false);
// 12789
f974244559_1617.returns.push(false);
// 12794
f974244559_1617.returns.push(false);
// 12799
f974244559_1617.returns.push(false);
// 12804
f974244559_1617.returns.push(false);
// 12809
f974244559_1617.returns.push(false);
// 12814
f974244559_1617.returns.push(false);
// 12819
o94.getElementsByTagName = f974244559_514;
// 12821
o94.querySelectorAll = f974244559_523;
// 12822
o216 = {};
// 12823
f974244559_523.returns.push(o216);
// 12824
o216.length = 1;
// 12825
o217 = {};
// 12826
o216["0"] = o217;
// undefined
o216 = null;
// undefined
o217 = null;
// 12830
f974244559_1617.returns.push(false);
// 12835
f974244559_1617.returns.push(false);
// 12840
f974244559_1617.returns.push(false);
// 12845
f974244559_1617.returns.push(false);
// 12850
f974244559_1617.returns.push(false);
// 12855
f974244559_1617.returns.push(false);
// 12860
f974244559_1617.returns.push(false);
// 12865
f974244559_1617.returns.push(false);
// 12870
f974244559_1617.returns.push(false);
// 12875
f974244559_1617.returns.push(false);
// 12880
f974244559_1617.returns.push(false);
// 12885
f974244559_1617.returns.push(false);
// 12890
f974244559_1617.returns.push(false);
// 12895
f974244559_1617.returns.push(false);
// 12900
f974244559_1617.returns.push(false);
// 12905
f974244559_1617.returns.push(false);
// 12913
f974244559_1617.returns.push(false);
// 12918
f974244559_1617.returns.push(false);
// 12923
f974244559_1617.returns.push(false);
// 12928
f974244559_1617.returns.push(false);
// 12933
f974244559_1617.returns.push(false);
// 12938
f974244559_1617.returns.push(false);
// 12943
f974244559_1617.returns.push(false);
// 12948
f974244559_1617.returns.push(false);
// 12953
f974244559_1617.returns.push(false);
// 12958
f974244559_1617.returns.push(false);
// 12963
f974244559_1617.returns.push(false);
// 12968
f974244559_1617.returns.push(false);
// 12973
f974244559_1617.returns.push(false);
// 12978
f974244559_1617.returns.push(false);
// 12983
f974244559_1617.returns.push(false);
// 12988
f974244559_1617.returns.push(false);
// 12996
f974244559_1617.returns.push(false);
// 13001
f974244559_1617.returns.push(false);
// 13006
f974244559_1617.returns.push(true);
// 13007
o94.nodeName = "DIV";
// 13008
o94.__FB_TOKEN = void 0;
// 13009
// 13010
o94.getAttribute = f974244559_500;
// 13011
o94.hasAttribute = f974244559_527;
// 13013
f974244559_527.returns.push(false);
// 13014
o94.JSBNG__addEventListener = f974244559_472;
// 13016
f974244559_472.returns.push(undefined);
// 13017
o94.JSBNG__onclick = null;
// 13022
f974244559_472.returns.push(undefined);
// 13023
o94.JSBNG__onmouseover = null;
// 13028
f974244559_472.returns.push(undefined);
// 13029
o94.JSBNG__onmouseout = null;
// undefined
o94 = null;
// 13031
f974244559_14.returns.push(undefined);
// 13032
f974244559_12.returns.push(47);
// 13035
o94 = {};
// 13036
f974244559_480.returns.push(o94);
// 13037
// 13038
// 13039
o94.getElementsByTagName = f974244559_514;
// 13040
o216 = {};
// 13041
f974244559_514.returns.push(o216);
// 13042
o216.length = 0;
// undefined
o216 = null;
// 13044
o216 = {};
// 13045
o94.childNodes = o216;
// undefined
o94 = null;
// 13046
o216.item = f974244559_517;
// 13047
o216.length = 1;
// 13048
o94 = {};
// 13049
o216["0"] = o94;
// undefined
o216 = null;
// undefined
o94 = null;
// 13051
f974244559_502.returns.push(o95);
// 13052
o95.getElementsByTagName = f974244559_514;
// 13054
o95.querySelectorAll = f974244559_523;
// undefined
o95 = null;
// 13055
o94 = {};
// 13056
f974244559_523.returns.push(o94);
// 13057
o94.length = 1;
// 13058
o94["0"] = o96;
// undefined
o94 = null;
// undefined
o96 = null;
// 13059
// 13060
// 13061
// 13067
o94 = {};
// 13068
f974244559_523.returns.push(o94);
// 13069
o94.length = 0;
// undefined
o94 = null;
// 13073
o94 = {};
// 13074
f974244559_523.returns.push(o94);
// 13075
o94.length = 1;
// 13076
o95 = {};
// 13077
o94["0"] = o95;
// undefined
o94 = null;
// 13079
o95.querySelectorAll = f974244559_523;
// undefined
o95 = null;
// 13080
o94 = {};
// 13081
f974244559_523.returns.push(o94);
// 13082
o94.length = 1;
// 13083
o95 = {};
// 13084
o94["0"] = o95;
// undefined
o94 = null;
// 13087
o98.remove = f974244559_1244;
// undefined
o98 = null;
// 13088
f974244559_1244.returns.push(undefined);
// 13092
f974244559_1244.returns.push(undefined);
// 13096
f974244559_1244.returns.push(undefined);
// 13100
f974244559_1244.returns.push(undefined);
// 13104
f974244559_1244.returns.push(undefined);
// 13105
o95.firstChild = null;
// undefined
o95 = null;
// 13109
f974244559_1617.returns.push(false);
// 13114
f974244559_1617.returns.push(false);
// 13119
f974244559_1617.returns.push(false);
// 13124
f974244559_1617.returns.push(true);
// 13125
o97.contains = f974244559_702;
// undefined
o97 = null;
// 13127
f974244559_702.returns.push(true);
// 13130
f974244559_471.returns.push(1373491297983);
// 13131
o207.getElementsByTagName = f974244559_514;
// 13133
o207.querySelectorAll = f974244559_523;
// undefined
o207 = null;
// 13134
o94 = {};
// 13135
f974244559_523.returns.push(o94);
// 13136
o94.length = 1;
// 13137
o94["0"] = o206;
// undefined
o94 = null;
// 13141
o94 = {};
// 13142
f974244559_523.returns.push(o94);
// 13143
o94.length = 0;
// undefined
o94 = null;
// 13147
o94 = {};
// 13148
f974244559_523.returns.push(o94);
// 13149
o94.length = 1;
// 13150
o95 = {};
// 13151
o94["0"] = o95;
// undefined
o94 = null;
// undefined
o95 = null;
// 13155
o94 = {};
// 13156
f974244559_523.returns.push(o94);
// 13157
o94.length = 1;
// 13158
o95 = {};
// 13159
o94["0"] = o95;
// undefined
o94 = null;
// undefined
o95 = null;
// 13160
o206.nodeName = "INPUT";
// 13161
o206.__FB_TOKEN = void 0;
// 13162
// 13163
o206.getAttribute = f974244559_500;
// 13164
o206.hasAttribute = f974244559_527;
// 13166
f974244559_527.returns.push(false);
// 13167
o206.JSBNG__addEventListener = f974244559_472;
// 13169
f974244559_472.returns.push(undefined);
// 13170
o206.JSBNG__onJSBNG__blur = void 0;
// 13175
f974244559_472.returns.push(undefined);
// 13176
o206.JSBNG__onJSBNG__focus = void 0;
// 13181
f974244559_472.returns.push(undefined);
// 13182
o206.JSBNG__onclick = null;
// 13187
f974244559_472.returns.push(undefined);
// 13188
o206.JSBNG__onkeydown = null;
// 13193
f974244559_472.returns.push(undefined);
// 13194
o206.JSBNG__onkeyup = null;
// 13199
f974244559_472.returns.push(undefined);
// 13200
o206.JSBNG__onkeypress = null;
// undefined
o206 = null;
// 13207
o8.clientHeight = 588;
// 13211
o196.remove = f974244559_1244;
// 13212
f974244559_1244.returns.push(undefined);
// 13217
f974244559_1244.returns.push(undefined);
// 13227
f974244559_471.returns.push(1373491297998);
// 13228
o2.getItem = f974244559_486;
// undefined
o2 = null;
// 13229
f974244559_486.returns.push(null);
// 13232
f974244559_471.returns.push(1373491297999);
// undefined
fo974244559_1_cookie.returns.push("c_user=100006118350059; csm=2; sub=268435456");
// 13235
o2 = {};
// 13236
f974244559_70.returns.push(o2);
// 13237
// 13238
o2.open = f974244559_1564;
// 13239
f974244559_1564.returns.push(undefined);
// 13240
o2.setRequestHeader = f974244559_1565;
// 13241
f974244559_1565.returns.push(undefined);
// 13244
f974244559_1565.returns.push(undefined);
// 13245
o2.send = f974244559_1566;
// 13246
f974244559_1566.returns.push(undefined);
// 13249
o94 = {};
// 13250
f974244559_502.returns.push(o94);
// 13252
o95 = {};
// 13253
f974244559_502.returns.push(o95);
// 13255
o96 = {};
// 13256
o97 = {};
// 13258
o96.transport = o2;
// 13259
o2.readyState = 1;
// 13260
o98 = {};
// 13261
o206 = {};
// 13263
o98.length = 1;
// 13264
o98["0"] = "brbS1";
// 13272
o207 = {};
// 13273
f974244559_502.returns.push(o207);
// undefined
o207 = null;
// 13277
o207 = {};
// 13278
f974244559_522.returns.push(o207);
// 13279
o207.length = 0;
// undefined
o207 = null;
// 13280
f974244559_1858 = function() { return f974244559_1858.returns[f974244559_1858.inst++]; };
f974244559_1858.returns = [];
f974244559_1858.inst = 0;
// 13281
o6.checkPermission = f974244559_1858;
// undefined
o6 = null;
// 13282
f974244559_1858.returns.push(1);
// 13286
o6 = {};
// 13287
f974244559_522.returns.push(o6);
// 13288
o6.length = 0;
// undefined
o6 = null;
// 13291
o6 = {};
// 13292
f974244559_502.returns.push(o6);
// undefined
o6 = null;
// 13296
o6 = {};
// 13297
f974244559_522.returns.push(o6);
// 13298
o6.length = 0;
// undefined
o6 = null;
// 13300
f974244559_1858.returns.push(1);
// 13304
o6 = {};
// 13305
f974244559_522.returns.push(o6);
// 13306
o6.length = 0;
// undefined
o6 = null;
// 13308
f974244559_470.returns.push(0.7653322485275567);
// 13310
f974244559_12.returns.push(48);
// 13311
f974244559_12.returns.push(49);
// 13312
f974244559_12.returns.push(50);
// 13313
f974244559_12.returns.push(51);
// 13314
f974244559_12.returns.push(52);
// 13321
o3.platform = "MacIntel";
// 13322
o6 = {};
// 13323
o3.plugins = o6;
// 13325
o207 = {};
// undefined
fo974244559_1863_Shockwave_Flash = function() { return fo974244559_1863_Shockwave_Flash.returns[fo974244559_1863_Shockwave_Flash.inst++]; };
fo974244559_1863_Shockwave_Flash.returns = [];
fo974244559_1863_Shockwave_Flash.inst = 0;
defineGetter(o6, "Shockwave Flash", fo974244559_1863_Shockwave_Flash, undefined);
// undefined
o6 = null;
// undefined
fo974244559_1863_Shockwave_Flash.returns.push(o207);
// undefined
o207 = null;
// 13328
o6 = {};
// undefined
fo974244559_1863_Shockwave_Flash.returns.push(o6);
// 13330
o6.description = "Shockwave Flash 11.7 r700";
// undefined
o6 = null;
// 13331
o6 = {};
// 13332
o3.mimeTypes = o6;
// undefined
o3 = null;
// 13334
o3 = {};
// undefined
fo974244559_1866_application_x_shockwave_flash = function() { return fo974244559_1866_application_x_shockwave_flash.returns[fo974244559_1866_application_x_shockwave_flash.inst++]; };
fo974244559_1866_application_x_shockwave_flash.returns = [];
fo974244559_1866_application_x_shockwave_flash.inst = 0;
defineGetter(o6, "application/x-shockwave-flash", fo974244559_1866_application_x_shockwave_flash, undefined);
// undefined
o6 = null;
// undefined
fo974244559_1866_application_x_shockwave_flash.returns.push(o3);
// undefined
o3 = null;
// 13337
o3 = {};
// undefined
fo974244559_1866_application_x_shockwave_flash.returns.push(o3);
// 13339
o6 = {};
// 13340
o3.enabledPlugin = o6;
// undefined
o3 = null;
// undefined
o6 = null;
// 13341
o0.readyState = "complete";
// 13344
o3 = {};
// 13345
f974244559_475.returns.push(o3);
// 13346
o3["0"] = o25;
// undefined
o3 = null;
// 13349
o3 = {};
// 13350
f974244559_480.returns.push(o3);
// 13351
f974244559_482.returns.push(o3);
// 13352
o3.parentNode = o25;
// 13354
f974244559_507.returns.push(o3);
// undefined
o3 = null;
// 13356
o3 = {};
// 13357
f974244559_475.returns.push(o3);
// 13358
o3["0"] = o25;
// undefined
o3 = null;
// 13360
o3 = {};
// 13361
f974244559_480.returns.push(o3);
// 13362
o3.setAttribute = f974244559_643;
// 13363
f974244559_643.returns.push(undefined);
// 13365
f974244559_643.returns.push(undefined);
// 13367
f974244559_482.returns.push(o3);
// 13368
f974244559_1874 = function() { return f974244559_1874.returns[f974244559_1874.inst++]; };
f974244559_1874.returns = [];
f974244559_1874.inst = 0;
// 13369
o3.GetVariable = f974244559_1874;
// undefined
o3 = null;
// 13371
f974244559_1874.returns.push("MAC 11,7,700,225");
// 13373
o5.host = "jsbngssl.www.facebook.com";
// undefined
o5 = null;
// 13375
o3 = {};
// 13376
f974244559_480.returns.push(o3);
// 13377
o3.setAttribute = f974244559_643;
// 13378
f974244559_643.returns.push(undefined);
// 13379
o5 = {};
// 13380
o3.style = o5;
// 13381
// undefined
o5 = null;
// 13384
f974244559_482.returns.push(o3);
// undefined
o3 = null;
// 13386
o3 = {};
// 13387
f974244559_502.returns.push(o3);
// 13388
o3.firstChild = null;
// 13391
f974244559_470.returns.push(0.3476652142126113);
// 13393
f974244559_471.returns.push(1373491298178);
// 13395
f974244559_471.returns.push(1373491298178);
// 13401
f974244559_471.returns.push(1373491298178);
// 13403
f974244559_471.returns.push(1373491298178);
// 13405
f974244559_471.returns.push(1373491298178);
// 13407
f974244559_471.returns.push(1373491298178);
// 13409
f974244559_471.returns.push(1373491298179);
// 13410
o3.nodeType = 1;
// 13412
f974244559_471.returns.push(1373491298179);
// 13414
f974244559_471.returns.push(1373491298181);
// 13416
f974244559_471.returns.push(1373491298181);
// 13417
o3.parentNode = o106;
// 13418
o3.nextSibling = null;
// 13419
o106.removeChild = f974244559_507;
// 13420
f974244559_507.returns.push(o3);
// 13421
// 13422
o106.appendChild = f974244559_482;
// undefined
o106 = null;
// 13423
f974244559_482.returns.push(o3);
// undefined
o3 = null;
// 13425
f974244559_471.returns.push(1373491298182);
// 13427
f974244559_471.returns.push(1373491298182);
// 13429
f974244559_471.returns.push(1373491298182);
// 13432
f974244559_471.returns.push(1373491298182);
// 13434
f974244559_471.returns.push(1373491298182);
// 13436
f974244559_471.returns.push(1373491298183);
// 13438
f974244559_471.returns.push(1373491298183);
// 13440
f974244559_471.returns.push(1373491298183);
// 13445
o3 = {};
// 13446
o5 = {};
// 13448
o3.length = 1;
// 13449
o3["0"] = "H+v1W";
// 13452
f974244559_471.returns.push(1373491298190);
// 13455
f974244559_471.returns.push(1373491298191);
// 13457
f974244559_471.returns.push(1373491298191);
// 13464
f974244559_502.returns.push(o215);
// 13467
o215.offsetWidth = 220;
// 13468
o215.offsetHeight = 25;
// 13470
f974244559_502.returns.push(o193);
// 13472
o25.contains = f974244559_702;
// 13474
f974244559_702.returns.push(true);
// 13475
o6 = {};
// 13476
f974244559_4.returns.push(o6);
// 13477
f974244559_1881 = function() { return f974244559_1881.returns[f974244559_1881.inst++]; };
f974244559_1881.returns = [];
f974244559_1881.inst = 0;
// 13478
o6.getPropertyValue = f974244559_1881;
// undefined
o6 = null;
// 13479
f974244559_1881.returns.push("fixed");
// 13481
o8.contains = f974244559_702;
// 13483
f974244559_702.returns.push(true);
// 13484
f974244559_1882 = function() { return f974244559_1882.returns[f974244559_1882.inst++]; };
f974244559_1882.returns = [];
f974244559_1882.inst = 0;
// 13485
o193.getBoundingClientRect = f974244559_1882;
// 13486
o6 = {};
// 13487
f974244559_1882.returns.push(o6);
// 13488
o6.left = 0;
// 13489
o8.clientLeft = 0;
// 13490
o6.JSBNG__top = 0;
// undefined
o6 = null;
// 13491
o8.clientTop = 0;
// 13492
o193.offsetWidth = 1050;
// 13493
o193.offsetHeight = 38;
// 13494
o215.getElementsByTagName = f974244559_514;
// 13496
o215.querySelectorAll = f974244559_523;
// 13497
o6 = {};
// 13498
f974244559_523.returns.push(o6);
// 13499
o6.length = 6;
// 13500
o106 = {};
// 13501
o6["0"] = o106;
// 13502
o207 = {};
// 13503
o6["1"] = o207;
// 13504
o216 = {};
// 13505
o6["2"] = o216;
// 13506
o217 = {};
// 13507
o6["3"] = o217;
// 13508
o218 = {};
// 13509
o6["4"] = o218;
// 13510
o219 = {};
// 13511
o6["5"] = o219;
// undefined
o6 = null;
// 13512
o106.getAttribute = f974244559_500;
// 13513
f974244559_500.returns.push("#");
// 13514
o207.getAttribute = f974244559_500;
// 13515
f974244559_500.returns.push("#");
// 13516
o216.getAttribute = f974244559_500;
// 13517
f974244559_500.returns.push("#");
// 13518
o217.getAttribute = f974244559_500;
// undefined
o217 = null;
// 13519
f974244559_500.returns.push("/ajax/chat/privacy/settings_dialog.php");
// 13520
o218.getAttribute = f974244559_500;
// 13521
f974244559_500.returns.push("#");
// 13522
o219.getAttribute = f974244559_500;
// undefined
o219 = null;
// 13523
f974244559_500.returns.push("/ajax/chat/privacy/turn_off_dialog.php");
// 13524
o106.removeAttribute = f974244559_644;
// 13525
f974244559_644.returns.push(undefined);
// 13526
o106.setAttribute = f974244559_643;
// 13527
f974244559_643.returns.push(undefined);
// 13528
o207.removeAttribute = f974244559_644;
// 13529
f974244559_644.returns.push(undefined);
// 13530
o207.setAttribute = f974244559_643;
// undefined
o207 = null;
// 13531
f974244559_643.returns.push(undefined);
// 13532
o216.removeAttribute = f974244559_644;
// 13533
f974244559_644.returns.push(undefined);
// 13534
o216.setAttribute = f974244559_643;
// undefined
o216 = null;
// 13535
f974244559_643.returns.push(undefined);
// 13536
o218.removeAttribute = f974244559_644;
// 13537
f974244559_644.returns.push(undefined);
// 13538
o218.setAttribute = f974244559_643;
// undefined
o218 = null;
// 13539
f974244559_643.returns.push(undefined);
// 13540
o215.nodeName = "DIV";
// 13541
o215.__FB_TOKEN = void 0;
// 13542
// 13543
o215.getAttribute = f974244559_500;
// 13544
o215.hasAttribute = f974244559_527;
// 13546
f974244559_527.returns.push(false);
// 13547
o215.JSBNG__addEventListener = f974244559_472;
// 13549
f974244559_472.returns.push(undefined);
// 13550
o215.JSBNG__onclick = null;
// undefined
o215 = null;
// 13554
f974244559_502.returns.push(o211);
// 13555
o211.__FB_TOKEN = void 0;
// 13556
// 13557
o211.getElementsByTagName = f974244559_514;
// 13559
o211.querySelectorAll = f974244559_523;
// 13560
o6 = {};
// 13561
f974244559_523.returns.push(o6);
// 13562
o6.length = 1;
// 13563
o6["0"] = o106;
// undefined
o6 = null;
// 13567
o6 = {};
// 13568
f974244559_523.returns.push(o6);
// 13569
o6.length = 1;
// 13570
o207 = {};
// 13571
o6["0"] = o207;
// undefined
o6 = null;
// 13575
o6 = {};
// 13576
f974244559_523.returns.push(o6);
// 13577
o6.length = 1;
// 13578
o215 = {};
// 13579
o6["0"] = o215;
// undefined
o6 = null;
// 13583
o6 = {};
// 13584
f974244559_523.returns.push(o6);
// 13585
o6.length = 1;
// 13586
o6["0"] = o210;
// undefined
o6 = null;
// 13590
f974244559_1617.returns.push(false);
// 13595
f974244559_1617.returns.push(true);
// 13599
o6 = {};
// 13600
f974244559_523.returns.push(o6);
// 13601
o6.length = 1;
// 13602
o216 = {};
// 13603
o6["0"] = o216;
// undefined
o6 = null;
// 13604
o216.__FB_TOKEN = void 0;
// 13605
// undefined
o216 = null;
// 13606
o210.contains = f974244559_702;
// undefined
o210 = null;
// 13608
f974244559_702.returns.push(true);
// 13612
o6 = {};
// 13613
f974244559_523.returns.push(o6);
// 13614
o6.length = 1;
// 13615
o210 = {};
// 13616
o6["0"] = o210;
// undefined
o6 = null;
// undefined
o210 = null;
// 13617
o211.nodeName = "DIV";
// 13618
o211.getAttribute = f974244559_500;
// 13619
o211.hasAttribute = f974244559_527;
// 13621
f974244559_527.returns.push(false);
// 13622
o211.JSBNG__addEventListener = f974244559_472;
// 13624
f974244559_472.returns.push(undefined);
// 13625
o211.JSBNG__onkeydown = null;
// undefined
o211 = null;
// 13627
o106.nodeName = "A";
// 13628
o106.__FB_TOKEN = void 0;
// 13629
// 13631
o106.hasAttribute = f974244559_527;
// 13633
f974244559_527.returns.push(false);
// 13634
o106.JSBNG__addEventListener = f974244559_472;
// 13636
f974244559_472.returns.push(undefined);
// 13637
o106.JSBNG__onclick = null;
// 13643
o212.remove = f974244559_1244;
// undefined
o212 = null;
// 13644
f974244559_1244.returns.push(undefined);
// 13648
f974244559_1244.returns.push(undefined);
// 13649
o6 = {};
// 13650
o207.classList = o6;
// undefined
o207 = null;
// 13652
o6.add = f974244559_1110;
// undefined
o6 = null;
// 13653
f974244559_1110.returns.push(undefined);
// 13654
f974244559_1902 = function() { return f974244559_1902.returns[f974244559_1902.inst++]; };
f974244559_1902.returns = [];
f974244559_1902.inst = 0;
// 13655
o215.cloneNode = f974244559_1902;
// 13656
o6 = {};
// 13657
f974244559_1902.returns.push(o6);
// 13658
o207 = {};
// undefined
fo974244559_1903_firstChild = function() { return fo974244559_1903_firstChild.returns[fo974244559_1903_firstChild.inst++]; };
fo974244559_1903_firstChild.returns = [];
fo974244559_1903_firstChild.inst = 0;
defineGetter(o6, "firstChild", fo974244559_1903_firstChild, undefined);
// undefined
fo974244559_1903_firstChild.returns.push(o207);
// undefined
fo974244559_1903_firstChild.returns.push(o207);
// 13661
o207.parentNode = o6;
// 13663
o6.removeChild = f974244559_507;
// 13664
f974244559_507.returns.push(o207);
// undefined
o207 = null;
// 13665
o207 = {};
// undefined
fo974244559_1903_firstChild.returns.push(o207);
// undefined
fo974244559_1903_firstChild.returns.push(o207);
// 13668
o207.parentNode = o6;
// 13671
f974244559_507.returns.push(o207);
// undefined
o207 = null;
// undefined
fo974244559_1903_firstChild.returns.push(null);
// 13674
o207 = {};
// 13675
f974244559_478.returns.push(o207);
// 13677
o210 = {};
// 13678
f974244559_1659.returns.push(o210);
// 13679
o207.appendChild = f974244559_482;
// 13680
f974244559_482.returns.push(o210);
// undefined
o210 = null;
// 13681
o6.appendChild = f974244559_482;
// 13682
f974244559_482.returns.push(o207);
// undefined
o207 = null;
// 13683
o215.parentNode = o106;
// 13684
o6.__html = void 0;
// 13686
o207 = {};
// 13687
f974244559_478.returns.push(o207);
// undefined
o207 = null;
// 13689
f974244559_1909 = function() { return f974244559_1909.returns[f974244559_1909.inst++]; };
f974244559_1909.returns = [];
f974244559_1909.inst = 0;
// 13690
o106.replaceChild = f974244559_1909;
// undefined
o106 = null;
// 13691
f974244559_1909.returns.push(o215);
// undefined
o215 = null;
// 13696
f974244559_471.returns.push(1373491298331);
// 13698
f974244559_471.returns.push(1373491298333);
// 13699
f974244559_7.returns.push(undefined);
// 13700
ow974244559.JSBNG__onJSBNG__blur = undefined;
// 13701
f974244559_13.returns.push(53);
// 13703
o106 = {};
// 13704
f974244559_480.returns.push(o106);
// 13705
// 13706
// 13707
o106.getElementsByTagName = f974244559_514;
// 13708
o207 = {};
// 13709
f974244559_514.returns.push(o207);
// 13710
o207.length = 0;
// undefined
o207 = null;
// 13712
o207 = {};
// 13713
o106.childNodes = o207;
// undefined
o106 = null;
// 13714
o207.item = f974244559_517;
// 13715
o207.length = 1;
// 13716
o106 = {};
// 13717
o207["0"] = o106;
// undefined
o207 = null;
// undefined
o106 = null;
// 13719
o106 = {};
// 13720
f974244559_480.returns.push(o106);
// 13721
// 13722
// 13723
o106.getElementsByTagName = f974244559_514;
// 13724
o207 = {};
// 13725
f974244559_514.returns.push(o207);
// 13726
o207.length = 0;
// undefined
o207 = null;
// 13728
o207 = {};
// 13729
o106.childNodes = o207;
// undefined
o106 = null;
// 13730
o207.item = f974244559_517;
// 13731
o207.length = 1;
// 13732
o106 = {};
// 13733
o207["0"] = o106;
// undefined
o207 = null;
// undefined
o106 = null;
// 13735
o106 = {};
// 13736
f974244559_480.returns.push(o106);
// 13737
// 13738
// 13739
o106.getElementsByTagName = f974244559_514;
// 13740
o207 = {};
// 13741
f974244559_514.returns.push(o207);
// 13742
o207.length = 0;
// undefined
o207 = null;
// 13744
o207 = {};
// 13745
o106.childNodes = o207;
// undefined
o106 = null;
// 13746
o207.item = f974244559_517;
// 13747
o207.length = 1;
// 13748
o106 = {};
// 13749
o207["0"] = o106;
// undefined
o207 = null;
// undefined
o106 = null;
// 13751
o106 = {};
// 13752
f974244559_480.returns.push(o106);
// 13753
// 13754
// 13755
o106.getElementsByTagName = f974244559_514;
// 13756
o207 = {};
// 13757
f974244559_514.returns.push(o207);
// 13758
o207.length = 0;
// undefined
o207 = null;
// 13760
o207 = {};
// 13761
o106.childNodes = o207;
// undefined
o106 = null;
// 13762
o207.item = f974244559_517;
// 13763
o207.length = 1;
// 13764
o106 = {};
// 13765
o207["0"] = o106;
// undefined
o207 = null;
// undefined
o106 = null;
// 13767
o106 = {};
// 13768
f974244559_480.returns.push(o106);
// 13769
// 13770
// 13771
o106.getElementsByTagName = f974244559_514;
// 13772
o207 = {};
// 13773
f974244559_514.returns.push(o207);
// 13774
o207.length = 0;
// undefined
o207 = null;
// 13776
o207 = {};
// 13777
o106.childNodes = o207;
// undefined
o106 = null;
// 13778
o207.item = f974244559_517;
// 13779
o207.length = 1;
// 13780
o106 = {};
// 13781
o207["0"] = o106;
// undefined
o207 = null;
// undefined
o106 = null;
// 13783
o106 = {};
// 13784
f974244559_480.returns.push(o106);
// 13785
// 13786
// 13787
o106.getElementsByTagName = f974244559_514;
// 13788
o207 = {};
// 13789
f974244559_514.returns.push(o207);
// 13790
o207.length = 0;
// undefined
o207 = null;
// 13792
o207 = {};
// 13793
o106.childNodes = o207;
// undefined
o106 = null;
// 13794
o207.item = f974244559_517;
// 13795
o207.length = 1;
// 13796
o106 = {};
// 13797
o207["0"] = o106;
// undefined
o207 = null;
// 13799
o207 = {};
// 13800
f974244559_480.returns.push(o207);
// 13801
// 13802
// 13803
o207.getElementsByTagName = f974244559_514;
// 13804
o210 = {};
// 13805
f974244559_514.returns.push(o210);
// 13806
o210.length = 0;
// undefined
o210 = null;
// 13808
o210 = {};
// 13809
o207.childNodes = o210;
// undefined
o207 = null;
// 13810
o210.item = f974244559_517;
// 13811
o210.length = 1;
// 13812
o207 = {};
// 13813
o210["0"] = o207;
// undefined
o210 = null;
// undefined
o207 = null;
// 13815
o207 = {};
// 13816
f974244559_480.returns.push(o207);
// 13817
// 13818
// 13819
o207.getElementsByTagName = f974244559_514;
// 13820
o210 = {};
// 13821
f974244559_514.returns.push(o210);
// 13822
o210.length = 0;
// undefined
o210 = null;
// 13824
o210 = {};
// 13825
o207.childNodes = o210;
// undefined
o207 = null;
// 13826
o210.item = f974244559_517;
// 13827
o210.length = 1;
// 13828
o207 = {};
// 13829
o210["0"] = o207;
// undefined
o210 = null;
// undefined
o207 = null;
// 13831
o207 = {};
// 13832
f974244559_480.returns.push(o207);
// 13833
// 13834
// 13835
o207.getElementsByTagName = f974244559_514;
// 13836
o210 = {};
// 13837
f974244559_514.returns.push(o210);
// 13838
o210.length = 0;
// undefined
o210 = null;
// 13840
o210 = {};
// 13841
o207.childNodes = o210;
// undefined
o207 = null;
// 13842
o210.item = f974244559_517;
// 13843
o210.length = 1;
// 13844
o207 = {};
// 13845
o210["0"] = o207;
// undefined
o210 = null;
// undefined
o207 = null;
// 13847
o207 = {};
// 13848
f974244559_480.returns.push(o207);
// 13849
// 13850
// 13851
o207.getElementsByTagName = f974244559_514;
// 13852
o210 = {};
// 13853
f974244559_514.returns.push(o210);
// 13854
o210.length = 0;
// undefined
o210 = null;
// 13856
o210 = {};
// 13857
o207.childNodes = o210;
// undefined
o207 = null;
// 13858
o210.item = f974244559_517;
// 13859
o210.length = 1;
// 13860
o207 = {};
// 13861
o210["0"] = o207;
// undefined
o210 = null;
// undefined
o207 = null;
// 13863
o207 = {};
// 13864
f974244559_480.returns.push(o207);
// 13865
// 13866
// 13867
o207.getElementsByTagName = f974244559_514;
// 13868
o210 = {};
// 13869
f974244559_514.returns.push(o210);
// 13870
o210.length = 0;
// undefined
o210 = null;
// 13872
o210 = {};
// 13873
o207.childNodes = o210;
// undefined
o207 = null;
// 13874
o210.item = f974244559_517;
// 13875
o210.length = 1;
// 13876
o207 = {};
// 13877
o210["0"] = o207;
// undefined
o210 = null;
// undefined
o207 = null;
// 13879
o207 = {};
// 13880
f974244559_480.returns.push(o207);
// 13881
// 13882
// 13883
o207.getElementsByTagName = f974244559_514;
// 13884
o210 = {};
// 13885
f974244559_514.returns.push(o210);
// 13886
o210.length = 0;
// undefined
o210 = null;
// 13888
o210 = {};
// 13889
o207.childNodes = o210;
// undefined
o207 = null;
// 13890
o210.item = f974244559_517;
// 13891
o210.length = 1;
// 13892
o207 = {};
// 13893
o210["0"] = o207;
// undefined
o210 = null;
// undefined
o207 = null;
// 13895
o207 = {};
// 13896
f974244559_480.returns.push(o207);
// 13897
// 13898
// 13899
o207.getElementsByTagName = f974244559_514;
// 13900
o210 = {};
// 13901
f974244559_514.returns.push(o210);
// 13902
o210.length = 0;
// undefined
o210 = null;
// 13904
o210 = {};
// 13905
o207.childNodes = o210;
// undefined
o207 = null;
// 13906
o210.item = f974244559_517;
// 13907
o210.length = 1;
// 13908
o207 = {};
// 13909
o210["0"] = o207;
// undefined
o210 = null;
// undefined
o207 = null;
// 13911
o207 = {};
// 13912
f974244559_480.returns.push(o207);
// 13913
// 13914
// 13915
o207.getElementsByTagName = f974244559_514;
// 13916
o210 = {};
// 13917
f974244559_514.returns.push(o210);
// 13918
o210.length = 0;
// undefined
o210 = null;
// 13920
o210 = {};
// 13921
o207.childNodes = o210;
// undefined
o207 = null;
// 13922
o210.item = f974244559_517;
// 13923
o210.length = 1;
// 13924
o207 = {};
// 13925
o210["0"] = o207;
// undefined
o210 = null;
// undefined
o207 = null;
// 13927
o207 = {};
// 13928
f974244559_480.returns.push(o207);
// 13929
// 13930
// 13931
o207.getElementsByTagName = f974244559_514;
// 13932
o210 = {};
// 13933
f974244559_514.returns.push(o210);
// 13934
o210.length = 0;
// undefined
o210 = null;
// 13936
o210 = {};
// 13937
o207.childNodes = o210;
// undefined
o207 = null;
// 13938
o210.item = f974244559_517;
// 13939
o210.length = 1;
// 13940
o207 = {};
// 13941
o210["0"] = o207;
// undefined
o210 = null;
// undefined
o207 = null;
// 13943
o207 = {};
// 13944
f974244559_480.returns.push(o207);
// 13945
// 13946
// 13947
o207.getElementsByTagName = f974244559_514;
// 13948
o210 = {};
// 13949
f974244559_514.returns.push(o210);
// 13950
o210.length = 0;
// undefined
o210 = null;
// 13952
o210 = {};
// 13953
o207.childNodes = o210;
// undefined
o207 = null;
// 13954
o210.item = f974244559_517;
// 13955
o210.length = 1;
// 13956
o207 = {};
// 13957
o210["0"] = o207;
// undefined
o210 = null;
// undefined
o207 = null;
// 13959
o207 = {};
// 13960
f974244559_480.returns.push(o207);
// 13961
// 13962
// 13963
o207.getElementsByTagName = f974244559_514;
// 13964
o210 = {};
// 13965
f974244559_514.returns.push(o210);
// 13966
o210.length = 0;
// undefined
o210 = null;
// 13968
o210 = {};
// 13969
o207.childNodes = o210;
// undefined
o207 = null;
// 13970
o210.item = f974244559_517;
// 13971
o210.length = 1;
// 13972
o207 = {};
// 13973
o210["0"] = o207;
// undefined
o210 = null;
// undefined
o207 = null;
// 13975
o207 = {};
// 13976
f974244559_480.returns.push(o207);
// 13977
// 13978
// 13979
o207.getElementsByTagName = f974244559_514;
// 13980
o210 = {};
// 13981
f974244559_514.returns.push(o210);
// 13982
o210.length = 0;
// undefined
o210 = null;
// 13984
o210 = {};
// 13985
o207.childNodes = o210;
// undefined
o207 = null;
// 13986
o210.item = f974244559_517;
// 13987
o210.length = 1;
// 13988
o207 = {};
// 13989
o210["0"] = o207;
// undefined
o210 = null;
// undefined
o207 = null;
// 13991
o207 = {};
// 13992
f974244559_480.returns.push(o207);
// 13993
// 13994
// 13995
o207.getElementsByTagName = f974244559_514;
// 13996
o210 = {};
// 13997
f974244559_514.returns.push(o210);
// 13998
o210.length = 0;
// undefined
o210 = null;
// 14000
o210 = {};
// 14001
o207.childNodes = o210;
// undefined
o207 = null;
// 14002
o210.item = f974244559_517;
// 14003
o210.length = 1;
// 14004
o207 = {};
// 14005
o210["0"] = o207;
// undefined
o210 = null;
// undefined
o207 = null;
// 14007
o207 = {};
// 14008
f974244559_480.returns.push(o207);
// 14009
// 14010
// 14011
o207.getElementsByTagName = f974244559_514;
// 14012
o210 = {};
// 14013
f974244559_514.returns.push(o210);
// 14014
o210.length = 0;
// undefined
o210 = null;
// 14016
o210 = {};
// 14017
o207.childNodes = o210;
// undefined
o207 = null;
// 14018
o210.item = f974244559_517;
// 14019
o210.length = 1;
// 14020
o207 = {};
// 14021
o210["0"] = o207;
// undefined
o210 = null;
// undefined
o207 = null;
// 14023
o207 = {};
// 14024
f974244559_480.returns.push(o207);
// 14025
// 14026
// 14027
o207.getElementsByTagName = f974244559_514;
// 14028
o210 = {};
// 14029
f974244559_514.returns.push(o210);
// 14030
o210.length = 0;
// undefined
o210 = null;
// 14032
o210 = {};
// 14033
o207.childNodes = o210;
// undefined
o207 = null;
// 14034
o210.item = f974244559_517;
// 14035
o210.length = 1;
// 14036
o207 = {};
// 14037
o210["0"] = o207;
// undefined
o210 = null;
// undefined
o207 = null;
// 14039
o207 = {};
// 14040
f974244559_480.returns.push(o207);
// 14041
// 14042
// 14043
o207.getElementsByTagName = f974244559_514;
// 14044
o210 = {};
// 14045
f974244559_514.returns.push(o210);
// 14046
o210.length = 0;
// undefined
o210 = null;
// 14048
o210 = {};
// 14049
o207.childNodes = o210;
// undefined
o207 = null;
// 14050
o210.item = f974244559_517;
// 14051
o210.length = 1;
// 14052
o207 = {};
// 14053
o210["0"] = o207;
// undefined
o210 = null;
// undefined
o207 = null;
// 14055
o207 = {};
// 14056
f974244559_480.returns.push(o207);
// 14057
// 14058
// 14059
o207.getElementsByTagName = f974244559_514;
// 14060
o210 = {};
// 14061
f974244559_514.returns.push(o210);
// 14062
o210.length = 0;
// undefined
o210 = null;
// 14064
o210 = {};
// 14065
o207.childNodes = o210;
// undefined
o207 = null;
// 14066
o210.item = f974244559_517;
// 14067
o210.length = 1;
// 14068
o207 = {};
// 14069
o210["0"] = o207;
// undefined
o210 = null;
// undefined
o207 = null;
// 14071
o207 = {};
// 14072
f974244559_480.returns.push(o207);
// 14073
// 14074
// 14075
o207.getElementsByTagName = f974244559_514;
// 14076
o210 = {};
// 14077
f974244559_514.returns.push(o210);
// 14078
o210.length = 0;
// undefined
o210 = null;
// 14080
o210 = {};
// 14081
o207.childNodes = o210;
// undefined
o207 = null;
// 14082
o210.item = f974244559_517;
// 14083
o210.length = 1;
// 14084
o207 = {};
// 14085
o210["0"] = o207;
// undefined
o210 = null;
// undefined
o207 = null;
// 14087
o207 = {};
// 14088
f974244559_480.returns.push(o207);
// 14089
// 14090
// 14091
o207.getElementsByTagName = f974244559_514;
// 14092
o210 = {};
// 14093
f974244559_514.returns.push(o210);
// 14094
o210.length = 0;
// undefined
o210 = null;
// 14096
o210 = {};
// 14097
o207.childNodes = o210;
// undefined
o207 = null;
// 14098
o210.item = f974244559_517;
// 14099
o210.length = 1;
// 14100
o207 = {};
// 14101
o210["0"] = o207;
// undefined
o210 = null;
// undefined
o207 = null;
// 14103
o207 = {};
// 14104
f974244559_480.returns.push(o207);
// 14105
// 14106
// 14107
o207.getElementsByTagName = f974244559_514;
// 14108
o210 = {};
// 14109
f974244559_514.returns.push(o210);
// 14110
o210.length = 0;
// undefined
o210 = null;
// 14112
o210 = {};
// 14113
o207.childNodes = o210;
// undefined
o207 = null;
// 14114
o210.item = f974244559_517;
// 14115
o210.length = 1;
// 14116
o207 = {};
// 14117
o210["0"] = o207;
// undefined
o210 = null;
// undefined
o207 = null;
// 14119
o207 = {};
// 14120
f974244559_480.returns.push(o207);
// 14121
// 14122
// 14123
o207.getElementsByTagName = f974244559_514;
// 14124
o210 = {};
// 14125
f974244559_514.returns.push(o210);
// 14126
o210.length = 0;
// undefined
o210 = null;
// 14128
o210 = {};
// 14129
o207.childNodes = o210;
// undefined
o207 = null;
// 14130
o210.item = f974244559_517;
// 14131
o210.length = 1;
// 14132
o207 = {};
// 14133
o210["0"] = o207;
// undefined
o210 = null;
// undefined
o207 = null;
// 14135
o207 = {};
// 14136
f974244559_480.returns.push(o207);
// 14137
// 14138
// 14139
o207.getElementsByTagName = f974244559_514;
// 14140
o210 = {};
// 14141
f974244559_514.returns.push(o210);
// 14142
o210.length = 0;
// undefined
o210 = null;
// 14144
o210 = {};
// 14145
o207.childNodes = o210;
// undefined
o207 = null;
// 14146
o210.item = f974244559_517;
// 14147
o210.length = 1;
// 14148
o207 = {};
// 14149
o210["0"] = o207;
// undefined
o210 = null;
// undefined
o207 = null;
// 14151
o207 = {};
// 14152
f974244559_480.returns.push(o207);
// 14153
// 14154
// 14155
o207.getElementsByTagName = f974244559_514;
// 14156
o210 = {};
// 14157
f974244559_514.returns.push(o210);
// 14158
o210.length = 0;
// undefined
o210 = null;
// 14160
o210 = {};
// 14161
o207.childNodes = o210;
// undefined
o207 = null;
// 14162
o210.item = f974244559_517;
// 14163
o210.length = 1;
// 14164
o207 = {};
// 14165
o210["0"] = o207;
// undefined
o210 = null;
// undefined
o207 = null;
// 14167
o207 = {};
// 14168
f974244559_480.returns.push(o207);
// 14169
// 14170
// 14171
o207.getElementsByTagName = f974244559_514;
// 14172
o210 = {};
// 14173
f974244559_514.returns.push(o210);
// 14174
o210.length = 0;
// undefined
o210 = null;
// 14176
o210 = {};
// 14177
o207.childNodes = o210;
// undefined
o207 = null;
// 14178
o210.item = f974244559_517;
// 14179
o210.length = 1;
// 14180
o207 = {};
// 14181
o210["0"] = o207;
// undefined
o210 = null;
// undefined
o207 = null;
// 14183
o207 = {};
// 14184
f974244559_480.returns.push(o207);
// 14185
// 14186
// 14187
o207.getElementsByTagName = f974244559_514;
// 14188
o210 = {};
// 14189
f974244559_514.returns.push(o210);
// 14190
o210.length = 0;
// undefined
o210 = null;
// 14192
o210 = {};
// 14193
o207.childNodes = o210;
// undefined
o207 = null;
// 14194
o210.item = f974244559_517;
// 14195
o210.length = 1;
// 14196
o207 = {};
// 14197
o210["0"] = o207;
// undefined
o210 = null;
// undefined
o207 = null;
// 14199
o207 = {};
// 14200
f974244559_480.returns.push(o207);
// 14201
// 14202
// 14203
o207.getElementsByTagName = f974244559_514;
// 14204
o210 = {};
// 14205
f974244559_514.returns.push(o210);
// 14206
o210.length = 0;
// undefined
o210 = null;
// 14208
o210 = {};
// 14209
o207.childNodes = o210;
// undefined
o207 = null;
// 14210
o210.item = f974244559_517;
// 14211
o210.length = 1;
// 14212
o207 = {};
// 14213
o210["0"] = o207;
// undefined
o210 = null;
// undefined
o207 = null;
// 14215
o207 = {};
// 14216
f974244559_480.returns.push(o207);
// 14217
// 14218
// 14219
o207.getElementsByTagName = f974244559_514;
// 14220
o210 = {};
// 14221
f974244559_514.returns.push(o210);
// 14222
o210.length = 0;
// undefined
o210 = null;
// 14224
o210 = {};
// 14225
o207.childNodes = o210;
// undefined
o207 = null;
// 14226
o210.item = f974244559_517;
// 14227
o210.length = 1;
// 14228
o207 = {};
// 14229
o210["0"] = o207;
// undefined
o210 = null;
// undefined
o207 = null;
// 14231
o207 = {};
// 14232
f974244559_480.returns.push(o207);
// 14233
// 14234
// 14235
o207.getElementsByTagName = f974244559_514;
// 14236
o210 = {};
// 14237
f974244559_514.returns.push(o210);
// 14238
o210.length = 0;
// undefined
o210 = null;
// 14240
o210 = {};
// 14241
o207.childNodes = o210;
// undefined
o207 = null;
// 14242
o210.item = f974244559_517;
// 14243
o210.length = 1;
// 14244
o207 = {};
// 14245
o210["0"] = o207;
// undefined
o210 = null;
// undefined
o207 = null;
// 14247
o207 = {};
// 14248
f974244559_480.returns.push(o207);
// 14249
// 14250
// 14251
o207.getElementsByTagName = f974244559_514;
// 14252
o210 = {};
// 14253
f974244559_514.returns.push(o210);
// 14254
o210.length = 0;
// undefined
o210 = null;
// 14256
o210 = {};
// 14257
o207.childNodes = o210;
// undefined
o207 = null;
// 14258
o210.item = f974244559_517;
// 14259
o210.length = 1;
// 14260
o207 = {};
// 14261
o210["0"] = o207;
// undefined
o210 = null;
// undefined
o207 = null;
// 14263
o207 = {};
// 14264
f974244559_480.returns.push(o207);
// 14265
// 14266
// 14267
o207.getElementsByTagName = f974244559_514;
// 14268
o210 = {};
// 14269
f974244559_514.returns.push(o210);
// 14270
o210.length = 0;
// undefined
o210 = null;
// 14272
o210 = {};
// 14273
o207.childNodes = o210;
// undefined
o207 = null;
// 14274
o210.item = f974244559_517;
// 14275
o210.length = 1;
// 14276
o207 = {};
// 14277
o210["0"] = o207;
// undefined
o210 = null;
// undefined
o207 = null;
// 14279
o207 = {};
// 14280
f974244559_480.returns.push(o207);
// 14281
// 14282
// 14283
o207.getElementsByTagName = f974244559_514;
// 14284
o210 = {};
// 14285
f974244559_514.returns.push(o210);
// 14286
o210.length = 0;
// undefined
o210 = null;
// 14288
o210 = {};
// 14289
o207.childNodes = o210;
// undefined
o207 = null;
// 14290
o210.item = f974244559_517;
// 14291
o210.length = 1;
// 14292
o207 = {};
// 14293
o210["0"] = o207;
// undefined
o210 = null;
// undefined
o207 = null;
// 14296
f974244559_471.returns.push(1373491298480);
// 14312
f974244559_1617.returns.push(false);
// 14319
o207 = {};
// 14320
o95.classList = o207;
// 14322
o207.contains = f974244559_1617;
// 14323
f974244559_1617.returns.push(false);
// 14324
o95.parentNode = o94;
// undefined
o95 = null;
// 14325
o95 = {};
// 14326
o94.classList = o95;
// 14328
o95.contains = f974244559_1617;
// undefined
o95 = null;
// 14329
f974244559_1617.returns.push(false);
// 14330
o95 = {};
// 14331
o94.parentNode = o95;
// 14332
o210 = {};
// 14333
o95.classList = o210;
// 14335
o210.contains = f974244559_1617;
// undefined
o210 = null;
// 14336
f974244559_1617.returns.push(false);
// 14337
o95.parentNode = o214;
// undefined
o95 = null;
// undefined
o214 = null;
// 14341
f974244559_1617.returns.push(false);
// 14346
f974244559_1617.returns.push(true);
// 14347
o213.getElementsByTagName = f974244559_514;
// 14349
o213.querySelectorAll = f974244559_523;
// 14350
o95 = {};
// 14351
f974244559_523.returns.push(o95);
// 14352
o95.length = 1;
// 14353
o95["0"] = o99;
// undefined
o95 = null;
// 14354
o99.offsetWidth = 205;
// 14355
o99.offsetHeight = 0;
// undefined
o99 = null;
// 14359
o95 = {};
// 14360
f974244559_523.returns.push(o95);
// 14361
o95.length = 1;
// 14362
o95["0"] = o94;
// undefined
o95 = null;
// 14363
o94.offsetWidth = 0;
// 14364
o94.offsetHeight = 0;
// 14365
o213.offsetWidth = 205;
// 14366
o213.offsetHeight = 25;
// undefined
o213 = null;
// 14367
o106.__html = void 0;
// 14368
o106.cloneNode = f974244559_1902;
// undefined
o106 = null;
// 14369
o95 = {};
// 14370
f974244559_1902.returns.push(o95);
// 14371
o95.getElementsByTagName = f974244559_514;
// 14372
o99 = {};
// 14373
f974244559_514.returns.push(o99);
// 14374
o99.length = 14;
// 14375
o106 = {};
// 14376
o99["0"] = o106;
// 14377
o106.getAttribute = f974244559_500;
// undefined
o106 = null;
// 14378
f974244559_500.returns.push(null);
// 14379
o106 = {};
// 14380
o99["1"] = o106;
// 14381
o106.getAttribute = f974244559_500;
// undefined
o106 = null;
// 14382
f974244559_500.returns.push(null);
// 14383
o106 = {};
// 14384
o99["2"] = o106;
// 14385
o106.getAttribute = f974244559_500;
// 14386
f974244559_500.returns.push("numTabs");
// 14387
o106.removeAttribute = f974244559_644;
// 14388
f974244559_644.returns.push(undefined);
// 14389
o210 = {};
// 14390
o106.childNodes = o210;
// undefined
o106 = null;
// 14391
o210.length = 0;
// undefined
o210 = null;
// 14392
o106 = {};
// 14393
o99["3"] = o106;
// 14394
o106.getAttribute = f974244559_500;
// 14395
f974244559_500.returns.push("numMessages");
// 14396
o106.removeAttribute = f974244559_644;
// 14397
f974244559_644.returns.push(undefined);
// 14398
o210 = {};
// 14399
o106.childNodes = o210;
// undefined
o106 = null;
// 14400
o210.length = 0;
// undefined
o210 = null;
// 14401
o106 = {};
// 14402
o99["4"] = o106;
// 14403
o106.getAttribute = f974244559_500;
// undefined
o106 = null;
// 14404
f974244559_500.returns.push(null);
// 14405
o106 = {};
// 14406
o99["5"] = o106;
// 14407
o106.getAttribute = f974244559_500;
// undefined
o106 = null;
// 14408
f974244559_500.returns.push(null);
// 14409
o106 = {};
// 14410
o99["6"] = o106;
// 14411
o106.getAttribute = f974244559_500;
// undefined
o106 = null;
// 14412
f974244559_500.returns.push(null);
// 14413
o106 = {};
// 14414
o99["7"] = o106;
// 14415
o106.getAttribute = f974244559_500;
// undefined
o106 = null;
// 14416
f974244559_500.returns.push(null);
// 14417
o106 = {};
// 14418
o99["8"] = o106;
// 14419
o106.getAttribute = f974244559_500;
// undefined
o106 = null;
// 14420
f974244559_500.returns.push(null);
// 14421
o106 = {};
// 14422
o99["9"] = o106;
// 14423
o106.getAttribute = f974244559_500;
// 14424
f974244559_500.returns.push("menu");
// 14425
o106.removeAttribute = f974244559_644;
// 14426
f974244559_644.returns.push(undefined);
// 14427
o210 = {};
// 14428
o106.childNodes = o210;
// 14429
o210.length = 1;
// undefined
o210 = null;
// 14430
o210 = {};
// 14431
o99["10"] = o210;
// 14432
o210.getAttribute = f974244559_500;
// 14433
f974244559_500.returns.push(null);
// 14434
o211 = {};
// 14435
o99["11"] = o211;
// 14436
o211.getAttribute = f974244559_500;
// undefined
o211 = null;
// 14437
f974244559_500.returns.push(null);
// 14438
o211 = {};
// 14439
o99["12"] = o211;
// 14440
o211.getAttribute = f974244559_500;
// undefined
o211 = null;
// 14441
f974244559_500.returns.push(null);
// 14442
o211 = {};
// 14443
o99["13"] = o211;
// undefined
o99 = null;
// 14444
o211.getAttribute = f974244559_500;
// undefined
o211 = null;
// 14445
f974244559_500.returns.push(null);
// 14446
o106.getElementsByTagName = f974244559_514;
// 14448
o106.querySelectorAll = f974244559_523;
// undefined
o106 = null;
// 14449
o99 = {};
// 14450
f974244559_523.returns.push(o99);
// 14451
o99.length = 1;
// 14452
o99["0"] = o210;
// undefined
o99 = null;
// undefined
o210 = null;
// 14453
o95.__FB_TOKEN = void 0;
// 14454
// 14455
o99 = {};
// 14456
o95.classList = o99;
// 14458
o99.add = f974244559_1110;
// undefined
o99 = null;
// 14459
f974244559_1110.returns.push(undefined);
// 14461
o95.__html = void 0;
// undefined
o95 = null;
// 14463
o95 = {};
// 14464
f974244559_478.returns.push(o95);
// 14466
f974244559_2086 = function() { return f974244559_2086.returns[f974244559_2086.inst++]; };
f974244559_2086.returns = [];
f974244559_2086.inst = 0;
// 14467
o94.insertBefore = f974244559_2086;
// undefined
o94 = null;
// 14468
f974244559_2086.returns.push(o95);
// undefined
o95 = null;
// 14471
o207.add = f974244559_1110;
// undefined
o207 = null;
// 14472
f974244559_1110.returns.push(undefined);
// 14476
f974244559_1110.returns.push(undefined);
// 14477
o94 = {};
// 14478
o95 = {};
// 14480
o94.length = 1;
// 14481
o94["0"] = "LpC/l";
// 14484
f974244559_471.returns.push(1373491298517);
// 14487
f974244559_471.returns.push(1373491298518);
// 14489
f974244559_471.returns.push(1373491298518);
// 14499
f974244559_1244.returns.push(undefined);
// 14502
o196.add = f974244559_1110;
// undefined
o196 = null;
// 14503
f974244559_1110.returns.push(undefined);
// 14504
o99 = {};
// 14508
f974244559_471.returns.push(1373491298565);
// 14513
f974244559_471.returns.push(1373491298568);
// 14517
f974244559_471.returns.push(1373491298569);
// 14519
o99.cancelBubble = false;
// 14520
o99.returnValue = true;
// 14523
o99.srcElement = o71;
// 14525
o99.target = o71;
// 14532
f974244559_519.returns.push(null);
// 14538
f974244559_519.returns.push(null);
// 14544
f974244559_519.returns.push(null);
// 14550
f974244559_519.returns.push(null);
// 14556
f974244559_519.returns.push(null);
// 14562
f974244559_519.returns.push(null);
// 14568
f974244559_519.returns.push(null);
// 14574
f974244559_519.returns.push(null);
// 14579
o99.JSBNG__screenX = 997;
// 14580
o99.JSBNG__screenY = 323;
// 14581
o99.altKey = false;
// 14582
o99.bubbles = true;
// 14583
o99.button = 0;
// 14584
o99.buttons = void 0;
// 14585
o99.cancelable = false;
// 14586
o99.clientX = 980;
// 14587
o99.clientY = 219;
// 14588
o99.ctrlKey = false;
// 14589
o99.currentTarget = o0;
// 14590
o99.defaultPrevented = false;
// 14591
o99.detail = 0;
// 14592
o99.eventPhase = 3;
// 14593
o99.isTrusted = void 0;
// 14594
o99.metaKey = false;
// 14595
o99.pageX = 980;
// 14596
o99.pageY = 1458;
// 14597
o99.relatedTarget = null;
// 14598
o99.fromElement = null;
// 14601
o99.shiftKey = false;
// 14604
o99.timeStamp = 1373491298565;
// 14605
o99.type = "mousemove";
// 14606
o99.view = ow974244559;
// undefined
o99 = null;
// 14612
f974244559_471.returns.push(1373491298578);
// 14616
f974244559_468.returns.push(3);
// 14618
f974244559_468.returns.push(4);
// 14623
f974244559_1244.returns.push(undefined);
// 14627
f974244559_1244.returns.push(undefined);
// 14631
f974244559_1110.returns.push(undefined);
// 14632
o6.cloneNode = f974244559_1902;
// 14633
o99 = {};
// 14634
f974244559_1902.returns.push(o99);
// 14635
o106 = {};
// undefined
fo974244559_2090_firstChild = function() { return fo974244559_2090_firstChild.returns[fo974244559_2090_firstChild.inst++]; };
fo974244559_2090_firstChild.returns = [];
fo974244559_2090_firstChild.inst = 0;
defineGetter(o99, "firstChild", fo974244559_2090_firstChild, undefined);
// undefined
fo974244559_2090_firstChild.returns.push(o106);
// undefined
fo974244559_2090_firstChild.returns.push(o106);
// 14638
o106.parentNode = o99;
// 14640
o99.removeChild = f974244559_507;
// 14641
f974244559_507.returns.push(o106);
// undefined
o106 = null;
// undefined
fo974244559_2090_firstChild.returns.push(null);
// 14644
o106 = {};
// 14645
f974244559_478.returns.push(o106);
// 14647
o196 = {};
// 14648
f974244559_1659.returns.push(o196);
// 14649
o106.appendChild = f974244559_482;
// 14650
f974244559_482.returns.push(o196);
// undefined
o196 = null;
// 14651
o99.appendChild = f974244559_482;
// 14652
f974244559_482.returns.push(o106);
// undefined
o106 = null;
// 14653
o6.parentNode = null;
// undefined
o6 = null;
// 14654
o99.__html = void 0;
// undefined
o99 = null;
// 14656
o6 = {};
// 14657
f974244559_478.returns.push(o6);
// undefined
o6 = null;
// 14661
f974244559_471.returns.push(1373491298595);
// 14662
o6 = {};
// 14664
o99 = {};
// 14665
o6.alertList = o99;
// 14666
f974244559_2097 = function() { return f974244559_2097.returns[f974244559_2097.inst++]; };
f974244559_2097.returns = [];
f974244559_2097.inst = 0;
// 14667
o99.getIds = f974244559_2097;
// 14668
o106 = {};
// 14669
o99._list = o106;
// 14670
f974244559_2099 = function() { return f974244559_2099.returns[f974244559_2099.inst++]; };
f974244559_2099.returns = [];
f974244559_2099.inst = 0;
// 14671
o106.reduce = f974244559_2099;
// 14672
o106._head = null;
// 14673
f974244559_2099.returns.push({__JSBNG_unknown_object:true});
// 14674
f974244559_2097.returns.push({__JSBNG_unknown_object:true});
// 14675
o6._autoLoadNotifIndex = 1;
// 14677
f974244559_2100 = function() { return f974244559_2100.returns[f974244559_2100.inst++]; };
f974244559_2100.returns = [];
f974244559_2100.inst = 0;
// 14678
o99.getDomObj = f974244559_2100;
// 14679
f974244559_2101 = function() { return f974244559_2101.returns[f974244559_2101.inst++]; };
f974244559_2101.returns = [];
f974244559_2101.inst = 0;
// 14680
o99._getField = f974244559_2101;
// 14682
f974244559_2102 = function() { return f974244559_2102.returns[f974244559_2102.inst++]; };
f974244559_2102.returns = [];
f974244559_2102.inst = 0;
// 14683
o106.get = f974244559_2102;
// 14684
o196 = {};
// 14685
o106._nodes = o196;
// 14686
o196["null"] = void 0;
// undefined
o196 = null;
// 14687
f974244559_2102.returns.push(null);
// 14688
f974244559_2101.returns.push(null);
// 14689
f974244559_2100.returns.push(null);
// 14690
// 14691
f974244559_2104 = function() { return f974244559_2104.returns[f974244559_2104.inst++]; };
f974244559_2104.returns = [];
f974244559_2104.inst = 0;
// 14692
o6._annotateMorePagerURI = f974244559_2104;
// 14693
o6._morePagerLink = o199;
// 14694
o199.setAttribute = f974244559_643;
// 14697
f974244559_500.returns.push("/ajax/notifications/get.php?user=100006118350059");
// 14699
f974244559_2105 = function() { return f974244559_2105.returns[f974244559_2105.inst++]; };
f974244559_2105.returns = [];
f974244559_2105.inst = 0;
// 14700
o99.getEarliestNotifTime = f974244559_2105;
// undefined
o99 = null;
// 14702
f974244559_2106 = function() { return f974244559_2106.returns[f974244559_2106.inst++]; };
f974244559_2106.returns = [];
f974244559_2106.inst = 0;
// 14703
o106.isEmpty = f974244559_2106;
// undefined
o106 = null;
// 14705
f974244559_2106.returns.push(true);
// 14706
f974244559_2105.returns.push(0);
// 14707
f974244559_643.returns.push(undefined);
// 14708
f974244559_2104.returns.push(undefined);
// 14709
o99 = {};
// undefined
fo974244559_1_cookie.returns.push("c_user=100006118350059; csm=2; sub=268435456");
// 14714
f974244559_471.returns.push(1373491298603);
// 14716
f974244559_471.returns.push(1373491298604);
// 14718
f974244559_471.returns.push(1373491298604);
// 14719
o120.offsetHeight = 669;
// 14720
o106 = {};
// 14722
o106._polling = false;
// 14723
// 14724
f974244559_2109 = function() { return f974244559_2109.returns[f974244559_2109.inst++]; };
f974244559_2109.returns = [];
f974244559_2109.inst = 0;
// 14725
o106.request = f974244559_2109;
// 14726
f974244559_2110 = function() { return f974244559_2110.returns[f974244559_2110.inst++]; };
f974244559_2110.returns = [];
f974244559_2110.inst = 0;
// 14727
o106._cancelRequest = f974244559_2110;
// 14728
f974244559_2110.returns.push(undefined);
// 14729
// undefined
fo974244559_1_cookie.returns.push("c_user=100006118350059; csm=2; sub=268435456");
// 14731
o106._muted = false;
// 14732
o196 = {};
// 14733
o106._config = o196;
// 14734
o196.maxRequests = Infinity;
// 14735
// 14737
f974244559_2112 = function() { return f974244559_2112.returns[f974244559_2112.inst++]; };
f974244559_2112.returns = [];
f974244559_2112.inst = 0;
// 14738
o196.setupRequest = f974244559_2112;
// undefined
o196 = null;
// 14739
f974244559_2112.returns.push(undefined);
// 14740
o106._skip = false;
// 14741
f974244559_2109.returns.push(o106);
// undefined
fo974244559_1_cookie.returns.push("c_user=100006118350059; csm=2; sub=268435456");
// 14743
o196 = {};
// 14745
o207 = {};
// 14746
f974244559_2115 = function() { return f974244559_2115.returns[f974244559_2115.inst++]; };
f974244559_2115.returns = [];
f974244559_2115.inst = 0;
// 14747
o207.render = f974244559_2115;
// 14748
f974244559_2116 = function() { return f974244559_2116.returns[f974244559_2116.inst++]; };
f974244559_2116.returns = [];
f974244559_2116.inst = 0;
// 14749
f974244559_2115.reset = f974244559_2116;
// 14750
f974244559_14.returns.push(undefined);
// 14751
f974244559_2116.returns.push(undefined);
// 14752
f974244559_12.returns.push(54);
// 14753
f974244559_2115.returns.push(undefined);
// 14754
// undefined
o207 = null;
// 14755
o207 = {};
// 14756
f974244559_2118 = function() { return f974244559_2118.returns[f974244559_2118.inst++]; };
f974244559_2118.returns = [];
f974244559_2118.inst = 0;
// 14757
o207.render = f974244559_2118;
// 14758
f974244559_2119 = function() { return f974244559_2119.returns[f974244559_2119.inst++]; };
f974244559_2119.returns = [];
f974244559_2119.inst = 0;
// 14759
f974244559_2118.reset = f974244559_2119;
// 14760
f974244559_14.returns.push(undefined);
// 14761
f974244559_2119.returns.push(undefined);
// 14762
f974244559_12.returns.push(55);
// 14763
f974244559_2118.returns.push(undefined);
// 14764
// undefined
o207 = null;
// 14765
o207 = {};
// 14769
o210 = {};
// 14773
o211 = {};
// 14778
f974244559_2123 = function() { return f974244559_2123.returns[f974244559_2123.inst++]; };
f974244559_2123.returns = [];
f974244559_2123.inst = 0;
// 14779
o167.getResponseHeader = f974244559_2123;
// 14782
f974244559_2123.returns.push("onvQQQgeg26FG1vjcTQeJoqQtTf9CDmOIpf3fGFEjY4=");
// 14785
f974244559_2123.returns.push("onvQQQgeg26FG1vjcTQeJoqQtTf9CDmOIpf3fGFEjY4=");
// 14786
// 14788
o167.JSBNG__status = 200;
// 14792
f974244559_471.returns.push(1373491298619);
// 14793
f974244559_2124 = function() { return f974244559_2124.returns[f974244559_2124.inst++]; };
f974244559_2124.returns = [];
f974244559_2124.inst = 0;
// 14794
o200._handleXHRResponse = f974244559_2124;
// 14796
f974244559_2125 = function() { return f974244559_2125.returns[f974244559_2125.inst++]; };
f974244559_2125.returns = [];
f974244559_2125.inst = 0;
// 14797
o200.getOption = f974244559_2125;
// 14798
o212 = {};
// 14799
o200.option = o212;
// 14800
o212.suppressEvaluation = false;
// 14803
f974244559_2125.returns.push(false);
// 14804
o167.responseText = "for (;;);{\"__ar\":1,\"payload\":null,\"jsmods\":{\"require\":[[\"m_2_0\"],[\"Layer\",\"show\",[\"m_2_0\"],[{\"__m\":\"m_2_0\"}]]],\"instances\":[[\"m_2_0\",[\"ContextualDialog\",\"ContextualDialogArrow\",\"ContextualDialogDefaultTheme\",\"LayerFadeOnHide\",\"LayerRemoveOnHide\",\"LayerDestroyOnHide\",\"LayerHideOnTransition\",\"LayerFadeOnShow\",\"ContextualLayerAutoFlip\",\"DialogHideOnSuccess\",\"m_2_1\"],[{\"width\":300,\"context\":null,\"contextID\":null,\"contextSelector\":\"#userNavigationLabel\",\"position\":\"below\",\"alignment\":\"right\",\"offsetX\":0,\"offsetY\":0,\"arrowBehavior\":{\"__m\":\"ContextualDialogArrow\"},\"theme\":{\"__m\":\"ContextualDialogDefaultTheme\"},\"addedBehaviors\":[{\"__m\":\"LayerFadeOnHide\"},{\"__m\":\"LayerRemoveOnHide\"},{\"__m\":\"LayerDestroyOnHide\"},{\"__m\":\"LayerHideOnTransition\"},{\"__m\":\"LayerFadeOnShow\"},{\"__m\":\"ContextualLayerAutoFlip\"},{\"__m\":\"DialogHideOnSuccess\"}]},{\"__m\":\"m_2_1\"}],3]],\"markup\":[[\"m_2_1\",{\"__html\":\"\\u003Cdiv>\\u003Cdiv class=\\\"pam\\\">\\u003Cdiv>\\u003Cdiv class=\\\"clearfix\\\">\\u003Cimg class=\\\"_8o _8s lfloat img\\\" src=\\\"https:\\/\\/fbstatic-a.akamaihd.net\\/rsrc.php\\/v2\\/yR\\/r\\/TU3b_k6WbfA.png\\\" alt=\\\"\\\" width=\\\"43\\\" height=\\\"43\\\" \\/>\\u003Cdiv class=\\\"_42ef\\\">\\u003Cstrong>Get to Know Your Privacy Settings\\u003C\\/strong>\\u003Cdiv class=\\\"mts\\\">You control how you share your stuff with people and apps on Facebook\\u003C\\/div>\\u003C\\/div>\\u003C\\/div>\\u003C\\/div>\\u003C\\/div>\\u003Cdiv class=\\\"uiOverlayFooter _572u uiBoxGray topborder\\\">\\u003Ca class=\\\"_42ft _42fu layerCancel uiOverlayButton selected _42g-\\\" role=\\\"button\\\" href=\\\"\\/ajax\\/marketing\\/tour\\/privacy_tour.php\\\" rel=\\\"dialog\\\">Learn More\\u003C\\/a>\\u003Ca class=\\\"_42ft _42fu layerCancel uiOverlayButton\\\" role=\\\"button\\\" href=\\\"\\/ajax\\/marketing\\/tour\\/privacy_dialog.php?close=1\\\" rel=\\\"async\\\">Close\\u003C\\/a>\\u003C\\/div>\\u003C\\/div>\"},2]]},\"css\":[\"W3Ky6\"],\"js\":[\"AyUu6\",\"AsDOA\"],\"bootloadable\":{\"IframeShim\":{\"resources\":[\"AyUu6\",\"AsDOA\",\"MqSmz\"],\"module\":true},\"Dialog\":{\"resources\":[\"AyUu6\",\"W3Ky6\",\"AsDOA\"],\"module\":true},\"AsyncDOM\":{\"resources\":[\"AyUu6\"],\"module\":true},\"ConfirmationDialog\":{\"resources\":[\"AyUu6\",\"AsDOA\",\"oE4Do\"],\"module\":true},\"React\":{\"resources\":[\"OJTM4\",\"AyUu6\"],\"module\":true}},\"resource_map\":{\"oE4Do\":{\"type\":\"js\",\"crossOrigin\":1,\"src\":\"https:\\/\\/fbstatic-a.akamaihd.net\\/rsrc.php\\/v2\\/yq\\/r\\/MDwOqV08JHh.js\"},\"AyUu6\":{\"type\":\"js\",\"crossOrigin\":1,\"src\":\"https:\\/\\/fbstatic-a.akamaihd.net\\/rsrc.php\\/v2\\/yF\\/r\\/pmYy9aLa5q_.js\"},\"W3Ky6\":{\"type\":\"css\",\"permanent\":1,\"crossOrigin\":1,\"src\":\"https:\\/\\/fbstatic-a.akamaihd.net\\/rsrc.php\\/v2\\/yk\\/r\\/TvSvrZCKhi2.css\"},\"OJTM4\":{\"type\":\"js\",\"crossOrigin\":1,\"src\":\"https:\\/\\/fbstatic-a.akamaihd.net\\/rsrc.php\\/v2\\/yd\\/r\\/-z4vUS8jrpA.js\"},\"AsDOA\":{\"type\":\"js\",\"crossOrigin\":1,\"src\":\"https:\\/\\/fbstatic-a.akamaihd.net\\/rsrc.php\\/v2\\/yg\\/r\\/4CJ_klaVGHP.js\"},\"MqSmz\":{\"type\":\"js\",\"crossOrigin\":1,\"src\":\"https:\\/\\/fbstatic-a.akamaihd.net\\/rsrc.php\\/v2\\/yH\\/r\\/ghlEJgSKAee.js\"}},\"ixData\":[]}";
// 14805
f974244559_2127 = function() { return f974244559_2127.returns[f974244559_2127.inst++]; };
f974244559_2127.returns = [];
f974244559_2127.inst = 0;
// 14806
o200._unshieldResponseText = f974244559_2127;
// 14807
f974244559_2127.returns.push("{\"__ar\":1,\"payload\":null,\"jsmods\":{\"require\":[[\"m_2_0\"],[\"Layer\",\"show\",[\"m_2_0\"],[{\"__m\":\"m_2_0\"}]]],\"instances\":[[\"m_2_0\",[\"ContextualDialog\",\"ContextualDialogArrow\",\"ContextualDialogDefaultTheme\",\"LayerFadeOnHide\",\"LayerRemoveOnHide\",\"LayerDestroyOnHide\",\"LayerHideOnTransition\",\"LayerFadeOnShow\",\"ContextualLayerAutoFlip\",\"DialogHideOnSuccess\",\"m_2_1\"],[{\"width\":300,\"context\":null,\"contextID\":null,\"contextSelector\":\"#userNavigationLabel\",\"position\":\"below\",\"alignment\":\"right\",\"offsetX\":0,\"offsetY\":0,\"arrowBehavior\":{\"__m\":\"ContextualDialogArrow\"},\"theme\":{\"__m\":\"ContextualDialogDefaultTheme\"},\"addedBehaviors\":[{\"__m\":\"LayerFadeOnHide\"},{\"__m\":\"LayerRemoveOnHide\"},{\"__m\":\"LayerDestroyOnHide\"},{\"__m\":\"LayerHideOnTransition\"},{\"__m\":\"LayerFadeOnShow\"},{\"__m\":\"ContextualLayerAutoFlip\"},{\"__m\":\"DialogHideOnSuccess\"}]},{\"__m\":\"m_2_1\"}],3]],\"markup\":[[\"m_2_1\",{\"__html\":\"\\u003Cdiv>\\u003Cdiv class=\\\"pam\\\">\\u003Cdiv>\\u003Cdiv class=\\\"clearfix\\\">\\u003Cimg class=\\\"_8o _8s lfloat img\\\" src=\\\"https:\\/\\/fbstatic-a.akamaihd.net\\/rsrc.php\\/v2\\/yR\\/r\\/TU3b_k6WbfA.png\\\" alt=\\\"\\\" width=\\\"43\\\" height=\\\"43\\\" \\/>\\u003Cdiv class=\\\"_42ef\\\">\\u003Cstrong>Get to Know Your Privacy Settings\\u003C\\/strong>\\u003Cdiv class=\\\"mts\\\">You control how you share your stuff with people and apps on Facebook\\u003C\\/div>\\u003C\\/div>\\u003C\\/div>\\u003C\\/div>\\u003C\\/div>\\u003Cdiv class=\\\"uiOverlayFooter _572u uiBoxGray topborder\\\">\\u003Ca class=\\\"_42ft _42fu layerCancel uiOverlayButton selected _42g-\\\" role=\\\"button\\\" href=\\\"\\/ajax\\/marketing\\/tour\\/privacy_tour.php\\\" rel=\\\"dialog\\\">Learn More\\u003C\\/a>\\u003Ca class=\\\"_42ft _42fu layerCancel uiOverlayButton\\\" role=\\\"button\\\" href=\\\"\\/ajax\\/marketing\\/tour\\/privacy_dialog.php?close=1\\\" rel=\\\"async\\\">Close\\u003C\\/a>\\u003C\\/div>\\u003C\\/div>\"},2]]},\"css\":[\"W3Ky6\"],\"js\":[\"AyUu6\",\"AsDOA\"],\"bootloadable\":{\"IframeShim\":{\"resources\":[\"AyUu6\",\"AsDOA\",\"MqSmz\"],\"module\":true},\"Dialog\":{\"resources\":[\"AyUu6\",\"W3Ky6\",\"AsDOA\"],\"module\":true},\"AsyncDOM\":{\"resources\":[\"AyUu6\"],\"module\":true},\"ConfirmationDialog\":{\"resources\":[\"AyUu6\",\"AsDOA\",\"oE4Do\"],\"module\":true},\"React\":{\"resources\":[\"OJTM4\",\"AyUu6\"],\"module\":true}},\"resource_map\":{\"oE4Do\":{\"type\":\"js\",\"crossOrigin\":1,\"src\":\"https:\\/\\/fbstatic-a.akamaihd.net\\/rsrc.php\\/v2\\/yq\\/r\\/MDwOqV08JHh.js\"},\"AyUu6\":{\"type\":\"js\",\"crossOrigin\":1,\"src\":\"https:\\/\\/fbstatic-a.akamaihd.net\\/rsrc.php\\/v2\\/yF\\/r\\/pmYy9aLa5q_.js\"},\"W3Ky6\":{\"type\":\"css\",\"permanent\":1,\"crossOrigin\":1,\"src\":\"https:\\/\\/fbstatic-a.akamaihd.net\\/rsrc.php\\/v2\\/yk\\/r\\/TvSvrZCKhi2.css\"},\"OJTM4\":{\"type\":\"js\",\"crossOrigin\":1,\"src\":\"https:\\/\\/fbstatic-a.akamaihd.net\\/rsrc.php\\/v2\\/yd\\/r\\/-z4vUS8jrpA.js\"},\"AsDOA\":{\"type\":\"js\",\"crossOrigin\":1,\"src\":\"https:\\/\\/fbstatic-a.akamaihd.net\\/rsrc.php\\/v2\\/yg\\/r\\/4CJ_klaVGHP.js\"},\"MqSmz\":{\"type\":\"js\",\"crossOrigin\":1,\"src\":\"https:\\/\\/fbstatic-a.akamaihd.net\\/rsrc.php\\/v2\\/yH\\/r\\/ghlEJgSKAee.js\"}},\"ixData\":[]}");
// 14808
f974244559_2128 = function() { return f974244559_2128.returns[f974244559_2128.inst++]; };
f974244559_2128.returns = [];
f974244559_2128.inst = 0;
// 14809
o200._interpretResponse = f974244559_2128;
// 14810
f974244559_2128.returns.push({__JSBNG_unknown_object:true});
// 14811
f974244559_2129 = function() { return f974244559_2129.returns[f974244559_2129.inst++]; };
f974244559_2129.returns = [];
f974244559_2129.inst = 0;
// 14812
o200.invokeResponseHandler = f974244559_2129;
// 14813
o200.handler = null;
// 14814
f974244559_2130 = function() { return f974244559_2130.returns[f974244559_2130.inst++]; };
f974244559_2130.returns = [];
f974244559_2130.inst = 0;
// 14815
o200.errorHandler = f974244559_2130;
// 14816
f974244559_2131 = function() { return f974244559_2131.returns[f974244559_2131.inst++]; };
f974244559_2131.returns = [];
f974244559_2131.inst = 0;
// 14817
o200._isRelevant = f974244559_2131;
// 14818
o200._allowCrossPageTransition = void 0;
// 14819
o200.id = 4;
// 14821
f974244559_2131.returns.push(true);
// 14822
f974244559_2132 = function() { return f974244559_2132.returns[f974244559_2132.inst++]; };
f974244559_2132.returns = [];
f974244559_2132.inst = 0;
// 14823
o200._dispatchResponse = f974244559_2132;
// 14824
f974244559_2132.JSBNG__name = "";
// 14825
o200.preBootloadHandler = void 0;
// 14826
f974244559_2133 = function() { return f974244559_2133.returns[f974244559_2133.inst++]; };
f974244559_2133.returns = [];
f974244559_2133.inst = 0;
// 14827
o200.getURI = f974244559_2133;
// 14828
o213 = {};
// 14829
o200.uri = o213;
// 14830
f974244559_2135 = function() { return f974244559_2135.returns[f974244559_2135.inst++]; };
f974244559_2135.returns = [];
f974244559_2135.inst = 0;
// 14832
o213.$URIBase0 = "";
// 14833
o213.$URIBase1 = "";
// 14834
o213.$URIBase2 = "";
// 14835
o213.$URIBase3 = "/ajax/marketing/tour/privacy_dialog.php";
// 14837
o214 = {};
// 14838
o213.$URIBase5 = o214;
// undefined
o214 = null;
// 14839
o213.$URIBase4 = "";
// 14840
f974244559_2135.returns.push("/ajax/marketing/tour/privacy_dialog.php");
// 14841
f974244559_2133.returns.push("/ajax/marketing/tour/privacy_dialog.php");
// 14843
f974244559_12.returns.push(56);
// 14847
o214 = {};
// 14848
f974244559_478.returns.push(o214);
// 14850
f974244559_482.returns.push(o214);
// undefined
o214 = null;
// 14851
f974244559_2129.returns.push(undefined);
// 14852
f974244559_2124.returns.push(undefined);
// 14855
o212.asynchronous = true;
// undefined
o212 = null;
// 14858
f974244559_2125.returns.push(true);
// 14859
// 14860
o212 = {};
// 14864
o214 = {};
// 14868
o215 = {};
// 14873
o2.getResponseHeader = f974244559_2123;
// 14876
f974244559_2123.returns.push("T67gpWC5IAYVP1Z5glZSxzp2ls3cEwqY7HXYCbjpiLQ=");
// 14879
f974244559_2123.returns.push("T67gpWC5IAYVP1Z5glZSxzp2ls3cEwqY7HXYCbjpiLQ=");
// 14880
// 14882
o2.JSBNG__status = 200;
// 14886
f974244559_471.returns.push(1373491298636);
// 14887
o96._handleXHRResponse = f974244559_2124;
// 14889
o96.getOption = f974244559_2125;
// 14890
o216 = {};
// 14891
o96.option = o216;
// 14892
o216.suppressEvaluation = false;
// 14895
f974244559_2125.returns.push(false);
// 14896
o2.responseText = "for (;;);{\"__ar\":1,\"payload\":[],\"bootloadable\":{},\"ixData\":[]}";
// 14897
o96._unshieldResponseText = f974244559_2127;
// 14898
f974244559_2127.returns.push("{\"__ar\":1,\"payload\":[],\"bootloadable\":{},\"ixData\":[]}");
// 14899
o96._interpretResponse = f974244559_2128;
// 14900
f974244559_2128.returns.push({__JSBNG_unknown_object:true});
// 14901
o96.invokeResponseHandler = f974244559_2129;
// 14902
o96.handler = null;
// 14903
o96.errorHandler = f974244559_2130;
// 14904
o96._isRelevant = f974244559_2131;
// 14905
o96._allowCrossPageTransition = void 0;
// 14906
o96.id = 5;
// 14908
f974244559_2131.returns.push(true);
// 14909
o96._dispatchResponse = f974244559_2132;
// 14911
o96.preBootloadHandler = void 0;
// 14912
o96.getURI = f974244559_2133;
// 14913
o217 = {};
// 14914
o96.uri = o217;
// 14916
o217.$URIBase0 = "";
// 14917
o217.$URIBase1 = "";
// 14918
o217.$URIBase2 = "";
// 14919
o217.$URIBase3 = "/ajax/chat/imps_logging.php";
// 14921
o218 = {};
// 14922
o217.$URIBase5 = o218;
// undefined
o218 = null;
// 14923
o217.$URIBase4 = "";
// 14924
f974244559_2135.returns.push("/ajax/chat/imps_logging.php");
// 14925
f974244559_2133.returns.push("/ajax/chat/imps_logging.php");
// 14927
f974244559_12.returns.push(57);
// 14931
o218 = {};
// 14932
f974244559_478.returns.push(o218);
// 14934
f974244559_482.returns.push(o218);
// undefined
o218 = null;
// 14935
f974244559_2129.returns.push(undefined);
// 14936
f974244559_2124.returns.push(undefined);
// 14939
o216.asynchronous = true;
// undefined
o216 = null;
// 14942
f974244559_2125.returns.push(true);
// 14943
// 14944
o216 = {};
// 14945
o218 = {};
// undefined
o218 = null;
// 14946
f974244559_2147 = function() { return f974244559_2147.returns[f974244559_2147.inst++]; };
f974244559_2147.returns = [];
f974244559_2147.inst = 0;
// 14947
o216._onReadyState = f974244559_2147;
// 14949
o216.xhr = o205;
// 14951
o205.readyState = 2;
// 14952
o216.JSBNG__status = null;
// 14953
f974244559_2148 = function() { return f974244559_2148.returns[f974244559_2148.inst++]; };
f974244559_2148.returns = [];
f974244559_2148.inst = 0;
// 14954
o216._parseStatus = f974244559_2148;
// 14956
o205.JSBNG__status = 404;
// 14957
// 14959
o205.statusText = "Not Found";
// 14969
// 14970
o216.errorText = void 0;
// 14971
// 14972
f974244559_2148.returns.push(undefined);
// 14974
f974244559_471.returns.push(1373491298650);
// 14975
o216._sentAt = 1373491297587;
// 14976
// 14977
f974244559_2149 = function() { return f974244559_2149.returns[f974244559_2149.inst++]; };
f974244559_2149.returns = [];
f974244559_2149.inst = 0;
// 14978
o216._call = f974244559_2149;
// 14979
f974244559_2150 = function() { return f974244559_2150.returns[f974244559_2150.inst++]; };
f974244559_2150.returns = [];
f974244559_2150.inst = 0;
// 14980
o216.onError = f974244559_2150;
// 14982
f974244559_2150.returns.push(undefined);
// 14983
f974244559_2149.returns.push(undefined);
// 14984
// 14985
// 14986
// 14987
o216._timer = 33;
// 14988
f974244559_14.returns.push(undefined);
// 14993
f974244559_2151 = function() { return f974244559_2151.returns[f974244559_2151.inst++]; };
f974244559_2151.returns = [];
f974244559_2151.inst = 0;
// 14994
o205.abort = f974244559_2151;
// undefined
o205 = null;
// 14995
f974244559_2151.returns.push(undefined);
// 14996
// 14997
f974244559_2147.returns.push(undefined);
// 14998
o205 = {};
// undefined
o205 = null;
// 15003
f974244559_471.returns.push(1373491298653);
// 15005
// 15007
f974244559_2149.returns.push(undefined);
// 15008
// 15009
// 15010
// 15012
f974244559_14.returns.push(undefined);
// 15013
f974244559_2147.returns.push(undefined);
// 15014
o205 = {};
// 15018
o218 = {};
// 15022
o219 = {};
// 15027
o1.getResponseHeader = f974244559_2123;
// 15030
f974244559_2123.returns.push("Q7JhPdiUZ/m8mUAM2lMAqlCXYkYHten/WqnLUu7jOOE=");
// 15033
f974244559_2123.returns.push("Q7JhPdiUZ/m8mUAM2lMAqlCXYkYHten/WqnLUu7jOOE=");
// 15034
// 15036
o1.JSBNG__status = 200;
// 15040
f974244559_471.returns.push(1373491298661);
// 15041
o122._handleXHRResponse = f974244559_2124;
// 15043
o122.getOption = f974244559_2125;
// 15044
o220 = {};
// 15045
o122.option = o220;
// 15046
o220.suppressEvaluation = false;
// 15049
f974244559_2125.returns.push(false);
// 15050
o1.responseText = "for (;;);{\"__ar\":1,\"payload\":{\"keys\":[]},\"bootloadable\":{},\"ixData\":[]}";
// 15051
o122._unshieldResponseText = f974244559_2127;
// 15052
f974244559_2127.returns.push("{\"__ar\":1,\"payload\":{\"keys\":[]},\"bootloadable\":{},\"ixData\":[]}");
// 15053
o122._interpretResponse = f974244559_2128;
// 15054
f974244559_2128.returns.push({__JSBNG_unknown_object:true});
// 15055
o122.invokeResponseHandler = f974244559_2129;
// 15056
f974244559_2157 = function() { return f974244559_2157.returns[f974244559_2157.inst++]; };
f974244559_2157.returns = [];
f974244559_2157.inst = 0;
// 15057
o122.handler = f974244559_2157;
// 15058
o122._isRelevant = f974244559_2131;
// 15059
o122._allowCrossPageTransition = void 0;
// 15060
o122.id = 3;
// 15062
f974244559_2131.returns.push(true);
// 15063
o122._dispatchResponse = f974244559_2132;
// 15065
o122.preBootloadHandler = void 0;
// 15066
o122.getURI = f974244559_2133;
// 15067
o221 = {};
// 15068
o122.uri = o221;
// 15070
o221.$URIBase0 = "";
// 15071
o221.$URIBase1 = "";
// 15072
o221.$URIBase2 = "";
// 15073
o221.$URIBase3 = "/ajax/webstorage/process_keys.php";
// 15075
o222 = {};
// 15076
o221.$URIBase5 = o222;
// undefined
o222 = null;
// 15077
o221.$URIBase4 = "";
// 15078
f974244559_2135.returns.push("/ajax/webstorage/process_keys.php");
// 15079
f974244559_2133.returns.push("/ajax/webstorage/process_keys.php");
// 15081
f974244559_12.returns.push(58);
// 15085
o222 = {};
// 15086
f974244559_478.returns.push(o222);
// 15088
f974244559_482.returns.push(o222);
// undefined
o222 = null;
// 15089
f974244559_2129.returns.push(undefined);
// 15090
f974244559_2124.returns.push(undefined);
// 15093
o220.asynchronous = true;
// undefined
o220 = null;
// 15096
f974244559_2125.returns.push(true);
// 15097
// 15098
f974244559_12.returns.push(59);
// 15102
f974244559_2161 = function() { return f974244559_2161.returns[f974244559_2161.inst++]; };
f974244559_2161.returns = [];
f974244559_2161.inst = 0;
// 15103
o200.clearStatusIndicator = f974244559_2161;
// 15104
f974244559_2162 = function() { return f974244559_2162.returns[f974244559_2162.inst++]; };
f974244559_2162.returns = [];
f974244559_2162.inst = 0;
// 15105
o200.getStatusElement = f974244559_2162;
// 15106
o200.statusElement = null;
// 15107
f974244559_2162.returns.push(null);
// 15108
f974244559_2161.returns.push(undefined);
// 15113
f974244559_2131.returns.push(true);
// 15114
o200.initialHandler = f974244559_2110;
// 15115
f974244559_2110.returns.push(undefined);
// 15116
o200.timer = null;
// 15117
f974244559_14.returns.push(undefined);
// 15119
f974244559_2163 = function() { return f974244559_2163.returns[f974244559_2163.inst++]; };
f974244559_2163.returns = [];
f974244559_2163.inst = 0;
// 15120
o200._handleJSResponse = f974244559_2163;
// 15121
f974244559_2164 = function() { return f974244559_2164.returns[f974244559_2164.inst++]; };
f974244559_2164.returns = [];
f974244559_2164.inst = 0;
// 15122
o200.getRelativeTo = f974244559_2164;
// 15123
o200.relativeTo = null;
// 15124
f974244559_2164.returns.push(null);
// 15129
o220 = {};
// 15130
f974244559_480.returns.push(o220);
// 15131
// 15132
// 15133
o220.getElementsByTagName = f974244559_514;
// 15134
o222 = {};
// 15135
f974244559_514.returns.push(o222);
// 15136
o222.length = 0;
// undefined
o222 = null;
// 15138
o222 = {};
// 15139
o220.childNodes = o222;
// undefined
o220 = null;
// 15140
o222.item = f974244559_517;
// 15141
o222.length = 1;
// 15142
o220 = {};
// 15143
o222["0"] = o220;
// undefined
o222 = null;
// 15144
o220.getElementsByTagName = f974244559_514;
// 15146
o220.querySelectorAll = f974244559_523;
// 15147
o222 = {};
// 15148
f974244559_523.returns.push(o222);
// 15149
o222.length = 1;
// 15150
o223 = {};
// 15151
o222["0"] = o223;
// undefined
o222 = null;
// undefined
o223 = null;
// 15152
o220.__html = void 0;
// 15153
o220.mountComponentIntoNode = void 0;
// 15154
o222 = {};
// 15155
o220.classList = o222;
// 15157
o222.add = f974244559_1110;
// undefined
o222 = null;
// 15158
f974244559_1110.returns.push(undefined);
// 15160
o222 = {};
// 15161
f974244559_480.returns.push(o222);
// 15162
// 15163
o222.firstChild = null;
// 15166
o223 = {};
// 15167
f974244559_478.returns.push(o223);
// 15169
o222.appendChild = f974244559_482;
// 15170
f974244559_482.returns.push(o223);
// undefined
o223 = null;
// 15172
o223 = {};
// 15173
f974244559_480.returns.push(o223);
// 15174
// 15175
o223.firstChild = null;
// 15176
o222.__html = void 0;
// 15178
o224 = {};
// 15179
f974244559_478.returns.push(o224);
// 15181
o223.appendChild = f974244559_482;
// 15182
f974244559_482.returns.push(o224);
// undefined
o224 = null;
// 15183
o224 = {};
// 15184
o223.classList = o224;
// 15186
o224.add = f974244559_1110;
// 15187
f974244559_1110.returns.push(undefined);
// 15188
o225 = {};
// undefined
fo974244559_2172_style = function() { return fo974244559_2172_style.returns[fo974244559_2172_style.inst++]; };
fo974244559_2172_style.returns = [];
fo974244559_2172_style.inst = 0;
defineGetter(o222, "style", fo974244559_2172_style, undefined);
// undefined
fo974244559_2172_style.returns.push(o225);
// 15190
// undefined
o225 = null;
// 15194
f974244559_1110.returns.push(undefined);
// 15195
o223.__FB_TOKEN = void 0;
// 15196
// 15197
f974244559_2178 = function() { return f974244559_2178.returns[f974244559_2178.inst++]; };
f974244559_2178.returns = [];
f974244559_2178.inst = 0;
// 15198
f974244559_2110.thatReturnsArgument = f974244559_2178;
// 15199
f974244559_2178.returns.push("aftershow");
// 15201
f974244559_2178.returns.push("aftershow");
// 15203
f974244559_2178.returns.push("show");
// 15204
f974244559_2178.returns.push("hide");
// 15205
f974244559_2178.returns.push("reposition");
// 15206
o223.nodeName = "DIV";
// 15207
o223.getAttribute = f974244559_500;
// 15208
o223.hasAttribute = f974244559_527;
// 15210
f974244559_527.returns.push(false);
// 15211
o223.JSBNG__addEventListener = f974244559_472;
// 15213
f974244559_472.returns.push(undefined);
// 15214
o223.JSBNG__onclick = null;
// 15219
f974244559_472.returns.push(undefined);
// 15220
o223.JSBNG__onsubmit = null;
// 15225
f974244559_472.returns.push(undefined);
// 15226
o223.JSBNG__onsuccess = void 0;
// 15231
f974244559_472.returns.push(undefined);
// 15232
o223.JSBNG__onerror = null;
// 15235
f974244559_2178.returns.push("mouseenter");
// 15237
f974244559_2178.returns.push("mouseleave");
// 15239
f974244559_2178.returns.push("hide");
// 15241
f974244559_2178.returns.push("starthide");
// 15243
f974244559_2178.returns.push("hide");
// 15245
f974244559_2178.returns.push("hide");
// 15246
f974244559_12.returns.push(60);
// 15248
f974244559_2178.returns.push("beforeshow");
// 15250
f974244559_2178.returns.push("show");
// 15252
f974244559_2178.returns.push("adjust");
// 15254
f974244559_2178.returns.push("success");
// 15256
f974244559_2178.returns.push("adjust");
// 15257
f974244559_2178.returns.push("reposition");
// 15260
o225 = {};
// undefined
fo974244559_2174_style = function() { return fo974244559_2174_style.returns[fo974244559_2174_style.inst++]; };
fo974244559_2174_style.returns = [];
fo974244559_2174_style.inst = 0;
defineGetter(o223, "style", fo974244559_2174_style, undefined);
// undefined
fo974244559_2174_style.returns.push(o225);
// 15262
// undefined
fo974244559_2174_style.returns.push(o225);
// 15264
// undefined
fo974244559_2174_style.returns.push(o225);
// 15266
// undefined
o225 = null;
// 15269
o224.remove = f974244559_1244;
// undefined
o224 = null;
// 15270
f974244559_1244.returns.push(undefined);
// 15272
o0.getAttributeNode = void 0;
// 15275
o224 = {};
// 15276
f974244559_475.returns.push(o224);
// 15277
o224.length = 1806;
// 15278
o224["0"] = o8;
// 15281
o225 = {};
// 15282
f974244559_519.returns.push(o225);
// 15283
o225.value = "facebook";
// undefined
o225 = null;
// 15285
o224["1"] = o9;
// 15286
o9.getAttributeNode = f974244559_519;
// undefined
o9 = null;
// 15288
f974244559_519.returns.push(null);
// 15290
o9 = {};
// 15291
o224["2"] = o9;
// 15292
o9.getAttributeNode = f974244559_519;
// undefined
o9 = null;
// 15294
f974244559_519.returns.push(null);
// 15296
o9 = {};
// 15297
o224["3"] = o9;
// 15298
o9.getAttributeNode = f974244559_519;
// undefined
o9 = null;
// 15300
f974244559_519.returns.push(null);
// 15302
o9 = {};
// 15303
o224["4"] = o9;
// 15304
o9.getAttributeNode = f974244559_519;
// undefined
o9 = null;
// 15306
f974244559_519.returns.push(null);
// 15308
o9 = {};
// 15309
o224["5"] = o9;
// 15310
o9.getAttributeNode = f974244559_519;
// undefined
o9 = null;
// 15312
f974244559_519.returns.push(null);
// 15314
o9 = {};
// 15315
o224["6"] = o9;
// 15316
o9.getAttributeNode = f974244559_519;
// undefined
o9 = null;
// 15318
f974244559_519.returns.push(null);
// 15320
o9 = {};
// 15321
o224["7"] = o9;
// 15322
o9.getAttributeNode = f974244559_519;
// undefined
o9 = null;
// 15324
f974244559_519.returns.push(null);
// 15326
o9 = {};
// 15327
o224["8"] = o9;
// 15328
o9.getAttributeNode = f974244559_519;
// undefined
o9 = null;
// 15330
f974244559_519.returns.push(null);
// 15332
o9 = {};
// 15333
o224["9"] = o9;
// 15334
o9.getAttributeNode = f974244559_519;
// undefined
o9 = null;
// 15336
f974244559_519.returns.push(null);
// 15338
o9 = {};
// 15339
o224["10"] = o9;
// 15340
o9.getAttributeNode = f974244559_519;
// undefined
o9 = null;
// 15342
f974244559_519.returns.push(null);
// 15344
o9 = {};
// 15345
o224["11"] = o9;
// 15346
o9.getAttributeNode = f974244559_519;
// undefined
o9 = null;
// 15348
o9 = {};
// 15349
f974244559_519.returns.push(o9);
// 15350
o9.value = "meta_referrer";
// undefined
o9 = null;
// 15352
o224["12"] = o14;
// 15353
o14.getAttributeNode = f974244559_519;
// undefined
o14 = null;
// 15355
f974244559_519.returns.push(null);
// 15357
o224["13"] = o15;
// 15358
o15.getAttributeNode = f974244559_519;
// undefined
o15 = null;
// 15360
f974244559_519.returns.push(null);
// 15362
o224["14"] = o16;
// 15363
o16.getAttributeNode = f974244559_519;
// undefined
o16 = null;
// 15365
f974244559_519.returns.push(null);
// 15367
o224["15"] = o17;
// 15368
o17.getAttributeNode = f974244559_519;
// undefined
o17 = null;
// 15370
f974244559_519.returns.push(null);
// 15372
o224["16"] = o18;
// 15373
o18.getAttributeNode = f974244559_519;
// undefined
o18 = null;
// 15375
f974244559_519.returns.push(null);
// 15377
o224["17"] = o19;
// 15378
o19.getAttributeNode = f974244559_519;
// undefined
o19 = null;
// 15380
f974244559_519.returns.push(null);
// 15382
o9 = {};
// 15383
o224["18"] = o9;
// 15384
o9.getAttributeNode = f974244559_519;
// undefined
o9 = null;
// 15386
f974244559_519.returns.push(null);
// 15388
o9 = {};
// 15389
o224["19"] = o9;
// 15390
o9.getAttributeNode = f974244559_519;
// undefined
o9 = null;
// 15392
f974244559_519.returns.push(null);
// 15394
o9 = {};
// 15395
o224["20"] = o9;
// 15396
o9.getAttributeNode = f974244559_519;
// undefined
o9 = null;
// 15398
f974244559_519.returns.push(null);
// 15400
o224["21"] = o10;
// 15401
o10.getAttributeNode = f974244559_519;
// undefined
o10 = null;
// 15403
f974244559_519.returns.push(null);
// 15405
o224["22"] = o11;
// 15406
o11.getAttributeNode = f974244559_519;
// undefined
o11 = null;
// 15408
f974244559_519.returns.push(null);
// 15410
o224["23"] = o12;
// 15411
o12.getAttributeNode = f974244559_519;
// undefined
o12 = null;
// 15413
f974244559_519.returns.push(null);
// 15415
o9 = {};
// 15416
o224["24"] = o9;
// 15417
o9.getAttributeNode = f974244559_519;
// undefined
o9 = null;
// 15419
f974244559_519.returns.push(null);
// 15421
o9 = {};
// 15422
o224["25"] = o9;
// 15423
o9.getAttributeNode = f974244559_519;
// undefined
o9 = null;
// 15425
o9 = {};
// 15426
f974244559_519.returns.push(o9);
// 15427
o9.value = "pageTitle";
// undefined
o9 = null;
// 15429
o224["26"] = o20;
// 15430
o20.getAttributeNode = f974244559_519;
// undefined
o20 = null;
// 15432
f974244559_519.returns.push(null);
// 15434
o9 = {};
// 15435
o224["27"] = o9;
// 15436
o9.getAttributeNode = f974244559_519;
// undefined
o9 = null;
// 15438
f974244559_519.returns.push(null);
// 15440
o224["28"] = o21;
// 15441
o21.getAttributeNode = f974244559_519;
// undefined
o21 = null;
// 15443
f974244559_519.returns.push(null);
// 15445
o224["29"] = o22;
// 15446
o22.getAttributeNode = f974244559_519;
// undefined
o22 = null;
// 15448
f974244559_519.returns.push(null);
// 15450
o224["30"] = o23;
// 15451
o23.getAttributeNode = f974244559_519;
// undefined
o23 = null;
// 15453
f974244559_519.returns.push(null);
// 15455
o9 = {};
// 15456
o224["31"] = o9;
// 15457
o9.getAttributeNode = f974244559_519;
// undefined
o9 = null;
// 15459
f974244559_519.returns.push(null);
// 15461
o224["32"] = o26;
// 15462
o26.getAttributeNode = f974244559_519;
// undefined
o26 = null;
// 15464
f974244559_519.returns.push(null);
// 15466
o224["33"] = o49;
// 15467
o49.getAttributeNode = f974244559_519;
// undefined
o49 = null;
// 15469
f974244559_519.returns.push(null);
// 15471
o224["34"] = o58;
// 15472
o58.getAttributeNode = f974244559_519;
// undefined
o58 = null;
// 15474
f974244559_519.returns.push(null);
// 15476
o224["35"] = o63;
// 15477
o63.getAttributeNode = f974244559_519;
// undefined
o63 = null;
// 15479
f974244559_519.returns.push(null);
// 15481
o224["36"] = o123;
// 15482
o123.getAttributeNode = f974244559_519;
// undefined
o123 = null;
// 15484
f974244559_519.returns.push(null);
// 15486
o224["37"] = o124;
// 15487
o124.getAttributeNode = f974244559_519;
// undefined
o124 = null;
// 15489
f974244559_519.returns.push(null);
// 15491
o224["38"] = o125;
// 15492
o125.getAttributeNode = f974244559_519;
// undefined
o125 = null;
// 15494
f974244559_519.returns.push(null);
// 15496
o224["39"] = o126;
// 15497
o126.getAttributeNode = f974244559_519;
// undefined
o126 = null;
// 15499
f974244559_519.returns.push(null);
// 15501
o224["40"] = o127;
// 15502
o127.getAttributeNode = f974244559_519;
// undefined
o127 = null;
// 15504
f974244559_519.returns.push(null);
// 15506
o224["41"] = o128;
// 15507
o128.getAttributeNode = f974244559_519;
// undefined
o128 = null;
// 15509
f974244559_519.returns.push(null);
// 15511
o224["42"] = o129;
// 15512
o129.getAttributeNode = f974244559_519;
// undefined
o129 = null;
// 15514
f974244559_519.returns.push(null);
// 15516
o224["43"] = o130;
// 15517
o130.getAttributeNode = f974244559_519;
// undefined
o130 = null;
// 15519
f974244559_519.returns.push(null);
// 15521
o224["44"] = o131;
// 15522
o131.getAttributeNode = f974244559_519;
// undefined
o131 = null;
// 15524
f974244559_519.returns.push(null);
// 15526
o224["45"] = o132;
// 15527
o132.getAttributeNode = f974244559_519;
// undefined
o132 = null;
// 15529
f974244559_519.returns.push(null);
// 15531
o224["46"] = o133;
// 15532
o133.getAttributeNode = f974244559_519;
// undefined
o133 = null;
// 15534
f974244559_519.returns.push(null);
// 15536
o224["47"] = o134;
// 15537
o134.getAttributeNode = f974244559_519;
// undefined
o134 = null;
// 15539
f974244559_519.returns.push(null);
// 15541
o224["48"] = o135;
// 15542
o135.getAttributeNode = f974244559_519;
// undefined
o135 = null;
// 15544
f974244559_519.returns.push(null);
// 15546
o224["49"] = o25;
// 15549
f974244559_519.returns.push(null);
// 15551
o224["50"] = o76;
// 15554
f974244559_519.returns.push(null);
// 15556
o224["51"] = o195;
// 15557
o195.getAttributeNode = f974244559_519;
// undefined
o195 = null;
// 15559
o9 = {};
// 15560
f974244559_519.returns.push(o9);
// 15561
o9.value = "pagelet_bluebar";
// undefined
o9 = null;
// 15563
o224["52"] = o194;
// 15564
o194.getAttributeNode = f974244559_519;
// 15566
o9 = {};
// 15567
f974244559_519.returns.push(o9);
// 15568
o9.value = "blueBarHolder";
// undefined
o9 = null;
// 15570
o224["53"] = o193;
// 15571
o193.getAttributeNode = f974244559_519;
// 15573
o9 = {};
// 15574
f974244559_519.returns.push(o9);
// 15575
o9.value = "blueBar";
// undefined
o9 = null;
// 15577
o224["54"] = o192;
// 15578
o192.getAttributeNode = f974244559_519;
// 15580
o9 = {};
// 15581
f974244559_519.returns.push(o9);
// 15582
o9.value = "pageHead";
// undefined
o9 = null;
// 15584
o9 = {};
// 15585
o224["55"] = o9;
// 15586
o9.getAttributeNode = f974244559_519;
// undefined
o9 = null;
// 15588
o9 = {};
// 15589
f974244559_519.returns.push(o9);
// 15590
o9.value = "pageLogo";
// undefined
o9 = null;
// 15592
o9 = {};
// 15593
o224["56"] = o9;
// 15594
o9.getAttributeNode = f974244559_519;
// undefined
o9 = null;
// 15596
f974244559_519.returns.push(null);
// 15598
o224["57"] = o189;
// 15599
o189.getAttributeNode = f974244559_519;
// undefined
o189 = null;
// 15601
o9 = {};
// 15602
f974244559_519.returns.push(o9);
// 15603
o9.value = "jewelContainer";
// undefined
o9 = null;
// 15605
o224["58"] = o143;
// 15606
o143.getAttributeNode = f974244559_519;
// undefined
o143 = null;
// 15608
o9 = {};
// 15609
f974244559_519.returns.push(o9);
// 15610
o9.value = "fbRequestsJewel";
// undefined
o9 = null;
// 15612
o9 = {};
// 15613
o224["59"] = o9;
// 15614
o9.getAttributeNode = f974244559_519;
// undefined
o9 = null;
// 15616
f974244559_519.returns.push(null);
// 15618
o9 = {};
// 15619
o224["60"] = o9;
// 15620
o9.getAttributeNode = f974244559_519;
// undefined
o9 = null;
// 15622
o9 = {};
// 15623
f974244559_519.returns.push(o9);
// 15624
o9.value = "requestsCountWrapper";
// undefined
o9 = null;
// 15626
o9 = {};
// 15627
o224["61"] = o9;
// 15628
o9.getAttributeNode = f974244559_519;
// undefined
o9 = null;
// 15630
o9 = {};
// 15631
f974244559_519.returns.push(o9);
// 15632
o9.value = "requestsCountValue";
// undefined
o9 = null;
// 15634
o9 = {};
// 15635
o224["62"] = o9;
// 15636
o9.getAttributeNode = f974244559_519;
// undefined
o9 = null;
// 15638
f974244559_519.returns.push(null);
// 15640
o224["63"] = o146;
// 15641
o146.getAttributeNode = f974244559_519;
// undefined
o146 = null;
// 15643
o9 = {};
// 15644
f974244559_519.returns.push(o9);
// 15645
o9.value = "fbRequestsFlyout";
// undefined
o9 = null;
// 15647
o9 = {};
// 15648
o224["64"] = o9;
// 15649
o9.getAttributeNode = f974244559_519;
// undefined
o9 = null;
// 15651
f974244559_519.returns.push(null);
// 15653
o9 = {};
// 15654
o224["65"] = o9;
// 15655
o9.getAttributeNode = f974244559_519;
// undefined
o9 = null;
// 15657
f974244559_519.returns.push(null);
// 15659
o9 = {};
// 15660
o224["66"] = o9;
// 15661
o9.getAttributeNode = f974244559_519;
// undefined
o9 = null;
// 15663
f974244559_519.returns.push(null);
// 15665
o224["67"] = o108;
// 15666
o108.getAttributeNode = f974244559_519;
// undefined
o108 = null;
// 15668
o9 = {};
// 15669
f974244559_519.returns.push(o9);
// 15670
o9.value = "fbRequestsList";
// undefined
o9 = null;
// 15672
o9 = {};
// 15673
o224["68"] = o9;
// 15674
o9.getAttributeNode = f974244559_519;
// undefined
o9 = null;
// 15676
o9 = {};
// 15677
f974244559_519.returns.push(o9);
// 15678
o9.value = "fbRequestsJewelLoading";
// undefined
o9 = null;
// 15680
o9 = {};
// 15681
o224["69"] = o9;
// 15682
o9.getAttributeNode = f974244559_519;
// undefined
o9 = null;
// 15684
o9 = {};
// 15685
f974244559_519.returns.push(o9);
// 15686
o9.value = "fbRequestsJewelLoadingContent";
// undefined
o9 = null;
// 15688
o9 = {};
// 15689
o224["70"] = o9;
// 15690
o9.getAttributeNode = f974244559_519;
// undefined
o9 = null;
// 15692
f974244559_519.returns.push(null);
// 15694
o9 = {};
// 15695
o224["71"] = o9;
// 15696
o9.getAttributeNode = f974244559_519;
// undefined
o9 = null;
// 15698
f974244559_519.returns.push(null);
// 15700
o9 = {};
// 15701
o224["72"] = o9;
// 15702
o9.getAttributeNode = f974244559_519;
// undefined
o9 = null;
// 15704
f974244559_519.returns.push(null);
// 15706
o9 = {};
// 15707
o224["73"] = o9;
// 15708
o9.getAttributeNode = f974244559_519;
// undefined
o9 = null;
// 15710
f974244559_519.returns.push(null);
// 15712
o9 = {};
// 15713
o224["74"] = o9;
// 15714
o9.getAttributeNode = f974244559_519;
// undefined
o9 = null;
// 15716
f974244559_519.returns.push(null);
// 15718
o9 = {};
// 15719
o224["75"] = o9;
// 15720
o9.getAttributeNode = f974244559_519;
// undefined
o9 = null;
// 15722
f974244559_519.returns.push(null);
// 15724
o9 = {};
// 15725
o224["76"] = o9;
// 15726
o9.getAttributeNode = f974244559_519;
// undefined
o9 = null;
// 15728
f974244559_519.returns.push(null);
// 15730
o9 = {};
// 15731
o224["77"] = o9;
// 15732
o9.getAttributeNode = f974244559_519;
// undefined
o9 = null;
// 15734
f974244559_519.returns.push(null);
// 15736
o9 = {};
// 15737
o224["78"] = o9;
// 15738
o9.getAttributeNode = f974244559_519;
// undefined
o9 = null;
// 15740
f974244559_519.returns.push(null);
// 15742
o9 = {};
// 15743
o224["79"] = o9;
// 15744
o9.getAttributeNode = f974244559_519;
// undefined
o9 = null;
// 15746
f974244559_519.returns.push(null);
// 15748
o9 = {};
// 15749
o224["80"] = o9;
// 15750
o9.getAttributeNode = f974244559_519;
// undefined
o9 = null;
// 15752
f974244559_519.returns.push(null);
// 15754
o9 = {};
// 15755
o224["81"] = o9;
// 15756
o9.getAttributeNode = f974244559_519;
// undefined
o9 = null;
// 15758
f974244559_519.returns.push(null);
// 15760
o9 = {};
// 15761
o224["82"] = o9;
// 15762
o9.getAttributeNode = f974244559_519;
// undefined
o9 = null;
// 15764
f974244559_519.returns.push(null);
// 15766
o224["83"] = o142;
// undefined
o142 = null;
// 15769
o9 = {};
// 15770
f974244559_519.returns.push(o9);
// 15771
o9.value = "fbMessagesJewel";
// undefined
o9 = null;
// 15773
o224["84"] = o169;
// undefined
o169 = null;
// 15776
f974244559_519.returns.push(null);
// 15778
o224["85"] = o170;
// undefined
o170 = null;
// 15781
o9 = {};
// 15782
f974244559_519.returns.push(o9);
// 15783
o9.value = "mercurymessagesCountWrapper";
// undefined
o9 = null;
// 15785
o224["86"] = o171;
// undefined
o171 = null;
// 15788
o9 = {};
// 15789
f974244559_519.returns.push(o9);
// 15790
o9.value = "mercurymessagesCountValue";
// undefined
o9 = null;
// 15792
o9 = {};
// 15793
o224["87"] = o9;
// 15794
o9.getAttributeNode = f974244559_519;
// undefined
o9 = null;
// 15796
f974244559_519.returns.push(null);
// 15798
o224["88"] = o144;
// undefined
o144 = null;
// 15801
o9 = {};
// 15802
f974244559_519.returns.push(o9);
// 15803
o9.value = "fbMessagesFlyout";
// undefined
o9 = null;
// 15805
o224["89"] = o173;
// undefined
o173 = null;
// 15808
f974244559_519.returns.push(null);
// 15810
o224["90"] = o174;
// undefined
o174 = null;
// 15813
f974244559_519.returns.push(null);
// 15815
o224["91"] = o175;
// undefined
o175 = null;
// 15818
f974244559_519.returns.push(null);
// 15820
o224["92"] = o176;
// undefined
o176 = null;
// 15823
f974244559_519.returns.push(null);
// 15825
o224["93"] = o177;
// undefined
o177 = null;
// 15828
f974244559_519.returns.push(null);
// 15830
o224["94"] = o178;
// undefined
o178 = null;
// 15833
f974244559_519.returns.push(null);
// 15835
o224["95"] = o179;
// undefined
o179 = null;
// 15838
f974244559_519.returns.push(null);
// 15840
o224["96"] = o180;
// undefined
o180 = null;
// 15843
f974244559_519.returns.push(null);
// 15845
o224["97"] = o141;
// undefined
o141 = null;
// 15848
o9 = {};
// 15849
f974244559_519.returns.push(o9);
// 15850
o9.value = "u_0_4";
// undefined
o9 = null;
// 15852
o224["98"] = o181;
// undefined
o181 = null;
// 15855
f974244559_519.returns.push(null);
// 15857
o224["99"] = o182;
// undefined
o182 = null;
// 15860
f974244559_519.returns.push(null);
// 15862
o224["100"] = o183;
// undefined
o183 = null;
// 15865
f974244559_519.returns.push(null);
// 15867
o224["101"] = o184;
// undefined
o184 = null;
// 15870
f974244559_519.returns.push(null);
// 15872
o224["102"] = o185;
// undefined
o185 = null;
// 15875
f974244559_519.returns.push(null);
// 15877
o224["103"] = o186;
// undefined
o186 = null;
// 15880
f974244559_519.returns.push(null);
// 15882
o224["104"] = o187;
// undefined
o187 = null;
// 15885
f974244559_519.returns.push(null);
// 15887
o224["105"] = o79;
// undefined
o79 = null;
// 15890
o9 = {};
// 15891
f974244559_519.returns.push(o9);
// 15892
o9.value = "MercuryJewelThreadList";
// undefined
o9 = null;
// 15894
o224["106"] = o81;
// 15895
o81.getAttributeNode = f974244559_519;
// undefined
o81 = null;
// 15897
f974244559_519.returns.push(null);
// 15899
o224["107"] = o82;
// 15900
o82.getAttributeNode = f974244559_519;
// undefined
o82 = null;
// 15902
f974244559_519.returns.push(null);
// 15904
o224["108"] = o83;
// 15905
o83.getAttributeNode = f974244559_519;
// undefined
o83 = null;
// 15907
f974244559_519.returns.push(null);
// 15909
o9 = {};
// 15910
o224["109"] = o9;
// 15911
o9.getAttributeNode = f974244559_519;
// undefined
o9 = null;
// 15913
f974244559_519.returns.push(null);
// 15915
o9 = {};
// 15916
o224["110"] = o9;
// 15917
o9.getAttributeNode = f974244559_519;
// undefined
o9 = null;
// 15919
f974244559_519.returns.push(null);
// 15921
o9 = {};
// 15922
o224["111"] = o9;
// 15923
o9.getAttributeNode = f974244559_519;
// undefined
o9 = null;
// 15925
f974244559_519.returns.push(null);
// 15927
o9 = {};
// 15928
o224["112"] = o9;
// 15929
o9.getAttributeNode = f974244559_519;
// undefined
o9 = null;
// 15931
f974244559_519.returns.push(null);
// 15933
o9 = {};
// 15934
o224["113"] = o9;
// 15935
o9.getAttributeNode = f974244559_519;
// undefined
o9 = null;
// 15937
f974244559_519.returns.push(null);
// 15939
o9 = {};
// 15940
o224["114"] = o9;
// 15941
o9.getAttributeNode = f974244559_519;
// undefined
o9 = null;
// 15943
f974244559_519.returns.push(null);
// 15945
o9 = {};
// 15946
o224["115"] = o9;
// 15947
o9.getAttributeNode = f974244559_519;
// undefined
o9 = null;
// 15949
f974244559_519.returns.push(null);
// 15951
o9 = {};
// 15952
o224["116"] = o9;
// 15953
o9.getAttributeNode = f974244559_519;
// undefined
o9 = null;
// 15955
f974244559_519.returns.push(null);
// 15957
o9 = {};
// 15958
o224["117"] = o9;
// 15959
o9.getAttributeNode = f974244559_519;
// undefined
o9 = null;
// 15961
f974244559_519.returns.push(null);
// 15963
o9 = {};
// 15964
o224["118"] = o9;
// 15965
o9.getAttributeNode = f974244559_519;
// undefined
o9 = null;
// 15967
f974244559_519.returns.push(null);
// 15969
o224["119"] = o84;
// 15970
o84.getAttributeNode = f974244559_519;
// undefined
o84 = null;
// 15972
f974244559_519.returns.push(null);
// 15974
o224["120"] = o85;
// 15975
o85.getAttributeNode = f974244559_519;
// undefined
o85 = null;
// 15977
f974244559_519.returns.push(null);
// 15979
o9 = {};
// 15980
o224["121"] = o9;
// 15981
o9.getAttributeNode = f974244559_519;
// undefined
o9 = null;
// 15983
o9 = {};
// 15984
f974244559_519.returns.push(o9);
// 15985
o9.value = "MercuryJewelFooter";
// undefined
o9 = null;
// 15987
o9 = {};
// 15988
o224["122"] = o9;
// 15989
o9.getAttributeNode = f974244559_519;
// undefined
o9 = null;
// 15991
f974244559_519.returns.push(null);
// 15993
o9 = {};
// 15994
o224["123"] = o9;
// 15995
o9.getAttributeNode = f974244559_519;
// undefined
o9 = null;
// 15997
f974244559_519.returns.push(null);
// 15999
o9 = {};
// 16000
o224["124"] = o9;
// 16001
o9.getAttributeNode = f974244559_519;
// undefined
o9 = null;
// 16003
f974244559_519.returns.push(null);
// 16005
o224["125"] = o145;
// 16006
o145.getAttributeNode = f974244559_519;
// undefined
o145 = null;
// 16008
o9 = {};
// 16009
f974244559_519.returns.push(o9);
// 16010
o9.value = "fbNotificationsJewel";
// undefined
o9 = null;
// 16012
o9 = {};
// 16013
o224["126"] = o9;
// 16014
o9.getAttributeNode = f974244559_519;
// undefined
o9 = null;
// 16016
f974244559_519.returns.push(null);
// 16018
o9 = {};
// 16019
o224["127"] = o9;
// 16020
o9.getAttributeNode = f974244559_519;
// undefined
o9 = null;
// 16022
f974244559_519.returns.push(null);
// 16024
o224["128"] = o190;
// 16025
o190.getAttributeNode = f974244559_519;
// undefined
o190 = null;
// 16027
o9 = {};
// 16028
f974244559_519.returns.push(o9);
// 16029
o9.value = "notificationsCountWrapper";
// undefined
o9 = null;
// 16031
o224["129"] = o191;
// 16032
o191.getAttributeNode = f974244559_519;
// undefined
o191 = null;
// 16034
o9 = {};
// 16035
f974244559_519.returns.push(o9);
// 16036
o9.value = "notificationsCountValue";
// undefined
o9 = null;
// 16038
o9 = {};
// 16039
o224["130"] = o9;
// 16040
o9.getAttributeNode = f974244559_519;
// undefined
o9 = null;
// 16042
f974244559_519.returns.push(null);
// 16044
o224["131"] = o148;
// 16045
o148.getAttributeNode = f974244559_519;
// undefined
o148 = null;
// 16047
o9 = {};
// 16048
f974244559_519.returns.push(o9);
// 16049
o9.value = "fbNotificationsFlyout";
// undefined
o9 = null;
// 16051
o9 = {};
// 16052
o224["132"] = o9;
// 16053
o9.getAttributeNode = f974244559_519;
// undefined
o9 = null;
// 16055
f974244559_519.returns.push(null);
// 16057
o9 = {};
// 16058
o224["133"] = o9;
// 16059
o9.getAttributeNode = f974244559_519;
// undefined
o9 = null;
// 16061
f974244559_519.returns.push(null);
// 16063
o9 = {};
// 16064
o224["134"] = o9;
// 16065
o9.getAttributeNode = f974244559_519;
// undefined
o9 = null;
// 16067
f974244559_519.returns.push(null);
// 16069
o9 = {};
// 16070
o224["135"] = o9;
// 16071
o9.getAttributeNode = f974244559_519;
// undefined
o9 = null;
// 16073
f974244559_519.returns.push(null);
// 16075
o9 = {};
// 16076
o224["136"] = o9;
// 16077
o9.getAttributeNode = f974244559_519;
// undefined
o9 = null;
// 16079
f974244559_519.returns.push(null);
// 16081
o9 = {};
// 16082
o224["137"] = o9;
// 16083
o9.getAttributeNode = f974244559_519;
// undefined
o9 = null;
// 16085
f974244559_519.returns.push(null);
// 16087
o9 = {};
// 16088
o224["138"] = o9;
// 16089
o9.getAttributeNode = f974244559_519;
// undefined
o9 = null;
// 16091
f974244559_519.returns.push(null);
// 16093
o9 = {};
// 16094
o224["139"] = o9;
// 16095
o9.getAttributeNode = f974244559_519;
// undefined
o9 = null;
// 16097
f974244559_519.returns.push(null);
// 16099
o9 = {};
// 16100
o224["140"] = o9;
// 16101
o9.getAttributeNode = f974244559_519;
// undefined
o9 = null;
// 16103
f974244559_519.returns.push(null);
// 16105
o9 = {};
// 16106
o224["141"] = o9;
// 16107
o9.getAttributeNode = f974244559_519;
// undefined
o9 = null;
// 16109
f974244559_519.returns.push(null);
// 16111
o9 = {};
// 16112
o224["142"] = o9;
// 16113
o9.getAttributeNode = f974244559_519;
// undefined
o9 = null;
// 16115
f974244559_519.returns.push(null);
// 16117
o224["143"] = o86;
// 16118
o86.getAttributeNode = f974244559_519;
// undefined
o86 = null;
// 16120
o9 = {};
// 16121
f974244559_519.returns.push(o9);
// 16122
o9.value = "u_0_5";
// undefined
o9 = null;
// 16124
o224["144"] = o88;
// 16125
o88.getAttributeNode = f974244559_519;
// undefined
o88 = null;
// 16127
f974244559_519.returns.push(null);
// 16129
o224["145"] = o89;
// 16130
o89.getAttributeNode = f974244559_519;
// undefined
o89 = null;
// 16132
f974244559_519.returns.push(null);
// 16134
o224["146"] = o90;
// 16135
o90.getAttributeNode = f974244559_519;
// undefined
o90 = null;
// 16137
f974244559_519.returns.push(null);
// 16139
o224["147"] = o168;
// 16140
o168.getAttributeNode = f974244559_519;
// undefined
o168 = null;
// 16142
o9 = {};
// 16143
f974244559_519.returns.push(o9);
// 16144
o9.value = "fbNotificationsList";
// undefined
o9 = null;
// 16146
o224["148"] = o172;
// 16147
o172.getAttributeNode = f974244559_519;
// undefined
o172 = null;
// 16149
o9 = {};
// 16150
f974244559_519.returns.push(o9);
// 16151
o9.value = "fbNotificationsList_loading_indicator";
// undefined
o9 = null;
// 16153
o9 = {};
// 16154
o224["149"] = o9;
// 16155
o9.getAttributeNode = f974244559_519;
// undefined
o9 = null;
// 16157
f974244559_519.returns.push(null);
// 16159
o224["150"] = o198;
// 16160
o198.getAttributeNode = f974244559_519;
// undefined
o198 = null;
// 16162
f974244559_519.returns.push(null);
// 16164
o224["151"] = o197;
// 16165
o197.getAttributeNode = f974244559_519;
// undefined
o197 = null;
// 16167
f974244559_519.returns.push(null);
// 16169
o224["152"] = o199;
// 16170
o199.getAttributeNode = f974244559_519;
// undefined
o199 = null;
// 16172
f974244559_519.returns.push(null);
// 16174
o9 = {};
// 16175
o224["153"] = o9;
// 16176
o9.getAttributeNode = f974244559_519;
// undefined
o9 = null;
// 16178
f974244559_519.returns.push(null);
// 16180
o9 = {};
// 16181
o224["154"] = o9;
// 16182
o9.getAttributeNode = f974244559_519;
// undefined
o9 = null;
// 16184
f974244559_519.returns.push(null);
// 16186
o9 = {};
// 16187
o224["155"] = o9;
// 16188
o9.getAttributeNode = f974244559_519;
// undefined
o9 = null;
// 16190
f974244559_519.returns.push(null);
// 16192
o224["156"] = o91;
// 16193
o91.getAttributeNode = f974244559_519;
// undefined
o91 = null;
// 16195
f974244559_519.returns.push(null);
// 16197
o224["157"] = o92;
// 16198
o92.getAttributeNode = f974244559_519;
// undefined
o92 = null;
// 16200
f974244559_519.returns.push(null);
// 16202
o9 = {};
// 16203
o224["158"] = o9;
// 16204
o9.getAttributeNode = f974244559_519;
// undefined
o9 = null;
// 16206
o9 = {};
// 16207
f974244559_519.returns.push(o9);
// 16208
o9.value = "jewelNotice";
// undefined
o9 = null;
// 16210
o224["159"] = o188;
// 16211
o188.getAttributeNode = f974244559_519;
// undefined
o188 = null;
// 16213
f974244559_519.returns.push(null);
// 16215
o9 = {};
// 16216
o224["160"] = o9;
// 16217
o9.getAttributeNode = f974244559_519;
// undefined
o9 = null;
// 16219
f974244559_519.returns.push(null);
// 16221
o9 = {};
// 16222
o224["161"] = o9;
// 16223
o9.getAttributeNode = f974244559_519;
// undefined
o9 = null;
// 16225
f974244559_519.returns.push(null);
// 16227
o9 = {};
// 16228
o224["162"] = o9;
// 16229
o9.getAttributeNode = f974244559_519;
// 16231
o10 = {};
// 16232
f974244559_519.returns.push(o10);
// 16233
o10.value = "headNav";
// undefined
o10 = null;
// 16235
o10 = {};
// 16236
o224["163"] = o10;
// 16237
o10.getAttributeNode = f974244559_519;
// undefined
o10 = null;
// 16239
f974244559_519.returns.push(null);
// 16241
o10 = {};
// 16242
o224["164"] = o10;
// 16243
o10.getAttributeNode = f974244559_519;
// undefined
o10 = null;
// 16245
o10 = {};
// 16246
f974244559_519.returns.push(o10);
// 16247
o10.value = "navSearch";
// undefined
o10 = null;
// 16249
o224["165"] = o161;
// 16250
o161.getAttributeNode = f974244559_519;
// undefined
o161 = null;
// 16252
o10 = {};
// 16253
f974244559_519.returns.push(o10);
// 16254
o10.value = "u_0_2";
// undefined
o10 = null;
// 16256
o10 = {};
// 16257
o224["166"] = o10;
// 16258
o10.getAttributeNode = f974244559_519;
// undefined
o10 = null;
// 16260
f974244559_519.returns.push(null);
// 16262
o10 = {};
// 16263
o224["167"] = o10;
// 16264
o10.getAttributeNode = f974244559_519;
// undefined
o10 = null;
// 16266
f974244559_519.returns.push(null);
// 16268
o10 = {};
// 16269
o224["168"] = o10;
// 16270
o10.getAttributeNode = f974244559_519;
// undefined
o10 = null;
// 16272
f974244559_519.returns.push(null);
// 16274
o224["169"] = o159;
// 16275
o159.getAttributeNode = f974244559_519;
// undefined
o159 = null;
// 16277
o10 = {};
// 16278
f974244559_519.returns.push(o10);
// 16279
o10.value = "u_0_3";
// undefined
o10 = null;
// 16281
o10 = {};
// 16282
o224["170"] = o10;
// 16283
o10.getAttributeNode = f974244559_519;
// undefined
o10 = null;
// 16285
f974244559_519.returns.push(null);
// 16287
o10 = {};
// 16288
o224["171"] = o10;
// 16289
o10.getAttributeNode = f974244559_519;
// undefined
o10 = null;
// 16291
f974244559_519.returns.push(null);
// 16293
o10 = {};
// 16294
o224["172"] = o10;
// 16295
o10.getAttributeNode = f974244559_519;
// undefined
o10 = null;
// 16297
f974244559_519.returns.push(null);
// 16299
o224["173"] = o163;
// 16300
o163.getAttributeNode = f974244559_519;
// undefined
o163 = null;
// 16302
o10 = {};
// 16303
f974244559_519.returns.push(o10);
// 16304
o10.value = "q";
// undefined
o10 = null;
// 16306
o10 = {};
// 16307
o224["174"] = o10;
// 16308
o10.getAttributeNode = f974244559_519;
// undefined
o10 = null;
// 16310
f974244559_519.returns.push(null);
// 16312
o10 = {};
// 16313
o224["175"] = o10;
// 16314
o10.getAttributeNode = f974244559_519;
// undefined
o10 = null;
// 16316
f974244559_519.returns.push(null);
// 16318
o10 = {};
// 16319
o224["176"] = o10;
// 16320
o10.getAttributeNode = f974244559_519;
// undefined
o10 = null;
// 16322
f974244559_519.returns.push(null);
// 16324
o10 = {};
// 16325
o224["177"] = o10;
// 16326
o10.getAttributeNode = f974244559_519;
// undefined
o10 = null;
// 16328
o10 = {};
// 16329
f974244559_519.returns.push(o10);
// 16330
o10.value = "u_0_0";
// undefined
o10 = null;
// 16332
o10 = {};
// 16333
o224["178"] = o10;
// 16334
o10.getAttributeNode = f974244559_519;
// undefined
o10 = null;
// 16336
o10 = {};
// 16337
f974244559_519.returns.push(o10);
// 16338
o10.value = "init";
// undefined
o10 = null;
// 16340
o10 = {};
// 16341
o224["179"] = o10;
// 16342
o10.getAttributeNode = f974244559_519;
// undefined
o10 = null;
// 16344
f974244559_519.returns.push(null);
// 16346
o10 = {};
// 16347
o224["180"] = o10;
// 16348
o10.getAttributeNode = f974244559_519;
// undefined
o10 = null;
// 16350
o10 = {};
// 16351
f974244559_519.returns.push(o10);
// 16352
o10.value = "search_first_focus";
// undefined
o10 = null;
// 16354
o10 = {};
// 16355
o224["181"] = o10;
// 16356
o10.getAttributeNode = f974244559_519;
// 16358
f974244559_519.returns.push(null);
// 16360
o11 = {};
// 16361
o224["182"] = o11;
// 16362
o11.getAttributeNode = f974244559_519;
// 16364
o12 = {};
// 16365
f974244559_519.returns.push(o12);
// 16366
o12.value = "pageNav";
// undefined
o12 = null;
// 16368
o12 = {};
// 16369
o224["183"] = o12;
// 16370
o12.getAttributeNode = f974244559_519;
// undefined
o12 = null;
// 16372
f974244559_519.returns.push(null);
// 16374
o12 = {};
// 16375
o224["184"] = o12;
// 16376
o12.getAttributeNode = f974244559_519;
// undefined
o12 = null;
// 16378
f974244559_519.returns.push(null);
// 16380
o12 = {};
// 16381
o224["185"] = o12;
// 16382
o12.getAttributeNode = f974244559_519;
// undefined
o12 = null;
// 16384
o12 = {};
// 16385
f974244559_519.returns.push(o12);
// 16386
o12.value = "profile_pic_header_100006118350059";
// undefined
o12 = null;
// 16388
o12 = {};
// 16389
o224["186"] = o12;
// 16390
o12.getAttributeNode = f974244559_519;
// undefined
o12 = null;
// 16392
f974244559_519.returns.push(null);
// 16394
o12 = {};
// 16395
o224["187"] = o12;
// 16396
o12.getAttributeNode = f974244559_519;
// undefined
o12 = null;
// 16398
f974244559_519.returns.push(null);
// 16400
o12 = {};
// 16401
o224["188"] = o12;
// 16402
o12.getAttributeNode = f974244559_519;
// undefined
o12 = null;
// 16404
f974244559_519.returns.push(null);
// 16406
o12 = {};
// 16407
o224["189"] = o12;
// 16408
o12.getAttributeNode = f974244559_519;
// undefined
o12 = null;
// 16410
f974244559_519.returns.push(null);
// 16412
o12 = {};
// 16413
o224["190"] = o12;
// 16414
o12.getAttributeNode = f974244559_519;
// undefined
o12 = null;
// 16416
f974244559_519.returns.push(null);
// 16418
o12 = {};
// 16419
o224["191"] = o12;
// 16420
o12.getAttributeNode = f974244559_519;
// undefined
o12 = null;
// 16422
o12 = {};
// 16423
f974244559_519.returns.push(o12);
// 16424
o12.value = "navFindFriends";
// undefined
o12 = null;
// 16426
o12 = {};
// 16427
o224["192"] = o12;
// 16428
o12.getAttributeNode = f974244559_519;
// undefined
o12 = null;
// 16430
o12 = {};
// 16431
f974244559_519.returns.push(o12);
// 16432
o12.value = "findFriendsNav";
// undefined
o12 = null;
// 16434
o12 = {};
// 16435
o224["193"] = o12;
// 16436
o12.getAttributeNode = f974244559_519;
// undefined
o12 = null;
// 16438
o12 = {};
// 16439
f974244559_519.returns.push(o12);
// 16440
o12.value = "navHome";
// undefined
o12 = null;
// 16442
o12 = {};
// 16443
o224["194"] = o12;
// 16444
o12.getAttributeNode = f974244559_519;
// undefined
o12 = null;
// 16446
f974244559_519.returns.push(null);
// 16448
o12 = {};
// 16449
o224["195"] = o12;
// 16450
o12.getAttributeNode = f974244559_519;
// undefined
o12 = null;
// 16452
o12 = {};
// 16453
f974244559_519.returns.push(o12);
// 16454
o12.value = "navPrivacy";
// undefined
o12 = null;
// 16456
o224["196"] = o150;
// 16457
o150.getAttributeNode = f974244559_519;
// undefined
o150 = null;
// 16459
o12 = {};
// 16460
f974244559_519.returns.push(o12);
// 16461
o12.value = "u_0_8";
// undefined
o12 = null;
// 16463
o12 = {};
// 16464
o224["197"] = o12;
// 16465
o12.getAttributeNode = f974244559_519;
// undefined
o12 = null;
// 16467
o12 = {};
// 16468
f974244559_519.returns.push(o12);
// 16469
o12.value = "u_0_6";
// undefined
o12 = null;
// 16471
o12 = {};
// 16472
o224["198"] = o12;
// 16473
o12.getAttributeNode = f974244559_519;
// undefined
o12 = null;
// 16475
o12 = {};
// 16476
f974244559_519.returns.push(o12);
// 16477
o12.value = "privacyFlyoutLabel";
// undefined
o12 = null;
// 16479
o12 = {};
// 16480
o224["199"] = o12;
// 16481
o12.getAttributeNode = f974244559_519;
// undefined
o12 = null;
// 16483
f974244559_519.returns.push(null);
// 16485
o224["200"] = o149;
// 16486
o149.getAttributeNode = f974244559_519;
// undefined
o149 = null;
// 16488
o12 = {};
// 16489
f974244559_519.returns.push(o12);
// 16490
o12.value = "u_0_7";
// undefined
o12 = null;
// 16492
o12 = {};
// 16493
o224["201"] = o12;
// 16494
o12.getAttributeNode = f974244559_519;
// undefined
o12 = null;
// 16496
f974244559_519.returns.push(null);
// 16498
o12 = {};
// 16499
o224["202"] = o12;
// 16500
o12.getAttributeNode = f974244559_519;
// undefined
o12 = null;
// 16502
f974244559_519.returns.push(null);
// 16504
o12 = {};
// 16505
o224["203"] = o12;
// 16506
o12.getAttributeNode = f974244559_519;
// undefined
o12 = null;
// 16508
f974244559_519.returns.push(null);
// 16510
o12 = {};
// 16511
o224["204"] = o12;
// 16512
o12.getAttributeNode = f974244559_519;
// undefined
o12 = null;
// 16514
f974244559_519.returns.push(null);
// 16516
o12 = {};
// 16517
o224["205"] = o12;
// 16518
o12.getAttributeNode = f974244559_519;
// undefined
o12 = null;
// 16520
f974244559_519.returns.push(null);
// 16522
o12 = {};
// 16523
o224["206"] = o12;
// 16524
o12.getAttributeNode = f974244559_519;
// undefined
o12 = null;
// 16526
f974244559_519.returns.push(null);
// 16528
o12 = {};
// 16529
o224["207"] = o12;
// 16530
o12.getAttributeNode = f974244559_519;
// undefined
o12 = null;
// 16532
f974244559_519.returns.push(null);
// 16534
o224["208"] = o160;
// 16535
o160.getAttributeNode = f974244559_519;
// undefined
o160 = null;
// 16537
f974244559_519.returns.push(null);
// 16539
o12 = {};
// 16540
o224["209"] = o12;
// 16541
o12.getAttributeNode = f974244559_519;
// undefined
o12 = null;
// 16543
f974244559_519.returns.push(null);
// 16545
o12 = {};
// 16546
o224["210"] = o12;
// 16547
o12.getAttributeNode = f974244559_519;
// undefined
o12 = null;
// 16549
f974244559_519.returns.push(null);
// 16551
o12 = {};
// 16552
o224["211"] = o12;
// 16553
o12.getAttributeNode = f974244559_519;
// undefined
o12 = null;
// 16555
f974244559_519.returns.push(null);
// 16557
o12 = {};
// 16558
o224["212"] = o12;
// 16559
o12.getAttributeNode = f974244559_519;
// undefined
o12 = null;
// 16561
f974244559_519.returns.push(null);
// 16563
o12 = {};
// 16564
o224["213"] = o12;
// 16565
o12.getAttributeNode = f974244559_519;
// undefined
o12 = null;
// 16567
o12 = {};
// 16568
f974244559_519.returns.push(o12);
// 16569
o12.value = "fbPrivacyLiteFlyoutLoading";
// undefined
o12 = null;
// 16571
o12 = {};
// 16572
o224["214"] = o12;
// 16573
o12.getAttributeNode = f974244559_519;
// undefined
o12 = null;
// 16575
f974244559_519.returns.push(null);
// 16577
o12 = {};
// 16578
o224["215"] = o12;
// 16579
o12.getAttributeNode = f974244559_519;
// undefined
o12 = null;
// 16581
f974244559_519.returns.push(null);
// 16583
o224["216"] = o158;
// 16584
o158.getAttributeNode = f974244559_519;
// undefined
o158 = null;
// 16586
f974244559_519.returns.push(null);
// 16588
o224["217"] = o156;
// 16589
o156.getAttributeNode = f974244559_519;
// undefined
o156 = null;
// 16591
f974244559_519.returns.push(null);
// 16593
o224["218"] = o155;
// 16594
o155.getAttributeNode = f974244559_519;
// undefined
o155 = null;
// 16596
o12 = {};
// 16597
f974244559_519.returns.push(o12);
// 16598
o12.value = "u_0_9";
// undefined
o12 = null;
// 16600
o12 = {};
// 16601
o224["219"] = o12;
// 16602
o12.getAttributeNode = f974244559_519;
// undefined
o12 = null;
// 16604
f974244559_519.returns.push(null);
// 16606
o224["220"] = o152;
// 16607
o152.getAttributeNode = f974244559_519;
// undefined
o152 = null;
// 16609
o12 = {};
// 16610
f974244559_519.returns.push(o12);
// 16611
o12.value = "u_0_a";
// undefined
o12 = null;
// 16613
o12 = {};
// 16614
o224["221"] = o12;
// 16615
o12.getAttributeNode = f974244559_519;
// undefined
o12 = null;
// 16617
f974244559_519.returns.push(null);
// 16619
o224["222"] = o157;
// 16620
o157.getAttributeNode = f974244559_519;
// undefined
o157 = null;
// 16622
f974244559_519.returns.push(null);
// 16624
o12 = {};
// 16625
o224["223"] = o12;
// 16626
o12.getAttributeNode = f974244559_519;
// undefined
o12 = null;
// 16628
f974244559_519.returns.push(null);
// 16630
o12 = {};
// 16631
o224["224"] = o12;
// 16632
o12.getAttributeNode = f974244559_519;
// undefined
o12 = null;
// 16634
f974244559_519.returns.push(null);
// 16636
o224["225"] = o154;
// 16637
o154.getAttributeNode = f974244559_519;
// undefined
o154 = null;
// 16639
o12 = {};
// 16640
f974244559_519.returns.push(o12);
// 16641
o12.value = "u_0_b";
// undefined
o12 = null;
// 16643
o12 = {};
// 16644
o224["226"] = o12;
// 16645
o12.getAttributeNode = f974244559_519;
// undefined
o12 = null;
// 16647
f974244559_519.returns.push(null);
// 16649
o224["227"] = o153;
// 16650
o153.getAttributeNode = f974244559_519;
// undefined
o153 = null;
// 16652
o12 = {};
// 16653
f974244559_519.returns.push(o12);
// 16654
o12.value = "u_0_c";
// undefined
o12 = null;
// 16656
o224["228"] = o151;
// 16657
o151.getAttributeNode = f974244559_519;
// undefined
o151 = null;
// 16659
o12 = {};
// 16660
f974244559_519.returns.push(o12);
// 16661
o12.value = "u_0_d";
// undefined
o12 = null;
// 16663
o12 = {};
// 16664
o224["229"] = o12;
// 16665
o12.getAttributeNode = f974244559_519;
// undefined
o12 = null;
// 16667
f974244559_519.returns.push(null);
// 16669
o12 = {};
// 16670
o224["230"] = o12;
// 16671
o12.getAttributeNode = f974244559_519;
// undefined
o12 = null;
// 16673
f974244559_519.returns.push(null);
// 16675
o12 = {};
// 16676
o224["231"] = o12;
// 16677
o12.getAttributeNode = f974244559_519;
// undefined
o12 = null;
// 16679
f974244559_519.returns.push(null);
// 16681
o12 = {};
// 16682
o224["232"] = o12;
// 16683
o12.getAttributeNode = f974244559_519;
// undefined
o12 = null;
// 16685
f974244559_519.returns.push(null);
// 16687
o224["233"] = o147;
// 16688
o147.getAttributeNode = f974244559_519;
// 16690
o12 = {};
// 16691
f974244559_519.returns.push(o12);
// 16692
o12.value = "u_0_e";
// undefined
o12 = null;
// 16694
o12 = {};
// 16695
o224["234"] = o12;
// 16696
o12.getAttributeNode = f974244559_519;
// 16698
o14 = {};
// 16699
f974244559_519.returns.push(o14);
// 16700
o14.value = "navAccount";
// undefined
o14 = null;
// 16702
o14 = {};
// 16703
o224["235"] = o14;
// 16704
o14.getAttributeNode = f974244559_519;
// 16706
o15 = {};
// 16707
f974244559_519.returns.push(o15);
// 16708
o15.value = "navAccountLink";
// undefined
o15 = null;
// 16710
o15 = {};
// 16711
o224["236"] = o15;
// undefined
o224 = null;
// 16712
o15.getAttributeNode = f974244559_519;
// 16714
o16 = {};
// 16715
f974244559_519.returns.push(o16);
// 16716
o16.value = "userNavigationLabel";
// undefined
o16 = null;
// 16718
o16 = {};
// 16719
o15.classList = o16;
// 16721
o16.contains = f974244559_1617;
// undefined
o16 = null;
// 16722
f974244559_1617.returns.push(false);
// 16723
o15.parentNode = o14;
// 16724
o16 = {};
// 16725
o14.classList = o16;
// 16727
o16.contains = f974244559_1617;
// undefined
o16 = null;
// 16728
f974244559_1617.returns.push(false);
// 16729
o14.parentNode = o12;
// undefined
o14 = null;
// 16730
o14 = {};
// 16731
o12.classList = o14;
// 16733
o14.contains = f974244559_1617;
// undefined
o14 = null;
// 16734
f974244559_1617.returns.push(false);
// 16735
o12.parentNode = o147;
// undefined
o12 = null;
// 16736
o12 = {};
// 16737
o147.classList = o12;
// 16739
o12.contains = f974244559_1617;
// undefined
o12 = null;
// 16740
f974244559_1617.returns.push(false);
// 16741
o147.parentNode = o11;
// undefined
o147 = null;
// 16742
o12 = {};
// 16743
o11.classList = o12;
// 16745
o12.contains = f974244559_1617;
// undefined
o12 = null;
// 16746
f974244559_1617.returns.push(false);
// 16747
o11.parentNode = o10;
// undefined
o11 = null;
// 16748
o11 = {};
// 16749
o10.classList = o11;
// 16751
o11.contains = f974244559_1617;
// undefined
o11 = null;
// 16752
f974244559_1617.returns.push(false);
// 16753
o10.parentNode = o9;
// undefined
o10 = null;
// 16754
o10 = {};
// 16755
o9.classList = o10;
// 16757
o10.contains = f974244559_1617;
// undefined
o10 = null;
// 16758
f974244559_1617.returns.push(false);
// 16759
o9.parentNode = o192;
// undefined
o9 = null;
// undefined
o192 = null;
// 16763
f974244559_1617.returns.push(false);
// 16768
f974244559_1617.returns.push(false);
// 16773
f974244559_1617.returns.push(false);
// 16778
f974244559_1617.returns.push(false);
// 16783
f974244559_1617.returns.push(false);
// 16788
f974244559_1617.returns.push(false);
// 16793
f974244559_1617.returns.push(false);
// 16799
o223.__html = void 0;
// 16801
o9 = {};
// 16802
f974244559_478.returns.push(o9);
// 16805
f974244559_482.returns.push(o9);
// undefined
o9 = null;
// 16809
f974244559_702.returns.push(true);
// 16810
o9 = {};
// 16811
f974244559_4.returns.push(o9);
// 16812
o9.getPropertyValue = f974244559_1881;
// undefined
o9 = null;
// 16813
f974244559_1881.returns.push("static");
// 16818
f974244559_702.returns.push(true);
// 16819
o9 = {};
// 16820
f974244559_4.returns.push(o9);
// 16821
o9.getPropertyValue = f974244559_1881;
// undefined
o9 = null;
// 16822
f974244559_1881.returns.push("relative");
// 16827
f974244559_702.returns.push(true);
// 16828
o9 = {};
// 16829
f974244559_4.returns.push(o9);
// 16830
o9.getPropertyValue = f974244559_1881;
// undefined
o9 = null;
// 16831
f974244559_1881.returns.push("relative");
// 16836
f974244559_702.returns.push(true);
// 16837
o9 = {};
// 16838
f974244559_4.returns.push(o9);
// 16839
o9.getPropertyValue = f974244559_1881;
// undefined
o9 = null;
// 16840
f974244559_1881.returns.push("static");
// 16845
f974244559_702.returns.push(true);
// 16846
o9 = {};
// 16847
f974244559_4.returns.push(o9);
// 16848
o9.getPropertyValue = f974244559_1881;
// undefined
o9 = null;
// 16849
f974244559_1881.returns.push("static");
// 16854
f974244559_702.returns.push(true);
// 16855
o9 = {};
// 16856
f974244559_4.returns.push(o9);
// 16857
o9.getPropertyValue = f974244559_1881;
// undefined
o9 = null;
// 16858
f974244559_1881.returns.push("static");
// 16863
f974244559_702.returns.push(true);
// 16864
o9 = {};
// 16865
f974244559_4.returns.push(o9);
// 16866
o9.getPropertyValue = f974244559_1881;
// undefined
o9 = null;
// 16867
f974244559_1881.returns.push("static");
// 16872
f974244559_702.returns.push(true);
// 16873
o9 = {};
// 16874
f974244559_4.returns.push(o9);
// 16875
o9.getPropertyValue = f974244559_1881;
// undefined
o9 = null;
// 16876
f974244559_1881.returns.push("static");
// 16881
f974244559_702.returns.push(true);
// 16882
o9 = {};
// 16883
f974244559_4.returns.push(o9);
// 16884
o9.getPropertyValue = f974244559_1881;
// undefined
o9 = null;
// 16885
f974244559_1881.returns.push("fixed");
// 16889
f974244559_1617.returns.push(false);
// 16894
f974244559_1617.returns.push(false);
// 16899
f974244559_1617.returns.push(false);
// 16904
f974244559_1617.returns.push(false);
// 16909
f974244559_1617.returns.push(false);
// 16914
f974244559_1617.returns.push(false);
// 16919
f974244559_1617.returns.push(false);
// 16924
f974244559_1617.returns.push(false);
// 16929
f974244559_1617.returns.push(false);
// 16934
f974244559_1617.returns.push(false);
// 16939
f974244559_1617.returns.push(false);
// 16944
f974244559_1617.returns.push(false);
// 16949
f974244559_1617.returns.push(false);
// 16954
f974244559_1617.returns.push(false);
// 16961
o9 = {};
// 16962
f974244559_4.returns.push(o9);
// 16963
o9.getPropertyValue = f974244559_1881;
// undefined
o9 = null;
// 16964
f974244559_1881.returns.push("static");
// 16969
f974244559_702.returns.push(false);
// 16972
o9 = {};
// undefined
fo974244559_2174_style.returns.push(o9);
// 16974
// 16977
o10 = {};
// 16978
f974244559_4.returns.push(o10);
// 16979
o10.getPropertyValue = f974244559_1881;
// undefined
o10 = null;
// 16980
f974244559_1881.returns.push("hidden");
// 16981
o10 = {};
// 16982
f974244559_4.returns.push(o10);
// 16983
o10.getPropertyValue = f974244559_1881;
// undefined
o10 = null;
// 16984
f974244559_1881.returns.push("hidden");
// 16985
o10 = {};
// 16986
f974244559_4.returns.push(o10);
// 16987
o10.getPropertyValue = f974244559_1881;
// undefined
o10 = null;
// 16988
f974244559_1881.returns.push("hidden");
// 16991
o10 = {};
// 16992
f974244559_4.returns.push(o10);
// 16993
o10.getPropertyValue = f974244559_1881;
// undefined
o10 = null;
// 16994
f974244559_1881.returns.push("visible");
// 16995
o10 = {};
// 16996
f974244559_4.returns.push(o10);
// 16997
o10.getPropertyValue = f974244559_1881;
// undefined
o10 = null;
// 16998
f974244559_1881.returns.push("visible");
// 16999
o10 = {};
// 17000
f974244559_4.returns.push(o10);
// 17001
o10.getPropertyValue = f974244559_1881;
// undefined
o10 = null;
// 17002
f974244559_1881.returns.push("visible");
// 17005
o10 = {};
// 17006
f974244559_4.returns.push(o10);
// 17007
o10.getPropertyValue = f974244559_1881;
// undefined
o10 = null;
// 17008
f974244559_1881.returns.push("visible");
// 17009
o10 = {};
// 17010
f974244559_4.returns.push(o10);
// 17011
o10.getPropertyValue = f974244559_1881;
// undefined
o10 = null;
// 17012
f974244559_1881.returns.push("visible");
// 17013
o10 = {};
// 17014
f974244559_4.returns.push(o10);
// 17015
o10.getPropertyValue = f974244559_1881;
// undefined
o10 = null;
// 17016
f974244559_1881.returns.push("visible");
// 17019
o10 = {};
// 17020
f974244559_4.returns.push(o10);
// 17021
o10.getPropertyValue = f974244559_1881;
// undefined
o10 = null;
// 17022
f974244559_1881.returns.push("visible");
// 17023
o10 = {};
// 17024
f974244559_4.returns.push(o10);
// 17025
o10.getPropertyValue = f974244559_1881;
// undefined
o10 = null;
// 17026
f974244559_1881.returns.push("visible");
// 17027
o10 = {};
// 17028
f974244559_4.returns.push(o10);
// 17029
o10.getPropertyValue = f974244559_1881;
// undefined
o10 = null;
// 17030
f974244559_1881.returns.push("visible");
// 17033
o10 = {};
// 17034
f974244559_4.returns.push(o10);
// 17035
o10.getPropertyValue = f974244559_1881;
// undefined
o10 = null;
// 17036
f974244559_1881.returns.push("visible");
// 17037
o10 = {};
// 17038
f974244559_4.returns.push(o10);
// 17039
o10.getPropertyValue = f974244559_1881;
// undefined
o10 = null;
// 17040
f974244559_1881.returns.push("visible");
// 17041
o10 = {};
// 17042
f974244559_4.returns.push(o10);
// 17043
o10.getPropertyValue = f974244559_1881;
// undefined
o10 = null;
// 17044
f974244559_1881.returns.push("visible");
// 17047
o10 = {};
// 17048
f974244559_4.returns.push(o10);
// 17049
o10.getPropertyValue = f974244559_1881;
// undefined
o10 = null;
// 17050
f974244559_1881.returns.push("visible");
// 17051
o10 = {};
// 17052
f974244559_4.returns.push(o10);
// 17053
o10.getPropertyValue = f974244559_1881;
// undefined
o10 = null;
// 17054
f974244559_1881.returns.push("visible");
// 17055
o10 = {};
// 17056
f974244559_4.returns.push(o10);
// 17057
o10.getPropertyValue = f974244559_1881;
// undefined
o10 = null;
// 17058
f974244559_1881.returns.push("visible");
// 17061
o10 = {};
// 17062
f974244559_4.returns.push(o10);
// 17063
o10.getPropertyValue = f974244559_1881;
// undefined
o10 = null;
// 17064
f974244559_1881.returns.push("visible");
// 17065
o10 = {};
// 17066
f974244559_4.returns.push(o10);
// 17067
o10.getPropertyValue = f974244559_1881;
// undefined
o10 = null;
// 17068
f974244559_1881.returns.push("visible");
// 17069
o10 = {};
// 17070
f974244559_4.returns.push(o10);
// 17071
o10.getPropertyValue = f974244559_1881;
// undefined
o10 = null;
// 17072
f974244559_1881.returns.push("visible");
// 17075
o10 = {};
// 17076
f974244559_4.returns.push(o10);
// 17077
o10.getPropertyValue = f974244559_1881;
// undefined
o10 = null;
// 17078
f974244559_1881.returns.push("visible");
// 17079
o10 = {};
// 17080
f974244559_4.returns.push(o10);
// 17081
o10.getPropertyValue = f974244559_1881;
// undefined
o10 = null;
// 17082
f974244559_1881.returns.push("visible");
// 17083
o10 = {};
// 17084
f974244559_4.returns.push(o10);
// 17085
o10.getPropertyValue = f974244559_1881;
// undefined
o10 = null;
// 17086
f974244559_1881.returns.push("visible");
// 17089
o10 = {};
// 17090
f974244559_4.returns.push(o10);
// 17091
o10.getPropertyValue = f974244559_1881;
// undefined
o10 = null;
// 17092
f974244559_1881.returns.push("visible");
// 17093
o10 = {};
// 17094
f974244559_4.returns.push(o10);
// 17095
o10.getPropertyValue = f974244559_1881;
// undefined
o10 = null;
// 17096
f974244559_1881.returns.push("visible");
// 17097
o10 = {};
// 17098
f974244559_4.returns.push(o10);
// 17099
o10.getPropertyValue = f974244559_1881;
// undefined
o10 = null;
// 17100
f974244559_1881.returns.push("visible");
// 17103
o10 = {};
// 17104
f974244559_4.returns.push(o10);
// 17105
o10.getPropertyValue = f974244559_1881;
// undefined
o10 = null;
// 17106
f974244559_1881.returns.push("visible");
// 17107
o10 = {};
// 17108
f974244559_4.returns.push(o10);
// 17109
o10.getPropertyValue = f974244559_1881;
// undefined
o10 = null;
// 17110
f974244559_1881.returns.push("visible");
// 17111
o10 = {};
// 17112
f974244559_4.returns.push(o10);
// 17113
o10.getPropertyValue = f974244559_1881;
// undefined
o10 = null;
// 17114
f974244559_1881.returns.push("visible");
// 17117
o10 = {};
// 17118
f974244559_4.returns.push(o10);
// 17119
o10.getPropertyValue = f974244559_1881;
// undefined
o10 = null;
// 17120
f974244559_1881.returns.push("visible");
// 17121
o10 = {};
// 17122
f974244559_4.returns.push(o10);
// 17123
o10.getPropertyValue = f974244559_1881;
// undefined
o10 = null;
// 17124
f974244559_1881.returns.push("visible");
// 17125
o10 = {};
// 17126
f974244559_4.returns.push(o10);
// 17127
o10.getPropertyValue = f974244559_1881;
// undefined
o10 = null;
// 17128
f974244559_1881.returns.push("visible");
// 17131
o10 = {};
// 17132
f974244559_4.returns.push(o10);
// 17133
o10.getPropertyValue = f974244559_1881;
// undefined
o10 = null;
// 17134
f974244559_1881.returns.push("visible");
// 17135
o10 = {};
// 17136
f974244559_4.returns.push(o10);
// 17137
o10.getPropertyValue = f974244559_1881;
// undefined
o10 = null;
// 17138
f974244559_1881.returns.push("visible");
// 17139
o10 = {};
// 17140
f974244559_4.returns.push(o10);
// 17141
o10.getPropertyValue = f974244559_1881;
// undefined
o10 = null;
// 17142
f974244559_1881.returns.push("visible");
// 17146
f974244559_502.returns.push(o75);
// 17147
o75.contains = f974244559_702;
// 17149
f974244559_702.returns.push(false);
// 17163
o10 = {};
// 17164
f974244559_4.returns.push(o10);
// 17165
o10.getPropertyValue = f974244559_1881;
// undefined
o10 = null;
// 17166
f974244559_1881.returns.push("static");
// 17167
o10 = {};
// 17168
f974244559_4.returns.push(o10);
// 17169
o10.getPropertyValue = f974244559_1881;
// undefined
o10 = null;
// 17170
f974244559_1881.returns.push("static");
// 17171
o10 = {};
// 17172
f974244559_4.returns.push(o10);
// 17173
o10.getPropertyValue = f974244559_1881;
// undefined
o10 = null;
// 17174
f974244559_1881.returns.push("static");
// 17175
o10 = {};
// 17176
f974244559_4.returns.push(o10);
// 17177
o10.getPropertyValue = f974244559_1881;
// undefined
o10 = null;
// 17178
f974244559_1881.returns.push("fixed");
// 17179
o10 = {};
// 17180
f974244559_4.returns.push(o10);
// 17181
o10.getPropertyValue = f974244559_1881;
// undefined
o10 = null;
// 17182
f974244559_1881.returns.push("300");
// 17184
o25.scrollLeft = 0;
// 17185
o25.scrollTop = 1239;
// 17191
f974244559_702.returns.push(true);
// 17192
o15.getBoundingClientRect = f974244559_1882;
// 17193
o10 = {};
// 17194
f974244559_1882.returns.push(o10);
// 17195
o10.left = 990.5;
// 17197
o10.JSBNG__top = 6;
// undefined
o10 = null;
// 17199
o15.offsetWidth = 24;
// 17200
o15.offsetHeight = 31;
// 17201
o10 = {};
// 17202
o222.classList = o10;
// 17204
o10.add = f974244559_1110;
// 17205
f974244559_1110.returns.push(undefined);
// 17206
o220.offsetWidth = 0;
// 17207
o220.offsetHeight = 0;
// undefined
o220 = null;
// 17210
o10.remove = f974244559_1244;
// undefined
o10 = null;
// 17211
f974244559_1244.returns.push(undefined);
// 17213
o10 = {};
// 17214
f974244559_4.returns.push(o10);
// 17215
o10.getPropertyValue = f974244559_1881;
// undefined
o10 = null;
// 17216
f974244559_1881.returns.push("ltr");
// 17224
f974244559_1110.returns.push(undefined);
// 17228
f974244559_1244.returns.push(undefined);
// 17232
f974244559_1244.returns.push(undefined);
// 17236
f974244559_1244.returns.push(undefined);
// 17238
o10 = {};
// 17239
f974244559_480.returns.push(o10);
// 17240
// 17241
o10.__html = void 0;
// 17243
o11 = {};
// 17244
f974244559_478.returns.push(o11);
// 17247
f974244559_482.returns.push(o11);
// undefined
o11 = null;
// 17251
f974244559_1110.returns.push(undefined);
// 17252
o11 = {};
// 17253
o10.style = o11;
// undefined
o10 = null;
// 17254
// 17256
// 17258
// 17260
// 17262
// 17264
// 17265
o10 = {};
// undefined
fo974244559_2172_style.returns.push(o10);
// 17267
// undefined
fo974244559_2172_style.returns.push(o10);
// 17269
// 17273
f974244559_1110.returns.push(undefined);
// 17277
f974244559_1110.returns.push(undefined);
// 17285
f974244559_702.returns.push(true);
// 17287
o12 = {};
// 17288
f974244559_1882.returns.push(o12);
// 17289
o12.left = 990.5;
// 17291
o12.JSBNG__top = 6;
// undefined
o12 = null;
// undefined
fo974244559_2174_style.returns.push(o9);
// 17296
// undefined
fo974244559_2174_style.returns.push(o9);
// 17298
// 17302
f974244559_1617.returns.push(false);
// 17307
f974244559_1617.returns.push(false);
// 17312
f974244559_1617.returns.push(false);
// 17317
f974244559_1617.returns.push(false);
// 17322
f974244559_1617.returns.push(false);
// 17327
f974244559_1617.returns.push(false);
// 17332
f974244559_1617.returns.push(false);
// 17337
f974244559_1617.returns.push(false);
// 17342
f974244559_1617.returns.push(false);
// 17347
f974244559_1617.returns.push(false);
// 17352
f974244559_1617.returns.push(false);
// 17357
f974244559_1617.returns.push(false);
// 17362
f974244559_1617.returns.push(false);
// 17367
f974244559_1617.returns.push(false);
// 17379
f974244559_702.returns.push(false);
// 17383
o223.offsetWidth = 0;
// undefined
fo974244559_2174_style.returns.push(o9);
// 17385
// undefined
fo974244559_2174_style.returns.push(o9);
// 17387
// 17391
f974244559_1617.returns.push(false);
// 17396
f974244559_1617.returns.push(false);
// 17401
f974244559_1617.returns.push(false);
// 17406
f974244559_1617.returns.push(false);
// 17411
f974244559_1617.returns.push(false);
// 17416
f974244559_1617.returns.push(false);
// 17421
f974244559_1617.returns.push(false);
// 17426
f974244559_1617.returns.push(false);
// 17431
f974244559_1617.returns.push(false);
// 17436
f974244559_1617.returns.push(false);
// 17441
f974244559_1617.returns.push(false);
// 17446
f974244559_1617.returns.push(false);
// 17451
f974244559_1617.returns.push(false);
// 17456
f974244559_1617.returns.push(false);
// 17474
o12 = {};
// 17475
f974244559_4.returns.push(o12);
// 17476
o12.getPropertyValue = f974244559_1881;
// undefined
o12 = null;
// 17477
f974244559_1881.returns.push("static");
// 17478
o12 = {};
// 17479
f974244559_4.returns.push(o12);
// 17480
o12.getPropertyValue = f974244559_1881;
// undefined
o12 = null;
// 17481
f974244559_1881.returns.push("static");
// 17482
o12 = {};
// 17483
f974244559_4.returns.push(o12);
// 17484
o12.getPropertyValue = f974244559_1881;
// undefined
o12 = null;
// 17485
f974244559_1881.returns.push("static");
// 17486
o12 = {};
// 17487
f974244559_4.returns.push(o12);
// 17488
o12.getPropertyValue = f974244559_1881;
// undefined
o12 = null;
// 17489
f974244559_1881.returns.push("fixed");
// 17490
o12 = {};
// 17491
f974244559_4.returns.push(o12);
// 17492
o12.getPropertyValue = f974244559_1881;
// undefined
o12 = null;
// 17493
f974244559_1881.returns.push("300");
// undefined
fo974244559_2174_style.returns.push(o9);
// 17495
// 17500
o12 = {};
// 17501
f974244559_4.returns.push(o12);
// 17502
o12.getPropertyValue = f974244559_1881;
// undefined
o12 = null;
// 17503
f974244559_1881.returns.push("");
// undefined
fo974244559_2174_style.returns.push(o9);
// 17505
// 17513
f974244559_702.returns.push(true);
// 17514
o12 = {};
// 17515
f974244559_4.returns.push(o12);
// 17516
o12.getPropertyValue = f974244559_1881;
// undefined
o12 = null;
// 17517
f974244559_1881.returns.push("static");
// 17522
f974244559_702.returns.push(true);
// 17523
o12 = {};
// 17524
f974244559_4.returns.push(o12);
// 17525
o12.getPropertyValue = f974244559_1881;
// undefined
o12 = null;
// 17526
f974244559_1881.returns.push("relative");
// 17531
f974244559_702.returns.push(true);
// 17532
o12 = {};
// 17533
f974244559_4.returns.push(o12);
// 17534
o12.getPropertyValue = f974244559_1881;
// undefined
o12 = null;
// 17535
f974244559_1881.returns.push("relative");
// 17540
f974244559_702.returns.push(true);
// 17541
o12 = {};
// 17542
f974244559_4.returns.push(o12);
// 17543
o12.getPropertyValue = f974244559_1881;
// undefined
o12 = null;
// 17544
f974244559_1881.returns.push("static");
// 17549
f974244559_702.returns.push(true);
// 17550
o12 = {};
// 17551
f974244559_4.returns.push(o12);
// 17552
o12.getPropertyValue = f974244559_1881;
// undefined
o12 = null;
// 17553
f974244559_1881.returns.push("static");
// 17558
f974244559_702.returns.push(true);
// 17559
o12 = {};
// 17560
f974244559_4.returns.push(o12);
// 17561
o12.getPropertyValue = f974244559_1881;
// undefined
o12 = null;
// 17562
f974244559_1881.returns.push("static");
// 17567
f974244559_702.returns.push(true);
// 17568
o12 = {};
// 17569
f974244559_4.returns.push(o12);
// 17570
o12.getPropertyValue = f974244559_1881;
// undefined
o12 = null;
// 17571
f974244559_1881.returns.push("static");
// 17576
f974244559_702.returns.push(true);
// 17577
o12 = {};
// 17578
f974244559_4.returns.push(o12);
// 17579
o12.getPropertyValue = f974244559_1881;
// undefined
o12 = null;
// 17580
f974244559_1881.returns.push("static");
// 17585
f974244559_702.returns.push(true);
// 17586
o12 = {};
// 17587
f974244559_4.returns.push(o12);
// 17588
o12.getPropertyValue = f974244559_1881;
// undefined
o12 = null;
// 17589
f974244559_1881.returns.push("fixed");
// 17593
f974244559_1617.returns.push(false);
// 17598
f974244559_1617.returns.push(false);
// 17603
f974244559_1617.returns.push(false);
// 17608
f974244559_1617.returns.push(false);
// 17613
f974244559_1617.returns.push(false);
// 17618
f974244559_1617.returns.push(false);
// 17623
f974244559_1617.returns.push(false);
// 17628
f974244559_1617.returns.push(false);
// 17633
f974244559_1617.returns.push(false);
// 17638
f974244559_1617.returns.push(false);
// 17643
f974244559_1617.returns.push(false);
// 17648
f974244559_1617.returns.push(false);
// 17653
f974244559_1617.returns.push(false);
// 17658
f974244559_1617.returns.push(false);
// 17665
o12 = {};
// 17666
f974244559_4.returns.push(o12);
// 17667
o12.getPropertyValue = f974244559_1881;
// undefined
o12 = null;
// 17668
f974244559_1881.returns.push("static");
// 17673
f974244559_702.returns.push(false);
// 17676
f974244559_471.returns.push(1373491298985);
// 17677
f974244559_468.returns.push(5);
// 17679
f974244559_471.returns.push(1373491298986);
// 17680
f974244559_12.returns.push(61);
// 17682
f974244559_471.returns.push(1373491298986);
// 17684
f974244559_471.returns.push(1373491298986);
// undefined
fo974244559_2174_style.returns.push(o9);
// 17686
// 17690
f974244559_527.returns.push(false);
// 17694
f974244559_527.returns.push(false);
// 17698
f974244559_527.returns.push(false);
// 17702
f974244559_527.returns.push(false);
// 17706
f974244559_527.returns.push(false);
// 17710
f974244559_527.returns.push(false);
// 17714
f974244559_527.returns.push(false);
// 17718
f974244559_527.returns.push(false);
// 17722
f974244559_527.returns.push(false);
// 17723
f974244559_468.returns.push(6);
// 17725
o222.nodeName = "DIV";
// 17726
o222.__FB_TOKEN = void 0;
// 17727
// 17728
o222.getAttribute = f974244559_500;
// 17729
o222.hasAttribute = f974244559_527;
// 17731
f974244559_527.returns.push(false);
// 17732
o222.JSBNG__addEventListener = f974244559_472;
// 17734
f974244559_472.returns.push(undefined);
// 17735
o222.JSBNG__onmouseover = null;
// 17740
f974244559_472.returns.push(undefined);
// 17741
o222.JSBNG__onmouseout = null;
// 17744
f974244559_2178.returns.push("hide");
// 17745
f974244559_12.returns.push(62);
// undefined
fo974244559_2174_style.returns.push(o9);
// 17747
// undefined
fo974244559_2174_style.returns.push(o9);
// 17749
// 17751
o222.getElementsByTagName = f974244559_514;
// 17753
o222.querySelectorAll = f974244559_523;
// undefined
o222 = null;
// 17754
o12 = {};
// 17755
f974244559_523.returns.push(o12);
// 17756
o12.length = 0;
// undefined
o12 = null;
// 17758
o12 = {};
// 17759
f974244559_480.returns.push(o12);
// 17760
// 17761
// 17762
o12.firstChild = null;
// 17764
o14 = {};
// 17765
f974244559_478.returns.push(o14);
// 17767
o16 = {};
// 17768
f974244559_1659.returns.push(o16);
// 17769
o14.appendChild = f974244559_482;
// 17770
f974244559_482.returns.push(o16);
// undefined
o16 = null;
// 17771
o12.appendChild = f974244559_482;
// 17772
f974244559_482.returns.push(o14);
// undefined
o14 = null;
// 17773
o12.__html = void 0;
// 17775
o14 = {};
// 17776
f974244559_478.returns.push(o14);
// 17779
f974244559_482.returns.push(o14);
// undefined
o14 = null;
// 17780
o12.nodeName = "A";
// 17781
o12.__FB_TOKEN = void 0;
// 17782
// 17783
o12.getAttribute = f974244559_500;
// 17784
o12.hasAttribute = f974244559_527;
// 17786
f974244559_527.returns.push(false);
// 17787
o12.JSBNG__addEventListener = f974244559_472;
// 17789
f974244559_472.returns.push(undefined);
// 17790
o12.JSBNG__onclick = null;
// undefined
o12 = null;
// 17793
o223.getElementsByTagName = f974244559_514;
// 17795
o223.querySelectorAll = f974244559_523;
// 17796
o12 = {};
// 17797
f974244559_523.returns.push(o12);
// 17798
o12.length = 0;
// undefined
o12 = null;
// 17801
o12 = {};
// 17802
f974244559_514.returns.push(o12);
// 17803
o12.tabIndex = void 0;
// 17804
o12.tagName = void 0;
// undefined
o12 = null;
// 17805
// 17809
f974244559_1110.returns.push(undefined);
// 17813
f974244559_472.returns.push(undefined);
// 17814
o223.JSBNG__onJSBNG__blur = void 0;
// 17816
// 17817
o223.JSBNG__focus = f974244559_1628;
// 17818
f974244559_1628.returns.push(undefined);
// 17819
o223.setAttribute = f974244559_643;
// undefined
o223 = null;
// 17820
o15.id = "userNavigationLabel";
// undefined
o15 = null;
// 17821
f974244559_643.returns.push(undefined);
// 17822
f974244559_2468 = function() { return f974244559_2468.returns[f974244559_2468.inst++]; };
f974244559_2468.returns = [];
f974244559_2468.inst = 0;
// 17823
o200._handleJSRegisters = f974244559_2468;
// 17824
f974244559_2468.returns.push(undefined);
// 17825
o200.lid = void 0;
// 17827
f974244559_2468.returns.push(undefined);
// 17828
f974244559_2163.returns.push(undefined);
// 17829
o200.finallyHandler = f974244559_2110;
// 17830
f974244559_2110.returns.push(undefined);
// 17831
f974244559_2132.returns.push(undefined);
// 17834
f974244559_471.returns.push(1373491299007);
// undefined
fo974244559_2174_style.returns.push(o9);
// 17836
// 17837
f974244559_468.returns.push(7);
// 17840
f974244559_471.returns.push(1373491299007);
// undefined
fo974244559_2174_style.returns.push(o9);
// 17842
// 17843
f974244559_468.returns.push(8);
// 17844
o12 = {};
// 17847
o12.cancelBubble = false;
// 17850
f974244559_471.returns.push(1373491299011);
// 17852
o12.returnValue = true;
// undefined
o12 = null;
// 17854
o96.clearStatusIndicator = f974244559_2161;
// 17855
o96.getStatusElement = f974244559_2162;
// 17856
o96.statusElement = null;
// 17857
f974244559_2162.returns.push(null);
// 17858
f974244559_2161.returns.push(undefined);
// 17863
f974244559_2131.returns.push(true);
// 17864
f974244559_2470 = function() { return f974244559_2470.returns[f974244559_2470.inst++]; };
f974244559_2470.returns = [];
f974244559_2470.inst = 0;
// 17865
o96.initialHandler = f974244559_2470;
// 17866
f974244559_2470.returns.push(true);
// 17867
o96.timer = null;
// 17868
f974244559_14.returns.push(undefined);
// 17870
o96._handleJSResponse = f974244559_2163;
// 17871
o96.getRelativeTo = f974244559_2164;
// 17872
o96.relativeTo = null;
// 17873
f974244559_2164.returns.push(null);
// 17874
o96._handleJSRegisters = f974244559_2468;
// 17875
f974244559_2468.returns.push(undefined);
// 17876
o96.lid = void 0;
// 17878
f974244559_2468.returns.push(undefined);
// 17879
f974244559_2163.returns.push(undefined);
// 17880
f974244559_2471 = function() { return f974244559_2471.returns[f974244559_2471.inst++]; };
f974244559_2471.returns = [];
f974244559_2471.inst = 0;
// 17881
o96.finallyHandler = f974244559_2471;
// 17882
f974244559_2471.returns.push(undefined);
// 17883
f974244559_2132.returns.push(undefined);
// 17885
o122.clearStatusIndicator = f974244559_2161;
// 17886
o122.getStatusElement = f974244559_2162;
// 17887
o122.statusElement = null;
// 17888
f974244559_2162.returns.push(null);
// 17889
f974244559_2161.returns.push(undefined);
// 17894
f974244559_2131.returns.push(true);
// 17895
o122.initialHandler = f974244559_2110;
// 17896
f974244559_2110.returns.push(undefined);
// 17897
o122.timer = null;
// 17898
f974244559_14.returns.push(undefined);
// 17900
f974244559_2472 = function() { return f974244559_2472.returns[f974244559_2472.inst++]; };
f974244559_2472.returns = [];
f974244559_2472.inst = 0;
// 17901
o122._shouldSuppressJS = f974244559_2472;
// 17903
f974244559_2157.returns.push(undefined);
// 17904
f974244559_2472.returns.push(false);
// 17905
o122._handleJSResponse = f974244559_2163;
// 17906
o122.getRelativeTo = f974244559_2164;
// 17907
o122.relativeTo = null;
// 17908
f974244559_2164.returns.push(null);
// 17909
o122._handleJSRegisters = f974244559_2468;
// 17910
f974244559_2468.returns.push(undefined);
// 17911
o122.lid = void 0;
// 17913
f974244559_2468.returns.push(undefined);
// 17914
f974244559_2163.returns.push(undefined);
// 17915
o122.finallyHandler = f974244559_2110;
// 17916
f974244559_2110.returns.push(undefined);
// 17917
f974244559_2132.returns.push(undefined);
// 17918
o12 = {};
// 17920
o14 = {};
// 17921
o14._shown = true;
// undefined
o14 = null;
// 17927
f974244559_2178.returns.push("FriendRequest/cancel");
// 17928
f974244559_2178.returns.push("FriendRequest/unfriend");
// 17929
f974244559_2178.returns.push("FriendRequest/sendFail");
// 17931
f974244559_2178.returns.push("FriendRequest/confirmFail");
// 17933
f974244559_2178.returns.push("FriendRequest/cancelFail");
// 17934
f974244559_2178.returns.push("FriendRequest/sent");
// 17935
f974244559_2178.returns.push("FriendRequest/sending");
// 17937
f974244559_2178.returns.push("FriendRequest/confirm");
// 17938
f974244559_2178.returns.push("FriendRequest/confirming");
// 17943
f974244559_2178.returns.push("UnfollowUser");
// 17945
f974244559_2178.returns.push("UpdateSubscriptionLevel");
// 17947
f974244559_2178.returns.push("FriendRequest/change");
// 17949
f974244559_2178.returns.push("select");
// 17954
f974244559_471.returns.push(1373491299104);
// 17959
f974244559_471.returns.push(1373491299105);
// 17963
f974244559_471.returns.push(1373491299105);
// 17967
o14 = {};
// 17968
f974244559_502.returns.push(o14);
// 17969
o14.id = "u_0_3n";
// 17970
o14.getElementsByTagName = f974244559_514;
// 17972
o14.querySelectorAll = f974244559_523;
// undefined
o14 = null;
// 17973
o14 = {};
// 17974
f974244559_523.returns.push(o14);
// 17975
o14.length = 1;
// 17976
o15 = {};
// 17977
o14["0"] = o15;
// undefined
o14 = null;
// 17981
o14 = {};
// 17982
f974244559_523.returns.push(o14);
// 17983
o14.length = 0;
// undefined
o14 = null;
// 17987
o14 = {};
// 17988
f974244559_523.returns.push(o14);
// 17989
o14.length = 1;
// 17990
o16 = {};
// 17991
o14["0"] = o16;
// undefined
o14 = null;
// undefined
o16 = null;
// 17995
o14 = {};
// 17996
f974244559_523.returns.push(o14);
// 17997
o14.length = 0;
// undefined
o14 = null;
// 18001
o14 = {};
// 18002
f974244559_523.returns.push(o14);
// 18003
o14.length = 0;
// undefined
o14 = null;
// 18005
f974244559_2178.returns.push("FriendRequest/change");
// 18007
f974244559_2178.returns.push("FriendRequest/confirm");
// 18008
o15.nodeName = "LABEL";
// 18009
o15.getElementsByTagName = f974244559_514;
// undefined
o15 = null;
// 18010
o14 = {};
// 18011
f974244559_514.returns.push(o14);
// 18012
o14.length = 1;
// 18013
o15 = {};
// 18014
o14["0"] = o15;
// undefined
o14 = null;
// 18015
o15.__FB_TOKEN = void 0;
// 18016
// 18017
o15.getAttribute = f974244559_500;
// 18018
o15.hasAttribute = f974244559_527;
// 18020
f974244559_527.returns.push(false);
// 18021
o15.JSBNG__addEventListener = f974244559_472;
// 18023
f974244559_472.returns.push(undefined);
// 18024
o15.JSBNG__onclick = null;
// 18025
o15.nodeName = "INPUT";
// undefined
o15 = null;
// 18028
o14 = {};
// 18029
f974244559_502.returns.push(o14);
// 18030
o14.id = "u_0_q";
// 18031
o14.getElementsByTagName = f974244559_514;
// 18033
o14.querySelectorAll = f974244559_523;
// undefined
o14 = null;
// 18034
o14 = {};
// 18035
f974244559_523.returns.push(o14);
// 18036
o14.length = 1;
// 18037
o15 = {};
// 18038
o14["0"] = o15;
// undefined
o14 = null;
// 18042
o14 = {};
// 18043
f974244559_523.returns.push(o14);
// 18044
o14.length = 1;
// 18045
o16 = {};
// 18046
o14["0"] = o16;
// undefined
o14 = null;
// undefined
o16 = null;
// 18050
o14 = {};
// 18051
f974244559_523.returns.push(o14);
// 18052
o14.length = 1;
// 18053
o16 = {};
// 18054
o14["0"] = o16;
// undefined
o14 = null;
// undefined
o16 = null;
// 18058
o14 = {};
// 18059
f974244559_523.returns.push(o14);
// 18060
o14.length = 0;
// undefined
o14 = null;
// 18064
o14 = {};
// 18065
f974244559_523.returns.push(o14);
// 18066
o14.length = 0;
// undefined
o14 = null;
// 18068
f974244559_2178.returns.push("FriendRequest/change");
// 18069
o15.nodeName = "A";
// 18070
o15.__FB_TOKEN = void 0;
// 18071
// 18072
o15.getAttribute = f974244559_500;
// 18073
o15.hasAttribute = f974244559_527;
// 18075
f974244559_527.returns.push(false);
// 18076
o15.JSBNG__addEventListener = f974244559_472;
// 18078
f974244559_472.returns.push(undefined);
// 18079
o15.JSBNG__onclick = null;
// undefined
o15 = null;
// 18083
o14 = {};
// 18084
f974244559_502.returns.push(o14);
// 18085
o14.id = "u_0_o";
// 18086
o14.getElementsByTagName = f974244559_514;
// 18088
o14.querySelectorAll = f974244559_523;
// undefined
o14 = null;
// 18089
o14 = {};
// 18090
f974244559_523.returns.push(o14);
// 18091
o14.length = 1;
// 18092
o15 = {};
// 18093
o14["0"] = o15;
// undefined
o14 = null;
// 18097
o14 = {};
// 18098
f974244559_523.returns.push(o14);
// 18099
o14.length = 0;
// undefined
o14 = null;
// 18103
o14 = {};
// 18104
f974244559_523.returns.push(o14);
// 18105
o14.length = 1;
// 18106
o16 = {};
// 18107
o14["0"] = o16;
// undefined
o14 = null;
// undefined
o16 = null;
// 18111
o14 = {};
// 18112
f974244559_523.returns.push(o14);
// 18113
o14.length = 0;
// undefined
o14 = null;
// 18117
o14 = {};
// 18118
f974244559_523.returns.push(o14);
// 18119
o14.length = 0;
// undefined
o14 = null;
// 18121
f974244559_2178.returns.push("FriendRequest/change");
// 18123
f974244559_2178.returns.push("FriendRequest/confirm");
// 18124
o15.nodeName = "LABEL";
// 18125
o15.getElementsByTagName = f974244559_514;
// undefined
o15 = null;
// 18126
o14 = {};
// 18127
f974244559_514.returns.push(o14);
// 18128
o14.length = 1;
// 18129
o15 = {};
// 18130
o14["0"] = o15;
// undefined
o14 = null;
// 18131
o15.__FB_TOKEN = void 0;
// 18132
// 18133
o15.getAttribute = f974244559_500;
// 18134
o15.hasAttribute = f974244559_527;
// 18136
f974244559_527.returns.push(false);
// 18137
o15.JSBNG__addEventListener = f974244559_472;
// 18139
f974244559_472.returns.push(undefined);
// 18140
o15.JSBNG__onclick = null;
// 18141
o15.nodeName = "INPUT";
// undefined
o15 = null;
// 18144
o14 = {};
// 18145
f974244559_502.returns.push(o14);
// 18146
o14.id = "u_0_14";
// 18147
o14.getElementsByTagName = f974244559_514;
// 18149
o14.querySelectorAll = f974244559_523;
// 18150
o15 = {};
// 18151
f974244559_523.returns.push(o15);
// 18152
o15.length = 1;
// 18153
o16 = {};
// 18154
o15["0"] = o16;
// undefined
o15 = null;
// 18158
o15 = {};
// 18159
f974244559_523.returns.push(o15);
// 18160
o15.length = 0;
// undefined
o15 = null;
// 18164
o15 = {};
// 18165
f974244559_523.returns.push(o15);
// 18166
o15.length = 1;
// 18167
o17 = {};
// 18168
o15["0"] = o17;
// undefined
o15 = null;
// undefined
o17 = null;
// 18172
o15 = {};
// 18173
f974244559_523.returns.push(o15);
// 18174
o15.length = 0;
// undefined
o15 = null;
// 18178
o15 = {};
// 18179
f974244559_523.returns.push(o15);
// 18180
o15.length = 0;
// undefined
o15 = null;
// 18182
f974244559_2178.returns.push("FriendRequest/change");
// 18184
f974244559_2178.returns.push("FriendRequest/confirm");
// 18185
o16.nodeName = "LABEL";
// 18186
o16.getElementsByTagName = f974244559_514;
// undefined
o16 = null;
// 18187
o15 = {};
// 18188
f974244559_514.returns.push(o15);
// 18189
o15.length = 1;
// 18190
o16 = {};
// 18191
o15["0"] = o16;
// undefined
o15 = null;
// 18192
o16.__FB_TOKEN = void 0;
// 18193
// 18194
o16.getAttribute = f974244559_500;
// 18195
o16.hasAttribute = f974244559_527;
// 18197
f974244559_527.returns.push(false);
// 18198
o16.JSBNG__addEventListener = f974244559_472;
// 18200
f974244559_472.returns.push(undefined);
// 18201
o16.JSBNG__onclick = null;
// 18202
o16.nodeName = "INPUT";
// undefined
o16 = null;
// 18207
f974244559_472.returns.push(undefined);
// 18208
o78.JSBNG__onmouseover = null;
// 18211
f974244559_2178.returns.push("init");
// 18213
f974244559_2178.returns.push("show");
// 18215
f974244559_2178.returns.push("hide");
// 18221
f974244559_472.returns.push(undefined);
// 18222
o78.JSBNG__onmouseout = null;
// undefined
o78 = null;
// 18225
f974244559_2178.returns.push("setMenu");
// 18227
o15 = {};
// 18228
o16 = {};
// 18230
o15.length = 1;
// 18231
o15["0"] = "3SGVa";
// 18234
f974244559_471.returns.push(1373491299155);
// 18237
f974244559_471.returns.push(1373491299155);
// 18239
f974244559_471.returns.push(1373491299156);
// 18250
f974244559_471.returns.push(1373491299266);
// 18253
f974244559_502.returns.push(o64);
// 18254
o64.getElementsByTagName = f974244559_514;
// 18256
o64.querySelectorAll = f974244559_523;
// 18257
o17 = {};
// 18258
f974244559_523.returns.push(o17);
// 18259
o17.length = 1;
// 18260
o18 = {};
// 18261
o17["0"] = o18;
// undefined
o17 = null;
// 18265
o17 = {};
// 18266
f974244559_523.returns.push(o17);
// 18267
o17.length = 5;
// 18268
o17["0"] = o18;
// undefined
o18 = null;
// 18269
o18 = {};
// 18270
o17["1"] = o18;
// undefined
o18 = null;
// 18271
o18 = {};
// 18272
o17["2"] = o18;
// undefined
o18 = null;
// 18273
o18 = {};
// 18274
o17["3"] = o18;
// undefined
o18 = null;
// 18275
o17["4"] = o77;
// undefined
o17 = null;
// 18276
o17 = {};
// 18277
o64.classList = o17;
// undefined
o64 = null;
// 18279
o17.contains = f974244559_1617;
// undefined
o17 = null;
// 18280
f974244559_1617.returns.push(false);
// 18282
o17 = {};
// 18283
o65.classList = o17;
// 18285
o17.contains = f974244559_1617;
// undefined
o17 = null;
// 18286
f974244559_1617.returns.push(true);
// 18287
o65.offsetWidth = 850;
// undefined
o65 = null;
// 18288
o77.offsetLeft = 536;
// 18289
o77.offsetWidth = 84;
// undefined
o77 = null;
// 18295
f974244559_1617.returns.push(false);
// 18300
f974244559_1617.returns.push(false);
// 18302
o17 = {};
// 18303
o66.classList = o17;
// 18305
o17.contains = f974244559_1617;
// undefined
o17 = null;
// 18306
f974244559_1617.returns.push(false);
// 18308
o17 = {};
// 18309
o67.classList = o17;
// 18311
o17.contains = f974244559_1617;
// undefined
o17 = null;
// 18312
f974244559_1617.returns.push(false);
// 18314
o17 = {};
// 18315
o68.classList = o17;
// undefined
o68 = null;
// 18317
o17.contains = f974244559_1617;
// undefined
o17 = null;
// 18318
f974244559_1617.returns.push(false);
// 18320
o17 = {};
// 18321
o69.classList = o17;
// undefined
o69 = null;
// 18323
o17.contains = f974244559_1617;
// 18324
f974244559_1617.returns.push(true);
// 18327
o17.remove = f974244559_1244;
// undefined
o17 = null;
// 18328
f974244559_1244.returns.push(undefined);
// 18330
f974244559_2178.returns.push("Medley/transitionToSection");
// 18337
f974244559_2178.returns.push("sidebar/initialized");
// 18338
f974244559_2178.returns.push("sidebar/show");
// 18339
f974244559_2178.returns.push("sidebar/hide");
// 18344
f974244559_2178.returns.push("TimelineCover/coverCollapsed");
// 18347
o17 = {};
// 18348
f974244559_502.returns.push(o17);
// 18349
o18 = {};
// 18350
o17.style = o18;
// 18351
// undefined
o18 = null;
// 18353
f974244559_502.returns.push(o40);
// 18354
o40.firstChild = null;
// undefined
o40 = null;
// 18358
o8.scrollWidth = 1050;
// 18366
f974244559_702.returns.push(true);
// 18367
o18 = {};
// 18368
f974244559_4.returns.push(o18);
// 18369
o18.getPropertyValue = f974244559_1881;
// undefined
o18 = null;
// 18370
f974244559_1881.returns.push("static");
// 18375
f974244559_702.returns.push(true);
// 18376
o18 = {};
// 18377
f974244559_4.returns.push(o18);
// 18378
o18.getPropertyValue = f974244559_1881;
// undefined
o18 = null;
// 18379
f974244559_1881.returns.push("relative");
// 18384
f974244559_702.returns.push(true);
// 18385
o18 = {};
// 18386
f974244559_4.returns.push(o18);
// 18387
o18.getPropertyValue = f974244559_1881;
// undefined
o18 = null;
// 18388
f974244559_1881.returns.push("relative");
// 18393
f974244559_702.returns.push(true);
// 18394
o18 = {};
// 18395
f974244559_4.returns.push(o18);
// 18396
o18.getPropertyValue = f974244559_1881;
// undefined
o18 = null;
// 18397
f974244559_1881.returns.push("static");
// 18402
f974244559_702.returns.push(true);
// 18403
o18 = {};
// 18404
f974244559_4.returns.push(o18);
// 18405
o18.getPropertyValue = f974244559_1881;
// undefined
o18 = null;
// 18406
f974244559_1881.returns.push("static");
// 18411
f974244559_702.returns.push(true);
// 18412
o18 = {};
// 18413
f974244559_4.returns.push(o18);
// 18414
o18.getPropertyValue = f974244559_1881;
// undefined
o18 = null;
// 18415
f974244559_1881.returns.push("static");
// 18420
f974244559_702.returns.push(true);
// 18421
o18 = {};
// 18422
f974244559_4.returns.push(o18);
// 18423
o18.getPropertyValue = f974244559_1881;
// undefined
o18 = null;
// 18424
f974244559_1881.returns.push("static");
// 18429
f974244559_702.returns.push(true);
// 18430
o18 = {};
// 18431
f974244559_4.returns.push(o18);
// 18432
o18.getPropertyValue = f974244559_1881;
// undefined
o18 = null;
// 18433
f974244559_1881.returns.push("static");
// 18438
f974244559_702.returns.push(true);
// 18439
o18 = {};
// 18440
f974244559_4.returns.push(o18);
// 18441
o18.getPropertyValue = f974244559_1881;
// undefined
o18 = null;
// 18442
f974244559_1881.returns.push("fixed");
// 18446
f974244559_1617.returns.push(false);
// 18451
f974244559_1617.returns.push(false);
// 18456
f974244559_1617.returns.push(false);
// 18461
f974244559_1617.returns.push(false);
// 18466
f974244559_1617.returns.push(false);
// 18471
f974244559_1617.returns.push(false);
// 18476
f974244559_1617.returns.push(false);
// 18481
f974244559_1617.returns.push(false);
// 18486
f974244559_1617.returns.push(false);
// 18491
f974244559_1617.returns.push(false);
// 18496
f974244559_1617.returns.push(false);
// 18501
f974244559_1617.returns.push(false);
// 18506
f974244559_1617.returns.push(false);
// 18511
f974244559_1617.returns.push(false);
// 18518
o18 = {};
// 18519
f974244559_4.returns.push(o18);
// 18520
o18.getPropertyValue = f974244559_1881;
// undefined
o18 = null;
// 18521
f974244559_1881.returns.push("static");
// 18526
f974244559_702.returns.push(false);
// undefined
fo974244559_2174_style.returns.push(o9);
// 18530
// 18533
f974244559_502.returns.push(o75);
// 18536
f974244559_702.returns.push(false);
// 18550
o18 = {};
// 18551
f974244559_4.returns.push(o18);
// 18552
o18.getPropertyValue = f974244559_1881;
// undefined
o18 = null;
// 18553
f974244559_1881.returns.push("static");
// 18554
o18 = {};
// 18555
f974244559_4.returns.push(o18);
// 18556
o18.getPropertyValue = f974244559_1881;
// undefined
o18 = null;
// 18557
f974244559_1881.returns.push("static");
// 18558
o18 = {};
// 18559
f974244559_4.returns.push(o18);
// 18560
o18.getPropertyValue = f974244559_1881;
// undefined
o18 = null;
// 18561
f974244559_1881.returns.push("static");
// 18562
o18 = {};
// 18563
f974244559_4.returns.push(o18);
// 18564
o18.getPropertyValue = f974244559_1881;
// undefined
o18 = null;
// 18565
f974244559_1881.returns.push("fixed");
// 18566
o18 = {};
// 18567
f974244559_4.returns.push(o18);
// 18568
o18.getPropertyValue = f974244559_1881;
// undefined
o18 = null;
// 18569
f974244559_1881.returns.push("300");
// 18578
f974244559_702.returns.push(true);
// 18580
o18 = {};
// 18581
f974244559_1882.returns.push(o18);
// 18582
o18.left = 990.5;
// 18584
o18.JSBNG__top = 6;
// undefined
o18 = null;
// 18597
f974244559_1110.returns.push(undefined);
// 18601
f974244559_1244.returns.push(undefined);
// 18605
f974244559_1244.returns.push(undefined);
// 18609
f974244559_1244.returns.push(undefined);
// 18613
f974244559_1110.returns.push(undefined);
// 18615
// 18617
// 18619
// 18621
// 18623
// 18625
// undefined
o11 = null;
// undefined
fo974244559_2172_style.returns.push(o10);
// 18627
// undefined
fo974244559_2172_style.returns.push(o10);
// 18629
// undefined
o10 = null;
// 18633
f974244559_1110.returns.push(undefined);
// 18641
f974244559_702.returns.push(true);
// 18643
o10 = {};
// 18644
f974244559_1882.returns.push(o10);
// 18645
o10.left = 990.5;
// 18647
o10.JSBNG__top = 6;
// undefined
o10 = null;
// undefined
fo974244559_2174_style.returns.push(o9);
// 18652
// undefined
fo974244559_2174_style.returns.push(o9);
// 18654
// 18660
f974244559_702.returns.push(false);
// undefined
fo974244559_2174_style.returns.push(o9);
// 18666
// undefined
fo974244559_2174_style.returns.push(o9);
// 18668
// 18672
f974244559_1617.returns.push(false);
// 18677
f974244559_1617.returns.push(false);
// 18682
f974244559_1617.returns.push(false);
// 18687
f974244559_1617.returns.push(false);
// 18692
f974244559_1617.returns.push(false);
// 18697
f974244559_1617.returns.push(false);
// 18702
f974244559_1617.returns.push(false);
// 18707
f974244559_1617.returns.push(false);
// 18712
f974244559_1617.returns.push(false);
// 18717
f974244559_1617.returns.push(false);
// 18722
f974244559_1617.returns.push(false);
// 18727
f974244559_1617.returns.push(false);
// 18732
f974244559_1617.returns.push(false);
// 18737
f974244559_1617.returns.push(false);
// 18755
o10 = {};
// 18756
f974244559_4.returns.push(o10);
// 18757
o10.getPropertyValue = f974244559_1881;
// undefined
o10 = null;
// 18758
f974244559_1881.returns.push("static");
// 18759
o10 = {};
// 18760
f974244559_4.returns.push(o10);
// 18761
o10.getPropertyValue = f974244559_1881;
// undefined
o10 = null;
// 18762
f974244559_1881.returns.push("static");
// 18763
o10 = {};
// 18764
f974244559_4.returns.push(o10);
// 18765
o10.getPropertyValue = f974244559_1881;
// undefined
o10 = null;
// 18766
f974244559_1881.returns.push("static");
// 18767
o10 = {};
// 18768
f974244559_4.returns.push(o10);
// 18769
o10.getPropertyValue = f974244559_1881;
// undefined
o10 = null;
// 18770
f974244559_1881.returns.push("fixed");
// 18771
o10 = {};
// 18772
f974244559_4.returns.push(o10);
// 18773
o10.getPropertyValue = f974244559_1881;
// undefined
o10 = null;
// 18774
f974244559_1881.returns.push("300");
// undefined
fo974244559_2174_style.returns.push(o9);
// 18776
// 18781
o10 = {};
// 18782
f974244559_4.returns.push(o10);
// 18783
o10.getPropertyValue = f974244559_1881;
// undefined
o10 = null;
// 18784
f974244559_1881.returns.push("");
// undefined
fo974244559_2174_style.returns.push(o9);
// 18786
// 18792
f974244559_502.returns.push(o67);
// 18796
f974244559_1617.returns.push(false);
// 18801
f974244559_1617.returns.push(true);
// 18802
o67.getElementsByTagName = f974244559_514;
// 18804
o67.querySelectorAll = f974244559_523;
// 18805
o10 = {};
// 18806
f974244559_523.returns.push(o10);
// 18807
o10.length = 1;
// 18808
o10["0"] = o38;
// undefined
o10 = null;
// 18811
o10 = {};
// 18812
f974244559_502.returns.push(o10);
// 18813
f974244559_468.returns.push(9);
// 18816
f974244559_502.returns.push(o10);
// 18819
f974244559_2178.returns.push("TimelineConstants/sectionFullyLoaded");
// 18822
o11 = {};
// 18823
f974244559_502.returns.push(o11);
// 18824
o11.nodeName = "A";
// 18825
o11.__FB_TOKEN = void 0;
// 18826
// 18827
o11.getAttribute = f974244559_500;
// 18828
o11.hasAttribute = f974244559_527;
// 18830
f974244559_527.returns.push(false);
// 18831
o11.JSBNG__addEventListener = f974244559_472;
// 18833
f974244559_472.returns.push(undefined);
// 18834
o11.JSBNG__onclick = null;
// undefined
o11 = null;
// 18838
f974244559_502.returns.push(o113);
// undefined
o113 = null;
// 18840
o11 = {};
// 18841
f974244559_502.returns.push(o11);
// 18843
f974244559_471.returns.push(1373491299350);
// 18848
o18 = {};
// 18849
f974244559_502.returns.push(o18);
// 18850
o18.nodeName = "A";
// 18851
o18.__FB_TOKEN = void 0;
// 18852
// 18853
o18.getAttribute = f974244559_500;
// 18854
o18.hasAttribute = f974244559_527;
// 18856
f974244559_527.returns.push(false);
// 18857
o18.JSBNG__addEventListener = f974244559_472;
// 18859
f974244559_472.returns.push(undefined);
// 18860
o18.JSBNG__onclick = null;
// undefined
o18 = null;
// 18864
f974244559_502.returns.push(o110);
// undefined
o110 = null;
// 18868
o18 = {};
// 18869
f974244559_502.returns.push(o18);
// 18870
o18.nodeName = "A";
// 18871
o18.__FB_TOKEN = void 0;
// 18872
// 18873
o18.getAttribute = f974244559_500;
// 18874
o18.hasAttribute = f974244559_527;
// 18876
f974244559_527.returns.push(false);
// 18877
o18.JSBNG__addEventListener = f974244559_472;
// 18879
f974244559_472.returns.push(undefined);
// 18880
o18.JSBNG__onclick = null;
// undefined
o18 = null;
// 18884
f974244559_502.returns.push(o114);
// undefined
o114 = null;
// 18888
o18 = {};
// 18889
f974244559_502.returns.push(o18);
// 18890
o18.nodeName = "A";
// 18891
o18.__FB_TOKEN = void 0;
// 18892
// 18893
o18.getAttribute = f974244559_500;
// 18894
o18.hasAttribute = f974244559_527;
// 18896
f974244559_527.returns.push(false);
// 18897
o18.JSBNG__addEventListener = f974244559_472;
// 18899
f974244559_472.returns.push(undefined);
// 18900
o18.JSBNG__onclick = null;
// undefined
o18 = null;
// 18904
f974244559_502.returns.push(o117);
// undefined
o117 = null;
// 18908
o18 = {};
// 18909
f974244559_502.returns.push(o18);
// 18910
o18.nodeName = "A";
// 18911
o18.__FB_TOKEN = void 0;
// 18912
// 18913
o18.getAttribute = f974244559_500;
// 18914
o18.hasAttribute = f974244559_527;
// 18916
f974244559_527.returns.push(false);
// 18917
o18.JSBNG__addEventListener = f974244559_472;
// 18919
f974244559_472.returns.push(undefined);
// 18920
o18.JSBNG__onclick = null;
// undefined
o18 = null;
// 18924
f974244559_502.returns.push(o118);
// undefined
o118 = null;
// 18927
o18 = {};
// 18928
f974244559_502.returns.push(o18);
// 18929
o18.nodeName = "A";
// 18930
o18.__FB_TOKEN = void 0;
// 18931
// 18932
o18.getAttribute = f974244559_500;
// 18933
o18.hasAttribute = f974244559_527;
// 18935
f974244559_527.returns.push(false);
// 18936
o18.JSBNG__addEventListener = f974244559_472;
// 18938
f974244559_472.returns.push(undefined);
// 18939
o18.JSBNG__onclick = null;
// undefined
o18 = null;
// 18943
f974244559_502.returns.push(o116);
// undefined
o116 = null;
// 18947
o18 = {};
// 18948
f974244559_502.returns.push(o18);
// 18949
o18.nodeName = "A";
// 18950
o18.__FB_TOKEN = void 0;
// 18951
// 18952
o18.getAttribute = f974244559_500;
// 18953
o18.hasAttribute = f974244559_527;
// 18955
f974244559_527.returns.push(false);
// 18956
o18.JSBNG__addEventListener = f974244559_472;
// 18958
f974244559_472.returns.push(undefined);
// 18959
o18.JSBNG__onclick = null;
// undefined
o18 = null;
// 18963
f974244559_502.returns.push(o115);
// undefined
o115 = null;
// 18967
o18 = {};
// 18968
f974244559_502.returns.push(o18);
// 18969
o19 = {};
// 18970
o18.firstChild = o19;
// 18971
o19.id = "u_0_40";
// 18975
f974244559_2178.returns.push("ScrollingPager/registered");
// 18979
f974244559_502.returns.push(o43);
// 18983
o20 = {};
// 18984
f974244559_502.returns.push(o20);
// 18985
o20.nodeName = "DIV";
// 18986
o20.__FB_TOKEN = void 0;
// 18987
// 18988
o20.getAttribute = f974244559_500;
// 18989
o20.hasAttribute = f974244559_527;
// 18991
f974244559_527.returns.push(false);
// 18992
o20.JSBNG__addEventListener = f974244559_472;
// 18994
f974244559_472.returns.push(undefined);
// 18995
o20.JSBNG__onclick = null;
// undefined
o20 = null;
// 19000
f974244559_502.returns.push(o119);
// 19004
f974244559_2178.returns.push("UFI/CommentAddedActive");
// 19005
f974244559_2178.returns.push("UFI/CommentDeletedActive");
// 19006
f974244559_2178.returns.push("UFI/LikeActive");
// 19007
f974244559_2178.returns.push("Curation/Action");
// 19008
f974244559_2178.returns.push("ProfileBrowser/LoadMoreContent");
// 19009
f974244559_2178.returns.push("Ads/NewContentDisplayed");
// 19011
f974244559_2178.returns.push("TimelineSideAds/refresh");
// 19012
f974244559_7.returns.push(undefined);
// 19013
f974244559_2566 = function() { return f974244559_2566.returns[f974244559_2566.inst++]; };
f974244559_2566.returns = [];
f974244559_2566.inst = 0;
// 19014
ow974244559.JSBNG__onmousemove = f974244559_2566;
// 19020
o119.getElementsByTagName = f974244559_514;
// 19022
o119.querySelectorAll = f974244559_523;
// 19023
o20 = {};
// 19024
f974244559_523.returns.push(o20);
// 19025
o20.length = 5;
// 19026
o21 = {};
// 19027
o20["0"] = o21;
// 19028
o22 = {};
// 19029
o20["1"] = o22;
// 19030
o23 = {};
// 19031
o20["2"] = o23;
// 19032
o26 = {};
// 19033
o20["3"] = o26;
// 19034
o40 = {};
// 19035
o20["4"] = o40;
// undefined
o20 = null;
// 19036
o21.getElementsByTagName = f974244559_514;
// 19038
o21.querySelectorAll = f974244559_523;
// 19039
o20 = {};
// 19040
f974244559_523.returns.push(o20);
// 19041
o20.length = 1;
// 19042
o49 = {};
// 19043
o20["0"] = o49;
// undefined
o20 = null;
// 19044
o49.getAttribute = f974244559_500;
// 19045
f974244559_500.returns.push("{\"adid\":6010069360965,\"segment\":\"market\"}");
// 19046
o22.getElementsByTagName = f974244559_514;
// 19048
o22.querySelectorAll = f974244559_523;
// 19049
o20 = {};
// 19050
f974244559_523.returns.push(o20);
// 19051
o20.length = 1;
// 19052
o58 = {};
// 19053
o20["0"] = o58;
// undefined
o20 = null;
// 19054
o58.getAttribute = f974244559_500;
// 19055
f974244559_500.returns.push("{\"adid\":6008291652839,\"segment\":\"market\"}");
// 19056
o23.getElementsByTagName = f974244559_514;
// 19058
o23.querySelectorAll = f974244559_523;
// 19059
o20 = {};
// 19060
f974244559_523.returns.push(o20);
// 19061
o20.length = 1;
// 19062
o63 = {};
// 19063
o20["0"] = o63;
// undefined
o20 = null;
// 19064
o63.getAttribute = f974244559_500;
// 19065
f974244559_500.returns.push("{\"adid\":6008916062318,\"segment\":\"market\"}");
// 19066
o26.getElementsByTagName = f974244559_514;
// 19068
o26.querySelectorAll = f974244559_523;
// 19069
o20 = {};
// 19070
f974244559_523.returns.push(o20);
// 19071
o20.length = 1;
// 19072
o64 = {};
// 19073
o20["0"] = o64;
// undefined
o20 = null;
// 19074
o64.getAttribute = f974244559_500;
// 19075
f974244559_500.returns.push("{\"adid\":6010037469977,\"segment\":\"market\"}");
// 19076
o40.getElementsByTagName = f974244559_514;
// 19078
o40.querySelectorAll = f974244559_523;
// 19079
o20 = {};
// 19080
f974244559_523.returns.push(o20);
// 19081
o20.length = 1;
// 19082
o65 = {};
// 19083
o20["0"] = o65;
// undefined
o20 = null;
// 19084
o65.getAttribute = f974244559_500;
// 19085
f974244559_500.returns.push("{\"adid\":6008948705864,\"segment\":\"market\"}");
// 19086
o20 = {};
// 19087
o21.classList = o20;
// 19089
o20.add = f974244559_1110;
// 19090
f974244559_1110.returns.push(undefined);
// 19091
o68 = {};
// 19092
o119.classList = o68;
// 19094
o68.remove = f974244559_1244;
// undefined
o68 = null;
// 19095
f974244559_1244.returns.push(undefined);
// 19096
o119.setAttribute = f974244559_643;
// 19097
f974244559_643.returns.push(undefined);
// 19098
o119.cloneNode = f974244559_1902;
// 19099
o68 = {};
// 19100
f974244559_1902.returns.push(o68);
// 19101
// 19102
o68.getElementsByTagName = f974244559_514;
// 19104
o68.querySelectorAll = f974244559_523;
// 19105
o69 = {};
// 19106
f974244559_523.returns.push(o69);
// 19107
o69.length = 5;
// 19108
o77 = {};
// 19109
o69["0"] = o77;
// 19110
o78 = {};
// 19111
o69["1"] = o78;
// 19112
o79 = {};
// 19113
o69["2"] = o79;
// 19114
o81 = {};
// 19115
o69["3"] = o81;
// 19116
o82 = {};
// 19117
o69["4"] = o82;
// undefined
o69 = null;
// 19118
o77.getElementsByTagName = f974244559_514;
// 19120
o77.querySelectorAll = f974244559_523;
// undefined
o77 = null;
// 19121
o69 = {};
// 19122
f974244559_523.returns.push(o69);
// 19123
o69.length = 1;
// 19124
o77 = {};
// 19125
o69["0"] = o77;
// undefined
o69 = null;
// 19126
o77.getAttribute = f974244559_500;
// undefined
o77 = null;
// 19127
f974244559_500.returns.push("{\"adid\":6010069360965,\"segment\":\"market\"}");
// 19128
o78.getElementsByTagName = f974244559_514;
// 19130
o78.querySelectorAll = f974244559_523;
// 19131
o69 = {};
// 19132
f974244559_523.returns.push(o69);
// 19133
o69.length = 1;
// 19134
o77 = {};
// 19135
o69["0"] = o77;
// undefined
o69 = null;
// 19136
o77.getAttribute = f974244559_500;
// undefined
o77 = null;
// 19137
f974244559_500.returns.push("{\"adid\":6008291652839,\"segment\":\"market\"}");
// 19138
o79.getElementsByTagName = f974244559_514;
// 19140
o79.querySelectorAll = f974244559_523;
// 19141
o69 = {};
// 19142
f974244559_523.returns.push(o69);
// 19143
o69.length = 1;
// 19144
o77 = {};
// 19145
o69["0"] = o77;
// undefined
o69 = null;
// 19146
o77.getAttribute = f974244559_500;
// undefined
o77 = null;
// 19147
f974244559_500.returns.push("{\"adid\":6008916062318,\"segment\":\"market\"}");
// 19148
o81.getElementsByTagName = f974244559_514;
// 19150
o81.querySelectorAll = f974244559_523;
// 19151
o69 = {};
// 19152
f974244559_523.returns.push(o69);
// 19153
o69.length = 1;
// 19154
o77 = {};
// 19155
o69["0"] = o77;
// undefined
o69 = null;
// 19156
o77.getAttribute = f974244559_500;
// undefined
o77 = null;
// 19157
f974244559_500.returns.push("{\"adid\":6010037469977,\"segment\":\"market\"}");
// 19158
o82.getElementsByTagName = f974244559_514;
// 19160
o82.querySelectorAll = f974244559_523;
// 19161
o69 = {};
// 19162
f974244559_523.returns.push(o69);
// 19163
o69.length = 1;
// 19164
o77 = {};
// 19165
o69["0"] = o77;
// undefined
o69 = null;
// 19166
o77.getAttribute = f974244559_500;
// undefined
o77 = null;
// 19167
f974244559_500.returns.push("{\"adid\":6008948705864,\"segment\":\"market\"}");
// 19168
o69 = {};
// 19169
o78.parentNode = o69;
// 19171
o69.removeChild = f974244559_507;
// 19172
f974244559_507.returns.push(o78);
// undefined
o78 = null;
// 19173
o79.parentNode = o69;
// 19176
f974244559_507.returns.push(o79);
// undefined
o79 = null;
// 19177
o81.parentNode = o69;
// 19180
f974244559_507.returns.push(o81);
// undefined
o81 = null;
// 19181
o82.parentNode = o69;
// undefined
o69 = null;
// 19184
f974244559_507.returns.push(o82);
// undefined
o82 = null;
// 19185
o69 = {};
// 19186
o68.classList = o69;
// 19188
o69.add = f974244559_1110;
// undefined
o69 = null;
// 19189
f974244559_1110.returns.push(undefined);
// 19192
o20.remove = f974244559_1244;
// undefined
o20 = null;
// 19193
f974244559_1244.returns.push(undefined);
// 19194
o21.setAttribute = f974244559_643;
// 19195
f974244559_643.returns.push(undefined);
// 19196
o20 = {};
// 19197
o22.classList = o20;
// 19199
o20.remove = f974244559_1244;
// undefined
o20 = null;
// 19200
f974244559_1244.returns.push(undefined);
// 19201
o22.setAttribute = f974244559_643;
// 19202
f974244559_643.returns.push(undefined);
// 19203
o20 = {};
// 19204
o23.classList = o20;
// 19206
o20.remove = f974244559_1244;
// undefined
o20 = null;
// 19207
f974244559_1244.returns.push(undefined);
// 19208
o23.setAttribute = f974244559_643;
// 19209
f974244559_643.returns.push(undefined);
// 19210
o20 = {};
// 19211
o26.classList = o20;
// 19213
o20.add = f974244559_1110;
// undefined
o20 = null;
// 19214
f974244559_1110.returns.push(undefined);
// 19215
o26.setAttribute = f974244559_643;
// 19216
f974244559_643.returns.push(undefined);
// 19217
o20 = {};
// 19218
o40.classList = o20;
// 19220
o20.add = f974244559_1110;
// undefined
o20 = null;
// 19221
f974244559_1110.returns.push(undefined);
// 19222
o40.setAttribute = f974244559_643;
// 19223
f974244559_643.returns.push(undefined);
// 19227
f974244559_1244.returns.push(undefined);
// 19229
f974244559_643.returns.push(undefined);
// 19233
o20 = {};
// 19234
f974244559_523.returns.push(o20);
// 19235
o20.length = 1;
// 19236
o20["0"] = o63;
// undefined
o20 = null;
// 19238
f974244559_500.returns.push("{\"adid\":6008916062318,\"segment\":\"market\"}");
// 19240
o20 = {};
// 19241
f974244559_480.returns.push(o20);
// 19242
// 19243
o20.setAttribute = f974244559_643;
// 19245
f974244559_643.returns.push(undefined);
// 19248
f974244559_643.returns.push(undefined);
// 19251
f974244559_643.returns.push(undefined);
// 19254
f974244559_643.returns.push(undefined);
// 19257
f974244559_643.returns.push(undefined);
// 19259
f974244559_643.returns.push(undefined);
// 19260
o20.__html = void 0;
// undefined
o20 = null;
// 19262
o20 = {};
// 19263
f974244559_478.returns.push(o20);
// 19265
o119.appendChild = f974244559_482;
// 19266
f974244559_482.returns.push(o20);
// undefined
o20 = null;
// 19270
o20 = {};
// 19271
f974244559_523.returns.push(o20);
// 19272
o20.length = 1;
// 19273
o20["0"] = o58;
// undefined
o20 = null;
// 19275
f974244559_500.returns.push("{\"adid\":6008291652839,\"segment\":\"market\"}");
// 19277
o20 = {};
// 19278
f974244559_480.returns.push(o20);
// 19279
// 19280
o20.setAttribute = f974244559_643;
// 19282
f974244559_643.returns.push(undefined);
// 19285
f974244559_643.returns.push(undefined);
// 19288
f974244559_643.returns.push(undefined);
// 19291
f974244559_643.returns.push(undefined);
// 19294
f974244559_643.returns.push(undefined);
// 19296
f974244559_643.returns.push(undefined);
// 19297
o20.__html = void 0;
// undefined
o20 = null;
// 19299
o20 = {};
// 19300
f974244559_478.returns.push(o20);
// 19303
f974244559_482.returns.push(o20);
// undefined
o20 = null;
// 19307
o20 = {};
// 19308
f974244559_523.returns.push(o20);
// 19309
o20.length = 1;
// 19310
o20["0"] = o49;
// undefined
o20 = null;
// 19312
f974244559_500.returns.push("{\"adid\":6010069360965,\"segment\":\"market\"}");
// 19314
o20 = {};
// 19315
f974244559_480.returns.push(o20);
// 19316
// 19317
o20.setAttribute = f974244559_643;
// 19319
f974244559_643.returns.push(undefined);
// 19322
f974244559_643.returns.push(undefined);
// 19325
f974244559_643.returns.push(undefined);
// 19328
f974244559_643.returns.push(undefined);
// 19331
f974244559_643.returns.push(undefined);
// 19333
f974244559_643.returns.push(undefined);
// 19334
o20.__html = void 0;
// undefined
o20 = null;
// 19336
o20 = {};
// 19337
f974244559_478.returns.push(o20);
// 19340
f974244559_482.returns.push(o20);
// undefined
o20 = null;
// 19344
o20 = {};
// 19345
f974244559_523.returns.push(o20);
// 19346
o20.length = 1;
// 19347
o20["0"] = o49;
// undefined
o20 = null;
// 19349
f974244559_500.returns.push("{\"adid\":6010069360965,\"segment\":\"market\"}");
// 19353
o20 = {};
// 19354
f974244559_523.returns.push(o20);
// 19355
o20.length = 1;
// 19356
o20["0"] = o58;
// undefined
o20 = null;
// 19358
f974244559_500.returns.push("{\"adid\":6008291652839,\"segment\":\"market\"}");
// 19362
o20 = {};
// 19363
f974244559_523.returns.push(o20);
// 19364
o20.length = 1;
// 19365
o20["0"] = o63;
// undefined
o20 = null;
// 19367
f974244559_500.returns.push("{\"adid\":6008916062318,\"segment\":\"market\"}");
// 19371
o20 = {};
// 19372
f974244559_523.returns.push(o20);
// 19373
o20.length = 1;
// 19374
o69 = {};
// 19375
o20["0"] = o69;
// undefined
o20 = null;
// 19376
o69.complete = true;
// 19377
f974244559_12.returns.push(63);
// 19381
o20 = {};
// 19382
f974244559_523.returns.push(o20);
// 19383
o20.length = 1;
// 19384
o77 = {};
// 19385
o20["0"] = o77;
// undefined
o20 = null;
// 19386
o77.complete = true;
// undefined
o77 = null;
// 19387
f974244559_12.returns.push(64);
// 19391
o20 = {};
// 19392
f974244559_523.returns.push(o20);
// 19393
o20.length = 1;
// 19394
o77 = {};
// 19395
o20["0"] = o77;
// undefined
o20 = null;
// 19396
o77.complete = true;
// undefined
o77 = null;
// 19397
f974244559_12.returns.push(65);
// 19401
o20 = {};
// 19402
f974244559_523.returns.push(o20);
// 19403
o20.length = 1;
// 19404
o77 = {};
// 19405
o20["0"] = o77;
// undefined
o20 = null;
// 19406
o77.complete = true;
// undefined
o77 = null;
// 19407
f974244559_12.returns.push(66);
// 19411
o20 = {};
// 19412
f974244559_523.returns.push(o20);
// 19413
o20.length = 1;
// 19414
o77 = {};
// 19415
o20["0"] = o77;
// undefined
o20 = null;
// 19416
o77.complete = true;
// undefined
o77 = null;
// 19417
f974244559_12.returns.push(67);
// 19418
o68.parentNode = null;
// undefined
o68 = null;
// 19422
f974244559_1244.returns.push(undefined);
// 19425
o20 = {};
// 19426
f974244559_502.returns.push(o20);
// 19427
o20.getElementsByTagName = f974244559_514;
// 19429
o20.querySelectorAll = f974244559_523;
// 19430
o68 = {};
// 19431
f974244559_523.returns.push(o68);
// 19432
o68.length = 0;
// undefined
o68 = null;
// 19436
o68 = {};
// 19437
f974244559_523.returns.push(o68);
// 19438
o68.length = 1;
// 19439
o77 = {};
// 19440
o68["0"] = o77;
// undefined
o68 = null;
// undefined
o77 = null;
// 19441
o68 = {};
// 19442
o20.classList = o68;
// 19444
o68.contains = f974244559_1617;
// 19445
f974244559_1617.returns.push(false);
// 19447
f974244559_502.returns.push(o193);
// 19450
o77 = {};
// 19451
f974244559_502.returns.push(o77);
// 19452
o78 = {};
// 19453
o77.classList = o78;
// 19455
o78.contains = f974244559_1617;
// 19456
f974244559_1617.returns.push(true);
// 19457
o77.__FB_TOKEN = void 0;
// 19458
// 19459
o79 = {};
// 19460
o77.childNodes = o79;
// undefined
o77 = null;
// 19461
o79.item = f974244559_517;
// 19462
o79.length = 1;
// 19463
o77 = {};
// 19464
o79["0"] = o77;
// undefined
o79 = null;
// 19465
o79 = {};
// 19466
o77.classList = o79;
// 19468
o79.contains = f974244559_1617;
// 19469
f974244559_1617.returns.push(false);
// 19470
o81 = {};
// 19471
o77.childNodes = o81;
// undefined
o77 = null;
// 19472
o81.item = f974244559_517;
// 19473
o81.length = 1;
// 19474
o81["0"] = o14;
// undefined
o81 = null;
// 19475
o77 = {};
// 19476
o14.classList = o77;
// undefined
o14 = null;
// 19478
o77.contains = f974244559_1617;
// undefined
o77 = null;
// 19479
f974244559_1617.returns.push(false);
// 19482
o79.remove = f974244559_1244;
// 19483
f974244559_1244.returns.push(undefined);
// 19487
f974244559_1244.returns.push(undefined);
// 19491
f974244559_1244.returns.push(undefined);
// 19494
o79.add = f974244559_1110;
// undefined
o79 = null;
// 19495
f974244559_1110.returns.push(undefined);
// 19499
f974244559_1110.returns.push(undefined);
// 19502
o78.remove = f974244559_1244;
// undefined
o78 = null;
// 19503
f974244559_1244.returns.push(undefined);
// 19506
o14 = {};
// 19507
f974244559_502.returns.push(o14);
// 19508
o77 = {};
// 19509
o14.classList = o77;
// 19511
o77.contains = f974244559_1617;
// 19512
f974244559_1617.returns.push(true);
// 19513
o14.__FB_TOKEN = void 0;
// 19514
// 19515
o78 = {};
// 19516
o14.childNodes = o78;
// undefined
o14 = null;
// 19517
o78.item = f974244559_517;
// 19518
o78.length = 1;
// 19519
o14 = {};
// 19520
o78["0"] = o14;
// undefined
o78 = null;
// 19521
o78 = {};
// 19522
o14.classList = o78;
// 19524
o78.contains = f974244559_1617;
// 19525
f974244559_1617.returns.push(false);
// 19526
o79 = {};
// 19527
o14.childNodes = o79;
// undefined
o14 = null;
// 19528
o79.item = f974244559_517;
// 19529
o79.length = 1;
// 19530
o14 = {};
// 19531
o79["0"] = o14;
// undefined
o79 = null;
// 19532
o79 = {};
// 19533
o14.classList = o79;
// undefined
o14 = null;
// 19535
o79.contains = f974244559_1617;
// undefined
o79 = null;
// 19536
f974244559_1617.returns.push(false);
// 19539
o78.remove = f974244559_1244;
// 19540
f974244559_1244.returns.push(undefined);
// 19544
f974244559_1244.returns.push(undefined);
// 19548
f974244559_1244.returns.push(undefined);
// 19551
o78.add = f974244559_1110;
// undefined
o78 = null;
// 19552
f974244559_1110.returns.push(undefined);
// 19556
f974244559_1110.returns.push(undefined);
// 19559
o77.remove = f974244559_1244;
// undefined
o77 = null;
// 19560
f974244559_1244.returns.push(undefined);
// 19563
o14 = {};
// 19564
f974244559_502.returns.push(o14);
// 19565
o14.getElementsByTagName = f974244559_514;
// 19567
o14.querySelectorAll = f974244559_523;
// 19568
o77 = {};
// 19569
f974244559_523.returns.push(o77);
// 19570
o77.length = 1;
// 19571
o78 = {};
// 19572
o77["0"] = o78;
// undefined
o77 = null;
// 19576
o77 = {};
// 19577
f974244559_523.returns.push(o77);
// 19578
o77.length = 1;
// 19579
o79 = {};
// 19580
o77["0"] = o79;
// undefined
o77 = null;
// 19584
o77 = {};
// 19585
f974244559_523.returns.push(o77);
// 19586
o77.length = 1;
// 19587
o81 = {};
// 19588
o77["0"] = o81;
// undefined
o77 = null;
// undefined
o81 = null;
// 19589
o78.getElementsByTagName = f974244559_514;
// 19591
o78.querySelectorAll = f974244559_523;
// 19592
o77 = {};
// 19593
f974244559_523.returns.push(o77);
// 19594
o77.length = 1;
// 19595
o81 = {};
// 19596
o77["0"] = o81;
// undefined
o77 = null;
// undefined
o81 = null;
// 19597
o77 = {};
// 19598
o78.classList = o77;
// 19600
o77.contains = f974244559_1617;
// undefined
o77 = null;
// 19601
f974244559_1617.returns.push(false);
// 19602
o77 = {};
// 19603
o78.parentNode = o77;
// 19604
o81 = {};
// 19605
o77.classList = o81;
// 19607
o81.contains = f974244559_1617;
// 19608
f974244559_1617.returns.push(false);
// 19609
o77.parentNode = o14;
// 19610
o82 = {};
// 19611
o14.classList = o82;
// 19613
o82.contains = f974244559_1617;
// 19614
f974244559_1617.returns.push(true);
// 19615
o14.__FB_TOKEN = void 0;
// 19616
// 19617
o14.getAttribute = f974244559_500;
// 19618
o14.hasAttribute = f974244559_527;
// 19620
f974244559_527.returns.push(false);
// 19624
f974244559_1617.returns.push(true);
// 19625
o83 = {};
// 19626
o14.childNodes = o83;
// undefined
o14 = null;
// 19627
o83.item = f974244559_517;
// 19628
o83.length = 4;
// 19629
o14 = {};
// 19630
o83["3"] = o14;
// 19631
o84 = {};
// 19632
o83["2"] = o84;
// 19633
o83["1"] = o77;
// 19634
o85 = {};
// 19635
o83["0"] = o85;
// undefined
o83 = null;
// 19636
o83 = {};
// 19637
o85.classList = o83;
// 19639
o83.contains = f974244559_1617;
// 19640
f974244559_1617.returns.push(false);
// 19641
o86 = {};
// 19642
o85.childNodes = o86;
// undefined
o85 = null;
// 19643
o86.item = f974244559_517;
// 19644
o86.length = 1;
// 19645
o85 = {};
// 19646
o86["0"] = o85;
// undefined
o86 = null;
// 19647
o86 = {};
// 19648
o85.classList = o86;
// undefined
o85 = null;
// 19650
o86.contains = f974244559_1617;
// undefined
o86 = null;
// 19651
f974244559_1617.returns.push(false);
// 19654
o83.remove = f974244559_1244;
// 19655
f974244559_1244.returns.push(undefined);
// 19659
f974244559_1244.returns.push(undefined);
// 19663
f974244559_1244.returns.push(undefined);
// 19667
f974244559_1617.returns.push(false);
// 19668
o85 = {};
// 19669
o77.childNodes = o85;
// undefined
o77 = null;
// 19670
o85.item = f974244559_517;
// 19671
o85.length = 1;
// 19672
o85["0"] = o78;
// undefined
o85 = null;
// undefined
o78 = null;
// 19676
f974244559_1617.returns.push(false);
// 19679
o81.remove = f974244559_1244;
// undefined
o81 = null;
// 19680
f974244559_1244.returns.push(undefined);
// 19684
f974244559_1244.returns.push(undefined);
// 19688
f974244559_1244.returns.push(undefined);
// 19689
o77 = {};
// 19690
o84.classList = o77;
// 19692
o77.contains = f974244559_1617;
// 19693
f974244559_1617.returns.push(false);
// 19694
o78 = {};
// 19695
o84.childNodes = o78;
// undefined
o84 = null;
// 19696
o78.item = f974244559_517;
// 19697
o78.length = 1;
// 19698
o78["0"] = o79;
// undefined
o78 = null;
// 19699
o78 = {};
// 19700
o79.classList = o78;
// 19702
o78.contains = f974244559_1617;
// undefined
o78 = null;
// 19703
f974244559_1617.returns.push(false);
// 19706
o77.remove = f974244559_1244;
// 19707
f974244559_1244.returns.push(undefined);
// 19711
f974244559_1244.returns.push(undefined);
// 19715
f974244559_1244.returns.push(undefined);
// 19716
o78 = {};
// 19717
o14.classList = o78;
// undefined
o14 = null;
// 19719
o78.contains = f974244559_1617;
// 19720
f974244559_1617.returns.push(true);
// 19723
o78.remove = f974244559_1244;
// 19724
f974244559_1244.returns.push(undefined);
// 19728
f974244559_1244.returns.push(undefined);
// 19731
o78.add = f974244559_1110;
// undefined
o78 = null;
// 19732
f974244559_1110.returns.push(undefined);
// 19735
o83.add = f974244559_1110;
// undefined
o83 = null;
// 19736
f974244559_1110.returns.push(undefined);
// 19739
o77.add = f974244559_1110;
// undefined
o77 = null;
// 19740
f974244559_1110.returns.push(undefined);
// 19743
o82.remove = f974244559_1244;
// undefined
o82 = null;
// 19744
f974244559_1244.returns.push(undefined);
// 19749
f974244559_1617.returns.push(false);
// 19753
f974244559_502.returns.push(o193);
// 19759
o14 = {};
// 19760
f974244559_523.returns.push(o14);
// 19761
o14.length = 1;
// 19762
o77 = {};
// 19763
o14["0"] = o77;
// undefined
o14 = null;
// 19764
o14 = {};
// 19765
o77.style = o14;
// undefined
o77 = null;
// 19766
// undefined
o14 = null;
// 19771
f974244559_1617.returns.push(false);
// 19775
f974244559_502.returns.push(o193);
// 19778
o79.getElementsByTagName = f974244559_514;
// 19780
o79.querySelectorAll = f974244559_523;
// undefined
o79 = null;
// 19781
o14 = {};
// 19782
f974244559_523.returns.push(o14);
// 19783
o14.length = 1;
// 19784
o77 = {};
// 19785
o14["0"] = o77;
// undefined
o14 = null;
// 19786
o14 = {};
// 19787
o77.style = o14;
// undefined
o77 = null;
// 19788
// undefined
o14 = null;
// 19792
o14 = {};
// 19793
f974244559_523.returns.push(o14);
// 19794
o14.length = 1;
// 19795
o77 = {};
// 19796
o14["0"] = o77;
// undefined
o14 = null;
// 19797
o77.nodeName = "DIV";
// 19798
o77.__FB_TOKEN = void 0;
// 19799
// 19800
o77.getAttribute = f974244559_500;
// 19801
o77.hasAttribute = f974244559_527;
// 19803
f974244559_527.returns.push(false);
// 19804
o77.JSBNG__addEventListener = f974244559_472;
// 19806
f974244559_472.returns.push(undefined);
// 19807
o77.JSBNG__onclick = null;
// undefined
o77 = null;
// 19810
f974244559_2178.returns.push("TimelineConstants/sectionLoaded");
// 19817
f974244559_2178.returns.push("hide");
// 19818
f974244559_2178.returns.push("show");
// 19820
f974244559_2178.returns.push("close");
// 19821
f974244559_2178.returns.push("open");
// 19825
o14 = {};
// 19826
f974244559_502.returns.push(o14);
// undefined
o14 = null;
// 19827
o14 = {};
// 19828
o77 = {};
// 19830
o14.length = 1;
// 19831
o14["0"] = "jsIYP";
// 19834
f974244559_471.returns.push(1373491299518);
// 19837
f974244559_471.returns.push(1373491299519);
// 19839
f974244559_471.returns.push(1373491299519);
// 19842
f974244559_471.returns.push(1373491299520);
// 19845
f974244559_471.returns.push(1373491299520);
// 19847
f974244559_471.returns.push(1373491299520);
// 19850
f974244559_471.returns.push(1373491299521);
// 19853
f974244559_471.returns.push(1373491299521);
// 19856
o78 = {};
// 19857
f974244559_502.returns.push(o78);
// undefined
o78 = null;
// 19859
o78 = {};
// 19860
f974244559_502.returns.push(o78);
// undefined
o78 = null;
// 19862
o78 = {};
// 19863
f974244559_502.returns.push(o78);
// 19865
o79 = {};
// 19866
f974244559_502.returns.push(o79);
// 19868
f974244559_2178.returns.push("SubMenu/Reset");
// 19869
o78.nodeName = "LI";
// 19870
o78.__FB_TOKEN = void 0;
// 19871
// 19872
o78.getAttribute = f974244559_500;
// 19873
o78.hasAttribute = f974244559_527;
// 19875
f974244559_527.returns.push(false);
// 19876
o78.JSBNG__addEventListener = f974244559_472;
// 19878
f974244559_472.returns.push(undefined);
// 19879
o78.JSBNG__onclick = null;
// undefined
o78 = null;
// 19881
o79.nodeName = "LI";
// 19882
o79.__FB_TOKEN = void 0;
// 19883
// 19884
o79.getAttribute = f974244559_500;
// 19885
o79.hasAttribute = f974244559_527;
// 19887
f974244559_527.returns.push(false);
// 19888
o79.JSBNG__addEventListener = f974244559_472;
// 19890
f974244559_472.returns.push(undefined);
// 19891
o79.JSBNG__onclick = null;
// undefined
o79 = null;
// 19896
f974244559_471.returns.push(1373491299530);
// 19899
f974244559_471.returns.push(1373491299531);
// 19902
f974244559_471.returns.push(1373491299532);
// 19904
f974244559_471.returns.push(1373491299532);
// 19907
f974244559_471.returns.push(1373491299533);
// 19910
f974244559_471.returns.push(1373491299533);
// 19912
f974244559_471.returns.push(1373491299533);
// 19915
f974244559_471.returns.push(1373491299534);
// 19918
f974244559_471.returns.push(1373491299535);
// 19920
f974244559_471.returns.push(1373491299535);
// 19923
f974244559_471.returns.push(1373491299536);
// 19926
f974244559_471.returns.push(1373491299536);
// 19929
f974244559_502.returns.push(o19);
// 19934
f974244559_2178.returns.push("dom-scroll");
// 19945
f974244559_2178.returns.push("TimelineConstants/sectionFullyLoaded");
// 19949
f974244559_2178.returns.push("TimelineConstants/sectionFullyLoaded");
// 19951
f974244559_471.returns.push(1373491299543);
// 19954
f974244559_471.returns.push(1373491299544);
// 19957
f974244559_471.returns.push(1373491299545);
// 19960
f974244559_502.returns.push(o121);
// 19961
o78 = {};
// 19962
o121.childNodes = o78;
// 19963
o79 = {};
// 19964
o78["0"] = o79;
// 19965
o78.length = 8;
// 19967
o79.getAttribute = f974244559_500;
// 19968
f974244559_500.returns.push("recent");
// 19971
o79.getElementsByTagName = f974244559_514;
// 19973
o79.querySelectorAll = f974244559_523;
// undefined
o79 = null;
// 19974
o79 = {};
// 19975
f974244559_523.returns.push(o79);
// 19976
o79.length = 0;
// undefined
o79 = null;
// 19979
f974244559_500.returns.push(null);
// 19981
o79 = {};
// 19982
o78["1"] = o79;
// 19983
o79.getAttribute = f974244559_500;
// 19984
f974244559_500.returns.push("year_2013");
// 19987
o79.getElementsByTagName = f974244559_514;
// 19989
o79.querySelectorAll = f974244559_523;
// 19990
o81 = {};
// 19991
f974244559_523.returns.push(o81);
// 19992
o81.length = 1;
// 19993
o82 = {};
// 19994
o81["0"] = o82;
// undefined
o81 = null;
// 19995
o81 = {};
// 19996
o82.childNodes = o81;
// undefined
o82 = null;
// 19997
o81.length = 1;
// 19998
o82 = {};
// 19999
o81["0"] = o82;
// undefined
o81 = null;
// 20000
o82.getAttribute = f974244559_500;
// undefined
o82 = null;
// 20001
f974244559_500.returns.push("month_2013_1");
// 20006
f974244559_500.returns.push("2010s");
// 20009
o81 = {};
// 20010
o78["2"] = o81;
// 20011
o81.getAttribute = f974244559_500;
// 20012
f974244559_500.returns.push("year_2012");
// 20015
o81.getElementsByTagName = f974244559_514;
// 20017
o81.querySelectorAll = f974244559_523;
// undefined
o81 = null;
// 20018
o81 = {};
// 20019
f974244559_523.returns.push(o81);
// 20020
o81.length = 1;
// 20021
o82 = {};
// 20022
o81["0"] = o82;
// undefined
o81 = null;
// 20023
o81 = {};
// 20024
o82.childNodes = o81;
// undefined
o82 = null;
// 20025
o81.length = 12;
// 20026
o82 = {};
// 20027
o81["0"] = o82;
// 20028
o82.getAttribute = f974244559_500;
// undefined
o82 = null;
// 20029
f974244559_500.returns.push("month_2012_12");
// 20032
o82 = {};
// 20033
o81["1"] = o82;
// 20034
o82.getAttribute = f974244559_500;
// undefined
o82 = null;
// 20035
f974244559_500.returns.push("month_2012_11");
// 20038
o82 = {};
// 20039
o81["2"] = o82;
// 20040
o82.getAttribute = f974244559_500;
// undefined
o82 = null;
// 20041
f974244559_500.returns.push("month_2012_10");
// 20044
o82 = {};
// 20045
o81["3"] = o82;
// 20046
o82.getAttribute = f974244559_500;
// undefined
o82 = null;
// 20047
f974244559_500.returns.push("month_2012_9");
// 20050
o82 = {};
// 20051
o81["4"] = o82;
// 20052
o82.getAttribute = f974244559_500;
// undefined
o82 = null;
// 20053
f974244559_500.returns.push("month_2012_8");
// 20056
o82 = {};
// 20057
o81["5"] = o82;
// 20058
o82.getAttribute = f974244559_500;
// undefined
o82 = null;
// 20059
f974244559_500.returns.push("month_2012_7");
// 20062
o82 = {};
// 20063
o81["6"] = o82;
// 20064
o82.getAttribute = f974244559_500;
// undefined
o82 = null;
// 20065
f974244559_500.returns.push("month_2012_6");
// 20068
o82 = {};
// 20069
o81["7"] = o82;
// 20070
o82.getAttribute = f974244559_500;
// undefined
o82 = null;
// 20071
f974244559_500.returns.push("month_2012_5");
// 20074
o82 = {};
// 20075
o81["8"] = o82;
// 20076
o82.getAttribute = f974244559_500;
// undefined
o82 = null;
// 20077
f974244559_500.returns.push("month_2012_4");
// 20080
o82 = {};
// 20081
o81["9"] = o82;
// 20082
o82.getAttribute = f974244559_500;
// undefined
o82 = null;
// 20083
f974244559_500.returns.push("month_2012_3");
// 20086
o82 = {};
// 20087
o81["10"] = o82;
// 20088
o82.getAttribute = f974244559_500;
// undefined
o82 = null;
// 20089
f974244559_500.returns.push("month_2012_2");
// 20092
o82 = {};
// 20093
o81["11"] = o82;
// undefined
o81 = null;
// 20094
o82.getAttribute = f974244559_500;
// undefined
o82 = null;
// 20095
f974244559_500.returns.push("month_2012_1");
// 20100
f974244559_500.returns.push("2010s");
// 20103
o81 = {};
// 20104
o78["3"] = o81;
// 20105
o81.getAttribute = f974244559_500;
// 20106
f974244559_500.returns.push("year_2011");
// 20109
o81.getElementsByTagName = f974244559_514;
// 20111
o81.querySelectorAll = f974244559_523;
// 20112
o82 = {};
// 20113
f974244559_523.returns.push(o82);
// 20114
o82.length = 1;
// 20115
o83 = {};
// 20116
o82["0"] = o83;
// undefined
o82 = null;
// 20117
o82 = {};
// 20118
o83.childNodes = o82;
// undefined
o83 = null;
// 20119
o82.length = 12;
// 20120
o83 = {};
// 20121
o82["0"] = o83;
// 20122
o83.getAttribute = f974244559_500;
// undefined
o83 = null;
// 20123
f974244559_500.returns.push("month_2011_12");
// 20126
o83 = {};
// 20127
o82["1"] = o83;
// 20128
o83.getAttribute = f974244559_500;
// undefined
o83 = null;
// 20129
f974244559_500.returns.push("month_2011_11");
// 20132
o83 = {};
// 20133
o82["2"] = o83;
// 20134
o83.getAttribute = f974244559_500;
// undefined
o83 = null;
// 20135
f974244559_500.returns.push("month_2011_10");
// 20138
o83 = {};
// 20139
o82["3"] = o83;
// 20140
o83.getAttribute = f974244559_500;
// undefined
o83 = null;
// 20141
f974244559_500.returns.push("month_2011_9");
// 20144
o83 = {};
// 20145
o82["4"] = o83;
// 20146
o83.getAttribute = f974244559_500;
// undefined
o83 = null;
// 20147
f974244559_500.returns.push("month_2011_8");
// 20150
o83 = {};
// 20151
o82["5"] = o83;
// 20152
o83.getAttribute = f974244559_500;
// undefined
o83 = null;
// 20153
f974244559_500.returns.push("month_2011_7");
// 20156
o83 = {};
// 20157
o82["6"] = o83;
// 20158
o83.getAttribute = f974244559_500;
// undefined
o83 = null;
// 20159
f974244559_500.returns.push("month_2011_6");
// 20162
o83 = {};
// 20163
o82["7"] = o83;
// 20164
o83.getAttribute = f974244559_500;
// undefined
o83 = null;
// 20165
f974244559_500.returns.push("month_2011_5");
// 20168
o83 = {};
// 20169
o82["8"] = o83;
// 20170
o83.getAttribute = f974244559_500;
// undefined
o83 = null;
// 20171
f974244559_500.returns.push("month_2011_4");
// 20174
o83 = {};
// 20175
o82["9"] = o83;
// 20176
o83.getAttribute = f974244559_500;
// undefined
o83 = null;
// 20177
f974244559_500.returns.push("month_2011_3");
// 20180
o83 = {};
// 20181
o82["10"] = o83;
// 20182
o83.getAttribute = f974244559_500;
// undefined
o83 = null;
// 20183
f974244559_500.returns.push("month_2011_2");
// 20186
o83 = {};
// 20187
o82["11"] = o83;
// undefined
o82 = null;
// 20188
o83.getAttribute = f974244559_500;
// undefined
o83 = null;
// 20189
f974244559_500.returns.push("month_2011_1");
// 20194
f974244559_500.returns.push("2010s");
// 20197
o82 = {};
// 20198
o78["4"] = o82;
// 20199
o82.getAttribute = f974244559_500;
// 20200
f974244559_500.returns.push("year_2010");
// 20203
o82.getElementsByTagName = f974244559_514;
// 20205
o82.querySelectorAll = f974244559_523;
// undefined
o82 = null;
// 20206
o82 = {};
// 20207
f974244559_523.returns.push(o82);
// 20208
o82.length = 1;
// 20209
o83 = {};
// 20210
o82["0"] = o83;
// undefined
o82 = null;
// 20211
o82 = {};
// 20212
o83.childNodes = o82;
// undefined
o83 = null;
// 20213
o82.length = 12;
// 20214
o83 = {};
// 20215
o82["0"] = o83;
// 20216
o83.getAttribute = f974244559_500;
// undefined
o83 = null;
// 20217
f974244559_500.returns.push("month_2010_12");
// 20220
o83 = {};
// 20221
o82["1"] = o83;
// 20222
o83.getAttribute = f974244559_500;
// undefined
o83 = null;
// 20223
f974244559_500.returns.push("month_2010_11");
// 20226
o83 = {};
// 20227
o82["2"] = o83;
// 20228
o83.getAttribute = f974244559_500;
// undefined
o83 = null;
// 20229
f974244559_500.returns.push("month_2010_10");
// 20232
o83 = {};
// 20233
o82["3"] = o83;
// 20234
o83.getAttribute = f974244559_500;
// undefined
o83 = null;
// 20235
f974244559_500.returns.push("month_2010_9");
// 20238
o83 = {};
// 20239
o82["4"] = o83;
// 20240
o83.getAttribute = f974244559_500;
// undefined
o83 = null;
// 20241
f974244559_500.returns.push("month_2010_8");
// 20244
o83 = {};
// 20245
o82["5"] = o83;
// 20246
o83.getAttribute = f974244559_500;
// undefined
o83 = null;
// 20247
f974244559_500.returns.push("month_2010_7");
// 20250
o83 = {};
// 20251
o82["6"] = o83;
// 20252
o83.getAttribute = f974244559_500;
// undefined
o83 = null;
// 20253
f974244559_500.returns.push("month_2010_6");
// 20256
o83 = {};
// 20257
o82["7"] = o83;
// 20258
o83.getAttribute = f974244559_500;
// undefined
o83 = null;
// 20259
f974244559_500.returns.push("month_2010_5");
// 20262
o83 = {};
// 20263
o82["8"] = o83;
// 20264
o83.getAttribute = f974244559_500;
// undefined
o83 = null;
// 20265
f974244559_500.returns.push("month_2010_4");
// 20268
o83 = {};
// 20269
o82["9"] = o83;
// 20270
o83.getAttribute = f974244559_500;
// undefined
o83 = null;
// 20271
f974244559_500.returns.push("month_2010_3");
// 20274
o83 = {};
// 20275
o82["10"] = o83;
// 20276
o83.getAttribute = f974244559_500;
// undefined
o83 = null;
// 20277
f974244559_500.returns.push("month_2010_2");
// 20280
o83 = {};
// 20281
o82["11"] = o83;
// undefined
o82 = null;
// 20282
o83.getAttribute = f974244559_500;
// undefined
o83 = null;
// 20283
f974244559_500.returns.push("month_2010_1");
// 20288
f974244559_500.returns.push("2010s");
// 20291
o82 = {};
// 20292
o78["5"] = o82;
// 20293
o82.getAttribute = f974244559_500;
// 20294
f974244559_500.returns.push("year_2009");
// 20297
o82.getElementsByTagName = f974244559_514;
// 20299
o82.querySelectorAll = f974244559_523;
// undefined
o82 = null;
// 20300
o82 = {};
// 20301
f974244559_523.returns.push(o82);
// 20302
o82.length = 1;
// 20303
o83 = {};
// 20304
o82["0"] = o83;
// undefined
o82 = null;
// 20305
o82 = {};
// 20306
o83.childNodes = o82;
// undefined
o83 = null;
// 20307
o82.length = 12;
// 20308
o83 = {};
// 20309
o82["0"] = o83;
// 20310
o83.getAttribute = f974244559_500;
// undefined
o83 = null;
// 20311
f974244559_500.returns.push("month_2009_12");
// 20314
o83 = {};
// 20315
o82["1"] = o83;
// 20316
o83.getAttribute = f974244559_500;
// undefined
o83 = null;
// 20317
f974244559_500.returns.push("month_2009_11");
// 20320
o83 = {};
// 20321
o82["2"] = o83;
// 20322
o83.getAttribute = f974244559_500;
// undefined
o83 = null;
// 20323
f974244559_500.returns.push("month_2009_10");
// 20326
o83 = {};
// 20327
o82["3"] = o83;
// 20328
o83.getAttribute = f974244559_500;
// undefined
o83 = null;
// 20329
f974244559_500.returns.push("month_2009_9");
// 20332
o83 = {};
// 20333
o82["4"] = o83;
// 20334
o83.getAttribute = f974244559_500;
// undefined
o83 = null;
// 20335
f974244559_500.returns.push("month_2009_8");
// 20338
o83 = {};
// 20339
o82["5"] = o83;
// 20340
o83.getAttribute = f974244559_500;
// undefined
o83 = null;
// 20341
f974244559_500.returns.push("month_2009_7");
// 20344
o83 = {};
// 20345
o82["6"] = o83;
// 20346
o83.getAttribute = f974244559_500;
// undefined
o83 = null;
// 20347
f974244559_500.returns.push("month_2009_6");
// 20350
o83 = {};
// 20351
o82["7"] = o83;
// 20352
o83.getAttribute = f974244559_500;
// undefined
o83 = null;
// 20353
f974244559_500.returns.push("month_2009_5");
// 20356
o83 = {};
// 20357
o82["8"] = o83;
// 20358
o83.getAttribute = f974244559_500;
// undefined
o83 = null;
// 20359
f974244559_500.returns.push("month_2009_4");
// 20362
o83 = {};
// 20363
o82["9"] = o83;
// 20364
o83.getAttribute = f974244559_500;
// undefined
o83 = null;
// 20365
f974244559_500.returns.push("month_2009_3");
// 20368
o83 = {};
// 20369
o82["10"] = o83;
// 20370
o83.getAttribute = f974244559_500;
// undefined
o83 = null;
// 20371
f974244559_500.returns.push("month_2009_2");
// 20374
o83 = {};
// 20375
o82["11"] = o83;
// undefined
o82 = null;
// 20376
o83.getAttribute = f974244559_500;
// undefined
o83 = null;
// 20377
f974244559_500.returns.push("month_2009_1");
// 20382
f974244559_500.returns.push("2000s");
// 20385
o82 = {};
// 20386
o78["6"] = o82;
// 20387
o82.getAttribute = f974244559_500;
// 20388
f974244559_500.returns.push("year_2008");
// 20391
o82.getElementsByTagName = f974244559_514;
// 20393
o82.querySelectorAll = f974244559_523;
// undefined
o82 = null;
// 20394
o82 = {};
// 20395
f974244559_523.returns.push(o82);
// 20396
o82.length = 1;
// 20397
o83 = {};
// 20398
o82["0"] = o83;
// undefined
o82 = null;
// 20399
o82 = {};
// 20400
o83.childNodes = o82;
// undefined
o83 = null;
// 20401
o82.length = 12;
// 20402
o83 = {};
// 20403
o82["0"] = o83;
// 20404
o83.getAttribute = f974244559_500;
// undefined
o83 = null;
// 20405
f974244559_500.returns.push("month_2008_12");
// 20408
o83 = {};
// 20409
o82["1"] = o83;
// 20410
o83.getAttribute = f974244559_500;
// undefined
o83 = null;
// 20411
f974244559_500.returns.push("month_2008_11");
// 20414
o83 = {};
// 20415
o82["2"] = o83;
// 20416
o83.getAttribute = f974244559_500;
// undefined
o83 = null;
// 20417
f974244559_500.returns.push("month_2008_10");
// 20420
o83 = {};
// 20421
o82["3"] = o83;
// 20422
o83.getAttribute = f974244559_500;
// undefined
o83 = null;
// 20423
f974244559_500.returns.push("month_2008_9");
// 20426
o83 = {};
// 20427
o82["4"] = o83;
// 20428
o83.getAttribute = f974244559_500;
// undefined
o83 = null;
// 20429
f974244559_500.returns.push("month_2008_8");
// 20432
o83 = {};
// 20433
o82["5"] = o83;
// 20434
o83.getAttribute = f974244559_500;
// undefined
o83 = null;
// 20435
f974244559_500.returns.push("month_2008_7");
// 20438
o83 = {};
// 20439
o82["6"] = o83;
// 20440
o83.getAttribute = f974244559_500;
// undefined
o83 = null;
// 20441
f974244559_500.returns.push("month_2008_6");
// 20444
o83 = {};
// 20445
o82["7"] = o83;
// 20446
o83.getAttribute = f974244559_500;
// undefined
o83 = null;
// 20447
f974244559_500.returns.push("month_2008_5");
// 20450
o83 = {};
// 20451
o82["8"] = o83;
// 20452
o83.getAttribute = f974244559_500;
// undefined
o83 = null;
// 20453
f974244559_500.returns.push("month_2008_4");
// 20456
o83 = {};
// 20457
o82["9"] = o83;
// 20458
o83.getAttribute = f974244559_500;
// undefined
o83 = null;
// 20459
f974244559_500.returns.push("month_2008_3");
// 20462
o83 = {};
// 20463
o82["10"] = o83;
// 20464
o83.getAttribute = f974244559_500;
// undefined
o83 = null;
// 20465
f974244559_500.returns.push("month_2008_2");
// 20468
o83 = {};
// 20469
o82["11"] = o83;
// undefined
o82 = null;
// 20470
o83.getAttribute = f974244559_500;
// undefined
o83 = null;
// 20471
f974244559_500.returns.push("month_2008_1");
// 20476
f974244559_500.returns.push("2000s");
// 20479
o82 = {};
// 20480
o78["7"] = o82;
// undefined
o78 = null;
// 20481
o82.getAttribute = f974244559_500;
// 20482
f974244559_500.returns.push("way_back");
// 20485
o82.getElementsByTagName = f974244559_514;
// 20487
o82.querySelectorAll = f974244559_523;
// undefined
o82 = null;
// 20488
o78 = {};
// 20489
f974244559_523.returns.push(o78);
// 20490
o78.length = 0;
// undefined
o78 = null;
// 20493
f974244559_500.returns.push(null);
// 20495
o121.nodeName = "UL";
// 20496
o121.__FB_TOKEN = void 0;
// 20497
// 20498
o121.getAttribute = f974244559_500;
// 20499
o121.hasAttribute = f974244559_527;
// 20501
f974244559_527.returns.push(false);
// 20502
o121.JSBNG__addEventListener = f974244559_472;
// 20504
f974244559_472.returns.push(undefined);
// 20505
o121.JSBNG__onclick = null;
// 20510
f974244559_472.returns.push(undefined);
// 20511
o121.JSBNG__onkeydown = null;
// 20513
o121.getElementsByTagName = f974244559_514;
// 20515
o121.querySelectorAll = f974244559_523;
// 20516
o78 = {};
// 20517
f974244559_523.returns.push(o78);
// 20518
o78.length = 69;
// 20519
o82 = {};
// 20520
o78["0"] = o82;
// undefined
o82 = null;
// 20521
o82 = {};
// 20522
o78["1"] = o82;
// 20523
o83 = {};
// 20524
o78["2"] = o83;
// undefined
o83 = null;
// 20525
o83 = {};
// 20526
o78["3"] = o83;
// undefined
o83 = null;
// 20527
o83 = {};
// 20528
o78["4"] = o83;
// undefined
o83 = null;
// 20529
o83 = {};
// 20530
o78["5"] = o83;
// undefined
o83 = null;
// 20531
o83 = {};
// 20532
o78["6"] = o83;
// undefined
o83 = null;
// 20533
o83 = {};
// 20534
o78["7"] = o83;
// undefined
o83 = null;
// 20535
o83 = {};
// 20536
o78["8"] = o83;
// undefined
o83 = null;
// 20537
o83 = {};
// 20538
o78["9"] = o83;
// undefined
o83 = null;
// 20539
o83 = {};
// 20540
o78["10"] = o83;
// undefined
o83 = null;
// 20541
o83 = {};
// 20542
o78["11"] = o83;
// undefined
o83 = null;
// 20543
o83 = {};
// 20544
o78["12"] = o83;
// undefined
o83 = null;
// 20545
o83 = {};
// 20546
o78["13"] = o83;
// undefined
o83 = null;
// 20547
o83 = {};
// 20548
o78["14"] = o83;
// undefined
o83 = null;
// 20549
o83 = {};
// 20550
o78["15"] = o83;
// undefined
o83 = null;
// 20551
o83 = {};
// 20552
o78["16"] = o83;
// 20553
o84 = {};
// 20554
o78["17"] = o84;
// undefined
o84 = null;
// 20555
o84 = {};
// 20556
o78["18"] = o84;
// undefined
o84 = null;
// 20557
o84 = {};
// 20558
o78["19"] = o84;
// undefined
o84 = null;
// 20559
o84 = {};
// 20560
o78["20"] = o84;
// undefined
o84 = null;
// 20561
o84 = {};
// 20562
o78["21"] = o84;
// undefined
o84 = null;
// 20563
o84 = {};
// 20564
o78["22"] = o84;
// undefined
o84 = null;
// 20565
o84 = {};
// 20566
o78["23"] = o84;
// undefined
o84 = null;
// 20567
o84 = {};
// 20568
o78["24"] = o84;
// undefined
o84 = null;
// 20569
o84 = {};
// 20570
o78["25"] = o84;
// undefined
o84 = null;
// 20571
o84 = {};
// 20572
o78["26"] = o84;
// undefined
o84 = null;
// 20573
o84 = {};
// 20574
o78["27"] = o84;
// undefined
o84 = null;
// 20575
o84 = {};
// 20576
o78["28"] = o84;
// undefined
o84 = null;
// 20577
o84 = {};
// 20578
o78["29"] = o84;
// undefined
o84 = null;
// 20579
o84 = {};
// 20580
o78["30"] = o84;
// undefined
o84 = null;
// 20581
o84 = {};
// 20582
o78["31"] = o84;
// undefined
o84 = null;
// 20583
o84 = {};
// 20584
o78["32"] = o84;
// undefined
o84 = null;
// 20585
o84 = {};
// 20586
o78["33"] = o84;
// undefined
o84 = null;
// 20587
o84 = {};
// 20588
o78["34"] = o84;
// undefined
o84 = null;
// 20589
o84 = {};
// 20590
o78["35"] = o84;
// undefined
o84 = null;
// 20591
o84 = {};
// 20592
o78["36"] = o84;
// undefined
o84 = null;
// 20593
o84 = {};
// 20594
o78["37"] = o84;
// undefined
o84 = null;
// 20595
o84 = {};
// 20596
o78["38"] = o84;
// undefined
o84 = null;
// 20597
o84 = {};
// 20598
o78["39"] = o84;
// undefined
o84 = null;
// 20599
o84 = {};
// 20600
o78["40"] = o84;
// undefined
o84 = null;
// 20601
o84 = {};
// 20602
o78["41"] = o84;
// undefined
o84 = null;
// 20603
o84 = {};
// 20604
o78["42"] = o84;
// undefined
o84 = null;
// 20605
o84 = {};
// 20606
o78["43"] = o84;
// undefined
o84 = null;
// 20607
o84 = {};
// 20608
o78["44"] = o84;
// undefined
o84 = null;
// 20609
o84 = {};
// 20610
o78["45"] = o84;
// undefined
o84 = null;
// 20611
o84 = {};
// 20612
o78["46"] = o84;
// undefined
o84 = null;
// 20613
o84 = {};
// 20614
o78["47"] = o84;
// undefined
o84 = null;
// 20615
o84 = {};
// 20616
o78["48"] = o84;
// undefined
o84 = null;
// 20617
o84 = {};
// 20618
o78["49"] = o84;
// undefined
o84 = null;
// 20619
o84 = {};
// 20620
o78["50"] = o84;
// undefined
o84 = null;
// 20621
o84 = {};
// 20622
o78["51"] = o84;
// undefined
o84 = null;
// 20623
o84 = {};
// 20624
o78["52"] = o84;
// undefined
o84 = null;
// 20625
o84 = {};
// 20626
o78["53"] = o84;
// undefined
o84 = null;
// 20627
o84 = {};
// 20628
o78["54"] = o84;
// undefined
o84 = null;
// 20629
o84 = {};
// 20630
o78["55"] = o84;
// undefined
o84 = null;
// 20631
o84 = {};
// 20632
o78["56"] = o84;
// undefined
o84 = null;
// 20633
o84 = {};
// 20634
o78["57"] = o84;
// undefined
o84 = null;
// 20635
o84 = {};
// 20636
o78["58"] = o84;
// undefined
o84 = null;
// 20637
o84 = {};
// 20638
o78["59"] = o84;
// undefined
o84 = null;
// 20639
o84 = {};
// 20640
o78["60"] = o84;
// undefined
o84 = null;
// 20641
o84 = {};
// 20642
o78["61"] = o84;
// undefined
o84 = null;
// 20643
o84 = {};
// 20644
o78["62"] = o84;
// undefined
o84 = null;
// 20645
o84 = {};
// 20646
o78["63"] = o84;
// undefined
o84 = null;
// 20647
o84 = {};
// 20648
o78["64"] = o84;
// undefined
o84 = null;
// 20649
o84 = {};
// 20650
o78["65"] = o84;
// undefined
o84 = null;
// 20651
o84 = {};
// 20652
o78["66"] = o84;
// undefined
o84 = null;
// 20653
o84 = {};
// 20654
o78["67"] = o84;
// undefined
o84 = null;
// 20655
o84 = {};
// 20656
o78["68"] = o84;
// undefined
o78 = null;
// undefined
o84 = null;
// 20657
o78 = {};
// 20658
o121.classList = o78;
// 20660
o78.remove = f974244559_1244;
// undefined
o78 = null;
// 20661
f974244559_1244.returns.push(undefined);
// 20664
o121.offsetHeight = 200;
// 20668
f974244559_1244.returns.push(undefined);
// 20673
f974244559_1617.returns.push(false);
// 20675
f974244559_502.returns.push(o111);
// 20676
o78 = {};
// 20677
o111.classList = o78;
// 20679
o78.contains = f974244559_1617;
// undefined
o78 = null;
// 20680
f974244559_1617.returns.push(false);
// 20681
o121.parentNode = o111;
// 20683
f974244559_2178.returns.push("TimelineConstants/sectionLoaded");
// 20685
f974244559_471.returns.push(1373491299614);
// 20688
f974244559_471.returns.push(1373491299615);
// 20691
f974244559_471.returns.push(1373491299615);
// 20694
f974244559_502.returns.push(o49);
// 20695
o49.__FB_TOKEN = void 0;
// 20696
// 20699
f974244559_502.returns.push(o58);
// 20700
o58.__FB_TOKEN = void 0;
// 20701
// undefined
o58 = null;
// 20704
f974244559_502.returns.push(o63);
// 20705
o63.__FB_TOKEN = void 0;
// 20706
// 20709
f974244559_502.returns.push(o64);
// 20710
o64.__FB_TOKEN = void 0;
// 20711
// undefined
o64 = null;
// 20714
f974244559_502.returns.push(o65);
// 20715
o65.__FB_TOKEN = void 0;
// 20716
// undefined
o65 = null;
// 20718
f974244559_471.returns.push(1373491299617);
// 20721
f974244559_471.returns.push(1373491299618);
// 20724
f974244559_471.returns.push(1373491299619);
// 20726
f974244559_471.returns.push(1373491299619);
// 20735
f974244559_472.returns.push(undefined);
// 20736
o0.JSBNG__onfullscreenchange = void 0;
// 20741
f974244559_472.returns.push(undefined);
// 20742
o0.JSBNG__onmozfullscreenchange = void 0;
// 20747
f974244559_472.returns.push(undefined);
// 20748
o0.JSBNG__onwebkitfullscreenchange = null;
// 20751
f974244559_2853 = function() { return f974244559_2853.returns[f974244559_2853.inst++]; };
f974244559_2853.returns = [];
f974244559_2853.inst = 0;
// 20752
f974244559_2110.thatReturnsNull = f974244559_2853;
// 20759
o58 = {};
// 20760
f974244559_480.returns.push(o58);
// 20761
// 20762
// 20763
o58.getElementsByTagName = f974244559_514;
// 20764
o64 = {};
// 20765
f974244559_514.returns.push(o64);
// 20766
o64.length = 0;
// undefined
o64 = null;
// 20768
o64 = {};
// 20769
o58.childNodes = o64;
// undefined
o58 = null;
// 20770
o64.item = f974244559_517;
// 20771
o64.length = 1;
// 20772
o58 = {};
// 20773
o64["0"] = o58;
// undefined
o64 = null;
// undefined
o58 = null;
// 20779
f974244559_2853.__prototyped = void 0;
// 20788
f974244559_471.returns.push(1373491299733);
// 20793
f974244559_471.returns.push(1373491299734);
// 20797
f974244559_471.returns.push(1373491299734);
// 20800
o37.__html = void 0;
// 20801
o37.mountComponentIntoNode = void 0;
// undefined
o37 = null;
// 20803
o37 = {};
// 20804
f974244559_480.returns.push(o37);
// 20805
// 20806
o37.firstChild = null;
// 20808
o58 = {};
// 20809
f974244559_478.returns.push(o58);
// 20811
o37.appendChild = f974244559_482;
// 20812
f974244559_482.returns.push(o58);
// undefined
o58 = null;
// 20814
o58 = {};
// 20815
f974244559_480.returns.push(o58);
// 20816
// 20817
o58.firstChild = null;
// 20819
o64 = {};
// 20820
f974244559_478.returns.push(o64);
// 20821
o37.__html = void 0;
// undefined
o37 = null;
// 20822
o58.appendChild = f974244559_482;
// 20823
f974244559_482.returns.push(o64);
// undefined
o64 = null;
// 20824
o58.setAttribute = f974244559_643;
// 20826
f974244559_643.returns.push(undefined);
// 20829
f974244559_643.returns.push(undefined);
// 20830
// 20833
f974244559_643.returns.push(undefined);
// 20836
f974244559_643.returns.push(undefined);
// 20837
o37 = {};
// 20838
o58.classList = o37;
// 20840
o37.add = f974244559_1110;
// undefined
o37 = null;
// 20841
f974244559_1110.returns.push(undefined);
// 20845
f974244559_1110.returns.push(undefined);
// 20849
f974244559_1110.returns.push(undefined);
// 20850
o58.__FB_TOKEN = void 0;
// 20851
// 20853
f974244559_2178.returns.push("show");
// 20854
f974244559_2178.returns.push("hide");
// 20856
f974244559_2178.returns.push("aftershow");
// 20858
f974244559_2178.returns.push("show");
// 20860
f974244559_2178.returns.push("hide");
// 20865
o37 = {};
// 20866
f974244559_523.returns.push(o37);
// 20867
o37.length = 1;
// 20868
o37["0"] = o76;
// undefined
o37 = null;
// undefined
o76 = null;
// 20870
f974244559_2178.returns.push("show");
// 20871
f974244559_2178.returns.push("hide");
// 20873
f974244559_2178.returns.push("show");
// 20875
f974244559_2178.returns.push("hide");
// 20877
f974244559_2178.returns.push("key");
// 20878
f974244559_2864 = function() { return f974244559_2864.returns[f974244559_2864.inst++]; };
f974244559_2864.returns = [];
f974244559_2864.inst = 0;
// 20879
o0.webkitCancelFullScreen = f974244559_2864;
// 20881
f974244559_2178.returns.push("JSBNG__blur");
// 20883
f974244559_2178.returns.push("hide");
// 20885
f974244559_2178.returns.push("key");
// 20886
o58.getElementsByTagName = f974244559_514;
// 20888
o58.querySelectorAll = f974244559_523;
// undefined
o58 = null;
// 20889
o37 = {};
// 20890
f974244559_523.returns.push(o37);
// 20891
o37.length = 0;
// undefined
o37 = null;
// 20895
o37 = {};
// 20896
f974244559_523.returns.push(o37);
// 20897
o37.length = 0;
// undefined
o37 = null;
// 20901
o37 = {};
// 20902
f974244559_523.returns.push(o37);
// 20903
o37.length = 0;
// undefined
o37 = null;
// 20907
f974244559_1110.returns.push(undefined);
// 20909
f974244559_471.returns.push(1373491299751);
// 20911
f974244559_471.returns.push(1373491299751);
// 20913
f974244559_2178.returns.push("PhotoSnowlift.GO");
// 20915
f974244559_2178.returns.push("PhotoTagApproval.HILITE_TAG");
// 20917
f974244559_2178.returns.push("PhotoTagApproval.UPDATE_TAG_BOX");
// 20919
f974244559_2178.returns.push("changed");
// 20921
o37 = {};
// 20922
o58 = {};
// 20924
o37.length = 1;
// 20925
o37["0"] = "+h1d2";
// 20928
f974244559_471.returns.push(1373491299754);
// 20931
f974244559_471.returns.push(1373491299759);
// 20933
f974244559_471.returns.push(1373491299759);
// 20936
f974244559_471.returns.push(1373491299760);
// 20939
f974244559_471.returns.push(1373491299761);
// 20941
f974244559_471.returns.push(1373491299761);
// 20944
f974244559_471.returns.push(1373491299762);
// 20947
f974244559_471.returns.push(1373491299762);
// 20949
f974244559_471.returns.push(1373491299762);
// 20952
f974244559_471.returns.push(1373491299764);
// 20955
f974244559_471.returns.push(1373491299764);
// 20957
f974244559_471.returns.push(1373491299764);
// 20967
f974244559_2178.returns.push("channel/message:live");
// 20971
o64 = {};
// 20972
f974244559_478.returns.push(o64);
// 20974
f974244559_482.returns.push(o64);
// undefined
o64 = null;
// 20980
o64 = {};
// 20981
f974244559_478.returns.push(o64);
// 20983
f974244559_482.returns.push(o64);
// undefined
o64 = null;
// 20991
o64 = {};
// 20992
f974244559_523.returns.push(o64);
// 20993
o64.length = 4;
// 20994
o64["0"] = o46;
// undefined
o46 = null;
// 20995
o64["1"] = o48;
// undefined
o48 = null;
// 20996
o46 = {};
// 20997
o64["2"] = o46;
// undefined
o46 = null;
// 20998
o64["3"] = o45;
// undefined
o64 = null;
// undefined
o45 = null;
// 21002
o45 = {};
// 21003
f974244559_478.returns.push(o45);
// 21005
f974244559_482.returns.push(o45);
// undefined
o45 = null;
// 21009
o45 = {};
// 21010
f974244559_478.returns.push(o45);
// 21012
f974244559_482.returns.push(o45);
// undefined
o45 = null;
// 21018
o45 = {};
// 21019
f974244559_478.returns.push(o45);
// 21021
f974244559_482.returns.push(o45);
// undefined
o45 = null;
// 21027
o45 = {};
// 21028
f974244559_478.returns.push(o45);
// 21030
f974244559_482.returns.push(o45);
// undefined
o45 = null;
// 21036
f974244559_471.returns.push(1373491299784);
// undefined
fo974244559_1_cookie.returns.push("c_user=100006118350059; csm=2; sub=268435456");
// 21045
o45 = {};
// 21046
f974244559_478.returns.push(o45);
// 21048
f974244559_482.returns.push(o45);
// undefined
o45 = null;
// 21052
// undefined
o8 = null;
// 21056
o8 = {};
// 21057
f974244559_478.returns.push(o8);
// 21059
f974244559_482.returns.push(o8);
// undefined
o8 = null;
// 21062
f974244559_12.returns.push(68);
// 21066
o8 = {};
// 21067
f974244559_478.returns.push(o8);
// 21069
f974244559_482.returns.push(o8);
// undefined
o8 = null;
// 21073
o8 = {};
// 21074
f974244559_480.returns.push(o8);
// 21076
o8.__html = void 0;
// 21078
o45 = {};
// 21079
f974244559_478.returns.push(o45);
// 21082
f974244559_482.returns.push(o45);
// undefined
o45 = null;
// 21083
o45 = {};
// 21084
o8.style = o45;
// 21085
// undefined
o45 = null;
// 21086
o45 = {};
// 21087
f974244559_4.returns.push(o45);
// 21088
o45.getPropertyValue = f974244559_1881;
// undefined
o45 = null;
// 21089
f974244559_1881.returns.push("");
// 21090
o45 = {};
// 21091
f974244559_4.returns.push(o45);
// 21092
o45.getPropertyValue = f974244559_1881;
// undefined
o45 = null;
// 21093
f974244559_1881.returns.push("");
// 21094
o45 = {};
// 21095
f974244559_4.returns.push(o45);
// 21096
o45.getPropertyValue = f974244559_1881;
// undefined
o45 = null;
// 21097
f974244559_1881.returns.push("");
// 21098
o8.parentNode = null;
// undefined
o8 = null;
// 21102
o8 = {};
// 21103
f974244559_478.returns.push(o8);
// 21105
f974244559_482.returns.push(o8);
// undefined
o8 = null;
// 21125
f974244559_471.returns.push(1373491299793);
// undefined
fo974244559_2174_style.returns.push(o9);
// 21127
// undefined
fo974244559_2174_style.returns.push(o9);
// 21129
o9.cssText = "opacity: 1; width: 0px; right: 35px; top: 37px; z-index: 300;";
// undefined
fo974244559_2174_style.returns.push(o9);
// 21131
// undefined
fo974244559_2174_style.returns.push(o9);
// 21133
// undefined
o9 = null;
// 21134
f974244559_14.returns.push(undefined);
// 21137
f974244559_471.returns.push(1373491299800);
// 21138
o8 = {};
// 21139
o10.classList = o8;
// 21141
o8.contains = f974244559_1617;
// undefined
o8 = null;
// 21142
f974244559_1617.returns.push(false);
// 21143
o8 = {};
// 21144
o10.parentNode = o8;
// 21145
o9 = {};
// 21146
o8.classList = o9;
// 21148
o9.contains = f974244559_1617;
// undefined
o9 = null;
// 21149
f974244559_1617.returns.push(true);
// 21150
o10.getElementsByTagName = f974244559_514;
// 21152
o10.querySelectorAll = f974244559_523;
// 21153
o9 = {};
// 21154
f974244559_523.returns.push(o9);
// 21155
o9.length = 1;
// 21156
o9["0"] = o44;
// undefined
o9 = null;
// 21160
o9 = {};
// 21161
f974244559_523.returns.push(o9);
// 21162
o9.length = 1;
// 21163
o9["0"] = o100;
// undefined
o9 = null;
// 21164
o100.offsetHeight = 785;
// 21165
o44.offsetHeight = 1872;
// 21166
o8.id = "u_0_18";
// 21170
f974244559_1617.returns.push(false);
// 21175
f974244559_1617.returns.push(true);
// 21179
o9 = {};
// 21180
f974244559_523.returns.push(o9);
// 21181
o9.length = 1;
// 21182
o9["0"] = o44;
// undefined
o9 = null;
// undefined
o44 = null;
// 21186
o9 = {};
// 21187
f974244559_523.returns.push(o9);
// 21188
o9.length = 1;
// 21189
o9["0"] = o100;
// undefined
o9 = null;
// undefined
o100 = null;
// 21193
o193.offsetTop = 0;
// 21200
f974244559_502.returns.push(o193);
// undefined
o193 = null;
// 21204
f974244559_702.returns.push(true);
// 21205
o9 = {};
// 21206
f974244559_4.returns.push(o9);
// 21207
o9.getPropertyValue = f974244559_1881;
// undefined
o9 = null;
// 21208
f974244559_1881.returns.push("fixed");
// 21210
f974244559_502.returns.push(o194);
// 21211
o194.offsetHeight = 38;
// undefined
o194 = null;
// 21212
o19.offsetWidth = 157;
// 21213
o19.offsetHeight = 62;
// 21217
f974244559_702.returns.push(true);
// 21218
o19.getBoundingClientRect = f974244559_1882;
// 21219
o9 = {};
// 21220
f974244559_1882.returns.push(o9);
// 21221
o9.left = 373.5;
// 21223
o9.JSBNG__top = 10526;
// undefined
o9 = null;
// 21228
o9 = {};
// 21229
o19.classList = o9;
// 21231
o9.contains = f974244559_1617;
// undefined
o9 = null;
// 21232
f974244559_1617.returns.push(false);
// 21233
o19.parentNode = o18;
// undefined
o19 = null;
// 21234
o9 = {};
// 21235
o18.classList = o9;
// 21237
o9.contains = f974244559_1617;
// undefined
o9 = null;
// 21238
f974244559_1617.returns.push(false);
// 21239
o18.parentNode = o109;
// undefined
o18 = null;
// 21240
o9 = {};
// 21241
o109.classList = o9;
// 21243
o9.contains = f974244559_1617;
// undefined
o9 = null;
// 21244
f974244559_1617.returns.push(false);
// 21245
o9 = {};
// 21246
o109.parentNode = o9;
// undefined
o109 = null;
// 21247
o18 = {};
// 21248
o9.classList = o18;
// 21250
o18.contains = f974244559_1617;
// undefined
o18 = null;
// 21251
f974244559_1617.returns.push(false);
// 21252
o9.parentNode = o10;
// undefined
o9 = null;
// 21256
f974244559_1617.returns.push(false);
// 21261
f974244559_1617.returns.push(false);
// 21262
o8.parentNode = o43;
// 21263
o9 = {};
// 21264
o43.classList = o9;
// 21266
o9.contains = f974244559_1617;
// undefined
o9 = null;
// 21267
f974244559_1617.returns.push(false);
// 21268
o43.parentNode = o11;
// 21269
o9 = {};
// 21270
o11.classList = o9;
// 21272
o9.contains = f974244559_1617;
// undefined
o9 = null;
// 21273
f974244559_1617.returns.push(false);
// 21274
o11.parentNode = o27;
// 21275
o9 = {};
// 21276
o27.classList = o9;
// undefined
o27 = null;
// 21278
o9.contains = f974244559_1617;
// undefined
o9 = null;
// 21279
f974244559_1617.returns.push(false);
// 21281
o9 = {};
// 21282
o13.classList = o9;
// undefined
o13 = null;
// 21284
o9.contains = f974244559_1617;
// undefined
o9 = null;
// 21285
f974244559_1617.returns.push(false);
// 21287
o9 = {};
// 21288
o70.classList = o9;
// undefined
o70 = null;
// 21290
o9.contains = f974244559_1617;
// undefined
o9 = null;
// 21291
f974244559_1617.returns.push(false);
// 21293
o9 = {};
// 21294
o71.classList = o9;
// 21296
o9.contains = f974244559_1617;
// undefined
o9 = null;
// 21297
f974244559_1617.returns.push(false);
// 21299
o9 = {};
// 21300
o72.classList = o9;
// undefined
o72 = null;
// 21302
o9.contains = f974244559_1617;
// undefined
o9 = null;
// 21303
f974244559_1617.returns.push(false);
// 21305
o9 = {};
// 21306
o73.classList = o9;
// undefined
o73 = null;
// 21308
o9.contains = f974244559_1617;
// undefined
o9 = null;
// 21309
f974244559_1617.returns.push(false);
// 21311
o9 = {};
// 21312
o74.classList = o9;
// undefined
o74 = null;
// 21314
o9.contains = f974244559_1617;
// undefined
o9 = null;
// 21315
f974244559_1617.returns.push(false);
// 21317
o9 = {};
// 21318
o75.classList = o9;
// undefined
o75 = null;
// 21320
o9.contains = f974244559_1617;
// undefined
o9 = null;
// 21321
f974244559_1617.returns.push(false);
// 21326
f974244559_1617.returns.push(false);
// 21331
f974244559_1617.returns.push(false);
// 21336
f974244559_1617.returns.push(false);
// 21344
o9 = {};
// 21345
f974244559_523.returns.push(o9);
// 21346
o9.length = 1;
// 21347
o9["0"] = o101;
// undefined
o9 = null;
// 21348
o101.getAttribute = f974244559_500;
// 21349
f974244559_500.returns.push("recent");
// 21351
f974244559_500.returns.push("0");
// 21353
f974244559_2178.returns.push("TimelineConstants/sectionRegistered");
// 21357
o9 = {};
// 21358
f974244559_523.returns.push(o9);
// 21359
o9.length = 1;
// 21360
o9["0"] = o101;
// undefined
o9 = null;
// undefined
o101 = null;
// 21362
f974244559_500.returns.push("recent");
// 21364
f974244559_500.returns.push("0");
// 21366
f974244559_2178.returns.push("TimelineConstants/sectionRegistered");
// 21369
o68.add = f974244559_1110;
// undefined
o68 = null;
// 21370
f974244559_1110.returns.push(undefined);
// 21371
f974244559_468.returns.push(10);
// 21372
o20.offsetTop = 38;
// 21373
o20.scrollHeight = 48;
// undefined
o20 = null;
// 21374
f974244559_2914 = function() { return f974244559_2914.returns[f974244559_2914.inst++]; };
f974244559_2914.returns = [];
f974244559_2914.inst = 0;
// 21375
f974244559_2110.thatReturns = f974244559_2914;
// 21376
f974244559_2914.returns.push({__JSBNG_unknown_function:true});
// 21377
o9 = {};
// 21381
f974244559_471.returns.push(1373491299840);
// 21382
o9.cancelBubble = false;
// 21383
o9.returnValue = true;
// 21386
o9.srcElement = o71;
// 21388
o9.target = o71;
// 21395
f974244559_519.returns.push(null);
// 21401
f974244559_519.returns.push(null);
// 21407
f974244559_519.returns.push(null);
// 21413
f974244559_519.returns.push(null);
// 21419
f974244559_519.returns.push(null);
// 21425
f974244559_519.returns.push(null);
// 21431
f974244559_519.returns.push(null);
// 21437
f974244559_519.returns.push(null);
// 21442
o9.JSBNG__screenX = 997;
// 21443
o9.JSBNG__screenY = 323;
// 21444
o9.altKey = false;
// 21445
o9.bubbles = true;
// 21446
o9.button = 0;
// 21447
o9.buttons = void 0;
// 21448
o9.cancelable = false;
// 21449
o9.clientX = 980;
// 21450
o9.clientY = 219;
// 21451
o9.ctrlKey = false;
// 21452
o9.currentTarget = o0;
// 21453
o9.defaultPrevented = false;
// 21454
o9.detail = 0;
// 21455
o9.eventPhase = 3;
// 21456
o9.isTrusted = void 0;
// 21457
o9.metaKey = false;
// 21458
o9.pageX = 980;
// 21459
o9.pageY = 1698;
// 21460
o9.relatedTarget = null;
// 21461
o9.fromElement = null;
// 21464
o9.shiftKey = false;
// 21467
o9.timeStamp = 1373491299840;
// 21468
o9.type = "mousemove";
// 21469
o9.view = ow974244559;
// undefined
o9 = null;
// 21472
f974244559_2916 = function() { return f974244559_2916.returns[f974244559_2916.inst++]; };
f974244559_2916.returns = [];
f974244559_2916.inst = 0;
// 21473
f974244559_2110.thatReturnsFalse = f974244559_2916;
// 21479
f974244559_2566.returns.push(undefined);
// 21482
f974244559_14.returns.push(undefined);
// 21487
f974244559_471.returns.push(1373491299854);
// 21488
f974244559_12.returns.push(69);
// 21491
o9 = {};
// 21494
o9.cancelBubble = false;
// 21497
f974244559_471.returns.push(1373491299867);
// 21499
o9.returnValue = true;
// undefined
o9 = null;
// 21500
f974244559_12.returns.push(70);
// 21504
o23.offsetHeight = 240;
// 21505
f974244559_643.returns.push(undefined);
// undefined
fo974244559_1_cookie.returns.push("c_user=100006118350059; csm=2; sub=268435456");
// 21509
f974244559_471.returns.push(1373491299880);
// 21511
o21.offsetHeight = 187;
// 21512
f974244559_643.returns.push(undefined);
// 21514
o22.offsetHeight = 175;
// undefined
o22 = null;
// 21515
f974244559_643.returns.push(undefined);
// 21517
o26.offsetHeight = 227;
// undefined
o26 = null;
// 21518
f974244559_643.returns.push(undefined);
// 21520
o40.offsetHeight = 136;
// undefined
o40 = null;
// 21521
f974244559_643.returns.push(undefined);
// 21523
f974244559_471.returns.push(1373491299881);
// undefined
fo974244559_1_cookie.returns.push("c_user=100006118350059; csm=2; sub=268435456");
// 21528
// 21529
o9 = {};
// 21533
f974244559_471.returns.push(1373491299957);
// 21534
o9.cancelBubble = false;
// 21535
o9.returnValue = true;
// 21538
o9.srcElement = o71;
// 21540
o9.target = o71;
// 21547
f974244559_519.returns.push(null);
// 21553
f974244559_519.returns.push(null);
// 21559
f974244559_519.returns.push(null);
// 21565
f974244559_519.returns.push(null);
// 21571
f974244559_519.returns.push(null);
// 21577
f974244559_519.returns.push(null);
// 21583
f974244559_519.returns.push(null);
// 21589
f974244559_519.returns.push(null);
// 21594
o9.JSBNG__screenX = 997;
// 21595
o9.JSBNG__screenY = 323;
// 21596
o9.altKey = false;
// 21597
o9.bubbles = true;
// 21598
o9.button = 0;
// 21599
o9.buttons = void 0;
// 21600
o9.cancelable = false;
// 21601
o9.clientX = 980;
// 21602
o9.clientY = 219;
// 21603
o9.ctrlKey = false;
// 21604
o9.currentTarget = o0;
// 21605
o9.defaultPrevented = false;
// 21606
o9.detail = 0;
// 21607
o9.eventPhase = 3;
// 21608
o9.isTrusted = void 0;
// 21609
o9.metaKey = false;
// 21610
o9.pageX = 980;
// 21611
o9.pageY = 1858;
// 21612
o9.relatedTarget = null;
// 21613
o9.fromElement = null;
// 21616
o9.shiftKey = false;
// 21619
o9.timeStamp = 1373491299957;
// 21620
o9.type = "mousemove";
// 21621
o9.view = ow974244559;
// undefined
o9 = null;
// 21630
f974244559_2566.returns.push(undefined);
// 21633
f974244559_14.returns.push(undefined);
// 21634
f974244559_12.returns.push(71);
// 21639
f974244559_471.returns.push(1373491300072);
// 21641
f974244559_471.returns.push(1373491300074);
// 21643
f974244559_471.returns.push(1373491300074);
// 21644
f974244559_14.returns.push(undefined);
// 21645
f974244559_12.returns.push(72);
// 21646
f974244559_14.returns.push(undefined);
// 21647
o9 = {};
// 21650
o9.cancelBubble = false;
// 21653
f974244559_471.returns.push(1373491300228);
// 21655
o9.returnValue = true;
// undefined
o9 = null;
// 21656
o9 = {};
// 21659
o9.cancelBubble = false;
// 21662
f974244559_471.returns.push(1373491300239);
// 21664
f974244559_12.returns.push(73);
// 21668
f974244559_471.returns.push(1373491300240);
// 21672
f974244559_471.returns.push(1373491300240);
// 21675
o9.returnValue = true;
// undefined
o9 = null;
// 21676
o9 = {};
// 21679
o9.cancelBubble = false;
// 21682
f974244559_471.returns.push(1373491300258);
// 21684
o9.returnValue = true;
// undefined
o9 = null;
// 21685
o9 = {};
// 21688
o9.cancelBubble = false;
// 21691
f974244559_471.returns.push(1373491300311);
// 21693
o9.returnValue = true;
// undefined
o9 = null;
// 21694
o9 = {};
// 21697
o9.cancelBubble = false;
// 21700
f974244559_471.returns.push(1373491300320);
// 21702
o9.returnValue = true;
// undefined
o9 = null;
// 21703
o9 = {};
// 21707
f974244559_471.returns.push(1373491300331);
// 21708
o9.cancelBubble = false;
// 21709
o9.returnValue = true;
// 21712
o9.srcElement = o71;
// 21714
o9.target = o71;
// 21721
f974244559_519.returns.push(null);
// 21727
f974244559_519.returns.push(null);
// 21733
f974244559_519.returns.push(null);
// 21739
f974244559_519.returns.push(null);
// 21745
f974244559_519.returns.push(null);
// 21751
f974244559_519.returns.push(null);
// 21757
f974244559_519.returns.push(null);
// 21763
f974244559_519.returns.push(null);
// 21768
o9.JSBNG__screenX = 997;
// 21769
o9.JSBNG__screenY = 323;
// 21770
o9.altKey = false;
// 21771
o9.bubbles = true;
// 21772
o9.button = 0;
// 21773
o9.buttons = void 0;
// 21774
o9.cancelable = false;
// 21775
o9.clientX = 980;
// 21776
o9.clientY = 219;
// 21777
o9.ctrlKey = false;
// 21778
o9.currentTarget = o0;
// 21779
o9.defaultPrevented = false;
// 21780
o9.detail = 0;
// 21781
o9.eventPhase = 3;
// 21782
o9.isTrusted = void 0;
// 21783
o9.metaKey = false;
// 21784
o9.pageX = 980;
// 21785
o9.pageY = 2058;
// 21786
o9.relatedTarget = null;
// 21787
o9.fromElement = null;
// 21790
o9.shiftKey = false;
// 21793
o9.timeStamp = 1373491300330;
// 21794
o9.type = "mousemove";
// 21795
o9.view = ow974244559;
// undefined
o9 = null;
// 21804
f974244559_2566.returns.push(undefined);
// 21807
f974244559_14.returns.push(undefined);
// 21812
f974244559_471.returns.push(1373491300339);
// 21813
f974244559_12.returns.push(74);
// undefined
fo974244559_1_cookie.returns.push("c_user=100006118350059; csm=2; sub=268435456; wd=1050x588");
// 21817
o9 = {};
// 21821
f974244559_471.returns.push(1373491300442);
// 21822
o9.cancelBubble = false;
// 21823
o9.returnValue = true;
// 21826
o9.srcElement = o71;
// 21828
o9.target = o71;
// 21835
f974244559_519.returns.push(null);
// 21841
f974244559_519.returns.push(null);
// 21847
f974244559_519.returns.push(null);
// 21853
f974244559_519.returns.push(null);
// 21859
f974244559_519.returns.push(null);
// 21865
f974244559_519.returns.push(null);
// 21871
f974244559_519.returns.push(null);
// 21877
f974244559_519.returns.push(null);
// 21882
o9.JSBNG__screenX = 997;
// 21883
o9.JSBNG__screenY = 323;
// 21884
o9.altKey = false;
// 21885
o9.bubbles = true;
// 21886
o9.button = 0;
// 21887
o9.buttons = void 0;
// 21888
o9.cancelable = false;
// 21889
o9.clientX = 980;
// 21890
o9.clientY = 219;
// 21891
o9.ctrlKey = false;
// 21892
o9.currentTarget = o0;
// 21893
o9.defaultPrevented = false;
// 21894
o9.detail = 0;
// 21895
o9.eventPhase = 3;
// 21896
o9.isTrusted = void 0;
// 21897
o9.metaKey = false;
// 21898
o9.pageX = 980;
// 21899
o9.pageY = 2098;
// 21900
o9.relatedTarget = null;
// 21901
o9.fromElement = null;
// 21904
o9.shiftKey = false;
// 21907
o9.timeStamp = 1373491300441;
// 21908
o9.type = "mousemove";
// 21909
o9.view = ow974244559;
// undefined
o9 = null;
// 21918
f974244559_2566.returns.push(undefined);
// 21921
f974244559_14.returns.push(undefined);
// 21922
f974244559_12.returns.push(75);
// 21925
o9 = {};
// 21928
o9.cancelBubble = false;
// 21931
f974244559_471.returns.push(1373491300727);
// 21933
o9.returnValue = true;
// undefined
o9 = null;
// 21934
o9 = {};
// 21937
o9.cancelBubble = false;
// 21940
f974244559_471.returns.push(1373491300744);
// 21945
f974244559_471.returns.push(1373491300746);
// 21949
f974244559_471.returns.push(1373491300746);
// 21952
o9.returnValue = true;
// undefined
o9 = null;
// 21953
o9 = {};
// 21956
o9.cancelBubble = false;
// 21959
f974244559_471.returns.push(1373491300763);
// 21961
o9.returnValue = true;
// undefined
o9 = null;
// 21962
o9 = {};
// 21965
o9.cancelBubble = false;
// 21968
f974244559_471.returns.push(1373491300780);
// 21970
o9.returnValue = true;
// undefined
o9 = null;
// 21971
o9 = {};
// 21974
o9.cancelBubble = false;
// 21977
f974244559_471.returns.push(1373491300823);
// 21979
o9.returnValue = true;
// undefined
o9 = null;
// 21980
o9 = {};
// 21984
f974244559_471.returns.push(1373491300830);
// 21985
o9.cancelBubble = false;
// 21986
o9.returnValue = true;
// 21989
o9.srcElement = o71;
// 21991
o9.target = o71;
// 21998
f974244559_519.returns.push(null);
// 22004
f974244559_519.returns.push(null);
// 22010
f974244559_519.returns.push(null);
// 22016
f974244559_519.returns.push(null);
// 22022
f974244559_519.returns.push(null);
// 22028
f974244559_519.returns.push(null);
// 22034
f974244559_519.returns.push(null);
// 22040
f974244559_519.returns.push(null);
// 22045
o9.JSBNG__screenX = 997;
// 22046
o9.JSBNG__screenY = 323;
// 22047
o9.altKey = false;
// 22048
o9.bubbles = true;
// 22049
o9.button = 0;
// 22050
o9.buttons = void 0;
// 22051
o9.cancelable = false;
// 22052
o9.clientX = 980;
// 22053
o9.clientY = 219;
// 22054
o9.ctrlKey = false;
// 22055
o9.currentTarget = o0;
// 22056
o9.defaultPrevented = false;
// 22057
o9.detail = 0;
// 22058
o9.eventPhase = 3;
// 22059
o9.isTrusted = void 0;
// 22060
o9.metaKey = false;
// 22061
o9.pageX = 980;
// 22062
o9.pageY = 2116;
// 22063
o9.relatedTarget = null;
// 22064
o9.fromElement = null;
// 22067
o9.shiftKey = false;
// 22070
o9.timeStamp = 1373491300829;
// 22071
o9.type = "mousemove";
// 22072
o9.view = ow974244559;
// undefined
o9 = null;
// 22081
f974244559_2566.returns.push(undefined);
// 22084
f974244559_14.returns.push(undefined);
// 22089
f974244559_471.returns.push(1373491300839);
// 22090
f974244559_12.returns.push(76);
// 22094
f974244559_12.returns.push(77);
// undefined
fo974244559_1_cookie.returns.push("c_user=100006118350059; csm=2; sub=268435456; wd=1050x588");
// 22099
f974244559_471.returns.push(1373491300886);
// undefined
fo974244559_1_cookie.returns.push("c_user=100006118350059; csm=2; sub=268435456; wd=1050x588");
// 22103
f974244559_471.returns.push(1373491301083);
// 22104
f974244559_14.returns.push(undefined);
// 22105
f974244559_12.returns.push(78);
// 22109
f974244559_471.returns.push(1373491301084);
// 22111
f974244559_471.returns.push(1373491301085);
// 22112
f974244559_14.returns.push(undefined);
// 22113
f974244559_12.returns.push(79);
// 22115
f974244559_471.returns.push(1373491301085);
// 22116
o9 = {};
// 22117
f974244559_70.returns.push(o9);
// 22118
o9.open = f974244559_1564;
// 22119
f974244559_1564.returns.push(undefined);
// 22120
o9.setRequestHeader = f974244559_1565;
// 22121
f974244559_1565.returns.push(undefined);
// 22122
// 22123
f974244559_12.returns.push(80);
// 22125
f974244559_471.returns.push(1373491301088);
// 22127
f974244559_471.returns.push(1373491301088);
// 22128
o9.send = f974244559_1566;
// 22129
f974244559_1566.returns.push(undefined);
// 22130
o13 = {};
// 22134
f974244559_471.returns.push(1373491301122);
// 22135
o13.cancelBubble = false;
// 22136
o13.returnValue = true;
// 22139
o13.srcElement = o71;
// 22141
o13.target = o71;
// 22148
f974244559_519.returns.push(null);
// 22154
f974244559_519.returns.push(null);
// 22160
f974244559_519.returns.push(null);
// 22166
f974244559_519.returns.push(null);
// 22172
f974244559_519.returns.push(null);
// 22178
f974244559_519.returns.push(null);
// 22184
f974244559_519.returns.push(null);
// 22190
f974244559_519.returns.push(null);
// 22195
o13.JSBNG__screenX = 991;
// 22196
o13.JSBNG__screenY = 442;
// 22197
o13.altKey = false;
// 22198
o13.bubbles = true;
// 22199
o13.button = 0;
// 22200
o13.buttons = void 0;
// 22201
o13.cancelable = false;
// 22202
o13.clientX = 974;
// 22203
o13.clientY = 338;
// 22204
o13.ctrlKey = false;
// 22205
o13.currentTarget = o0;
// 22206
o13.defaultPrevented = false;
// 22207
o13.detail = 0;
// 22208
o13.eventPhase = 3;
// 22209
o13.isTrusted = void 0;
// 22210
o13.metaKey = false;
// 22211
o13.pageX = 974;
// 22212
o13.pageY = 2235;
// 22213
o13.relatedTarget = null;
// 22214
o13.fromElement = null;
// 22217
o13.shiftKey = false;
// 22220
o13.timeStamp = 1373491301121;
// 22221
o13.type = "mousemove";
// 22222
o13.view = ow974244559;
// undefined
o13 = null;
// 22231
f974244559_2566.returns.push(undefined);
// 22234
f974244559_14.returns.push(undefined);
// 22235
f974244559_12.returns.push(81);
// 22238
o13 = {};
// 22241
o13.cancelBubble = false;
// 22244
f974244559_471.returns.push(1373491301182);
// 22246
o13.returnValue = true;
// undefined
o13 = null;
// 22247
o13 = {};
// 22250
o13.cancelBubble = false;
// 22253
f974244559_471.returns.push(1373491301208);
// 22255
o13.returnValue = true;
// undefined
o13 = null;
// 22256
o13 = {};
// 22259
o13.cancelBubble = false;
// 22262
f974244559_471.returns.push(1373491301229);
// 22264
o13.returnValue = true;
// undefined
o13 = null;
// 22265
o13 = {};
// 22268
o13.cancelBubble = false;
// 22271
f974244559_471.returns.push(1373491301243);
// 22273
o13.returnValue = true;
// undefined
o13 = null;
// 22274
o13 = {};
// 22277
o13.cancelBubble = false;
// 22280
f974244559_471.returns.push(1373491301253);
// 22285
f974244559_471.returns.push(1373491301255);
// 22289
f974244559_471.returns.push(1373491301255);
// 22292
o13.returnValue = true;
// undefined
o13 = null;
// 22293
o13 = {};
// 22296
o13.cancelBubble = false;
// 22299
f974244559_471.returns.push(1373491301271);
// 22301
o13.returnValue = true;
// undefined
o13 = null;
// undefined
fo974244559_1_cookie.returns.push("c_user=100006118350059; csm=2; sub=268435456; wd=1050x588");
// 22303
o13 = {};
// undefined
o13 = null;
// undefined
fo974244559_2932_readyState = function() { return fo974244559_2932_readyState.returns[fo974244559_2932_readyState.inst++]; };
fo974244559_2932_readyState.returns = [];
fo974244559_2932_readyState.inst = 0;
defineGetter(o9, "readyState", fo974244559_2932_readyState, undefined);
// undefined
fo974244559_2932_readyState.returns.push(2);
// 22305
o13 = {};
// undefined
o13 = null;
// undefined
fo974244559_2932_readyState.returns.push(3);
// 22307
o13 = {};
// undefined
o13 = null;
// undefined
fo974244559_2932_readyState.returns.push(4);
// 22309
o9.JSBNG__status = 200;
// undefined
fo974244559_2932_readyState.returns.push(4);
// 22311
// undefined
o9 = null;
// 22313
f974244559_12.returns.push(82);
// undefined
fo974244559_1_cookie.returns.push("c_user=100006118350059; csm=2; sub=268435456");
// 22318
f974244559_471.returns.push(1373491301894);
// undefined
fo974244559_1_cookie.returns.push("c_user=100006118350059; csm=2; sub=268435456");
// 22320
o9 = {};
// 22323
o9.cancelBubble = false;
// 22326
f974244559_471.returns.push(1373491302144);
// 22331
f974244559_471.returns.push(1373491302145);
// 22335
f974244559_471.returns.push(1373491302145);
// 22338
o9.returnValue = true;
// undefined
o9 = null;
// 22339
o9 = {};
// 22342
o9.cancelBubble = false;
// 22345
f974244559_471.returns.push(1373491302166);
// 22347
o9.returnValue = true;
// undefined
o9 = null;
// 22348
o9 = {};
// 22351
o9.cancelBubble = false;
// 22354
f974244559_471.returns.push(1373491302169);
// 22356
o9.returnValue = true;
// undefined
o9 = null;
// 22357
o9 = {};
// 22360
o9.cancelBubble = false;
// 22363
f974244559_471.returns.push(1373491302173);
// 22365
o9.returnValue = true;
// undefined
o9 = null;
// 22366
o9 = {};
// 22369
o9.cancelBubble = false;
// 22372
f974244559_471.returns.push(1373491302195);
// 22374
o9.returnValue = true;
// undefined
o9 = null;
// 22375
o9 = {};
// 22378
o9.cancelBubble = false;
// 22381
f974244559_471.returns.push(1373491302222);
// 22383
o9.returnValue = true;
// undefined
o9 = null;
// undefined
fo974244559_1_cookie.returns.push("c_user=100006118350059; csm=2; sub=268435456");
// 22386
f974244559_12.returns.push(83);
// undefined
fo974244559_1_cookie.returns.push("c_user=100006118350059; csm=2; sub=268435456");
// 22391
f974244559_471.returns.push(1373491302892);
// undefined
fo974244559_1_cookie.returns.push("c_user=100006118350059; csm=2; sub=268435456");
// 22394
f974244559_471.returns.push(1373491303237);
// undefined
fo974244559_1_cookie.returns.push("c_user=100006118350059; csm=2; sub=268435456");
// 22397
f974244559_12.returns.push(84);
// undefined
fo974244559_1_cookie.returns.push("c_user=100006118350059; csm=2; sub=268435456");
// 22402
f974244559_471.returns.push(1373491303893);
// undefined
fo974244559_1_cookie.returns.push("c_user=100006118350059; csm=2; sub=268435456");
// 22404
o9 = {};
// 22408
f974244559_471.returns.push(1373491304318);
// 22413
f974244559_471.returns.push(1373491304318);
// 22417
f974244559_471.returns.push(1373491304318);
// 22419
o9.cancelBubble = false;
// 22420
o9.returnValue = true;
// 22423
o9.srcElement = o71;
// 22425
o9.target = o71;
// 22432
f974244559_519.returns.push(null);
// 22438
f974244559_519.returns.push(null);
// 22444
f974244559_519.returns.push(null);
// 22450
f974244559_519.returns.push(null);
// 22456
f974244559_519.returns.push(null);
// 22462
f974244559_519.returns.push(null);
// 22468
f974244559_519.returns.push(null);
// 22474
f974244559_519.returns.push(null);
// 22479
o9.JSBNG__screenX = 990;
// 22480
o9.JSBNG__screenY = 442;
// 22481
o9.altKey = false;
// 22482
o9.bubbles = true;
// 22483
o9.button = 0;
// 22484
o9.buttons = void 0;
// 22485
o9.cancelable = false;
// 22486
o9.clientX = 973;
// 22487
o9.clientY = 338;
// 22488
o9.ctrlKey = false;
// 22489
o9.currentTarget = o0;
// 22490
o9.defaultPrevented = false;
// 22491
o9.detail = 0;
// 22492
o9.eventPhase = 3;
// 22493
o9.isTrusted = void 0;
// 22494
o9.metaKey = false;
// 22495
o9.pageX = 973;
// 22496
o9.pageY = 2235;
// 22497
o9.relatedTarget = null;
// 22498
o9.fromElement = null;
// 22501
o9.shiftKey = false;
// 22504
o9.timeStamp = 1373491304317;
// 22505
o9.type = "mousemove";
// 22506
o9.view = ow974244559;
// undefined
o9 = null;
// 22515
f974244559_2566.returns.push(undefined);
// 22518
f974244559_14.returns.push(undefined);
// 22519
f974244559_12.returns.push(85);
// undefined
fo974244559_1_cookie.returns.push("c_user=100006118350059; csm=2; sub=268435456");
// 22523
o9 = {};
// 22526
o9.cancelBubble = false;
// 22529
f974244559_471.returns.push(1373491304514);
// 22531
o9.returnValue = true;
// undefined
o9 = null;
// 22532
o9 = {};
// 22535
o9.cancelBubble = false;
// 22538
f974244559_471.returns.push(1373491304532);
// 22540
o9.returnValue = true;
// undefined
o9 = null;
// 22541
o9 = {};
// 22544
o9.cancelBubble = false;
// 22547
f974244559_471.returns.push(1373491304545);
// 22549
o9.returnValue = true;
// undefined
o9 = null;
// 22550
o9 = {};
// 22553
o9.cancelBubble = false;
// 22556
f974244559_471.returns.push(1373491304562);
// 22558
o9.returnValue = true;
// undefined
o9 = null;
// 22559
o9 = {};
// 22562
o9.cancelBubble = false;
// 22565
f974244559_471.returns.push(1373491304611);
// 22567
o9.returnValue = true;
// undefined
o9 = null;
// 22568
o9 = {};
// 22571
o9.cancelBubble = false;
// 22574
f974244559_471.returns.push(1373491304620);
// 22576
o9.returnValue = true;
// undefined
o9 = null;
// 22577
o9 = {};
// 22581
f974244559_471.returns.push(1373491304628);
// 22582
o9.cancelBubble = false;
// 22583
o9.returnValue = true;
// 22586
o9.srcElement = o71;
// 22588
o9.target = o71;
// 22595
f974244559_519.returns.push(null);
// 22601
f974244559_519.returns.push(null);
// 22607
f974244559_519.returns.push(null);
// 22613
f974244559_519.returns.push(null);
// 22619
f974244559_519.returns.push(null);
// 22625
f974244559_519.returns.push(null);
// 22631
f974244559_519.returns.push(null);
// 22637
f974244559_519.returns.push(null);
// 22642
o9.JSBNG__screenX = 990;
// 22643
o9.JSBNG__screenY = 442;
// 22644
o9.altKey = false;
// 22645
o9.bubbles = true;
// 22646
o9.button = 0;
// 22647
o9.buttons = void 0;
// 22648
o9.cancelable = false;
// 22649
o9.clientX = 973;
// 22650
o9.clientY = 338;
// 22651
o9.ctrlKey = false;
// 22652
o9.currentTarget = o0;
// 22653
o9.defaultPrevented = false;
// 22654
o9.detail = 0;
// 22655
o9.eventPhase = 3;
// 22656
o9.isTrusted = void 0;
// 22657
o9.metaKey = false;
// 22658
o9.pageX = 973;
// 22659
o9.pageY = 1995;
// 22660
o9.relatedTarget = null;
// 22661
o9.fromElement = null;
// 22664
o9.shiftKey = false;
// 22667
o9.timeStamp = 1373491304627;
// 22668
o9.type = "mousemove";
// 22669
o9.view = ow974244559;
// undefined
o9 = null;
// 22678
f974244559_2566.returns.push(undefined);
// 22681
f974244559_14.returns.push(undefined);
// 22682
f974244559_12.returns.push(86);
// 22685
o9 = {};
// 22688
o9.cancelBubble = false;
// 22691
f974244559_471.returns.push(1373491304657);
// 22693
o9.returnValue = true;
// undefined
o9 = null;
// 22694
o9 = {};
// 22698
f974244559_471.returns.push(1373491304759);
// 22699
o9.cancelBubble = false;
// 22700
o9.returnValue = true;
// 22703
o9.srcElement = o71;
// 22705
o9.target = o71;
// 22712
f974244559_519.returns.push(null);
// 22718
f974244559_519.returns.push(null);
// 22724
f974244559_519.returns.push(null);
// 22730
f974244559_519.returns.push(null);
// 22736
f974244559_519.returns.push(null);
// 22742
f974244559_519.returns.push(null);
// 22748
f974244559_519.returns.push(null);
// 22754
f974244559_519.returns.push(null);
// 22759
o9.JSBNG__screenX = 990;
// 22760
o9.JSBNG__screenY = 442;
// 22761
o9.altKey = false;
// 22762
o9.bubbles = true;
// 22763
o9.button = 0;
// 22764
o9.buttons = void 0;
// 22765
o9.cancelable = false;
// 22766
o9.clientX = 973;
// 22767
o9.clientY = 338;
// 22768
o9.ctrlKey = false;
// 22769
o9.currentTarget = o0;
// 22770
o9.defaultPrevented = false;
// 22771
o9.detail = 0;
// 22772
o9.eventPhase = 3;
// 22773
o9.isTrusted = void 0;
// 22774
o9.metaKey = false;
// 22775
o9.pageX = 973;
// 22776
o9.pageY = 1955;
// 22777
o9.relatedTarget = null;
// 22778
o9.fromElement = null;
// 22781
o9.shiftKey = false;
// 22784
o9.timeStamp = 1373491304759;
// 22785
o9.type = "mousemove";
// 22786
o9.view = ow974244559;
// undefined
o9 = null;
// 22795
f974244559_2566.returns.push(undefined);
// 22798
f974244559_14.returns.push(undefined);
// 22799
f974244559_12.returns.push(87);
// 22803
f974244559_12.returns.push(88);
// undefined
fo974244559_1_cookie.returns.push("c_user=100006118350059; csm=2; sub=268435456");
// 22808
f974244559_471.returns.push(1373491304900);
// undefined
fo974244559_1_cookie.returns.push("c_user=100006118350059; csm=2; sub=268435456");
// 22810
o9 = {};
// 22813
o9.cancelBubble = false;
// 22816
f974244559_471.returns.push(1373491304937);
// 22821
f974244559_471.returns.push(1373491304938);
// 22825
f974244559_471.returns.push(1373491304938);
// 22828
o9.returnValue = true;
// undefined
o9 = null;
// 22829
o9 = {};
// 22832
o9.cancelBubble = false;
// 22835
f974244559_471.returns.push(1373491304959);
// 22837
o9.returnValue = true;
// undefined
o9 = null;
// 22838
o9 = {};
// 22841
o9.cancelBubble = false;
// 22844
f974244559_471.returns.push(1373491304968);
// 22846
o9.returnValue = true;
// undefined
o9 = null;
// 22847
o9 = {};
// 22850
o9.cancelBubble = false;
// 22853
f974244559_471.returns.push(1373491304976);
// 22855
o9.returnValue = true;
// undefined
o9 = null;
// 22856
o9 = {};
// 22859
o9.cancelBubble = false;
// 22862
f974244559_471.returns.push(1373491304985);
// 22864
o9.returnValue = true;
// undefined
o9 = null;
// 22865
o9 = {};
// 22868
o9.cancelBubble = false;
// 22871
f974244559_471.returns.push(1373491305013);
// 22873
o9.returnValue = true;
// undefined
o9 = null;
// 22874
o9 = {};
// 22878
f974244559_471.returns.push(1373491305041);
// 22879
o9.cancelBubble = false;
// 22880
o9.returnValue = true;
// 22883
o9.srcElement = o71;
// 22885
o9.target = o71;
// 22892
f974244559_519.returns.push(null);
// 22898
f974244559_519.returns.push(null);
// 22904
f974244559_519.returns.push(null);
// 22910
f974244559_519.returns.push(null);
// 22916
f974244559_519.returns.push(null);
// 22922
f974244559_519.returns.push(null);
// 22928
f974244559_519.returns.push(null);
// 22934
f974244559_519.returns.push(null);
// 22939
o9.JSBNG__screenX = 990;
// 22940
o9.JSBNG__screenY = 442;
// 22941
o9.altKey = false;
// 22942
o9.bubbles = true;
// 22943
o9.button = 0;
// 22944
o9.buttons = void 0;
// 22945
o9.cancelable = false;
// 22946
o9.clientX = 973;
// 22947
o9.clientY = 338;
// 22948
o9.ctrlKey = false;
// 22949
o9.currentTarget = o0;
// 22950
o9.defaultPrevented = false;
// 22951
o9.detail = 0;
// 22952
o9.eventPhase = 3;
// 22953
o9.isTrusted = void 0;
// 22954
o9.metaKey = false;
// 22955
o9.pageX = 973;
// 22956
o9.pageY = 1715;
// 22957
o9.relatedTarget = null;
// 22958
o9.fromElement = null;
// 22961
o9.shiftKey = false;
// 22964
o9.timeStamp = 1373491305040;
// 22965
o9.type = "mousemove";
// 22966
o9.view = ow974244559;
// undefined
o9 = null;
// 22975
f974244559_2566.returns.push(undefined);
// 22978
f974244559_14.returns.push(undefined);
// 22979
f974244559_12.returns.push(89);
// 22982
o9 = {};
// 22985
o9.cancelBubble = false;
// 22988
f974244559_471.returns.push(1373491305275);
// 22990
o9.returnValue = true;
// undefined
o9 = null;
// 22991
o9 = {};
// 22994
o9.cancelBubble = false;
// 22997
f974244559_471.returns.push(1373491305282);
// 22999
o9.returnValue = true;
// undefined
o9 = null;
// 23000
o9 = {};
// 23003
o9.cancelBubble = false;
// 23006
f974244559_471.returns.push(1373491305307);
// 23008
o9.returnValue = true;
// undefined
o9 = null;
// 23009
o9 = {};
// 23012
o9.cancelBubble = false;
// 23015
f974244559_471.returns.push(1373491305316);
// 23017
o9.returnValue = true;
// undefined
o9 = null;
// 23018
o9 = {};
// 23021
o9.cancelBubble = false;
// 23024
f974244559_471.returns.push(1373491305326);
// 23026
o9.returnValue = true;
// undefined
o9 = null;
// 23027
o9 = {};
// 23030
o9.cancelBubble = false;
// 23033
f974244559_471.returns.push(1373491305353);
// 23035
o9.returnValue = true;
// undefined
o9 = null;
// 23036
o9 = {};
// 23040
f974244559_471.returns.push(1373491305378);
// 23041
o9.cancelBubble = false;
// 23042
o9.returnValue = true;
// 23045
o9.srcElement = o71;
// 23047
o9.target = o71;
// 23054
f974244559_519.returns.push(null);
// 23060
f974244559_519.returns.push(null);
// 23066
f974244559_519.returns.push(null);
// 23072
f974244559_519.returns.push(null);
// 23078
f974244559_519.returns.push(null);
// 23084
f974244559_519.returns.push(null);
// 23090
f974244559_519.returns.push(null);
// 23096
f974244559_519.returns.push(null);
// 23101
o9.JSBNG__screenX = 990;
// 23102
o9.JSBNG__screenY = 442;
// 23103
o9.altKey = false;
// 23104
o9.bubbles = true;
// 23105
o9.button = 0;
// 23106
o9.buttons = void 0;
// 23107
o9.cancelable = false;
// 23108
o9.clientX = 973;
// 23109
o9.clientY = 338;
// 23110
o9.ctrlKey = false;
// 23111
o9.currentTarget = o0;
// 23112
o9.defaultPrevented = false;
// 23113
o9.detail = 0;
// 23114
o9.eventPhase = 3;
// 23115
o9.isTrusted = void 0;
// 23116
o9.metaKey = false;
// 23117
o9.pageX = 973;
// 23118
o9.pageY = 1475;
// 23119
o9.relatedTarget = null;
// 23120
o9.fromElement = null;
// 23123
o9.shiftKey = false;
// 23126
o9.timeStamp = 1373491305378;
// 23127
o9.type = "mousemove";
// 23128
o9.view = ow974244559;
// undefined
o9 = null;
// 23137
f974244559_2566.returns.push(undefined);
// 23140
f974244559_14.returns.push(undefined);
// 23141
f974244559_12.returns.push(90);
// undefined
fo974244559_1_cookie.returns.push("c_user=100006118350059; csm=2; sub=268435456");
// 23145
o9 = {};
// 23148
o9.cancelBubble = false;
// 23151
f974244559_471.returns.push(1373491305605);
// 23156
f974244559_471.returns.push(1373491305606);
// 23160
f974244559_471.returns.push(1373491305606);
// 23163
o9.returnValue = true;
// undefined
o9 = null;
// 23164
o9 = {};
// 23167
o9.cancelBubble = false;
// 23170
f974244559_471.returns.push(1373491305629);
// 23172
o9.returnValue = true;
// undefined
o9 = null;
// 23173
o9 = {};
// 23176
o9.cancelBubble = false;
// 23179
f974244559_471.returns.push(1373491305638);
// 23181
o9.returnValue = true;
// undefined
o9 = null;
// 23182
o9 = {};
// 23185
o9.cancelBubble = false;
// 23188
f974244559_471.returns.push(1373491305649);
// 23190
o9.returnValue = true;
// undefined
o9 = null;
// 23191
o9 = {};
// 23194
o9.cancelBubble = false;
// 23197
f974244559_471.returns.push(1373491305660);
// 23199
o9.returnValue = true;
// undefined
o9 = null;
// 23200
o9 = {};
// 23203
o9.cancelBubble = false;
// 23206
f974244559_471.returns.push(1373491305676);
// 23208
o9.returnValue = true;
// undefined
o9 = null;
// 23209
o9 = {};
// 23213
f974244559_471.returns.push(1373491305708);
// 23214
o9.cancelBubble = false;
// 23215
o9.returnValue = true;
// 23218
o9.srcElement = o71;
// 23220
o9.target = o71;
// 23227
f974244559_519.returns.push(null);
// 23233
f974244559_519.returns.push(null);
// 23239
f974244559_519.returns.push(null);
// 23245
f974244559_519.returns.push(null);
// 23251
f974244559_519.returns.push(null);
// 23257
f974244559_519.returns.push(null);
// 23263
f974244559_519.returns.push(null);
// 23269
f974244559_519.returns.push(null);
// 23274
o9.JSBNG__screenX = 990;
// 23275
o9.JSBNG__screenY = 442;
// 23276
o9.altKey = false;
// 23277
o9.bubbles = true;
// 23278
o9.button = 0;
// 23279
o9.buttons = void 0;
// 23280
o9.cancelable = false;
// 23281
o9.clientX = 973;
// 23282
o9.clientY = 338;
// 23283
o9.ctrlKey = false;
// 23284
o9.currentTarget = o0;
// 23285
o9.defaultPrevented = false;
// 23286
o9.detail = 0;
// 23287
o9.eventPhase = 3;
// 23288
o9.isTrusted = void 0;
// 23289
o9.metaKey = false;
// 23290
o9.pageX = 973;
// 23291
o9.pageY = 1235;
// 23292
o9.relatedTarget = null;
// 23293
o9.fromElement = null;
// 23296
o9.shiftKey = false;
// 23299
o9.timeStamp = 1373491305708;
// 23300
o9.type = "mousemove";
// 23301
o9.view = ow974244559;
// undefined
o9 = null;
// 23310
f974244559_2566.returns.push(undefined);
// 23313
f974244559_14.returns.push(undefined);
// 23318
f974244559_471.returns.push(1373491305717);
// 23319
f974244559_12.returns.push(91);
// 23322
o9 = {};
// 23326
f974244559_471.returns.push(1373491305819);
// 23327
o9.cancelBubble = false;
// 23328
o9.returnValue = true;
// 23331
o9.srcElement = o71;
// 23333
o9.target = o71;
// 23340
f974244559_519.returns.push(null);
// 23346
f974244559_519.returns.push(null);
// 23352
f974244559_519.returns.push(null);
// 23358
f974244559_519.returns.push(null);
// 23364
f974244559_519.returns.push(null);
// 23370
f974244559_519.returns.push(null);
// 23376
f974244559_519.returns.push(null);
// 23382
f974244559_519.returns.push(null);
// 23387
o9.JSBNG__screenX = 990;
// 23388
o9.JSBNG__screenY = 442;
// 23389
o9.altKey = false;
// 23390
o9.bubbles = true;
// 23391
o9.button = 0;
// 23392
o9.buttons = void 0;
// 23393
o9.cancelable = false;
// 23394
o9.clientX = 973;
// 23395
o9.clientY = 338;
// 23396
o9.ctrlKey = false;
// 23397
o9.currentTarget = o0;
// 23398
o9.defaultPrevented = false;
// 23399
o9.detail = 0;
// 23400
o9.eventPhase = 3;
// 23401
o9.isTrusted = void 0;
// 23402
o9.metaKey = false;
// 23403
o9.pageX = 973;
// 23404
o9.pageY = 1195;
// 23405
o9.relatedTarget = null;
// 23406
o9.fromElement = null;
// 23409
o9.shiftKey = false;
// 23412
o9.timeStamp = 1373491305818;
// 23413
o9.type = "mousemove";
// 23414
o9.view = ow974244559;
// undefined
o9 = null;
// 23423
f974244559_2566.returns.push(undefined);
// 23426
f974244559_14.returns.push(undefined);
// 23427
f974244559_12.returns.push(92);
// 23431
f974244559_12.returns.push(93);
// undefined
fo974244559_1_cookie.returns.push("c_user=100006118350059; csm=2; sub=268435456");
// 23436
f974244559_471.returns.push(1373491305903);
// undefined
fo974244559_1_cookie.returns.push("c_user=100006118350059; csm=2; sub=268435456");
// 23438
o9 = {};
// 23441
o9.cancelBubble = false;
// 23444
f974244559_471.returns.push(1373491305964);
// 23446
o9.returnValue = true;
// undefined
o9 = null;
// 23447
o9 = {};
// 23450
o9.cancelBubble = false;
// 23453
f974244559_471.returns.push(1373491305974);
// 23455
o9.returnValue = true;
// undefined
o9 = null;
// 23456
o9 = {};
// 23459
o9.cancelBubble = false;
// 23462
f974244559_471.returns.push(1373491305986);
// 23464
o9.returnValue = true;
// undefined
o9 = null;
// 23465
o9 = {};
// 23468
o9.cancelBubble = false;
// 23471
f974244559_471.returns.push(1373491305998);
// 23473
o9.returnValue = true;
// undefined
o9 = null;
// 23474
o9 = {};
// 23477
o9.cancelBubble = false;
// 23480
f974244559_471.returns.push(1373491306018);
// 23482
o9.returnValue = true;
// undefined
o9 = null;
// 23483
o9 = {};
// 23486
o9.cancelBubble = false;
// 23489
f974244559_471.returns.push(1373491306058);
// 23491
o9.returnValue = true;
// undefined
o9 = null;
// 23492
o9 = {};
// 23495
o9.srcElement = o71;
// 23497
o9.target = o71;
// 23504
f974244559_519.returns.push(null);
// 23510
f974244559_519.returns.push(null);
// 23516
f974244559_519.returns.push(null);
// 23522
f974244559_519.returns.push(null);
// 23528
f974244559_519.returns.push(null);
// 23534
f974244559_519.returns.push(null);
// 23540
f974244559_519.returns.push(null);
// 23546
f974244559_519.returns.push(null);
// 23551
o9.relatedTarget = o83;
// 23552
o83.parentNode = o81;
// 23553
o83.nodeType = 1;
// 23554
o83.getAttributeNode = f974244559_519;
// 23556
f974244559_519.returns.push(null);
// 23558
o81.parentNode = o121;
// 23559
o81.nodeType = 1;
// 23560
o81.getAttributeNode = f974244559_519;
// undefined
o81 = null;
// 23562
f974244559_519.returns.push(null);
// 23565
o121.nodeType = 1;
// 23566
o121.getAttributeNode = f974244559_519;
// 23568
f974244559_519.returns.push(null);
// 23570
o13 = {};
// 23571
o111.parentNode = o13;
// 23572
o111.nodeType = 1;
// 23573
o111.getAttributeNode = f974244559_519;
// undefined
o111 = null;
// 23575
f974244559_519.returns.push(null);
// 23577
o13.parentNode = o17;
// 23578
o13.nodeType = 1;
// 23579
o13.getAttributeNode = f974244559_519;
// 23581
f974244559_519.returns.push(null);
// 23583
o17.parentNode = o71;
// 23584
o17.nodeType = 1;
// 23585
o17.getAttributeNode = f974244559_519;
// 23587
f974244559_519.returns.push(null);
// 23593
f974244559_519.returns.push(null);
// 23599
f974244559_519.returns.push(null);
// 23605
f974244559_519.returns.push(null);
// 23611
f974244559_519.returns.push(null);
// 23617
f974244559_519.returns.push(null);
// 23623
f974244559_519.returns.push(null);
// 23629
f974244559_519.returns.push(null);
// 23635
f974244559_519.returns.push(null);
// 23640
o9.cancelBubble = false;
// 23641
o9.returnValue = true;
// undefined
o9 = null;
// 23642
o9 = {};
// 23645
o9.cancelBubble = false;
// 23648
f974244559_471.returns.push(1373491306081);
// 23651
f974244559_1202.returns.push(undefined);
// 23653
o9.returnValue = true;
// 23656
o9.srcElement = o83;
// 23658
o9.target = o83;
// 23665
f974244559_519.returns.push(null);
// 23671
f974244559_519.returns.push(null);
// 23677
f974244559_519.returns.push(null);
// 23683
f974244559_519.returns.push(null);
// 23689
f974244559_519.returns.push(null);
// 23695
f974244559_519.returns.push(null);
// 23701
f974244559_519.returns.push(null);
// 23707
f974244559_519.returns.push(null);
// 23713
f974244559_519.returns.push(null);
// 23719
f974244559_519.returns.push(null);
// 23725
f974244559_519.returns.push(null);
// 23731
f974244559_519.returns.push(null);
// 23737
f974244559_519.returns.push(null);
// 23743
f974244559_519.returns.push(null);
// 23748
o9.relatedTarget = o71;
// undefined
o9 = null;
// undefined
o71 = null;
// 23751
o9 = {};
// 23755
f974244559_471.returns.push(1373491306089);
// 23756
o9.cancelBubble = false;
// 23757
o9.returnValue = true;
// 23760
o9.srcElement = o83;
// 23762
o9.target = o83;
// 23769
f974244559_519.returns.push(null);
// 23775
f974244559_519.returns.push(null);
// 23781
f974244559_519.returns.push(null);
// 23787
f974244559_519.returns.push(null);
// 23793
f974244559_519.returns.push(null);
// 23799
f974244559_519.returns.push(null);
// 23805
f974244559_519.returns.push(null);
// 23811
f974244559_519.returns.push(null);
// 23817
f974244559_519.returns.push(null);
// 23823
f974244559_519.returns.push(null);
// 23829
f974244559_519.returns.push(null);
// 23835
f974244559_519.returns.push(null);
// 23841
f974244559_519.returns.push(null);
// 23847
f974244559_519.returns.push(null);
// 23852
o9.JSBNG__screenX = 990;
// 23853
o9.JSBNG__screenY = 442;
// 23854
o9.altKey = false;
// 23855
o9.bubbles = true;
// 23856
o9.button = 0;
// 23857
o9.buttons = void 0;
// 23858
o9.cancelable = false;
// 23859
o9.clientX = 973;
// 23860
o9.clientY = 338;
// 23861
o9.ctrlKey = false;
// 23862
o9.currentTarget = o0;
// 23863
o9.defaultPrevented = false;
// 23864
o9.detail = 0;
// 23865
o9.eventPhase = 3;
// 23866
o9.isTrusted = void 0;
// 23867
o9.metaKey = false;
// 23868
o9.pageX = 973;
// 23869
o9.pageY = 955;
// 23870
o9.relatedTarget = null;
// 23871
o9.fromElement = null;
// 23874
o9.shiftKey = false;
// 23877
o9.timeStamp = 1373491306089;
// 23878
o9.type = "mousemove";
// 23879
o9.view = ow974244559;
// undefined
o9 = null;
// 23888
f974244559_2566.returns.push(undefined);
// 23891
f974244559_14.returns.push(undefined);
// 23892
f974244559_12.returns.push(94);
// 23895
o9 = {};
// 23898
o9.cancelBubble = false;
// 23901
f974244559_471.returns.push(1373491306120);
// 23906
f974244559_471.returns.push(1373491306129);
// 23910
f974244559_471.returns.push(1373491306129);
// 23913
o9.returnValue = true;
// undefined
o9 = null;
// 23914
o9 = {};
// 23917
o9.srcElement = o83;
// 23919
o9.target = o83;
// 23926
f974244559_519.returns.push(null);
// 23932
f974244559_519.returns.push(null);
// 23938
f974244559_519.returns.push(null);
// 23944
f974244559_519.returns.push(null);
// 23950
f974244559_519.returns.push(null);
// 23956
f974244559_519.returns.push(null);
// 23962
f974244559_519.returns.push(null);
// 23968
f974244559_519.returns.push(null);
// 23974
f974244559_519.returns.push(null);
// 23980
f974244559_519.returns.push(null);
// 23986
f974244559_519.returns.push(null);
// 23992
f974244559_519.returns.push(null);
// 23998
f974244559_519.returns.push(null);
// 24004
f974244559_519.returns.push(null);
// 24009
o9.relatedTarget = o82;
// 24010
o82.parentNode = o79;
// 24011
o82.nodeType = 1;
// 24012
o82.getAttributeNode = f974244559_519;
// 24014
f974244559_519.returns.push(null);
// 24016
o79.parentNode = o121;
// undefined
o121 = null;
// 24017
o79.nodeType = 1;
// 24018
o79.getAttributeNode = f974244559_519;
// undefined
o79 = null;
// 24020
f974244559_519.returns.push(null);
// 24026
f974244559_519.returns.push(null);
// 24032
f974244559_519.returns.push(null);
// 24038
f974244559_519.returns.push(null);
// 24044
f974244559_519.returns.push(null);
// 24050
f974244559_519.returns.push(null);
// 24056
f974244559_519.returns.push(null);
// 24062
f974244559_519.returns.push(null);
// 24068
f974244559_519.returns.push(null);
// 24074
f974244559_519.returns.push(null);
// 24080
f974244559_519.returns.push(null);
// 24086
f974244559_519.returns.push(null);
// 24092
f974244559_519.returns.push(null);
// 24097
o9.cancelBubble = false;
// 24098
o9.returnValue = true;
// undefined
o9 = null;
// 24099
o9 = {};
// 24102
o9.cancelBubble = false;
// 24105
f974244559_471.returns.push(1373491306241);
// 24108
f974244559_1202.returns.push(undefined);
// 24110
o9.returnValue = true;
// 24113
o9.srcElement = o82;
// 24115
o9.target = o82;
// 24122
f974244559_519.returns.push(null);
// 24128
f974244559_519.returns.push(null);
// 24134
f974244559_519.returns.push(null);
// 24140
f974244559_519.returns.push(null);
// 24146
f974244559_519.returns.push(null);
// 24152
f974244559_519.returns.push(null);
// 24158
f974244559_519.returns.push(null);
// 24164
f974244559_519.returns.push(null);
// 24170
f974244559_519.returns.push(null);
// 24176
f974244559_519.returns.push(null);
// 24182
f974244559_519.returns.push(null);
// 24188
f974244559_519.returns.push(null);
// 24194
f974244559_519.returns.push(null);
// 24200
f974244559_519.returns.push(null);
// 24205
o9.relatedTarget = o83;
// undefined
o9 = null;
// undefined
o83 = null;
// 24208
o9 = {};
// 24212
f974244559_471.returns.push(1373491306252);
// 24213
o9.cancelBubble = false;
// 24214
o9.returnValue = true;
// 24217
o9.srcElement = o82;
// 24219
o9.target = o82;
// 24226
f974244559_519.returns.push(null);
// 24232
f974244559_519.returns.push(null);
// 24238
f974244559_519.returns.push(null);
// 24244
f974244559_519.returns.push(null);
// 24250
f974244559_519.returns.push(null);
// 24256
f974244559_519.returns.push(null);
// 24262
f974244559_519.returns.push(null);
// 24268
f974244559_519.returns.push(null);
// 24274
f974244559_519.returns.push(null);
// 24280
f974244559_519.returns.push(null);
// 24286
f974244559_519.returns.push(null);
// 24292
f974244559_519.returns.push(null);
// 24298
f974244559_519.returns.push(null);
// 24304
f974244559_519.returns.push(null);
// 24309
o9.JSBNG__screenX = 990;
// 24310
o9.JSBNG__screenY = 442;
// 24311
o9.altKey = false;
// 24312
o9.bubbles = true;
// 24313
o9.button = 0;
// 24314
o9.buttons = void 0;
// 24315
o9.cancelable = false;
// 24316
o9.clientX = 973;
// 24317
o9.clientY = 338;
// 24318
o9.ctrlKey = false;
// 24319
o9.currentTarget = o0;
// 24320
o9.defaultPrevented = false;
// 24321
o9.detail = 0;
// 24322
o9.eventPhase = 3;
// 24323
o9.isTrusted = void 0;
// 24324
o9.metaKey = false;
// 24325
o9.pageX = 973;
// 24326
o9.pageY = 915;
// 24327
o9.relatedTarget = null;
// 24328
o9.fromElement = null;
// 24331
o9.shiftKey = false;
// 24334
o9.timeStamp = 1373491306252;
// 24335
o9.type = "mousemove";
// 24336
o9.view = ow974244559;
// undefined
o9 = null;
// 24345
f974244559_2566.returns.push(undefined);
// 24348
f974244559_14.returns.push(undefined);
// 24349
f974244559_12.returns.push(95);
// 24352
o9 = {};
// 24355
o9.cancelBubble = false;
// 24358
f974244559_471.returns.push(1373491306328);
// 24360
o9.returnValue = true;
// undefined
o9 = null;
// 24361
o9 = {};
// 24364
o9.cancelBubble = false;
// 24367
f974244559_471.returns.push(1373491306345);
// 24369
o9.returnValue = true;
// undefined
o9 = null;
// 24370
o9 = {};
// 24373
o9.cancelBubble = false;
// 24376
f974244559_471.returns.push(1373491306364);
// 24378
o9.returnValue = true;
// undefined
o9 = null;
// 24379
o9 = {};
// 24382
o9.cancelBubble = false;
// 24385
f974244559_471.returns.push(1373491306379);
// 24387
o9.returnValue = true;
// undefined
o9 = null;
// 24388
o9 = {};
// 24391
o9.cancelBubble = false;
// 24394
f974244559_471.returns.push(1373491306391);
// 24396
o9.returnValue = true;
// undefined
o9 = null;
// 24397
o9 = {};
// 24400
o9.cancelBubble = false;
// 24403
f974244559_471.returns.push(1373491306410);
// 24405
o9.returnValue = true;
// undefined
o9 = null;
// undefined
fo974244559_1_cookie.returns.push("c_user=100006118350059; csm=2; sub=268435456");
// 24407
o9 = {};
// 24410
o9.cancelBubble = false;
// 24413
f974244559_471.returns.push(1373491306427);
// 24415
o9.returnValue = true;
// undefined
o9 = null;
// 24416
o9 = {};
// 24419
o9.srcElement = o82;
// 24421
o9.target = o82;
// 24428
f974244559_519.returns.push(null);
// 24434
f974244559_519.returns.push(null);
// 24440
f974244559_519.returns.push(null);
// 24446
f974244559_519.returns.push(null);
// 24452
f974244559_519.returns.push(null);
// 24458
f974244559_519.returns.push(null);
// 24464
f974244559_519.returns.push(null);
// 24470
f974244559_519.returns.push(null);
// 24476
f974244559_519.returns.push(null);
// 24482
f974244559_519.returns.push(null);
// 24488
f974244559_519.returns.push(null);
// 24494
f974244559_519.returns.push(null);
// 24500
f974244559_519.returns.push(null);
// 24506
f974244559_519.returns.push(null);
// 24511
o18 = {};
// 24512
o9.relatedTarget = o18;
// 24513
o19 = {};
// 24514
o18.parentNode = o19;
// 24515
o18.nodeType = 1;
// 24516
o18.getAttributeNode = f974244559_519;
// 24518
f974244559_519.returns.push(null);
// 24520
o20 = {};
// 24521
o19.parentNode = o20;
// 24522
o19.nodeType = 1;
// 24523
o19.getAttributeNode = f974244559_519;
// undefined
o19 = null;
// 24525
f974244559_519.returns.push(null);
// 24527
o20.parentNode = o63;
// 24528
o20.nodeType = 1;
// 24529
o20.getAttributeNode = f974244559_519;
// undefined
o20 = null;
// 24531
f974244559_519.returns.push(null);
// 24533
o63.parentNode = o23;
// 24534
o63.nodeType = 1;
// 24535
o63.getAttributeNode = f974244559_519;
// undefined
o63 = null;
// 24537
f974244559_519.returns.push(null);
// 24539
o19 = {};
// 24540
o23.parentNode = o19;
// 24541
o23.nodeType = 1;
// 24542
o23.getAttributeNode = f974244559_519;
// undefined
o23 = null;
// 24544
f974244559_519.returns.push(null);
// 24546
o19.parentNode = o120;
// 24547
o19.nodeType = 1;
// 24548
o19.getAttributeNode = f974244559_519;
// 24550
f974244559_519.returns.push(null);
// 24552
o20 = {};
// 24553
o120.parentNode = o20;
// 24554
o120.nodeType = 1;
// 24555
o120.getAttributeNode = f974244559_519;
// undefined
o120 = null;
// 24557
f974244559_519.returns.push(null);
// 24559
o20.parentNode = o119;
// 24560
o20.nodeType = 1;
// 24561
o20.getAttributeNode = f974244559_519;
// undefined
o20 = null;
// 24563
f974244559_519.returns.push(null);
// 24565
o119.parentNode = o105;
// 24566
o119.nodeType = 1;
// 24567
o119.getAttributeNode = f974244559_519;
// undefined
o119 = null;
// 24569
f974244559_519.returns.push(null);
// 24571
o105.parentNode = o13;
// undefined
o13 = null;
// 24572
o105.nodeType = 1;
// 24573
o105.getAttributeNode = f974244559_519;
// undefined
o105 = null;
// 24575
f974244559_519.returns.push(null);
// 24581
f974244559_519.returns.push(null);
// 24587
f974244559_519.returns.push(null);
// 24593
f974244559_519.returns.push(null);
// 24599
f974244559_519.returns.push(null);
// 24605
f974244559_519.returns.push(null);
// 24611
f974244559_519.returns.push(null);
// 24617
f974244559_519.returns.push(null);
// 24623
f974244559_519.returns.push(null);
// 24629
f974244559_519.returns.push(null);
// 24635
f974244559_519.returns.push(null);
// 24640
o9.cancelBubble = false;
// 24641
o9.returnValue = true;
// undefined
o9 = null;
// 24642
o9 = {};
// 24645
o9.cancelBubble = false;
// 24648
f974244559_471.returns.push(1373491306460);
// 24651
f974244559_1202.returns.push(undefined);
// 24653
o9.returnValue = true;
// 24656
o9.srcElement = o18;
// 24658
o9.target = o18;
// 24665
f974244559_519.returns.push(null);
// 24671
f974244559_519.returns.push(null);
// 24677
f974244559_519.returns.push(null);
// 24683
f974244559_519.returns.push(null);
// 24689
f974244559_519.returns.push(null);
// 24695
f974244559_519.returns.push(null);
// 24701
f974244559_519.returns.push(null);
// 24707
f974244559_519.returns.push(null);
// 24713
f974244559_519.returns.push(null);
// 24719
f974244559_519.returns.push(null);
// 24725
f974244559_519.returns.push(null);
// 24731
f974244559_519.returns.push(null);
// 24737
f974244559_519.returns.push(null);
// 24743
f974244559_519.returns.push(null);
// 24749
f974244559_519.returns.push(null);
// 24755
f974244559_519.returns.push(null);
// 24761
f974244559_519.returns.push(null);
// 24767
f974244559_519.returns.push(null);
// 24773
f974244559_519.returns.push(null);
// 24779
f974244559_519.returns.push(null);
// 24784
o9.relatedTarget = o82;
// undefined
o9 = null;
// undefined
o82 = null;
// 24787
o9 = {};
// 24791
f974244559_471.returns.push(1373491306469);
// 24792
o9.cancelBubble = false;
// 24793
o9.returnValue = true;
// 24796
o9.srcElement = o18;
// 24798
o9.target = o18;
// 24805
f974244559_519.returns.push(null);
// 24811
f974244559_519.returns.push(null);
// 24817
f974244559_519.returns.push(null);
// 24823
f974244559_519.returns.push(null);
// 24829
f974244559_519.returns.push(null);
// 24835
f974244559_519.returns.push(null);
// 24841
f974244559_519.returns.push(null);
// 24847
f974244559_519.returns.push(null);
// 24853
f974244559_519.returns.push(null);
// 24859
f974244559_519.returns.push(null);
// 24865
f974244559_519.returns.push(null);
// 24871
f974244559_519.returns.push(null);
// 24877
f974244559_519.returns.push(null);
// 24883
f974244559_519.returns.push(null);
// 24889
f974244559_519.returns.push(null);
// 24895
f974244559_519.returns.push(null);
// 24901
f974244559_519.returns.push(null);
// 24907
f974244559_519.returns.push(null);
// 24913
f974244559_519.returns.push(null);
// 24919
f974244559_519.returns.push(null);
// 24924
o9.JSBNG__screenX = 990;
// 24925
o9.JSBNG__screenY = 442;
// 24926
o9.altKey = false;
// 24927
o9.bubbles = true;
// 24928
o9.button = 0;
// 24929
o9.buttons = void 0;
// 24930
o9.cancelable = false;
// 24931
o9.clientX = 973;
// 24932
o9.clientY = 338;
// 24933
o9.ctrlKey = false;
// 24934
o9.currentTarget = o0;
// 24935
o9.defaultPrevented = false;
// 24936
o9.detail = 0;
// 24937
o9.eventPhase = 3;
// 24938
o9.isTrusted = void 0;
// 24939
o9.metaKey = false;
// 24940
o9.pageX = 973;
// 24941
o9.pageY = 635;
// 24942
o9.relatedTarget = null;
// 24943
o9.fromElement = null;
// 24946
o9.shiftKey = false;
// 24949
o9.timeStamp = 1373491306469;
// 24950
o9.type = "mousemove";
// 24951
o9.view = ow974244559;
// undefined
o9 = null;
// 24960
f974244559_2566.returns.push(undefined);
// 24963
f974244559_14.returns.push(undefined);
// 24964
f974244559_12.returns.push(96);
// 24967
o9 = {};
// 24970
o9.cancelBubble = false;
// 24973
f974244559_471.returns.push(1373491306718);
// 24978
f974244559_471.returns.push(1373491306719);
// 24982
f974244559_471.returns.push(1373491306719);
// 24985
o9.returnValue = true;
// undefined
o9 = null;
// 24986
o9 = {};
// 24989
o9.cancelBubble = false;
// 24992
f974244559_471.returns.push(1373491306733);
// 24994
o9.returnValue = true;
// undefined
o9 = null;
// 24995
o9 = {};
// 24998
o9.cancelBubble = false;
// 25001
f974244559_471.returns.push(1373491306747);
// 25003
o9.returnValue = true;
// undefined
o9 = null;
// 25004
o9 = {};
// 25007
o9.cancelBubble = false;
// 25010
f974244559_471.returns.push(1373491306762);
// 25012
o9.returnValue = true;
// undefined
o9 = null;
// 25013
o9 = {};
// 25016
o9.cancelBubble = false;
// 25019
f974244559_471.returns.push(1373491306776);
// 25021
o9.returnValue = true;
// undefined
o9 = null;
// 25022
o9 = {};
// 25025
o9.cancelBubble = false;
// 25028
f974244559_471.returns.push(1373491306791);
// 25030
o9.returnValue = true;
// undefined
o9 = null;
// 25031
o9 = {};
// 25034
o9.srcElement = o18;
// 25036
o9.target = o18;
// 25043
f974244559_519.returns.push(null);
// 25049
f974244559_519.returns.push(null);
// 25055
f974244559_519.returns.push(null);
// 25061
f974244559_519.returns.push(null);
// 25067
f974244559_519.returns.push(null);
// 25073
f974244559_519.returns.push(null);
// 25079
f974244559_519.returns.push(null);
// 25085
f974244559_519.returns.push(null);
// 25091
f974244559_519.returns.push(null);
// 25097
f974244559_519.returns.push(null);
// 25103
f974244559_519.returns.push(null);
// 25109
f974244559_519.returns.push(null);
// 25115
f974244559_519.returns.push(null);
// 25121
f974244559_519.returns.push(null);
// 25127
f974244559_519.returns.push(null);
// 25133
f974244559_519.returns.push(null);
// 25139
f974244559_519.returns.push(null);
// 25145
f974244559_519.returns.push(null);
// 25151
f974244559_519.returns.push(null);
// 25157
f974244559_519.returns.push(null);
// 25162
o13 = {};
// 25163
o9.relatedTarget = o13;
// 25164
o20 = {};
// 25165
o13.parentNode = o20;
// 25166
o13.nodeType = 1;
// 25167
o13.getAttributeNode = f974244559_519;
// 25169
f974244559_519.returns.push(null);
// 25171
o22 = {};
// 25172
o20.parentNode = o22;
// 25173
o20.nodeType = 1;
// 25174
o20.getAttributeNode = f974244559_519;
// undefined
o20 = null;
// 25176
f974244559_519.returns.push(null);
// 25178
o20 = {};
// 25179
o22.parentNode = o20;
// 25180
o22.nodeType = 1;
// 25181
o22.getAttributeNode = f974244559_519;
// undefined
o22 = null;
// 25183
f974244559_519.returns.push(null);
// 25185
o22 = {};
// 25186
o20.parentNode = o22;
// 25187
o20.nodeType = 1;
// 25188
o20.getAttributeNode = f974244559_519;
// 25190
f974244559_519.returns.push(null);
// 25192
o22.parentNode = o49;
// 25193
o22.nodeType = 1;
// 25194
o22.getAttributeNode = f974244559_519;
// undefined
o22 = null;
// 25196
f974244559_519.returns.push(null);
// 25198
o49.parentNode = o21;
// 25199
o49.nodeType = 1;
// 25200
o49.getAttributeNode = f974244559_519;
// undefined
o49 = null;
// 25202
f974244559_519.returns.push(null);
// 25204
o21.parentNode = o19;
// undefined
o19 = null;
// 25205
o21.nodeType = 1;
// 25206
o21.getAttributeNode = f974244559_519;
// undefined
o21 = null;
// 25208
f974244559_519.returns.push(null);
// 25214
f974244559_519.returns.push(null);
// 25220
f974244559_519.returns.push(null);
// 25226
f974244559_519.returns.push(null);
// 25232
f974244559_519.returns.push(null);
// 25238
f974244559_519.returns.push(null);
// 25244
f974244559_519.returns.push(null);
// 25250
f974244559_519.returns.push(null);
// 25256
f974244559_519.returns.push(null);
// 25262
f974244559_519.returns.push(null);
// 25268
f974244559_519.returns.push(null);
// 25274
f974244559_519.returns.push(null);
// 25280
f974244559_519.returns.push(null);
// 25286
f974244559_519.returns.push(null);
// 25292
f974244559_519.returns.push(null);
// 25298
f974244559_519.returns.push(null);
// 25303
o9.cancelBubble = false;
// 25304
o9.returnValue = true;
// undefined
o9 = null;
// 25305
o9 = {};
// 25308
o9.cancelBubble = false;
// 25311
f974244559_471.returns.push(1373491306844);
// 25314
f974244559_1202.returns.push(undefined);
// 25316
o9.returnValue = true;
// 25319
o9.srcElement = o13;
// 25321
o9.target = o13;
// 25328
f974244559_519.returns.push(null);
// 25334
f974244559_519.returns.push(null);
// 25340
f974244559_519.returns.push(null);
// 25346
f974244559_519.returns.push(null);
// 25352
f974244559_519.returns.push(null);
// 25358
f974244559_519.returns.push(null);
// 25364
f974244559_519.returns.push(null);
// 25370
f974244559_519.returns.push(null);
// 25376
f974244559_519.returns.push(null);
// 25382
f974244559_519.returns.push(null);
// 25388
f974244559_519.returns.push(null);
// 25394
f974244559_519.returns.push(null);
// 25400
f974244559_519.returns.push(null);
// 25406
f974244559_519.returns.push(null);
// 25412
f974244559_519.returns.push(null);
// 25418
f974244559_519.returns.push(null);
// 25424
f974244559_519.returns.push(null);
// 25430
f974244559_519.returns.push(null);
// 25436
f974244559_519.returns.push(null);
// 25442
f974244559_519.returns.push(null);
// 25448
f974244559_519.returns.push(null);
// 25454
f974244559_519.returns.push(null);
// 25459
o9.relatedTarget = o18;
// undefined
o9 = null;
// undefined
o18 = null;
// 25462
o9 = {};
// 25466
f974244559_471.returns.push(1373491306853);
// 25467
o9.cancelBubble = false;
// 25468
o9.returnValue = true;
// 25471
o9.srcElement = o13;
// 25473
o9.target = o13;
// 25480
f974244559_519.returns.push(null);
// 25486
f974244559_519.returns.push(null);
// 25492
f974244559_519.returns.push(null);
// 25498
f974244559_519.returns.push(null);
// 25504
f974244559_519.returns.push(null);
// 25510
f974244559_519.returns.push(null);
// 25516
f974244559_519.returns.push(null);
// 25522
f974244559_519.returns.push(null);
// 25528
f974244559_519.returns.push(null);
// 25534
f974244559_519.returns.push(null);
// 25540
f974244559_519.returns.push(null);
// 25546
f974244559_519.returns.push(null);
// 25552
f974244559_519.returns.push(null);
// 25558
f974244559_519.returns.push(null);
// 25564
f974244559_519.returns.push(null);
// 25570
f974244559_519.returns.push(null);
// 25576
f974244559_519.returns.push(null);
// 25582
f974244559_519.returns.push(null);
// 25588
f974244559_519.returns.push(null);
// 25594
f974244559_519.returns.push(null);
// 25600
f974244559_519.returns.push(null);
// 25606
f974244559_519.returns.push(null);
// 25611
o9.JSBNG__screenX = 990;
// 25612
o9.JSBNG__screenY = 442;
// 25613
o9.altKey = false;
// 25614
o9.bubbles = true;
// 25615
o9.button = 0;
// 25616
o9.buttons = void 0;
// 25617
o9.cancelable = false;
// 25618
o9.clientX = 973;
// 25619
o9.clientY = 338;
// 25620
o9.ctrlKey = false;
// 25621
o9.currentTarget = o0;
// 25622
o9.defaultPrevented = false;
// 25623
o9.detail = 0;
// 25624
o9.eventPhase = 3;
// 25625
o9.isTrusted = void 0;
// 25626
o9.metaKey = false;
// 25627
o9.pageX = 973;
// 25628
o9.pageY = 355;
// 25629
o9.relatedTarget = null;
// 25630
o9.fromElement = null;
// 25633
o9.shiftKey = false;
// 25636
o9.timeStamp = 1373491306852;
// 25637
o9.type = "mousemove";
// 25638
o9.view = ow974244559;
// undefined
o9 = null;
// 25647
f974244559_2566.returns.push(undefined);
// 25650
f974244559_14.returns.push(undefined);
// 25651
f974244559_12.returns.push(97);
// 25655
f974244559_12.returns.push(98);
// undefined
fo974244559_1_cookie.returns.push("c_user=100006118350059; csm=2; sub=268435456");
// 25660
f974244559_471.returns.push(1373491306919);
// undefined
fo974244559_1_cookie.returns.push("c_user=100006118350059; csm=2; sub=268435456");
// 25662
o9 = {};
// 25665
o9.cancelBubble = false;
// 25668
f974244559_471.returns.push(1373491307005);
// 25670
o9.returnValue = true;
// undefined
o9 = null;
// 25671
o9 = {};
// 25674
o9.cancelBubble = false;
// 25677
f974244559_471.returns.push(1373491307014);
// 25679
o9.returnValue = true;
// undefined
o9 = null;
// 25680
o9 = {};
// 25683
o9.cancelBubble = false;
// 25686
f974244559_471.returns.push(1373491307018);
// 25688
o9.returnValue = true;
// undefined
o9 = null;
// 25689
o9 = {};
// 25692
o9.cancelBubble = false;
// 25695
f974244559_471.returns.push(1373491307025);
// 25697
o9.returnValue = true;
// undefined
o9 = null;
// 25698
o9 = {};
// 25701
o9.cancelBubble = false;
// 25704
f974244559_471.returns.push(1373491307032);
// 25706
o9.returnValue = true;
// undefined
o9 = null;
// 25707
o9 = {};
// 25710
o9.cancelBubble = false;
// 25713
f974244559_471.returns.push(1373491307053);
// 25715
o9.returnValue = true;
// undefined
o9 = null;
// 25716
o9 = {};
// 25720
f974244559_471.returns.push(1373491307108);
// 25721
o9.cancelBubble = false;
// 25722
o9.returnValue = true;
// 25725
o9.srcElement = o13;
// 25727
o9.target = o13;
// 25734
f974244559_519.returns.push(null);
// 25740
f974244559_519.returns.push(null);
// 25746
f974244559_519.returns.push(null);
// 25752
f974244559_519.returns.push(null);
// 25758
f974244559_519.returns.push(null);
// 25764
f974244559_519.returns.push(null);
// 25770
f974244559_519.returns.push(null);
// 25776
f974244559_519.returns.push(null);
// 25782
f974244559_519.returns.push(null);
// 25788
f974244559_519.returns.push(null);
// 25794
f974244559_519.returns.push(null);
// 25800
f974244559_519.returns.push(null);
// 25806
f974244559_519.returns.push(null);
// 25812
f974244559_519.returns.push(null);
// 25818
f974244559_519.returns.push(null);
// 25824
f974244559_519.returns.push(null);
// 25830
f974244559_519.returns.push(null);
// 25836
f974244559_519.returns.push(null);
// 25842
f974244559_519.returns.push(null);
// 25848
f974244559_519.returns.push(null);
// 25854
f974244559_519.returns.push(null);
// 25860
f974244559_519.returns.push(null);
// 25865
o9.JSBNG__screenX = 990;
// 25866
o9.JSBNG__screenY = 442;
// 25867
o9.altKey = false;
// 25868
o9.bubbles = true;
// 25869
o9.button = 0;
// 25870
o9.buttons = void 0;
// 25871
o9.cancelable = false;
// 25872
o9.clientX = 973;
// 25873
o9.clientY = 338;
// 25874
o9.ctrlKey = false;
// 25875
o9.currentTarget = o0;
// 25876
o9.defaultPrevented = false;
// 25877
o9.detail = 0;
// 25878
o9.eventPhase = 3;
// 25879
o9.isTrusted = void 0;
// 25880
o9.metaKey = false;
// 25881
o9.pageX = 973;
// 25882
o9.pageY = 338;
// 25883
o9.relatedTarget = null;
// 25884
o9.fromElement = null;
// 25887
o9.shiftKey = false;
// 25890
o9.timeStamp = 1373491307108;
// 25891
o9.type = "mousemove";
// 25892
o9.view = ow974244559;
// undefined
o9 = null;
// 25901
f974244559_2566.returns.push(undefined);
// 25904
f974244559_14.returns.push(undefined);
// 25905
f974244559_12.returns.push(99);
// 25908
o9 = {};
// 25911
o9.cancelBubble = false;
// 25914
f974244559_471.returns.push(1373491307333);
// 25919
f974244559_471.returns.push(1373491307334);
// 25923
f974244559_471.returns.push(1373491307335);
// 25926
o9.returnValue = true;
// undefined
o9 = null;
// 25927
o9 = {};
// 25930
o9.cancelBubble = false;
// 25933
f974244559_471.returns.push(1373491307342);
// 25935
o9.returnValue = true;
// undefined
o9 = null;
// 25936
o9 = {};
// 25939
o9.cancelBubble = false;
// 25942
f974244559_471.returns.push(1373491307356);
// 25944
o9.returnValue = true;
// undefined
o9 = null;
// 25945
o9 = {};
// 25948
o9.cancelBubble = false;
// 25951
f974244559_471.returns.push(1373491307357);
// 25953
o9.returnValue = true;
// undefined
o9 = null;
// 25954
o9 = {};
// 25957
o9.cancelBubble = false;
// 25960
f974244559_471.returns.push(1373491307361);
// 25962
o9.returnValue = true;
// undefined
o9 = null;
// 25963
o9 = {};
// 25966
o9.cancelBubble = false;
// 25969
f974244559_471.returns.push(1373491307374);
// 25971
o9.returnValue = true;
// undefined
o9 = null;
// 25972
o9 = {};
// 25975
o9.cancelBubble = false;
// 25978
f974244559_471.returns.push(1373491307393);
// 25980
o9.returnValue = true;
// undefined
o9 = null;
// undefined
fo974244559_1_cookie.returns.push("c_user=100006118350059; csm=2; sub=268435456");
// 25982
o9 = {};
// 25985
o9.cancelBubble = false;
// 25988
f974244559_471.returns.push(1373491307637);
// 25990
o9.returnValue = true;
// undefined
o9 = null;
// 25991
o9 = {};
// 25994
o9.cancelBubble = false;
// 25997
f974244559_471.returns.push(1373491307655);
// 25999
o9.returnValue = true;
// undefined
o9 = null;
// 26000
o9 = {};
// 26003
o9.cancelBubble = false;
// 26006
f974244559_471.returns.push(1373491307670);
// 26008
o9.returnValue = true;
// undefined
o9 = null;
// 26009
o9 = {};
// 26012
o9.cancelBubble = false;
// 26015
f974244559_471.returns.push(1373491307679);
// 26017
o9.returnValue = true;
// undefined
o9 = null;
// 26018
o9 = {};
// 26021
o9.cancelBubble = false;
// 26024
f974244559_471.returns.push(1373491307729);
// 26026
o9.returnValue = true;
// undefined
o9 = null;
// undefined
fo974244559_1_cookie.returns.push("c_user=100006118350059; csm=2; sub=268435456");
// 26029
f974244559_471.returns.push(1373491307741);
// 26031
f974244559_471.returns.push(1373491307741);
// 26033
f974244559_471.returns.push(1373491307741);
// 26034
o9 = {};
// 26037
o9.cancelBubble = false;
// 26040
f974244559_471.returns.push(1373491307756);
// 26042
o9.returnValue = true;
// undefined
o9 = null;
// 26044
f974244559_12.returns.push(100);
// undefined
fo974244559_1_cookie.returns.push("c_user=100006118350059; csm=2; sub=268435456");
// 26049
f974244559_471.returns.push(1373491307922);
// undefined
fo974244559_1_cookie.returns.push("c_user=100006118350059; csm=2; sub=268435456");
// 26051
o9 = {};
// 26054
o9.srcElement = o13;
// 26056
o9.target = o13;
// 26063
f974244559_519.returns.push(null);
// 26069
f974244559_519.returns.push(null);
// 26075
f974244559_519.returns.push(null);
// 26081
f974244559_519.returns.push(null);
// 26087
f974244559_519.returns.push(null);
// 26093
f974244559_519.returns.push(null);
// 26099
f974244559_519.returns.push(null);
// 26105
f974244559_519.returns.push(null);
// 26111
f974244559_519.returns.push(null);
// 26117
f974244559_519.returns.push(null);
// 26123
f974244559_519.returns.push(null);
// 26129
f974244559_519.returns.push(null);
// 26135
f974244559_519.returns.push(null);
// 26141
f974244559_519.returns.push(null);
// 26147
f974244559_519.returns.push(null);
// 26153
f974244559_519.returns.push(null);
// 26159
f974244559_519.returns.push(null);
// 26165
f974244559_519.returns.push(null);
// 26171
f974244559_519.returns.push(null);
// 26177
f974244559_519.returns.push(null);
// 26183
f974244559_519.returns.push(null);
// 26189
f974244559_519.returns.push(null);
// 26194
o9.relatedTarget = o69;
// 26195
o18 = {};
// 26196
o69.parentNode = o18;
// 26197
o69.nodeType = 1;
// 26198
o69.getAttributeNode = f974244559_519;
// 26200
f974244559_519.returns.push(null);
// 26202
o18.parentNode = o20;
// undefined
o20 = null;
// 26203
o18.nodeType = 1;
// 26204
o18.getAttributeNode = f974244559_519;
// undefined
o18 = null;
// 26206
f974244559_519.returns.push(null);
// 26212
f974244559_519.returns.push(null);
// 26218
f974244559_519.returns.push(null);
// 26224
f974244559_519.returns.push(null);
// 26230
f974244559_519.returns.push(null);
// 26236
f974244559_519.returns.push(null);
// 26242
f974244559_519.returns.push(null);
// 26248
f974244559_519.returns.push(null);
// 26254
f974244559_519.returns.push(null);
// 26260
f974244559_519.returns.push(null);
// 26266
f974244559_519.returns.push(null);
// 26272
f974244559_519.returns.push(null);
// 26278
f974244559_519.returns.push(null);
// 26284
f974244559_519.returns.push(null);
// 26290
f974244559_519.returns.push(null);
// 26296
f974244559_519.returns.push(null);
// 26302
f974244559_519.returns.push(null);
// 26308
f974244559_519.returns.push(null);
// 26314
f974244559_519.returns.push(null);
// 26320
f974244559_519.returns.push(null);
// 26325
o9.cancelBubble = false;
// 26326
o9.returnValue = true;
// undefined
o9 = null;
// 26327
o9 = {};
// 26330
o9.cancelBubble = false;
// 26333
f974244559_471.returns.push(1373491307978);
// 26338
f974244559_471.returns.push(1373491307979);
// 26342
f974244559_471.returns.push(1373491307979);
// 26346
f974244559_1202.returns.push(undefined);
// 26348
o9.returnValue = true;
// 26351
o9.srcElement = o69;
// 26353
o9.target = o69;
// 26360
f974244559_519.returns.push(null);
// 26366
f974244559_519.returns.push(null);
// 26372
f974244559_519.returns.push(null);
// 26378
f974244559_519.returns.push(null);
// 26384
f974244559_519.returns.push(null);
// 26390
f974244559_519.returns.push(null);
// 26396
f974244559_519.returns.push(null);
// 26402
f974244559_519.returns.push(null);
// 26408
f974244559_519.returns.push(null);
// 26414
f974244559_519.returns.push(null);
// 26420
f974244559_519.returns.push(null);
// 26426
f974244559_519.returns.push(null);
// 26432
f974244559_519.returns.push(null);
// 26438
f974244559_519.returns.push(null);
// 26444
f974244559_519.returns.push(null);
// 26450
f974244559_519.returns.push(null);
// 26456
f974244559_519.returns.push(null);
// 26462
f974244559_519.returns.push(null);
// 26468
f974244559_519.returns.push(null);
// 26474
f974244559_519.returns.push(null);
// 26480
f974244559_519.returns.push(null);
// 26485
o9.relatedTarget = o13;
// undefined
o9 = null;
// undefined
o13 = null;
// 26488
o9 = {};
// 26492
f974244559_471.returns.push(1373491307988);
// 26493
o9.cancelBubble = false;
// 26494
o9.returnValue = true;
// 26497
o9.srcElement = o69;
// 26499
o9.target = o69;
// 26506
f974244559_519.returns.push(null);
// 26512
f974244559_519.returns.push(null);
// 26518
f974244559_519.returns.push(null);
// 26524
f974244559_519.returns.push(null);
// 26530
f974244559_519.returns.push(null);
// 26536
f974244559_519.returns.push(null);
// 26542
f974244559_519.returns.push(null);
// 26548
f974244559_519.returns.push(null);
// 26554
f974244559_519.returns.push(null);
// 26560
f974244559_519.returns.push(null);
// 26566
f974244559_519.returns.push(null);
// 26572
f974244559_519.returns.push(null);
// 26578
f974244559_519.returns.push(null);
// 26584
f974244559_519.returns.push(null);
// 26590
f974244559_519.returns.push(null);
// 26596
f974244559_519.returns.push(null);
// 26602
f974244559_519.returns.push(null);
// 26608
f974244559_519.returns.push(null);
// 26614
f974244559_519.returns.push(null);
// 26620
f974244559_519.returns.push(null);
// 26626
f974244559_519.returns.push(null);
// 26631
o9.JSBNG__screenX = 991;
// 26632
o9.JSBNG__screenY = 434;
// 26633
o9.altKey = false;
// 26634
o9.bubbles = true;
// 26635
o9.button = 0;
// 26636
o9.buttons = void 0;
// 26637
o9.cancelable = false;
// 26638
o9.clientX = 974;
// 26639
o9.clientY = 330;
// 26640
o9.ctrlKey = false;
// 26641
o9.currentTarget = o0;
// 26642
o9.defaultPrevented = false;
// 26643
o9.detail = 0;
// 26644
o9.eventPhase = 3;
// 26645
o9.isTrusted = void 0;
// 26646
o9.metaKey = false;
// 26647
o9.pageX = 974;
// 26648
o9.pageY = 330;
// 26649
o9.relatedTarget = null;
// 26650
o9.fromElement = null;
// 26653
o9.shiftKey = false;
// 26656
o9.timeStamp = 1373491307988;
// 26657
o9.type = "mousemove";
// 26658
o9.view = ow974244559;
// undefined
o9 = null;
// 26667
f974244559_2566.returns.push(undefined);
// 26670
f974244559_14.returns.push(undefined);
// 26671
f974244559_12.returns.push(101);
// 26674
o9 = {};
// 26677
o9.srcElement = o69;
// 26679
o9.target = o69;
// 26686
f974244559_519.returns.push(null);
// 26692
f974244559_519.returns.push(null);
// 26698
f974244559_519.returns.push(null);
// 26704
f974244559_519.returns.push(null);
// 26710
f974244559_519.returns.push(null);
// 26716
f974244559_519.returns.push(null);
// 26722
f974244559_519.returns.push(null);
// 26728
f974244559_519.returns.push(null);
// 26734
f974244559_519.returns.push(null);
// 26740
f974244559_519.returns.push(null);
// 26746
f974244559_519.returns.push(null);
// 26752
f974244559_519.returns.push(null);
// 26758
f974244559_519.returns.push(null);
// 26764
f974244559_519.returns.push(null);
// 26770
f974244559_519.returns.push(null);
// 26776
f974244559_519.returns.push(null);
// 26782
f974244559_519.returns.push(null);
// 26788
f974244559_519.returns.push(null);
// 26794
f974244559_519.returns.push(null);
// 26800
f974244559_519.returns.push(null);
// 26806
f974244559_519.returns.push(null);
// 26811
o9.relatedTarget = o17;
// 26816
f974244559_519.returns.push(null);
// 26822
f974244559_519.returns.push(null);
// 26828
f974244559_519.returns.push(null);
// 26834
f974244559_519.returns.push(null);
// 26840
f974244559_519.returns.push(null);
// 26846
f974244559_519.returns.push(null);
// 26852
f974244559_519.returns.push(null);
// 26858
f974244559_519.returns.push(null);
// 26864
f974244559_519.returns.push(null);
// 26869
o9.cancelBubble = false;
// 26870
o9.returnValue = true;
// undefined
o9 = null;
// 26871
o9 = {};
// 26874
o9.cancelBubble = false;
// 26877
f974244559_471.returns.push(1373491308046);
// 26880
f974244559_1202.returns.push(undefined);
// 26882
o9.returnValue = true;
// 26885
o9.srcElement = o17;
// 26887
o9.target = o17;
// 26894
f974244559_519.returns.push(null);
// 26900
f974244559_519.returns.push(null);
// 26906
f974244559_519.returns.push(null);
// 26912
f974244559_519.returns.push(null);
// 26918
f974244559_519.returns.push(null);
// 26924
f974244559_519.returns.push(null);
// 26930
f974244559_519.returns.push(null);
// 26936
f974244559_519.returns.push(null);
// 26942
f974244559_519.returns.push(null);
// 26947
o9.relatedTarget = o69;
// undefined
o9 = null;
// undefined
o69 = null;
// 26950
o9 = {};
// 26954
f974244559_471.returns.push(1373491308052);
// 26955
o9.cancelBubble = false;
// 26956
o9.returnValue = true;
// 26959
o9.srcElement = o17;
// 26961
o9.target = o17;
// 26968
f974244559_519.returns.push(null);
// 26974
f974244559_519.returns.push(null);
// 26980
f974244559_519.returns.push(null);
// 26986
f974244559_519.returns.push(null);
// 26992
f974244559_519.returns.push(null);
// 26998
f974244559_519.returns.push(null);
// 27004
f974244559_519.returns.push(null);
// 27010
f974244559_519.returns.push(null);
// 27016
f974244559_519.returns.push(null);
// 27021
o9.JSBNG__screenX = 1009;
// 27022
o9.JSBNG__screenY = 292;
// 27023
o9.altKey = false;
// 27024
o9.bubbles = true;
// 27025
o9.button = 0;
// 27026
o9.buttons = void 0;
// 27027
o9.cancelable = false;
// 27028
o9.clientX = 992;
// 27029
o9.clientY = 188;
// 27030
o9.ctrlKey = false;
// 27031
o9.currentTarget = o0;
// 27032
o9.defaultPrevented = false;
// 27033
o9.detail = 0;
// 27034
o9.eventPhase = 3;
// 27035
o9.isTrusted = void 0;
// 27036
o9.metaKey = false;
// 27037
o9.pageX = 992;
// 27038
o9.pageY = 188;
// 27039
o9.relatedTarget = null;
// 27040
o9.fromElement = null;
// 27043
o9.shiftKey = false;
// 27046
o9.timeStamp = 1373491308052;
// 27047
o9.type = "mousemove";
// 27048
o9.view = ow974244559;
// undefined
o9 = null;
// 27057
f974244559_2566.returns.push(undefined);
// 27060
f974244559_14.returns.push(undefined);
// 27061
f974244559_12.returns.push(102);
// 27064
o9 = {};
// 27068
f974244559_471.returns.push(1373491308066);
// 27069
o9.cancelBubble = false;
// 27070
o9.returnValue = true;
// 27073
o9.srcElement = o17;
// 27075
o9.target = o17;
// 27082
f974244559_519.returns.push(null);
// 27088
f974244559_519.returns.push(null);
// 27094
f974244559_519.returns.push(null);
// 27100
f974244559_519.returns.push(null);
// 27106
f974244559_519.returns.push(null);
// 27112
f974244559_519.returns.push(null);
// 27118
f974244559_519.returns.push(null);
// 27124
f974244559_519.returns.push(null);
// 27130
f974244559_519.returns.push(null);
// 27135
o9.JSBNG__screenX = 1015;
// 27136
o9.JSBNG__screenY = 245;
// 27137
o9.altKey = false;
// 27138
o9.bubbles = true;
// 27139
o9.button = 0;
// 27140
o9.buttons = void 0;
// 27141
o9.cancelable = false;
// 27142
o9.clientX = 998;
// 27143
o9.clientY = 141;
// 27144
o9.ctrlKey = false;
// 27145
o9.currentTarget = o0;
// 27146
o9.defaultPrevented = false;
// 27147
o9.detail = 0;
// 27148
o9.eventPhase = 3;
// 27149
o9.isTrusted = void 0;
// 27150
o9.metaKey = false;
// 27151
o9.pageX = 998;
// 27152
o9.pageY = 141;
// 27153
o9.relatedTarget = null;
// 27154
o9.fromElement = null;
// 27157
o9.shiftKey = false;
// 27160
o9.timeStamp = 1373491308065;
// 27161
o9.type = "mousemove";
// 27162
o9.view = ow974244559;
// undefined
o9 = null;
// 27171
f974244559_2566.returns.push(undefined);
// 27174
f974244559_14.returns.push(undefined);
// 27175
f974244559_12.returns.push(103);
// 27178
o9 = {};
// 27182
f974244559_471.returns.push(1373491308080);
// 27183
o9.cancelBubble = false;
// 27184
o9.returnValue = true;
// 27187
o9.srcElement = o17;
// 27189
o9.target = o17;
// 27196
f974244559_519.returns.push(null);
// 27202
f974244559_519.returns.push(null);
// 27208
f974244559_519.returns.push(null);
// 27214
f974244559_519.returns.push(null);
// 27220
f974244559_519.returns.push(null);
// 27226
f974244559_519.returns.push(null);
// 27232
f974244559_519.returns.push(null);
// 27238
f974244559_519.returns.push(null);
// 27244
f974244559_519.returns.push(null);
// 27249
o9.JSBNG__screenX = 1017;
// 27250
o9.JSBNG__screenY = 232;
// 27251
o9.altKey = false;
// 27252
o9.bubbles = true;
// 27253
o9.button = 0;
// 27254
o9.buttons = void 0;
// 27255
o9.cancelable = false;
// 27256
o9.clientX = 1000;
// 27257
o9.clientY = 128;
// 27258
o9.ctrlKey = false;
// 27259
o9.currentTarget = o0;
// 27260
o9.defaultPrevented = false;
// 27261
o9.detail = 0;
// 27262
o9.eventPhase = 3;
// 27263
o9.isTrusted = void 0;
// 27264
o9.metaKey = false;
// 27265
o9.pageX = 1000;
// 27266
o9.pageY = 128;
// 27267
o9.relatedTarget = null;
// 27268
o9.fromElement = null;
// 27271
o9.shiftKey = false;
// 27274
o9.timeStamp = 1373491308080;
// 27275
o9.type = "mousemove";
// 27276
o9.view = ow974244559;
// undefined
o9 = null;
// 27285
f974244559_2566.returns.push(undefined);
// 27288
f974244559_14.returns.push(undefined);
// 27289
f974244559_12.returns.push(104);
// 27292
o9 = {};
// 27296
f974244559_471.returns.push(1373491308112);
// 27297
o9.cancelBubble = false;
// 27298
o9.returnValue = true;
// 27301
o9.srcElement = o17;
// 27303
o9.target = o17;
// 27310
f974244559_519.returns.push(null);
// 27316
f974244559_519.returns.push(null);
// 27322
f974244559_519.returns.push(null);
// 27328
f974244559_519.returns.push(null);
// 27334
f974244559_519.returns.push(null);
// 27340
f974244559_519.returns.push(null);
// 27346
f974244559_519.returns.push(null);
// 27352
f974244559_519.returns.push(null);
// 27358
f974244559_519.returns.push(null);
// 27363
o9.JSBNG__screenX = 1017;
// 27364
o9.JSBNG__screenY = 213;
// 27365
o9.altKey = false;
// 27366
o9.bubbles = true;
// 27367
o9.button = 0;
// 27368
o9.buttons = void 0;
// 27369
o9.cancelable = false;
// 27370
o9.clientX = 1000;
// 27371
o9.clientY = 109;
// 27372
o9.ctrlKey = false;
// 27373
o9.currentTarget = o0;
// 27374
o9.defaultPrevented = false;
// 27375
o9.detail = 0;
// 27376
o9.eventPhase = 3;
// 27377
o9.isTrusted = void 0;
// 27378
o9.metaKey = false;
// 27379
o9.pageX = 1000;
// 27380
o9.pageY = 109;
// 27381
o9.relatedTarget = null;
// 27382
o9.fromElement = null;
// 27385
o9.shiftKey = false;
// 27388
o9.timeStamp = 1373491308111;
// 27389
o9.type = "mousemove";
// 27390
o9.view = ow974244559;
// undefined
o9 = null;
// 27399
f974244559_2566.returns.push(undefined);
// 27402
f974244559_14.returns.push(undefined);
// 27403
f974244559_12.returns.push(105);
// 27406
o9 = {};
// 27410
f974244559_471.returns.push(1373491308133);
// 27411
o9.cancelBubble = false;
// 27412
o9.returnValue = true;
// 27415
o9.srcElement = o17;
// 27417
o9.target = o17;
// 27424
f974244559_519.returns.push(null);
// 27430
f974244559_519.returns.push(null);
// 27436
f974244559_519.returns.push(null);
// 27442
f974244559_519.returns.push(null);
// 27448
f974244559_519.returns.push(null);
// 27454
f974244559_519.returns.push(null);
// 27460
f974244559_519.returns.push(null);
// 27466
f974244559_519.returns.push(null);
// 27472
f974244559_519.returns.push(null);
// 27477
o9.JSBNG__screenX = 1017;
// 27478
o9.JSBNG__screenY = 196;
// 27479
o9.altKey = false;
// 27480
o9.bubbles = true;
// 27481
o9.button = 0;
// 27482
o9.buttons = void 0;
// 27483
o9.cancelable = false;
// 27484
o9.clientX = 1000;
// 27485
o9.clientY = 92;
// 27486
o9.ctrlKey = false;
// 27487
o9.currentTarget = o0;
// 27488
o9.defaultPrevented = false;
// 27489
o9.detail = 0;
// 27490
o9.eventPhase = 3;
// 27491
o9.isTrusted = void 0;
// 27492
o9.metaKey = false;
// 27493
o9.pageX = 1000;
// 27494
o9.pageY = 92;
// 27495
o9.relatedTarget = null;
// 27496
o9.fromElement = null;
// 27499
o9.shiftKey = false;
// 27502
o9.timeStamp = 1373491308126;
// 27503
o9.type = "mousemove";
// 27504
o9.view = ow974244559;
// undefined
o9 = null;
// 27513
f974244559_2566.returns.push(undefined);
// 27516
f974244559_14.returns.push(undefined);
// 27517
f974244559_12.returns.push(106);
// 27520
o9 = {};
// 27524
f974244559_471.returns.push(1373491308145);
// 27525
o9.cancelBubble = false;
// 27526
o9.returnValue = true;
// 27529
o9.srcElement = o17;
// 27531
o9.target = o17;
// 27538
f974244559_519.returns.push(null);
// 27544
f974244559_519.returns.push(null);
// 27550
f974244559_519.returns.push(null);
// 27556
f974244559_519.returns.push(null);
// 27562
f974244559_519.returns.push(null);
// 27568
f974244559_519.returns.push(null);
// 27574
f974244559_519.returns.push(null);
// 27580
f974244559_519.returns.push(null);
// 27586
f974244559_519.returns.push(null);
// 27591
o9.JSBNG__screenX = 1017;
// 27592
o9.JSBNG__screenY = 187;
// 27593
o9.altKey = false;
// 27594
o9.bubbles = true;
// 27595
o9.button = 0;
// 27596
o9.buttons = void 0;
// 27597
o9.cancelable = false;
// 27598
o9.clientX = 1000;
// 27599
o9.clientY = 83;
// 27600
o9.ctrlKey = false;
// 27601
o9.currentTarget = o0;
// 27602
o9.defaultPrevented = false;
// 27603
o9.detail = 0;
// 27604
o9.eventPhase = 3;
// 27605
o9.isTrusted = void 0;
// 27606
o9.metaKey = false;
// 27607
o9.pageX = 1000;
// 27608
o9.pageY = 83;
// 27609
o9.relatedTarget = null;
// 27610
o9.fromElement = null;
// 27613
o9.shiftKey = false;
// 27616
o9.timeStamp = 1373491308145;
// 27617
o9.type = "mousemove";
// 27618
o9.view = ow974244559;
// undefined
o9 = null;
// 27627
f974244559_2566.returns.push(undefined);
// 27630
f974244559_14.returns.push(undefined);
// 27631
f974244559_12.returns.push(107);
// 27634
o9 = {};
// 27638
f974244559_471.returns.push(1373491308152);
// 27639
o9.cancelBubble = false;
// 27640
o9.returnValue = true;
// 27643
o9.srcElement = o17;
// 27645
o9.target = o17;
// 27652
f974244559_519.returns.push(null);
// 27658
f974244559_519.returns.push(null);
// 27664
f974244559_519.returns.push(null);
// 27670
f974244559_519.returns.push(null);
// 27676
f974244559_519.returns.push(null);
// 27682
f974244559_519.returns.push(null);
// 27688
f974244559_519.returns.push(null);
// 27694
f974244559_519.returns.push(null);
// 27700
f974244559_519.returns.push(null);
// 27705
o9.JSBNG__screenX = 1017;
// 27706
o9.JSBNG__screenY = 186;
// 27707
o9.altKey = false;
// 27708
o9.bubbles = true;
// 27709
o9.button = 0;
// 27710
o9.buttons = void 0;
// 27711
o9.cancelable = false;
// 27712
o9.clientX = 1000;
// 27713
o9.clientY = 82;
// 27714
o9.ctrlKey = false;
// 27715
o9.currentTarget = o0;
// 27716
o9.defaultPrevented = false;
// 27717
o9.detail = 0;
// 27718
o9.eventPhase = 3;
// 27719
o9.isTrusted = void 0;
// 27720
o9.metaKey = false;
// 27721
o9.pageX = 1000;
// 27722
o9.pageY = 82;
// 27723
o9.relatedTarget = null;
// 27724
o9.fromElement = null;
// 27727
o9.shiftKey = false;
// 27730
o9.timeStamp = 1373491308152;
// 27731
o9.type = "mousemove";
// 27732
o9.view = ow974244559;
// undefined
o9 = null;
// 27741
f974244559_2566.returns.push(undefined);
// 27744
f974244559_14.returns.push(undefined);
// 27745
f974244559_12.returns.push(108);
// 27748
o9 = {};
// 27752
f974244559_471.returns.push(1373491308160);
// 27753
o9.cancelBubble = false;
// 27754
o9.returnValue = true;
// 27757
o9.srcElement = o17;
// 27759
o9.target = o17;
// 27766
f974244559_519.returns.push(null);
// 27772
f974244559_519.returns.push(null);
// 27778
f974244559_519.returns.push(null);
// 27784
f974244559_519.returns.push(null);
// 27790
f974244559_519.returns.push(null);
// 27796
f974244559_519.returns.push(null);
// 27802
f974244559_519.returns.push(null);
// 27808
f974244559_519.returns.push(null);
// 27814
f974244559_519.returns.push(null);
// 27819
o9.JSBNG__screenX = 1017;
// 27820
o9.JSBNG__screenY = 185;
// 27821
o9.altKey = false;
// 27822
o9.bubbles = true;
// 27823
o9.button = 0;
// 27824
o9.buttons = void 0;
// 27825
o9.cancelable = false;
// 27826
o9.clientX = 1000;
// 27827
o9.clientY = 81;
// 27828
o9.ctrlKey = false;
// 27829
o9.currentTarget = o0;
// 27830
o9.defaultPrevented = false;
// 27831
o9.detail = 0;
// 27832
o9.eventPhase = 3;
// 27833
o9.isTrusted = void 0;
// 27834
o9.metaKey = false;
// 27835
o9.pageX = 1000;
// 27836
o9.pageY = 81;
// 27837
o9.relatedTarget = null;
// 27838
o9.fromElement = null;
// 27841
o9.shiftKey = false;
// 27844
o9.timeStamp = 1373491308160;
// 27845
o9.type = "mousemove";
// 27846
o9.view = ow974244559;
// undefined
o9 = null;
// 27855
f974244559_2566.returns.push(undefined);
// 27858
f974244559_14.returns.push(undefined);
// 27859
f974244559_12.returns.push(109);
// 27863
f974244559_471.returns.push(1373491308283);
// 27864
o9 = {};
// 27868
f974244559_471.returns.push(1373491308324);
// 27869
o9.cancelBubble = false;
// 27870
o9.returnValue = true;
// 27873
o9.srcElement = o17;
// 27875
o9.target = o17;
// 27882
f974244559_519.returns.push(null);
// 27888
f974244559_519.returns.push(null);
// 27894
f974244559_519.returns.push(null);
// 27900
f974244559_519.returns.push(null);
// 27906
f974244559_519.returns.push(null);
// 27912
f974244559_519.returns.push(null);
// 27918
f974244559_519.returns.push(null);
// 27924
f974244559_519.returns.push(null);
// 27930
f974244559_519.returns.push(null);
// 27935
o9.JSBNG__screenX = 1017;
// 27936
o9.JSBNG__screenY = 186;
// 27937
o9.altKey = false;
// 27938
o9.bubbles = true;
// 27939
o9.button = 0;
// 27940
o9.buttons = void 0;
// 27941
o9.cancelable = false;
// 27942
o9.clientX = 1000;
// 27943
o9.clientY = 82;
// 27944
o9.ctrlKey = false;
// 27945
o9.currentTarget = o0;
// 27946
o9.defaultPrevented = false;
// 27947
o9.detail = 0;
// 27948
o9.eventPhase = 3;
// 27949
o9.isTrusted = void 0;
// 27950
o9.metaKey = false;
// 27951
o9.pageX = 1000;
// 27952
o9.pageY = 82;
// 27953
o9.relatedTarget = null;
// 27954
o9.fromElement = null;
// 27957
o9.shiftKey = false;
// 27960
o9.timeStamp = 1373491308324;
// 27961
o9.type = "mousemove";
// 27962
o9.view = ow974244559;
// undefined
o9 = null;
// 27971
f974244559_2566.returns.push(undefined);
// 27974
f974244559_14.returns.push(undefined);
// 27975
f974244559_12.returns.push(110);
// 27978
o9 = {};
// 27982
f974244559_471.returns.push(1373491308333);
// 27983
o9.cancelBubble = false;
// 27984
o9.returnValue = true;
// 27987
o9.srcElement = o17;
// 27989
o9.target = o17;
// 27996
f974244559_519.returns.push(null);
// 28002
f974244559_519.returns.push(null);
// 28008
f974244559_519.returns.push(null);
// 28014
f974244559_519.returns.push(null);
// 28020
f974244559_519.returns.push(null);
// 28026
f974244559_519.returns.push(null);
// 28032
f974244559_519.returns.push(null);
// 28038
f974244559_519.returns.push(null);
// 28044
f974244559_519.returns.push(null);
// 28049
o9.JSBNG__screenX = 1017;
// 28050
o9.JSBNG__screenY = 187;
// 28051
o9.altKey = false;
// 28052
o9.bubbles = true;
// 28053
o9.button = 0;
// 28054
o9.buttons = void 0;
// 28055
o9.cancelable = false;
// 28056
o9.clientX = 1000;
// 28057
o9.clientY = 83;
// 28058
o9.ctrlKey = false;
// 28059
o9.currentTarget = o0;
// 28060
o9.defaultPrevented = false;
// 28061
o9.detail = 0;
// 28062
o9.eventPhase = 3;
// 28063
o9.isTrusted = void 0;
// 28064
o9.metaKey = false;
// 28065
o9.pageX = 1000;
// 28066
o9.pageY = 83;
// 28067
o9.relatedTarget = null;
// 28068
o9.fromElement = null;
// 28071
o9.shiftKey = false;
// 28074
o9.timeStamp = 1373491308332;
// 28075
o9.type = "mousemove";
// 28076
o9.view = ow974244559;
// undefined
o9 = null;
// 28085
f974244559_2566.returns.push(undefined);
// 28088
f974244559_14.returns.push(undefined);
// 28089
f974244559_12.returns.push(111);
// 28092
o9 = {};
// 28096
f974244559_471.returns.push(1373491308340);
// 28097
o9.cancelBubble = false;
// 28098
o9.returnValue = true;
// 28101
o9.srcElement = o17;
// 28103
o9.target = o17;
// 28110
f974244559_519.returns.push(null);
// 28116
f974244559_519.returns.push(null);
// 28122
f974244559_519.returns.push(null);
// 28128
f974244559_519.returns.push(null);
// 28134
f974244559_519.returns.push(null);
// 28140
f974244559_519.returns.push(null);
// 28146
f974244559_519.returns.push(null);
// 28152
f974244559_519.returns.push(null);
// 28158
f974244559_519.returns.push(null);
// 28163
o9.JSBNG__screenX = 1017;
// 28164
o9.JSBNG__screenY = 188;
// 28165
o9.altKey = false;
// 28166
o9.bubbles = true;
// 28167
o9.button = 0;
// 28168
o9.buttons = void 0;
// 28169
o9.cancelable = false;
// 28170
o9.clientX = 1000;
// 28171
o9.clientY = 84;
// 28172
o9.ctrlKey = false;
// 28173
o9.currentTarget = o0;
// 28174
o9.defaultPrevented = false;
// 28175
o9.detail = 0;
// 28176
o9.eventPhase = 3;
// 28177
o9.isTrusted = void 0;
// 28178
o9.metaKey = false;
// 28179
o9.pageX = 1000;
// 28180
o9.pageY = 84;
// 28181
o9.relatedTarget = null;
// 28182
o9.fromElement = null;
// 28185
o9.shiftKey = false;
// 28188
o9.timeStamp = 1373491308340;
// 28189
o9.type = "mousemove";
// 28190
o9.view = ow974244559;
// undefined
o9 = null;
// 28199
f974244559_2566.returns.push(undefined);
// 28202
f974244559_14.returns.push(undefined);
// 28203
f974244559_12.returns.push(112);
// 28206
o9 = {};
// 28210
f974244559_471.returns.push(1373491308351);
// 28211
o9.cancelBubble = false;
// 28212
o9.returnValue = true;
// 28215
o9.srcElement = o17;
// 28217
o9.target = o17;
// 28224
f974244559_519.returns.push(null);
// 28230
f974244559_519.returns.push(null);
// 28236
f974244559_519.returns.push(null);
// 28242
f974244559_519.returns.push(null);
// 28248
f974244559_519.returns.push(null);
// 28254
f974244559_519.returns.push(null);
// 28260
f974244559_519.returns.push(null);
// 28266
f974244559_519.returns.push(null);
// 28272
f974244559_519.returns.push(null);
// 28277
o9.JSBNG__screenX = 1017;
// 28278
o9.JSBNG__screenY = 189;
// 28279
o9.altKey = false;
// 28280
o9.bubbles = true;
// 28281
o9.button = 0;
// 28282
o9.buttons = void 0;
// 28283
o9.cancelable = false;
// 28284
o9.clientX = 1000;
// 28285
o9.clientY = 85;
// 28286
o9.ctrlKey = false;
// 28287
o9.currentTarget = o0;
// 28288
o9.defaultPrevented = false;
// 28289
o9.detail = 0;
// 28290
o9.eventPhase = 3;
// 28291
o9.isTrusted = void 0;
// 28292
o9.metaKey = false;
// 28293
o9.pageX = 1000;
// 28294
o9.pageY = 85;
// 28295
o9.relatedTarget = null;
// 28296
o9.fromElement = null;
// 28299
o9.shiftKey = false;
// 28302
o9.timeStamp = 1373491308350;
// 28303
o9.type = "mousemove";
// 28304
o9.view = ow974244559;
// undefined
o9 = null;
// 28313
f974244559_2566.returns.push(undefined);
// 28316
f974244559_14.returns.push(undefined);
// 28317
f974244559_12.returns.push(113);
// 28320
o9 = {};
// 28324
f974244559_471.returns.push(1373491308383);
// 28325
o9.cancelBubble = false;
// 28326
o9.returnValue = true;
// 28329
o9.srcElement = o17;
// 28331
o9.target = o17;
// 28338
f974244559_519.returns.push(null);
// 28344
f974244559_519.returns.push(null);
// 28350
f974244559_519.returns.push(null);
// 28356
f974244559_519.returns.push(null);
// 28362
f974244559_519.returns.push(null);
// 28368
f974244559_519.returns.push(null);
// 28374
f974244559_519.returns.push(null);
// 28380
f974244559_519.returns.push(null);
// 28386
f974244559_519.returns.push(null);
// 28391
o9.JSBNG__screenX = 1017;
// 28392
o9.JSBNG__screenY = 190;
// 28393
o9.altKey = false;
// 28394
o9.bubbles = true;
// 28395
o9.button = 0;
// 28396
o9.buttons = void 0;
// 28397
o9.cancelable = false;
// 28398
o9.clientX = 1000;
// 28399
o9.clientY = 86;
// 28400
o9.ctrlKey = false;
// 28401
o9.currentTarget = o0;
// 28402
o9.defaultPrevented = false;
// 28403
o9.detail = 0;
// 28404
o9.eventPhase = 3;
// 28405
o9.isTrusted = void 0;
// 28406
o9.metaKey = false;
// 28407
o9.pageX = 1000;
// 28408
o9.pageY = 86;
// 28409
o9.relatedTarget = null;
// 28410
o9.fromElement = null;
// 28413
o9.shiftKey = false;
// 28416
o9.timeStamp = 1373491308378;
// 28417
o9.type = "mousemove";
// 28418
o9.view = ow974244559;
// undefined
o9 = null;
// 28427
f974244559_2566.returns.push(undefined);
// 28430
f974244559_14.returns.push(undefined);
// 28431
f974244559_12.returns.push(114);
// 28434
o9 = {};
// 28438
f974244559_471.returns.push(1373491308432);
// 28439
o9.cancelBubble = false;
// 28440
o9.returnValue = true;
// 28443
o9.srcElement = o17;
// 28445
o9.target = o17;
// 28452
f974244559_519.returns.push(null);
// 28458
f974244559_519.returns.push(null);
// 28464
f974244559_519.returns.push(null);
// 28470
f974244559_519.returns.push(null);
// 28476
f974244559_519.returns.push(null);
// 28482
f974244559_519.returns.push(null);
// 28488
f974244559_519.returns.push(null);
// 28494
f974244559_519.returns.push(null);
// 28500
f974244559_519.returns.push(null);
// 28505
o9.JSBNG__screenX = 1013;
// 28506
o9.JSBNG__screenY = 194;
// 28507
o9.altKey = false;
// 28508
o9.bubbles = true;
// 28509
o9.button = 0;
// 28510
o9.buttons = void 0;
// 28511
o9.cancelable = false;
// 28512
o9.clientX = 996;
// 28513
o9.clientY = 90;
// 28514
o9.ctrlKey = false;
// 28515
o9.currentTarget = o0;
// 28516
o9.defaultPrevented = false;
// 28517
o9.detail = 0;
// 28518
o9.eventPhase = 3;
// 28519
o9.isTrusted = void 0;
// 28520
o9.metaKey = false;
// 28521
o9.pageX = 996;
// 28522
o9.pageY = 90;
// 28523
o9.relatedTarget = null;
// 28524
o9.fromElement = null;
// 28527
o9.shiftKey = false;
// 28530
o9.timeStamp = 1373491308431;
// 28531
o9.type = "mousemove";
// 28532
o9.view = ow974244559;
// undefined
o9 = null;
// 28541
f974244559_2566.returns.push(undefined);
// 28544
f974244559_14.returns.push(undefined);
// 28545
f974244559_12.returns.push(115);
// undefined
fo974244559_1_cookie.returns.push("c_user=100006118350059; csm=2; sub=268435456");
// 28549
o9 = {};
// 28553
f974244559_471.returns.push(1373491308467);
// 28554
o9.cancelBubble = false;
// 28555
o9.returnValue = true;
// 28558
o9.srcElement = o17;
// 28560
o9.target = o17;
// 28567
f974244559_519.returns.push(null);
// 28573
f974244559_519.returns.push(null);
// 28579
f974244559_519.returns.push(null);
// 28585
f974244559_519.returns.push(null);
// 28591
f974244559_519.returns.push(null);
// 28597
f974244559_519.returns.push(null);
// 28603
f974244559_519.returns.push(null);
// 28609
f974244559_519.returns.push(null);
// 28615
f974244559_519.returns.push(null);
// 28620
o9.JSBNG__screenX = 1009;
// 28621
o9.JSBNG__screenY = 195;
// 28622
o9.altKey = false;
// 28623
o9.bubbles = true;
// 28624
o9.button = 0;
// 28625
o9.buttons = void 0;
// 28626
o9.cancelable = false;
// 28627
o9.clientX = 992;
// 28628
o9.clientY = 91;
// 28629
o9.ctrlKey = false;
// 28630
o9.currentTarget = o0;
// 28631
o9.defaultPrevented = false;
// 28632
o9.detail = 0;
// 28633
o9.eventPhase = 3;
// 28634
o9.isTrusted = void 0;
// 28635
o9.metaKey = false;
// 28636
o9.pageX = 992;
// 28637
o9.pageY = 91;
// 28638
o9.relatedTarget = null;
// 28639
o9.fromElement = null;
// 28642
o9.shiftKey = false;
// 28645
o9.timeStamp = 1373491308467;
// 28646
o9.type = "mousemove";
// 28647
o9.view = ow974244559;
// undefined
o9 = null;
// 28656
f974244559_2566.returns.push(undefined);
// 28659
f974244559_14.returns.push(undefined);
// 28660
f974244559_12.returns.push(116);
// 28663
o9 = {};
// 28667
f974244559_471.returns.push(1373491308480);
// 28672
f974244559_471.returns.push(1373491308481);
// 28676
f974244559_471.returns.push(1373491308481);
// 28678
o9.cancelBubble = false;
// 28679
o9.returnValue = true;
// 28682
o9.srcElement = o17;
// 28684
o9.target = o17;
// 28691
f974244559_519.returns.push(null);
// 28697
f974244559_519.returns.push(null);
// 28703
f974244559_519.returns.push(null);
// 28709
f974244559_519.returns.push(null);
// 28715
f974244559_519.returns.push(null);
// 28721
f974244559_519.returns.push(null);
// 28727
f974244559_519.returns.push(null);
// 28733
f974244559_519.returns.push(null);
// 28739
f974244559_519.returns.push(null);
// 28744
o9.JSBNG__screenX = 1005;
// 28745
o9.JSBNG__screenY = 199;
// 28746
o9.altKey = false;
// 28747
o9.bubbles = true;
// 28748
o9.button = 0;
// 28749
o9.buttons = void 0;
// 28750
o9.cancelable = false;
// 28751
o9.clientX = 988;
// 28752
o9.clientY = 95;
// 28753
o9.ctrlKey = false;
// 28754
o9.currentTarget = o0;
// 28755
o9.defaultPrevented = false;
// 28756
o9.detail = 0;
// 28757
o9.eventPhase = 3;
// 28758
o9.isTrusted = void 0;
// 28759
o9.metaKey = false;
// 28760
o9.pageX = 988;
// 28761
o9.pageY = 95;
// 28762
o9.relatedTarget = null;
// 28763
o9.fromElement = null;
// 28766
o9.shiftKey = false;
// 28769
o9.timeStamp = 1373491308480;
// 28770
o9.type = "mousemove";
// 28771
o9.view = ow974244559;
// undefined
o9 = null;
// 28780
f974244559_2566.returns.push(undefined);
// 28783
f974244559_14.returns.push(undefined);
// 28784
f974244559_12.returns.push(117);
// 28787
o9 = {};
// 28791
f974244559_471.returns.push(1373491308490);
// 28792
o9.cancelBubble = false;
// 28793
o9.returnValue = true;
// 28796
o9.srcElement = o17;
// 28798
o9.target = o17;
// 28805
f974244559_519.returns.push(null);
// 28811
f974244559_519.returns.push(null);
// 28817
f974244559_519.returns.push(null);
// 28823
f974244559_519.returns.push(null);
// 28829
f974244559_519.returns.push(null);
// 28835
f974244559_519.returns.push(null);
// 28841
f974244559_519.returns.push(null);
// 28847
f974244559_519.returns.push(null);
// 28853
f974244559_519.returns.push(null);
// 28858
o9.JSBNG__screenX = 999;
// 28859
o9.JSBNG__screenY = 203;
// 28860
o9.altKey = false;
// 28861
o9.bubbles = true;
// 28862
o9.button = 0;
// 28863
o9.buttons = void 0;
// 28864
o9.cancelable = false;
// 28865
o9.clientX = 982;
// 28866
o9.clientY = 99;
// 28867
o9.ctrlKey = false;
// 28868
o9.currentTarget = o0;
// 28869
o9.defaultPrevented = false;
// 28870
o9.detail = 0;
// 28871
o9.eventPhase = 3;
// 28872
o9.isTrusted = void 0;
// 28873
o9.metaKey = false;
// 28874
o9.pageX = 982;
// 28875
o9.pageY = 99;
// 28876
o9.relatedTarget = null;
// 28877
o9.fromElement = null;
// 28880
o9.shiftKey = false;
// 28883
o9.timeStamp = 1373491308490;
// 28884
o9.type = "mousemove";
// 28885
o9.view = ow974244559;
// undefined
o9 = null;
// 28894
f974244559_2566.returns.push(undefined);
// 28897
f974244559_14.returns.push(undefined);
// 28898
f974244559_12.returns.push(118);
// 28901
o9 = {};
// 28905
f974244559_471.returns.push(1373491308510);
// 28906
o9.cancelBubble = false;
// 28907
o9.returnValue = true;
// 28910
o9.srcElement = o17;
// 28912
o9.target = o17;
// 28919
f974244559_519.returns.push(null);
// 28925
f974244559_519.returns.push(null);
// 28931
f974244559_519.returns.push(null);
// 28937
f974244559_519.returns.push(null);
// 28943
f974244559_519.returns.push(null);
// 28949
f974244559_519.returns.push(null);
// 28955
f974244559_519.returns.push(null);
// 28961
f974244559_519.returns.push(null);
// 28967
f974244559_519.returns.push(null);
// 28972
o9.JSBNG__screenX = 946;
// 28973
o9.JSBNG__screenY = 239;
// 28974
o9.altKey = false;
// 28975
o9.bubbles = true;
// 28976
o9.button = 0;
// 28977
o9.buttons = void 0;
// 28978
o9.cancelable = false;
// 28979
o9.clientX = 929;
// 28980
o9.clientY = 135;
// 28981
o9.ctrlKey = false;
// 28982
o9.currentTarget = o0;
// 28983
o9.defaultPrevented = false;
// 28984
o9.detail = 0;
// 28985
o9.eventPhase = 3;
// 28986
o9.isTrusted = void 0;
// 28987
o9.metaKey = false;
// 28988
o9.pageX = 929;
// 28989
o9.pageY = 135;
// 28990
o9.relatedTarget = null;
// 28991
o9.fromElement = null;
// 28994
o9.shiftKey = false;
// 28997
o9.timeStamp = 1373491308509;
// 28998
o9.type = "mousemove";
// 28999
o9.view = ow974244559;
// undefined
o9 = null;
// 29008
f974244559_2566.returns.push(undefined);
// 29011
f974244559_14.returns.push(undefined);
// 29012
f974244559_12.returns.push(119);
// 29015
o9 = {};
// 29018
o9.srcElement = o17;
// 29020
o9.target = o17;
// 29027
f974244559_519.returns.push(null);
// 29033
f974244559_519.returns.push(null);
// 29039
f974244559_519.returns.push(null);
// 29045
f974244559_519.returns.push(null);
// 29051
f974244559_519.returns.push(null);
// 29057
f974244559_519.returns.push(null);
// 29063
f974244559_519.returns.push(null);
// 29069
f974244559_519.returns.push(null);
// 29075
f974244559_519.returns.push(null);
// 29080
o13 = {};
// 29081
o9.relatedTarget = o13;
// 29082
o18 = {};
// 29083
o13.parentNode = o18;
// 29084
o13.nodeType = 1;
// 29085
o13.getAttributeNode = f974244559_519;
// 29087
f974244559_519.returns.push(null);
// 29089
o18.parentNode = o38;
// 29090
o18.nodeType = 1;
// 29091
o18.getAttributeNode = f974244559_519;
// undefined
o18 = null;
// 29093
f974244559_519.returns.push(null);
// 29095
o38.parentNode = o67;
// undefined
o67 = null;
// 29096
o38.nodeType = 1;
// 29097
o38.getAttributeNode = f974244559_519;
// undefined
o38 = null;
// 29099
f974244559_519.returns.push(null);
// 29105
f974244559_519.returns.push(null);
// 29111
f974244559_519.returns.push(null);
// 29117
f974244559_519.returns.push(null);
// 29123
f974244559_519.returns.push(null);
// 29129
f974244559_519.returns.push(null);
// 29135
f974244559_519.returns.push(null);
// 29141
f974244559_519.returns.push(null);
// 29147
f974244559_519.returns.push(null);
// 29153
f974244559_519.returns.push(null);
// 29159
f974244559_519.returns.push(null);
// 29165
f974244559_519.returns.push(null);
// 29171
f974244559_519.returns.push(null);
// 29177
f974244559_519.returns.push(null);
// 29183
f974244559_519.returns.push(null);
// 29188
o9.cancelBubble = false;
// 29189
o9.returnValue = true;
// undefined
o9 = null;
// 29190
o9 = {};
// 29193
o9.cancelBubble = false;
// 29196
f974244559_471.returns.push(1373491308557);
// 29199
f974244559_1202.returns.push(undefined);
// 29201
o9.returnValue = true;
// 29204
o9.srcElement = o13;
// 29206
o9.target = o13;
// 29213
f974244559_519.returns.push(null);
// 29219
f974244559_519.returns.push(null);
// 29225
f974244559_519.returns.push(null);
// 29231
f974244559_519.returns.push(null);
// 29237
f974244559_519.returns.push(null);
// 29243
f974244559_519.returns.push(null);
// 29249
f974244559_519.returns.push(null);
// 29255
f974244559_519.returns.push(null);
// 29261
f974244559_519.returns.push(null);
// 29267
f974244559_519.returns.push(null);
// 29273
f974244559_519.returns.push(null);
// 29279
f974244559_519.returns.push(null);
// 29285
f974244559_519.returns.push(null);
// 29291
f974244559_519.returns.push(null);
// 29297
f974244559_519.returns.push(null);
// 29303
f974244559_519.returns.push(null);
// 29309
f974244559_519.returns.push(null);
// 29314
o9.relatedTarget = o17;
// undefined
o9 = null;
// undefined
o17 = null;
// 29317
o9 = {};
// 29321
f974244559_471.returns.push(1373491308565);
// 29322
o9.cancelBubble = false;
// 29323
o9.returnValue = true;
// 29326
o9.srcElement = o13;
// 29328
o9.target = o13;
// 29335
f974244559_519.returns.push(null);
// 29341
f974244559_519.returns.push(null);
// 29347
f974244559_519.returns.push(null);
// 29353
f974244559_519.returns.push(null);
// 29359
f974244559_519.returns.push(null);
// 29365
f974244559_519.returns.push(null);
// 29371
f974244559_519.returns.push(null);
// 29377
f974244559_519.returns.push(null);
// 29383
f974244559_519.returns.push(null);
// 29389
f974244559_519.returns.push(null);
// 29395
f974244559_519.returns.push(null);
// 29401
f974244559_519.returns.push(null);
// 29407
f974244559_519.returns.push(null);
// 29413
f974244559_519.returns.push(null);
// 29419
f974244559_519.returns.push(null);
// 29425
f974244559_519.returns.push(null);
// 29431
f974244559_519.returns.push(null);
// 29436
o9.JSBNG__screenX = 859;
// 29437
o9.JSBNG__screenY = 266;
// 29438
o9.altKey = false;
// 29439
o9.bubbles = true;
// 29440
o9.button = 0;
// 29441
o9.buttons = void 0;
// 29442
o9.cancelable = false;
// 29443
o9.clientX = 842;
// 29444
o9.clientY = 162;
// 29445
o9.ctrlKey = false;
// 29446
o9.currentTarget = o0;
// 29447
o9.defaultPrevented = false;
// 29448
o9.detail = 0;
// 29449
o9.eventPhase = 3;
// 29450
o9.isTrusted = void 0;
// 29451
o9.metaKey = false;
// 29452
o9.pageX = 842;
// 29453
o9.pageY = 162;
// 29454
o9.relatedTarget = null;
// 29455
o9.fromElement = null;
// 29458
o9.shiftKey = false;
// 29461
o9.timeStamp = 1373491308565;
// 29462
o9.type = "mousemove";
// 29463
o9.view = ow974244559;
// undefined
o9 = null;
// 29472
f974244559_2566.returns.push(undefined);
// 29475
f974244559_14.returns.push(undefined);
// 29476
f974244559_12.returns.push(120);
// 29479
o9 = {};
// 29483
f974244559_471.returns.push(1373491308599);
// 29484
o9.cancelBubble = false;
// 29485
o9.returnValue = true;
// 29488
o9.srcElement = o13;
// 29490
o9.target = o13;
// 29497
f974244559_519.returns.push(null);
// 29503
f974244559_519.returns.push(null);
// 29509
f974244559_519.returns.push(null);
// 29515
f974244559_519.returns.push(null);
// 29521
f974244559_519.returns.push(null);
// 29527
f974244559_519.returns.push(null);
// 29533
f974244559_519.returns.push(null);
// 29539
f974244559_519.returns.push(null);
// 29545
f974244559_519.returns.push(null);
// 29551
f974244559_519.returns.push(null);
// 29557
f974244559_519.returns.push(null);
// 29563
f974244559_519.returns.push(null);
// 29569
f974244559_519.returns.push(null);
// 29575
f974244559_519.returns.push(null);
// 29581
f974244559_519.returns.push(null);
// 29587
f974244559_519.returns.push(null);
// 29593
f974244559_519.returns.push(null);
// 29598
o9.JSBNG__screenX = 728;
// 29599
o9.JSBNG__screenY = 353;
// 29600
o9.altKey = false;
// 29601
o9.bubbles = true;
// 29602
o9.button = 0;
// 29603
o9.buttons = void 0;
// 29604
o9.cancelable = false;
// 29605
o9.clientX = 711;
// 29606
o9.clientY = 249;
// 29607
o9.ctrlKey = false;
// 29608
o9.currentTarget = o0;
// 29609
o9.defaultPrevented = false;
// 29610
o9.detail = 0;
// 29611
o9.eventPhase = 3;
// 29612
o9.isTrusted = void 0;
// 29613
o9.metaKey = false;
// 29614
o9.pageX = 711;
// 29615
o9.pageY = 249;
// 29616
o9.relatedTarget = null;
// 29617
o9.fromElement = null;
// 29620
o9.shiftKey = false;
// 29623
o9.timeStamp = 1373491308599;
// 29624
o9.type = "mousemove";
// 29625
o9.view = ow974244559;
// undefined
o9 = null;
// 29634
f974244559_2566.returns.push(undefined);
// 29637
f974244559_14.returns.push(undefined);
// 29638
f974244559_12.returns.push(121);
// 29641
o9 = {};
// 29644
o9.srcElement = o13;
// 29646
o9.target = o13;
// 29653
f974244559_519.returns.push(null);
// 29659
f974244559_519.returns.push(null);
// 29665
f974244559_519.returns.push(null);
// 29671
f974244559_519.returns.push(null);
// 29677
f974244559_519.returns.push(null);
// 29683
f974244559_519.returns.push(null);
// 29689
f974244559_519.returns.push(null);
// 29695
f974244559_519.returns.push(null);
// 29701
f974244559_519.returns.push(null);
// 29707
f974244559_519.returns.push(null);
// 29713
f974244559_519.returns.push(null);
// 29719
f974244559_519.returns.push(null);
// 29725
f974244559_519.returns.push(null);
// 29731
f974244559_519.returns.push(null);
// 29737
f974244559_519.returns.push(null);
// 29743
f974244559_519.returns.push(null);
// 29749
f974244559_519.returns.push(null);
// 29754
o9.relatedTarget = o41;
// 29755
o17 = {};
// 29756
o41.parentNode = o17;
// 29757
o41.nodeType = 1;
// 29758
o41.getAttributeNode = f974244559_519;
// 29760
f974244559_519.returns.push(null);
// 29762
o18 = {};
// 29763
o17.parentNode = o18;
// 29764
o17.nodeType = 1;
// 29765
o17.getAttributeNode = f974244559_519;
// undefined
o17 = null;
// 29767
f974244559_519.returns.push(null);
// 29769
o18.parentNode = o66;
// undefined
o66 = null;
// 29770
o18.nodeType = 1;
// 29771
o18.getAttributeNode = f974244559_519;
// undefined
o18 = null;
// 29773
f974244559_519.returns.push(null);
// 29779
f974244559_519.returns.push(null);
// 29785
f974244559_519.returns.push(null);
// 29791
f974244559_519.returns.push(null);
// 29797
f974244559_519.returns.push(null);
// 29803
f974244559_519.returns.push(null);
// 29809
f974244559_519.returns.push(null);
// 29815
f974244559_519.returns.push(null);
// 29821
f974244559_519.returns.push(null);
// 29827
f974244559_519.returns.push(null);
// 29833
f974244559_519.returns.push(null);
// 29839
f974244559_519.returns.push(null);
// 29845
f974244559_519.returns.push(null);
// 29851
f974244559_519.returns.push(null);
// 29857
f974244559_519.returns.push(null);
// 29863
f974244559_519.returns.push(null);
// 29868
o9.cancelBubble = false;
// 29869
o9.returnValue = true;
// undefined
o9 = null;
// 29870
o9 = {};
// 29873
o9.cancelBubble = false;
// 29876
f974244559_471.returns.push(1373491308647);
// 29879
f974244559_1202.returns.push(undefined);
// 29881
o9.returnValue = true;
// 29884
o9.srcElement = o41;
// 29886
o9.target = o41;
// 29893
f974244559_519.returns.push(null);
// 29899
f974244559_519.returns.push(null);
// 29905
f974244559_519.returns.push(null);
// 29911
f974244559_519.returns.push(null);
// 29917
f974244559_519.returns.push(null);
// 29923
f974244559_519.returns.push(null);
// 29929
f974244559_519.returns.push(null);
// 29935
f974244559_519.returns.push(null);
// 29941
f974244559_519.returns.push(null);
// 29947
f974244559_519.returns.push(null);
// 29953
f974244559_519.returns.push(null);
// 29959
f974244559_519.returns.push(null);
// 29965
f974244559_519.returns.push(null);
// 29971
f974244559_519.returns.push(null);
// 29977
f974244559_519.returns.push(null);
// 29983
f974244559_519.returns.push(null);
// 29989
f974244559_519.returns.push(null);
// 29995
f974244559_519.returns.push(null);
// 30000
o9.relatedTarget = o13;
// undefined
o9 = null;
// undefined
o13 = null;
// 30003
o9 = {};
// 30007
f974244559_471.returns.push(1373491308670);
// 30008
o9.cancelBubble = false;
// 30009
o9.returnValue = true;
// 30012
o9.srcElement = o41;
// 30014
o9.target = o41;
// 30021
f974244559_519.returns.push(null);
// 30027
f974244559_519.returns.push(null);
// 30033
f974244559_519.returns.push(null);
// 30039
f974244559_519.returns.push(null);
// 30045
f974244559_519.returns.push(null);
// 30051
f974244559_519.returns.push(null);
// 30057
f974244559_519.returns.push(null);
// 30063
f974244559_519.returns.push(null);
// 30069
f974244559_519.returns.push(null);
// 30075
f974244559_519.returns.push(null);
// 30081
f974244559_519.returns.push(null);
// 30087
f974244559_519.returns.push(null);
// 30093
f974244559_519.returns.push(null);
// 30099
f974244559_519.returns.push(null);
// 30105
f974244559_519.returns.push(null);
// 30111
f974244559_519.returns.push(null);
// 30117
f974244559_519.returns.push(null);
// 30123
f974244559_519.returns.push(null);
// 30128
o9.JSBNG__screenX = 711;
// 30129
o9.JSBNG__screenY = 372;
// 30130
o9.altKey = false;
// 30131
o9.bubbles = true;
// 30132
o9.button = 0;
// 30133
o9.buttons = void 0;
// 30134
o9.cancelable = false;
// 30135
o9.clientX = 694;
// 30136
o9.clientY = 268;
// 30137
o9.ctrlKey = false;
// 30138
o9.currentTarget = o0;
// 30139
o9.defaultPrevented = false;
// 30140
o9.detail = 0;
// 30141
o9.eventPhase = 3;
// 30142
o9.isTrusted = void 0;
// 30143
o9.metaKey = false;
// 30144
o9.pageX = 694;
// 30145
o9.pageY = 268;
// 30146
o9.relatedTarget = null;
// 30147
o9.fromElement = null;
// 30150
o9.shiftKey = false;
// 30153
o9.timeStamp = 1373491308669;
// 30154
o9.type = "mousemove";
// 30155
o9.view = ow974244559;
// undefined
o9 = null;
// 30164
f974244559_2566.returns.push(undefined);
// 30167
f974244559_14.returns.push(undefined);
// 30168
f974244559_12.returns.push(122);
// 30171
o9 = {};
// 30174
o9.srcElement = o41;
// 30176
o9.target = o41;
// 30183
f974244559_519.returns.push(null);
// 30189
f974244559_519.returns.push(null);
// 30195
f974244559_519.returns.push(null);
// 30201
f974244559_519.returns.push(null);
// 30207
f974244559_519.returns.push(null);
// 30213
f974244559_519.returns.push(null);
// 30219
f974244559_519.returns.push(null);
// 30225
f974244559_519.returns.push(null);
// 30231
f974244559_519.returns.push(null);
// 30237
f974244559_519.returns.push(null);
// 30243
f974244559_519.returns.push(null);
// 30249
f974244559_519.returns.push(null);
// 30255
f974244559_519.returns.push(null);
// 30261
f974244559_519.returns.push(null);
// 30267
f974244559_519.returns.push(null);
// 30273
f974244559_519.returns.push(null);
// 30279
f974244559_519.returns.push(null);
// 30285
f974244559_519.returns.push(null);
// 30290
o9.relatedTarget = o103;
// 30295
f974244559_519.returns.push(null);
// 30301
f974244559_519.returns.push(null);
// 30307
f974244559_519.returns.push(null);
// 30313
f974244559_519.returns.push(null);
// 30319
f974244559_519.returns.push(null);
// 30325
f974244559_519.returns.push(null);
// 30331
f974244559_519.returns.push(null);
// 30337
f974244559_519.returns.push(null);
// 30343
f974244559_519.returns.push(null);
// 30349
f974244559_519.returns.push(null);
// 30355
f974244559_519.returns.push(null);
// 30361
f974244559_519.returns.push(null);
// 30367
f974244559_519.returns.push(null);
// 30373
f974244559_519.returns.push(null);
// 30379
f974244559_519.returns.push(null);
// 30385
f974244559_519.returns.push(null);
// 30391
f974244559_519.returns.push(null);
// 30396
o9.cancelBubble = false;
// 30397
o9.returnValue = true;
// undefined
o9 = null;
// 30398
o9 = {};
// 30401
o9.cancelBubble = false;
// 30404
f974244559_471.returns.push(1373491308707);
// 30407
f974244559_1202.returns.push(undefined);
// 30409
o9.returnValue = true;
// 30412
o9.srcElement = o103;
// 30414
o9.target = o103;
// 30421
f974244559_519.returns.push(null);
// 30427
f974244559_519.returns.push(null);
// 30433
f974244559_519.returns.push(null);
// 30439
f974244559_519.returns.push(null);
// 30445
f974244559_519.returns.push(null);
// 30451
f974244559_519.returns.push(null);
// 30457
f974244559_519.returns.push(null);
// 30463
f974244559_519.returns.push(null);
// 30469
f974244559_519.returns.push(null);
// 30475
f974244559_519.returns.push(null);
// 30481
f974244559_519.returns.push(null);
// 30487
f974244559_519.returns.push(null);
// 30493
f974244559_519.returns.push(null);
// 30499
f974244559_519.returns.push(null);
// 30505
f974244559_519.returns.push(null);
// 30511
f974244559_519.returns.push(null);
// 30517
f974244559_519.returns.push(null);
// 30522
o9.relatedTarget = o41;
// undefined
o9 = null;
// undefined
o41 = null;
// 30525
o9 = {};
// 30529
f974244559_471.returns.push(1373491308714);
// 30530
o9.cancelBubble = false;
// 30531
o9.returnValue = true;
// 30534
o9.srcElement = o103;
// 30536
o9.target = o103;
// 30543
f974244559_519.returns.push(null);
// 30549
f974244559_519.returns.push(null);
// 30555
f974244559_519.returns.push(null);
// 30561
f974244559_519.returns.push(null);
// 30567
f974244559_519.returns.push(null);
// 30573
f974244559_519.returns.push(null);
// 30579
f974244559_519.returns.push(null);
// 30585
f974244559_519.returns.push(null);
// 30591
f974244559_519.returns.push(null);
// 30597
f974244559_519.returns.push(null);
// 30603
f974244559_519.returns.push(null);
// 30609
f974244559_519.returns.push(null);
// 30615
f974244559_519.returns.push(null);
// 30621
f974244559_519.returns.push(null);
// 30627
f974244559_519.returns.push(null);
// 30633
f974244559_519.returns.push(null);
// 30639
f974244559_519.returns.push(null);
// 30644
o9.JSBNG__screenX = 610;
// 30645
o9.JSBNG__screenY = 521;
// 30646
o9.altKey = false;
// 30647
o9.bubbles = true;
// 30648
o9.button = 0;
// 30649
o9.buttons = void 0;
// 30650
o9.cancelable = false;
// 30651
o9.clientX = 593;
// 30652
o9.clientY = 417;
// 30653
o9.ctrlKey = false;
// 30654
o9.currentTarget = o0;
// 30655
o9.defaultPrevented = false;
// 30656
o9.detail = 0;
// 30657
o9.eventPhase = 3;
// 30658
o9.isTrusted = void 0;
// 30659
o9.metaKey = false;
// 30660
o9.pageX = 593;
// 30661
o9.pageY = 417;
// 30662
o9.relatedTarget = null;
// 30663
o9.fromElement = null;
// 30666
o9.shiftKey = false;
// 30669
o9.timeStamp = 1373491308714;
// 30670
o9.type = "mousemove";
// 30671
o9.view = ow974244559;
// undefined
o9 = null;
// 30680
f974244559_2566.returns.push(undefined);
// 30683
f974244559_14.returns.push(undefined);
// 30684
f974244559_12.returns.push(123);
// 30687
o9 = {};
// 30690
o9.srcElement = o103;
// 30692
o9.target = o103;
// 30699
f974244559_519.returns.push(null);
// 30705
f974244559_519.returns.push(null);
// 30711
f974244559_519.returns.push(null);
// 30717
f974244559_519.returns.push(null);
// 30723
f974244559_519.returns.push(null);
// 30729
f974244559_519.returns.push(null);
// 30735
f974244559_519.returns.push(null);
// 30741
f974244559_519.returns.push(null);
// 30747
f974244559_519.returns.push(null);
// 30753
f974244559_519.returns.push(null);
// 30759
f974244559_519.returns.push(null);
// 30765
f974244559_519.returns.push(null);
// 30771
f974244559_519.returns.push(null);
// 30777
f974244559_519.returns.push(null);
// 30783
f974244559_519.returns.push(null);
// 30789
f974244559_519.returns.push(null);
// 30795
f974244559_519.returns.push(null);
// 30800
o9.relatedTarget = o10;
// 30802
o10.nodeType = 1;
// 30803
o10.getAttributeNode = f974244559_519;
// 30805
f974244559_519.returns.push(null);
// 30808
o8.nodeType = 1;
// 30809
o8.getAttributeNode = f974244559_519;
// undefined
o8 = null;
// 30811
f974244559_519.returns.push(null);
// 30814
o43.nodeType = 1;
// 30815
o43.getAttributeNode = f974244559_519;
// undefined
o43 = null;
// 30817
f974244559_519.returns.push(null);
// 30820
o11.nodeType = 1;
// 30821
o11.getAttributeNode = f974244559_519;
// undefined
o11 = null;
// 30823
f974244559_519.returns.push(null);
// 30829
f974244559_519.returns.push(null);
// 30835
f974244559_519.returns.push(null);
// 30841
f974244559_519.returns.push(null);
// 30847
f974244559_519.returns.push(null);
// 30853
f974244559_519.returns.push(null);
// 30859
f974244559_519.returns.push(null);
// 30865
f974244559_519.returns.push(null);
// 30871
f974244559_519.returns.push(null);
// 30877
f974244559_519.returns.push(null);
// 30883
f974244559_519.returns.push(null);
// 30889
f974244559_519.returns.push(null);
// 30894
o9.cancelBubble = false;
// 30895
o9.returnValue = true;
// undefined
o9 = null;
// 30896
o8 = {};
// 30899
o8.cancelBubble = false;
// 30902
f974244559_471.returns.push(1373491308777);
// 30905
f974244559_1202.returns.push(undefined);
// 30907
o8.returnValue = true;
// 30910
o8.srcElement = o10;
// 30912
o8.target = o10;
// 30919
f974244559_519.returns.push(null);
// 30925
f974244559_519.returns.push(null);
// 30931
f974244559_519.returns.push(null);
// 30937
f974244559_519.returns.push(null);
// 30943
f974244559_519.returns.push(null);
// 30949
f974244559_519.returns.push(null);
// 30955
f974244559_519.returns.push(null);
// 30961
f974244559_519.returns.push(null);
// 30967
f974244559_519.returns.push(null);
// 30973
f974244559_519.returns.push(null);
// 30979
f974244559_519.returns.push(null);
// 30985
f974244559_519.returns.push(null);
// 30991
f974244559_519.returns.push(null);
// 30997
f974244559_519.returns.push(null);
// 31003
f974244559_519.returns.push(null);
// 31008
o8.relatedTarget = o103;
// undefined
o8 = null;
// 31011
o8 = {};
// 31015
f974244559_471.returns.push(1373491308789);
// 31016
o8.cancelBubble = false;
// 31017
o8.returnValue = true;
// 31020
o8.srcElement = o10;
// 31022
o8.target = o10;
// 31029
f974244559_519.returns.push(null);
// 31035
f974244559_519.returns.push(null);
// 31041
f974244559_519.returns.push(null);
// 31047
f974244559_519.returns.push(null);
// 31053
f974244559_519.returns.push(null);
// 31059
f974244559_519.returns.push(null);
// 31065
f974244559_519.returns.push(null);
// 31071
f974244559_519.returns.push(null);
// 31077
f974244559_519.returns.push(null);
// 31083
f974244559_519.returns.push(null);
// 31089
f974244559_519.returns.push(null);
// 31095
f974244559_519.returns.push(null);
// 31101
f974244559_519.returns.push(null);
// 31107
f974244559_519.returns.push(null);
// 31113
f974244559_519.returns.push(null);
// 31118
o8.JSBNG__screenX = 541;
// 31119
o8.JSBNG__screenY = 620;
// 31120
o8.altKey = false;
// 31121
o8.bubbles = true;
// 31122
o8.button = 0;
// 31123
o8.buttons = void 0;
// 31124
o8.cancelable = false;
// 31125
o8.clientX = 524;
// 31126
o8.clientY = 516;
// 31127
o8.ctrlKey = false;
// 31128
o8.currentTarget = o0;
// 31129
o8.defaultPrevented = false;
// 31130
o8.detail = 0;
// 31131
o8.eventPhase = 3;
// 31132
o8.isTrusted = void 0;
// 31133
o8.metaKey = false;
// 31134
o8.pageX = 524;
// 31135
o8.pageY = 516;
// 31136
o8.relatedTarget = null;
// 31137
o8.fromElement = null;
// 31140
o8.shiftKey = false;
// 31143
o8.timeStamp = 1373491308789;
// 31144
o8.type = "mousemove";
// 31145
o8.view = ow974244559;
// undefined
o8 = null;
// 31154
f974244559_2566.returns.push(undefined);
// 31157
f974244559_14.returns.push(undefined);
// 31158
f974244559_12.returns.push(124);
// 31161
o8 = {};
// 31165
f974244559_471.returns.push(1373491308810);
// 31166
o8.cancelBubble = false;
// 31167
o8.returnValue = true;
// 31170
o8.srcElement = o10;
// 31172
o8.target = o10;
// 31179
f974244559_519.returns.push(null);
// 31185
f974244559_519.returns.push(null);
// 31191
f974244559_519.returns.push(null);
// 31197
f974244559_519.returns.push(null);
// 31203
f974244559_519.returns.push(null);
// 31209
f974244559_519.returns.push(null);
// 31215
f974244559_519.returns.push(null);
// 31221
f974244559_519.returns.push(null);
// 31227
f974244559_519.returns.push(null);
// 31233
f974244559_519.returns.push(null);
// 31239
f974244559_519.returns.push(null);
// 31245
f974244559_519.returns.push(null);
// 31251
f974244559_519.returns.push(null);
// 31257
f974244559_519.returns.push(null);
// 31263
f974244559_519.returns.push(null);
// 31268
o8.JSBNG__screenX = 540;
// 31269
o8.JSBNG__screenY = 621;
// 31270
o8.altKey = false;
// 31271
o8.bubbles = true;
// 31272
o8.button = 0;
// 31273
o8.buttons = void 0;
// 31274
o8.cancelable = false;
// 31275
o8.clientX = 523;
// 31276
o8.clientY = 517;
// 31277
o8.ctrlKey = false;
// 31278
o8.currentTarget = o0;
// 31279
o8.defaultPrevented = false;
// 31280
o8.detail = 0;
// 31281
o8.eventPhase = 3;
// 31282
o8.isTrusted = void 0;
// 31283
o8.metaKey = false;
// 31284
o8.pageX = 523;
// 31285
o8.pageY = 517;
// 31286
o8.relatedTarget = null;
// 31287
o8.fromElement = null;
// 31290
o8.shiftKey = false;
// 31293
o8.timeStamp = 1373491308810;
// 31294
o8.type = "mousemove";
// 31295
o8.view = ow974244559;
// undefined
o8 = null;
// 31304
f974244559_2566.returns.push(undefined);
// 31307
f974244559_14.returns.push(undefined);
// 31308
f974244559_12.returns.push(125);
// 31311
o8 = {};
// 31315
f974244559_471.returns.push(1373491308923);
// 31316
o8.cancelBubble = false;
// 31317
o8.returnValue = true;
// 31320
o8.srcElement = o10;
// 31322
o8.target = o10;
// 31329
f974244559_519.returns.push(null);
// 31335
f974244559_519.returns.push(null);
// 31341
f974244559_519.returns.push(null);
// 31347
f974244559_519.returns.push(null);
// 31353
f974244559_519.returns.push(null);
// 31359
f974244559_519.returns.push(null);
// 31365
f974244559_519.returns.push(null);
// 31371
f974244559_519.returns.push(null);
// 31377
f974244559_519.returns.push(null);
// 31383
f974244559_519.returns.push(null);
// 31389
f974244559_519.returns.push(null);
// 31395
f974244559_519.returns.push(null);
// 31401
f974244559_519.returns.push(null);
// 31407
f974244559_519.returns.push(null);
// 31413
f974244559_519.returns.push(null);
// 31418
o8.JSBNG__screenX = 540;
// 31419
o8.JSBNG__screenY = 615;
// 31420
o8.altKey = false;
// 31421
o8.bubbles = true;
// 31422
o8.button = 0;
// 31423
o8.buttons = void 0;
// 31424
o8.cancelable = false;
// 31425
o8.clientX = 523;
// 31426
o8.clientY = 511;
// 31427
o8.ctrlKey = false;
// 31428
o8.currentTarget = o0;
// 31429
o8.defaultPrevented = false;
// 31430
o8.detail = 0;
// 31431
o8.eventPhase = 3;
// 31432
o8.isTrusted = void 0;
// 31433
o8.metaKey = false;
// 31434
o8.pageX = 523;
// 31435
o8.pageY = 511;
// 31436
o8.relatedTarget = null;
// 31437
o8.fromElement = null;
// 31440
o8.shiftKey = false;
// 31443
o8.timeStamp = 1373491308923;
// 31444
o8.type = "mousemove";
// 31445
o8.view = ow974244559;
// undefined
o8 = null;
// 31454
f974244559_2566.returns.push(undefined);
// 31457
f974244559_14.returns.push(undefined);
// 31458
f974244559_12.returns.push(126);
// 31462
f974244559_12.returns.push(127);
// undefined
fo974244559_1_cookie.returns.push("c_user=100006118350059; csm=2; sub=268435456");
// 31467
f974244559_471.returns.push(1373491308968);
// 31468
o8 = {};
// 31471
o8.srcElement = o10;
// 31473
o8.target = o10;
// 31480
f974244559_519.returns.push(null);
// 31486
f974244559_519.returns.push(null);
// 31492
f974244559_519.returns.push(null);
// 31498
f974244559_519.returns.push(null);
// 31504
f974244559_519.returns.push(null);
// 31510
f974244559_519.returns.push(null);
// 31516
f974244559_519.returns.push(null);
// 31522
f974244559_519.returns.push(null);
// 31528
f974244559_519.returns.push(null);
// 31534
f974244559_519.returns.push(null);
// 31540
f974244559_519.returns.push(null);
// 31546
f974244559_519.returns.push(null);
// 31552
f974244559_519.returns.push(null);
// 31558
f974244559_519.returns.push(null);
// 31564
f974244559_519.returns.push(null);
// 31569
o9 = {};
// 31570
o8.relatedTarget = o9;
// 31571
o9.parentNode = o104;
// undefined
o104 = null;
// 31572
o9.nodeType = 1;
// 31573
o9.getAttributeNode = f974244559_519;
// 31575
f974244559_519.returns.push(null);
// 31581
f974244559_519.returns.push(null);
// 31587
f974244559_519.returns.push(null);
// 31593
f974244559_519.returns.push(null);
// 31599
f974244559_519.returns.push(null);
// 31605
f974244559_519.returns.push(null);
// 31611
f974244559_519.returns.push(null);
// 31617
f974244559_519.returns.push(null);
// 31623
f974244559_519.returns.push(null);
// 31629
f974244559_519.returns.push(null);
// 31635
f974244559_519.returns.push(null);
// 31641
f974244559_519.returns.push(null);
// 31647
f974244559_519.returns.push(null);
// 31653
f974244559_519.returns.push(null);
// 31659
f974244559_519.returns.push(null);
// 31664
o8.cancelBubble = false;
// 31665
o8.returnValue = true;
// undefined
o8 = null;
// 31666
o8 = {};
// 31669
o8.cancelBubble = false;
// 31672
f974244559_471.returns.push(1373491308998);
// 31677
f974244559_471.returns.push(1373491308999);
// 31681
f974244559_471.returns.push(1373491308999);
// 31685
f974244559_1202.returns.push(undefined);
// 31687
o8.returnValue = true;
// 31690
o8.srcElement = o9;
// 31692
o8.target = o9;
// 31699
f974244559_519.returns.push(null);
// 31705
f974244559_519.returns.push(null);
// 31711
f974244559_519.returns.push(null);
// 31717
f974244559_519.returns.push(null);
// 31723
f974244559_519.returns.push(null);
// 31729
f974244559_519.returns.push(null);
// 31735
f974244559_519.returns.push(null);
// 31741
f974244559_519.returns.push(null);
// 31747
f974244559_519.returns.push(null);
// 31753
f974244559_519.returns.push(null);
// 31759
f974244559_519.returns.push(null);
// 31765
f974244559_519.returns.push(null);
// 31771
f974244559_519.returns.push(null);
// 31777
f974244559_519.returns.push(null);
// 31783
f974244559_519.returns.push(null);
// 31788
o8.relatedTarget = o10;
// undefined
o8 = null;
// undefined
o10 = null;
// 31791
o8 = {};
// 31795
f974244559_471.returns.push(1373491309006);
// 31796
o8.cancelBubble = false;
// 31797
o8.returnValue = true;
// 31800
o8.srcElement = o9;
// 31802
o8.target = o9;
// 31809
f974244559_519.returns.push(null);
// 31815
f974244559_519.returns.push(null);
// 31821
f974244559_519.returns.push(null);
// 31827
f974244559_519.returns.push(null);
// 31833
f974244559_519.returns.push(null);
// 31839
f974244559_519.returns.push(null);
// 31845
f974244559_519.returns.push(null);
// 31851
f974244559_519.returns.push(null);
// 31857
f974244559_519.returns.push(null);
// 31863
f974244559_519.returns.push(null);
// 31869
f974244559_519.returns.push(null);
// 31875
f974244559_519.returns.push(null);
// 31881
f974244559_519.returns.push(null);
// 31887
f974244559_519.returns.push(null);
// 31893
f974244559_519.returns.push(null);
// 31898
o8.JSBNG__screenX = 540;
// 31899
o8.JSBNG__screenY = 606;
// 31900
o8.altKey = false;
// 31901
o8.bubbles = true;
// 31902
o8.button = 0;
// 31903
o8.buttons = void 0;
// 31904
o8.cancelable = false;
// 31905
o8.clientX = 523;
// 31906
o8.clientY = 502;
// 31907
o8.ctrlKey = false;
// 31908
o8.currentTarget = o0;
// 31909
o8.defaultPrevented = false;
// 31910
o8.detail = 0;
// 31911
o8.eventPhase = 3;
// 31912
o8.isTrusted = void 0;
// 31913
o8.metaKey = false;
// 31914
o8.pageX = 523;
// 31915
o8.pageY = 502;
// 31916
o8.relatedTarget = null;
// 31917
o8.fromElement = null;
// 31920
o8.shiftKey = false;
// 31923
o8.timeStamp = 1373491309006;
// 31924
o8.type = "mousemove";
// 31925
o8.view = ow974244559;
// undefined
o8 = null;
// 31934
f974244559_2566.returns.push(undefined);
// 31937
f974244559_14.returns.push(undefined);
// 31938
f974244559_12.returns.push(128);
// undefined
fo974244559_1_cookie.returns.push("c_user=100006118350059; csm=2; sub=268435456");
// 31942
o8 = {};
// 31945
o8.srcElement = o9;
// 31947
o8.target = o9;
// 31954
f974244559_519.returns.push(null);
// 31960
f974244559_519.returns.push(null);
// 31966
f974244559_519.returns.push(null);
// 31972
f974244559_519.returns.push(null);
// 31978
f974244559_519.returns.push(null);
// 31984
f974244559_519.returns.push(null);
// 31990
f974244559_519.returns.push(null);
// 31996
f974244559_519.returns.push(null);
// 32002
f974244559_519.returns.push(null);
// 32008
f974244559_519.returns.push(null);
// 32014
f974244559_519.returns.push(null);
// 32020
f974244559_519.returns.push(null);
// 32026
f974244559_519.returns.push(null);
// 32032
f974244559_519.returns.push(null);
// 32038
f974244559_519.returns.push(null);
// 32043
o10 = {};
// 32044
o8.relatedTarget = o10;
// 32045
o11 = {};
// 32046
o10.parentNode = o11;
// 32047
o10.nodeType = 1;
// 32048
o10.getAttributeNode = f974244559_519;
// 32050
f974244559_519.returns.push(null);
// 32052
o11.parentNode = o9;
// 32053
o11.nodeType = 1;
// 32054
o11.getAttributeNode = f974244559_519;
// undefined
o11 = null;
// 32056
f974244559_519.returns.push(null);
// 32062
f974244559_519.returns.push(null);
// 32068
f974244559_519.returns.push(null);
// 32074
f974244559_519.returns.push(null);
// 32080
f974244559_519.returns.push(null);
// 32086
f974244559_519.returns.push(null);
// 32092
f974244559_519.returns.push(null);
// 32098
f974244559_519.returns.push(null);
// 32104
f974244559_519.returns.push(null);
// 32110
f974244559_519.returns.push(null);
// 32116
f974244559_519.returns.push(null);
// 32122
f974244559_519.returns.push(null);
// 32128
f974244559_519.returns.push(null);
// 32134
f974244559_519.returns.push(null);
// 32140
f974244559_519.returns.push(null);
// 32146
f974244559_519.returns.push(null);
// 32151
o8.cancelBubble = false;
// 32152
o8.returnValue = true;
// undefined
o8 = null;
// 32153
o8 = {};
// 32156
o8.cancelBubble = false;
// 32159
f974244559_471.returns.push(1373491309039);
// 32162
f974244559_1202.returns.push(undefined);
// 32164
o8.returnValue = true;
// 32167
o8.srcElement = o10;
// 32169
o8.target = o10;
// 32176
f974244559_519.returns.push(null);
// 32182
f974244559_519.returns.push(null);
// 32188
f974244559_519.returns.push(null);
// 32194
f974244559_519.returns.push(null);
// 32200
f974244559_519.returns.push(null);
// 32206
f974244559_519.returns.push(null);
// 32212
f974244559_519.returns.push(null);
// 32218
f974244559_519.returns.push(null);
// 32224
f974244559_519.returns.push(null);
// 32230
f974244559_519.returns.push(null);
// 32236
f974244559_519.returns.push(null);
// 32242
f974244559_519.returns.push(null);
// 32248
f974244559_519.returns.push(null);
// 32254
f974244559_519.returns.push(null);
// 32260
f974244559_519.returns.push(null);
// 32266
f974244559_519.returns.push(null);
// 32272
f974244559_519.returns.push(null);
// 32277
o8.relatedTarget = o9;
// undefined
o8 = null;
// undefined
o9 = null;
// 32280
o8 = {};
// 32284
f974244559_471.returns.push(1373491309047);
// 32285
o8.cancelBubble = false;
// 32286
o8.returnValue = true;
// 32289
o8.srcElement = o10;
// 32291
o8.target = o10;
// 32298
f974244559_519.returns.push(null);
// 32304
f974244559_519.returns.push(null);
// 32310
f974244559_519.returns.push(null);
// 32316
f974244559_519.returns.push(null);
// 32322
f974244559_519.returns.push(null);
// 32328
f974244559_519.returns.push(null);
// 32334
f974244559_519.returns.push(null);
// 32340
f974244559_519.returns.push(null);
// 32346
f974244559_519.returns.push(null);
// 32352
f974244559_519.returns.push(null);
// 32358
f974244559_519.returns.push(null);
// 32364
f974244559_519.returns.push(null);
// 32370
f974244559_519.returns.push(null);
// 32376
f974244559_519.returns.push(null);
// 32382
f974244559_519.returns.push(null);
// 32388
f974244559_519.returns.push(null);
// 32394
f974244559_519.returns.push(null);
// 32399
o8.JSBNG__screenX = 540;
// 32400
o8.JSBNG__screenY = 592;
// 32401
o8.altKey = false;
// 32402
o8.bubbles = true;
// 32403
o8.button = 0;
// 32404
o8.buttons = void 0;
// 32405
o8.cancelable = false;
// 32406
o8.clientX = 523;
// 32407
o8.clientY = 488;
// 32408
o8.ctrlKey = false;
// 32409
o8.currentTarget = o0;
// 32410
o8.defaultPrevented = false;
// 32411
o8.detail = 0;
// 32412
o8.eventPhase = 3;
// 32413
o8.isTrusted = void 0;
// 32414
o8.metaKey = false;
// 32415
o8.pageX = 523;
// 32416
o8.pageY = 488;
// 32417
o8.relatedTarget = null;
// 32418
o8.fromElement = null;
// 32421
o8.shiftKey = false;
// 32424
o8.timeStamp = 1373491309047;
// 32425
o8.type = "mousemove";
// 32426
o8.view = ow974244559;
// undefined
o8 = null;
// 32435
f974244559_2566.returns.push(undefined);
// 32438
f974244559_14.returns.push(undefined);
// 32439
f974244559_12.returns.push(129);
// 32442
o8 = {};
// 32445
o8.srcElement = o10;
// 32447
o8.target = o10;
// 32454
f974244559_519.returns.push(null);
// 32460
f974244559_519.returns.push(null);
// 32466
f974244559_519.returns.push(null);
// 32472
f974244559_519.returns.push(null);
// 32478
f974244559_519.returns.push(null);
// 32484
f974244559_519.returns.push(null);
// 32490
f974244559_519.returns.push(null);
// 32496
f974244559_519.returns.push(null);
// 32502
f974244559_519.returns.push(null);
// 32508
f974244559_519.returns.push(null);
// 32514
f974244559_519.returns.push(null);
// 32520
f974244559_519.returns.push(null);
// 32526
f974244559_519.returns.push(null);
// 32532
f974244559_519.returns.push(null);
// 32538
f974244559_519.returns.push(null);
// 32544
f974244559_519.returns.push(null);
// 32550
f974244559_519.returns.push(null);
// 32555
o8.relatedTarget = o103;
// 32560
f974244559_519.returns.push(null);
// 32566
f974244559_519.returns.push(null);
// 32572
f974244559_519.returns.push(null);
// 32578
f974244559_519.returns.push(null);
// 32584
f974244559_519.returns.push(null);
// 32590
f974244559_519.returns.push(null);
// 32596
f974244559_519.returns.push(null);
// 32602
f974244559_519.returns.push(null);
// 32608
f974244559_519.returns.push(null);
// 32614
f974244559_519.returns.push(null);
// 32620
f974244559_519.returns.push(null);
// 32626
f974244559_519.returns.push(null);
// 32632
f974244559_519.returns.push(null);
// 32638
f974244559_519.returns.push(null);
// 32644
f974244559_519.returns.push(null);
// 32650
f974244559_519.returns.push(null);
// 32656
f974244559_519.returns.push(null);
// 32661
o8.cancelBubble = false;
// 32662
o8.returnValue = true;
// undefined
o8 = null;
// 32663
o8 = {};
// 32666
o8.cancelBubble = false;
// 32669
f974244559_471.returns.push(1373491309090);
// 32672
f974244559_1202.returns.push(undefined);
// 32674
o8.returnValue = true;
// 32677
o8.srcElement = o103;
// 32679
o8.target = o103;
// 32686
f974244559_519.returns.push(null);
// 32692
f974244559_519.returns.push(null);
// 32698
f974244559_519.returns.push(null);
// 32704
f974244559_519.returns.push(null);
// 32710
f974244559_519.returns.push(null);
// 32716
f974244559_519.returns.push(null);
// 32722
f974244559_519.returns.push(null);
// 32728
f974244559_519.returns.push(null);
// 32734
f974244559_519.returns.push(null);
// 32740
f974244559_519.returns.push(null);
// 32746
f974244559_519.returns.push(null);
// 32752
f974244559_519.returns.push(null);
// 32758
f974244559_519.returns.push(null);
// 32764
f974244559_519.returns.push(null);
// 32770
f974244559_519.returns.push(null);
// 32776
f974244559_519.returns.push(null);
// 32782
f974244559_519.returns.push(null);
// 32787
o8.relatedTarget = o10;
// undefined
o8 = null;
// undefined
o10 = null;
// 32790
o8 = {};
// 32794
f974244559_471.returns.push(1373491309099);
// 32795
o8.cancelBubble = false;
// 32796
o8.returnValue = true;
// 32799
o8.srcElement = o103;
// 32801
o8.target = o103;
// undefined
o103 = null;
// 32808
f974244559_519.returns.push(null);
// 32814
f974244559_519.returns.push(null);
// 32820
f974244559_519.returns.push(null);
// 32826
f974244559_519.returns.push(null);
// 32832
f974244559_519.returns.push(null);
// 32838
f974244559_519.returns.push(null);
// 32844
f974244559_519.returns.push(null);
// 32850
f974244559_519.returns.push(null);
// 32856
f974244559_519.returns.push(null);
// 32862
f974244559_519.returns.push(null);
// 32868
f974244559_519.returns.push(null);
// 32874
f974244559_519.returns.push(null);
// 32880
f974244559_519.returns.push(null);
// 32886
f974244559_519.returns.push(null);
// 32892
f974244559_519.returns.push(null);
// 32898
f974244559_519.returns.push(null);
// 32904
f974244559_519.returns.push(null);
// 32909
o8.JSBNG__screenX = 540;
// 32910
o8.JSBNG__screenY = 531;
// 32911
o8.altKey = false;
// 32912
o8.bubbles = true;
// 32913
o8.button = 0;
// 32914
o8.buttons = void 0;
// 32915
o8.cancelable = false;
// 32916
o8.clientX = 523;
// 32917
o8.clientY = 427;
// 32918
o8.ctrlKey = false;
// 32919
o8.currentTarget = o0;
// 32920
o8.defaultPrevented = false;
// 32921
o8.detail = 0;
// 32922
o8.eventPhase = 3;
// 32923
o8.isTrusted = void 0;
// 32924
o8.metaKey = false;
// 32925
o8.pageX = 523;
// 32926
o8.pageY = 427;
// 32927
o8.relatedTarget = null;
// 32928
o8.fromElement = null;
// 32931
o8.shiftKey = false;
// 32934
o8.timeStamp = 1373491309099;
// 32935
o8.type = "mousemove";
// 32936
o8.view = ow974244559;
// undefined
o8 = null;
// 32945
f974244559_2566.returns.push(undefined);
// 32948
f974244559_14.returns.push(undefined);
// 32949
f974244559_12.returns.push(130);
// 32953
f974244559_471.returns.push(1373491309144);
// 32954
o47.getAttribute = f974244559_500;
// undefined
o47 = null;
// 32955
f974244559_500.returns.push("1373168110");
// 32957
f974244559_500.returns.push(null);
// 32958
o55.getAttribute = f974244559_500;
// undefined
o55 = null;
// 32959
f974244559_500.returns.push("1373214256");
// 32961
f974244559_500.returns.push(null);
// 32962
o56.getAttribute = f974244559_500;
// undefined
o56 = null;
// 32963
f974244559_500.returns.push("1373214355");
// 32965
f974244559_500.returns.push(null);
// 32966
o57.getAttribute = f974244559_500;
// undefined
o57 = null;
// 32967
f974244559_500.returns.push("1373214375");
// 32969
f974244559_500.returns.push(null);
// 32970
o59.getAttribute = f974244559_500;
// undefined
o59 = null;
// 32971
f974244559_500.returns.push("1372985540");
// 32973
f974244559_500.returns.push(null);
// 32974
o60.getAttribute = f974244559_500;
// undefined
o60 = null;
// 32975
f974244559_500.returns.push("1373002430");
// 32977
f974244559_500.returns.push(null);
// 32978
o61.getAttribute = f974244559_500;
// undefined
o61 = null;
// 32979
f974244559_500.returns.push("1373066508");
// 32981
f974244559_500.returns.push(null);
// 32982
o62.getAttribute = f974244559_500;
// undefined
o62 = null;
// 32983
f974244559_500.returns.push("1373066594");
// 32985
f974244559_500.returns.push(null);
// 32986
o51.getAttribute = f974244559_500;
// undefined
o51 = null;
// 32987
f974244559_500.returns.push("1372275695");
// 32989
f974244559_500.returns.push(null);
// 32990
o52.getAttribute = f974244559_500;
// undefined
o52 = null;
// 32991
f974244559_500.returns.push("1372275736");
// 32993
f974244559_500.returns.push(null);
// 32994
o53.getAttribute = f974244559_500;
// undefined
o53 = null;
// 32995
f974244559_500.returns.push("1372275825");
// 32997
f974244559_500.returns.push(null);
// 32998
o54.getAttribute = f974244559_500;
// undefined
o54 = null;
// 32999
f974244559_500.returns.push("1372275890");
// 33001
f974244559_500.returns.push(null);
// undefined
fo974244559_1_cookie.returns.push("c_user=100006118350059; csm=2; sub=268435456");
// 33003
o8 = {};
// 33009
// 33011
o9 = {};
// 33014
f974244559_1728.returns.push(undefined);
// 33015
o9.cancelBubble = false;
// undefined
fo974244559_1_cookie.returns.push("c_user=100006118350059; csm=2; sub=268435456");
// 33019
// 33021
o9.returnValue = true;
// undefined
o9 = null;
// 33022
// 0
JSBNG_Replay$ = function(real, cb) { if (!real) return;
// 987
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: \"69.171.242.27\",\n    www_base: \"http://jsbngssl.www.facebook.com/\",\n    fb_dtsg: \"AQCttlPQ\",\n    ajaxpipe_token: \"AXg1MJsj67jxFeGx\",\n    lhsh: \"AAQGnORMT\",\n    tracking_domain: \"http://jsbngssl.pixel.facebook.com\",\n    retry_ajax_on_network_error: \"1\",\n    fbid_emoticons: \"1\"\n});");
// 988
geval("envFlush({\n    eagleEyeConfig: {\n        seed: \"0KqC\",\n        JSBNG__sessionStorage: true\n    }\n});\nCavalryLogger = false;");
// 989
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        function fa() {\n            return y(da, this, arguments, null, ea);\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 = ((window.top.JSBNG_Replay.push)((window.top.JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_166), 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(((window.top.JSBNG_Replay.push)((window.top.JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_169), 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, 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: function() {\n            return ((v() || k));\n        },\n        safari: function() {\n            return w.webkit();\n        },\n        chrome: 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});");
// 1027
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o7,"(window.Bootloader && Bootloader.done([\"FHcQn\",]));");
// 1028
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o7,"s1ec9de22962c463704debb06fba6d985fa278804");
// 1029
geval("((window.Bootloader && Bootloader.done([\"FHcQn\",])));");
// 1030
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o7,"Bootloader.loadEarlyResources({\n    OJTM4: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yd/r/-z4vUS8jrpA.js\"\n    },\n    KPZ5T: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yy/r/lUdBiFiT5WF.js\"\n    },\n    AyUu6: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yF/r/pmYy9aLa5q_.js\"\n    }\n});");
// 1031
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o7,"sd09f96795fe3d45f3ee8b15c8b39018f5cc6971d");
// 1032
geval("Bootloader.loadEarlyResources({\n    OJTM4: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yd/r/-z4vUS8jrpA.js\"\n    },\n    KPZ5T: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yy/r/lUdBiFiT5WF.js\"\n    },\n    AyUu6: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yF/r/pmYy9aLa5q_.js\"\n    }\n});");
// 1089
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o7,"");
// 1090
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o7,"sda39a3ee5e6b4b0d3255bfef95601890afd80709");
// 1091
geval("");
// 1092
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o7,"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});");
// 1093
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o7,"sbc7df7f6bb75d7e29414a7bf76d7afea4393a8e7");
// 1094
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});");
// 1121
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o7,"function ea75eb5ad8aaea24ab24ebf43517fa9f8f28a5e83(event) {\n    (window.Toggler && Toggler.hide());\n};");
// 1122
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o7,"s2d2f3176d7753da10c34c3bb177bec59b83cb469");
// 1123
geval("function ea75eb5ad8aaea24ab24ebf43517fa9f8f28a5e83(JSBNG__event) {\n    ((window.Toggler && Toggler.hide()));\n};\n;");
// 1124
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o7,"function e830f288e6a8cbf22e8abb986c6e089c5659271c8(event) {\n    return run_with(this, [\"min-notifications-jewel\",], function() {\n        MinNotifications.bootstrap(this);\n    });\n};");
// 1125
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o7,"s228e7ad8d8b34d9189383f1ee1f8ebc5e264b2c7");
// 1126
geval("function e830f288e6a8cbf22e8abb986c6e089c5659271c8(JSBNG__event) {\n    return run_with(this, [\"min-notifications-jewel\",], function() {\n        MinNotifications.bootstrap(this);\n    });\n};\n;");
// 1127
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o7,"function ef343163437e1e36e64320973e11ec4fd294199b8(event) {\n    return ((window.Event && Event.__inlineSubmit) && Event.__inlineSubmit(this, event));\n};");
// 1128
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o7,"sf00410e00f99092f4a1d19a9b07b9e421c5c3098");
// 1129
geval("function ef343163437e1e36e64320973e11ec4fd294199b8(JSBNG__event) {\n    return ((((window.JSBNG__Event && JSBNG__Event.__inlineSubmit)) && JSBNG__Event.__inlineSubmit(this, JSBNG__event)));\n};\n;");
// 1130
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o7,"function e6b9ee6e4c720411e5cc90c2e8a27e3f011d2ca03(event) {\n    var q = $(\"q\");\n    if ((q.value == q.getAttribute(\"placeholder\"))) {\n        q.focus();\n        return false;\n    }\n;\n};");
// 1131
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o7,"s79e165899c0a8b35dcda3e0eed5a77113507cc2a");
// 1132
geval("function e6b9ee6e4c720411e5cc90c2e8a27e3f011d2ca03(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;");
// 1133
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o7,"function e1763d39821c50954838c23c263a833cf3c220233(event) {\n    $(\"search_first_focus\").value = ($(\"search_first_focus\").value || +new Date());\n;\n    Bootloader.loadComponents(\"SearchBootloader\", emptyFunction);\n};");
// 1134
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o7,"sb457412c7c4a82cfb7d83a81e772662d119d7357");
// 1135
geval("function e1763d39821c50954838c23c263a833cf3c220233(JSBNG__event) {\n    $(\"search_first_focus\").value = (($(\"search_first_focus\").value || +new JSBNG__Date()));\n;\n    Bootloader.loadComponents(\"SearchBootloader\", emptyFunction);\n};\n;");
// 1136
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o7,"function e48ad00ab516f01e319fbed724390d12b75b18f19(event) {\n    var q = $(\"q\");\n    if ((q.value == q.getAttribute(\"placeholder\"))) {\n        q.focus();\n        return false;\n    }\n;\n};");
// 1137
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o7,"sad3e60e6ef313246af33ee4c857063d0e186372c");
// 1138
geval("function e48ad00ab516f01e319fbed724390d12b75b18f19(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;");
// 1139
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o7,"function ed96a7469491d024c399c3c2140634dee18c29dbb(event) {\n    Arbiter.inform(\"PagesVoiceBar/toggle\");\n};");
// 1140
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o7,"sccff236b67446ab7470d818242ee08d410ef28af");
// 1141
geval("function ed96a7469491d024c399c3c2140634dee18c29dbb(JSBNG__event) {\n    Arbiter.inform(\"PagesVoiceBar/toggle\");\n};\n;");
// 1142
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o7,"function ed5b9a1e17754cdecbed0d4ced66ccc11999b694d(event) {\n    return ((window.Event && Event.__inlineSubmit) && Event.__inlineSubmit(this, event));\n};");
// 1143
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o7,"s790f8f81fa1c06d1398ea01a4fd11cfcc38d38ed");
// 1144
geval("function ed5b9a1e17754cdecbed0d4ced66ccc11999b694d(JSBNG__event) {\n    return ((((window.JSBNG__Event && JSBNG__Event.__inlineSubmit)) && JSBNG__Event.__inlineSubmit(this, JSBNG__event)));\n};\n;");
// 1145
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o7,"function si_cj(m) {\n    setTimeout(function() {\n        new Image().src = ((\"http://jsbngssl.error.facebook.com/common/scribe_endpoint.php?c=si_clickjacking&t=8127\" + \"&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 \");\n    } catch (e) {\n        si_cj(\"1 \\u0009\");\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;");
// 1146
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o7,"s02f69967dd897bcff2d1e3395259ebba55e85d4d");
// 1147
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=8127\" + \"&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 \");\n    } catch (e) {\n        si_cj(\"1 \\u0009\");\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;");
// 1148
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o7,"Bootloader.setResourceMap({\n    VDymv: {\n        type: \"css\",\n        permanent: 1,\n        crossOrigin: 1,\n        src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/y5/r/vs3UafVWckq.css\"\n    },\n    \"X/Fq6\": {\n        type: \"css\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.fbstatic-a.akamaihd.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.fbstatic-a.akamaihd.net/rsrc.php/v2/yr/r/18Su5nrioMP.css\"\n    },\n    ZtiRu: {\n        type: \"css\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yR/r/CXfPMMHwvvH.css\"\n    },\n    aQ3gA: {\n        type: \"css\",\n        permanent: 1,\n        crossOrigin: 1,\n        src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yi/r/4f32cuKS2xy.css\"\n    },\n    ynBUm: {\n        type: \"css\",\n        permanent: 1,\n        crossOrigin: 1,\n        src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yD/r/OWwnO_yMqhK.css\"\n    },\n    vFtag: {\n        type: \"css\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yS/r/AXbdtQOFsWr.css\"\n    },\n    cy4a0: {\n        type: \"css\",\n        permanent: 1,\n        crossOrigin: 1,\n        src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/y5/r/WlCdxJgZUKg.css\"\n    },\n    xqZGj: {\n        type: \"css\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yb/r/tOU0wFcLVo_.css\"\n    },\n    W3Ky6: {\n        type: \"css\",\n        permanent: 1,\n        crossOrigin: 1,\n        src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yk/r/TvSvrZCKhi2.css\"\n    },\n    yagwf: {\n        type: \"css\",\n        permanent: 1,\n        crossOrigin: 1,\n        src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yO/r/M-qAxLB_sZh.css\"\n    }\n});\nBootloader.setResourceMap({\n    cNca2: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yv/r/OHUUx9tXXmr.js\"\n    },\n    oE4Do: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yq/r/MDwOqV08JHh.js\"\n    },\n    C3MER: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yP/r/hnJRUTuHHeP.js\"\n    },\n    AyUu6: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yF/r/pmYy9aLa5q_.js\"\n    },\n    \"+h1d2\": {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yo/r/0gMMCDzw75A.js\"\n    },\n    h9fqQ: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yF/r/FmIXX_SfTzh.js\"\n    },\n    \"63VzN\": {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/ye/r/v9y92rsUvEH.js\"\n    },\n    \"wxq+C\": {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/y7/r/HXOT2PHhPzY.js\"\n    },\n    MqSmz: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yH/r/ghlEJgSKAee.js\"\n    },\n    tIw4R: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yq/r/ztXltT1LKGv.js\"\n    },\n    pR9EP: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yE/r/jKneATMaMne.js\"\n    },\n    AtxWD: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yU/r/RXieOTwv9ZN.js\"\n    },\n    qu1rX: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/ym/r/5vdmAFTChHH.js\"\n    },\n    \"4vv8/\": {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/y4/r/VctjjLR0rnO.js\"\n    },\n    KPZ5T: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yy/r/lUdBiFiT5WF.js\"\n    },\n    C6rJk: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yk/r/mvmvxDKTeL4.js\"\n    },\n    \"xO/k5\": {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yB/r/fQIoBRZLBHX.js\"\n    },\n    H42Jh: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/y3/r/ppwOo4BAmlb.js\"\n    },\n    bwsMw: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/y_/r/hwOyT9fmfZV.js\"\n    },\n    Pc0ie: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yu/r/aUem8WpGyly.js\"\n    },\n    hfrQl: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/y7/r/MX9CLuapN6V.js\"\n    },\n    OJTM4: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yd/r/-z4vUS8jrpA.js\"\n    },\n    AsDOA: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yg/r/4CJ_klaVGHP.js\"\n    },\n    zyFOp: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yA/r/HAFtXNlDnG9.js\"\n    },\n    \"u//Ut\": {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yn/r/-5WtOV0lZ_r.js\"\n    },\n    bUzfU: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yz/r/CVXUroaYxOH.js\"\n    },\n    hofTc: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yP/r/EKA5EzGo0o5.js\"\n    },\n    Rs18G: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/ys/r/t80qJDlUD7e.js\"\n    },\n    EzMPG: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yr/r/r-aTsS_RKim.js\"\n    },\n    \"LpC/l\": {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yC/r/3O1MmhNwV3-.js\"\n    },\n    brbS1: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/y1/r/-lwVuunZG1z.js\"\n    },\n    \"/vuZw\": {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yC/r/yXqVwx5GyZ4.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    AjaxPipeRequest: {\n        resources: [\"AyUu6\",\"AsDOA\",],\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    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    \"legacy:link-rel-preload\": {\n        resources: [\"AyUu6\",]\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});");
// 1149
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o7,"s4ad4029b5e856b7e9e2bf9caa5692c3f880512f5");
// 1150
geval("Bootloader.setResourceMap({\n    VDymv: {\n        type: \"css\",\n        permanent: 1,\n        crossOrigin: 1,\n        src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/y5/r/vs3UafVWckq.css\"\n    },\n    \"X/Fq6\": {\n        type: \"css\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.fbstatic-a.akamaihd.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.fbstatic-a.akamaihd.net/rsrc.php/v2/yr/r/18Su5nrioMP.css\"\n    },\n    ZtiRu: {\n        type: \"css\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yR/r/CXfPMMHwvvH.css\"\n    },\n    aQ3gA: {\n        type: \"css\",\n        permanent: 1,\n        crossOrigin: 1,\n        src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yi/r/4f32cuKS2xy.css\"\n    },\n    ynBUm: {\n        type: \"css\",\n        permanent: 1,\n        crossOrigin: 1,\n        src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yD/r/OWwnO_yMqhK.css\"\n    },\n    vFtag: {\n        type: \"css\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yS/r/AXbdtQOFsWr.css\"\n    },\n    cy4a0: {\n        type: \"css\",\n        permanent: 1,\n        crossOrigin: 1,\n        src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/y5/r/WlCdxJgZUKg.css\"\n    },\n    xqZGj: {\n        type: \"css\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yb/r/tOU0wFcLVo_.css\"\n    },\n    W3Ky6: {\n        type: \"css\",\n        permanent: 1,\n        crossOrigin: 1,\n        src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yk/r/TvSvrZCKhi2.css\"\n    },\n    yagwf: {\n        type: \"css\",\n        permanent: 1,\n        crossOrigin: 1,\n        src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yO/r/M-qAxLB_sZh.css\"\n    }\n});\nBootloader.setResourceMap({\n    cNca2: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yv/r/OHUUx9tXXmr.js\"\n    },\n    oE4Do: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yq/r/MDwOqV08JHh.js\"\n    },\n    C3MER: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yP/r/hnJRUTuHHeP.js\"\n    },\n    AyUu6: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yF/r/pmYy9aLa5q_.js\"\n    },\n    \"+h1d2\": {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yo/r/0gMMCDzw75A.js\"\n    },\n    h9fqQ: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yF/r/FmIXX_SfTzh.js\"\n    },\n    \"63VzN\": {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/ye/r/v9y92rsUvEH.js\"\n    },\n    \"wxq+C\": {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/y7/r/HXOT2PHhPzY.js\"\n    },\n    MqSmz: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yH/r/ghlEJgSKAee.js\"\n    },\n    tIw4R: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yq/r/ztXltT1LKGv.js\"\n    },\n    pR9EP: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yE/r/jKneATMaMne.js\"\n    },\n    AtxWD: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yU/r/RXieOTwv9ZN.js\"\n    },\n    qu1rX: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/ym/r/5vdmAFTChHH.js\"\n    },\n    \"4vv8/\": {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/y4/r/VctjjLR0rnO.js\"\n    },\n    KPZ5T: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yy/r/lUdBiFiT5WF.js\"\n    },\n    C6rJk: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yk/r/mvmvxDKTeL4.js\"\n    },\n    \"xO/k5\": {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yB/r/fQIoBRZLBHX.js\"\n    },\n    H42Jh: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/y3/r/ppwOo4BAmlb.js\"\n    },\n    bwsMw: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/y_/r/hwOyT9fmfZV.js\"\n    },\n    Pc0ie: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yu/r/aUem8WpGyly.js\"\n    },\n    hfrQl: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/y7/r/MX9CLuapN6V.js\"\n    },\n    OJTM4: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yd/r/-z4vUS8jrpA.js\"\n    },\n    AsDOA: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yg/r/4CJ_klaVGHP.js\"\n    },\n    zyFOp: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yA/r/HAFtXNlDnG9.js\"\n    },\n    \"u//Ut\": {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yn/r/-5WtOV0lZ_r.js\"\n    },\n    bUzfU: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yz/r/CVXUroaYxOH.js\"\n    },\n    hofTc: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yP/r/EKA5EzGo0o5.js\"\n    },\n    Rs18G: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/ys/r/t80qJDlUD7e.js\"\n    },\n    EzMPG: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yr/r/r-aTsS_RKim.js\"\n    },\n    \"LpC/l\": {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yC/r/3O1MmhNwV3-.js\"\n    },\n    brbS1: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/y1/r/-lwVuunZG1z.js\"\n    },\n    \"/vuZw\": {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yC/r/yXqVwx5GyZ4.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    AjaxPipeRequest: {\n        resources: [\"AyUu6\",\"AsDOA\",],\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    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    \"legacy:link-rel-preload\": {\n        resources: [\"AyUu6\",]\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});");
// 1151
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o7,"require(\"InitialJSLoader\").loadOnDOMContentReady([\"AyUu6\",\"OJTM4\",\"KPZ5T\",\"AsDOA\",\"63VzN\",\"4vv8/\",\"u//Ut\",\"hfrQl\",\"C6rJk\",]);");
// 1152
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o7,"s64e75ee044a462ca968ff449d6732ef3a2cbafdb");
// 1153
geval("require(\"InitialJSLoader\").loadOnDOMContentReady([\"AyUu6\",\"OJTM4\",\"KPZ5T\",\"AsDOA\",\"63VzN\",\"4vv8/\",\"u//Ut\",\"hfrQl\",\"C6rJk\",]);");
// 1155
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o7,"Bootloader.configurePage([\"W3Ky6\",\"0duP3\",\"ZtiRu\",\"aQ3gA\",\"vFtag\",\"ynBUm\",\"xqZGj\",\"yagwf\",]);\nBootloader.done([\"jDr+c\",]);\nJSCC.init(({\n    j1QNRR7i8ax0yUao4H0: 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: \"1\",\n        spacerImage: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/y4/r/-PAXP-deijE.gif\"\n    },],],],[\"ScriptPath\",\"set\",[],[\"/profile_book.php\",\"98f03730\",],],[\"ClickRefLogger\",],[\"userAction\",\"setUATypeConfig\",[],[{\n        \"ua:n\": false,\n        \"ua:i\": false,\n        \"ua:d\": false,\n        \"ua:e\": false\n    },],],[\"ScriptPathState\",\"setUserURISampleRate\",[],[1077,],],[\"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\",[],[1373491278,],],[\"MessagingReliabilityLogger\",],[\"SidebarPrelude\",\"addSidebarMode\",[],[1225,],],[\"Quickling\",],[\"TinyViewport\",],[\"WebStorageMonster\",\"schedule\",[],[false,],],[\"AsyncRequestNectarLogging\",],[\"ViewasChromeBar\",\"initChromeBar\",[\"m_0_0\",],[{\n        __m: \"m_0_0\"\n    },],],[\"PagesVoiceBar\",\"initVoiceBar\",[],[],],[\"TypeaheadSearchBrowseUpsell\",\"registerForm\",[\"m_0_1\",],[{\n        __m: \"m_0_1\"\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_3\",],[{\n        __m: \"m_0_3\"\n    },],],[\"MercuryJewel\",],[\"TitanLeftNav\",\"initialize\",[],[],],[\"m_0_6\",],[\"Typeahead\",\"init\",[\"m_0_7\",\"m_0_6\",\"TypeaheadExcludeBootstrapFromQueryCache\",\"TypeaheadSearchBrowseUpsell\",\"TypeaheadDetectQueryLocale\",],[{\n        __m: \"m_0_7\"\n    },{\n        __m: \"m_0_6\"\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_4\",],[\"ChatOpenTab\",\"listenOpenEmptyTab\",[\"m_0_c\",],[{\n        __m: \"m_0_c\"\n    },],],[\"Scrollable\",],[\"m_0_e\",],[\"m_0_b\",],[\"WebStorageMonster\",\"registerLogoutForm\",[\"m_0_g\",],[{\n        __m: \"m_0_g\"\n    },[\"^Banzai$\",\"^\\\\:userchooser\\\\:osessusers$\",\"^[0-9]+:powereditor:\",\"^[0-9]+:page_insights:\",\"^_SocialFoxExternal_machineid$\",\"^_SocialFoxExternal_LoggedInBefore$\",\"^_socialfox_worker_enabled$\",],],],[\"m_0_j\",],[\"m_0_l\",],[\"m_0_m\",],[\"PrivacyLiteNUXController\",\"init\",[\"m_0_m\",],[{\n        dialog: {\n            __m: \"m_0_m\"\n        },\n        sectionID: \"who_can_see\",\n        subsectionID: \"plite_activity_log\",\n        showOnExpand: true\n    },],],[\"m_0_o\",],[\"PrivacyLiteFlyout\",\"registerFinalReminderFlyout\",[\"m_0_o\",],[{\n        __m: \"m_0_o\"\n    },],],[\"PrivacyLiteFlyout\",\"registerFlyoutToggler\",[\"m_0_q\",\"m_0_r\",],[{\n        __m: \"m_0_q\"\n    },{\n        __m: \"m_0_r\"\n    },],],[\"Primer\",],[\"m_0_x\",],],\n    instances: [[\"m_0_6\",[\"Typeahead\",\"m_0_9\",\"SearchTypeaheadView\",\"SearchTypeaheadRenderer\",\"m_0_7\",\"SearchTypeaheadCore\",\"m_0_8\",],[{\n        __m: \"m_0_9\"\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_7\"\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_8\"\n    },],4,],[\"m_0_4\",[\"JewelX\",\"m_0_a\",],[{\n        __m: \"m_0_a\"\n    },{\n        name: \"mercurymessages\"\n    },],2,],[\"m_0_e\",[\"ScrollableArea\",\"m_0_d\",],[{\n        __m: \"m_0_d\"\n    },{\n        persistent: true\n    },],1,],[\"m_0_b\",[\"JewelX\",\"m_0_f\",],[{\n        __m: \"m_0_f\"\n    },{\n        name: \"requests\"\n    },],2,],[\"m_0_j\",[\"JewelX\",\"m_0_i\",],[{\n        __m: \"m_0_i\"\n    },{\n        name: \"notifications\"\n    },],1,],[\"m_0_l\",[\"ScrollableArea\",\"m_0_k\",],[{\n        __m: \"m_0_k\"\n    },{\n        persistent: true\n    },],1,],[\"m_0_m\",[\"ContextualDialog\",\"ContextualDialogArrow\",\"ContextualDialogDefaultTheme\",\"LayerRemoveOnHide\",\"LayerHideOnTransition\",\"LayerFadeOnShow\",\"m_0_n\",],[{\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_n\"\n    },],3,],[\"m_0_o\",[\"ContextualDialog\",\"ContextualDialogArrow\",\"ContextualDialogDefaultTheme\",\"LayerRemoveOnHide\",\"LayerDestroyOnHide\",\"LayerHideOnTransition\",\"LayerFadeOnShow\",\"ContextualLayerAutoFlip\",\"DialogHideOnSuccess\",\"m_0_p\",],[{\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_p\"\n    },],3,],[\"m_0_x\",[\"PrivacyLiteFlyoutHelp\",\"m_0_s\",\"m_0_t\",\"m_0_u\",\"m_0_v\",\"m_0_w\",],[{\n        __m: \"m_0_s\"\n    },{\n        __m: \"m_0_t\"\n    },{\n        __m: \"m_0_u\"\n    },{\n        __m: \"m_0_v\"\n    },{\n        __m: \"m_0_w\"\n    },],1,],[\"m_0_9\",[\"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: 1373491278,\n        enabledQueryCache: true,\n        queryExactMatch: false,\n        enabledHashtag: true\n    },],2,],[\"m_0_y\",[\"XHPTemplate\",\"m_0_14\",],[{\n        __m: \"m_0_14\"\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,],],\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_y\",\"m_0_z\",],{\n        \":fb:mercury:attachment-indicator\": {\n            __m: \"m_0_y\"\n        },\n        \":fb:mercury:attachment-icon-text\": {\n            __m: \"m_0_z\"\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_10\",],{\n        \":fb:mercury:jewel:threadlist-row\": {\n            __m: \"m_0_10\"\n        }\n    },39,],[\"MercuryStatusTemplates\",[\"m_0_11\",\"m_0_12\",\"m_0_13\",],{\n        \":fb:mercury:resend-indicator\": {\n            __m: \"m_0_11\"\n        },\n        \":fb:mercury:filtered-message\": {\n            __m: \"m_0_12\"\n        },\n        \":fb:mercury:error-indicator\": {\n            __m: \"m_0_13\"\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: 10848,\n        image_url: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yF/r/irmqzCEvUpb.png\"\n    },146,],],\n    elements: [[\"m_0_2\",\"u_0_1\",2,\"m_0_1\",],[\"m_0_8\",\"u_0_2\",2,],[\"m_0_7\",\"u_0_3\",4,],[\"m_0_a\",\"fbMessagesJewel\",2,],[\"m_0_c\",\"u_0_4\",2,],[\"m_0_d\",\"MercuryJewelThreadList\",2,],[\"m_0_f\",\"fbRequestsJewel\",2,],[\"m_0_g\",\"logout_form\",2,],[\"m_0_i\",\"fbNotificationsJewel\",2,],[\"m_0_k\",\"u_0_5\",2,],[\"m_0_r\",\"u_0_8\",2,],[\"m_0_w\",\"u_0_9\",2,],[\"m_0_t\",\"u_0_a\",2,],[\"m_0_v\",\"u_0_b\",2,],[\"m_0_5\",\"navSearch\",2,],[\"m_0_q\",\"u_0_7\",2,],[\"m_0_u\",\"u_0_c\",2,],[\"m_0_s\",\"u_0_d\",2,],[\"m_0_3\",\"u_0_e\",2,],[\"m_0_h\",\"logout_form\",2,],[\"m_0_0\",\"u_0_f\",2,],],\n    markup: [[\"m_0_1\",{\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_n\",{\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.fbstatic-a.akamaihd.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_p\",{\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.fbstatic-a.akamaihd.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_14\",{\n        __html: \"\\u003Ci class=\\\"mrs MercuryThreadlistIcon img sp_2gr8ms sx_22d5af\\\"\\u003E\\u003C/i\\u003E\"\n    },2,],[\"m_0_15\",{\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_16\",{\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.fbexternal-a.akamaihd.net/safe_image.php?d=AQD8Nn8D0yyraIdI&amp;url=https%3A%2F%2Ffbstatic-a.akamaihd.net%2Frsrc.php%2Fv2%2Fyw%2Fr%2FdrP8vlvSl_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_17\",{\n        __html: \"\\u003Cdiv class=\\\"_542d\\\"\\u003E\\u003Cimg class=\\\"img\\\" src=\\\"http://jsbngssl.fbstatic-a.akamaihd.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_18\",{\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_19\",{\n        __html: \"\\u003Cdiv class=\\\"_542d\\\"\\u003E\\u003Cimg class=\\\"img\\\" src=\\\"http://jsbngssl.fbstatic-a.akamaihd.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_4\"), {\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_6\").getData().onLoad(false, true);\n});\nonloadRegister_DEPRECATED(function() {\n    window.presenceRequests = JSCC.get(\"j1QNRR7i8ax0yUao4H0\").init(require(\"m_0_b\"), \"[fb]requests\", false);\n});\nonloadRegister_DEPRECATED(function() {\n    window.presenceNotifications = new Notifications({\n        updateTime: 1373491278000,\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([\"legacy:link-rel-preload\",], function() {\n        link_rel_preload();\n    });\n});");
// 1156
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o7,"s7d69d1300480c076a19d2cade30894fd648724a1");
// 1157
geval("Bootloader.configurePage([\"W3Ky6\",\"0duP3\",\"ZtiRu\",\"aQ3gA\",\"vFtag\",\"ynBUm\",\"xqZGj\",\"yagwf\",]);\nBootloader.done([\"jDr+c\",]);\nJSCC.init(({\n    j1QNRR7i8ax0yUao4H0: 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: \"1\",\n        spacerImage: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/y4/r/-PAXP-deijE.gif\"\n    },],],],[\"ScriptPath\",\"set\",[],[\"/profile_book.php\",\"98f03730\",],],[\"ClickRefLogger\",],[\"userAction\",\"setUATypeConfig\",[],[{\n        \"ua:n\": false,\n        \"ua:i\": false,\n        \"ua:d\": false,\n        \"ua:e\": false\n    },],],[\"ScriptPathState\",\"setUserURISampleRate\",[],[1077,],],[\"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\",[],[1373491278,],],[\"MessagingReliabilityLogger\",],[\"SidebarPrelude\",\"addSidebarMode\",[],[1225,],],[\"Quickling\",],[\"TinyViewport\",],[\"WebStorageMonster\",\"schedule\",[],[false,],],[\"AsyncRequestNectarLogging\",],[\"ViewasChromeBar\",\"initChromeBar\",[\"m_0_0\",],[{\n        __m: \"m_0_0\"\n    },],],[\"PagesVoiceBar\",\"initVoiceBar\",[],[],],[\"TypeaheadSearchBrowseUpsell\",\"registerForm\",[\"m_0_1\",],[{\n        __m: \"m_0_1\"\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_3\",],[{\n        __m: \"m_0_3\"\n    },],],[\"MercuryJewel\",],[\"TitanLeftNav\",\"initialize\",[],[],],[\"m_0_6\",],[\"Typeahead\",\"init\",[\"m_0_7\",\"m_0_6\",\"TypeaheadExcludeBootstrapFromQueryCache\",\"TypeaheadSearchBrowseUpsell\",\"TypeaheadDetectQueryLocale\",],[{\n        __m: \"m_0_7\"\n    },{\n        __m: \"m_0_6\"\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_4\",],[\"ChatOpenTab\",\"listenOpenEmptyTab\",[\"m_0_c\",],[{\n        __m: \"m_0_c\"\n    },],],[\"Scrollable\",],[\"m_0_e\",],[\"m_0_b\",],[\"WebStorageMonster\",\"registerLogoutForm\",[\"m_0_g\",],[{\n        __m: \"m_0_g\"\n    },[\"^Banzai$\",\"^\\\\:userchooser\\\\:osessusers$\",\"^[0-9]+:powereditor:\",\"^[0-9]+:page_insights:\",\"^_SocialFoxExternal_machineid$\",\"^_SocialFoxExternal_LoggedInBefore$\",\"^_socialfox_worker_enabled$\",],],],[\"m_0_j\",],[\"m_0_l\",],[\"m_0_m\",],[\"PrivacyLiteNUXController\",\"init\",[\"m_0_m\",],[{\n        dialog: {\n            __m: \"m_0_m\"\n        },\n        sectionID: \"who_can_see\",\n        subsectionID: \"plite_activity_log\",\n        showOnExpand: true\n    },],],[\"m_0_o\",],[\"PrivacyLiteFlyout\",\"registerFinalReminderFlyout\",[\"m_0_o\",],[{\n        __m: \"m_0_o\"\n    },],],[\"PrivacyLiteFlyout\",\"registerFlyoutToggler\",[\"m_0_q\",\"m_0_r\",],[{\n        __m: \"m_0_q\"\n    },{\n        __m: \"m_0_r\"\n    },],],[\"Primer\",],[\"m_0_x\",],],\n    instances: [[\"m_0_6\",[\"Typeahead\",\"m_0_9\",\"SearchTypeaheadView\",\"SearchTypeaheadRenderer\",\"m_0_7\",\"SearchTypeaheadCore\",\"m_0_8\",],[{\n        __m: \"m_0_9\"\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_7\"\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_8\"\n    },],4,],[\"m_0_4\",[\"JewelX\",\"m_0_a\",],[{\n        __m: \"m_0_a\"\n    },{\n        JSBNG__name: \"mercurymessages\"\n    },],2,],[\"m_0_e\",[\"ScrollableArea\",\"m_0_d\",],[{\n        __m: \"m_0_d\"\n    },{\n        persistent: true\n    },],1,],[\"m_0_b\",[\"JewelX\",\"m_0_f\",],[{\n        __m: \"m_0_f\"\n    },{\n        JSBNG__name: \"requests\"\n    },],2,],[\"m_0_j\",[\"JewelX\",\"m_0_i\",],[{\n        __m: \"m_0_i\"\n    },{\n        JSBNG__name: \"notifications\"\n    },],1,],[\"m_0_l\",[\"ScrollableArea\",\"m_0_k\",],[{\n        __m: \"m_0_k\"\n    },{\n        persistent: true\n    },],1,],[\"m_0_m\",[\"ContextualDialog\",\"ContextualDialogArrow\",\"ContextualDialogDefaultTheme\",\"LayerRemoveOnHide\",\"LayerHideOnTransition\",\"LayerFadeOnShow\",\"m_0_n\",],[{\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_n\"\n    },],3,],[\"m_0_o\",[\"ContextualDialog\",\"ContextualDialogArrow\",\"ContextualDialogDefaultTheme\",\"LayerRemoveOnHide\",\"LayerDestroyOnHide\",\"LayerHideOnTransition\",\"LayerFadeOnShow\",\"ContextualLayerAutoFlip\",\"DialogHideOnSuccess\",\"m_0_p\",],[{\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_p\"\n    },],3,],[\"m_0_x\",[\"PrivacyLiteFlyoutHelp\",\"m_0_s\",\"m_0_t\",\"m_0_u\",\"m_0_v\",\"m_0_w\",],[{\n        __m: \"m_0_s\"\n    },{\n        __m: \"m_0_t\"\n    },{\n        __m: \"m_0_u\"\n    },{\n        __m: \"m_0_v\"\n    },{\n        __m: \"m_0_w\"\n    },],1,],[\"m_0_9\",[\"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: 1373491278,\n        enabledQueryCache: true,\n        queryExactMatch: false,\n        enabledHashtag: true\n    },],2,],[\"m_0_y\",[\"XHPTemplate\",\"m_0_14\",],[{\n        __m: \"m_0_14\"\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,],],\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_y\",\"m_0_z\",],{\n        \":fb:mercury:attachment-indicator\": {\n            __m: \"m_0_y\"\n        },\n        \":fb:mercury:attachment-icon-text\": {\n            __m: \"m_0_z\"\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_10\",],{\n        \":fb:mercury:jewel:threadlist-row\": {\n            __m: \"m_0_10\"\n        }\n    },39,],[\"MercuryStatusTemplates\",[\"m_0_11\",\"m_0_12\",\"m_0_13\",],{\n        \":fb:mercury:resend-indicator\": {\n            __m: \"m_0_11\"\n        },\n        \":fb:mercury:filtered-message\": {\n            __m: \"m_0_12\"\n        },\n        \":fb:mercury:error-indicator\": {\n            __m: \"m_0_13\"\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: 10848,\n        image_url: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yF/r/irmqzCEvUpb.png\"\n    },146,],],\n    elements: [[\"m_0_2\",\"u_0_1\",2,\"m_0_1\",],[\"m_0_8\",\"u_0_2\",2,],[\"m_0_7\",\"u_0_3\",4,],[\"m_0_a\",\"fbMessagesJewel\",2,],[\"m_0_c\",\"u_0_4\",2,],[\"m_0_d\",\"MercuryJewelThreadList\",2,],[\"m_0_f\",\"fbRequestsJewel\",2,],[\"m_0_g\",\"logout_form\",2,],[\"m_0_i\",\"fbNotificationsJewel\",2,],[\"m_0_k\",\"u_0_5\",2,],[\"m_0_r\",\"u_0_8\",2,],[\"m_0_w\",\"u_0_9\",2,],[\"m_0_t\",\"u_0_a\",2,],[\"m_0_v\",\"u_0_b\",2,],[\"m_0_5\",\"navSearch\",2,],[\"m_0_q\",\"u_0_7\",2,],[\"m_0_u\",\"u_0_c\",2,],[\"m_0_s\",\"u_0_d\",2,],[\"m_0_3\",\"u_0_e\",2,],[\"m_0_h\",\"logout_form\",2,],[\"m_0_0\",\"u_0_f\",2,],],\n    markup: [[\"m_0_1\",{\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_n\",{\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.fbstatic-a.akamaihd.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_p\",{\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.fbstatic-a.akamaihd.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_14\",{\n        __html: \"\\u003Ci class=\\\"mrs MercuryThreadlistIcon img sp_2gr8ms sx_22d5af\\\"\\u003E\\u003C/i\\u003E\"\n    },2,],[\"m_0_15\",{\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_16\",{\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.fbexternal-a.akamaihd.net/safe_image.php?d=AQD8Nn8D0yyraIdI&amp;url=https%3A%2F%2Ffbstatic-a.akamaihd.net%2Frsrc.php%2Fv2%2Fyw%2Fr%2FdrP8vlvSl_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_17\",{\n        __html: \"\\u003Cdiv class=\\\"_542d\\\"\\u003E\\u003Cimg class=\\\"img\\\" src=\\\"http://jsbngssl.fbstatic-a.akamaihd.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_18\",{\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_19\",{\n        __html: \"\\u003Cdiv class=\\\"_542d\\\"\\u003E\\u003Cimg class=\\\"img\\\" src=\\\"http://jsbngssl.fbstatic-a.akamaihd.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_4\"), {\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_6\").getData().onLoad(false, true);\n});\nonloadRegister_DEPRECATED(function() {\n    window.presenceRequests = JSCC.get(\"j1QNRR7i8ax0yUao4H0\").init(require(\"m_0_b\"), \"[fb]requests\", false);\n});\nonloadRegister_DEPRECATED(function() {\n    window.presenceNotifications = new Notifications({\n        updateTime: 1373491278000,\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([\"legacy:link-rel-preload\",], function() {\n        link_rel_preload();\n    });\n});");
// 1413
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o7,"var bigPipe = new (require(\"BigPipe\"))({\n    lid: 0,\n    forceFinish: true\n});");
// 1414
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o7,"se151abf45cd37f530e5c8a27b753d912bd1be56a");
// 1415
geval("var bigPipe = new (require(\"BigPipe\"))({\n    lid: 0,\n    forceFinish: true\n});");
// 1421
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o7,"bigPipe.onPageletArrive({\n    id: \"first_response\",\n    phase: 0,\n    jsmods: {\n    },\n    is_last: true,\n    css: [\"W3Ky6\",\"0duP3\",\"ZtiRu\",\"aQ3gA\",\"vFtag\",\"ynBUm\",\"xqZGj\",\"yagwf\",],\n    bootloadable: {\n    },\n    resource_map: {\n    },\n    js: [\"AyUu6\",\"OJTM4\",\"KPZ5T\",\"AsDOA\",\"63VzN\",\"4vv8/\",\"u//Ut\",\"hfrQl\",\"C6rJk\",]\n});");
// 1422
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o7,"s1ad89e51a19ecbfc25aaa045a400340da242a983");
// 1423
geval("bigPipe.onPageletArrive({\n    id: \"first_response\",\n    phase: 0,\n    jsmods: {\n    },\n    is_last: true,\n    css: [\"W3Ky6\",\"0duP3\",\"ZtiRu\",\"aQ3gA\",\"vFtag\",\"ynBUm\",\"xqZGj\",\"yagwf\",],\n    bootloadable: {\n    },\n    resource_map: {\n    },\n    js: [\"AyUu6\",\"OJTM4\",\"KPZ5T\",\"AsDOA\",\"63VzN\",\"4vv8/\",\"u//Ut\",\"hfrQl\",\"C6rJk\",]\n});");
// 1451
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o7,"bigPipe.onPageletArrive({\n    content: {\n        pagelet_timeline_main_column: {\n            container_id: \"u_0_g\"\n        }\n    },\n    jsmods: {\n        require: [[\"TimelineController\",\"init\",[],[\"1055580469\",\"timeline\",{\n            has_fixed_ads: false,\n            one_column_minimal: true\n        },],],]\n    },\n    bootloadable: {\n    },\n    resource_map: {\n        jsIYP: {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yJ/r/QYljgrU-Eo8.js\"\n        }\n    },\n    js: [\"AyUu6\",\"AsDOA\",\"jsIYP\",],\n    id: \"pagelet_timeline_main_column\",\n    phase: 1\n});");
// 1452
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o7,"s7a57a026e0294fc8f995c6d150d1e11aba9f190c");
// 1453
geval("bigPipe.onPageletArrive({\n    JSBNG__content: {\n        pagelet_timeline_main_column: {\n            container_id: \"u_0_g\"\n        }\n    },\n    jsmods: {\n        require: [[\"TimelineController\",\"init\",[],[\"1055580469\",\"timeline\",{\n            has_fixed_ads: false,\n            one_column_minimal: true\n        },],],]\n    },\n    bootloadable: {\n    },\n    resource_map: {\n        jsIYP: {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yJ/r/QYljgrU-Eo8.js\"\n        }\n    },\n    js: [\"AyUu6\",\"AsDOA\",\"jsIYP\",],\n    id: \"pagelet_timeline_main_column\",\n    phase: 1\n});");
// 1500
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o7,"bigPipe.onPageletArrive({\n    display_dependency: [\"pagelet_timeline_main_column\",],\n    content: {\n        pagelet_main_column_personal: {\n            container_id: \"u_0_n\"\n        }\n    },\n    jsmods: {\n        require: [[\"TimelineContentLoader\",\"registerTimePeriod\",[\"m_0_1a\",],[{\n            __m: \"m_0_1a\"\n        },\"recent\",{\n            profile_id: 1055580469,\n            start: 0,\n            end: 1375340399,\n            query_type: 39,\n            section_pagelet_id: \"pagelet_timeline_recent\",\n            load_immediately: true\n        },true,null,0,-1,],],[\"TimelineCoverCollapse\",\"collapse\",[\"m_0_1b\",],[{\n            __m: \"m_0_1b\"\n        },160,],],[\"m_0_1c\",],[\"m_0_1e\",],[\"m_0_1f\",],[\"m_0_1h\",],[\"m_0_1i\",],[\"m_0_1l\",],[\"PhotoSnowlift\",\"initWithSpotlight\",[\"m_0_1l\",],[{\n            __m: \"m_0_1l\"\n        },{\n            refresh_fast: true,\n            refresh_rate: 20000,\n            hw_rendering: false,\n            pivot_hover: false,\n            pivot_end_metric: false,\n            pagers_on_keyboard_nav: false,\n            og_videos: false,\n            snowlift_profile_pic_cropper: false,\n            product_collections_visible: false,\n            snowlift_hover_shows_all_tags_and_faces: true,\n            resize_comments_for_ads: false,\n            snowlift_redesign: false,\n            min_ads: 2\n        },],],[\"PhotoSnowlift\",\"touch\",[\"m_0_1k\",],[{\n            __m: \"m_0_1k\"\n        },],],],\n        instances: [[\"m_0_1c\",[\"TimelineCover\",\"m_0_1b\",],[{\n            __m: \"m_0_1b\"\n        },{\n            cover_height: 315,\n            cover_width: 851\n        },],1,],[\"m_0_1e\",[\"TimelineNavLight\",\"m_0_1d\",],[{\n            __m: \"m_0_1d\"\n        },],1,],[\"m_0_1f\",[\"PopoverLoadingMenu\",\"MenuTheme\",],[{\n            theme: {\n                __m: \"MenuTheme\"\n            }\n        },],3,],[\"m_0_1h\",[\"PopoverAsyncMenu\",\"m_0_1i\",\"m_0_1g\",\"m_0_1f\",\"PopoverMenuShowOnHover\",],[{\n            __m: \"m_0_1i\"\n        },{\n            __m: \"m_0_1g\"\n        },{\n            __m: \"m_0_1f\"\n        },\"/ajax/timeline/collections/nav_light_dropdown_menu/?profileid=1055580469&offset=3\",[{\n            __m: \"PopoverMenuShowOnHover\"\n        },],],1,],[\"m_0_1i\",[\"Popover\",\"m_0_1j\",\"m_0_1g\",],[{\n            __m: \"m_0_1j\"\n        },{\n            __m: \"m_0_1g\"\n        },[],{\n            alignh: \"left\"\n        },],3,],[\"m_0_1l\",[\"Spotlight\",\"LayerHideOnBlur\",\"LayerHideOnEscape\",\"m_0_1m\",],[{\n            addedBehaviors: [{\n                __m: \"LayerHideOnBlur\"\n            },{\n                __m: \"LayerHideOnEscape\"\n            },],\n            attributes: {\n                id: \"photos_snowlift\",\n                tabindex: \"0\",\n                role: \"region\",\n                \"aria-label\": \"Facebook Photo Theater\",\n                \"aria-busy\": \"true\"\n            },\n            classNames: [\"fbPhotoSnowlift\",\"fbxPhoto\",]\n        },{\n            __m: \"m_0_1m\"\n        },],3,],],\n        elements: [[\"m_0_1a\",\"pagelet_timeline_recent\",2,],[\"m_0_1b\",\"u_0_h\",4,],[\"m_0_1d\",\"u_0_i\",2,],[\"m_0_1j\",\"u_0_j\",2,],[\"m_0_1g\",\"u_0_k\",4,],[\"m_0_1n\",\"u_0_m\",2,\"m_0_1m\",],],\n        markup: [[\"m_0_1m\",{\n            __html: \"\\u003Cdiv class=\\\"_n3\\\"\\u003E\\u003Cdiv class=\\\"fbPhotoSnowliftContainer uiContextualLayerParent\\\" data-ft=\\\"&#123;&quot;type&quot;:44&#125;\\\"\\u003E\\u003Cdiv class=\\\"clearfix fbPhotoSnowliftPopup\\\"\\u003E\\u003Cdiv class=\\\"stageWrapper lfloat\\\"\\u003E\\u003Cdiv class=\\\"fbPhotoSnowliftFullScreen fullScreenSwitch\\\" id=\\\"fullScreenSwitch\\\"\\u003E\\u003Ca data-hover=\\\"tooltip\\\" aria-label=\\\"Enter Fullscreen\\\" data-tooltip-position=\\\"below\\\" data-tooltip-alignh=\\\"right\\\" href=\\\"#\\\" id=\\\"fbPhotoSnowliftFullScreenSwitch\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003Ca data-hover=\\\"tooltip\\\" aria-label=\\\"Press Esc to exit fullscreen\\\" data-tooltip-position=\\\"below\\\" data-tooltip-alignh=\\\"right\\\" href=\\\"#\\\" id=\\\"fbPhotoSnowliftFullScreenClose\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"stage\\\"\\u003E\\u003Cdiv class=\\\"fbPhotosCornerWantButton\\\" id=\\\"fbPhotoSnowliftWantButton\\\"\\u003E\\u003C/div\\u003E\\u003Cimg class=\\\"spotlight spotlight\\\" src=\\\"/images/spacer.gif\\\" /\\u003E\\u003Cdiv class=\\\"fbPhotosPhotoTagboxes tagContainer\\\" id=\\\"fbPhotoSnowliftTagBoxes\\\"\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"fbPhotoTagApproval\\\" id=\\\"fbPhotoSnowliftTagApproval\\\"\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"_5bai\\\" id=\\\"fbPhotoSnowliftComputerVisionInfo\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"videoStage\\\"\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"stageActions\\\" id=\\\"snowliftStageActions\\\"\\u003E\\u003Cdiv class=\\\"clearfix snowliftOverlay snowliftOverlayBar rightButtons\\\"\\u003E\\u003Cdiv class=\\\"overlayBarButtons rfloat\\\"\\u003E\\u003Cdiv class=\\\"_6a _6b fbPhotosPhotoActions\\\" id=\\\"fbPhotoSnowliftActions\\\"\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"fbPhotosPhotoButtons\\\" id=\\\"fbPhotoSnowliftButtons\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"mediaTitleInfo\\\"\\u003E\\u003Cdiv class=\\\"mediaTitleBoxFlex\\\"\\u003E\\u003Cdiv id=\\\"fbPhotoSnowliftMediaTitle\\\"\\u003E\\u003C/div\\u003E\\u003Cspan class=\\\"mlm hidden_elem\\\" id=\\\"fbPhotoSnowliftPositionAndCount\\\"\\u003E\\u003C/span\\u003E\\u003Cdiv class=\\\"mediaTitleInfoSpacer\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"fbPhotosPhotoTagboxBase newTagBox hidden_elem\\\" style=\\\"\\\"\\u003E\\u003Cdiv class=\\\"borderTagBox\\\"\\u003E\\u003Cdiv class=\\\"innerTagBox\\\"\\u003E\\u003Cdiv class=\\\"ieContentFix\\\"\\u003E\\u00a0\\u00a0\\u00a0\\u00a0\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"tag\\\" style=\\\"\\\"\\u003E\\u003Cdiv class=\\\"tagPointer\\\"\\u003E\\u003Ci class=\\\"tagArrow img sp_9kaae3 sx_883a69\\\"\\u003E\\u003C/i\\u003E\\u003Cdiv class=\\\"tagName\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Ca class=\\\"snowliftPager prev\\\" title=\\\"Previous\\\"\\u003E\\u003Ci\\u003E\\u003C/i\\u003E\\u003C/a\\u003E\\u003Ca class=\\\"snowliftPager next\\\" title=\\\"Next\\\"\\u003E\\u003Ci\\u003E\\u003C/i\\u003E\\u003C/a\\u003E\\u003Cdiv class=\\\"photoError stageError\\\" id=\\\"fbPhotoSnowliftError\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"rhc photoUfiContainer\\\"\\u003E\\u003Cdiv class=\\\"rhcHeader\\\"\\u003E\\u003Cdiv class=\\\"fbPhotoSnowliftControls\\\"\\u003E\\u003Ca data-hover=\\\"tooltip\\\" aria-label=\\\"Press Esc to close\\\" data-tooltip-position=\\\"below\\\" data-tooltip-alignh=\\\"right\\\" class=\\\"closeTheater\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003Ca data-hover=\\\"tooltip\\\" aria-label=\\\"Press Esc to exit fullscreen\\\" data-tooltip-position=\\\"below\\\" data-tooltip-alignh=\\\"right\\\" class=\\\"closeTheater fullscreenCommentClose\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/div\\u003E\\u003Cdiv id=\\\"fbPhotoSnowliftInlineEditor\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cform rel=\\\"async\\\" class=\\\"fbPhotosSnowliftFeedbackForm rhcBody commentable_item autoexpand_mode\\\" method=\\\"post\\\" action=\\\"/ajax/ufi/modify.php\\\" onsubmit=\\\"return window.Event &amp;&amp; Event.__inlineSubmit &amp;&amp; Event.__inlineSubmit(this,event)\\\" id=\\\"u_0_m\\\"\\u003E\\u003Cinput type=\\\"hidden\\\" name=\\\"charset_test\\\" value=\\\"&euro;,&acute;,\\u20ac,\\u00b4,\\u6c34,\\u0414,\\u0404\\\" /\\u003E\\u003Cinput type=\\\"hidden\\\" name=\\\"fb_dtsg\\\" value=\\\"AQCttlPQ\\\" autocomplete=\\\"off\\\" /\\u003E\\u003Cdiv class=\\\"uiScrollableArea rhcScroller native\\\" style=\\\"width:285px;\\\"\\u003E\\u003Cdiv class=\\\"uiScrollableAreaWrap scrollable\\\" aria-label=\\\"Scrollable region\\\" tabindex=\\\"0\\\"\\u003E\\u003Cdiv class=\\\"uiScrollableAreaBody\\\"\\u003E\\u003Cdiv class=\\\"uiScrollableAreaContent\\\"\\u003E\\u003Cspan id=\\\"fbPhotoSnowliftSpecificAudience\\\"\\u003E\\u003C/span\\u003E\\u003Cdiv class=\\\"clearfix fbPhotoSnowliftAuthorInfo\\\"\\u003E\\u003Cdiv class=\\\"lfloat\\\" id=\\\"fbPhotoSnowliftAuthorPic\\\"\\u003E\\u003C/div\\u003E\\u003Cdiv\\u003E\\u003Cdiv class=\\\"fbPhotoContributorName\\\" id=\\\"fbPhotoSnowliftAuthorName\\\"\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"mrs fsm fwn fcg\\\"\\u003E\\u003Cspan id=\\\"fbPhotoSnowliftSubscribe\\\"\\u003E\\u003C/span\\u003E\\u003Cspan id=\\\"fbPhotoSnowliftTimestamp\\\"\\u003E\\u003C/span\\u003E\\u003Cdiv class=\\\"mls\\\" id=\\\"fbPhotoSnowliftAudienceSelector\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"fsm fwn fcg\\\"\\u003E\\u003Cdiv class=\\\"fbPhotosOnProfile\\\" id=\\\"fbPhotoSnowliftOnProfile\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cspan id=\\\"fbPhotoSnowliftViewOnApp\\\"\\u003E\\u003C/span\\u003E\\u003Cspan id=\\\"fbPhotoSnowliftUseApp\\\"\\u003E\\u003C/span\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv\\u003E\\u003Cspan class=\\\"fbPhotosPhotoCaption\\\" tabindex=\\\"0\\\" aria-live=\\\"polite\\\" data-ft=\\\"&#123;&quot;type&quot;:45&#125;\\\" id=\\\"fbPhotoSnowliftCaption\\\"\\u003E\\u003C/span\\u003E\\u003Cspan class=\\\"fbPhotoTagList\\\" id=\\\"fbPhotoSnowliftTagList\\\"\\u003E\\u003C/span\\u003E\\u003Cdiv class=\\\"fbPhotoPagesTagList\\\" id=\\\"fbPhotoSnowliftPagesTagList\\\"\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"pts fbPhotoLegacyTagList\\\" id=\\\"fbPhotoSnowliftLegacyTagList\\\"\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"fbPhotosPhotoOwnerButtons stat_elem\\\" id=\\\"fbPhotoSnowliftOwnerButtons\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"fbPhotosSnowliftFeedback\\\" id=\\\"fbPhotoSnowliftFeedback\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"fbPhotosSnowboxFeedbackInput\\\" id=\\\"fbPhotoSnowliftFeedbackInput\\\"\\u003E\\u003C/div\\u003E\\u003C/form\\u003E\\u003Cdiv class=\\\"fbPhotosSnowliftProductMetadata\\\"\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"_5ciw rhcFooter\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv id=\\\"pagelet_photo_viewer_init\\\" class=\\\"hidden_elem\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },3,],[\"m_0_1k\",{\n            __html: \"\\u003Cdiv\\u003E\\u003C/div\\u003E\"\n        },2,],]\n    },\n    css: [\"ZtiRu\",\"W3Ky6\",\"OoPZI\",\"0duP3\",],\n    bootloadable: {\n        PhotoCropper: {\n            resources: [\"AyUu6\",\"AsDOA\",\"W3Ky6\",\"+h1d2\",\"Pc0ie\",\"0duP3\",\"h9fqQ\",],\n            \"module\": true\n        }\n    },\n    resource_map: {\n        \"3SGVa\": {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yg/r/5QLY1f97RlL.js\"\n        },\n        OoPZI: {\n            type: \"css\",\n            permanent: 1,\n            crossOrigin: 1,\n            src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/y3/r/brsbz78y8Q6.css\"\n        }\n    },\n    js: [\"AyUu6\",\"AsDOA\",\"jsIYP\",\"3SGVa\",\"OJTM4\",\"+h1d2\",],\n    displayJS: [\"AyUu6\",],\n    id: \"pagelet_main_column_personal\",\n    phase: 1\n});");
// 1501
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o7,"scfbf12eed6ea85773331aa9d172f6e2f76f3b6a3");
// 1502
geval("bigPipe.onPageletArrive({\n    display_dependency: [\"pagelet_timeline_main_column\",],\n    JSBNG__content: {\n        pagelet_main_column_personal: {\n            container_id: \"u_0_n\"\n        }\n    },\n    jsmods: {\n        require: [[\"TimelineContentLoader\",\"registerTimePeriod\",[\"m_0_1a\",],[{\n            __m: \"m_0_1a\"\n        },\"recent\",{\n            profile_id: 1055580469,\n            start: 0,\n            end: 1375340399,\n            query_type: 39,\n            section_pagelet_id: \"pagelet_timeline_recent\",\n            load_immediately: true\n        },true,null,0,-1,],],[\"TimelineCoverCollapse\",\"collapse\",[\"m_0_1b\",],[{\n            __m: \"m_0_1b\"\n        },160,],],[\"m_0_1c\",],[\"m_0_1e\",],[\"m_0_1f\",],[\"m_0_1h\",],[\"m_0_1i\",],[\"m_0_1l\",],[\"PhotoSnowlift\",\"initWithSpotlight\",[\"m_0_1l\",],[{\n            __m: \"m_0_1l\"\n        },{\n            refresh_fast: true,\n            refresh_rate: 20000,\n            hw_rendering: false,\n            pivot_hover: false,\n            pivot_end_metric: false,\n            pagers_on_keyboard_nav: false,\n            og_videos: false,\n            snowlift_profile_pic_cropper: false,\n            product_collections_visible: false,\n            snowlift_hover_shows_all_tags_and_faces: true,\n            resize_comments_for_ads: false,\n            snowlift_redesign: false,\n            min_ads: 2\n        },],],[\"PhotoSnowlift\",\"touch\",[\"m_0_1k\",],[{\n            __m: \"m_0_1k\"\n        },],],],\n        instances: [[\"m_0_1c\",[\"TimelineCover\",\"m_0_1b\",],[{\n            __m: \"m_0_1b\"\n        },{\n            cover_height: 315,\n            cover_width: 851\n        },],1,],[\"m_0_1e\",[\"TimelineNavLight\",\"m_0_1d\",],[{\n            __m: \"m_0_1d\"\n        },],1,],[\"m_0_1f\",[\"PopoverLoadingMenu\",\"MenuTheme\",],[{\n            theme: {\n                __m: \"MenuTheme\"\n            }\n        },],3,],[\"m_0_1h\",[\"PopoverAsyncMenu\",\"m_0_1i\",\"m_0_1g\",\"m_0_1f\",\"PopoverMenuShowOnHover\",],[{\n            __m: \"m_0_1i\"\n        },{\n            __m: \"m_0_1g\"\n        },{\n            __m: \"m_0_1f\"\n        },\"/ajax/timeline/collections/nav_light_dropdown_menu/?profileid=1055580469&offset=3\",[{\n            __m: \"PopoverMenuShowOnHover\"\n        },],],1,],[\"m_0_1i\",[\"Popover\",\"m_0_1j\",\"m_0_1g\",],[{\n            __m: \"m_0_1j\"\n        },{\n            __m: \"m_0_1g\"\n        },[],{\n            alignh: \"left\"\n        },],3,],[\"m_0_1l\",[\"Spotlight\",\"LayerHideOnBlur\",\"LayerHideOnEscape\",\"m_0_1m\",],[{\n            addedBehaviors: [{\n                __m: \"LayerHideOnBlur\"\n            },{\n                __m: \"LayerHideOnEscape\"\n            },],\n            attributes: {\n                id: \"photos_snowlift\",\n                tabindex: \"0\",\n                role: \"region\",\n                \"aria-label\": \"Facebook Photo Theater\",\n                \"aria-busy\": \"true\"\n            },\n            classNames: [\"fbPhotoSnowlift\",\"fbxPhoto\",]\n        },{\n            __m: \"m_0_1m\"\n        },],3,],],\n        elements: [[\"m_0_1a\",\"pagelet_timeline_recent\",2,],[\"m_0_1b\",\"u_0_h\",4,],[\"m_0_1d\",\"u_0_i\",2,],[\"m_0_1j\",\"u_0_j\",2,],[\"m_0_1g\",\"u_0_k\",4,],[\"m_0_1n\",\"u_0_m\",2,\"m_0_1m\",],],\n        markup: [[\"m_0_1m\",{\n            __html: \"\\u003Cdiv class=\\\"_n3\\\"\\u003E\\u003Cdiv class=\\\"fbPhotoSnowliftContainer uiContextualLayerParent\\\" data-ft=\\\"&#123;&quot;type&quot;:44&#125;\\\"\\u003E\\u003Cdiv class=\\\"clearfix fbPhotoSnowliftPopup\\\"\\u003E\\u003Cdiv class=\\\"stageWrapper lfloat\\\"\\u003E\\u003Cdiv class=\\\"fbPhotoSnowliftFullScreen fullScreenSwitch\\\" id=\\\"fullScreenSwitch\\\"\\u003E\\u003Ca data-hover=\\\"tooltip\\\" aria-label=\\\"Enter Fullscreen\\\" data-tooltip-position=\\\"below\\\" data-tooltip-alignh=\\\"right\\\" href=\\\"#\\\" id=\\\"fbPhotoSnowliftFullScreenSwitch\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003Ca data-hover=\\\"tooltip\\\" aria-label=\\\"Press Esc to exit fullscreen\\\" data-tooltip-position=\\\"below\\\" data-tooltip-alignh=\\\"right\\\" href=\\\"#\\\" id=\\\"fbPhotoSnowliftFullScreenClose\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"stage\\\"\\u003E\\u003Cdiv class=\\\"fbPhotosCornerWantButton\\\" id=\\\"fbPhotoSnowliftWantButton\\\"\\u003E\\u003C/div\\u003E\\u003Cimg class=\\\"spotlight spotlight\\\" src=\\\"/images/spacer.gif\\\" /\\u003E\\u003Cdiv class=\\\"fbPhotosPhotoTagboxes tagContainer\\\" id=\\\"fbPhotoSnowliftTagBoxes\\\"\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"fbPhotoTagApproval\\\" id=\\\"fbPhotoSnowliftTagApproval\\\"\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"_5bai\\\" id=\\\"fbPhotoSnowliftComputerVisionInfo\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"videoStage\\\"\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"stageActions\\\" id=\\\"snowliftStageActions\\\"\\u003E\\u003Cdiv class=\\\"clearfix snowliftOverlay snowliftOverlayBar rightButtons\\\"\\u003E\\u003Cdiv class=\\\"overlayBarButtons rfloat\\\"\\u003E\\u003Cdiv class=\\\"_6a _6b fbPhotosPhotoActions\\\" id=\\\"fbPhotoSnowliftActions\\\"\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"fbPhotosPhotoButtons\\\" id=\\\"fbPhotoSnowliftButtons\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"mediaTitleInfo\\\"\\u003E\\u003Cdiv class=\\\"mediaTitleBoxFlex\\\"\\u003E\\u003Cdiv id=\\\"fbPhotoSnowliftMediaTitle\\\"\\u003E\\u003C/div\\u003E\\u003Cspan class=\\\"mlm hidden_elem\\\" id=\\\"fbPhotoSnowliftPositionAndCount\\\"\\u003E\\u003C/span\\u003E\\u003Cdiv class=\\\"mediaTitleInfoSpacer\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"fbPhotosPhotoTagboxBase newTagBox hidden_elem\\\" style=\\\"\\\"\\u003E\\u003Cdiv class=\\\"borderTagBox\\\"\\u003E\\u003Cdiv class=\\\"innerTagBox\\\"\\u003E\\u003Cdiv class=\\\"ieContentFix\\\"\\u003E\\u00a0\\u00a0\\u00a0\\u00a0\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"tag\\\" style=\\\"\\\"\\u003E\\u003Cdiv class=\\\"tagPointer\\\"\\u003E\\u003Ci class=\\\"tagArrow img sp_9kaae3 sx_883a69\\\"\\u003E\\u003C/i\\u003E\\u003Cdiv class=\\\"tagName\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Ca class=\\\"snowliftPager prev\\\" title=\\\"Previous\\\"\\u003E\\u003Ci\\u003E\\u003C/i\\u003E\\u003C/a\\u003E\\u003Ca class=\\\"snowliftPager next\\\" title=\\\"Next\\\"\\u003E\\u003Ci\\u003E\\u003C/i\\u003E\\u003C/a\\u003E\\u003Cdiv class=\\\"photoError stageError\\\" id=\\\"fbPhotoSnowliftError\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"rhc photoUfiContainer\\\"\\u003E\\u003Cdiv class=\\\"rhcHeader\\\"\\u003E\\u003Cdiv class=\\\"fbPhotoSnowliftControls\\\"\\u003E\\u003Ca data-hover=\\\"tooltip\\\" aria-label=\\\"Press Esc to close\\\" data-tooltip-position=\\\"below\\\" data-tooltip-alignh=\\\"right\\\" class=\\\"closeTheater\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003Ca data-hover=\\\"tooltip\\\" aria-label=\\\"Press Esc to exit fullscreen\\\" data-tooltip-position=\\\"below\\\" data-tooltip-alignh=\\\"right\\\" class=\\\"closeTheater fullscreenCommentClose\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/div\\u003E\\u003Cdiv id=\\\"fbPhotoSnowliftInlineEditor\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cform rel=\\\"async\\\" class=\\\"fbPhotosSnowliftFeedbackForm rhcBody commentable_item autoexpand_mode\\\" method=\\\"post\\\" action=\\\"/ajax/ufi/modify.php\\\" onsubmit=\\\"return window.Event &amp;&amp; Event.__inlineSubmit &amp;&amp; Event.__inlineSubmit(this,event)\\\" id=\\\"u_0_m\\\"\\u003E\\u003Cinput type=\\\"hidden\\\" name=\\\"charset_test\\\" value=\\\"&euro;,&acute;,\\u20ac,\\u00b4,\\u6c34,\\u0414,\\u0404\\\" /\\u003E\\u003Cinput type=\\\"hidden\\\" name=\\\"fb_dtsg\\\" value=\\\"AQCttlPQ\\\" autocomplete=\\\"off\\\" /\\u003E\\u003Cdiv class=\\\"uiScrollableArea rhcScroller native\\\" style=\\\"width:285px;\\\"\\u003E\\u003Cdiv class=\\\"uiScrollableAreaWrap scrollable\\\" aria-label=\\\"Scrollable region\\\" tabindex=\\\"0\\\"\\u003E\\u003Cdiv class=\\\"uiScrollableAreaBody\\\"\\u003E\\u003Cdiv class=\\\"uiScrollableAreaContent\\\"\\u003E\\u003Cspan id=\\\"fbPhotoSnowliftSpecificAudience\\\"\\u003E\\u003C/span\\u003E\\u003Cdiv class=\\\"clearfix fbPhotoSnowliftAuthorInfo\\\"\\u003E\\u003Cdiv class=\\\"lfloat\\\" id=\\\"fbPhotoSnowliftAuthorPic\\\"\\u003E\\u003C/div\\u003E\\u003Cdiv\\u003E\\u003Cdiv class=\\\"fbPhotoContributorName\\\" id=\\\"fbPhotoSnowliftAuthorName\\\"\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"mrs fsm fwn fcg\\\"\\u003E\\u003Cspan id=\\\"fbPhotoSnowliftSubscribe\\\"\\u003E\\u003C/span\\u003E\\u003Cspan id=\\\"fbPhotoSnowliftTimestamp\\\"\\u003E\\u003C/span\\u003E\\u003Cdiv class=\\\"mls\\\" id=\\\"fbPhotoSnowliftAudienceSelector\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"fsm fwn fcg\\\"\\u003E\\u003Cdiv class=\\\"fbPhotosOnProfile\\\" id=\\\"fbPhotoSnowliftOnProfile\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cspan id=\\\"fbPhotoSnowliftViewOnApp\\\"\\u003E\\u003C/span\\u003E\\u003Cspan id=\\\"fbPhotoSnowliftUseApp\\\"\\u003E\\u003C/span\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv\\u003E\\u003Cspan class=\\\"fbPhotosPhotoCaption\\\" tabindex=\\\"0\\\" aria-live=\\\"polite\\\" data-ft=\\\"&#123;&quot;type&quot;:45&#125;\\\" id=\\\"fbPhotoSnowliftCaption\\\"\\u003E\\u003C/span\\u003E\\u003Cspan class=\\\"fbPhotoTagList\\\" id=\\\"fbPhotoSnowliftTagList\\\"\\u003E\\u003C/span\\u003E\\u003Cdiv class=\\\"fbPhotoPagesTagList\\\" id=\\\"fbPhotoSnowliftPagesTagList\\\"\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"pts fbPhotoLegacyTagList\\\" id=\\\"fbPhotoSnowliftLegacyTagList\\\"\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"fbPhotosPhotoOwnerButtons stat_elem\\\" id=\\\"fbPhotoSnowliftOwnerButtons\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"fbPhotosSnowliftFeedback\\\" id=\\\"fbPhotoSnowliftFeedback\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"fbPhotosSnowboxFeedbackInput\\\" id=\\\"fbPhotoSnowliftFeedbackInput\\\"\\u003E\\u003C/div\\u003E\\u003C/form\\u003E\\u003Cdiv class=\\\"fbPhotosSnowliftProductMetadata\\\"\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"_5ciw rhcFooter\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv id=\\\"pagelet_photo_viewer_init\\\" class=\\\"hidden_elem\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },3,],[\"m_0_1k\",{\n            __html: \"\\u003Cdiv\\u003E\\u003C/div\\u003E\"\n        },2,],]\n    },\n    css: [\"ZtiRu\",\"W3Ky6\",\"OoPZI\",\"0duP3\",],\n    bootloadable: {\n        PhotoCropper: {\n            resources: [\"AyUu6\",\"AsDOA\",\"W3Ky6\",\"+h1d2\",\"Pc0ie\",\"0duP3\",\"h9fqQ\",],\n            \"module\": true\n        }\n    },\n    resource_map: {\n        \"3SGVa\": {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yg/r/5QLY1f97RlL.js\"\n        },\n        OoPZI: {\n            type: \"css\",\n            permanent: 1,\n            crossOrigin: 1,\n            src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/y3/r/brsbz78y8Q6.css\"\n        }\n    },\n    js: [\"AyUu6\",\"AsDOA\",\"jsIYP\",\"3SGVa\",\"OJTM4\",\"+h1d2\",],\n    displayJS: [\"AyUu6\",],\n    id: \"pagelet_main_column_personal\",\n    phase: 1\n});");
// 1547
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o7,"if (self.CavalryLogger) {\n    CavalryLogger.start_js([\"AyUu6\",]);\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(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__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    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            for (var q in n) {\n                if ((n.hasOwnProperty(q) && (n[q] !== undefined))) {\n                    p.push(h(n[q], (o ? ((((o + \"[\") + q) + \"]\")) : q)));\n                };\n            };\n        }\n         else p.push(((i(o) + \"=\") + i(n)));\n        \n    ;\n        return p.join(\"&\");\n    };\n    function i(n) {\n        return encodeURIComponent(n).replace(/%5D/g, \"]\").replace(/%5B/g, \"[\");\n    };\n    var j = /^(\\w+)((?:\\[\\w*\\])+)=?(.*)/;\n    function k(n) {\n        if (!n) {\n            return {\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                        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                        x = x[(x.length - 1)];\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        return o;\n    };\n    function l(n) {\n        return decodeURIComponent(n.replace(/\\+/g, \" \"));\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        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        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        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        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        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        return true;\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.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        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        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        for (var p = 0, q = o.length; (p < q); ++p) {\n            delete this.$URIBase5[o[p]];;\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        if (this.$URIBase1) {\n            o += this.$URIBase1;\n        };\n        if (this.$URIBase2) {\n            o += (\":\" + this.$URIBase2);\n        };\n        if (this.$URIBase3) {\n            o += this.$URIBase3;\n        }\n         else if (o) {\n            o += \"/\";\n        }\n    ;\n        var p = g.serialize(this.$URIBase5);\n        if (p) {\n            o += (\"?\" + p);\n        };\n        if (this.$URIBase4) {\n            o += (\"#\" + this.$URIBase4);\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.location.href))\n        };\n        g.call(this, (l || \"\"));\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        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 = 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        if (this.isEmpty()) {\n            return false\n        };\n        if ((!this.getDomain() && !this.getProtocol())) {\n            return true\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        if (!this.isFacebookURI()) {\n            return null\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        return this;\n    };\n    k.prototype.isSameOrigin = function(l) {\n        var m = (l || window.location.href);\n        if (!((m instanceof k))) {\n            m = new k(m.toString());\n        };\n        if ((this.isEmpty() || m.isEmpty())) {\n            return false\n        };\n        if ((this.getProtocol() && (this.getProtocol() != m.getProtocol()))) {\n            return false\n        };\n        if ((this.getDomain() && (this.getDomain() != m.getDomain()))) {\n            return false\n        };\n        if ((this.getPort() && (this.getPort() != m.getPort()))) {\n            return false\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        return this.setDomain(m.join(\".\"));\n    };\n    k.prototype.getSubdomain = function() {\n        if (!this.getDomain()) {\n            return \"\"\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.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.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.location.href)\n        ;\n        },\n        expression: /(((\\w+):\\/\\/)([^\\/:]*)(:(\\d+))?)?([^#?]*)(\\?([^#]*))?(#(.*))?/,\n        arrayQueryExpression: /^(\\w+)((?:\\[\\w*\\])+)=?(.*)/,\n        explodeQuery: function(l) {\n            if (!l) {\n                return {\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                            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                            v = v[(v.length - 1)];\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            return m;\n        },\n        implodeQuery: function(l, m, n) {\n            m = (m || \"\");\n            if ((n === undefined)) {\n                n = true;\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                    } catch (q) {\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 for (var r in l) {\n                    try {\n                        if ((l[r] !== undefined)) {\n                            o.push(k.implodeQuery(l[r], (m ? ((((m + \"[\") + r) + \"]\")) : r), n));\n                        };\n                    } catch (q) {\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            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        this.uri = 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 Image();\n        if (n) {\n            p.onload = p.onerror = function() {\n                h.applyWithGuard(n, null, [(p.height == 1),]);\n            };\n        };\n        o.asyncSignal = ((((Math.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        for (var m = i.length; m--; ) {\n            k[i[m]] = (l ? j[m] : j);;\n        };\n        return k;\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    var n = {\n        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            var q = p.split(\" \"), r = [o,];\n            for (var s = 0; (s < q.length); s++) {\n                if ((r.length === 0)) {\n                    break;\n                };\n                if ((q[s] === \"\")) {\n                    continue;\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                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 (((document == r[ca]) || n.contains(r[ca], ba))) {\n                                v = [ba,];\n                                break;\n                            }\n                            \n                        ;\n                        }\n                    };\n                }\n                 else {\n                    var da = [], ea = r.length, fa, ga = ((!w && (u.indexOf(\"[\") < 0)) && 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                                ia = ia.parentNode;\n                            };\n                        }\n                         else if (ga) {\n                            fa = r[ha].querySelectorAll(u);\n                        }\n                         else fa = r[ha].getElementsByTagName(y);\n                        \n                    ;\n                        var ja = fa.length;\n                        for (var ka = 0; (ka < ja); ka++) {\n                            da.push(fa[ka]);;\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                                if (na) {\n                                    if (!g.hasClass(pa, oa)) {\n                                        delete da[ha];\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                                     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                    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                r = v;\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 = document.createElement(\"div\");\n                    l = ((p.textContent != null) ? \"textContent\" : \"innerText\");\n                }\n            ;\n                return o[l];\n            }\n             else return \"\"\n            \n        ;\n        },\n        getSelection: function() {\n            var o = window.getSelection, p = document.selection;\n            if (o) {\n                return (o() + \"\");\n            }\n             else if (p) {\n                return p.createRange().text\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(\"content\");\n            };\n            return (o || document.body);\n        },\n        isNode: function(o) {\n            return !!((o && (((typeof Node !== \"undefined\") ? (o instanceof 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 || 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    function j(l) {\n        var m = i(l);\n        return (g[m] || (g[m] = {\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            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            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            if ((((n !== undefined)) && ((p === undefined)))) {\n                p = o[m] = 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            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.event = (j || window.event);\n        h((typeof (this.event.srcElement) != \"unknown\"));\n        this.target = (this.event.target || this.event.srcElement);\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.event;\n            if (j.preventDefault) {\n                j.preventDefault();\n                if (!((\"defaultPrevented\" in j))) {\n                    j.defaultPrevented = true;\n                };\n            }\n             else j.returnValue = false;\n        ;\n            return this;\n        },\n        isDefaultPrevented: function() {\n            var j = this.event;\n            return (((\"defaultPrevented\" in j)) ? j.defaultPrevented : (j.returnValue === false));\n        },\n        stopPropagation: function() {\n            var j = this.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        for (var k in i) {\n            j.push(i[k]);;\n        };\n        return j;\n    };\n    e.exports = h;\n});\n__d(\"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.Event;\n    q.DATASTORE_KEY = \"Event.listeners\";\n    if (!q.prototype) {\n        q.prototype = {\n        };\n    };\n    function r(ca) {\n        if ((((ca.type === \"click\") || (ca.type === \"mouseover\")) || (ca.type === \"keydown\"))) {\n            g.inform(\"Event/stop\", {\n                event: ca\n            });\n        };\n    };\n    function s(ca, da, ea) {\n        this.target = ca;\n        this.type = da;\n        this.data = ea;\n    };\n    o(s.prototype, {\n        getData: function() {\n            this.data = (this.data || {\n            });\n            return this.data;\n        },\n        stop: function() {\n            return q.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        if (!ca) {\n            if ((!window.addEventListener && document.createEventObject)) {\n                ca = (window.event ? document.createEventObject(window.event) : {\n                });\n            }\n             else ca = {\n            };\n        \n        };\n        if (!ca._inherits_from_prototype) {\n            for (var da in q.prototype) {\n                try {\n                    ca[da] = q.prototype[da];\n                } catch (ea) {\n                \n                };\n            }\n        };\n        return ca;\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            return (this.button && (this.button === 2));\n        },\n        isMiddleClick: function() {\n            if (this.which) {\n                return (this.which === 2)\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            if ((typeof fa == \"undefined\")) {\n                fa = q.Priority.NORMAL;\n            };\n            if ((typeof da == \"object\")) {\n                var ga = {\n                };\n                for (var ha in da) {\n                    ga[ha] = q.listen(ca, ha, da[ha], fa);;\n                };\n                return ga;\n            }\n        ;\n            if (da.match(/^on/i)) {\n                throw new TypeError(((\"Bad event name `\" + da) + \"': use `click', not `onclick'.\"))\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 === \"scroll\"))) {\n                var ja = i.getDocumentScrollElement();\n                if (((ja !== document.documentElement) && (ja !== document.body))) {\n                    ca = ja;\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            z(ca, da);\n            var ma = ka[da];\n            if (!((fa in ma))) {\n                ma[fa] = [];\n            };\n            var na = ma[fa].length, oa = new ba(ea, ma[fa], na);\n            ma[fa].push(oa);\n            return oa;\n        },\n        stop: function(ca) {\n            var da = new j(ca).stopPropagation();\n            r(da.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.event);\n            return false;\n        },\n        getKeyCode: function(event) {\n            event = new j(event).event;\n            if (!event) {\n                return false\n            };\n            switch (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            if (event.shiftKey) {\n                switch (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            return 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            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                ca = ca.parentNode;\n            } while (((ca && (ga !== false)) && !fa.cancelBubble));\n            return (ga !== false);\n        },\n        __fire: function(ca, da, event) {\n            var ea = q.__getHandler(ca, da);\n            if (ea) {\n                return ea(t(event))\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).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    }, x;\n    if (!window.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    if (m.firefox()) {\n        var y = function(ca, event) {\n            event = t(event);\n            var da = event.getTarget();\n            while (da) {\n                q.__fire(da, ca, event);\n                da = da.parentNode;\n            };\n        };\n        document.documentElement.addEventListener(\"focus\", y.curry(\"focusin\"), true);\n        document.documentElement.addEventListener(\"blur\", y.curry(\"focusout\"), true);\n    }\n;\n    var z = function(ca, da) {\n        var ea = (\"on\" + da), fa = aa.bind(ca, da), ga = h.get(ca, v);\n        if ((da in ga)) {\n            return\n        };\n        ga[da] = {\n        };\n        if (ca.addEventListener) {\n            ca.addEventListener(da, fa, false);\n        }\n         else if (ca.attachEvent) {\n            ca.attachEvent(ea, fa);\n        }\n    ;\n        h.set(ca, (v + da), fa);\n        if (ca[ea]) {\n            var ha = ((ca === 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        if (((ca.nodeName === \"FORM\") && (da === \"submit\"))) {\n            q.listen(ca, da, q.__bubbleSubmit.curry(ca), q.Priority._BUBBLE);\n        };\n    }, aa = k.guard(function(ca, event) {\n        event = t(event);\n        if (!h.get(this, v)) {\n            throw new Error(\"Bad listenHandler context.\")\n        };\n        var da = h.get(this, v)[ca];\n        if (!da) {\n            throw new Error(((\"No registered handlers for `\" + ca) + \"'.\"))\n        };\n        if ((ca == \"click\")) {\n            var ea = l.byTag(event.getTarget(), \"a\");\n            if (window.userAction) {\n                var fa = window.userAction(\"evt_ext\", ea, event, {\n                    mode: \"DEDUP\"\n                }).uai_fallback(\"click\");\n                if (window.ArbiterMonitor) {\n                    window.ArbiterMonitor.initUA(fa, [ea,]);\n                };\n            }\n        ;\n            if (window.clickRefAction) {\n                window.clickRefAction(\"click\", ea, event);\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                    var la = ja[ka].fire(this, event);\n                    if ((la === false)) {\n                        return event.kill();\n                    }\n                     else if (event.cancelBubble) {\n                        event.stop();\n                    }\n                ;\n                };\n            }\n        ;\n        };\n        return 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    o(ba.prototype, {\n        remove: function() {\n            delete this._handler;\n            delete this._container[this._index];\n        },\n        fire: function(ca, event) {\n            return k.applyWithGuard(this._handler, ca, [event,], function(da) {\n                da.event_type = event.type;\n                da.dom_element = (ca.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        if (!h) {\n            return\n        };\n        var i = document.createElement(\"script\");\n        try {\n            i.appendChild(document.createTextNode(h));\n        } catch (j) {\n            i.text = h;\n        };\n        var k = (document.getElementsByTagName(\"head\")[0] || document.documentElement);\n        k.appendChild(i);\n        k.removeChild(i);\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        if (!((this instanceof m))) {\n            if ((n instanceof m)) {\n                return n\n            };\n            return new m(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    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            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 = document.createDocumentFragment();\n                for (var p = 0; (p < n.length); p++) {\n                    o.appendChild(n[p]);;\n                };\n                this._rootNode = o;\n            }\n        ;\n            return this._rootNode;\n        },\n        _fillCache: function() {\n            if ((null !== this._nodes)) {\n                return\n            };\n            var n = this._content;\n            if (!n) {\n                this._nodes = [];\n                return;\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 = 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            p.innerHTML = ((r[1] + n) + r[2]);\n            while (r[0]--) {\n                p = p.lastChild;;\n            };\n            if (q) {\n                p.removeChild(p.firstChild);\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                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            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            for (var w = (u.length - 1); (w >= 0); w--) {\n                u[w].parentNode.removeChild(u[w]);;\n            };\n            var x = function() {\n                for (var y = 0; (y < v.length); y++) {\n                    v[y]();;\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    e.exports = g;\n});\n__d(\"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        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    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            for (var m in g.patterns) {\n                var n = g.patterns[m];\n                for (var o in g.meta) {\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                k.push(m);\n                l.push(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        return j.replace(/\\x01/g, \"\");\n    };\n    e.exports = {\n        endsInPunct: h,\n        applyPhonologicalRules: i,\n        setPhonologicalRules: function(j) {\n            g = j;\n        }\n    };\n});\n__d(\"substituteTokens\", [\"invariant\",\"Intl\",], function(a, b, c, d, e, f) {\n    var g = b(\"invariant\"), h = b(\"Intl\");\n    function i(j, k) {\n        if (!k) {\n            return j\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            return (u + ((h.endsInPunct(u) ? \"\" : t)));\n        }).split(\"\\u0017\").map(h.applyPhonologicalRules);\n        if ((o.length === 1)) {\n            return o[0]\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        return p;\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        i = _string_table[i];\n        return g(i, j);\n    };\n    h._ = g;\n    e.exports = h;\n});\n__d(\"DOM\", [\"function-extensions\",\"DOMQuery\",\"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(\"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 = document.createElement(u);\n            if (v) {\n                r.setAttributes(x, v);\n            };\n            if ((w != null)) {\n                r.setContent(x, w);\n            };\n            return x;\n        },\n        setAttributes: function(u, v) {\n            if (v.type) {\n                u.type = v.type;\n            };\n            for (var w in v) {\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                 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        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        empty: function(u) {\n            u = k(u);\n            while (u.firstChild) {\n                r.remove(u.firstChild);;\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            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         else if (g.isTextNode(v)) {\n            v.data = u;\n            return [u,];\n        }\n        \n    ;\n        var z = document.createDocumentFragment(), aa, ba = [], ca = [];\n        if (!Array.isArray(u)) {\n            u = [u,];\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             else if (n(aa)) {\n                var ga = 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        w(z);\n        ca.forEach(function(ha) {\n            ha();\n        });\n        return ba;\n    };\n    function t(u) {\n        function v(w) {\n            return r.create(\"div\", {\n            }, w).innerHTML;\n        };\n        return function(w, x) {\n            var y = {\n            };\n            if (x) {\n                for (var z in x) {\n                    y[z] = v(x[z]);;\n                }\n            };\n            return i(u(w, y));\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            l.href = m;\n            if (n) {\n                i.remove(o);\n            };\n        },\n        referrer_log: function(l, m, n) {\n            var o = g(\"meta_referrer\");\n            o.content = \"origin\";\n            k.swap(l, m);\n            (function() {\n                o.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            document.cookie = (((((((((h + \"=\") + encodeURIComponent(i)) + \"; \") + ((j ? ((\"expires=\" + (new Date((Date.now() + j))).toGMTString()) + \"; \") : \"\"))) + \"path=\") + ((k || \"/\"))) + \"; domain=\") + window.location.hostname.replace(/^.*(\\.facebook\\..*)$/i, \"$1\")) + ((l ? \"; secure\" : \"\")));\n        },\n        clear: function(h, i) {\n            i = (i || \"/\");\n            document.cookie = (((((h + \"=; expires=Thu, 01-Jan-1970 00:00:01 GMT; \") + \"path=\") + i) + \"; domain=\") + window.location.hostname.replace(/^.*(\\.facebook\\..*)$/i, \"$1\"));\n        },\n        get: function(h) {\n            var i = 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        g.set(l, m, n, o, p);\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    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        document.documentElement.onmousedown = function(k) {\n            k = (k || window.event);\n            var l = (k.target || k.srcElement), m = h.byTag(l, \"A\");\n            if (!m) {\n                return\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            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            return;\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            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    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            } catch (m) {\n                alert(l);\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                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                alert(l);\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                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.sendErrorSignal(l, JSON.stringify(o));\n            }\n        ;\n        },\n        logErrorByGroup: function(l, m) {\n            if ((Math.floor((Math.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    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        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        k.toString = function() {\n            return (\"bound lazily: \" + h[i]);\n        };\n        return k;\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    e.exports = g;\n});\n__d(\"AsyncRequest\", [\"Arbiter\",\"AsyncResponse\",\"Bootloader\",\"CSS\",\"Env\",\"ErrorUtils\",\"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(\"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    function ha(pa) {\n        return (((\"upload\" in pa)) && ((\"onprogress\" in pa.upload)));\n    };\n    function ia(pa) {\n        return (\"withCredentials\" in pa);\n    };\n    function ja(pa) {\n        return (pa.status in {\n            0: 1,\n            12029: 1,\n            12030: 1,\n            12031: 1,\n            12152: 1\n        });\n    };\n    function ka(pa) {\n        var qa = (!pa || (typeof (pa) === \"function\"));\n        return qa;\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    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            var va = (p.byClass(qa, \"stat_elem\") || qa);\n            if ((va && j.hasClass(va, \"async_saving\"))) {\n                return false\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            if (va) {\n                wa.setStatusElement(va);\n                var xa = va.getAttribute(\"data-status-class\");\n                (xa && wa.setStatusClass(xa));\n            }\n        ;\n            if (qa) {\n                m.fire(qa, \"AsyncRequest/send\", {\n                    request: wa\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    x(na.prototype, {\n        _dispatchResponse: function(pa) {\n            this.clearStatusIndicator();\n            if (!this._isRelevant()) {\n                this._invokeErrorHandler(1010);\n                return;\n            }\n        ;\n            if ((this.initialHandler(pa) === false)) {\n                return\n            };\n            clearTimeout(this.timer);\n            if (pa.jscc_map) {\n                var qa = (eval)(pa.jscc_map);\n                o.init(qa);\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            if (!ra) {\n                this._handleJSResponse(pa);\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            if (sa) {\n                ta.handle(sa);\n            };\n            var va = function(wa) {\n                if ((ra && wa)) {\n                    wa.invoke(ra, qa);\n                };\n                if (ua) {\n                    ta.handle({\n                        require: ua\n                    });\n                };\n                this._handleJSRegisters(pa, \"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                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        _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        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            if (((!this.handler && !this.errorHandler) && !this.transportErrorHandler)) {\n                return\n            };\n            var qa = pa.asyncResponse;\n            if ((typeof (qa) !== \"undefined\")) {\n                if (!this._isRelevant()) {\n                    this._invokeErrorHandler(1010);\n                    return;\n                }\n            ;\n                if (qa.inlinejs) {\n                    z(qa.inlinejs);\n                };\n                if (qa.lid) {\n                    this._responseTime = Date.now();\n                    if (a.CavalryLogger) {\n                        this.cavalry = a.CavalryLogger.getInstance(qa.lid);\n                    };\n                    this.lid = qa.lid;\n                }\n            ;\n                if (qa.resource_map) {\n                    i.setResourceMap(qa.resource_map);\n                };\n                if (qa.bootloadable) {\n                    i.enableBootload(qa.bootloadable);\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                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                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             else this._invokeErrorHandler(1007);\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.status) || 1004);\n                } catch (ra) {\n                    qa = 1005;\n                };\n                if ((false === navigator.onLine)) {\n                    qa = 1006;\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                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            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            if (!this.transportErrorHandler) {\n                return\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: (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            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                clearTimeout(this.timer);\n                try {\n                    qa(pa);\n                } catch (ua) {\n                    this.finallyHandler(pa);\n                    throw ua;\n                };\n                this.finallyHandler(pa);\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            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                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                }.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        _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                } catch (ta) {\n                    sa = \"empty\";\n                    qa = {\n                        transportError: ta.message\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            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            var sa = 0;\n            while (((pa.charAt(sa) == \" \") || (pa.charAt(sa) == \"\\u000a\"))) {\n                sa++;;\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            var qa = new h(this);\n            if ((pa.__ar != 1)) {\n                qa.payload = pa;\n            }\n             else x(qa, pa);\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                    } catch (qa) {\n                    \n                    };\n                    if (((this.transport.status >= 200) && (this.transport.status < 300))) {\n                        na.lastSuccessTime = Date.now();\n                        this._handleXHRResponse(this.transport);\n                    }\n                     else if ((t.webkit() && ((typeof (this.transport.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                    if ((this.getOption(\"asynchronous\") !== false)) {\n                        delete this.transport;\n                    };\n                }\n            ;\n            } catch (pa) {\n                if (ga()) {\n                    return\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        _isMultiplexable: function() {\n            if ((this.getOption(\"jsonp\") || this.getOption(\"useIframeTransport\"))) {\n                return false\n            };\n            if (!this.uri.isFacebookURI()) {\n                return false\n            };\n            if (!this.getOption(\"asynchronous\")) {\n                return false\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            if ((typeof this.data.fb_dtsg !== \"string\")) {\n                return\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            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            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            if ((((!this._allowCrossOrigin && !this.getOption(\"jsonp\")) && !this.getOption(\"useIframeTransport\")) && !qa.isSameOrigin())) {\n                return this\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.location.href,\n                        aid: this.userActionID\n                    };\n                    ra.sendErrorSignal(\"async_error\", JSON.stringify(ta));\n                    ra.sendErrorSignal(\"async_xport_stack\", [1013,window.location.href,null,sa(),].join(\":\"));\n                }\n            ;\n                return this;\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            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            return this;\n        },\n        setErrorHandler: function(pa) {\n            if (ka(pa)) {\n                this.errorHandler = pa;\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            return this;\n        },\n        resetTimeout: function(pa) {\n            if (!((this.timeoutHandler === null))) {\n                if ((pa === null)) {\n                    this.timeout = null;\n                    clearTimeout(this.timer);\n                    this.timer = null;\n                }\n                 else {\n                    var qa = !this._allowCrossPageTransition;\n                    this.timeout = pa;\n                    clearTimeout(this.timer);\n                    this.timer = this._handleTimeout.bind(this).defer(this.timeout, qa);\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            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            if (!this.id) {\n                return true\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        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        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                return false;\n            }, this);\n        },\n        setOption: function(pa, qa) {\n            if ((typeof (this.option[pa]) != \"undefined\")) {\n                this.option[pa] = qa;\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            this.abortHandler();\n        },\n        abandon: function() {\n            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        setNectarData: function(pa) {\n            if (pa) {\n                if ((this.data.nctr === undefined)) {\n                    this.data.nctr = {\n                    };\n                };\n                x(this.data.nctr, pa);\n            }\n        ;\n            return this;\n        },\n        setNectarModuleDataSafe: function(pa) {\n            if (this.setNectarModuleData) {\n                this.setNectarModuleData(pa);\n            };\n            return this;\n        },\n        setNectarImpressionIdSafe: function() {\n            if (this.setNectarImpressionId) {\n                this.setNectarImpressionId();\n            };\n            return this;\n        },\n        setAllowCrossPageTransition: function(pa) {\n            this._allowCrossPageTransition = !!pa;\n            if (this.timer) {\n                this.resetTimeout(this.timeout);\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            (!this.errorHandler && !this.getOption(\"suppressErrorHandlerWarning\"));\n            if ((this.getOption(\"jsonp\") && (this.method != \"GET\"))) {\n                this.setMethod(\"GET\");\n            };\n            if ((this.getOption(\"useIframeTransport\") && (this.method != \"GET\"))) {\n                this.setMethod(\"GET\");\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            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            if (k.force_param) {\n                x(this.data, k.force_param);\n            };\n            this._setUserActionID();\n            if ((this.getOption(\"bundle\") && this._isMultiplexable())) {\n                oa.schedule(this);\n                return true;\n            }\n        ;\n            this.setNewSerial();\n            if (!this.getOption(\"asynchronous\")) {\n                this.uri.addQueryData({\n                    __s: 1\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            if (this.transport) {\n                return false\n            };\n            if ((this.getOption(\"jsonp\") || this.getOption(\"useIframeTransport\"))) {\n                d([\"JSONPTransport\",], function(va) {\n                    var wa = new va((this.getOption(\"jsonp\") ? \"jsonp\" : \"iframe\"), this.uri);\n                    this.setJSONPTransport(wa);\n                    wa.send();\n                }.bind(this));\n                return true;\n            }\n        ;\n            var sa = u.create();\n            if (!sa) {\n                return false\n            };\n            sa.onreadystatechange = v(this._onStateChange.bind(this), \"xhr\");\n            if ((this.uploadProgressHandler && ha(sa))) {\n                sa.upload.onprogress = this.uploadProgressHandler.bind(this);\n            };\n            if (!pa) {\n                this.remainingRetries = this.getOption(\"retries\");\n            };\n            if ((a.ErrorSignal || a.ArbiterMonitor)) {\n                this._sendTimeStamp = (this._sendTimeStamp || Date.now());\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            var ua = k.svn_rev;\n            if (ua) {\n                this.transport.setRequestHeader(\"X-SVN-Rev\", String(ua));\n            };\n            if (((!this.uri.isSameOrigin() && !this.getOption(\"jsonp\")) && !this.getOption(\"useIframeTransport\"))) {\n                if (!ia(this.transport)) {\n                    return false\n                };\n                if (this.uri.isFacebookURI()) {\n                    this.transport.withCredentials = true;\n                };\n            }\n        ;\n            if (((this.method == \"POST\") && !this.rawData)) {\n                this.transport.setRequestHeader(\"Content-Type\", \"application/x-www-form-urlencoded\");\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            na._inflightCount++;\n            na._inflightAdd(this);\n            return true;\n        }\n    });\n    function oa() {\n        this._requests = [];\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            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            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            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            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                sa.handleResponse(qa[ra][1]);\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        var l;\n        function m(n, o, p, q, r) {\n            m.reset();\n            l = setTimeout(function() {\n                h.call(j, n, o, p, q, r);\n            }, i, !k);\n        };\n        m.reset = function() {\n            clearTimeout(l);\n        };\n        return m;\n    };\n    e.exports = g;\n});\n__d(\"LitestandViewportHeight\", [\"Arbiter\",\"CSS\",\"Event\",\"cx\",\"debounce\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"CSS\"), i = b(\"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            if ((m === \"_4vcx\")) {\n                return n.LARGE\n            };\n            return n.NORMAL;\n        },\n        init: function(o) {\n            n.init = l;\n            var p = k(function() {\n                var q = 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                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            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 || document.documentElement), o)[0];\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    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    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(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            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            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                    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                    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                            q.log(\"seqmatch\", t.fbid, \"exp\", t.expseq, \"cur\", y);\n                            delete z[y];\n                        }\n                         else break;\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        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    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        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 = (Date.now() / 1000);\n            this.updateTimeStamps();\n        },\n        getApproximateServerTime: function() {\n            return (this.getServerTimeOffset() + Date.now());\n        },\n        getServerTimeOffset: function() {\n            return (((this.serverTime - this.localStartTime)) * m);\n        },\n        updateTimeStamps: function() {\n            s.timestamps = h.scry(document.body, \"abbr.livetimestamp\");\n            s.startLoop(r);\n        },\n        addTimeStamps: function(t) {\n            if (!t) {\n                return\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            s.startLoop(0);\n        },\n        startLoop: function(t) {\n            this.stop();\n            this.timeout = setTimeout(function() {\n                s.loop();\n            }, t);\n        },\n        stop: function() {\n            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            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                if (((aa.next != -1) && (((aa.next < v) || (v == -1))))) {\n                    v = aa.next;\n                };\n            }));\n            if ((v != -1)) {\n                var w = Math.max(r, (v * m));\n                s.timeout = setTimeout(function() {\n                    s.loop();\n                }, w);\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            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                return w;\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                w.next = (n - (x % n));\n                return w;\n            }\n        ;\n            if ((z < 11)) {\n                w.next = (o - (x % o));\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            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.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        try {\n            return JSON.stringify(l);\n        } catch (m) {\n            return \"{}\";\n        };\n    };\n    function i(l, event, m) {\n        if (!g.counts[l]) {\n            g.counts[l] = {\n            };\n        };\n        if (!g.counts[l][event]) {\n            g.counts[l][event] = 0;\n        };\n        m = ((m == null) ? 1 : Number(m));\n        g.counts[l][event] += (isFinite(m) ? m : 0);\n    };\n    g.logAction = function(event, l, m) {\n        if ((this.type == \"bump\")) {\n            i(this.cat, event, l);\n        }\n         else if ((this.type == \"rate\")) {\n            ((l && i(this.cat, (event + \"_n\"), m)));\n            i(this.cat, (event + \"_d\"), m);\n        }\n         else {\n            var n = {\n                cat: this.cat,\n                type: this.type,\n                event: event,\n                data: ((l != null) ? h(l) : null),\n                date: 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            return 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 ((document.domain != \"facebook.com\")) {\n                        return\n                    };\n                    p = g.logAction;\n                    if (/^\\/+(dialogs|plugins?)\\//.test(location.pathname)) {\n                        g.forwarding = false;\n                    }\n                     else try {\n                        p = a.top.require(\"JSLogger\")._.logAction;\n                        g.forwarding = (p !== g.logAction);\n                    } catch (q) {\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        return g.categories[l];\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                    event: o.event,\n                    seq: o.seq\n                };\n                if (o.data) {\n                    p.data = JSON.parse(o.data);\n                };\n                n.push(p);\n            }\n        ;\n        };\n        return 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    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        } while (((j && i) && !l));\n        return i;\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    function k(m) {\n        if ((g.module || !m)) {\n            return g.module\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            if ((!o && n[p])) {\n                o = p;\n            };\n            m = i(m);\n        };\n        return o;\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        addImpressionID: function(m) {\n            if (g.impid) {\n                j(m);\n                m.nctr._impid = g.impid;\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 = 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            h[m] = 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            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(document.documentElement, j);\n                    h.pointerEvents = (window.getComputedStyle && (getComputedStyle(j, \"\").pointerEvents === \"auto\"));\n                    g.remove(j);\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            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    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    function m(s, t) {\n        var u = r.get(s, t);\n        return (((u === \"auto\") || (u === \"scroll\")));\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    function p(s) {\n        var t = \"\";\n        for (var u in s) {\n            if (s[u]) {\n                t += (((u + \":\") + s[u]) + \";\");\n            };\n        };\n        return t;\n    };\n    function q(s) {\n        return ((s !== \"\") ? ((\"alpha(opacity=\" + (s * 100)) + \")\") : \"\");\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                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        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            var w = o(s.style.cssText);\n            for (u in t) {\n                var x = t[u];\n                delete t[u];\n                u = k(u);\n                for (var y in w) {\n                    if (((y === u) || (y.indexOf((u + \"-\")) === 0))) {\n                        delete w[y];\n                    };\n                };\n                t[u] = x;\n            };\n            t = j(w, t);\n            s.style.cssText = p(t);\n            if ((h.ie() < 9)) {\n                for (u in t) {\n                    if (!t[u]) {\n                        r.set(s, u, \"\");\n                    };\n                }\n            };\n        },\n        get: function(s, t) {\n            s = i(s);\n            var u;\n            if (window.getComputedStyle) {\n                u = window.getComputedStyle(s, null);\n                if (u) {\n                    return u.getPropertyValue(k(t))\n                };\n            }\n        ;\n            if ((document.defaultView && document.defaultView.getComputedStyle)) {\n                u = document.defaultView.getComputedStyle(s, null);\n                if (u) {\n                    return u.getPropertyValue(k(t))\n                };\n                if ((t == \"display\")) {\n                    return \"none\"\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                return s.currentStyle[t];\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(document.body, s)) {\n                if ((r.get(s, \"position\") === \"fixed\")) {\n                    return true\n                };\n                s = s.parentNode;\n            };\n            return false;\n        },\n        getScrollParent: function(s) {\n            if (!s) {\n                return null\n            };\n            while ((s !== document.body)) {\n                if (((m(s, \"overflow\") || m(s, \"overflowY\")) || m(s, \"overflowX\"))) {\n                    return s\n                };\n                s = s.parentNode;\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        var j = Array.prototype.slice.call(arguments, 2);\n        return function() {\n            return h.apply(i, j);\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    function q(ga) {\n        if (g.hasCSS3DTransforms()) {\n            return t(ga);\n        }\n         else return s(ga)\n    ;\n    };\n    function r(ga) {\n        return ga.toFixed(8);\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    function t(ga) {\n        return ((\"matrix3d(\" + ga.map(r).join(\",\")) + \")\");\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        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                ia[((ja * 4) + ka)] = la;\n            };\n        };\n        return ia;\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.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        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        var ga = 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        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        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            this.obj.removeChild(this.container_div);\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            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 \"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        if ((this.state.attrs[ga] === undefined)) {\n            this.state.attrs[ga] = {\n            };\n        };\n        if (ja) {\n            this.state.attrs[ga].auto = true;\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    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    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    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        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        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        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        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 = 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        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 (document.documentElement[db] || document.body[db]);\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            if (ma.checkpointcb) {\n                this._callback(ma.checkpointcb, (ga - ma.start));\n                ma.checkpointcb = null;\n            }\n        ;\n            if ((ma.started === undefined)) {\n                if (ma.show) {\n                    this._show();\n                };\n                for (var na in ma.attrs) {\n                    if ((ma.attrs[na].start !== undefined)) {\n                        continue;\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                        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                        break;\n                      case \"height\":\n                        ja = aa(this.obj);\n                        if (ma.attrs[na].by) {\n                            ma.attrs[na].value += ja;\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                        break;\n                      case \"scrollLeft\":\n                    \n                      case \"scrollTop\":\n                        ja = (((this.obj === document.body)) ? ka(na) : this.obj[na]);\n                        if (ma.attrs[na].by) {\n                            ma.attrs[na].value += ja;\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                        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                        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                        break;\n                    };\n                    ma.attrs[na].start = ja;\n                };\n                if ((((ma.attrs.height && ma.attrs.height.auto)) || ((ma.attrs.width && ma.attrs.width.auto)))) {\n                    this._destroy_container();\n                    for (var na in {\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                    }) {\n                        if (ma.attrs[na]) {\n                            this.obj.style[na] = (ma.attrs[na].value + (((typeof ma.attrs[na].value == \"number\") ? \"px\" : \"\")));\n                        };\n                    };\n                    if ((ma.attrs.height && ma.attrs.height.auto)) {\n                        ma.attrs.height.value = aa(this.obj);\n                    };\n                    if ((ma.attrs.width && ma.attrs.width.auto)) {\n                        ma.attrs.width.value = z(this.obj);\n                    };\n                }\n            ;\n                ma.started = true;\n                if (ma.blind) {\n                    this._build_container();\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             else ha = false;\n        ;\n            var pa = (ma.ease ? ma.ease(oa) : oa);\n            if (((!ia && (oa != 1)) && ma.blind)) {\n                ia = true;\n            };\n            for (var na in ma.attrs) {\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                    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 === 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.scrollTo(ra, ka(\"scrollTop\"));\n                            }\n                             else a.scrollTo(ka(\"scrollLeft\"), ra);\n                        ;\n                            ra = ka(na);\n                        }\n                    ;\n                        ma[(\"last\" + na)] = ra;\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            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            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            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            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            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            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            if ((oa == 1)) {\n                this.queue.splice(la--, 1);\n                this._callback(ma.ondone, ((ga - ma.start) - ma.duration));\n            }\n        ;\n        };\n        if ((!ia && this.container_div)) {\n            this._destroy_container();\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    function ba(ga, ha, ia, ja) {\n        return ((ja ? parseInt : parseFloat))(((((ia - ha)) * ga) + ha), 10);\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    function da(ga) {\n        n.push(ga);\n        if ((n.length === 1)) {\n            if (!m) {\n                var ha = ((a.requestAnimationFrame || a.webkitRequestAnimationFrame) || a.mozRequestAnimationFrame);\n                if (ha) {\n                    m = ha.bind(a);\n                };\n            }\n        ;\n            if (m) {\n                m(fa);\n            }\n             else o = setInterval(fa, 20, false);\n        ;\n        }\n    ;\n        if (m) {\n            ea();\n        };\n        fa(Date.now(), true);\n    };\n    function ea() {\n        if (!m) {\n            throw new Error(\"Ending timer only valid with requestAnimationFrame\")\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        if (o) {\n            clearTimeout(o);\n            o = null;\n        }\n    ;\n        var la = Date.now();\n        if ((ga > la)) {\n            o = setTimeout(l(fa), (ga - la), false);\n        };\n    };\n    function fa(ga, ha) {\n        var ia = 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            } catch (ka) {\n                n.splice(ja--, 1);\n            };\n        };\n        if ((n.length === 0)) {\n            if (o) {\n                if (m) {\n                    clearTimeout(o);\n                }\n                 else clearInterval(o);\n            ;\n                o = null;\n            }\n        ;\n        }\n         else if (m) {\n            m(fa);\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                k = i.getContext(k);\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                j = j.parentNode;\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    i(j.prototype, {\n        getRoot: function() {\n            return this.root;\n        },\n        beginUpdate: function() {\n            if (this.updating) {\n                return false\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            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.innerWidth)) || (((document && document.documentElement) && document.documentElement.clientWidth))) || (((document && document.body) && document.body.clientWidth))) || 0), k = (((((window && window.innerHeight)) || (((document && document.documentElement) && document.documentElement.clientHeight))) || (((document && document.body) && document.body.clientHeight))) || 0);\n            return {\n                width: j,\n                height: k\n            };\n        },\n        getViewportWithoutScrollbarDimensions: function() {\n            var j = (((((document && document.documentElement) && document.documentElement.clientWidth)) || (((document && document.body) && document.body.clientWidth))) || 0), k = (((((document && document.documentElement) && document.documentElement.clientHeight)) || (((document && document.body) && document.body.clientHeight))) || 0);\n            return {\n                width: j,\n                height: k\n            };\n        },\n        getDocumentDimensions: function(j) {\n            j = (j || 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 \"top\":\n            \n              case \"bottom\":\n                o = [k,];\n                break;\n              case \"width\":\n                o = [\"left\",\"right\",];\n                break;\n              case \"height\":\n                o = [\"top\",\"bottom\",];\n                break;\n              default:\n                throw Error((\"Invalid plane: \" + k));\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                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    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.addEventListener) {\n        h = function(k, l, m) {\n            m.wrapper = g(m, \"entry\", ((k + \":\") + l));\n            k.addEventListener(l, m.wrapper, false);\n        };\n        i = function(k, l, m) {\n            k.removeEventListener(l, m.wrapper, false);\n        };\n    }\n     else if (window.attachEvent) {\n        h = function(k, l, m) {\n            m.wrapper = g(m, \"entry\", ((k + \":\") + l));\n            k.attachEvent((\"on\" + l), m.wrapper);\n        };\n        i = function(k, l, m) {\n            k.detachEvent((\"on\" + l), m.wrapper);\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            var k = document.documentElement;\n            if ((!((\"getBoundingClientRect\" in j)) || !h.contains(k, j))) {\n                return {\n                    x: 0,\n                    y: 0\n                }\n            };\n            var l = j.getBoundingClientRect(), m = (Math.round(l.left) - k.clientLeft), n = (Math.round(l.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.top);\n    };\n    e.exports = g;\n});\n__d(\"DimensionTracking\", [\"Cookie\",\"DOMDimensions\",\"Event\",\"debounce\",\"isInIframe\",], function(a, b, c, d, e, f) {\n    var g = b(\"Cookie\"), h = b(\"DOMDimensions\"), i = b(\"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    if (!k()) {\n        l.defer(100);\n        i.listen(window, \"resize\", j(l, 250));\n        i.listen(window, \"focus\", l);\n    }\n;\n});\n__d(\"Focus\", [\"CSS\",\"DOM\",\"Event\",\"Run\",\"cx\",\"ge\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSS\"), h = b(\"DOM\"), i = b(\"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.focus();\n            } catch (t) {\n            \n            };\n        },\n        setWithoutOutline: function(s) {\n            g.addClass(s, \"_1qp5\");\n            var t = i.listen(s, \"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    function p() {\n        if (n) {\n            return\n        };\n        i.listen(document.documentElement, \"focusout\", q);\n        i.listen(document.documentElement, \"focusin\", q);\n        n = true;\n    };\n    function q(event) {\n        var s = event.getTarget();\n        if (!g.hasClass(s, \"_1qp5\")) {\n            return\n        };\n        if (m[s.id]) {\n            g.conditionClass(m[s.id], \"_3oxt\", ((event.type === \"focusin\") || (event.type === \"focus\")));\n        };\n    };\n    function r(s) {\n        if ((m[s] && !l(s))) {\n            delete m[s];\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            var p = j.create(\"div\");\n            j.appendContent(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(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            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    }, 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 == document.activeElement)) {\n                return\n            };\n            if (k.isEmpty(l)) {\n                g.conditionClass(l, \"DOMControl_placeholder\", m);\n                l.value = (m || \"\");\n            }\n        ;\n        },\n        reset: function(l) {\n            var m = ((l !== 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    e.exports = k;\n});\n__d(\"KeyEventController\", [\"DOM\",\"Event\",\"Run\",\"copyProperties\",\"isEmpty\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOM\"), h = b(\"Event\"), i = b(\"Run\"), j = b(\"copyProperties\"), k = b(\"isEmpty\");\n    function l() {\n        this.handlers = {\n        };\n        document.onkeyup = this.onkeyevent.bind(this, \"onkeyup\");\n        document.onkeydown = this.onkeyevent.bind(this, \"onkeydown\");\n        document.onkeypress = this.onkeyevent.bind(this, \"onkeypress\");\n    };\n    j(l, {\n        instance: null,\n        getInstance: function() {\n            return (l.instance || (l.instance = new l()));\n        },\n        defaultFilter: function(event, m) {\n            event = h.$E(event);\n            return ((l.filterEventTypes(event, m) && l.filterEventTargets(event, m)) && l.filterEventModifiers(event, m));\n        },\n        filterEventTypes: function(event, m) {\n            if ((m === \"onkeydown\")) {\n                return true\n            };\n            return false;\n        },\n        filterEventTargets: function(event, m) {\n            var n = event.getTarget(), o = (n.contentEditable === \"true\");\n            return (((!((o || g.isNodeOfType(n, l._interactiveElements))) || (n.type in l._uninterestingTypes)) || (((event.keyCode in l._controlKeys) && ((((g.isNodeOfType(n, [\"input\",\"textarea\",]) && (n.value.length === 0))) || ((o && (g.getText(n).length === 0)))))))));\n        },\n        filterEventModifiers: function(event, m) {\n            if ((((event.ctrlKey || event.altKey) || event.metaKey) || event.repeat)) {\n                return false\n            };\n            return true;\n        },\n        registerKey: function(m, n, o, p) {\n            if ((o === undefined)) {\n                o = l.defaultFilter;\n            };\n            var q = l.getInstance(), r = q.mapKey(m);\n            if (k(q.handlers)) {\n                i.onLeave(q.resetHandlers.bind(q));\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                var u = {\n                    callback: n,\n                    filter: o\n                };\n                s[m] = u;\n                q.handlers[m].push(u);\n            };\n            return {\n                remove: function() {\n                    for (var v in s) {\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                        delete s[v];\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                return [(48 + m),(96 + m),];\n            }\n        ;\n            var n = l.keyCodeMap[m.toUpperCase()];\n            if (n) {\n                return 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                    } catch (t) {\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\", [\"Event\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = null, i = null;\n    function j() {\n        if (!i) {\n            i = g.listen(window, \"blur\", function() {\n                h = null;\n                k();\n            });\n        };\n    };\n    function k() {\n        if (i) {\n            i.remove();\n            i = null;\n        }\n    ;\n    };\n    g.listen(document.documentElement, \"keydown\", function(m) {\n        h = g.getKeyCode(m);\n        j();\n    }, g.Priority.URGENT);\n    g.listen(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    g(h.prototype, {\n        enable: function() {\n            if (!this._enabled) {\n                this._enabled = true;\n                this._behavior.enable();\n            }\n        ;\n        },\n        disable: function() {\n            if (this._enabled) {\n                this._enabled = false;\n                this._behavior.disable();\n            }\n        ;\n        }\n    });\n    var i = 1;\n    function j(l) {\n        if (!l.__BEHAVIOR_ID) {\n            l.__BEHAVIOR_ID = i++;\n        };\n        return l.__BEHAVIOR_ID;\n    };\n    var k = {\n        enableBehavior: function(l) {\n            if (!this._behaviors) {\n                this._behaviors = {\n                };\n            };\n            var m = j(l);\n            if (!this._behaviors[m]) {\n                this._behaviors[m] = new h(new l(this));\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            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                for (var l in this._behaviors) {\n                    this._behaviors[l].disable();;\n                };\n                this._behaviors = {\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    e.exports = g;\n});\n__d(\"Layer\", [\"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(\"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    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 = document.createElement(\"div\");\n                    j.renderComponent(y, ba);\n                    y = this._reactContainer = ba;\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            if (x.classNames) {\n                x.classNames.forEach(l.addClass.curry(this._root));\n            };\n            l.addClass(this._root, \"uiLayer\");\n            if (x.causalElement) {\n                this._causalElement = t(x.causalElement);\n            };\n            if (x.permanent) {\n                this._permanent = x.permanent;\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 || 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                this._insertParent = x;\n            }\n        ;\n            return this;\n        },\n        show: function() {\n            if (this._shown) {\n                return this\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                    }.bind(this).defer();\n                };\n            }\n             else l.hide(x);\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            this._hiding = true;\n            if ((this.inform(\"starthide\") !== false)) {\n                this.finishHide();\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                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        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            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(document.documentElement, \"keydown\", function(event) {\n        if (p.filterEventTargets(event, \"keydown\")) {\n            for (var x = (v.length - 1); (x >= 0); x--) {\n                if ((v[x].inform(\"key\", event) === false)) {\n                    return false\n                };\n            }\n        };\n    }, g.Priority.URGENT);\n    g.listen(document.documentElement, \"click\", function(event) {\n        var x = v.length;\n        if (!x) {\n            return\n        };\n        var y = event.getTarget();\n        if (!n.contains(document.documentElement, y)) {\n            return\n        };\n        if (!y.offsetWidth) {\n            return\n        };\n        if (q.byClass(y, \"generic_dialog\")) {\n            return\n        };\n        while (x--) {\n            var z = v[x], aa = z.getContentRoot();\n            if (k.containsIncludingLayers(aa, y)) {\n                return\n            };\n            if (((z.inform(\"blur\") === false) || z.isShown())) {\n                return\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            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            var q = (m.height - l.height), r = (m.width - l.width);\n            if (((r < 0) && !k._opts.widthElement)) {\n                r = 0;\n            };\n            r = ((r > 1) ? r : 0);\n            if ((!k._opts.allowShrink && (q < 0))) {\n                q = 0;\n            };\n            if ((q || r)) {\n                try {\n                    (window.console && window.console.firebug);\n                    window.resizeBy(r, q);\n                    if (r) {\n                        window.moveBy((r / -2), 0);\n                    };\n                } catch (s) {\n                \n                }\n            };\n        },\n        _getDocumentSize: function() {\n            var l = g.getDocumentDimensions();\n            if ((k._opts.strategy === \"offsetHeight\")) {\n                l.height = document.body.offsetHeight;\n            };\n            if (k._opts.widthElement) {\n                var m = h.scry(document.body, k._opts.widthElement)[0];\n                if (m) {\n                    l.width = g.getElementDimensions(m).width;\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            return l;\n        },\n        open: function(l, m, n) {\n            var o = ((typeof window.screenX != \"undefined\") ? window.screenX : window.screenLeft), p = ((typeof window.screenY != \"undefined\") ? window.screenY : window.screenTop), q = ((typeof window.outerWidth != \"undefined\") ? window.outerWidth : document.body.clientWidth), r = ((typeof window.outerHeight != \"undefined\") ? window.outerHeight : ((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            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\", [\"Event\",\"DOMDimensions\",\"DOMPosition\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"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    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                return this.add(l.x, l.y);\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            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 != \"document\"))) {\n                return new k(0, 0)\n            };\n            if ((l == this.domain)) {\n                return new k(this.x, this.y, this.domain)\n            };\n            if ((l == \"pure\")) {\n                return new k(this.x, this.y)\n            };\n            if ((this.domain == \"pure\")) {\n                return new k(0, 0)\n            };\n            var m = k.getScrollPosition(\"document\"), n = this.x, o = this.y;\n            if ((this.domain == \"document\")) {\n                n -= m.x;\n                o -= m.y;\n            }\n             else {\n                n += m.x;\n                o += m.y;\n            }\n        ;\n            return new k(n, o, l);\n        },\n        setElementPosition: function(l) {\n            var m = this.convertTo(\"document\");\n            l.style.left = (parseInt(m.x) + \"px\");\n            l.style.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 == document.body)) {\n                window.scrollBy(this.x, this.y);\n            }\n             else {\n                l.scrollLeft += this.x;\n                l.scrollTop += this.y;\n            }\n        ;\n            return this;\n        }\n    });\n    j(k, {\n        getEventPosition: function(l, m) {\n            m = (m || \"document\");\n            var n = g.getPosition(l), o = new k(n.x, n.y, \"document\");\n            return o.convertTo(m);\n        },\n        getScrollPosition: function(l) {\n            l = (l || \"document\");\n            var m = i.getScrollPosition();\n            return new k(m.x, m.y, \"document\").convertTo(l);\n        },\n        getElementPosition: function(l, m) {\n            m = (m || \"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, \"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        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                        for (var r in q) {\n                            if ((o[r] !== undefined)) {\n                                if ((k[j[n]][r] === undefined)) {\n                                    k[j[n]][r] = [];\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            i = g(i);\n        };\n        for (var s in k) {\n            for (var t in o) {\n                if ((k[s][t] !== undefined)) {\n                    k[s][t] = k[s][t].join(o[t]);\n                };\n            };\n        };\n        return k;\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    e.exports = g;\n});\n__d(\"requestAnimationFrame\", [\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"emptyFunction\"), h = 0, i = (((((a.requestAnimationFrame || a.webkitRequestAnimationFrame) || a.mozRequestAnimationFrame) || a.oRequestAnimationFrame) || a.msRequestAnimationFrame) || function(j) {\n        var k = Date.now(), l = Math.max(0, (16 - ((k - h))));\n        h = (k + l);\n        return a.setTimeout(j, l);\n    });\n    i(g);\n    e.exports = i;\n});\n__d(\"queryThenMutateDOM\", [\"function-extensions\",\"Run\",\"createArrayFrom\",\"emptyFunction\",\"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(\"requestAnimationFrame\"), k, l, m = {\n    }, n = [], o = [];\n    function p(s, t, u) {\n        if ((!s && !t)) {\n            return\n        };\n        if ((u && m.hasOwnProperty(u))) {\n            return;\n        }\n         else if (u) {\n            m[u] = 1;\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    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        while (t--) {\n            v = n.shift();\n            v(u.shift());\n        };\n        l = false;\n        r();\n    };\n    function r() {\n        if ((!l && ((o.length || n.length)))) {\n            l = true;\n            j(q);\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 setTimeout(h, i, false);\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        window.scrollBy(0, m);\n        j.inform(\"TimelineCover/coverCollapsed\", m, g.BEHAVIOR_STATE);\n    };\n});\nfunction tz_calculate(a) {\n    var b = new 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    return (f * 30);\n};\nfunction tz_autoset(a, b, c) {\n    if ((!a || (undefined == b))) {\n        return\n    };\n    if (window.tz_autoset.calculated) {\n        return\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__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(document.body, m);\n                if ((!n || n.link_data)) {\n                    return\n                };\n                var o = l(n, [\"ft\",]).ft;\n                if (Object.keys(o).length) {\n                    var p = k.create(\"input\", {\n                        type: \"hidden\",\n                        name: \"link_data\",\n                        value: JSON.stringify(o)\n                    });\n                    n.appendChild(p);\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    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    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    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        return j.reverse();\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        if ((m === false)) {\n            return \"0\";\n        }\n         else if ((m === true)) {\n            return \"1\"\n        }\n    ;\n        return m.toString().replace(g, \"&amp;\").replace(j, \"&quot;\").replace(k, \"&#039;\").replace(h, \"&lt;\").replace(i, \"&gt;\");\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    e.exports = h;\n});");
// 1548
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o7,"s5e7dba3ea700a5261ca8857ec975a807389e8969");
// 1549
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 = 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: ((window.top.JSBNG_Replay.push)((window.top.JSBNG_Replay.s5e7dba3ea700a5261ca8857ec975a807389e8969_270), 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    {\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        ((window.top.JSBNG_Replay.s5e7dba3ea700a5261ca8857ec975a807389e8969_457.push)((fa)));\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});");
// 1630
JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_190[0](o24,false,"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yF/r/pmYy9aLa5q_.js",o29);
// undefined
o24 = null;
// undefined
o29 = null;
// 1634
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o7,"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});");
// 1635
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o7,"s93c2e40407555ddbaca9d11f5326c966155ad343");
// 1636
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});");
// 1655
JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_190[0](o30,false,"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yd/r/-z4vUS8jrpA.js",o31);
// undefined
o30 = null;
// undefined
o31 = null;
// 1659
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o7,"if (self.CavalryLogger) {\n    CavalryLogger.start_js([\"KPZ5T\",]);\n}\n;\n__d(\"EntStreamGroupMall\", [\"DOM\",\"$\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOM\"), h = b(\"$\"), i = {\n        replacePager: function(j) {\n            g.setContent(h(\"pagelet_group_pager\"), j);\n        },\n        replaceFilesPager: function(j, k) {\n            g.setContent(h((\"group_files_pager_\" + k)), j);\n        }\n    };\n    e.exports = i;\n});\n__d(\"GroupMall\", [\"Animation\",\"Arbiter\",\"DOM\",\"LiveTimer\",\"NavigationMessage\",\"Run\",\"Vector\",\"$\",\"copyProperties\",\"ge\",], function(a, b, c, d, e, f) {\n    var g = b(\"Animation\"), h = b(\"Arbiter\"), i = b(\"DOM\"), j = b(\"LiveTimer\"), k = b(\"NavigationMessage\"), l = b(\"Run\"), m = b(\"Vector\"), n = b(\"$\"), o = b(\"copyProperties\"), p = b(\"ge\"), q = {\n    };\n    o(q, {\n        init: function(r, s) {\n            this._mallNode = n((\"group_mall_\" + r));\n            this._composerPublishToken = h.subscribe(\"composer/publish\", function(event, t) {\n                if ((((t.composer_id === s) && t.streamStory) && !p(t.streamStory.id))) {\n                    this._addPostToUI(t.streamStory);\n                };\n            }.bind(this));\n            l.onLeave(this._onleave.bind(this));\n            this._navigationBeginToken = h.subscribe(k.NAVIGATION_BEGIN, this._onleave.bind(this));\n        },\n        _onleave: function() {\n            this._navigationBeginToken.unsubscribe();\n            this._composerPublishToken.unsubscribe();\n        },\n        _addPostToUI: function(r) {\n            var s = m.getElementDimensions(this._mallNode).y;\n            i.prependContent(this._mallNode, r);\n            var t = this._mallNode.firstChild;\n            j.startLoop(0);\n            new g(t).from(\"opacity\", 0).to(\"opacity\", 1).duration(300).go();\n        }\n    });\n    e.exports = q;\n});\n__d(\"LitestandShareAttachment\", [\"CSS\",\"DOM\",\"DOMQuery\",\"csx\",\"queryThenMutateDOM\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSS\"), h = b(\"DOM\"), i = b(\"DOMQuery\"), j = b(\"csx\"), k = b(\"queryThenMutateDOM\"), l = 16, m = 22, n = 5, o = {\n        1: 5,\n        2: 4,\n        3: 2,\n        4: 0,\n        5: 0\n    }, p, q = {\n        init: function(u) {\n            var v, w, x;\n            k(function() {\n                v = h.find(u, \"._6m6\");\n                w = h.scry(u, \"._6m7\")[0];\n                x = t(v);\n            }, function() {\n                if (!x) {\n                    r(v, (n * m));\n                }\n                 else if ((w && x)) {\n                    g.show(w);\n                    r(w, (x * l));\n                }\n                \n            ;\n            });\n        }\n    };\n    function r(u, v) {\n        var w = u.scrollHeight;\n        if ((w <= v)) {\n            return u\n        };\n        var x, y = \"...\", z = i.getText(u);\n        while ((w > v)) {\n            x = z.lastIndexOf(\" \");\n            if ((x === -1)) {\n                x = ((z.length - y.length) - 1);\n            };\n            z = (z.substr(0, x).trim() + y);\n            s(u, z);\n            w = u.scrollHeight;\n        };\n    };\n    function s(u, v) {\n        p = (p || (((u.textContent != null) ? \"textContent\" : \"innerText\")));\n        u[p] = v;\n    };\n    function t(u) {\n        var v = Math.round((u.scrollHeight / m));\n        return o[v];\n    };\n    e.exports = q;\n});\n__d(\"highlight\", [\"Animation\",\"Style\",], function(a, b, c, d, e, f) {\n    var g = b(\"Animation\"), h = b(\"Style\");\n    function i(j, k, l) {\n        new g(j).from(\"background\", \"#fff9d7\").to(\"background\", (l || \"#fff\")).ease(g.ease.both).duration(2000).ondone(function() {\n            h.set(j, \"background\", \"\");\n            (k && k());\n        }).go();\n    };\n    i.highlight = i;\n    e.exports = i;\n});\n__d(\"ScrollHighlight\", [\"DOMScroll\",\"highlight\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOMScroll\"), h = b(\"highlight\"), i = {\n        actOn: function(j, k) {\n            g.scrollTo(j);\n            h(j, null, k);\n        }\n    };\n    e.exports = i;\n});\n__d(\"foldl\", [], function(a, b, c, d, e, f) {\n    function g(h, i, j) {\n        var k = 0, l = i.length;\n        if ((l === 0)) {\n            if ((j === undefined)) {\n                throw new TypeError(\"Reduce of empty array with no initial value\")\n            };\n            return j;\n        }\n    ;\n        if ((j === undefined)) {\n            j = i[k++];\n        };\n        while ((k < l)) {\n            if ((k in i)) {\n                j = h(j, i[k]);\n            };\n            k++;\n        };\n        return j;\n    };\n    e.exports = g;\n});\n__d(\"FacebarStructuredFragment\", [], function(a, b, c, d, e, f) {\n    function g(i, j) {\n        if ((i && j)) {\n            return (i.toLowerCase() == j.toLowerCase());\n        }\n         else return (!i && !j)\n    ;\n    };\n    function h(i) {\n        this._text = String(i.text);\n        this._uid = (i.uid ? String(i.uid) : null);\n        this._type = (i.type ? String(i.type) : null);\n        this._typeParts = null;\n    };\n    h.prototype.getText = function() {\n        return this._text;\n    };\n    h.prototype.getUID = function() {\n        return this._uid;\n    };\n    h.prototype.getType = function() {\n        return this._type;\n    };\n    h.prototype.getTypePart = function(i) {\n        return this._getTypeParts()[i];\n    };\n    h.prototype.getLength = function() {\n        return this._text.length;\n    };\n    h.prototype.isType = function(i) {\n        for (var j = 0; (j < arguments.length); j++) {\n            if (!g(arguments[j], this.getTypePart(j))) {\n                return false\n            };\n        };\n        return true;\n    };\n    h.prototype.isWhitespace = function() {\n        return (/^\\s*$/).test(this._text);\n    };\n    h.prototype.toStruct = function() {\n        return {\n            text: this._text,\n            type: this._type,\n            uid: this._uid\n        };\n    };\n    h.prototype.getHash = function(i) {\n        var j = ((i != null) ? this._getTypeParts().slice(0, i).join(\":\") : this._type);\n        return ((j + \"::\") + this._text);\n    };\n    h.prototype._getTypeParts = function() {\n        if ((this._typeParts === null)) {\n            this._typeParts = (this._type ? this._type.split(\":\") : []);\n        };\n        return this._typeParts;\n    };\n    e.exports = h;\n});\n__d(\"FacebarStructuredText\", [\"createArrayFrom\",\"foldl\",\"FacebarStructuredFragment\",], function(a, b, c, d, e, f) {\n    var g = b(\"createArrayFrom\"), h = b(\"foldl\"), i = b(\"FacebarStructuredFragment\"), j = /\\s+$/;\n    function k(o) {\n        if (!o) {\n            return [];\n        }\n         else if ((o instanceof n)) {\n            return o.toArray();\n        }\n         else return g(o).map(function(p) {\n            return new i(p);\n        })\n        \n    ;\n    };\n    function l(o) {\n        return new i({\n            text: o,\n            type: \"text\"\n        });\n    };\n    function m(o, p, q) {\n        var r = o.getText(), s = r.replace(p, q);\n        if ((r != s)) {\n            return new i({\n                text: s,\n                type: o.getType(),\n                uid: o.getUID()\n            });\n        }\n         else return o\n    ;\n    };\n    function n(o) {\n        this._fragments = (o || []);\n        this._hash = null;\n    };\n    n.prototype.matches = function(o, p) {\n        if (o) {\n            var q = this._fragments, r = o._fragments;\n            return ((q.length == r.length) && !q.some(function(s, t) {\n                if ((!p && s.getUID())) {\n                    return (s.getUID() != r[t].getUID());\n                }\n                 else return ((s.getText() != r[t].getText()) || (s.getType() != r[t].getType()))\n            ;\n            }));\n        }\n    ;\n        return false;\n    };\n    n.prototype.trim = function() {\n        var o = null, p = null;\n        this.forEach(function(r, s) {\n            if (!r.isWhitespace()) {\n                if ((o === null)) {\n                    o = s;\n                };\n                p = s;\n            }\n        ;\n        });\n        if ((p !== null)) {\n            var q = this._fragments.slice(o, (p + 1));\n            q.push(m(q.pop(), j, \"\"));\n            return new n(q);\n        }\n         else return new n([])\n    ;\n    };\n    n.prototype.pad = function() {\n        var o = this.getFragment(-1);\n        if (((o && !j.test(o.getText())) && (o.getText() !== \"\"))) {\n            return new n(this._fragments.concat(l(\" \")));\n        }\n         else return this\n    ;\n    };\n    n.prototype.forEach = function(o) {\n        this._fragments.forEach(o);\n        return this;\n    };\n    n.prototype.matchType = function(o) {\n        var p = null;\n        for (var q = 0; (q < this._fragments.length); q++) {\n            var r = this._fragments[q], s = r.isType.apply(r, arguments);\n            if ((s && !p)) {\n                p = r;\n            }\n             else if ((s || !r.isWhitespace())) {\n                return null\n            }\n        ;\n        };\n        return p;\n    };\n    n.prototype.hasType = function(o) {\n        var p = arguments;\n        return this._fragments.some(function(q) {\n            return (!q.isWhitespace() && q.isType.apply(q, p));\n        });\n    };\n    n.prototype.isEmptyOrWhitespace = function() {\n        return !this._fragments.some(function(o) {\n            return !o.isWhitespace();\n        });\n    };\n    n.prototype.isEmpty = function() {\n        return (this.getLength() === 0);\n    };\n    n.prototype.getFragment = function(o) {\n        return this._fragments[((o >= 0) ? o : (this._fragments.length + o))];\n    };\n    n.prototype.getCount = function() {\n        return this._fragments.length;\n    };\n    n.prototype.getLength = function() {\n        return h(function(o, p) {\n            return (o + p.getLength());\n        }, this._fragments, 0);\n    };\n    n.prototype.toStruct = function() {\n        return this._fragments.map(function(o) {\n            return o.toStruct();\n        });\n    };\n    n.prototype.toArray = function() {\n        return this._fragments.slice();\n    };\n    n.prototype.toString = function() {\n        return this._fragments.map(function(o) {\n            return o.getText();\n        }).join(\"\");\n    };\n    n.prototype.getHash = function() {\n        if ((this._hash === null)) {\n            this._hash = this._fragments.map(function(o) {\n                if (o.getUID()) {\n                    return ((\"[[\" + o.getHash(1)) + \"]]\");\n                }\n                 else return o.getText()\n            ;\n            }).join(\"\");\n        };\n        return this._hash;\n    };\n    n.fromStruct = function(o) {\n        return new n(k(o));\n    };\n    n.fromString = function(o) {\n        return new n([l(o),]);\n    };\n    e.exports = n;\n});\n__d(\"FacebarNavigation\", [\"Arbiter\",\"csx\",\"DOMQuery\",\"FacebarStructuredText\",\"Input\",\"URI\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"csx\"), i = b(\"DOMQuery\"), j = b(\"FacebarStructuredText\"), k = b(\"Input\"), l = b(\"URI\"), m = null, n = null, o = null, p = false, q = true, r = (function() {\n        var v = {\n        }, w = function(x) {\n            return (\"uri-\" + x.getQualifiedURI().toString());\n        };\n        return {\n            set: function(x, y) {\n                v[w(x)] = y;\n            },\n            get: function(x) {\n                return v[w(x)];\n            }\n        };\n    })();\n    function s(v, w) {\n        o = v;\n        p = w;\n        q = false;\n        t();\n    };\n    function t() {\n        if (q) {\n            return;\n        }\n         else if (n) {\n            (p && n.pageTransition());\n            n.setPageQuery(o);\n            q = true;\n        }\n         else if (((m && o) && !k.getValue(m))) {\n            k.setValue(m, (o.structure.toString() + \" \"));\n        }\n        \n    ;\n    };\n    g.subscribe(\"page_transition\", function(v, w) {\n        s(r.get(w.uri), true);\n    });\n    var u = {\n        registerInput: function(v) {\n            m = i.scry(v, \"._586f\")[0];\n            t();\n        },\n        registerBehavior: function(v) {\n            n = v;\n            t();\n        },\n        setPageQuery: function(v) {\n            r.set(l.getNextURI(), v);\n            v.structure = j.fromStruct(v.structure);\n            s(v, false);\n        }\n    };\n    e.exports = u;\n});");
// 1660
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o7,"s432d2d37a964b93da04968ef608f9248ba0f3d25");
// 1661
geval("if (JSBNG__self.CavalryLogger) {\n    CavalryLogger.start_js([\"KPZ5T\",]);\n}\n;\n;\n__d(\"EntStreamGroupMall\", [\"DOM\",\"$\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOM\"), h = b(\"$\"), i = {\n        replacePager: function(j) {\n            g.setContent(h(\"pagelet_group_pager\"), j);\n        },\n        replaceFilesPager: function(j, k) {\n            g.setContent(h(((\"group_files_pager_\" + k))), j);\n        }\n    };\n    e.exports = i;\n});\n__d(\"GroupMall\", [\"Animation\",\"Arbiter\",\"DOM\",\"LiveTimer\",\"NavigationMessage\",\"Run\",\"Vector\",\"$\",\"copyProperties\",\"ge\",], function(a, b, c, d, e, f) {\n    var g = b(\"Animation\"), h = b(\"Arbiter\"), i = b(\"DOM\"), j = b(\"LiveTimer\"), k = b(\"NavigationMessage\"), l = b(\"Run\"), m = b(\"Vector\"), n = b(\"$\"), o = b(\"copyProperties\"), p = b(\"ge\"), q = {\n    };\n    o(q, {\n        init: function(r, s) {\n            this._mallNode = n(((\"group_mall_\" + r)));\n            this._composerPublishToken = h.subscribe(\"composer/publish\", function(JSBNG__event, t) {\n                if (((((((t.composer_id === s)) && t.streamStory)) && !p(t.streamStory.id)))) {\n                    this._addPostToUI(t.streamStory);\n                }\n            ;\n            ;\n            }.bind(this));\n            l.onLeave(this._onleave.bind(this));\n            this._navigationBeginToken = h.subscribe(k.NAVIGATION_BEGIN, this._onleave.bind(this));\n        },\n        _onleave: function() {\n            this._navigationBeginToken.unsubscribe();\n            this._composerPublishToken.unsubscribe();\n        },\n        _addPostToUI: function(r) {\n            var s = m.getElementDimensions(this._mallNode).y;\n            i.prependContent(this._mallNode, r);\n            var t = this._mallNode.firstChild;\n            j.startLoop(0);\n            new g(t).from(\"opacity\", 0).to(\"opacity\", 1).duration(300).go();\n        }\n    });\n    e.exports = q;\n});\n__d(\"LitestandShareAttachment\", [\"CSS\",\"DOM\",\"DOMQuery\",\"csx\",\"queryThenMutateDOM\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSS\"), h = b(\"DOM\"), i = b(\"DOMQuery\"), j = b(\"csx\"), k = b(\"queryThenMutateDOM\"), l = 16, m = 22, n = 5, o = {\n        1: 5,\n        2: 4,\n        3: 2,\n        4: 0,\n        5: 0\n    }, p, q = {\n        init: function(u) {\n            var v, w, x;\n            k(function() {\n                v = h.JSBNG__find(u, \"._6m6\");\n                w = h.scry(u, \"._6m7\")[0];\n                x = t(v);\n            }, function() {\n                if (!x) {\n                    r(v, ((n * m)));\n                }\n                 else if (((w && x))) {\n                    g.show(w);\n                    r(w, ((x * l)));\n                }\n                \n            ;\n            ;\n            });\n        }\n    };\n    function r(u, v) {\n        var w = u.scrollHeight;\n        if (((w <= v))) {\n            return u;\n        }\n    ;\n    ;\n        var x, y = \"...\", z = i.getText(u);\n        while (((w > v))) {\n            x = z.lastIndexOf(\" \");\n            if (((x === -1))) {\n                x = ((((z.length - y.length)) - 1));\n            }\n        ;\n        ;\n            z = ((z.substr(0, x).trim() + y));\n            s(u, z);\n            w = u.scrollHeight;\n        };\n    ;\n    };\n;\n    function s(u, v) {\n        p = ((p || ((((u.textContent != null)) ? \"textContent\" : \"innerText\"))));\n        u[p] = v;\n    };\n;\n    function t(u) {\n        var v = Math.round(((u.scrollHeight / m)));\n        return o[v];\n    };\n;\n    e.exports = q;\n});\n__d(\"highlight\", [\"Animation\",\"Style\",], function(a, b, c, d, e, f) {\n    var g = b(\"Animation\"), h = b(\"Style\");\n    function i(j, k, l) {\n        new g(j).from(\"background\", \"#fff9d7\").to(\"background\", ((l || \"#fff\"))).ease(g.ease.both).duration(2000).ondone(function() {\n            h.set(j, \"background\", \"\");\n            ((k && k()));\n        }).go();\n    };\n;\n    i.highlight = i;\n    e.exports = i;\n});\n__d(\"ScrollHighlight\", [\"DOMScroll\",\"highlight\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOMScroll\"), h = b(\"highlight\"), i = {\n        actOn: function(j, k) {\n            g.JSBNG__scrollTo(j);\n            h(j, null, k);\n        }\n    };\n    e.exports = i;\n});\n__d(\"foldl\", [], function(a, b, c, d, e, f) {\n    function g(h, i, j) {\n        var k = 0, l = i.length;\n        if (((l === 0))) {\n            if (((j === undefined))) {\n                throw new TypeError(\"Reduce of empty array with no initial value\");\n            }\n        ;\n        ;\n            return j;\n        }\n    ;\n    ;\n        if (((j === undefined))) {\n            j = i[k++];\n        }\n    ;\n    ;\n        while (((k < l))) {\n            if (((k in i))) {\n                j = h(j, i[k]);\n            }\n        ;\n        ;\n            k++;\n        };\n    ;\n        return j;\n    };\n;\n    e.exports = g;\n});\n__d(\"FacebarStructuredFragment\", [], function(a, b, c, d, e, f) {\n    function g(i, j) {\n        if (((i && j))) {\n            return ((i.toLowerCase() == j.toLowerCase()));\n        }\n         else return ((!i && !j))\n    ;\n    };\n;\n    function h(i) {\n        this._text = String(i.text);\n        this._uid = ((i.uid ? String(i.uid) : null));\n        this._type = ((i.type ? String(i.type) : null));\n        this._typeParts = null;\n    };\n;\n    h.prototype.getText = function() {\n        return this._text;\n    };\n    h.prototype.getUID = function() {\n        return this._uid;\n    };\n    h.prototype.getType = function() {\n        return this._type;\n    };\n    h.prototype.getTypePart = function(i) {\n        return this._getTypeParts()[i];\n    };\n    h.prototype.getLength = function() {\n        return this._text.length;\n    };\n    h.prototype.isType = function(i) {\n        for (var j = 0; ((j < arguments.length)); j++) {\n            if (!g(arguments[j], this.getTypePart(j))) {\n                return false;\n            }\n        ;\n        ;\n        };\n    ;\n        return true;\n    };\n    h.prototype.isWhitespace = function() {\n        return (/^\\s*$/).test(this._text);\n    };\n    h.prototype.toStruct = function() {\n        return {\n            text: this._text,\n            type: this._type,\n            uid: this._uid\n        };\n    };\n    h.prototype.getHash = function(i) {\n        var j = ((((i != null)) ? this._getTypeParts().slice(0, i).join(\":\") : this._type));\n        return ((((j + \"::\")) + this._text));\n    };\n    h.prototype._getTypeParts = function() {\n        if (((this._typeParts === null))) {\n            this._typeParts = ((this._type ? this._type.split(\":\") : []));\n        }\n    ;\n    ;\n        return this._typeParts;\n    };\n    e.exports = h;\n});\n__d(\"FacebarStructuredText\", [\"createArrayFrom\",\"foldl\",\"FacebarStructuredFragment\",], function(a, b, c, d, e, f) {\n    var g = b(\"createArrayFrom\"), h = b(\"foldl\"), i = b(\"FacebarStructuredFragment\"), j = /\\s+$/;\n    function k(o) {\n        if (!o) {\n            return [];\n        }\n         else if (((o instanceof n))) {\n            return o.toArray();\n        }\n         else return g(o).map(function(p) {\n            return new i(p);\n        })\n        \n    ;\n    };\n;\n    function l(o) {\n        return new i({\n            text: o,\n            type: \"text\"\n        });\n    };\n;\n    function m(o, p, q) {\n        var r = o.getText(), s = r.replace(p, q);\n        if (((r != s))) {\n            return new i({\n                text: s,\n                type: o.getType(),\n                uid: o.getUID()\n            });\n        }\n         else return o\n    ;\n    };\n;\n    function n(o) {\n        this._fragments = ((o || []));\n        this._hash = null;\n    };\n;\n    n.prototype.matches = function(o, p) {\n        if (o) {\n            var q = this._fragments, r = o._fragments;\n            return ((((q.length == r.length)) && !q.some(function(s, t) {\n                if (((!p && s.getUID()))) {\n                    return ((s.getUID() != r[t].getUID()));\n                }\n                 else return ((((s.getText() != r[t].getText())) || ((s.getType() != r[t].getType()))))\n            ;\n            })));\n        }\n    ;\n    ;\n        return false;\n    };\n    n.prototype.trim = function() {\n        var o = null, p = null;\n        this.forEach(function(r, s) {\n            if (!r.isWhitespace()) {\n                if (((o === null))) {\n                    o = s;\n                }\n            ;\n            ;\n                p = s;\n            }\n        ;\n        ;\n        });\n        if (((p !== null))) {\n            var q = this._fragments.slice(o, ((p + 1)));\n            q.push(m(q.pop(), j, \"\"));\n            return new n(q);\n        }\n         else return new n([])\n    ;\n    };\n    n.prototype.pad = function() {\n        var o = this.getFragment(-1);\n        if (((((o && !j.test(o.getText()))) && ((o.getText() !== \"\"))))) {\n            return new n(this._fragments.concat(l(\" \")));\n        }\n         else return this\n    ;\n    };\n    n.prototype.forEach = function(o) {\n        this._fragments.forEach(o);\n        return this;\n    };\n    n.prototype.matchType = function(o) {\n        var p = null;\n        for (var q = 0; ((q < this._fragments.length)); q++) {\n            var r = this._fragments[q], s = r.isType.apply(r, arguments);\n            if (((s && !p))) {\n                p = r;\n            }\n             else if (((s || !r.isWhitespace()))) {\n                return null;\n            }\n            \n        ;\n        ;\n        };\n    ;\n        return p;\n    };\n    n.prototype.hasType = function(o) {\n        var p = arguments;\n        return this._fragments.some(function(q) {\n            return ((!q.isWhitespace() && q.isType.apply(q, p)));\n        });\n    };\n    n.prototype.isEmptyOrWhitespace = function() {\n        return !this._fragments.some(function(o) {\n            return !o.isWhitespace();\n        });\n    };\n    n.prototype.isEmpty = function() {\n        return ((this.getLength() === 0));\n    };\n    n.prototype.getFragment = function(o) {\n        return this._fragments[((((o >= 0)) ? o : ((this._fragments.length + o))))];\n    };\n    n.prototype.getCount = function() {\n        return this._fragments.length;\n    };\n    n.prototype.getLength = function() {\n        return h(function(o, p) {\n            return ((o + p.getLength()));\n        }, this._fragments, 0);\n    };\n    n.prototype.toStruct = function() {\n        return this._fragments.map(function(o) {\n            return o.toStruct();\n        });\n    };\n    n.prototype.toArray = function() {\n        return this._fragments.slice();\n    };\n    n.prototype.toString = function() {\n        return this._fragments.map(function(o) {\n            return o.getText();\n        }).join(\"\");\n    };\n    n.prototype.getHash = function() {\n        if (((this._hash === null))) {\n            this._hash = this._fragments.map(function(o) {\n                if (o.getUID()) {\n                    return ((((\"[[\" + o.getHash(1))) + \"]]\"));\n                }\n                 else return o.getText()\n            ;\n            }).join(\"\");\n        }\n    ;\n    ;\n        return this._hash;\n    };\n    n.fromStruct = function(o) {\n        return new n(k(o));\n    };\n    n.fromString = function(o) {\n        return new n([l(o),]);\n    };\n    e.exports = n;\n});\n__d(\"FacebarNavigation\", [\"Arbiter\",\"csx\",\"DOMQuery\",\"FacebarStructuredText\",\"Input\",\"URI\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"csx\"), i = b(\"DOMQuery\"), j = b(\"FacebarStructuredText\"), k = b(\"Input\"), l = b(\"URI\"), m = null, n = null, o = null, p = false, q = true, r = (function() {\n        var v = {\n        }, w = function(x) {\n            return ((\"uri-\" + x.getQualifiedURI().toString()));\n        };\n        return {\n            set: function(x, y) {\n                v[w(x)] = y;\n            },\n            get: function(x) {\n                return v[w(x)];\n            }\n        };\n    })();\n    function s(v, w) {\n        o = v;\n        p = w;\n        q = false;\n        t();\n    };\n;\n    function t() {\n        if (q) {\n            return;\n        }\n         else if (n) {\n            ((p && n.pageTransition()));\n            n.setPageQuery(o);\n            q = true;\n        }\n         else if (((((m && o)) && !k.getValue(m)))) {\n            k.setValue(m, ((o.structure.toString() + \" \")));\n        }\n        \n        \n    ;\n    ;\n    };\n;\n    g.subscribe(\"page_transition\", function(v, w) {\n        s(r.get(w.uri), true);\n    });\n    var u = {\n        registerInput: function(v) {\n            m = i.scry(v, \"._586f\")[0];\n            t();\n        },\n        registerBehavior: function(v) {\n            n = v;\n            t();\n        },\n        setPageQuery: function(v) {\n            r.set(l.getNextURI(), v);\n            v.structure = j.fromStruct(v.structure);\n            s(v, false);\n        }\n    };\n    e.exports = u;\n});");
// 1664
JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_190[0](o32,false,"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yy/r/lUdBiFiT5WF.js",o33);
// undefined
o32 = null;
// undefined
o33 = null;
// 1669
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_166[0], o28,o34);
// undefined
o28 = null;
// undefined
o34 = null;
// 1673
JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_169[0](false);
// 1679
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o7,"bigPipe.onPageletArrive({\n    display_dependency: [\"pagelet_main_column_personal\",],\n    content: {\n        pagelet_escape_hatch: {\n            container_id: \"u_0_r\"\n        }\n    },\n    jsmods: {\n        require: [[\"AddFriendButton\",\"init\",[\"m_0_1o\",],[{\n            __m: \"m_0_1o\"\n        },1055580469,false,\"profile_button\",\"none\",\"/ajax/add_friend/action.php\",null,null,null,false,],],[\"m_0_1p\",],[\"FriendListFlyoutController\",\"init\",[\"m_0_1p\",],[{\n            __m: \"m_0_1p\"\n        },50,],],[\"AddFriendButton\",\"init\",[\"m_0_1r\",],[{\n            __m: \"m_0_1r\"\n        },1055580469,null,\"profile_button\",\"none\",\"/ajax/add_friend/action.php\",\"\",true,null,false,null,0,],],[\"FriendStatus\",\"setSpecialLists\",[],[{\n            close: 1374283956118870,\n            acq: \"100006118350059_124542800973931\"\n        },],],],\n        instances: [[\"m_0_1p\",[\"ContextualDialog\",\"ContextualDialogArrow\",\"ContextualDialogDefaultTheme\",\"LayerRemoveOnHide\",\"LayerHideOnTransition\",\"LayerFadeOnShow\",\"ContextualLayerAutoFlip\",\"DialogHideOnSuccess\",\"m_0_1q\",],[{\n            width: 192,\n            context: null,\n            contextID: null,\n            contextSelector: null,\n            position: \"below\",\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                __m: \"ContextualLayerAutoFlip\"\n            },{\n                __m: \"DialogHideOnSuccess\"\n            },]\n        },{\n            __m: \"m_0_1q\"\n        },],3,],],\n        elements: [[\"m_0_1r\",\"u_0_o\",2,],[\"m_0_1o\",\"u_0_q\",2,],],\n        markup: [[\"m_0_1q\",{\n            __html: \"\\u003Cdiv\\u003E\\u003Cdiv\\u003E\\u003Cdiv\\u003E\\u003Cdiv class=\\\"FriendListFlyoutLoading\\\"\\u003E\\u003Cimg class=\\\"mvl center img\\\" src=\\\"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yk/r/LOOn0JtHNzb.gif\\\" alt=\\\"\\\" width=\\\"16\\\" height=\\\"16\\\" /\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],]\n    },\n    css: [\"ZtiRu\",\"W3Ky6\",\"0duP3\",],\n    bootloadable: {\n    },\n    resource_map: {\n    },\n    js: [\"AyUu6\",\"AsDOA\",\"3SGVa\",],\n    id: \"pagelet_escape_hatch\",\n    phase: 1\n});");
// 1680
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o7,"s59777a653b179d9e8cc116abbe8f9965a35842ca");
// 1681
geval("bigPipe.onPageletArrive({\n    display_dependency: [\"pagelet_main_column_personal\",],\n    JSBNG__content: {\n        pagelet_escape_hatch: {\n            container_id: \"u_0_r\"\n        }\n    },\n    jsmods: {\n        require: [[\"AddFriendButton\",\"init\",[\"m_0_1o\",],[{\n            __m: \"m_0_1o\"\n        },1055580469,false,\"profile_button\",\"none\",\"/ajax/add_friend/action.php\",null,null,null,false,],],[\"m_0_1p\",],[\"FriendListFlyoutController\",\"init\",[\"m_0_1p\",],[{\n            __m: \"m_0_1p\"\n        },50,],],[\"AddFriendButton\",\"init\",[\"m_0_1r\",],[{\n            __m: \"m_0_1r\"\n        },1055580469,null,\"profile_button\",\"none\",\"/ajax/add_friend/action.php\",\"\",true,null,false,null,0,],],[\"FriendStatus\",\"setSpecialLists\",[],[{\n            close: 1374283956118870,\n            acq: \"100006118350059_124542800973931\"\n        },],],],\n        instances: [[\"m_0_1p\",[\"ContextualDialog\",\"ContextualDialogArrow\",\"ContextualDialogDefaultTheme\",\"LayerRemoveOnHide\",\"LayerHideOnTransition\",\"LayerFadeOnShow\",\"ContextualLayerAutoFlip\",\"DialogHideOnSuccess\",\"m_0_1q\",],[{\n            width: 192,\n            context: null,\n            contextID: null,\n            contextSelector: null,\n            position: \"below\",\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                __m: \"ContextualLayerAutoFlip\"\n            },{\n                __m: \"DialogHideOnSuccess\"\n            },]\n        },{\n            __m: \"m_0_1q\"\n        },],3,],],\n        elements: [[\"m_0_1r\",\"u_0_o\",2,],[\"m_0_1o\",\"u_0_q\",2,],],\n        markup: [[\"m_0_1q\",{\n            __html: \"\\u003Cdiv\\u003E\\u003Cdiv\\u003E\\u003Cdiv\\u003E\\u003Cdiv class=\\\"FriendListFlyoutLoading\\\"\\u003E\\u003Cimg class=\\\"mvl center img\\\" src=\\\"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yk/r/LOOn0JtHNzb.gif\\\" alt=\\\"\\\" width=\\\"16\\\" height=\\\"16\\\" /\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],]\n    },\n    css: [\"ZtiRu\",\"W3Ky6\",\"0duP3\",],\n    bootloadable: {\n    },\n    resource_map: {\n    },\n    js: [\"AyUu6\",\"AsDOA\",\"3SGVa\",],\n    id: \"pagelet_escape_hatch\",\n    phase: 1\n});");
// 1700
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o7,"bigPipe.onPageletArrive({\n    display_dependency: [\"pagelet_main_column_personal\",],\n    content: {\n        pagelet_above_header_timeline: \"\"\n    },\n    jsmods: {\n        require: [[\"m_0_1s\",],[\"m_0_1u\",],[\"TimelineCurationNUXController\",\"init\",[\"m_0_1s\",\"m_0_1u\",],[{\n            next_step: \"add_button\",\n            dialogs: {\n                add_button: {\n                    __m: \"m_0_1s\"\n                },\n                privacy: {\n                    __m: \"m_0_1u\"\n                }\n            }\n        },],],],\n        instances: [[\"m_0_1s\",[\"ContextualDialog\",\"ContextualDialogArrow\",\"ContextualDialogDefaultTheme\",\"LayerRemoveOnHide\",\"LayerHideOnTransition\",\"LayerFadeOnShow\",\"m_0_1t\",],[{\n            width: 300,\n            context: null,\n            contextID: null,\n            contextSelector: null,\n            position: \"above\",\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_1t\"\n        },],3,],[\"m_0_1u\",[\"ContextualDialog\",\"ContextualDialogArrow\",\"ContextualDialogDefaultTheme\",\"LayerRemoveOnHide\",\"LayerHideOnTransition\",\"LayerFadeOnShow\",\"ContextualLayerAutoFlip\",\"DialogHideOnSuccess\",\"m_0_1v\",],[{\n            width: 300,\n            context: null,\n            contextID: null,\n            contextSelector: null,\n            position: \"right\",\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                __m: \"ContextualLayerAutoFlip\"\n            },{\n                __m: \"DialogHideOnSuccess\"\n            },]\n        },{\n            __m: \"m_0_1v\"\n        },],3,],],\n        define: [[\"AdsCurrencyConfig\",[],{\n            currencies: {\n                ARS: [\"{symbol} {amount}\",\"$\",100,],\n                AUD: [\"{symbol}{amount}\",\"$\",100,],\n                BOB: [\"{symbol} {amount}\",\"$b\",100,],\n                BRL: [\"{symbol} {amount}\",\"R$\",100,],\n                GBP: [\"{symbol}{amount}\",\"\\u00a3\",100,],\n                CAD: [\"{symbol}{amount}\",\"$\",100,],\n                CLP: [\"{symbol} {amount}\",\"$\",1,],\n                CNY: [\"{amount} {symbol}\",\"\\uffe5\",100,],\n                COP: [\"{symbol} {amount}\",\"$\",1,],\n                CRC: [\"{symbol}{amount}\",\"\\u20a1\",1,],\n                CZK: [\"{amount} {symbol}\",\"K\\u010d\",100,],\n                DKK: [\"{symbol} {amount}\",\"DKK\",100,],\n                EUR: [\"{symbol} {amount}\",\"\\u20ac\",100,],\n                GTQ: [\"{symbol}{amount}\",\"Q\",100,],\n                HNL: [\"{symbol} {amount}\",\"L.\",100,],\n                HKD: [\"{symbol}{amount}\",\"$\",100,],\n                HUF: [\"{amount} {symbol}\",\"Ft\",1,],\n                ISK: [\"{amount} {symbol}\",\"kr.\",1,],\n                INR: [\"{symbol} {amount}\",\"\\u0930\\u0941\",100,],\n                IDR: [\"{symbol} {amount}\",\"Rp\",1,],\n                ILS: [\"{symbol} {amount}\",\"\\u20aa\",100,],\n                JPY: [\"{symbol}{amount}\",\"\\u00a5\",1,],\n                KRW: [\"{symbol}{amount}\",\"\\u20a9\",1,],\n                MOP: [\"{symbol}{amount}\",\"MOP\",100,],\n                MYR: [\"{symbol}{amount}\",\"R\",100,],\n                MXN: [\"{symbol}{amount}\",\"$\",100,],\n                NZD: [\"{amount}{symbol}\",\"$\",100,],\n                NIO: [\"{symbol} {amount}\",\"C$\",100,],\n                NOK: [\"{symbol} {amount}\",\"NOK\",100,],\n                PYG: [\"{symbol} {amount}\",\"Gs\",1,],\n                PEN: [\"{symbol} {amount}\",\"S/.\",100,],\n                PHP: [\"{symbol}{amount}\",\"Php\",100,],\n                PLN: [\"{amount} {symbol}\",\"z\\u0142\",100,],\n                QAR: [\"{amount} {symbol}\",\"\\u0631.\\u0642.\",100,],\n                RON: [\"{amount} {symbol}\",\"lei\",100,],\n                RUB: [\"{amount}{symbol}\",\"RUB\",100,],\n                SAR: [\"{amount} {symbol}\",\"\\u0631.\\u0633.\",100,],\n                SGD: [\"{symbol}{amount}\",\"$\",100,],\n                ZAR: [\"{symbol} {amount}\",\"R\",100,],\n                SEK: [\"{amount} {symbol}\",\"kr\",100,],\n                CHF: [\"{symbol} {amount}\",\"CHF\",100,],\n                TWD: [\"{symbol}{amount}\",\"NT$\",1,],\n                THB: [\"{symbol}{amount}\",\"\\u0e3f\",100,],\n                TRY: [\"{amount} {symbol}\",\"TL\",100,],\n                AED: [\"{amount} {symbol}\",\"\\u062f.\\u0625.\",100,],\n                USD: [\"{symbol}{amount}\",\"$\",100,],\n                UYU: [\"{symbol} {amount}\",\"$U\",100,],\n                VEF: [\"{symbol} {amount}\",\"Bs\",100,],\n                VND: [\"{amount} {symbol}\",\"\\u20ab\",1,]\n            }\n        },168,],[\"TimelineDynamicSectionConfig\",[\"m_0_1w\",\"m_0_1x\",\"m_0_1y\",],{\n            smallThrobber: {\n                __m: \"m_0_1w\"\n            },\n            pager: {\n                __m: \"m_0_1x\"\n            },\n            throbber: {\n                __m: \"m_0_1y\"\n            },\n            skmapping: {\n                friends_recent: \"friends\",\n                friends_all: \"friends\",\n                friends_mutual: \"friends\",\n                photos_of: \"photos\",\n                photos_all: \"photos\",\n                photos_albums: \"photos\",\n                likes_recent: null,\n                info_all: \"info\",\n                music_my_music: \"music\",\n                music_favs: \"music\",\n                music_playlists: \"music\",\n                places_all: \"map\",\n                books_read: \"books\",\n                books_favorite: \"books\",\n                books_want: \"books\",\n                places_recent: null,\n                fitness_overview: \"fitness\",\n                fitness_daily_activity: null,\n                fitness_sports_i_play: null,\n                friends_featured: null,\n                places_want: null,\n                info_basic: \"info\",\n                info_contact: null,\n                fitness_running: \"fitness\",\n                fitness_cycling: \"fitness\",\n                friends_followers: \"friends\",\n                friends_following: \"friends\",\n                music_radio: \"music\",\n                info_history: \"info\",\n                games_play: \"games\",\n                products_want: null,\n                photos_archive: \"photos\",\n                notes_my_notes: \"notes\",\n                notes_drafts: \"notes\",\n                notes_about_me: \"notes\",\n                likes_sports_teams: \"likes\",\n                likes_activities: \"likes\",\n                likes_interests: \"likes\",\n                likes_other: \"likes\",\n                video_movies_watch: \"movies\",\n                video_tv_show_watch: \"tv\",\n                music_saved: \"music\",\n                video_movies_want: \"movies\",\n                video_tv_show_want: \"tv\",\n                video_movies_favorite: \"movies\",\n                video_tv_show_favorite: \"tv\",\n                friends_high_school: \"friends\",\n                friends_college: \"friends\",\n                friends_work: \"friends\",\n                friends_suggested: \"friends\",\n                apps_like: \"games\",\n                upcoming_events: \"events\",\n                past_events: \"events\",\n                likes_people: \"likes\",\n                likes_sports: \"likes\",\n                likes_athletes: \"likes\",\n                fitness_report: null,\n                groups_member: \"groups\",\n                music_all_time: \"music\",\n                music_heavy_rotation: \"music\",\n                photos_album: \"photos\",\n                photos_untagged: \"photos\",\n                music_mutual: \"music\",\n                likes_foods: \"likes\",\n                likes_restaurants: \"likes\",\n                restaurants_visited: \"restaurants\",\n                restaurants_want: \"restaurants\",\n                likes_websites: \"likes\",\n                likes_clothing: \"likes\",\n                followers: \"friends\",\n                following: \"friends\",\n                media_set: \"photos\",\n                photos_stream: \"photos\",\n                photos_synced: \"photos\"\n            }\n        },68,],[\"AppSectionCurationState\",[],{\n            showItems: \"show_items\",\n            showApps: \"show_apps\",\n            hide: \"hide\"\n        },145,],[\"NumberFormatConfig\",[],{\n            decimalSeparator: \".\",\n            numberDelimiter: \",\"\n        },54,],],\n        markup: [[\"m_0_1t\",{\n            __html: \"\\u003Cdiv\\u003E\\u003Cdiv class=\\\"_53iv\\\"\\u003E\\u003Cdiv\\u003E\\u003Ca data-hover=\\\"tooltip\\\" aria-label=\\\"Close\\\" class=\\\"layerButton rfloat uiCloseButton uiCloseButtonSmall\\\" href=\\\"#\\\" role=\\\"button\\\" data-action=\\\"close\\\"\\u003E\\u003C/a\\u003EUse the [+] button or search tool to add a story about movies, books or something else you enjoy.\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"uiOverlayFooter _572u uiBoxGray topborder\\\"\\u003E\\u003Ca class=\\\"_42ft _42fu layerButton uiOverlayButton selected _42g-\\\" role=\\\"button\\\" href=\\\"#\\\" data-action=\\\"next\\\"\\u003ENext\\u003C/a\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_1v\",{\n            __html: \"\\u003Cdiv\\u003E\\u003Cdiv class=\\\"_53iv\\\"\\u003E\\u003Cdiv\\u003E\\u003Ca data-hover=\\\"tooltip\\\" aria-label=\\\"Close\\\" class=\\\"layerButton rfloat uiCloseButton uiCloseButtonSmall\\\" href=\\\"#\\\" role=\\\"button\\\" data-action=\\\"done\\\"\\u003E\\u003C/a\\u003EUse the audience selector to choose who can see what you add [+].\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"uiOverlayFooter _572u uiBoxGray topborder\\\"\\u003E\\u003Ca class=\\\"_42ft _42fu layerButton uiOverlayButton selected _42g-\\\" role=\\\"button\\\" href=\\\"#\\\" data-action=\\\"done\\\"\\u003EDone\\u003C/a\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_1w\",{\n            __html: \"\\u003Cimg class=\\\"img\\\" src=\\\"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yb/r/GsNJNwuI-UM.gif\\\" alt=\\\"\\\" width=\\\"16\\\" height=\\\"11\\\" /\\u003E\"\n        },2,],[\"m_0_1x\",{\n            __html: \"\\u003Ca class=\\\"_3t3\\\" href=\\\"#\\\" data-referrer=\\\"timeline_collections_overview_see_all\\\" role=\\\"button\\\"\\u003E\\u003Cspan class=\\\"_3t5 fwb\\\"\\u003ESee All\\u003C/span\\u003E\\u003Cimg class=\\\"uiLoadingIndicatorAsync img\\\" src=\\\"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yb/r/GsNJNwuI-UM.gif\\\" alt=\\\"\\\" width=\\\"16\\\" height=\\\"11\\\" /\\u003E\\u003C/a\\u003E\"\n        },2,],[\"m_0_1y\",{\n            __html: \"\\u003Cimg class=\\\"_359 img\\\" src=\\\"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/y9/r/jKEcVPZFk-2.gif\\\" alt=\\\"\\\" width=\\\"32\\\" height=\\\"32\\\" /\\u003E\"\n        },2,],]\n    },\n    css: [\"W3Ky6\",\"ZtiRu\",],\n    bootloadable: {\n    },\n    resource_map: {\n    },\n    js: [\"AyUu6\",\"AsDOA\",\"jsIYP\",\"3SGVa\",\"OJTM4\",],\n    id: \"pagelet_above_header_timeline\",\n    phase: 1\n});");
// 1701
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o7,"s44966f4b4efc7bf5a05845d74c60242fea5ee0dd");
// 1702
geval("bigPipe.onPageletArrive({\n    display_dependency: [\"pagelet_main_column_personal\",],\n    JSBNG__content: {\n        pagelet_above_header_timeline: \"\"\n    },\n    jsmods: {\n        require: [[\"m_0_1s\",],[\"m_0_1u\",],[\"TimelineCurationNUXController\",\"init\",[\"m_0_1s\",\"m_0_1u\",],[{\n            next_step: \"add_button\",\n            dialogs: {\n                add_button: {\n                    __m: \"m_0_1s\"\n                },\n                privacy: {\n                    __m: \"m_0_1u\"\n                }\n            }\n        },],],],\n        instances: [[\"m_0_1s\",[\"ContextualDialog\",\"ContextualDialogArrow\",\"ContextualDialogDefaultTheme\",\"LayerRemoveOnHide\",\"LayerHideOnTransition\",\"LayerFadeOnShow\",\"m_0_1t\",],[{\n            width: 300,\n            context: null,\n            contextID: null,\n            contextSelector: null,\n            position: \"above\",\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_1t\"\n        },],3,],[\"m_0_1u\",[\"ContextualDialog\",\"ContextualDialogArrow\",\"ContextualDialogDefaultTheme\",\"LayerRemoveOnHide\",\"LayerHideOnTransition\",\"LayerFadeOnShow\",\"ContextualLayerAutoFlip\",\"DialogHideOnSuccess\",\"m_0_1v\",],[{\n            width: 300,\n            context: null,\n            contextID: null,\n            contextSelector: null,\n            position: \"right\",\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                __m: \"ContextualLayerAutoFlip\"\n            },{\n                __m: \"DialogHideOnSuccess\"\n            },]\n        },{\n            __m: \"m_0_1v\"\n        },],3,],],\n        define: [[\"AdsCurrencyConfig\",[],{\n            currencies: {\n                ARS: [\"{symbol} {amount}\",\"$\",100,],\n                AUD: [\"{symbol}{amount}\",\"$\",100,],\n                BOB: [\"{symbol} {amount}\",\"$b\",100,],\n                BRL: [\"{symbol} {amount}\",\"R$\",100,],\n                GBP: [\"{symbol}{amount}\",\"\\u00a3\",100,],\n                CAD: [\"{symbol}{amount}\",\"$\",100,],\n                CLP: [\"{symbol} {amount}\",\"$\",1,],\n                CNY: [\"{amount} {symbol}\",\"\\uffe5\",100,],\n                COP: [\"{symbol} {amount}\",\"$\",1,],\n                CRC: [\"{symbol}{amount}\",\"\\u20a1\",1,],\n                CZK: [\"{amount} {symbol}\",\"K\\u010d\",100,],\n                DKK: [\"{symbol} {amount}\",\"DKK\",100,],\n                EUR: [\"{symbol} {amount}\",\"\\u20ac\",100,],\n                GTQ: [\"{symbol}{amount}\",\"Q\",100,],\n                HNL: [\"{symbol} {amount}\",\"L.\",100,],\n                HKD: [\"{symbol}{amount}\",\"$\",100,],\n                HUF: [\"{amount} {symbol}\",\"Ft\",1,],\n                ISK: [\"{amount} {symbol}\",\"kr.\",1,],\n                INR: [\"{symbol} {amount}\",\"\\u0930\\u0941\",100,],\n                IDR: [\"{symbol} {amount}\",\"Rp\",1,],\n                ILS: [\"{symbol} {amount}\",\"\\u20aa\",100,],\n                JPY: [\"{symbol}{amount}\",\"\\u00a5\",1,],\n                KRW: [\"{symbol}{amount}\",\"\\u20a9\",1,],\n                MOP: [\"{symbol}{amount}\",\"MOP\",100,],\n                MYR: [\"{symbol}{amount}\",\"R\",100,],\n                MXN: [\"{symbol}{amount}\",\"$\",100,],\n                NZD: [\"{amount}{symbol}\",\"$\",100,],\n                NIO: [\"{symbol} {amount}\",\"C$\",100,],\n                NOK: [\"{symbol} {amount}\",\"NOK\",100,],\n                PYG: [\"{symbol} {amount}\",\"Gs\",1,],\n                PEN: [\"{symbol} {amount}\",\"S/.\",100,],\n                PHP: [\"{symbol}{amount}\",\"Php\",100,],\n                PLN: [\"{amount} {symbol}\",\"z\\u0142\",100,],\n                QAR: [\"{amount} {symbol}\",\"\\u0631.\\u0642.\",100,],\n                RON: [\"{amount} {symbol}\",\"lei\",100,],\n                RUB: [\"{amount}{symbol}\",\"RUB\",100,],\n                SAR: [\"{amount} {symbol}\",\"\\u0631.\\u0633.\",100,],\n                SGD: [\"{symbol}{amount}\",\"$\",100,],\n                ZAR: [\"{symbol} {amount}\",\"R\",100,],\n                SEK: [\"{amount} {symbol}\",\"kr\",100,],\n                CHF: [\"{symbol} {amount}\",\"CHF\",100,],\n                TWD: [\"{symbol}{amount}\",\"NT$\",1,],\n                THB: [\"{symbol}{amount}\",\"\\u0e3f\",100,],\n                TRY: [\"{amount} {symbol}\",\"TL\",100,],\n                AED: [\"{amount} {symbol}\",\"\\u062f.\\u0625.\",100,],\n                USD: [\"{symbol}{amount}\",\"$\",100,],\n                UYU: [\"{symbol} {amount}\",\"$U\",100,],\n                VEF: [\"{symbol} {amount}\",\"Bs\",100,],\n                VND: [\"{amount} {symbol}\",\"\\u20ab\",1,]\n            }\n        },168,],[\"TimelineDynamicSectionConfig\",[\"m_0_1w\",\"m_0_1x\",\"m_0_1y\",],{\n            smallThrobber: {\n                __m: \"m_0_1w\"\n            },\n            pager: {\n                __m: \"m_0_1x\"\n            },\n            throbber: {\n                __m: \"m_0_1y\"\n            },\n            skmapping: {\n                friends_recent: \"friends\",\n                friends_all: \"friends\",\n                friends_mutual: \"friends\",\n                photos_of: \"photos\",\n                photos_all: \"photos\",\n                photos_albums: \"photos\",\n                likes_recent: null,\n                info_all: \"info\",\n                music_my_music: \"music\",\n                music_favs: \"music\",\n                music_playlists: \"music\",\n                places_all: \"map\",\n                books_read: \"books\",\n                books_favorite: \"books\",\n                books_want: \"books\",\n                places_recent: null,\n                fitness_overview: \"fitness\",\n                fitness_daily_activity: null,\n                fitness_sports_i_play: null,\n                friends_featured: null,\n                places_want: null,\n                info_basic: \"info\",\n                info_contact: null,\n                fitness_running: \"fitness\",\n                fitness_cycling: \"fitness\",\n                friends_followers: \"friends\",\n                friends_following: \"friends\",\n                music_radio: \"music\",\n                info_history: \"info\",\n                games_play: \"games\",\n                products_want: null,\n                photos_archive: \"photos\",\n                notes_my_notes: \"notes\",\n                notes_drafts: \"notes\",\n                notes_about_me: \"notes\",\n                likes_sports_teams: \"likes\",\n                likes_activities: \"likes\",\n                likes_interests: \"likes\",\n                likes_other: \"likes\",\n                video_movies_watch: \"movies\",\n                video_tv_show_watch: \"tv\",\n                music_saved: \"music\",\n                video_movies_want: \"movies\",\n                video_tv_show_want: \"tv\",\n                video_movies_favorite: \"movies\",\n                video_tv_show_favorite: \"tv\",\n                friends_high_school: \"friends\",\n                friends_college: \"friends\",\n                friends_work: \"friends\",\n                friends_suggested: \"friends\",\n                apps_like: \"games\",\n                upcoming_events: \"events\",\n                past_events: \"events\",\n                likes_people: \"likes\",\n                likes_sports: \"likes\",\n                likes_athletes: \"likes\",\n                fitness_report: null,\n                groups_member: \"groups\",\n                music_all_time: \"music\",\n                music_heavy_rotation: \"music\",\n                photos_album: \"photos\",\n                photos_untagged: \"photos\",\n                music_mutual: \"music\",\n                likes_foods: \"likes\",\n                likes_restaurants: \"likes\",\n                restaurants_visited: \"restaurants\",\n                restaurants_want: \"restaurants\",\n                likes_websites: \"likes\",\n                likes_clothing: \"likes\",\n                followers: \"friends\",\n                following: \"friends\",\n                media_set: \"photos\",\n                photos_stream: \"photos\",\n                photos_synced: \"photos\"\n            }\n        },68,],[\"AppSectionCurationState\",[],{\n            showItems: \"show_items\",\n            showApps: \"show_apps\",\n            hide: \"hide\"\n        },145,],[\"NumberFormatConfig\",[],{\n            decimalSeparator: \".\",\n            numberDelimiter: \",\"\n        },54,],],\n        markup: [[\"m_0_1t\",{\n            __html: \"\\u003Cdiv\\u003E\\u003Cdiv class=\\\"_53iv\\\"\\u003E\\u003Cdiv\\u003E\\u003Ca data-hover=\\\"tooltip\\\" aria-label=\\\"Close\\\" class=\\\"layerButton rfloat uiCloseButton uiCloseButtonSmall\\\" href=\\\"#\\\" role=\\\"button\\\" data-action=\\\"close\\\"\\u003E\\u003C/a\\u003EUse the [+] button or search tool to add a story about movies, books or something else you enjoy.\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"uiOverlayFooter _572u uiBoxGray topborder\\\"\\u003E\\u003Ca class=\\\"_42ft _42fu layerButton uiOverlayButton selected _42g-\\\" role=\\\"button\\\" href=\\\"#\\\" data-action=\\\"next\\\"\\u003ENext\\u003C/a\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_1v\",{\n            __html: \"\\u003Cdiv\\u003E\\u003Cdiv class=\\\"_53iv\\\"\\u003E\\u003Cdiv\\u003E\\u003Ca data-hover=\\\"tooltip\\\" aria-label=\\\"Close\\\" class=\\\"layerButton rfloat uiCloseButton uiCloseButtonSmall\\\" href=\\\"#\\\" role=\\\"button\\\" data-action=\\\"done\\\"\\u003E\\u003C/a\\u003EUse the audience selector to choose who can see what you add [+].\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"uiOverlayFooter _572u uiBoxGray topborder\\\"\\u003E\\u003Ca class=\\\"_42ft _42fu layerButton uiOverlayButton selected _42g-\\\" role=\\\"button\\\" href=\\\"#\\\" data-action=\\\"done\\\"\\u003EDone\\u003C/a\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_1w\",{\n            __html: \"\\u003Cimg class=\\\"img\\\" src=\\\"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yb/r/GsNJNwuI-UM.gif\\\" alt=\\\"\\\" width=\\\"16\\\" height=\\\"11\\\" /\\u003E\"\n        },2,],[\"m_0_1x\",{\n            __html: \"\\u003Ca class=\\\"_3t3\\\" href=\\\"#\\\" data-referrer=\\\"timeline_collections_overview_see_all\\\" role=\\\"button\\\"\\u003E\\u003Cspan class=\\\"_3t5 fwb\\\"\\u003ESee All\\u003C/span\\u003E\\u003Cimg class=\\\"uiLoadingIndicatorAsync img\\\" src=\\\"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yb/r/GsNJNwuI-UM.gif\\\" alt=\\\"\\\" width=\\\"16\\\" height=\\\"11\\\" /\\u003E\\u003C/a\\u003E\"\n        },2,],[\"m_0_1y\",{\n            __html: \"\\u003Cimg class=\\\"_359 img\\\" src=\\\"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/y9/r/jKEcVPZFk-2.gif\\\" alt=\\\"\\\" width=\\\"32\\\" height=\\\"32\\\" /\\u003E\"\n        },2,],]\n    },\n    css: [\"W3Ky6\",\"ZtiRu\",],\n    bootloadable: {\n    },\n    resource_map: {\n    },\n    js: [\"AyUu6\",\"AsDOA\",\"jsIYP\",\"3SGVa\",\"OJTM4\",],\n    id: \"pagelet_above_header_timeline\",\n    phase: 1\n});");
// 1721
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o7,"bigPipe.onPageletArrive({\n    display_dependency: [\"pagelet_main_column_personal\",],\n    is_last: true,\n    content: {\n        pagelet_timeline_profile_actions: {\n            container_id: \"u_0_16\"\n        }\n    },\n    jsmods: {\n        require: [[\"m_0_1z\",],[\"m_0_20\",],[\"ButtonGroupMonitor\",],[\"SelectorDeprecated\",],[\"m_0_24\",],[\"SubscribeButton\",\"init\",[\"m_0_27\",\"m_0_26\",\"m_0_28\",],[{\n            __m: \"m_0_27\"\n        },{\n            __m: \"m_0_26\"\n        },{\n            __m: \"m_0_28\"\n        },\"1055580469\",0,false,],],[\"m_0_27\",],[\"m_0_28\",],[\"m_0_2d\",],[\"m_0_2c\",],[\"AddFriendButton\",\"init\",[\"m_0_2g\",],[{\n            __m: \"m_0_2g\"\n        },1055580469,\"http://jsbngssl.www.facebook.com/LawlabeeTheWallaby?sk=wall\",\"profile_button\",\"none\",\"/ajax/add_friend/action.php\",\"\",true,null,false,null,0,],],[\"FriendStatus\",\"setSpecialLists\",[],[{\n            close: 1374283956118870,\n            acq: \"100006118350059_124542800973931\"\n        },],],],\n        instances: [[\"m_0_1z\",[\"ButtonGroup\",\"m_0_21\",],[{\n            __m: \"m_0_21\"\n        },],1,],[\"m_0_20\",[\"ButtonGroup\",\"m_0_22\",],[{\n            __m: \"m_0_22\"\n        },],1,],[\"m_0_24\",[\"AsyncMenu\",\"m_0_25\",],[\"/ajax/lists/interests_submenu.php?profile_id=1055580469&list_location=gear_menu\",{\n            __m: \"m_0_25\"\n        },],2,],[\"m_0_27\",[\"SwapButtonDEPRECATED\",\"m_0_26\",\"m_0_29\",],[{\n            __m: \"m_0_26\"\n        },{\n            __m: \"m_0_29\"\n        },false,],3,],[\"m_0_28\",[\"HoverButton\",\"m_0_2a\",\"m_0_2c\",\"m_0_2b\",],[{\n            __m: \"m_0_2a\"\n        },{\n            __m: \"m_0_2c\"\n        },{\n            __m: \"m_0_2b\"\n        },\"/ajax/lists/interests_menu.php?profile_id=1055580469&list_location=follow_1&follow_location=1\",],3,],[\"m_0_2d\",[\"ContextualDialog\",\"ContextualDialogArrow\",\"ContextualDialogDefaultTheme\",\"LayerRemoveOnHide\",\"LayerHideOnTransition\",\"LayerFadeOnShow\",\"LayerHideOnEscape\",\"ContextualLayerAutoFlip\",\"DialogHideOnSuccess\",\"m_0_2e\",],[{\n            width: null,\n            context: null,\n            contextID: null,\n            contextSelector: null,\n            position: \"below\",\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                __m: \"LayerHideOnEscape\"\n            },{\n                __m: \"ContextualLayerAutoFlip\"\n            },{\n                __m: \"DialogHideOnSuccess\"\n            },]\n        },{\n            __m: \"m_0_2e\"\n        },],3,],[\"m_0_2c\",[\"HoverFlyout\",\"m_0_2d\",\"m_0_2f\",],[{\n            __m: \"m_0_2d\"\n        },{\n            __m: \"m_0_2f\"\n        },150,150,],3,],],\n        elements: [[\"m_0_21\",\"u_0_s\",2,],[\"m_0_22\",\"u_0_t\",2,],[\"m_0_23\",\"u_0_u\",2,],[\"m_0_25\",\"u_0_z\",2,],[\"m_0_26\",\"u_0_10\",4,],[\"m_0_29\",\"u_0_11\",2,],[\"m_0_2b\",\"u_0_12\",2,\"m_0_2e\",],[\"m_0_2a\",\"u_0_11\",2,],[\"m_0_2f\",\"u_0_11\",2,],[\"m_0_2g\",\"u_0_14\",2,],],\n        markup: [[\"m_0_2e\",{\n            __html: \"\\u003Cdiv\\u003E\\u003Cdiv\\u003E\\u003Cdiv\\u003E\\u003Cdiv id=\\\"u_0_12\\\"\\u003E\\u003Cimg class=\\\"mal pal _52ng center img\\\" src=\\\"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yk/r/LOOn0JtHNzb.gif\\\" alt=\\\"\\\" width=\\\"16\\\" height=\\\"16\\\" /\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },3,],]\n    },\n    css: [\"W3Ky6\",\"ZtiRu\",\"0duP3\",],\n    bootloadable: {\n    },\n    resource_map: {\n    },\n    js: [\"AyUu6\",\"AsDOA\",\"jsIYP\",\"bUzfU\",\"3SGVa\",],\n    jscc_map: \"({\\\"jo1F7acLCCEktuSNmv0\\\":function(){return new SubMenu()}})\",\n    onload: [\"JSCC.get(\\\"jo1F7acLCCEktuSNmv0\\\").init($(\\\"u_0_v\\\"), $(\\\"u_0_w\\\"), $(\\\"u_0_x\\\"), $(\\\"u_0_y\\\"));\",\"JSCC.get(\\\"jo1F7acLCCEktuSNmv0\\\").initAsyncChildMenu(require(\\\"m_0_24\\\"));\",],\n    id: \"pagelet_timeline_profile_actions\",\n    phase: 1\n});");
// 1722
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o7,"sf92807471072e89943a425892a865905c874a658");
// 1723
geval("bigPipe.onPageletArrive({\n    display_dependency: [\"pagelet_main_column_personal\",],\n    is_last: true,\n    JSBNG__content: {\n        pagelet_timeline_profile_actions: {\n            container_id: \"u_0_16\"\n        }\n    },\n    jsmods: {\n        require: [[\"m_0_1z\",],[\"m_0_20\",],[\"ButtonGroupMonitor\",],[\"SelectorDeprecated\",],[\"m_0_24\",],[\"SubscribeButton\",\"init\",[\"m_0_27\",\"m_0_26\",\"m_0_28\",],[{\n            __m: \"m_0_27\"\n        },{\n            __m: \"m_0_26\"\n        },{\n            __m: \"m_0_28\"\n        },\"1055580469\",0,false,],],[\"m_0_27\",],[\"m_0_28\",],[\"m_0_2d\",],[\"m_0_2c\",],[\"AddFriendButton\",\"init\",[\"m_0_2g\",],[{\n            __m: \"m_0_2g\"\n        },1055580469,\"http://jsbngssl.www.facebook.com/LawlabeeTheWallaby?sk=wall\",\"profile_button\",\"none\",\"/ajax/add_friend/action.php\",\"\",true,null,false,null,0,],],[\"FriendStatus\",\"setSpecialLists\",[],[{\n            close: 1374283956118870,\n            acq: \"100006118350059_124542800973931\"\n        },],],],\n        instances: [[\"m_0_1z\",[\"ButtonGroup\",\"m_0_21\",],[{\n            __m: \"m_0_21\"\n        },],1,],[\"m_0_20\",[\"ButtonGroup\",\"m_0_22\",],[{\n            __m: \"m_0_22\"\n        },],1,],[\"m_0_24\",[\"AsyncMenu\",\"m_0_25\",],[\"/ajax/lists/interests_submenu.php?profile_id=1055580469&list_location=gear_menu\",{\n            __m: \"m_0_25\"\n        },],2,],[\"m_0_27\",[\"SwapButtonDEPRECATED\",\"m_0_26\",\"m_0_29\",],[{\n            __m: \"m_0_26\"\n        },{\n            __m: \"m_0_29\"\n        },false,],3,],[\"m_0_28\",[\"HoverButton\",\"m_0_2a\",\"m_0_2c\",\"m_0_2b\",],[{\n            __m: \"m_0_2a\"\n        },{\n            __m: \"m_0_2c\"\n        },{\n            __m: \"m_0_2b\"\n        },\"/ajax/lists/interests_menu.php?profile_id=1055580469&list_location=follow_1&follow_location=1\",],3,],[\"m_0_2d\",[\"ContextualDialog\",\"ContextualDialogArrow\",\"ContextualDialogDefaultTheme\",\"LayerRemoveOnHide\",\"LayerHideOnTransition\",\"LayerFadeOnShow\",\"LayerHideOnEscape\",\"ContextualLayerAutoFlip\",\"DialogHideOnSuccess\",\"m_0_2e\",],[{\n            width: null,\n            context: null,\n            contextID: null,\n            contextSelector: null,\n            position: \"below\",\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                __m: \"LayerHideOnEscape\"\n            },{\n                __m: \"ContextualLayerAutoFlip\"\n            },{\n                __m: \"DialogHideOnSuccess\"\n            },]\n        },{\n            __m: \"m_0_2e\"\n        },],3,],[\"m_0_2c\",[\"HoverFlyout\",\"m_0_2d\",\"m_0_2f\",],[{\n            __m: \"m_0_2d\"\n        },{\n            __m: \"m_0_2f\"\n        },150,150,],3,],],\n        elements: [[\"m_0_21\",\"u_0_s\",2,],[\"m_0_22\",\"u_0_t\",2,],[\"m_0_23\",\"u_0_u\",2,],[\"m_0_25\",\"u_0_z\",2,],[\"m_0_26\",\"u_0_10\",4,],[\"m_0_29\",\"u_0_11\",2,],[\"m_0_2b\",\"u_0_12\",2,\"m_0_2e\",],[\"m_0_2a\",\"u_0_11\",2,],[\"m_0_2f\",\"u_0_11\",2,],[\"m_0_2g\",\"u_0_14\",2,],],\n        markup: [[\"m_0_2e\",{\n            __html: \"\\u003Cdiv\\u003E\\u003Cdiv\\u003E\\u003Cdiv\\u003E\\u003Cdiv id=\\\"u_0_12\\\"\\u003E\\u003Cimg class=\\\"mal pal _52ng center img\\\" src=\\\"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yk/r/LOOn0JtHNzb.gif\\\" alt=\\\"\\\" width=\\\"16\\\" height=\\\"16\\\" /\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },3,],]\n    },\n    css: [\"W3Ky6\",\"ZtiRu\",\"0duP3\",],\n    bootloadable: {\n    },\n    resource_map: {\n    },\n    js: [\"AyUu6\",\"AsDOA\",\"jsIYP\",\"bUzfU\",\"3SGVa\",],\n    jscc_map: \"({\\\"jo1F7acLCCEktuSNmv0\\\":function(){return new SubMenu()}})\",\n    JSBNG__onload: [\"JSCC.get(\\\"jo1F7acLCCEktuSNmv0\\\").init($(\\\"u_0_v\\\"), $(\\\"u_0_w\\\"), $(\\\"u_0_x\\\"), $(\\\"u_0_y\\\"));\",\"JSCC.get(\\\"jo1F7acLCCEktuSNmv0\\\").initAsyncChildMenu(require(\\\"m_0_24\\\"));\",],\n    id: \"pagelet_timeline_profile_actions\",\n    phase: 1\n});");
// 1742
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o7,"bigPipe.onPageletArrive({\n    content: {\n        pagelet_timeline_recent: {\n            container_id: \"u_0_19\"\n        }\n    },\n    jsmods: {\n        require: [[\"TimelineContentLoader\",\"removeSection\",[],[\"month_1969_12\",],],[\"TimelineLogging\",\"init\",[],[1055580469,],],[\"TimelineContentLoader\",\"enableScrollLoadOnClick\",[],[\"u_0_18_scroll_trigger\",\"recent\",250,],],[\"TimelineController\",],[\"Arbiter\",\"inform\",[],[\"TimelineConstants/sectionLoaded\",{\n            key: \"recent\"\n        },],],[\"TimelineStickyRightColumn\",\"init\",[],[],],]\n    },\n    css: [\"ZtiRu\",\"W3Ky6\",],\n    bootloadable: {\n    },\n    resource_map: {\n    },\n    js: [\"AyUu6\",\"AsDOA\",\"jsIYP\",\"OJTM4\",\"+h1d2\",\"3SGVa\",],\n    id: \"pagelet_timeline_recent\",\n    phase: 2\n});");
// 1743
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o7,"sae96e0cef5e25242b9be2e67c82b708f9bc8f291");
// 1744
geval("bigPipe.onPageletArrive({\n    JSBNG__content: {\n        pagelet_timeline_recent: {\n            container_id: \"u_0_19\"\n        }\n    },\n    jsmods: {\n        require: [[\"TimelineContentLoader\",\"removeSection\",[],[\"month_1969_12\",],],[\"TimelineLogging\",\"init\",[],[1055580469,],],[\"TimelineContentLoader\",\"enableScrollLoadOnClick\",[],[\"u_0_18_scroll_trigger\",\"recent\",250,],],[\"TimelineController\",],[\"Arbiter\",\"inform\",[],[\"TimelineConstants/sectionLoaded\",{\n            key: \"recent\"\n        },],],[\"TimelineStickyRightColumn\",\"init\",[],[],],]\n    },\n    css: [\"ZtiRu\",\"W3Ky6\",],\n    bootloadable: {\n    },\n    resource_map: {\n    },\n    js: [\"AyUu6\",\"AsDOA\",\"jsIYP\",\"OJTM4\",\"+h1d2\",\"3SGVa\",],\n    id: \"pagelet_timeline_recent\",\n    phase: 2\n});");
// 1751
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o7,"bigPipe.onPageletArrive({\n    append: \"u_0_17_left\",\n    display_dependency: [\"pagelet_timeline_recent\",],\n    content: {\n        pagelet_timeline_composer: \"\"\n    },\n    bootloadable: {\n    },\n    resource_map: {\n    },\n    id: \"pagelet_timeline_composer\",\n    phase: 2\n});");
// 1752
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o7,"s565187d25e949806276f66d0839cfc734c328513");
// 1753
geval("bigPipe.onPageletArrive({\n    append: \"u_0_17_left\",\n    display_dependency: [\"pagelet_timeline_recent\",],\n    JSBNG__content: {\n        pagelet_timeline_composer: \"\"\n    },\n    bootloadable: {\n    },\n    resource_map: {\n    },\n    id: \"pagelet_timeline_composer\",\n    phase: 2\n});");
// 1759
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o7,"bigPipe.onPageletArrive({\n    append: \"u_0_17_left\",\n    display_dependency: [\"pagelet_timeline_recent\",\"pagelet_timeline_composer\",],\n    is_last: true,\n    content: {\n        pagelet_timeline_recent_segment_0_0_left: {\n            container_id: \"u_0_20\"\n        }\n    },\n    jsmods: {\n        require: [[\"TimelineCapsule\",\"loadTwoColumnUnits\",[],[\"u_0_17\",],],[\"TimelineStickyRightColumn\",\"adjust\",[],[],],[\"m_0_2h\",],[\"m_0_2j\",],[\"m_0_2k\",],[\"m_0_2m\",],[\"m_0_2o\",],[\"m_0_2p\",],[\"m_0_2r\",],[\"m_0_2t\",],[\"m_0_2u\",],[\"m_0_2w\",],[\"m_0_2y\",],[\"m_0_2z\",],[\"Hovercard\",],[\"m_0_36\",],[\"Tooltip\",],[\"m_0_39\",],[\"m_0_3b\",],[\"m_0_3e\",],],\n        instances: [[\"m_0_2h\",[\"PopoverLoadingMenu\",\"MenuTheme\",],[{\n            theme: {\n                __m: \"MenuTheme\"\n            }\n        },],3,],[\"m_0_2j\",[\"PopoverAsyncMenu\",\"m_0_2k\",\"m_0_2i\",\"m_0_2h\",\"PopoverMenuOverlappingBorder\",],[{\n            __m: \"m_0_2k\"\n        },{\n            __m: \"m_0_2i\"\n        },{\n            __m: \"m_0_2h\"\n        },\"/ajax/timeline/curation_menu_new.php?unit_data%5Bunit_type%5D=3&unit_data%5Bhash%5D=3857418892059122853&unit_data%5Bwindow_size%5D=3&unit_data%5Bwindow_start_time%5D=0&unit_data%5Bwindow_end_time%5D=1375340399&unit_data%5Bunit_start_time%5D=1372262734&unit_data%5Bunit_end_time%5D=1372262734&dom_id=u_0_1b&timestamp=1372262734&impression_id=856ec6cb&is_start=1&friendship_page_id=0&is_pinned_page_post=0&profile_id=1055580469&start=0&end=1375340399&query_type=39\",[{\n            __m: \"PopoverMenuOverlappingBorder\"\n        },],],1,],[\"m_0_2k\",[\"Popover\",\"m_0_2l\",\"m_0_2i\",\"ContextualLayerAsyncRelative\",],[{\n            __m: \"m_0_2l\"\n        },{\n            __m: \"m_0_2i\"\n        },[{\n            __m: \"ContextualLayerAsyncRelative\"\n        },],{\n            alignh: \"right\"\n        },],3,],[\"m_0_2m\",[\"PopoverLoadingMenu\",\"MenuTheme\",],[{\n            theme: {\n                __m: \"MenuTheme\"\n            }\n        },],3,],[\"m_0_2o\",[\"PopoverAsyncMenu\",\"m_0_2p\",\"m_0_2n\",\"m_0_2m\",\"PopoverMenuOverlappingBorder\",],[{\n            __m: \"m_0_2p\"\n        },{\n            __m: \"m_0_2n\"\n        },{\n            __m: \"m_0_2m\"\n        },\"/ajax/timeline/curation_menu_new.php?unit_data%5Bunit_type%5D=3&unit_data%5Bhash%5D=-6185676099150237519&unit_data%5Bwindow_size%5D=3&unit_data%5Bwindow_start_time%5D=0&unit_data%5Bwindow_end_time%5D=1375340399&unit_data%5Bunit_start_time%5D=1372627013&unit_data%5Bunit_end_time%5D=1372627013&dom_id=u_0_1f&timestamp=1372627013&impression_id=856ec6cb&is_start=1&friendship_page_id=0&is_pinned_page_post=0&profile_id=1055580469&start=0&end=1375340399&query_type=39\",[{\n            __m: \"PopoverMenuOverlappingBorder\"\n        },],],1,],[\"m_0_2p\",[\"Popover\",\"m_0_2q\",\"m_0_2n\",\"ContextualLayerAsyncRelative\",],[{\n            __m: \"m_0_2q\"\n        },{\n            __m: \"m_0_2n\"\n        },[{\n            __m: \"ContextualLayerAsyncRelative\"\n        },],{\n            alignh: \"right\"\n        },],3,],[\"m_0_2r\",[\"PopoverLoadingMenu\",\"MenuTheme\",],[{\n            theme: {\n                __m: \"MenuTheme\"\n            }\n        },],3,],[\"m_0_2t\",[\"PopoverAsyncMenu\",\"m_0_2u\",\"m_0_2s\",\"m_0_2r\",\"PopoverMenuOverlappingBorder\",],[{\n            __m: \"m_0_2u\"\n        },{\n            __m: \"m_0_2s\"\n        },{\n            __m: \"m_0_2r\"\n        },\"/ajax/timeline/curation_menu_new.php?unit_data%5Bunit_type%5D=2&unit_data%5Bhash%5D=4498726532280095426&unit_data%5Bwindow_size%5D=3&unit_data%5Bwindow_start_time%5D=0&unit_data%5Bwindow_end_time%5D=1375340399&unit_data%5Bunit_start_time%5D=1372923465&unit_data%5Bunit_end_time%5D=1372923465&dom_id=u_0_1i&timestamp=1372923465&impression_id=856ec6cb&is_start=1&friendship_page_id=0&is_pinned_page_post=0&profile_id=1055580469&start=0&end=1375340399&query_type=39\",[{\n            __m: \"PopoverMenuOverlappingBorder\"\n        },],],1,],[\"m_0_2u\",[\"Popover\",\"m_0_2v\",\"m_0_2s\",\"ContextualLayerAsyncRelative\",],[{\n            __m: \"m_0_2v\"\n        },{\n            __m: \"m_0_2s\"\n        },[{\n            __m: \"ContextualLayerAsyncRelative\"\n        },],{\n            alignh: \"right\"\n        },],3,],[\"m_0_2w\",[\"PopoverLoadingMenu\",\"MenuTheme\",],[{\n            theme: {\n                __m: \"MenuTheme\"\n            }\n        },],3,],[\"m_0_2y\",[\"PopoverAsyncMenu\",\"m_0_2z\",\"m_0_2x\",\"m_0_2w\",\"PopoverMenuOverlappingBorder\",],[{\n            __m: \"m_0_2z\"\n        },{\n            __m: \"m_0_2x\"\n        },{\n            __m: \"m_0_2w\"\n        },\"/ajax/timeline/curation_menu_new.php?unit_data%5Bunit_type%5D=2&unit_data%5Bhash%5D=2953496614934485437&unit_data%5Bwindow_size%5D=3&unit_data%5Bwindow_start_time%5D=0&unit_data%5Bwindow_end_time%5D=1375340399&unit_data%5Bunit_start_time%5D=1373055341&unit_data%5Bunit_end_time%5D=1373055341&dom_id=u_0_1l&timestamp=1373055341&impression_id=856ec6cb&is_start=1&friendship_page_id=0&is_pinned_page_post=0&profile_id=1055580469&start=0&end=1375340399&query_type=39\",[{\n            __m: \"PopoverMenuOverlappingBorder\"\n        },],],1,],[\"m_0_2z\",[\"Popover\",\"m_0_30\",\"m_0_2x\",\"ContextualLayerAsyncRelative\",],[{\n            __m: \"m_0_30\"\n        },{\n            __m: \"m_0_2x\"\n        },[{\n            __m: \"ContextualLayerAsyncRelative\"\n        },],{\n            alignh: \"right\"\n        },],3,],[\"m_0_36\",[\"UFIController\",\"m_0_35\",\"m_0_37\",],[{\n            __m: \"m_0_35\"\n        },{\n            ftentidentifier: \"10200303357400658\",\n            instanceid: \"u_0_1o\",\n            source: 0,\n            showaddcomment: true,\n            collapseaddcomment: false,\n            markedcomments: [],\n            scrollcomments: false,\n            scrollwidth: null,\n            showshares: false,\n            shownub: false,\n            numberdelimiter: \",\",\n            showtyping: 0,\n            logtyping: 0,\n            entstream: false,\n            embedded: false,\n            viewoptionstypeobjects: null,\n            viewoptionstypeobjectsorder: null,\n            giftoccasion: null,\n            sht: 1,\n            timelinelogdata: \"AQChaL86QisSqs0sUSs8MRUaUotI69G171F9LUzJjbgJ3UzhkCDbngkCSE3LqTXr_kwkpMKYBFjbAFbf3ARkq6WPhwdNggKyVSvV8KV-PNpxpVpn4z-X01gT7qWCefQ74vFJS2ze7QPxN8wBikMPK_87rL9vxxevWGYc6pl6lt9iairELljWGqZ5OVTPh_6betWgKPnueIKl3cfeeu2Wp8JVo_rxtcGLCbGllyAUoOfJQvVl1ip2BW-lSbknT2jNEqF6YODCH8P6runJMeNh1vdnyrKv4tcAfTjIZJTNToVZuwg0_J_mSNRH0A0Pd0n1fwQ7E6tv0rX79Dhg8U_MZ5vNwdHr1A2inl1kF3pwcKlpAKuaPfTvQg9J_b4Er2dOkDYkc_ns-EaFh3HtRioAV4ql\"\n        },{\n            feedbacktargets: [{\n                targetfbid: \"10200303357400658\",\n                entidentifier: \"10200303357400658\",\n                permalink: \"/LawlabeeTheWallaby/posts/10200303357400658\",\n                commentcount: 6,\n                likecount: 0,\n                viewercanlike: true,\n                hasviewerliked: false,\n                cancomment: false,\n                showremovemenu: false,\n                actorforpost: \"100006118350059\",\n                viewerid: \"100006118350059\",\n                likesentences: {\n                    current: {\n                    },\n                    alternate: {\n                        text: \"You like this.\",\n                        ranges: [],\n                        aggregatedranges: []\n                    }\n                },\n                sharecount: 0,\n                ownerid: \"1055580469\",\n                lastseentime: null,\n                canremoveall: false,\n                seencount: 0,\n                seenbyall: false,\n                hasunseencollapsed: false,\n                mentionsdatasource: {\n                    __m: \"m_0_37\"\n                },\n                isranked: false,\n                isthreaded: false,\n                isownerpage: false,\n                actorid: \"1055580469\",\n                grouporeventid: null,\n                allowphotoattachments: true,\n                replysocialsentencemaxreplies: 10,\n                showfeaturedreplies: false,\n                viewercansubscribetopost: false,\n                hasviewersubscribed: false,\n                commentboxhoisted: false,\n                hasaddcommentlink: false,\n                defaultcommentorderingmode: \"chronological\",\n                showsendonentertip: true\n            },],\n            comments: [{\n                id: \"10200303357400658_4912489\",\n                fbid: \"10200304193501560\",\n                legacyid: \"4912489\",\n                body: {\n                    text: \"which one?\",\n                    ranges: [],\n                    aggregatedranges: []\n                },\n                author: \"100001619067228\",\n                ftentidentifier: \"10200303357400658\",\n                likecount: 0,\n                hasviewerliked: false,\n                canremove: false,\n                canreport: true,\n                canedit: false,\n                source: null,\n                istranslatable: false,\n                timestamp: {\n                    time: 1372275695,\n                    text: \"June 26 at 3:41pm\",\n                    verbose: \"Wednesday, June 26, 2013 at 3:41pm\"\n                },\n                spamreplycount: 0,\n                replyauthors: []\n            },{\n                id: \"10200303357400658_4912495\",\n                fbid: \"10200304196181627\",\n                legacyid: \"4912495\",\n                body: {\n                    text: \"oh! this is what is said... ruin all childhood memories!\",\n                    ranges: [],\n                    aggregatedranges: []\n                },\n                author: \"100001619067228\",\n                ftentidentifier: \"10200303357400658\",\n                likecount: 0,\n                hasviewerliked: false,\n                canremove: false,\n                canreport: true,\n                canedit: false,\n                source: null,\n                istranslatable: false,\n                timestamp: {\n                    time: 1372275736,\n                    text: \"June 26 at 3:42pm\",\n                    verbose: \"Wednesday, June 26, 2013 at 3:42pm\"\n                },\n                spamreplycount: 0,\n                replyauthors: []\n            },{\n                id: \"10200303357400658_4912503\",\n                fbid: \"10200304201781767\",\n                legacyid: \"4912503\",\n                body: {\n                    text: \"It didn't work for me!!!\",\n                    ranges: [],\n                    aggregatedranges: []\n                },\n                author: \"100002461958396\",\n                ftentidentifier: \"10200303357400658\",\n                likecount: 0,\n                hasviewerliked: false,\n                canremove: false,\n                canreport: true,\n                canedit: false,\n                source: null,\n                istranslatable: false,\n                timestamp: {\n                    time: 1372275825,\n                    text: \"June 26 at 3:43pm\",\n                    verbose: \"Wednesday, June 26, 2013 at 3:43pm\"\n                },\n                spamreplycount: 0,\n                replyauthors: []\n            },{\n                id: \"10200303357400658_4912511\",\n                fbid: \"10200304206981897\",\n                legacyid: \"4912511\",\n                body: {\n                    text: \"Anyhow, it was nice. Thanks\",\n                    ranges: [],\n                    aggregatedranges: []\n                },\n                author: \"100002461958396\",\n                ftentidentifier: \"10200303357400658\",\n                likecount: 1,\n                hasviewerliked: false,\n                canremove: false,\n                canreport: true,\n                canedit: false,\n                source: null,\n                istranslatable: false,\n                timestamp: {\n                    time: 1372275890,\n                    text: \"June 26 at 3:44pm\",\n                    verbose: \"Wednesday, June 26, 2013 at 3:44pm\"\n                },\n                spamreplycount: 0,\n                replyauthors: []\n            },],\n            profiles: [{\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            },{\n                id: \"100001619067228\",\n                name: \"Baharak Saberidokht\",\n                firstName: \"Baharak\",\n                vanity: \"baharak.saberidokht\",\n                thumbSrc: \"http://jsbngssl.profile-b.xx.fbcdn.net/hprofile-prn2/s32x32/260631_100001619067228_542177443_q.jpg\",\n                uri: \"http://jsbngssl.www.facebook.com/baharak.saberidokht\",\n                gender: 1,\n                type: \"user\",\n                is_friend: false,\n                social_snippets: null\n            },{\n                id: \"100002461958396\",\n                name: \"Vida Farsam\",\n                firstName: \"Vida\",\n                vanity: \"vida.farsam\",\n                thumbSrc: \"http://jsbngssl.fbcdn-profile-a.akamaihd.net/hprofile-ak-ash4/s32x32/203461_100002461958396_1397706771_q.jpg\",\n                uri: \"http://jsbngssl.www.facebook.com/vida.farsam\",\n                gender: 1,\n                type: \"user\",\n                is_friend: false,\n                social_snippets: null\n            },],\n            actions: [],\n            commentlists: {\n                comments: {\n                    10200303357400658: {\n                        chronological: {\n                            range: {\n                                offset: 2,\n                                length: 4\n                            },\n                            values: [\"10200303357400658_4912489\",\"10200303357400658_4912495\",\"10200303357400658_4912503\",\"10200303357400658_4912511\",]\n                        }\n                    }\n                },\n                replies: {\n                    \"10200303357400658_4912489\": {\n                        range: {\n                            offset: 0,\n                            length: 0\n                        },\n                        values: [],\n                        count: 0,\n                        ftentidentifier: \"10200303357400658\"\n                    },\n                    \"10200303357400658_4912495\": {\n                        range: {\n                            offset: 0,\n                            length: 0\n                        },\n                        values: [],\n                        count: 0,\n                        ftentidentifier: \"10200303357400658\"\n                    },\n                    \"10200303357400658_4912503\": {\n                        range: {\n                            offset: 0,\n                            length: 0\n                        },\n                        values: [],\n                        count: 0,\n                        ftentidentifier: \"10200303357400658\"\n                    },\n                    \"10200303357400658_4912511\": {\n                        range: {\n                            offset: 0,\n                            length: 0\n                        },\n                        values: [],\n                        count: 0,\n                        ftentidentifier: \"10200303357400658\"\n                    }\n                }\n            },\n            servertime: 1373491278\n        },],1,],[\"m_0_39\",[\"UFIController\",\"m_0_38\",\"m_0_3c\",],[{\n            __m: \"m_0_38\"\n        },{\n            ftentidentifier: \"10200350995551582\",\n            instanceid: \"u_0_1q\",\n            source: 0,\n            showaddcomment: true,\n            collapseaddcomment: false,\n            markedcomments: [],\n            scrollcomments: false,\n            scrollwidth: null,\n            showshares: false,\n            shownub: false,\n            numberdelimiter: \",\",\n            showtyping: 0,\n            logtyping: 0,\n            entstream: false,\n            embedded: false,\n            viewoptionstypeobjects: null,\n            viewoptionstypeobjectsorder: null,\n            giftoccasion: null,\n            sht: 1,\n            timelinelogdata: \"AQA0ygLaoIJHgq67aBT-K1c3pj79g5OygMMsHNzDJu-9etibWoq1ZipXxwv_7rDQYnw7mc7OPjKj5Beyr9GBFDeu4VStyKM9XbyP9Aj0vtj__0Id5nF8bZdAch9fYCTA6Z5HXojmLoKLG9dt6tLzGvMXecj0uIKTkMzqQLePPXxpU1B4-db-2-s3Fh99w9DO1plYSzpabaaYcYw8oo-ejXWEvfGXk3p-qv74e-8VozmoKCDL4y2FEvzILcwwHVgt3obElgmRgnkwQkg4hQ2bZ4fl_dlYe6ISRXOiqnQW5-OOfrkLjdMMB5UcaztBff6fxAxyPURkZBzktcfC5m8jKfdWybdGKs1obIlQzJWki5VmoELTY7QMLjC8T-0UJv9q2zVZ0JBGzEGnpjU8NAQYo9FR\"\n        },{\n            feedbacktargets: [{\n                targetfbid: \"10200350995551582\",\n                entidentifier: \"10200350995551582\",\n                permalink: \"/LawlabeeTheWallaby/posts/10200350995551582\",\n                commentcount: 5,\n                likecount: 1,\n                viewercanlike: true,\n                hasviewerliked: false,\n                cancomment: false,\n                showremovemenu: false,\n                actorforpost: \"100006118350059\",\n                viewerid: \"100006118350059\",\n                likesentences: {\n                    current: {\n                        text: \"Jan Vitek likes this.\",\n                        ranges: [{\n                            offset: 0,\n                            length: 9,\n                            entities: [{\n                                url: \"http://jsbngssl.www.facebook.com/jvitekjr\",\n                                id: 719575350\n                            },]\n                        },],\n                        aggregatedranges: []\n                    },\n                    alternate: {\n                        text: \"You and Jan Vitek like this.\",\n                        ranges: [{\n                            offset: 8,\n                            length: 9,\n                            entities: [{\n                                url: \"http://jsbngssl.www.facebook.com/jvitekjr\",\n                                id: 719575350\n                            },]\n                        },],\n                        aggregatedranges: []\n                    }\n                },\n                sharecount: 0,\n                ownerid: \"1055580469\",\n                lastseentime: null,\n                canremoveall: false,\n                seencount: 0,\n                seenbyall: false,\n                hasunseencollapsed: false,\n                mentionsdatasource: {\n                    __m: \"m_0_3c\"\n                },\n                isranked: false,\n                isthreaded: false,\n                isownerpage: false,\n                actorid: \"1055580469\",\n                grouporeventid: null,\n                allowphotoattachments: true,\n                replysocialsentencemaxreplies: 10,\n                showfeaturedreplies: false,\n                viewercansubscribetopost: false,\n                hasviewersubscribed: false,\n                commentboxhoisted: false,\n                hasaddcommentlink: false,\n                defaultcommentorderingmode: \"chronological\",\n                showsendonentertip: true\n            },],\n            comments: [{\n                id: \"10200350995551582_4954379\",\n                fbid: \"10200357365790834\",\n                legacyid: \"4954379\",\n                body: {\n                    text: \"You should have snatched it out of his hands, and played it/\",\n                    ranges: [],\n                    aggregatedranges: []\n                },\n                author: \"1710926078\",\n                ftentidentifier: \"10200350995551582\",\n                likecount: 0,\n                hasviewerliked: false,\n                canremove: false,\n                canreport: true,\n                canedit: false,\n                source: null,\n                istranslatable: false,\n                timestamp: {\n                    time: 1373168110,\n                    text: \"July 6 at 11:35pm\",\n                    verbose: \"Saturday, July 6, 2013 at 11:35pm\"\n                },\n                spamreplycount: 0,\n                replyauthors: []\n            },{\n                id: \"10200350995551582_4955913\",\n                fbid: \"10200359402281745\",\n                legacyid: \"4955913\",\n                body: {\n                    text: \"I've found that stealing musical instruments in non-English-speaking countries hasn't brought me great luck in the past.\",\n                    ranges: [],\n                    aggregatedranges: []\n                },\n                author: \"1055580469\",\n                ftentidentifier: \"10200350995551582\",\n                likecount: 0,\n                hasviewerliked: false,\n                canremove: false,\n                canreport: true,\n                canedit: false,\n                source: null,\n                istranslatable: false,\n                timestamp: {\n                    time: 1373214256,\n                    text: \"Sunday at 12:24pm\",\n                    verbose: \"Sunday, July 7, 2013 at 12:24pm\"\n                },\n                spamreplycount: 0,\n                replyauthors: []\n            },{\n                id: \"10200350995551582_4955915\",\n                fbid: \"10200359408281895\",\n                legacyid: \"4955915\",\n                body: {\n                    text: \"But in English-speaking countries it's just fine.\",\n                    ranges: [],\n                    aggregatedranges: []\n                },\n                author: \"10715287\",\n                ftentidentifier: \"10200350995551582\",\n                likecount: 0,\n                hasviewerliked: false,\n                canremove: false,\n                canreport: true,\n                canedit: false,\n                source: null,\n                istranslatable: false,\n                timestamp: {\n                    time: 1373214355,\n                    text: \"Sunday at 12:25pm\",\n                    verbose: \"Sunday, July 7, 2013 at 12:25pm\"\n                },\n                spamreplycount: 0,\n                replyauthors: []\n            },{\n                id: \"10200350995551582_4955918\",\n                fbid: \"10200359410801958\",\n                legacyid: \"4955918\",\n                body: {\n                    text: \"Naturally.\",\n                    ranges: [],\n                    aggregatedranges: []\n                },\n                author: \"1055580469\",\n                ftentidentifier: \"10200350995551582\",\n                likecount: 0,\n                hasviewerliked: false,\n                canremove: false,\n                canreport: true,\n                canedit: false,\n                source: null,\n                istranslatable: false,\n                timestamp: {\n                    time: 1373214375,\n                    text: \"Sunday at 12:26pm\",\n                    verbose: \"Sunday, July 7, 2013 at 12:26pm\"\n                },\n                spamreplycount: 0,\n                replyauthors: []\n            },],\n            profiles: [{\n                id: \"1710926078\",\n                name: \"Kathy Wertheimer Richards\",\n                firstName: \"Kathy\",\n                vanity: \"kathy.w.richards\",\n                thumbSrc: \"http://jsbngssl.profile-a.xx.fbcdn.net/hprofile-prn2/s32x32/276006_1710926078_512651488_q.jpg\",\n                uri: \"http://jsbngssl.www.facebook.com/kathy.w.richards\",\n                gender: 1,\n                type: \"user\",\n                is_friend: false,\n                social_snippets: null\n            },{\n                id: \"1055580469\",\n                name: \"Gregor Richards\",\n                firstName: \"Gregor\",\n                vanity: \"LawlabeeTheWallaby\",\n                thumbSrc: \"http://jsbngssl.fbcdn-profile-a.akamaihd.net/hprofile-ak-prn2/s32x32/276274_1055580469_962040234_q.jpg\",\n                uri: \"http://jsbngssl.www.facebook.com/LawlabeeTheWallaby\",\n                gender: 2,\n                type: \"user\",\n                is_friend: false,\n                social_snippets: null\n            },{\n                id: \"10715287\",\n                name: \"Michael A Goss\",\n                firstName: \"Michael\",\n                vanity: \"michael.a.goss\",\n                thumbSrc: \"http://jsbngssl.fbcdn-profile-a.akamaihd.net/hprofile-ak-prn1/s32x32/624179_10715287_1397603425_q.jpg\",\n                uri: \"http://jsbngssl.www.facebook.com/michael.a.goss\",\n                gender: 2,\n                type: \"user\",\n                is_friend: false,\n                social_snippets: null\n            },],\n            actions: [],\n            commentlists: {\n                comments: {\n                    10200350995551582: {\n                        chronological: {\n                            range: {\n                                offset: 1,\n                                length: 4\n                            },\n                            values: [\"10200350995551582_4954379\",\"10200350995551582_4955913\",\"10200350995551582_4955915\",\"10200350995551582_4955918\",]\n                        }\n                    }\n                },\n                replies: {\n                    \"10200350995551582_4954379\": {\n                        range: {\n                            offset: 0,\n                            length: 0\n                        },\n                        values: [],\n                        count: 0,\n                        ftentidentifier: \"10200350995551582\"\n                    },\n                    \"10200350995551582_4955913\": {\n                        range: {\n                            offset: 0,\n                            length: 0\n                        },\n                        values: [],\n                        count: 0,\n                        ftentidentifier: \"10200350995551582\"\n                    },\n                    \"10200350995551582_4955915\": {\n                        range: {\n                            offset: 0,\n                            length: 0\n                        },\n                        values: [],\n                        count: 0,\n                        ftentidentifier: \"10200350995551582\"\n                    },\n                    \"10200350995551582_4955918\": {\n                        range: {\n                            offset: 0,\n                            length: 0\n                        },\n                        values: [],\n                        count: 0,\n                        ftentidentifier: \"10200350995551582\"\n                    }\n                }\n            },\n            servertime: 1373491278\n        },],1,],[\"m_0_3b\",[\"UFIController\",\"m_0_3a\",\"m_0_37\",],[{\n            __m: \"m_0_3a\"\n        },{\n            ftentidentifier: \"10200325012062011\",\n            instanceid: \"u_0_1r\",\n            source: 0,\n            showaddcomment: true,\n            collapseaddcomment: false,\n            markedcomments: [],\n            scrollcomments: false,\n            scrollwidth: null,\n            showshares: false,\n            shownub: false,\n            numberdelimiter: \",\",\n            showtyping: 0,\n            logtyping: 0,\n            entstream: false,\n            embedded: false,\n            viewoptionstypeobjects: null,\n            viewoptionstypeobjectsorder: null,\n            giftoccasion: null,\n            sht: 1,\n            timelinelogdata: \"AQAFUCiLAT5RUcefEz2gKoDEw2y45fki1LQIejQbsCIWgwWsHCHMRqEd6NhhEE3HTJZ2JeWFwNWNGpTentE0x92XazUIAtkX7WDrpyxi9lvRDzK82lTMz_-Mi3SE3WjxflxWWcoKMLrhgXNr8_aZGGFiPZMoR9NNj1x_UacSFZb2GTZ-WXhNFIoMR3XpZ0Pz27lrZweBjs2LJCZhbxVEPWJ_zyMrKnZHkx2FTxMwMZsHcYwye7UenkmczH058RJbpEvmjgxS1Gm_mgug6mBvaekggu2f8o4Rr45al2p3_SqwfDej46LHq_iPe0GGAcI4qqYAbF-p79BSdK-YgegB9yVzvHPCboN8aAtfuzDypVKin-tqTXAmmqLB3xV3C7kjQE4TV1nfDtFW2pWKQZP4YUc1kQmo11w5z3YMFqDxoxibhQ\"\n        },{\n            feedbacktargets: [{\n                targetfbid: \"10200325012062011\",\n                entidentifier: \"10200325012062011\",\n                permalink: \"/LawlabeeTheWallaby/posts/10200325012062011\",\n                commentcount: 0,\n                likecount: 1,\n                viewercanlike: true,\n                hasviewerliked: false,\n                cancomment: false,\n                showremovemenu: false,\n                actorforpost: \"100006118350059\",\n                viewerid: \"100006118350059\",\n                likesentences: {\n                    current: {\n                        text: \"Steph Burg likes this.\",\n                        ranges: [{\n                            offset: 0,\n                            length: 10,\n                            entities: [{\n                                url: \"http://jsbngssl.www.facebook.com/rubolix\",\n                                id: 8621712\n                            },]\n                        },],\n                        aggregatedranges: []\n                    },\n                    alternate: {\n                        text: \"You and Steph Burg like this.\",\n                        ranges: [{\n                            offset: 8,\n                            length: 10,\n                            entities: [{\n                                url: \"http://jsbngssl.www.facebook.com/rubolix\",\n                                id: 8621712\n                            },]\n                        },],\n                        aggregatedranges: []\n                    }\n                },\n                sharecount: 0,\n                ownerid: \"1055580469\",\n                lastseentime: null,\n                canremoveall: false,\n                seencount: 0,\n                seenbyall: false,\n                hasunseencollapsed: false,\n                mentionsdatasource: {\n                    __m: \"m_0_37\"\n                },\n                isranked: false,\n                isthreaded: false,\n                isownerpage: false,\n                actorid: \"1055580469\",\n                grouporeventid: null,\n                allowphotoattachments: true,\n                replysocialsentencemaxreplies: 10,\n                showfeaturedreplies: false,\n                viewercansubscribetopost: false,\n                hasviewersubscribed: false,\n                commentboxhoisted: false,\n                hasaddcommentlink: false,\n                defaultcommentorderingmode: \"chronological\",\n                showsendonentertip: true\n            },],\n            comments: [],\n            profiles: [],\n            actions: [],\n            commentlists: {\n                comments: {\n                    10200325012062011: {\n                        chronological: {\n                            range: {\n                                offset: 0,\n                                length: 0\n                            },\n                            values: []\n                        }\n                    }\n                },\n                replies: null\n            },\n            servertime: 1373491278\n        },],1,],[\"m_0_3e\",[\"UFIController\",\"m_0_3d\",\"m_0_37\",],[{\n            __m: \"m_0_3d\"\n        },{\n            ftentidentifier: \"10200343222477260\",\n            instanceid: \"u_0_1u\",\n            source: 0,\n            showaddcomment: true,\n            collapseaddcomment: false,\n            markedcomments: [],\n            scrollcomments: false,\n            scrollwidth: null,\n            showshares: false,\n            shownub: false,\n            numberdelimiter: \",\",\n            showtyping: 0,\n            logtyping: 0,\n            entstream: false,\n            embedded: false,\n            viewoptionstypeobjects: null,\n            viewoptionstypeobjectsorder: null,\n            giftoccasion: null,\n            sht: 1,\n            timelinelogdata: \"AQCrvWaeB11JjIMAytH5Nvv3qmEhQbh5baPerOqkyOPG1prNmmgkQAYqxfM8F4KjqFTD35ePAPwvQDoPrrHJTHSjopTAuw4pc583uhw3meWdTKut8CfMnKQqizqrxNnzYyp4oPdWH66yt7nwLvLnUzUvcvAjMWicEEkiNWbuP3BEi1jT5w2dD7zoCGzxzHY_BeJ1PJ9BPrKJxn6P8TCdhb40KyMbyy0_kaWcpo1sksJl-adSjcOMevAoGosEm8ZiQxjcmpajE_jLfhvKfoYMMW3spYJ_rJby1Js3Q_VW7GswwODSD2FCX_pOREfx3p9VXZfl1eZNupMCx6QKcIGU-ExdJPac8H7Lp4XnIPKIpA49Y5Y9rJADGzQX23L_q5IbjhfIntPu29XD5hzwIEpzA6EL\"\n        },{\n            feedbacktargets: [{\n                targetfbid: \"10200343222477260\",\n                entidentifier: \"10200343222477260\",\n                permalink: \"/LawlabeeTheWallaby/posts/10200343222477260\",\n                commentcount: 11,\n                likecount: 7,\n                viewercanlike: true,\n                hasviewerliked: false,\n                cancomment: false,\n                showremovemenu: false,\n                actorforpost: \"100006118350059\",\n                viewerid: \"100006118350059\",\n                likesentences: {\n                    current: {\n                        text: \"7 people like this.\",\n                        ranges: [],\n                        aggregatedranges: [{\n                            offset: 0,\n                            length: 8,\n                            count: 7\n                        },]\n                    },\n                    alternate: {\n                        text: \"You and 7 others like this.\",\n                        ranges: [],\n                        aggregatedranges: [{\n                            offset: 8,\n                            length: 8,\n                            count: 7\n                        },]\n                    }\n                },\n                sharecount: 0,\n                ownerid: \"1055580469\",\n                lastseentime: null,\n                canremoveall: false,\n                seencount: 0,\n                seenbyall: false,\n                hasunseencollapsed: false,\n                mentionsdatasource: {\n                    __m: \"m_0_37\"\n                },\n                isranked: false,\n                isthreaded: false,\n                isownerpage: false,\n                actorid: \"1055580469\",\n                grouporeventid: null,\n                allowphotoattachments: true,\n                replysocialsentencemaxreplies: 10,\n                showfeaturedreplies: false,\n                viewercansubscribetopost: false,\n                hasviewersubscribed: false,\n                commentboxhoisted: false,\n                hasaddcommentlink: false,\n                defaultcommentorderingmode: \"chronological\",\n                showsendonentertip: true\n            },],\n            comments: [{\n                id: \"10200343222477260_4946958\",\n                fbid: \"10200346777686138\",\n                legacyid: \"4946958\",\n                body: {\n                    text: \"Does it have a sense of the surreal or are you just sharing a data point? ;)\",\n                    ranges: [],\n                    aggregatedranges: []\n                },\n                author: \"1633181753\",\n                ftentidentifier: \"10200343222477260\",\n                likecount: 0,\n                hasviewerliked: false,\n                canremove: false,\n                canreport: true,\n                canedit: false,\n                source: null,\n                istranslatable: false,\n                timestamp: {\n                    time: 1372985540,\n                    text: \"July 4 at 8:52pm\",\n                    verbose: \"Thursday, July 4, 2013 at 8:52pm\"\n                },\n                spamreplycount: 0,\n                replyauthors: []\n            },{\n                id: \"10200343222477260_4947623\",\n                fbid: \"10200347758230651\",\n                legacyid: \"4947623\",\n                body: {\n                    text: \"Merely minor amusement.\",\n                    ranges: [],\n                    aggregatedranges: []\n                },\n                author: \"1055580469\",\n                ftentidentifier: \"10200343222477260\",\n                likecount: 0,\n                hasviewerliked: false,\n                canremove: false,\n                canreport: true,\n                canedit: false,\n                source: null,\n                istranslatable: false,\n                timestamp: {\n                    time: 1373002430,\n                    text: \"July 5 at 1:33am\",\n                    verbose: \"Friday, July 5, 2013 at 1:33am\"\n                },\n                spamreplycount: 0,\n                replyauthors: []\n            },{\n                id: \"10200343222477260_4950566\",\n                fbid: \"10200351838652659\",\n                legacyid: \"4950566\",\n                body: {\n                    text: \"Did you wear http://img2.etsystatic.com/005/0/8125869/il_570xN.471485474_swpa.jpg\",\n                    ranges: [{\n                        offset: 13,\n                        length: 68,\n                        entities: [{\n                            url: \"http://img2.etsystatic.com/005/0/8125869/il_570xN.471485474_swpa.jpg\",\n                            shimhash: \"nAQExoxFw\",\n                            id: \"0746af69b9da85d793efe61531abaafe\",\n                            external: true\n                        },]\n                    },],\n                    aggregatedranges: []\n                },\n                author: \"53600996\",\n                ftentidentifier: \"10200343222477260\",\n                likecount: 0,\n                hasviewerliked: false,\n                canremove: false,\n                canreport: true,\n                canedit: false,\n                source: null,\n                istranslatable: false,\n                timestamp: {\n                    time: 1373066508,\n                    text: \"July 5 at 7:21pm\",\n                    verbose: \"Friday, July 5, 2013 at 7:21pm\"\n                },\n                spamreplycount: 0,\n                replyauthors: []\n            },{\n                id: \"10200343222477260_4950571\",\n                fbid: \"10200351843052769\",\n                legacyid: \"4950571\",\n                body: {\n                    text: \"That's the most delightfully offensive piece of apparel I've seen in quite some time.\",\n                    ranges: [],\n                    aggregatedranges: []\n                },\n                author: \"1055580469\",\n                ftentidentifier: \"10200343222477260\",\n                likecount: 0,\n                hasviewerliked: false,\n                canremove: false,\n                canreport: true,\n                canedit: false,\n                source: null,\n                istranslatable: false,\n                timestamp: {\n                    time: 1373066594,\n                    text: \"July 5 at 7:23pm\",\n                    verbose: \"Friday, July 5, 2013 at 7:23pm\"\n                },\n                spamreplycount: 0,\n                replyauthors: []\n            },],\n            profiles: [{\n                id: \"1633181753\",\n                name: \"Robert Nesius\",\n                firstName: \"Robert\",\n                vanity: \"rnesius\",\n                thumbSrc: \"http://jsbngssl.fbcdn-profile-a.akamaihd.net/hprofile-ak-prn1/s32x32/573766_1633181753_1114062672_q.jpg\",\n                uri: \"http://jsbngssl.www.facebook.com/rnesius\",\n                gender: 2,\n                type: \"user\",\n                is_friend: false,\n                social_snippets: null\n            },{\n                id: \"53600996\",\n                name: \"Harrison Metzger\",\n                firstName: \"Harrison\",\n                vanity: \"harrisonmetz\",\n                thumbSrc: \"http://jsbngssl.fbcdn-profile-a.akamaihd.net/hprofile-ak-ash4/s32x32/195694_53600996_1993816119_q.jpg\",\n                uri: \"http://jsbngssl.www.facebook.com/harrisonmetz\",\n                gender: 2,\n                type: \"user\",\n                is_friend: false,\n                social_snippets: null\n            },],\n            actions: [],\n            commentlists: {\n                comments: {\n                    10200343222477260: {\n                        chronological: {\n                            range: {\n                                offset: 7,\n                                length: 4\n                            },\n                            values: [\"10200343222477260_4946958\",\"10200343222477260_4947623\",\"10200343222477260_4950566\",\"10200343222477260_4950571\",]\n                        }\n                    }\n                },\n                replies: {\n                    \"10200343222477260_4946958\": {\n                        range: {\n                            offset: 0,\n                            length: 0\n                        },\n                        values: [],\n                        count: 0,\n                        ftentidentifier: \"10200343222477260\"\n                    },\n                    \"10200343222477260_4947623\": {\n                        range: {\n                            offset: 0,\n                            length: 0\n                        },\n                        values: [],\n                        count: 0,\n                        ftentidentifier: \"10200343222477260\"\n                    },\n                    \"10200343222477260_4950566\": {\n                        range: {\n                            offset: 0,\n                            length: 0\n                        },\n                        values: [],\n                        count: 0,\n                        ftentidentifier: \"10200343222477260\"\n                    },\n                    \"10200343222477260_4950571\": {\n                        range: {\n                            offset: 0,\n                            length: 0\n                        },\n                        values: [],\n                        count: 0,\n                        ftentidentifier: \"10200343222477260\"\n                    }\n                }\n            },\n            servertime: 1373491278\n        },],1,],[\"m_0_37\",[\"MultiBootstrapDataSource\",],[{\n            maxResults: 3,\n            queryData: {\n                context: \"topics_limited_autosuggest\",\n                viewer: 100006118350059,\n                filter: [\"page\",\"user\",],\n                rsp: \"mentions\"\n            },\n            queryEndpoint: \"/ajax/typeahead/search.php\",\n            bootstrapData: {\n                rsp: \"mentions\"\n            },\n            bootstrapEndpoints: [{\n                endpoint: \"/ajax/typeahead/first_degree.php\",\n                data: {\n                    context: \"mentions\",\n                    viewer: 100006118350059,\n                    token: \"1372173655-7\",\n                    filter: [\"page\",\"group\",\"app\",\"event\",\"user\",],\n                    options: [\"friends_only\",\"nm\",]\n                }\n            },]\n        },],6,],[\"m_0_3c\",[\"MultiBootstrapDataSource\",],[{\n            maxResults: 3,\n            queryData: {\n                context: \"topics_limited_autosuggest\",\n                viewer: 100006118350059,\n                filter: [\"page\",\"user\",],\n                rsp: \"mentions\"\n            },\n            queryEndpoint: \"/ajax/typeahead/search.php\",\n            bootstrapData: {\n                rsp: \"mentions\"\n            },\n            bootstrapEndpoints: [{\n                endpoint: \"/ajax/typeahead/first_degree.php\",\n                data: {\n                    context: \"mentions\",\n                    viewer: 100006118350059,\n                    token: \"1372173655-7\",\n                    filter: [\"page\",\"group\",\"app\",\"event\",\"user\",],\n                    options: [\"friends_only\",\"nm\",]\n                }\n            },]\n        },],2,],[\"m_0_3f\",[\"XHPTemplate\",\"m_0_3g\",],[{\n            __m: \"m_0_3g\"\n        },],2,],],\n        define: [[\"CLogConfig\",[],{\n            gkResults: 0\n        },174,],[\"UFICommentTemplates\",[\"m_0_3f\",],{\n            \":fb:ufi:hide-dialog-template\": {\n                __m: \"m_0_3f\"\n            }\n        },70,],[\"UFISpamCountImpl\",[],{\n            \"module\": null\n        },72,],[\"UFIConfig\",[],{\n            renderEmoji: true,\n            renderEmoticons: 1\n        },71,],],\n        elements: [[\"m_0_2l\",\"u_0_1c\",2,],[\"m_0_2i\",\"u_0_1d\",4,],[\"m_0_2q\",\"u_0_1g\",2,],[\"m_0_2n\",\"u_0_1h\",4,],[\"m_0_2v\",\"u_0_1j\",2,],[\"m_0_2s\",\"u_0_1k\",4,],[\"m_0_30\",\"u_0_1m\",2,],[\"m_0_2x\",\"u_0_1n\",4,],[\"m_0_35\",\"u_0_1p\",2,],[\"m_0_38\",\"u_0_1s\",2,],[\"m_0_3a\",\"u_0_1t\",2,],[\"m_0_3d\",\"u_0_1v\",2,],[\"m_0_32\",\"u_0_1w\",2,],[\"m_0_31\",\"u_0_1x\",2,],[\"m_0_33\",\"u_0_1y\",2,],[\"m_0_34\",\"u_0_1z\",2,],],\n        markup: [[\"m_0_3g\",{\n            __html: \"\\u003Cdiv\\u003E\\u003Cdiv class=\\\"pvs phm _1yw\\\" data-jsid=\\\"title\\\"\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"pam _13\\\" data-jsid=\\\"body\\\"\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"_14\\\"\\u003E\\u003Cdiv class=\\\"pam uiOverlayFooter uiBoxGray topborder\\\"\\u003E\\u003Cbutton value=\\\"1\\\" class=\\\"_42ft _42fu layerConfirm uiOverlayButton selected _42g- _42gy\\\" data-jsid=\\\"delete\\\" type=\\\"submit\\\"\\u003EDelete\\u003C/button\\u003E\\u003Ca class=\\\"_42ft _42fu layerCancel uiOverlayButton _42gy\\\" role=\\\"button\\\" href=\\\"#\\\"\\u003ECancel\\u003C/a\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],]\n    },\n    css: [\"W3Ky6\",\"ZtiRu\",\"0duP3\",],\n    bootloadable: {\n        TypeaheadHoistFriends: {\n            resources: [\"bUzfU\",],\n            \"module\": true\n        },\n        \"UFIEntStreamOrderingModeSelector.react\": {\n            resources: [\"AyUu6\",\"OJTM4\",\"W3Ky6\",\"AsDOA\",\"bUzfU\",\"0duP3\",\"vzIoO\",\"QI+gv\",\"TOw+q\",],\n            \"module\": true\n        },\n        InputSelection: {\n            resources: [\"AyUu6\",\"W3Ky6\",\"AsDOA\",],\n            \"module\": true\n        },\n        FileInputUploader: {\n            resources: [\"AyUu6\",\"AsDOA\",\"LpC/l\",\"FFdfj\",],\n            \"module\": true\n        },\n        DialogX: {\n            resources: [\"AyUu6\",\"AsDOA\",\"W3Ky6\",\"OJTM4\",],\n            \"module\": true\n        },\n        ContextualTypeaheadView: {\n            resources: [\"AyUu6\",\"0duP3\",\"u//Ut\",\"W3Ky6\",\"AsDOA\",],\n            \"module\": true\n        },\n        TypeaheadBestName: {\n            resources: [\"OJTM4\",\"u//Ut\",],\n            \"module\": true\n        },\n        TypeaheadMetrics: {\n            resources: [\"AyUu6\",\"bUzfU\",],\n            \"module\": true\n        },\n        MentionsInput: {\n            resources: [\"AyUu6\",\"W3Ky6\",\"AsDOA\",\"bUzfU\",\"OJTM4\",],\n            \"module\": true\n        },\n        TypingDetector: {\n            resources: [\"AyUu6\",\"u//Ut\",],\n            \"module\": true\n        },\n        TypeaheadAreaCore: {\n            resources: [\"AyUu6\",\"W3Ky6\",\"AsDOA\",\"u//Ut\",\"bUzfU\",],\n            \"module\": true\n        },\n        EntstreamPubContentOverlay: {\n            resources: [\"AyUu6\",\"OJTM4\",\"W3Ky6\",\"AsDOA\",\"SZ74q\",\"7EHvC\",\"TOw+q\",\"0duP3\",\"63VzN\",\"40bIq\",],\n            \"module\": true\n        },\n        CompactTypeaheadRenderer: {\n            resources: [\"AyUu6\",\"0duP3\",\"u//Ut\",\"W3Ky6\",],\n            \"module\": true\n        },\n        ScrollAwareDOM: {\n            resources: [\"AyUu6\",\"AsDOA\",],\n            \"module\": true\n        },\n        \"legacy:live-js\": {\n            resources: [\"AyUu6\",\"OJTM4\",]\n        },\n        collectDataAttributes: {\n            resources: [\"AyUu6\",],\n            \"module\": true\n        },\n        UFIScrollHighlight: {\n            resources: [\"AyUu6\",\"AsDOA\",\"KPZ5T\",\"rSdpp\",],\n            \"module\": true\n        },\n        UFIComments: {\n            resources: [\"OJTM4\",\"AyUu6\",],\n            \"module\": true\n        },\n        UFIRetryActions: {\n            resources: [\"AyUu6\",\"OJTM4\",\"8ay4F\",],\n            \"module\": true\n        },\n        LegacyMenuUtils: {\n            resources: [\"AyUu6\",\"AsDOA\",\"W3Ky6\",\"OJTM4\",\"utuxU\",\"NfUUN\",],\n            \"module\": true\n        },\n        HashtagLayerPageController: {\n            resources: [\"AyUu6\",\"OJTM4\",\"W3Ky6\",\"AsDOA\",\"SZ74q\",\"IxyKh\",\"cq4zB\",\"Lsvc0\",\"7EHvC\",\"BBKr2\",\"iFPko\",\"AMFDz\",\"qRGqD\",],\n            \"module\": true\n        },\n        \"legacy:ufi-tracking-js\": {\n            resources: [\"AyUu6\",]\n        },\n        CLoggerX: {\n            resources: [\"AyUu6\",\"OJTM4\",],\n            \"module\": true\n        },\n        \"UFICommentRemovalControls.react\": {\n            resources: [\"OJTM4\",\"AyUu6\",\"W3Ky6\",\"QE+SD\",],\n            \"module\": true\n        },\n        DOMScroll: {\n            resources: [\"AyUu6\",\"AsDOA\",],\n            \"module\": true\n        },\n        ScrollableArea: {\n            resources: [\"AyUu6\",\"AsDOA\",\"W3Ky6\",],\n            \"module\": true\n        },\n        HashtagParser: {\n            resources: [\"u//Ut\",\"hfrQl\",],\n            \"module\": true\n        },\n        TextAreaControl: {\n            resources: [\"AyUu6\",\"LpC/l\",\"W3Ky6\",],\n            \"module\": true\n        },\n        LegacyContextualDialog: {\n            resources: [\"AyUu6\",\"AsDOA\",\"EzMPG\",\"W3Ky6\",],\n            \"module\": true\n        },\n        Typeahead: {\n            resources: [\"AyUu6\",\"W3Ky6\",\"u//Ut\",],\n            \"module\": true\n        },\n        Hovercard: {\n            resources: [\"AyUu6\",\"AsDOA\",\"W3Ky6\",],\n            \"module\": true\n        },\n        FileInput: {\n            resources: [\"AyUu6\",\"u//Ut\",\"W3Ky6\",],\n            \"module\": true\n        },\n        \"UFIOrderingModeSelector.react\": {\n            resources: [\"AyUu6\",\"OJTM4\",\"W3Ky6\",\"AsDOA\",\"bUzfU\",],\n            \"module\": true\n        }\n    },\n    resource_map: {\n        AMFDz: {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yb/r/l0jEiYB1BY4.js\"\n        },\n        BBKr2: {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yu/r/AS6izN-qGVZ.js\"\n        },\n        SZ74q: {\n            type: \"css\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yG/r/9E2LeES-RRN.css\"\n        },\n        \"QI+gv\": {\n            type: \"css\",\n            permanent: 1,\n            crossOrigin: 1,\n            src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yF/r/w_bzJgcyc3W.css\"\n        },\n        \"8ay4F\": {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yC/r/VrfxLTcinh0.js\"\n        },\n        iFPko: {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yD/r/8h9kPf0GHRH.js\"\n        },\n        vzIoO: {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yk/r/oUbZBpEktAd.js\"\n        },\n        Lsvc0: {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yQ/r/_hmcMOWGDp_.js\"\n        },\n        NfUUN: {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/y4/r/2xf6U6ugHB5.js\"\n        },\n        rSdpp: {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yc/r/2PkTFjdVPzc.js\"\n        },\n        \"7EHvC\": {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yW/r/Pey6lNCLBYS.js\"\n        },\n        \"40bIq\": {\n            type: \"css\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yW/r/6QVB5ZYkMIN.css\"\n        },\n        qRGqD: {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yx/r/7VYwuqZ2nti.js\"\n        },\n        \"QE+SD\": {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yJ/r/PIykjmSfAPR.js\"\n        },\n        \"TOw+q\": {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yd/r/vux7xKvT3o9.js\"\n        },\n        utuxU: {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yy/r/NRYuSW1uDUF.js\"\n        },\n        FFdfj: {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yp/r/jyBR-Jzbcb5.js\"\n        },\n        IxyKh: {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yv/r/ZIi5f4O5zUo.js\"\n        },\n        cq4zB: {\n            type: \"css\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yt/r/h721jO007c4.css\"\n        }\n    },\n    ixData: {\n        \"/images/group_gifts/icons/gift_icon_red-13px.png\": {\n            sprited: false,\n            uri: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yP/r/83ZMt066WCp.png\",\n            width: 13,\n            height: 13\n        }\n    },\n    js: [\"AyUu6\",\"AsDOA\",\"jsIYP\",\"OJTM4\",\"+h1d2\",\"3SGVa\",],\n    displayJS: [\"AyUu6\",\"OJTM4\",],\n    onafterload: [\"Bootloader.loadComponents([\\\"legacy:live-js\\\"], function(){ Live.startup() });\",\"Bootloader.loadComponents([\\\"legacy:live-js\\\"], function(){ Live.startup() });\",\"Bootloader.loadComponents([\\\"legacy:ufi-tracking-js\\\"], function(){ ufi_add_all_link_data(); });\",\"Bootloader.loadComponents([\\\"legacy:live-js\\\"], function(){ Live.startup() });\",\"Bootloader.loadComponents([\\\"legacy:live-js\\\"], function(){ Live.startup() });\",],\n    id: \"pagelet_timeline_recent_segment_0_0_left\",\n    phase: 2,\n    tti_phase: 2\n});");
// 1760
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o7,"s8d5ddf7f4f4f9691c0eab3a887a80a3c868d015e");
// 1761
geval("bigPipe.onPageletArrive({\n    append: \"u_0_17_left\",\n    display_dependency: [\"pagelet_timeline_recent\",\"pagelet_timeline_composer\",],\n    is_last: true,\n    JSBNG__content: {\n        pagelet_timeline_recent_segment_0_0_left: {\n            container_id: \"u_0_20\"\n        }\n    },\n    jsmods: {\n        require: [[\"TimelineCapsule\",\"loadTwoColumnUnits\",[],[\"u_0_17\",],],[\"TimelineStickyRightColumn\",\"adjust\",[],[],],[\"m_0_2h\",],[\"m_0_2j\",],[\"m_0_2k\",],[\"m_0_2m\",],[\"m_0_2o\",],[\"m_0_2p\",],[\"m_0_2r\",],[\"m_0_2t\",],[\"m_0_2u\",],[\"m_0_2w\",],[\"m_0_2y\",],[\"m_0_2z\",],[\"Hovercard\",],[\"m_0_36\",],[\"Tooltip\",],[\"m_0_39\",],[\"m_0_3b\",],[\"m_0_3e\",],],\n        instances: [[\"m_0_2h\",[\"PopoverLoadingMenu\",\"MenuTheme\",],[{\n            theme: {\n                __m: \"MenuTheme\"\n            }\n        },],3,],[\"m_0_2j\",[\"PopoverAsyncMenu\",\"m_0_2k\",\"m_0_2i\",\"m_0_2h\",\"PopoverMenuOverlappingBorder\",],[{\n            __m: \"m_0_2k\"\n        },{\n            __m: \"m_0_2i\"\n        },{\n            __m: \"m_0_2h\"\n        },\"/ajax/timeline/curation_menu_new.php?unit_data%5Bunit_type%5D=3&unit_data%5Bhash%5D=3857418892059122853&unit_data%5Bwindow_size%5D=3&unit_data%5Bwindow_start_time%5D=0&unit_data%5Bwindow_end_time%5D=1375340399&unit_data%5Bunit_start_time%5D=1372262734&unit_data%5Bunit_end_time%5D=1372262734&dom_id=u_0_1b&timestamp=1372262734&impression_id=856ec6cb&is_start=1&friendship_page_id=0&is_pinned_page_post=0&profile_id=1055580469&start=0&end=1375340399&query_type=39\",[{\n            __m: \"PopoverMenuOverlappingBorder\"\n        },],],1,],[\"m_0_2k\",[\"Popover\",\"m_0_2l\",\"m_0_2i\",\"ContextualLayerAsyncRelative\",],[{\n            __m: \"m_0_2l\"\n        },{\n            __m: \"m_0_2i\"\n        },[{\n            __m: \"ContextualLayerAsyncRelative\"\n        },],{\n            alignh: \"right\"\n        },],3,],[\"m_0_2m\",[\"PopoverLoadingMenu\",\"MenuTheme\",],[{\n            theme: {\n                __m: \"MenuTheme\"\n            }\n        },],3,],[\"m_0_2o\",[\"PopoverAsyncMenu\",\"m_0_2p\",\"m_0_2n\",\"m_0_2m\",\"PopoverMenuOverlappingBorder\",],[{\n            __m: \"m_0_2p\"\n        },{\n            __m: \"m_0_2n\"\n        },{\n            __m: \"m_0_2m\"\n        },\"/ajax/timeline/curation_menu_new.php?unit_data%5Bunit_type%5D=3&unit_data%5Bhash%5D=-6185676099150237519&unit_data%5Bwindow_size%5D=3&unit_data%5Bwindow_start_time%5D=0&unit_data%5Bwindow_end_time%5D=1375340399&unit_data%5Bunit_start_time%5D=1372627013&unit_data%5Bunit_end_time%5D=1372627013&dom_id=u_0_1f&timestamp=1372627013&impression_id=856ec6cb&is_start=1&friendship_page_id=0&is_pinned_page_post=0&profile_id=1055580469&start=0&end=1375340399&query_type=39\",[{\n            __m: \"PopoverMenuOverlappingBorder\"\n        },],],1,],[\"m_0_2p\",[\"Popover\",\"m_0_2q\",\"m_0_2n\",\"ContextualLayerAsyncRelative\",],[{\n            __m: \"m_0_2q\"\n        },{\n            __m: \"m_0_2n\"\n        },[{\n            __m: \"ContextualLayerAsyncRelative\"\n        },],{\n            alignh: \"right\"\n        },],3,],[\"m_0_2r\",[\"PopoverLoadingMenu\",\"MenuTheme\",],[{\n            theme: {\n                __m: \"MenuTheme\"\n            }\n        },],3,],[\"m_0_2t\",[\"PopoverAsyncMenu\",\"m_0_2u\",\"m_0_2s\",\"m_0_2r\",\"PopoverMenuOverlappingBorder\",],[{\n            __m: \"m_0_2u\"\n        },{\n            __m: \"m_0_2s\"\n        },{\n            __m: \"m_0_2r\"\n        },\"/ajax/timeline/curation_menu_new.php?unit_data%5Bunit_type%5D=2&unit_data%5Bhash%5D=4498726532280095426&unit_data%5Bwindow_size%5D=3&unit_data%5Bwindow_start_time%5D=0&unit_data%5Bwindow_end_time%5D=1375340399&unit_data%5Bunit_start_time%5D=1372923465&unit_data%5Bunit_end_time%5D=1372923465&dom_id=u_0_1i&timestamp=1372923465&impression_id=856ec6cb&is_start=1&friendship_page_id=0&is_pinned_page_post=0&profile_id=1055580469&start=0&end=1375340399&query_type=39\",[{\n            __m: \"PopoverMenuOverlappingBorder\"\n        },],],1,],[\"m_0_2u\",[\"Popover\",\"m_0_2v\",\"m_0_2s\",\"ContextualLayerAsyncRelative\",],[{\n            __m: \"m_0_2v\"\n        },{\n            __m: \"m_0_2s\"\n        },[{\n            __m: \"ContextualLayerAsyncRelative\"\n        },],{\n            alignh: \"right\"\n        },],3,],[\"m_0_2w\",[\"PopoverLoadingMenu\",\"MenuTheme\",],[{\n            theme: {\n                __m: \"MenuTheme\"\n            }\n        },],3,],[\"m_0_2y\",[\"PopoverAsyncMenu\",\"m_0_2z\",\"m_0_2x\",\"m_0_2w\",\"PopoverMenuOverlappingBorder\",],[{\n            __m: \"m_0_2z\"\n        },{\n            __m: \"m_0_2x\"\n        },{\n            __m: \"m_0_2w\"\n        },\"/ajax/timeline/curation_menu_new.php?unit_data%5Bunit_type%5D=2&unit_data%5Bhash%5D=2953496614934485437&unit_data%5Bwindow_size%5D=3&unit_data%5Bwindow_start_time%5D=0&unit_data%5Bwindow_end_time%5D=1375340399&unit_data%5Bunit_start_time%5D=1373055341&unit_data%5Bunit_end_time%5D=1373055341&dom_id=u_0_1l&timestamp=1373055341&impression_id=856ec6cb&is_start=1&friendship_page_id=0&is_pinned_page_post=0&profile_id=1055580469&start=0&end=1375340399&query_type=39\",[{\n            __m: \"PopoverMenuOverlappingBorder\"\n        },],],1,],[\"m_0_2z\",[\"Popover\",\"m_0_30\",\"m_0_2x\",\"ContextualLayerAsyncRelative\",],[{\n            __m: \"m_0_30\"\n        },{\n            __m: \"m_0_2x\"\n        },[{\n            __m: \"ContextualLayerAsyncRelative\"\n        },],{\n            alignh: \"right\"\n        },],3,],[\"m_0_36\",[\"UFIController\",\"m_0_35\",\"m_0_37\",],[{\n            __m: \"m_0_35\"\n        },{\n            ftentidentifier: \"10200303357400658\",\n            instanceid: \"u_0_1o\",\n            source: 0,\n            showaddcomment: true,\n            collapseaddcomment: false,\n            markedcomments: [],\n            scrollcomments: false,\n            scrollwidth: null,\n            showshares: false,\n            shownub: false,\n            numberdelimiter: \",\",\n            showtyping: 0,\n            logtyping: 0,\n            entstream: false,\n            embedded: false,\n            viewoptionstypeobjects: null,\n            viewoptionstypeobjectsorder: null,\n            giftoccasion: null,\n            sht: 1,\n            timelinelogdata: \"AQChaL86QisSqs0sUSs8MRUaUotI69G171F9LUzJjbgJ3UzhkCDbngkCSE3LqTXr_kwkpMKYBFjbAFbf3ARkq6WPhwdNggKyVSvV8KV-PNpxpVpn4z-X01gT7qWCefQ74vFJS2ze7QPxN8wBikMPK_87rL9vxxevWGYc6pl6lt9iairELljWGqZ5OVTPh_6betWgKPnueIKl3cfeeu2Wp8JVo_rxtcGLCbGllyAUoOfJQvVl1ip2BW-lSbknT2jNEqF6YODCH8P6runJMeNh1vdnyrKv4tcAfTjIZJTNToVZuwg0_J_mSNRH0A0Pd0n1fwQ7E6tv0rX79Dhg8U_MZ5vNwdHr1A2inl1kF3pwcKlpAKuaPfTvQg9J_b4Er2dOkDYkc_ns-EaFh3HtRioAV4ql\"\n        },{\n            feedbacktargets: [{\n                targetfbid: \"10200303357400658\",\n                entidentifier: \"10200303357400658\",\n                permalink: \"/LawlabeeTheWallaby/posts/10200303357400658\",\n                commentcount: 6,\n                likecount: 0,\n                viewercanlike: true,\n                hasviewerliked: false,\n                cancomment: false,\n                showremovemenu: false,\n                actorforpost: \"100006118350059\",\n                viewerid: \"100006118350059\",\n                likesentences: {\n                    current: {\n                    },\n                    alternate: {\n                        text: \"You like this.\",\n                        ranges: [],\n                        aggregatedranges: []\n                    }\n                },\n                sharecount: 0,\n                ownerid: \"1055580469\",\n                lastseentime: null,\n                canremoveall: false,\n                seencount: 0,\n                seenbyall: false,\n                hasunseencollapsed: false,\n                mentionsdatasource: {\n                    __m: \"m_0_37\"\n                },\n                isranked: false,\n                isthreaded: false,\n                isownerpage: false,\n                actorid: \"1055580469\",\n                grouporeventid: null,\n                allowphotoattachments: true,\n                replysocialsentencemaxreplies: 10,\n                showfeaturedreplies: false,\n                viewercansubscribetopost: false,\n                hasviewersubscribed: false,\n                commentboxhoisted: false,\n                hasaddcommentlink: false,\n                defaultcommentorderingmode: \"chronological\",\n                showsendonentertip: true\n            },],\n            comments: [{\n                id: \"10200303357400658_4912489\",\n                fbid: \"10200304193501560\",\n                legacyid: \"4912489\",\n                body: {\n                    text: \"which one?\",\n                    ranges: [],\n                    aggregatedranges: []\n                },\n                author: \"100001619067228\",\n                ftentidentifier: \"10200303357400658\",\n                likecount: 0,\n                hasviewerliked: false,\n                canremove: false,\n                canreport: true,\n                canedit: false,\n                source: null,\n                istranslatable: false,\n                timestamp: {\n                    time: 1372275695,\n                    text: \"June 26 at 3:41pm\",\n                    verbose: \"Wednesday, June 26, 2013 at 3:41pm\"\n                },\n                spamreplycount: 0,\n                replyauthors: []\n            },{\n                id: \"10200303357400658_4912495\",\n                fbid: \"10200304196181627\",\n                legacyid: \"4912495\",\n                body: {\n                    text: \"oh! this is what is said... ruin all childhood memories!\",\n                    ranges: [],\n                    aggregatedranges: []\n                },\n                author: \"100001619067228\",\n                ftentidentifier: \"10200303357400658\",\n                likecount: 0,\n                hasviewerliked: false,\n                canremove: false,\n                canreport: true,\n                canedit: false,\n                source: null,\n                istranslatable: false,\n                timestamp: {\n                    time: 1372275736,\n                    text: \"June 26 at 3:42pm\",\n                    verbose: \"Wednesday, June 26, 2013 at 3:42pm\"\n                },\n                spamreplycount: 0,\n                replyauthors: []\n            },{\n                id: \"10200303357400658_4912503\",\n                fbid: \"10200304201781767\",\n                legacyid: \"4912503\",\n                body: {\n                    text: \"It didn't work for me!!!\",\n                    ranges: [],\n                    aggregatedranges: []\n                },\n                author: \"100002461958396\",\n                ftentidentifier: \"10200303357400658\",\n                likecount: 0,\n                hasviewerliked: false,\n                canremove: false,\n                canreport: true,\n                canedit: false,\n                source: null,\n                istranslatable: false,\n                timestamp: {\n                    time: 1372275825,\n                    text: \"June 26 at 3:43pm\",\n                    verbose: \"Wednesday, June 26, 2013 at 3:43pm\"\n                },\n                spamreplycount: 0,\n                replyauthors: []\n            },{\n                id: \"10200303357400658_4912511\",\n                fbid: \"10200304206981897\",\n                legacyid: \"4912511\",\n                body: {\n                    text: \"Anyhow, it was nice. Thanks\",\n                    ranges: [],\n                    aggregatedranges: []\n                },\n                author: \"100002461958396\",\n                ftentidentifier: \"10200303357400658\",\n                likecount: 1,\n                hasviewerliked: false,\n                canremove: false,\n                canreport: true,\n                canedit: false,\n                source: null,\n                istranslatable: false,\n                timestamp: {\n                    time: 1372275890,\n                    text: \"June 26 at 3:44pm\",\n                    verbose: \"Wednesday, June 26, 2013 at 3:44pm\"\n                },\n                spamreplycount: 0,\n                replyauthors: []\n            },],\n            profiles: [{\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            },{\n                id: \"100001619067228\",\n                JSBNG__name: \"Baharak Saberidokht\",\n                firstName: \"Baharak\",\n                vanity: \"baharak.saberidokht\",\n                thumbSrc: \"http://jsbngssl.profile-b.xx.fbcdn.net/hprofile-prn2/s32x32/260631_100001619067228_542177443_q.jpg\",\n                uri: \"http://jsbngssl.www.facebook.com/baharak.saberidokht\",\n                gender: 1,\n                type: \"user\",\n                is_friend: false,\n                social_snippets: null\n            },{\n                id: \"100002461958396\",\n                JSBNG__name: \"Vida Farsam\",\n                firstName: \"Vida\",\n                vanity: \"vida.farsam\",\n                thumbSrc: \"http://jsbngssl.fbcdn-profile-a.akamaihd.net/hprofile-ak-ash4/s32x32/203461_100002461958396_1397706771_q.jpg\",\n                uri: \"http://jsbngssl.www.facebook.com/vida.farsam\",\n                gender: 1,\n                type: \"user\",\n                is_friend: false,\n                social_snippets: null\n            },],\n            actions: [],\n            commentlists: {\n                comments: {\n                    10200303357400658: {\n                        chronological: {\n                            range: {\n                                offset: 2,\n                                length: 4\n                            },\n                            values: [\"10200303357400658_4912489\",\"10200303357400658_4912495\",\"10200303357400658_4912503\",\"10200303357400658_4912511\",]\n                        }\n                    }\n                },\n                replies: {\n                    \"10200303357400658_4912489\": {\n                        range: {\n                            offset: 0,\n                            length: 0\n                        },\n                        values: [],\n                        count: 0,\n                        ftentidentifier: \"10200303357400658\"\n                    },\n                    \"10200303357400658_4912495\": {\n                        range: {\n                            offset: 0,\n                            length: 0\n                        },\n                        values: [],\n                        count: 0,\n                        ftentidentifier: \"10200303357400658\"\n                    },\n                    \"10200303357400658_4912503\": {\n                        range: {\n                            offset: 0,\n                            length: 0\n                        },\n                        values: [],\n                        count: 0,\n                        ftentidentifier: \"10200303357400658\"\n                    },\n                    \"10200303357400658_4912511\": {\n                        range: {\n                            offset: 0,\n                            length: 0\n                        },\n                        values: [],\n                        count: 0,\n                        ftentidentifier: \"10200303357400658\"\n                    }\n                }\n            },\n            servertime: 1373491278\n        },],1,],[\"m_0_39\",[\"UFIController\",\"m_0_38\",\"m_0_3c\",],[{\n            __m: \"m_0_38\"\n        },{\n            ftentidentifier: \"10200350995551582\",\n            instanceid: \"u_0_1q\",\n            source: 0,\n            showaddcomment: true,\n            collapseaddcomment: false,\n            markedcomments: [],\n            scrollcomments: false,\n            scrollwidth: null,\n            showshares: false,\n            shownub: false,\n            numberdelimiter: \",\",\n            showtyping: 0,\n            logtyping: 0,\n            entstream: false,\n            embedded: false,\n            viewoptionstypeobjects: null,\n            viewoptionstypeobjectsorder: null,\n            giftoccasion: null,\n            sht: 1,\n            timelinelogdata: \"AQA0ygLaoIJHgq67aBT-K1c3pj79g5OygMMsHNzDJu-9etibWoq1ZipXxwv_7rDQYnw7mc7OPjKj5Beyr9GBFDeu4VStyKM9XbyP9Aj0vtj__0Id5nF8bZdAch9fYCTA6Z5HXojmLoKLG9dt6tLzGvMXecj0uIKTkMzqQLePPXxpU1B4-db-2-s3Fh99w9DO1plYSzpabaaYcYw8oo-ejXWEvfGXk3p-qv74e-8VozmoKCDL4y2FEvzILcwwHVgt3obElgmRgnkwQkg4hQ2bZ4fl_dlYe6ISRXOiqnQW5-OOfrkLjdMMB5UcaztBff6fxAxyPURkZBzktcfC5m8jKfdWybdGKs1obIlQzJWki5VmoELTY7QMLjC8T-0UJv9q2zVZ0JBGzEGnpjU8NAQYo9FR\"\n        },{\n            feedbacktargets: [{\n                targetfbid: \"10200350995551582\",\n                entidentifier: \"10200350995551582\",\n                permalink: \"/LawlabeeTheWallaby/posts/10200350995551582\",\n                commentcount: 5,\n                likecount: 1,\n                viewercanlike: true,\n                hasviewerliked: false,\n                cancomment: false,\n                showremovemenu: false,\n                actorforpost: \"100006118350059\",\n                viewerid: \"100006118350059\",\n                likesentences: {\n                    current: {\n                        text: \"Jan Vitek likes this.\",\n                        ranges: [{\n                            offset: 0,\n                            length: 9,\n                            entities: [{\n                                url: \"http://jsbngssl.www.facebook.com/jvitekjr\",\n                                id: 719575350\n                            },]\n                        },],\n                        aggregatedranges: []\n                    },\n                    alternate: {\n                        text: \"You and Jan Vitek like this.\",\n                        ranges: [{\n                            offset: 8,\n                            length: 9,\n                            entities: [{\n                                url: \"http://jsbngssl.www.facebook.com/jvitekjr\",\n                                id: 719575350\n                            },]\n                        },],\n                        aggregatedranges: []\n                    }\n                },\n                sharecount: 0,\n                ownerid: \"1055580469\",\n                lastseentime: null,\n                canremoveall: false,\n                seencount: 0,\n                seenbyall: false,\n                hasunseencollapsed: false,\n                mentionsdatasource: {\n                    __m: \"m_0_3c\"\n                },\n                isranked: false,\n                isthreaded: false,\n                isownerpage: false,\n                actorid: \"1055580469\",\n                grouporeventid: null,\n                allowphotoattachments: true,\n                replysocialsentencemaxreplies: 10,\n                showfeaturedreplies: false,\n                viewercansubscribetopost: false,\n                hasviewersubscribed: false,\n                commentboxhoisted: false,\n                hasaddcommentlink: false,\n                defaultcommentorderingmode: \"chronological\",\n                showsendonentertip: true\n            },],\n            comments: [{\n                id: \"10200350995551582_4954379\",\n                fbid: \"10200357365790834\",\n                legacyid: \"4954379\",\n                body: {\n                    text: \"You should have snatched it out of his hands, and played it/\",\n                    ranges: [],\n                    aggregatedranges: []\n                },\n                author: \"1710926078\",\n                ftentidentifier: \"10200350995551582\",\n                likecount: 0,\n                hasviewerliked: false,\n                canremove: false,\n                canreport: true,\n                canedit: false,\n                source: null,\n                istranslatable: false,\n                timestamp: {\n                    time: 1373168110,\n                    text: \"July 6 at 11:35pm\",\n                    verbose: \"Saturday, July 6, 2013 at 11:35pm\"\n                },\n                spamreplycount: 0,\n                replyauthors: []\n            },{\n                id: \"10200350995551582_4955913\",\n                fbid: \"10200359402281745\",\n                legacyid: \"4955913\",\n                body: {\n                    text: \"I've found that stealing musical instruments in non-English-speaking countries hasn't brought me great luck in the past.\",\n                    ranges: [],\n                    aggregatedranges: []\n                },\n                author: \"1055580469\",\n                ftentidentifier: \"10200350995551582\",\n                likecount: 0,\n                hasviewerliked: false,\n                canremove: false,\n                canreport: true,\n                canedit: false,\n                source: null,\n                istranslatable: false,\n                timestamp: {\n                    time: 1373214256,\n                    text: \"Sunday at 12:24pm\",\n                    verbose: \"Sunday, July 7, 2013 at 12:24pm\"\n                },\n                spamreplycount: 0,\n                replyauthors: []\n            },{\n                id: \"10200350995551582_4955915\",\n                fbid: \"10200359408281895\",\n                legacyid: \"4955915\",\n                body: {\n                    text: \"But in English-speaking countries it's just fine.\",\n                    ranges: [],\n                    aggregatedranges: []\n                },\n                author: \"10715287\",\n                ftentidentifier: \"10200350995551582\",\n                likecount: 0,\n                hasviewerliked: false,\n                canremove: false,\n                canreport: true,\n                canedit: false,\n                source: null,\n                istranslatable: false,\n                timestamp: {\n                    time: 1373214355,\n                    text: \"Sunday at 12:25pm\",\n                    verbose: \"Sunday, July 7, 2013 at 12:25pm\"\n                },\n                spamreplycount: 0,\n                replyauthors: []\n            },{\n                id: \"10200350995551582_4955918\",\n                fbid: \"10200359410801958\",\n                legacyid: \"4955918\",\n                body: {\n                    text: \"Naturally.\",\n                    ranges: [],\n                    aggregatedranges: []\n                },\n                author: \"1055580469\",\n                ftentidentifier: \"10200350995551582\",\n                likecount: 0,\n                hasviewerliked: false,\n                canremove: false,\n                canreport: true,\n                canedit: false,\n                source: null,\n                istranslatable: false,\n                timestamp: {\n                    time: 1373214375,\n                    text: \"Sunday at 12:26pm\",\n                    verbose: \"Sunday, July 7, 2013 at 12:26pm\"\n                },\n                spamreplycount: 0,\n                replyauthors: []\n            },],\n            profiles: [{\n                id: \"1710926078\",\n                JSBNG__name: \"Kathy Wertheimer Richards\",\n                firstName: \"Kathy\",\n                vanity: \"kathy.w.richards\",\n                thumbSrc: \"http://jsbngssl.profile-a.xx.fbcdn.net/hprofile-prn2/s32x32/276006_1710926078_512651488_q.jpg\",\n                uri: \"http://jsbngssl.www.facebook.com/kathy.w.richards\",\n                gender: 1,\n                type: \"user\",\n                is_friend: false,\n                social_snippets: null\n            },{\n                id: \"1055580469\",\n                JSBNG__name: \"Gregor Richards\",\n                firstName: \"Gregor\",\n                vanity: \"LawlabeeTheWallaby\",\n                thumbSrc: \"http://jsbngssl.fbcdn-profile-a.akamaihd.net/hprofile-ak-prn2/s32x32/276274_1055580469_962040234_q.jpg\",\n                uri: \"http://jsbngssl.www.facebook.com/LawlabeeTheWallaby\",\n                gender: 2,\n                type: \"user\",\n                is_friend: false,\n                social_snippets: null\n            },{\n                id: \"10715287\",\n                JSBNG__name: \"Michael A Goss\",\n                firstName: \"Michael\",\n                vanity: \"michael.a.goss\",\n                thumbSrc: \"http://jsbngssl.fbcdn-profile-a.akamaihd.net/hprofile-ak-prn1/s32x32/624179_10715287_1397603425_q.jpg\",\n                uri: \"http://jsbngssl.www.facebook.com/michael.a.goss\",\n                gender: 2,\n                type: \"user\",\n                is_friend: false,\n                social_snippets: null\n            },],\n            actions: [],\n            commentlists: {\n                comments: {\n                    10200350995551582: {\n                        chronological: {\n                            range: {\n                                offset: 1,\n                                length: 4\n                            },\n                            values: [\"10200350995551582_4954379\",\"10200350995551582_4955913\",\"10200350995551582_4955915\",\"10200350995551582_4955918\",]\n                        }\n                    }\n                },\n                replies: {\n                    \"10200350995551582_4954379\": {\n                        range: {\n                            offset: 0,\n                            length: 0\n                        },\n                        values: [],\n                        count: 0,\n                        ftentidentifier: \"10200350995551582\"\n                    },\n                    \"10200350995551582_4955913\": {\n                        range: {\n                            offset: 0,\n                            length: 0\n                        },\n                        values: [],\n                        count: 0,\n                        ftentidentifier: \"10200350995551582\"\n                    },\n                    \"10200350995551582_4955915\": {\n                        range: {\n                            offset: 0,\n                            length: 0\n                        },\n                        values: [],\n                        count: 0,\n                        ftentidentifier: \"10200350995551582\"\n                    },\n                    \"10200350995551582_4955918\": {\n                        range: {\n                            offset: 0,\n                            length: 0\n                        },\n                        values: [],\n                        count: 0,\n                        ftentidentifier: \"10200350995551582\"\n                    }\n                }\n            },\n            servertime: 1373491278\n        },],1,],[\"m_0_3b\",[\"UFIController\",\"m_0_3a\",\"m_0_37\",],[{\n            __m: \"m_0_3a\"\n        },{\n            ftentidentifier: \"10200325012062011\",\n            instanceid: \"u_0_1r\",\n            source: 0,\n            showaddcomment: true,\n            collapseaddcomment: false,\n            markedcomments: [],\n            scrollcomments: false,\n            scrollwidth: null,\n            showshares: false,\n            shownub: false,\n            numberdelimiter: \",\",\n            showtyping: 0,\n            logtyping: 0,\n            entstream: false,\n            embedded: false,\n            viewoptionstypeobjects: null,\n            viewoptionstypeobjectsorder: null,\n            giftoccasion: null,\n            sht: 1,\n            timelinelogdata: \"AQAFUCiLAT5RUcefEz2gKoDEw2y45fki1LQIejQbsCIWgwWsHCHMRqEd6NhhEE3HTJZ2JeWFwNWNGpTentE0x92XazUIAtkX7WDrpyxi9lvRDzK82lTMz_-Mi3SE3WjxflxWWcoKMLrhgXNr8_aZGGFiPZMoR9NNj1x_UacSFZb2GTZ-WXhNFIoMR3XpZ0Pz27lrZweBjs2LJCZhbxVEPWJ_zyMrKnZHkx2FTxMwMZsHcYwye7UenkmczH058RJbpEvmjgxS1Gm_mgug6mBvaekggu2f8o4Rr45al2p3_SqwfDej46LHq_iPe0GGAcI4qqYAbF-p79BSdK-YgegB9yVzvHPCboN8aAtfuzDypVKin-tqTXAmmqLB3xV3C7kjQE4TV1nfDtFW2pWKQZP4YUc1kQmo11w5z3YMFqDxoxibhQ\"\n        },{\n            feedbacktargets: [{\n                targetfbid: \"10200325012062011\",\n                entidentifier: \"10200325012062011\",\n                permalink: \"/LawlabeeTheWallaby/posts/10200325012062011\",\n                commentcount: 0,\n                likecount: 1,\n                viewercanlike: true,\n                hasviewerliked: false,\n                cancomment: false,\n                showremovemenu: false,\n                actorforpost: \"100006118350059\",\n                viewerid: \"100006118350059\",\n                likesentences: {\n                    current: {\n                        text: \"Steph Burg likes this.\",\n                        ranges: [{\n                            offset: 0,\n                            length: 10,\n                            entities: [{\n                                url: \"http://jsbngssl.www.facebook.com/rubolix\",\n                                id: 8621712\n                            },]\n                        },],\n                        aggregatedranges: []\n                    },\n                    alternate: {\n                        text: \"You and Steph Burg like this.\",\n                        ranges: [{\n                            offset: 8,\n                            length: 10,\n                            entities: [{\n                                url: \"http://jsbngssl.www.facebook.com/rubolix\",\n                                id: 8621712\n                            },]\n                        },],\n                        aggregatedranges: []\n                    }\n                },\n                sharecount: 0,\n                ownerid: \"1055580469\",\n                lastseentime: null,\n                canremoveall: false,\n                seencount: 0,\n                seenbyall: false,\n                hasunseencollapsed: false,\n                mentionsdatasource: {\n                    __m: \"m_0_37\"\n                },\n                isranked: false,\n                isthreaded: false,\n                isownerpage: false,\n                actorid: \"1055580469\",\n                grouporeventid: null,\n                allowphotoattachments: true,\n                replysocialsentencemaxreplies: 10,\n                showfeaturedreplies: false,\n                viewercansubscribetopost: false,\n                hasviewersubscribed: false,\n                commentboxhoisted: false,\n                hasaddcommentlink: false,\n                defaultcommentorderingmode: \"chronological\",\n                showsendonentertip: true\n            },],\n            comments: [],\n            profiles: [],\n            actions: [],\n            commentlists: {\n                comments: {\n                    10200325012062012: {\n                        chronological: {\n                            range: {\n                                offset: 0,\n                                length: 0\n                            },\n                            values: []\n                        }\n                    }\n                },\n                replies: null\n            },\n            servertime: 1373491278\n        },],1,],[\"m_0_3e\",[\"UFIController\",\"m_0_3d\",\"m_0_37\",],[{\n            __m: \"m_0_3d\"\n        },{\n            ftentidentifier: \"10200343222477260\",\n            instanceid: \"u_0_1u\",\n            source: 0,\n            showaddcomment: true,\n            collapseaddcomment: false,\n            markedcomments: [],\n            scrollcomments: false,\n            scrollwidth: null,\n            showshares: false,\n            shownub: false,\n            numberdelimiter: \",\",\n            showtyping: 0,\n            logtyping: 0,\n            entstream: false,\n            embedded: false,\n            viewoptionstypeobjects: null,\n            viewoptionstypeobjectsorder: null,\n            giftoccasion: null,\n            sht: 1,\n            timelinelogdata: \"AQCrvWaeB11JjIMAytH5Nvv3qmEhQbh5baPerOqkyOPG1prNmmgkQAYqxfM8F4KjqFTD35ePAPwvQDoPrrHJTHSjopTAuw4pc583uhw3meWdTKut8CfMnKQqizqrxNnzYyp4oPdWH66yt7nwLvLnUzUvcvAjMWicEEkiNWbuP3BEi1jT5w2dD7zoCGzxzHY_BeJ1PJ9BPrKJxn6P8TCdhb40KyMbyy0_kaWcpo1sksJl-adSjcOMevAoGosEm8ZiQxjcmpajE_jLfhvKfoYMMW3spYJ_rJby1Js3Q_VW7GswwODSD2FCX_pOREfx3p9VXZfl1eZNupMCx6QKcIGU-ExdJPac8H7Lp4XnIPKIpA49Y5Y9rJADGzQX23L_q5IbjhfIntPu29XD5hzwIEpzA6EL\"\n        },{\n            feedbacktargets: [{\n                targetfbid: \"10200343222477260\",\n                entidentifier: \"10200343222477260\",\n                permalink: \"/LawlabeeTheWallaby/posts/10200343222477260\",\n                commentcount: 11,\n                likecount: 7,\n                viewercanlike: true,\n                hasviewerliked: false,\n                cancomment: false,\n                showremovemenu: false,\n                actorforpost: \"100006118350059\",\n                viewerid: \"100006118350059\",\n                likesentences: {\n                    current: {\n                        text: \"7 people like this.\",\n                        ranges: [],\n                        aggregatedranges: [{\n                            offset: 0,\n                            length: 8,\n                            count: 7\n                        },]\n                    },\n                    alternate: {\n                        text: \"You and 7 others like this.\",\n                        ranges: [],\n                        aggregatedranges: [{\n                            offset: 8,\n                            length: 8,\n                            count: 7\n                        },]\n                    }\n                },\n                sharecount: 0,\n                ownerid: \"1055580469\",\n                lastseentime: null,\n                canremoveall: false,\n                seencount: 0,\n                seenbyall: false,\n                hasunseencollapsed: false,\n                mentionsdatasource: {\n                    __m: \"m_0_37\"\n                },\n                isranked: false,\n                isthreaded: false,\n                isownerpage: false,\n                actorid: \"1055580469\",\n                grouporeventid: null,\n                allowphotoattachments: true,\n                replysocialsentencemaxreplies: 10,\n                showfeaturedreplies: false,\n                viewercansubscribetopost: false,\n                hasviewersubscribed: false,\n                commentboxhoisted: false,\n                hasaddcommentlink: false,\n                defaultcommentorderingmode: \"chronological\",\n                showsendonentertip: true\n            },],\n            comments: [{\n                id: \"10200343222477260_4946958\",\n                fbid: \"10200346777686138\",\n                legacyid: \"4946958\",\n                body: {\n                    text: \"Does it have a sense of the surreal or are you just sharing a data point? ;)\",\n                    ranges: [],\n                    aggregatedranges: []\n                },\n                author: \"1633181753\",\n                ftentidentifier: \"10200343222477260\",\n                likecount: 0,\n                hasviewerliked: false,\n                canremove: false,\n                canreport: true,\n                canedit: false,\n                source: null,\n                istranslatable: false,\n                timestamp: {\n                    time: 1372985540,\n                    text: \"July 4 at 8:52pm\",\n                    verbose: \"Thursday, July 4, 2013 at 8:52pm\"\n                },\n                spamreplycount: 0,\n                replyauthors: []\n            },{\n                id: \"10200343222477260_4947623\",\n                fbid: \"10200347758230651\",\n                legacyid: \"4947623\",\n                body: {\n                    text: \"Merely minor amusement.\",\n                    ranges: [],\n                    aggregatedranges: []\n                },\n                author: \"1055580469\",\n                ftentidentifier: \"10200343222477260\",\n                likecount: 0,\n                hasviewerliked: false,\n                canremove: false,\n                canreport: true,\n                canedit: false,\n                source: null,\n                istranslatable: false,\n                timestamp: {\n                    time: 1373002430,\n                    text: \"July 5 at 1:33am\",\n                    verbose: \"Friday, July 5, 2013 at 1:33am\"\n                },\n                spamreplycount: 0,\n                replyauthors: []\n            },{\n                id: \"10200343222477260_4950566\",\n                fbid: \"10200351838652659\",\n                legacyid: \"4950566\",\n                body: {\n                    text: \"Did you wear http://img2.etsystatic.com/005/0/8125869/il_570xN.471485474_swpa.jpg\",\n                    ranges: [{\n                        offset: 13,\n                        length: 68,\n                        entities: [{\n                            url: \"http://img2.etsystatic.com/005/0/8125869/il_570xN.471485474_swpa.jpg\",\n                            shimhash: \"nAQExoxFw\",\n                            id: \"0746af69b9da85d793efe61531abaafe\",\n                            JSBNG__external: true\n                        },]\n                    },],\n                    aggregatedranges: []\n                },\n                author: \"53600996\",\n                ftentidentifier: \"10200343222477260\",\n                likecount: 0,\n                hasviewerliked: false,\n                canremove: false,\n                canreport: true,\n                canedit: false,\n                source: null,\n                istranslatable: false,\n                timestamp: {\n                    time: 1373066508,\n                    text: \"July 5 at 7:21pm\",\n                    verbose: \"Friday, July 5, 2013 at 7:21pm\"\n                },\n                spamreplycount: 0,\n                replyauthors: []\n            },{\n                id: \"10200343222477260_4950571\",\n                fbid: \"10200351843052769\",\n                legacyid: \"4950571\",\n                body: {\n                    text: \"That's the most delightfully offensive piece of apparel I've seen in quite some time.\",\n                    ranges: [],\n                    aggregatedranges: []\n                },\n                author: \"1055580469\",\n                ftentidentifier: \"10200343222477260\",\n                likecount: 0,\n                hasviewerliked: false,\n                canremove: false,\n                canreport: true,\n                canedit: false,\n                source: null,\n                istranslatable: false,\n                timestamp: {\n                    time: 1373066594,\n                    text: \"July 5 at 7:23pm\",\n                    verbose: \"Friday, July 5, 2013 at 7:23pm\"\n                },\n                spamreplycount: 0,\n                replyauthors: []\n            },],\n            profiles: [{\n                id: \"1633181753\",\n                JSBNG__name: \"Robert Nesius\",\n                firstName: \"Robert\",\n                vanity: \"rnesius\",\n                thumbSrc: \"http://jsbngssl.fbcdn-profile-a.akamaihd.net/hprofile-ak-prn1/s32x32/573766_1633181753_1114062672_q.jpg\",\n                uri: \"http://jsbngssl.www.facebook.com/rnesius\",\n                gender: 2,\n                type: \"user\",\n                is_friend: false,\n                social_snippets: null\n            },{\n                id: \"53600996\",\n                JSBNG__name: \"Harrison Metzger\",\n                firstName: \"Harrison\",\n                vanity: \"harrisonmetz\",\n                thumbSrc: \"http://jsbngssl.fbcdn-profile-a.akamaihd.net/hprofile-ak-ash4/s32x32/195694_53600996_1993816119_q.jpg\",\n                uri: \"http://jsbngssl.www.facebook.com/harrisonmetz\",\n                gender: 2,\n                type: \"user\",\n                is_friend: false,\n                social_snippets: null\n            },],\n            actions: [],\n            commentlists: {\n                comments: {\n                    10200343222477260: {\n                        chronological: {\n                            range: {\n                                offset: 7,\n                                length: 4\n                            },\n                            values: [\"10200343222477260_4946958\",\"10200343222477260_4947623\",\"10200343222477260_4950566\",\"10200343222477260_4950571\",]\n                        }\n                    }\n                },\n                replies: {\n                    \"10200343222477260_4946958\": {\n                        range: {\n                            offset: 0,\n                            length: 0\n                        },\n                        values: [],\n                        count: 0,\n                        ftentidentifier: \"10200343222477260\"\n                    },\n                    \"10200343222477260_4947623\": {\n                        range: {\n                            offset: 0,\n                            length: 0\n                        },\n                        values: [],\n                        count: 0,\n                        ftentidentifier: \"10200343222477260\"\n                    },\n                    \"10200343222477260_4950566\": {\n                        range: {\n                            offset: 0,\n                            length: 0\n                        },\n                        values: [],\n                        count: 0,\n                        ftentidentifier: \"10200343222477260\"\n                    },\n                    \"10200343222477260_4950571\": {\n                        range: {\n                            offset: 0,\n                            length: 0\n                        },\n                        values: [],\n                        count: 0,\n                        ftentidentifier: \"10200343222477260\"\n                    }\n                }\n            },\n            servertime: 1373491278\n        },],1,],[\"m_0_37\",[\"MultiBootstrapDataSource\",],[{\n            maxResults: 3,\n            queryData: {\n                context: \"topics_limited_autosuggest\",\n                viewer: 100006118350059,\n                filter: [\"page\",\"user\",],\n                rsp: \"mentions\"\n            },\n            queryEndpoint: \"/ajax/typeahead/search.php\",\n            bootstrapData: {\n                rsp: \"mentions\"\n            },\n            bootstrapEndpoints: [{\n                endpoint: \"/ajax/typeahead/first_degree.php\",\n                data: {\n                    context: \"mentions\",\n                    viewer: 100006118350059,\n                    token: \"1372173655-7\",\n                    filter: [\"page\",\"group\",\"app\",\"JSBNG__event\",\"user\",],\n                    options: [\"friends_only\",\"nm\",]\n                }\n            },]\n        },],6,],[\"m_0_3c\",[\"MultiBootstrapDataSource\",],[{\n            maxResults: 3,\n            queryData: {\n                context: \"topics_limited_autosuggest\",\n                viewer: 100006118350059,\n                filter: [\"page\",\"user\",],\n                rsp: \"mentions\"\n            },\n            queryEndpoint: \"/ajax/typeahead/search.php\",\n            bootstrapData: {\n                rsp: \"mentions\"\n            },\n            bootstrapEndpoints: [{\n                endpoint: \"/ajax/typeahead/first_degree.php\",\n                data: {\n                    context: \"mentions\",\n                    viewer: 100006118350059,\n                    token: \"1372173655-7\",\n                    filter: [\"page\",\"group\",\"app\",\"JSBNG__event\",\"user\",],\n                    options: [\"friends_only\",\"nm\",]\n                }\n            },]\n        },],2,],[\"m_0_3f\",[\"XHPTemplate\",\"m_0_3g\",],[{\n            __m: \"m_0_3g\"\n        },],2,],],\n        define: [[\"CLogConfig\",[],{\n            gkResults: 0\n        },174,],[\"UFICommentTemplates\",[\"m_0_3f\",],{\n            \":fb:ufi:hide-dialog-template\": {\n                __m: \"m_0_3f\"\n            }\n        },70,],[\"UFISpamCountImpl\",[],{\n            \"module\": null\n        },72,],[\"UFIConfig\",[],{\n            renderEmoji: true,\n            renderEmoticons: 1\n        },71,],],\n        elements: [[\"m_0_2l\",\"u_0_1c\",2,],[\"m_0_2i\",\"u_0_1d\",4,],[\"m_0_2q\",\"u_0_1g\",2,],[\"m_0_2n\",\"u_0_1h\",4,],[\"m_0_2v\",\"u_0_1j\",2,],[\"m_0_2s\",\"u_0_1k\",4,],[\"m_0_30\",\"u_0_1m\",2,],[\"m_0_2x\",\"u_0_1n\",4,],[\"m_0_35\",\"u_0_1p\",2,],[\"m_0_38\",\"u_0_1s\",2,],[\"m_0_3a\",\"u_0_1t\",2,],[\"m_0_3d\",\"u_0_1v\",2,],[\"m_0_32\",\"u_0_1w\",2,],[\"m_0_31\",\"u_0_1x\",2,],[\"m_0_33\",\"u_0_1y\",2,],[\"m_0_34\",\"u_0_1z\",2,],],\n        markup: [[\"m_0_3g\",{\n            __html: \"\\u003Cdiv\\u003E\\u003Cdiv class=\\\"pvs phm _1yw\\\" data-jsid=\\\"title\\\"\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"pam _13\\\" data-jsid=\\\"body\\\"\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"_14\\\"\\u003E\\u003Cdiv class=\\\"pam uiOverlayFooter uiBoxGray topborder\\\"\\u003E\\u003Cbutton value=\\\"1\\\" class=\\\"_42ft _42fu layerConfirm uiOverlayButton selected _42g- _42gy\\\" data-jsid=\\\"delete\\\" type=\\\"submit\\\"\\u003EDelete\\u003C/button\\u003E\\u003Ca class=\\\"_42ft _42fu layerCancel uiOverlayButton _42gy\\\" role=\\\"button\\\" href=\\\"#\\\"\\u003ECancel\\u003C/a\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],]\n    },\n    css: [\"W3Ky6\",\"ZtiRu\",\"0duP3\",],\n    bootloadable: {\n        TypeaheadHoistFriends: {\n            resources: [\"bUzfU\",],\n            \"module\": true\n        },\n        \"UFIEntStreamOrderingModeSelector.react\": {\n            resources: [\"AyUu6\",\"OJTM4\",\"W3Ky6\",\"AsDOA\",\"bUzfU\",\"0duP3\",\"vzIoO\",\"QI+gv\",\"TOw+q\",],\n            \"module\": true\n        },\n        InputSelection: {\n            resources: [\"AyUu6\",\"W3Ky6\",\"AsDOA\",],\n            \"module\": true\n        },\n        FileInputUploader: {\n            resources: [\"AyUu6\",\"AsDOA\",\"LpC/l\",\"FFdfj\",],\n            \"module\": true\n        },\n        DialogX: {\n            resources: [\"AyUu6\",\"AsDOA\",\"W3Ky6\",\"OJTM4\",],\n            \"module\": true\n        },\n        ContextualTypeaheadView: {\n            resources: [\"AyUu6\",\"0duP3\",\"u//Ut\",\"W3Ky6\",\"AsDOA\",],\n            \"module\": true\n        },\n        TypeaheadBestName: {\n            resources: [\"OJTM4\",\"u//Ut\",],\n            \"module\": true\n        },\n        TypeaheadMetrics: {\n            resources: [\"AyUu6\",\"bUzfU\",],\n            \"module\": true\n        },\n        MentionsInput: {\n            resources: [\"AyUu6\",\"W3Ky6\",\"AsDOA\",\"bUzfU\",\"OJTM4\",],\n            \"module\": true\n        },\n        TypingDetector: {\n            resources: [\"AyUu6\",\"u//Ut\",],\n            \"module\": true\n        },\n        TypeaheadAreaCore: {\n            resources: [\"AyUu6\",\"W3Ky6\",\"AsDOA\",\"u//Ut\",\"bUzfU\",],\n            \"module\": true\n        },\n        EntstreamPubContentOverlay: {\n            resources: [\"AyUu6\",\"OJTM4\",\"W3Ky6\",\"AsDOA\",\"SZ74q\",\"7EHvC\",\"TOw+q\",\"0duP3\",\"63VzN\",\"40bIq\",],\n            \"module\": true\n        },\n        CompactTypeaheadRenderer: {\n            resources: [\"AyUu6\",\"0duP3\",\"u//Ut\",\"W3Ky6\",],\n            \"module\": true\n        },\n        ScrollAwareDOM: {\n            resources: [\"AyUu6\",\"AsDOA\",],\n            \"module\": true\n        },\n        \"legacy:live-js\": {\n            resources: [\"AyUu6\",\"OJTM4\",]\n        },\n        collectDataAttributes: {\n            resources: [\"AyUu6\",],\n            \"module\": true\n        },\n        UFIScrollHighlight: {\n            resources: [\"AyUu6\",\"AsDOA\",\"KPZ5T\",\"rSdpp\",],\n            \"module\": true\n        },\n        UFIComments: {\n            resources: [\"OJTM4\",\"AyUu6\",],\n            \"module\": true\n        },\n        UFIRetryActions: {\n            resources: [\"AyUu6\",\"OJTM4\",\"8ay4F\",],\n            \"module\": true\n        },\n        LegacyMenuUtils: {\n            resources: [\"AyUu6\",\"AsDOA\",\"W3Ky6\",\"OJTM4\",\"utuxU\",\"NfUUN\",],\n            \"module\": true\n        },\n        HashtagLayerPageController: {\n            resources: [\"AyUu6\",\"OJTM4\",\"W3Ky6\",\"AsDOA\",\"SZ74q\",\"IxyKh\",\"cq4zB\",\"Lsvc0\",\"7EHvC\",\"BBKr2\",\"iFPko\",\"AMFDz\",\"qRGqD\",],\n            \"module\": true\n        },\n        \"legacy:ufi-tracking-js\": {\n            resources: [\"AyUu6\",]\n        },\n        CLoggerX: {\n            resources: [\"AyUu6\",\"OJTM4\",],\n            \"module\": true\n        },\n        \"UFICommentRemovalControls.react\": {\n            resources: [\"OJTM4\",\"AyUu6\",\"W3Ky6\",\"QE+SD\",],\n            \"module\": true\n        },\n        DOMScroll: {\n            resources: [\"AyUu6\",\"AsDOA\",],\n            \"module\": true\n        },\n        ScrollableArea: {\n            resources: [\"AyUu6\",\"AsDOA\",\"W3Ky6\",],\n            \"module\": true\n        },\n        HashtagParser: {\n            resources: [\"u//Ut\",\"hfrQl\",],\n            \"module\": true\n        },\n        TextAreaControl: {\n            resources: [\"AyUu6\",\"LpC/l\",\"W3Ky6\",],\n            \"module\": true\n        },\n        LegacyContextualDialog: {\n            resources: [\"AyUu6\",\"AsDOA\",\"EzMPG\",\"W3Ky6\",],\n            \"module\": true\n        },\n        Typeahead: {\n            resources: [\"AyUu6\",\"W3Ky6\",\"u//Ut\",],\n            \"module\": true\n        },\n        Hovercard: {\n            resources: [\"AyUu6\",\"AsDOA\",\"W3Ky6\",],\n            \"module\": true\n        },\n        FileInput: {\n            resources: [\"AyUu6\",\"u//Ut\",\"W3Ky6\",],\n            \"module\": true\n        },\n        \"UFIOrderingModeSelector.react\": {\n            resources: [\"AyUu6\",\"OJTM4\",\"W3Ky6\",\"AsDOA\",\"bUzfU\",],\n            \"module\": true\n        }\n    },\n    resource_map: {\n        AMFDz: {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yb/r/l0jEiYB1BY4.js\"\n        },\n        BBKr2: {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yu/r/AS6izN-qGVZ.js\"\n        },\n        SZ74q: {\n            type: \"css\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yG/r/9E2LeES-RRN.css\"\n        },\n        \"QI+gv\": {\n            type: \"css\",\n            permanent: 1,\n            crossOrigin: 1,\n            src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yF/r/w_bzJgcyc3W.css\"\n        },\n        \"8ay4F\": {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yC/r/VrfxLTcinh0.js\"\n        },\n        iFPko: {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yD/r/8h9kPf0GHRH.js\"\n        },\n        vzIoO: {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yk/r/oUbZBpEktAd.js\"\n        },\n        Lsvc0: {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yQ/r/_hmcMOWGDp_.js\"\n        },\n        NfUUN: {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/y4/r/2xf6U6ugHB5.js\"\n        },\n        rSdpp: {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yc/r/2PkTFjdVPzc.js\"\n        },\n        \"7EHvC\": {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yW/r/Pey6lNCLBYS.js\"\n        },\n        \"40bIq\": {\n            type: \"css\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yW/r/6QVB5ZYkMIN.css\"\n        },\n        qRGqD: {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yx/r/7VYwuqZ2nti.js\"\n        },\n        \"QE+SD\": {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yJ/r/PIykjmSfAPR.js\"\n        },\n        \"TOw+q\": {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yd/r/vux7xKvT3o9.js\"\n        },\n        utuxU: {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yy/r/NRYuSW1uDUF.js\"\n        },\n        FFdfj: {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yp/r/jyBR-Jzbcb5.js\"\n        },\n        IxyKh: {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yv/r/ZIi5f4O5zUo.js\"\n        },\n        cq4zB: {\n            type: \"css\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yt/r/h721jO007c4.css\"\n        }\n    },\n    ixData: {\n        \"/images/group_gifts/icons/gift_icon_red-13px.png\": {\n            sprited: false,\n            uri: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yP/r/83ZMt066WCp.png\",\n            width: 13,\n            height: 13\n        }\n    },\n    js: [\"AyUu6\",\"AsDOA\",\"jsIYP\",\"OJTM4\",\"+h1d2\",\"3SGVa\",],\n    displayJS: [\"AyUu6\",\"OJTM4\",],\n    onafterload: [\"Bootloader.loadComponents([\\\"legacy:live-js\\\"], function(){ Live.startup() });\",\"Bootloader.loadComponents([\\\"legacy:live-js\\\"], function(){ Live.startup() });\",\"Bootloader.loadComponents([\\\"legacy:ufi-tracking-js\\\"], function(){ ufi_add_all_link_data(); });\",\"Bootloader.loadComponents([\\\"legacy:live-js\\\"], function(){ Live.startup() });\",\"Bootloader.loadComponents([\\\"legacy:live-js\\\"], function(){ Live.startup() });\",],\n    id: \"pagelet_timeline_recent_segment_0_0_left\",\n    phase: 2,\n    tti_phase: 2\n});");
// 1767
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o7,"bigPipe.onPageletArrive({\n    content: {\n        pagelet_sidebar: {\n            container_id: \"u_0_2e\"\n        }\n    },\n    jsmods: {\n        require: [[\"ChatSidebar\",\"init\",[\"m_0_3h\",\"m_0_3i\",\"m_0_3j\",],[{\n            __m: \"m_0_3h\"\n        },{\n            __m: \"m_0_3i\"\n        },{\n            __m: \"m_0_3j\"\n        },[],],],[\"ChatSidebarLog\",\"start\",[],[],],[\"m_0_3k\",],[\"m_0_3m\",],[\"m_0_3j\",],[\"Typeahead\",\"init\",[\"m_0_3n\",\"m_0_3j\",],[{\n            __m: \"m_0_3n\"\n        },{\n            __m: \"m_0_3j\"\n        },[\"chatTypeahead\",\"buildBestAvailableNames\",\"showLoadingIndicator\",],null,],],[\"ClearableTypeahead\",\"resetOnCloseButtonClick\",[\"m_0_3j\",\"m_0_3p\",],[{\n            __m: \"m_0_3j\"\n        },{\n            __m: \"m_0_3p\"\n        },],],[\"m_0_3s\",],[\"m_0_3t\",],[\"Layer\",\"init\",[\"m_0_3t\",\"m_0_3u\",],[{\n            __m: \"m_0_3t\"\n        },{\n            __m: \"m_0_3u\"\n        },],],[\"m_0_3i\",],[\"PresencePrivacy\",],],\n        instances: [[\"m_0_3m\",[\"ScrollableArea\",\"m_0_3l\",],[{\n            __m: \"m_0_3l\"\n        },{\n            persistent: true\n        },],1,],[\"m_0_3j\",[\"Typeahead\",\"m_0_3q\",\"ChatTypeaheadView\",\"ChatTypeaheadRenderer\",\"m_0_3n\",\"ChatTypeaheadCore\",\"m_0_3o\",],[{\n            __m: \"m_0_3q\"\n        },{\n            node_id: \"u_0_21\",\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_3n\"\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_3o\"\n        },],7,],[\"m_0_3s\",[\"ChatSidebarDropdown\",\"m_0_3r\",],[{\n            __m: \"m_0_3r\"\n        },null,],1,],[\"m_0_3t\",[\"LegacyContextualDialog\",\"AccessibleLayer\",],[{\n            buildWrapper: false,\n            causalElement: null,\n            addedBehaviors: [{\n                __m: \"AccessibleLayer\"\n            },]\n        },],5,],[\"m_0_3i\",[\"ChatOrderedList\",\"m_0_3v\",\"m_0_3w\",\"m_0_3x\",\"m_0_3t\",],[true,{\n            __m: \"m_0_3v\"\n        },{\n            __m: \"m_0_3w\"\n        },{\n            __m: \"m_0_3x\"\n        },{\n            __m: \"m_0_3t\"\n        },null,],5,],[\"m_0_3k\",[\"LiveBarDark\",\"m_0_3i\",],[{\n            __m: \"m_0_3i\"\n        },[],[\"music\",\"canvas\",\"checkin\",\"travelling\",],],1,],[\"m_0_3q\",[\"ChatTypeaheadDataSource\",],[{\n            alwaysPrefixMatch: true,\n            showOfflineUsers: true\n        },],2,],[\"m_0_3w\",[\"XHPTemplate\",\"m_0_3y\",],[{\n            __m: \"m_0_3y\"\n        },],2,],[\"m_0_3x\",[\"XHPTemplate\",\"m_0_3z\",],[{\n            __m: \"m_0_3z\"\n        },],2,],[\"m_0_40\",[\"XHPTemplate\",\"m_0_44\",],[{\n            __m: \"m_0_44\"\n        },],2,],[\"m_0_41\",[\"XHPTemplate\",\"m_0_45\",],[{\n            __m: \"m_0_45\"\n        },],2,],[\"m_0_42\",[\"XHPTemplate\",\"m_0_47\",],[{\n            __m: \"m_0_47\"\n        },],2,],[\"m_0_43\",[\"XHPTemplate\",\"m_0_49\",],[{\n            __m: \"m_0_49\"\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: \"1373491278000\",\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_40\",\"m_0_41\",\"m_0_42\",\"m_0_43\",],{\n            \":fb:chat:blackbird:dialog-frame\": {\n                __m: \"m_0_40\"\n            },\n            \":fb:chat:blackbird:offline-educate\": {\n                __m: \"m_0_41\"\n            },\n            \":fb:chat:blackbird:most-friends-educate\": {\n                __m: \"m_0_42\"\n            },\n            \":fb:chat:blackbird:some-friends-educate\": {\n                __m: \"m_0_43\"\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.fbstatic-a.akamaihd.net/rsrc.php/yT/r/q-Drar4Ade6.ogg\",\n            idle_limit: 1800000,\n            \"sidebar.min_friends\": 7,\n            \"sound.notif_mp3_url\": \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/yb/r/VBbzpp2k5li.mp3\",\n            idle_poll_interval: 300000,\n            activity_limit: 60000,\n            \"sound.ringtone_mp3_url\": \"http://jsbngssl.fbstatic-a.akamaihd.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.fbstatic-a.akamaihd.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: 1373491278000\n        },166,],],\n        elements: [[\"m_0_3h\",\"u_0_22\",2,],[\"m_0_3l\",\"u_0_23\",2,],[\"m_0_3o\",\"u_0_24\",2,],[\"m_0_3p\",\"u_0_25\",2,],[\"m_0_3n\",\"u_0_26\",4,],[\"m_0_3r\",\"u_0_27\",2,],[\"m_0_3v\",\"u_0_29\",2,],[\"m_0_46\",\"u_0_2b\",2,\"m_0_45\",],[\"m_0_48\",\"u_0_2c\",2,\"m_0_47\",],[\"m_0_4a\",\"u_0_2d\",2,\"m_0_49\",],],\n        markup: [[\"m_0_3u\",{\n            __html: \"\\u003Cdiv class=\\\"uiContextualDialogPositioner\\\" id=\\\"u_0_28\\\" 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_3y\",{\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.fbstatic-a.akamaihd.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.fbstatic-a.akamaihd.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.fbstatic-a.akamaihd.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.fbstatic-a.akamaihd.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_3z\",{\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_44\",{\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_2a\\\"\\u003E\\u003Cinput title=\\\"Remove\\\" type=\\\"button\\\" data-jsid=\\\"dialogCloseButton\\\" id=\\\"u_0_2a\\\" /\\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_45\",{\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_2b\\\"\\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_47\",{\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_2c\\\"\\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_49\",{\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_2d\\\"\\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    },\n    resource_map: {\n        \"6tAwh\": {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yV/r/OktjXMyrl5l.js\"\n        },\n        \"H+v1W\": {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yl/r/OUIW4Mbs_w6.js\"\n        },\n        fvNhh: {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/y7/r/sghigcwX_l-.js\"\n        },\n        b7cJk: {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.fbstatic-a.akamaihd.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.fbstatic-a.akamaihd.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.fbstatic-a.akamaihd.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.fbstatic-a.akamaihd.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: 3\n});");
// 1768
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o7,"s7144c2b4882a7a306a63842ad9110cd8d48b5b57");
// 1769
geval("bigPipe.onPageletArrive({\n    JSBNG__content: {\n        pagelet_sidebar: {\n            container_id: \"u_0_2e\"\n        }\n    },\n    jsmods: {\n        require: [[\"ChatSidebar\",\"init\",[\"m_0_3h\",\"m_0_3i\",\"m_0_3j\",],[{\n            __m: \"m_0_3h\"\n        },{\n            __m: \"m_0_3i\"\n        },{\n            __m: \"m_0_3j\"\n        },[],],],[\"ChatSidebarLog\",\"start\",[],[],],[\"m_0_3k\",],[\"m_0_3m\",],[\"m_0_3j\",],[\"Typeahead\",\"init\",[\"m_0_3n\",\"m_0_3j\",],[{\n            __m: \"m_0_3n\"\n        },{\n            __m: \"m_0_3j\"\n        },[\"chatTypeahead\",\"buildBestAvailableNames\",\"showLoadingIndicator\",],null,],],[\"ClearableTypeahead\",\"resetOnCloseButtonClick\",[\"m_0_3j\",\"m_0_3p\",],[{\n            __m: \"m_0_3j\"\n        },{\n            __m: \"m_0_3p\"\n        },],],[\"m_0_3s\",],[\"m_0_3t\",],[\"Layer\",\"init\",[\"m_0_3t\",\"m_0_3u\",],[{\n            __m: \"m_0_3t\"\n        },{\n            __m: \"m_0_3u\"\n        },],],[\"m_0_3i\",],[\"PresencePrivacy\",],],\n        instances: [[\"m_0_3m\",[\"ScrollableArea\",\"m_0_3l\",],[{\n            __m: \"m_0_3l\"\n        },{\n            persistent: true\n        },],1,],[\"m_0_3j\",[\"Typeahead\",\"m_0_3q\",\"ChatTypeaheadView\",\"ChatTypeaheadRenderer\",\"m_0_3n\",\"ChatTypeaheadCore\",\"m_0_3o\",],[{\n            __m: \"m_0_3q\"\n        },{\n            node_id: \"u_0_21\",\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_3n\"\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_3o\"\n        },],7,],[\"m_0_3s\",[\"ChatSidebarDropdown\",\"m_0_3r\",],[{\n            __m: \"m_0_3r\"\n        },null,],1,],[\"m_0_3t\",[\"LegacyContextualDialog\",\"AccessibleLayer\",],[{\n            buildWrapper: false,\n            causalElement: null,\n            addedBehaviors: [{\n                __m: \"AccessibleLayer\"\n            },]\n        },],5,],[\"m_0_3i\",[\"ChatOrderedList\",\"m_0_3v\",\"m_0_3w\",\"m_0_3x\",\"m_0_3t\",],[true,{\n            __m: \"m_0_3v\"\n        },{\n            __m: \"m_0_3w\"\n        },{\n            __m: \"m_0_3x\"\n        },{\n            __m: \"m_0_3t\"\n        },null,],5,],[\"m_0_3k\",[\"LiveBarDark\",\"m_0_3i\",],[{\n            __m: \"m_0_3i\"\n        },[],[\"music\",\"canvas\",\"checkin\",\"travelling\",],],1,],[\"m_0_3q\",[\"ChatTypeaheadDataSource\",],[{\n            alwaysPrefixMatch: true,\n            showOfflineUsers: true\n        },],2,],[\"m_0_3w\",[\"XHPTemplate\",\"m_0_3y\",],[{\n            __m: \"m_0_3y\"\n        },],2,],[\"m_0_3x\",[\"XHPTemplate\",\"m_0_3z\",],[{\n            __m: \"m_0_3z\"\n        },],2,],[\"m_0_40\",[\"XHPTemplate\",\"m_0_44\",],[{\n            __m: \"m_0_44\"\n        },],2,],[\"m_0_41\",[\"XHPTemplate\",\"m_0_45\",],[{\n            __m: \"m_0_45\"\n        },],2,],[\"m_0_42\",[\"XHPTemplate\",\"m_0_47\",],[{\n            __m: \"m_0_47\"\n        },],2,],[\"m_0_43\",[\"XHPTemplate\",\"m_0_49\",],[{\n            __m: \"m_0_49\"\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: \"1373491278000\",\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_40\",\"m_0_41\",\"m_0_42\",\"m_0_43\",],{\n            \":fb:chat:blackbird:dialog-frame\": {\n                __m: \"m_0_40\"\n            },\n            \":fb:chat:blackbird:offline-educate\": {\n                __m: \"m_0_41\"\n            },\n            \":fb:chat:blackbird:most-friends-educate\": {\n                __m: \"m_0_42\"\n            },\n            \":fb:chat:blackbird:some-friends-educate\": {\n                __m: \"m_0_43\"\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.fbstatic-a.akamaihd.net/rsrc.php/yT/r/q-Drar4Ade6.ogg\",\n            idle_limit: 1800000,\n            \"sidebar.min_friends\": 7,\n            \"sound.notif_mp3_url\": \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/yb/r/VBbzpp2k5li.mp3\",\n            idle_poll_interval: 300000,\n            activity_limit: 60000,\n            \"sound.ringtone_mp3_url\": \"http://jsbngssl.fbstatic-a.akamaihd.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.fbstatic-a.akamaihd.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: 1373491278000\n        },166,],],\n        elements: [[\"m_0_3h\",\"u_0_22\",2,],[\"m_0_3l\",\"u_0_23\",2,],[\"m_0_3o\",\"u_0_24\",2,],[\"m_0_3p\",\"u_0_25\",2,],[\"m_0_3n\",\"u_0_26\",4,],[\"m_0_3r\",\"u_0_27\",2,],[\"m_0_3v\",\"u_0_29\",2,],[\"m_0_46\",\"u_0_2b\",2,\"m_0_45\",],[\"m_0_48\",\"u_0_2c\",2,\"m_0_47\",],[\"m_0_4a\",\"u_0_2d\",2,\"m_0_49\",],],\n        markup: [[\"m_0_3u\",{\n            __html: \"\\u003Cdiv class=\\\"uiContextualDialogPositioner\\\" id=\\\"u_0_28\\\" 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_3y\",{\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.fbstatic-a.akamaihd.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.fbstatic-a.akamaihd.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.fbstatic-a.akamaihd.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.fbstatic-a.akamaihd.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_3z\",{\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_44\",{\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_2a\\\"\\u003E\\u003Cinput title=\\\"Remove\\\" type=\\\"button\\\" data-jsid=\\\"dialogCloseButton\\\" id=\\\"u_0_2a\\\" /\\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_45\",{\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_2b\\\"\\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_47\",{\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_2c\\\"\\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_49\",{\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_2d\\\"\\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    },\n    resource_map: {\n        \"6tAwh\": {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yV/r/OktjXMyrl5l.js\"\n        },\n        \"H+v1W\": {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yl/r/OUIW4Mbs_w6.js\"\n        },\n        fvNhh: {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/y7/r/sghigcwX_l-.js\"\n        },\n        b7cJk: {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.fbstatic-a.akamaihd.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.fbstatic-a.akamaihd.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.fbstatic-a.akamaihd.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.fbstatic-a.akamaihd.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: 3\n});");
// 1776
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o7,"bigPipe.onPageletArrive({\n    append: \"u_0_17_right\",\n    is_last: true,\n    is_second_to_last_phase: true,\n    content: {\n        pagelet_timeline_recent_segment_0_0_right: {\n            container_id: \"u_0_2p\"\n        }\n    },\n    jsmods: {\n        require: [[\"TimelineContentLoader\",\"markSectionAsLoaded\",[],[\"u_0_18\",\"recent\",\"0\",],],[\"TimelineCapsule\",\"loadTwoColumnUnits\",[],[\"u_0_17\",],],[\"TimelineStickyRightColumn\",\"adjust\",[],[],],]\n    },\n    css: [\"W3Ky6\",\"ZtiRu\",\"RaYA1\",\"0duP3\",],\n    bootloadable: {\n    },\n    resource_map: {\n        RaYA1: {\n            type: \"css\",\n            permanent: 1,\n            crossOrigin: 1,\n            src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yt/r/CFIDS-pTvJ2.css\"\n        }\n    },\n    js: [\"AyUu6\",\"AsDOA\",\"jsIYP\",\"OJTM4\",\"+h1d2\",\"3SGVa\",],\n    id: \"pagelet_timeline_recent_segment_0_0_right\",\n    phase: 3\n});");
// 1777
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o7,"s943922c655173e1c90bbc4804674c7de02afa9c1");
// 1778
geval("bigPipe.onPageletArrive({\n    append: \"u_0_17_right\",\n    is_last: true,\n    is_second_to_last_phase: true,\n    JSBNG__content: {\n        pagelet_timeline_recent_segment_0_0_right: {\n            container_id: \"u_0_2p\"\n        }\n    },\n    jsmods: {\n        require: [[\"TimelineContentLoader\",\"markSectionAsLoaded\",[],[\"u_0_18\",\"recent\",\"0\",],],[\"TimelineCapsule\",\"loadTwoColumnUnits\",[],[\"u_0_17\",],],[\"TimelineStickyRightColumn\",\"adjust\",[],[],],]\n    },\n    css: [\"W3Ky6\",\"ZtiRu\",\"RaYA1\",\"0duP3\",],\n    bootloadable: {\n    },\n    resource_map: {\n        RaYA1: {\n            type: \"css\",\n            permanent: 1,\n            crossOrigin: 1,\n            src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yt/r/CFIDS-pTvJ2.css\"\n        }\n    },\n    js: [\"AyUu6\",\"AsDOA\",\"jsIYP\",\"OJTM4\",\"+h1d2\",\"3SGVa\",],\n    id: \"pagelet_timeline_recent_segment_0_0_right\",\n    phase: 3\n});");
// 1785
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o7,"bigPipe.onPageletArrive({\n    content: {\n        pagelet_side_ads: {\n            container_id: \"u_0_2r\"\n        }\n    },\n    jsmods: {\n        require: [[\"TimelineSideAds\",\"init\",[\"m_0_4b\",],[{\n            __m: \"m_0_4b\"\n        },1055580469,{\n            refresh_delay: 5000,\n            refresh_threshold: 30000,\n            mouse_move: 1,\n            max_ads: 5\n        },],],],\n        elements: [[\"m_0_4b\",\"u_0_2q\",2,],]\n    },\n    css: [\"W3Ky6\",\"0duP3\",\"ZtiRu\",],\n    bootloadable: {\n    },\n    resource_map: {\n    },\n    js: [\"AyUu6\",\"AsDOA\",\"jsIYP\",],\n    id: \"pagelet_side_ads\",\n    phase: 4\n});");
// 1786
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o7,"s69cc65dcd57102640a5edcd5771671d565c03fcd");
// 1787
geval("bigPipe.onPageletArrive({\n    JSBNG__content: {\n        pagelet_side_ads: {\n            container_id: \"u_0_2r\"\n        }\n    },\n    jsmods: {\n        require: [[\"TimelineSideAds\",\"init\",[\"m_0_4b\",],[{\n            __m: \"m_0_4b\"\n        },1055580469,{\n            refresh_delay: 5000,\n            refresh_threshold: 30000,\n            mouse_move: 1,\n            max_ads: 5\n        },],],],\n        elements: [[\"m_0_4b\",\"u_0_2q\",2,],]\n    },\n    css: [\"W3Ky6\",\"0duP3\",\"ZtiRu\",],\n    bootloadable: {\n    },\n    resource_map: {\n    },\n    js: [\"AyUu6\",\"AsDOA\",\"jsIYP\",],\n    id: \"pagelet_side_ads\",\n    phase: 4\n});");
// 1794
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o7,"bigPipe.onPageletArrive({\n    content: {\n        pagelet_dock: {\n            container_id: \"u_0_3g\"\n        }\n    },\n    jsmods: {\n        require: [[\"MusicButtonManager\",\"init\",[],[[\"music.song\",],],],[\"initLiveMessageReceiver\",],[\"Dock\",\"init\",[\"m_0_4c\",],[{\n            __m: \"m_0_4c\"\n        },],],[\"React\",\"constructAndRenderComponent\",[\"NotificationBeeper.react\",\"m_0_4d\",],[{\n            __m: \"NotificationBeeper.react\"\n        },{\n            unseenVsUnread: false,\n            canPause: false,\n            shouldLogImpressions: false,\n            soundPath: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/yy/r/odIeERVR1c5.mp3\",\n            soundEnabled: true,\n            tracking: \"{\\\"ref\\\":\\\"beeper\\\",\\\"jewel\\\":\\\"notifications\\\",\\\"type\\\":\\\"click2canvas\\\"}\"\n        },{\n            __m: \"m_0_4d\"\n        },],],[\"ChatApp\",\"init\",[\"m_0_4e\",\"m_0_4f\",],[{\n            __m: \"m_0_4e\"\n        },{\n            __m: \"m_0_4f\"\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_4h\",],[\"m_0_4j\",],[\"Typeahead\",\"init\",[\"m_0_4k\",\"m_0_4j\",],[{\n            __m: \"m_0_4k\"\n        },{\n            __m: \"m_0_4j\"\n        },[\"chatTypeahead\",\"buildBestAvailableNames\",\"showLoadingIndicator\",],null,],],[\"ClearableTypeahead\",\"resetOnCloseButtonClick\",[\"m_0_4j\",\"m_0_4m\",],[{\n            __m: \"m_0_4j\"\n        },{\n            __m: \"m_0_4m\"\n        },],],[\"m_0_4p\",],[\"m_0_4q\",],[\"Layer\",\"init\",[\"m_0_4q\",\"m_0_4r\",],[{\n            __m: \"m_0_4q\"\n        },{\n            __m: \"m_0_4r\"\n        },],],[\"m_0_4i\",],[\"m_0_6x\",],[\"Typeahead\",\"init\",[\"m_0_6v\",\"m_0_6x\",],[{\n            __m: \"m_0_6v\"\n        },{\n            __m: \"m_0_6x\"\n        },[],null,],],],\n        instances: [[\"m_0_4h\",[\"BuddyListNub\",\"m_0_4g\",\"m_0_4i\",\"m_0_4j\",],[{\n            __m: \"m_0_4g\"\n        },{\n            __m: \"m_0_4i\"\n        },{\n            __m: \"m_0_4j\"\n        },],1,],[\"m_0_4j\",[\"Typeahead\",\"m_0_4n\",\"ChatTypeaheadView\",\"ChatTypeaheadRenderer\",\"m_0_4k\",\"ChatTypeaheadCore\",\"m_0_4l\",],[{\n            __m: \"m_0_4n\"\n        },{\n            node_id: \"u_0_2v\",\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_4k\"\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_4l\"\n        },],7,],[\"m_0_4p\",[\"ChatSidebarDropdown\",\"m_0_4o\",],[{\n            __m: \"m_0_4o\"\n        },null,],1,],[\"m_0_4q\",[\"LegacyContextualDialog\",\"AccessibleLayer\",],[{\n            buildWrapper: false,\n            causalElement: null,\n            addedBehaviors: [{\n                __m: \"AccessibleLayer\"\n            },]\n        },],5,],[\"m_0_4i\",[\"ChatOrderedList\",\"m_0_4s\",\"m_0_4t\",\"m_0_4u\",\"m_0_4q\",],[false,{\n            __m: \"m_0_4s\"\n        },{\n            __m: \"m_0_4t\"\n        },{\n            __m: \"m_0_4u\"\n        },{\n            __m: \"m_0_4q\"\n        },null,],3,],[\"m_0_4n\",[\"ChatTypeaheadDataSource\",],[{\n            alwaysPrefixMatch: true,\n            showOfflineUsers: true\n        },],2,],[\"m_0_4t\",[\"XHPTemplate\",\"m_0_4v\",],[{\n            __m: \"m_0_4v\"\n        },],2,],[\"m_0_4u\",[\"XHPTemplate\",\"m_0_4w\",],[{\n            __m: \"m_0_4w\"\n        },],2,],[\"m_0_4x\",[\"XHPTemplate\",\"m_0_62\",],[{\n            __m: \"m_0_62\"\n        },],2,],[\"m_0_4y\",[\"XHPTemplate\",\"m_0_63\",],[{\n            __m: \"m_0_63\"\n        },],2,],[\"m_0_4z\",[\"XHPTemplate\",\"m_0_64\",],[{\n            __m: \"m_0_64\"\n        },],2,],[\"m_0_50\",[\"XHPTemplate\",\"m_0_65\",],[{\n            __m: \"m_0_65\"\n        },],2,],[\"m_0_51\",[\"XHPTemplate\",\"m_0_66\",],[{\n            __m: \"m_0_66\"\n        },],2,],[\"m_0_52\",[\"XHPTemplate\",\"m_0_67\",],[{\n            __m: \"m_0_67\"\n        },],2,],[\"m_0_53\",[\"XHPTemplate\",\"m_0_68\",],[{\n            __m: \"m_0_68\"\n        },],2,],[\"m_0_54\",[\"XHPTemplate\",\"m_0_69\",],[{\n            __m: \"m_0_69\"\n        },],2,],[\"m_0_55\",[\"XHPTemplate\",\"m_0_6a\",],[{\n            __m: \"m_0_6a\"\n        },],2,],[\"m_0_56\",[\"XHPTemplate\",\"m_0_6b\",],[{\n            __m: \"m_0_6b\"\n        },],2,],[\"m_0_57\",[\"XHPTemplate\",\"m_0_6c\",],[{\n            __m: \"m_0_6c\"\n        },],2,],[\"m_0_58\",[\"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_59\",[\"XHPTemplate\",\"m_0_6d\",],[{\n            __m: \"m_0_6d\"\n        },],2,],[\"m_0_5a\",[\"XHPTemplate\",\"m_0_6e\",],[{\n            __m: \"m_0_6e\"\n        },],2,],[\"m_0_5b\",[\"XHPTemplate\",\"m_0_6f\",],[{\n            __m: \"m_0_6f\"\n        },],2,],[\"m_0_5c\",[\"XHPTemplate\",\"m_0_6g\",],[{\n            __m: \"m_0_6g\"\n        },],2,],[\"m_0_5d\",[\"XHPTemplate\",\"m_0_6h\",],[{\n            __m: \"m_0_6h\"\n        },],2,],[\"m_0_5e\",[\"XHPTemplate\",\"m_0_6i\",],[{\n            __m: \"m_0_6i\"\n        },],2,],[\"m_0_5f\",[\"XHPTemplate\",\"m_0_6j\",],[{\n            __m: \"m_0_6j\"\n        },],2,],[\"m_0_5g\",[\"XHPTemplate\",\"m_0_6k\",],[{\n            __m: \"m_0_6k\"\n        },],2,],[\"m_0_5h\",[\"XHPTemplate\",\"m_0_6l\",],[{\n            __m: \"m_0_6l\"\n        },],2,],[\"m_0_5i\",[\"XHPTemplate\",\"m_0_6m\",],[{\n            __m: \"m_0_6m\"\n        },],2,],[\"m_0_5j\",[\"XHPTemplate\",\"m_0_6n\",],[{\n            __m: \"m_0_6n\"\n        },],2,],[\"m_0_5k\",[\"XHPTemplate\",\"m_0_6o\",],[{\n            __m: \"m_0_6o\"\n        },],2,],[\"m_0_5l\",[\"XHPTemplate\",\"m_0_6p\",],[{\n            __m: \"m_0_6p\"\n        },],2,],[\"m_0_5m\",[\"XHPTemplate\",\"m_0_6q\",],[{\n            __m: \"m_0_6q\"\n        },],2,],[\"m_0_5n\",[\"XHPTemplate\",\"m_0_6r\",],[{\n            __m: \"m_0_6r\"\n        },],2,],[\"m_0_6x\",[\"Typeahead\",\"m_0_6y\",\"ContextualTypeaheadView\",\"m_0_6v\",\"TypeaheadCore\",\"m_0_6w\",],[{\n            __m: \"m_0_6y\"\n        },{\n            node_id: \"\",\n            node: null,\n            ctor: {\n                __m: \"ContextualTypeaheadView\"\n            },\n            options: {\n                causalElement: {\n                    __m: \"m_0_6v\"\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_6w\"\n        },],3,],[\"m_0_5o\",[\"XHPTemplate\",\"m_0_6u\",],[{\n            __m: \"m_0_6u\"\n        },],2,],[\"m_0_5p\",[\"XHPTemplate\",\"m_0_6z\",],[{\n            __m: \"m_0_6z\"\n        },],2,],[\"m_0_5q\",[\"XHPTemplate\",\"m_0_70\",],[{\n            __m: \"m_0_70\"\n        },],2,],[\"m_0_5r\",[\"XHPTemplate\",\"m_0_71\",],[{\n            __m: \"m_0_71\"\n        },],2,],[\"m_0_5s\",[\"XHPTemplate\",\"m_0_72\",],[{\n            __m: \"m_0_72\"\n        },],2,],[\"m_0_5t\",[\"XHPTemplate\",\"m_0_73\",],[{\n            __m: \"m_0_73\"\n        },],2,],[\"m_0_5u\",[\"XHPTemplate\",\"m_0_74\",],[{\n            __m: \"m_0_74\"\n        },],2,],[\"m_0_5v\",[\"XHPTemplate\",\"m_0_75\",],[{\n            __m: \"m_0_75\"\n        },],2,],[\"m_0_5w\",[\"XHPTemplate\",\"m_0_76\",],[{\n            __m: \"m_0_76\"\n        },],2,],[\"m_0_5x\",[\"XHPTemplate\",\"m_0_79\",],[{\n            __m: \"m_0_79\"\n        },],2,],[\"m_0_5y\",[\"XHPTemplate\",\"m_0_7a\",],[{\n            __m: \"m_0_7a\"\n        },],2,],[\"m_0_5z\",[\"XHPTemplate\",\"m_0_7b\",],[{\n            __m: \"m_0_7b\"\n        },],2,],[\"m_0_60\",[\"XHPTemplate\",\"m_0_7c\",],[{\n            __m: \"m_0_7c\"\n        },],2,],[\"m_0_61\",[\"XHPTemplate\",\"m_0_7d\",],[{\n            __m: \"m_0_7d\"\n        },],2,],[\"m_0_6y\",[\"DataSource\",],[[],],2,],],\n        define: [[\"LinkshimHandlerConfig\",[],{\n            supports_meta_referrer: true,\n            render_verification_rate: 1000\n        },27,],[\"MercurySheetTemplates\",[\"m_0_4x\",],{\n            \":fb:mercury:tab-sheet:loading\": {\n                __m: \"m_0_4x\"\n            }\n        },40,],[\"MercuryAttachmentTemplates\",[\"m_0_4y\",\"m_0_4z\",\"m_0_50\",\"m_0_51\",\"m_0_52\",\"m_0_53\",\"m_0_54\",\"m_0_55\",\"m_0_56\",\"m_0_57\",],{\n            \":fb:mercury:attachment:error\": {\n                __m: \"m_0_4y\"\n            },\n            \":fb:mercury:attachment:video-thumb\": {\n                __m: \"m_0_4z\"\n            },\n            \":fb:mercury:attachment:file-name\": {\n                __m: \"m_0_50\"\n            },\n            \":fb:mercury:attachment:external-link\": {\n                __m: \"m_0_51\"\n            },\n            \":fb:mercury:attachment:music\": {\n                __m: \"m_0_52\"\n            },\n            \":fb:mercury:attachment:file-link\": {\n                __m: \"m_0_53\"\n            },\n            \":fb:mercury:attachment:preview\": {\n                __m: \"m_0_54\"\n            },\n            \":fb:mercury:attachment:share-link\": {\n                __m: \"m_0_55\"\n            },\n            \":fb:mercury:upload-file-row\": {\n                __m: \"m_0_56\"\n            },\n            \":fb:mercury:attachment:extended-file-link\": {\n                __m: \"m_0_57\"\n            }\n        },34,],[\"MercuryDataSourceWrapper\",[\"m_0_58\",],{\n            source: {\n                __m: \"m_0_58\"\n            }\n        },37,],[\"MercuryStickersInitialData\",[],{\n            packs: [{\n                id: 126361870881943,\n                name: \"Meep\",\n                icon: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yd/r/wn5XeO2Rkqj.png\",\n                selectedIcon: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yN/r/sZ4spcbuYtY.png\"\n            },{\n                id: 350357561732812,\n                name: \"Pusheen\",\n                icon: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yy/r/kLIslj7Vlau.png\",\n                selectedIcon: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yz/r/58FtCc-hDRb.png\"\n            },{\n                id: \"emoticons\",\n                name: \"Emoticons\",\n                icon: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/y_/r/4Dc6kC7GMzT.png\",\n                selectedIcon: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yV/r/d-mu_AVkpiU.png\"\n            },]\n        },144,],[\"ChatTabTemplates\",[\"m_0_59\",\"m_0_5a\",\"m_0_5b\",\"m_0_5c\",\"m_0_5d\",\"m_0_5e\",\"m_0_5f\",\"m_0_5g\",\"m_0_5h\",\"m_0_5i\",\"m_0_5j\",\"m_0_5k\",\"m_0_5l\",\"m_0_5m\",\"m_0_5n\",\"m_0_5o\",\"m_0_5p\",\"m_0_5q\",\"m_0_5r\",\"m_0_5s\",\"m_0_5t\",\"m_0_5u\",\"m_0_5v\",\"m_0_5w\",],{\n            \":fb:chat:conversation:message:event\": {\n                __m: \"m_0_59\"\n            },\n            \":fb:chat:conversation:message-group\": {\n                __m: \"m_0_5a\"\n            },\n            \":fb:chat:conversation:message:undertext\": {\n                __m: \"m_0_5b\"\n            },\n            \":fb:chat:tab:selector:item\": {\n                __m: \"m_0_5c\"\n            },\n            \":fb:mercury:chat:message:forward\": {\n                __m: \"m_0_5d\"\n            },\n            \":fb:chat:tab:selector\": {\n                __m: \"m_0_5e\"\n            },\n            \":fb:mercury:chat:multichat-tooltip-item\": {\n                __m: \"m_0_5f\"\n            },\n            \":fb:chat:conversation:date-break\": {\n                __m: \"m_0_5g\"\n            },\n            \":fb:mercury:call:tour\": {\n                __m: \"m_0_5h\"\n            },\n            \":fb:mercury:chat:tab-sheet:message-icon-sheet\": {\n                __m: \"m_0_5i\"\n            },\n            \":fb:mercury:chat:tab-sheet:clickable-message-icon-sheet\": {\n                __m: \"m_0_5j\"\n            },\n            \":fb:mercury:chat:tab-sheet:user-blocked\": {\n                __m: \"m_0_5k\"\n            },\n            \":fb:chat:conversation:message:subject\": {\n                __m: \"m_0_5l\"\n            },\n            \":fb:mercury:chat:tab-sheet:add-friends-empty-tab\": {\n                __m: \"m_0_5m\"\n            },\n            \":fb:mercury:chat:multichat-tab\": {\n                __m: \"m_0_5n\"\n            },\n            \":fb:mercury:chat:tab-sheet:name-conversation\": {\n                __m: \"m_0_5o\"\n            },\n            \":fb:chat:conversation:message\": {\n                __m: \"m_0_5p\"\n            },\n            \":fb:mercury:call:promo\": {\n                __m: \"m_0_5q\"\n            },\n            \":fb:mercury:chat:tab-sheet:add-friends\": {\n                __m: \"m_0_5r\"\n            },\n            \":fb:chat:conversation:message:status\": {\n                __m: \"m_0_5s\"\n            },\n            \":fb:mercury:chat:tab-sheet:message-mute-sheet\": {\n                __m: \"m_0_5t\"\n            },\n            \":fb:mercury:typing-indicator:typing\": {\n                __m: \"m_0_5u\"\n            },\n            \":fb:mercury:timestamp\": {\n                __m: \"m_0_5v\"\n            },\n            \":fb:mercury:chat:user-tab\": {\n                __m: \"m_0_5w\"\n            }\n        },15,],[\"VideoCallTemplates\",[\"m_0_5x\",],{\n            \":fb:videocall:incoming-dialog\": {\n                __m: \"m_0_5x\"\n            }\n        },74,],[\"MercuryTypeaheadTemplates\",[\"m_0_5y\",\"m_0_5z\",\"m_0_60\",\"m_0_61\",],{\n            \":fb:mercury:tokenizer\": {\n                __m: \"m_0_5y\"\n            },\n            \":fb:mercury:typeahead:header\": {\n                __m: \"m_0_5z\"\n            },\n            \":fb:mercury:typeahead\": {\n                __m: \"m_0_60\"\n            },\n            \":fb:mercury:typeahead:result\": {\n                __m: \"m_0_61\"\n            }\n        },43,],],\n        elements: [[\"m_0_4c\",\"u_0_2s\",2,],[\"m_0_4e\",\"u_0_2t\",2,],[\"m_0_4f\",\"u_0_2u\",2,],[\"m_0_4g\",\"fbDockChatBuddylistNub\",2,],[\"m_0_4l\",\"u_0_2w\",2,],[\"m_0_4m\",\"u_0_2x\",2,],[\"m_0_4k\",\"u_0_2y\",4,],[\"m_0_4o\",\"u_0_2z\",2,],[\"m_0_4s\",\"u_0_31\",2,],[\"m_0_4d\",\"u_0_32\",2,],[\"m_0_6t\",\"u_0_37\",2,\"m_0_6r\",],[\"m_0_6s\",\"u_0_38\",2,\"m_0_6r\",],[\"m_0_6w\",\"u_0_39\",2,\"m_0_6u\",],[\"m_0_6v\",\"u_0_3a\",4,\"m_0_6u\",],[\"m_0_78\",\"u_0_3e\",2,\"m_0_76\",],[\"m_0_77\",\"u_0_3f\",2,\"m_0_76\",],],\n        markup: [[\"m_0_4r\",{\n            __html: \"\\u003Cdiv class=\\\"uiContextualDialogPositioner\\\" id=\\\"u_0_30\\\" 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_4v\",{\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.fbstatic-a.akamaihd.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.fbstatic-a.akamaihd.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.fbstatic-a.akamaihd.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.fbstatic-a.akamaihd.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_4w\",{\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_62\",{\n            __html: \"\\u003Cimg class=\\\"hidden_elem _1sk7 img\\\" src=\\\"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yk/r/LOOn0JtHNzb.gif\\\" alt=\\\"\\\" width=\\\"16\\\" height=\\\"16\\\" /\\u003E\"\n        },2,],[\"m_0_63\",{\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_64\",{\n            __html: \"\\u003Cdiv class=\\\"_59go\\\"\\u003E\\u003Ca class=\\\"uiVideoThumb videoPreview\\\" href=\\\"#\\\" data-jsid=\\\"thumb\\\" role=\\\"button\\\"\\u003E\\u003Cimg class=\\\"img\\\" src=\\\"http://jsbngssl.fbstatic-a.akamaihd.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_65\",{\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_66\",{\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.fbstatic-a.akamaihd.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_67\",{\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.fbstatic-a.akamaihd.net/rsrc.php/v2/yw/r/drP8vlvSl_8.gif\\\" /\\u003E\\u003C/a\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_68\",{\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_69\",{\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.fbstatic-a.akamaihd.net/rsrc.php/v2/yw/r/drP8vlvSl_8.gif\\\" /\\u003E\\u003C/a\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_6a\",{\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_6b\",{\n            __html: \"\\u003Cdiv class=\\\"_2qh _2qe uploadFileRow\\\"\\u003E\\u003Cimg class=\\\"_2qf img\\\" src=\\\"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yb/r/GsNJNwuI-UM.gif\\\" alt=\\\"\\\" width=\\\"16\\\" height=\\\"11\\\" /\\u003E\\u003Clabel class=\\\"_2qg uiCloseButton uiCloseButtonSmall uiCloseButtonSmallDark\\\" for=\\\"u_0_33\\\"\\u003E\\u003Cinput title=\\\"Remove\\\" type=\\\"button\\\" data-jsid=\\\"closeFileUpload\\\" id=\\\"u_0_33\\\" /\\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_6c\",{\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_6d\",{\n            __html: \"\\u003Cdiv class=\\\"mhs mbs pts fbChatConvItem _511o clearfix\\\"\\u003E\\u003Cdiv class=\\\"_1_vw\\\"\\u003E\\u003Cimg class=\\\"_1_vv img\\\" src=\\\"http://jsbngssl.fbstatic-a.akamaihd.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_6e\",{\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_6f\",{\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_6g\",{\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_34\\\"\\u003E\\u003Cinput title=\\\"Remove\\\" type=\\\"button\\\" data-jsid=\\\"closeButton\\\" id=\\\"u_0_34\\\" /\\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_6h\",{\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_6i\",{\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_6j\",{\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_6k\",{\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_6l\",{\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_6m\",{\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_6n\",{\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_6o\",{\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_6p\",{\n            __html: \"\\u003Cdiv class=\\\"fbChatMessageSubject fsm fwb\\\" data-jsid=\\\"messageSubject\\\"\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_6q\",{\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_6r\",{\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_35\\\"\\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_37\\\"\\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.fbstatic-a.akamaihd.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_35\\\" 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.fbstatic-a.akamaihd.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_36\\\"\\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_36\\\" 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_38\\\"\\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_6u\",{\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_39\\\"\\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_39\\\" role=\\\"combobox\\\" spellcheck=\\\"false\\\" value=\\\"Name this group\\\" aria-label=\\\"Name this group\\\" id=\\\"u_0_3a\\\" /\\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_6z\",{\n            __html: \"\\u003Cdiv class=\\\"_kso fsm\\\" data-jsid=\\\"message\\\"\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_70\",{\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_71\",{\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_3b\\\"\\u003E\\u003Cinput value=\\\"Done\\\" data-jsid=\\\"doneButton\\\" type=\\\"submit\\\" id=\\\"u_0_3b\\\" /\\u003E\\u003C/label\\u003E\\u003C/td\\u003E\\u003C/tr\\u003E\\u003C/tbody\\u003E\\u003C/table\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_72\",{\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_73\",{\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_74\",{\n            __html: \"\\u003Cdiv class=\\\"_510u\\\"\\u003E\\u003Cdiv class=\\\"_510v\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_75\",{\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_76\",{\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_3c\\\"\\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_3e\\\"\\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.fbstatic-a.akamaihd.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_3c\\\" 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.fbstatic-a.akamaihd.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_3d\\\"\\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_3d\\\" 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_3f\\\"\\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_79\",{\n            __html: \"\\u003Cdiv class=\\\"clearfix\\\"\\u003E\\u003Cimg class=\\\"mrm _s0 _29h _29i _rw img\\\" src=\\\"http://jsbngssl.fbstatic-a.akamaihd.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_7a\",{\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_7b\",{\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.fbstatic-a.akamaihd.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_7c\",{\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_7d\",{\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.fbexternal-a.akamaihd.net/safe_image.php?d=AQD8Nn8D0yyraIdI&amp;url=https%3A%2F%2Ffbstatic-a.akamaihd.net%2Frsrc.php%2Fv2%2Fyw%2Fr%2FdrP8vlvSl_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.fbstatic-a.akamaihd.net/rsrc.php/v2/yd/r/5D2UmwASouw.css\"\n        },\n        Mzbs2: {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/y7/r/sM5jkmon6X9.js\"\n        },\n        \"3h2ll\": {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yz/r/8nGweTPJCKZ.js\"\n        },\n        \"6WF8S\": {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/ya/r/cHaSy_1vFQu.js\"\n        },\n        \"4qhP/\": {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yv/r/tMfRnsOx-tg.js\"\n        },\n        \"LTaK/\": {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/y_/r/3Z79JZzbt1o.js\"\n        },\n        KPLqg: {\n            type: \"css\",\n            permanent: 1,\n            crossOrigin: 1,\n            src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yq/r/UJCnyWz8q3r.css\"\n        },\n        \"wGXi/\": {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/ym/r/usnMgvD8abB.js\"\n        },\n        gMfWI: {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yY/r/YnJRD6K1VJA.js\"\n        },\n        \"c1+nc\": {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/y1/r/3A9a-abDc5V.js\"\n        },\n        \"LsRx/\": {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yu/r/kS-r05X6OEA.js\"\n        },\n        a3inZ: {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yO/r/9ELMM-KdnsD.js\"\n        },\n        d6Evh: {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/y2/r/jalUIRLBuTe.js\"\n        },\n        MfG6c: {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yS/r/eKDf9pXbovQ.js\"\n        },\n        \"21lHn\": {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.fbstatic-a.akamaihd.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.fbstatic-a.akamaihd.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.fbstatic-a.akamaihd.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.fbstatic-a.akamaihd.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.fbstatic-a.akamaihd.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.fbstatic-a.akamaihd.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.fbstatic-a.akamaihd.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: 4\n});");
// 1795
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o7,"s69364f19bb6fa9c0f653371d16ea69f4ba8a1b6e");
// 1796
geval("bigPipe.onPageletArrive({\n    JSBNG__content: {\n        pagelet_dock: {\n            container_id: \"u_0_3g\"\n        }\n    },\n    jsmods: {\n        require: [[\"MusicButtonManager\",\"init\",[],[[\"music.song\",],],],[\"initLiveMessageReceiver\",],[\"Dock\",\"init\",[\"m_0_4c\",],[{\n            __m: \"m_0_4c\"\n        },],],[\"React\",\"constructAndRenderComponent\",[\"NotificationBeeper.react\",\"m_0_4d\",],[{\n            __m: \"NotificationBeeper.react\"\n        },{\n            unseenVsUnread: false,\n            canPause: false,\n            shouldLogImpressions: false,\n            soundPath: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/yy/r/odIeERVR1c5.mp3\",\n            soundEnabled: true,\n            tracking: \"{\\\"ref\\\":\\\"beeper\\\",\\\"jewel\\\":\\\"notifications\\\",\\\"type\\\":\\\"click2canvas\\\"}\"\n        },{\n            __m: \"m_0_4d\"\n        },],],[\"ChatApp\",\"init\",[\"m_0_4e\",\"m_0_4f\",],[{\n            __m: \"m_0_4e\"\n        },{\n            __m: \"m_0_4f\"\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_4h\",],[\"m_0_4j\",],[\"Typeahead\",\"init\",[\"m_0_4k\",\"m_0_4j\",],[{\n            __m: \"m_0_4k\"\n        },{\n            __m: \"m_0_4j\"\n        },[\"chatTypeahead\",\"buildBestAvailableNames\",\"showLoadingIndicator\",],null,],],[\"ClearableTypeahead\",\"resetOnCloseButtonClick\",[\"m_0_4j\",\"m_0_4m\",],[{\n            __m: \"m_0_4j\"\n        },{\n            __m: \"m_0_4m\"\n        },],],[\"m_0_4p\",],[\"m_0_4q\",],[\"Layer\",\"init\",[\"m_0_4q\",\"m_0_4r\",],[{\n            __m: \"m_0_4q\"\n        },{\n            __m: \"m_0_4r\"\n        },],],[\"m_0_4i\",],[\"m_0_6x\",],[\"Typeahead\",\"init\",[\"m_0_6v\",\"m_0_6x\",],[{\n            __m: \"m_0_6v\"\n        },{\n            __m: \"m_0_6x\"\n        },[],null,],],],\n        instances: [[\"m_0_4h\",[\"BuddyListNub\",\"m_0_4g\",\"m_0_4i\",\"m_0_4j\",],[{\n            __m: \"m_0_4g\"\n        },{\n            __m: \"m_0_4i\"\n        },{\n            __m: \"m_0_4j\"\n        },],1,],[\"m_0_4j\",[\"Typeahead\",\"m_0_4n\",\"ChatTypeaheadView\",\"ChatTypeaheadRenderer\",\"m_0_4k\",\"ChatTypeaheadCore\",\"m_0_4l\",],[{\n            __m: \"m_0_4n\"\n        },{\n            node_id: \"u_0_2v\",\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_4k\"\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_4l\"\n        },],7,],[\"m_0_4p\",[\"ChatSidebarDropdown\",\"m_0_4o\",],[{\n            __m: \"m_0_4o\"\n        },null,],1,],[\"m_0_4q\",[\"LegacyContextualDialog\",\"AccessibleLayer\",],[{\n            buildWrapper: false,\n            causalElement: null,\n            addedBehaviors: [{\n                __m: \"AccessibleLayer\"\n            },]\n        },],5,],[\"m_0_4i\",[\"ChatOrderedList\",\"m_0_4s\",\"m_0_4t\",\"m_0_4u\",\"m_0_4q\",],[false,{\n            __m: \"m_0_4s\"\n        },{\n            __m: \"m_0_4t\"\n        },{\n            __m: \"m_0_4u\"\n        },{\n            __m: \"m_0_4q\"\n        },null,],3,],[\"m_0_4n\",[\"ChatTypeaheadDataSource\",],[{\n            alwaysPrefixMatch: true,\n            showOfflineUsers: true\n        },],2,],[\"m_0_4t\",[\"XHPTemplate\",\"m_0_4v\",],[{\n            __m: \"m_0_4v\"\n        },],2,],[\"m_0_4u\",[\"XHPTemplate\",\"m_0_4w\",],[{\n            __m: \"m_0_4w\"\n        },],2,],[\"m_0_4x\",[\"XHPTemplate\",\"m_0_62\",],[{\n            __m: \"m_0_62\"\n        },],2,],[\"m_0_4y\",[\"XHPTemplate\",\"m_0_63\",],[{\n            __m: \"m_0_63\"\n        },],2,],[\"m_0_4z\",[\"XHPTemplate\",\"m_0_64\",],[{\n            __m: \"m_0_64\"\n        },],2,],[\"m_0_50\",[\"XHPTemplate\",\"m_0_65\",],[{\n            __m: \"m_0_65\"\n        },],2,],[\"m_0_51\",[\"XHPTemplate\",\"m_0_66\",],[{\n            __m: \"m_0_66\"\n        },],2,],[\"m_0_52\",[\"XHPTemplate\",\"m_0_67\",],[{\n            __m: \"m_0_67\"\n        },],2,],[\"m_0_53\",[\"XHPTemplate\",\"m_0_68\",],[{\n            __m: \"m_0_68\"\n        },],2,],[\"m_0_54\",[\"XHPTemplate\",\"m_0_69\",],[{\n            __m: \"m_0_69\"\n        },],2,],[\"m_0_55\",[\"XHPTemplate\",\"m_0_6a\",],[{\n            __m: \"m_0_6a\"\n        },],2,],[\"m_0_56\",[\"XHPTemplate\",\"m_0_6b\",],[{\n            __m: \"m_0_6b\"\n        },],2,],[\"m_0_57\",[\"XHPTemplate\",\"m_0_6c\",],[{\n            __m: \"m_0_6c\"\n        },],2,],[\"m_0_58\",[\"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_59\",[\"XHPTemplate\",\"m_0_6d\",],[{\n            __m: \"m_0_6d\"\n        },],2,],[\"m_0_5a\",[\"XHPTemplate\",\"m_0_6e\",],[{\n            __m: \"m_0_6e\"\n        },],2,],[\"m_0_5b\",[\"XHPTemplate\",\"m_0_6f\",],[{\n            __m: \"m_0_6f\"\n        },],2,],[\"m_0_5c\",[\"XHPTemplate\",\"m_0_6g\",],[{\n            __m: \"m_0_6g\"\n        },],2,],[\"m_0_5d\",[\"XHPTemplate\",\"m_0_6h\",],[{\n            __m: \"m_0_6h\"\n        },],2,],[\"m_0_5e\",[\"XHPTemplate\",\"m_0_6i\",],[{\n            __m: \"m_0_6i\"\n        },],2,],[\"m_0_5f\",[\"XHPTemplate\",\"m_0_6j\",],[{\n            __m: \"m_0_6j\"\n        },],2,],[\"m_0_5g\",[\"XHPTemplate\",\"m_0_6k\",],[{\n            __m: \"m_0_6k\"\n        },],2,],[\"m_0_5h\",[\"XHPTemplate\",\"m_0_6l\",],[{\n            __m: \"m_0_6l\"\n        },],2,],[\"m_0_5i\",[\"XHPTemplate\",\"m_0_6m\",],[{\n            __m: \"m_0_6m\"\n        },],2,],[\"m_0_5j\",[\"XHPTemplate\",\"m_0_6n\",],[{\n            __m: \"m_0_6n\"\n        },],2,],[\"m_0_5k\",[\"XHPTemplate\",\"m_0_6o\",],[{\n            __m: \"m_0_6o\"\n        },],2,],[\"m_0_5l\",[\"XHPTemplate\",\"m_0_6p\",],[{\n            __m: \"m_0_6p\"\n        },],2,],[\"m_0_5m\",[\"XHPTemplate\",\"m_0_6q\",],[{\n            __m: \"m_0_6q\"\n        },],2,],[\"m_0_5n\",[\"XHPTemplate\",\"m_0_6r\",],[{\n            __m: \"m_0_6r\"\n        },],2,],[\"m_0_6x\",[\"Typeahead\",\"m_0_6y\",\"ContextualTypeaheadView\",\"m_0_6v\",\"TypeaheadCore\",\"m_0_6w\",],[{\n            __m: \"m_0_6y\"\n        },{\n            node_id: \"\",\n            node: null,\n            ctor: {\n                __m: \"ContextualTypeaheadView\"\n            },\n            options: {\n                causalElement: {\n                    __m: \"m_0_6v\"\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_6w\"\n        },],3,],[\"m_0_5o\",[\"XHPTemplate\",\"m_0_6u\",],[{\n            __m: \"m_0_6u\"\n        },],2,],[\"m_0_5p\",[\"XHPTemplate\",\"m_0_6z\",],[{\n            __m: \"m_0_6z\"\n        },],2,],[\"m_0_5q\",[\"XHPTemplate\",\"m_0_70\",],[{\n            __m: \"m_0_70\"\n        },],2,],[\"m_0_5r\",[\"XHPTemplate\",\"m_0_71\",],[{\n            __m: \"m_0_71\"\n        },],2,],[\"m_0_5s\",[\"XHPTemplate\",\"m_0_72\",],[{\n            __m: \"m_0_72\"\n        },],2,],[\"m_0_5t\",[\"XHPTemplate\",\"m_0_73\",],[{\n            __m: \"m_0_73\"\n        },],2,],[\"m_0_5u\",[\"XHPTemplate\",\"m_0_74\",],[{\n            __m: \"m_0_74\"\n        },],2,],[\"m_0_5v\",[\"XHPTemplate\",\"m_0_75\",],[{\n            __m: \"m_0_75\"\n        },],2,],[\"m_0_5w\",[\"XHPTemplate\",\"m_0_76\",],[{\n            __m: \"m_0_76\"\n        },],2,],[\"m_0_5x\",[\"XHPTemplate\",\"m_0_79\",],[{\n            __m: \"m_0_79\"\n        },],2,],[\"m_0_5y\",[\"XHPTemplate\",\"m_0_7a\",],[{\n            __m: \"m_0_7a\"\n        },],2,],[\"m_0_5z\",[\"XHPTemplate\",\"m_0_7b\",],[{\n            __m: \"m_0_7b\"\n        },],2,],[\"m_0_60\",[\"XHPTemplate\",\"m_0_7c\",],[{\n            __m: \"m_0_7c\"\n        },],2,],[\"m_0_61\",[\"XHPTemplate\",\"m_0_7d\",],[{\n            __m: \"m_0_7d\"\n        },],2,],[\"m_0_6y\",[\"DataSource\",],[[],],2,],],\n        define: [[\"LinkshimHandlerConfig\",[],{\n            supports_meta_referrer: true,\n            render_verification_rate: 1000\n        },27,],[\"MercurySheetTemplates\",[\"m_0_4x\",],{\n            \":fb:mercury:tab-sheet:loading\": {\n                __m: \"m_0_4x\"\n            }\n        },40,],[\"MercuryAttachmentTemplates\",[\"m_0_4y\",\"m_0_4z\",\"m_0_50\",\"m_0_51\",\"m_0_52\",\"m_0_53\",\"m_0_54\",\"m_0_55\",\"m_0_56\",\"m_0_57\",],{\n            \":fb:mercury:attachment:error\": {\n                __m: \"m_0_4y\"\n            },\n            \":fb:mercury:attachment:video-thumb\": {\n                __m: \"m_0_4z\"\n            },\n            \":fb:mercury:attachment:file-name\": {\n                __m: \"m_0_50\"\n            },\n            \":fb:mercury:attachment:external-link\": {\n                __m: \"m_0_51\"\n            },\n            \":fb:mercury:attachment:music\": {\n                __m: \"m_0_52\"\n            },\n            \":fb:mercury:attachment:file-link\": {\n                __m: \"m_0_53\"\n            },\n            \":fb:mercury:attachment:preview\": {\n                __m: \"m_0_54\"\n            },\n            \":fb:mercury:attachment:share-link\": {\n                __m: \"m_0_55\"\n            },\n            \":fb:mercury:upload-file-row\": {\n                __m: \"m_0_56\"\n            },\n            \":fb:mercury:attachment:extended-file-link\": {\n                __m: \"m_0_57\"\n            }\n        },34,],[\"MercuryDataSourceWrapper\",[\"m_0_58\",],{\n            source: {\n                __m: \"m_0_58\"\n            }\n        },37,],[\"MercuryStickersInitialData\",[],{\n            packs: [{\n                id: 126361870881943,\n                JSBNG__name: \"Meep\",\n                icon: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yd/r/wn5XeO2Rkqj.png\",\n                selectedIcon: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yN/r/sZ4spcbuYtY.png\"\n            },{\n                id: 350357561732812,\n                JSBNG__name: \"Pusheen\",\n                icon: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yy/r/kLIslj7Vlau.png\",\n                selectedIcon: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yz/r/58FtCc-hDRb.png\"\n            },{\n                id: \"emoticons\",\n                JSBNG__name: \"Emoticons\",\n                icon: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/y_/r/4Dc6kC7GMzT.png\",\n                selectedIcon: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yV/r/d-mu_AVkpiU.png\"\n            },]\n        },144,],[\"ChatTabTemplates\",[\"m_0_59\",\"m_0_5a\",\"m_0_5b\",\"m_0_5c\",\"m_0_5d\",\"m_0_5e\",\"m_0_5f\",\"m_0_5g\",\"m_0_5h\",\"m_0_5i\",\"m_0_5j\",\"m_0_5k\",\"m_0_5l\",\"m_0_5m\",\"m_0_5n\",\"m_0_5o\",\"m_0_5p\",\"m_0_5q\",\"m_0_5r\",\"m_0_5s\",\"m_0_5t\",\"m_0_5u\",\"m_0_5v\",\"m_0_5w\",],{\n            \":fb:chat:conversation:message:event\": {\n                __m: \"m_0_59\"\n            },\n            \":fb:chat:conversation:message-group\": {\n                __m: \"m_0_5a\"\n            },\n            \":fb:chat:conversation:message:undertext\": {\n                __m: \"m_0_5b\"\n            },\n            \":fb:chat:tab:selector:item\": {\n                __m: \"m_0_5c\"\n            },\n            \":fb:mercury:chat:message:forward\": {\n                __m: \"m_0_5d\"\n            },\n            \":fb:chat:tab:selector\": {\n                __m: \"m_0_5e\"\n            },\n            \":fb:mercury:chat:multichat-tooltip-item\": {\n                __m: \"m_0_5f\"\n            },\n            \":fb:chat:conversation:date-break\": {\n                __m: \"m_0_5g\"\n            },\n            \":fb:mercury:call:tour\": {\n                __m: \"m_0_5h\"\n            },\n            \":fb:mercury:chat:tab-sheet:message-icon-sheet\": {\n                __m: \"m_0_5i\"\n            },\n            \":fb:mercury:chat:tab-sheet:clickable-message-icon-sheet\": {\n                __m: \"m_0_5j\"\n            },\n            \":fb:mercury:chat:tab-sheet:user-blocked\": {\n                __m: \"m_0_5k\"\n            },\n            \":fb:chat:conversation:message:subject\": {\n                __m: \"m_0_5l\"\n            },\n            \":fb:mercury:chat:tab-sheet:add-friends-empty-tab\": {\n                __m: \"m_0_5m\"\n            },\n            \":fb:mercury:chat:multichat-tab\": {\n                __m: \"m_0_5n\"\n            },\n            \":fb:mercury:chat:tab-sheet:name-conversation\": {\n                __m: \"m_0_5o\"\n            },\n            \":fb:chat:conversation:message\": {\n                __m: \"m_0_5p\"\n            },\n            \":fb:mercury:call:promo\": {\n                __m: \"m_0_5q\"\n            },\n            \":fb:mercury:chat:tab-sheet:add-friends\": {\n                __m: \"m_0_5r\"\n            },\n            \":fb:chat:conversation:message:status\": {\n                __m: \"m_0_5s\"\n            },\n            \":fb:mercury:chat:tab-sheet:message-mute-sheet\": {\n                __m: \"m_0_5t\"\n            },\n            \":fb:mercury:typing-indicator:typing\": {\n                __m: \"m_0_5u\"\n            },\n            \":fb:mercury:timestamp\": {\n                __m: \"m_0_5v\"\n            },\n            \":fb:mercury:chat:user-tab\": {\n                __m: \"m_0_5w\"\n            }\n        },15,],[\"VideoCallTemplates\",[\"m_0_5x\",],{\n            \":fb:videocall:incoming-dialog\": {\n                __m: \"m_0_5x\"\n            }\n        },74,],[\"MercuryTypeaheadTemplates\",[\"m_0_5y\",\"m_0_5z\",\"m_0_60\",\"m_0_61\",],{\n            \":fb:mercury:tokenizer\": {\n                __m: \"m_0_5y\"\n            },\n            \":fb:mercury:typeahead:header\": {\n                __m: \"m_0_5z\"\n            },\n            \":fb:mercury:typeahead\": {\n                __m: \"m_0_60\"\n            },\n            \":fb:mercury:typeahead:result\": {\n                __m: \"m_0_61\"\n            }\n        },43,],],\n        elements: [[\"m_0_4c\",\"u_0_2s\",2,],[\"m_0_4e\",\"u_0_2t\",2,],[\"m_0_4f\",\"u_0_2u\",2,],[\"m_0_4g\",\"fbDockChatBuddylistNub\",2,],[\"m_0_4l\",\"u_0_2w\",2,],[\"m_0_4m\",\"u_0_2x\",2,],[\"m_0_4k\",\"u_0_2y\",4,],[\"m_0_4o\",\"u_0_2z\",2,],[\"m_0_4s\",\"u_0_31\",2,],[\"m_0_4d\",\"u_0_32\",2,],[\"m_0_6t\",\"u_0_37\",2,\"m_0_6r\",],[\"m_0_6s\",\"u_0_38\",2,\"m_0_6r\",],[\"m_0_6w\",\"u_0_39\",2,\"m_0_6u\",],[\"m_0_6v\",\"u_0_3a\",4,\"m_0_6u\",],[\"m_0_78\",\"u_0_3e\",2,\"m_0_76\",],[\"m_0_77\",\"u_0_3f\",2,\"m_0_76\",],],\n        markup: [[\"m_0_4r\",{\n            __html: \"\\u003Cdiv class=\\\"uiContextualDialogPositioner\\\" id=\\\"u_0_30\\\" 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_4v\",{\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.fbstatic-a.akamaihd.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.fbstatic-a.akamaihd.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.fbstatic-a.akamaihd.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.fbstatic-a.akamaihd.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_4w\",{\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_62\",{\n            __html: \"\\u003Cimg class=\\\"hidden_elem _1sk7 img\\\" src=\\\"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yk/r/LOOn0JtHNzb.gif\\\" alt=\\\"\\\" width=\\\"16\\\" height=\\\"16\\\" /\\u003E\"\n        },2,],[\"m_0_63\",{\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_64\",{\n            __html: \"\\u003Cdiv class=\\\"_59go\\\"\\u003E\\u003Ca class=\\\"uiVideoThumb videoPreview\\\" href=\\\"#\\\" data-jsid=\\\"thumb\\\" role=\\\"button\\\"\\u003E\\u003Cimg class=\\\"img\\\" src=\\\"http://jsbngssl.fbstatic-a.akamaihd.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_65\",{\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_66\",{\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.fbstatic-a.akamaihd.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_67\",{\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.fbstatic-a.akamaihd.net/rsrc.php/v2/yw/r/drP8vlvSl_8.gif\\\" /\\u003E\\u003C/a\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_68\",{\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_69\",{\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.fbstatic-a.akamaihd.net/rsrc.php/v2/yw/r/drP8vlvSl_8.gif\\\" /\\u003E\\u003C/a\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_6a\",{\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_6b\",{\n            __html: \"\\u003Cdiv class=\\\"_2qh _2qe uploadFileRow\\\"\\u003E\\u003Cimg class=\\\"_2qf img\\\" src=\\\"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yb/r/GsNJNwuI-UM.gif\\\" alt=\\\"\\\" width=\\\"16\\\" height=\\\"11\\\" /\\u003E\\u003Clabel class=\\\"_2qg uiCloseButton uiCloseButtonSmall uiCloseButtonSmallDark\\\" for=\\\"u_0_33\\\"\\u003E\\u003Cinput title=\\\"Remove\\\" type=\\\"button\\\" data-jsid=\\\"closeFileUpload\\\" id=\\\"u_0_33\\\" /\\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_6c\",{\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_6d\",{\n            __html: \"\\u003Cdiv class=\\\"mhs mbs pts fbChatConvItem _511o clearfix\\\"\\u003E\\u003Cdiv class=\\\"_1_vw\\\"\\u003E\\u003Cimg class=\\\"_1_vv img\\\" src=\\\"http://jsbngssl.fbstatic-a.akamaihd.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_6e\",{\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_6f\",{\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_6g\",{\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_34\\\"\\u003E\\u003Cinput title=\\\"Remove\\\" type=\\\"button\\\" data-jsid=\\\"closeButton\\\" id=\\\"u_0_34\\\" /\\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_6h\",{\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_6i\",{\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_6j\",{\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_6k\",{\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_6l\",{\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_6m\",{\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_6n\",{\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_6o\",{\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_6p\",{\n            __html: \"\\u003Cdiv class=\\\"fbChatMessageSubject fsm fwb\\\" data-jsid=\\\"messageSubject\\\"\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_6q\",{\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_6r\",{\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_35\\\"\\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_37\\\"\\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.fbstatic-a.akamaihd.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_35\\\" 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.fbstatic-a.akamaihd.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_36\\\"\\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_36\\\" 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_38\\\"\\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_6u\",{\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_39\\\"\\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_39\\\" role=\\\"combobox\\\" spellcheck=\\\"false\\\" value=\\\"Name this group\\\" aria-label=\\\"Name this group\\\" id=\\\"u_0_3a\\\" /\\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_6z\",{\n            __html: \"\\u003Cdiv class=\\\"_kso fsm\\\" data-jsid=\\\"message\\\"\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_70\",{\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_71\",{\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_3b\\\"\\u003E\\u003Cinput value=\\\"Done\\\" data-jsid=\\\"doneButton\\\" type=\\\"submit\\\" id=\\\"u_0_3b\\\" /\\u003E\\u003C/label\\u003E\\u003C/td\\u003E\\u003C/tr\\u003E\\u003C/tbody\\u003E\\u003C/table\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_72\",{\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_73\",{\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_74\",{\n            __html: \"\\u003Cdiv class=\\\"_510u\\\"\\u003E\\u003Cdiv class=\\\"_510v\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_75\",{\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_76\",{\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_3c\\\"\\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_3e\\\"\\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.fbstatic-a.akamaihd.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_3c\\\" 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.fbstatic-a.akamaihd.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_3d\\\"\\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_3d\\\" 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_3f\\\"\\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_79\",{\n            __html: \"\\u003Cdiv class=\\\"clearfix\\\"\\u003E\\u003Cimg class=\\\"mrm _s0 _29h _29i _rw img\\\" src=\\\"http://jsbngssl.fbstatic-a.akamaihd.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_7a\",{\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_7b\",{\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.fbstatic-a.akamaihd.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_7c\",{\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_7d\",{\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.fbexternal-a.akamaihd.net/safe_image.php?d=AQD8Nn8D0yyraIdI&amp;url=https%3A%2F%2Ffbstatic-a.akamaihd.net%2Frsrc.php%2Fv2%2Fyw%2Fr%2FdrP8vlvSl_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.fbstatic-a.akamaihd.net/rsrc.php/v2/yd/r/5D2UmwASouw.css\"\n        },\n        Mzbs2: {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/y7/r/sM5jkmon6X9.js\"\n        },\n        \"3h2ll\": {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yz/r/8nGweTPJCKZ.js\"\n        },\n        \"6WF8S\": {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/ya/r/cHaSy_1vFQu.js\"\n        },\n        \"4qhP/\": {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yv/r/tMfRnsOx-tg.js\"\n        },\n        \"LTaK/\": {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/y_/r/3Z79JZzbt1o.js\"\n        },\n        KPLqg: {\n            type: \"css\",\n            permanent: 1,\n            crossOrigin: 1,\n            src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yq/r/UJCnyWz8q3r.css\"\n        },\n        \"wGXi/\": {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/ym/r/usnMgvD8abB.js\"\n        },\n        gMfWI: {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yY/r/YnJRD6K1VJA.js\"\n        },\n        \"c1+nc\": {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/y1/r/3A9a-abDc5V.js\"\n        },\n        \"LsRx/\": {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yu/r/kS-r05X6OEA.js\"\n        },\n        a3inZ: {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yO/r/9ELMM-KdnsD.js\"\n        },\n        d6Evh: {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/y2/r/jalUIRLBuTe.js\"\n        },\n        MfG6c: {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yS/r/eKDf9pXbovQ.js\"\n        },\n        \"21lHn\": {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.fbstatic-a.akamaihd.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.fbstatic-a.akamaihd.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.fbstatic-a.akamaihd.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.fbstatic-a.akamaihd.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.fbstatic-a.akamaihd.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.fbstatic-a.akamaihd.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.fbstatic-a.akamaihd.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: 4\n});");
// 1803
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o7,"bigPipe.onPageletArrive({\n    content: {\n        fbRequestsList: {\n            container_id: \"u_0_3h\"\n        }\n    },\n    css: [\"W3Ky6\",],\n    bootloadable: {\n    },\n    resource_map: {\n    },\n    id: \"fbRequestsList\",\n    phase: 4\n});");
// 1804
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o7,"s86b45e82f6e166651b2fac8cb86b6e027787add5");
// 1805
geval("bigPipe.onPageletArrive({\n    JSBNG__content: {\n        fbRequestsList: {\n            container_id: \"u_0_3h\"\n        }\n    },\n    css: [\"W3Ky6\",],\n    bootloadable: {\n    },\n    resource_map: {\n    },\n    id: \"fbRequestsList\",\n    phase: 4\n});");
// 1812
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o7,"bigPipe.onPageletArrive({\n    content: {\n        timeline_sticky_header: {\n            container_id: \"u_0_3r\"\n        }\n    },\n    jsmods: {\n        require: [[\"TimelineStickyHeader\",\"init\",[\"m_0_7e\",],[{\n            __m: \"m_0_7e\"\n        },],],[\"SubscribeButton\",\"init\",[\"m_0_7h\",\"m_0_7g\",\"m_0_7i\",],[{\n            __m: \"m_0_7h\"\n        },{\n            __m: \"m_0_7g\"\n        },{\n            __m: \"m_0_7i\"\n        },\"1055580469\",0,false,],],[\"m_0_7h\",],[\"m_0_7i\",],[\"m_0_7n\",],[\"m_0_7m\",],[\"AddFriendButton\",\"init\",[\"m_0_7q\",],[{\n            __m: \"m_0_7q\"\n        },1055580469,null,\"profile_button\",\"none\",\"/ajax/add_friend/action.php\",\"\",true,null,false,null,0,],],[\"FriendStatus\",\"setSpecialLists\",[],[{\n            close: 1374283956118870,\n            acq: \"100006118350059_124542800973931\"\n        },],],[\"TimelineStickyHeaderNav\",\"init\",[\"m_0_7r\",],[{\n            __m: \"m_0_7r\"\n        },{\n            custom_subsection_menu: false\n        },],],],\n        instances: [[\"m_0_7h\",[\"SwapButtonDEPRECATED\",\"m_0_7g\",\"m_0_7j\",],[{\n            __m: \"m_0_7g\"\n        },{\n            __m: \"m_0_7j\"\n        },false,],3,],[\"m_0_7i\",[\"HoverButton\",\"m_0_7k\",\"m_0_7m\",\"m_0_7l\",],[{\n            __m: \"m_0_7k\"\n        },{\n            __m: \"m_0_7m\"\n        },{\n            __m: \"m_0_7l\"\n        },\"/ajax/lists/interests_menu.php?profile_id=1055580469&list_location=follow_1&follow_location=1\",],3,],[\"m_0_7n\",[\"ContextualDialog\",\"ContextualDialogArrow\",\"ContextualDialogDefaultTheme\",\"LayerRemoveOnHide\",\"LayerHideOnTransition\",\"LayerFadeOnShow\",\"LayerHideOnEscape\",\"ContextualLayerAutoFlip\",\"DialogHideOnSuccess\",\"m_0_7o\",],[{\n            width: null,\n            context: null,\n            contextID: null,\n            contextSelector: null,\n            position: \"below\",\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                __m: \"LayerHideOnEscape\"\n            },{\n                __m: \"ContextualLayerAutoFlip\"\n            },{\n                __m: \"DialogHideOnSuccess\"\n            },]\n        },{\n            __m: \"m_0_7o\"\n        },],3,],[\"m_0_7m\",[\"HoverFlyout\",\"m_0_7n\",\"m_0_7p\",],[{\n            __m: \"m_0_7n\"\n        },{\n            __m: \"m_0_7p\"\n        },150,150,],3,],],\n        elements: [[\"m_0_7f\",\"u_0_3i\",2,],[\"m_0_7g\",\"u_0_3j\",4,],[\"m_0_7j\",\"u_0_3k\",2,],[\"m_0_7l\",\"u_0_3l\",2,\"m_0_7o\",],[\"m_0_7k\",\"u_0_3k\",2,],[\"m_0_7p\",\"u_0_3k\",2,],[\"m_0_7q\",\"u_0_3n\",2,],[\"m_0_7r\",\"u_0_3p\",4,],[\"m_0_7e\",\"u_0_3q\",2,],],\n        markup: [[\"m_0_7o\",{\n            __html: \"\\u003Cdiv\\u003E\\u003Cdiv\\u003E\\u003Cdiv\\u003E\\u003Cdiv id=\\\"u_0_3l\\\"\\u003E\\u003Cimg class=\\\"mal pal _52ng center img\\\" src=\\\"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yk/r/LOOn0JtHNzb.gif\\\" alt=\\\"\\\" width=\\\"16\\\" height=\\\"16\\\" /\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },3,],]\n    },\n    css: [\"ZtiRu\",\"W3Ky6\",\"0duP3\",],\n    bootloadable: {\n        StickyController: {\n            resources: [\"AyUu6\",\"W3Ky6\",\"jsIYP\",],\n            \"module\": true\n        }\n    },\n    resource_map: {\n    },\n    js: [\"AyUu6\",\"AsDOA\",\"jsIYP\",\"bUzfU\",\"3SGVa\",],\n    id: \"timeline_sticky_header\",\n    phase: 4\n});");
// 1813
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o7,"s52651095b57e04ea43897033158020b58b7dde09");
// 1814
geval("bigPipe.onPageletArrive({\n    JSBNG__content: {\n        timeline_sticky_header: {\n            container_id: \"u_0_3r\"\n        }\n    },\n    jsmods: {\n        require: [[\"TimelineStickyHeader\",\"init\",[\"m_0_7e\",],[{\n            __m: \"m_0_7e\"\n        },],],[\"SubscribeButton\",\"init\",[\"m_0_7h\",\"m_0_7g\",\"m_0_7i\",],[{\n            __m: \"m_0_7h\"\n        },{\n            __m: \"m_0_7g\"\n        },{\n            __m: \"m_0_7i\"\n        },\"1055580469\",0,false,],],[\"m_0_7h\",],[\"m_0_7i\",],[\"m_0_7n\",],[\"m_0_7m\",],[\"AddFriendButton\",\"init\",[\"m_0_7q\",],[{\n            __m: \"m_0_7q\"\n        },1055580469,null,\"profile_button\",\"none\",\"/ajax/add_friend/action.php\",\"\",true,null,false,null,0,],],[\"FriendStatus\",\"setSpecialLists\",[],[{\n            close: 1374283956118870,\n            acq: \"100006118350059_124542800973931\"\n        },],],[\"TimelineStickyHeaderNav\",\"init\",[\"m_0_7r\",],[{\n            __m: \"m_0_7r\"\n        },{\n            custom_subsection_menu: false\n        },],],],\n        instances: [[\"m_0_7h\",[\"SwapButtonDEPRECATED\",\"m_0_7g\",\"m_0_7j\",],[{\n            __m: \"m_0_7g\"\n        },{\n            __m: \"m_0_7j\"\n        },false,],3,],[\"m_0_7i\",[\"HoverButton\",\"m_0_7k\",\"m_0_7m\",\"m_0_7l\",],[{\n            __m: \"m_0_7k\"\n        },{\n            __m: \"m_0_7m\"\n        },{\n            __m: \"m_0_7l\"\n        },\"/ajax/lists/interests_menu.php?profile_id=1055580469&list_location=follow_1&follow_location=1\",],3,],[\"m_0_7n\",[\"ContextualDialog\",\"ContextualDialogArrow\",\"ContextualDialogDefaultTheme\",\"LayerRemoveOnHide\",\"LayerHideOnTransition\",\"LayerFadeOnShow\",\"LayerHideOnEscape\",\"ContextualLayerAutoFlip\",\"DialogHideOnSuccess\",\"m_0_7o\",],[{\n            width: null,\n            context: null,\n            contextID: null,\n            contextSelector: null,\n            position: \"below\",\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                __m: \"LayerHideOnEscape\"\n            },{\n                __m: \"ContextualLayerAutoFlip\"\n            },{\n                __m: \"DialogHideOnSuccess\"\n            },]\n        },{\n            __m: \"m_0_7o\"\n        },],3,],[\"m_0_7m\",[\"HoverFlyout\",\"m_0_7n\",\"m_0_7p\",],[{\n            __m: \"m_0_7n\"\n        },{\n            __m: \"m_0_7p\"\n        },150,150,],3,],],\n        elements: [[\"m_0_7f\",\"u_0_3i\",2,],[\"m_0_7g\",\"u_0_3j\",4,],[\"m_0_7j\",\"u_0_3k\",2,],[\"m_0_7l\",\"u_0_3l\",2,\"m_0_7o\",],[\"m_0_7k\",\"u_0_3k\",2,],[\"m_0_7p\",\"u_0_3k\",2,],[\"m_0_7q\",\"u_0_3n\",2,],[\"m_0_7r\",\"u_0_3p\",4,],[\"m_0_7e\",\"u_0_3q\",2,],],\n        markup: [[\"m_0_7o\",{\n            __html: \"\\u003Cdiv\\u003E\\u003Cdiv\\u003E\\u003Cdiv\\u003E\\u003Cdiv id=\\\"u_0_3l\\\"\\u003E\\u003Cimg class=\\\"mal pal _52ng center img\\\" src=\\\"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yk/r/LOOn0JtHNzb.gif\\\" alt=\\\"\\\" width=\\\"16\\\" height=\\\"16\\\" /\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },3,],]\n    },\n    css: [\"ZtiRu\",\"W3Ky6\",\"0duP3\",],\n    bootloadable: {\n        StickyController: {\n            resources: [\"AyUu6\",\"W3Ky6\",\"jsIYP\",],\n            \"module\": true\n        }\n    },\n    resource_map: {\n    },\n    js: [\"AyUu6\",\"AsDOA\",\"jsIYP\",\"bUzfU\",\"3SGVa\",],\n    id: \"timeline_sticky_header\",\n    phase: 4\n});");
// 1821
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o7,"bigPipe.onPageletArrive({\n    append: \"timeline_tab_content_extra\",\n    content: {\n        timeline_section_placeholders: {\n            container_id: \"u_0_3z\"\n        }\n    },\n    jsmods: {\n        require: [[\"TimelineContentLoader\",\"loadSectionOnClick\",[\"m_0_7s\",],[{\n            __m: \"m_0_7s\"\n        },\"year_2013\",],],[\"TimelineContentLoader\",\"registerTimePeriod\",[\"m_0_7t\",],[{\n            __m: \"m_0_7t\"\n        },\"year_2013\",{\n            profile_id: 1055580469,\n            start: 1357027200,\n            end: 1388563199,\n            query_type: 8,\n            filter_after_timestamp: 1359228986,\n            section_pagelet_id: \"pagelet_timeline_year_current\",\n            load_immediately: false\n        },false,null,1,\"1.75\",],],[\"TimelineContentLoader\",\"setExpandLoadDataForSection\",[],[\"year_2013\",{\n            profile_id: 1055580469,\n            start: 1357027200,\n            end: 1388563199,\n            query_type: 9\n        },],],[\"TimelineContentLoader\",\"loadSectionOnClick\",[\"m_0_7u\",],[{\n            __m: \"m_0_7u\"\n        },\"year_2012\",],],[\"TimelineContentLoader\",\"registerTimePeriod\",[\"m_0_7v\",],[{\n            __m: \"m_0_7v\"\n        },\"year_2012\",{\n            profile_id: 1055580469,\n            start: 1325404800,\n            end: 1357027199,\n            query_type: 8,\n            section_pagelet_id: \"pagelet_timeline_year_last\",\n            load_immediately: false\n        },false,null,2,\"24.648440122605\",],],[\"TimelineContentLoader\",\"setExpandLoadDataForSection\",[],[\"year_2012\",{\n            profile_id: 1055580469,\n            start: 1325404800,\n            end: 1357027199,\n            query_type: 9\n        },],],[\"TimelineContentLoader\",\"loadSectionOnClick\",[\"m_0_7w\",],[{\n            __m: \"m_0_7w\"\n        },\"year_2011\",],],[\"TimelineContentLoader\",\"registerTimePeriod\",[\"m_0_7x\",],[{\n            __m: \"m_0_7x\"\n        },\"year_2011\",{\n            profile_id: 1055580469,\n            start: 1293868800,\n            end: 1325404799,\n            query_type: 8,\n            section_pagelet_id: \"pagelet_timeline_year_2011\",\n            load_immediately: false\n        },false,null,3,\"6.5829925537109\",],],[\"TimelineContentLoader\",\"setExpandLoadDataForSection\",[],[\"year_2011\",{\n            profile_id: 1055580469,\n            start: 1293868800,\n            end: 1325404799,\n            query_type: 9\n        },],],[\"TimelineContentLoader\",\"loadSectionOnClick\",[\"m_0_7y\",],[{\n            __m: \"m_0_7y\"\n        },\"year_2008\",],],[\"TimelineContentLoader\",\"registerTimePeriod\",[\"m_0_7z\",],[{\n            __m: \"m_0_7z\"\n        },\"year_2008\",{\n            profile_id: 1055580469,\n            start: 1199174400,\n            end: 1230796799,\n            query_type: 8,\n            section_pagelet_id: \"pagelet_timeline_year_2008\",\n            load_immediately: false\n        },false,null,6,\"13.875\",],],[\"TimelineContentLoader\",\"setExpandLoadDataForSection\",[],[\"year_2008\",{\n            profile_id: 1055580469,\n            start: 1199174400,\n            end: 1230796799,\n            query_type: 9\n        },],],[\"TimelineContentLoader\",\"loadSectionOnClick\",[\"m_0_80\",],[{\n            __m: \"m_0_80\"\n        },\"way_back\",],],[\"TimelineContentLoader\",\"registerTimePeriod\",[\"m_0_81\",],[{\n            __m: \"m_0_81\"\n        },\"way_back\",{\n            profile_id: 1055580469,\n            start: 1167638400,\n            end: 1199174399,\n            query_type: 11,\n            section_pagelet_id: \"pagelet_timeline_wayback\",\n            load_immediately: false\n        },false,null,7,-1,],],[\"TimelineContentLoader\",\"loadSectionOnClick\",[\"m_0_82\",],[{\n            __m: \"m_0_82\"\n        },\"year_2009\",],],[\"TimelineContentLoader\",\"registerTimePeriod\",[\"m_0_83\",],[{\n            __m: \"m_0_83\"\n        },\"year_2009\",{\n            profile_id: 1055580469,\n            start: 1230796800,\n            end: 1262332799,\n            query_type: 8,\n            section_pagelet_id: \"pagelet_timeline_year_2009\",\n            load_immediately: false\n        },false,null,5,\"14.0224609375\",],],[\"TimelineContentLoader\",\"setExpandLoadDataForSection\",[],[\"year_2009\",{\n            profile_id: 1055580469,\n            start: 1230796800,\n            end: 1262332799,\n            query_type: 9\n        },],],[\"TimelineContentLoader\",\"loadSectionOnClick\",[\"m_0_84\",],[{\n            __m: \"m_0_84\"\n        },\"year_2010\",],],[\"TimelineContentLoader\",\"registerTimePeriod\",[\"m_0_85\",],[{\n            __m: \"m_0_85\"\n        },\"year_2010\",{\n            profile_id: 1055580469,\n            start: 1262332800,\n            end: 1293868799,\n            query_type: 8,\n            section_pagelet_id: \"pagelet_timeline_year_2010\",\n            load_immediately: false\n        },false,null,4,\"9.1259155273438\",],],[\"TimelineContentLoader\",\"setExpandLoadDataForSection\",[],[\"year_2010\",{\n            profile_id: 1055580469,\n            start: 1262332800,\n            end: 1293868799,\n            query_type: 9\n        },],],],\n        elements: [[\"m_0_7s\",\"u_0_3s\",2,],[\"m_0_7u\",\"u_0_3t\",2,],[\"m_0_7w\",\"u_0_3u\",2,],[\"m_0_7y\",\"u_0_3v\",2,],[\"m_0_80\",\"u_0_3w\",2,],[\"m_0_82\",\"u_0_3x\",2,],[\"m_0_84\",\"u_0_3y\",2,],[\"m_0_7t\",\"pagelet_timeline_year_current\",2,],[\"m_0_7v\",\"pagelet_timeline_year_last\",2,],[\"m_0_7x\",\"pagelet_timeline_year_2011\",2,],[\"m_0_85\",\"pagelet_timeline_year_2010\",2,],[\"m_0_83\",\"pagelet_timeline_year_2009\",2,],[\"m_0_7z\",\"pagelet_timeline_year_2008\",2,],[\"m_0_81\",\"pagelet_timeline_wayback\",2,],]\n    },\n    css: [\"ZtiRu\",\"W3Ky6\",],\n    bootloadable: {\n    },\n    resource_map: {\n    },\n    js: [\"AyUu6\",\"AsDOA\",\"jsIYP\",],\n    id: \"timeline_section_placeholders\",\n    phase: 4\n});");
// 1822
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o7,"s7a057c195088590cb4874a4a0af4b53a836e06dd");
// 1823
geval("bigPipe.onPageletArrive({\n    append: \"timeline_tab_content_extra\",\n    JSBNG__content: {\n        timeline_section_placeholders: {\n            container_id: \"u_0_3z\"\n        }\n    },\n    jsmods: {\n        require: [[\"TimelineContentLoader\",\"loadSectionOnClick\",[\"m_0_7s\",],[{\n            __m: \"m_0_7s\"\n        },\"year_2013\",],],[\"TimelineContentLoader\",\"registerTimePeriod\",[\"m_0_7t\",],[{\n            __m: \"m_0_7t\"\n        },\"year_2013\",{\n            profile_id: 1055580469,\n            start: 1357027200,\n            end: 1388563199,\n            query_type: 8,\n            filter_after_timestamp: 1359228986,\n            section_pagelet_id: \"pagelet_timeline_year_current\",\n            load_immediately: false\n        },false,null,1,\"1.75\",],],[\"TimelineContentLoader\",\"setExpandLoadDataForSection\",[],[\"year_2013\",{\n            profile_id: 1055580469,\n            start: 1357027200,\n            end: 1388563199,\n            query_type: 9\n        },],],[\"TimelineContentLoader\",\"loadSectionOnClick\",[\"m_0_7u\",],[{\n            __m: \"m_0_7u\"\n        },\"year_2012\",],],[\"TimelineContentLoader\",\"registerTimePeriod\",[\"m_0_7v\",],[{\n            __m: \"m_0_7v\"\n        },\"year_2012\",{\n            profile_id: 1055580469,\n            start: 1325404800,\n            end: 1357027199,\n            query_type: 8,\n            section_pagelet_id: \"pagelet_timeline_year_last\",\n            load_immediately: false\n        },false,null,2,\"24.648440122605\",],],[\"TimelineContentLoader\",\"setExpandLoadDataForSection\",[],[\"year_2012\",{\n            profile_id: 1055580469,\n            start: 1325404800,\n            end: 1357027199,\n            query_type: 9\n        },],],[\"TimelineContentLoader\",\"loadSectionOnClick\",[\"m_0_7w\",],[{\n            __m: \"m_0_7w\"\n        },\"year_2011\",],],[\"TimelineContentLoader\",\"registerTimePeriod\",[\"m_0_7x\",],[{\n            __m: \"m_0_7x\"\n        },\"year_2011\",{\n            profile_id: 1055580469,\n            start: 1293868800,\n            end: 1325404799,\n            query_type: 8,\n            section_pagelet_id: \"pagelet_timeline_year_2011\",\n            load_immediately: false\n        },false,null,3,\"6.5829925537109\",],],[\"TimelineContentLoader\",\"setExpandLoadDataForSection\",[],[\"year_2011\",{\n            profile_id: 1055580469,\n            start: 1293868800,\n            end: 1325404799,\n            query_type: 9\n        },],],[\"TimelineContentLoader\",\"loadSectionOnClick\",[\"m_0_7y\",],[{\n            __m: \"m_0_7y\"\n        },\"year_2008\",],],[\"TimelineContentLoader\",\"registerTimePeriod\",[\"m_0_7z\",],[{\n            __m: \"m_0_7z\"\n        },\"year_2008\",{\n            profile_id: 1055580469,\n            start: 1199174400,\n            end: 1230796799,\n            query_type: 8,\n            section_pagelet_id: \"pagelet_timeline_year_2008\",\n            load_immediately: false\n        },false,null,6,\"13.875\",],],[\"TimelineContentLoader\",\"setExpandLoadDataForSection\",[],[\"year_2008\",{\n            profile_id: 1055580469,\n            start: 1199174400,\n            end: 1230796799,\n            query_type: 9\n        },],],[\"TimelineContentLoader\",\"loadSectionOnClick\",[\"m_0_80\",],[{\n            __m: \"m_0_80\"\n        },\"way_back\",],],[\"TimelineContentLoader\",\"registerTimePeriod\",[\"m_0_81\",],[{\n            __m: \"m_0_81\"\n        },\"way_back\",{\n            profile_id: 1055580469,\n            start: 1167638400,\n            end: 1199174399,\n            query_type: 11,\n            section_pagelet_id: \"pagelet_timeline_wayback\",\n            load_immediately: false\n        },false,null,7,-1,],],[\"TimelineContentLoader\",\"loadSectionOnClick\",[\"m_0_82\",],[{\n            __m: \"m_0_82\"\n        },\"year_2009\",],],[\"TimelineContentLoader\",\"registerTimePeriod\",[\"m_0_83\",],[{\n            __m: \"m_0_83\"\n        },\"year_2009\",{\n            profile_id: 1055580469,\n            start: 1230796800,\n            end: 1262332799,\n            query_type: 8,\n            section_pagelet_id: \"pagelet_timeline_year_2009\",\n            load_immediately: false\n        },false,null,5,\"14.0224609375\",],],[\"TimelineContentLoader\",\"setExpandLoadDataForSection\",[],[\"year_2009\",{\n            profile_id: 1055580469,\n            start: 1230796800,\n            end: 1262332799,\n            query_type: 9\n        },],],[\"TimelineContentLoader\",\"loadSectionOnClick\",[\"m_0_84\",],[{\n            __m: \"m_0_84\"\n        },\"year_2010\",],],[\"TimelineContentLoader\",\"registerTimePeriod\",[\"m_0_85\",],[{\n            __m: \"m_0_85\"\n        },\"year_2010\",{\n            profile_id: 1055580469,\n            start: 1262332800,\n            end: 1293868799,\n            query_type: 8,\n            section_pagelet_id: \"pagelet_timeline_year_2010\",\n            load_immediately: false\n        },false,null,4,\"9.1259155273438\",],],[\"TimelineContentLoader\",\"setExpandLoadDataForSection\",[],[\"year_2010\",{\n            profile_id: 1055580469,\n            start: 1262332800,\n            end: 1293868799,\n            query_type: 9\n        },],],],\n        elements: [[\"m_0_7s\",\"u_0_3s\",2,],[\"m_0_7u\",\"u_0_3t\",2,],[\"m_0_7w\",\"u_0_3u\",2,],[\"m_0_7y\",\"u_0_3v\",2,],[\"m_0_80\",\"u_0_3w\",2,],[\"m_0_82\",\"u_0_3x\",2,],[\"m_0_84\",\"u_0_3y\",2,],[\"m_0_7t\",\"pagelet_timeline_year_current\",2,],[\"m_0_7v\",\"pagelet_timeline_year_last\",2,],[\"m_0_7x\",\"pagelet_timeline_year_2011\",2,],[\"m_0_85\",\"pagelet_timeline_year_2010\",2,],[\"m_0_83\",\"pagelet_timeline_year_2009\",2,],[\"m_0_7z\",\"pagelet_timeline_year_2008\",2,],[\"m_0_81\",\"pagelet_timeline_wayback\",2,],]\n    },\n    css: [\"ZtiRu\",\"W3Ky6\",],\n    bootloadable: {\n    },\n    resource_map: {\n    },\n    js: [\"AyUu6\",\"AsDOA\",\"jsIYP\",],\n    id: \"timeline_section_placeholders\",\n    phase: 4\n});");
// 1830
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o7,"bigPipe.onPageletArrive({\n    content: {\n        pagelet_timeline_recent_more_pager: {\n            container_id: \"u_0_41\"\n        }\n    },\n    jsmods: {\n        require: [[\"TimelineContentLoader\",\"updatePagerAfterLoad\",[\"m_0_86\",],[{\n            __m: \"m_0_86\"\n        },\"u_0_18\",\"recent\",\"0\",true,],],],\n        elements: [[\"m_0_86\",\"pagelet_timeline_recent_pager_1\",2,],]\n    },\n    css: [\"ZtiRu\",\"0duP3\",\"W3Ky6\",],\n    bootloadable: {\n    },\n    resource_map: {\n    },\n    js: [\"AyUu6\",\"AsDOA\",\"jsIYP\",],\n    jscc_map: \"({\\\"jo1YixfNw93Ap09ygDm0\\\":function(){return new ScrollingPager(\\\"u_0_40\\\", \\\"ProfileTimelineSectionPagelet\\\", {\\\"profile_id\\\":1055580469,\\\"start\\\":0,\\\"end\\\":1375340399,\\\"query_type\\\":39,\\\"page_index\\\":1,\\\"section_container_id\\\":\\\"u_0_18\\\",\\\"section_pagelet_id\\\":\\\"pagelet_timeline_recent\\\",\\\"unit_container_id\\\":\\\"u_0_17\\\",\\\"current_scrubber_key\\\":\\\"recent\\\",\\\"time_cutoff\\\":null,\\\"buffer\\\":50,\\\"require_click\\\":false,\\\"showing_esc\\\":false,\\\"adjust_buffer\\\":true,\\\"tipld\\\":{\\\"sc\\\":4,\\\"rc\\\":13},\\\"num_visible_units\\\":7,\\\"remove_dupes\\\":true}, {\\\"usePipe\\\":true,\\\"jsNonblock\\\":true,\\\"buffer\\\":50,\\\"constHeight\\\":true,\\\"target_id\\\":\\\"u_0_17\\\"});}})\",\n    onload: [\"JSCC.get(\\\"jo1YixfNw93Ap09ygDm0\\\").register();\",],\n    id: \"pagelet_timeline_recent_more_pager\",\n    phase: 4\n});");
// 1831
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o7,"sc6b0399da9f730ec700d42e38f00a80a82b32c68");
// 1832
geval("bigPipe.onPageletArrive({\n    JSBNG__content: {\n        pagelet_timeline_recent_more_pager: {\n            container_id: \"u_0_41\"\n        }\n    },\n    jsmods: {\n        require: [[\"TimelineContentLoader\",\"updatePagerAfterLoad\",[\"m_0_86\",],[{\n            __m: \"m_0_86\"\n        },\"u_0_18\",\"recent\",\"0\",true,],],],\n        elements: [[\"m_0_86\",\"pagelet_timeline_recent_pager_1\",2,],]\n    },\n    css: [\"ZtiRu\",\"0duP3\",\"W3Ky6\",],\n    bootloadable: {\n    },\n    resource_map: {\n    },\n    js: [\"AyUu6\",\"AsDOA\",\"jsIYP\",],\n    jscc_map: \"({\\\"jo1YixfNw93Ap09ygDm0\\\":function(){return new ScrollingPager(\\\"u_0_40\\\", \\\"ProfileTimelineSectionPagelet\\\", {\\\"profile_id\\\":1055580469,\\\"start\\\":0,\\\"end\\\":1375340399,\\\"query_type\\\":39,\\\"page_index\\\":1,\\\"section_container_id\\\":\\\"u_0_18\\\",\\\"section_pagelet_id\\\":\\\"pagelet_timeline_recent\\\",\\\"unit_container_id\\\":\\\"u_0_17\\\",\\\"current_scrubber_key\\\":\\\"recent\\\",\\\"time_cutoff\\\":null,\\\"buffer\\\":50,\\\"require_click\\\":false,\\\"showing_esc\\\":false,\\\"adjust_buffer\\\":true,\\\"tipld\\\":{\\\"sc\\\":4,\\\"rc\\\":13},\\\"num_visible_units\\\":7,\\\"remove_dupes\\\":true}, {\\\"usePipe\\\":true,\\\"jsNonblock\\\":true,\\\"buffer\\\":50,\\\"constHeight\\\":true,\\\"target_id\\\":\\\"u_0_17\\\"});}})\",\n    JSBNG__onload: [\"JSCC.get(\\\"jo1YixfNw93Ap09ygDm0\\\").register();\",],\n    id: \"pagelet_timeline_recent_more_pager\",\n    phase: 4\n});");
// 1839
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o7,"bigPipe.onPageletArrive({\n    append: \"rightColContent\",\n    content: {\n        pagelet_timeline_scrubber: {\n            container_id: \"u_0_43\"\n        }\n    },\n    css: [\"ZtiRu\",\"W3Ky6\",],\n    bootloadable: {\n    },\n    resource_map: {\n    },\n    js: [\"AyUu6\",\"jsIYP\",\"AsDOA\",],\n    jscc_map: \"({\\\"jp1kb9bkjloUQHYlRF80\\\":function(){return new TimelineMainScrubber($(\\\"u_0_42\\\"));}})\",\n    onload: [\"JSCC.get(\\\"jp1kb9bkjloUQHYlRF80\\\")\",],\n    id: \"pagelet_timeline_scrubber\",\n    phase: 4\n});");
// 1840
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o7,"s0bca8d2d4acc19abfba8e616cbd94eb1c1449f00");
// 1841
geval("bigPipe.onPageletArrive({\n    append: \"rightColContent\",\n    JSBNG__content: {\n        pagelet_timeline_scrubber: {\n            container_id: \"u_0_43\"\n        }\n    },\n    css: [\"ZtiRu\",\"W3Ky6\",],\n    bootloadable: {\n    },\n    resource_map: {\n    },\n    js: [\"AyUu6\",\"jsIYP\",\"AsDOA\",],\n    jscc_map: \"({\\\"jp1kb9bkjloUQHYlRF80\\\":function(){return new TimelineMainScrubber($(\\\"u_0_42\\\"));}})\",\n    JSBNG__onload: [\"JSCC.get(\\\"jp1kb9bkjloUQHYlRF80\\\")\",],\n    id: \"pagelet_timeline_scrubber\",\n    phase: 4\n});");
// 1848
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o7,"bigPipe.onPageletArrive({\n    display_dependency: [\"pagelet_side_ads\",],\n    content: {\n        u_0_2q: {\n            container_id: \"u_0_45\"\n        }\n    },\n    jsmods: {\n        require: [[\"Arbiter\",\"inform\",[],[\"netego_loaded\",null,],],[\"NetEgo\",\"setup\",[],[6010069360965,],],[\"NetEgo\",\"setup\",[],[6008291652839,],],[\"NetEgo\",\"setup\",[],[6008916062318,],],[\"NetEgo\",\"setup\",[],[6010037469977,],],[\"NetEgo\",\"setup\",[],[6008948705864,],],[\"AdblockDetectorLogging\",\"assertUnblocked\",[\"m_0_87\",],[{\n            __m: \"m_0_87\"\n        },],],[\"TimelineController\",\"setAdsTracking\",[],[{\n            6010069360965: \"AQLbmP60eMgrcRKD1n0iNPI3rEJypxhSsWe9OK3TEwO7BVgxc6QQKwnakQAQI3orulou1PD-qpHI5wCUVGLAxnrt8wOvshETaxEJ1sLGFUpUY1P5L1XkKD08rgHoNbdP49921HWPkUq9zl956uZN0B6ppiBvk5K4N0-xN28WbsOolp86XrFx-3JM0Q5kdlOF2c6bP2P4QATsezJ66B7x9AYUlu0EP_oXTm9QKiz-qU_vJoeU08w2dMq_ilvBF1Ql_pD3Z72LQyN34jkjhcvzOBWQziwhUUIoGDvS9hkP6N2GKh_lBfPiZUS3naKm1Z_kPRXsBZgnSNgHZYTcbautyag2uCfwzap9jj5GWduyyDvrsT087ffLwU2-bK2IQrDVfX4s3ZYqGn8Bw07iUHGDYBrO2pUVfRHpO0PgjDMqx81p34YcSl5gCgycaYvl2ucTQoG3qOa1432N23t2GDetziVF0zUa4MiswULJGHP3JWcWqyYMFFlglD-o5c9XLwn2M1bzcqhcKPa2qOulwAGsqI1AFF4GqhsMUyAmzaEWXz1iAZxpWMVc_63eDLlYwCvQYllTa3aEBAeaTnD2vpLEH9IyyEFZeE6-pQgX9I4t8bpzbnUj6r2-oRxJCrxemyfCHoIkJ-G-j616dXmW25uZ1I5ELdLweNWoq-Xjl-R-RKfWM7gCvLv_j9r7m6yv6bPmCrniu8XwY8JpXUr9kkLiM6AGlZG2DURm6uzpODQDeEkmt87HHo60DpuwSVYJ3iA5N10J9_qgNKkbhQZy3CtUh-z0AkqZCl0a4fOa8F-Qpvomdu5w4BA5_4w9WfiZBQ3JOEVpqaBHhtx_xnnG7JhBVoIfz-bE7rJdU3cXsfltsGs1tfvA7W7_jiSYWj9DZD5A8vdp9asPOrd_WrALKaxK28hi\",\n            6008291652839: \"AQK2JCkebZg-304wmP1Dt4OZiq1R0zBVNi60e4kmzoblTj9ZIpl8yHSoikJBlVaqR5DUIlWq3YjZw2vAs9A2vpHmYqbO2XnwLZu-vEBRBAnppzlz6PSHYKUEyGZOPv3w3NBB73eMlXKmDcnugfeBCSxsJ03WAYT8PyIRpwRBohfNi8Cn8-Q7wfZvNPD1rR0ZV8l6a47oaZcmerncQU-a8_VqakT2N5yb3IoXxgp4BVjT87Y6SrwczaqvKQIdzPvstWhI7f3itV-WMeIeaM8pSQs4C1fyzb4b4XoY_bIuGsqyXWtkNbP4IeXy7nvCYDMODhBN2GE18saReegNSYGg5ZibQml0HW2nfKqrRC0bqWOJ2AWPaOazWIB3UzCnY8JVkNfnN4ZN1L8Z4agU-r0EOwAa0Ci0DSZwK3NqrZREmX4vQWqZ2SPMiML9P7yyG8eoDlzq25HArSmGIQNt2MORzCKFNXjDYK0moRdDkygGOjZbaBB_oqV0wYIaA_rJZZsk8IEFgal8_Zv0mMIMHWMt2U-v8Hc3oUUYYI9SBn0IxU19faiRgmPr829b7jVhi2eacvPVA0xHOjiAreaE_HplczjKgEyg-MK93lnFMy0t7jBWhz0J5LDrECqRBmO2bt8_wqHim8arn3TjylHbLy9_g9ur1f0w7S04eYT0lL7FViy6r--uMeCXhnnrauA0T9YNIg0F2h-QEoEjOrKqNU_JTcz_u5ul2CI8Hf_9WACDntxJanwUMpVZ2yLzqfSNOGWZYRdPt3U2eEX5GwD7w29JMg84XiaTe1_nTdFQBbPiCe9Hr9Oo-U3kFCealIZQUrV_7sAslu96-zJepOUIeyOpf6JWQ5LdbyO7OspnnYWFOTG2HQl7MFad5kgKUmhHkSyM8VnfHHXXg9RL2NHjG_WsrpDK\",\n            6008916062318: \"AQL7RzfFwNInah9q3QXCnlQ0J-X_CbBOJTqcjJV0weNEBz_C5uAcLMf8k2mubs16TPAkUKvx9LikmysjVfEVkPkpGd-m5vB3bRwszmGd0HL9sSMouRAB8-NL89N9cogM7BXls1z5ezGvAe1aifJF4c0k46nLC9XHCTufa6E7yYYDzpYu8tDjD9vGJIEOWO3gxGkEO4kQNEtWLInGy-z7jiKkPtwugTSsIX2qpMdRmWcIgocVhycuOxzITg2AMM8Np3Obntkh3juE52ZPskNp6YOPPUVg5Tkm3lD3pP7xRbLW3WUr8T7cpcuThrb9MtODZWLaBA0IWKkZWoVkCOCIkRDZvATFXPPXHq8uJi73Btmw-bTkzmRkeqLyHUMlXtdgPz3ne0FBjAotaWMhh7gcoG2JnzGyPFRZUuVhk7rLDT794x-BlCzsefRwXyC95dRm3tUsOx_3B3aldhugawxX8SyQPr6Wb0SG3h7XHJqV2MAXqo24Ql7NLQiXYx3Z7uTsctIv1peKYuOrcNWEhAdmnPaaVPloK-662wZViJvQfunzptNVZVLGBcj7bfpsaBaGkwuWqF7kOfv_HbkedRp5pehBDbKpaGRG_Hf66zaYIPk-b8gYDNE35C0NoKEMH8Rct3hkeLiAAmIdn12qR0dcfxR5ReJwnrkFNAICp2TxgcJqdispTVeVVj_NowgOVe5NFk8BjpdMgXkhGhL8tmQSJV3w4Zbf-4QpsxS1oYpqcjSZwIKrXo-ttTSOQSIJvfVMVd66CW8AWB2i8q9eOSpoT-4Ddh_rNSg8k5ln6j3euEb6QeQJ5N9HLZEp5BvuJ4zuQw2Jc5yNuheLkqP6x3nYqbR1fHoRZICS2fuiHWhiTizcMA282WPCd-nn_CTCc41xowx5XAs7q5V0T-okQWbu5wbmu3k_D_bOy2UQlYsrPQvbjCVront6wwthuWYVF-jNJ-Q\",\n            6010037469977: \"AQJEqQpJ9IbDt_NxB0QkgLDbRr1fFa_K3WFVk2ML-TdapfyzQJjJ10K7kXwXJV-9C8HofFltnZyoD_flyZQC1yGtiexVBtCuYMaN77hambAITBv-PAzbgnI6BExtMYBIU7FFoJhdv4BHVJKGXlwLEGIYk-JvY31Zo9TRo07GWudeK3pguvbMoaKrJdHEjGwnvF8jhwubHrdEQ6NA7iNRinLMik7V4AYkzCYA_vhlCueTAWZINsqK_2nZTIXLD0JMrtkSCyLLJFdcj1JPVmQ8NikRLQHHif-Tq0YShvffXvUXrwQ4CrX8JjKAO_lJ3p80U41ShHJdm5ICTEub-k5N3th7LbeGugaA4zQGJzWzHl-ABASedUPiWEAvceCG_ybZ8pP-IyySn7Pq-w1noR--jsCDwwdgtmm-MNPt0wms2uTjh4B9LKo6VtIk-MaebfXb66Oe12xKhUXaTgyNHn9GRbHnC9kjYrf1l9LDlu8JgQ8RnU2DfkKUt1Gpgsy7qXvxuGgPuyKP3_qaIYy6oivRGFt7XFEvewljZ91Z4TwJu43tAfuuqPpPYaG_pEs7bU2QvW9XQLQYkYldvO6Bnxrrbwy91C8Wp-BzAqMv6VvDHsQub64MVZegvxZPSYhVZKTN2qQQDrIAtOm_kSKAGaa95iuxu5Ol5jbkaDG6az4Re2_jaXXssFr62ano4rxftlGe0rBxKCYZIMW8FNkrZlwzWv0KESWHjxA6pWL4d9OqibWiGbPQO0QieSG_CcLgvbheU2VuauxzHj5PcGMQodm_fNNvVKGrBBotuEoi0LUHNvxcYjlfmedeXg2Uyul5gzr5v29JJ0QHm8ajxlMTvM__deiAvdQOjcykjZ59ydEsLZJhs6YXITuvLLtuGCtTSGSE9leRTDInwnqtO29YJsJPAUM2uC-baKXzvunPRzMKi4jGXg\",\n            6008948705864: \"AQLP71CE_gU9zcF13ctX_43YAY5s1-_Fhlibdf1VX1WTKpFonhYx2lnQuox3kDCVMluFrmlMAl6R5bXUpjeX5HWu9bXSMje7A5Z7uXvFWdjD0lFQ3ad-kPDkIeQ8VF1afF_Cv95W9TfJdlpJThwj3kY-aitTqB0NigF2-t3GAG02zllCQ-Ythp5LZCxzG7nI9tJ8J18jOMT8OkIDIHL9SbijxuleqrqewjszbhR-GhuoaR6w9eRrlF7BWNsQJ7C_9-zP7XoNiVM9u7XUlzFdfAfq0UDPupJgKPo6OeBDgYoIbdN50BunNAKI3G3Ykht16vJfXhPLrvQeHfGsyWwAnF0HoYJJLagvWZwJMpc34huL9iwq-R2ZZ4CA02-DTuIGVCE2BJxUI7xyH4uYjwKHSmJnXo9TLdhkSxjGRcIqegyzyf2V-kQ39ljSSupNMzk0lrVj_Wz2N_kqwf_wOkdgWEiIPoE5Z-NWm5bSz1MrAwcuuxNgeXWAvXKo27E2uxtFshus0lt9QFzytzkNffoQtkg5Y4fFSLzfefwTtBQq2lklj_qZ3kDehX69OIwvNBvubLAnlxjoJLtIlR55T0WjY45FmeV8S96ptgnzuDNWVAyDthioPjdhPonQf1Wi-UwZypxVkJ1JB1anpRMe9dzHsCUumoCSPvEvOWHPlG_7IigdQ6GEOsivnPu1yJ2KW78K3EOMDgX6d0JFgv9k6BXiMiRnXABAN4a6UB3M4HSv3KVEqJ8mg1xDEjxmOlNsaG2tfIFYowH2Qzc-x1oaZg_rO82sChY_qyHjfJISXjTzhql6fk2ypT7nWfNjdaLnYCUIAbzCEaZj_1RjMTHQ7SvKdK2olvdvQ6Fa8W5wawufBzjwc4o8PF9dwvsdrLyte_zrnl_ksXsNDkS1bfZ03G3l4GAvv-GWiQRvuvMlgF7etHmkJen85cSTrOL7lcAdCQKBGSg\"\n        },],],],\n        elements: [[\"m_0_87\",\"u_0_44\",2,],]\n    },\n    css: [\"0duP3\",\"W3Ky6\",],\n    bootloadable: {\n    },\n    resource_map: {\n    },\n    js: [\"AyUu6\",\"AsDOA\",\"jsIYP\",],\n    onload: [\"new EmuController(\\\"6010069360965-id_51ddd04f4b2ff8432881967\\\", \\\"AQImwNUhGWEdpxtbkvIo1XeZdXEJCbnUliRgBk-VjzyF9x_sRKX5KkfadkdzeU0OYGCk-6TBWIQSN5KzhOYoKjVlo4kTAXaIrVwpryZutdNpoebhwCxm335cl9OPRfK09xRh4Y0LhYHkwbguwrbCU9Q-xXnQWfSF77ZWyXIVGn1UNoTLBXwEVFVOTa4cx0J1ahfjWT78k25lBrHWBgosZ6OIfarUrONZma0tgqTA23dfX05cx0d2_-hJmyGJ3oi0-j3kuHdF7pqG6w5V5_hkT1FQ3hdSMhZN-w4U-WLh_Y_mcrtwnWDuSl1BRcLv1IutgYQwnxToVQM5ybpIIWLnaArXiPAcoiCaMdG8TUoj_NhJOfabT5OFaqRc0r_h42Jgbbsgw6zmag-qunA9rZmuDukrfz8B2v3Zxe40tDWjZPkflOc86jOu6qXzOhh988Tqm8_1iJ0HE9F1uHJnZ02Ixn2R6W5ufWmZm1qPkkF9fqSwdqjcxe3zHt892q18k9Q3zshsNZKxJ1clp4-eYVxD1G0v-FF66tMfniEWCbrzZHRhHIKBNn-2_0Omah9tD2FvDBiyK2UNQ2j8rLeapu6grh5xaeTTXA4VN2PaupbwY51nqoKgZF5K-OCLLgVOgmg26iYtq0SmvQ-iYZZke3YFfzhmNku9b_uDx5Kybyb3zI9M7ZZb3gBSbIjixin2vCo-KXqCy0QZ9NEGx3N2qY8tdpYSQ771yiMQuVrs4-C202l4rzLoqQ2wb_MmQph6g3gg2XtzNAksclUHD7ow2jObx9XduHIbOoNF97W8DqXbPf155_eeNLApheFI8ylWSFnl054AGnzXB6yM-IcB-1ywdLU2eikQ5HhPrTC0xjlEX1Oa_CJYOnHcoCCYmXWjeAyGPwYC4mA4OA83LUFiGFrY3l7Ktauyjs236xp9fYDl--nxDgO1rP8Bm85L4cgE_hJ2xorp56xzHaj23PcAGj96HJwiw5O5TcyN4fJEsdZlXJKKAT0augBxDLo3Kia2tDrSJ5Y41nBmqvaPUnaGLz06VWI_OYm8kWlzzszKL_EwYlzhraKQ79ERahSXdSgX8T83Ssnyx8FZW2HMckb5QDAejgDSon2tNiRDdLSqtnEb4ITvknaS4P6WFxzAiimm_e0Vd7A\\\")\",\"new EmuController(\\\"6008291652839-id_51ddd04f4b40f3b54921268\\\", \\\"AQLU3ia2O2tSXcTyZF1S-m9ygoUHiN3bm1ko05o4JTKBeSUdBGMvDM9NFdb665C7Omjd8pBKRBujLFSfEs2pyk0VuuZULVUDMANj_CxfQ4olt9vV8kPyMKtOdYXzEZhHhTSnPb6x-GRdfaMiJgbCQWTGEMNt_zGVfL9wnfzHkyG7SLjHcj0oYPQIn57OvP-jym7jA_aLhuMMPt2nmJUiZr6oiJioS8zTo_5uRy92fACLirEu1NaVSmHZ6maRJO_wl7fGRFNPABOVagzRGyRDYxDrM3y3at3tIjh85q3g_fZosaZ6do85XNoXrLs7E19IQONnT35cpCsJwcTnufpDUmxzzxwzcn8v_Ljx8iDT6_OB3IHHCx1NSMRXpGcuHLbWEvhYwQ4Zw5cDOfaxO-FM6mdlCNmrwnXSuMOxNeYLh9mrvx0ZauKzEbgW4OM5XPKaXbBeGA_2xk3LvIS2pLyI64ZZ5LhlhNDURh3sxm9KtT71-BDzVN11ub-Ss8dRFHIdgflTiHpEgDCK2Y0EGeEePyk2t5BZSmMU5_VG7cWIfE19SKkgiGdpUvJ589nczcPTSlxzHrOYrUvuAEIOszwO8HQ_c5-C-iyC3oMzyuEpUH-w22Al4tM2rRpVMq7j_lmzWFYfms6qDSpWUuzH_pD1fkXlJ95W68vQkIeHMo8EPchdVBprsdhM6moT_bBuei2OaqthIa075zQoiKGy8992jBq2XnY7ucwiWsPtTu9tkniXf4DOwR4lxw-UuAi4gs0R05wFS2KmlQq8BrJLtQR2n4xP3QZRpt1RVMjNSkScHUg0ijLJTaX8wm2mI35QggY4UZLKy0ge9iYRW-Q5CDjr6IhTJTnnCQsf4WRWgbQmD2BQCDUbSEbLjSCahTyn3vlzvTGNCzdxzvGJQhuH1wvZnrhwlfbeMtf7RatnLXBdVpFn0cn6_y60J7ZnHPsRPs7xNa1rAJyT3je8nZ44pXP6sWX3xOK254R7xy4iLFrbU0Cu3i4DwACvxT7feEwdqffxIqOUgS8yzToxFDMF-39PfWKqblBId2IiHARQu1uzY9QByj7Z4uf0GHK954XZ6-1a_ykWvdVPC_h3sb_2zoHTNK1uR_XNvrq8_xTALaqZNcrbEmo5brUvzkqOqCH5ZsTEwmTyara0pzUHrQdMkTw0_VGav5oQwUq7xD4X3ptEXQMcmQ\\\")\",\"new EmuController(\\\"6008916062318-id_51ddd04f4b4974851446951\\\", \\\"AQJGJvOnYZukufXE1r_V1Je4--yXbyhh5Q3z3eGIaBR82I_qO9CvM05NtO5v6wk63rBuEWdg8CziEwH64ob6GbBDs5tftO7CTKcsolCZ_-ewPnydNAPt5Toc5Q831MXKSjUJTe1Tixboky_IWQxRzYqFWWiYvyQJ7F02Y9Tam0xYH40Az8lAfEX8jLmCv-zgfGAapedwVz_mhy86fHV_w6skg85CNbutvnpU5J90gkkpLGyn-VYiJ78ICtgHFdkh2EIbR8FOwE8TjB1OBoa02Xl16425PXowjNG7VzR_1-hgx_kflmiqjvYOqGjTrbWiAm31n-MhBI1h8EsafPSC0o831XJw2btIAr-l5Uko5rjDq6M2nEte_s9Dvgu_xoSUZP_msK4DbXD-kZpnRif4QJaixS6ReLDJexDKmai6jgcOGodR9QqOs2LyEcd__V1BW-0btEfHvmfhzQXG5_7aWS5X-OAzFyuoFHVL5lPcDBa3OZ_JOnrUE5k_MEZsauZoeJ58TSVX0yG9o2HfpEGLjcUaKGCkJNNON7vfWxVZUShX-d3mYCKhKMFtihEYKN9VoS13KF_lRMDuz_cGWtaqLrKqxYxTWpwW_ymYFMw1bAOFXNxpMHFlFxaJ3E6IPkWGCcqfOKhCbcLf44md4WdNzRDg0IMWkDH_p9VSUYqB3jYCqo0qZP2hCvDXejEttr7B-VvT1ZAOgThX4s4WPNMpPOKuPL540FE3LhFxMDdfghPDQ4NIlhJjgtXneS9lLWxBS0xHZMY4yxHQMeZbR-KoMs4wxXk9ZjuvTMNh6RDr87V7XJ6MrTJjkE4QG96W_U91wL8u-kFCrs21nSSa0jhoZ9dva0Zgaj4V35lprB20UPEQIuTBo8X-qRoOSeZVMoqgKF7IkZHq2lhkWW_D6MpQRltKnAjsahfWd-sAmtJ8O6W7UjsRMYxY2docYD2XFgi6MPtzVm4X5I8205fsTRS1Z5LP1IuhRA5rw3AOClNyJJga17cFwF_-O_4BaG0sZVOS7XdUubnvhxqjLOoAO9cSIcHgs7BRDswzOr-Pfmfe_JyuQVponbkDRlJut7weddUFG2z_nJ-725A4GL2GNg4q1MjegEFPAfVEnVsi1JL2y_CBvhWd0RXXYb_ccwyCEPCvzDB3lYF5JS-8vL1Ygquo4KfWra8PUDwAziKvqCvJnUVFrOrbjRhvoZi1MWuUmMOjIKAp-tfkt30I3h69iub2fzirkyrK5tJd_Iv22Jxl9xHS22-g4pdzv7af4IPgy2CooVk\\\")\",\"new EmuController(\\\"6010037469977-id_51ddd04f4b5207180068485\\\", \\\"AQI5MS3p7PmoZOkYz1-g1bhcl_ihn4Me_qxkz6ExYyZ6Ptcc8YBk7zVSepS3t2VJaPYX4hangH0-ljBRqDpoJOa93hz_L9--Dht1_ed3yX9GClqUUFM2cqMqxvSVwxS3TfF3eNPJIv9hnQ8X8MgGQ9DaBkdVrQIt-t4kITCIpzoiDPe8F-D8d6sSllyxuQ3GUuk853fOQiwNt8BJkhbx24v0mMGM00G6tNnt99sTwBAlVb94zM23M6SHbMq2rOXBJ063K4L19AI5lZ02BHv_1_EF9dSVwoI9Vp22_oX_p6CDbPtqZJMb3yFp8EoDUOtSgopKSm0STXuLme3ITvV2SrCG0F9tk_atLtgGw8nQgCNkK_hKbs11EdIcVrz0YsVhy0vPaV5AywPLqM1PL_JjFNuPa4AzYOBZQSQvlOvEh-rD4lsQHn5nCZUmhSzjgs8s9lN7kc97LQJko0NUfEpW6A38y_1lhxtU2UdyS1vpiB5_E2fjWasz0sZ-LMCU3w5L2eurooyNpA5lmSlTFCZDw97s4Cl6Ea2MY3yKeG9USM_j__uNDmw-Ky2t5tS73heObkCginQdOzFr0bi570RPHbpIr9gJr1Pz-WxLsmvO7FVHeYJnwSItyNDNZwg9zmZeMNjrbnbvKkAgFu2qiWF_IPdH3etIDGbSco9BXsWTfs313VjaAAkbGcty2xe4MvxiFW4nB8-PkWW_UOjQwepjA8rc6Kw6akeI2Q7jJAvRc9CHdjgafRJxeK4ajl1M84swoGGwWRMtfheU-fO3raIM1S4uOREZCntZ-QAvVH36PuvlDlhyXPQActDMUCiOg-RAo-FoxoWrCkmPfnvFjsiaYfFwr5oZ_QHX5m0rIRjAzav4m7LZgNHpCEqWxbp-m4yQs4cTuZVRVC4Op--d4zie7eCZvNnSUvc8OaJs1UPjq9hZuoP1D9k1upnQ9um94jl3Ao3XO_wq7C24Y9WhJWoTo5ruUq0tAcpyr7g4oXAmLYaYaVdz31I_SbWqdxlON1bL5Hh5Jfhq9Y8Oh_txkhyYqUr73X9afte2tSoCDZia4Zszfzi-EQsQX9HMl85aETVtcpZWQTiXlDet_WddSuYkEmOrwNuPqNFCCZmbd8E9NG0XQDwkT4F-2rPgeQORouZ-nTug-uxSZGqOxLkVJb9_aSUTYPUisB9iFggbslTgLu2r3Fgaq0VCeSWGChXNQ6xUJgS2Lo5w4yQJ8AUHnuhqmv8qL8YeyrgFCHkjQWV9M0GzcqHFo409aYD2P7n822yyvoY\\\")\",\"new EmuController(\\\"6008948705864-id_51ddd04f4b59a3268404703\\\", \\\"AQJitB_HcoNKErKtrE1sFhSrP-tJFXEaNq2L9DGjGez_P-aWdI7tb3MQm3rKVU8GGq31CKIdLSfV9Da0z9htTnIlE8v0zWpIG2uga9AQ91KRFjegyqUemEZX5TBJfS-gzxI6STRlpJzAduP1XXzH3_GVuf6Q5oDNvMkhG8yRibyI5SMbprQr3A7FNtxCc50MT_Z9Q3uN1CHzijuyo7YzbleWb_kSUVovVvqNdIX0MM8JQ17BRs29aPQuZCi2HmAmgR0P_9k0jVBaKfSFDyAJejchw8vMr6OZLS_0siapgQpdDkZeoGE7aiorw3lnV-6VAdeA3A7aiYU7rnEikQV9eHA96htHndp_8lc3ka8EyV_lRc46WCsa5-SVj3HVWj_I3pfzQeLKQp214smdOUCLGLHKGPGuUiIcKx4PYL-ewY74gOFIN1yxBWMmvJP5GrGFiw7kK45tOgnBQmnfcmMXIcBfXlVVOk1q-5o1w3pYsHZw1ZgbmKpP_hRIj0u0HuN6n9q9moAJ0mfL6iYlELp-PIeAiBzA8THivuMrKRSdSvxW4M9dxBqyI5TwKSdxfIn53KKwrLkRN5tHjhp-XkAjG9VVfCag5xK44A_SwgFd4Y7M1VPb5g5x_CC-7HIRMBm4QCTMVFz2KS4Zk42I6-FhpRmw0RHsrp8erbOzpd11nxmnL-Yf7fK-TPIsnheUbmFRmLjlUNmMeQT_z3rNTyOBj-qqvnK0IG3IonJVtHknSLvhRYmNkS6__8C0kU2cMvm-KJHdc8dX5FQ06y0evFOFKx-qngoiuaIv_AcDzvW4y3ByUnurF-2jE9ju1DQH9HoTPKu4yvlB6ppvMnOQ51fpLMW1xO7bTJlu5stUxLR-2Ijq9nuNTH4qKkwSAHR3U_oaehsFPksTtYxgA0T7o96rP_7tS3IEUwtuIieP0VsReFAAPrfElIQ07QuK2882l3KgRajixpFP0Vv-APJQrBikDlFlaiCuOp5zCV2g-s0B1eoo6cuP6CqKWaX0G6XrT9Y3CtFLCowNTYiQ0sZeMEzH58lBAWvlsCyjX62os4-278WMX3sp8bEV6NPOwWkzpurwm4lYpQ0LuRCjEfnzpDDR6OxNXNBve6pHB1_NP8Xh0vbkYNkQQpi1hxwh__OTpP232_P9wi1pc6yu1suD1Fp2Dm-vADs_5NmxHBT_EwqAwYzti4dbaT6ritCOMJRtX9ngPBes9z1DU2LKG7vLyuanLJ3pai8IKROpgAZRWwdm0MdYudjhpaAQCxVeNjPHpI0LRSE\\\")\",],\n    id: \"u_0_2q\",\n    phase: 4\n});");
// 1849
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o7,"s3384546c050c84c47757d73b92c422e36cb04d63");
// 1850
geval("bigPipe.onPageletArrive({\n    display_dependency: [\"pagelet_side_ads\",],\n    JSBNG__content: {\n        u_0_2q: {\n            container_id: \"u_0_45\"\n        }\n    },\n    jsmods: {\n        require: [[\"Arbiter\",\"inform\",[],[\"netego_loaded\",null,],],[\"NetEgo\",\"setup\",[],[6010069360965,],],[\"NetEgo\",\"setup\",[],[6008291652839,],],[\"NetEgo\",\"setup\",[],[6008916062318,],],[\"NetEgo\",\"setup\",[],[6010037469977,],],[\"NetEgo\",\"setup\",[],[6008948705864,],],[\"AdblockDetectorLogging\",\"assertUnblocked\",[\"m_0_87\",],[{\n            __m: \"m_0_87\"\n        },],],[\"TimelineController\",\"setAdsTracking\",[],[{\n            6010069360965: \"AQLbmP60eMgrcRKD1n0iNPI3rEJypxhSsWe9OK3TEwO7BVgxc6QQKwnakQAQI3orulou1PD-qpHI5wCUVGLAxnrt8wOvshETaxEJ1sLGFUpUY1P5L1XkKD08rgHoNbdP49921HWPkUq9zl956uZN0B6ppiBvk5K4N0-xN28WbsOolp86XrFx-3JM0Q5kdlOF2c6bP2P4QATsezJ66B7x9AYUlu0EP_oXTm9QKiz-qU_vJoeU08w2dMq_ilvBF1Ql_pD3Z72LQyN34jkjhcvzOBWQziwhUUIoGDvS9hkP6N2GKh_lBfPiZUS3naKm1Z_kPRXsBZgnSNgHZYTcbautyag2uCfwzap9jj5GWduyyDvrsT087ffLwU2-bK2IQrDVfX4s3ZYqGn8Bw07iUHGDYBrO2pUVfRHpO0PgjDMqx81p34YcSl5gCgycaYvl2ucTQoG3qOa1432N23t2GDetziVF0zUa4MiswULJGHP3JWcWqyYMFFlglD-o5c9XLwn2M1bzcqhcKPa2qOulwAGsqI1AFF4GqhsMUyAmzaEWXz1iAZxpWMVc_63eDLlYwCvQYllTa3aEBAeaTnD2vpLEH9IyyEFZeE6-pQgX9I4t8bpzbnUj6r2-oRxJCrxemyfCHoIkJ-G-j616dXmW25uZ1I5ELdLweNWoq-Xjl-R-RKfWM7gCvLv_j9r7m6yv6bPmCrniu8XwY8JpXUr9kkLiM6AGlZG2DURm6uzpODQDeEkmt87HHo60DpuwSVYJ3iA5N10J9_qgNKkbhQZy3CtUh-z0AkqZCl0a4fOa8F-Qpvomdu5w4BA5_4w9WfiZBQ3JOEVpqaBHhtx_xnnG7JhBVoIfz-bE7rJdU3cXsfltsGs1tfvA7W7_jiSYWj9DZD5A8vdp9asPOrd_WrALKaxK28hi\",\n            6008291652839: \"AQK2JCkebZg-304wmP1Dt4OZiq1R0zBVNi60e4kmzoblTj9ZIpl8yHSoikJBlVaqR5DUIlWq3YjZw2vAs9A2vpHmYqbO2XnwLZu-vEBRBAnppzlz6PSHYKUEyGZOPv3w3NBB73eMlXKmDcnugfeBCSxsJ03WAYT8PyIRpwRBohfNi8Cn8-Q7wfZvNPD1rR0ZV8l6a47oaZcmerncQU-a8_VqakT2N5yb3IoXxgp4BVjT87Y6SrwczaqvKQIdzPvstWhI7f3itV-WMeIeaM8pSQs4C1fyzb4b4XoY_bIuGsqyXWtkNbP4IeXy7nvCYDMODhBN2GE18saReegNSYGg5ZibQml0HW2nfKqrRC0bqWOJ2AWPaOazWIB3UzCnY8JVkNfnN4ZN1L8Z4agU-r0EOwAa0Ci0DSZwK3NqrZREmX4vQWqZ2SPMiML9P7yyG8eoDlzq25HArSmGIQNt2MORzCKFNXjDYK0moRdDkygGOjZbaBB_oqV0wYIaA_rJZZsk8IEFgal8_Zv0mMIMHWMt2U-v8Hc3oUUYYI9SBn0IxU19faiRgmPr829b7jVhi2eacvPVA0xHOjiAreaE_HplczjKgEyg-MK93lnFMy0t7jBWhz0J5LDrECqRBmO2bt8_wqHim8arn3TjylHbLy9_g9ur1f0w7S04eYT0lL7FViy6r--uMeCXhnnrauA0T9YNIg0F2h-QEoEjOrKqNU_JTcz_u5ul2CI8Hf_9WACDntxJanwUMpVZ2yLzqfSNOGWZYRdPt3U2eEX5GwD7w29JMg84XiaTe1_nTdFQBbPiCe9Hr9Oo-U3kFCealIZQUrV_7sAslu96-zJepOUIeyOpf6JWQ5LdbyO7OspnnYWFOTG2HQl7MFad5kgKUmhHkSyM8VnfHHXXg9RL2NHjG_WsrpDK\",\n            6008916062318: \"AQL7RzfFwNInah9q3QXCnlQ0J-X_CbBOJTqcjJV0weNEBz_C5uAcLMf8k2mubs16TPAkUKvx9LikmysjVfEVkPkpGd-m5vB3bRwszmGd0HL9sSMouRAB8-NL89N9cogM7BXls1z5ezGvAe1aifJF4c0k46nLC9XHCTufa6E7yYYDzpYu8tDjD9vGJIEOWO3gxGkEO4kQNEtWLInGy-z7jiKkPtwugTSsIX2qpMdRmWcIgocVhycuOxzITg2AMM8Np3Obntkh3juE52ZPskNp6YOPPUVg5Tkm3lD3pP7xRbLW3WUr8T7cpcuThrb9MtODZWLaBA0IWKkZWoVkCOCIkRDZvATFXPPXHq8uJi73Btmw-bTkzmRkeqLyHUMlXtdgPz3ne0FBjAotaWMhh7gcoG2JnzGyPFRZUuVhk7rLDT794x-BlCzsefRwXyC95dRm3tUsOx_3B3aldhugawxX8SyQPr6Wb0SG3h7XHJqV2MAXqo24Ql7NLQiXYx3Z7uTsctIv1peKYuOrcNWEhAdmnPaaVPloK-662wZViJvQfunzptNVZVLGBcj7bfpsaBaGkwuWqF7kOfv_HbkedRp5pehBDbKpaGRG_Hf66zaYIPk-b8gYDNE35C0NoKEMH8Rct3hkeLiAAmIdn12qR0dcfxR5ReJwnrkFNAICp2TxgcJqdispTVeVVj_NowgOVe5NFk8BjpdMgXkhGhL8tmQSJV3w4Zbf-4QpsxS1oYpqcjSZwIKrXo-ttTSOQSIJvfVMVd66CW8AWB2i8q9eOSpoT-4Ddh_rNSg8k5ln6j3euEb6QeQJ5N9HLZEp5BvuJ4zuQw2Jc5yNuheLkqP6x3nYqbR1fHoRZICS2fuiHWhiTizcMA282WPCd-nn_CTCc41xowx5XAs7q5V0T-okQWbu5wbmu3k_D_bOy2UQlYsrPQvbjCVront6wwthuWYVF-jNJ-Q\",\n            6010037469977: \"AQJEqQpJ9IbDt_NxB0QkgLDbRr1fFa_K3WFVk2ML-TdapfyzQJjJ10K7kXwXJV-9C8HofFltnZyoD_flyZQC1yGtiexVBtCuYMaN77hambAITBv-PAzbgnI6BExtMYBIU7FFoJhdv4BHVJKGXlwLEGIYk-JvY31Zo9TRo07GWudeK3pguvbMoaKrJdHEjGwnvF8jhwubHrdEQ6NA7iNRinLMik7V4AYkzCYA_vhlCueTAWZINsqK_2nZTIXLD0JMrtkSCyLLJFdcj1JPVmQ8NikRLQHHif-Tq0YShvffXvUXrwQ4CrX8JjKAO_lJ3p80U41ShHJdm5ICTEub-k5N3th7LbeGugaA4zQGJzWzHl-ABASedUPiWEAvceCG_ybZ8pP-IyySn7Pq-w1noR--jsCDwwdgtmm-MNPt0wms2uTjh4B9LKo6VtIk-MaebfXb66Oe12xKhUXaTgyNHn9GRbHnC9kjYrf1l9LDlu8JgQ8RnU2DfkKUt1Gpgsy7qXvxuGgPuyKP3_qaIYy6oivRGFt7XFEvewljZ91Z4TwJu43tAfuuqPpPYaG_pEs7bU2QvW9XQLQYkYldvO6Bnxrrbwy91C8Wp-BzAqMv6VvDHsQub64MVZegvxZPSYhVZKTN2qQQDrIAtOm_kSKAGaa95iuxu5Ol5jbkaDG6az4Re2_jaXXssFr62ano4rxftlGe0rBxKCYZIMW8FNkrZlwzWv0KESWHjxA6pWL4d9OqibWiGbPQO0QieSG_CcLgvbheU2VuauxzHj5PcGMQodm_fNNvVKGrBBotuEoi0LUHNvxcYjlfmedeXg2Uyul5gzr5v29JJ0QHm8ajxlMTvM__deiAvdQOjcykjZ59ydEsLZJhs6YXITuvLLtuGCtTSGSE9leRTDInwnqtO29YJsJPAUM2uC-baKXzvunPRzMKi4jGXg\",\n            6008948705864: \"AQLP71CE_gU9zcF13ctX_43YAY5s1-_Fhlibdf1VX1WTKpFonhYx2lnQuox3kDCVMluFrmlMAl6R5bXUpjeX5HWu9bXSMje7A5Z7uXvFWdjD0lFQ3ad-kPDkIeQ8VF1afF_Cv95W9TfJdlpJThwj3kY-aitTqB0NigF2-t3GAG02zllCQ-Ythp5LZCxzG7nI9tJ8J18jOMT8OkIDIHL9SbijxuleqrqewjszbhR-GhuoaR6w9eRrlF7BWNsQJ7C_9-zP7XoNiVM9u7XUlzFdfAfq0UDPupJgKPo6OeBDgYoIbdN50BunNAKI3G3Ykht16vJfXhPLrvQeHfGsyWwAnF0HoYJJLagvWZwJMpc34huL9iwq-R2ZZ4CA02-DTuIGVCE2BJxUI7xyH4uYjwKHSmJnXo9TLdhkSxjGRcIqegyzyf2V-kQ39ljSSupNMzk0lrVj_Wz2N_kqwf_wOkdgWEiIPoE5Z-NWm5bSz1MrAwcuuxNgeXWAvXKo27E2uxtFshus0lt9QFzytzkNffoQtkg5Y4fFSLzfefwTtBQq2lklj_qZ3kDehX69OIwvNBvubLAnlxjoJLtIlR55T0WjY45FmeV8S96ptgnzuDNWVAyDthioPjdhPonQf1Wi-UwZypxVkJ1JB1anpRMe9dzHsCUumoCSPvEvOWHPlG_7IigdQ6GEOsivnPu1yJ2KW78K3EOMDgX6d0JFgv9k6BXiMiRnXABAN4a6UB3M4HSv3KVEqJ8mg1xDEjxmOlNsaG2tfIFYowH2Qzc-x1oaZg_rO82sChY_qyHjfJISXjTzhql6fk2ypT7nWfNjdaLnYCUIAbzCEaZj_1RjMTHQ7SvKdK2olvdvQ6Fa8W5wawufBzjwc4o8PF9dwvsdrLyte_zrnl_ksXsNDkS1bfZ03G3l4GAvv-GWiQRvuvMlgF7etHmkJen85cSTrOL7lcAdCQKBGSg\"\n        },],],],\n        elements: [[\"m_0_87\",\"u_0_44\",2,],]\n    },\n    css: [\"0duP3\",\"W3Ky6\",],\n    bootloadable: {\n    },\n    resource_map: {\n    },\n    js: [\"AyUu6\",\"AsDOA\",\"jsIYP\",],\n    JSBNG__onload: [\"new EmuController(\\\"6010069360965-id_51ddd04f4b2ff8432881967\\\", \\\"AQImwNUhGWEdpxtbkvIo1XeZdXEJCbnUliRgBk-VjzyF9x_sRKX5KkfadkdzeU0OYGCk-6TBWIQSN5KzhOYoKjVlo4kTAXaIrVwpryZutdNpoebhwCxm335cl9OPRfK09xRh4Y0LhYHkwbguwrbCU9Q-xXnQWfSF77ZWyXIVGn1UNoTLBXwEVFVOTa4cx0J1ahfjWT78k25lBrHWBgosZ6OIfarUrONZma0tgqTA23dfX05cx0d2_-hJmyGJ3oi0-j3kuHdF7pqG6w5V5_hkT1FQ3hdSMhZN-w4U-WLh_Y_mcrtwnWDuSl1BRcLv1IutgYQwnxToVQM5ybpIIWLnaArXiPAcoiCaMdG8TUoj_NhJOfabT5OFaqRc0r_h42Jgbbsgw6zmag-qunA9rZmuDukrfz8B2v3Zxe40tDWjZPkflOc86jOu6qXzOhh988Tqm8_1iJ0HE9F1uHJnZ02Ixn2R6W5ufWmZm1qPkkF9fqSwdqjcxe3zHt892q18k9Q3zshsNZKxJ1clp4-eYVxD1G0v-FF66tMfniEWCbrzZHRhHIKBNn-2_0Omah9tD2FvDBiyK2UNQ2j8rLeapu6grh5xaeTTXA4VN2PaupbwY51nqoKgZF5K-OCLLgVOgmg26iYtq0SmvQ-iYZZke3YFfzhmNku9b_uDx5Kybyb3zI9M7ZZb3gBSbIjixin2vCo-KXqCy0QZ9NEGx3N2qY8tdpYSQ771yiMQuVrs4-C202l4rzLoqQ2wb_MmQph6g3gg2XtzNAksclUHD7ow2jObx9XduHIbOoNF97W8DqXbPf155_eeNLApheFI8ylWSFnl054AGnzXB6yM-IcB-1ywdLU2eikQ5HhPrTC0xjlEX1Oa_CJYOnHcoCCYmXWjeAyGPwYC4mA4OA83LUFiGFrY3l7Ktauyjs236xp9fYDl--nxDgO1rP8Bm85L4cgE_hJ2xorp56xzHaj23PcAGj96HJwiw5O5TcyN4fJEsdZlXJKKAT0augBxDLo3Kia2tDrSJ5Y41nBmqvaPUnaGLz06VWI_OYm8kWlzzszKL_EwYlzhraKQ79ERahSXdSgX8T83Ssnyx8FZW2HMckb5QDAejgDSon2tNiRDdLSqtnEb4ITvknaS4P6WFxzAiimm_e0Vd7A\\\")\",\"new EmuController(\\\"6008291652839-id_51ddd04f4b40f3b54921268\\\", \\\"AQLU3ia2O2tSXcTyZF1S-m9ygoUHiN3bm1ko05o4JTKBeSUdBGMvDM9NFdb665C7Omjd8pBKRBujLFSfEs2pyk0VuuZULVUDMANj_CxfQ4olt9vV8kPyMKtOdYXzEZhHhTSnPb6x-GRdfaMiJgbCQWTGEMNt_zGVfL9wnfzHkyG7SLjHcj0oYPQIn57OvP-jym7jA_aLhuMMPt2nmJUiZr6oiJioS8zTo_5uRy92fACLirEu1NaVSmHZ6maRJO_wl7fGRFNPABOVagzRGyRDYxDrM3y3at3tIjh85q3g_fZosaZ6do85XNoXrLs7E19IQONnT35cpCsJwcTnufpDUmxzzxwzcn8v_Ljx8iDT6_OB3IHHCx1NSMRXpGcuHLbWEvhYwQ4Zw5cDOfaxO-FM6mdlCNmrwnXSuMOxNeYLh9mrvx0ZauKzEbgW4OM5XPKaXbBeGA_2xk3LvIS2pLyI64ZZ5LhlhNDURh3sxm9KtT71-BDzVN11ub-Ss8dRFHIdgflTiHpEgDCK2Y0EGeEePyk2t5BZSmMU5_VG7cWIfE19SKkgiGdpUvJ589nczcPTSlxzHrOYrUvuAEIOszwO8HQ_c5-C-iyC3oMzyuEpUH-w22Al4tM2rRpVMq7j_lmzWFYfms6qDSpWUuzH_pD1fkXlJ95W68vQkIeHMo8EPchdVBprsdhM6moT_bBuei2OaqthIa075zQoiKGy8992jBq2XnY7ucwiWsPtTu9tkniXf4DOwR4lxw-UuAi4gs0R05wFS2KmlQq8BrJLtQR2n4xP3QZRpt1RVMjNSkScHUg0ijLJTaX8wm2mI35QggY4UZLKy0ge9iYRW-Q5CDjr6IhTJTnnCQsf4WRWgbQmD2BQCDUbSEbLjSCahTyn3vlzvTGNCzdxzvGJQhuH1wvZnrhwlfbeMtf7RatnLXBdVpFn0cn6_y60J7ZnHPsRPs7xNa1rAJyT3je8nZ44pXP6sWX3xOK254R7xy4iLFrbU0Cu3i4DwACvxT7feEwdqffxIqOUgS8yzToxFDMF-39PfWKqblBId2IiHARQu1uzY9QByj7Z4uf0GHK954XZ6-1a_ykWvdVPC_h3sb_2zoHTNK1uR_XNvrq8_xTALaqZNcrbEmo5brUvzkqOqCH5ZsTEwmTyara0pzUHrQdMkTw0_VGav5oQwUq7xD4X3ptEXQMcmQ\\\")\",\"new EmuController(\\\"6008916062318-id_51ddd04f4b4974851446951\\\", \\\"AQJGJvOnYZukufXE1r_V1Je4--yXbyhh5Q3z3eGIaBR82I_qO9CvM05NtO5v6wk63rBuEWdg8CziEwH64ob6GbBDs5tftO7CTKcsolCZ_-ewPnydNAPt5Toc5Q831MXKSjUJTe1Tixboky_IWQxRzYqFWWiYvyQJ7F02Y9Tam0xYH40Az8lAfEX8jLmCv-zgfGAapedwVz_mhy86fHV_w6skg85CNbutvnpU5J90gkkpLGyn-VYiJ78ICtgHFdkh2EIbR8FOwE8TjB1OBoa02Xl16425PXowjNG7VzR_1-hgx_kflmiqjvYOqGjTrbWiAm31n-MhBI1h8EsafPSC0o831XJw2btIAr-l5Uko5rjDq6M2nEte_s9Dvgu_xoSUZP_msK4DbXD-kZpnRif4QJaixS6ReLDJexDKmai6jgcOGodR9QqOs2LyEcd__V1BW-0btEfHvmfhzQXG5_7aWS5X-OAzFyuoFHVL5lPcDBa3OZ_JOnrUE5k_MEZsauZoeJ58TSVX0yG9o2HfpEGLjcUaKGCkJNNON7vfWxVZUShX-d3mYCKhKMFtihEYKN9VoS13KF_lRMDuz_cGWtaqLrKqxYxTWpwW_ymYFMw1bAOFXNxpMHFlFxaJ3E6IPkWGCcqfOKhCbcLf44md4WdNzRDg0IMWkDH_p9VSUYqB3jYCqo0qZP2hCvDXejEttr7B-VvT1ZAOgThX4s4WPNMpPOKuPL540FE3LhFxMDdfghPDQ4NIlhJjgtXneS9lLWxBS0xHZMY4yxHQMeZbR-KoMs4wxXk9ZjuvTMNh6RDr87V7XJ6MrTJjkE4QG96W_U91wL8u-kFCrs21nSSa0jhoZ9dva0Zgaj4V35lprB20UPEQIuTBo8X-qRoOSeZVMoqgKF7IkZHq2lhkWW_D6MpQRltKnAjsahfWd-sAmtJ8O6W7UjsRMYxY2docYD2XFgi6MPtzVm4X5I8205fsTRS1Z5LP1IuhRA5rw3AOClNyJJga17cFwF_-O_4BaG0sZVOS7XdUubnvhxqjLOoAO9cSIcHgs7BRDswzOr-Pfmfe_JyuQVponbkDRlJut7weddUFG2z_nJ-725A4GL2GNg4q1MjegEFPAfVEnVsi1JL2y_CBvhWd0RXXYb_ccwyCEPCvzDB3lYF5JS-8vL1Ygquo4KfWra8PUDwAziKvqCvJnUVFrOrbjRhvoZi1MWuUmMOjIKAp-tfkt30I3h69iub2fzirkyrK5tJd_Iv22Jxl9xHS22-g4pdzv7af4IPgy2CooVk\\\")\",\"new EmuController(\\\"6010037469977-id_51ddd04f4b5207180068485\\\", \\\"AQI5MS3p7PmoZOkYz1-g1bhcl_ihn4Me_qxkz6ExYyZ6Ptcc8YBk7zVSepS3t2VJaPYX4hangH0-ljBRqDpoJOa93hz_L9--Dht1_ed3yX9GClqUUFM2cqMqxvSVwxS3TfF3eNPJIv9hnQ8X8MgGQ9DaBkdVrQIt-t4kITCIpzoiDPe8F-D8d6sSllyxuQ3GUuk853fOQiwNt8BJkhbx24v0mMGM00G6tNnt99sTwBAlVb94zM23M6SHbMq2rOXBJ063K4L19AI5lZ02BHv_1_EF9dSVwoI9Vp22_oX_p6CDbPtqZJMb3yFp8EoDUOtSgopKSm0STXuLme3ITvV2SrCG0F9tk_atLtgGw8nQgCNkK_hKbs11EdIcVrz0YsVhy0vPaV5AywPLqM1PL_JjFNuPa4AzYOBZQSQvlOvEh-rD4lsQHn5nCZUmhSzjgs8s9lN7kc97LQJko0NUfEpW6A38y_1lhxtU2UdyS1vpiB5_E2fjWasz0sZ-LMCU3w5L2eurooyNpA5lmSlTFCZDw97s4Cl6Ea2MY3yKeG9USM_j__uNDmw-Ky2t5tS73heObkCginQdOzFr0bi570RPHbpIr9gJr1Pz-WxLsmvO7FVHeYJnwSItyNDNZwg9zmZeMNjrbnbvKkAgFu2qiWF_IPdH3etIDGbSco9BXsWTfs313VjaAAkbGcty2xe4MvxiFW4nB8-PkWW_UOjQwepjA8rc6Kw6akeI2Q7jJAvRc9CHdjgafRJxeK4ajl1M84swoGGwWRMtfheU-fO3raIM1S4uOREZCntZ-QAvVH36PuvlDlhyXPQActDMUCiOg-RAo-FoxoWrCkmPfnvFjsiaYfFwr5oZ_QHX5m0rIRjAzav4m7LZgNHpCEqWxbp-m4yQs4cTuZVRVC4Op--d4zie7eCZvNnSUvc8OaJs1UPjq9hZuoP1D9k1upnQ9um94jl3Ao3XO_wq7C24Y9WhJWoTo5ruUq0tAcpyr7g4oXAmLYaYaVdz31I_SbWqdxlON1bL5Hh5Jfhq9Y8Oh_txkhyYqUr73X9afte2tSoCDZia4Zszfzi-EQsQX9HMl85aETVtcpZWQTiXlDet_WddSuYkEmOrwNuPqNFCCZmbd8E9NG0XQDwkT4F-2rPgeQORouZ-nTug-uxSZGqOxLkVJb9_aSUTYPUisB9iFggbslTgLu2r3Fgaq0VCeSWGChXNQ6xUJgS2Lo5w4yQJ8AUHnuhqmv8qL8YeyrgFCHkjQWV9M0GzcqHFo409aYD2P7n822yyvoY\\\")\",\"new EmuController(\\\"6008948705864-id_51ddd04f4b59a3268404703\\\", \\\"AQJitB_HcoNKErKtrE1sFhSrP-tJFXEaNq2L9DGjGez_P-aWdI7tb3MQm3rKVU8GGq31CKIdLSfV9Da0z9htTnIlE8v0zWpIG2uga9AQ91KRFjegyqUemEZX5TBJfS-gzxI6STRlpJzAduP1XXzH3_GVuf6Q5oDNvMkhG8yRibyI5SMbprQr3A7FNtxCc50MT_Z9Q3uN1CHzijuyo7YzbleWb_kSUVovVvqNdIX0MM8JQ17BRs29aPQuZCi2HmAmgR0P_9k0jVBaKfSFDyAJejchw8vMr6OZLS_0siapgQpdDkZeoGE7aiorw3lnV-6VAdeA3A7aiYU7rnEikQV9eHA96htHndp_8lc3ka8EyV_lRc46WCsa5-SVj3HVWj_I3pfzQeLKQp214smdOUCLGLHKGPGuUiIcKx4PYL-ewY74gOFIN1yxBWMmvJP5GrGFiw7kK45tOgnBQmnfcmMXIcBfXlVVOk1q-5o1w3pYsHZw1ZgbmKpP_hRIj0u0HuN6n9q9moAJ0mfL6iYlELp-PIeAiBzA8THivuMrKRSdSvxW4M9dxBqyI5TwKSdxfIn53KKwrLkRN5tHjhp-XkAjG9VVfCag5xK44A_SwgFd4Y7M1VPb5g5x_CC-7HIRMBm4QCTMVFz2KS4Zk42I6-FhpRmw0RHsrp8erbOzpd11nxmnL-Yf7fK-TPIsnheUbmFRmLjlUNmMeQT_z3rNTyOBj-qqvnK0IG3IonJVtHknSLvhRYmNkS6__8C0kU2cMvm-KJHdc8dX5FQ06y0evFOFKx-qngoiuaIv_AcDzvW4y3ByUnurF-2jE9ju1DQH9HoTPKu4yvlB6ppvMnOQ51fpLMW1xO7bTJlu5stUxLR-2Ijq9nuNTH4qKkwSAHR3U_oaehsFPksTtYxgA0T7o96rP_7tS3IEUwtuIieP0VsReFAAPrfElIQ07QuK2882l3KgRajixpFP0Vv-APJQrBikDlFlaiCuOp5zCV2g-s0B1eoo6cuP6CqKWaX0G6XrT9Y3CtFLCowNTYiQ0sZeMEzH58lBAWvlsCyjX62os4-278WMX3sp8bEV6NPOwWkzpurwm4lYpQ0LuRCjEfnzpDDR6OxNXNBve6pHB1_NP8Xh0vbkYNkQQpi1hxwh__OTpP232_P9wi1pc6yu1suD1Fp2Dm-vADs_5NmxHBT_EwqAwYzti4dbaT6ritCOMJRtX9ngPBes9z1DU2LKG7vLyuanLJ3pai8IKROpgAZRWwdm0MdYudjhpaAQCxVeNjPHpI0LRSE\\\")\",],\n    id: \"u_0_2q\",\n    phase: 4\n});");
// 1856
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o7,"bigPipe.onPageletArrive({\n    id: \"\",\n    phase: 4,\n    jsmods: {\n        require: [[\"TimelineContentLoader\",\"setParallelLoadConfig\",[],[{\n            required_units: 5,\n            max_parallelism: 3\n        },],],]\n    },\n    is_last: true,\n    css: [\"W3Ky6\",\"0duP3\",\"ZtiRu\",\"aQ3gA\",\"vFtag\",\"ynBUm\",\"xqZGj\",\"yagwf\",],\n    bootloadable: {\n    },\n    resource_map: {\n    },\n    js: [\"AyUu6\",\"OJTM4\",\"KPZ5T\",\"AsDOA\",\"63VzN\",\"4vv8/\",\"u//Ut\",\"hfrQl\",\"C6rJk\",\"jsIYP\",],\n    the_end: true\n});");
// 1857
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o7,"s6de83c457bb48e650172c981b18e87e39bf333f3");
// 1858
geval("bigPipe.onPageletArrive({\n    id: \"\",\n    phase: 4,\n    jsmods: {\n        require: [[\"TimelineContentLoader\",\"setParallelLoadConfig\",[],[{\n            required_units: 5,\n            max_parallelism: 3\n        },],],]\n    },\n    is_last: true,\n    css: [\"W3Ky6\",\"0duP3\",\"ZtiRu\",\"aQ3gA\",\"vFtag\",\"ynBUm\",\"xqZGj\",\"yagwf\",],\n    bootloadable: {\n    },\n    resource_map: {\n    },\n    js: [\"AyUu6\",\"OJTM4\",\"KPZ5T\",\"AsDOA\",\"63VzN\",\"4vv8/\",\"u//Ut\",\"hfrQl\",\"C6rJk\",\"jsIYP\",],\n    the_end: true\n});");
// 1866
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_222[0], o0,o35);
// undefined
o0 = null;
// undefined
o35 = null;
// 1868
JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_225[0](o36);
// undefined
o36 = null;
// 1870
JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_169[0](false);
// 5476
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o7,"if (self.CavalryLogger) {\n    CavalryLogger.start_js([\"AsDOA\",]);\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            clearTimeout(h[m]);\n            h[m] = null;\n        }\n        \n    ;\n        h[m] = setTimeout(function() {\n            h[m] = null;\n            if (!k.offsetHeight) {\n                var n = k, o = 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.parentNode;\n                };\n                if ((n === o)) {\n                    (l && l(k));\n                };\n            }\n        ;\n        }, 3000);\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.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.name = (l + m);\n        };\n    }\n;\n    var n = ((((window.location.protocol == \"https:\") && document.cookie.match(/\\bcsm=1/))) ? \"; secure\" : \"\"), o = ((l + m) + \"_\"), p = new Date((Date.now() + 604800000)).toGMTString(), q = window.location.hostname.replace(/^.*(facebook\\..*)$/i, \"$1\"), r = ((((\"; expires=\" + p) + \";path=/; domain=\") + q) + n), s = 0, t, u = (k.sessionStorage && a.sessionStorage), v = document.cookie.length, w = false, x = Date.now();\n    function y(ca) {\n        return ((((o + (s++)) + \"=\") + encodeURIComponent(ca)) + r);\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        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, document.cookie.length);\n            if ((!w && (((new Date() - x) > 60000)))) {\n                w = true;\n            };\n            var ha = (!ga && ((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                if ((((ha || ia)) && (((((document.cookie.length + na.length) > ka)) || ((document.cookie.split(\";\").length > ja)))))) {\n                    break;\n                };\n                document.cookie = na;\n                ha = true;\n                this.dequeue();\n            };\n            var oa = 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() || ((document.cookie.length > ma))) || ((document.cookie.split(\";\").length > la))))))) {\n                var pa = new Image(), qa = this, ra = (h.tracking_domain || \"\");\n                da = true;\n                pa.onload = function ua() {\n                    da = false;\n                    fa = 0;\n                    qa.clear();\n                };\n                pa.onerror = pa.onabort = function ua() {\n                    da = false;\n                    ea = 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.random() * 10000)) + 1))) + sa) + ta) + \"&\") + ((!ga ? \"\" : \"s=\"))) + oa);\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 = 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            function fa() {\n                var ha = ((ca + \";\") + da);\n                sessionStorage.setItem(\"_e_ids\", ha);\n            };\n            function ga(ha) {\n                return (\"_e_\" + ((((ha !== undefined)) ? ha : ca++)));\n            };\n            this.isEmpty = function() {\n                return (da === ca);\n            };\n            this.enqueue = function(ha, ia) {\n                var ja = (ia ? ga(--da) : ga());\n                sessionStorage.setItem(ja, ha);\n                fa();\n            };\n            this.dequeue = function() {\n                this.isEmpty();\n                sessionStorage.removeItem(ga(da));\n                da++;\n                fa();\n            };\n            this.peek = function() {\n                var ha = 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    var ba = {\n        log: function(ca, da, ea) {\n            if (h.no_cookies) {\n                return\n            };\n            var fa = [m,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            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            event: \"ads_blocked\"\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    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            }, 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            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                l -= q;\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            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    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        this.impression = p;\n        this.containerId = o;\n        h.set(q, \"emuController\", this);\n        return this;\n    };\n    j(n, {\n        fromContainer: function(o) {\n            var p = l(o);\n            if (!p) {\n                return null\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        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            if (!r) {\n                r = k;\n            };\n            var t = new g().setURI(this.EVENT_HANDLER_PATH).setData(s).setErrorHandler(r);\n            if (q) {\n                t.setHandler(q);\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.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            h(i, k);\n        },\n        getDebugInfo: function() {\n            return i;\n        }\n    };\n    j.set(g);\n    e.exports = j;\n});\n__d(\"cancelAnimationFrame\", [], function(a, b, c, d, e, f) {\n    var g = (((((a.cancelAnimationFrame || a.webkitCancelAnimationFrame) || a.mozCancelAnimationFrame) || a.oCancelAnimationFrame) || a.msCancelAnimationFrame) || a.clearTimeout);\n    e.exports = g;\n});\n__d(\"XUISpinner.react\", [\"BrowserSupport\",\"ReactProps\",\"React\",\"cancelAnimationFrame\",\"cx\",\"joinClasses\",\"requestAnimationFrame\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"BrowserSupport\"), h = b(\"ReactProps\"), i = b(\"React\"), j = b(\"cancelAnimationFrame\"), k = b(\"cx\"), l = b(\"joinClasses\"), m = b(\"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: Date.now()\n                }\n            };\n        },\n        componentDidMount: function() {\n            if (!o) {\n                this._step();\n            };\n        },\n        componentWillUnmount: function() {\n            (this._requestID && j(this._requestID));\n        },\n        _step: function() {\n            this._requestID = m(this._step);\n            var x = 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        _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        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    function n(q) {\n        return function(r) {\n            return new o(q, r);\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    o.prototype.remove = function() {\n        k(l[this.getSide()], this);\n    };\n    var p = {\n        getTop: m(\"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(\"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        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        return h;\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    function s(w) {\n        if (!((w instanceof Array))) {\n            w = [w,];\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        return null;\n    };\n    function t(w) {\n        return (k.getElementPosition(w).y > o.getTop());\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    var v = p({\n        monitor: function(w, x) {\n            if (q()) {\n                return x()\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                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(\"scroll\", da) !== false)) {\n                        ca.scrollElementBy(l.getDocumentScrollElement());\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            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    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    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        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            var j = null;\n            if (a.ActiveXObject) {\n                try {\n                    j = new a.ActiveXObject(h);\n                    if (j) {\n                        return true\n                    };\n                } catch (k) {\n                \n                };\n            }\n             else if ((a.navigator && a.navigator.plugins)) {\n                a.navigator.plugins.refresh(false);\n                for (var l = 0, m = a.navigator.plugins.length; (l < m); l++) {\n                    j = a.navigator.plugins[l];\n                    if ((j.length && (j[0].type === this.mimeType))) {\n                        return true\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\", [\"Event\",\"ArbiterMixin\",\"UserAgent\",\"Vector\",\"copyProperties\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"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    k(m.prototype, h, {\n        setMinDragDistance: function(n) {\n            this.minDragDistance = n;\n        },\n        _start: function(event) {\n            var n = false, o = true, p = null;\n            if (this.inform(\"mousedown\", event)) {\n                o = false;\n            };\n            if (this.minDragDistance) {\n                p = j.getEventPosition(event);\n            }\n             else {\n                n = true;\n                var q = this.inform(\"start\", 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            var r = ((i.ie() < 9) ? document.documentElement : window), s = g.listen(r, {\n                selectstart: (o ? g.prevent : l),\n                mousemove: function(event) {\n                    if (!n) {\n                        var t = j.getEventPosition(event);\n                        if ((p.distanceTo(t) < this.minDragDistance)) {\n                            return\n                        };\n                        n = true;\n                        if ((this.inform(\"start\", event) === false)) {\n                            n = false;\n                            return;\n                        }\n                    ;\n                    }\n                ;\n                    this.inform(\"update\", event);\n                }.bind(this),\n                mouseup: function(event) {\n                    for (var t in s) {\n                        s[t].remove();;\n                    };\n                    if (n) {\n                        this.inform(\"end\", event);\n                    }\n                     else this.inform(\"click\", event);\n                ;\n                }.bind(this)\n            });\n            (o && 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\", [\"Event\",\"DOM\",\"Input\",\"Style\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"DOM\"), i = b(\"Input\"), j = b(\"Style\");\n    function k(event) {\n        var l = 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        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                    if (((t >= 1470) && (t <= 1920))) {\n                        j.set(l, \"direction\", \"rtl\");\n                        return;\n                    }\n                ;\n                    if ((q == 5)) {\n                        j.set(l, \"direction\", \"ltr\");\n                        return;\n                    }\n                ;\n                }\n                 else r = true;\n            ;\n            };\n        }\n         else if ((o.length === 0)) {\n            j.set(l, \"direction\", \"\");\n        }\n    ;\n    };\n    g.listen(document.documentElement, {\n        keyup: k,\n        input: k\n    });\n});\n__d(\"PlaceholderOnsubmitFormListener\", [\"Event\",\"Input\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"Input\");\n    g.listen(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__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(document.body, j);\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(document.body, k);\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    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        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.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             else n.no_script_path = 1;\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        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    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        if (!x) {\n            y.style.minHeight = \"600px\";\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        k.empty(y);\n    };\n    function u(w, x) {\n        var y = r(w);\n        if ((y && !x)) {\n            y.style.minHeight = \"100px\";\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    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            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            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            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.location, o(w.redirect).removeQueryData(x), true);\n                }\n                 else {\n                    var y = a.PageTransitions;\n                    y.go(w.redirect, true);\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            if (!x) {\n                return true\n            };\n            if ((this._redirect(x) || !this._versionCheck(x))) {\n                return false\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        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            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            if (x) {\n                if ((((\"content\" in x.content) && (this._canvas_id !== null)) && (this._canvas_id != \"content\"))) {\n                    x.content[this._canvas_id] = x.content.content;\n                    delete x.content.content;\n                }\n            ;\n                this.pipe.onPageletArrive(x);\n            }\n        ;\n            if (w.is_last) {\n                u(this._canvas_id, this._constHeight);\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            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        setNectarImpressionId: function() {\n            if ((this.method == \"POST\")) {\n                h.addImpressionID(this.data);\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    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            if (!n) {\n                j.className = k;\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    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.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            document.body.appendChild(q);\n            var r = p.offsetWidth;\n            q.style.overflow = \"scroll\";\n            var s = p.offsetWidth;\n            if ((r == s)) {\n                s = q.clientWidth;\n            };\n            document.body.removeChild(q);\n            o._scrollbarSize = (r - s);\n        },\n        getScrollbarSize: function() {\n            if ((o._scrollbarSize === null)) {\n                o._initScrollbarSize();\n            };\n            return o._scrollbarSize;\n        },\n        scrollTo: function(p, q, r, s, t) {\n            if (((typeof q == \"undefined\") || (q === true))) {\n                q = 750;\n            };\n            if (n()) {\n                q = false;\n            };\n            if (!((p instanceof k))) {\n                var u = k.getScrollPosition().x, v = k.getElementPosition(m(p)).y;\n                p = new k(u, v, \"document\");\n                if (!s) {\n                    p.y -= (l.getTop() / ((r ? 2 : 1)));\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            p = p.convertTo(\"document\");\n            if (q) {\n                return new g(document.body).to(\"scrollTop\", p.y).to(\"scrollLeft\", p.x).ease(g.ease.end).duration(q).ondone(t).go();\n            }\n             else if (window.scrollTo) {\n                window.scrollTo(p.x, p.y);\n                (t && t());\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            p = m(p);\n            if (q) {\n                p = j.find(p, q);\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.scrollTo(new k(u, x, \"document\"), s, false, false, t);\n            }\n             else if ((y > w)) {\n                if (((x - ((y - w))) < v)) {\n                    o.scrollTo(new k(u, x, \"document\"), s, false, false, t);\n                }\n                 else o.scrollTo(new k(u, y, \"document\"), s, false, true, t);\n            \n            }\n        ;\n        },\n        scrollToTop: function(p) {\n            var q = k.getScrollPosition();\n            o.scrollTo(new k(q.x, 0, \"document\"), (p !== false));\n        }\n    };\n    e.exports = o;\n});\n__d(\"Button\", [\"CSS\",\"DataStore\",\"DOM\",\"Event\",\"Parent\",\"cx\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSS\"), h = b(\"DataStore\"), i = b(\"DOM\"), j = b(\"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         else if (!ca) {\n            h.set(aa, r, j.listen(aa, \"click\", m.thatReturnsFalse, j.Priority.URGENT));\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        return ba;\n    };\n    function w(aa) {\n        return i.isNodeOfType(aa, \"a\");\n    };\n    function x(aa) {\n        return i.isNodeOfType(aa, \"button\");\n    };\n    function y(aa) {\n        return g.hasClass(aa, \"_42ft\");\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            return (x(aa) ? aa : i.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                    if ((!ea && ga)) {\n                        aa.setAttribute(\"ajaxify\", ga);\n                    };\n                    aa.removeAttribute(\"tabIndex\");\n                }\n                 else {\n                    if ((da && (da !== fa))) {\n                        h.set(aa, s, da);\n                    };\n                    if ((ea && (ea !== ga))) {\n                        h.set(aa, t, ea);\n                    };\n                    aa.removeAttribute(\"href\");\n                    aa.removeAttribute(\"ajaxify\");\n                    aa.setAttribute(\"tabIndex\", \"-1\");\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        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                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                i.setContent(aa, ca);\n            }\n             else if (w(aa)) {\n                var ea = i.find(aa, \"span.uiButtonText\");\n                i.setContent(ea, ba);\n            }\n             else z.getInputElement(aa).value = ba;\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            aa = v(aa);\n            var ca = i.scry(aa, \".img\")[0];\n            if (!ba) {\n                (ca && i.remove(ca));\n                return;\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    e.exports = z;\n});\n__d(\"Form\", [\"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(\"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 = (\"FileList\" in window), v = (\"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        return z;\n    };\n    var x = {\n        getInputs: function(y) {\n            y = (y || 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.name];\n                z[aa.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        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            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                        aa.disabled = z;\n                    }\n                     else if ((ba !== true)) {\n                        aa.disabled = false;\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            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            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            }).setFinallyHandler(x.setDisabled.curry(y, false)).send();\n        },\n        forEachValue: function(y, z, aa) {\n            x.getElements(y).forEach(function(ba) {\n                if (((ba.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.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.name, ea.value);\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.name, fa.item(ga));;\n                        };\n                    }\n                    \n                    \n                \n                };\n            });\n            if (((((z && z.name) && (z.type === \"submit\")) && m.contains(y, z)) && m.isNodeOfType(z, [\"input\",\"button\",]))) {\n                aa(\"submit\", z.name, z.value);\n            };\n        },\n        createFormData: function(y, z) {\n            if (!v) {\n                return null\n            };\n            var aa = new 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                    for (var ca in ba) {\n                        aa.append(ca, ba[ca]);;\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                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                var ea = 0;\n                if ((ca[2] === \"\")) {\n                    while ((y[ca[1]][ea] !== undefined)) {\n                        ea++;;\n                    };\n                }\n                 else ea = ca[2];\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             else y[z] = aa;\n        ;\n        },\n        _serializeFix: function(y) {\n            for (var z in y) {\n                if ((y[z] instanceof Object)) {\n                    y[z] = x._serializeFix(y[z]);\n                };\n            };\n            var aa = Object.keys(y);\n            if (((aa.length === 0) || aa.some(isNaN))) {\n                return y\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            return y;\n        },\n        post: function(y, z, aa) {\n            var ba = 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            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            for (var da in ca) {\n                if ((ca[da] === null)) {\n                    continue;\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                        name: da,\n                        value: ca[da]\n                    });\n                    aa[da] = ea;\n                    z.appendChild(ea);\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                    } catch (ea) {\n                    \n                    };\n                };\n            };\n            return null;\n        },\n        focusFirst: function(y) {\n            var z = x.getFirstElement(y);\n            if (z) {\n                z.focus();\n                return true;\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(document.body, \"direction\")));\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 || document.body);\n        var k = [];\n        while ((i && (i !== j))) {\n            k.push(i);\n            i = i.parentNode;\n        };\n        if ((i !== j)) {\n            return 0\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        return 0;\n    };\n    e.exports = h;\n});\n__d(\"Dialog\", [\"Animation\",\"Arbiter\",\"AsyncRequest\",\"Bootloader\",\"Button\",\"ContextualThing\",\"CSS\",\"DOM\",\"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(\"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 = document.body, ma = document.createElement(\"div\"), na = document.createElement(\"div\");\n        la.insertBefore(ma, la.firstChild);\n        la.insertBefore(na, la.firstChild);\n        ma.style.position = \"fixed\";\n        ma.style.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        ka._init();\n    };\n    ba(ka, {\n        OK: {\n            name: \"ok\",\n            label: \"Okay\"\n        },\n        CANCEL: {\n            name: \"cancel\",\n            label: \"Cancel\",\n            className: \"inputaux\"\n        },\n        CLOSE: {\n            name: \"close\",\n            label: \"Close\"\n        },\n        NEXT: {\n            name: \"next\",\n            label: \"Next\"\n        },\n        SAVE: {\n            name: \"save\",\n            label: \"Save\"\n        },\n        SUBMIT: {\n            name: \"submit\",\n            label: \"Submit\"\n        },\n        CONFIRM: {\n            name: \"confirm\",\n            label: \"Confirm\"\n        },\n        DELETE: {\n            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                name: la,\n                label: ma\n            };\n            if (na) {\n                pa.className = na;\n            };\n            if (oa) {\n                pa.handler = oa;\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            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        _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(document.documentElement, \"keydown\", function(event) {\n                if (((o.getKeyCode(event) == s.ESC) && !event.getModifiers().any)) {\n                    if (ka._escape()) {\n                        event.kill();\n                    };\n                }\n                 else if (((o.getKeyCode(event) == s.RETURN) && !event.getModifiers().any)) {\n                    if (ka._enter()) {\n                        event.kill();\n                    }\n                }\n            ;\n            });\n            o.listen(window, \"resize\", function(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].name == ma)) {\n                        return la[na]\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        _escape: function() {\n            var la = ka.getCurrent();\n            if (!la) {\n                return false\n            };\n            var ma = la._semi_modal, na = la._buttons;\n            if ((!na.length && !ma)) {\n                return false\n            };\n            if ((ma && !na.length)) {\n                la.hide();\n                return true;\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            if ((document.activeElement != la._frame)) {\n                return false\n            };\n            var ma = la._buttons;\n            if (!ma) {\n                return false\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            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            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             else this._update();\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            this._showing = false;\n            if (this._autohide_timeout) {\n                clearTimeout(this._autohide_timeout);\n                this._autohide_timeout = null;\n            }\n        ;\n            if ((this._fade_enabled && (ka._stack.length <= 1))) {\n                this._fadeOut();\n            }\n             else this._hide();\n        ;\n            return this;\n        },\n        cancel: function() {\n            if ((!this._cancelHandler || (this._cancelHandler() !== false))) {\n                this.hide();\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            if ((!la || !la.name)) {\n                return null\n            };\n            var ma = n.scry(this._popup, \"input\"), na = function(oa) {\n                return (oa.name == la.name);\n            };\n            return (ma.filter(na)[0] || null);\n        },\n        getContentNode: function() {\n            return n.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.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.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 = setTimeout(ha(this.hide, this), la);\n                }\n                 else this._autohide = la;\n            ;\n            }\n             else {\n                this._autohide = null;\n                if (this._autohide_timeout) {\n                    clearTimeout(this._autohide_timeout);\n                    this._autohide_timeout = null;\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            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            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                        name: (na.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                        if (m.hasClass(sa, \"uiButtonSpecial\")) {\n                            m.removeClass(sa, \"uiButtonConfirm\");\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                    if (na.disabled) {\n                        k.setEnabled(sa, false);\n                    };\n                    o.listen(ra, \"click\", this._handleButton.bind(this, na.name));\n                    for (var ta in na) {\n                        if (((ta.indexOf(\"data-\") === 0) && (ta.length > 5))) {\n                            ra.setAttribute(ta, na[ta]);\n                        };\n                    };\n                    pa.push(sa);\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(event) {\n                    var na = event.getTarget();\n                    if ((na && (na.id === this._clickOnEnterTarget))) {\n                        if ((o.getKeyCode(event) == s.RETURN)) {\n                            this._handleButton(ma);\n                            event.kill();\n                        }\n                    \n                    };\n                    return true;\n                }.bind(this));\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            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            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                }.bind(this));\n            }\n             else (this._semiModalListener && this._semiModalListener.remove());\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            var ma = n.find(this._popup, \"h2.dialog_title\");\n            if (ma) {\n                m.conditionClass(ma, \"loading\", la);\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                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                this._async_request = null;\n                var va = ua.getPayload(), wa = va;\n                if (this._loading) {\n                    this._showing = true;\n                };\n                if ((typeof wa == \"string\")) {\n                    this.setBody(wa);\n                }\n                 else this._setFromModel(wa);\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            }.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            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            if ((la instanceof r)) {\n                la.setDeferred(true);\n            };\n            return la;\n        },\n        _update: function() {\n            if (!this._showing) {\n                return\n            };\n            if (((this._autohide && !this._async_request) && !this._autohide_timeout)) {\n                this._autohide_timeout = setTimeout(aa(this, \"hide\"), this._autohide);\n            };\n            m.removeClass(this._frame, \"dialog_loading_shown\");\n            this._loading = false;\n            this._renderDialog();\n            this._runOnloads();\n            this._previous_focus = 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            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            if (this._content_width) {\n                la += this._content_width;\n                if (!this._full_bleed) {\n                    la += (2 * ka._PADDING_WIDTH);\n                };\n            }\n             else if (this._wide_dialog) {\n                la += ka.SIZE.WIDE;\n            }\n             else la += ka.SIZE.STANDARD;\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                this._hasSetZIndex = (la > ((this._modal ? 400 : 200)));\n                w.set(this._obj, \"z-index\", (this._hasSetZIndex ? la : \"\"));\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            clearInterval(this.active_hiding);\n            this.active_hiding = 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            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(document.body, this._obj);\n            if (!this._popup) {\n                this._popup = n.create(\"div\", {\n                    className: \"generic_dialog_popup\"\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            m.addClass(this._obj, \"pop_dialog\");\n            if (t.isRTL()) {\n                m.addClass(this._obj, \"pop_dialog_rtl\");\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.setContent(this._popup, r(la));\n            var ma = n.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                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        resetDialogPosition: function() {\n            if (!this._popup) {\n                return\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            var wa = ja();\n            if (!wa) {\n                ta += z.getScrollPosition().y;\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(document.documentElement, \"generic_dialog_overflow_mode\", xa);\n        },\n        _fadeOut: function(la) {\n            if (!this._popup) {\n                return\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        _hide: function(la) {\n            if (this._obj) {\n                this._obj.style.display = \"none\";\n            };\n            m.removeClass(document.documentElement, \"generic_dialog_overflow_mode\");\n            this._updateShim();\n            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            if (((this._previous_focus && document.activeElement) && n.contains(this._obj, document.activeElement))) {\n                p.set(this._previous_focus);\n            };\n            if (la) {\n                return\n            };\n            this.destroy();\n        },\n        destroy: function() {\n            this._popFromStack();\n            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            (this._clickOnEnterListener && this._clickOnEnterListener.remove());\n            if (this._close_handler) {\n                this._close_handler({\n                    return_data: this._return_data\n                });\n            };\n        },\n        _handleButton: function(la) {\n            if ((typeof la == \"string\")) {\n                la = ka._findButton(this._buttons, la);\n            };\n            var ma = ka.call_or_eval(la, la.handler);\n            if ((ma === false)) {\n                return\n            };\n            if ((la.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        _submitForm: function(la, ma, na) {\n            var oa = this.getFormData();\n            if (na) {\n                oa[na.name] = na.label;\n            };\n            if (this._extra_data) {\n                ba(oa, this._extra_data);\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            for (var na in ma) {\n                if ((na == \"onloadRegister\")) {\n                    this.onloadRegister(ma[na]);\n                    continue;\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        _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            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        _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             else h.inform(\"layer_hidden\", {\n                type: \"Dialog\"\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    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, event) {\n            if (h.hasClass(event.getTarget(), \"_s\")) {\n                this._layer.hide();\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 = 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         else {\n            clearInterval(m);\n            m = null;\n            q();\n        }\n    ;\n    };\n    function p(s) {\n        document.title = s;\n        n = true;\n    };\n    function q() {\n        r.set((i || h), true);\n        n = false;\n    };\n    var r = {\n        get: function() {\n            return h;\n        },\n        set: function(s, t) {\n            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        blink: function(s) {\n            var t = {\n                title: s\n            };\n            k.push(t);\n            if ((m === null)) {\n                m = setInterval(o, j);\n            };\n            return {\n                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    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    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            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.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            return this;\n        },\n        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            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            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        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            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            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    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        var o, p, q;\n        function r() {\n            p = Date.now();\n            if (o) {\n                j.apply(l, o);\n                o = null;\n                q = setTimeout(r, k, !m);\n            }\n             else q = false;\n        ;\n        };\n        return function s() {\n            o = arguments;\n            if ((!q || (((Date.now() - p) > k)))) {\n                if (n) {\n                    r();\n                }\n                 else q = setTimeout(r, 0, !m);\n            \n            };\n        };\n    };\n    e.exports = h;\n});\n__d(\"FullScreen\", [\"Event\",\"Arbiter\",\"CSS\",\"UserAgent\",\"copyProperties\",\"throttle\",], function(a, b, c, d, e, f) {\n    var g = b(\"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        enableFullScreen: function(p) {\n            this.listenForEvent(p);\n            if (p.webkitRequestFullScreen) {\n                if (j.chrome()) {\n                    p.webkitRequestFullScreen(Element.ALLOW_KEYBOARD_INPUT);\n                }\n                 else p.webkitRequestFullScreen();\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 (document.webkitCancelFullScreen) {\n                document.webkitCancelFullScreen();\n            }\n             else if (document.mozCancelFullScreen) {\n                document.mozCancelFullScreen();\n            }\n             else if (document.cancelFullScreen) {\n                document.cancelFullScreen();\n            }\n             else if (document.exitFullScreen) {\n                document.exitFullScreen();\n            }\n             else return false\n            \n            \n            \n        ;\n            return true;\n        },\n        isFullScreen: function() {\n            return (((document.webkitIsFullScreen || document.fullScreen) || 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(document.body, \"fullScreen\", p);\n            this.inform(\"changed\");\n        },\n        isSupported: function() {\n            return (((((document.webkitCancelFullScreen && j.chrome())) || document.mozCancelFullScreen) || document.cancelFullScreen) || document.exitFullScreen);\n        }\n    }), o = l(n.onChange, 0, n);\n    g.listen(document, {\n        webkitfullscreenchange: o,\n        mozfullscreenchange: o,\n        fullscreenchange: o\n    });\n    e.exports = n;\n});\n__d(\"HistoryManager\", [\"Event\",\"function-extensions\",\"Cookie\",\"Env\",\"URI\",\"UserAgent\",\"copyProperties\",\"emptyFunction\",\"goOrReplace\",], function(a, b, c, d, e, f) {\n    var g = b(\"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        history: null,\n        current: 0,\n        fragment: null,\n        _setIframeSrcFragment: function(p) {\n            p = p.toString();\n            var q = (o.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.document.location.href).getFragment());\n        },\n        nextframe: function(p, q) {\n            if (q) {\n                o._setIframeSrcFragment(p);\n                return;\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            if ((o.iframeQueue.length && !o.iframeTimeout)) {\n                var r = o.iframeQueue[0];\n                o.iframeTimeout = setTimeout(function() {\n                    o._setIframeSrcFragment(r);\n                }, 100, false);\n            }\n        ;\n        },\n        isInitialized: function() {\n            return !!o._initialized;\n        },\n        init: function() {\n            if ((!i.ALLOW_TRANSITION_IN_IFRAME && (window != window.top))) {\n                return\n            };\n            if (o._initialized) {\n                return o\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            if ((j.getRequestURI(false).getProtocol().toLowerCase() == \"https\")) {\n                o._IFRAME_BASE_URI = \"https://s-static.ak.facebook.com/common/history_manager.php\";\n            };\n            l(o, {\n                _initialized: true,\n                fragment: q,\n                orig_fragment: q,\n                history: [p,],\n                callbacks: [],\n                lastChanged: 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.history && history.pushState)) {\n                this.lastURI = document.URL;\n                window.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 = Date.now();\n                        o.notify(j(r.state).getUnqualifiedURI().toString());\n                    }\n                ;\n                }.bind(o));\n                if (((k.webkit() < 534) || (k.chrome() <= 13))) {\n                    setInterval(o.checkURI, 42, false);\n                    o._updateRefererURI(this.lastURI);\n                }\n            ;\n                return o;\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            if ((k.ie() < 8)) {\n                o.iframe = document.createElement(\"iframe\");\n                l(o.iframe.style, {\n                    width: \"0\",\n                    height: \"0\",\n                    frameborder: \"0\",\n                    left: \"0\",\n                    top: \"0\",\n                    position: \"absolute\"\n                });\n                o._setIframeSrcFragment(q);\n                document.body.insertBefore(o.iframe, document.body.firstChild);\n            }\n             else if ((\"onhashchange\" in window)) {\n                g.listen(window, \"hashchange\", function() {\n                    o.checkURI.bind(o).defer();\n                });\n            }\n             else setInterval(o.checkURI, 42, false);\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            for (var q = 0; (q < o.callbacks.length); q++) {\n                try {\n                    if (o.callbacks[q](p)) {\n                        return true\n                    };\n                } catch (r) {\n                \n                };\n            };\n            return false;\n        },\n        checkURI: function() {\n            if (((Date.now() - o.lastChanged) < 400)) {\n                return\n            };\n            if ((window.history && history.pushState)) {\n                var p = j(document.URL).removeQueryData(\"ref\").toString(), q = j(o.lastURI).removeQueryData(\"ref\").toString();\n                if ((p != q)) {\n                    o.lastChanged = Date.now();\n                    o.lastURI = p;\n                    if ((k.webkit() < 534)) {\n                        o._updateRefererURI(p);\n                    };\n                    o.notify(j(p).getUnqualifiedURI().toString());\n                }\n            ;\n                return;\n            }\n        ;\n            if (((k.ie() < 8) && o.iframeQueue.length)) {\n                return\n            };\n            if ((k.webkit() && (window.history.length == 200))) {\n                if (!o.warned) {\n                    o.warned = true;\n                };\n                return;\n            }\n        ;\n            var r = j().getFragment();\n            if ((r.charAt(0) == \"!\")) {\n                r = r.substr(1);\n            };\n            if ((k.ie() < 8)) {\n                r = o.getIframeSrcFragment();\n            };\n            r = r.replace(/%23/g, \"#\");\n            if ((r != o.fragment.replace(/%23/g, \"#\"))) {\n                o.debug([r,\" vs \",o.fragment,\"whl: \",window.history.length,\"QHL: \",o.history.length,].join(\" \"));\n                for (var s = (o.history.length - 1); (s >= 0); --s) {\n                    if ((o.history[s].getFragment().replace(/%23/g, \"#\") == r)) {\n                        break;\n                    };\n                };\n                ++o.user;\n                if ((s >= 0)) {\n                    o.go((s - o.current));\n                }\n                 else o.go((\"#\" + r));\n            ;\n                --o.user;\n            }\n        ;\n        },\n        _updateRefererURI: function(p) {\n            p = p.toString();\n            if (((p.charAt(0) != \"/\") && (p.indexOf(\"//\") == -1))) {\n                return\n            };\n            var q = new j(window.location);\n            if (q.isFacebookURI()) {\n                var r = (q.getPath() + window.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            h.set(\"x-referer\", s);\n        },\n        go: function(p, q, r) {\n            if ((window.history && history.pushState)) {\n                (q || (typeof (p) == \"number\"));\n                var s = j(p).removeQueryData(\"ref\").toString();\n                o.lastChanged = Date.now();\n                this.lastURI = s;\n                if (r) {\n                    window.history.replaceState(p, null, s);\n                }\n                 else window.history.pushState(p, null, s);\n            ;\n                if ((k.webkit() < 534)) {\n                    o._updateRefererURI(p);\n                };\n                return false;\n            }\n        ;\n            o.debug((\"go: \" + p));\n            if ((q === undefined)) {\n                q = true;\n            };\n            if (!o.enabled) {\n                if (!q) {\n                    return false\n                }\n            };\n            if ((typeof (p) == \"number\")) {\n                if (!p) {\n                    return false\n                };\n                var t = (p + o.current), u = Math.max(0, Math.min((o.history.length - 1), t));\n                o.current = u;\n                t = (o.history[u].getFragment() || o.orig_fragment);\n                t = j(t).removeQueryData(\"ref\").getUnqualifiedURI().toString();\n                o.fragment = t;\n                o.lastChanged = Date.now();\n                if ((k.ie() < 8)) {\n                    if (o.fragmentTimeout) {\n                        clearTimeout(o.fragmentTimeout);\n                    };\n                    o._temporary_fragment = t;\n                    o.fragmentTimeout = setTimeout(function() {\n                        window.location.hash = (\"#!\" + t);\n                        delete o._temporary_fragment;\n                    }, 750, false);\n                    if (!o.user) {\n                        o.nextframe(t, r);\n                    };\n                }\n                 else if (!o.user) {\n                    n(window.location, ((window.location.href.split(\"#\")[0] + \"#!\") + t), r);\n                }\n            ;\n                if (q) {\n                    o.notify(t);\n                };\n                o._updateRefererURI(t);\n                return false;\n            }\n        ;\n            p = j(p);\n            if ((p.getDomain() == j().getDomain())) {\n                p = j((\"#\" + p.getUnqualifiedURI()));\n            };\n            var v = o.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                o._updateRefererURI(w);\n                return false;\n            }\n        ;\n            if (r) {\n                o.current--;\n            };\n            var x = (((o.history.length - o.current)) - 1);\n            o.history.splice((o.current + 1), x);\n            o.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 (!document.selection) {\n                return {\n                    start: j.selectionStart,\n                    end: j.selectionEnd\n                }\n            };\n            var k = document.selection.createRange();\n            if ((k.parentElement() !== j)) {\n                return {\n                    start: 0,\n                    end: 0\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        set: function(j, k, l) {\n            if ((typeof l == \"undefined\")) {\n                l = k;\n            };\n            if (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                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    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 = \"iframe\";\n    function q(s) {\n        delete m[s];\n    };\n    function r(s, t) {\n        this._type = s;\n        this._uri = t;\n        m[this.getID()] = this;\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                if ((v._type == p)) {\n                    t = JSON.parse(JSON.stringify(t));\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    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            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(document.body, t)[0];\n        },\n        send: function() {\n            if ((this._type === o)) {\n                (function() {\n                    h.appendContent(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        handleResponse: function(s) {\n            this.inform(\"response\", s);\n            if (this.hasFinished()) {\n                this._cleanup.bind(this).defer();\n            };\n        },\n        abort: function() {\n            if (this._aborted) {\n                return\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    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\",\"iframe\",\"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            if ((!n && m)) {\n                n = m.children;\n                delete m.children;\n            }\n        ;\n            if (n) {\n                n = (Array.isArray(n) ? h(n) : h([n,]));\n            };\n            return g.create(k, m, n);\n        };\n        j[k] = l;\n    });\n    e.exports = j;\n});\n__d(\"LinkController\", [\"Event\",\"DataStore\",\"Parent\",\"trackReferrer\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"DataStore\"), i = b(\"Parent\"), j = b(\"trackReferrer\"), k = \"LinkControllerHandler\", l = [], m = [];\n    function n(event) {\n        var r = i.byTag(event.getTarget(), \"a\"), s = (r && r.getAttribute(\"href\", 2));\n        if ((((!s || r.rel) || !p(s)) || h.get(r, k))) {\n            return\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            j(r, s);\n            o(r, u);\n        });\n        h.set(r, k, t);\n    };\n    function o(r, event) {\n        if ((((r.target || r.rel) || event.getModifiers().any) || ((event.which && (event.which != 1))))) {\n            return\n        };\n        var s = l.concat(m);\n        for (var t = 0, u = s.length; (t < u); t++) {\n            if ((s[t](r, event) === false)) {\n                return event.prevent()\n            };\n        };\n    };\n    function p(r) {\n        var s = r.match(/^(\\w+):/);\n        return (!s || s[1].match(/^http/i));\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(document.documentElement, \"mousedown\", n);\n    g.listen(document.documentElement, \"keydown\", n);\n    e.exports = q;\n});\n__d(\"MenuDeprecated\", [\"Event\",\"Arbiter\",\"CSS\",\"DataStore\",\"DOM\",\"HTML\",\"Keys\",\"Parent\",\"Style\",\"UserAgent\",\"copyProperties\",\"emptyFunction\",\"Run\",], function(a, b, c, d, e, f) {\n    var g = b(\"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        return n.byClass(ea, \"uiMenu\");\n    };\n    function v(ea) {\n        return n.byClass(ea, \"uiMenuItem\");\n    };\n    function w(ea) {\n        if (document.activeElement) {\n            var fa = v(document.activeElement);\n            return ea.indexOf(fa);\n        }\n    ;\n        return -1;\n    };\n    function x(ea) {\n        return k.find(ea, \"a.itemAnchor\");\n    };\n    function y(ea) {\n        return i.hasClass(ea, \"checked\");\n    };\n    function z(ea) {\n        return (!i.hasClass(ea, \"disabled\") && (o.get(ea, \"display\") !== \"none\"));\n    };\n    function aa(event) {\n        var ea = document.activeElement;\n        if (((!ea || !n.byClass(ea, \"uiMenu\")) || !k.isInputNode(ea))) {\n            var fa = v(event.getTarget());\n            (fa && da.focusItem(fa));\n        }\n    ;\n    };\n    function ba(ea) {\n        (p.firefox() && x(ea).blur());\n        da.inform(\"select\", {\n            menu: u(ea),\n            item: ea\n        });\n    };\n    var ca = function() {\n        ca = r;\n        var ea = {\n        };\n        ea.click = function(event) {\n            var fa = v(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        ea.keydown = function(event) {\n            var fa = event.getTarget();\n            if (event.getModifiers().any) {\n                return\n            };\n            if ((!t || k.isInputNode(fa))) {\n                return\n            };\n            var ga = g.getKeyCode(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                    event.prevent();\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        g.listen(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).focus();\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            if ((fa !== false)) {\n                t = ea;\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.find(ea, \"a\").className + \" disabledAnchor\")\n                }, l(x(ea).innerHTML)));\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        return null;\n    };\n    e.exports = g;\n});\n__d(\"OnVisible\", [\"Arbiter\",\"DOM\",\"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(\"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        s = 0;\n        q.length = 0;\n    };\n    function aa() {\n        if (!q.length) {\n            z();\n            return;\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            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        s = fa;\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            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            if ((ga.inverse ? !ia : ia)) {\n                ga.remove();\n                ga.handler((t.indexOf(fa) !== -1));\n            }\n        ;\n        };\n    };\n    function ca() {\n        da();\n        if (q.length) {\n            return\n        };\n        v = i.listen(window, \"scroll\", da);\n        u = i.listen(window, \"resize\", da);\n        r = g.subscribe(\"dom-scroll\", da);\n    };\n    function da() {\n        p(aa, ba, \"OnVisible/positionCheck\");\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.find(ka, \".uiScrollableAreaWrap\"), \"scroll\", this.checkBuffer);\n        };\n        if ((q.length === 0)) {\n            k.onLeave(z);\n        };\n        ca();\n        q.push(this);\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        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(\"onloadhooks\");\n        if ((!window.loaded && r)) {\n            r.getInstance().setTimeStamp(\"t_hooks\");\n        };\n        window.loaded = true;\n        g.inform(\"uipage_onload\", true, g.BEHAVIOR_STATE);\n    };\n    function l() {\n        n(\"onafterloadhooks\");\n        window.afterloaded = true;\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    function n(r) {\n        var s = (((r == \"onbeforeleavehooks\")) || ((r == \"onbeforeunloadhooks\")));\n        do {\n            var t = window[r];\n            if (!t) {\n                break;\n            };\n            if (!s) {\n                window[r] = null;\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        } while ((!s && window[r]));\n    };\n    function o() {\n        if (!window.loaded) {\n            window.loaded = true;\n            n(\"onloadhooks\");\n        }\n    ;\n        if (!window.afterloaded) {\n            window.afterloaded = true;\n            n(\"onafterloadhooks\");\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        }, g.SUBSCRIBE_NEW);\n        g.subscribe(j.ONUNLOAD, function(r, s) {\n            n(\"onunloadhooks\");\n            n(\"onafterunloadhooks\");\n        }, g.SUBSCRIBE_NEW);\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        if (((k == null) || (l == null))) {\n            return false\n        };\n        if (((typeof k != \"object\") || (typeof l != \"object\"))) {\n            return false\n        };\n        var o = Object.prototype.toString, p = o.call(k);\n        if ((p != o.call(l))) {\n            return false\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        var q = m.length;\n        while (q--) {\n            if ((m[q] == k)) {\n                return (n[q] == l)\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            while (r--) {\n                if (!g(k[r], l[r], m, n)) {\n                    return false\n                };\n            };\n        }\n         else {\n            if ((k.constructor !== l.constructor)) {\n                return false\n            };\n            if ((k.hasOwnProperty(\"valueOf\") && l.hasOwnProperty(\"valueOf\"))) {\n                return (k.valueOf() == l.valueOf())\n            };\n            var s = Object.keys(k);\n            if ((s.length != Object.keys(l).length)) {\n                return false\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        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        if ((l.charAt(0) == \"/\")) {\n            return l\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                 else m.push(n);\n            \n            };\n        });\n        return m.join(\"/\");\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        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            if (!h(l[(\"get\" + q)]())) {\n                o = l;\n            };\n            if (!r) {\n                m[(\"set\" + q)](o[(\"get\" + q)]());\n            };\n        });\n        return m;\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        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    e.exports = g;\n});\n__d(\"PageTransitions\", [\"Arbiter\",\"Dialog\",\"DOMQuery\",\"DOMScroll\",\"Env\",\"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(\"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    function ja(ta) {\n        return ha[ta.getUnqualifiedURI()];\n    };\n    function ka(ta) {\n        delete ha[ta.getUnqualifiedURI()];\n    };\n    var la = null, ma = null;\n    function na(ta) {\n        ma = ta;\n        da(function() {\n            ma = null;\n        }, 0);\n    };\n    function oa(event) {\n        if (ma) {\n            if (!event.isDefaultPrevented()) {\n                pa(ma);\n                sa.lookBusy(ma);\n                ra.go(ma.getAttribute(\"href\"));\n            }\n        ;\n            event.prevent();\n        }\n         else {\n            la = event.getTarget();\n            da(function() {\n                la = null;\n            }, 0);\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    function qa(event) {\n        var ta = event.getTarget();\n        if ((m.getAttribute(ta, \"rel\") || m.getAttribute(ta, \"target\"))) {\n            return\n        };\n        w(\"form\", ta, event).set_namespace(\"page_transition\");\n        var ua = ga(\"page_transitions\", ta, event, {\n            mode: \"DEDUP\"\n        }).uai_fallback(null, \"form\"), va = a.ArbiterMonitor;\n        if (va) {\n            va.initUA(ua, [ta,]);\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.name)) {\n                ya[za.name] = za.value;\n            };\n            ra.go(xa.addQueryData(ya));\n            event.kill();\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            if ((!k.ALLOW_TRANSITION_IN_IFRAME && (window != window.top))) {\n                return\n            };\n            if (ra._initialized) {\n                return ra\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            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.init().setCanonicalLocation((\"#\" + xa)).registerURIHandler(ra._historyManagerHandler);\n            p.registerFallbackHandler(na);\n            l.listen(document, \"click\", oa, l.Priority._BUBBLE);\n            l.listen(document, \"submit\", qa, l.Priority._BUBBLE);\n            l.listen(window, \"scroll\", function() {\n                if (!ra._scroll_locked) {\n                    ia(ra._current_uri, u.getScrollPosition());\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            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            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.location, va, ua);\n            ;\n            });\n        },\n        _historyManagerHandler: function(ta) {\n            if ((ta.charAt(0) != \"/\")) {\n                return false\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.location, ta, true);\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            var va;\n            if (ra._current_uri) {\n                va = ja(ra._current_uri);\n            };\n            ra._current_uri = null;\n            ra._next_uri = ta;\n            if (va) {\n                j.scrollTo(va, false);\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        _handleTransition: function(ta) {\n            window.onbeforeleavehooks = undefined;\n            sa.lookBusy();\n            if (!ta.isSameOrigin()) {\n                return false\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                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                        return true;\n                    }\n                     else wa.splice(xa, 1);\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            try {\n                if ((document.activeElement && (document.activeElement.nodeName === \"A\"))) {\n                    document.activeElement.blur();\n                };\n            } catch (ua) {\n            \n            };\n        },\n        _executeCompletionCallback: function() {\n            if (ra._completionCallback) {\n                ra._completionCallback();\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            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                name: \"leave_page\",\n                label: \"Leave this Page\",\n                handler: ua\n            },{\n                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.scrollTo(ua, false);\n                return true;\n            }\n        ;\n            function va(ya) {\n                if (!ya) {\n                    return null\n                };\n                var za = ((\"a[name='\" + z(ya)) + \"']\");\n                return (i.scry(document.body, za)[0] || aa(ya));\n            };\n            var wa = va(s(ta).getFragment());\n            if (wa) {\n                var xa = u.getElementPosition(wa);\n                xa.x = 0;\n                j.scrollTo(xa);\n                return true;\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            if (sa._looking_busy) {\n                return\n            };\n            sa._looking_busy = true;\n            sa._giveProgressCursor(document.documentElement);\n        },\n        stopLookingBusy: function() {\n            if (!sa._looking_busy) {\n                return\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        _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    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.devicePixelRatio || 1);\n    };\n    function n() {\n        h.set(j, m());\n    };\n    function o() {\n        h.clear(j);\n    };\n    function p() {\n        var r = m();\n        if ((r !== k)) {\n            n();\n        }\n         else o();\n    ;\n    };\n    var q = {\n        startDetecting: function(r) {\n            k = (r || 1);\n            o();\n            if (l) {\n                return\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    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        disable: function() {\n            this._enabled = false;\n        },\n        _subscribe: function() {\n            g.registerHandler(function() {\n                if (this._enabled) {\n                    this._layer.hide();\n                };\n                this._subscribed = false;\n            }.bind(this));\n        }\n    });\n    e.exports = i;\n});\n__d(\"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            if ((k instanceof g)) {\n                return new j(k.y, k.x, k.y, k.x, k.domain)\n            };\n            return j.getElementBounds(h(k));\n        }\n    ;\n        i(this, {\n            t: k,\n            r: l,\n            b: m,\n            l: n,\n            domain: (o || \"pure\")\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                return this.add(k.x, k.y);\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            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            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            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            if ((k == \"pure\")) {\n                return new j(this.t, this.r, this.b, this.l, \"pure\")\n            };\n            if ((this.domain == \"pure\")) {\n                return new j(0, 0, 0, 0)\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            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            } catch (h) {\n                return false;\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    e.exports = g;\n});\n__d(\"ContextualLayer\", [\"Event\",\"Arbiter\",\"ARIA\",\"Class\",\"ContextualThing\",\"CSS\",\"DataStore\",\"DOM\",\"Layer\",\"LayerHideOnTransition\",\"Locale\",\"Parent\",\"Rect\",\"Style\",\"Vector\",\"SVGChecker\",\"arrayContains\",\"copyProperties\",\"emptyFunction\",\"getOverlayZIndex\",\"removeFromArray\",\"throttle\",], function(a, b, c, d, e, f) {\n    var g = b(\"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(\"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    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 === document.body)) {\n                    ka = document.documentElement;\n                }\n                 else ka = da(ka);\n            ;\n            }\n             else return ka\n        ;\n        }\n         else ka = document.documentElement;\n    ;\n        return ka;\n    };\n    function ea(ja, ka) {\n        this.parent.construct(this, ja, ka);\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    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            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            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            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            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                ja = ja.parentNode;\n            };\n            if ((ka === this._parentLayer)) {\n                return\n            };\n            if ((this._parentLayer && this._parentSubscription)) {\n                this._parentLayer.unsubscribe(this._parentSubscription);\n                this._parentSubscription = null;\n            }\n        ;\n            if (ka) {\n                this._parentSubscription = ka.subscribe(\"hide\", this.hide.bind(this));\n            };\n            this._parentLayer = ka;\n        },\n        setPosition: function(ja) {\n            if (this._getOrientation().setDefaultPosition(ja)) {\n                (this._shown && this.updatePosition());\n            };\n            return this;\n        },\n        setAlignment: function(ja) {\n            if (this._getOrientation().setDefaultAlignment(ja)) {\n                (this._shown && this.updatePosition());\n            };\n            return this;\n        },\n        setOffsetX: function(ja) {\n            if (this._getOrientation().setDefaultOffsetX(ja)) {\n                (this._shown && this.updatePosition());\n            };\n            return this;\n        },\n        setOffsetY: function(ja) {\n            if (this._getOrientation().setDefaultOffsetY(ja)) {\n                (this._shown && this.updatePosition());\n            };\n            return this;\n        },\n        _getOrientation: function() {\n            if (!this._orientation) {\n                this._orientation = new ia();\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.find(document, this._contextSelector);\n            };\n            return this._contextNode;\n        },\n        getContextBounds: function(ja) {\n            if (this._contextBounds) {\n                return this._contextBounds.convertTo(ja)\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            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            return this._insertScrollParent;\n        },\n        show: function() {\n            if (this._shown) {\n                return this\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            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            var ka = this.isFixed();\n            if ((!ka && !((ja.offsetParent || ((v.isSVG(ja) && v.isDisplayed(ja))))))) {\n                return false\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            this._updateWrapperPosition(ma);\n            this._updateWrapperClass(ma);\n            l.conditionClass(la, \"uiContextualLayerPositionerFixed\", ka);\n            var na, oa, pa = (ka ? \"viewport\" : \"document\"), qa = (ka ? document.documentElement : da(la));\n            if ((qa === document.documentElement)) {\n                na = new u(0, 0);\n                oa = 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 !== document.body)) {\n                    na = na.sub(new u(qa.scrollLeft, qa.scrollTop));\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            if (((((ma.getPosition() === \"right\") || ((ma.isVertical() && (ma.getAlignment() === \"right\"))))) != wa)) {\n                sa += va;\n            };\n            var xa = ma.getOffsetX();\n            if ((ma.isVertical() && (ma.getAlignment() === \"center\"))) {\n                xa += (((va - this.getContentRoot().offsetWidth)) / 2);\n            };\n            if (wa) {\n                xa *= -1;\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            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 = document.documentElement.clientWidth;\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             else t.set(la, \"width\", ((cb + la.offsetWidth) + \"px\"));\n        ;\n            t.set(la, \"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            if (this._orientationClass) {\n                l.removeClass(this._contentWrapper, this._orientationClass);\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                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                return ma;\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    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             else if ((this._default._alignment !== this._alignment)) {\n                ja *= -1;\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            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\", [\"Event\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"copyProperties\");\n    function i(j) {\n        this._layer = j;\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            this.detach();\n        },\n        attach: function() {\n            if (this._listener) {\n                return\n            };\n            var j = this._layer.getContextScrollParent();\n            if ((j === window)) {\n                return\n            };\n            this._listener = g.listen(j, \"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    e.exports = i;\n});\n__d(\"LayerHideOnEscape\", [\"Event\",\"copyProperties\",\"Keys\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"copyProperties\"), i = b(\"Keys\");\n    function j(k) {\n        this._layer = k;\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, event) {\n            if ((g.getKeyCode(event) === i.ESC)) {\n                this._layer.hide();\n                return false;\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        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        return false;\n    };\n    function j(l) {\n        if (((l.offsetHeight === 0) && (l.offsetWidth === 0))) {\n            return false\n        };\n        while (((l !== document) && (g.get(l, \"visibility\") != \"hidden\"))) {\n            l = l.parentNode;;\n        };\n        return (l === document);\n    };\n    var k = {\n        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\", [\"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(\"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(document.documentElement, \"click\", function(event) {\n            var ga = 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    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                var ka = o.scry(ga, \".uiToggleFlyout\")[0];\n                if (ka) {\n                    var la = (r.find(ka)[0] || ka);\n                    if ((la.tabIndex == -1)) {\n                        la.tabIndex = 0;\n                    };\n                    p.setWithoutOutline(la);\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        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                z(ha.togglers).forEach(n.remove);\n                ha.inform(\"hide\", ha);\n                ha.active = null;\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        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                    onfocus: function() {\n                        var ia = n.scry(ha.active, \"a[rel=\\\"toggle\\\"]\")[0];\n                        (ia && ia.focus());\n                        ha.hide();\n                    }\n                });\n                ha.togglers[ga].setAttribute(\"type\", \"button\");\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            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                if (k.hasClass(ga, \"uiToggleContext\")) {\n                    return da.createInstance(ga)\n                };\n                ga = y(ga);\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        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                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        return da.getInstance(ha);\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    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\", [\"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(\"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    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        this._setupKeyListener();\n        x.setAttribute(\"role\", \"button\");\n        m.set(w, \"Popover\", this);\n    };\n    t(v.prototype, i, {\n        _layer: null,\n        ensureInit: function() {\n            if (!this._layer) {\n                this._init();\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            if (this._config.layer_content) {\n                this._layer.setContent(this._config.layer_content);\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        enable: function() {\n            if (!this._disabled) {\n                return\n            };\n            this._setupClickListener();\n            this._setupKeyListener();\n            this._disabled = false;\n        },\n        disable: function() {\n            if (this._disabled) {\n                return\n            };\n            if (this.isShown()) {\n                this.hideLayer();\n            };\n            while (this._listeners.length) {\n                this._listeners.pop().remove();;\n            };\n            if ((this._triggerElem.getAttribute(\"rel\") === \"toggle\")) {\n                this._triggerElem.removeAttribute(\"rel\");\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(event) {\n            if (event.getModifiers().any) {\n                return\n            };\n            switch (g.getKeyCode(event)) {\n              case p.DOWN:\n            \n              case p.UP:\n                s.bootstrap(this._triggerElem);\n                break;\n              default:\n                return;\n            };\n            event.prevent();\n        }\n    });\n    e.exports = v;\n});\n__d(\"PopoverMenu\", [\"Event\",\"Arbiter\",\"ArbiterMixin\",\"ARIA\",\"BehaviorsMixin\",\"Focus\",\"Keys\",\"KeyStatus\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"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    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            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            this._popoverShown = true;\n        },\n        _onPopoverHide: function() {\n            if (this._menu) {\n                this._menu.onHide();\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            if (r.getModifiers().any) {\n                return\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.blur();\n                    this._menu.handleKeydown(s, r);\n                }\n            ;\n                break;\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.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        _onMenuDone: function(q) {\n            this._popover.hideLayer.bind(this._popover).defer();\n            if (n.isKeyDown()) {\n                l.set(this._triggerElem);\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\", [\"Event\",\"AsyncRequest\",\"Class\",\"PopoverMenu\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"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.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            this._fetchMenu();\n            this._popover.getLayer().subscribe(\"key\", this._handleKeyEvent.bind(this));\n        },\n        _fetchMenu: function() {\n            if (this._fetched) {\n                return\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    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    h(j.prototype, g, {\n        getRoot: i,\n        onShow: i,\n        onHide: i,\n        focusAnItem: i.thatReturnsFalse,\n        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    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        _removeBorderSubscriptions: function() {\n            if (this._showSubscription) {\n                this._popover.unsubscribe(this._showSubscription);\n                this._showSubscription = null;\n            }\n        ;\n            if (this._menuSubscription) {\n                this._menu.unsubscribe(this._menuSubscription);\n                this._menuSubscription = null;\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    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\",\"Rect\",\"Vector\",\"ViewportBounds\",\"ge\",\"getOverlayZIndex\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOM\"), h = b(\"Locale\"), i = b(\"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            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            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             else if ((((p.getPosition() === \"right\")) !== h.isRTL())) {\n                t += u;\n            }\n             else t -= r.x;\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    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        disable: function() {\n            this._subscription.unsubscribe();\n            this._subscription = null;\n            if (this._layer.isShown()) {\n                this._layer.updatePosition();\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            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.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.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            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             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        _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            return n;\n        }\n    });\n    e.exports = l;\n});\n__d(\"Tooltip\", [\"Event\",\"AsyncRequest\",\"ContextualLayer\",\"ContextualLayerAutoFlip\",\"CSS\",\"DataStore\",\"DOM\",\"Style\",\"URI\",\"copyProperties\",\"emptyFunction\",\"cx\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"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    function z(fa) {\n        return p({\n            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    function aa(fa, ga) {\n        var ha = z(fa);\n        l.set(fa, \"tooltip\", {\n            content: (ga.content || ha.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    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    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    var ea = {\n        process: function(fa, ga) {\n            if (!m.contains(fa, ga)) {\n                return\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                ea.show(fa);\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        set: function(fa, ga, ha, ia) {\n            if ((ha || ia)) {\n                aa(fa, {\n                    position: ha,\n                    alignH: ia\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             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                aa(fa, {\n                    content: ga\n                });\n                ((fa === t) && ea.show(fa));\n            }\n        ;\n        },\n        show: function(fa) {\n            y();\n            ea.hide();\n            var ga = z(fa);\n            if (!ga.content) {\n                return\n            };\n            var ha = 0, ia = 0;\n            if (((ga.position === \"left\") || (ga.position === \"right\"))) {\n                x = (x || k.hasClass(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            u.setContext(fa).setOffsetX(ha).setOffsetY(ia).setPosition(ga.position).setAlignment(ga.alignH);\n            if ((typeof ga.content === \"string\")) {\n                k.addClass(u.getRoot(), \"invisible_elem\");\n                var la = m.create(\"span\", {\n                }, da(ga.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                if (!na) {\n                    na = ma.offsetWidth;\n                };\n                if ((na < la.offsetWidth)) {\n                    k.addClass(ma, \"tooltipWrap\");\n                    u.updatePosition();\n                }\n            ;\n                k.removeClass(u.getRoot(), \"invisible_elem\");\n            }\n             else {\n                m.setContent(v, ga.content);\n                u.show();\n            }\n        ;\n            var pa = function(ra) {\n                if (!m.contains(t, ra.getTarget())) {\n                    ea.hide();\n                };\n            };\n            w.push(g.listen(document.documentElement, \"mouseover\", pa), g.listen(document.documentElement, \"focusin\", pa));\n            var qa = n.getScrollParent(fa);\n            if ((qa !== window)) {\n                w.push(g.listen(qa, \"scroll\", ea.hide));\n            };\n            w.push(g.listen(fa, \"click\", ea.hide));\n            t = fa;\n        }\n    };\n    g.listen(window, \"scroll\", ea.hide);\n    e.exports = ea;\n});\n__d(\"SelectorDeprecated\", [\"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(\"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    function fa(pa) {\n        return s.byClass(pa, \"uiSelectorButton\");\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        return ba;\n    };\n    function ha(pa) {\n        return m.scry(pa, \"select\")[0];\n    };\n    function ia(pa) {\n        return m.find(pa, \"div.uiSelectorMenuWrapper\");\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            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                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            if ((!ra || !sa)) {\n                (aa && oa.toggle(aa));\n            };\n        });\n    };\n    function ka(pa) {\n        return !!pa.getAttribute(\"data-multiple\");\n    };\n    function la(pa) {\n        return k.hasClass(pa, \"uiSelectorOption\");\n    };\n    function ma(pa) {\n        return !!pa.getAttribute(\"data-autosubmit\");\n    };\n    var na = function() {\n        na = z;\n        var pa = {\n            keydown: function(event) {\n                var qa = event.getTarget();\n                if (m.isInputNode(qa)) {\n                    return\n                };\n                switch (g.getKeyCode(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                    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                    break;\n                };\n            },\n            mouseover: function(event) {\n                var qa = s.byAttribute(event.getTarget(), \"ajaxify\");\n                if ((qa && k.hasClass(qa, \"uiSelectorButton\"))) {\n                    oa.loadMenu(ea(qa));\n                };\n            }\n        };\n        g.listen(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                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, \"scroll\", function() {\n                            qa.hide();\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                r.register(ta);\n                if (q.isKeyDown()) {\n                    var za = r.getCheckedItems(ta);\n                    if (!za.length) {\n                        za = r.getEnabledItems(ta);\n                    };\n                    r.focusItem(za[0]);\n                }\n            ;\n            }\n             else {\n                aa = null;\n                if (da) {\n                    while (ca.length) {\n                        ca.pop().remove();;\n                    };\n                    m.replace(da, ra);\n                    ga().hide();\n                    da = null;\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            k.conditionClass(oa.getSelectorButton(ra), \"selected\", ua);\n            oa.inform((ua ? \"open\" : \"close\"), {\n                selector: ra,\n                clone: da\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(\"name\", sa));\n                    if (!ka(pa)) {\n                        ra.setAttribute(\"multiple\", false);\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                return true;\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            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.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            if (!ka(pa)) {\n                return qa.value\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            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        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(\"onmouseover\");\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        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        setEnabled: function(pa, qa) {\n            if (((!qa && aa) && (ea(pa) === aa))) {\n                oa.toggle(pa);\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            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                r.toggleItem(sa);\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            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                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                (ab && oa.setButtonTooltip(pa, ua));\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    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        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            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    e.exports = j;\n});\n__d(\"UserActivity\", [\"Arbiter\",\"Event\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"Event\"), i = 5000, j = 500, k = -5, l = 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 Date() - l) < ((p || i))));\n        },\n        getLastInformTime: function() {\n            return m;\n        }\n    };\n    function o(event) {\n        l = Date.now();\n        var p = (l - m);\n        if ((p > j)) {\n            m = l;\n            g.inform(\"useractivity/activity\", {\n                event: event,\n                idleness: p,\n                last_inform: m\n            });\n        }\n         else if ((p < k)) {\n            m = l;\n        }\n    ;\n    };\n    h.listen(window, \"scroll\", o);\n    h.listen(window, \"focus\", o);\n    h.listen(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.event);\n    });\n    e.exports = n;\n});\n__d(\"enforceMaxLength\", [\"Event\",\"function-extensions\",\"DOM\",\"Input\",\"InputSelection\",], function(a, b, c, d, e, f) {\n    var g = b(\"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            if ((t >= r)) {\n                q = t;\n            };\n            var v = (q - r);\n            if ((v && (((p.charCodeAt((v - 1)) & 64512)) === 55296))) {\n                v--;\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    }, l = function(event) {\n        var n = 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    }, m = ((\"maxLength\" in h.create(\"input\")) && (\"maxLength\" in h.create(\"textarea\")));\n    if (!m) {\n        g.listen(document.documentElement, {\n            keydown: l,\n            paste: l\n        });\n    };\n    e.exports = k;\n});\n__d(\"guid\", [], function(a, b, c, d, e, f) {\n    function g() {\n        return (\"f\" + ((Math.random() * ((1 << 30)))).toString(16).replace(\".\", \"\"));\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 = [Date.now(),h.getCurrentUECount(),m,j,m,m,p,(a.URI ? a.URI.getRequestURI(true, true).getUnqualifiedURI().toString() : ((location.pathname + location.search) + location.hash)),l,0,0,0,0,].concat(o);\n        g.log(\"act\", q);\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(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.find(r[t], \".ego_action a\");\n                                if (v) {\n                                    v.click();\n                                };\n                                break;\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            var p = function(z) {\n                return function(aa) {\n                    var ba = aa.getAttribute(z);\n                    if (!ba) {\n                        return false\n                    };\n                    var ca = new j(ba).getQueryData();\n                    return !!ca.xids;\n                };\n            }, q = i.scry(document.body, \".ego_unit a\");\n            q = q.filter(p(\"ajaxify\"));\n            if ((q.length == 0)) {\n                return\n            };\n            var r = new j(q[0].getAttribute(\"ajaxify\")), s = r.getQueryData();\n            if (!s.xids) {\n                return\n            };\n            try {\n                var u = JSON.parse(s.xids);\n            } catch (t) {\n                return;\n            };\n            for (var v = 0; (v < n.length); ++v) {\n                delete u[n[v]];;\n            };\n            for (v = 0; (v < o.length); ++v) {\n                u[o[v]] = 1;;\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            var y = i.scry(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        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        _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        _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(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            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    e.exports = m;\n});\n__d(\"ControlledReferer\", [\"Event\",\"URI\",\"UserAgent\",], function(a, b, c, d, e, f) {\n    var g = b(\"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                var q = k.contentWindow.location.pathname;\n                if (((q !== \"/intern/common/referer_frame.php\") && (q !== \"/common/referer_frame.php\"))) {\n                    return\n                };\n                n = true;\n                k.contentWindow.document.body.style.margin = 0;\n                l();\n            };\n            var p;\n            if ((document.domain !== \"facebook.com\")) {\n                p = \"/intern/common/referer_frame.php\";\n            }\n             else if (i.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            if (m) {\n                p += (\"?fb_source=\" + m);\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.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    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        var v = new l(u.replace(/\\/+/g, \"/\"));\n        if (t.subdomain) {\n            v.setSubdomain(t.subdomain);\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            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                    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                    if (this._finallyHandler) {\n                        this._finallyHandler();\n                    };\n                });\n                if (this.transportErrorHandler) {\n                    this._request.setTransportErrorHandler(this.transportErrorHandler);\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        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\",\"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(\"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        y = (y || {\n        });\n        this._elem = x;\n        this._wrap = l.find(x, \"div.uiScrollableAreaWrap\");\n        this._body = l.find(this._wrap, \"div.uiScrollableAreaBody\");\n        this._content = l.find(this._body, \"div.uiScrollableAreaContent\");\n        this._track = l.find(x, \"div.uiScrollableAreaTrack\");\n        this._gripper = l.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, \"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        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        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                    z.remove();\n                });\n            }));\n        }\n         else if (r.firefox()) {\n            this._wrap.addEventListener(\"DOMMouseScroll\", function(event) {\n                ((event.axis === event.HORIZONTAL_AXIS) && event.preventDefault());\n            }, false);\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        if ((y.shadow !== false)) {\n            j.addClass(this._elem, \"uiScrollableAreaWithShadow\");\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                content: x\n            };\n        },\n        fromNative: function(x, y) {\n            if ((!j.hasClass(x, \"uiScrollableArea\") || !j.hasClass(x, \"native\"))) {\n                return\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            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, event) {\n                if (!((((event.which && (event.which === 1))) || ((event.button && (event.button === 1)))))) {\n                    return\n                };\n                var aa = s.getEventPosition(event, \"viewport\");\n                if (x) {\n                    var ba = this._gripper.getBoundingClientRect();\n                    if (((((aa.x < ba.left) || (aa.x > ba.right)) || (aa.y < ba.top)) || (aa.y > ba.bottom))) {\n                        return false\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, event) {\n                    var ha = (s.getEventPosition(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            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, \"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(event) {\n            var x = s.getEventPosition(event, \"viewport\"), y = this._gripper.getBoundingClientRect();\n            if (((x.x < y.right) && (x.x > y.left))) {\n                if ((x.y < y.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                event.prevent();\n            }\n        ;\n        },\n        _handleMouseMove: function(event) {\n            var x = (this._options.fade !== false);\n            if ((i.hasPointerEvents() || x)) {\n                this._mousePos = s.getEventPosition(event);\n                this._throttledRespondMouseMove();\n            }\n        ;\n        },\n        _respondMouseMove: function() {\n            if (!this._mouseOver) {\n                return\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        _handleScroll: function(event) {\n            if (this._needsGripper()) {\n                this._slideGripper();\n            };\n            this.throttledAdjustGripper();\n            if ((this._options.fade !== false)) {\n                this.showScrollbar();\n            };\n            this.inform(\"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            this._scrollbarVisible = false;\n            if (this._hideTimeout) {\n                clearTimeout(this._hideTimeout);\n                this._hideTimeout = null;\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.stop();\n                    this._hideAnimation = null;\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            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            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            this._scrollbarVisible = true;\n            if (this._hideTimeout) {\n                clearTimeout(this._hideTimeout);\n                this._hideTimeout = null;\n            }\n        ;\n            if (this._hideAnimation) {\n                this._hideAnimation.stop();\n                this._hideAnimation = null;\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            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        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.stop();\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    e.exports = w;\n});\n__d(\"Menu\", [\"CSS\",\"Class\",\"DataStore\",\"DOM\",\"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(\"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        this._config = (u || {\n        });\n        this._theme = (u.theme || {\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                this._items.splice(w, 1);\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                if (v) {\n                    w++;\n                };\n                this._items.splice(w, 0, t);\n            }\n             else this._items.push(t);\n        ;\n            if (this._root) {\n                this._insertItem(t, u, v);\n            };\n        },\n        removeItem: function(t) {\n            var u = this._items.indexOf(t);\n            if ((u < 0)) {\n                return\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            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            this.focusAnItem();\n        },\n        onHide: function() {\n            this.blur();\n        },\n        focusAnItem: function() {\n            return this._attemptFocus(0, 1);\n        },\n        blur: function() {\n            if (this._focused) {\n                this._focused.blur();\n                this._focused = null;\n                this.inform(\"blur\");\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                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                return false;\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.content, this._ul);\n                t = this._scrollableElems.root;\n                p.set(this._scrollableElems.wrap, \"max-height\", (this._config.maxheight + \"px\"));\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            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        _handleItemClick: function(t, u) {\n            this.inform(\"itemclick\", {\n                item: t,\n                event: u\n            });\n            if (t.hasAction()) {\n                this.done();\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.blur();\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        _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            return false;\n        },\n        _focusItem: function(t, u) {\n            if ((t.focus(u) !== false)) {\n                if ((this._focused !== t)) {\n                    this.blur();\n                    this._focused = t;\n                    this.inform(\"focus\");\n                }\n            ;\n                return true;\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    g(i.prototype, {\n        _root: null,\n        getRoot: function() {\n            if (!this._root) {\n                this._root = this.render();\n            };\n            return this._root;\n        },\n        render: h,\n        getAccessKey: h,\n        hasAction: h.thatReturnsFalse,\n        focus: h.thatReturnsFalse,\n        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    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            var o = {\n                className: n,\n                \"aria-selected\": \"false\"\n            };\n            for (var p in this._data) {\n                if ((p.indexOf(\"data-\") === 0)) {\n                    o[p] = this._data[p];\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    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        focus: function(q) {\n            if ((this.isDisabled() || !this._root.offsetParent)) {\n                return false\n            };\n            h.addClass(this._root, \"_54ne\");\n            h.addClass(this._root, \"selected\");\n            this._root.setAttribute(\"aria-selected\", \"true\");\n            (q || this._anchor.focus());\n        },\n        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            if ((typeof this._onclickHandler === \"function\")) {\n                return this._onclickHandler()\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            if (this._data.icon) {\n                i.prependContent(this._anchor, this._data.icon);\n                h.addClass(this._anchor, \"_54nu\");\n            }\n        ;\n            if (!this.isDisabled()) {\n                this._anchor.setAttribute(\"href\", (this._data.href || \"#\"));\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            if (this._data.ajaxify) {\n                this._anchor.setAttribute(\"ajaxify\", this._data.ajaxify);\n            };\n            if (this._data.target) {\n                this._anchor.setAttribute(\"target\", this._data.target);\n            };\n            for (var q in this._data) {\n                if (((typeof q === \"string\") && o(q, \"data-\"))) {\n                    this._anchor.setAttribute(q, this._data[q]);\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            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    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            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            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    function m(o) {\n        return ((o.select && o.deselect) && o.isSelected);\n    };\n    function n(o) {\n        return (m(o) && o.isSelected());\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            return this.parent.focusAnItem();\n        },\n        setValue: function(o) {\n            if (!this._root) {\n                this._render();\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            this.inform(\"change\", this._getSelection());\n        },\n        _handleItemClick: function(o, p) {\n            if (!m(o)) {\n                return this.parent._handleItemClick(o, p)\n            };\n            this.inform(\"itemclick\", {\n                item: o,\n                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             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                        this.inform(\"change\", this._getSelection());\n                    }\n                \n                };\n                this.done();\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            if (!this._config.multiple) {\n                o = o[0];\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    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            return this._root;\n        }\n    });\n    e.exports = m;\n});\n__d(\"TabIsolation\", [\"Event\",\"DOMQuery\",\"Focus\",\"Keys\",\"TabbableElements\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"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    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            }.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                this._eventHandler.remove();\n                this._eventHandler = null;\n            }\n        ;\n        },\n        _tabHandler: function(p) {\n            if ((g.getKeyCode(p) !== j.TAB)) {\n                return\n            };\n            var q = p.getTarget();\n            if (!q) {\n                return\n            };\n            var r = k.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    e.exports = o;\n});\n__d(\"AccessibleLayer\", [\"Event\",\"DOM\",\"Focus\",\"copyProperties\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"DOM\"), i = b(\"Focus\"), j = b(\"copyProperties\"), k = b(\"tx\");\n    function l(m) {\n        this._layer = m;\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(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            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            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\", [\"Event\",\"copyProperties\",\"Parent\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"copyProperties\"), i = b(\"Parent\");\n    function j(k) {\n        this._layer = k;\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        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        _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            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    e.exports = j;\n});\n__d(\"ContextualLayerUpdateOnScroll\", [\"Event\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"copyProperties\");\n    function i(j) {\n        this._layer = j;\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            this.detach();\n        },\n        _attachScrollListener: function() {\n            if (this._listener) {\n                return\n            };\n            var j = this._layer.getContextScrollParent();\n            this._listener = g.listen(j, \"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    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 = document.activeElement;\n                if (g.isNodeOfType(o, [\"input\",\"textarea\",])) {\n                    return\n                };\n                var p = i.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             else if ((m.tabIndex !== 0)) {\n                n = false;\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    e.exports = k;\n});\n__d(\"LayerButtons\", [\"Event\",\"Parent\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"Parent\"), i = b(\"copyProperties\");\n    function j(k) {\n        this._layer = k;\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(\"confirm\", m) === false)) {\n                    k.prevent();\n                };\n                return;\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                k.prevent();\n                return;\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    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    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    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    k(l.prototype, {\n        _subscription: null,\n        enable: function() {\n            if ((j.ie() < 9)) {\n                return\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        _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            }).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    j(k.prototype, {\n        _subscriptions: null,\n        enable: function() {\n            if ((i.ie() < 9)) {\n                return\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                this._subscriptions = null;\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\", [\"Event\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"copyProperties\");\n    function i(j) {\n        this._layer = j;\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(event) {\n            if ((this._layer.inform(\"submit\", event) === false)) {\n                event.kill();\n            };\n        },\n        _onSuccess: function(event) {\n            if ((this._layer.inform(\"success\", event) === false)) {\n                event.kill();\n            };\n        },\n        _onError: function(event) {\n            var j = event.getData();\n            if ((this._layer.inform(\"error\", {\n                response: j.response\n            }) === false)) {\n                event.kill();\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    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        disable: function() {\n            this._detach();\n            while (this._subscriptions.length) {\n                this._subscriptions.pop().unsubscribe();;\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(\"blur\", function() {\n                this._layer.hide();\n                return false;\n            }.bind(this));\n        }\n    });\n    e.exports = h;\n});\n__d(\"LayerMouseHooks\", [\"Event\",\"function-extensions\",\"Arbiter\",\"ContextualThing\",\"Layer\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"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    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            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        _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        _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            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    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, event) {\n            if (((document.activeElement === document.body) || k.contains(this._layer.getRoot(), 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                if ((o && ((o.tabIndex != -1)))) {\n                    h.setWithoutOutline(o);\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    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            this._tabIsolation.disable();\n            this._tabIsolation = null;\n        }\n    });\n    e.exports = i;\n});\n__d(\"ModalLayer\", [\"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(\"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(document.body, \"._li\")[0];\n        };\n        return ba;\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, \"top\", (na + \"px\"));\n        h.inform(\"reflow\");\n        ma.listener = n.subscribe(\"scroll\", function(oa, pa) {\n            if (m.contains(la, pa.target)) {\n                var qa = (la.offsetTop - pa.delta.y);\n                o.set(la, \"top\", (qa + \"px\"));\n                ma.position = ma.position.add(pa.delta);\n                return false;\n            }\n        ;\n        });\n        j.set(la, \"ModalLayerData\", ma);\n        if ((q.firefox() < 13)) {\n            ea.curry(la).defer();\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    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, \"top\", \"\");\n                if (ma) {\n                    var ra = m.getDocumentScrollElement();\n                    ra.scrollTop = na.position.y;\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(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        if ((q.ie() < 7)) {\n            o.set(la, \"height\", \"\");\n        };\n    };\n    function ga() {\n        var la = ca();\n        if (!i.hasClass(la, \"_31e\")) {\n            da(la);\n        };\n    };\n    function ha() {\n        if (!y.length) {\n            fa(ca(), true);\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        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        (la && la(ca()));\n    };\n    function ja(la, ma) {\n        var na = (q.ie() < 7);\n        if (((na && ma) && (ma <= document.body.clientWidth))) {\n            ma = \"\";\n        };\n        o.set(la, (na ? \"width\" : \"min-width\"), (ma + ((ma ? \"px\" : \"\"))));\n    };\n    function ka(la) {\n        this._layer = la;\n    };\n    s(ka.prototype, {\n        _subscription: null,\n        enable: function() {\n            if (!ca()) {\n                return\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        disable: function() {\n            if (!ca()) {\n                return\n            };\n            this._subscription.unsubscribe();\n            this._subscription = null;\n            if (this._layer.isShown()) {\n                this._removeModal();\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            var ma = m.getDocumentScrollElement();\n            ma.scrollTop = 0;\n            if (!y.length) {\n                if ((q.ie() < 7)) {\n                    i.addClass(document.documentElement, \"_31d\");\n                };\n                var na = v(ia, 100);\n                z = g.listen(window, \"resize\", na);\n                aa = h.subscribe(\"reflow\", na);\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            !function() {\n                if (na) {\n                    fa(na.getLayerRoot(), ma);\n                }\n                 else ha();\n            ;\n                if (y.length) {\n                    ia.defer();\n                }\n                 else if ((q.ie() < 7)) {\n                    i.removeClass(document.documentElement, \"_31d\");\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        top: \"_53il\",\n        right: \"_53im\",\n        left: \"_53in\"\n    }, p = {\n        above: \"bottom\",\n        below: \"top\",\n        left: \"right\",\n        right: \"left\"\n    };\n    function q(r) {\n        this._layer = r;\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        _repositionRoot: function(r) {\n            var s = r.getAlignment();\n            if ((s == \"center\")) {\n                return\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            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             else {\n                var ga = parseInt(k.get(t, \"top\"), 10);\n                k.set(t, \"top\", (((ga - da)) + \"px\"));\n            }\n        ;\n        },\n        _repositionArrow: function(r) {\n            var s = this._layer._contentWrapper, t = r.getPosition(), u = p[t];\n            for (var v in o) {\n                h.conditionClass(s, o[v], (u === v));;\n            };\n            if ((t == \"none\")) {\n                return\n            };\n            if (!this._arrow) {\n                this._arrow = g.i({\n                    className: \"_53io\"\n                });\n                i.appendContent(s, this._arrow);\n            }\n        ;\n            h.conditionClass(s, \"_kc\", this._layer.getFooter());\n            k.set(this._arrow, \"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            return 0;\n        },\n        getOffsetSide: function(r) {\n            var s = r.isVertical();\n            return (s ? ((j.isRTL() ? \"right\" : \"left\")) : \"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            return y;\n        }\n    });\n    e.exports = q;\n});\n__d(\"ContextualDialogFitInViewport\", [\"Event\",\"ContextualLayerDimensions\",\"Style\",\"Vector\",\"copyProperties\",\"throttle\",], function(a, b, c, d, e, f) {\n    var g = b(\"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    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            }.bind(this));\n            if (this._layer.isShown()) {\n                this._attachScroll();\n            };\n        },\n        disable: function() {\n            if (this._layer.isShown()) {\n                this._detachScroll();\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, \"scroll\", n),g.listen(window, \"resize\", n),];\n        },\n        _detachScroll: function() {\n            while (this._listeners.length) {\n                this._listeners.pop().remove();;\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            this._minimumTop = (((this._getContextY() - ((this._getContentHeight() - this._arrowBuffer))) + n.getOffsetY()));\n        },\n        _adjustForScroll: function() {\n            if (this._layer.isFixed()) {\n                return\n            };\n            var n = this._layer._getOrientation();\n            if (n.isVertical()) {\n                return\n            };\n            var o = h.getViewportRect(this._layer), p = (o.b - this._minimumTop);\n            if ((p < 0)) {\n                return\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(), \"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    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            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            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\",\"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(\"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    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        _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                top: ca\n            });\n        },\n        setWidth: function(ba) {\n            ba = Math.floor(ba);\n            if ((ba === this._width)) {\n                return\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    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            }.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        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    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\",\"blur\",], function(ha, ia) {\n                if (((ha == \"blur\") || (((ha == \"key\") && (ia.keyCode == m.ESC))))) {\n                    ca();\n                    return false;\n                }\n            ;\n            });\n        }\n    ;\n        return x;\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    function da(ga) {\n        delete z[ga];\n        if (!Object.keys(z).length) {\n            y().hide();\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            ja();\n            (ka && ka(la));\n        });\n        ga.setInterceptHandler(ja).setAbortHandler(ja);\n        ga.send();\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            var ja = (o.byClass(ha, \"stat_elem\") || ha);\n            if ((ja && i.hasClass(ja, \"async_saving\"))) {\n                return false\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            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        getLoadingDialog: function() {\n            return y();\n        }\n    };\n    e.exports = fa;\n});\n__d(\"Hovercard\", [\"JSXDOM\",\"Event\",\"function-extensions\",\"AccessibleLayer\",\"Arbiter\",\"AsyncRequest\",\"AsyncSignal\",\"ContextualDialog\",\"ContextualThing\",\"DOM\",\"LayerAutoFocus\",\"Parent\",\"Rect\",\"Style\",\"UserAgent\",\"Vector\",\"clickRefAction\",\"cx\",\"emptyFunction\",\"tx\",\"userAction\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSXDOM\"), h = b(\"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(\"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(event) {\n        var cb = q.byTag(event.getTarget(), \"a\");\n        (bb.processNode(cb) && event.stop());\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            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        return true;\n    };\n    function pa(cb) {\n        return ((cb && ca) && (ba.node == cb));\n    };\n    function qa(cb) {\n        return cb.getAttribute(\"data-hovercard\");\n    };\n    function ra(cb) {\n        var db = h.listen(cb, \"mouseout\", function() {\n            clearTimeout(ja);\n            clearTimeout(ka);\n            db.remove();\n            da = null;\n            if (!bb.contains(cb)) {\n                bb.hide();\n            };\n        });\n        if (!ba.moveToken) {\n            ba.moveToken = h.listen(cb, \"mousemove\", function(event) {\n                ba.pos = u.getEventPosition(event);\n            });\n        };\n        clearTimeout(ja);\n        clearTimeout(ka);\n        clearTimeout(ma);\n        var eb = fa, fb = (ca ? ia : ga);\n        if (cb.getAttribute(\"data-hovercard-instant\")) {\n            eb = fb = 50;\n        };\n        ja = setTimeout(wa.curry(cb), eb);\n        ka = setTimeout(sa.curry(cb), fb);\n    };\n    function sa(cb, db) {\n        if ((ba.node != cb)) {\n            return\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 = setTimeout(sa.curry(cb, true), (ha - fb));\n        }\n        \n    ;\n    };\n    function ta() {\n        bb.hide(true);\n        clearTimeout(ka);\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        if (!o.contains(document.body, db)) {\n            bb.hide(true);\n            return;\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    function va(cb) {\n        var db = ba.pos, eb = cb.getClientRects();\n        if ((!db || (eb.length === 0))) {\n            return r.getElementBounds(cb)\n        };\n        var fb, gb = false;\n        for (var hb = 0; (hb < eb.length); hb++) {\n            var ib = new r(Math.round(eb[hb].top), Math.round(eb[hb].right), Math.round(eb[hb].bottom), Math.round(eb[hb].left), \"viewport\").convertTo(\"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                fb = new r(jb.y, kb.x, kb.y, jb.x, \"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            if (ib.contains(db)) {\n                gb = true;\n            };\n        };\n        return fb;\n    };\n    function wa(cb) {\n        if ((cb.id && (aa[cb.id] != null))) {\n            return\n        };\n        var db = qa(cb);\n        if ((aa[db] != null)) {\n            return\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    function xa(cb) {\n        aa[cb] = false;\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            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            db = null;\n        }),];\n    };\n    var ab = true, bb = {\n        hide: function(cb) {\n            if (!ca) {\n                return\n            };\n            if (cb) {\n                if (ea) {\n                    ea.hide();\n                };\n                da = null;\n                ca = null;\n                ea = null;\n            }\n             else ma = setTimeout(bb.hide.curry(true), ia);\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        getDialog: function(cb) {\n            return aa[cb];\n        },\n        contains: function(cb) {\n            if (ea) {\n                return n.containsIncludingLayers(ea.getContentRoot(), cb)\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        dirtyAll: function() {\n            for (var cb in aa) {\n                var db = aa[cb];\n                (db && bb.dirty(cb));\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            return false;\n        },\n        setDirtyAllOnPageTransition: function(cb) {\n            ab = cb;\n        }\n    };\n    (function() {\n        if ((t.ie() < 8)) {\n            return\n        };\n        h.listen(document.documentElement, \"mouseover\", na);\n        h.listen(window, \"scroll\", function() {\n            if ((ca && s.isFixed(ca))) {\n                bb.hide(true);\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\", [\"Event\",\"CSS\",\"DOM\",\"Input\",\"Parent\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"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    function n(q) {\n        return i.scry(q, \".placeholder\")[0];\n    };\n    function o(q) {\n        q = (q || window.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    var p = {\n        init: function() {\n            p.init = l;\n            g.listen(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 ((document.activeElement === q)) {\n                    var s = g.listen(q, \"blur\", function() {\n                        p.manipulateInput(q, r);\n                        s.remove();\n                    });\n                }\n                 else p.manipulateInput(q, r);\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            g.listen(s, \"click\", function() {\n                q.focus();\n            });\n            if ((q.value === r)) {\n                q.value = \"\";\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        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        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\", [\"Event\",\"ArbiterMixin\",\"BehaviorsMixin\",\"DOM\",\"Form\",\"Run\",\"areObjectsEqual\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"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(\"confirm\", this._handleDialogConfirm.bind(this));\n            j.prependContent(this._root, j.create(\"input\", {\n                type: \"hidden\",\n                name: \"confirmed\",\n                value: \"true\"\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        var u = true;\n        l.onBeforeUnload(this.checkUnsaved.bind(this), u);\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            if ((this.inform(\"submit\") === false)) {\n                return false\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        reset: function() {\n            this.inform(\"reset\");\n            this._submitted = false;\n            this._confirmed = false;\n        },\n        isDirty: function() {\n            if ((this._submitted || !j.contains(document.body, this._root))) {\n                return false\n            };\n            if (this._forceDirty) {\n                return true\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            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            if ((p === undefined)) {\n                p = 1;\n            };\n            o = Number(o);\n            p = Number(p);\n            if ((!isFinite(o) || !isFinite(p))) {\n                return\n            };\n            r[0] += o;\n            if ((arguments.length >= 4)) {\n                if (!r[1]) {\n                    r[1] = 0;\n                };\n                r[1] += p;\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                for (var n in k) {\n                    g.post((\"ods:\" + n), k[n], m);;\n                };\n                k = {\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    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    e.exports = g;\n});");
// 5477
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o7,"sf8457e5183159cd46485198114fb31bc4f940d4d");
// 5478
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: ((window.top.JSBNG_Replay.push)((window.top.JSBNG_Replay.sf8457e5183159cd46485198114fb31bc4f940d4d_523), 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: ((window.top.JSBNG_Replay.push)((window.top.JSBNG_Replay.sf8457e5183159cd46485198114fb31bc4f940d4d_845), 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});");
// 6503
JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_190[0](o42,false,"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yg/r/4CJ_klaVGHP.js",o93);
// undefined
o42 = null;
// undefined
o93 = null;
// 7196
fpc.call(JSBNG_Replay.sf8457e5183159cd46485198114fb31bc4f940d4d_845[0], o102,undefined);
// undefined
o102 = null;
// 7699
fpc.call(JSBNG_Replay.sf8457e5183159cd46485198114fb31bc4f940d4d_845[0], o39,undefined);
// undefined
o39 = null;
// 7737
fpc.call(JSBNG_Replay.sf8457e5183159cd46485198114fb31bc4f940d4d_523[0], o80,undefined);
// undefined
o80 = null;
// 7765
fpc.call(JSBNG_Replay.sf8457e5183159cd46485198114fb31bc4f940d4d_523[0], o4,undefined);
// undefined
o4 = null;
// 7767
fpc.call(JSBNG_Replay.sf8457e5183159cd46485198114fb31bc4f940d4d_845[0], o87,undefined);
// undefined
o87 = null;
// 10319
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o7,"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});");
// 10320
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o7,"s6de57b149b09c494ec606f82771caf93a5a215db");
// 10321
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 fin115keys = ((window.top.JSBNG_Replay.forInKeys)((i))), fin115i = (0);\n                var k;\n                for (; (fin115i < fin115keys.length); (fin115i++)) {\n                    ((k) = (fin115keys[fin115i]));\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 fin116keys = ((window.top.JSBNG_Replay.forInKeys)((fa))), fin116i = (0);\n            var ga;\n            for (; (fin116i < fin116keys.length); (fin116i++)) {\n                ((ga) = (fin116keys[fin116i]));\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    {\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        ((window.top.JSBNG_Replay.s6de57b149b09c494ec606f82771caf93a5a215db_133.push)((u)));\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 fin117keys = ((window.top.JSBNG_Replay.forInKeys)((t))), fin117i = (0);\n            var v;\n            for (; (fin117i < fin117keys.length); (fin117i++)) {\n                ((v) = (fin117keys[fin117i]));\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});");
// 10426
fpc.call(JSBNG_Replay.s5e7dba3ea700a5261ca8857ec975a807389e8969_270[0], o122,o136);
// undefined
o136 = null;
// 10431
JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_190[0](o137,false,"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/ye/r/v9y92rsUvEH.js",o138);
// undefined
o137 = null;
// undefined
o138 = null;
// 10435
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o7,"if (self.CavalryLogger) {\n    CavalryLogger.start_js([\"4vv8/\",]);\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    e.exports = {\n        init: function(p) {\n            if ((window.top == window.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});");
// 10436
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o7,"s76aa385d8208e4e8eefbd18ade1f1e8c544e0113");
// 10437
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});");
// 10444
JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_190[0](o139,false,"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/y4/r/VctjjLR0rnO.js",o140);
// undefined
o139 = null;
// undefined
o140 = null;
// 10448
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o7,"if (self.CavalryLogger) {\n    CavalryLogger.start_js([\"u//Ut\",]);\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: \"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: \"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            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            if ((n == 1357001)) {\n                o = \"Your session has timed out. Please log in.\";\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    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        for (sa in ra) {\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            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        for (sa in ra) {\n            v[sa] = ra[sa];;\n        };\n        ea.inform(\"privacy-changed\");\n    };\n    function ga(ra, sa) {\n        var ta = {\n        };\n        ta[ra] = sa;\n        fa(ta);\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        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    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        z = ra;\n        ea.inform(\"privacy-user-presence-changed\");\n        ea.inform(\"privacy-changed\");\n    };\n    function ja(ra, sa) {\n        ca = true;\n        ra.send();\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    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                for (var va in ra.settings) {\n                    x[va] = ra.settings[va];;\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            ea.inform(\"privacy-user-presence-response\");\n        }\n    ;\n        da().log(\"set_update_response\", {\n            data: ra,\n            response: sa\n        });\n    };\n    function ma(ra, sa) {\n        if ((w !== y)) {\n            ha(y);\n        };\n        if ((z !== aa)) {\n            ia(aa);\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    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    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        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    function pa(ra, sa, ta) {\n        return oa(new i(ra).setData(sa), ta);\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        if ((ta.window_id === n.getSessionID())) {\n            return\n        };\n        var ua = ta.data;\n        if ((ta.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.event == \"visibility_update\")) {\n                var va = (!!ua.visibility ? ea.ONLINE : ea.OFFLINE);\n                ha(va);\n                y = va;\n            }\n             else if ((ta.event == \"online_policy_update\")) {\n                ia(ua.online_policy);\n                aa = ua.online_policy;\n            }\n            \n        ;\n            ea.inform(\"privacy-user-presence-response\");\n        }\n    ;\n        da().log(\"channel_message_received\", {\n            data: sa.obj\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            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                fa(ta);\n                var wa = sa;\n                if ((wa == ea.UNLISTED)) {\n                    wa = x[ra[0]];\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            return sa;\n        },\n        setFriendVisibilityMap: function(ra, sa) {\n            for (var ta in ra) {\n                x[ta] = v[ta];;\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            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            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            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            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            for (var sa in v) {\n                if ((v[sa] === ea.BLACKLISTED)) {\n                    ra.push(sa);\n                };\n            };\n            return ra;\n        },\n        getWhitelist: function() {\n            var ra = [];\n            for (var sa in v) {\n                if ((v[sa] === ea.WHITELISTED)) {\n                    ra.push(sa);\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    }.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            (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            (k && k());\n        },\n        toggleVisibility: function() {\n            if (j.isOnline()) {\n                j.goOffline();\n            }\n             else j.goOnline();\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    var h = {\n        isValid: function(i) {\n            if (!i) {\n                return false\n            };\n            return g(i);\n        },\n        isValidThreadID: function(i) {\n            if (!h.isValid(i)) {\n                return false\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        tokenize: function(i) {\n            if (!this.isValid(i)) {\n                throw \"bad_id_format\"\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            var j = h.tokenize(i);\n            if ((j.type != \"fbid\")) {\n                return null\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        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        isEmailParticipantID: function(h) {\n            var i = g.tokenize(h);\n            if ((i.type != \"email\")) {\n                throw \"bad_email_id\"\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__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            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            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    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            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            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            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            return false;\n        }\n    });\n    var p = null;\n    function q() {\n        if (p) {\n            return p\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        return s;\n    };\n    function r(s) {\n        return [s.fbid,s.type,s.width,s.height,s.resize_mode,].join(\"|\");\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    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        maxValidActionID: function(k, l) {\n            if (!i(k)) {\n                return l\n            };\n            if (!i(l)) {\n                return k\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            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        return v;\n    };\n    function o(t, u, v, w) {\n        if ((t[u] === undefined)) {\n            t[u] = {\n            };\n        };\n        if ((t[u][v] === undefined)) {\n            t[u][v] = 0;\n        };\n        t[u][v] += w;\n    };\n    function p(t, u, v, w) {\n        if ((t[u] === undefined)) {\n            t[u] = {\n            };\n        };\n        if ((t[u][v] === undefined)) {\n            t[u][v] = [];\n        };\n        for (var x = 0; (x < w.length); ++x) {\n            t[u][v].push(w[x]);;\n        };\n    };\n    function q(t, u) {\n        if ((((t && !t.categories)) || ((u && !u.categories)))) {\n            return\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        for (var z in x) {\n            var aa = x[z], ba = y[z];\n            for (var ca in aa) {\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        return n(v, w);\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            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            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            if (w.length) {\n                m.inform(\"threads-updated\", o);\n            };\n            for (var x in p) {\n                m.inform(\"thread-read-changed\", p);\n                break;\n            };\n            for (var x in n) {\n                m.inform(\"threads-deleted\", n);\n                break;\n            };\n            if (r) {\n                m.inform(\"unseen-updated\", null);\n            };\n            if (s) {\n                m.inform(\"unread-updated\", null);\n            };\n            for (x in t) {\n                m.inform(\"messages-received\", t);\n                break;\n            };\n            for (x in u) {\n                m.inform(\"messages-reordered\", u);\n                break;\n            };\n            for (x in v) {\n                m.inform(\"messages-updated\", v);\n                break;\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    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            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            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            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        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    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    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            vb = (vb || (\"thread:\" + ub));\n            ma(sb, ub, vb);\n        }\n    ;\n        tb.thread_id = vb;\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    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    function oa(sb, tb) {\n        return sb._clientToServerIDs.getResource(tb);\n    };\n    function pa(sb, tb) {\n        return !!sb._serverToClientIDs.getResource(tb);\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        return ub;\n    };\n    function ra(sb, tb, ub) {\n        sb._serverToClientIDs.executeOrEnqueue(tb, ub);\n        sb.ensureThreadIsFetched(tb);\n    };\n    function sa(sb, tb, ub) {\n        if ((tb.action_type != m.SEND_MESSAGE)) {\n            return\n        };\n        var vb = tb.client_thread_id;\n        if (!vb) {\n            vb = qa(sb, tb.thread_id);\n        };\n        var wb = null;\n        if (vb) {\n            wb = t.tokenize(vb).type;\n        };\n        ba.addEntry((\"send_\" + wb), ub, ((tb.thread_id + \",\") + tb.message_id));\n    };\n    function ta(sb) {\n        return (sb.getError() ? (\"_\" + sb.getError()) : \"\");\n    };\n    function ua(sb, tb) {\n        var ub = null;\n        switch (tb.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        sa(sb, tb, ub);\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.status && (cc.status != n.SUCCESS)) && !cc.thread_id)) {\n                cc.thread_id = cc.client_thread_id;\n                return;\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            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            tb.end_of_history = ub;\n        }\n    ;\n        if (tb.roger) {\n            var xb = {\n            };\n            for (var yb in tb.roger) {\n                var zb = sb._serverToClientIDs.getResource(yb);\n                if (zb) {\n                    var ac = tb.roger[yb];\n                    xb[zb] = {\n                    };\n                    for (var bc in ac) {\n                        xb[zb][(\"fbid:\" + bc)] = ac[bc];;\n                    };\n                }\n            ;\n            };\n            tb.roger = xb;\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    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            for (vb in tb.threads) {\n                ub.threads[vb] = Object.keys(ha(((ub.threads[vb] || [])).concat(tb.threads[vb])));;\n            };\n        }\n    ;\n        if (tb.messages) {\n            if (!ub.messages) {\n                ub.messages = {\n                };\n            };\n            for (vb in tb.messages) {\n                if (!ub.messages[vb]) {\n                    ub.messages[vb] = {\n                    };\n                };\n                for (var wb in tb.messages[vb]) {\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        ub.client = (sb.client || tb.client);\n        return ub;\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    function za(sb, tb) {\n        for (var ub in tb) {\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        return sb;\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    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    function cb(sb, tb) {\n        var ub = {\n        }, vb, wb = (sb.client || tb.client);\n        delete sb.client;\n        delete tb.client;\n        for (vb in sb) {\n            ga(ub, ha(sb[vb], vb));;\n        };\n        for (vb in tb) {\n            ga(ub, ha(tb[vb], vb));;\n        };\n        var xb = {\n            client: wb\n        };\n        for (var yb in ub) {\n            vb = ub[yb];\n            if (!xb[vb]) {\n                xb[vb] = [];\n            };\n            xb[vb].push(yb);\n        };\n        return xb;\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    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    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                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            }.bind(this));\n            this.inform(\"fetch-thread-data\", ub);\n            for (var xb in ub.threads) {\n                rb(this, \"/ajax/mercury/thread_info.php\", ub);\n                break;\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        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            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                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        handleThreadInfoError: function(sb) {\n            var tb = sb.getRequest().getData(), ub = [];\n            if (tb.messages) {\n                for (var vb in tb.messages.thread_ids) {\n                    ub.push(fb(qa(this, vb)));;\n                };\n                for (var wb in tb.messages.user_ids) {\n                    ub.push(fb((\"user:\" + wb)));;\n                };\n                for (var xb in tb.messages.group_ids) {\n                    ub.push(fb((\"group:\" + xb)));;\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            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                 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                    }.bind(this));\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        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            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                }.bind(this));\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        _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            for (var wb in sb) {\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            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        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            var vb = [];\n            for (var wb in tb) {\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                        status: n.UNABLE_TO_CONFIRM\n                    });\n                });\n            };\n            for (var yb in ub) {\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                    status: n.UNABLE_TO_CONFIRM\n                });\n            };\n            if (vb.length) {\n                this.handleUpdate({\n                    actions: vb,\n                    payload_source: v.CLIENT_HANDLE_ERROR\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        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            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        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                    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            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            for (wb in sb) {\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                    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        _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                    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            var wb = sb.error;\n            if ((wb === 1404102)) {\n                h.verboseErrorHandler(sb);\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: 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    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    function hb(sb, tb) {\n        gb(tb).handleUpdate(sb);\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    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    function kb(sb, tb) {\n        return tb;\n    };\n    function lb(sb) {\n        var tb = gb(sb.getRequest());\n        tb.handleThreadInfoError(sb);\n    };\n    function mb(sb) {\n        var tb = gb(sb.getRequest());\n        tb.handleSendMessageError(sb);\n    };\n    function nb(sb) {\n        var tb = gb(sb.getRequest());\n        tb.handleSendMessageTransportError(sb);\n    };\n    function ob(sb) {\n        var tb = gb(sb);\n        tb.handleSendMessageTimeout(sb);\n    };\n    function pb(sb) {\n        var tb = gb(sb.getRequest());\n        tb.handleMessageConfirmError(sb);\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    function rb(sb, tb, ub, vb) {\n        ea.trySend(tb, ub, vb, sb._fbid);\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        if (ba.vanity) {\n            v[ba.vanity] = ba.id;\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            name: da,\n            short_name: da,\n            employee: false,\n            call_promo: false\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        var ga = r(fa);\n        if (ga.length) {\n            p.getMulti(ga, function(ha) {\n                for (var ia in fa) {\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                        name: ka.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                ca(ea);\n            });\n        }\n         else ca(ea);\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        if (((!ba.name && !ba.href) && !ba.vanity)) {\n            var da = \"Facebook User\";\n            ba.name = da;\n            ba.short_name = da;\n        }\n    ;\n        return ba;\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            if (v[ba]) {\n                return v[ba]\n            };\n            if (ba.match(\"^\\\\d+$\")) {\n                return aa.getIDForUser(ba)\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                }, ia = function(la, ma) {\n                    u[la].big_image_src = ma.uri;\n                    ha(la, ma.uri);\n                };\n                for (var ja in ea) {\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        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            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            }.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            }.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        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        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            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        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                l.push(this._resources[m]);\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            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            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.name = n.filename;\n                    p.icon_type = o;\n                    p.url = \"\";\n                    if ((o == g.PHOTO)) {\n                        p.preview_loading = true;\n                    };\n                    l.push(p);\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    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    function da(na, oa) {\n        if ((na.participants[0] != oa)) {\n            z(na.participants, oa);\n            na.participants.unshift(oa);\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         else ra = pa;\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        na.is_forwarded_snippet = !!oa.forward_count;\n        na.snippet_sender = oa.author;\n    };\n    function fa(na, oa, pa) {\n        if (!oa) {\n            return false\n        };\n        if (!oa.timestamp) {\n            return true\n        };\n        var qa = !oa.unread_count;\n        if ((pa == qa)) {\n            return false\n        };\n        oa.unread_count = (pa ? 0 : 1);\n        na._threadInformer.updatedThread(oa.thread_id);\n        return true;\n    };\n    function ga(na, oa) {\n        var pa = na._threads.getAllResources();\n        for (var qa in pa) {\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    function ha(na, oa, pa) {\n        if ((!oa || (oa.chat_clear_time === pa))) {\n            return false\n        };\n        oa.chat_clear_time = pa;\n        na._threadInformer.reorderedMessages(oa.thread_id);\n        return true;\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        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            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             else if ((sa == q.THREAD_NAME)) {\n                oa.name = pa.log_message_data.name;\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            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            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                    na._threadInformer.updatedThread(oa.thread_id);\n                }\n            ;\n            }\n        ;\n            break;\n        };\n        if (pa.action_id) {\n            oa.last_action_id = h.maxValidActionID(pa.action_id, oa.last_action_id);\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        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            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    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    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            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        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        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        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            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            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                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                if (((!wa && !ta.action_id) && (ua == l.USER_GENERATED_MESSAGE))) {\n                    wa = ja(this, ta);\n                    this._threads.setResource(va, wa);\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                    var xa = !!ta.action_id;\n                    if (((ua == l.LOG_MESSAGE) || (ua == l.USER_GENERATED_MESSAGE))) {\n                        xa = !oa;\n                    };\n                    if (((wa.server_timestamp && (ta.timestamp <= wa.server_timestamp)) && xa)) {\n                        continue;\n                    };\n                    if (!ra[va]) {\n                        ra[va] = x({\n                        }, wa);\n                    };\n                    ia(this, ra[va], ta, oa);\n                    if ((ua == l.USER_GENERATED_MESSAGE)) {\n                        pa[va] = ta;\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            for (var ya in ra) {\n                var za = ra[ya], ab = pa[ya];\n                if (ab) {\n                    ea(za, ab);\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                    var db = za.server_timestamp;\n                    if ((!oa && (bb.timestamp > db))) {\n                        za.server_timestamp = bb.timestamp;\n                    };\n                }\n            ;\n                this._threads.setResource(ya, za);\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            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                    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            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        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            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            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    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    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        for (var qa in pa) {\n            oa.messaging.threads[qa] = pa[qa]._threads.dumpResources();;\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        return o;\n    };\n    function n(o, p, q, r) {\n        if (!p) {\n            return \"\"\n        };\n        var s = [], t = null, u = null, v = (q ? \"getUTC\" : \"get\"), w = o[(v + \"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            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                break;\n              default:\n                t = u;\n            };\n            s.push(t);\n        };\n        return s.join(\"\");\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        return bb._messages[db];\n    };\n    var la = new k();\n    function ma(bb, cb) {\n        if ((cb.status === undefined)) {\n            cb.status = m.UNSENT;\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        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            cb.thread_id = (cb.thread_id || (\"root:\" + cb.message_id));\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    function na(bb, cb, db, eb) {\n        var fb = (xa(db) ? [t.CHAT,] : []), gb = Date.now(), hb = ha(new 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 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    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        return false;\n    };\n    function pa(bb) {\n        return (bb && (bb.substr(0, 6) === \"server\"));\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        return bb._threadsToMessages[cb];\n    };\n    g.subscribe(j.DUMP_EVENT, function(bb, cb) {\n        var db = {\n        }, eb = {\n        }, fb = sa._getInstances();\n        for (var gb in fb) {\n            db[gb] = {\n            };\n            for (var hb in fb[gb]._messages) {\n                var ib = fb[gb]._messages[hb];\n                if ((Object.keys(ib).length === 0)) {\n                    continue;\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            eb[gb] = fa({\n            }, fb[gb]._localIdsMap);\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    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                }.bind(this));\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        }.bind(this));\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            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             else {\n                if (!this._attachmentData[bb]) {\n                    this._attachmentData[bb] = [];\n                };\n                this._attachmentData[bb].push({\n                    attach_key: cb,\n                    data: db\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                    continue;\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.status)) {\n                        if ((jb.status == m.UNCONFIRMED)) {\n                            if (!hb[jb.thread_id]) {\n                                hb[jb.thread_id] = [];\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                        var mb = ka(this, jb.client_message_id), nb = mb.status;\n                        mb.status = jb.status;\n                        if (((jb.status === m.SUCCESS) || jb.error_data)) {\n                            mb.error_data = jb.error_data;\n                        };\n                        if ((jb.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                        if ((((((typeof nb != \"undefined\") || (jb.status == m.FAILED_UNKNOWN_REASON)) || (jb.status == m.UNABLE_TO_CONFIRM)) || (jb.status == m.SUCCESS)) || (jb.status == m.ERROR))) {\n                            this._threadInformer.updatedMessage(jb.thread_id, ka(this, jb.client_message_id).message_id, db);\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                 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                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                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                if (!gb[jb.thread_id]) {\n                    gb[jb.thread_id] = [];\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                if (!cb) {\n                    this._threadInformer.receivedMessage(jb);\n                };\n            };\n            for (var sb in gb) {\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                if (cb) {\n                    fb.addResources(gb[sb]);\n                    this._threadInformer.reorderedMessages(sb, db);\n                }\n                 else fb.addResourcesWithoutSorting(gb[sb].reverse(), 0);\n            ;\n                this._threadInformer.updatedThread(sb);\n            };\n            var vb = Object.keys(hb);\n            if (vb.length) {\n                this._serverRequests.requestMessageConfirmation(hb);\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            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        zapMessage: function(bb, cb, db) {\n            if ((bb.thread_id == q.PENDING_THREAD_ID)) {\n                return\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            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.status = m.RESENDING;\n            db.timestamp = 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        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        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            if ((bb.attachments && bb.attachments.length)) {\n                fb.raw_attachments = null;\n                fb.attachments = bb.attachments;\n                ya(this, fb, db);\n            }\n        ;\n            if (bb.log_message_data) {\n                fb.log_message_data = bb.log_message_data;\n            };\n            if (wa(fb)) {\n                this._localTitanMessagesCount[fb.thread_id]--;\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    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        bb._titanMessagesCount[cb] += eb.length;\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        bb._localTitanMessagesCount[cb] += eb.length;\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        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    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    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            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    function za(bb, cb) {\n        if ((!cb || !cb.attachments)) {\n            return false\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        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        return false;\n    };\n    var ab = ga(function(bb) {\n        var cb = {\n        };\n        for (var db in bb._messagesNeedingAttachmentData) {\n            var eb = ka(bb, db);\n            if (za(bb, eb)) {\n                cb[db] = true;\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        bb._messagesNeedingAttachmentData = {\n        };\n    }, 0, this, true);\n    e.exports = sa;\n});\n__d(\"ChatOpenTab\", [\"Arbiter\",\"Banzai\",\"Bootloader\",\"ChatVisibility\",\"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(\"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    function r(u, v, w, x) {\n        k.listen(u, \"click\", function(y) {\n            if (x(v, w)) {\n                return\n            };\n            return y.kill();\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: Date.now()\n        };\n        if ((w !== undefined)) {\n            x.message_target_ids = [w,];\n        };\n        h.post(p, x, {\n            delay: 0,\n            retry: true\n        });\n    };\n    var t = {\n        openEmptyTab: function(u, v) {\n            if ((!window.Chat || !j.isOnline())) {\n                return true\n            };\n            i.loadModules([\"ChatTabModel\",], function(w) {\n                var x = w.getEmptyTab();\n                if (!x) {\n                    x = (\"root:\" + m.generateNewClientMessageID(Date.now()));\n                    o.createNewLocalThread(x, []);\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            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\",\"Image.react\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"React\"), h = b(\"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            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            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        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    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        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(document.body, h);\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    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        getURIPathForIDOrVanity: function(i, j) {\n            if (i.match(((\"^\" + h.overriddenVanities) + \"$\"))) {\n                i = (\".\" + i);\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            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            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        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.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                    event: o.READ,\n                    tids: [na.tid,],\n                    folder_info: ra,\n                    timestamp: na.timestamp\n                }\n            });\n        }\n    ;\n        n.addEntry(\"channel_receive\", \"success\", [oa.thread_id,oa.message_id,r.getSessionID(),]);\n    };\n    function w(la, ma) {\n        if ((((la != h.getArbiterType(\"messaging\")) || !ma.obj) || !ma.obj.tids)) {\n            return\n        };\n        var na = [], oa = (ma.obj.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    function x(la, ma) {\n        if ((((la != h.getArbiterType(\"messaging\")) || !ma.obj) || !ma.obj.tids)) {\n            return\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    function y(la, ma) {\n        if (((((la != h.getArbiterType(\"messaging\")) || !ma.obj) || !ma.obj.tids) || !ma.obj.mids)) {\n            return\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    function z(la, ma) {\n        if ((((la != h.getArbiterType(\"messaging\")) || !ma.obj) || !ma.obj.folder)) {\n            return\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    function aa(la, ma) {\n        if (((la != h.getArbiterType(\"messaging\")) || !ma.obj.tids)) {\n            return\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    function ba(la, ma) {\n        if (((la != h.getArbiterType(\"messaging\")) || !ma.obj.tids)) {\n            return\n        };\n        var na = m.CLIENT_CHANNEL_MESSAGE, oa;\n        ma.obj.tids.forEach(function(pa) {\n            if ((ma.obj.event == o.TAG)) {\n                oa = ma.obj.tag;\n            }\n             else oa = (ma.obj.marked_as_spam ? p.SPAM : p.INBOX);\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    function ca(la, ma) {\n        if (((la != h.getArbiterType(\"messaging\")) || !ma.obj.tag)) {\n            return\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    function da(la, ma) {\n        if ((((la != h.getArbiterType(\"inbox\")) || !ma.obj) || !ma.obj.seen_timestamp)) {\n            return\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    function ea(la, ma) {\n        if (((la != h.getArbiterType(\"mercury\")) || !ma.obj)) {\n            return\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            na.actions = oa;\n            na.payload_source = m.CLIENT_CHANNEL_MESSAGE;\n            s.handleUpdate(na);\n        });\n    };\n    function fa(la, ma) {\n        s.handleRoger(ma.obj);\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        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    function ha(la, ma) {\n        switch (ma.obj.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    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        if (!ma.obj.is_canonical) {\n            return\n        };\n        var na = ma.obj.sender_id;\n        if ((na == i.user)) {\n            na = ma.obj.recipient_id;\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    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                for (var ma in la) {\n                    ja.push(g.subscribe(h.getArbiterType(ma), la[ma]));;\n                };\n            }\n        ;\n        },\n        turnOff: function() {\n            if (ja.length) {\n                ja.forEach(g.unsubscribe);\n                ja = [];\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            var o = [], p = k[m.thread_id], q = h.SUCCESS;\n            for (var r in p) {\n                if ((((p[r] > m.timestamp) && (((m.status === undefined) || (m.status === q)))) && ((!n || (r != m.author))))) {\n                    o.push(r);\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        for (var o in n) {\n            if (!k[o]) {\n                k[o] = {\n                };\n            };\n            for (var p in n[o]) {\n                var q = k[o][p], r = n[o][p];\n                if ((!q || (r > q))) {\n                    k[o][p] = r;\n                };\n            };\n        };\n        if (n) {\n            l.inform(\"state-changed\", 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            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            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            var ba = aa.timestamp;\n            if ((aa.action_id || (aa.status == i.SUCCESS))) {\n                ba -= h.getServerTimeOffset();\n            };\n            var ca = t.getSeenBy(x);\n            if (r[x]) {\n                clearTimeout(r[x]);\n                delete r[x];\n            }\n        ;\n            var da = (ba + s), ea = (da - Date.now());\n            if ((ea > 0)) {\n                r[x] = p(function() {\n                    delete r[x];\n                    v(x);\n                }, ea);\n            };\n            q[x] = aa;\n            var fa = t.getSeenBy(x);\n            if ((ca.length || fa.length)) {\n                y = true;\n            };\n        });\n        return y;\n    };\n    function v(x) {\n        var y = {\n        };\n        y[x] = true;\n        t.inform(\"state-changed\", y);\n    };\n    function w(event, x) {\n        var y = {\n        };\n        for (var z in x) {\n            if (u(z)) {\n                y[z] = true;\n            };\n        };\n        for (var aa in y) {\n            t.inform(\"state-changed\", y);\n            break;\n        };\n    };\n    l.subscribe(\"state-changed\", function(x, y) {\n        for (var z in y) {\n            (!r[z] && v(z));;\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             else {\n                var va = (ua.end - ua.start);\n                if ((ua.thread_ids.length < va)) {\n                    la = true;\n                };\n            }\n        ;\n            if ((!pa || (ua.end > pa))) {\n                pa = ua.end;\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    function x(ga, ha) {\n        v.forEach(function(ia) {\n            u.forEach(function(ja) {\n                w(ga, ha, ia, ja);\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            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            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            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                return;\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                break;\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                    ia[ja][ka].to_remove.push(na);\n                };\n                la.removeResources(ia[ja][ka].to_remove);\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        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    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    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        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        var la = ia.folder;\n        if (ia.is_archived) {\n            la = m.ACTION_ARCHIVED;\n        };\n        if (ga._threadlistOrderMap[la]) {\n            return la;\n        }\n         else return null\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        if (ia.unread_count) {\n            ja.push(m.UNREAD);\n        };\n        if (!ia.is_canonical) {\n            ja.push(m.GROUPS);\n        };\n        return ja;\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    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            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            this._threadInformer.updatedThreadlist();\n        }.bind(this));\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                na.setError(false);\n                this._serverRequests.fetchThreadlistInfo(na.getCurrentArraySize(), pa.length, ia, ((ja == i.ALL) ? null : ja), ma);\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    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        }.bind(this));\n        this._serverRequests.subscribe(\"update-thread-ids\", function(na, oa) {\n            ka(this, oa);\n        }.bind(this));\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            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    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    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    function da(ma, na) {\n        return ma._unreadResources[na].getResource(w);\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    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            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            ma._threadInformer.updatedUnreadState();\n        });\n        ((na.message_counts || [])).forEach(function(pa) {\n            if ((pa.unread_count === undefined)) {\n                return\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                ma._threadInformer.updatedUnreadState();\n            }\n        ;\n        });\n        ((na.actions || [])).forEach(function(pa) {\n            if (pa.is_forward) {\n                return\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                v.forEach(function(ta) {\n                    if ((ta != oa)) {\n                        ha(ma, ta, ra);\n                    };\n                });\n            }\n             else {\n                oa = pa.folder;\n                if (!la(oa)) {\n                    return\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                 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    function ga(ma, na, oa, pa) {\n        if (ma._maxCount[na]) {\n            return\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    function ha(ma, na, oa, pa) {\n        if (ma._maxCount[na]) {\n            return\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            var sa = qa[oa];\n            if (((pa && (typeof sa == \"number\")) && (pa < sa))) {\n                return\n            };\n            if ((oa in qa)) {\n                delete qa[oa];\n                ba(ma, na, qa);\n                ma._threadInformer.updatedUnreadState();\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    function ja(ma, na) {\n        return na.map(ma._serverRequests.convertThreadIDIfAvailable.bind(ma._serverRequests));\n    };\n    function ka(ma, na) {\n        v.forEach(function(oa) {\n            var pa = da(ma, oa);\n            if (!pa) {\n                return\n            };\n            for (var qa in na) {\n                var ra = na[qa];\n                if (pa[qa]) {\n                    pa[ra] = pa[qa];\n                    delete pa[qa];\n                }\n            ;\n            };\n            ba(ma, oa, pa);\n        });\n    };\n    function la(ma) {\n        return s(v, ma);\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        for (var pa in oa) {\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    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    q(w.prototype, {\n        getUnseenCount: function() {\n            if (this.exceedsMaxCount()) {\n                v.error(\"unguarded_unseen_count_fetch\", {\n                });\n                return 0;\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        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    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    function z(ja) {\n        return ja._unseenResources.getResource(t);\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    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                var xa = ga(ja, wa.thread_ids), ya = ja._lastSeenTimestamp;\n                if ((la && la.seen_timestamp)) {\n                    ya = la.seen_timestamp;\n                };\n                ca(ja, ya, xa);\n                if ((la && (la.unseen_count > s))) {\n                    ja._maxCount = true;\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         else {\n            if (ja._maxCount) {\n                return\n            };\n            var ma = ka.actions;\n            if ((!ma || !(ma.length))) {\n                return\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                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                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                 else if (((ra == k.CHANGE_READ_STATUS) && qa.mark_as_read)) {\n                    oa[ta] = sa;\n                }\n            ;\n            };\n            da(ja, na);\n            ea(ja, oa);\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            var na = {\n            }, oa = (z(ja) || {\n            });\n            for (var pa in oa) {\n                if ((oa[pa] !== true)) {\n                    var qa = oa[pa];\n                    if (fa(ja, qa)) {\n                        na[pa] = qa;\n                    };\n                }\n            ;\n            };\n            var ra = q(r(la, true), na);\n            x(ja, ra);\n            ja._threadInformer.updatedUnseenState();\n        }\n    ;\n    };\n    function da(ja, ka) {\n        if (ja._maxCount) {\n            return\n        };\n        var la = {\n        }, ma = false;\n        for (var na in ka) {\n            var oa = ka[na];\n            if (fa(ja, oa)) {\n                la[na] = oa;\n                ma = true;\n            }\n        ;\n        };\n        if (!ma) {\n            return\n        };\n        y(ja, function(pa) {\n            for (var qa in la) {\n                var ra = la[qa];\n                if ((!pa[qa] && fa(ja, ra))) {\n                    pa[qa] = la[qa];\n                };\n            };\n            x(ja, pa);\n            ja._threadInformer.updatedUnseenState();\n        });\n    };\n    function ea(ja, ka, la) {\n        var ma = false;\n        for (var na in ka) {\n            ma = true;\n            break;\n        };\n        if (ma) {\n            y(ja, function(oa) {\n                var pa = false;\n                for (var qa in ka) {\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                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    function fa(ja, ka) {\n        var la = h.convertActionIDToTimestamp(ka);\n        return (la > ja._lastSeenTimestamp);\n    };\n    function ga(ja, ka) {\n        return ka.map(ja._serverRequests.convertThreadIDIfAvailable.bind(ja._serverRequests));\n    };\n    function ha(ja, ka) {\n        var la = z(ja);\n        if (!la) {\n            return\n        };\n        for (var ma in ka) {\n            var na = ka[ma];\n            if (la[ma]) {\n                la[na] = la[ma];\n                delete la[ma];\n            }\n        ;\n        };\n        x(ja, la);\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        return null;\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        for (var ma in la) {\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    e.exports = w;\n});\n__d(\"MercuryThreadMetadataRawRenderer\", [\"Event\",\"CSS\",\"DOM\",\"MercuryActionStatus\",\"MercuryErrorInfo\",\"MessagingTag\",\"MercuryStatusTemplates\",\"Tooltip\",\"URI\",\"WebMessengerPermalinkConstants\",\"cx\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"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            for (var ca in z) {\n                if (aa[ca]) {\n                    ba[ca] = z[ca];\n                    delete z[ca];\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            for (var ha in z) {\n                ga[ha] = z[ha];;\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            }.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.name;\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             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             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             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            if (Array.isArray(aa)) {\n                aa = i.create(\"span\", {\n                }, aa);\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            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            return x;\n        },\n        renderShortNames: function(u) {\n            if ((u.length == 1)) {\n                return [u[0].name,]\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            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            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.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            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        return v;\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    k.subscribe(\"state-changed\", function(p, q) {\n        for (var r in m) {\n            var s = i.scry(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    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    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 Date(sa)).toLocaleDateString();\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 Date(sa), (g[\"24h_times\"] ? \"H:i\" : \"g:ia\"));\n                }\n            ;\n                i.setContent(pa, ra);\n                h.show(pa);\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                va = \"_9i\";\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             else h.hide(pa);\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.name\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.name\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(\"name\"),];\n            if (ua) {\n                va.push(ua);\n            };\n            oa(this, pa, va, sa);\n            if ((pa.folder && ta)) {\n                na(qa.getNode(\"folderBadge\"), pa.folder);\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                if (pa.is_forwarded_snippet) {\n                    i.appendContent(qa, i.create(\"strong\", {\n                        className: \"_55q_\"\n                    }, \"Forwarded Message:\"));\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                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                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            var ua = pa.participants.length;\n            if (pa.is_subscribed) {\n                ua--;\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                            name: va.short_name,\n                            conversation_snippet: ta\n                        }));\n                    }\n                     else i.appendContent(qa, ta);\n                ;\n                });\n            }\n             else i.appendContent(qa, ta);\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        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        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            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            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.name) {\n                return ta\n            };\n            return ha._(\"{conversation_name} [with {participant_list}]\", {\n                conversation_name: ua.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        return pa.snippet_attachments.filter(function(qa) {\n            return (qa.attach_type === m.PHOTO);\n        });\n    };\n    function la(pa, qa) {\n        var ra = ka(qa);\n        if ((ra.length === 0)) {\n            return\n        };\n        var sa = ra[0].thumbnail_url;\n        if (!sa) {\n            return\n        };\n        var ta = (((ra.length == 1)) ? \"snippet-thumbnail-single\" : \"snippet-thumbnail-multiple\"), ua = pa.getNode(ta);\n        if (!ua) {\n            return\n        };\n        var va = i.find(ua, \"i\");\n        x.set(va, \"background-image\", ((\"url(\" + sa) + \")\"));\n        h.show(ua);\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            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                        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                    name: ya,\n                    num_photos: ua.length\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                    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                    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.name);\n                h.addClass(db, l.getAttachIconClass(cb.icon_type));\n                i.appendContent(ra, db);\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    function oa(pa, qa, ra, sa) {\n        ra = da(ra);\n        if (qa.name) {\n            var ta = q.renderRawTitleWithUnreadCount(qa.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        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        r.getMulti(ua, function(va) {\n            q.renderParticipantListWithNoThreadName(pa._serverRequests.getServerThreadIDNow(qa.thread_id), qa, ua, va, ra, sa);\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    g(h.prototype, {\n        dirty: function() {\n            if (!this._isDirty) {\n                this._isDirty = true;\n                this._doPaint.bind(this).defer();\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        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    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(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            if ((this._statusClass && this._statusNode)) {\n                h.conditionClass(this._statusNode, this._statusClass, (this._count > 0));\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            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.localStorage;\n    };\n    i.available = function() {\n        try {\n            return !!a.localStorage;\n        } catch (m) {\n            return false;\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            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.sessionStorage;\n    };\n    j.available = function() {\n        try {\n            return !!a.sessionStorage;\n        } catch (m) {\n            return false;\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            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    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            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        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            for (var o in h) {\n                var p = h[o];\n                if (p.available()) {\n                    m = o;\n                    break;\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             else if ((!m.available || !m.available())) {\n                this._backend = new k();\n            }\n             else this._backend = m;\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            } catch (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                try {\n                    this._backend.set((this._key_prefix + m), n);\n                } catch (o) {\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                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                 else o = undefined;\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                    try {\n                        this._backend.set((this._key_prefix + m), r);\n                    } catch (p) {\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    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        if (k) {\n            return g.create(\"span\", {\n                className: k\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        if (j.text) {\n            var m = [j.text,];\n            if (j.verified) {\n                m.push(g(\"xsmall\"));\n            };\n            l.push(h.create(\"span\", {\n                className: \"text\"\n            }, m));\n        }\n    ;\n        if (j.subtext) {\n            l.push(h.create(\"span\", {\n                className: \"subtext\"\n            }, [j.subtext,]));\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        return n;\n    };\n    i.className = \"basic\";\n    e.exports = i;\n});\n__d(\"TypeaheadView\", [\"Event\",\"ArbiterMixin\",\"BasicTypeaheadRenderer\",\"CSS\",\"DOM\",\"Parent\",\"$\",\"copyProperties\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"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.content = m(q);\n        this.showBadges = r.showBadges;\n        n(this, r);\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(event) {\n            if ((event.button != 2)) {\n                this.select(true);\n                event.kill();\n            }\n        ;\n        },\n        mouseover: function(event) {\n            if (this.ignoreMouseover) {\n                this.ignoreMouseover = false;\n                return;\n            }\n        ;\n            if (this.visible) {\n                this.highlight(this.getIndex(event));\n            };\n        },\n        reset: function(q) {\n            if (!q) {\n                this.disableAutoSelect = false;\n            };\n            this.justRendered = false;\n            this.justShown = false;\n            this.index = -1;\n            this.items = [];\n            this.results = [];\n            this.value = \"\";\n            this.content.innerHTML = \"\";\n            this.inform(\"reset\");\n            return this;\n        },\n        getIndex: function(event) {\n            return this.items.indexOf(l.byTag(event.getTarget(), \"li\"));\n        },\n        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            (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            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            this.justRendered = true;\n            if (!this.results.length) {\n                this.justShown = true;\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            this.results = r;\n            k.setContent(this.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.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            r = r.bind(this);\n            var t = this.showBadges, u = q.map(function(w, x) {\n                if (!t) {\n                    w.verified = null;\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            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            if ((q > (this.items.length - 1))) {\n                q = -1;\n            }\n             else if ((q < -1)) {\n                q = (this.items.length - 1);\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                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             else (this.accessibilityElement && this.accessibilityElement.removeAttribute(\"aria-activedescendant\"));\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            if ((r !== false)) {\n                this.inform(\"highlight\", {\n                    index: q,\n                    selected: this.results[q],\n                    element: this.selected\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    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    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            while ((((m >= 0) && (m < this.items.length)) && !this.isHighlightable(this.results[m]))) {\n                m = (m + 1);;\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            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                r.classNames = s;\n                r.groupIndex = p[s];\n                r.indexInGroup = (o[r.groupIndex].length - 1);\n                o[r.groupIndex].push(r);\n            };\n            for (s in this.typeObjects) {\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            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             else for (var w = 0; (w < o.length); ++w) {\n                t = t.concat(o[w]);;\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            if (n.markup) {\n                n.text = n.markup;\n                delete n.markup;\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        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            if ((m.length === 0)) {\n                return -1\n            };\n            var o = 0;\n            while ((!this.isHighlightable(m) && (o < m.length))) {\n                o++;;\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            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            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    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            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            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            if (this.layer.isShown()) {\n                this.layer.updatePosition();\n            }\n             else this.layer.show();\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        return k;\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        for (var l in i) {\n            h[i[l]] = l;\n            k.push(i[l]);\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\", [\"Event\",\"ArbiterMixin\",\"DOM\",\"DOMClone\",\"Focus\",\"UserAgent\",\"copyProperties\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"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    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                this._initListeners();\n            }\n             else {\n                this.input.value = \"\";\n                this.input.files = null;\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(event) {\n            this.inform(\"change\", event);\n            var q = this.input.form;\n            if ((q && (o < 9))) {\n                g.fire(q, \"change\", event);\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    m.MIN_INTERVAL = 2000;\n    k(m.prototype, g, {\n        start: function() {\n            if (this._polling) {\n                return this\n            };\n            this._requests = 0;\n            this.request();\n            return this;\n        },\n        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            return this;\n        },\n        skip: function() {\n            this._skip = true;\n            return this;\n        },\n        reset: function() {\n            return this.stop().start();\n        },\n        request: function() {\n            this._cancelRequest();\n            this._polling = true;\n            if (!o()) {\n                return this._done()\n            };\n            if (this._muted) {\n                return this\n            };\n            if ((++this._requests > this._config.maxRequests)) {\n                return this._done()\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            return this;\n        },\n        isPolling: function() {\n            return this._polling;\n        },\n        isMuted: function() {\n            return this._muted;\n        },\n        setInterval: function(p) {\n            if (p) {\n                this._config.interval = p;\n                this.start();\n            }\n        ;\n        },\n        getInterval: function() {\n            return this._config.interval;\n        },\n        _cleanup: function() {\n            if (this._handle) {\n                clearTimeout(this._handle);\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        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    function o() {\n        return (j.user == i.get(\"c_user\"));\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    setInterval(function() {\n        for (var w = 0; (w < m.length); w++) {\n            m[w]();;\n        };\n    }, n, false);\n    function o() {\n        return (((/c_user=(\\d+)/.test(document.cookie) && RegExp.$1)) || 0);\n    };\n    var p = h.user, q = navigator.onLine;\n    function r() {\n        if (!q) {\n            q = true;\n            l.inform(l.ONLINE, q);\n        }\n    ;\n    };\n    function s() {\n        if (q) {\n            q = false;\n            l.inform(l.ONLINE, q);\n        }\n    ;\n    };\n    if (j.ie()) {\n        if ((j.ie() >= 8)) {\n            window.attachEvent(\"onload\", function() {\n                document.body.ononline = r;\n                document.body.onoffline = s;\n            });\n        }\n         else m.push(function() {\n            ((navigator.onLine ? r : s))();\n        });\n    ;\n    }\n     else if (window.addEventListener) {\n        if (!j.chrome()) {\n            window.addEventListener(\"online\", r, false);\n            window.addEventListener(\"offline\", s, false);\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    var u = Date.now();\n    function v() {\n        var w = 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        return y;\n    };\n    m.push(v);\n    m.push(function() {\n        if ((window.onerror != i.onerror)) {\n            window.onerror = i.onerror;\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\",\"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(\"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    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.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            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                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                this.view.init();\n                this.view.setTypeahead(this.element);\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                this.core.init(this.getData(), this.getView(), this.getElement());\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            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                    }.bind(this));\n                ;\n                }\n                 else this.enableBehavior(s);\n            ;\n            }, this);\n        }\n    });\n    q.initNow = function(r, s, t) {\n        if (t) {\n            t.init(r);\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        var v = false;\n        try {\n            v = (document.activeElement === r);\n        } catch (w) {\n        \n        };\n        if (v) {\n            q.initNow(s, t, u);\n        }\n         else var x = k.listen(r, \"focus\", function() {\n            q.initNow(s, t, u);\n            x.remove();\n        })\n    ;\n    };\n    e.exports = q;\n});\n__d(\"TypeaheadCore\", [\"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(\"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    s(u.prototype, i, {\n        events: [\"blur\",\"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.find(x, \"div.wrap\");\n            this.hiddenInput = k.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            this.initView();\n            this.initData();\n            this.initEvents();\n            this.initToggle();\n            this._exclusions = [];\n        },\n        initInput: function() {\n            this.element = k.find(this.root, \".textInput\");\n            var v = k.scry(this.element, \"input\")[0];\n            if (v) {\n                this.element = v;\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            }.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                if ((this.loading != this.fetching)) {\n                    this.loading = this.fetching;\n                    this.inform(\"loading\", {\n                        loading: this.loading\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                blur: r(this, \"blur\"),\n                focus: r(this, \"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            if ((q.firefox() < 4)) {\n                v.keypress = v.keydown;\n                delete v.keydown;\n            }\n        ;\n            g.listen(this.element, v);\n            g.listen(this.element, \"keypress\", r(this, \"keypress\"));\n        },\n        initToggle: function() {\n            this.subscribe(\"blur\", this.view.hide.bind(this.view));\n            this.subscribe(\"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        blur: function() {\n            if (this.selecting) {\n                this.selecting = false;\n                return;\n            }\n        ;\n            this.inform(\"blur\");\n        },\n        click: function() {\n            var v = n.get(this.element);\n            if ((v.start == v.end)) {\n                this.element.select();\n            };\n            this.inform(\"click\");\n        },\n        focus: function() {\n            this.checkValue();\n            this.inform(\"focus\");\n        },\n        keyup: function() {\n            if ((this.resetOnKeyup && !this.getValue())) {\n                this.view.reset();\n            };\n            this.checkValue();\n        },\n        keydown: function(event) {\n            if ((!this.view.isVisible() || this.view.isEmpty())) {\n                this.checkValue.bind(this).defer();\n                return;\n            }\n        ;\n            switch (g.getKeyCode(event)) {\n              case o.TAB:\n                this.handleTab(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            event.kill();\n        },\n        keypress: function(event) {\n            if ((this.view.getSelection() && (g.getKeyCode(event) == o.RETURN))) {\n                this.view.select();\n                event.kill();\n            }\n        ;\n        },\n        handleTab: function(event) {\n            if (this.preventFocusChangeOnTab) {\n                if (this.view.getSelection()) {\n                    event.kill();\n                }\n                 else event.prevent();\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        afterSelect: function() {\n            (this.keepFocused ? l.set(this.element) : this.element.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            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            if ((this.selectedText && (this.selectedText != v))) {\n                this.unselect();\n            };\n            var w = 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            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    e.exports = u;\n});\n__d(\"setIntervalAcrossTransitions\", [], function(a, b, c, d, e, f) {\n    function g(h, i) {\n        return setInterval(h, i, false);\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                if (z) {\n                    t = JSON.parse(z);\n                };\n            }\n        ;\n            if ((t && ((!t.user || (t.user === j.user))))) {\n                return t\n            };\n        } catch (y) {\n            u.warn(\"getcookie_error\");\n        };\n        return null;\n    };\n    function w() {\n        return parseInt((Date.now() / 1000), 10);\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            var z = {\n                v: o,\n                time: w(),\n                user: j.user\n            };\n            for (var aa in r) {\n                z[aa] = i.applyWithGuard(r[aa], r, [(y && y[aa]),], function(ea) {\n                    ea.presence_subcookie = aa;\n                });;\n            };\n            var ba = JSON.stringify(z);\n            if (p) {\n                ba = (\"E\" + h.encode(ba));\n            };\n            if (l.hasUserCookie()) {\n                var ca = ba.length;\n                if ((ca > 1024)) {\n                    u.warn(\"big_cookie\", ca);\n                };\n                var da = (m.getRequestURI(false).isSecure() && !!g.get(\"csm\"));\n                g.set(q, ba, null, null, da);\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            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    function z() {\n        t = Date.now();\n        j.store();\n        da(s);\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        return ia;\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        ja.ut = t;\n        for (var ka = 0, la = p.length; (ka < la); ka++) {\n            h.applyWithGuard(p[ka], null, [ja,]);;\n        };\n        s = ja;\n        return s;\n    };\n    function da(ia) {\n        v++;\n        t = ba(ia.ut);\n        if (!r) {\n            r = m(ga, o);\n        };\n        s = ia;\n        if ((u === null)) {\n            u = ia;\n        };\n        for (var ja = 0, ka = q.length; (ja < ka); ja++) {\n            h.applyWithGuard(q[ja], null, [ia,]);;\n        };\n        v--;\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        return false;\n    };\n    function fa() {\n        var ia = y();\n        if (ea(ia)) {\n            s = ia;\n        };\n        return s;\n    };\n    function ga() {\n        var ia = y();\n        if (ea(ia)) {\n            da(ia);\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    var ha = {\n        doSync: function(ia) {\n            if (v) {\n                return\n            };\n            if (ia) {\n                z();\n            }\n             else aa();\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    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                if (g.isQueryMatch(m, o.default_name)) {\n                    o.text = o.default_name;\n                    return;\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                o.text = o.default_name;\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    a.TypeaheadBehaviors.buildBestAvailableNames = function(f) {\n        f.enableBehavior(e);\n    };\n}, 3);\n__d(\"TypingDetector\", [\"Event\",\"function-extensions\",\"ArbiterMixin\",\"Input\",\"Run\",\"copyProperties\",\"createObjectFrom\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"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.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            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        _update: function(event) {\n            var o = g.getKeyCode(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                 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        _transition: function(o) {\n            this.reset();\n            this._currentState = o;\n            this.inform(\"change\", o);\n        },\n        _recordKeystroke: function() {\n            this._lastKeystrokeTime = Date.now();\n            if (!this._checkTimer) {\n                this._checkTimer = this._checkTyping.bind(this).defer(this._timeout);\n            };\n        },\n        _checkTyping: function() {\n            var o = (this._lastKeystrokeTime + this._timeout), p = Date.now();\n            if ((p > o)) {\n                this._transition(n.INACTIVE);\n            }\n             else {\n                clearTimeout(this._checkTimer);\n                this._checkTimer = this._checkTyping.bind(this).defer(((o - p) + 10));\n            }\n        ;\n        }\n    });\n    e.exports = n;\n});\n__d(\"ClearableTypeahead\", [\"Event\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = {\n        resetOnCloseButtonClick: function(i, j) {\n            g.listen(j, \"click\", function() {\n                var k = i.getCore();\n                k.getElement().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    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    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        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            m.push(n);\n        }\n    ;\n        if (k.text) {\n            var o = [k.text,];\n            if (k.verified) {\n                o.push(g(\"xsmall\"));\n            };\n            m.push(h.create(\"span\", {\n                className: \"text\"\n            }, o));\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        var s = h.create(\"li\", {\n            className: (k.type || \"\")\n        }, m);\n        if (k.text) {\n            s.setAttribute(\"aria-label\", k.text);\n        };\n        return s;\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        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        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             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             else if (ea.test(va)) {\n                break;\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});");
// 10449
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o7,"s8ead2a036e92884168d3fc8f84e49d83e5bb9b50");
// 10450
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 fin118keys = ((window.top.JSBNG_Replay.forInKeys)((ra))), fin118i = (0);\n            (0);\n            for (; (fin118i < fin118keys.length); (fin118i++)) {\n                ((sa) = (fin118keys[fin118i]));\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 fin119keys = ((window.top.JSBNG_Replay.forInKeys)((ra))), fin119i = (0);\n            (0);\n            for (; (fin119i < fin119keys.length); (fin119i++)) {\n                ((sa) = (fin119keys[fin119i]));\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 fin120keys = ((window.top.JSBNG_Replay.forInKeys)((ra.settings))), fin120i = (0);\n                    var va;\n                    for (; (fin120i < fin120keys.length); (fin120i++)) {\n                        ((va) = (fin120keys[fin120i]));\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 fin121keys = ((window.top.JSBNG_Replay.forInKeys)((ra))), fin121i = (0);\n                var ta;\n                for (; (fin121i < fin121keys.length); (fin121i++)) {\n                    ((ta) = (fin121keys[fin121i]));\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 fin122keys = ((window.top.JSBNG_Replay.forInKeys)((v))), fin122i = (0);\n                var sa;\n                for (; (fin122i < fin122keys.length); (fin122i++)) {\n                    ((sa) = (fin122keys[fin122i]));\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 fin123keys = ((window.top.JSBNG_Replay.forInKeys)((v))), fin123i = (0);\n                var sa;\n                for (; (fin123i < fin123keys.length); (fin123i++)) {\n                    ((sa) = (fin123keys[fin123i]));\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 fin124keys = ((window.top.JSBNG_Replay.forInKeys)((x))), fin124i = (0);\n            var z;\n            for (; (fin124i < fin124keys.length); (fin124i++)) {\n                ((z) = (fin124keys[fin124i]));\n                {\n                    var aa = x[z], ba = y[z];\n                    {\n                        var fin125keys = ((window.top.JSBNG_Replay.forInKeys)((aa))), fin125i = (0);\n                        var ca;\n                        for (; (fin125i < fin125keys.length); (fin125i++)) {\n                            ((ca) = (fin125keys[fin125i]));\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 fin126keys = ((window.top.JSBNG_Replay.forInKeys)((p))), fin126i = (0);\n                var x;\n                for (; (fin126i < fin126keys.length); (fin126i++)) {\n                    ((x) = (fin126keys[fin126i]));\n                    {\n                        m.inform(\"thread-read-changed\", p);\n                        break;\n                    };\n                };\n            };\n        ;\n            {\n                var fin127keys = ((window.top.JSBNG_Replay.forInKeys)((n))), fin127i = (0);\n                var x;\n                for (; (fin127i < fin127keys.length); (fin127i++)) {\n                    ((x) = (fin127keys[fin127i]));\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 fin128keys = ((window.top.JSBNG_Replay.forInKeys)((t))), fin128i = (0);\n                (0);\n                for (; (fin128i < fin128keys.length); (fin128i++)) {\n                    ((x) = (fin128keys[fin128i]));\n                    {\n                        m.inform(\"messages-received\", t);\n                        break;\n                    };\n                };\n            };\n        ;\n            {\n                var fin129keys = ((window.top.JSBNG_Replay.forInKeys)((u))), fin129i = (0);\n                (0);\n                for (; (fin129i < fin129keys.length); (fin129i++)) {\n                    ((x) = (fin129keys[fin129i]));\n                    {\n                        m.inform(\"messages-reordered\", u);\n                        break;\n                    };\n                };\n            };\n        ;\n            {\n                var fin130keys = ((window.top.JSBNG_Replay.forInKeys)((v))), fin130i = (0);\n                (0);\n                for (; (fin130i < fin130keys.length); (fin130i++)) {\n                    ((x) = (fin130keys[fin130i]));\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 fin131keys = ((window.top.JSBNG_Replay.forInKeys)((tb.roger))), fin131i = (0);\n                var yb;\n                for (; (fin131i < fin131keys.length); (fin131i++)) {\n                    ((yb) = (fin131keys[fin131i]));\n                    {\n                        var zb = sb._serverToClientIDs.getResource(yb);\n                        if (zb) {\n                            var ac = tb.roger[yb];\n                            xb[zb] = {\n                            };\n                            {\n                                var fin132keys = ((window.top.JSBNG_Replay.forInKeys)((ac))), fin132i = (0);\n                                var bc;\n                                for (; (fin132i < fin132keys.length); (fin132i++)) {\n                                    ((bc) = (fin132keys[fin132i]));\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 fin133keys = ((window.top.JSBNG_Replay.forInKeys)((tb.threads))), fin133i = (0);\n                (0);\n                for (; (fin133i < fin133keys.length); (fin133i++)) {\n                    ((vb) = (fin133keys[fin133i]));\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 fin134keys = ((window.top.JSBNG_Replay.forInKeys)((tb.messages))), fin134i = (0);\n                (0);\n                for (; (fin134i < fin134keys.length); (fin134i++)) {\n                    ((vb) = (fin134keys[fin134i]));\n                    {\n                        if (!ub.messages[vb]) {\n                            ub.messages[vb] = {\n                            };\n                        }\n                    ;\n                    ;\n                        {\n                            var fin135keys = ((window.top.JSBNG_Replay.forInKeys)((tb.messages[vb]))), fin135i = (0);\n                            var wb;\n                            for (; (fin135i < fin135keys.length); (fin135i++)) {\n                                ((wb) = (fin135keys[fin135i]));\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 fin136keys = ((window.top.JSBNG_Replay.forInKeys)((tb))), fin136i = (0);\n            var ub;\n            for (; (fin136i < fin136keys.length); (fin136i++)) {\n                ((ub) = (fin136keys[fin136i]));\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 fin137keys = ((window.top.JSBNG_Replay.forInKeys)((sb))), fin137i = (0);\n            (0);\n            for (; (fin137i < fin137keys.length); (fin137i++)) {\n                ((vb) = (fin137keys[fin137i]));\n                {\n                    ga(ub, ha(sb[vb], vb));\n                ;\n                };\n            };\n        };\n    ;\n        {\n            var fin138keys = ((window.top.JSBNG_Replay.forInKeys)((tb))), fin138i = (0);\n            (0);\n            for (; (fin138i < fin138keys.length); (fin138i++)) {\n                ((vb) = (fin138keys[fin138i]));\n                {\n                    ga(ub, ha(tb[vb], vb));\n                ;\n                };\n            };\n        };\n    ;\n        var xb = {\n            client: wb\n        };\n        {\n            var fin139keys = ((window.top.JSBNG_Replay.forInKeys)((ub))), fin139i = (0);\n            var yb;\n            for (; (fin139i < fin139keys.length); (fin139i++)) {\n                ((yb) = (fin139keys[fin139i]));\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 fin140keys = ((window.top.JSBNG_Replay.forInKeys)((ub.threads))), fin140i = (0);\n                var xb;\n                for (; (fin140i < fin140keys.length); (fin140i++)) {\n                    ((xb) = (fin140keys[fin140i]));\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 fin141keys = ((window.top.JSBNG_Replay.forInKeys)((tb.messages.thread_ids))), fin141i = (0);\n                    var vb;\n                    for (; (fin141i < fin141keys.length); (fin141i++)) {\n                        ((vb) = (fin141keys[fin141i]));\n                        {\n                            ub.push(fb(qa(this, vb)));\n                        ;\n                        };\n                    };\n                };\n            ;\n                {\n                    var fin142keys = ((window.top.JSBNG_Replay.forInKeys)((tb.messages.user_ids))), fin142i = (0);\n                    var wb;\n                    for (; (fin142i < fin142keys.length); (fin142i++)) {\n                        ((wb) = (fin142keys[fin142i]));\n                        {\n                            ub.push(fb(((\"user:\" + wb))));\n                        ;\n                        };\n                    };\n                };\n            ;\n                {\n                    var fin143keys = ((window.top.JSBNG_Replay.forInKeys)((tb.messages.group_ids))), fin143i = (0);\n                    var xb;\n                    for (; (fin143i < fin143keys.length); (fin143i++)) {\n                        ((xb) = (fin143keys[fin143i]));\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 fin144keys = ((window.top.JSBNG_Replay.forInKeys)((sb))), fin144i = (0);\n                var wb;\n                for (; (fin144i < fin144keys.length); (fin144i++)) {\n                    ((wb) = (fin144keys[fin144i]));\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 fin145keys = ((window.top.JSBNG_Replay.forInKeys)((tb))), fin145i = (0);\n                var wb;\n                for (; (fin145i < fin145keys.length); (fin145i++)) {\n                    ((wb) = (fin145keys[fin145i]));\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 fin146keys = ((window.top.JSBNG_Replay.forInKeys)((ub))), fin146i = (0);\n                var yb;\n                for (; (fin146i < fin146keys.length); (fin146i++)) {\n                    ((yb) = (fin146keys[fin146i]));\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 fin147keys = ((window.top.JSBNG_Replay.forInKeys)((sb))), fin147i = (0);\n                (0);\n                for (; (fin147i < fin147keys.length); (fin147i++)) {\n                    ((wb) = (fin147keys[fin147i]));\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 fin148keys = ((window.top.JSBNG_Replay.forInKeys)((fa))), fin148i = (0);\n                    var ia;\n                    for (; (fin148i < fin148keys.length); (fin148i++)) {\n                        ((ia) = (fin148keys[fin148i]));\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 fin149keys = ((window.top.JSBNG_Replay.forInKeys)((ea))), fin149i = (0);\n                    var ja;\n                    for (; (fin149i < fin149keys.length); (fin149i++)) {\n                        ((ja) = (fin149keys[fin149i]));\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 fin150keys = ((window.top.JSBNG_Replay.forInKeys)((pa))), fin150i = (0);\n            var qa;\n            for (; (fin150i < fin150keys.length); (fin150i++)) {\n                ((qa) = (fin150keys[fin150i]));\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 fin151keys = ((window.top.JSBNG_Replay.forInKeys)((ra))), fin151i = (0);\n                var ya;\n                for (; (fin151i < fin151keys.length); (fin151i++)) {\n                    ((ya) = (fin151keys[fin151i]));\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 fin152keys = ((window.top.JSBNG_Replay.forInKeys)((pa))), fin152i = (0);\n            var qa;\n            for (; (fin152i < fin152keys.length); (fin152i++)) {\n                ((qa) = (fin152keys[fin152i]));\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 fin153keys = ((window.top.JSBNG_Replay.forInKeys)((fb))), fin153i = (0);\n            var gb;\n            for (; (fin153i < fin153keys.length); (fin153i++)) {\n                ((gb) = (fin153keys[fin153i]));\n                {\n                    db[gb] = {\n                    };\n                    {\n                        var fin154keys = ((window.top.JSBNG_Replay.forInKeys)((fb[gb]._messages))), fin154i = (0);\n                        var hb;\n                        for (; (fin154i < fin154keys.length); (fin154i++)) {\n                            ((hb) = (fin154keys[fin154i]));\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 fin155keys = ((window.top.JSBNG_Replay.forInKeys)((gb))), fin155i = (0);\n                var sb;\n                for (; (fin155i < fin155keys.length); (fin155i++)) {\n                    ((sb) = (fin155keys[fin155i]));\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 fin156keys = ((window.top.JSBNG_Replay.forInKeys)((bb._messagesNeedingAttachmentData))), fin156i = (0);\n            var db;\n            for (; (fin156i < fin156keys.length); (fin156i++)) {\n                ((db) = (fin156keys[fin156i]));\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 fin157keys = ((window.top.JSBNG_Replay.forInKeys)((la))), fin157i = (0);\n                    var ma;\n                    for (; (fin157i < fin157keys.length); (fin157i++)) {\n                        ((ma) = (fin157keys[fin157i]));\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 fin158keys = ((window.top.JSBNG_Replay.forInKeys)((p))), fin158i = (0);\n                var r;\n                for (; (fin158i < fin158keys.length); (fin158i++)) {\n                    ((r) = (fin158keys[fin158i]));\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 fin159keys = ((window.top.JSBNG_Replay.forInKeys)((n))), fin159i = (0);\n            var o;\n            for (; (fin159i < fin159keys.length); (fin159i++)) {\n                ((o) = (fin159keys[fin159i]));\n                {\n                    if (!k[o]) {\n                        k[o] = {\n                        };\n                    }\n                ;\n                ;\n                    {\n                        var fin160keys = ((window.top.JSBNG_Replay.forInKeys)((n[o]))), fin160i = (0);\n                        var p;\n                        for (; (fin160i < fin160keys.length); (fin160i++)) {\n                            ((p) = (fin160keys[fin160i]));\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 fin161keys = ((window.top.JSBNG_Replay.forInKeys)((x))), fin161i = (0);\n            var z;\n            for (; (fin161i < fin161keys.length); (fin161i++)) {\n                ((z) = (fin161keys[fin161i]));\n                {\n                    if (u(z)) {\n                        y[z] = true;\n                    }\n                ;\n                ;\n                };\n            };\n        };\n    ;\n        {\n            var fin162keys = ((window.top.JSBNG_Replay.forInKeys)((y))), fin162i = (0);\n            var aa;\n            for (; (fin162i < fin162keys.length); (fin162i++)) {\n                ((aa) = (fin162keys[fin162i]));\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 fin163keys = ((window.top.JSBNG_Replay.forInKeys)((y))), fin163i = (0);\n            var z;\n            for (; (fin163i < fin163keys.length); (fin163i++)) {\n                ((z) = (fin163keys[fin163i]));\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 fin164keys = ((window.top.JSBNG_Replay.forInKeys)((na))), fin164i = (0);\n                var qa;\n                for (; (fin164i < fin164keys.length); (fin164i++)) {\n                    ((qa) = (fin164keys[fin164i]));\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 fin165keys = ((window.top.JSBNG_Replay.forInKeys)((oa))), fin165i = (0);\n            var pa;\n            for (; (fin165i < fin165keys.length); (fin165i++)) {\n                ((pa) = (fin165keys[fin165i]));\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 fin166keys = ((window.top.JSBNG_Replay.forInKeys)((oa))), fin166i = (0);\n                var pa;\n                for (; (fin166i < fin166keys.length); (fin166i++)) {\n                    ((pa) = (fin166keys[fin166i]));\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 fin167keys = ((window.top.JSBNG_Replay.forInKeys)((ka))), fin167i = (0);\n            var na;\n            for (; (fin167i < fin167keys.length); (fin167i++)) {\n                ((na) = (fin167keys[fin167i]));\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 fin168keys = ((window.top.JSBNG_Replay.forInKeys)((la))), fin168i = (0);\n                var qa;\n                for (; (fin168i < fin168keys.length); (fin168i++)) {\n                    ((qa) = (fin168keys[fin168i]));\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 fin169keys = ((window.top.JSBNG_Replay.forInKeys)((ka))), fin169i = (0);\n            var na;\n            for (; (fin169i < fin169keys.length); (fin169i++)) {\n                ((na) = (fin169keys[fin169i]));\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 fin170keys = ((window.top.JSBNG_Replay.forInKeys)((ka))), fin170i = (0);\n                    var qa;\n                    for (; (fin170i < fin170keys.length); (fin170i++)) {\n                        ((qa) = (fin170keys[fin170i]));\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 fin171keys = ((window.top.JSBNG_Replay.forInKeys)((ka))), fin171i = (0);\n            var ma;\n            for (; (fin171i < fin171keys.length); (fin171i++)) {\n                ((ma) = (fin171keys[fin171i]));\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 fin172keys = ((window.top.JSBNG_Replay.forInKeys)((la))), fin172i = (0);\n            var ma;\n            for (; (fin172i < fin172keys.length); (fin172i++)) {\n                ((ma) = (fin172keys[fin172i]));\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 fin173keys = ((window.top.JSBNG_Replay.forInKeys)((z))), fin173i = (0);\n                var ca;\n                for (; (fin173i < fin173keys.length); (fin173i++)) {\n                    ((ca) = (fin173keys[fin173i]));\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 fin174keys = ((window.top.JSBNG_Replay.forInKeys)((z))), fin174i = (0);\n                var ha;\n                for (; (fin174i < fin174keys.length); (fin174i++)) {\n                    ((ha) = (fin174keys[fin174i]));\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 fin175keys = ((window.top.JSBNG_Replay.forInKeys)((m))), fin175i = (0);\n            var r;\n            for (; (fin175i < fin175keys.length); (fin175i++)) {\n                ((r) = (fin175keys[fin175i]));\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 fin176keys = ((window.top.JSBNG_Replay.forInKeys)((h))), fin176i = (0);\n                var o;\n                for (; (fin176i < fin176keys.length); (fin176i++)) {\n                    ((o) = (fin176keys[fin176i]));\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 fin177keys = ((window.top.JSBNG_Replay.forInKeys)((this.typeObjects))), fin177i = (0);\n                (0);\n                for (; (fin177i < fin177keys.length); (fin177i++)) {\n                    ((s) = (fin177keys[fin177i]));\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 fin178keys = ((window.top.JSBNG_Replay.forInKeys)((i))), fin178i = (0);\n            var l;\n            for (; (fin178i < fin178keys.length); (fin178i++)) {\n                ((l) = (fin178keys[fin178i]));\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: ((window.top.JSBNG_Replay.push)((window.top.JSBNG_Replay.s8ead2a036e92884168d3fc8f84e49d83e5bb9b50_739), 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(((window.top.JSBNG_Replay.push)((window.top.JSBNG_Replay.s8ead2a036e92884168d3fc8f84e49d83e5bb9b50_757), 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 fin179keys = ((window.top.JSBNG_Replay.forInKeys)((r))), fin179i = (0);\n                var aa;\n                for (; (fin179i < fin179keys.length); (fin179i++)) {\n                    ((aa) = (fin179keys[fin179i]));\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});");
// 10527
JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_190[0](o107,false,"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yn/r/-5WtOV0lZ_r.js",o112);
// undefined
o107 = null;
// undefined
o112 = null;
// 10531
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o7,"if (self.CavalryLogger) {\n    CavalryLogger.start_js([\"hfrQl\",]);\n}\n;\n__d(\"FriendBrowserCheckboxController\", [\"AsyncRequest\",\"CSS\",\"DOM\",\"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(\"Event\"), k = b(\"Form\"), l = b(\"OnVisible\"), m = b(\"$\"), n = b(\"bind\"), o = b(\"copyProperties\"), p = b(\"ge\");\n    function q() {\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.find(s, \".friendBrowserCheckboxContentGrid\");\n            this._loadingIndicator = i.find(s, \".friendBrowsingCheckboxContentLoadingIndicator\");\n            this._checkboxResults = i.find(s, \".friendBrowserCheckboxResults\");\n            this._contentPager = i.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        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, event, t) {\n            if (this._simplified) {\n                this.getNew(true);\n                return;\n            }\n        ;\n            if (!((((event == \"select\")) && t.selected))) {\n                return\n            };\n            var u = this.buildNewCheckbox(s, t.selected.text, t.selected.uid), v = i.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            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                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            if (h.hasClass(r, \"async_saving\")) {\n                return false\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        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            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                h.hide(this._loadingIndicator);\n                this.updatePagerAndExtraData(t.pager, t.extra_data);\n            }\n        ;\n        },\n        updatePagerAndExtraData: function(r, s) {\n            i.setContent(this._contentPager, r);\n            if (this._infiniteScroll) {\n                this.setupOnVisible();\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    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    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.name.length);\n                    fa++;\n                }\n                 else break;\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    function m(da) {\n        return o(da, t(da));\n    };\n    function n(da) {\n        var ea = aa(da);\n        return o(ea, p(da, ea));\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    function p(da, ea) {\n        return u(s(da), t(ea));\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    function s(da) {\n        return ba(da).map(function(ea) {\n            return [ea.offset,ea.name.length,];\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        return ea;\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        return fa.concat(da.slice(ga), ea.slice(ha));\n    };\n    function v(da, ea, fa) {\n        if (!fa) {\n            return false\n        };\n        var ga = x(fa, da);\n        return (w(da, ea, fa, ga) || w(da, ea, fa, (ga + 1)));\n    };\n    function w(da, ea, fa, ga) {\n        if (!fa[ga]) {\n            return false\n        };\n        var ha = fa[ga][0], ia = fa[ga][1];\n        return !((((((da + ea) - 1) < ha)) || ((da > ((ha + ia) - 1)))));\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        return ga;\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                name: ia,\n                offset: ja\n            });\n        });\n        return ea;\n    };\n    function z(da) {\n        return (da ? da.replace(/\\\\([^\\\\])/g, \"$1\").replace(/\\\\\\\\/g, \"\\\\\") : null);\n    };\n    function aa(da) {\n        return da.replace(j, function(ea, fa, ga, ha, ia) {\n            return z(ha);\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.name);\n            ea += (ga.token.length - ia.length);\n            if ((ha >= 0)) {\n                return {\n                    id: ga.id,\n                    name: ia,\n                    type: ga.type,\n                    offset: ha\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            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\", [\"Event\",\"AsyncRequest\",\"DOM\",\"CSS\",\"Focus\",\"Input\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"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    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            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            this._lastQuery = p;\n            if ((p === \"\")) {\n                this.clearResults();\n                return;\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        setTimer: function() {\n            if ((this._timerID !== 0)) {\n                clearTimeout(this._timerID);\n            };\n            this._timerID = 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        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            j.removeClass(p, \"hidden_elem\");\n        }\n    });\n    e.exports = o;\n});\n__d(\"RequestsJewel\", [\"Arbiter\",\"AsyncRequest\",\"AsyncSignal\",\"ChannelConstants\",\"CSS\",\"DOM\",\"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(\"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    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            this.jewel.subscribe(\"marked-seen\", u(this._markSeenCallback, this));\n            this.jewel.subscribe(\"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            }.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, \"scroll\", this._handleScroll.bind(this), m.Priority._BUBBLE);\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                    ++this._requestCount;\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            var aa;\n            if ((y && y.type)) {\n                aa = parseInt(y.type, 10);\n                if (isNaN(aa)) {\n                    aa = undefined;\n                };\n            }\n        ;\n            return {\n                requester: z,\n                type: aa\n            };\n        },\n        _handleLink: function(x, 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            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            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                var aa = l.find(y, \"a\");\n                if (!aa) {\n                    return\n                };\n                var ba = r.getElementPosition(aa, \"viewport\").y;\n                if ((ba == this._lastLinkPosition)) {\n                    return\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        _addRequest: function(x, y) {\n            if (!y) {\n                return\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            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                new h().setURI(\"/ajax/friends/jewel/request_markup\").setData(ea).setHandler(da).send();\n            }\n        ;\n        },\n        _onMarkupCallback: function(x, y, z) {\n            var aa = z.getPayload();\n            if (!aa) {\n                return\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                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            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            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        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                    setTimeout(function() {\n                        y.click();\n                    }, 100);\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        _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        _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 = 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             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            (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\", [\"Event\",\"Arbiter\",\"ArbiterMixin\",\"CSS\",\"DOM\",\"HTML\",\"Keys\",\"TabIsolation\",\"Toggler\",\"copyProperties\",\"emptyFunction\",\"reportData\",], function(a, b, c, d, e, f) {\n    var g = b(\"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.name = u.name;\n            this.root = t;\n            this.countNew = 0;\n            this.initialCount = 0;\n            this.escHandler = null;\n            s._instancesByName[this.name] = this;\n            var v = k.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(\"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.name) && this.update(y));\n            }.bind(this));\n            h.subscribe(\"jewel/count-initial\", function(x, y) {\n                ((y.jewel == this.name) && this.setInitial(y));\n            }.bind(this));\n            h.subscribe(\"jewel/reset\", function(x, y) {\n                ((y.jewel == this.name) && this.reset());\n            }.bind(this));\n            s._resizeListener = (s._resizeListener || (function() {\n                var x = null;\n                return g.listen(window, \"resize\", function() {\n                    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.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.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            this.inform(\"updated\", t);\n        },\n        setInitial: function(t) {\n            this.initialCount = t;\n        },\n        setupEvents: function() {\n            this.escHandler = g.listen(document.documentElement, \"keydown\", function(t) {\n                if (((t.keyCode === m.ESC) && this.isOpen())) {\n                    o.hide(this.root);\n                };\n            }.bind(this));\n        },\n        removeEvents: function() {\n            if (this.escHandler) {\n                this.escHandler.remove();\n            };\n        },\n        markSeen: function() {\n            h.inform(\"jewel/count-updated\", {\n                jewel: this.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.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    }, t = function(u, v) {\n        p = u;\n        q = h.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            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\",\"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(\"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.find(this._contentArea, \".jewelContent\");\n        this._loadingElement = l.find(this._contentArea, \".jewelLoading\");\n        this._loadMoreButton = l.find(this._contentArea, \"._8y5\");\n        this._loadMoreLink = l.find(this._contentArea, \"a._8y6\");\n        this._currentFolder = r.INBOX;\n        this._jewelFolderLinks = [];\n        this._jewelFolderLinks[r.INBOX] = l.find(oa, \"._1sde\");\n        this._jewelFolderLinks[r.OTHER] = l.find(oa, \"._1sdf\");\n        this._jewelFolderCounts = [];\n        this._jewelFolderCounts[r.INBOX] = l.find(oa, \"._1sdg\");\n        this._jewelFolderCounts[r.OTHER] = l.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, \"scroll\", da(ha, 50, this));\n        m.listen(this._loadMoreLink, \"click\", this.renderMoreThreads.bind(this));\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            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            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                y.set(ra, sa, \"above\", \"right\");\n                m.listen(ra, \"click\", function(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            if ((j.MessagesJewelOpenInChat && i.canOpenChatTab(oa))) {\n                m.listen(na.getRoot(), \"click\", function(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            m.listen(na.getRoot(), \"mouseover\", function(event) {\n                var ta = na.getRoot();\n                if (!t.byClass(ta, \"notifNegativeBase\")) {\n                    k.addClass(ta, \"selected\");\n                };\n            });\n            m.listen(na.getRoot(), \"mouseout\", function(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    function ia() {\n        return ((this._contentArea.scrollTop + this._contentArea.clientHeight) >= (this._contentArea.scrollHeight - 1));\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        this._folderIsLoading[oa] = false;\n        k.removeClass(this._loadMoreButton, \"async_saving\");\n        this.render();\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    function la() {\n        ma.bind(this)(r.INBOX);\n        ma.bind(this)(r.OTHER);\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        var pa = this._jewelFolderCounts[na];\n        if ((oa > 0)) {\n            if ((oa == q.MAX_UNREAD_COUNT)) {\n                oa += \"+\";\n            };\n            l.setContent(pa, ea._(\"({unread_count})\", {\n                unread_count: oa\n            }));\n        }\n         else l.setContent(pa, \"\");\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.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    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    function o() {\n        if (this._listenForLoad) {\n            this._ua.add_event(\"loaded\");\n            this._listenForLoad = false;\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__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        for (var p in o) {\n            m.inform((\"count/\" + p), o[p]);;\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                    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                }), t = r.defer(60000);\n            }\n        ;\n        });\n    });\n    g.subscribe(h.getArbiterType(\"messaging\"), function(o, p) {\n        var q = j({\n        }, p.obj), event = (q.event || \"\");\n        delete q.type;\n        delete q.event;\n        m.inform(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    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\", [\"Event\",\"CSS\",\"DOM\",\"Keys\",\"TabbableElements\",\"Toggler\",], function(a, b, c, d, e, f) {\n    var g = b(\"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.focus());\n        l.getInstance(m).hide();\n    };\n    function q(x) {\n        if (!x) {\n            return false\n        };\n        h.removeClass(x, \"selected\");\n        x.setAttribute(\"aria-selected\", \"false\");\n    };\n    function r(x) {\n        if (!x) {\n            return false\n        };\n        h.addClass(x, \"selected\");\n        x.setAttribute(\"aria-selected\", \"true\");\n        var y = k.find(x);\n        if (y[0]) {\n            y[0].focus();\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        q(y);\n        r(aa);\n    };\n    function t(x) {\n        if ((!l.isShown() || (l.getActive() !== m))) {\n            return true\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    function u(x, y) {\n        m = y.getActive();\n        n = i.scry(m, \"[role=\\\"menuitem\\\"]\");\n        if (!o) {\n            o = g.listen(document.documentElement, \"keydown\", t);\n        };\n    };\n    function v() {\n        if ((l.getActive() == m)) {\n            q(i.scry(m, \".selected\")[0]);\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    e.exports = h;\n});\n__d(\"NegativeNotif\", [\"Animation\",\"AsyncRequest\",\"CSS\",\"DataStore\",\"DOM\",\"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(\"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.find(this.obj, \".notif_x\");\n        this.confirmingMsg = k.find(this.obj, \".confirmingMsg\");\n        this.mainLink = k.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    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(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, event).uai(\"click\");\n            q(\"click\", this.xLink, event, null, v);\n            return false;\n        },\n        gentleFirstReceiptNotifHover: function(event) {\n            event.stop();\n            var u = k.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 Date();\n                this.gentleFirstReceiptUnhoverEventHandler = l.listen(document.documentElement, \"mouseover\", this.gentleFirstReceiptNotifUnhover.bind(this));\n            }\n        ;\n            if (!this.gentleFirstReceiptNoClickEventHandler) {\n                this.gentleFirstReceiptNoClickEventHandler = l.listen(u, \"click\", this.gentleFirstReceiptNoClick.bind(this));\n            };\n        },\n        gentleFirstReceiptNotifUnhover: function(event) {\n            if ((m.byClass(event.getTarget(), \"uiContextualLayer\") || m.byClass(event.getTarget(), \"uiScrollableAreaTrack\"))) {\n                return false\n            };\n            var u = new 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            this._removeGentleFirstReceiptListeners();\n            this._gentleFirstReceiptTooltipFadeAway();\n            this._gentleFirstReceiptXButtonFadeAway();\n            var v = this;\n            setTimeout(function() {\n                v._gentleFirstReceiptUIFadeAway();\n            }, this.GENTLE_FRUI_DELAY_FADE_TIME);\n            this._sendFirstReceiptYesToServer();\n        },\n        gentleFirstReceiptNoClick: function(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            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        onTurnedOff: function() {\n            this.userUnsubscribed = true;\n            i.hide(this.confirmingMsg);\n            this._notifMainLinkShowUp(k.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.find(this.obj, \".confirmedMsg\"));\n            k.remove(k.find(this.obj, \".confirmedMsg\"));\n        },\n        onMarkedSpam: function() {\n            k.remove(k.find(this.obj, \".confirmedMsg\"));\n            this._fadeAway(k.find(this.obj, \".spamMsg\"));\n        },\n        onFirstReceiptYes: function() {\n            this._hideFirstReceiptDiv();\n            this._fadeAway(k.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            var u = k.find(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            var u = k.find(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.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.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        _removeGentleFirstReceiptListeners: function() {\n            if (this.gentleFirstReceiptHoverEventHandler) {\n                this.gentleFirstReceiptHoverEventHandler.remove();\n            };\n            if (this.gentleFirstReceiptUnhoverEventHandler) {\n                this.gentleFirstReceiptUnhoverEventHandler.remove();\n            };\n            if (this.gentleFirstReceiptNoClickEventHandler) {\n                this.gentleFirstReceiptNoClickEventHandler.remove();\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            this._adjustContainer(this.obj);\n        },\n        _hideFirstReceiptDiv: function() {\n            i.removeClass(this.obj, \"first_receipt\");\n            i.hide(k.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            for (var m in j) {\n                var n = Number(j[m]);\n                if (((typeof j[m] == \"string\") && isNaN(n))) {\n                    return j[m]\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                l += 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\",\"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(\"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    function ba(da) {\n        return (da == y);\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    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        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                    ja = this._getField(da, \"readness\");\n                    ka = this._getField(da, \"time\");\n                    if ((ka > ea)) {\n                        return false\n                    };\n                    na = (la ? da : ia);\n                    this._remove(na);\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            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            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            if (!((ea && this.unseenVsUnread))) {\n                i.removeClass(da, \"_5c9q\");\n                i.addClass(da, \"_5c9_\");\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            this._setReadStateToggleReadness(ga, fa);\n            var ha = function(event) {\n                if ((this.unseenVsUnread && this.isUnreadId(da))) {\n                    this.markReadSignalServer([da,]);\n                };\n                o.kill(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            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            i.show(this.noItemsElement);\n        },\n        _insert: function(da) {\n            this._list.remove(da.id);\n            var ea = null;\n            this._list.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        _remove: function(da) {\n            var ea = this._getField(da, \"obj\");\n            if (!ea) {\n                return false\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                    if (ea) {\n                        this._markReadInDom(da[ga], ha.obj);\n                    }\n                     else this.animateMarkRead(ha.obj);\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        markSeen: function(da) {\n            if (!w(da)) {\n                return\n            };\n            if (!this.unseenVsUnread) {\n                this.markRead(da);\n                return;\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            if (ea) {\n                this.unseenCount = this.getUnseenIds().length;\n                this.inform(ca.UNREAD_COUNT_CHANGE_TYPE);\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            if (((fa.readness == x) && (ea == z))) {\n                return false\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            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        animateMarkRead: function(da) {\n            if (!i.hasClass(da, ca.ITEM_UNREAD_CLASS)) {\n                return\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            if ((this.shouldBlockAnimation && this.shouldBlockAnimation(da))) {\n                return\n            };\n            fa.defer(10000);\n        },\n        stopAnimation: function(da) {\n            ((da in this.animations) && this.animations[da].stop());\n            delete this.animations[da];\n            return true;\n        },\n        insertMany: function(da, ea) {\n            if (((\"object\" == typeof da) && !u(da))) {\n                for (var fa in da) {\n                    var ga = da[fa];\n                    this.insert(fa, ga.time, ga.markup, true, ea, (ga.alt_id || null));\n                };\n                (this.noItemsElement && i.hide(this.noItemsElement));\n            }\n             else (this.isEmpty() && this.showNoNotifications());\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                        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        _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\",\"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(\"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 || 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    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.content = ia(this.contentID);\n            this.jewelFlyout = ia(\"fbNotificationsFlyout\");\n            this.footer = n.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.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.find(this.wrapper, \"span.jewelCount span\");\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        _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.content, {\n                mouseover: function(event) {\n                    var ta = 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                mouseout: function(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        _setupScroll: function() {\n            this._scrollArea = n.scry(this.jewelFlyout, \"div.uiScrollableAreaWrap\")[0];\n            this._morePagerLink = n.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        _initializeScrollEvents: function() {\n            p.listen(this._scrollArea, \"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(event) {\n            var pa = v.byTag(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        onMouseOver: function(event) {\n            if (m.hasClass(event.getTarget(), \"jewelButton\")) {\n                this.ua = na(\"notifs\", event.target, event, {\n                    mode: \"DEDUP\"\n                }).uai(\"mouseover\", \"jewel\").add_event(\"hover\");\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        onHide: function() {\n            this.animate = false;\n            (this.animation && this.animation.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        _handleInsert: function(pa, qa) {\n            if (qa.is_new) {\n                this._newDataFromInsert = true;\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            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                for (var pa in this.negativeNotifs) {\n                    if (pa) {\n                        ((this.negativeNotifs[pa] instanceof r) && this.negativeNotifs[pa].reset());\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            }.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            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            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                var sa = pa;\n                (ra ? this.alertList.markSeen(qa) : this.alertList.markRead(qa, sa));\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        _updateDisplay: function() {\n            if (!this.content) {\n                return\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            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            var qa = ba(\"/ajax/notifications/get.php\"), ra = (pa || this.loadingIndicator);\n            if (this.currentFetchRequest) {\n                return true\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                this.fetchListeners = [];\n            }\n        ;\n            (a.ArbiterMonitor && h.inform(\"notifs/fetched\", \"\", h.BEHAVIOR_STATE));\n            var sa = qa.generated, ta = Math.round((Date.now() / 1000));\n            if (((ta - sa) > 15)) {\n                sa = ta;\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                this._updateScrollDataStructures();\n                if ((this.isNotifJewelOpen() && this.afterFirstFetch)) {\n                    this.animate = true;\n                };\n                this.afterFirstFetch = true;\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            var ua = this.alertList.getDomObj(pa);\n            if (ua) {\n                k.loadModules([\"LiveTimer\",], function(va) {\n                    va.addTimeStamps(ua);\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        _displayNotification: function(pa, qa) {\n            var ra = qa.obj;\n            if ((typeof this.useDesktopNotifications == \"undefined\")) {\n                this.useDesktopNotifications = ((this.allowDesktopNotifications && window.webkitNotifications) && (window.webkitNotifications.checkPermission() === 0));\n            };\n            if (this.useDesktopNotifications) {\n                k.loadModules([\"DesktopNotifications\",], function(sa) {\n                    sa.addNotification(ra.alert_id);\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        _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            var ra = qa.obj;\n            this.alertList.markSeen(ra.alert_ids);\n        },\n        _hideOverflow: function() {\n            if (!this.isNotifJewelOpen()) {\n                return\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(document.documentElement, \"tinyViewport\") && !m.hasClass(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            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            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                    xa += \"px\";\n                }\n            ;\n            }\n             else xa += \"px\";\n        ;\n            if (((this.useInfiniteScroll && this.animate) && (xa != \"100%\"))) {\n                (this.animation && this.animation.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        _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                    m.removeClass(this.firstReceiptMap[qa].obj, \"first_receipt\");\n                }\n            ;\n                this.firstReceiptMap[qa] = pa;\n                m.addClass(pa.obj, \"first_receipt\");\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(document.body, \"hasVoiceBar\", v);\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    function y() {\n        s = null;\n    };\n    function z(da, ea) {\n        if ((ea.obj.profile_id && (ea.obj.profile_id == s))) {\n            ba();\n        };\n    };\n    function aa(da) {\n        h.subscribe(o, da);\n    };\n    function ba() {\n        m.getNextURI().go();\n    };\n    var ca = {\n        initVoiceBar: function() {\n            if (u) {\n                return\n            };\n            t = g(\"pagesVoiceBarContent\");\n            v = j.hasClass(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\", [\"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(\"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.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    function ba(ka) {\n        var la = \"._59fb\";\n        return (!p.byClass(ka, \"hasSmurfbar\") && n.scry(h(\"blueBar\"), la).length);\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].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    function da(ka) {\n        return new l().setURI(ka).send();\n    };\n    function ea() {\n        return da(\"/ajax/privacy/privacy_lite/increment_masher_tip_count\");\n    };\n    function fa() {\n        return da(\"/ajax/privacy/privacy_lite/dismiss_masher_tip\");\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                new l(\"/ajax/privacy/privacy_lite/loader\").setData({\n                    from_megaphone: ka\n                }).send();\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        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        registerFinalReminderFlyout: function(ka) {\n            if ((ia || !aa())) {\n                return\n            };\n            var la = n.find(ka.getRoot(), \"._57bk\"), ma = ka.getContext();\n            if (ba(ma)) {\n                ka.setOffsetY(-5);\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(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        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            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        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        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                m.addClass(la, \"_2va0\");\n                if (ma) {\n                    new l(\"/ajax/privacy/privacy_lite/kill_intro\").send();\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, \"focus\", m.show.curry(la));\n        },\n        registerMessageFilterSettingOnClick: function(ka, la) {\n            var ma = n.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        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                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\", [\"Event\",\"Arbiter\",\"AsyncRequest\",\"ContextualHelpSearchController\",\"CSS\",\"DOM\",\"Parent\",\"copyProperties\",\"csx\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"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.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.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.find(q, \"._4_8m\");\n                    l.setContent(ca, ba);\n                    k.addClass(q, \"_4_8l\");\n                }.bind(this)).send();\n            };\n        }.bind(this)));\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            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    g.extend(j, h);\n    j.prototype._getDuration = i.thatReturns(500);\n    e.exports = j;\n});\n__d(\"PrivacyLiteNUXController\", [\"AsyncRequest\",\"CSS\",\"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(\"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            if (y.showOnExpand) {\n                w._attachFlyoutListener();\n            }\n             else w._detachFlyoutListener();\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            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            p.setSticky(true);\n            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            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(event) {\n                if (n.byClass(event.getTarget(), u)) {\n                    w._cleanup();\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        _detachFlyoutListener: function() {\n            if (w.flyoutSubscription) {\n                w.flyoutSubscription.unsubscribe();\n                w.flyoutSubscription = null;\n            }\n        ;\n        },\n        _cleanup: function() {\n            if (!w.tourStarted) {\n                return\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            if (w._maskListener) {\n                w._maskListener.remove();\n                w._maskListener = null;\n            }\n        ;\n        }\n    };\n    function x(y, z) {\n        v.push(o.subscribe(y, z));\n    };\n    e.exports = w;\n});\n__d(\"ViewasChromeBar\", [\"Event\",\"Arbiter\",\"AsyncRequest\",\"CSS\",\"DOM\",\"Focus\",\"ModalMask\",\"PageTransitions\",\"Parent\",\"cx\",\"csx\",], function(a, b, c, d, e, f) {\n    var g = b(\"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    function v(x) {\n        j.addClass(x, \"_7g7\");\n        var y = k.find(x, \"._7g0\");\n        l.set(k.find(y, \".textInput\"));\n    };\n    var w = {\n        initChromeBar: function(x) {\n            if (t) {\n                return\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        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                 else {\n                    if (((r <= 0) && !i)) {\n                        continue;\n                    };\n                    m.push(t);\n                    q++;\n                    r--;\n                }\n            ;\n            };\n            if (((r > 0) && (o.length > 0))) {\n                n = n.concat(o.slice(0, r));\n            };\n            if (!i) {\n                return m.concat(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    function h(o, p) {\n        return Math.min(p.maxNumberAds, ((p.maxNumberRemovedResults + p.maxNumberResultsAndAds) - o));\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        return q;\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    function k(o, p) {\n        return (p.indexOf(String(o)) != -1);\n    };\n    function l(o, p, q, r) {\n        if (n.isSelfPromoted(o)) {\n            return false\n        };\n        if (((q + p.length) < r.maxNumberResultsAndAds)) {\n            return false\n        };\n        return true;\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        if ((s == q)) {\n            return false\n        };\n        if ((s == r)) {\n            return false\n        };\n        return true;\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            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            for (var w in t) {\n                if (p[w]) {\n                    for (var x in p[w]) {\n                        var y = p[w][x];\n                        if ((q && q.hasOwnProperty(y.uid))) {\n                            continue;\n                        };\n                        r.push(y);\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                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                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                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                if (u.hasOwnProperty(ba.s_account)) {\n                    (ba.setDebugString && ba.setDebugString(((\"filtered: ad account \" + ba.s_account) + \" already selected\")));\n                    continue;\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                (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            return t;\n        },\n        hasTopResult: function(o, p, q) {\n            if ((o == null)) {\n                return false\n            };\n            if ((o.type == \"user\")) {\n                return false\n            };\n            if ((o.type == \"grammar\")) {\n                return false\n            };\n            if ((o.score > q.v0)) {\n                return true\n            };\n            if ((o.s_value > q.v3)) {\n                return true\n            };\n            if ((o.s_value > p.s_value)) {\n                return true\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            return true;\n        },\n        setOrganicECPM: function(o, p) {\n            if ((o == null)) {\n                return\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            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            return p;\n        },\n        getTopAdPosition: function(o, p, q) {\n            if ((o.length < 1)) {\n                return null\n            };\n            if ((p.length < 1)) {\n                return null\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                return o.length;\n            }\n        ;\n            if (n.hasTopResult(o[0], p[0], q)) {\n                return 1\n            };\n            return 0;\n        }\n    };\n    e.exports = n;\n});\n__d(\"TypeaheadSearchSponsored\", [\"Event\",\"Arbiter\",\"CSS\",\"DOM\",\"URI\",\"copyProperties\",\"TypeaheadSearchSponsoredUtils\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"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    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                    this._sponsoredEntries[v][u.uid] = u;\n                };\n                if (r.s_bootstrap_id) {\n                    this._sBootstrapID = r.s_bootstrap_id;\n                };\n                if (r.organic_s_value) {\n                    this._organicECPM = l(this._organicECPM, r.organic_s_value);\n                };\n            }\n        ;\n        }.bind(this)),];\n        if (o.auctionOptions.bootstrap) {\n            this._dataSubscriptions.push(this._data.subscribe(\"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        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            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.content) {\n                j.scry(this._view.content, \"a.report\").forEach(i.hide);\n            };\n            if (((!q.element || !q.selected) || !q.selected.s_token)) {\n                return\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        }.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            if (this._hideReasonDialog) {\n                this._hideReasonDialog.hide();\n                this._hideReasonDialog = null;\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        p = o.initResults(p);\n        if (!q) {\n            return p\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        var v = {\n        }, w = p.map(function(ba) {\n            if (ba.s_categories) {\n                v[ba.uid] = ba.s_categories;\n            };\n            return String(ba.uid);\n        }), x = m.selectAds(w, v, t, s);\n        if ((x.length === 0)) {\n            return p\n        };\n        if (m.hasTopResult(p[0], x[0], s)) {\n            o.setTopResult(p);\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        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    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(event) {\n            this._view.index = -1;\n            this._view.highlight(-1, false);\n            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            if (p.path) {\n                q.pathOverride = true;\n                q.orig_path = q.path;\n                q.path = p.path;\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            if (r.debug) {\n                if ((!p.subtextOverride && p.subtext)) {\n                    p.subtextOverride = p.subtext;\n                };\n                if (p.subtextOverride) {\n                    p.subtextOverride += ((\" \\u00b7 (Debug: \" + q.text) + \")\");\n                }\n                 else p.subtextOverride = ((\"(Debug: \" + q.text) + \")\");\n            ;\n            }\n        ;\n            p.type = q.type;\n            p.render_type = q.render_type;\n            p.is_self = false;\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        if ((q > r)) {\n            p.splice(r, 0, p.splice(q, 1)[0]);\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        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            t = m.buildResultIndices(p);\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        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            if (s.renderTypeOverride) {\n                s.render_type = s.orig_render_type;\n                s.renderTypeOverride = false;\n            }\n        ;\n            s.rankType = ((s.rankType || s.render_type) || s.type);\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        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    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\", [\"Event\",\"Arbiter\",\"AsyncResponse\",\"DataSource\",\"HashtagSearchResultUtils\",\"copyProperties\",\"createArrayFrom\",\"BingScalingCommon\",], function(a, b, c, d, e, f) {\n    var g = b(\"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    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    p.prototype.fetch = function(q, r, s) {\n        s = (s || {\n        });\n        s.fetch_start = 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: 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            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            if (((r.bootstrap && !s.no_data) && (this._bootstrapRequestsPending > 0))) {\n                r.bootstrap = false;\n                --this._bootstrapRequestsPending;\n                (!this._bootstrapRequestsPending && this._bootstrapPostProcess());\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        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        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            q = q.slice(0, (q.length - 1));\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        }.bind(this));\n        return (r < this._maxResults);\n    };\n    p.prototype._bootstrapPostProcess = function() {\n        var q = {\n            time: 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            for (var s in r) {\n                q = this.getEntry(s);\n                (q && (q.index = r[s]));\n            };\n            this.setExclusions(this._leanPayload.blocked);\n            this._leanPayload = null;\n        }\n    ;\n    };\n    p.prototype._updateMaxResults = function() {\n        var q = (window.innerHeight || 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        this.fetch(this.bootstrapEndpoint, s, {\n            bootstrap: true,\n            type: q\n        });\n        ++this._bootstrapRequestsPending;\n    };\n    p.prototype._fetchOnUse = function(q, r) {\n        for (var s in this.bootstrapData) {\n            (!q.hasOwnProperty(s) && (q[s] = this.bootstrapData[s]));;\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    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        if (this._bootstrapped) {\n            return\n        };\n        var r = {\n            filter: [\"event\",],\n            no_cache: 1\n        };\n        this._fetchOnUse(r, {\n            type: \"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             else this._bootstrapFetch(\"user\", {\n                filter: [\"user\",]\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        if ((q > 0)) {\n            this.inform(\"extra_bootstrap\", {\n                time: Date.now()\n            }, h.BEHAVIOR_PERSISTENT);\n        };\n        this._fetchOnUseRequests = [];\n    };\n    p.prototype.onLoad = function(q, r) {\n        this.inform(\"onload\", {\n            time: Date.now()\n        }, h.BEHAVIOR_PERSISTENT);\n        if (q) {\n            this.bootstrap.bind(this, r).defer();\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        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        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            var v = q[r[u]];\n            if (v) {\n                s.push((v.join ? v.join(\" \") : v));\n            };\n        };\n        return s.join(\" \");\n    };\n    p.prototype.getDynamicHashtagResult = function(q) {\n        if ((!q || !this._enabledHashtag)) {\n            return\n        };\n        var r = k.getHashtagFromQuery(q);\n        if (!r) {\n            return\n        };\n        var s = (\"hashtag:\" + r), t = this.getEntry(s);\n        if (!t) {\n            this.processEntries([k.makeTypeaheadResult(r),], q);\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\", [\"Event\",\"function-extensions\",\"Arbiter\",\"Class\",\"DOM\",\"Input\",\"Parent\",\"TypeaheadCore\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"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    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(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        if (t) {\n            var v = j.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                u.defer();\n            }.bind(this), g.Priority.URGENT);\n        }\n    ;\n    };\n    p.prototype.select = function() {\n        this.reset();\n        this.element.focus();\n        (function() {\n            this.element.blur();\n        }).bind(this).defer();\n    };\n    p.prototype.handleTab = function(event) {\n        var q = this.view.getQuerySuggestion(this.value);\n        if (q) {\n            k.setValue(this.element, q);\n            this.checkValue();\n            event.kill();\n        }\n         else o.handleTab.call(this, event);\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    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(event) {\n        event.prevent();\n    };\n    t.prototype.render = function(v, w, x) {\n        if (this._bucketize) {\n            w = u(w);\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        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        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        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        if ((w <= 0)) {\n            return o._(\"See results for {query}\", {\n                query: v\n            })\n        };\n        if (this._redirectToUsersResultsPage) {\n            return r._(\"Filter results for {query}\", [r.param(\"query\", v),])\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        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            (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    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    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    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                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        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    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            aa[ba[z]].push(y);\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        return ca;\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\", [\"Event\",\"AsyncRequest\",\"Banzai\",\"Keys\",\"TypeaheadUtil\",\"Vector\",\"ge\",\"clickRefAction\",\"copyProperties\",\"userAction\",], function(a, b, c, d, e, f) {\n    var g = b(\"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    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 = 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.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(\"focus\", function(event) {\n            if (!this.stats.session_start_time) {\n                this.recordStat(\"session_start_time\", Date.now());\n            };\n        }.bind(this));\n        this.core.subscribe(\"blur\", function(event) {\n            var s = Date.now();\n            for (var t in this._inflightRequests) {\n                var u = this._inflightRequests[t], v = (s - u);\n                this.recordAvgStat(\"search_endpoint_ms_from_js\", v);\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            if (!this.stats.first_query_time) {\n                this.recordStat(\"first_query_time\", Date.now());\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] = Date.now();\n        }.bind(this));\n        this.data.subscribe(\"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            if (t.coeff2_ts) {\n                this.bootstrapStats.coeff2_ts = t.coeff2_ts;\n            };\n            if ((typeof t.browserCacheHit != \"undefined\")) {\n                this.recordCountStat((t.browserCacheHit ? \"bootstrap_cachehits\" : \"bootstrap_cachemisses\"));\n            };\n            if (this._inflightRequests[t.value]) {\n                delete this._inflightRequests[t.value];\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        }.bind(this));\n        g.listen(this.element, \"keydown\", function(event) {\n            if ((g.getKeyCode(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             else this._backspacing = false;\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            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    q.prototype.recordAppendStat = function(s, t) {\n        if (!this.appendStats.hasOwnProperty(s)) {\n            this.appendStats[s] = [];\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\", Date.now());\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        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        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        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        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        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            this.recordStat(\"backend_queries\", this.backendQueries);\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        var t = this.stats;\n        for (var u in this.avgStats) {\n            var v = this.avgStats[u];\n            t[u] = (v[0] / v[1]);\n        };\n        for (var w in this.appendStats) {\n            t[w] = JSON.stringify(this.appendStats[w]);;\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            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.random() > 113062)) {\n                s.recorded_first = \"legacy\";\n                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                setTimeout(this.submitThroughAsyncRequest.bind(this, s), 0);\n            }\n        ;\n            break;\n          case \"random_recording\":\n            if ((Math.random() > 113386)) {\n                this.submitThroughAsyncRequest(s);\n            }\n             else i.post(this._banzaiRoute, s, {\n                delay: 0,\n                retry: true\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        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    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        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        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    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    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            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        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            if (n.verified) {\n                r.push(g(\"xsmall\"));\n            };\n            p.push(h.create(\"span\", {\n                className: \"text\"\n            }, r));\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            var w = (n.message ? \"preCategory\" : \"category\");\n            p.push(h.create(\"span\", {\n                className: w\n            }, v));\n        }\n    ;\n        if (n.message) {\n            p.push(h.create(\"span\", {\n                className: \"category\"\n            }, [n.message,]));\n        };\n        var x = (n.subtextOverride || n.subtext);\n        if (x) {\n            p.push(h.create(\"span\", {\n                className: \"subtext\"\n            }, [x,]));\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            aa += ((((aa.indexOf(\"?\") > 0) ? \"&\" : \"?\")) + \"ref=ts&fref=ts\");\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.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.onclick = this.ignoreClick;\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        return ca;\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    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    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            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            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    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    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            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            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        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    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    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        }.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\",\"Event\",\"copyProperties\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"CSS\"), i = b(\"DOM\"), j = b(\"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.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.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.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        }.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    g(i.prototype, {\n        _filterRegistry: null,\n        _filter: function(j, k) {\n            if (((j.type !== \"user\") || !j.memorialized)) {\n                return true\n            };\n            var l = h.parse(j.text).tokens;\n            if (((l.length === 1) && h.isExactMatch(k, j.text))) {\n                return true\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    a.TypeaheadBehaviors.regulateMemorializedUsers = function(f) {\n        f.enableBehavior(e);\n    };\n}, 3);");
// 10532
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o7,"sa0cdb1bc3c127a88a086a13f4a6ca1502f98adf1");
// 10533
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 fin180keys = ((window.top.JSBNG_Replay.forInKeys)((o))), fin180i = (0);\n            var p;\n            for (; (fin180i < fin180keys.length); (fin180i++)) {\n                ((p) = (fin180keys[fin180i]));\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 fin181keys = ((window.top.JSBNG_Replay.forInKeys)((j))), fin181i = (0);\n                var m;\n                for (; (fin181i < fin181keys.length); (fin181i++)) {\n                    ((m) = (fin181keys[fin181i]));\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 fin182keys = ((window.top.JSBNG_Replay.forInKeys)((da))), fin182i = (0);\n                    var fa;\n                    for (; (fin182i < fin182keys.length); (fin182i++)) {\n                        ((fa) = (fin182keys[fin182i]));\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: ((window.top.JSBNG_Replay.push)((window.top.JSBNG_Replay.sa0cdb1bc3c127a88a086a13f4a6ca1502f98adf1_257), 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 fin183keys = ((window.top.JSBNG_Replay.forInKeys)((this.negativeNotifs))), fin183i = (0);\n                    var pa;\n                    for (; (fin183i < fin183keys.length); (fin183i++)) {\n                        ((pa) = (fin183keys[fin183i]));\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 fin184keys = ((window.top.JSBNG_Replay.forInKeys)((t))), fin184i = (0);\n                var w;\n                for (; (fin184i < fin184keys.length); (fin184i++)) {\n                    ((w) = (fin184keys[fin184i]));\n                    {\n                        if (p[w]) {\n                            {\n                                var fin185keys = ((window.top.JSBNG_Replay.forInKeys)((p[w]))), fin185i = (0);\n                                var x;\n                                for (; (fin185i < fin185keys.length); (fin185i++)) {\n                                    ((x) = (fin185keys[fin185i]));\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 fin186keys = ((window.top.JSBNG_Replay.forInKeys)((r))), fin186i = (0);\n                var s;\n                for (; (fin186i < fin186keys.length); (fin186i++)) {\n                    ((s) = (fin186keys[fin186i]));\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 fin187keys = ((window.top.JSBNG_Replay.forInKeys)((this.bootstrapData))), fin187i = (0);\n            var s;\n            for (; (fin187i < fin187keys.length); (fin187i++)) {\n                ((s) = (fin187keys[fin187i]));\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 fin188keys = ((window.top.JSBNG_Replay.forInKeys)((this._inflightRequests))), fin188i = (0);\n                var t;\n                for (; (fin188i < fin188keys.length); (fin188i++)) {\n                    ((t) = (fin188keys[fin188i]));\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 fin189keys = ((window.top.JSBNG_Replay.forInKeys)((this.avgStats))), fin189i = (0);\n            var u;\n            for (; (fin189i < fin189keys.length); (fin189i++)) {\n                ((u) = (fin189keys[fin189i]));\n                {\n                    var v = this.avgStats[u];\n                    t[u] = ((v[0] / v[1]));\n                };\n            };\n        };\n    ;\n        {\n            var fin190keys = ((window.top.JSBNG_Replay.forInKeys)((this.appendStats))), fin190i = (0);\n            var w;\n            for (; (fin190i < fin190keys.length); (fin190i++)) {\n                ((w) = (fin190keys[fin190i]));\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);");
// 10869
JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_190[0](o162,false,"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/y7/r/MX9CLuapN6V.js",o164);
// undefined
o162 = null;
// undefined
o164 = null;
// 10873
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o7,"if (self.CavalryLogger) {\n    CavalryLogger.start_js([\"C6rJk\",]);\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        h = p;\n    };\n    function j(p) {\n        g[p] = null;\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        g[p] = q;\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        return false;\n    };\n    function m(p) {\n        return (null != g[p]);\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    function o(p) {\n        delete g[p];\n    };\n    e.exports = {\n        init: i,\n        userXClick: j,\n        filterStoreClicked: l,\n        newNotifExist: m,\n        resumeInsert: n,\n        removeNotif: o\n    };\n});");
// 10874
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o7,"sd0e0e320aa683436cafcda743d8b77745ad99691");
// 10875
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});");
// 10883
JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_190[0](o165,false,"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yk/r/mvmvxDKTeL4.js",o166);
// undefined
o165 = null;
// undefined
o166 = null;
// 11597
fpc.call(JSBNG_Replay.s5e7dba3ea700a5261ca8857ec975a807389e8969_270[0], o200,o201);
// undefined
o201 = null;
// 11600
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o7,"if (self.CavalryLogger) {\n    CavalryLogger.start_js([\"bUzfU\",]);\n}\n;\n__d(\"TrackingPixel\", [\"Arbiter\",\"ControlledReferer\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ControlledReferer\"), i = {\n        _iframe: undefined,\n        loadWithNoReferrer: function(j) {\n            if (!i._iframe) {\n                var k = document.createElement(\"iframe\");\n                k.frameborder = 0;\n                k.width = k.height = 1;\n                k.style.position = \"absolute\";\n                k.style.top = \"-10px\";\n                h.useFacebookReferer(k, function() {\n                    g.inform(\"TrackingPixel/iframeIsLoaded\", null, g.BEHAVIOR_PERSISTENT);\n                }, null);\n                document.body.appendChild(k);\n                i._iframe = k;\n            }\n        ;\n            g.subscribe(\"TrackingPixel/iframeIsLoaded\", function() {\n                var l = i._iframe.contentWindow.document, m = l.createElement(\"img\");\n                m.src = j;\n            });\n        }\n    };\n    e.exports = i;\n});\n__d(\"ExternalTrackingTag\", [\"AsyncSignal\",\"TrackingPixel\",\"Event\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncSignal\"), h = b(\"TrackingPixel\"), i = b(\"Event\"), j = {\n        listenForElementClick: function(k, l, m, n) {\n            i.listen(k, \"click\", function() {\n                j.sendRequest(l, m, n);\n            });\n        },\n        sendRequest: function(k, l, m) {\n            if (!k) {\n                return\n            };\n            new g(\"/ads/external_tracking_tag/\", {\n                href: k,\n                tracking_tag_id: l,\n                adgroup_id: m\n            }).send();\n            h.loadWithNoReferrer(k);\n        }\n    };\n    e.exports = j;\n});\n__d(\"ad-logging\", [\"Arbiter\",\"AsyncRequest\",\"Banzai\",\"collectDataAttributes\",\"Parent\",\"TrackingNodes\",\"ExternalTrackingTag\",], function(a, b, c, d, e, f) {\n    var g = \"ssinfeed\", h = b(\"Arbiter\"), i = b(\"AsyncRequest\"), j = b(\"Banzai\"), k = b(\"collectDataAttributes\"), l = b(\"Parent\"), m = b(\"TrackingNodes\"), n = b(\"ExternalTrackingTag\"), o = {\n    };\n    function p(s) {\n        return (((((s.getAttribute && ((s.getAttribute(\"ajaxify\") || s.getAttribute(\"data-endpoint\")))) || s.action) || s.href) || s.name));\n    };\n    function q(s) {\n        var t = (s.ei || s.ai);\n        if ((!t && s.mei)) {\n            t = s.mf_story_key;\n        };\n        if (((s !== null) && (typeof (t) === \"string\"))) {\n            var u = false;\n            if (s.tn) {\n                var v = m.parseTrackingNodeString(s.tn);\n                for (var w = 0; (w < v.length); w++) {\n                    var x = v[w][0];\n                    switch (x) {\n                      case m.types.LIKE_LINK:\n                    \n                      case m.types.UNLIKE_LINK:\n                    \n                      case m.types.COMMENT:\n                    \n                      case m.types.ADD_COMMENT_BOX:\n                        return;\n                      case m.types.XBUTTON:\n                    \n                      case m.types.HIDE_LINK:\n                    \n                      case m.types.REPORT_SPAM_LINK:\n                    \n                      case m.types.HIDE_ALL_LINK:\n                    \n                      case m.types.DROPDOWN_BUTTON:\n                    \n                      case m.types.UNHIDE_LINK:\n                        return;\n                      case m.types.ATTACHMENT:\n                    \n                      case m.types.USER_MESSAGE:\n                        u = true;\n                        break;\n                    };\n                };\n            }\n        ;\n            var y = Date.now(), z = 500;\n            s.duplicate_click = (!!o[t] && (((y - o[t]) < z)));\n            o[t] = y;\n            if (j.isEnabled(\"ssinfeed\")) {\n                j.post(g, s, {\n                    delay: 0,\n                    retry: j.isEnabled(\"ssinfeed_retry\")\n                });\n            }\n             else {\n                var aa = new i(\"/ajax/ssinfeed/end/\").setData(s).setAllowCrossPageTransition(true).setMethod(\"POST\");\n                aa.send();\n            }\n        ;\n            if (((u && s.external_tracking_tag) && !s.duplicate_click)) {\n                n.sendRequest(s.external_tracking_tag.url, s.external_tracking_tag.tag_id, s.external_tracking_tag.adgroup_id);\n            };\n        }\n    ;\n    };\n    function r(s, t) {\n        if (!t.node) {\n            return\n        };\n        var u = p(t.node), v = (l.byTag(t.node, \"input\") || l.byTag(t.node, \"button\"));\n        if (((((!u && v) && (v.type == \"submit\")) && v.getAttribute) && v.getAttribute(\"data-ft\"))) {\n            u = \"#\";\n        };\n        var w;\n        if (((u && t.event) && (((t.event.type === \"click\") || (t.event.type === \"contextmenu\"))))) {\n            w = k(t.node, [\"ft\",]);\n            w.ft.href = u;\n            w.ft.mouse_type = t.event.type;\n            q(w.ft);\n        }\n    ;\n    };\n    h.subscribe(\"ClickRefAction/new\", r);\n});\n__d(\"PopoverMenu.react\", [\"CSS\",\"InlineBlock.react\",\"Popover\",\"PopoverMenu\",\"React\",\"ReactProps\",\"SubscriptionsHandler\",\"cx\",\"joinClasses\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSS\"), h = b(\"InlineBlock.react\"), i = b(\"Popover\"), j = b(\"PopoverMenu\"), k = b(\"React\"), l = b(\"ReactProps\"), m = b(\"SubscriptionsHandler\"), n = b(\"cx\"), o = b(\"joinClasses\");\n    function p(r, s) {\n        var t, u;\n        for (var v in r) {\n            t = r[v];\n            u = s[v];\n            if (((typeof t === \"object\") && (typeof u === \"object\"))) {\n                if (!p(t, u)) {\n                    return false\n                };\n            }\n             else if ((t !== u)) {\n                return false\n            }\n        ;\n        };\n        return true;\n    };\n    var q = k.createClass({\n        displayName: \"ReactPopoverMenu\",\n        props: {\n            alignh: l.oneOf([\"left\",\"center\",\"right\",]),\n            layerBehaviors: l.array,\n            menu: l.object,\n            disabled: l.bool\n        },\n        _menuSubscriptions: null,\n        componentDidMount: function() {\n            var r = this.refs.root.getDOMNode(), s = r.firstChild;\n            g.addClass(s, \"_p\");\n            this._popover = new i(r, s, this.props.layerBehaviors, {\n                alignh: this.props.alignh,\n                disabled: this.props.disabled\n            });\n            this._popoverMenu = new j(this._popover, s, this._createMenu(this.props.menu), this.props.behaviors);\n        },\n        componentDidUpdate: function(r) {\n            if (!p(r.menu, this.props.menu)) {\n                if (this._menuSubscriptions) {\n                    this._menuSubscriptions.release();\n                    this._menuSubscriptions = null;\n                }\n            ;\n                this._popoverMenu.setMenu(this._createMenu(this.props.menu));\n            }\n        ;\n            if ((this.props.alignh !== r.alignh)) {\n                this._popoverMenu.getPopover().getLayer().setAlignment(this.props.alignh);\n            };\n            if ((this.props.disabled !== r.disabled)) {\n                if (this.props.disabled) {\n                    this._popoverMenu.disable();\n                }\n                 else this._popoverMenu.enable();\n            \n            };\n        },\n        getFirstChild: function() {\n            var r = this.props.children;\n            return (Array.isArray(r) ? r[0] : r);\n        },\n        getButtonSize: function() {\n            var r = this.getFirstChild();\n            return (r && r.getButtonSize());\n        },\n        render: function() {\n            var r = this.getFirstChild();\n            r.props.className = o((r.props.className || \"\"), \"_p\");\n            return this.transferPropsTo(h({\n                alignv: \"middle\",\n                className: \"uiPopover\",\n                ref: \"root\",\n                disabled: null\n            }, this.props.children));\n        },\n        componentWillUnmount: function() {\n            if (this._menuSubscriptions) {\n                this._menuSubscriptions.release();\n                this._menuSubscriptions = null;\n            }\n        ;\n        },\n        _createMenu: function(r) {\n            var s = new r.ctor(r.menuitems, r.config);\n            this._menuSubscriptions = new m();\n            if (r.onItemClick) {\n                this._menuSubscriptions.addSubscriptions(s.subscribe(\"itemclick\", r.onItemClick));\n            };\n            if (r.onChange) {\n                this._menuSubscriptions.addSubscriptions(s.subscribe(\"change\", r.onChange));\n            };\n            if (this.props.onShow) {\n                this._menuSubscriptions.addSubscriptions(this._popover.subscribe(\"show\", this.props.onShow));\n            };\n            if (this.props.onHide) {\n                this._menuSubscriptions.addSubscriptions(this._popover.subscribe(\"hide\", this.props.onHide));\n            };\n            return s;\n        }\n    });\n    e.exports = q;\n});\n__d(\"ReactMenu\", [\"Menu\",\"MenuItem\",\"MenuSelectableItem\",\"MenuTheme\",\"SelectableMenu\",\"cx\",\"flattenArray\",\"merge\",], function(a, b, c, d, e, f) {\n    var g = b(\"Menu\"), h = b(\"MenuItem\"), i = b(\"MenuSelectableItem\"), j = b(\"MenuTheme\"), k = b(\"SelectableMenu\"), l = b(\"cx\"), m = b(\"flattenArray\"), n = b(\"merge\"), o = Array.prototype.slice;\n    function p(q, r) {\n        if (!Array.isArray(r)) {\n            r = o.call(arguments, 1);\n        };\n        var s = {\n            ctor: g,\n            menuitems: m((r || [])),\n            config: {\n                theme: j,\n                maxheight: (q ? q.maxheight : null)\n            }\n        };\n        return n(s, q);\n    };\n    p.SelectableMenu = function(q, r) {\n        if (!Array.isArray(r)) {\n            r = o.call(arguments, 1);\n        };\n        var s = {\n            ctor: k,\n            menuitems: m(r),\n            config: {\n                className: \"_57di\",\n                theme: j,\n                multiple: (q && q.multiple),\n                maxheight: (q ? q.maxheight : null)\n            }\n        };\n        return n(s, q);\n    };\n    p.Item = function(q, r) {\n        if (!Array.isArray(r)) {\n            r = o.call(arguments, 1);\n        };\n        var s = {\n            ctor: h,\n            reactChildren: r\n        };\n        return n(s, q);\n    };\n    p.SelectableItem = function(q, r) {\n        if (!Array.isArray(r)) {\n            r = o.call(arguments, 1);\n        };\n        var s = {\n            ctor: i,\n            reactChildren: r\n        };\n        return n(s, q);\n    };\n    e.exports = p;\n});\n__d(\"UFIOrderingModeSelector.react\", [\"InlineBlock.react\",\"Link.react\",\"LoadingIndicator.react\",\"React\",\"Image.react\",\"ReactMenu\",\"PopoverMenu.react\",\"cx\",\"ix\",], function(a, b, c, d, e, f) {\n    var g = b(\"InlineBlock.react\"), h = b(\"Link.react\"), i = b(\"LoadingIndicator.react\"), j = b(\"React\"), k = b(\"Image.react\"), l = b(\"ReactMenu\"), m = b(\"PopoverMenu.react\"), n = b(\"cx\"), o = b(\"ix\"), p = l.SelectableMenu, q = l.SelectableItem, r = j.createClass({\n        displayName: \"UFIOrderingModeSelector\",\n        getInitialState: function() {\n            var s = null;\n            this.props.orderingmodes.map(function(t) {\n                if (t.selected) {\n                    s = t;\n                };\n            });\n            return {\n                selectedMode: s\n            };\n        },\n        onMenuItemClick: function(s, t) {\n            var u = t.item.getValue();\n            this.props.orderingmodes.map(function(v) {\n                if ((v.value === u)) {\n                    this.setState({\n                        selectedMode: v\n                    });\n                };\n            }.bind(this));\n            this.props.onOrderChanged(u);\n        },\n        render: function() {\n            var s = null;\n            if ((this.props.currentOrderingMode != this.state.selectedMode.value)) {\n                s = i({\n                    className: \"UFIOrderingModeSelectorLoading\",\n                    color: \"white\",\n                    size: \"small\"\n                });\n            };\n            var t = p({\n                onItemClick: this.onMenuItemClick\n            }, this.props.orderingmodes.map(function(u) {\n                return (q({\n                    key: u.value,\n                    value: u.value,\n                    selected: (u.value === this.state.selectedMode.value)\n                }, u.name));\n            }.bind(this)));\n            return (j.DOM.div({\n                className: \"UFIOrderingModeSelector\"\n            }, s, g(null, m({\n                className: \"UFIOrderingModeSelectorPopover\",\n                menu: t,\n                alignh: \"right\"\n            }, h(null, this.state.selectedMode.name, k({\n                className: \"UFIOrderingModeSelectorDownCaret\",\n                src: o(\"/images/ui/xhp/link/more/down_caret.gif\")\n            }))))));\n        }\n    });\n    e.exports = r;\n});\n__d(\"ComposerPublishTrackingStory\", [\"Event\",\"ge\",\"reportData\",\"DOMQuery\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"ge\"), i = b(\"reportData\"), j = b(\"DOMQuery\");\n    f.init = function(k) {\n        g.listen(k, \"submit\", function() {\n            var l = h(\"home_stream\");\n            if (!l) {\n                return\n            };\n            var m = j.scry(l, \".uiStreamStory\")[0];\n            if ((m && m.getAttribute(\"data-ft\"))) {\n                var n = JSON.parse(m.getAttribute(\"data-ft\"));\n                if (!((((\"mf_story_key\" in n)) && ((\"qid\" in n))))) {\n                    return\n                };\n                var o = {\n                    mf_story_key: n.mf_story_key,\n                    qid: n.qid\n                };\n                i(\"compose\", {\n                    ft: o\n                });\n            }\n        ;\n        });\n    };\n});\n__d(\"ComposerXAttachmentBootstrap\", [\"CSS\",\"Form\",\"Parent\",\"URI\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSS\"), h = b(\"Form\"), i = b(\"Parent\"), j = b(\"URI\"), k = b(\"cx\"), l = [], m = {\n        bootstrap: function(n) {\n            m.load(i.byTag(n, \"form\"), n.getAttribute(\"data-endpoint\"));\n        },\n        load: function(n, o, p) {\n            var q = j(o).addQueryData({\n                composerurihash: m.getURIHash(o)\n            });\n            g.conditionClass(n, \"_fu\", p);\n            var r = i.byClass(n, \"_2_4\");\n            g.removeClass(r, \"async_saving\");\n            h.setDisabled(n, false);\n            n.action = q.toString();\n            h.bootstrap(n);\n        },\n        getURIHash: function(n) {\n            if ((n === \"initial\")) {\n                return \"initial\"\n            };\n            var o = l.indexOf(n);\n            if ((o !== -1)) {\n                return (o + \"\");\n            }\n             else {\n                o = l.length;\n                l[o] = n;\n                return (o + \"\");\n            }\n        ;\n        }\n    };\n    e.exports = m;\n});\n__d(\"ComposerXStore\", [\"function-extensions\",\"Arbiter\",\"ge\",], function(a, b, c, d, e, f) {\n    b(\"function-extensions\");\n    var g = b(\"Arbiter\"), h = b(\"ge\"), i = {\n    };\n    function j(l, m) {\n        return (((\"ComposerX/\" + l) + \"/\") + m);\n    };\n    var k = {\n        set: function(l, m, n) {\n            if (!i[l]) {\n                i[l] = {\n                };\n            };\n            i[l][m] = n;\n            g.inform(j(l, m), {\n            }, g.BEHAVIOR_STATE);\n        },\n        get: function(l, m) {\n            if (i[l]) {\n                return i[l][m]\n            };\n            return null;\n        },\n        getAllForComposer: function(l) {\n            return (i[l] || {\n            });\n        },\n        waitForComponents: function(l, m, n) {\n            g.registerCallback(n, m.map(j.curry(l)));\n        }\n    };\n    g.subscribe(\"page_transition\", function() {\n        for (var l in i) {\n            if (!h(l)) {\n                delete i[l];\n            };\n        };\n    });\n    e.exports = k;\n});\n__d(\"ComposerX\", [\"Arbiter\",\"ComposerXAttachmentBootstrap\",\"ComposerXStore\",\"CSS\",\"DOM\",\"DOMQuery\",\"copyProperties\",\"csx\",\"cx\",\"getObjectValues\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ComposerXAttachmentBootstrap\"), i = b(\"ComposerXStore\"), j = b(\"CSS\"), k = b(\"DOM\"), l = b(\"DOMQuery\"), m = b(\"copyProperties\"), n = b(\"csx\"), o = b(\"cx\"), p = b(\"getObjectValues\"), q = \"any\";\n    function r(s) {\n        this._root = s;\n        this._composerID = s.id;\n        this._attachments = {\n        };\n        this._attachmentFetchForm = l.find(s, \"._2_4\");\n        this._resetSubscription = g.subscribe(\"composer/publish\", function(t, u) {\n            if ((u.composer_id === this._composerID)) {\n                this.reset();\n            };\n        }.bind(this));\n    };\n    m(r.prototype, {\n        _endpointHashToShow: q,\n        _lastFetchEndpoint: \"\",\n        _initialAttachmentEndpoint: \"\",\n        getAttachment: function(s, t) {\n            var u = h.getURIHash(s);\n            this._endpointHashToShow = u;\n            var v = this._attachments[u];\n            if (v) {\n                this._showAttachmentAfterComponentsLoaded(u);\n            }\n             else this.fetchAttachmentData(s, t);\n        ;\n        },\n        fetchAttachmentData: function(s, t) {\n            var u = h.getURIHash(s);\n            if (this._attachments[u]) {\n                return\n            };\n            if ((s !== this._lastFetchEndpoint)) {\n                h.load(this._attachmentFetchForm, s, t);\n                this._lastFetchEndpoint = s;\n            }\n        ;\n        },\n        setAttachment: function(s, t, u, v) {\n            this._setupAttachment(s, t, u, v);\n            this._showAttachmentAfterComponentsLoaded(s);\n        },\n        setInitialAttachment: function(s, t, u, v) {\n            var w = h.getURIHash(s);\n            this._setupAttachment(w, t, u, v);\n            this._initialAttachmentEndpoint = s;\n            if (!this._currentInstance) {\n                this._showAttachmentAfterComponentsLoaded(w);\n            };\n        },\n        setComponent: function(s, t) {\n            if (!i.get(this._composerID, s)) {\n                i.set(this._composerID, s, t);\n                k.appendContent(this._attachmentFetchForm, k.create(\"input\", {\n                    type: \"hidden\",\n                    name: \"loaded_components[]\",\n                    value: s\n                }));\n            }\n        ;\n        },\n        reset: function() {\n            if (this._currentInstance) {\n                this._currentInstance.cleanup();\n                this._currentInstance = null;\n            }\n        ;\n            for (var s in this._attachments) {\n                this._attachments[s].instance.reset();;\n            };\n            var t = i.getAllForComposer(this._composerID);\n            p(t).forEach(function(u) {\n                if (u.reset) {\n                    u.reset(u);\n                };\n            });\n            this.getAttachment(this._initialAttachmentEndpoint);\n            g.inform(\"composer/reset\");\n        },\n        destroy: function() {\n            if (this._resetSubscription) {\n                this._resetSubscription.unsubscribe();\n                this._resetSubscription = null;\n            }\n        ;\n        },\n        addPlaceholders: function(s, t) {\n            var u;\n            for (var v in this._attachments) {\n                u = this._attachments[v];\n                if ((u.instance === s)) {\n                    t.forEach(function(w) {\n                        u.placeholders.push(w);\n                        u.required_components.push(w.component_name);\n                    });\n                    break;\n                }\n            ;\n            };\n            if ((this._currentInstance === s)) {\n                this._fillPlaceholders(t);\n            };\n        },\n        _setupAttachment: function(s, t, u, v) {\n            t.setComposerID(this._composerID);\n            this._attachments[s] = {\n                instance: t,\n                placeholders: u,\n                required_components: v\n            };\n            var w = l.find(this._root, \"div._55d0\"), x = t.getRoot();\n            if ((x.parentNode !== w)) {\n                j.hide(x);\n                k.appendContent(w, x);\n            }\n        ;\n        },\n        _showAttachment: function(s, t, u) {\n            if ((this._currentInstance === s)) {\n                return\n            };\n            if ((this._endpointHashToShow === q)) {\n                this._endpointHashToShow = null;\n            }\n             else if ((this._endpointHashToShow !== t)) {\n                return\n            }\n        ;\n            if (this._currentInstance) {\n                if (!this._currentInstance.canSwitchAway()) {\n                    return\n                };\n                this._currentInstance.cleanup();\n            }\n        ;\n            this._currentInstance = s;\n            var v = l.find(this._root, \"div._55d0\"), w = v.childNodes, x = s.getRoot();\n            for (var y = 0; (y < w.length); y++) {\n                if ((w[y] !== x)) {\n                    j.hide(w[y]);\n                };\n            };\n            j.show(x);\n            this._fillPlaceholders(u);\n            var z = h.getURIHash(this._initialAttachmentEndpoint), aa = (t === z);\n            s.initWithComponents(aa);\n            this._setAttachmentSelectedClass(s.attachmentClassName);\n            g.inform(\"composer/initializedAttachment\", {\n                composerRoot: this._root,\n                isInitial: aa\n            });\n        },\n        _showAttachmentAfterComponentsLoaded: function(s) {\n            var t = this._attachments[s];\n            i.waitForComponents(this._composerID, t.required_components, this._showAttachment.bind(this, t.instance, s, t.placeholders));\n        },\n        _fillPlaceholders: function(s) {\n            s.forEach(function(t) {\n                var u = i.get(this._composerID, t.component_name);\n                if ((t.element !== u.element.parentNode)) {\n                    k.setContent(t.element, u.element);\n                };\n            }.bind(this));\n        },\n        _setAttachmentSelectedClass: function(s) {\n            var t = l.scry(this._root, \"._519b\")[0], u;\n            if (t) {\n                j.removeClass(t, \"_519b\");\n                u = l.scry(t, \"*[aria-pressed=\\\"true\\\"]\")[0];\n                if (u) {\n                    u.setAttribute(\"aria-pressed\", \"false\");\n                };\n            }\n        ;\n            if (s) {\n                var v = l.scry(this._root, (\".\" + s))[0];\n                if (v) {\n                    j.addClass(v, \"_519b\");\n                    u = l.scry(v, \"*[aria-pressed=\\\"false\\\"]\")[0];\n                    if (u) {\n                        u.setAttribute(\"aria-pressed\", \"true\");\n                    };\n                }\n            ;\n            }\n        ;\n        }\n    });\n    e.exports = r;\n});\n__d(\"ComposerXAttachment\", [\"ComposerXStore\",\"copyProperties\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"ComposerXStore\"), h = b(\"copyProperties\"), i = b(\"emptyFunction\");\n    function j() {\n    \n    };\n    h(j.prototype, {\n        getRoot: i,\n        initWithComponents: function(k) {\n        \n        },\n        cleanup: i,\n        reset: i,\n        attachmentClassName: \"\",\n        getComponent: function(k) {\n            return g.get(this._composerID, k);\n        },\n        canSwitchAway: i.thatReturnsTrue,\n        setComposerID: function(k) {\n            this._composerID = k;\n        },\n        allowOGTagPreview: function() {\n            return false;\n        }\n    });\n    e.exports = j;\n});\n__d(\"ComposerXController\", [\"Arbiter\",\"ComposerX\",\"ComposerXAttachmentBootstrap\",\"Parent\",\"$\",\"cx\",\"emptyFunction\",\"ge\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ComposerX\"), i = b(\"ComposerXAttachmentBootstrap\"), j = b(\"Parent\"), k = b(\"$\"), l = b(\"cx\"), m = b(\"emptyFunction\"), n = b(\"ge\"), o = {\n    };\n    function p(r) {\n        var s = j.byClass(k(r), \"_119\"), t = s.id;\n        if (!o[t]) {\n            o[t] = new h(s);\n        };\n        return o[t];\n    };\n    var q = {\n        getAttachment: function(r, s, t) {\n            var u = p(r);\n            u.getAttachment(s, t);\n        },\n        fetchAttachmentData: function(r, s, t) {\n            p(r).fetchAttachmentData(s, t);\n        },\n        setAttachment: function(r, s, t, u, v) {\n            var w = p(r);\n            w.setAttachment(s, t, u, v);\n        },\n        setInitialAttachment: function(r, s, t, u, v) {\n            var w = p(r);\n            w.setInitialAttachment(s, t, u, v);\n        },\n        setComponent: function(r, s, t) {\n            var u = p(r);\n            u.setComponent(s, t);\n        },\n        reset: function(r) {\n            var s = p(r);\n            s.reset();\n        },\n        holdTheMarkup: m,\n        getEndpoint: function(r, s, t) {\n            var u = p(r);\n            i.load(u._attachmentFetchForm, s, t);\n        },\n        addPlaceholders: function(r, s, t) {\n            var u = p(r);\n            u.addPlaceholders(s, t);\n        }\n    };\n    i.bootstrap = function(r) {\n        q.getAttachment(r, r.getAttribute(\"data-endpoint\"));\n    };\n    g.subscribe(\"page_transition\", function() {\n        for (var r in o) {\n            if (!n(r)) {\n                o[r].destroy();\n                delete o[r];\n            }\n        ;\n        };\n    });\n    e.exports = q;\n});\n__d(\"ComposerXAttachmentUtils\", [\"CSS\",\"DataStore\",\"DOMQuery\",\"Focus\",\"Input\",\"PageTransitions\",\"Run\",\"StickyPlaceholderInput\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSS\"), h = b(\"DataStore\"), i = b(\"DOMQuery\"), j = b(\"Focus\"), k = b(\"Input\"), l = b(\"PageTransitions\"), m = b(\"Run\"), n = b(\"StickyPlaceholderInput\"), o = b(\"tx\"), p = \"composer_fixed_placeholder\";\n    function q(s, t) {\n        if (!h.get(s.element, p, false)) {\n            s.instance.setPlaceholder(t);\n        };\n    };\n    var r = {\n        initMentions: function(s, t) {\n            q(s, t);\n            var u = i.find(s.element, \"textarea.input\");\n            j.set(u);\n        },\n        setStickyPlaceholderForMentions: function(s, t) {\n            if ((i.contains(s.element, document.activeElement) && g.hasClass(document.activeElement, \"DOMControl_placeholder\"))) {\n                document.activeElement.blur();\n            };\n            q(s, t);\n        },\n        setPlaceholderIsFixed: function(s, t) {\n            h.set(s.element, p, !!t);\n        },\n        setStickyPlaceholderForTypeahead: function(s, t) {\n            var u = i.find(s, \".textInput\");\n            n.setPlaceholderText(u, t);\n        },\n        registerInputForLeaveWarning: function(s) {\n            m.onBeforeUnload(function() {\n                var t = l.getNextURI();\n                if (t.getQueryData().hasOwnProperty(\"theater\")) {\n                    return\n                };\n                if ((a.Dialog && a.Dialog.getCurrent())) {\n                    return\n                };\n                if (((s.offsetParent !== null) && !k.isEmpty(s))) {\n                    return \"You haven't finished your post yet. Do you want to leave without finishing?\"\n                };\n            });\n        }\n    };\n    e.exports = r;\n});\n__d(\"DragDropFileUpload\", [], function(a, b, c, d, e, f) {\n    f.isSupported = function() {\n        return (typeof (FileList) !== \"undefined\");\n    };\n});\n__d(\"DocumentDragDrop\", [\"Event\",\"Arbiter\",\"CSS\",\"DOM\",\"DOMQuery\",\"DragDropFileUpload\",\"emptyFunction\",\"getObjectValues\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"Arbiter\"), i = b(\"CSS\"), j = b(\"DOM\"), k = b(\"DOMQuery\"), l = b(\"DragDropFileUpload\"), m = b(\"emptyFunction\"), n = b(\"getObjectValues\"), o = {\n    }, p = 0;\n    function q() {\n        p = 0;\n        n(o).forEach(function(t) {\n            i.removeClass(t.element, t.className);\n            h.inform(\"dragleave\", {\n                element: t.element\n            });\n        });\n    };\n    function r() {\n        if (!l.isSupported()) {\n            return\n        };\n        g.listen(document, \"dragenter\", function(u) {\n            if ((p === 0)) {\n                n(o).forEach(function(v) {\n                    i.addClass(v.element, v.className);\n                    h.inform(\"dragenter\", {\n                        element: v.element,\n                        event: u\n                    });\n                });\n            };\n            p++;\n        });\n        g.listen(document, \"dragleave\", function(u) {\n            p--;\n            if ((p === 0)) {\n                q();\n            };\n        });\n        g.listen(document, \"drop\", function(u) {\n            var v = u.getTarget();\n            if (k.isNodeOfType(u.getTarget(), \"input\")) {\n                if ((v.type === \"file\")) {\n                    return\n                }\n            };\n            u.prevent();\n        });\n        g.listen(document, \"dragover\", g.prevent);\n        var t = null;\n        document.addEventListener(\"dragover\", function() {\n            (t && clearTimeout(t));\n            t = setTimeout(q, 839);\n        }, true);\n        r = m;\n    };\n    var s = {\n        registerStatusElement: function(t, u) {\n            r();\n            o[j.getID(t)] = {\n                element: t,\n                className: u\n            };\n        },\n        removeStatusElement: function(t) {\n            var u = j.getID(t), v = o[u];\n            i.removeClass(v.element, v.className);\n            delete o[u];\n        }\n    };\n    e.exports = s;\n});\n__d(\"DragDropTarget\", [\"Event\",\"CSS\",\"DocumentDragDrop\",\"DragDropFileUpload\",\"copyProperties\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"CSS\"), i = b(\"DocumentDragDrop\"), j = b(\"DragDropFileUpload\"), k = b(\"copyProperties\"), l = b(\"emptyFunction\");\n    function m(n) {\n        this._element = n;\n        this._listeners = [];\n        this._statusElem = n;\n        this._dragEnterCount = 0;\n        this._enabled = false;\n    };\n    k(m.prototype, {\n        _onFilesDropCallback: l,\n        _onURLDropCallback: l,\n        _onPlainTextDropCallback: l,\n        _onDropCallback: l,\n        _fileFilterFn: l.thatReturnsArgument,\n        setOnFilesDropCallback: function(n) {\n            this._onFilesDropCallback = n;\n            return this;\n        },\n        setOnURLDropCallback: function(n) {\n            this._onURLDropCallback = n;\n            return this;\n        },\n        setOnPlainTextDropCallback: function(n) {\n            this._onPlainTextDropCallback = n;\n            return this;\n        },\n        setOnDropCallback: function(n) {\n            this._onDropCallback = n;\n            return this;\n        },\n        enable: function() {\n            if (!j.isSupported()) {\n                return this\n            };\n            i.registerStatusElement(this._statusElem, \"fbWantsDragDrop\");\n            this._listeners.push(g.listen(this._element, \"dragenter\", this._onDragEnter.bind(this)));\n            this._listeners.push(g.listen(this._element, \"dragleave\", this._onDragLeave.bind(this)));\n            this._listeners.push(g.listen(this._element, \"dragover\", g.kill));\n            this._listeners.push(g.listen(this._element, \"drop\", function(n) {\n                this._dragEnterCount = 0;\n                h.removeClass(this._statusElem, \"fbDropReady\");\n                h.removeClass(this._statusElem, \"fbDropReadyPhoto\");\n                h.removeClass(this._statusElem, \"fbDropReadyPhotos\");\n                h.removeClass(this._statusElem, \"fbDropReadyLink\");\n                var o = {\n                }, p = false, q = this._fileFilterFn(n.dataTransfer.files);\n                if (q.length) {\n                    this._onFilesDropCallback(q, n);\n                    o.files = q;\n                    p = true;\n                }\n            ;\n                var r = (n.dataTransfer.getData(\"url\") || n.dataTransfer.getData(\"text/uri-list\"));\n                if (r) {\n                    this._onURLDropCallback(r, n);\n                    o.url = r;\n                    p = true;\n                }\n            ;\n                var s = n.dataTransfer.getData(\"text/plain\");\n                if (s) {\n                    this._onPlainTextDropCallback(s, n);\n                    o.plainText = s;\n                    p = true;\n                }\n            ;\n                if (p) {\n                    this._onDropCallback(o, n);\n                };\n                n.kill();\n            }.bind(this)));\n            this._enabled = true;\n            return this;\n        },\n        disable: function() {\n            if (!this._enabled) {\n                return this\n            };\n            i.removeStatusElement(this._statusElem, \"fbWantsDragDrop\");\n            h.removeClass(this._statusElem, \"fbDropReady\");\n            h.removeClass(this._statusElem, \"fbDropReadyPhoto\");\n            h.removeClass(this._statusElem, \"fbDropReadyPhotos\");\n            h.removeClass(this._statusElem, \"fbDropReadyLink\");\n            while (this._listeners.length) {\n                this._listeners.pop().remove();;\n            };\n            this._enabled = false;\n            return this;\n        },\n        setFileFilter: function(n) {\n            this._fileFilterFn = n;\n            return this;\n        },\n        setStatusElement: function(n) {\n            this._statusElem = n;\n            return this;\n        },\n        _onDragEnter: function(n) {\n            if ((this._dragEnterCount === 0)) {\n                var o = n.dataTransfer.items, p = false;\n                for (var q = 0; (q < o.length); q++) {\n                    if (!o[q].type.match(\"image/*\")) {\n                        p = true;\n                        break;\n                    }\n                ;\n                };\n                h.addClass(this._statusElem, \"fbDropReady\");\n                if (p) {\n                    h.addClass(this._statusElem, \"fbDropReadyLink\");\n                }\n                 else if ((o.length > 1)) {\n                    h.addClass(this._statusElem, \"fbDropReadyPhotos\");\n                }\n                 else h.addClass(this._statusElem, \"fbDropReadyPhoto\");\n                \n            ;\n            }\n        ;\n            this._dragEnterCount++;\n        },\n        _onDragLeave: function() {\n            this._dragEnterCount = Math.max((this._dragEnterCount - 1), 0);\n            if ((this._dragEnterCount === 0)) {\n                h.removeClass(this._statusElem, \"fbDropReady\");\n                h.removeClass(this._statusElem, \"fbDropReadyPhoto\");\n                h.removeClass(this._statusElem, \"fbDropReadyPhotos\");\n                h.removeClass(this._statusElem, \"fbDropReadyLink\");\n            }\n        ;\n        }\n    });\n    e.exports = m;\n});\n__d(\"ComposerXDragDrop\", [\"Arbiter\",\"ComposerXController\",\"CSS\",\"DragDropTarget\",\"DOMQuery\",\"Parent\",\"URI\",\"copyProperties\",\"csx\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ComposerXController\"), i = b(\"CSS\"), j = b(\"DragDropTarget\"), k = b(\"DOMQuery\"), l = b(\"Parent\"), m = b(\"URI\"), n = b(\"copyProperties\"), o = b(\"csx\"), p = b(\"cx\"), q = \"/ajax/composerx/attachment/media/upload/\", r = \"/ajax/composerx/attachment/link/scraper/\", s = function(u) {\n        u();\n    };\n    function t(u, v, w, x) {\n        this._root = u;\n        this._composerID = v;\n        this._targetID = w;\n        x = (x || s);\n        this._dragdrop = new j(u).setOnFilesDropCallback(function(y) {\n            x(this._uploadFiles.bind(this, y));\n        }.bind(this)).setFileFilter(t.filterImages).enable();\n        t.handleDragEnterAndLeave(u);\n        g.subscribe(\"composer/deactivateDragdrop\", function() {\n            this.deactivate();\n        }.bind(this));\n        g.subscribe(\"composer/reactivateDragdrop\", function() {\n            this.reactivate();\n        }.bind(this));\n    };\n    n(t, {\n        handleDragEnterAndLeave: function(u) {\n            var v = k.scry(l.byClass(u, \"_119\"), \"._2wr\");\n            g.subscribe(\"dragenter\", function(w, x) {\n                if ((u == x.element)) {\n                    v.forEach(i.hide);\n                };\n            });\n            g.subscribe(\"dragleave\", function(w, x) {\n                if ((u == x.element)) {\n                    v.forEach(i.show);\n                };\n            });\n        },\n        filterImages: function(u) {\n            var v = [];\n            for (var w = 0; (w < u.length); w++) {\n                if (u[w].type.match(\"image/*\")) {\n                    v.push(u[w]);\n                };\n            };\n            return v;\n        }\n    });\n    n(t.prototype, {\n        enableURLDropping: function() {\n            this._dragdrop.setOnURLDropCallback(this._onURLDrop.bind(this));\n        },\n        deactivate: function() {\n            this._dragdrop.disable();\n        },\n        reactivate: function() {\n            this._dragdrop.enable();\n        },\n        _uploadFiles: function(u) {\n            h.getAttachment(this._root, q);\n            g.inform(((\"ComposerXFilesStore/filesDropped/\" + this._composerID) + \"/mediaupload\"), {\n                files: u\n            }, g.BEHAVIOR_PERSISTENT);\n        },\n        _onURLDrop: function(u) {\n            var v = new m(r);\n            v.addQueryData({\n                scrape_url: encodeURIComponent(u)\n            });\n            h.getAttachment(this._root, v.toString());\n        }\n    });\n    e.exports = t;\n});\n__d(\"PrivacyConst\", [], function(a, b, c, d, e, f) {\n    var g = {\n        FRIENDS_PLUS_GAMER_FRIENDS: 128,\n        FRIENDS_MINUS_ACQUAINTANCES: 127,\n        FACEBOOK_EMPLOYEES: 112,\n        CUSTOM: 111,\n        EVERYONE: 80,\n        NETWORKS_FRIENDS_OF_FRIENDS: 60,\n        NETWORKS_FRIENDS: 55,\n        FRIENDS_OF_FRIENDS: 50,\n        ALL_FRIENDS: 40,\n        SELF: 10,\n        NOBODY: 0\n    }, h = {\n        EVERYONE: 80,\n        NETWORKS_FRIENDS: 55,\n        FRIENDS_OF_FRIENDS: 50,\n        ALL_FRIENDS: 40,\n        SOME_FRIENDS: 30,\n        SELF: 10,\n        NO_FRIENDS: 0\n    }, i = {\n        NONE: 0,\n        TAGGEES: 1,\n        FRIENDS_OF_TAGGEES: 2\n    }, j = {\n        BaseValue: g,\n        FriendsValue: h,\n        TagExpansion: i\n    };\n    e.exports = j;\n});\n__d(\"ComposerXBootloadStatusAttachment\", [\"Event\",\"function-extensions\",\"Arbiter\",\"AsyncRequest\",\"Bootloader\",\"Class\",\"ComposerXAttachment\",\"ComposerXController\",\"ComposerXDragDrop\",\"ComposerXStore\",\"CSS\",\"DOM\",\"DOMQuery\",\"Focus\",\"Parent\",\"PlaceholderListener\",\"PrivacyConst\",\"URI\",\"SelectorDeprecated\",\"copyProperties\",\"csx\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\");\n    b(\"function-extensions\");\n    var h = b(\"Arbiter\"), i = b(\"AsyncRequest\"), j = b(\"Bootloader\"), k = b(\"Class\"), l = b(\"ComposerXAttachment\"), m = b(\"ComposerXController\"), n = b(\"ComposerXDragDrop\"), o = b(\"ComposerXStore\"), p = b(\"CSS\"), q = b(\"DOM\"), r = b(\"DOMQuery\"), s = b(\"Focus\"), t = b(\"Parent\"), u = b(\"PlaceholderListener\"), v = b(\"PrivacyConst\"), w = b(\"URI\"), x = b(\"SelectorDeprecated\"), y = b(\"copyProperties\"), z = b(\"csx\"), aa = b(\"cx\"), ba = {\n    };\n    function ca(da, ea) {\n        this.parent.construct(this);\n        this._root = da;\n        this._config = ea;\n    };\n    k.extend(ca, l);\n    y(ca.prototype, {\n        _attachmentIsActive: false,\n        _bootloading: false,\n        _fullVersion: false,\n        _focusListener: null,\n        _privacyWidgetTags: null,\n        _scraper: null,\n        _dragdrop: null,\n        attachmentClassName: \"_4j\",\n        getRoot: function() {\n            return this._root;\n        },\n        initWithComponents: function(da) {\n            ba[this._composerID] = this;\n            this._attachmentIsActive = true;\n            var ea = r.find(this.getComponent(\"maininput\").element, \"textarea.input\");\n            if (this._fullVersion) {\n                this._fullInitWithComponents();\n            }\n             else if (!this._bootloading) {\n                if (r.contains(this._root, document.activeElement)) {\n                    this._onInitialFocus();\n                }\n                 else this._focusListener = g.listen(ea, \"focus\", this._onInitialFocus.bind(this));\n            \n            }\n        ;\n            this._dragEnterHandler = h.subscribe(\"dragenter\", function(fa, ga) {\n                if ((ga.element == this._root)) {\n                    var ha = ga.event.dataTransfer.items, ia;\n                    if (ha) {\n                        ia = n.filterImages(ha);\n                    };\n                    if ((ia && (ia.length > 0))) {\n                        s.set(ea);\n                    }\n                     else {\n                        var ja = t.byClass(this._root, \"focus_target\");\n                        u.expandInput(ja);\n                        if ((!this._bootloading && !this._fullVersion)) {\n                            this._onInitialFocus();\n                        };\n                    }\n                ;\n                }\n            ;\n            }.bind(this));\n            this.getComponent(\"maininput\").instance.setPlaceholder(this._config.mentionsPlaceholder);\n            if (!da) {\n                s.set(ea);\n            };\n            if (this._config.plus_version) {\n                this._dragdrop = new n(this._root, this._composerID, this._config.targetID);\n                this._dragdrop.enableURLDropping();\n            }\n        ;\n        },\n        _fullInitWithComponents: function() {\n            j.loadModules([\"ComposerXPrivacyWidgetTags\",\"URLScraper\",\"URI\",], function(da, ea, fa) {\n                this._tagger.init(this);\n                this._privacyWidgetTags = new da(this);\n                var ga = r.find(this.getComponent(\"maininput\").element, \"textarea.input\");\n                if (!this._scraper) {\n                    this._scraper = new ea(ga);\n                    this._scraper.subscribe(\"match\", function(ha, ia) {\n                        var ja = this._getScraperEndpoint();\n                        ja.addQueryData({\n                            scrape_url: encodeURIComponent(ia.url)\n                        });\n                        m.getAttachment(this._root, ja.toString());\n                    }.bind(this));\n                }\n            ;\n                this._scraper.enable();\n                this._scraper.check();\n            }.bind(this));\n            this._initPrivacyReminder();\n        },\n        _initPrivacyReminder: function() {\n            if ((!this._reminderDialog || this._reminderShown)) {\n                return\n            };\n            var da = this.getComponent(\"mainprivacywidget\"), ea = x.getSelectedOptions(da.element), fa = x.getOptionValue(ea[0]);\n            if ((fa !== String(v.BaseValue.SELF))) {\n                return\n            };\n            this._reminderDialog.setContext(this.getComponent(\"mainprivacywidget\").element).show();\n            this._reminderShown = true;\n            var ga = function() {\n                new i(\"/ajax/privacy/reminders/dismiss\").setData({\n                    type: \"only_me\"\n                }).send();\n                this._reminderDialog.hide();\n            }.bind(this);\n            this._reminderEvents = [g.listen(this._reminderDialog.getContent(), \"click\", ga),g.listen(this._reminderDialog.getContext(), \"click\", ga),];\n        },\n        cleanup: function() {\n            this._attachmentIsActive = false;\n            if (this._focusListener) {\n                this._focusListener.remove();\n                this._focusListener = null;\n            }\n        ;\n            if ((this._reminderDialog && this._reminderShown)) {\n                this._reminderDialog.hide();\n                this._reminderEvents.forEach(function(da) {\n                    da.remove();\n                });\n            }\n        ;\n            if (this._dragdrop) {\n                this._dragdrop.deactivate();\n                this._dragdrop = null;\n            }\n        ;\n            if (this._fullVersion) {\n                this._tagger.cleanup();\n                this._privacyWidgetTags.destroy();\n                this._privacyWidgetTags = null;\n                this._scraper.disable();\n            }\n        ;\n            if (this._dragEnterHandler) {\n                this._dragEnterHandler.unsubscribe();\n                this._dragEnterHandler = null;\n            }\n        ;\n        },\n        reset: function() {\n            var da = t.byClass(this._root, \"child_was_focused\");\n            if (da) {\n                p.removeClass(da, \"child_was_focused\");\n            };\n            if (this._tagger) {\n                this._tagger.reset();\n            };\n            this.getComponent(\"maininput\").instance.setPlaceholder(this._config.mentionsPlaceholder);\n        },\n        canSwitchAway: function() {\n            return !t.byClass(this._root, \"async_saving\");\n        },\n        setBootloadedContent: function(da, ea, fa, ga) {\n            this._reminderDialog = ga;\n            var ha = fa.map(function(ia) {\n                return ia.component_name;\n            });\n            o.waitForComponents(this._composerID, ha, function() {\n                var ia = r.find(this._root, \"._3-6\"), ja = r.find(this._root, \"._3-7\");\n                q.setContent(ia, da.tagger_content);\n                q.setContent(ja, da.tagger_icons);\n                m.addPlaceholders(this._root, this, fa);\n                this._tagger = ea;\n                this._fullVersion = true;\n                if (this._attachmentIsActive) {\n                    if (this._focusListener) {\n                        this._focusListener.remove();\n                        this._focusListener = null;\n                    }\n                ;\n                    this._fullInitWithComponents();\n                }\n            ;\n            }.bind(this));\n        },\n        _getScraperEndpoint: function() {\n            return w(\"/ajax/composerx/attachment/link/scraper/\");\n        },\n        _onInitialFocus: function() {\n            h.inform(\"composer/focus\");\n            m.getEndpoint(this._root, \"/ajax/composerx/attachment/status/bootload/\", true);\n            this._bootloading = true;\n        },\n        allowOGTagPreview: function() {\n            return true;\n        }\n    });\n    ca.setBootloadedContent = function(da, ea, fa, ga, ha) {\n        var ia = ba[da];\n        if (ia) {\n            ia.setBootloadedContent(ea, fa, ga, ha);\n        };\n    };\n    e.exports = ca;\n});\n__d(\"ComposerXMentionsInputReset\", [\"DOMQuery\",\"Input\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOMQuery\"), h = b(\"Input\");\n    function i(j) {\n        var k = g.scry(j.element, \"textarea.input\")[0];\n        j.instance.reset();\n        h.reset(k);\n    };\n    e.exports = i;\n});\n__d(\"ComposerXOGTaggerIconReset\", [\"CSS\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSS\"), h = b(\"cx\");\n    function i(j) {\n        g.removeClass(j.element, \"_4-jh\");\n        g.removeClass(j.element, \"_509o\");\n    };\n    e.exports = i;\n});\n__d(\"ComposerXPrivacyWidgetReset\", [\"Arbiter\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\");\n    function h(i) {\n        g.inform(\"Composer/changedtags\", {\n            withTags: [],\n            mention: {\n            },\n            eventTag: false\n        });\n    };\n    e.exports = h;\n});\n__d(\"ComposerXTaggerIconReset\", [\"CSS\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSS\"), h = b(\"cx\");\n    function i(j) {\n        g.removeClass(j.element, \"_1dsa\");\n        g.removeClass(j.element, \"_1dsb\");\n        g.removeClass(j.element, \"_509o\");\n    };\n    e.exports = i;\n});\n__d(\"SwapButtonDEPRECATED\", [\"Event\",\"Arbiter\",\"copyProperties\",\"CSS\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"Arbiter\"), i = b(\"copyProperties\"), j = b(\"CSS\");\n    function k(l, m, n) {\n        this._swapperButton = l;\n        this._swappeeButton = m;\n        g.listen(l, \"click\", this.swap.bind(this));\n        if (n) {\n            g.listen(m, \"click\", this.unswap.bind(this));\n        };\n        h.subscribe(\"SwapButtonDEPRECATED/focusOnJoinButton\", this.setFocusOnSwapper.bind(this), h.SUBSCRIBE_ALL);\n    };\n    i(k.prototype, {\n        _swapperButton: null,\n        _swappeeButton: null,\n        swap: function(l) {\n            j.hide(this._swapperButton);\n            j.show(this._swappeeButton);\n            ((l !== false) && this._swappeeButton.focus());\n        },\n        unswap: function(l) {\n            j.show(this._swapperButton);\n            j.hide(this._swappeeButton);\n            ((l !== false) && this._swapperButton.focus());\n        },\n        toggle: function() {\n            j.toggle(this._swapperButton);\n            j.toggle(this._swappeeButton);\n        },\n        setFocusOnSwapper: function() {\n            this._swapperButton.focus();\n        }\n    });\n    e.exports = k;\n});\n__d(\"SubscribeButton\", [\"Arbiter\",\"AsyncRequest\",\"Event\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"AsyncRequest\"), i = b(\"Event\"), j = {\n        SUBSCRIBED: \"FollowingUser\",\n        UNSUBSCRIBED: \"UnfollowingUser\",\n        init: function(k, l, m, n, o, p) {\n            i.listen(l, \"click\", function() {\n                g.inform(j.SUBSCRIBED, {\n                    profile_id: n\n                });\n            });\n            g.subscribe(j.SUBSCRIBED, function(q, r) {\n                if ((n === r.profile_id)) {\n                    if (!o) {\n                        m.suppressNextMouseEnter();\n                    };\n                    k.swap();\n                    if ((p === true)) {\n                        new h().setURI(\"/ajax/profile/suggestions_on_following.php\").setData({\n                            profileid: n\n                        }).send();\n                    };\n                }\n            ;\n            });\n            g.subscribe(j.UNSUBSCRIBED, function(q, r) {\n                if ((n === r.profile_id)) {\n                    k.unswap();\n                    m.hideFlyout();\n                    g.inform(\"SubMenu/Reset\");\n                }\n            ;\n            });\n        },\n        initUnsubscribe: function(k, l) {\n            i.listen(k, \"click\", function() {\n                g.inform.bind(g, j.UNSUBSCRIBED, {\n                    profile_id: l\n                }).defer();\n            });\n        }\n    };\n    e.exports = j;\n});\n__d(\"AudienceSelectorTags\", [], function(a, b, c, d, e, f) {\n    var g = {\n    }, h = {\n        hasTags: function(i) {\n            return g.hasOwnProperty(i);\n        },\n        setHasTags: function(i) {\n            if (i) {\n                g[i] = true;\n            };\n        }\n    };\n    e.exports = h;\n});\n__d(\"BasePrivacyOption\", [\"Arbiter\",\"AudienceSelectorTags\",\"copyProperties\",\"CSS\",\"DOM\",\"Env\",\"fbt\",\"Parent\",\"PrivacyConst\",\"SelectorDeprecated\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"AudienceSelectorTags\"), i = b(\"copyProperties\"), j = b(\"CSS\"), k = b(\"DOM\"), l = b(\"Env\"), m = b(\"fbt\"), n = b(\"Parent\"), o = b(\"PrivacyConst\"), p = b(\"SelectorDeprecated\"), q = b(\"tx\");\n    function r(s) {\n        this._selector = n.byClass(s, \"audienceSelector\");\n        this._plusLabel = k.scry(s, \".plusLabel\")[0];\n        if (!this._selector) {\n            return\n        };\n        this._elem = s;\n        this._taggedIDs = [];\n        this._tags = [];\n        this._hasEvent = false;\n        this._recalculateTooltipAndLabel();\n        this._updateSelector();\n        g.subscribe(\"Composer/changedtags\", function(t, u) {\n            if (!this._getChangedData()) {\n                return\n            };\n            var v = this._hasEvent;\n            this._hasEvent = !!u.eventTag;\n            this._tags = u.withTags.map(function(y) {\n                return y.getText();\n            });\n            this._taggedIDs = u.withTags.map(function(y) {\n                return y.getValue();\n            });\n            for (var w in u.mention) {\n                if (((u.mention[w].type == \"user\") && (u.mention[w].uid != l.user))) {\n                    this._tags.push(u.mention[w].text);\n                    this._taggedIDs.push(u.mention[w].uid);\n                }\n                 else if ((u.mention[w].type == \"event\")) {\n                    this._hasEvent = true;\n                }\n            ;\n            };\n            if ((this._hasEvent && (v != this._hasEvent))) {\n                this._eventTagChanged();\n            };\n            var x = this._recalculateTooltipAndLabel();\n            if ((x && p.isOptionSelected(this._elem))) {\n                this._updateSelector();\n                g.inform(\"SelectedPrivacyOption/changed\", this._getChangedData());\n            }\n        ;\n        }.bind(this));\n        p.listen(this._selector, \"change\", this._updateSelector.bind(this));\n    };\n    i(r.prototype, {\n        _eventTagChanged: function() {\n        \n        },\n        _getChangedData: function() {\n            return null;\n        },\n        _recalculateTooltipAndLabel: function() {\n            var s = this._tooltip, t = this._label, u = this._getIncludedAudience(), v = this._getExcludedAudience(), w = this._getTagExpansionText();\n            if (w) {\n                u = m._(\"{list of people who can see this}, {list of additional people who can see this}\", [m.param(\"list of people who can see this\", u),m.param(\"list of additional people who can see this\", w),]);\n            };\n            this._tooltip = this._getCombinedSentence(u, v);\n            this._recalcLabel();\n            return (((s != this._tooltip)) || ((t != this._label)));\n        },\n        _getIncludedAudience: function() {\n            return this._elem.getAttribute(\"data-label\");\n        },\n        _getExcludedAudience: function() {\n            return \"\";\n        },\n        _getTagExpansionText: function() {\n            var s = this._getTagExpansionBehavior();\n            if ((!!this._taggedIDs.length || this._alreadyHasTags())) {\n                if ((s == o.TagExpansion.FRIENDS_OF_TAGGEES)) {\n                    if (this._hasEvent) {\n                        return \"friends of anyone tagged, event guests\"\n                    };\n                    return \"friends of anyone tagged\";\n                }\n                 else if ((s == o.TagExpansion.TAGGEES)) {\n                    return \"Anyone tagged\"\n                }\n            ;\n                return \"\";\n            }\n        ;\n            if ((this._hasEvent && (s == o.TagExpansion.FRIENDS_OF_TAGGEES))) {\n                return \"event guests\"\n            };\n            return \"\";\n        },\n        _getCombinedSentence: function(s, t) {\n            if (!t) {\n                return s\n            };\n            return m._(\"{list of people who can see this}; Except: {list of people who cannot see this}\", [m.param(\"list of people who can see this\", s),m.param(\"list of people who cannot see this\", t),]);\n        },\n        _recalcLabel: function() {\n            this._label = this._elem.getAttribute(\"data-label\");\n            if (this._showPlusLabel()) {\n                this._label += \" (+)\";\n            };\n            j.conditionShow(this._plusLabel, this._showPlusLabel());\n        },\n        _showPlusLabel: function() {\n            var s = this._getTagExpansionBehavior();\n            return (((!!this._taggedIDs.length && (s != o.TagExpansion.NONE))) || ((!!this._hasEvent && (s == o.TagExpansion.FRIENDS_OF_TAGGEES))));\n        },\n        _getTagExpansionBehavior: function() {\n            return o.TagExpansion.NONE;\n        },\n        _alreadyHasTags: function() {\n            var s = k.scry(this._selector, \"*[data-oid]\")[0];\n            s = (s && s.getAttribute(\"data-oid\"));\n            return (s && h.hasTags(s));\n        },\n        _updateSelector: function() {\n            if (p.isOptionSelected(this._elem)) {\n                p.setButtonTooltip(this._selector, this._tooltip);\n                return false;\n            }\n        ;\n            return true;\n        }\n    });\n    e.exports = r;\n});\n__d(\"CustomPrivacyOption\", [\"Arbiter\",\"AsyncDialog\",\"AsyncRequest\",\"BasePrivacyOption\",\"Class\",\"DOM\",\"Event\",\"Form\",\"PrivacyConst\",\"SelectorDeprecated\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"AsyncDialog\"), i = b(\"AsyncRequest\"), j = b(\"BasePrivacyOption\"), k = b(\"Class\"), l = b(\"DOM\"), m = b(\"Event\"), n = b(\"Form\"), o = b(\"PrivacyConst\"), p = b(\"SelectorDeprecated\"), q = b(\"copyProperties\");\n    function r(s, t, u, v, w, x, y, z, aa, ba, ca, da) {\n        if (!s) {\n            return\n        };\n        this._baseAudienceValue = aa;\n        this._includedAudience = ba;\n        this._excludedAudience = ca;\n        this._tagExpansionBehavior = da;\n        (function() {\n            this.initCustomState(s, t, u);\n            m.listen(s, \"click\", function(event) {\n                this.openCustomDialog(event, t, v, x, y, z);\n            }.bind(this));\n            p.listen(this._selector, \"select\", function(ea) {\n                if ((ea.option._id != this._id)) {\n                    this.clearCustomState();\n                };\n            }.bind(this));\n            this.parent.construct(this, s);\n        }).bind(this).defer();\n    };\n    k.extend(r, j);\n    q(r, {\n        _instances: {\n        },\n        update: function(s, t, u, v, w, x, y, z) {\n            var aa = r._instances[s];\n            aa._update(t, u)._updateOptionValues(w, x, y, z)._updateOption(u);\n            g.inform(\"Form/change\", {\n                node: aa._container\n            });\n        },\n        getData: function(s) {\n            return r._instances[s]._privacyData;\n        },\n        setPrivacyData: function(s, t, u) {\n            r._instances[s]._update(t, u);\n            r._instances[s]._updateOption(u);\n        }\n    });\n    q(r.prototype, {\n        _getChangedData: function() {\n            return {\n                hasEvent: this._hasEvent,\n                tags: this._taggedIDs,\n                privacy: this._baseAudienceValue\n            };\n        },\n        _updateOptionValues: function(s, t, u, v) {\n            this._baseAudienceValue = s;\n            this._includedAudience = t;\n            this._excludedAudience = u;\n            this._tagExpansionBehavior = v;\n            return this;\n        },\n        _updateOption: function(s) {\n            var t = (p.getOption(this._selector, s) || p.getOption(this._selector, (o.BaseValue.CUSTOM + \"\")));\n            this._recalculateTooltipAndLabel();\n            g.inform(\"CustomPrivacyOption/update\", {\n                selector: this._selector,\n                option: t,\n                tooltip: this._tooltip,\n                label: this._label\n            });\n            return this;\n        },\n        _getIncludedAudience: function() {\n            return this._includedAudience;\n        },\n        _getExcludedAudience: function() {\n            return this._excludedAudience;\n        },\n        _getTagExpansionBehavior: function() {\n            return this._tagExpansionBehavior;\n        },\n        _update: function(s, t) {\n            var u = ((t == o.BaseValue.CUSTOM) || !p.getOption(this._selector, t)), v = this._selector.getAttribute(\"data-name\");\n            this.updateCustomState(s, u, v);\n            return this;\n        },\n        initCustomState: function(s, t, u) {\n            r._instances[t] = this;\n            this._container = l.find(s, \".customPrivacyInputs\");\n            this._id = u;\n            this._privacyData = {\n            };\n            var v = n.serialize(this._container);\n            if (v.audience) {\n                this._privacyData = v.audience[u];\n            };\n            return s;\n        },\n        openCustomDialog: function(event, s, t, u, v, w) {\n            var x = new i(\"/ajax/privacy/custom_dialog/\").setData({\n                option_id: s,\n                id: this._id,\n                privacy_data: this._privacyData,\n                explain_tags: t,\n                autosave: u,\n                limit_to_friends: v,\n                source: w\n            });\n            x.setRelativeTo(event.getTarget());\n            h.send(x);\n        },\n        updateCustomState: function(s, t, u) {\n            this.clearCustomState();\n            this._privacyData = q({\n            }, s);\n            if (t) {\n                if (u) {\n                    u = u.slice(0, -\"[value]\".length);\n                    var v = {\n                    };\n                    v[u] = s;\n                    n.createHiddenInputs(v, this._container, null, true);\n                }\n            \n            };\n        },\n        clearCustomState: function() {\n            this._privacyData = {\n            };\n            l.empty(this._container);\n        }\n    });\n    e.exports = r;\n});\n__d(\"DynamicIconSelector\", [\"Button\",\"CSS\",\"DOM\",\"SelectorDeprecated\",], function(a, b, c, d, e, f) {\n    var g = b(\"Button\"), h = b(\"CSS\"), i = b(\"DOM\"), j = b(\"SelectorDeprecated\"), k = {\n        swapIcon: function(l) {\n            var m = j.getSelectedOptions(l)[0], n = (m && i.scry(m, \".itemIcon\")[0]), o = j.getSelectorButton(l);\n            if (n) {\n                g.setIcon(o, n.cloneNode(true));\n            }\n             else {\n                var p = i.scry(o, \".img\")[0];\n                (p && i.remove(p));\n            }\n        ;\n            h.conditionClass(o, \"uiSelectorChevronOnly\", !n);\n        }\n    };\n    j.subscribe(\"change\", function(l, m) {\n        var n = m.selector;\n        if (h.hasClass(n, \"dynamicIconSelector\")) {\n            k.swapIcon(n);\n        };\n    });\n    e.exports = k;\n});\n__d(\"AudienceSelector\", [\"Arbiter\",\"AudienceSelectorTags\",\"CSS\",\"CustomPrivacyOption\",\"DOM\",\"DynamicIconSelector\",\"PrivacyConst\",\"SelectorDeprecated\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"AudienceSelectorTags\"), i = b(\"CSS\"), j = b(\"CustomPrivacyOption\"), k = b(\"DOM\"), l = b(\"DynamicIconSelector\"), m = b(\"PrivacyConst\"), n = b(\"SelectorDeprecated\"), o = {\n    };\n    n.subscribe(\"select\", function(q, r) {\n        if (!i.hasClass(r.selector, \"audienceSelector\")) {\n            return\n        };\n        var s = n.getOptionValue(r.option);\n        r.value = s;\n        g.inform(\"AudienceSelector/changed\", r);\n        if (((s == m.BaseValue.CUSTOM) && !i.hasClass(r.option, \"noDialog\"))) {\n            n.toggle(r.selector);\n            return false;\n        }\n    ;\n        if (i.hasClass(r.selector, \"dataTooltip\")) {\n            var t = k.find(r.option, \".itemAnchor\").getAttribute(\"data-tooltip\");\n            n.setButtonTooltip(r.selector, (t || null));\n        }\n    ;\n        if (!i.hasClass(r.option, \"specialOption\")) {\n            return\n        };\n        var u = k.find(r.option, \"a\").getAttribute(\"data-type\");\n        if (i.hasClass(r.option, \"moreOption\")) {\n            i.addClass(r.selector, u);\n            i.addClass(r.selector, \"showSecondaryOptions\");\n            return false;\n        }\n         else if (i.hasClass(r.option, \"returnOption\")) {\n            i.removeClass(r.selector, \"showSecondaryOptions\");\n            i.removeClass(r.selector, \"friendList\");\n            return false;\n        }\n        \n    ;\n    });\n    var p = {\n        keepSynchronized: function(q, r) {\n            (o[q] || (o[q] = {\n            }));\n            o[q][r.id] = r;\n        },\n        setHasTags: function(q) {\n            h.setHasTags(q);\n        }\n    };\n    g.subscribe(\"CustomPrivacyOption/update\", function(q, r) {\n        if (!i.hasClass(r.selector, \"audienceSelector\")) {\n            return\n        };\n        n.setSelected(r.selector, n.getOptionValue(r.option));\n        l.swapIcon(r.selector);\n        n.setButtonLabel(r.selector, r.label);\n        n.setButtonTooltip(r.selector, r.tooltip);\n        g.inform(\"AudienceSelector/update\", r);\n    });\n    g.subscribe([\"AudienceSelector/changed\",\"AudienceSelector/update\",], function(event, q) {\n        var r = n.getOptionValue(q.option), s = {\n        };\n        if ((r == m.BaseValue.CUSTOM)) {\n            if ((event == \"AudienceSelector/changed\")) {\n                return\n            };\n            s = j.getData(q.option.id);\n        }\n    ;\n        for (var t in o) {\n            var u = o[t];\n            if (u[q.selector.id]) {\n                g.inform(\"AudienceSelector/syncNonSelectorIcon\", {\n                    category: t\n                });\n                for (var v in u) {\n                    var w = u[v];\n                    if ((!w || (q.selector === w))) {\n                        continue;\n                    };\n                    if ((n.getValue(w) !== r)) {\n                        n.setSelected(w, r);\n                        l.swapIcon(w);\n                    }\n                ;\n                    if ((r == m.BaseValue.CUSTOM)) {\n                        var x = n.getOption(w, (m.BaseValue.CUSTOM + \"\"));\n                        if (x) {\n                            j.setPrivacyData(x.id, s, r);\n                            n.setButtonTooltip(w, q.tooltip);\n                        }\n                    ;\n                    }\n                ;\n                };\n            }\n        ;\n        };\n    });\n    e.exports = p;\n});\n__d(\"ErrorDialog\", [\"Dialog\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"Dialog\"), h = b(\"emptyFunction\"), i = {\n        showAsyncError: function(j) {\n            try {\n                return i.show(j.getErrorSummary(), j.getErrorDescription());\n            } catch (k) {\n                alert(j);\n            };\n        },\n        show: function(j, k, l, m) {\n            return (new g()).setTitle(j).setBody(k).setButtons([g.OK,]).setStackable(true).setModal(true).setHandler((l || h)).setButtonsMessage((m || \"\")).show();\n        }\n    };\n    e.exports = i;\n});\n__d(\"Tour\", [\"Arbiter\",\"LayerDestroyOnHide\",\"LayerHideOnEscape\",\"copyProperties\",\"NavigationMessage\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"LayerDestroyOnHide\"), i = b(\"LayerHideOnEscape\"), j = b(\"copyProperties\"), k = b(\"NavigationMessage\");\n    function l() {\n        if (l._instance) {\n            l._instance.setTourComplete();\n        };\n        l._instance = this;\n    };\n    j(l.prototype, {\n        tourStarted: false,\n        tourComplete: false,\n        _navigationBeginToken: null,\n        _pageLeaveToken: null,\n        steps: {\n        },\n        openDialog: null,\n        init: function() {\n            this._pageLeaveToken = g.subscribe(\"onload/exit\", this.handleLeavePage.bind(this));\n            this._navigationBeginToken = g.subscribe(k.NAVIGATION_BEGIN, this.handleTransition.bind(this));\n            this.steps = {\n            };\n            return this;\n        },\n        registerStep: function(m, n) {\n            m.disableBehavior(h);\n            m.disableBehavior(i);\n            this.steps[n] = m;\n            m.subscribe(\"show\", function() {\n                m.inform(\"tour-dialog-show\", m);\n            });\n            if (!this.getTourStarted()) {\n                this.setTourStart();\n            };\n        },\n        _unsubscribeSubscriptions: function() {\n            this._navigationBeginToken.unsubscribe();\n            this._pageLeaveToken.unsubscribe();\n        },\n        handleLeavePage: function() {\n            this._unsubscribeSubscriptions();\n        },\n        handleTransition: function() {\n            this._unsubscribeSubscriptions();\n        },\n        handleTourStart: function() {\n        \n        },\n        handleTourStop: function() {\n        \n        },\n        handleTourComplete: function() {\n        \n        },\n        showStep: function(m) {\n            var n = this.steps[m];\n            if (!((this.openDialog == n))) {\n                this.hideOpenDialog();\n            };\n            if (!n) {\n                return\n            };\n            this.openDialog = n;\n            n.show();\n        },\n        hideOpenDialog: function() {\n            if (this.openDialog) {\n                this.openDialog.hide();\n                this.openDialog = null;\n            }\n        ;\n        },\n        getTourStarted: function() {\n            return this.tourStarted;\n        },\n        setTourStart: function() {\n            this.tourStarted = true;\n            this.handleTourStart();\n        },\n        setTourStop: function() {\n            this.tourStarted = false;\n            this.hideOpenDialog();\n            this.handleTourStop();\n        },\n        setTourComplete: function() {\n            if (this.tourComplete) {\n                return\n            };\n            this.setTourStop();\n            this.tourComplete = true;\n            this.handleTourComplete();\n        },\n        hideStep: function(m) {\n            var n = this.steps[m];\n            (n && n.hide());\n        }\n    });\n    j(l, {\n        getInstance: function() {\n            return (l._instance || (l._instance = new l()));\n        }\n    });\n    e.exports = l;\n});\n__d(\"FutureSideNavItem\", [\"Arbiter\",\"CSS\",\"DOM\",\"Parent\",\"$\",\"copyProperties\",\"createArrayFrom\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"CSS\"), i = b(\"DOM\"), j = b(\"Parent\"), k = b(\"$\"), l = b(\"copyProperties\"), m = b(\"createArrayFrom\");\n    function n(o, p) {\n        this.id = o.id;\n        this.up = p;\n        this.endpoint = o.endpoint;\n        this.type = o.type;\n        this.node = (o.node || k(o.id));\n        this.paths = (o.path ? m(o.path) : []);\n        this.keys = (o.key ? m(o.key) : []);\n        var q = this._findKeys(this.keys);\n        this.numericKey = (q.numeric || this.keys[0]);\n        this.textKey = (q.text || this.keys[0]);\n        this._pathPattern = this._buildRegex(this.paths);\n        this._keyPattern = this._buildRegex(this.keys);\n        this.hideLoading();\n        this.hideSelected();\n    };\n    l(n.prototype, {\n        equals: function(o) {\n            return (o && (o.id === this.id));\n        },\n        getLinkNode: function() {\n            return ((i.scry(this.node, \"a.item\")[0] || i.scry(this.node, \"a.subitem\")[0]));\n        },\n        matchPath: function(o) {\n            return this._matchInput(this._pathPattern, o);\n        },\n        matchKey: function(o) {\n            return this._matchInput(this._keyPattern, o);\n        },\n        _matchInput: function(o, p) {\n            var q = (o && o.exec(p));\n            return (q && q.slice(1));\n        },\n        getTop: function() {\n            return (this.isTop() ? this : this.up.getTop());\n        },\n        isTop: function(o) {\n            return !this.up;\n        },\n        setCount: function(o, p) {\n            return this._updateCount(o, true);\n        },\n        incrementCount: function(o, p) {\n            return this._updateCount(o, false);\n        },\n        _updateCount: function(o, p, q) {\n            var r = i.scry(this.node, \"span.count\")[0], s = (r && i.scry(r, \"span.countValue\")[0]);\n            if (s) {\n                var t = (p ? 0 : parseInt(i.getText(s), 10)), u = Math.max(0, (t + o)), v = (this.isTop() ? \"hidden\" : \"hiddenSubitem\");\n                i.setContent(s, u);\n                (q && h.conditionClass(this.node, v, !u));\n                h.conditionClass(r, \"hidden_elem\", !u);\n                if (this.isTop()) {\n                    var w = i.scry(this.node, \"div.linkWrap\")[0];\n                    if (w) {\n                        h.conditionClass(w, \"noCount\", !u);\n                        h.conditionClass(w, \"hasCount\", u);\n                    }\n                ;\n                }\n            ;\n            }\n        ;\n            g.inform(\"NavigationMessage.COUNT_UPDATE_DONE\");\n        },\n        showLoading: function() {\n            h.addClass(this.node, \"loading\");\n        },\n        hideLoading: function() {\n            h.removeClass(this.node, \"loading\");\n        },\n        showSelected: function() {\n            h.addClass(this.node, \"selectedItem\");\n            (h.hasClass(this.node, \"hider\") && h.addClass(this._getExpanderParent(), \"expandedMode\"));\n        },\n        hideSelected: function() {\n            h.removeClass(this.node, \"selectedItem\");\n        },\n        showChildren: function() {\n            h.addClass(this.node, \"open\");\n        },\n        hideChildren: function() {\n            h.removeClass(this.node, \"open\");\n        },\n        _getExpanderParent: function() {\n            return j.byClass(this.node, \"expandableSideNav\");\n        },\n        _buildRegex: function(o) {\n            if (o.length) {\n                var p = o.map(function(q) {\n                    if ((typeof q === \"string\")) {\n                        return q.replace(/([^a-z0-9_])/gi, \"\\\\$1\");\n                    }\n                     else if ((q && q.regex)) {\n                        return q.regex\n                    }\n                ;\n                });\n                return new RegExp(((\"^(?:\" + p.join(\"|\")) + \")$\"));\n            }\n        ;\n        },\n        _findKeys: function(o) {\n            var p = /^(app|group|fl)_/, q = {\n            };\n            for (var r = 0; (r < o.length); r++) {\n                var s = p.test(o[r]);\n                if ((s && !q.numeric)) {\n                    q.numeric = o[r];\n                }\n                 else if ((!s && !q.text)) {\n                    q.text = o[r];\n                }\n            ;\n                if ((q.numeric && q.text)) {\n                    break;\n                };\n            };\n            return q;\n        }\n    });\n    e.exports = n;\n});\n__d(\"FutureSideNavSection\", [\"Bootloader\",\"DOMQuery\",\"$\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Bootloader\"), h = b(\"DOMQuery\"), i = b(\"$\"), j = b(\"copyProperties\");\n    function k(l) {\n        this.id = l.id;\n        this.node = (this.node || i(l.id));\n        this.editEndpoint = l.editEndpoint;\n    };\n    j(k.prototype, {\n        equals: function(l) {\n            return (l && (l.id === this.id));\n        },\n        getEditorAsync: function(l) {\n            g.loadModules([\"SortableSideNav\",], function(m) {\n                var n = new m(h.find(this.node, \"ul.uiSideNav\"), this.editEndpoint);\n                l(n);\n            }.bind(this));\n        }\n    });\n    e.exports = k;\n});\n__d(\"FutureSideNav\", [\"Arbiter\",\"Bootloader\",\"ChannelConstants\",\"CSS\",\"DOM\",\"Event\",\"FutureSideNavItem\",\"FutureSideNavSection\",\"NavigationMessage\",\"PageTransitions\",\"Parent\",\"Run\",\"SelectorDeprecated\",\"URI\",\"UserAgent\",\"Vector\",\"copyProperties\",\"createArrayFrom\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"Bootloader\"), i = b(\"ChannelConstants\"), j = b(\"CSS\"), k = b(\"DOM\"), l = b(\"Event\"), m = b(\"FutureSideNavItem\"), n = b(\"FutureSideNavSection\"), o = b(\"NavigationMessage\"), p = b(\"PageTransitions\"), q = b(\"Parent\"), r = b(\"Run\"), s = b(\"SelectorDeprecated\"), t = b(\"URI\"), u = b(\"UserAgent\"), v = b(\"Vector\"), w = b(\"copyProperties\"), x = b(\"createArrayFrom\");\n    function y() {\n        (y.instance && y.instance.uninstall());\n        y.instance = this;\n    };\n    y.instance = null;\n    y.getInstance = function() {\n        return (y.instance || new y());\n    };\n    w(y.prototype, {\n        init: function(z, aa, ba) {\n            this.root = z;\n            this.items = {\n            };\n            this.sections = {\n            };\n            this.editor = null;\n            this.editing = false;\n            this.selected = null;\n            this.loading = null;\n            this.keyParam = \"sk\";\n            this.defaultKey = aa;\n            this.uri = t.getRequestURI();\n            this.ajaxPipe = ba;\n            this.ajaxPipeEndpoints = {\n            };\n            this.sidecol = true;\n            this._installed = true;\n            this._handlePageTransitions = true;\n            p.registerHandler(function(ca) {\n                return (this._handlePageTransitions && this.handlePageTransition(ca));\n            }.bind(this));\n            this._eventHandlers = [];\n            this._arbiterSubscriptions = [g.subscribe(o.NAVIGATION_COMPLETED, this.navigationComplete.bind(this)),g.subscribe(o.NAVIGATION_FAILED, this.navigationFailed.bind(this)),g.subscribe(o.NAVIGATION_COUNT_UPDATE, this.navigationCountUpdate.bind(this)),g.subscribe(o.NAVIGATION_SELECT, this.navigationSelect.bind(this)),g.subscribe(i.getArbiterType(\"nav_update_counts\"), this.navigationCountUpdateFromPresence.bind(this)),];\n            this._explicitHover = [];\n            this._ensureHover(\"sideNavItem\");\n            this._eventHandlers.push(l.listen(window, \"resize\", this._handleResize.bind(this)));\n            this._checkNarrow();\n            this._selectorSubscriptions = [];\n            (window.Selector && this._selectorSubscriptions.push(s.subscribe([\"open\",\"close\",], function(ca, da) {\n                var ea = q.byClass(da.selector, \"sideNavItem\");\n                (ea && j.conditionClass(ea, \"editMenuOpened\", (ca === \"open\")));\n            })));\n            r.onLeave(this.uninstall.bind(this));\n            if (this._pendingSections) {\n                this._pendingSections.forEach(function(ca) {\n                    this.initSection.apply(this, ca);\n                }.bind(this));\n            };\n        },\n        _handleResize: (function() {\n            var z;\n            return function() {\n                (z && clearTimeout(z));\n                z = this._checkNarrow.bind(this).defer(200);\n            };\n        })(),\n        _checkNarrow: function() {\n            j.conditionClass(this.root, \"uiNarrowSideNav\", (v.getElementPosition(this.root).x < 20));\n        },\n        _ensureHover: function(z) {\n            if ((u.ie() < 8)) {\n                h.loadModules([\"ExplicitHover\",], function(aa) {\n                    this._explicitHover.push(new aa(this.root, z));\n                }.bind(this));\n            };\n        },\n        uninstall: function() {\n            if (this._installed) {\n                this._installed = false;\n                this._handlePageTransitions = false;\n                this._arbiterSubscriptions.forEach(g.unsubscribe);\n                this._selectorSubscriptions.forEach(function(z) {\n                    s.unsubscribe(z);\n                });\n                this._eventHandlers.forEach(function(z) {\n                    z.remove();\n                });\n                this._explicitHover.forEach(function(z) {\n                    z.uninstall();\n                });\n            }\n        ;\n        },\n        initSection: function(z, aa) {\n            if (!this._installed) {\n                this._pendingSections = (this._pendingSections || []);\n                this._pendingSections.push(arguments);\n                return;\n            }\n        ;\n            this._initItems(aa);\n            this._initSection(z);\n        },\n        addItem: function(z, aa) {\n            this._initItem(z, aa);\n        },\n        _initItems: function(z) {\n            var aa = function(ba, ca) {\n                var da = this._initItem(ba, ca);\n                if (ba.children) {\n                    ba.children.forEach(function(ea) {\n                        aa(ea, da);\n                    });\n                };\n            }.bind(this);\n            x(z).forEach(function(ba) {\n                aa(ba, null);\n            });\n        },\n        _initItem: function(z, aa) {\n            var ba = this.items[z.id] = this._constructItem(z, aa);\n            if ((ba.equals(this.selected) || z.selected)) {\n                this.setSelected(ba);\n            };\n            var ca = ba.getLinkNode();\n            (ca && this._eventHandlers.push(l.listen(ca, \"click\", function(event) {\n                return !this.editing;\n            }.bind(this))));\n            return ba;\n        },\n        _initSection: function(z) {\n            var aa = this.sections[z.id] = this._constructSection(z);\n            this._eventHandlers.push(l.listen(aa.node, \"click\", this.handleSectionClick.bind(this, aa)));\n            k.scry(aa.node, \"div.bookmarksMenuButton\").forEach(j.show);\n            return aa;\n        },\n        _constructItem: function(z, aa) {\n            return new m(z, aa);\n        },\n        _constructSection: function(z) {\n            return new n(z);\n        },\n        handleSectionClick: function(z, event) {\n            var aa = this._getEventTarget(event, \"a\"), ba = this._getItemForNode(aa);\n            if (!aa) {\n                return;\n            }\n             else if (j.hasClass(aa.parentNode, \"uiMenuItem\")) {\n                this._handleMenuClick(z, ba, aa.parentNode, event);\n            }\n             else this._handleLinkClick(z, aa, event);\n            \n        ;\n        },\n        _getEventTarget: function(event, z) {\n            var aa = event.getTarget();\n            if ((aa.tagName !== z.toUpperCase())) {\n                return q.byTag(aa, z);\n            }\n             else return aa\n        ;\n        },\n        _handleMenuClick: function(z, aa, ba, event) {\n            if (j.hasClass(ba, \"rearrange\")) {\n                this.beginEdit(z);\n            };\n        },\n        _handleLinkClick: function(z, aa, event) {\n            if (j.hasClass(aa, \"navEditDone\")) {\n                (this.editing ? this.endEdit() : this.beginEdit(z));\n                event.kill();\n            }\n        ;\n        },\n        getItem: function(z) {\n            if (this._isCurrentPath(z)) {\n                return this._getItemForKey((this._getKey(z.getQueryData()) || this.defaultKey));\n            }\n             else return this._getItemForPath(z.getPath())\n        ;\n        },\n        getNodeForKey: function(z) {\n            var aa = this._getItemForKey(z);\n            if (aa) {\n                return aa.node\n            };\n        },\n        _isCurrentPath: function(z) {\n            return ((z.getDomain() === this.uri.getDomain()) && (z.getPath() === this.uri.getPath()));\n        },\n        _getKey: function(z) {\n            return z[this.keyParam];\n        },\n        _getItemForNode: function(z) {\n            z = q.byClass(z, \"sideNavItem\");\n            return (z && this.items[z.id]);\n        },\n        _getItemForKey: function(z) {\n            return this._findItem(function(aa) {\n                return aa.matchKey(z);\n            });\n        },\n        _getItemForPath: function(z) {\n            return this._findItem(function(aa) {\n                return aa.matchPath(z);\n            });\n        },\n        _findItem: function(z) {\n            for (var aa in this.items) {\n                if (z(this.items[aa])) {\n                    return this.items[aa]\n                };\n            };\n        },\n        removeItem: function(z) {\n            if ((z && this.items[z.id])) {\n                k.remove(z.node);\n                delete this.items[z.id];\n            }\n        ;\n        },\n        removeItemByKey: function(z) {\n            this.removeItem(this._getItemForKey(z));\n        },\n        moveItem: function(z, aa, ba) {\n            var ca = k.find(z.node, \"ul.uiSideNav\");\n            ((ba ? k.prependContent : k.appendContent))(ca, aa.node);\n        },\n        setLoading: function(z) {\n            (this.loading && this.loading.hideLoading());\n            this.loading = z;\n            (this.loading && this.loading.showLoading());\n        },\n        setSelected: function(z) {\n            this.setLoading(null);\n            if (this.selected) {\n                this.selected.hideSelected();\n                this.selected.getTop().hideChildren();\n            }\n        ;\n            this.selected = z;\n            if (this.selected) {\n                this.selected.showSelected();\n                this.selected.getTop().showChildren();\n            }\n        ;\n        },\n        handlePageTransition: function(z) {\n            var aa = this.getItem(z), ba = ((aa && aa.endpoint) && this._doPageTransition(aa, z));\n            return ba;\n        },\n        _doPageTransition: function(z, aa) {\n            this.setLoading(z);\n            this._sendPageTransition(z.endpoint, w(this._getTransitionData(z, aa), aa.getQueryData()));\n            return true;\n        },\n        _sendPageTransition: function(z, aa) {\n            aa.endpoint = z;\n            g.inform(o.NAVIGATION_BEGIN, {\n                useAjaxPipe: this._useAjaxPipe(z),\n                params: aa\n            });\n        },\n        _getTransitionData: function(z, aa) {\n            var ba = {\n            };\n            ba.sidecol = this.sidecol;\n            ba.path = aa.getPath();\n            ba[this.keyParam] = z.textKey;\n            ba.key = z.textKey;\n            return ba;\n        },\n        _useAjaxPipe: function(z) {\n            return (this.ajaxPipe || this.ajaxPipeEndpoints[z]);\n        },\n        navigationComplete: function() {\n            (this.loading && this.setSelected(this.loading));\n        },\n        navigationFailed: function() {\n            this.setLoading(null);\n        },\n        navigationSelect: function(z, aa) {\n            var ba = this._getItemForKey(this._getKey(aa));\n            if (aa.asLoading) {\n                this.setLoading(ba);\n            }\n             else this.setSelected(ba);\n        ;\n        },\n        navigationCountUpdate: function(z, aa) {\n            var ba = this._getItemForKey((aa && aa.key));\n            if (ba) {\n                if ((typeof aa.count !== \"undefined\")) {\n                    ba.setCount(aa.count, aa.hide);\n                }\n                 else if ((typeof aa.increment !== \"undefined\")) {\n                    ba.incrementCount(aa.increment, aa.hide);\n                }\n            \n            };\n        },\n        navigationCountUpdateFromPresence: function(z, aa) {\n            aa = aa.obj;\n            if (aa) {\n                if ((!aa.class_name || (aa.class_name && j.hasClass(this.root, aa.class_name)))) {\n                    if (aa.items) {\n                        for (var ba = 0; (ba < aa.items.length); ba++) {\n                            this.navigationCountUpdate(z, aa.items[ba]);;\n                        }\n                    }\n                }\n            };\n        },\n        beginEdit: function(z) {\n            if (!this.editing) {\n                this.editing = true;\n                j.addClass(this.root, \"editMode\");\n                this._updateTrackingData();\n                this._initEditor(z);\n            }\n        ;\n        },\n        endEdit: function() {\n            if (this.editing) {\n                j.removeClass(this.root, \"editMode\");\n                (this.editor && this.editor.endEdit());\n                this.editor = null;\n                this.editing = false;\n                this._updateTrackingData();\n            }\n        ;\n        },\n        _updateTrackingData: function(z) {\n            var aa = (this.root.getAttribute(\"data-gt\") || \"{}\");\n            try {\n                aa = JSON.parse(aa);\n                if (this.editing) {\n                    aa.editing = true;\n                }\n                 else delete aa.editing;\n            ;\n                this.root.setAttribute(\"data-gt\", JSON.stringify(aa));\n            } catch (ba) {\n            \n            };\n        },\n        _initEditor: function(z) {\n            z.getEditorAsync(function(aa) {\n                if (this.editing) {\n                    this.editor = aa;\n                    this.editor.beginEdit();\n                }\n            ;\n            }.bind(this));\n        }\n    });\n    e.exports = y;\n});\n__d(\"PageFanning\", [\"Animation\",\"AsyncRequest\",\"CSS\",\"DOM\",\"FutureSideNav\",\"Parent\",\"URI\",\"$\",\"collectDataAttributes\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Animation\"), h = b(\"AsyncRequest\"), i = b(\"CSS\"), j = b(\"DOM\"), k = b(\"FutureSideNav\"), l = b(\"Parent\"), m = b(\"URI\"), n = b(\"$\"), o = b(\"collectDataAttributes\"), p = b(\"copyProperties\"), q = {\n        setFanStatus: function(s, t, u, v, w, x, y) {\n            var z = {\n                ft: {\n                }\n            };\n            if (s) {\n                z = {\n                    ft: o(s, [\"ft\",]).ft\n                };\n            };\n            w = (w || function(ca) {\n                var da = ca.getPayload();\n                if ((!da || !s)) {\n                    return\n                };\n                if (da.reload) {\n                    q.reloadOnFanStatusChanged(da.preserve_tab);\n                }\n                 else r(s, da);\n            ;\n            });\n            var aa = {\n                fbpage_id: t,\n                add: u,\n                reload: v\n            };\n            if ((y != null)) {\n                p(aa, y);\n            };\n            p(aa, z);\n            var ba = new h().setURI(\"/ajax/pages/fan_status.php\").setData(aa).setNectarModuleDataSafe(s).setHandler(w);\n            if (x) {\n                ba.setErrorHandler(x);\n            };\n            ba.send();\n            return false;\n        },\n        reloadOnFanStatusChanged: function(s) {\n            var t = m.getRequestURI();\n            if (s) {\n                var u = k.getInstance().selected.textKey;\n                if ((!t.getQueryData().sk && u)) {\n                    t.addQueryData({\n                        sk: u\n                    });\n                };\n            }\n        ;\n            window.location.href = t;\n        },\n        toggleLikeOnFanStatusChanged: function(s, t) {\n            var u = n((\"liked_pages_like_action_\" + s)), v = n((\"liked_pages_undo_action_\" + s));\n            i.conditionClass(u, \"hidden_elem\", t);\n            i.conditionClass(v, \"hidden_elem\", !t);\n        },\n        informPageLikeButtonOnChange: function(s, t) {\n            var u = a.PageLikeButton;\n            if (u) {\n                if (t) {\n                    u.informLike(s);\n                    u.informLikeSuccess(s);\n                }\n                 else u.informUnlike(s);\n            \n            };\n        }\n    };\n    function r(s, t) {\n        var u = t.feedback;\n        if (!u) {\n            return\n        };\n        if (l.byClass(s, \"fbTimelineEscapeSectionItem\")) {\n            s = (l.byClass(s, \"fan_status_inactive\") || s);\n        };\n        var v = j.create(\"span\", {\n            className: \"fan_status_inactive\"\n        }, u);\n        s.parentNode.replaceChild(v, s);\n        var w = function() {\n            if (t.can_repeat_action) {\n                v.parentNode.replaceChild(s, v);\n            };\n        };\n        new g(v).duration(3000).checkpoint().to(\"backgroundColor\", \"#FFFFFF\").duration(1000).ondone(w).go();\n    };\n    e.exports = q;\n});\n__d(\"PageLikeButton\", [\"Arbiter\",\"AsyncRequest\",\"AsyncResponse\",\"Event\",\"PageFanning\",\"SubscribeButton\",\"Tour\",\"URI\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"AsyncRequest\"), i = b(\"AsyncResponse\"), j = b(\"Event\"), k = b(\"PageFanning\"), l = b(\"SubscribeButton\"), m = b(\"Tour\"), n = b(\"URI\"), o = {\n        LIKED: \"liked\",\n        UNLIKED: \"unliked\",\n        LIKED_SUCCESS: \"liked_success\",\n        init: function(r, s, t, u, v, w, x, y, z, aa, ba) {\n            g.subscribe(o.LIKED, function(ca, da) {\n                if ((u === da.profile_id)) {\n                    if (!z) {\n                        t.suppressNextMouseEnter();\n                    };\n                    r.swap(ba);\n                    if ((aa === true)) {\n                        new h().setURI(\"/ajax/pages/suggestions_on_liking.php\").setData({\n                            pageid: u\n                        }).send();\n                    };\n                }\n            ;\n            });\n            g.subscribe(o.UNLIKED, function(ca, da) {\n                if ((u === da.profile_id)) {\n                    r.unswap(ba);\n                    t.hideFlyout();\n                }\n            ;\n            });\n            if (y) {\n                g.subscribe(o.LIKED_SUCCESS, function(ca, da) {\n                    var ea = n.getRequestURI().getQueryData().app_data;\n                    if ((da.profile_id == u)) {\n                        new h().setURI(\"/ajax/pages/fetch_app_column.php\").setData({\n                            profile_id: u,\n                            tab_key: y,\n                            app_data: ea\n                        }).send();\n                    };\n                });\n            };\n            j.listen(s, \"click\", q.bind(null, u, v, w, x));\n        },\n        initCallout: function(r, s) {\n            var t = document.getElementById(\"pageActionLikeCalloutButton\");\n            j.listen(t, \"click\", q.bind(null, r, s, null, null));\n        },\n        initUnlike: function(r, s, t) {\n            j.listen(r, \"click\", function(event) {\n                p(event.getTarget(), s, false, function(u) {\n                    g.inform(o.LIKED, {\n                        profile_id: s\n                    });\n                    i.defaultErrorHandler(u);\n                }, t);\n                o.informUnlike(s);\n            });\n        },\n        informLike: function(r, s, t) {\n            var u = {\n                profile_id: r,\n                target: s,\n                origin: t\n            };\n            g.inform(o.LIKED, u);\n            g.inform(l.SUBSCRIBED, u);\n        },\n        informLikeSuccess: function(r) {\n            var s = {\n                profile_id: r\n            };\n            g.inform(o.LIKED_SUCCESS, s);\n        },\n        informUnlike: function(r) {\n            var s = {\n                profile_id: r\n            };\n            g.inform.bind(g, o.UNLIKED, s).defer();\n            g.inform.bind(g, l.UNSUBSCRIBED, s).defer();\n        }\n    };\n    function p(r, s, t, u, v, w, x) {\n        m.getInstance().hideStep(\"low_page_likes\");\n        k.setFanStatus(r, s, t, false, function() {\n            o.informLikeSuccess(s);\n        }, u, {\n            fan_origin: v,\n            fan_source: w,\n            cat: x\n        });\n    };\n    function q(r, s, t, u, event) {\n        p(event.getTarget(), r, true, function(v) {\n            g.inform(o.UNLIKED, {\n                profile_id: r\n            });\n            i.defaultErrorHandler(v);\n        }, s, t, u);\n        o.informLike(r, event.getTarget(), s);\n    };\n    e.exports = o;\n    a.PageLikeButton = o;\n});\n__d(\"legacy:PageLikeButton\", [\"PageLikeButton\",], function(a, b, c, d) {\n    a.PageLikeButton = b(\"PageLikeButton\");\n}, 3);\n__d(\"legacy:AudienceSelector\", [\"AudienceSelector\",], function(a, b, c, d) {\n    b(\"AudienceSelector\");\n}, 3);\n__d(\"FriendListPrivacyOptions\", [\"Arbiter\",\"AsyncDialog\",\"AsyncRequest\",\"Dialog\",\"DOMQuery\",\"PageTransitions\",\"Parent\",\"SelectorDeprecated\",\"$\",\"ge\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"AsyncDialog\"), i = b(\"AsyncRequest\"), j = b(\"Dialog\"), k = b(\"DOMQuery\"), l = b(\"PageTransitions\"), m = b(\"Parent\"), n = b(\"SelectorDeprecated\"), o = b(\"$\"), p = b(\"ge\"), q = false, r = false, s = null, t = {\n    }, u = function(w) {\n        if (!Object.keys(t).length) {\n            l.registerHandler(function() {\n                t = {\n                };\n                q = false;\n                r = false;\n            });\n        };\n        var x = w.getAttribute(\"data-name\");\n        t[x] = w;\n        n.listen(w, \"select\", function(y) {\n            var z = y.option, aa = k.find(z, \"a.itemAnchor\"), ba = aa.getAttribute(\"data-flid\");\n            if (!ba) {\n                return\n            };\n            var ca = aa.getAttribute(\"data-dynamic\");\n            if ((ca && q)) {\n                v.showSmartListNux(z, ba);\n            }\n             else if ((!ca && r)) {\n                v.showDumbListNux([ba,]);\n            }\n        ;\n        });\n    }, v = {\n        listen: function(w, x, y) {\n            var z = p(w);\n            if (!z) {\n                return\n            };\n            var aa = m.byClass(z, \"audienceSelector\");\n            if (aa) {\n                u(aa);\n                q = x;\n                r = y;\n            }\n        ;\n        },\n        showSmartListNux: function(w, x) {\n            w = o(w);\n            new i(\"/ajax/friends/lists/smart_list_publish_nux.php\").setData({\n                option_id: w.id,\n                flid: x\n            }).send();\n            q = false;\n        },\n        setContextualDialog: function(w, x) {\n            x = o(x);\n            var y = m.byClass(x, \"audienceSelector\");\n            if (y) {\n                w.setContext(y);\n                w.show();\n                var z = g.subscribe(\"composer/publish\", function() {\n                    w.hide();\n                });\n                w.subscribe(\"hide\", function() {\n                    z.unsubscribe();\n                });\n            }\n        ;\n        },\n        showDumbListNux: function(w) {\n            h.send(new i(\"/ajax/friends/lists/dumb_list_publish_nux.php\").setData({\n                flids: w\n            }));\n            r = false;\n        },\n        showBothListsNux: function(w, x) {\n            s = o(w);\n            v.showDumbListNux(x);\n        },\n        setDialogX: function(w) {\n            if (!s) {\n                return\n            };\n            w.subscribe(\"hide\", function() {\n                v.showSmartListNux(s);\n                s = null;\n            });\n        },\n        setDialog: function() {\n            if (!s) {\n                return\n            };\n            var w = j.getCurrent();\n            if (w) {\n                w.setCloseHandler(function() {\n                    v.showSmartListNux(s);\n                    s = null;\n                });\n            };\n        }\n    };\n    e.exports = v;\n});\n__d(\"FriendsMinusAcquaintancesPrivacyOption\", [\"AudienceSelectorTags\",\"BasePrivacyOption\",\"Class\",\"DOM\",\"PrivacyConst\",\"copyProperties\",\"fbt\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"AudienceSelectorTags\"), h = b(\"BasePrivacyOption\"), i = b(\"Class\"), j = b(\"DOM\"), k = b(\"PrivacyConst\"), l = k.FriendsValue, m = b(\"copyProperties\"), n = b(\"fbt\"), o = b(\"tx\");\n    function p(q, r) {\n        this._hasRestricted = r;\n        this.parent.construct(this, q);\n    };\n    i.extend(p, h);\n    m(p.prototype, {\n        _getChangedData: function() {\n            return {\n                hasEvent: this._hasEvent,\n                tags: this._taggedIDs,\n                privacy: l.FRIENDS_MINUS_ACQUAINTANCES\n            };\n        },\n        _recalculateTooltipAndLabel: function() {\n            var q = this._hasEvent, r = this._tags.length, s = this._tooltip, t = this._label;\n            if (q) {\n                if (((r > 1) || this._alreadyHasTags())) {\n                    this._tooltip = (this._hasRestricted ? \"Your friends, friends of anyone tagged and event guests; Except: Acquaintances, Restricted\" : \"Your friends, friends of anyone tagged and event guests; Except: Acquaintances\");\n                }\n                 else if ((r == 1)) {\n                    this._tooltip = (this._hasRestricted ? o._(\"Your friends, {user}'s friends and event guests; Except: Acquaintances, Restricted\", {\n                        user: this._tags[0]\n                    }) : o._(\"Your friends, {user}'s friends and event guests; Except: Acquaintances\", {\n                        user: this._tags[0]\n                    }));\n                }\n                 else this._tooltip = (this._hasRestricted ? \"Your friends and event guests; Except: Acquaintances, Restricted\" : \"Your friends and event guests; Except: Acquaintances\");\n                \n            ;\n            }\n             else if (((r > 0) || this._alreadyHasTags())) {\n                var u = \"friends of anyone tagged\", v = n._(\"{people who can see this}, {list of more people who can see this}\", [n.param(\"people who can see this\", \"Your friends\"),n.param(\"list of more people who can see this\", u),]), w = \"Acquaintances\";\n                if (this._hasRestricted) {\n                    w = n._(\"{Name of Acquaintances friend list}, {restricted}\", [n.param(\"Name of Acquaintances friend list\", w),n.param(\"restricted\", \"Restricted\"),]);\n                };\n                this._tooltip = this._getCombinedSentence(v, w);\n            }\n             else {\n                this._tooltip = \"Friends except Acquaintances\";\n                if (this._hasRestricted) {\n                    this._tooltip = \"Friends; Except: Acquaintances, Restricted\";\n                };\n            }\n            \n        ;\n            this._recalcLabel();\n            return ((((s != this._tooltip)) || ((t != this._label))));\n        },\n        _alreadyHasTags: function() {\n            var q = j.scry(this._selector, \"*[data-oid]\")[0];\n            q = (q && q.getAttribute(\"data-oid\"));\n            return (q && g.hasTags(q));\n        },\n        _getTagExpansionBehavior: function() {\n            return k.TagExpansion.FRIENDS_OF_TAGGEES;\n        }\n    });\n    e.exports = p;\n});\n__d(\"FriendsPrivacyOption\", [\"Arbiter\",\"BasePrivacyOption\",\"Class\",\"PrivacyConst\",\"SelectorDeprecated\",\"copyProperties\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"BasePrivacyOption\"), i = b(\"Class\"), j = b(\"PrivacyConst\"), k = b(\"SelectorDeprecated\"), l = b(\"copyProperties\"), m = b(\"tx\");\n    function n(o, p) {\n        this._hasRestricted = p;\n        this.parent.construct(this, o);\n    };\n    i.extend(n, h);\n    l(n.prototype, {\n        _getChangedData: function() {\n            return {\n                hasEvent: this._hasEvent,\n                tags: this._taggedIDs,\n                privacy: j.FriendsValue.ALL_FRIENDS\n            };\n        },\n        _eventTagChanged: function() {\n            var o = this._getChangedData();\n            o.privacy = k.getValue(this._selector);\n            g.inform(\"EventTagged/changed\", o);\n        },\n        _recalculateTooltipAndLabel: function() {\n            var o = this._hasEvent, p = this._tags.length, q = this._tooltip, r = this._label;\n            if ((p > 2)) {\n                if (o) {\n                    this._tooltip = (this._hasRestricted ? \"Your friends, friends of anyone tagged and event guests; Except: Restricted\" : \"Your friends, friends of anyone tagged and event guests\");\n                }\n                 else this._tooltip = (this._hasRestricted ? \"Your friends and friends of anyone tagged; Except: Restricted\" : \"Your friends and friends of anyone tagged\");\n            ;\n            }\n             else if ((p == 2)) {\n                if (o) {\n                    if (this._hasRestricted) {\n                        this._tooltip = \"Your friends, friends of anyone tagged and event guests; Except: Restricted\";\n                    }\n                     else this._tooltip = \"Your friends, friends of anyone tagged and event guests\";\n                ;\n                }\n                 else if (this._hasRestricted) {\n                    this._tooltip = m._(\"Your friends, {user}'s friends and {user2}'s friends; Except: Restricted \", {\n                        user: this._tags[0],\n                        user2: this._tags[1]\n                    });\n                }\n                 else this._tooltip = m._(\"Your friends, {user}'s friends and {user2}'s friends\", {\n                    user: this._tags[0],\n                    user2: this._tags[1]\n                });\n                \n            ;\n            }\n             else if ((p == 1)) {\n                if (o) {\n                    if (this._hasRestricted) {\n                        this._tooltip = m._(\"Your friends, {user}'s friends and event guests; Except: Restricted\", {\n                            user: this._tags[0]\n                        });\n                    }\n                     else this._tooltip = m._(\"Your friends, {user}'s friends and event guests\", {\n                        user: this._tags[0]\n                    });\n                ;\n                }\n                 else if (this._hasRestricted) {\n                    this._tooltip = m._(\"Your friends and {user}'s friends; Except: Restricted\", {\n                        user: this._tags[0]\n                    });\n                }\n                 else this._tooltip = m._(\"Your friends and {user}'s friends\", {\n                    user: this._tags[0]\n                });\n                \n            ;\n            }\n             else if (o) {\n                this._tooltip = (this._hasRestricted ? \"Your friends and event guests; Except: Restricted\" : \"Your friends and event guests\");\n            }\n             else this._tooltip = (this._hasRestricted ? \"Your friends; Except: Restricted\" : \"Your friends\");\n            \n            \n            \n        ;\n            this._recalcLabel();\n            return (((q != this._tooltip)) || ((r != this._label)));\n        },\n        _getTagExpansionBehavior: function() {\n            return j.TagExpansion.FRIENDS_OF_TAGGEES;\n        }\n    });\n    e.exports = n;\n});\n__d(\"MetaComposerEdDialog\", [\"Animation\",\"Arbiter\",\"ARIA\",\"AsyncRequest\",\"copyProperties\",\"CSS\",\"DOM\",\"Ease\",\"ge\",\"Parent\",\"SelectorDeprecated\",\"Vector\",], function(a, b, c, d, e, f) {\n    var g = b(\"Animation\"), h = b(\"Arbiter\"), i = b(\"ARIA\"), j = b(\"AsyncRequest\"), k = b(\"copyProperties\"), l = b(\"CSS\"), m = b(\"DOM\"), n = b(\"Ease\"), o = b(\"ge\"), p = b(\"Parent\"), q = b(\"SelectorDeprecated\"), r = b(\"Vector\"), s = null;\n    function t(u) {\n        this._dialog = u.dialog;\n        this.config = u;\n        this._init();\n    };\n    t.init = function(u) {\n        if (s) {\n            s.config.show_audience = u.show_audience;\n            u.dialog.destroy();\n            return;\n        }\n    ;\n        s = new t(u);\n    };\n    k(t.prototype, {\n        _init: function() {\n            h.subscribe(\"ComposerXStatusAttachment/ready\", function() {\n                if (this.config.show_audience) {\n                    this._sendEducationRequest({\n                    }, \"/ajax/composer/audience/education\", this._handlerCustomDuration.bind(this, 6000));\n                    this.config.show_audience = false;\n                }\n            ;\n            }.bind(this));\n            if (this.config.show_sticky) {\n                h.subscribe(\"composer/mutate\", function(u, v) {\n                    this._sendEducationRequest({\n                        sticky_num: this.config.n_sticky_shown\n                    }, \"/ajax/composer/audience/sticky_education\");\n                }.bind(this));\n            };\n            if (this.config.show_event_tags) {\n                if ((this.config.n_event_tag_shown === 0)) {\n                    h.subscribe(\"EventTagged/changed\", function(u, v) {\n                        this._sendEducationRequest({\n                            selector: \"div.fbComposerAudienceTourContext\",\n                            privacy: v.privacy,\n                            event_tag_num: this.config.n_event_tag_shown\n                        }, \"/ajax/events/tagging/user_education\");\n                    }.bind(this));\n                    h.subscribe([\"composer/publish\",\"composer/reset\",], function() {\n                        var u = o(\"event_tagging_tag_expansion_NUX\");\n                        (u && l.hide(u));\n                    }.bind(this));\n                }\n                 else h.subscribe(\"EventTagged/changed\", function(u, v) {\n                    this._sendEducationRequest({\n                        ids: v.tags,\n                        from: \"AtTagger\",\n                        hasEvent: v.hasEvent,\n                        type: v.privacy,\n                        tag_num: this.config.n_tag_shown,\n                        event_tag_num: this.config.n_event_tag_shown\n                    }, \"ajax/composer/audience/tag_education\", this._handler.bind(this));\n                }.bind(this));\n            \n            };\n            if (this.config.show_tags) {\n                h.subscribe(\"SelectedPrivacyOption/changed\", function(u, v) {\n                    this._sendEducationRequest({\n                        ids: v.tags,\n                        from: \"WithTagger\",\n                        hasEvent: v.hasEvent,\n                        type: v.privacy,\n                        tag_num: this.config.n_tag_shown,\n                        event_tag_num: this.config.n_event_tag_shown\n                    }, \"/ajax/composer/audience/tag_education\", this._handler.bind(this));\n                }.bind(this));\n            };\n            q.subscribe(\"open\", this._killAnim.bind(this));\n        },\n        _sendEducationRequest: function(u, v, w) {\n            if (!this._updateDialogContext()) {\n                return\n            };\n            (this._async && this._async.abort());\n            this._async = new j(v);\n            this._async.setData(u).setHandler(w).send();\n        },\n        _updateDialogContext: function() {\n            var u = m.scry(document.body, \"div.composerAudienceWrapper\"), v, w;\n            for (var x = 0; (x < u.length); x++) {\n                v = u[x];\n                w = r.getElementPosition(v);\n                if (((v && (w.x > 0)) && (w.y > 0))) {\n                    this._dialog.setContext(v);\n                    return true;\n                }\n            ;\n            };\n            return false;\n        },\n        _handler: function(u) {\n            this._handlerCustomDuration(1500, u);\n        },\n        _handlerCustomDuration: function(u, v) {\n            var w = v.payload;\n            if ((!w || !this._updateDialogContext())) {\n                return\n            };\n            var x = this._dialog.getContent().firstChild;\n            m.setContent(x, w);\n            i.announce(m.getText(x));\n            this._dialog.show();\n            var y = p.byClass(x, \"metaComposerUserEd\");\n            if (this._anim) {\n                this._anim.stop();\n                this._anim = new g(y);\n            }\n             else this._anim = new g(y).from(\"opacity\", 0);\n        ;\n            this._anim.to(\"opacity\", 1).ease(n.sineOut).checkpoint().duration(u).checkpoint().to(\"opacity\", 0).ease(n.sineOut).checkpoint().ondone(this._killAnim.bind(this)).go();\n        },\n        _killAnim: function(u, v) {\n            if (this._anim) {\n                this._dialog.hide();\n                this._anim.stop();\n                this._anim = null;\n            }\n        ;\n        }\n    });\n    e.exports = t;\n});\n__d(\"OnlyMePrivacyOption\", [\"BasePrivacyOption\",\"copyProperties\",\"Class\",\"PrivacyConst\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"BasePrivacyOption\"), h = b(\"copyProperties\"), i = b(\"Class\"), j = b(\"PrivacyConst\"), k = b(\"tx\");\n    function l(m) {\n        this.parent.construct(this, m);\n    };\n    i.extend(l, g);\n    h(l.prototype, {\n        _getChangedData: function() {\n            return {\n                hasEvent: this._hasEvent,\n                tags: this._taggedIDs,\n                privacy: j.FriendsValue.SELF\n            };\n        },\n        _getIncludedAudience: function() {\n            return \"Only you\";\n        },\n        _getTagExpansionBehavior: function() {\n            return j.TagExpansion.TAGGEES;\n        }\n    });\n    e.exports = l;\n});\n__d(\"legacy:UIPagelet\", [\"UIPagelet\",], function(a, b, c, d) {\n    a.UIPagelet = b(\"UIPagelet\");\n}, 3);\n__d(\"HoverButton\", [\"AsyncRequest\",\"CSS\",\"DOM\",\"URI\",\"copyProperties\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = b(\"CSS\"), i = b(\"DOM\"), j = b(\"URI\"), k = b(\"copyProperties\"), l = b(\"cx\");\n    function m(n, o, p, q) {\n        this._button = n;\n        this._flyout = o;\n        this._flyoutAjaxify = q;\n        this._flyoutContent = p;\n        o.subscribe(\"show\", this._onShow.bind(this));\n        o.subscribe(\"hide\", this._onHide.bind(this));\n    };\n    k(m.prototype, {\n        _button: null,\n        _flyout: null,\n        _flyoutAjaxify: null,\n        _flyoutContent: null,\n        showFlyoutBriefly: function() {\n            this.showFlyout();\n            this._flyout.hideFlyoutDelayed(5000);\n        },\n        showFlyout: function() {\n            this._flyout.showFlyout(this._button, true);\n            this._flyout.inform(\"show\", this._button);\n        },\n        hideFlyout: function() {\n            this._flyout.hideFlyout(true);\n            this._flyout.inform(\"hide\", this._button);\n        },\n        enableButton: function() {\n            this._flyout.initNode(this._button);\n        },\n        disableButton: function() {\n            this.hideFlyout();\n            this._flyout.deactivateNode(this._button);\n        },\n        _onShow: function(n, o) {\n            h.addClass(o, \"_52nd\");\n            if ((h.hasClass(o, \"uiButton\") || h.hasClass(o, \"_42fu\"))) {\n                h.addClass(o, \"selected\");\n            };\n            if (this._flyoutAjaxify) {\n                h.addClass(this._flyoutContent, \"async_saving\");\n                new g().setURI(new j(this._flyoutAjaxify)).setHandler(function(p) {\n                    h.removeClass(this._flyoutContent, \"async_saving\");\n                    i.setContent(this._flyoutContent, p.payload);\n                }.bind(this)).send();\n                this._flyoutAjaxify = null;\n            }\n        ;\n        },\n        _onHide: function(n, o) {\n            h.removeClass(o, \"_52nd\");\n            if ((h.hasClass(o, \"uiButton\") || h.hasClass(o, \"_42fu\"))) {\n                h.removeClass(o, \"selected\");\n            };\n        },\n        destroy: function() {\n            this.hideFlyout();\n            this._flyout.destroy();\n        },\n        suppressNextMouseEnter: function() {\n            this._flyout.setActiveNode(this._button);\n        }\n    });\n    e.exports = m;\n});\n__d(\"legacy:DynamicIconSelector\", [\"DynamicIconSelector\",], function(a, b, c, d) {\n    a.DynamicIconSelector = b(\"DynamicIconSelector\");\n}, 3);\n__d(\"MentionsInputMatchers\", [], function(a, b, c, d, e, f) {\n    var g = [\"@\",\"\\\\uff20\",\"+\",\"\\\\uff0b\",].join(\"\"), h = \".,*?$|#{}()\\\\^\\\\-\\\\[\\\\]\\\\\\\\/!%&'\\\"~=\\u003C\\u003E_:;\", i = ((\"\\\\b[A-Z][^ A-Z\" + h) + \"]\"), j = (((((((\"([^\" + g) + h) + \"]|[\") + h) + \"][^ \") + h) + \"])\"), k = ((((\"(?:^|\\\\s)(?:[\" + g) + \"](\") + j) + \"{0,20}))\"), l = ((((\"(?:(?:^|[^#])(\" + i) + \"+)|\") + k) + \")\"), m = ((\"(?:\" + i) + \"{4,})\"), n = \"#\\\\uFF03\", o = {\n        trigger: new RegExp(((\"[\" + g) + \"]$\")),\n        hashtagTrigger: new RegExp(((\"[\" + n) + \"]\")),\n        mainMatcher: new RegExp((k + \"$\")),\n        autoMatcher: new RegExp((l + \"$\")),\n        userMatcher: new RegExp((m + \"$\"))\n    };\n    e.exports = o;\n});\n__d(\"MentionsInput\", [\"function-extensions\",\"Arbiter\",\"ArbiterMixin\",\"Bootloader\",\"CSS\",\"DataStore\",\"DOM\",\"Event\",\"HTML\",\"Input\",\"InputSelection\",\"Keys\",\"MentionsInputMatchers\",\"Parent\",\"Style\",\"TypeaheadUtil\",\"UserAgent\",\"copyProperties\",\"htmlize\",\"removeFromArray\",\"repeatString\",], function(a, b, c, d, e, f) {\n    b(\"function-extensions\");\n    var g = b(\"Arbiter\"), h = b(\"ArbiterMixin\"), i = b(\"Bootloader\"), j = b(\"CSS\"), k = b(\"DataStore\"), l = b(\"DOM\"), m = b(\"Event\"), n = b(\"HTML\"), o = b(\"Input\"), p = b(\"InputSelection\"), q = b(\"Keys\"), r = b(\"MentionsInputMatchers\"), s = b(\"Parent\"), t = b(\"Style\"), u = b(\"TypeaheadUtil\"), v = b(\"UserAgent\"), w = b(\"copyProperties\"), x = b(\"htmlize\"), y = b(\"removeFromArray\"), z = b(\"repeatString\"), aa = \"\\ufeff\", ba = new RegExp(aa, \"g\"), ca = function(ja) {\n        return (ja + aa);\n    }, da = \"\\ufffd\", ea = /@+\\[[0-9]+\\:([^\\]]|\\\\\\])*\\]+/g, fa = /[\\\\\\]:]/g;\n    function ga(ja, ka) {\n        return ja.replace(ka, z(\" \", ka.length));\n    };\n    function ha(ja, ka) {\n        return (ja.substring(0, ka) + ja.substring((ka + 1)));\n    };\n    function ia(ja, ka, la, ma, na, oa) {\n        k.set(ja, \"MentionsInput\", this);\n        this._root = ja;\n        this._typeahead = ka;\n        this._input = la;\n        var pa = null, qa = this.init.bind(this, ma, na, oa);\n        try {\n            pa = (document.activeElement === this._input);\n        } catch (ra) {\n        \n        };\n        if (pa) {\n            qa.defer();\n        }\n         else var sa = m.listen(this._input, \"focus\", function() {\n            qa.defer();\n            sa.remove();\n        })\n    ;\n        this._hasHashtags = ma.hashtags;\n        this._hashtags = [];\n    };\n    ia.getInstance = function(ja) {\n        var ka = s.byClass(ja, \"uiMentionsInput\");\n        return (ka ? k.get(ka, \"MentionsInput\") : null);\n    };\n    w(ia.prototype, h, {\n        init: function(ja, ka, la) {\n            if (this._initialized) {\n                return\n            };\n            this._initialized = true;\n            this._highlighter = l.find(this._root, \".highlighter\");\n            this._highlighterInner = this._highlighter.firstChild;\n            this._highlighterContent = l.find(this._root, \".highlighterContent\");\n            this._hiddenInput = l.find(this._root, \".mentionsHidden\");\n            this._placeholder = (this._input.getAttribute(\"placeholder\") || \"\");\n            this._maxMentions = (ja.max || 6);\n            this._metrics = la;\n            if (!this._hiddenInput.name) {\n                var ma = this._input.name;\n                this._input.name = (ma + \"_text\");\n                this._hiddenInput.name = ma;\n            }\n        ;\n            this._initEvents();\n            this._initTypeahead();\n            this.reset(ka);\n            this.inform(\"init\", null, g.BEHAVIOR_STATE);\n        },\n        reset: function(ja) {\n            if (!this._initialized) {\n                return\n            };\n            this._mentioned = {\n            };\n            this._orderedUIDs = [];\n            this._numMentioned = 0;\n            this._filterData = null;\n            (this._hiddenInput && (this._hiddenInput.value = \"\"));\n            (this._highlighterContent && l.empty(this._highlighterContent));\n            (this._highlighterAuxContent && l.remove(this._highlighterAuxContent));\n            this._highlighterAuxContent = null;\n            o.setPlaceholder(this._input, this._placeholder);\n            t.set(this._typeahead.getElement(), \"height\", \"auto\");\n            var ka = ((ja && ja.value) || \"\"), la = (ja && ja.mentions);\n            if ((la && la.length)) {\n                var ma = [];\n                la.forEach(function(na) {\n                    ma.push((na.offset + na.length));\n                    delete na.offset;\n                    delete na.length;\n                    this._addToken(na);\n                }, this);\n                ma.reverse().forEach(function(na) {\n                    ka = ((ka.substring(0, na) + aa) + ka.substring(na));\n                });\n            }\n        ;\n            o.setValue(this._input, ka);\n            this._updateTypeahead();\n            this._updateWidth();\n            this._update();\n        },\n        getValue: function() {\n            return this._getMarkedValue().replace(ba, \"\");\n        },\n        _getMarkedValue: function() {\n            return o.getValue(this._input);\n        },\n        getRawValue: function() {\n            this._update();\n            return o.getValue(this._hiddenInput);\n        },\n        checkValue: function() {\n            var ja = this._typeahead.getCore().getValue();\n            if ((r.trigger.exec(ja) || (ja === \"\"))) {\n                this.inform(\"sessionEnd\", {\n                });\n            };\n        },\n        getTypeahead: function() {\n            return this._typeahead;\n        },\n        _initEvents: function() {\n            var ja = this._update.bind(this);\n            m.listen(this._input, {\n                input: ja,\n                keyup: ja,\n                change: ja,\n                blur: this._handleBlur.bind(this),\n                focus: this._handleFocus.bind(this),\n                keydown: this._handleKeydown.bind(this)\n            });\n            if (this._metrics) {\n                this._metrics._reset();\n                this._metrics.bindSessionStart(this._typeahead, \"render\", true);\n                this._metrics.bindSessionEnd(this._typeahead.getView(), \"select\", true);\n                this._metrics.bindSessionEnd(this, \"sessionEnd\", false);\n                m.listen(this._input, \"keyup\", function(event) {\n                    this.checkValue.bind(this).defer();\n                }.bind(this));\n            }\n        ;\n        },\n        _initTypeahead: function() {\n            this._typeahead.subscribe(\"select\", function(oa, pa) {\n                var qa = pa.selected;\n                this._addToken({\n                    uid: qa.uid,\n                    text: qa.text,\n                    type: qa.type,\n                    weakreference: qa.weak_reference\n                });\n                this.updateValue();\n            }.bind(this));\n            var ja = this._input, ka = null;\n            function la() {\n                if ((ka === null)) {\n                    ka = o.getSubmitOnEnter(ja);\n                    o.setSubmitOnEnter(ja, false);\n                }\n            ;\n            };\n            function ma() {\n                if ((ka !== null)) {\n                    o.setSubmitOnEnter(ja, ka);\n                    ka = null;\n                }\n            ;\n            };\n            this._typeahead.subscribe(\"reset\", ma);\n            this._typeahead.subscribe(\"render\", la);\n            this._typeahead.subscribe(\"highlight\", function(oa, pa) {\n                ((pa.index >= 0) ? la() : ma());\n            });\n            this._typeahead.subscribe(\"query\", function() {\n                this._filterData = null;\n            }.bind(this));\n            var na = this._typeahead.getCore();\n            na.suffix = aa;\n            this._handleFocus();\n        },\n        _handleBlur: function() {\n            if (this._filterToken) {\n                this._filterToken.remove();\n                this._filterToken = null;\n            }\n        ;\n        },\n        _handleFocus: function() {\n            if (!this._filterToken) {\n                this._filterToken = this._typeahead.getData().addFilter(this._filterResults.bind(this));\n            };\n            this._updateWidth();\n        },\n        _handleKeydown: function(event) {\n            var ja = event.keyCode;\n            if (((ja == q.BACKSPACE) || (ja == q.DELETE))) {\n                this._handleBackspaceAndDelete(event, ja);\n            };\n            if (((ja == q.LEFT) || (ja == q.RIGHT))) {\n                setTimeout(this._handleLeftAndRight.bind(this, ja), 10);\n            };\n        },\n        _handleLeftAndRight: function(ja) {\n            var ka = this._getMarkedValue(), la = p.get(this._input), ma = la.start, na = la.end, oa = (ja == q.LEFT), pa = (ja == q.RIGHT);\n            if ((ma == na)) {\n                var qa = (oa ? -1 : 1);\n                if ((ka.charAt(ma) == aa)) {\n                    p.set(this._input, (ma + qa));\n                };\n            }\n             else if ((oa && (ka.charAt(ma) == aa))) {\n                p.set(this._input, (ma - 1), na);\n            }\n             else if ((oa && (ka.charAt(na) == aa))) {\n                p.set(this._input, ma, (na - 1));\n            }\n             else if ((pa && (ka.charAt(na) == aa))) {\n                p.set(this._input, ma, (na + 1));\n            }\n             else if ((pa && (ka.charAt(ma) == aa))) {\n                p.set(this._input, (ma + 1), na);\n            }\n            \n            \n            \n        ;\n        },\n        _handleBackspaceAndDelete: function(event, ja) {\n            var ka = p.get(this._input), la = false;\n            if ((ka.start !== ka.end)) {\n                if ((this._offsetIsInsideMention((ka.start + 1)) && this._offsetIsInsideMention(ka.end))) {\n                    la = ((ja === q.BACKSPACE));\n                }\n                 else return\n            \n            };\n            var ma = ((ja === q.DELETE) ? 1 : -1), na = (ma + ((la ? ka.end : ka.start))), oa = this._getMarkedValue(), pa = oa;\n            for (var qa = 0; (qa < this._orderedUIDs.length); ++qa) {\n                var ra = this._mentioned[this._orderedUIDs[qa]], sa = ra.text, ta = ca(sa), ua = pa.indexOf(ta), va = (ua + ta.length);\n                if (((na < ua) || (na >= va))) {\n                    pa = ga(pa, ta);\n                    continue;\n                }\n            ;\n                var wa, xa;\n                if ((ra.type != \"user\")) {\n                    wa = 0;\n                    xa = [sa,];\n                }\n                 else {\n                    wa = (ta.substring(0, (na - ua)).split(\" \").length - 1);\n                    xa = sa.split(\" \");\n                }\n            ;\n                var ya = xa.splice(wa, 1)[0], za = xa.join(\" \"), ab = ((wa === 0) ? ua : ((va - ya.length) - 1));\n                if (za) {\n                    ra.text = za;\n                    za = ca(za);\n                }\n                 else this._removeToken(ra.uid);\n            ;\n                var bb = ((oa.substring(0, ua) + za) + oa.substring(va));\n                o.setValue(this._input, bb);\n                p.set(this._input, ab);\n                this._update();\n                event.kill();\n                break;\n            };\n        },\n        _offsetIsInsideMention: function(ja) {\n            for (var ka = 0; (ka < this._offsets.length); ka++) {\n                if (((ja > this._offsets[ka][0]) && (ja <= this._offsets[ka][1]))) {\n                    return true\n                };\n            };\n            return false;\n        },\n        _filterResults: function(ja) {\n            if ((this._filterData === null)) {\n                var ka = p.get(this._input).start;\n                if (this._offsetIsInsideMention(ka)) {\n                    this._filterData = {\n                        caretIsInsideMention: true\n                    };\n                    return false;\n                }\n            ;\n                var la = this._typeahead.getCore();\n                this._filterData = {\n                    value: la.getValue(),\n                    rawValue: la.getRawValue()\n                };\n            }\n        ;\n            if (this._filterData.caretIsInsideMention) {\n                return false\n            };\n            if (r.mainMatcher.test(this._filterData.rawValue)) {\n                return true\n            };\n            if ((ja.type != \"user\")) {\n                return false\n            };\n            if (ja.disable_autosuggest) {\n                return false\n            };\n            if (r.userMatcher.test(this._filterData.value)) {\n                return true\n            };\n            return u.isExactMatch(this._filterData.value, this._typeahead.getData().getTextToIndex(ja));\n        },\n        _addToken: function(ja) {\n            var ka = ja.uid;\n            if (!this._mentioned.hasOwnProperty(ka)) {\n                this._mentioned[ka] = ja;\n                this._orderedUIDs.push(ka);\n                this._numMentioned++;\n                this._updateTypeahead();\n            }\n        ;\n        },\n        _removeToken: function(ja) {\n            if (this._mentioned.hasOwnProperty(ja)) {\n                delete this._mentioned[ja];\n                y(this._orderedUIDs, ja);\n                this._numMentioned--;\n                this._updateTypeahead();\n            }\n        ;\n        },\n        _update: function() {\n            var ja = this._getMarkedValue();\n            if ((ja == this._value)) {\n                return\n            };\n            this._value = ja;\n            this._updateMentions();\n            this._updateDirection.bind(this).defer();\n            this.updateValue();\n        },\n        _updateMentions: function() {\n            this._offsets = [];\n            var ja = this._getMarkedValue(), ka = ja;\n            for (var la = 0; (la < this._orderedUIDs.length); ++la) {\n                var ma = this._orderedUIDs[la], na = ca(this._mentioned[ma].text), oa = ka.indexOf(na);\n                if ((oa == -1)) {\n                    this._removeToken(ma);\n                };\n                ka = ga(ka, na);\n                this._offsets.push([oa,(oa + na.length),]);\n            };\n            var pa = ja;\n            while (((oa = ka.indexOf(aa)) > -1)) {\n                pa = ha(pa, oa);\n                ka = ha(ka, oa);\n            };\n            if ((ja !== pa)) {\n                var qa = p.get(this._input);\n                o.setValue(this._input, pa);\n                p.set(this._input, qa.start);\n                this._value = pa;\n            }\n        ;\n        },\n        _renderHashtags: function(ja) {\n            if (!this._hasHashtags) {\n                return x(ja)\n            };\n            if (!this._hashtagParser) {\n                if (r.hashtagTrigger.exec(ja)) {\n                    this.bootloadHashtagParser();\n                };\n                if (!this._hashtagParser) {\n                    return x(ja)\n                };\n            }\n        ;\n            this._hashtags = this._hashtagParser.parse(ja);\n            var ka = [], la = 0;\n            for (var ma = 0; (ma < this._hashtags.length); ma++) {\n                var na = this._hashtags[ma];\n                ka.push(x(ja.substring(la, na.rawOffset)), \"\\u003Cb\\u003E\", na.marker, na.tag, \"\\u003C/b\\u003E\");\n                la = ((na.rawOffset + na.marker.length) + na.tag.length);\n            };\n            ka.push(x(ja.substring(la)));\n            return ka.join(\"\");\n        },\n        updateValue: function() {\n            var ja = this._value = this._getMarkedValue(), ka = this._orderedUIDs, la = ja.replace(ea, da);\n            for (var ma = 0; (ma < ka.length); ++ma) {\n                var na = ((\"@[\" + ka[ma]) + \":]\"), oa = ca(this._mentioned[ka[ma]].text);\n                la = la.replace(oa, na);\n                ja = ja.replace(oa, na);\n            };\n            var pa = this._renderHashtags(ja);\n            for (var ma = 0; (ma < ka.length); ++ma) {\n                var qa = ka[ma], ra = this._mentioned[qa], sa = ra.text, ta = (ra.weakreference ? \"\\u003Cb class=\\\"weak\\\"\\u003E\" : \"\\u003Cb\\u003E\");\n                pa = pa.replace(((\"@[\" + qa) + \":]\"), ((ta + x(ca(sa))) + \"\\u003C/b\\u003E\"));\n                sa = sa.replace(fa, function(ua) {\n                    return (\"\\\\\" + ua);\n                });\n                la = la.replace(((\"@[\" + qa) + \":]\"), ((((\"@[\" + qa) + \":\") + sa) + \"]\"));\n            };\n            if (v.ie()) {\n                pa = pa.replace(/ /g, \"&nbsp;\\u003Cwbr/\\u003E\");\n            };\n            l.setContent(this._highlighterContent, n(pa));\n            this._hiddenInput.value = la;\n            this._updateHighlighter();\n            this._updateHeight();\n        },\n        _updateDirection: function() {\n            var ja = t.get(this._input, \"direction\");\n            if ((ja == this._dir)) {\n                return\n            };\n            this._dir = ja;\n            t.set(this._highlighter, \"direction\", ja);\n            if ((ja == \"rtl\")) {\n                t.set(this._highlighter, \"text-align\", \"right\");\n            }\n             else t.set(this._highlighter, \"text-align\", \"left\");\n        ;\n        },\n        _updateWidth: function() {\n            var ja = t.getFloat.curry(this._input), ka = ((((this._input.offsetWidth - ja(\"paddingLeft\")) - ja(\"paddingRight\")) - ja(\"borderLeftWidth\")) - ja(\"borderRightWidth\"));\n            if (v.firefox()) {\n                ka -= 2;\n            };\n            if ((v.ie() <= 7)) {\n                ka -= t.getFloat(this._highlighterInner, \"paddingLeft\");\n                this._highlighter.style.zoom = 1;\n            }\n        ;\n            this._highlighterInner.style.width = (Math.max(ka, 0) + \"px\");\n        },\n        _updateHeight: function() {\n            if (this._highlighterAuxContent) {\n                var ja = this._highlighter.offsetHeight, ka = this._typeahead.getElement();\n                if ((ja > ka.offsetHeight)) {\n                    t.set(ka, \"height\", (ja + \"px\"));\n                    g.inform(\"reflow\");\n                }\n            ;\n            }\n        ;\n        },\n        _updateTypeahead: function() {\n            var ja = this._typeahead.getCore(), ka = null;\n            if ((!this._maxMentions || (this._numMentioned < this._maxMentions))) {\n                ka = r.autoMatcher;\n            };\n            ja.matcher = ka;\n            ja.setExclusions(this._orderedUIDs);\n            this.inform(\"update\", {\n                mentioned: this._mentioned\n            });\n        },\n        setPlaceholder: function(ja) {\n            this._placeholder = ja;\n            if (!this.hasAuxContent()) {\n                o.setPlaceholder(this._input, ja);\n            };\n        },\n        _updateHighlighter: function() {\n            if (this._highlighterContent) {\n                j.conditionShow(this._highlighterContent, (((this._numMentioned > 0) || this.hasAuxContent()) || this._hashtags.length));\n            };\n        },\n        setAuxContent: function(ja) {\n            if (this._highlighterContent) {\n                if (!this._highlighterAuxContent) {\n                    this._highlighterAuxContent = l.create(\"span\", {\n                        className: \"highlighterAuxContent\"\n                    });\n                    l.insertAfter(this._highlighterContent, this._highlighterAuxContent);\n                }\n            ;\n                l.setContent(this._highlighterAuxContent, ja);\n                if (ja) {\n                    o.setPlaceholder(this._input, \"\");\n                }\n                 else o.setPlaceholder(this._input, this._placeholder);\n            ;\n                this._updateHighlighter();\n                this._updateHeight();\n            }\n        ;\n        },\n        hasAuxContent: function() {\n            var ja = this.getAuxContentRoot();\n            return (ja && (ja.innerHTML.length > 0));\n        },\n        getAuxContentRoot: function() {\n            return this._highlighterAuxContent;\n        },\n        addMention: function(ja) {\n            var ka = this._getMarkedValue();\n            if ((ka !== \"\")) {\n                ka += \" \";\n            };\n            o.setValue(this._input, ((ka + ca(ja.text)) + \" \"));\n            this._addToken(ja);\n            this._update();\n        },\n        getMentions: function() {\n            return this._mentioned;\n        },\n        bootloadHashtagParser: function() {\n            if (!this._hashtagParser) {\n                i.loadModules([\"HashtagParser\",], function(ja) {\n                    this._hashtagParser = ja;\n                    if (this._initialized) {\n                        this._update();\n                    };\n                }.bind(this));\n            };\n        }\n    });\n    e.exports = ia;\n});\n__d(\"MentionsTypeaheadAreaView\", [\"Class\",\"ContextualTypeaheadView\",\"Parent\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Class\"), h = b(\"ContextualTypeaheadView\"), i = b(\"Parent\"), j = b(\"copyProperties\");\n    function k(l, m) {\n        this.parent.construct(this, l, m);\n    };\n    g.extend(k, h);\n    j(k.prototype, {\n        getContext: function() {\n            return i.byClass(this.element, \"uiMentionsInput\");\n        }\n    });\n    e.exports = k;\n});\n__d(\"legacy:MentionsInput\", [\"MentionsInput\",], function(a, b, c, d) {\n    a.MentionsInput = b(\"MentionsInput\");\n}, 3);\n__d(\"legacy:ui-side-nav-future-js\", [\"FutureSideNav\",], function(a, b, c, d) {\n    a.FutureSideNav = b(\"FutureSideNav\");\n}, 3);\n__d(\"HoverFlyout\", [\"Arbiter\",\"ArbiterMixin\",\"DataStore\",\"Event\",\"Keys\",\"arrayContains\",\"copyProperties\",\"removeFromArray\",\"shield\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ArbiterMixin\"), i = b(\"DataStore\"), j = b(\"Event\"), k = b(\"Keys\"), l = b(\"arrayContains\"), m = b(\"copyProperties\"), n = b(\"removeFromArray\"), o = b(\"shield\");\n    function p(q, r, s, t) {\n        if (q) {\n            this._showDelay = s;\n            this._hideDelay = t;\n            this.init(q);\n            if (r) {\n                this.initNode(r);\n            };\n        }\n    ;\n        g.subscribe(\"SwapButtonDEPRECATED/focusOnJoinButton\", o(this.hideFlyout, this), g.SUBSCRIBE_ALL);\n    };\n    m(p.prototype, h, {\n        init: function(q) {\n            this._flyout = q;\n            this._showDelay = (this._showDelay || 0);\n            this._hideDelay = (this._hideDelay || 100);\n            this._showTimeout = null;\n            this._hideTimeout = null;\n            this._flyoutSubscriptions = [this._flyout.subscribe(\"mouseenter\", this._onFlyoutMouseEnter.bind(this)),this._flyout.subscribe(\"mouseleave\", o(this.hideFlyout, this)),];\n            this._nodes = [];\n            this._dataStoreUnique = ((\"HoverFlyout_\" + Date.now()) + \"_listeners\");\n            return this;\n        },\n        initNode: function(q) {\n            if (l(this._nodes, q)) {\n                return this\n            };\n            this._nodes.push(q);\n            i.set(q, this._dataStoreUnique, [j.listen(q, \"mouseenter\", this._onNodeMouseEnter.bind(this, q)),j.listen(q, \"mouseleave\", o(this.hideFlyout, this)),j.listen(q, \"click\", this._onNodeMouseEnter.bind(this, q)),j.listen(q, \"keydown\", this._onNodeKeyEscape.bind(this)),]);\n            return this;\n        },\n        deactivateNode: function(q) {\n            var r = i.get(q, this._dataStoreUnique);\n            if (r) {\n                while (r.length) {\n                    r.pop().remove();;\n                }\n            };\n            n(this._nodes, q);\n        },\n        setShowDelay: function(q) {\n            this._showDelay = q;\n            return this;\n        },\n        setHideDelay: function(q) {\n            this._hideDelay = q;\n            return this;\n        },\n        showFlyout: function(q, r) {\n            this.setActiveNode(q);\n            if (r) {\n                this._flyout.setContext(q).show();\n                this.inform(\"show\", q);\n            }\n             else this._showTimeout = this.showFlyout.bind(this, q, true).defer(this._showDelay);\n        ;\n            return this;\n        },\n        hideFlyout: function(q) {\n            clearTimeout(this._showTimeout);\n            if (q) {\n                this._flyout.hide();\n                (this._activeNode && this.inform(\"hide\", this._activeNode));\n                this._activeNode = null;\n            }\n             else this._hideTimeout = this.hideFlyout.bind(this, true).defer(this._hideDelay);\n        ;\n        },\n        hideFlyoutDelayed: function(q) {\n            clearTimeout(this._showTimeout);\n            clearTimeout(this._hideTimeout);\n            this._hideTimeout = this.hideFlyout.bind(this, true).defer(q);\n        },\n        getActiveNode: function() {\n            return this._activeNode;\n        },\n        setActiveNode: function(q) {\n            clearTimeout(this._hideTimeout);\n            if ((this._activeNode && (this._activeNode !== q))) {\n                this.hideFlyout(true);\n            };\n            this._activeNode = q;\n            return this;\n        },\n        clearNodes: function() {\n            for (var q = this._nodes.length; (q > 0); q--) {\n                this.deactivateNode(this._nodes[(q - 1)]);;\n            };\n        },\n        destroy: function() {\n            while (this._flyoutSubscriptions.length) {\n                this._flyout.unsubscribe(this._flyoutSubscriptions.pop());;\n            };\n            this.clearNodes();\n        },\n        _onNodeMouseEnter: function(q) {\n            if ((this._activeNode === q)) {\n                clearTimeout(this._hideTimeout);\n            }\n             else this.showFlyout(q);\n        ;\n        },\n        _onFlyoutMouseEnter: function() {\n            clearTimeout(this._hideTimeout);\n        },\n        _onNodeKeyEscape: function(event) {\n            if ((j.getKeyCode(event) === k.ESC)) {\n                (this._activeNode && this.inform(\"hide\", this._activeNode));\n                this._activeNode = null;\n            }\n        ;\n        }\n    });\n    e.exports = (a.HoverFlyout || p);\n});\n__d(\"TypeaheadAreaCore\", [\"Class\",\"InputSelection\",\"TypeaheadCore\",\"copyProperties\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"Class\"), h = b(\"InputSelection\"), i = b(\"TypeaheadCore\"), j = b(\"copyProperties\"), k = b(\"emptyFunction\");\n    function l(m) {\n        this.parent.construct(this, m);\n        this.matcher = new RegExp((this.matcher + \"$\"));\n        this.preventFocusChangeOnTab = true;\n    };\n    g.extend(l, i);\n    j(l.prototype, {\n        prefix: \"\",\n        suffix: \", \",\n        matcher: \"\\\\b[^,]*\",\n        click: k,\n        select: function(m) {\n            this.parent.select(m);\n            var n = this.element.value, o = ((this.prefix + m.text) + this.suffix);\n            this.expandBounds(n, o);\n            var p = n.substring(0, this.start), q = n.substring(this.end);\n            this.element.value = ((p + o) + q);\n            h.set(this.element, (p.length + o.length));\n        },\n        expandBounds: function(m, n) {\n            m = m.toLowerCase();\n            n = n.toLowerCase();\n            var o, p, q, r, s = /\\s/;\n            p = m.substring(this.start, this.end);\n            q = n.indexOf(p);\n            o = this.start;\n            while (((o >= 0) && (q >= 0))) {\n                r = m.charAt((o - 1));\n                if ((!r || s.test(r))) {\n                    this.start = o;\n                };\n                p = (r + p);\n                q = n.indexOf(p);\n                o--;\n            };\n            p = m.substring(this.start, this.end);\n            q = n.indexOf(p);\n            o = this.end;\n            while (((o <= m.length) && (q >= 0))) {\n                r = m.charAt(o);\n                if ((!r || s.test(r))) {\n                    this.end = o;\n                };\n                p = (p + r);\n                q = n.indexOf(p);\n                o++;\n            };\n        },\n        getRawValue: function() {\n            var m = (h.get(this.element).start || 0);\n            return this.parent.getValue().substring(0, m);\n        },\n        getValue: function() {\n            var m = (this.matcher && this.matcher.exec(this.getRawValue()));\n            if (!m) {\n                return \"\"\n            };\n            var n = m[0], o = (m.index + n.length);\n            n = n.replace(/^\\s/, \"\");\n            var p = n.length;\n            n = n.replace(/\\s$/, \"\");\n            var q = (p - n.length);\n            this.start = (o - p);\n            this.end = (o + q);\n            return ((m[2] || m[1]) || m[0]);\n        }\n    });\n    e.exports = l;\n});\n__d(\"TypeaheadMetrics\", [\"Event\",\"AsyncRequest\",\"copyProperties\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"AsyncRequest\"), i = b(\"copyProperties\"), j = b(\"emptyFunction\");\n    function k(l) {\n        this.extraData = {\n        };\n        i(this, l);\n    };\n    i(k.prototype, {\n        endPoint: \"/ajax/typeahead/record_basic_metrics.php\",\n        init: function(l) {\n            this.init = j;\n            this.core = l.getCore();\n            this.view = l.getView();\n            this.data = l.getData();\n            this.stats = {\n            };\n            this.sessionActive = false;\n            this._sessionStartEvents = [];\n            this._sessionEndEvents = [];\n            this._reset();\n            this.initEvents();\n        },\n        _reset: function() {\n            this.stats = {\n            };\n            this.avgStats = {\n            };\n            this.sessionActive = false;\n            this.results = null;\n            this.sid = Math.floor((Date.now() * Math.random()));\n            this.data.setQueryData({\n                sid: this.sid\n            });\n        },\n        recordSelect: function(l) {\n            var m = l.selected;\n            if ((m.uid == null)) {\n                this.recordStat(\"selected_id\", \"SELECT_NULL\");\n            }\n             else this.recordStat(\"selected_id\", m.uid);\n        ;\n            this.recordStat(\"selected_type\", m.type);\n            this.recordStat(\"selected_position\", l.index);\n            this.recordStat(\"selected_with_mouse\", (l.clicked ? 1 : 0));\n            this.recordStat(\"selected_query\", l.query);\n            this._sessionEnd();\n        },\n        bindSessionStart: function(l, event, m) {\n            if (m) {\n                for (var n = 0; (n < this._sessionStartEvents.length); ++n) {\n                    var o = this._sessionStartEvents[n];\n                    o.obj.unsubscribe(o.token);\n                }\n            };\n            this._sessionStartEvents.push({\n                obj: l,\n                token: l.subscribe(event, function(p, q) {\n                    this._sessionStart();\n                }.bind(this))\n            });\n        },\n        bindSessionEnd: function(l, event, m) {\n            if (m) {\n                for (var n = 0; (n < this._sessionEndEvents.length); ++n) {\n                    var o = this._sessionEndEvents[n];\n                    o.obj.unsubscribe(o.token);\n                }\n            };\n            this._sessionEndEvents.push({\n                obj: l,\n                token: l.subscribe(event, function(p, q) {\n                    this._sessionEnd();\n                }.bind(this))\n            });\n        },\n        initEvents: function() {\n            this.bindSessionStart(this.core, \"focus\", false);\n            this.bindSessionEnd(this.core, \"blur\", false);\n            this.view.subscribe(\"select\", function(l, m) {\n                this.recordSelect(m);\n            }.bind(this));\n            this.bindSessionEnd(this.view, \"select\", false);\n            this.view.subscribe(\"render\", function(l, m) {\n                this.results = m;\n            }.bind(this));\n            this.data.subscribe(\"beforeQuery\", function(l, m) {\n                if (!m.value) {\n                    return\n                };\n                this.query = m.value;\n                this.recordCountStat(\"num_queries\");\n            }.bind(this));\n            this.data.subscribe(\"beforeFetch\", function(l, m) {\n                if (m.fetch_context.bootstrap) {\n                    this.bootstrapBegin = Date.now();\n                }\n                 else m.fetch_context.queryBegin = Date.now();\n            ;\n            }.bind(this));\n            this.data.subscribe(\"fetchComplete\", function(l, m) {\n                if (m.fetch_context.bootstrap) {\n                    this.recordAvgStat(\"bootstrap_latency\", (Date.now() - this.bootstrapBegin));\n                    var n = {\n                    };\n                    m.response.payload.entries.forEach(function(o) {\n                        if (!n[o.type]) {\n                            n[o.type] = 1;\n                        }\n                         else n[o.type]++;\n                    ;\n                    });\n                    this.recordStat(\"bootstrap_response_types\", n);\n                    this.bootstrapped = true;\n                }\n                 else {\n                    if ((\"filtered_count\" in m.response.payload)) {\n                        this.recordStat(\"filtered_count\", m.response.payload.filtered_count);\n                    };\n                    this.recordAvgStat(\"avg_query_latency\", (Date.now() - m.fetch_context.queryBegin));\n                }\n            ;\n            }.bind(this));\n            this.data.subscribe(\"dirty\", function(l, m) {\n                this.bootstrapped = false;\n            });\n        },\n        _sessionStart: function() {\n            if (this.sessionActive) {\n                return\n            };\n            this.sessionActive = true;\n        },\n        _sessionEnd: function() {\n            if (!this.sessionActive) {\n                return\n            };\n            this.sessionActive = false;\n            this.submit();\n            this._reset();\n        },\n        recordStat: function(l, m) {\n            this.stats[l] = m;\n        },\n        recordCountStat: function(l) {\n            var m = this.stats[l];\n            this.stats[l] = (m ? (m + 1) : 1);\n        },\n        recordAvgStat: function(l, m) {\n            if (this.avgStats[l]) {\n                this.avgStats[l][0] += m;\n                ++this.avgStats[l][1];\n            }\n             else this.avgStats[l] = [m,1,];\n        ;\n        },\n        submit: function() {\n            if (Object.keys(this.stats).length) {\n                i(this.stats, this.extraData);\n                if (this.results) {\n                    var l = (this.results).map(function(o, p) {\n                        return o.uid;\n                    });\n                    this.recordStat(\"candidate_results\", JSON.stringify(l));\n                }\n            ;\n                if (this.query) {\n                    this.recordStat(\"query\", this.query);\n                };\n                if (this.sid) {\n                    this.recordStat(\"sid\", this.sid);\n                };\n                if (this.bootstrapped) {\n                    this.recordStat(\"bootstrapped\", 1);\n                };\n                for (var m in this.avgStats) {\n                    var n = this.avgStats[m];\n                    this.stats[m] = (n[0] / n[1]);\n                };\n                new h().setURI(this.endPoint).setMethod(\"POST\").setData({\n                    stats: this.stats\n                }).send();\n                this._reset();\n            }\n        ;\n        }\n    });\n    k.register = function(l, m, n) {\n        if ((document.activeElement === l)) {\n            m.init(n);\n        }\n         else var o = g.listen(l, \"focus\", function() {\n            m.init(n);\n            o.remove();\n        })\n    ;\n    };\n    e.exports = k;\n});\n__d(\"TypeaheadHoistFriends\", [\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"copyProperties\");\n    function h(i) {\n        this._typeahead = i;\n    };\n    g(h.prototype, {\n        _subscription: null,\n        enable: function() {\n            var i = this._typeahead.getView();\n            this._subscription = i.subscribe(\"beforeRender\", function(j, k) {\n                var l = [], m = [], n = [];\n                for (var o = 0; (o < k.results.length); ++o) {\n                    var p = k.results[o];\n                    if ((p.type == \"header\")) {\n                        n = n.concat(m, l);\n                        n.push(p);\n                        m = [];\n                        l = [];\n                    }\n                     else if (((p.type == \"user\") && p.bootstrapped)) {\n                        m.push(p);\n                    }\n                     else l.push(p);\n                    \n                ;\n                };\n                k.results = n.concat(m, l);\n            });\n        },\n        disable: function() {\n            this._typeahead.getView().unsubscribe(this._subscription);\n            this._subscription = null;\n        }\n    });\n    e.exports = h;\n});\n__d(\"legacy:HoistFriendsTypeaheadBehavior\", [\"TypeaheadHoistFriends\",], function(a, b, c, d) {\n    var e = b(\"TypeaheadHoistFriends\");\n    if (!a.TypeaheadBehaviors) {\n        a.TypeaheadBehaviors = {\n        };\n    };\n    a.TypeaheadBehaviors.hoistFriends = function(f) {\n        f.enableBehavior(e);\n    };\n}, 3);\n__d(\"escapeRegex\", [], function(a, b, c, d, e, f) {\n    function g(h) {\n        return h.replace(/([.?*+\\^$\\[\\]\\\\(){}|\\-])/g, \"\\\\$1\");\n    };\n    e.exports = g;\n});\n__d(\"mixin\", [], function(a, b, c, d, e, f) {\n    function g(h, i, j, k, l, m, n, o, p, q, r) {\n        var s = function() {\n        \n        }, t = [h,i,j,k,l,m,n,o,p,q,], u = 0, v;\n        while (t[u]) {\n            v = t[u];\n            for (var w in v) {\n                if (v.hasOwnProperty(w)) {\n                    s.prototype[w] = v[w];\n                };\n            };\n            u += 1;\n        };\n        return s;\n    };\n    e.exports = g;\n});");
// 11601
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o7,"s51fddd875afc7457603cdcb3c6030e2a05d380c3");
// 11644
o50.style = o202;
// undefined
o50 = null;
// undefined
o202 = null;
// 11602
geval("if (JSBNG__self.CavalryLogger) {\n    CavalryLogger.start_js([\"bUzfU\",]);\n}\n;\n;\n__d(\"TrackingPixel\", [\"Arbiter\",\"ControlledReferer\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ControlledReferer\"), i = {\n        _iframe: undefined,\n        loadWithNoReferrer: function(j) {\n            if (!i._iframe) {\n                var k = JSBNG__document.createElement(\"div\");\n                k.frameborder = 0;\n                k.width = k.height = 1;\n                k.style.position = \"absolute\";\n                k.style.JSBNG__top = \"-10px\";\n                h.useFacebookReferer(k, function() {\n                    g.inform(\"TrackingPixel/iframeIsLoaded\", null, g.BEHAVIOR_PERSISTENT);\n                }, null);\n                JSBNG__document.body.appendChild(k);\n                i._iframe = k;\n            }\n        ;\n        ;\n            g.subscribe(\"TrackingPixel/iframeIsLoaded\", function() {\n                var l = i._iframe.contentWindow.JSBNG__document, m = l.createElement(\"img\");\n                m.src = j;\n            });\n        }\n    };\n    e.exports = i;\n});\n__d(\"ExternalTrackingTag\", [\"AsyncSignal\",\"TrackingPixel\",\"JSBNG__Event\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncSignal\"), h = b(\"TrackingPixel\"), i = b(\"JSBNG__Event\"), j = {\n        listenForElementClick: function(k, l, m, n) {\n            i.listen(k, \"click\", function() {\n                j.sendRequest(l, m, n);\n            });\n        },\n        sendRequest: function(k, l, m) {\n            if (!k) {\n                return;\n            }\n        ;\n        ;\n            new g(\"/ads/external_tracking_tag/\", {\n                href: k,\n                tracking_tag_id: l,\n                adgroup_id: m\n            }).send();\n            h.loadWithNoReferrer(k);\n        }\n    };\n    e.exports = j;\n});\n__d(\"ad-logging\", [\"Arbiter\",\"AsyncRequest\",\"Banzai\",\"collectDataAttributes\",\"Parent\",\"TrackingNodes\",\"ExternalTrackingTag\",], function(a, b, c, d, e, f) {\n    var g = \"ssinfeed\", h = b(\"Arbiter\"), i = b(\"AsyncRequest\"), j = b(\"Banzai\"), k = b(\"collectDataAttributes\"), l = b(\"Parent\"), m = b(\"TrackingNodes\"), n = b(\"ExternalTrackingTag\"), o = {\n    };\n    function p(s) {\n        return ((((((((s.getAttribute && ((s.getAttribute(\"ajaxify\") || s.getAttribute(\"data-endpoint\"))))) || s.action)) || s.href)) || s.JSBNG__name));\n    };\n;\n    function q(s) {\n        var t = ((s.ei || s.ai));\n        if (((!t && s.mei))) {\n            t = s.mf_story_key;\n        }\n    ;\n    ;\n        if (((((s !== null)) && ((typeof (t) === \"string\"))))) {\n            var u = false;\n            if (s.tn) {\n                var v = m.parseTrackingNodeString(s.tn);\n                for (var w = 0; ((w < v.length)); w++) {\n                    var x = v[w][0];\n                    switch (x) {\n                      case m.types.LIKE_LINK:\n                    \n                      case m.types.UNLIKE_LINK:\n                    \n                      case m.types.COMMENT:\n                    \n                      case m.types.ADD_COMMENT_BOX:\n                        return;\n                      case m.types.XBUTTON:\n                    \n                      case m.types.HIDE_LINK:\n                    \n                      case m.types.REPORT_SPAM_LINK:\n                    \n                      case m.types.HIDE_ALL_LINK:\n                    \n                      case m.types.DROPDOWN_BUTTON:\n                    \n                      case m.types.UNHIDE_LINK:\n                        return;\n                      case m.types.ATTACHMENT:\n                    \n                      case m.types.USER_MESSAGE:\n                        u = true;\n                        break;\n                    };\n                ;\n                };\n            ;\n            }\n        ;\n        ;\n            var y = JSBNG__Date.now(), z = 500;\n            s.duplicate_click = ((!!o[t] && ((((y - o[t])) < z))));\n            o[t] = y;\n            if (j.isEnabled(\"ssinfeed\")) {\n                j.post(g, s, {\n                    delay: 0,\n                    retry: j.isEnabled(\"ssinfeed_retry\")\n                });\n            }\n             else {\n                var aa = new i(\"/ajax/ssinfeed/end/\").setData(s).setAllowCrossPageTransition(true).setMethod(\"POST\");\n                aa.send();\n            }\n        ;\n        ;\n            if (((((u && s.external_tracking_tag)) && !s.duplicate_click))) {\n                n.sendRequest(s.external_tracking_tag.url, s.external_tracking_tag.tag_id, s.external_tracking_tag.adgroup_id);\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n    };\n;\n    function r(s, t) {\n        if (!t.node) {\n            return;\n        }\n    ;\n    ;\n        var u = p(t.node), v = ((l.byTag(t.node, \"input\") || l.byTag(t.node, \"button\")));\n        if (((((((((!u && v)) && ((v.type == \"submit\")))) && v.getAttribute)) && v.getAttribute(\"data-ft\")))) {\n            u = \"#\";\n        }\n    ;\n    ;\n        var w;\n        if (((((u && t.JSBNG__event)) && ((((t.JSBNG__event.type === \"click\")) || ((t.JSBNG__event.type === \"contextmenu\"))))))) {\n            w = k(t.node, [\"ft\",]);\n            w.ft.href = u;\n            w.ft.mouse_type = t.JSBNG__event.type;\n            q(w.ft);\n        }\n    ;\n    ;\n    };\n;\n    h.subscribe(\"ClickRefAction/new\", r);\n});\n__d(\"PopoverMenu.react\", [\"CSS\",\"InlineBlock.react\",\"Popover\",\"PopoverMenu\",\"React\",\"ReactProps\",\"SubscriptionsHandler\",\"cx\",\"joinClasses\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSS\"), h = b(\"InlineBlock.react\"), i = b(\"Popover\"), j = b(\"PopoverMenu\"), k = b(\"React\"), l = b(\"ReactProps\"), m = b(\"SubscriptionsHandler\"), n = b(\"cx\"), o = b(\"joinClasses\");\n    function p(r, s) {\n        var t, u;\n        {\n            var fin191keys = ((window.top.JSBNG_Replay.forInKeys)((r))), fin191i = (0);\n            var v;\n            for (; (fin191i < fin191keys.length); (fin191i++)) {\n                ((v) = (fin191keys[fin191i]));\n                {\n                    t = r[v];\n                    u = s[v];\n                    if (((((typeof t === \"object\")) && ((typeof u === \"object\"))))) {\n                        if (!p(t, u)) {\n                            return false;\n                        }\n                    ;\n                    ;\n                    }\n                     else if (((t !== u))) {\n                        return false;\n                    }\n                    \n                ;\n                ;\n                };\n            };\n        };\n    ;\n        return true;\n    };\n;\n    var q = k.createClass({\n        displayName: \"ReactPopoverMenu\",\n        props: {\n            alignh: l.oneOf([\"left\",\"center\",\"right\",]),\n            layerBehaviors: l.array,\n            menu: l.object,\n            disabled: l.bool\n        },\n        _menuSubscriptions: null,\n        componentDidMount: function() {\n            var r = this.refs.root.getDOMNode(), s = r.firstChild;\n            g.addClass(s, \"_p\");\n            this._popover = new i(r, s, this.props.layerBehaviors, {\n                alignh: this.props.alignh,\n                disabled: this.props.disabled\n            });\n            this._popoverMenu = new j(this._popover, s, this._createMenu(this.props.menu), this.props.behaviors);\n        },\n        componentDidUpdate: function(r) {\n            if (!p(r.menu, this.props.menu)) {\n                if (this._menuSubscriptions) {\n                    this._menuSubscriptions.release();\n                    this._menuSubscriptions = null;\n                }\n            ;\n            ;\n                this._popoverMenu.setMenu(this._createMenu(this.props.menu));\n            }\n        ;\n        ;\n            if (((this.props.alignh !== r.alignh))) {\n                this._popoverMenu.getPopover().getLayer().setAlignment(this.props.alignh);\n            }\n        ;\n        ;\n            if (((this.props.disabled !== r.disabled))) {\n                if (this.props.disabled) {\n                    this._popoverMenu.disable();\n                }\n                 else this._popoverMenu.enable();\n            ;\n            }\n        ;\n        ;\n        },\n        getFirstChild: function() {\n            var r = this.props.children;\n            return ((Array.isArray(r) ? r[0] : r));\n        },\n        getButtonSize: function() {\n            var r = this.getFirstChild();\n            return ((r && r.getButtonSize()));\n        },\n        render: function() {\n            var r = this.getFirstChild();\n            r.props.className = o(((r.props.className || \"\")), \"_p\");\n            return this.transferPropsTo(h({\n                alignv: \"middle\",\n                className: \"uiPopover\",\n                ref: \"root\",\n                disabled: null\n            }, this.props.children));\n        },\n        componentWillUnmount: function() {\n            if (this._menuSubscriptions) {\n                this._menuSubscriptions.release();\n                this._menuSubscriptions = null;\n            }\n        ;\n        ;\n        },\n        _createMenu: function(r) {\n            var s = new r.ctor(r.menuitems, r.config);\n            this._menuSubscriptions = new m();\n            if (r.onItemClick) {\n                this._menuSubscriptions.addSubscriptions(s.subscribe(\"itemclick\", r.onItemClick));\n            }\n        ;\n        ;\n            if (r.onChange) {\n                this._menuSubscriptions.addSubscriptions(s.subscribe(\"change\", r.onChange));\n            }\n        ;\n        ;\n            if (this.props.onShow) {\n                this._menuSubscriptions.addSubscriptions(this._popover.subscribe(\"show\", this.props.onShow));\n            }\n        ;\n        ;\n            if (this.props.onHide) {\n                this._menuSubscriptions.addSubscriptions(this._popover.subscribe(\"hide\", this.props.onHide));\n            }\n        ;\n        ;\n            return s;\n        }\n    });\n    e.exports = q;\n});\n__d(\"ReactMenu\", [\"Menu\",\"MenuItem\",\"MenuSelectableItem\",\"MenuTheme\",\"SelectableMenu\",\"cx\",\"flattenArray\",\"merge\",], function(a, b, c, d, e, f) {\n    var g = b(\"Menu\"), h = b(\"MenuItem\"), i = b(\"MenuSelectableItem\"), j = b(\"MenuTheme\"), k = b(\"SelectableMenu\"), l = b(\"cx\"), m = b(\"flattenArray\"), n = b(\"merge\"), o = Array.prototype.slice;\n    function p(q, r) {\n        if (!Array.isArray(r)) {\n            r = o.call(arguments, 1);\n        }\n    ;\n    ;\n        var s = {\n            ctor: g,\n            menuitems: m(((r || []))),\n            config: {\n                theme: j,\n                maxheight: ((q ? q.maxheight : null))\n            }\n        };\n        return n(s, q);\n    };\n;\n    p.SelectableMenu = function(q, r) {\n        if (!Array.isArray(r)) {\n            r = o.call(arguments, 1);\n        }\n    ;\n    ;\n        var s = {\n            ctor: k,\n            menuitems: m(r),\n            config: {\n                className: \"_57di\",\n                theme: j,\n                multiple: ((q && q.multiple)),\n                maxheight: ((q ? q.maxheight : null))\n            }\n        };\n        return n(s, q);\n    };\n    p.Item = function(q, r) {\n        if (!Array.isArray(r)) {\n            r = o.call(arguments, 1);\n        }\n    ;\n    ;\n        var s = {\n            ctor: h,\n            reactChildren: r\n        };\n        return n(s, q);\n    };\n    p.SelectableItem = function(q, r) {\n        if (!Array.isArray(r)) {\n            r = o.call(arguments, 1);\n        }\n    ;\n    ;\n        var s = {\n            ctor: i,\n            reactChildren: r\n        };\n        return n(s, q);\n    };\n    e.exports = p;\n});\n__d(\"UFIOrderingModeSelector.react\", [\"InlineBlock.react\",\"Link.react\",\"LoadingIndicator.react\",\"React\",\"JSBNG__Image.react\",\"ReactMenu\",\"PopoverMenu.react\",\"cx\",\"ix\",], function(a, b, c, d, e, f) {\n    var g = b(\"InlineBlock.react\"), h = b(\"Link.react\"), i = b(\"LoadingIndicator.react\"), j = b(\"React\"), k = b(\"JSBNG__Image.react\"), l = b(\"ReactMenu\"), m = b(\"PopoverMenu.react\"), n = b(\"cx\"), o = b(\"ix\"), p = l.SelectableMenu, q = l.SelectableItem, r = j.createClass({\n        displayName: \"UFIOrderingModeSelector\",\n        getInitialState: function() {\n            var s = null;\n            this.props.orderingmodes.map(function(t) {\n                if (t.selected) {\n                    s = t;\n                }\n            ;\n            ;\n            });\n            return {\n                selectedMode: s\n            };\n        },\n        onMenuItemClick: function(s, t) {\n            var u = t.item.getValue();\n            this.props.orderingmodes.map(function(v) {\n                if (((v.value === u))) {\n                    this.setState({\n                        selectedMode: v\n                    });\n                }\n            ;\n            ;\n            }.bind(this));\n            this.props.onOrderChanged(u);\n        },\n        render: function() {\n            var s = null;\n            if (((this.props.currentOrderingMode != this.state.selectedMode.value))) {\n                s = i({\n                    className: \"UFIOrderingModeSelectorLoading\",\n                    color: \"white\",\n                    size: \"small\"\n                });\n            }\n        ;\n        ;\n            var t = p({\n                onItemClick: this.onMenuItemClick\n            }, this.props.orderingmodes.map(function(u) {\n                return (q({\n                    key: u.value,\n                    value: u.value,\n                    selected: ((u.value === this.state.selectedMode.value))\n                }, u.JSBNG__name));\n            }.bind(this)));\n            return (j.DOM.div({\n                className: \"UFIOrderingModeSelector\"\n            }, s, g(null, m({\n                className: \"UFIOrderingModeSelectorPopover\",\n                menu: t,\n                alignh: \"right\"\n            }, h(null, this.state.selectedMode.JSBNG__name, k({\n                className: \"UFIOrderingModeSelectorDownCaret\",\n                src: o(\"/images/ui/xhp/link/more/down_caret.gif\")\n            }))))));\n        }\n    });\n    e.exports = r;\n});\n__d(\"ComposerPublishTrackingStory\", [\"JSBNG__Event\",\"ge\",\"reportData\",\"DOMQuery\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"ge\"), i = b(\"reportData\"), j = b(\"DOMQuery\");\n    f.init = function(k) {\n        g.listen(k, \"submit\", function() {\n            var l = h(\"home_stream\");\n            if (!l) {\n                return;\n            }\n        ;\n        ;\n            var m = j.scry(l, \".uiStreamStory\")[0];\n            if (((m && m.getAttribute(\"data-ft\")))) {\n                var n = JSON.parse(m.getAttribute(\"data-ft\"));\n                if (!((((\"mf_story_key\" in n)) && ((\"qid\" in n))))) {\n                    return;\n                }\n            ;\n            ;\n                var o = {\n                    mf_story_key: n.mf_story_key,\n                    qid: n.qid\n                };\n                i(\"compose\", {\n                    ft: o\n                });\n            }\n        ;\n        ;\n        });\n    };\n});\n__d(\"ComposerXAttachmentBootstrap\", [\"CSS\",\"Form\",\"Parent\",\"URI\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSS\"), h = b(\"Form\"), i = b(\"Parent\"), j = b(\"URI\"), k = b(\"cx\"), l = [], m = {\n        bootstrap: function(n) {\n            m.load(i.byTag(n, \"form\"), n.getAttribute(\"data-endpoint\"));\n        },\n        load: function(n, o, p) {\n            var q = j(o).addQueryData({\n                composerurihash: m.getURIHash(o)\n            });\n            g.conditionClass(n, \"_fu\", p);\n            var r = i.byClass(n, \"_2_4\");\n            g.removeClass(r, \"async_saving\");\n            h.setDisabled(n, false);\n            n.action = q.toString();\n            h.bootstrap(n);\n        },\n        getURIHash: function(n) {\n            if (((n === \"initial\"))) {\n                return \"initial\";\n            }\n        ;\n        ;\n            var o = l.indexOf(n);\n            if (((o !== -1))) {\n                return ((o + \"\"));\n            }\n             else {\n                o = l.length;\n                l[o] = n;\n                return ((o + \"\"));\n            }\n        ;\n        ;\n        }\n    };\n    e.exports = m;\n});\n__d(\"ComposerXStore\", [\"function-extensions\",\"Arbiter\",\"ge\",], function(a, b, c, d, e, f) {\n    b(\"function-extensions\");\n    var g = b(\"Arbiter\"), h = b(\"ge\"), i = {\n    };\n    function j(l, m) {\n        return ((((((\"ComposerX/\" + l)) + \"/\")) + m));\n    };\n;\n    var k = {\n        set: function(l, m, n) {\n            if (!i[l]) {\n                i[l] = {\n                };\n            }\n        ;\n        ;\n            i[l][m] = n;\n            g.inform(j(l, m), {\n            }, g.BEHAVIOR_STATE);\n        },\n        get: function(l, m) {\n            if (i[l]) {\n                return i[l][m];\n            }\n        ;\n        ;\n            return null;\n        },\n        getAllForComposer: function(l) {\n            return ((i[l] || {\n            }));\n        },\n        waitForComponents: function(l, m, n) {\n            g.registerCallback(n, m.map(j.curry(l)));\n        }\n    };\n    g.subscribe(\"page_transition\", function() {\n        {\n            var fin192keys = ((window.top.JSBNG_Replay.forInKeys)((i))), fin192i = (0);\n            var l;\n            for (; (fin192i < fin192keys.length); (fin192i++)) {\n                ((l) = (fin192keys[fin192i]));\n                {\n                    if (!h(l)) {\n                        delete i[l];\n                    }\n                ;\n                ;\n                };\n            };\n        };\n    ;\n    });\n    e.exports = k;\n});\n__d(\"ComposerX\", [\"Arbiter\",\"ComposerXAttachmentBootstrap\",\"ComposerXStore\",\"CSS\",\"DOM\",\"DOMQuery\",\"copyProperties\",\"csx\",\"cx\",\"getObjectValues\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ComposerXAttachmentBootstrap\"), i = b(\"ComposerXStore\"), j = b(\"CSS\"), k = b(\"DOM\"), l = b(\"DOMQuery\"), m = b(\"copyProperties\"), n = b(\"csx\"), o = b(\"cx\"), p = b(\"getObjectValues\"), q = \"any\";\n    function r(s) {\n        this._root = s;\n        this._composerID = s.id;\n        this._attachments = {\n        };\n        this._attachmentFetchForm = l.JSBNG__find(s, \"._2_4\");\n        this._resetSubscription = g.subscribe(\"composer/publish\", function(t, u) {\n            if (((u.composer_id === this._composerID))) {\n                this.reset();\n            }\n        ;\n        ;\n        }.bind(this));\n    };\n;\n    m(r.prototype, {\n        _endpointHashToShow: q,\n        _lastFetchEndpoint: \"\",\n        _initialAttachmentEndpoint: \"\",\n        getAttachment: function(s, t) {\n            var u = h.getURIHash(s);\n            this._endpointHashToShow = u;\n            var v = this._attachments[u];\n            if (v) {\n                this._showAttachmentAfterComponentsLoaded(u);\n            }\n             else this.fetchAttachmentData(s, t);\n        ;\n        ;\n        },\n        fetchAttachmentData: function(s, t) {\n            var u = h.getURIHash(s);\n            if (this._attachments[u]) {\n                return;\n            }\n        ;\n        ;\n            if (((s !== this._lastFetchEndpoint))) {\n                h.load(this._attachmentFetchForm, s, t);\n                this._lastFetchEndpoint = s;\n            }\n        ;\n        ;\n        },\n        setAttachment: function(s, t, u, v) {\n            this._setupAttachment(s, t, u, v);\n            this._showAttachmentAfterComponentsLoaded(s);\n        },\n        setInitialAttachment: function(s, t, u, v) {\n            var w = h.getURIHash(s);\n            this._setupAttachment(w, t, u, v);\n            this._initialAttachmentEndpoint = s;\n            if (!this._currentInstance) {\n                this._showAttachmentAfterComponentsLoaded(w);\n            }\n        ;\n        ;\n        },\n        setComponent: function(s, t) {\n            if (!i.get(this._composerID, s)) {\n                i.set(this._composerID, s, t);\n                k.appendContent(this._attachmentFetchForm, k.create(\"input\", {\n                    type: \"hidden\",\n                    JSBNG__name: \"loaded_components[]\",\n                    value: s\n                }));\n            }\n        ;\n        ;\n        },\n        reset: function() {\n            if (this._currentInstance) {\n                this._currentInstance.cleanup();\n                this._currentInstance = null;\n            }\n        ;\n        ;\n            {\n                var fin193keys = ((window.top.JSBNG_Replay.forInKeys)((this._attachments))), fin193i = (0);\n                var s;\n                for (; (fin193i < fin193keys.length); (fin193i++)) {\n                    ((s) = (fin193keys[fin193i]));\n                    {\n                        this._attachments[s].instance.reset();\n                    ;\n                    };\n                };\n            };\n        ;\n            var t = i.getAllForComposer(this._composerID);\n            p(t).forEach(function(u) {\n                if (u.reset) {\n                    u.reset(u);\n                }\n            ;\n            ;\n            });\n            this.getAttachment(this._initialAttachmentEndpoint);\n            g.inform(\"composer/reset\");\n        },\n        destroy: function() {\n            if (this._resetSubscription) {\n                this._resetSubscription.unsubscribe();\n                this._resetSubscription = null;\n            }\n        ;\n        ;\n        },\n        addPlaceholders: function(s, t) {\n            var u;\n            {\n                var fin194keys = ((window.top.JSBNG_Replay.forInKeys)((this._attachments))), fin194i = (0);\n                var v;\n                for (; (fin194i < fin194keys.length); (fin194i++)) {\n                    ((v) = (fin194keys[fin194i]));\n                    {\n                        u = this._attachments[v];\n                        if (((u.instance === s))) {\n                            t.forEach(function(w) {\n                                u.placeholders.push(w);\n                                u.required_components.push(w.component_name);\n                            });\n                            break;\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            if (((this._currentInstance === s))) {\n                this._fillPlaceholders(t);\n            }\n        ;\n        ;\n        },\n        _setupAttachment: function(s, t, u, v) {\n            t.setComposerID(this._composerID);\n            this._attachments[s] = {\n                instance: t,\n                placeholders: u,\n                required_components: v\n            };\n            var w = l.JSBNG__find(this._root, \"div._55d0\"), x = t.getRoot();\n            if (((x.parentNode !== w))) {\n                j.hide(x);\n                k.appendContent(w, x);\n            }\n        ;\n        ;\n        },\n        _showAttachment: function(s, t, u) {\n            if (((this._currentInstance === s))) {\n                return;\n            }\n        ;\n        ;\n            if (((this._endpointHashToShow === q))) {\n                this._endpointHashToShow = null;\n            }\n             else if (((this._endpointHashToShow !== t))) {\n                return;\n            }\n            \n        ;\n        ;\n            if (this._currentInstance) {\n                if (!this._currentInstance.canSwitchAway()) {\n                    return;\n                }\n            ;\n            ;\n                this._currentInstance.cleanup();\n            }\n        ;\n        ;\n            this._currentInstance = s;\n            var v = l.JSBNG__find(this._root, \"div._55d0\"), w = v.childNodes, x = s.getRoot();\n            for (var y = 0; ((y < w.length)); y++) {\n                if (((w[y] !== x))) {\n                    j.hide(w[y]);\n                }\n            ;\n            ;\n            };\n        ;\n            j.show(x);\n            this._fillPlaceholders(u);\n            var z = h.getURIHash(this._initialAttachmentEndpoint), aa = ((t === z));\n            s.initWithComponents(aa);\n            this._setAttachmentSelectedClass(s.attachmentClassName);\n            g.inform(\"composer/initializedAttachment\", {\n                composerRoot: this._root,\n                isInitial: aa\n            });\n        },\n        _showAttachmentAfterComponentsLoaded: function(s) {\n            var t = this._attachments[s];\n            i.waitForComponents(this._composerID, t.required_components, this._showAttachment.bind(this, t.instance, s, t.placeholders));\n        },\n        _fillPlaceholders: function(s) {\n            s.forEach(function(t) {\n                var u = i.get(this._composerID, t.component_name);\n                if (((t.element !== u.element.parentNode))) {\n                    k.setContent(t.element, u.element);\n                }\n            ;\n            ;\n            }.bind(this));\n        },\n        _setAttachmentSelectedClass: function(s) {\n            var t = l.scry(this._root, \"._519b\")[0], u;\n            if (t) {\n                j.removeClass(t, \"_519b\");\n                u = l.scry(t, \"*[aria-pressed=\\\"true\\\"]\")[0];\n                if (u) {\n                    u.setAttribute(\"aria-pressed\", \"false\");\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            if (s) {\n                var v = l.scry(this._root, ((\".\" + s)))[0];\n                if (v) {\n                    j.addClass(v, \"_519b\");\n                    u = l.scry(v, \"*[aria-pressed=\\\"false\\\"]\")[0];\n                    if (u) {\n                        u.setAttribute(\"aria-pressed\", \"true\");\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = r;\n});\n__d(\"ComposerXAttachment\", [\"ComposerXStore\",\"copyProperties\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"ComposerXStore\"), h = b(\"copyProperties\"), i = b(\"emptyFunction\");\n    function j() {\n    \n    };\n;\n    h(j.prototype, {\n        getRoot: i,\n        initWithComponents: function(k) {\n        \n        },\n        cleanup: i,\n        reset: i,\n        attachmentClassName: \"\",\n        getComponent: function(k) {\n            return g.get(this._composerID, k);\n        },\n        canSwitchAway: i.thatReturnsTrue,\n        setComposerID: function(k) {\n            this._composerID = k;\n        },\n        allowOGTagPreview: function() {\n            return false;\n        }\n    });\n    e.exports = j;\n});\n__d(\"ComposerXController\", [\"Arbiter\",\"ComposerX\",\"ComposerXAttachmentBootstrap\",\"Parent\",\"$\",\"cx\",\"emptyFunction\",\"ge\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ComposerX\"), i = b(\"ComposerXAttachmentBootstrap\"), j = b(\"Parent\"), k = b(\"$\"), l = b(\"cx\"), m = b(\"emptyFunction\"), n = b(\"ge\"), o = {\n    };\n    function p(r) {\n        var s = j.byClass(k(r), \"_119\"), t = s.id;\n        if (!o[t]) {\n            o[t] = new h(s);\n        }\n    ;\n    ;\n        return o[t];\n    };\n;\n    var q = {\n        getAttachment: function(r, s, t) {\n            var u = p(r);\n            u.getAttachment(s, t);\n        },\n        fetchAttachmentData: function(r, s, t) {\n            p(r).fetchAttachmentData(s, t);\n        },\n        setAttachment: function(r, s, t, u, v) {\n            var w = p(r);\n            w.setAttachment(s, t, u, v);\n        },\n        setInitialAttachment: function(r, s, t, u, v) {\n            var w = p(r);\n            w.setInitialAttachment(s, t, u, v);\n        },\n        setComponent: function(r, s, t) {\n            var u = p(r);\n            u.setComponent(s, t);\n        },\n        reset: function(r) {\n            var s = p(r);\n            s.reset();\n        },\n        holdTheMarkup: m,\n        getEndpoint: function(r, s, t) {\n            var u = p(r);\n            i.load(u._attachmentFetchForm, s, t);\n        },\n        addPlaceholders: function(r, s, t) {\n            var u = p(r);\n            u.addPlaceholders(s, t);\n        }\n    };\n    i.bootstrap = function(r) {\n        q.getAttachment(r, r.getAttribute(\"data-endpoint\"));\n    };\n    g.subscribe(\"page_transition\", function() {\n        {\n            var fin195keys = ((window.top.JSBNG_Replay.forInKeys)((o))), fin195i = (0);\n            var r;\n            for (; (fin195i < fin195keys.length); (fin195i++)) {\n                ((r) = (fin195keys[fin195i]));\n                {\n                    if (!n(r)) {\n                        o[r].destroy();\n                        delete o[r];\n                    }\n                ;\n                ;\n                };\n            };\n        };\n    ;\n    });\n    e.exports = q;\n});\n__d(\"ComposerXAttachmentUtils\", [\"CSS\",\"DataStore\",\"DOMQuery\",\"Focus\",\"Input\",\"PageTransitions\",\"Run\",\"StickyPlaceholderInput\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSS\"), h = b(\"DataStore\"), i = b(\"DOMQuery\"), j = b(\"Focus\"), k = b(\"Input\"), l = b(\"PageTransitions\"), m = b(\"Run\"), n = b(\"StickyPlaceholderInput\"), o = b(\"tx\"), p = \"composer_fixed_placeholder\";\n    function q(s, t) {\n        if (!h.get(s.element, p, false)) {\n            s.instance.setPlaceholder(t);\n        }\n    ;\n    ;\n    };\n;\n    var r = {\n        initMentions: function(s, t) {\n            q(s, t);\n            var u = i.JSBNG__find(s.element, \"textarea.input\");\n            j.set(u);\n        },\n        setStickyPlaceholderForMentions: function(s, t) {\n            if (((i.contains(s.element, JSBNG__document.activeElement) && g.hasClass(JSBNG__document.activeElement, \"DOMControl_placeholder\")))) {\n                JSBNG__document.activeElement.JSBNG__blur();\n            }\n        ;\n        ;\n            q(s, t);\n        },\n        setPlaceholderIsFixed: function(s, t) {\n            h.set(s.element, p, !!t);\n        },\n        setStickyPlaceholderForTypeahead: function(s, t) {\n            var u = i.JSBNG__find(s, \".textInput\");\n            n.setPlaceholderText(u, t);\n        },\n        registerInputForLeaveWarning: function(s) {\n            m.onBeforeUnload(function() {\n                var t = l.getNextURI();\n                if (t.getQueryData().hasOwnProperty(\"theater\")) {\n                    return;\n                }\n            ;\n            ;\n                if (((a.Dialog && a.Dialog.getCurrent()))) {\n                    return;\n                }\n            ;\n            ;\n                if (((((s.offsetParent !== null)) && !k.isEmpty(s)))) {\n                    return \"You haven't finished your post yet. Do you want to leave without finishing?\";\n                }\n            ;\n            ;\n            });\n        }\n    };\n    e.exports = r;\n});\n__d(\"DragDropFileUpload\", [], function(a, b, c, d, e, f) {\n    f.isSupported = function() {\n        return ((typeof (JSBNG__FileList) !== \"undefined\"));\n    };\n});\n__d(\"DocumentDragDrop\", [\"JSBNG__Event\",\"Arbiter\",\"CSS\",\"DOM\",\"DOMQuery\",\"DragDropFileUpload\",\"emptyFunction\",\"getObjectValues\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"Arbiter\"), i = b(\"CSS\"), j = b(\"DOM\"), k = b(\"DOMQuery\"), l = b(\"DragDropFileUpload\"), m = b(\"emptyFunction\"), n = b(\"getObjectValues\"), o = {\n    }, p = 0;\n    function q() {\n        p = 0;\n        n(o).forEach(function(t) {\n            i.removeClass(t.element, t.className);\n            h.inform(\"dragleave\", {\n                element: t.element\n            });\n        });\n    };\n;\n    function r() {\n        if (!l.isSupported()) {\n            return;\n        }\n    ;\n    ;\n        g.listen(JSBNG__document, \"dragenter\", function(u) {\n            if (((p === 0))) {\n                n(o).forEach(function(v) {\n                    i.addClass(v.element, v.className);\n                    h.inform(\"dragenter\", {\n                        element: v.element,\n                        JSBNG__event: u\n                    });\n                });\n            }\n        ;\n        ;\n            p++;\n        });\n        g.listen(JSBNG__document, \"dragleave\", function(u) {\n            p--;\n            if (((p === 0))) {\n                q();\n            }\n        ;\n        ;\n        });\n        g.listen(JSBNG__document, \"drop\", function(u) {\n            var v = u.getTarget();\n            if (k.isNodeOfType(u.getTarget(), \"input\")) {\n                if (((v.type === \"file\"))) {\n                    return;\n                }\n            ;\n            }\n        ;\n        ;\n            u.prevent();\n        });\n        g.listen(JSBNG__document, \"dragover\", g.prevent);\n        var t = null;\n        JSBNG__document.JSBNG__addEventListener(\"dragover\", function() {\n            ((t && JSBNG__clearTimeout(t)));\n            t = JSBNG__setTimeout(q, 839);\n        }, true);\n        r = m;\n    };\n;\n    var s = {\n        registerStatusElement: function(t, u) {\n            r();\n            o[j.getID(t)] = {\n                element: t,\n                className: u\n            };\n        },\n        removeStatusElement: function(t) {\n            var u = j.getID(t), v = o[u];\n            i.removeClass(v.element, v.className);\n            delete o[u];\n        }\n    };\n    e.exports = s;\n});\n__d(\"DragDropTarget\", [\"JSBNG__Event\",\"CSS\",\"DocumentDragDrop\",\"DragDropFileUpload\",\"copyProperties\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"CSS\"), i = b(\"DocumentDragDrop\"), j = b(\"DragDropFileUpload\"), k = b(\"copyProperties\"), l = b(\"emptyFunction\");\n    function m(n) {\n        this._element = n;\n        this._listeners = [];\n        this._statusElem = n;\n        this._dragEnterCount = 0;\n        this._enabled = false;\n    };\n;\n    k(m.prototype, {\n        _onFilesDropCallback: l,\n        _onURLDropCallback: l,\n        _onPlainTextDropCallback: l,\n        _onDropCallback: l,\n        _fileFilterFn: l.thatReturnsArgument,\n        setOnFilesDropCallback: function(n) {\n            this._onFilesDropCallback = n;\n            return this;\n        },\n        setOnURLDropCallback: function(n) {\n            this._onURLDropCallback = n;\n            return this;\n        },\n        setOnPlainTextDropCallback: function(n) {\n            this._onPlainTextDropCallback = n;\n            return this;\n        },\n        setOnDropCallback: function(n) {\n            this._onDropCallback = n;\n            return this;\n        },\n        enable: function() {\n            if (!j.isSupported()) {\n                return this;\n            }\n        ;\n        ;\n            i.registerStatusElement(this._statusElem, \"fbWantsDragDrop\");\n            this._listeners.push(g.listen(this._element, \"dragenter\", this._onDragEnter.bind(this)));\n            this._listeners.push(g.listen(this._element, \"dragleave\", this._onDragLeave.bind(this)));\n            this._listeners.push(g.listen(this._element, \"dragover\", g.kill));\n            this._listeners.push(g.listen(this._element, \"drop\", function(n) {\n                this._dragEnterCount = 0;\n                h.removeClass(this._statusElem, \"fbDropReady\");\n                h.removeClass(this._statusElem, \"fbDropReadyPhoto\");\n                h.removeClass(this._statusElem, \"fbDropReadyPhotos\");\n                h.removeClass(this._statusElem, \"fbDropReadyLink\");\n                var o = {\n                }, p = false, q = this._fileFilterFn(n.dataTransfer.files);\n                if (q.length) {\n                    this._onFilesDropCallback(q, n);\n                    o.files = q;\n                    p = true;\n                }\n            ;\n            ;\n                var r = ((n.dataTransfer.getData(\"url\") || n.dataTransfer.getData(\"text/uri-list\")));\n                if (r) {\n                    this._onURLDropCallback(r, n);\n                    o.url = r;\n                    p = true;\n                }\n            ;\n            ;\n                var s = n.dataTransfer.getData(\"text/plain\");\n                if (s) {\n                    this._onPlainTextDropCallback(s, n);\n                    o.plainText = s;\n                    p = true;\n                }\n            ;\n            ;\n                if (p) {\n                    this._onDropCallback(o, n);\n                }\n            ;\n            ;\n                n.kill();\n            }.bind(this)));\n            this._enabled = true;\n            return this;\n        },\n        disable: function() {\n            if (!this._enabled) {\n                return this;\n            }\n        ;\n        ;\n            i.removeStatusElement(this._statusElem, \"fbWantsDragDrop\");\n            h.removeClass(this._statusElem, \"fbDropReady\");\n            h.removeClass(this._statusElem, \"fbDropReadyPhoto\");\n            h.removeClass(this._statusElem, \"fbDropReadyPhotos\");\n            h.removeClass(this._statusElem, \"fbDropReadyLink\");\n            while (this._listeners.length) {\n                this._listeners.pop().remove();\n            ;\n            };\n        ;\n            this._enabled = false;\n            return this;\n        },\n        setFileFilter: function(n) {\n            this._fileFilterFn = n;\n            return this;\n        },\n        setStatusElement: function(n) {\n            this._statusElem = n;\n            return this;\n        },\n        _onDragEnter: function(n) {\n            if (((this._dragEnterCount === 0))) {\n                var o = n.dataTransfer.items, p = false;\n                for (var q = 0; ((q < o.length)); q++) {\n                    if (!o[q].type.match(\"image/*\")) {\n                        p = true;\n                        break;\n                    }\n                ;\n                ;\n                };\n            ;\n                h.addClass(this._statusElem, \"fbDropReady\");\n                if (p) {\n                    h.addClass(this._statusElem, \"fbDropReadyLink\");\n                }\n                 else if (((o.length > 1))) {\n                    h.addClass(this._statusElem, \"fbDropReadyPhotos\");\n                }\n                 else h.addClass(this._statusElem, \"fbDropReadyPhoto\");\n                \n            ;\n            ;\n            }\n        ;\n        ;\n            this._dragEnterCount++;\n        },\n        _onDragLeave: function() {\n            this._dragEnterCount = Math.max(((this._dragEnterCount - 1)), 0);\n            if (((this._dragEnterCount === 0))) {\n                h.removeClass(this._statusElem, \"fbDropReady\");\n                h.removeClass(this._statusElem, \"fbDropReadyPhoto\");\n                h.removeClass(this._statusElem, \"fbDropReadyPhotos\");\n                h.removeClass(this._statusElem, \"fbDropReadyLink\");\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = m;\n});\n__d(\"ComposerXDragDrop\", [\"Arbiter\",\"ComposerXController\",\"CSS\",\"DragDropTarget\",\"DOMQuery\",\"Parent\",\"URI\",\"copyProperties\",\"csx\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ComposerXController\"), i = b(\"CSS\"), j = b(\"DragDropTarget\"), k = b(\"DOMQuery\"), l = b(\"Parent\"), m = b(\"URI\"), n = b(\"copyProperties\"), o = b(\"csx\"), p = b(\"cx\"), q = \"/ajax/composerx/attachment/media/upload/\", r = \"/ajax/composerx/attachment/link/scraper/\", s = function(u) {\n        u();\n    };\n    function t(u, v, w, x) {\n        this._root = u;\n        this._composerID = v;\n        this._targetID = w;\n        x = ((x || s));\n        this._dragdrop = new j(u).setOnFilesDropCallback(function(y) {\n            x(this._uploadFiles.bind(this, y));\n        }.bind(this)).setFileFilter(t.filterImages).enable();\n        t.handleDragEnterAndLeave(u);\n        g.subscribe(\"composer/deactivateDragdrop\", function() {\n            this.deactivate();\n        }.bind(this));\n        g.subscribe(\"composer/reactivateDragdrop\", function() {\n            this.reactivate();\n        }.bind(this));\n    };\n;\n    n(t, {\n        handleDragEnterAndLeave: function(u) {\n            var v = k.scry(l.byClass(u, \"_119\"), \"._2wr\");\n            g.subscribe(\"dragenter\", function(w, x) {\n                if (((u == x.element))) {\n                    v.forEach(i.hide);\n                }\n            ;\n            ;\n            });\n            g.subscribe(\"dragleave\", function(w, x) {\n                if (((u == x.element))) {\n                    v.forEach(i.show);\n                }\n            ;\n            ;\n            });\n        },\n        filterImages: function(u) {\n            var v = [];\n            for (var w = 0; ((w < u.length)); w++) {\n                if (u[w].type.match(\"image/*\")) {\n                    v.push(u[w]);\n                }\n            ;\n            ;\n            };\n        ;\n            return v;\n        }\n    });\n    n(t.prototype, {\n        enableURLDropping: function() {\n            this._dragdrop.setOnURLDropCallback(this._onURLDrop.bind(this));\n        },\n        deactivate: function() {\n            this._dragdrop.disable();\n        },\n        reactivate: function() {\n            this._dragdrop.enable();\n        },\n        _uploadFiles: function(u) {\n            h.getAttachment(this._root, q);\n            g.inform(((((\"ComposerXFilesStore/filesDropped/\" + this._composerID)) + \"/mediaupload\")), {\n                files: u\n            }, g.BEHAVIOR_PERSISTENT);\n        },\n        _onURLDrop: function(u) {\n            var v = new m(r);\n            v.addQueryData({\n                scrape_url: encodeURIComponent(u)\n            });\n            h.getAttachment(this._root, v.toString());\n        }\n    });\n    e.exports = t;\n});\n__d(\"PrivacyConst\", [], function(a, b, c, d, e, f) {\n    var g = {\n        FRIENDS_PLUS_GAMER_FRIENDS: 128,\n        FRIENDS_MINUS_ACQUAINTANCES: 127,\n        FACEBOOK_EMPLOYEES: 112,\n        CUSTOM: 111,\n        EVERYONE: 80,\n        NETWORKS_FRIENDS_OF_FRIENDS: 60,\n        NETWORKS_FRIENDS: 55,\n        FRIENDS_OF_FRIENDS: 50,\n        ALL_FRIENDS: 40,\n        SELF: 10,\n        NOBODY: 0\n    }, h = {\n        EVERYONE: 80,\n        NETWORKS_FRIENDS: 55,\n        FRIENDS_OF_FRIENDS: 50,\n        ALL_FRIENDS: 40,\n        SOME_FRIENDS: 30,\n        SELF: 10,\n        NO_FRIENDS: 0\n    }, i = {\n        NONE: 0,\n        TAGGEES: 1,\n        FRIENDS_OF_TAGGEES: 2\n    }, j = {\n        BaseValue: g,\n        FriendsValue: h,\n        TagExpansion: i\n    };\n    e.exports = j;\n});\n__d(\"ComposerXBootloadStatusAttachment\", [\"JSBNG__Event\",\"function-extensions\",\"Arbiter\",\"AsyncRequest\",\"Bootloader\",\"Class\",\"ComposerXAttachment\",\"ComposerXController\",\"ComposerXDragDrop\",\"ComposerXStore\",\"CSS\",\"DOM\",\"DOMQuery\",\"Focus\",\"Parent\",\"PlaceholderListener\",\"PrivacyConst\",\"URI\",\"SelectorDeprecated\",\"copyProperties\",\"csx\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\");\n    b(\"function-extensions\");\n    var h = b(\"Arbiter\"), i = b(\"AsyncRequest\"), j = b(\"Bootloader\"), k = b(\"Class\"), l = b(\"ComposerXAttachment\"), m = b(\"ComposerXController\"), n = b(\"ComposerXDragDrop\"), o = b(\"ComposerXStore\"), p = b(\"CSS\"), q = b(\"DOM\"), r = b(\"DOMQuery\"), s = b(\"Focus\"), t = b(\"Parent\"), u = b(\"PlaceholderListener\"), v = b(\"PrivacyConst\"), w = b(\"URI\"), x = b(\"SelectorDeprecated\"), y = b(\"copyProperties\"), z = b(\"csx\"), aa = b(\"cx\"), ba = {\n    };\n    function ca(da, ea) {\n        this.parent.construct(this);\n        this._root = da;\n        this._config = ea;\n    };\n;\n    k.extend(ca, l);\n    y(ca.prototype, {\n        _attachmentIsActive: false,\n        _bootloading: false,\n        _fullVersion: false,\n        _focusListener: null,\n        _privacyWidgetTags: null,\n        _scraper: null,\n        _dragdrop: null,\n        attachmentClassName: \"_4j\",\n        getRoot: function() {\n            return this._root;\n        },\n        initWithComponents: function(da) {\n            ba[this._composerID] = this;\n            this._attachmentIsActive = true;\n            var ea = r.JSBNG__find(this.getComponent(\"maininput\").element, \"textarea.input\");\n            if (this._fullVersion) {\n                this._fullInitWithComponents();\n            }\n             else if (!this._bootloading) {\n                if (r.contains(this._root, JSBNG__document.activeElement)) {\n                    this._onInitialFocus();\n                }\n                 else this._focusListener = g.listen(ea, \"JSBNG__focus\", this._onInitialFocus.bind(this));\n            ;\n            }\n            \n        ;\n        ;\n            this._dragEnterHandler = h.subscribe(\"dragenter\", function(fa, ga) {\n                if (((ga.element == this._root))) {\n                    var ha = ga.JSBNG__event.dataTransfer.items, ia;\n                    if (ha) {\n                        ia = n.filterImages(ha);\n                    }\n                ;\n                ;\n                    if (((ia && ((ia.length > 0))))) {\n                        s.set(ea);\n                    }\n                     else {\n                        var ja = t.byClass(this._root, \"focus_target\");\n                        u.expandInput(ja);\n                        if (((!this._bootloading && !this._fullVersion))) {\n                            this._onInitialFocus();\n                        }\n                    ;\n                    ;\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n            }.bind(this));\n            this.getComponent(\"maininput\").instance.setPlaceholder(this._config.mentionsPlaceholder);\n            if (!da) {\n                s.set(ea);\n            }\n        ;\n        ;\n            if (this._config.plus_version) {\n                this._dragdrop = new n(this._root, this._composerID, this._config.targetID);\n                this._dragdrop.enableURLDropping();\n            }\n        ;\n        ;\n        },\n        _fullInitWithComponents: function() {\n            j.loadModules([\"ComposerXPrivacyWidgetTags\",\"URLScraper\",\"URI\",], function(da, ea, fa) {\n                this._tagger.init(this);\n                this._privacyWidgetTags = new da(this);\n                var ga = r.JSBNG__find(this.getComponent(\"maininput\").element, \"textarea.input\");\n                if (!this._scraper) {\n                    this._scraper = new ea(ga);\n                    this._scraper.subscribe(\"match\", function(ha, ia) {\n                        var ja = this._getScraperEndpoint();\n                        ja.addQueryData({\n                            scrape_url: encodeURIComponent(ia.url)\n                        });\n                        m.getAttachment(this._root, ja.toString());\n                    }.bind(this));\n                }\n            ;\n            ;\n                this._scraper.enable();\n                this._scraper.check();\n            }.bind(this));\n            this._initPrivacyReminder();\n        },\n        _initPrivacyReminder: function() {\n            if (((!this._reminderDialog || this._reminderShown))) {\n                return;\n            }\n        ;\n        ;\n            var da = this.getComponent(\"mainprivacywidget\"), ea = x.getSelectedOptions(da.element), fa = x.getOptionValue(ea[0]);\n            if (((fa !== String(v.BaseValue.SELF)))) {\n                return;\n            }\n        ;\n        ;\n            this._reminderDialog.setContext(this.getComponent(\"mainprivacywidget\").element).show();\n            this._reminderShown = true;\n            var ga = function() {\n                new i(\"/ajax/privacy/reminders/dismiss\").setData({\n                    type: \"only_me\"\n                }).send();\n                this._reminderDialog.hide();\n            }.bind(this);\n            this._reminderEvents = [g.listen(this._reminderDialog.getContent(), \"click\", ga),g.listen(this._reminderDialog.getContext(), \"click\", ga),];\n        },\n        cleanup: function() {\n            this._attachmentIsActive = false;\n            if (this._focusListener) {\n                this._focusListener.remove();\n                this._focusListener = null;\n            }\n        ;\n        ;\n            if (((this._reminderDialog && this._reminderShown))) {\n                this._reminderDialog.hide();\n                this._reminderEvents.forEach(function(da) {\n                    da.remove();\n                });\n            }\n        ;\n        ;\n            if (this._dragdrop) {\n                this._dragdrop.deactivate();\n                this._dragdrop = null;\n            }\n        ;\n        ;\n            if (this._fullVersion) {\n                this._tagger.cleanup();\n                this._privacyWidgetTags.destroy();\n                this._privacyWidgetTags = null;\n                this._scraper.disable();\n            }\n        ;\n        ;\n            if (this._dragEnterHandler) {\n                this._dragEnterHandler.unsubscribe();\n                this._dragEnterHandler = null;\n            }\n        ;\n        ;\n        },\n        reset: function() {\n            var da = t.byClass(this._root, \"child_was_focused\");\n            if (da) {\n                p.removeClass(da, \"child_was_focused\");\n            }\n        ;\n        ;\n            if (this._tagger) {\n                this._tagger.reset();\n            }\n        ;\n        ;\n            this.getComponent(\"maininput\").instance.setPlaceholder(this._config.mentionsPlaceholder);\n        },\n        canSwitchAway: function() {\n            return !t.byClass(this._root, \"async_saving\");\n        },\n        setBootloadedContent: function(da, ea, fa, ga) {\n            this._reminderDialog = ga;\n            var ha = fa.map(function(ia) {\n                return ia.component_name;\n            });\n            o.waitForComponents(this._composerID, ha, function() {\n                var ia = r.JSBNG__find(this._root, \"._3-6\"), ja = r.JSBNG__find(this._root, \"._3-7\");\n                q.setContent(ia, da.tagger_content);\n                q.setContent(ja, da.tagger_icons);\n                m.addPlaceholders(this._root, this, fa);\n                this._tagger = ea;\n                this._fullVersion = true;\n                if (this._attachmentIsActive) {\n                    if (this._focusListener) {\n                        this._focusListener.remove();\n                        this._focusListener = null;\n                    }\n                ;\n                ;\n                    this._fullInitWithComponents();\n                }\n            ;\n            ;\n            }.bind(this));\n        },\n        _getScraperEndpoint: function() {\n            return w(\"/ajax/composerx/attachment/link/scraper/\");\n        },\n        _onInitialFocus: function() {\n            h.inform(\"composer/focus\");\n            m.getEndpoint(this._root, \"/ajax/composerx/attachment/status/bootload/\", true);\n            this._bootloading = true;\n        },\n        allowOGTagPreview: function() {\n            return true;\n        }\n    });\n    ca.setBootloadedContent = function(da, ea, fa, ga, ha) {\n        var ia = ba[da];\n        if (ia) {\n            ia.setBootloadedContent(ea, fa, ga, ha);\n        }\n    ;\n    ;\n    };\n    e.exports = ca;\n});\n__d(\"ComposerXMentionsInputReset\", [\"DOMQuery\",\"Input\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOMQuery\"), h = b(\"Input\");\n    function i(j) {\n        var k = g.scry(j.element, \"textarea.input\")[0];\n        j.instance.reset();\n        h.reset(k);\n    };\n;\n    e.exports = i;\n});\n__d(\"ComposerXOGTaggerIconReset\", [\"CSS\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSS\"), h = b(\"cx\");\n    function i(j) {\n        g.removeClass(j.element, \"_4-jh\");\n        g.removeClass(j.element, \"_509o\");\n    };\n;\n    e.exports = i;\n});\n__d(\"ComposerXPrivacyWidgetReset\", [\"Arbiter\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\");\n    function h(i) {\n        g.inform(\"Composer/changedtags\", {\n            withTags: [],\n            mention: {\n            },\n            eventTag: false\n        });\n    };\n;\n    e.exports = h;\n});\n__d(\"ComposerXTaggerIconReset\", [\"CSS\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSS\"), h = b(\"cx\");\n    function i(j) {\n        g.removeClass(j.element, \"_1dsa\");\n        g.removeClass(j.element, \"_1dsb\");\n        g.removeClass(j.element, \"_509o\");\n    };\n;\n    e.exports = i;\n});\n__d(\"SwapButtonDEPRECATED\", [\"JSBNG__Event\",\"Arbiter\",\"copyProperties\",\"CSS\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"Arbiter\"), i = b(\"copyProperties\"), j = b(\"CSS\");\n    function k(l, m, n) {\n        this._swapperButton = l;\n        this._swappeeButton = m;\n        g.listen(l, \"click\", this.swap.bind(this));\n        if (n) {\n            g.listen(m, \"click\", this.unswap.bind(this));\n        }\n    ;\n    ;\n        h.subscribe(\"SwapButtonDEPRECATED/focusOnJoinButton\", this.setFocusOnSwapper.bind(this), h.SUBSCRIBE_ALL);\n    };\n;\n    i(k.prototype, {\n        _swapperButton: null,\n        _swappeeButton: null,\n        swap: function(l) {\n            j.hide(this._swapperButton);\n            j.show(this._swappeeButton);\n            ((((l !== false)) && this._swappeeButton.JSBNG__focus()));\n        },\n        unswap: function(l) {\n            j.show(this._swapperButton);\n            j.hide(this._swappeeButton);\n            ((((l !== false)) && this._swapperButton.JSBNG__focus()));\n        },\n        toggle: function() {\n            j.toggle(this._swapperButton);\n            j.toggle(this._swappeeButton);\n        },\n        setFocusOnSwapper: function() {\n            this._swapperButton.JSBNG__focus();\n        }\n    });\n    e.exports = k;\n});\n__d(\"SubscribeButton\", [\"Arbiter\",\"AsyncRequest\",\"JSBNG__Event\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"AsyncRequest\"), i = b(\"JSBNG__Event\"), j = {\n        SUBSCRIBED: \"FollowingUser\",\n        UNSUBSCRIBED: \"UnfollowingUser\",\n        init: function(k, l, m, n, o, p) {\n            i.listen(l, \"click\", function() {\n                g.inform(j.SUBSCRIBED, {\n                    profile_id: n\n                });\n            });\n            g.subscribe(j.SUBSCRIBED, function(q, r) {\n                if (((n === r.profile_id))) {\n                    if (!o) {\n                        m.suppressNextMouseEnter();\n                    }\n                ;\n                ;\n                    k.swap();\n                    if (((p === true))) {\n                        new h().setURI(\"/ajax/profile/suggestions_on_following.php\").setData({\n                            profileid: n\n                        }).send();\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n            });\n            g.subscribe(j.UNSUBSCRIBED, function(q, r) {\n                if (((n === r.profile_id))) {\n                    k.unswap();\n                    m.hideFlyout();\n                    g.inform(\"SubMenu/Reset\");\n                }\n            ;\n            ;\n            });\n        },\n        initUnsubscribe: function(k, l) {\n            i.listen(k, \"click\", function() {\n                g.inform.bind(g, j.UNSUBSCRIBED, {\n                    profile_id: l\n                }).defer();\n            });\n        }\n    };\n    e.exports = j;\n});\n__d(\"AudienceSelectorTags\", [], function(a, b, c, d, e, f) {\n    var g = {\n    }, h = {\n        hasTags: function(i) {\n            return g.hasOwnProperty(i);\n        },\n        setHasTags: function(i) {\n            if (i) {\n                g[i] = true;\n            }\n        ;\n        ;\n        }\n    };\n    e.exports = h;\n});\n__d(\"BasePrivacyOption\", [\"Arbiter\",\"AudienceSelectorTags\",\"copyProperties\",\"CSS\",\"DOM\",\"Env\",\"fbt\",\"Parent\",\"PrivacyConst\",\"SelectorDeprecated\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"AudienceSelectorTags\"), i = b(\"copyProperties\"), j = b(\"CSS\"), k = b(\"DOM\"), l = b(\"Env\"), m = b(\"fbt\"), n = b(\"Parent\"), o = b(\"PrivacyConst\"), p = b(\"SelectorDeprecated\"), q = b(\"tx\");\n    function r(s) {\n        this._selector = n.byClass(s, \"audienceSelector\");\n        this._plusLabel = k.scry(s, \".plusLabel\")[0];\n        if (!this._selector) {\n            return;\n        }\n    ;\n    ;\n        this._elem = s;\n        this._taggedIDs = [];\n        this._tags = [];\n        this._hasEvent = false;\n        this._recalculateTooltipAndLabel();\n        this._updateSelector();\n        g.subscribe(\"Composer/changedtags\", function(t, u) {\n            if (!this._getChangedData()) {\n                return;\n            }\n        ;\n        ;\n            var v = this._hasEvent;\n            this._hasEvent = !!u.eventTag;\n            this._tags = u.withTags.map(function(y) {\n                return y.getText();\n            });\n            this._taggedIDs = u.withTags.map(function(y) {\n                return y.getValue();\n            });\n            {\n                var fin196keys = ((window.top.JSBNG_Replay.forInKeys)((u.mention))), fin196i = (0);\n                var w;\n                for (; (fin196i < fin196keys.length); (fin196i++)) {\n                    ((w) = (fin196keys[fin196i]));\n                    {\n                        if (((((u.mention[w].type == \"user\")) && ((u.mention[w].uid != l.user))))) {\n                            this._tags.push(u.mention[w].text);\n                            this._taggedIDs.push(u.mention[w].uid);\n                        }\n                         else if (((u.mention[w].type == \"JSBNG__event\"))) {\n                            this._hasEvent = true;\n                        }\n                        \n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            if (((this._hasEvent && ((v != this._hasEvent))))) {\n                this._eventTagChanged();\n            }\n        ;\n        ;\n            var x = this._recalculateTooltipAndLabel();\n            if (((x && p.isOptionSelected(this._elem)))) {\n                this._updateSelector();\n                g.inform(\"SelectedPrivacyOption/changed\", this._getChangedData());\n            }\n        ;\n        ;\n        }.bind(this));\n        p.listen(this._selector, \"change\", this._updateSelector.bind(this));\n    };\n;\n    i(r.prototype, {\n        _eventTagChanged: function() {\n        \n        },\n        _getChangedData: function() {\n            return null;\n        },\n        _recalculateTooltipAndLabel: function() {\n            var s = this._tooltip, t = this._label, u = this._getIncludedAudience(), v = this._getExcludedAudience(), w = this._getTagExpansionText();\n            if (w) {\n                u = m._(\"{list of people who can see this}, {list of additional people who can see this}\", [m.param(\"list of people who can see this\", u),m.param(\"list of additional people who can see this\", w),]);\n            }\n        ;\n        ;\n            this._tooltip = this._getCombinedSentence(u, v);\n            this._recalcLabel();\n            return ((((s != this._tooltip)) || ((t != this._label))));\n        },\n        _getIncludedAudience: function() {\n            return this._elem.getAttribute(\"data-label\");\n        },\n        _getExcludedAudience: function() {\n            return \"\";\n        },\n        _getTagExpansionText: function() {\n            var s = this._getTagExpansionBehavior();\n            if (((!!this._taggedIDs.length || this._alreadyHasTags()))) {\n                if (((s == o.TagExpansion.FRIENDS_OF_TAGGEES))) {\n                    if (this._hasEvent) {\n                        return \"friends of anyone tagged, event guests\";\n                    }\n                ;\n                ;\n                    return \"friends of anyone tagged\";\n                }\n                 else if (((s == o.TagExpansion.TAGGEES))) {\n                    return \"Anyone tagged\";\n                }\n                \n            ;\n            ;\n                return \"\";\n            }\n        ;\n        ;\n            if (((this._hasEvent && ((s == o.TagExpansion.FRIENDS_OF_TAGGEES))))) {\n                return \"event guests\";\n            }\n        ;\n        ;\n            return \"\";\n        },\n        _getCombinedSentence: function(s, t) {\n            if (!t) {\n                return s;\n            }\n        ;\n        ;\n            return m._(\"{list of people who can see this}; Except: {list of people who cannot see this}\", [m.param(\"list of people who can see this\", s),m.param(\"list of people who cannot see this\", t),]);\n        },\n        _recalcLabel: function() {\n            this._label = this._elem.getAttribute(\"data-label\");\n            if (this._showPlusLabel()) {\n                this._label += \" (+)\";\n            }\n        ;\n        ;\n            j.conditionShow(this._plusLabel, this._showPlusLabel());\n        },\n        _showPlusLabel: function() {\n            var s = this._getTagExpansionBehavior();\n            return ((((!!this._taggedIDs.length && ((s != o.TagExpansion.NONE)))) || ((!!this._hasEvent && ((s == o.TagExpansion.FRIENDS_OF_TAGGEES))))));\n        },\n        _getTagExpansionBehavior: function() {\n            return o.TagExpansion.NONE;\n        },\n        _alreadyHasTags: function() {\n            var s = k.scry(this._selector, \"*[data-oid]\")[0];\n            s = ((s && s.getAttribute(\"data-oid\")));\n            return ((s && h.hasTags(s)));\n        },\n        _updateSelector: function() {\n            if (p.isOptionSelected(this._elem)) {\n                p.setButtonTooltip(this._selector, this._tooltip);\n                return false;\n            }\n        ;\n        ;\n            return true;\n        }\n    });\n    e.exports = r;\n});\n__d(\"CustomPrivacyOption\", [\"Arbiter\",\"AsyncDialog\",\"AsyncRequest\",\"BasePrivacyOption\",\"Class\",\"DOM\",\"JSBNG__Event\",\"Form\",\"PrivacyConst\",\"SelectorDeprecated\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"AsyncDialog\"), i = b(\"AsyncRequest\"), j = b(\"BasePrivacyOption\"), k = b(\"Class\"), l = b(\"DOM\"), m = b(\"JSBNG__Event\"), n = b(\"Form\"), o = b(\"PrivacyConst\"), p = b(\"SelectorDeprecated\"), q = b(\"copyProperties\");\n    function r(s, t, u, v, w, x, y, z, aa, ba, ca, da) {\n        if (!s) {\n            return;\n        }\n    ;\n    ;\n        this._baseAudienceValue = aa;\n        this._includedAudience = ba;\n        this._excludedAudience = ca;\n        this._tagExpansionBehavior = da;\n        (function() {\n            this.initCustomState(s, t, u);\n            m.listen(s, \"click\", function(JSBNG__event) {\n                this.openCustomDialog(JSBNG__event, t, v, x, y, z);\n            }.bind(this));\n            p.listen(this._selector, \"select\", function(ea) {\n                if (((ea.option._id != this._id))) {\n                    this.clearCustomState();\n                }\n            ;\n            ;\n            }.bind(this));\n            this.parent.construct(this, s);\n        }).bind(this).defer();\n    };\n;\n    k.extend(r, j);\n    q(r, {\n        _instances: {\n        },\n        update: function(s, t, u, v, w, x, y, z) {\n            var aa = r._instances[s];\n            aa._update(t, u)._updateOptionValues(w, x, y, z)._updateOption(u);\n            g.inform(\"Form/change\", {\n                node: aa._container\n            });\n        },\n        getData: function(s) {\n            return r._instances[s]._privacyData;\n        },\n        setPrivacyData: function(s, t, u) {\n            r._instances[s]._update(t, u);\n            r._instances[s]._updateOption(u);\n        }\n    });\n    q(r.prototype, {\n        _getChangedData: function() {\n            return {\n                hasEvent: this._hasEvent,\n                tags: this._taggedIDs,\n                privacy: this._baseAudienceValue\n            };\n        },\n        _updateOptionValues: function(s, t, u, v) {\n            this._baseAudienceValue = s;\n            this._includedAudience = t;\n            this._excludedAudience = u;\n            this._tagExpansionBehavior = v;\n            return this;\n        },\n        _updateOption: function(s) {\n            var t = ((p.getOption(this._selector, s) || p.getOption(this._selector, ((o.BaseValue.CUSTOM + \"\")))));\n            this._recalculateTooltipAndLabel();\n            g.inform(\"CustomPrivacyOption/update\", {\n                selector: this._selector,\n                option: t,\n                tooltip: this._tooltip,\n                label: this._label\n            });\n            return this;\n        },\n        _getIncludedAudience: function() {\n            return this._includedAudience;\n        },\n        _getExcludedAudience: function() {\n            return this._excludedAudience;\n        },\n        _getTagExpansionBehavior: function() {\n            return this._tagExpansionBehavior;\n        },\n        _update: function(s, t) {\n            var u = ((((t == o.BaseValue.CUSTOM)) || !p.getOption(this._selector, t))), v = this._selector.getAttribute(\"data-name\");\n            this.updateCustomState(s, u, v);\n            return this;\n        },\n        initCustomState: function(s, t, u) {\n            r._instances[t] = this;\n            this._container = l.JSBNG__find(s, \".customPrivacyInputs\");\n            this._id = u;\n            this._privacyData = {\n            };\n            var v = n.serialize(this._container);\n            if (v.audience) {\n                this._privacyData = v.audience[u];\n            }\n        ;\n        ;\n            return s;\n        },\n        openCustomDialog: function(JSBNG__event, s, t, u, v, w) {\n            var x = new i(\"/ajax/privacy/custom_dialog/\").setData({\n                option_id: s,\n                id: this._id,\n                privacy_data: this._privacyData,\n                explain_tags: t,\n                autosave: u,\n                limit_to_friends: v,\n                source: w\n            });\n            x.setRelativeTo(JSBNG__event.getTarget());\n            h.send(x);\n        },\n        updateCustomState: function(s, t, u) {\n            this.clearCustomState();\n            this._privacyData = q({\n            }, s);\n            if (t) {\n                if (u) {\n                    u = u.slice(0, -\"[value]\".length);\n                    var v = {\n                    };\n                    v[u] = s;\n                    n.createHiddenInputs(v, this._container, null, true);\n                }\n            ;\n            }\n        ;\n        ;\n        },\n        clearCustomState: function() {\n            this._privacyData = {\n            };\n            l.empty(this._container);\n        }\n    });\n    e.exports = r;\n});\n__d(\"DynamicIconSelector\", [\"Button\",\"CSS\",\"DOM\",\"SelectorDeprecated\",], function(a, b, c, d, e, f) {\n    var g = b(\"Button\"), h = b(\"CSS\"), i = b(\"DOM\"), j = b(\"SelectorDeprecated\"), k = {\n        swapIcon: function(l) {\n            var m = j.getSelectedOptions(l)[0], n = ((m && i.scry(m, \".itemIcon\")[0])), o = j.getSelectorButton(l);\n            if (n) {\n                g.setIcon(o, n.cloneNode(true));\n            }\n             else {\n                var p = i.scry(o, \".img\")[0];\n                ((p && i.remove(p)));\n            }\n        ;\n        ;\n            h.conditionClass(o, \"uiSelectorChevronOnly\", !n);\n        }\n    };\n    j.subscribe(\"change\", function(l, m) {\n        var n = m.selector;\n        if (h.hasClass(n, \"dynamicIconSelector\")) {\n            k.swapIcon(n);\n        }\n    ;\n    ;\n    });\n    e.exports = k;\n});\n__d(\"AudienceSelector\", [\"Arbiter\",\"AudienceSelectorTags\",\"CSS\",\"CustomPrivacyOption\",\"DOM\",\"DynamicIconSelector\",\"PrivacyConst\",\"SelectorDeprecated\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"AudienceSelectorTags\"), i = b(\"CSS\"), j = b(\"CustomPrivacyOption\"), k = b(\"DOM\"), l = b(\"DynamicIconSelector\"), m = b(\"PrivacyConst\"), n = b(\"SelectorDeprecated\"), o = {\n    };\n    n.subscribe(\"select\", function(q, r) {\n        if (!i.hasClass(r.selector, \"audienceSelector\")) {\n            return;\n        }\n    ;\n    ;\n        var s = n.getOptionValue(r.option);\n        r.value = s;\n        g.inform(\"AudienceSelector/changed\", r);\n        if (((((s == m.BaseValue.CUSTOM)) && !i.hasClass(r.option, \"noDialog\")))) {\n            n.toggle(r.selector);\n            return false;\n        }\n    ;\n    ;\n        if (i.hasClass(r.selector, \"dataTooltip\")) {\n            var t = k.JSBNG__find(r.option, \".itemAnchor\").getAttribute(\"data-tooltip\");\n            n.setButtonTooltip(r.selector, ((t || null)));\n        }\n    ;\n    ;\n        if (!i.hasClass(r.option, \"specialOption\")) {\n            return;\n        }\n    ;\n    ;\n        var u = k.JSBNG__find(r.option, \"a\").getAttribute(\"data-type\");\n        if (i.hasClass(r.option, \"moreOption\")) {\n            i.addClass(r.selector, u);\n            i.addClass(r.selector, \"showSecondaryOptions\");\n            return false;\n        }\n         else if (i.hasClass(r.option, \"returnOption\")) {\n            i.removeClass(r.selector, \"showSecondaryOptions\");\n            i.removeClass(r.selector, \"friendList\");\n            return false;\n        }\n        \n    ;\n    ;\n    });\n    var p = {\n        keepSynchronized: function(q, r) {\n            ((o[q] || (o[q] = {\n            })));\n            o[q][r.id] = r;\n        },\n        setHasTags: function(q) {\n            h.setHasTags(q);\n        }\n    };\n    g.subscribe(\"CustomPrivacyOption/update\", function(q, r) {\n        if (!i.hasClass(r.selector, \"audienceSelector\")) {\n            return;\n        }\n    ;\n    ;\n        n.setSelected(r.selector, n.getOptionValue(r.option));\n        l.swapIcon(r.selector);\n        n.setButtonLabel(r.selector, r.label);\n        n.setButtonTooltip(r.selector, r.tooltip);\n        g.inform(\"AudienceSelector/update\", r);\n    });\n    g.subscribe([\"AudienceSelector/changed\",\"AudienceSelector/update\",], function(JSBNG__event, q) {\n        var r = n.getOptionValue(q.option), s = {\n        };\n        if (((r == m.BaseValue.CUSTOM))) {\n            if (((JSBNG__event == \"AudienceSelector/changed\"))) {\n                return;\n            }\n        ;\n        ;\n            s = j.getData(q.option.id);\n        }\n    ;\n    ;\n        {\n            var fin197keys = ((window.top.JSBNG_Replay.forInKeys)((o))), fin197i = (0);\n            var t;\n            for (; (fin197i < fin197keys.length); (fin197i++)) {\n                ((t) = (fin197keys[fin197i]));\n                {\n                    var u = o[t];\n                    if (u[q.selector.id]) {\n                        g.inform(\"AudienceSelector/syncNonSelectorIcon\", {\n                            category: t\n                        });\n                        {\n                            var fin198keys = ((window.top.JSBNG_Replay.forInKeys)((u))), fin198i = (0);\n                            var v;\n                            for (; (fin198i < fin198keys.length); (fin198i++)) {\n                                ((v) = (fin198keys[fin198i]));\n                                {\n                                    var w = u[v];\n                                    if (((!w || ((q.selector === w))))) {\n                                        continue;\n                                    }\n                                ;\n                                ;\n                                    if (((n.getValue(w) !== r))) {\n                                        n.setSelected(w, r);\n                                        l.swapIcon(w);\n                                    }\n                                ;\n                                ;\n                                    if (((r == m.BaseValue.CUSTOM))) {\n                                        var x = n.getOption(w, ((m.BaseValue.CUSTOM + \"\")));\n                                        if (x) {\n                                            j.setPrivacyData(x.id, s, r);\n                                            n.setButtonTooltip(w, q.tooltip);\n                                        }\n                                    ;\n                                    ;\n                                    }\n                                ;\n                                ;\n                                };\n                            };\n                        };\n                    ;\n                    }\n                ;\n                ;\n                };\n            };\n        };\n    ;\n    });\n    e.exports = p;\n});\n__d(\"ErrorDialog\", [\"Dialog\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"Dialog\"), h = b(\"emptyFunction\"), i = {\n        showAsyncError: function(j) {\n            try {\n                return i.show(j.getErrorSummary(), j.getErrorDescription());\n            } catch (k) {\n                JSBNG__alert(j);\n            };\n        ;\n        },\n        show: function(j, k, l, m) {\n            return (new g()).setTitle(j).setBody(k).setButtons([g.OK,]).setStackable(true).setModal(true).setHandler(((l || h))).setButtonsMessage(((m || \"\"))).show();\n        }\n    };\n    e.exports = i;\n});\n__d(\"Tour\", [\"Arbiter\",\"LayerDestroyOnHide\",\"LayerHideOnEscape\",\"copyProperties\",\"NavigationMessage\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"LayerDestroyOnHide\"), i = b(\"LayerHideOnEscape\"), j = b(\"copyProperties\"), k = b(\"NavigationMessage\");\n    function l() {\n        if (l._instance) {\n            l._instance.setTourComplete();\n        }\n    ;\n    ;\n        l._instance = this;\n    };\n;\n    j(l.prototype, {\n        tourStarted: false,\n        tourComplete: false,\n        _navigationBeginToken: null,\n        _pageLeaveToken: null,\n        steps: {\n        },\n        JSBNG__openDialog: null,\n        init: function() {\n            this._pageLeaveToken = g.subscribe(\"onload/exit\", this.handleLeavePage.bind(this));\n            this._navigationBeginToken = g.subscribe(k.NAVIGATION_BEGIN, this.handleTransition.bind(this));\n            this.steps = {\n            };\n            return this;\n        },\n        registerStep: function(m, n) {\n            m.disableBehavior(h);\n            m.disableBehavior(i);\n            this.steps[n] = m;\n            m.subscribe(\"show\", function() {\n                m.inform(\"tour-dialog-show\", m);\n            });\n            if (!this.getTourStarted()) {\n                this.setTourStart();\n            }\n        ;\n        ;\n        },\n        _unsubscribeSubscriptions: function() {\n            this._navigationBeginToken.unsubscribe();\n            this._pageLeaveToken.unsubscribe();\n        },\n        handleLeavePage: function() {\n            this._unsubscribeSubscriptions();\n        },\n        handleTransition: function() {\n            this._unsubscribeSubscriptions();\n        },\n        handleTourStart: function() {\n        \n        },\n        handleTourStop: function() {\n        \n        },\n        handleTourComplete: function() {\n        \n        },\n        showStep: function(m) {\n            var n = this.steps[m];\n            if (!((this.JSBNG__openDialog == n))) {\n                this.hideOpenDialog();\n            }\n        ;\n        ;\n            if (!n) {\n                return;\n            }\n        ;\n        ;\n            this.JSBNG__openDialog = n;\n            n.show();\n        },\n        hideOpenDialog: function() {\n            if (this.JSBNG__openDialog) {\n                this.JSBNG__openDialog.hide();\n                this.JSBNG__openDialog = null;\n            }\n        ;\n        ;\n        },\n        getTourStarted: function() {\n            return this.tourStarted;\n        },\n        setTourStart: function() {\n            this.tourStarted = true;\n            this.handleTourStart();\n        },\n        setTourStop: function() {\n            this.tourStarted = false;\n            this.hideOpenDialog();\n            this.handleTourStop();\n        },\n        setTourComplete: function() {\n            if (this.tourComplete) {\n                return;\n            }\n        ;\n        ;\n            this.setTourStop();\n            this.tourComplete = true;\n            this.handleTourComplete();\n        },\n        hideStep: function(m) {\n            var n = this.steps[m];\n            ((n && n.hide()));\n        }\n    });\n    j(l, {\n        getInstance: function() {\n            return ((l._instance || (l._instance = new l())));\n        }\n    });\n    e.exports = l;\n});\n__d(\"FutureSideNavItem\", [\"Arbiter\",\"CSS\",\"DOM\",\"Parent\",\"$\",\"copyProperties\",\"createArrayFrom\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"CSS\"), i = b(\"DOM\"), j = b(\"Parent\"), k = b(\"$\"), l = b(\"copyProperties\"), m = b(\"createArrayFrom\");\n    function n(o, p) {\n        this.id = o.id;\n        this.up = p;\n        this.endpoint = o.endpoint;\n        this.type = o.type;\n        this.node = ((o.node || k(o.id)));\n        this.paths = ((o.path ? m(o.path) : []));\n        this.keys = ((o.key ? m(o.key) : []));\n        var q = this._findKeys(this.keys);\n        this.numericKey = ((q.numeric || this.keys[0]));\n        this.textKey = ((q.text || this.keys[0]));\n        this._pathPattern = this._buildRegex(this.paths);\n        this._keyPattern = this._buildRegex(this.keys);\n        this.hideLoading();\n        this.hideSelected();\n    };\n;\n    l(n.prototype, {\n        equals: function(o) {\n            return ((o && ((o.id === this.id))));\n        },\n        getLinkNode: function() {\n            return ((i.scry(this.node, \"a.item\")[0] || i.scry(this.node, \"a.subitem\")[0]));\n        },\n        matchPath: function(o) {\n            return this._matchInput(this._pathPattern, o);\n        },\n        matchKey: function(o) {\n            return this._matchInput(this._keyPattern, o);\n        },\n        _matchInput: function(o, p) {\n            var q = ((o && o.exec(p)));\n            return ((q && q.slice(1)));\n        },\n        getTop: function() {\n            return ((this.isTop() ? this : this.up.getTop()));\n        },\n        isTop: function(o) {\n            return !this.up;\n        },\n        setCount: function(o, p) {\n            return this._updateCount(o, true);\n        },\n        incrementCount: function(o, p) {\n            return this._updateCount(o, false);\n        },\n        _updateCount: function(o, p, q) {\n            var r = i.scry(this.node, \"span.count\")[0], s = ((r && i.scry(r, \"span.countValue\")[0]));\n            if (s) {\n                var t = ((p ? 0 : parseInt(i.getText(s), 10))), u = Math.max(0, ((t + o))), v = ((this.isTop() ? \"hidden\" : \"hiddenSubitem\"));\n                i.setContent(s, u);\n                ((q && h.conditionClass(this.node, v, !u)));\n                h.conditionClass(r, \"hidden_elem\", !u);\n                if (this.isTop()) {\n                    var w = i.scry(this.node, \"div.linkWrap\")[0];\n                    if (w) {\n                        h.conditionClass(w, \"noCount\", !u);\n                        h.conditionClass(w, \"hasCount\", u);\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            g.inform(\"NavigationMessage.COUNT_UPDATE_DONE\");\n        },\n        showLoading: function() {\n            h.addClass(this.node, \"loading\");\n        },\n        hideLoading: function() {\n            h.removeClass(this.node, \"loading\");\n        },\n        showSelected: function() {\n            h.addClass(this.node, \"selectedItem\");\n            ((h.hasClass(this.node, \"hider\") && h.addClass(this._getExpanderParent(), \"expandedMode\")));\n        },\n        hideSelected: function() {\n            h.removeClass(this.node, \"selectedItem\");\n        },\n        showChildren: function() {\n            h.addClass(this.node, \"open\");\n        },\n        hideChildren: function() {\n            h.removeClass(this.node, \"open\");\n        },\n        _getExpanderParent: function() {\n            return j.byClass(this.node, \"expandableSideNav\");\n        },\n        _buildRegex: function(o) {\n            if (o.length) {\n                var p = o.map(function(q) {\n                    if (((typeof q === \"string\"))) {\n                        return q.replace(/([^a-z0-9_])/gi, \"\\\\$1\");\n                    }\n                     else if (((q && q.regex))) {\n                        return q.regex;\n                    }\n                    \n                ;\n                ;\n                });\n                return new RegExp(((((\"^(?:\" + p.join(\"|\"))) + \")$\")));\n            }\n        ;\n        ;\n        },\n        _findKeys: function(o) {\n            var p = /^(app|group|fl)_/, q = {\n            };\n            for (var r = 0; ((r < o.length)); r++) {\n                var s = p.test(o[r]);\n                if (((s && !q.numeric))) {\n                    q.numeric = o[r];\n                }\n                 else if (((!s && !q.text))) {\n                    q.text = o[r];\n                }\n                \n            ;\n            ;\n                if (((q.numeric && q.text))) {\n                    break;\n                }\n            ;\n            ;\n            };\n        ;\n            return q;\n        }\n    });\n    e.exports = n;\n});\n__d(\"FutureSideNavSection\", [\"Bootloader\",\"DOMQuery\",\"$\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Bootloader\"), h = b(\"DOMQuery\"), i = b(\"$\"), j = b(\"copyProperties\");\n    function k(l) {\n        this.id = l.id;\n        this.node = ((this.node || i(l.id)));\n        this.editEndpoint = l.editEndpoint;\n    };\n;\n    j(k.prototype, {\n        equals: function(l) {\n            return ((l && ((l.id === this.id))));\n        },\n        getEditorAsync: function(l) {\n            g.loadModules([\"SortableSideNav\",], function(m) {\n                var n = new m(h.JSBNG__find(this.node, \"ul.uiSideNav\"), this.editEndpoint);\n                l(n);\n            }.bind(this));\n        }\n    });\n    e.exports = k;\n});\n__d(\"FutureSideNav\", [\"Arbiter\",\"Bootloader\",\"ChannelConstants\",\"CSS\",\"DOM\",\"JSBNG__Event\",\"FutureSideNavItem\",\"FutureSideNavSection\",\"NavigationMessage\",\"PageTransitions\",\"Parent\",\"Run\",\"SelectorDeprecated\",\"URI\",\"UserAgent\",\"Vector\",\"copyProperties\",\"createArrayFrom\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"Bootloader\"), i = b(\"ChannelConstants\"), j = b(\"CSS\"), k = b(\"DOM\"), l = b(\"JSBNG__Event\"), m = b(\"FutureSideNavItem\"), n = b(\"FutureSideNavSection\"), o = b(\"NavigationMessage\"), p = b(\"PageTransitions\"), q = b(\"Parent\"), r = b(\"Run\"), s = b(\"SelectorDeprecated\"), t = b(\"URI\"), u = b(\"UserAgent\"), v = b(\"Vector\"), w = b(\"copyProperties\"), x = b(\"createArrayFrom\");\n    function y() {\n        ((y.instance && y.instance.uninstall()));\n        y.instance = this;\n    };\n;\n    y.instance = null;\n    y.getInstance = function() {\n        return ((y.instance || new y()));\n    };\n    w(y.prototype, {\n        init: function(z, aa, ba) {\n            this.root = z;\n            this.items = {\n            };\n            this.sections = {\n            };\n            this.editor = null;\n            this.editing = false;\n            this.selected = null;\n            this.loading = null;\n            this.keyParam = \"sk\";\n            this.defaultKey = aa;\n            this.uri = t.getRequestURI();\n            this.ajaxPipe = ba;\n            this.ajaxPipeEndpoints = {\n            };\n            this.sidecol = true;\n            this._installed = true;\n            this._handlePageTransitions = true;\n            p.registerHandler(function(ca) {\n                return ((this._handlePageTransitions && this.handlePageTransition(ca)));\n            }.bind(this));\n            this._eventHandlers = [];\n            this._arbiterSubscriptions = [g.subscribe(o.NAVIGATION_COMPLETED, this.navigationComplete.bind(this)),g.subscribe(o.NAVIGATION_FAILED, this.navigationFailed.bind(this)),g.subscribe(o.NAVIGATION_COUNT_UPDATE, this.navigationCountUpdate.bind(this)),g.subscribe(o.NAVIGATION_SELECT, this.navigationSelect.bind(this)),g.subscribe(i.getArbiterType(\"nav_update_counts\"), this.navigationCountUpdateFromPresence.bind(this)),];\n            this._explicitHover = [];\n            this._ensureHover(\"sideNavItem\");\n            this._eventHandlers.push(l.listen(window, \"resize\", this._handleResize.bind(this)));\n            this._checkNarrow();\n            this._selectorSubscriptions = [];\n            ((window.Selector && this._selectorSubscriptions.push(s.subscribe([\"open\",\"close\",], function(ca, da) {\n                var ea = q.byClass(da.selector, \"sideNavItem\");\n                ((ea && j.conditionClass(ea, \"editMenuOpened\", ((ca === \"open\")))));\n            }))));\n            r.onLeave(this.uninstall.bind(this));\n            if (this._pendingSections) {\n                this._pendingSections.forEach(function(ca) {\n                    this.initSection.apply(this, ca);\n                }.bind(this));\n            }\n        ;\n        ;\n        },\n        _handleResize: (function() {\n            var z;\n            return function() {\n                ((z && JSBNG__clearTimeout(z)));\n                z = this._checkNarrow.bind(this).defer(200);\n            };\n        })(),\n        _checkNarrow: function() {\n            j.conditionClass(this.root, \"uiNarrowSideNav\", ((v.getElementPosition(this.root).x < 20)));\n        },\n        _ensureHover: function(z) {\n            if (((u.ie() < 8))) {\n                h.loadModules([\"ExplicitHover\",], function(aa) {\n                    this._explicitHover.push(new aa(this.root, z));\n                }.bind(this));\n            }\n        ;\n        ;\n        },\n        uninstall: function() {\n            if (this._installed) {\n                this._installed = false;\n                this._handlePageTransitions = false;\n                this._arbiterSubscriptions.forEach(g.unsubscribe);\n                this._selectorSubscriptions.forEach(function(z) {\n                    s.unsubscribe(z);\n                });\n                this._eventHandlers.forEach(function(z) {\n                    z.remove();\n                });\n                this._explicitHover.forEach(function(z) {\n                    z.uninstall();\n                });\n            }\n        ;\n        ;\n        },\n        initSection: function(z, aa) {\n            if (!this._installed) {\n                this._pendingSections = ((this._pendingSections || []));\n                this._pendingSections.push(arguments);\n                return;\n            }\n        ;\n        ;\n            this._initItems(aa);\n            this._initSection(z);\n        },\n        addItem: function(z, aa) {\n            this._initItem(z, aa);\n        },\n        _initItems: function(z) {\n            var aa = function(ba, ca) {\n                var da = this._initItem(ba, ca);\n                if (ba.children) {\n                    ba.children.forEach(function(ea) {\n                        aa(ea, da);\n                    });\n                }\n            ;\n            ;\n            }.bind(this);\n            x(z).forEach(function(ba) {\n                aa(ba, null);\n            });\n        },\n        _initItem: function(z, aa) {\n            var ba = this.items[z.id] = this._constructItem(z, aa);\n            if (((ba.equals(this.selected) || z.selected))) {\n                this.setSelected(ba);\n            }\n        ;\n        ;\n            var ca = ba.getLinkNode();\n            ((ca && this._eventHandlers.push(l.listen(ca, \"click\", function(JSBNG__event) {\n                return !this.editing;\n            }.bind(this)))));\n            return ba;\n        },\n        _initSection: function(z) {\n            var aa = this.sections[z.id] = this._constructSection(z);\n            this._eventHandlers.push(l.listen(aa.node, \"click\", this.handleSectionClick.bind(this, aa)));\n            k.scry(aa.node, \"div.bookmarksMenuButton\").forEach(j.show);\n            return aa;\n        },\n        _constructItem: function(z, aa) {\n            return new m(z, aa);\n        },\n        _constructSection: function(z) {\n            return new n(z);\n        },\n        handleSectionClick: function(z, JSBNG__event) {\n            var aa = this._getEventTarget(JSBNG__event, \"a\"), ba = this._getItemForNode(aa);\n            if (!aa) {\n                return;\n            }\n             else if (j.hasClass(aa.parentNode, \"uiMenuItem\")) {\n                this._handleMenuClick(z, ba, aa.parentNode, JSBNG__event);\n            }\n             else this._handleLinkClick(z, aa, JSBNG__event);\n            \n        ;\n        ;\n        },\n        _getEventTarget: function(JSBNG__event, z) {\n            var aa = JSBNG__event.getTarget();\n            if (((aa.tagName !== z.toUpperCase()))) {\n                return q.byTag(aa, z);\n            }\n             else return aa\n        ;\n        },\n        _handleMenuClick: function(z, aa, ba, JSBNG__event) {\n            if (j.hasClass(ba, \"rearrange\")) {\n                this.beginEdit(z);\n            }\n        ;\n        ;\n        },\n        _handleLinkClick: function(z, aa, JSBNG__event) {\n            if (j.hasClass(aa, \"navEditDone\")) {\n                ((this.editing ? this.endEdit() : this.beginEdit(z)));\n                JSBNG__event.kill();\n            }\n        ;\n        ;\n        },\n        getItem: function(z) {\n            if (this._isCurrentPath(z)) {\n                return this._getItemForKey(((this._getKey(z.getQueryData()) || this.defaultKey)));\n            }\n             else return this._getItemForPath(z.getPath())\n        ;\n        },\n        getNodeForKey: function(z) {\n            var aa = this._getItemForKey(z);\n            if (aa) {\n                return aa.node;\n            }\n        ;\n        ;\n        },\n        _isCurrentPath: function(z) {\n            return ((((z.getDomain() === this.uri.getDomain())) && ((z.getPath() === this.uri.getPath()))));\n        },\n        _getKey: function(z) {\n            return z[this.keyParam];\n        },\n        _getItemForNode: function(z) {\n            z = q.byClass(z, \"sideNavItem\");\n            return ((z && this.items[z.id]));\n        },\n        _getItemForKey: function(z) {\n            return this._findItem(function(aa) {\n                return aa.matchKey(z);\n            });\n        },\n        _getItemForPath: function(z) {\n            return this._findItem(function(aa) {\n                return aa.matchPath(z);\n            });\n        },\n        _findItem: function(z) {\n            {\n                var fin199keys = ((window.top.JSBNG_Replay.forInKeys)((this.items))), fin199i = (0);\n                var aa;\n                for (; (fin199i < fin199keys.length); (fin199i++)) {\n                    ((aa) = (fin199keys[fin199i]));\n                    {\n                        if (z(this.items[aa])) {\n                            return this.items[aa];\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n        },\n        removeItem: function(z) {\n            if (((z && this.items[z.id]))) {\n                k.remove(z.node);\n                delete this.items[z.id];\n            }\n        ;\n        ;\n        },\n        removeItemByKey: function(z) {\n            this.removeItem(this._getItemForKey(z));\n        },\n        moveItem: function(z, aa, ba) {\n            var ca = k.JSBNG__find(z.node, \"ul.uiSideNav\");\n            ((ba ? k.prependContent : k.appendContent))(ca, aa.node);\n        },\n        setLoading: function(z) {\n            ((this.loading && this.loading.hideLoading()));\n            this.loading = z;\n            ((this.loading && this.loading.showLoading()));\n        },\n        setSelected: function(z) {\n            this.setLoading(null);\n            if (this.selected) {\n                this.selected.hideSelected();\n                this.selected.getTop().hideChildren();\n            }\n        ;\n        ;\n            this.selected = z;\n            if (this.selected) {\n                this.selected.showSelected();\n                this.selected.getTop().showChildren();\n            }\n        ;\n        ;\n        },\n        handlePageTransition: function(z) {\n            var aa = this.getItem(z), ba = ((((aa && aa.endpoint)) && this._doPageTransition(aa, z)));\n            return ba;\n        },\n        _doPageTransition: function(z, aa) {\n            this.setLoading(z);\n            this._sendPageTransition(z.endpoint, w(this._getTransitionData(z, aa), aa.getQueryData()));\n            return true;\n        },\n        _sendPageTransition: function(z, aa) {\n            aa.endpoint = z;\n            g.inform(o.NAVIGATION_BEGIN, {\n                useAjaxPipe: this._useAjaxPipe(z),\n                params: aa\n            });\n        },\n        _getTransitionData: function(z, aa) {\n            var ba = {\n            };\n            ba.sidecol = this.sidecol;\n            ba.path = aa.getPath();\n            ba[this.keyParam] = z.textKey;\n            ba.key = z.textKey;\n            return ba;\n        },\n        _useAjaxPipe: function(z) {\n            return ((this.ajaxPipe || this.ajaxPipeEndpoints[z]));\n        },\n        navigationComplete: function() {\n            ((this.loading && this.setSelected(this.loading)));\n        },\n        navigationFailed: function() {\n            this.setLoading(null);\n        },\n        navigationSelect: function(z, aa) {\n            var ba = this._getItemForKey(this._getKey(aa));\n            if (aa.asLoading) {\n                this.setLoading(ba);\n            }\n             else this.setSelected(ba);\n        ;\n        ;\n        },\n        navigationCountUpdate: function(z, aa) {\n            var ba = this._getItemForKey(((aa && aa.key)));\n            if (ba) {\n                if (((typeof aa.count !== \"undefined\"))) {\n                    ba.setCount(aa.count, aa.hide);\n                }\n                 else if (((typeof aa.increment !== \"undefined\"))) {\n                    ba.incrementCount(aa.increment, aa.hide);\n                }\n                \n            ;\n            }\n        ;\n        ;\n        },\n        navigationCountUpdateFromPresence: function(z, aa) {\n            aa = aa.obj;\n            if (aa) {\n                if (((!aa.class_name || ((aa.class_name && j.hasClass(this.root, aa.class_name)))))) {\n                    if (aa.items) {\n                        for (var ba = 0; ((ba < aa.items.length)); ba++) {\n                            this.navigationCountUpdate(z, aa.items[ba]);\n                        ;\n                        };\n                    }\n                ;\n                }\n            ;\n            }\n        ;\n        ;\n        },\n        beginEdit: function(z) {\n            if (!this.editing) {\n                this.editing = true;\n                j.addClass(this.root, \"editMode\");\n                this._updateTrackingData();\n                this._initEditor(z);\n            }\n        ;\n        ;\n        },\n        endEdit: function() {\n            if (this.editing) {\n                j.removeClass(this.root, \"editMode\");\n                ((this.editor && this.editor.endEdit()));\n                this.editor = null;\n                this.editing = false;\n                this._updateTrackingData();\n            }\n        ;\n        ;\n        },\n        _updateTrackingData: function(z) {\n            var aa = ((this.root.getAttribute(\"data-gt\") || \"{}\"));\n            try {\n                aa = JSON.parse(aa);\n                if (this.editing) {\n                    aa.editing = true;\n                }\n                 else delete aa.editing;\n            ;\n            ;\n                this.root.setAttribute(\"data-gt\", JSON.stringify(aa));\n            } catch (ba) {\n            \n            };\n        ;\n        },\n        _initEditor: function(z) {\n            z.getEditorAsync(function(aa) {\n                if (this.editing) {\n                    this.editor = aa;\n                    this.editor.beginEdit();\n                }\n            ;\n            ;\n            }.bind(this));\n        }\n    });\n    e.exports = y;\n});\n__d(\"PageFanning\", [\"Animation\",\"AsyncRequest\",\"CSS\",\"DOM\",\"FutureSideNav\",\"Parent\",\"URI\",\"$\",\"collectDataAttributes\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Animation\"), h = b(\"AsyncRequest\"), i = b(\"CSS\"), j = b(\"DOM\"), k = b(\"FutureSideNav\"), l = b(\"Parent\"), m = b(\"URI\"), n = b(\"$\"), o = b(\"collectDataAttributes\"), p = b(\"copyProperties\"), q = {\n        setFanStatus: function(s, t, u, v, w, x, y) {\n            var z = {\n                ft: {\n                }\n            };\n            if (s) {\n                z = {\n                    ft: o(s, [\"ft\",]).ft\n                };\n            }\n        ;\n        ;\n            w = ((w || function(ca) {\n                var da = ca.getPayload();\n                if (((!da || !s))) {\n                    return;\n                }\n            ;\n            ;\n                if (da.reload) {\n                    q.reloadOnFanStatusChanged(da.preserve_tab);\n                }\n                 else r(s, da);\n            ;\n            ;\n            }));\n            var aa = {\n                fbpage_id: t,\n                add: u,\n                reload: v\n            };\n            if (((y != null))) {\n                p(aa, y);\n            }\n        ;\n        ;\n            p(aa, z);\n            var ba = new h().setURI(\"/ajax/pages/fan_status.php\").setData(aa).setNectarModuleDataSafe(s).setHandler(w);\n            if (x) {\n                ba.setErrorHandler(x);\n            }\n        ;\n        ;\n            ba.send();\n            return false;\n        },\n        reloadOnFanStatusChanged: function(s) {\n            var t = m.getRequestURI();\n            if (s) {\n                var u = k.getInstance().selected.textKey;\n                if (((!t.getQueryData().sk && u))) {\n                    t.addQueryData({\n                        sk: u\n                    });\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            window.JSBNG__location.href = t;\n        },\n        toggleLikeOnFanStatusChanged: function(s, t) {\n            var u = n(((\"liked_pages_like_action_\" + s))), v = n(((\"liked_pages_undo_action_\" + s)));\n            i.conditionClass(u, \"hidden_elem\", t);\n            i.conditionClass(v, \"hidden_elem\", !t);\n        },\n        informPageLikeButtonOnChange: function(s, t) {\n            var u = a.PageLikeButton;\n            if (u) {\n                if (t) {\n                    u.informLike(s);\n                    u.informLikeSuccess(s);\n                }\n                 else u.informUnlike(s);\n            ;\n            }\n        ;\n        ;\n        }\n    };\n    function r(s, t) {\n        var u = t.feedback;\n        if (!u) {\n            return;\n        }\n    ;\n    ;\n        if (l.byClass(s, \"fbTimelineEscapeSectionItem\")) {\n            s = ((l.byClass(s, \"fan_status_inactive\") || s));\n        }\n    ;\n    ;\n        var v = j.create(\"span\", {\n            className: \"fan_status_inactive\"\n        }, u);\n        s.parentNode.replaceChild(v, s);\n        var w = function() {\n            if (t.can_repeat_action) {\n                v.parentNode.replaceChild(s, v);\n            }\n        ;\n        ;\n        };\n        new g(v).duration(3000).checkpoint().to(\"backgroundColor\", \"#FFFFFF\").duration(1000).ondone(w).go();\n    };\n;\n    e.exports = q;\n});\n__d(\"PageLikeButton\", [\"Arbiter\",\"AsyncRequest\",\"AsyncResponse\",\"JSBNG__Event\",\"PageFanning\",\"SubscribeButton\",\"Tour\",\"URI\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"AsyncRequest\"), i = b(\"AsyncResponse\"), j = b(\"JSBNG__Event\"), k = b(\"PageFanning\"), l = b(\"SubscribeButton\"), m = b(\"Tour\"), n = b(\"URI\"), o = {\n        LIKED: \"liked\",\n        UNLIKED: \"unliked\",\n        LIKED_SUCCESS: \"liked_success\",\n        init: function(r, s, t, u, v, w, x, y, z, aa, ba) {\n            g.subscribe(o.LIKED, function(ca, da) {\n                if (((u === da.profile_id))) {\n                    if (!z) {\n                        t.suppressNextMouseEnter();\n                    }\n                ;\n                ;\n                    r.swap(ba);\n                    if (((aa === true))) {\n                        new h().setURI(\"/ajax/pages/suggestions_on_liking.php\").setData({\n                            pageid: u\n                        }).send();\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n            });\n            g.subscribe(o.UNLIKED, function(ca, da) {\n                if (((u === da.profile_id))) {\n                    r.unswap(ba);\n                    t.hideFlyout();\n                }\n            ;\n            ;\n            });\n            if (y) {\n                g.subscribe(o.LIKED_SUCCESS, function(ca, da) {\n                    var ea = n.getRequestURI().getQueryData().app_data;\n                    if (((da.profile_id == u))) {\n                        new h().setURI(\"/ajax/pages/fetch_app_column.php\").setData({\n                            profile_id: u,\n                            tab_key: y,\n                            app_data: ea\n                        }).send();\n                    }\n                ;\n                ;\n                });\n            }\n        ;\n        ;\n            j.listen(s, \"click\", q.bind(null, u, v, w, x));\n        },\n        initCallout: function(r, s) {\n            var t = JSBNG__document.getElementById(\"pageActionLikeCalloutButton\");\n            j.listen(t, \"click\", q.bind(null, r, s, null, null));\n        },\n        initUnlike: function(r, s, t) {\n            j.listen(r, \"click\", function(JSBNG__event) {\n                p(JSBNG__event.getTarget(), s, false, function(u) {\n                    g.inform(o.LIKED, {\n                        profile_id: s\n                    });\n                    i.defaultErrorHandler(u);\n                }, t);\n                o.informUnlike(s);\n            });\n        },\n        informLike: function(r, s, t) {\n            var u = {\n                profile_id: r,\n                target: s,\n                origin: t\n            };\n            g.inform(o.LIKED, u);\n            g.inform(l.SUBSCRIBED, u);\n        },\n        informLikeSuccess: function(r) {\n            var s = {\n                profile_id: r\n            };\n            g.inform(o.LIKED_SUCCESS, s);\n        },\n        informUnlike: function(r) {\n            var s = {\n                profile_id: r\n            };\n            g.inform.bind(g, o.UNLIKED, s).defer();\n            g.inform.bind(g, l.UNSUBSCRIBED, s).defer();\n        }\n    };\n    function p(r, s, t, u, v, w, x) {\n        m.getInstance().hideStep(\"low_page_likes\");\n        k.setFanStatus(r, s, t, false, function() {\n            o.informLikeSuccess(s);\n        }, u, {\n            fan_origin: v,\n            fan_source: w,\n            cat: x\n        });\n    };\n;\n    function q(r, s, t, u, JSBNG__event) {\n        p(JSBNG__event.getTarget(), r, true, function(v) {\n            g.inform(o.UNLIKED, {\n                profile_id: r\n            });\n            i.defaultErrorHandler(v);\n        }, s, t, u);\n        o.informLike(r, JSBNG__event.getTarget(), s);\n    };\n;\n    e.exports = o;\n    a.PageLikeButton = o;\n});\n__d(\"legacy:PageLikeButton\", [\"PageLikeButton\",], function(a, b, c, d) {\n    a.PageLikeButton = b(\"PageLikeButton\");\n}, 3);\n__d(\"legacy:AudienceSelector\", [\"AudienceSelector\",], function(a, b, c, d) {\n    b(\"AudienceSelector\");\n}, 3);\n__d(\"FriendListPrivacyOptions\", [\"Arbiter\",\"AsyncDialog\",\"AsyncRequest\",\"Dialog\",\"DOMQuery\",\"PageTransitions\",\"Parent\",\"SelectorDeprecated\",\"$\",\"ge\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"AsyncDialog\"), i = b(\"AsyncRequest\"), j = b(\"Dialog\"), k = b(\"DOMQuery\"), l = b(\"PageTransitions\"), m = b(\"Parent\"), n = b(\"SelectorDeprecated\"), o = b(\"$\"), p = b(\"ge\"), q = false, r = false, s = null, t = {\n    }, u = function(w) {\n        if (!Object.keys(t).length) {\n            l.registerHandler(function() {\n                t = {\n                };\n                q = false;\n                r = false;\n            });\n        }\n    ;\n    ;\n        var x = w.getAttribute(\"data-name\");\n        t[x] = w;\n        n.listen(w, \"select\", function(y) {\n            var z = y.option, aa = k.JSBNG__find(z, \"a.itemAnchor\"), ba = aa.getAttribute(\"data-flid\");\n            if (!ba) {\n                return;\n            }\n        ;\n        ;\n            var ca = aa.getAttribute(\"data-dynamic\");\n            if (((ca && q))) {\n                v.showSmartListNux(z, ba);\n            }\n             else if (((!ca && r))) {\n                v.showDumbListNux([ba,]);\n            }\n            \n        ;\n        ;\n        });\n    }, v = {\n        listen: function(w, x, y) {\n            var z = p(w);\n            if (!z) {\n                return;\n            }\n        ;\n        ;\n            var aa = m.byClass(z, \"audienceSelector\");\n            if (aa) {\n                u(aa);\n                q = x;\n                r = y;\n            }\n        ;\n        ;\n        },\n        showSmartListNux: function(w, x) {\n            w = o(w);\n            new i(\"/ajax/friends/lists/smart_list_publish_nux.php\").setData({\n                option_id: w.id,\n                flid: x\n            }).send();\n            q = false;\n        },\n        setContextualDialog: function(w, x) {\n            x = o(x);\n            var y = m.byClass(x, \"audienceSelector\");\n            if (y) {\n                w.setContext(y);\n                w.show();\n                var z = g.subscribe(\"composer/publish\", function() {\n                    w.hide();\n                });\n                w.subscribe(\"hide\", function() {\n                    z.unsubscribe();\n                });\n            }\n        ;\n        ;\n        },\n        showDumbListNux: function(w) {\n            h.send(new i(\"/ajax/friends/lists/dumb_list_publish_nux.php\").setData({\n                flids: w\n            }));\n            r = false;\n        },\n        showBothListsNux: function(w, x) {\n            s = o(w);\n            v.showDumbListNux(x);\n        },\n        setDialogX: function(w) {\n            if (!s) {\n                return;\n            }\n        ;\n        ;\n            w.subscribe(\"hide\", function() {\n                v.showSmartListNux(s);\n                s = null;\n            });\n        },\n        setDialog: function() {\n            if (!s) {\n                return;\n            }\n        ;\n        ;\n            var w = j.getCurrent();\n            if (w) {\n                w.setCloseHandler(function() {\n                    v.showSmartListNux(s);\n                    s = null;\n                });\n            }\n        ;\n        ;\n        }\n    };\n    e.exports = v;\n});\n__d(\"FriendsMinusAcquaintancesPrivacyOption\", [\"AudienceSelectorTags\",\"BasePrivacyOption\",\"Class\",\"DOM\",\"PrivacyConst\",\"copyProperties\",\"fbt\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"AudienceSelectorTags\"), h = b(\"BasePrivacyOption\"), i = b(\"Class\"), j = b(\"DOM\"), k = b(\"PrivacyConst\"), l = k.FriendsValue, m = b(\"copyProperties\"), n = b(\"fbt\"), o = b(\"tx\");\n    function p(q, r) {\n        this._hasRestricted = r;\n        this.parent.construct(this, q);\n    };\n;\n    i.extend(p, h);\n    m(p.prototype, {\n        _getChangedData: function() {\n            return {\n                hasEvent: this._hasEvent,\n                tags: this._taggedIDs,\n                privacy: l.FRIENDS_MINUS_ACQUAINTANCES\n            };\n        },\n        _recalculateTooltipAndLabel: function() {\n            var q = this._hasEvent, r = this._tags.length, s = this._tooltip, t = this._label;\n            if (q) {\n                if (((((r > 1)) || this._alreadyHasTags()))) {\n                    this._tooltip = ((this._hasRestricted ? \"Your friends, friends of anyone tagged and event guests; Except: Acquaintances, Restricted\" : \"Your friends, friends of anyone tagged and event guests; Except: Acquaintances\"));\n                }\n                 else if (((r == 1))) {\n                    this._tooltip = ((this._hasRestricted ? o._(\"Your friends, {user}'s friends and event guests; Except: Acquaintances, Restricted\", {\n                        user: this._tags[0]\n                    }) : o._(\"Your friends, {user}'s friends and event guests; Except: Acquaintances\", {\n                        user: this._tags[0]\n                    })));\n                }\n                 else this._tooltip = ((this._hasRestricted ? \"Your friends and event guests; Except: Acquaintances, Restricted\" : \"Your friends and event guests; Except: Acquaintances\"));\n                \n            ;\n            ;\n            }\n             else if (((((r > 0)) || this._alreadyHasTags()))) {\n                var u = \"friends of anyone tagged\", v = n._(\"{people who can see this}, {list of more people who can see this}\", [n.param(\"people who can see this\", \"Your friends\"),n.param(\"list of more people who can see this\", u),]), w = \"Acquaintances\";\n                if (this._hasRestricted) {\n                    w = n._(\"{Name of Acquaintances friend list}, {restricted}\", [n.param(\"Name of Acquaintances friend list\", w),n.param(\"restricted\", \"Restricted\"),]);\n                }\n            ;\n            ;\n                this._tooltip = this._getCombinedSentence(v, w);\n            }\n             else {\n                this._tooltip = \"Friends except Acquaintances\";\n                if (this._hasRestricted) {\n                    this._tooltip = \"Friends; Except: Acquaintances, Restricted\";\n                }\n            ;\n            ;\n            }\n            \n        ;\n        ;\n            this._recalcLabel();\n            return ((((s != this._tooltip)) || ((t != this._label))));\n        },\n        _alreadyHasTags: function() {\n            var q = j.scry(this._selector, \"*[data-oid]\")[0];\n            q = ((q && q.getAttribute(\"data-oid\")));\n            return ((q && g.hasTags(q)));\n        },\n        _getTagExpansionBehavior: function() {\n            return k.TagExpansion.FRIENDS_OF_TAGGEES;\n        }\n    });\n    e.exports = p;\n});\n__d(\"FriendsPrivacyOption\", [\"Arbiter\",\"BasePrivacyOption\",\"Class\",\"PrivacyConst\",\"SelectorDeprecated\",\"copyProperties\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"BasePrivacyOption\"), i = b(\"Class\"), j = b(\"PrivacyConst\"), k = b(\"SelectorDeprecated\"), l = b(\"copyProperties\"), m = b(\"tx\");\n    function n(o, p) {\n        this._hasRestricted = p;\n        this.parent.construct(this, o);\n    };\n;\n    i.extend(n, h);\n    l(n.prototype, {\n        _getChangedData: function() {\n            return {\n                hasEvent: this._hasEvent,\n                tags: this._taggedIDs,\n                privacy: j.FriendsValue.ALL_FRIENDS\n            };\n        },\n        _eventTagChanged: function() {\n            var o = this._getChangedData();\n            o.privacy = k.getValue(this._selector);\n            g.inform(\"EventTagged/changed\", o);\n        },\n        _recalculateTooltipAndLabel: function() {\n            var o = this._hasEvent, p = this._tags.length, q = this._tooltip, r = this._label;\n            if (((p > 2))) {\n                if (o) {\n                    this._tooltip = ((this._hasRestricted ? \"Your friends, friends of anyone tagged and event guests; Except: Restricted\" : \"Your friends, friends of anyone tagged and event guests\"));\n                }\n                 else this._tooltip = ((this._hasRestricted ? \"Your friends and friends of anyone tagged; Except: Restricted\" : \"Your friends and friends of anyone tagged\"));\n            ;\n            ;\n            }\n             else if (((p == 2))) {\n                if (o) {\n                    if (this._hasRestricted) {\n                        this._tooltip = \"Your friends, friends of anyone tagged and event guests; Except: Restricted\";\n                    }\n                     else this._tooltip = \"Your friends, friends of anyone tagged and event guests\";\n                ;\n                ;\n                }\n                 else if (this._hasRestricted) {\n                    this._tooltip = m._(\"Your friends, {user}'s friends and {user2}'s friends; Except: Restricted \", {\n                        user: this._tags[0],\n                        user2: this._tags[1]\n                    });\n                }\n                 else this._tooltip = m._(\"Your friends, {user}'s friends and {user2}'s friends\", {\n                    user: this._tags[0],\n                    user2: this._tags[1]\n                });\n                \n            ;\n            ;\n            }\n             else if (((p == 1))) {\n                if (o) {\n                    if (this._hasRestricted) {\n                        this._tooltip = m._(\"Your friends, {user}'s friends and event guests; Except: Restricted\", {\n                            user: this._tags[0]\n                        });\n                    }\n                     else this._tooltip = m._(\"Your friends, {user}'s friends and event guests\", {\n                        user: this._tags[0]\n                    });\n                ;\n                ;\n                }\n                 else if (this._hasRestricted) {\n                    this._tooltip = m._(\"Your friends and {user}'s friends; Except: Restricted\", {\n                        user: this._tags[0]\n                    });\n                }\n                 else this._tooltip = m._(\"Your friends and {user}'s friends\", {\n                    user: this._tags[0]\n                });\n                \n            ;\n            ;\n            }\n             else if (o) {\n                this._tooltip = ((this._hasRestricted ? \"Your friends and event guests; Except: Restricted\" : \"Your friends and event guests\"));\n            }\n             else this._tooltip = ((this._hasRestricted ? \"Your friends; Except: Restricted\" : \"Your friends\"));\n            \n            \n            \n        ;\n        ;\n            this._recalcLabel();\n            return ((((q != this._tooltip)) || ((r != this._label))));\n        },\n        _getTagExpansionBehavior: function() {\n            return j.TagExpansion.FRIENDS_OF_TAGGEES;\n        }\n    });\n    e.exports = n;\n});\n__d(\"MetaComposerEdDialog\", [\"Animation\",\"Arbiter\",\"ARIA\",\"AsyncRequest\",\"copyProperties\",\"CSS\",\"DOM\",\"Ease\",\"ge\",\"Parent\",\"SelectorDeprecated\",\"Vector\",], function(a, b, c, d, e, f) {\n    var g = b(\"Animation\"), h = b(\"Arbiter\"), i = b(\"ARIA\"), j = b(\"AsyncRequest\"), k = b(\"copyProperties\"), l = b(\"CSS\"), m = b(\"DOM\"), n = b(\"Ease\"), o = b(\"ge\"), p = b(\"Parent\"), q = b(\"SelectorDeprecated\"), r = b(\"Vector\"), s = null;\n    function t(u) {\n        this._dialog = u.dialog;\n        this.config = u;\n        this._init();\n    };\n;\n    t.init = function(u) {\n        if (s) {\n            s.config.show_audience = u.show_audience;\n            u.dialog.destroy();\n            return;\n        }\n    ;\n    ;\n        s = new t(u);\n    };\n    k(t.prototype, {\n        _init: function() {\n            h.subscribe(\"ComposerXStatusAttachment/ready\", function() {\n                if (this.config.show_audience) {\n                    this._sendEducationRequest({\n                    }, \"/ajax/composer/audience/education\", this._handlerCustomDuration.bind(this, 6000));\n                    this.config.show_audience = false;\n                }\n            ;\n            ;\n            }.bind(this));\n            if (this.config.show_sticky) {\n                h.subscribe(\"composer/mutate\", function(u, v) {\n                    this._sendEducationRequest({\n                        sticky_num: this.config.n_sticky_shown\n                    }, \"/ajax/composer/audience/sticky_education\");\n                }.bind(this));\n            }\n        ;\n        ;\n            if (this.config.show_event_tags) {\n                if (((this.config.n_event_tag_shown === 0))) {\n                    h.subscribe(\"EventTagged/changed\", function(u, v) {\n                        this._sendEducationRequest({\n                            selector: \"div.fbComposerAudienceTourContext\",\n                            privacy: v.privacy,\n                            event_tag_num: this.config.n_event_tag_shown\n                        }, \"/ajax/events/tagging/user_education\");\n                    }.bind(this));\n                    h.subscribe([\"composer/publish\",\"composer/reset\",], function() {\n                        var u = o(\"event_tagging_tag_expansion_NUX\");\n                        ((u && l.hide(u)));\n                    }.bind(this));\n                }\n                 else h.subscribe(\"EventTagged/changed\", function(u, v) {\n                    this._sendEducationRequest({\n                        ids: v.tags,\n                        from: \"AtTagger\",\n                        hasEvent: v.hasEvent,\n                        type: v.privacy,\n                        tag_num: this.config.n_tag_shown,\n                        event_tag_num: this.config.n_event_tag_shown\n                    }, \"ajax/composer/audience/tag_education\", this._handler.bind(this));\n                }.bind(this));\n            ;\n            }\n        ;\n        ;\n            if (this.config.show_tags) {\n                h.subscribe(\"SelectedPrivacyOption/changed\", function(u, v) {\n                    this._sendEducationRequest({\n                        ids: v.tags,\n                        from: \"WithTagger\",\n                        hasEvent: v.hasEvent,\n                        type: v.privacy,\n                        tag_num: this.config.n_tag_shown,\n                        event_tag_num: this.config.n_event_tag_shown\n                    }, \"/ajax/composer/audience/tag_education\", this._handler.bind(this));\n                }.bind(this));\n            }\n        ;\n        ;\n            q.subscribe(\"open\", this._killAnim.bind(this));\n        },\n        _sendEducationRequest: function(u, v, w) {\n            if (!this._updateDialogContext()) {\n                return;\n            }\n        ;\n        ;\n            ((this._async && this._async.abort()));\n            this._async = new j(v);\n            this._async.setData(u).setHandler(w).send();\n        },\n        _updateDialogContext: function() {\n            var u = m.scry(JSBNG__document.body, \"div.composerAudienceWrapper\"), v, w;\n            for (var x = 0; ((x < u.length)); x++) {\n                v = u[x];\n                w = r.getElementPosition(v);\n                if (((((v && ((w.x > 0)))) && ((w.y > 0))))) {\n                    this._dialog.setContext(v);\n                    return true;\n                }\n            ;\n            ;\n            };\n        ;\n            return false;\n        },\n        _handler: function(u) {\n            this._handlerCustomDuration(1500, u);\n        },\n        _handlerCustomDuration: function(u, v) {\n            var w = v.payload;\n            if (((!w || !this._updateDialogContext()))) {\n                return;\n            }\n        ;\n        ;\n            var x = this._dialog.getContent().firstChild;\n            m.setContent(x, w);\n            i.announce(m.getText(x));\n            this._dialog.show();\n            var y = p.byClass(x, \"metaComposerUserEd\");\n            if (this._anim) {\n                this._anim.JSBNG__stop();\n                this._anim = new g(y);\n            }\n             else this._anim = new g(y).from(\"opacity\", 0);\n        ;\n        ;\n            this._anim.to(\"opacity\", 1).ease(n.sineOut).checkpoint().duration(u).checkpoint().to(\"opacity\", 0).ease(n.sineOut).checkpoint().ondone(this._killAnim.bind(this)).go();\n        },\n        _killAnim: function(u, v) {\n            if (this._anim) {\n                this._dialog.hide();\n                this._anim.JSBNG__stop();\n                this._anim = null;\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = t;\n});\n__d(\"OnlyMePrivacyOption\", [\"BasePrivacyOption\",\"copyProperties\",\"Class\",\"PrivacyConst\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"BasePrivacyOption\"), h = b(\"copyProperties\"), i = b(\"Class\"), j = b(\"PrivacyConst\"), k = b(\"tx\");\n    function l(m) {\n        this.parent.construct(this, m);\n    };\n;\n    i.extend(l, g);\n    h(l.prototype, {\n        _getChangedData: function() {\n            return {\n                hasEvent: this._hasEvent,\n                tags: this._taggedIDs,\n                privacy: j.FriendsValue.SELF\n            };\n        },\n        _getIncludedAudience: function() {\n            return \"Only you\";\n        },\n        _getTagExpansionBehavior: function() {\n            return j.TagExpansion.TAGGEES;\n        }\n    });\n    e.exports = l;\n});\n__d(\"legacy:UIPagelet\", [\"UIPagelet\",], function(a, b, c, d) {\n    a.UIPagelet = b(\"UIPagelet\");\n}, 3);\n__d(\"HoverButton\", [\"AsyncRequest\",\"CSS\",\"DOM\",\"URI\",\"copyProperties\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = b(\"CSS\"), i = b(\"DOM\"), j = b(\"URI\"), k = b(\"copyProperties\"), l = b(\"cx\");\n    function m(n, o, p, q) {\n        this._button = n;\n        this._flyout = o;\n        this._flyoutAjaxify = q;\n        this._flyoutContent = p;\n        o.subscribe(\"show\", this._onShow.bind(this));\n        o.subscribe(\"hide\", this._onHide.bind(this));\n    };\n;\n    k(m.prototype, {\n        _button: null,\n        _flyout: null,\n        _flyoutAjaxify: null,\n        _flyoutContent: null,\n        showFlyoutBriefly: function() {\n            this.showFlyout();\n            this._flyout.hideFlyoutDelayed(5000);\n        },\n        showFlyout: function() {\n            this._flyout.showFlyout(this._button, true);\n            this._flyout.inform(\"show\", this._button);\n        },\n        hideFlyout: function() {\n            this._flyout.hideFlyout(true);\n            this._flyout.inform(\"hide\", this._button);\n        },\n        enableButton: function() {\n            this._flyout.initNode(this._button);\n        },\n        disableButton: function() {\n            this.hideFlyout();\n            this._flyout.deactivateNode(this._button);\n        },\n        _onShow: function(n, o) {\n            h.addClass(o, \"_52nd\");\n            if (((h.hasClass(o, \"uiButton\") || h.hasClass(o, \"_42fu\")))) {\n                h.addClass(o, \"selected\");\n            }\n        ;\n        ;\n            if (this._flyoutAjaxify) {\n                h.addClass(this._flyoutContent, \"async_saving\");\n                new g().setURI(new j(this._flyoutAjaxify)).setHandler(function(p) {\n                    h.removeClass(this._flyoutContent, \"async_saving\");\n                    i.setContent(this._flyoutContent, p.payload);\n                }.bind(this)).send();\n                this._flyoutAjaxify = null;\n            }\n        ;\n        ;\n        },\n        _onHide: function(n, o) {\n            h.removeClass(o, \"_52nd\");\n            if (((h.hasClass(o, \"uiButton\") || h.hasClass(o, \"_42fu\")))) {\n                h.removeClass(o, \"selected\");\n            }\n        ;\n        ;\n        },\n        destroy: function() {\n            this.hideFlyout();\n            this._flyout.destroy();\n        },\n        suppressNextMouseEnter: function() {\n            this._flyout.setActiveNode(this._button);\n        }\n    });\n    e.exports = m;\n});\n__d(\"legacy:DynamicIconSelector\", [\"DynamicIconSelector\",], function(a, b, c, d) {\n    a.DynamicIconSelector = b(\"DynamicIconSelector\");\n}, 3);\n__d(\"MentionsInputMatchers\", [], function(a, b, c, d, e, f) {\n    var g = [\"@\",\"\\\\uff20\",\"+\",\"\\\\uff0b\",].join(\"\"), h = \".,*?$|#{}()\\\\^\\\\-\\\\[\\\\]\\\\\\\\/!%&'\\\"~=\\u003C\\u003E_:;\", i = ((((\"\\\\b[A-Z][^ A-Z\" + h)) + \"]\")), j = ((((((((((((((\"([^\" + g)) + h)) + \"]|[\")) + h)) + \"][^ \")) + h)) + \"])\")), k = ((((((((\"(?:^|\\\\s)(?:[\" + g)) + \"](\")) + j)) + \"{0,20}))\")), l = ((((((((\"(?:(?:^|[^#])(\" + i)) + \"+)|\")) + k)) + \")\")), m = ((((\"(?:\" + i)) + \"{4,})\")), n = \"#\\\\uFF03\", o = {\n        trigger: new RegExp(((((\"[\" + g)) + \"]$\"))),\n        hashtagTrigger: new RegExp(((((\"[\" + n)) + \"]\"))),\n        mainMatcher: new RegExp(((k + \"$\"))),\n        autoMatcher: new RegExp(((l + \"$\"))),\n        userMatcher: new RegExp(((m + \"$\")))\n    };\n    e.exports = o;\n});\n__d(\"MentionsInput\", [\"function-extensions\",\"Arbiter\",\"ArbiterMixin\",\"Bootloader\",\"CSS\",\"DataStore\",\"DOM\",\"JSBNG__Event\",\"HTML\",\"Input\",\"InputSelection\",\"Keys\",\"MentionsInputMatchers\",\"Parent\",\"Style\",\"TypeaheadUtil\",\"UserAgent\",\"copyProperties\",\"htmlize\",\"removeFromArray\",\"repeatString\",], function(a, b, c, d, e, f) {\n    b(\"function-extensions\");\n    var g = b(\"Arbiter\"), h = b(\"ArbiterMixin\"), i = b(\"Bootloader\"), j = b(\"CSS\"), k = b(\"DataStore\"), l = b(\"DOM\"), m = b(\"JSBNG__Event\"), n = b(\"HTML\"), o = b(\"Input\"), p = b(\"InputSelection\"), q = b(\"Keys\"), r = b(\"MentionsInputMatchers\"), s = b(\"Parent\"), t = b(\"Style\"), u = b(\"TypeaheadUtil\"), v = b(\"UserAgent\"), w = b(\"copyProperties\"), x = b(\"htmlize\"), y = b(\"removeFromArray\"), z = b(\"repeatString\"), aa = \"\\ufeff\", ba = new RegExp(aa, \"g\"), ca = function(ja) {\n        return ((ja + aa));\n    }, da = \"\\ufffd\", ea = /@+\\[[0-9]+\\:([^\\]]|\\\\\\])*\\]+/g, fa = /[\\\\\\]:]/g;\n    function ga(ja, ka) {\n        return ja.replace(ka, z(\" \", ka.length));\n    };\n;\n    function ha(ja, ka) {\n        return ((ja.substring(0, ka) + ja.substring(((ka + 1)))));\n    };\n;\n    function ia(ja, ka, la, ma, na, oa) {\n        k.set(ja, \"MentionsInput\", this);\n        this._root = ja;\n        this._typeahead = ka;\n        this._input = la;\n        var pa = null, qa = this.init.bind(this, ma, na, oa);\n        try {\n            pa = ((JSBNG__document.activeElement === this._input));\n        } catch (ra) {\n        \n        };\n    ;\n        if (pa) {\n            qa.defer();\n        }\n         else var sa = m.listen(this._input, \"JSBNG__focus\", function() {\n            qa.defer();\n            sa.remove();\n        })\n    ;\n        this._hasHashtags = ma.hashtags;\n        this._hashtags = [];\n    };\n;\n    ia.getInstance = function(ja) {\n        var ka = s.byClass(ja, \"uiMentionsInput\");\n        return ((ka ? k.get(ka, \"MentionsInput\") : null));\n    };\n    w(ia.prototype, h, {\n        init: function(ja, ka, la) {\n            if (this._initialized) {\n                return;\n            }\n        ;\n        ;\n            this._initialized = true;\n            this._highlighter = l.JSBNG__find(this._root, \".highlighter\");\n            this._highlighterInner = this._highlighter.firstChild;\n            this._highlighterContent = l.JSBNG__find(this._root, \".highlighterContent\");\n            this._hiddenInput = l.JSBNG__find(this._root, \".mentionsHidden\");\n            this._placeholder = ((this._input.getAttribute(\"placeholder\") || \"\"));\n            this._maxMentions = ((ja.max || 6));\n            this._metrics = la;\n            if (!this._hiddenInput.JSBNG__name) {\n                var ma = this._input.JSBNG__name;\n                this._input.JSBNG__name = ((ma + \"_text\"));\n                this._hiddenInput.JSBNG__name = ma;\n            }\n        ;\n        ;\n            this._initEvents();\n            this._initTypeahead();\n            this.reset(ka);\n            this.inform(\"init\", null, g.BEHAVIOR_STATE);\n        },\n        reset: function(ja) {\n            if (!this._initialized) {\n                return;\n            }\n        ;\n        ;\n            this._mentioned = {\n            };\n            this._orderedUIDs = [];\n            this._numMentioned = 0;\n            this._filterData = null;\n            ((this._hiddenInput && (this._hiddenInput.value = \"\")));\n            ((this._highlighterContent && l.empty(this._highlighterContent)));\n            ((this._highlighterAuxContent && l.remove(this._highlighterAuxContent)));\n            this._highlighterAuxContent = null;\n            o.setPlaceholder(this._input, this._placeholder);\n            t.set(this._typeahead.getElement(), \"height\", \"auto\");\n            var ka = ((((ja && ja.value)) || \"\")), la = ((ja && ja.mentions));\n            if (((la && la.length))) {\n                var ma = [];\n                la.forEach(function(na) {\n                    ma.push(((na.offset + na.length)));\n                    delete na.offset;\n                    delete na.length;\n                    this._addToken(na);\n                }, this);\n                ma.reverse().forEach(function(na) {\n                    ka = ((((ka.substring(0, na) + aa)) + ka.substring(na)));\n                });\n            }\n        ;\n        ;\n            o.setValue(this._input, ka);\n            this._updateTypeahead();\n            this._updateWidth();\n            this._update();\n        },\n        getValue: function() {\n            return this._getMarkedValue().replace(ba, \"\");\n        },\n        _getMarkedValue: function() {\n            return o.getValue(this._input);\n        },\n        getRawValue: function() {\n            this._update();\n            return o.getValue(this._hiddenInput);\n        },\n        checkValue: function() {\n            var ja = this._typeahead.getCore().getValue();\n            if (((r.trigger.exec(ja) || ((ja === \"\"))))) {\n                this.inform(\"sessionEnd\", {\n                });\n            }\n        ;\n        ;\n        },\n        getTypeahead: function() {\n            return this._typeahead;\n        },\n        _initEvents: function() {\n            var ja = this._update.bind(this);\n            m.listen(this._input, {\n                input: ja,\n                keyup: ja,\n                change: ja,\n                JSBNG__blur: this._handleBlur.bind(this),\n                JSBNG__focus: this._handleFocus.bind(this),\n                keydown: this._handleKeydown.bind(this)\n            });\n            if (this._metrics) {\n                this._metrics._reset();\n                this._metrics.bindSessionStart(this._typeahead, \"render\", true);\n                this._metrics.bindSessionEnd(this._typeahead.getView(), \"select\", true);\n                this._metrics.bindSessionEnd(this, \"sessionEnd\", false);\n                m.listen(this._input, \"keyup\", function(JSBNG__event) {\n                    this.checkValue.bind(this).defer();\n                }.bind(this));\n            }\n        ;\n        ;\n        },\n        _initTypeahead: function() {\n            this._typeahead.subscribe(\"select\", function(oa, pa) {\n                var qa = pa.selected;\n                this._addToken({\n                    uid: qa.uid,\n                    text: qa.text,\n                    type: qa.type,\n                    weakreference: qa.weak_reference\n                });\n                this.updateValue();\n            }.bind(this));\n            var ja = this._input, ka = null;\n            function la() {\n                if (((ka === null))) {\n                    ka = o.getSubmitOnEnter(ja);\n                    o.setSubmitOnEnter(ja, false);\n                }\n            ;\n            ;\n            };\n        ;\n            function ma() {\n                if (((ka !== null))) {\n                    o.setSubmitOnEnter(ja, ka);\n                    ka = null;\n                }\n            ;\n            ;\n            };\n        ;\n            this._typeahead.subscribe(\"reset\", ma);\n            this._typeahead.subscribe(\"render\", la);\n            this._typeahead.subscribe(\"highlight\", function(oa, pa) {\n                ((((pa.index >= 0)) ? la() : ma()));\n            });\n            this._typeahead.subscribe(\"query\", function() {\n                this._filterData = null;\n            }.bind(this));\n            var na = this._typeahead.getCore();\n            na.suffix = aa;\n            this._handleFocus();\n        },\n        _handleBlur: function() {\n            if (this._filterToken) {\n                this._filterToken.remove();\n                this._filterToken = null;\n            }\n        ;\n        ;\n        },\n        _handleFocus: function() {\n            if (!this._filterToken) {\n                this._filterToken = this._typeahead.getData().addFilter(this._filterResults.bind(this));\n            }\n        ;\n        ;\n            this._updateWidth();\n        },\n        _handleKeydown: function(JSBNG__event) {\n            var ja = JSBNG__event.keyCode;\n            if (((((ja == q.BACKSPACE)) || ((ja == q.DELETE))))) {\n                this._handleBackspaceAndDelete(JSBNG__event, ja);\n            }\n        ;\n        ;\n            if (((((ja == q.LEFT)) || ((ja == q.RIGHT))))) {\n                JSBNG__setTimeout(this._handleLeftAndRight.bind(this, ja), 10);\n            }\n        ;\n        ;\n        },\n        _handleLeftAndRight: function(ja) {\n            var ka = this._getMarkedValue(), la = p.get(this._input), ma = la.start, na = la.end, oa = ((ja == q.LEFT)), pa = ((ja == q.RIGHT));\n            if (((ma == na))) {\n                var qa = ((oa ? -1 : 1));\n                if (((ka.charAt(ma) == aa))) {\n                    p.set(this._input, ((ma + qa)));\n                }\n            ;\n            ;\n            }\n             else if (((oa && ((ka.charAt(ma) == aa))))) {\n                p.set(this._input, ((ma - 1)), na);\n            }\n             else if (((oa && ((ka.charAt(na) == aa))))) {\n                p.set(this._input, ma, ((na - 1)));\n            }\n             else if (((pa && ((ka.charAt(na) == aa))))) {\n                p.set(this._input, ma, ((na + 1)));\n            }\n             else if (((pa && ((ka.charAt(ma) == aa))))) {\n                p.set(this._input, ((ma + 1)), na);\n            }\n            \n            \n            \n            \n        ;\n        ;\n        },\n        _handleBackspaceAndDelete: function(JSBNG__event, ja) {\n            var ka = p.get(this._input), la = false;\n            if (((ka.start !== ka.end))) {\n                if (((this._offsetIsInsideMention(((ka.start + 1))) && this._offsetIsInsideMention(ka.end)))) {\n                    la = ((ja === q.BACKSPACE));\n                }\n                 else return\n            ;\n            }\n        ;\n        ;\n            var ma = ((((ja === q.DELETE)) ? 1 : -1)), na = ((ma + ((la ? ka.end : ka.start)))), oa = this._getMarkedValue(), pa = oa;\n            for (var qa = 0; ((qa < this._orderedUIDs.length)); ++qa) {\n                var ra = this._mentioned[this._orderedUIDs[qa]], sa = ra.text, ta = ca(sa), ua = pa.indexOf(ta), va = ((ua + ta.length));\n                if (((((na < ua)) || ((na >= va))))) {\n                    pa = ga(pa, ta);\n                    continue;\n                }\n            ;\n            ;\n                var wa, xa;\n                if (((ra.type != \"user\"))) {\n                    wa = 0;\n                    xa = [sa,];\n                }\n                 else {\n                    wa = ((ta.substring(0, ((na - ua))).split(\" \").length - 1));\n                    xa = sa.split(\" \");\n                }\n            ;\n            ;\n                var ya = xa.splice(wa, 1)[0], za = xa.join(\" \"), ab = ((((wa === 0)) ? ua : ((((va - ya.length)) - 1))));\n                if (za) {\n                    ra.text = za;\n                    za = ca(za);\n                }\n                 else this._removeToken(ra.uid);\n            ;\n            ;\n                var bb = ((((oa.substring(0, ua) + za)) + oa.substring(va)));\n                o.setValue(this._input, bb);\n                p.set(this._input, ab);\n                this._update();\n                JSBNG__event.kill();\n                break;\n            };\n        ;\n        },\n        _offsetIsInsideMention: function(ja) {\n            for (var ka = 0; ((ka < this._offsets.length)); ka++) {\n                if (((((ja > this._offsets[ka][0])) && ((ja <= this._offsets[ka][1]))))) {\n                    return true;\n                }\n            ;\n            ;\n            };\n        ;\n            return false;\n        },\n        _filterResults: function(ja) {\n            if (((this._filterData === null))) {\n                var ka = p.get(this._input).start;\n                if (this._offsetIsInsideMention(ka)) {\n                    this._filterData = {\n                        caretIsInsideMention: true\n                    };\n                    return false;\n                }\n            ;\n            ;\n                var la = this._typeahead.getCore();\n                this._filterData = {\n                    value: la.getValue(),\n                    rawValue: la.getRawValue()\n                };\n            }\n        ;\n        ;\n            if (this._filterData.caretIsInsideMention) {\n                return false;\n            }\n        ;\n        ;\n            if (r.mainMatcher.test(this._filterData.rawValue)) {\n                return true;\n            }\n        ;\n        ;\n            if (((ja.type != \"user\"))) {\n                return false;\n            }\n        ;\n        ;\n            if (ja.disable_autosuggest) {\n                return false;\n            }\n        ;\n        ;\n            if (r.userMatcher.test(this._filterData.value)) {\n                return true;\n            }\n        ;\n        ;\n            return u.isExactMatch(this._filterData.value, this._typeahead.getData().getTextToIndex(ja));\n        },\n        _addToken: function(ja) {\n            var ka = ja.uid;\n            if (!this._mentioned.hasOwnProperty(ka)) {\n                this._mentioned[ka] = ja;\n                this._orderedUIDs.push(ka);\n                this._numMentioned++;\n                this._updateTypeahead();\n            }\n        ;\n        ;\n        },\n        _removeToken: function(ja) {\n            if (this._mentioned.hasOwnProperty(ja)) {\n                delete this._mentioned[ja];\n                y(this._orderedUIDs, ja);\n                this._numMentioned--;\n                this._updateTypeahead();\n            }\n        ;\n        ;\n        },\n        _update: function() {\n            var ja = this._getMarkedValue();\n            if (((ja == this._value))) {\n                return;\n            }\n        ;\n        ;\n            this._value = ja;\n            this._updateMentions();\n            this._updateDirection.bind(this).defer();\n            this.updateValue();\n        },\n        _updateMentions: function() {\n            this._offsets = [];\n            var ja = this._getMarkedValue(), ka = ja;\n            for (var la = 0; ((la < this._orderedUIDs.length)); ++la) {\n                var ma = this._orderedUIDs[la], na = ca(this._mentioned[ma].text), oa = ka.indexOf(na);\n                if (((oa == -1))) {\n                    this._removeToken(ma);\n                }\n            ;\n            ;\n                ka = ga(ka, na);\n                this._offsets.push([oa,((oa + na.length)),]);\n            };\n        ;\n            var pa = ja;\n            while ((((oa = ka.indexOf(aa)) > -1))) {\n                pa = ha(pa, oa);\n                ka = ha(ka, oa);\n            };\n        ;\n            if (((ja !== pa))) {\n                var qa = p.get(this._input);\n                o.setValue(this._input, pa);\n                p.set(this._input, qa.start);\n                this._value = pa;\n            }\n        ;\n        ;\n        },\n        _renderHashtags: function(ja) {\n            if (!this._hasHashtags) {\n                return x(ja);\n            }\n        ;\n        ;\n            if (!this._hashtagParser) {\n                if (r.hashtagTrigger.exec(ja)) {\n                    this.bootloadHashtagParser();\n                }\n            ;\n            ;\n                if (!this._hashtagParser) {\n                    return x(ja);\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            this._hashtags = this._hashtagParser.parse(ja);\n            var ka = [], la = 0;\n            for (var ma = 0; ((ma < this._hashtags.length)); ma++) {\n                var na = this._hashtags[ma];\n                ka.push(x(ja.substring(la, na.rawOffset)), \"\\u003Cb\\u003E\", na.marker, na.tag, \"\\u003C/b\\u003E\");\n                la = ((((na.rawOffset + na.marker.length)) + na.tag.length));\n            };\n        ;\n            ka.push(x(ja.substring(la)));\n            return ka.join(\"\");\n        },\n        updateValue: function() {\n            var ja = this._value = this._getMarkedValue(), ka = this._orderedUIDs, la = ja.replace(ea, da);\n            for (var ma = 0; ((ma < ka.length)); ++ma) {\n                var na = ((((\"@[\" + ka[ma])) + \":]\")), oa = ca(this._mentioned[ka[ma]].text);\n                la = la.replace(oa, na);\n                ja = ja.replace(oa, na);\n            };\n        ;\n            var pa = this._renderHashtags(ja);\n            for (var ma = 0; ((ma < ka.length)); ++ma) {\n                var qa = ka[ma], ra = this._mentioned[qa], sa = ra.text, ta = ((ra.weakreference ? \"\\u003Cb class=\\\"weak\\\"\\u003E\" : \"\\u003Cb\\u003E\"));\n                pa = pa.replace(((((\"@[\" + qa)) + \":]\")), ((((ta + x(ca(sa)))) + \"\\u003C/b\\u003E\")));\n                sa = sa.replace(fa, function(ua) {\n                    return ((\"\\\\\" + ua));\n                });\n                la = la.replace(((((\"@[\" + qa)) + \":]\")), ((((((((\"@[\" + qa)) + \":\")) + sa)) + \"]\")));\n            };\n        ;\n            if (v.ie()) {\n                pa = pa.replace(/ /g, \"&nbsp;\\u003Cwbr/\\u003E\");\n            }\n        ;\n        ;\n            l.setContent(this._highlighterContent, n(pa));\n            this._hiddenInput.value = la;\n            this._updateHighlighter();\n            this._updateHeight();\n        },\n        _updateDirection: function() {\n            var ja = t.get(this._input, \"direction\");\n            if (((ja == this._dir))) {\n                return;\n            }\n        ;\n        ;\n            this._dir = ja;\n            t.set(this._highlighter, \"direction\", ja);\n            if (((ja == \"rtl\"))) {\n                t.set(this._highlighter, \"text-align\", \"right\");\n            }\n             else t.set(this._highlighter, \"text-align\", \"left\");\n        ;\n        ;\n        },\n        _updateWidth: function() {\n            var ja = t.getFloat.curry(this._input), ka = ((((((((this._input.offsetWidth - ja(\"paddingLeft\"))) - ja(\"paddingRight\"))) - ja(\"borderLeftWidth\"))) - ja(\"borderRightWidth\")));\n            if (v.firefox()) {\n                ka -= 2;\n            }\n        ;\n        ;\n            if (((v.ie() <= 7))) {\n                ka -= t.getFloat(this._highlighterInner, \"paddingLeft\");\n                this._highlighter.style.zoom = 1;\n            }\n        ;\n        ;\n            this._highlighterInner.style.width = ((Math.max(ka, 0) + \"px\"));\n        },\n        _updateHeight: function() {\n            if (this._highlighterAuxContent) {\n                var ja = this._highlighter.offsetHeight, ka = this._typeahead.getElement();\n                if (((ja > ka.offsetHeight))) {\n                    t.set(ka, \"height\", ((ja + \"px\")));\n                    g.inform(\"reflow\");\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n        },\n        _updateTypeahead: function() {\n            var ja = this._typeahead.getCore(), ka = null;\n            if (((!this._maxMentions || ((this._numMentioned < this._maxMentions))))) {\n                ka = r.autoMatcher;\n            }\n        ;\n        ;\n            ja.matcher = ka;\n            ja.setExclusions(this._orderedUIDs);\n            this.inform(\"update\", {\n                mentioned: this._mentioned\n            });\n        },\n        setPlaceholder: function(ja) {\n            this._placeholder = ja;\n            if (!this.hasAuxContent()) {\n                o.setPlaceholder(this._input, ja);\n            }\n        ;\n        ;\n        },\n        _updateHighlighter: function() {\n            if (this._highlighterContent) {\n                j.conditionShow(this._highlighterContent, ((((((this._numMentioned > 0)) || this.hasAuxContent())) || this._hashtags.length)));\n            }\n        ;\n        ;\n        },\n        setAuxContent: function(ja) {\n            if (this._highlighterContent) {\n                if (!this._highlighterAuxContent) {\n                    this._highlighterAuxContent = l.create(\"span\", {\n                        className: \"highlighterAuxContent\"\n                    });\n                    l.insertAfter(this._highlighterContent, this._highlighterAuxContent);\n                }\n            ;\n            ;\n                l.setContent(this._highlighterAuxContent, ja);\n                if (ja) {\n                    o.setPlaceholder(this._input, \"\");\n                }\n                 else o.setPlaceholder(this._input, this._placeholder);\n            ;\n            ;\n                this._updateHighlighter();\n                this._updateHeight();\n            }\n        ;\n        ;\n        },\n        hasAuxContent: function() {\n            var ja = this.getAuxContentRoot();\n            return ((ja && ((ja.innerHTML.length > 0))));\n        },\n        getAuxContentRoot: function() {\n            return this._highlighterAuxContent;\n        },\n        addMention: function(ja) {\n            var ka = this._getMarkedValue();\n            if (((ka !== \"\"))) {\n                ka += \" \";\n            }\n        ;\n        ;\n            o.setValue(this._input, ((((ka + ca(ja.text))) + \" \")));\n            this._addToken(ja);\n            this._update();\n        },\n        getMentions: function() {\n            return this._mentioned;\n        },\n        bootloadHashtagParser: function() {\n            if (!this._hashtagParser) {\n                i.loadModules([\"HashtagParser\",], function(ja) {\n                    this._hashtagParser = ja;\n                    if (this._initialized) {\n                        this._update();\n                    }\n                ;\n                ;\n                }.bind(this));\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = ia;\n});\n__d(\"MentionsTypeaheadAreaView\", [\"Class\",\"ContextualTypeaheadView\",\"Parent\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Class\"), h = b(\"ContextualTypeaheadView\"), i = b(\"Parent\"), j = b(\"copyProperties\");\n    function k(l, m) {\n        this.parent.construct(this, l, m);\n    };\n;\n    g.extend(k, h);\n    j(k.prototype, {\n        getContext: function() {\n            return i.byClass(this.element, \"uiMentionsInput\");\n        }\n    });\n    e.exports = k;\n});\n__d(\"legacy:MentionsInput\", [\"MentionsInput\",], function(a, b, c, d) {\n    a.MentionsInput = b(\"MentionsInput\");\n}, 3);\n__d(\"legacy:ui-side-nav-future-js\", [\"FutureSideNav\",], function(a, b, c, d) {\n    a.FutureSideNav = b(\"FutureSideNav\");\n}, 3);\n__d(\"HoverFlyout\", [\"Arbiter\",\"ArbiterMixin\",\"DataStore\",\"JSBNG__Event\",\"Keys\",\"arrayContains\",\"copyProperties\",\"removeFromArray\",\"shield\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ArbiterMixin\"), i = b(\"DataStore\"), j = b(\"JSBNG__Event\"), k = b(\"Keys\"), l = b(\"arrayContains\"), m = b(\"copyProperties\"), n = b(\"removeFromArray\"), o = b(\"shield\");\n    function p(q, r, s, t) {\n        if (q) {\n            this._showDelay = s;\n            this._hideDelay = t;\n            this.init(q);\n            if (r) {\n                this.initNode(r);\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n        g.subscribe(\"SwapButtonDEPRECATED/focusOnJoinButton\", o(this.hideFlyout, this), g.SUBSCRIBE_ALL);\n    };\n;\n    m(p.prototype, h, {\n        init: function(q) {\n            this._flyout = q;\n            this._showDelay = ((this._showDelay || 0));\n            this._hideDelay = ((this._hideDelay || 100));\n            this._showTimeout = null;\n            this._hideTimeout = null;\n            this._flyoutSubscriptions = [this._flyout.subscribe(\"mouseenter\", this._onFlyoutMouseEnter.bind(this)),this._flyout.subscribe(\"mouseleave\", o(this.hideFlyout, this)),];\n            this._nodes = [];\n            this._dataStoreUnique = ((((\"HoverFlyout_\" + JSBNG__Date.now())) + \"_listeners\"));\n            return this;\n        },\n        initNode: function(q) {\n            if (l(this._nodes, q)) {\n                return this;\n            }\n        ;\n        ;\n            this._nodes.push(q);\n            i.set(q, this._dataStoreUnique, [j.listen(q, \"mouseenter\", this._onNodeMouseEnter.bind(this, q)),j.listen(q, \"mouseleave\", o(this.hideFlyout, this)),j.listen(q, \"click\", this._onNodeMouseEnter.bind(this, q)),j.listen(q, \"keydown\", this._onNodeKeyEscape.bind(this)),]);\n            return this;\n        },\n        deactivateNode: function(q) {\n            var r = i.get(q, this._dataStoreUnique);\n            if (r) {\n                while (r.length) {\n                    r.pop().remove();\n                ;\n                };\n            }\n        ;\n        ;\n            n(this._nodes, q);\n        },\n        setShowDelay: function(q) {\n            this._showDelay = q;\n            return this;\n        },\n        setHideDelay: function(q) {\n            this._hideDelay = q;\n            return this;\n        },\n        showFlyout: function(q, r) {\n            this.setActiveNode(q);\n            if (r) {\n                this._flyout.setContext(q).show();\n                this.inform(\"show\", q);\n            }\n             else this._showTimeout = this.showFlyout.bind(this, q, true).defer(this._showDelay);\n        ;\n        ;\n            return this;\n        },\n        hideFlyout: function(q) {\n            JSBNG__clearTimeout(this._showTimeout);\n            if (q) {\n                this._flyout.hide();\n                ((this._activeNode && this.inform(\"hide\", this._activeNode)));\n                this._activeNode = null;\n            }\n             else this._hideTimeout = this.hideFlyout.bind(this, true).defer(this._hideDelay);\n        ;\n        ;\n        },\n        hideFlyoutDelayed: function(q) {\n            JSBNG__clearTimeout(this._showTimeout);\n            JSBNG__clearTimeout(this._hideTimeout);\n            this._hideTimeout = this.hideFlyout.bind(this, true).defer(q);\n        },\n        getActiveNode: function() {\n            return this._activeNode;\n        },\n        setActiveNode: function(q) {\n            JSBNG__clearTimeout(this._hideTimeout);\n            if (((this._activeNode && ((this._activeNode !== q))))) {\n                this.hideFlyout(true);\n            }\n        ;\n        ;\n            this._activeNode = q;\n            return this;\n        },\n        clearNodes: function() {\n            for (var q = this._nodes.length; ((q > 0)); q--) {\n                this.deactivateNode(this._nodes[((q - 1))]);\n            ;\n            };\n        ;\n        },\n        destroy: function() {\n            while (this._flyoutSubscriptions.length) {\n                this._flyout.unsubscribe(this._flyoutSubscriptions.pop());\n            ;\n            };\n        ;\n            this.clearNodes();\n        },\n        _onNodeMouseEnter: function(q) {\n            if (((this._activeNode === q))) {\n                JSBNG__clearTimeout(this._hideTimeout);\n            }\n             else this.showFlyout(q);\n        ;\n        ;\n        },\n        _onFlyoutMouseEnter: function() {\n            JSBNG__clearTimeout(this._hideTimeout);\n        },\n        _onNodeKeyEscape: function(JSBNG__event) {\n            if (((j.getKeyCode(JSBNG__event) === k.ESC))) {\n                ((this._activeNode && this.inform(\"hide\", this._activeNode)));\n                this._activeNode = null;\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = ((a.HoverFlyout || p));\n});\n__d(\"TypeaheadAreaCore\", [\"Class\",\"InputSelection\",\"TypeaheadCore\",\"copyProperties\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"Class\"), h = b(\"InputSelection\"), i = b(\"TypeaheadCore\"), j = b(\"copyProperties\"), k = b(\"emptyFunction\");\n    function l(m) {\n        this.parent.construct(this, m);\n        this.matcher = new RegExp(((this.matcher + \"$\")));\n        this.preventFocusChangeOnTab = true;\n    };\n;\n    g.extend(l, i);\n    j(l.prototype, {\n        prefix: \"\",\n        suffix: \", \",\n        matcher: \"\\\\b[^,]*\",\n        click: k,\n        select: function(m) {\n            this.parent.select(m);\n            var n = this.element.value, o = ((((this.prefix + m.text)) + this.suffix));\n            this.expandBounds(n, o);\n            var p = n.substring(0, this.start), q = n.substring(this.end);\n            this.element.value = ((((p + o)) + q));\n            h.set(this.element, ((p.length + o.length)));\n        },\n        expandBounds: function(m, n) {\n            m = m.toLowerCase();\n            n = n.toLowerCase();\n            var o, p, q, r, s = /\\s/;\n            p = m.substring(this.start, this.end);\n            q = n.indexOf(p);\n            o = this.start;\n            while (((((o >= 0)) && ((q >= 0))))) {\n                r = m.charAt(((o - 1)));\n                if (((!r || s.test(r)))) {\n                    this.start = o;\n                }\n            ;\n            ;\n                p = ((r + p));\n                q = n.indexOf(p);\n                o--;\n            };\n        ;\n            p = m.substring(this.start, this.end);\n            q = n.indexOf(p);\n            o = this.end;\n            while (((((o <= m.length)) && ((q >= 0))))) {\n                r = m.charAt(o);\n                if (((!r || s.test(r)))) {\n                    this.end = o;\n                }\n            ;\n            ;\n                p = ((p + r));\n                q = n.indexOf(p);\n                o++;\n            };\n        ;\n        },\n        getRawValue: function() {\n            var m = ((h.get(this.element).start || 0));\n            return this.parent.getValue().substring(0, m);\n        },\n        getValue: function() {\n            var m = ((this.matcher && this.matcher.exec(this.getRawValue())));\n            if (!m) {\n                return \"\";\n            }\n        ;\n        ;\n            var n = m[0], o = ((m.index + n.length));\n            n = n.replace(/^\\s/, \"\");\n            var p = n.length;\n            n = n.replace(/\\s$/, \"\");\n            var q = ((p - n.length));\n            this.start = ((o - p));\n            this.end = ((o + q));\n            return ((((m[2] || m[1])) || m[0]));\n        }\n    });\n    e.exports = l;\n});\n__d(\"TypeaheadMetrics\", [\"JSBNG__Event\",\"AsyncRequest\",\"copyProperties\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"AsyncRequest\"), i = b(\"copyProperties\"), j = b(\"emptyFunction\");\n    function k(l) {\n        this.extraData = {\n        };\n        i(this, l);\n    };\n;\n    i(k.prototype, {\n        endPoint: \"/ajax/typeahead/record_basic_metrics.php\",\n        init: function(l) {\n            this.init = j;\n            this.core = l.getCore();\n            this.view = l.getView();\n            this.data = l.getData();\n            this.stats = {\n            };\n            this.sessionActive = false;\n            this._sessionStartEvents = [];\n            this._sessionEndEvents = [];\n            this._reset();\n            this.initEvents();\n        },\n        _reset: function() {\n            this.stats = {\n            };\n            this.avgStats = {\n            };\n            this.sessionActive = false;\n            this.results = null;\n            this.sid = Math.floor(((JSBNG__Date.now() * Math.JSBNG__random())));\n            this.data.setQueryData({\n                sid: this.sid\n            });\n        },\n        recordSelect: function(l) {\n            var m = l.selected;\n            if (((m.uid == null))) {\n                this.recordStat(\"selected_id\", \"SELECT_NULL\");\n            }\n             else this.recordStat(\"selected_id\", m.uid);\n        ;\n        ;\n            this.recordStat(\"selected_type\", m.type);\n            this.recordStat(\"selected_position\", l.index);\n            this.recordStat(\"selected_with_mouse\", ((l.clicked ? 1 : 0)));\n            this.recordStat(\"selected_query\", l.query);\n            this._sessionEnd();\n        },\n        bindSessionStart: function(l, JSBNG__event, m) {\n            if (m) {\n                for (var n = 0; ((n < this._sessionStartEvents.length)); ++n) {\n                    var o = this._sessionStartEvents[n];\n                    o.obj.unsubscribe(o.token);\n                };\n            }\n        ;\n        ;\n            this._sessionStartEvents.push({\n                obj: l,\n                token: l.subscribe(JSBNG__event, function(p, q) {\n                    this._sessionStart();\n                }.bind(this))\n            });\n        },\n        bindSessionEnd: function(l, JSBNG__event, m) {\n            if (m) {\n                for (var n = 0; ((n < this._sessionEndEvents.length)); ++n) {\n                    var o = this._sessionEndEvents[n];\n                    o.obj.unsubscribe(o.token);\n                };\n            }\n        ;\n        ;\n            this._sessionEndEvents.push({\n                obj: l,\n                token: l.subscribe(JSBNG__event, function(p, q) {\n                    this._sessionEnd();\n                }.bind(this))\n            });\n        },\n        initEvents: function() {\n            this.bindSessionStart(this.core, \"JSBNG__focus\", false);\n            this.bindSessionEnd(this.core, \"JSBNG__blur\", false);\n            this.view.subscribe(\"select\", function(l, m) {\n                this.recordSelect(m);\n            }.bind(this));\n            this.bindSessionEnd(this.view, \"select\", false);\n            this.view.subscribe(\"render\", function(l, m) {\n                this.results = m;\n            }.bind(this));\n            this.data.subscribe(\"beforeQuery\", function(l, m) {\n                if (!m.value) {\n                    return;\n                }\n            ;\n            ;\n                this.query = m.value;\n                this.recordCountStat(\"num_queries\");\n            }.bind(this));\n            this.data.subscribe(\"beforeFetch\", function(l, m) {\n                if (m.fetch_context.bootstrap) {\n                    this.bootstrapBegin = JSBNG__Date.now();\n                }\n                 else m.fetch_context.queryBegin = JSBNG__Date.now();\n            ;\n            ;\n            }.bind(this));\n            this.data.subscribe(\"fetchComplete\", function(l, m) {\n                if (m.fetch_context.bootstrap) {\n                    this.recordAvgStat(\"bootstrap_latency\", ((JSBNG__Date.now() - this.bootstrapBegin)));\n                    var n = {\n                    };\n                    m.response.payload.entries.forEach(function(o) {\n                        if (!n[o.type]) {\n                            n[o.type] = 1;\n                        }\n                         else n[o.type]++;\n                    ;\n                    ;\n                    });\n                    this.recordStat(\"bootstrap_response_types\", n);\n                    this.bootstrapped = true;\n                }\n                 else {\n                    if (((\"filtered_count\" in m.response.payload))) {\n                        this.recordStat(\"filtered_count\", m.response.payload.filtered_count);\n                    }\n                ;\n                ;\n                    this.recordAvgStat(\"avg_query_latency\", ((JSBNG__Date.now() - m.fetch_context.queryBegin)));\n                }\n            ;\n            ;\n            }.bind(this));\n            this.data.subscribe(\"dirty\", function(l, m) {\n                this.bootstrapped = false;\n            });\n        },\n        _sessionStart: function() {\n            if (this.sessionActive) {\n                return;\n            }\n        ;\n        ;\n            this.sessionActive = true;\n        },\n        _sessionEnd: function() {\n            if (!this.sessionActive) {\n                return;\n            }\n        ;\n        ;\n            this.sessionActive = false;\n            this.submit();\n            this._reset();\n        },\n        recordStat: function(l, m) {\n            this.stats[l] = m;\n        },\n        recordCountStat: function(l) {\n            var m = this.stats[l];\n            this.stats[l] = ((m ? ((m + 1)) : 1));\n        },\n        recordAvgStat: function(l, m) {\n            if (this.avgStats[l]) {\n                this.avgStats[l][0] += m;\n                ++this.avgStats[l][1];\n            }\n             else this.avgStats[l] = [m,1,];\n        ;\n        ;\n        },\n        submit: function() {\n            if (Object.keys(this.stats).length) {\n                i(this.stats, this.extraData);\n                if (this.results) {\n                    var l = (this.results).map(function(o, p) {\n                        return o.uid;\n                    });\n                    this.recordStat(\"candidate_results\", JSON.stringify(l));\n                }\n            ;\n            ;\n                if (this.query) {\n                    this.recordStat(\"query\", this.query);\n                }\n            ;\n            ;\n                if (this.sid) {\n                    this.recordStat(\"sid\", this.sid);\n                }\n            ;\n            ;\n                if (this.bootstrapped) {\n                    this.recordStat(\"bootstrapped\", 1);\n                }\n            ;\n            ;\n                {\n                    var fin200keys = ((window.top.JSBNG_Replay.forInKeys)((this.avgStats))), fin200i = (0);\n                    var m;\n                    for (; (fin200i < fin200keys.length); (fin200i++)) {\n                        ((m) = (fin200keys[fin200i]));\n                        {\n                            var n = this.avgStats[m];\n                            this.stats[m] = ((n[0] / n[1]));\n                        };\n                    };\n                };\n            ;\n                new h().setURI(this.endPoint).setMethod(\"POST\").setData({\n                    stats: this.stats\n                }).send();\n                this._reset();\n            }\n        ;\n        ;\n        }\n    });\n    k.register = function(l, m, n) {\n        if (((JSBNG__document.activeElement === l))) {\n            m.init(n);\n        }\n         else var o = g.listen(l, \"JSBNG__focus\", function() {\n            m.init(n);\n            o.remove();\n        })\n    ;\n    };\n    e.exports = k;\n});\n__d(\"TypeaheadHoistFriends\", [\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"copyProperties\");\n    function h(i) {\n        this._typeahead = i;\n    };\n;\n    g(h.prototype, {\n        _subscription: null,\n        enable: function() {\n            var i = this._typeahead.getView();\n            this._subscription = i.subscribe(\"beforeRender\", function(j, k) {\n                var l = [], m = [], n = [];\n                for (var o = 0; ((o < k.results.length)); ++o) {\n                    var p = k.results[o];\n                    if (((p.type == \"header\"))) {\n                        n = n.concat(m, l);\n                        n.push(p);\n                        m = [];\n                        l = [];\n                    }\n                     else if (((((p.type == \"user\")) && p.bootstrapped))) {\n                        m.push(p);\n                    }\n                     else l.push(p);\n                    \n                ;\n                ;\n                };\n            ;\n                k.results = n.concat(m, l);\n            });\n        },\n        disable: function() {\n            this._typeahead.getView().unsubscribe(this._subscription);\n            this._subscription = null;\n        }\n    });\n    e.exports = h;\n});\n__d(\"legacy:HoistFriendsTypeaheadBehavior\", [\"TypeaheadHoistFriends\",], function(a, b, c, d) {\n    var e = b(\"TypeaheadHoistFriends\");\n    if (!a.TypeaheadBehaviors) {\n        a.TypeaheadBehaviors = {\n        };\n    }\n;\n;\n    a.TypeaheadBehaviors.hoistFriends = function(f) {\n        f.enableBehavior(e);\n    };\n}, 3);\n__d(\"escapeRegex\", [], function(a, b, c, d, e, f) {\n    function g(h) {\n        return h.replace(/([.?*+\\^$\\[\\]\\\\(){}|\\-])/g, \"\\\\$1\");\n    };\n;\n    e.exports = g;\n});\n__d(\"mixin\", [], function(a, b, c, d, e, f) {\n    function g(h, i, j, k, l, m, n, o, p, q, r) {\n        var s = function() {\n        \n        }, t = [h,i,j,k,l,m,n,o,p,q,], u = 0, v;\n        while (t[u]) {\n            v = t[u];\n            {\n                var fin201keys = ((window.top.JSBNG_Replay.forInKeys)((v))), fin201i = (0);\n                var w;\n                for (; (fin201i < fin201keys.length); (fin201i++)) {\n                    ((w) = (fin201keys[fin201i]));\n                    {\n                        if (v.hasOwnProperty(w)) {\n                            s.prototype[w] = v[w];\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            u += 1;\n        };\n    ;\n        return s;\n    };\n;\n    e.exports = g;\n});");
// 11681
JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_190[0](o203,false,"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yz/r/CVXUroaYxOH.js",o204);
// undefined
o203 = null;
// undefined
o204 = null;
// 11685
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o7,"if (self.CavalryLogger) {\n    CavalryLogger.start_js([\"EzMPG\",]);\n}\n;\n__d(\"ChannelSubdomain\", [\"Cookie\",\"JSLogger\",], function(a, b, c, d, e, f) {\n    var g = b(\"Cookie\"), h = b(\"JSLogger\"), i = h.create(\"channel\"), j = 7, k = null;\n    function l(o, p) {\n        var q = null, r = m(), s;\n        o--;\n        var t = Math.min(32, (j * o));\n        t = Math.max(t, 1);\n        var u = false;\n        for (var v = 0; (v < 32); v++) {\n            s = (((v + p)) % t);\n            if (!((r & ((1 << s))))) {\n                u = true;\n                break;\n            }\n        ;\n        };\n        if (u) {\n            k = s;\n            q = (k % j);\n            g.set(\"sub\", (r | ((1 << k))));\n        }\n         else {\n            k = -1;\n            q = null;\n            i.error(\"subdomain_overflow\", {\n                slot: k,\n                max: o\n            });\n        }\n    ;\n        return q;\n    };\n    function m() {\n        var o = (g.get(\"sub\") || 0);\n        o = parseInt(o, 10);\n        return (isNaN(o) ? 0 : o);\n    };\n    function n() {\n        if (((k !== null) && (k >= 0))) {\n            var o = (m() & ~((1 << k)));\n            if (o) {\n                g.set(\"sub\", o);\n            }\n             else g.clear(\"sub\");\n        ;\n        }\n    ;\n    };\n    e.exports = {\n        allocate: l,\n        clear: n\n    };\n});\n__d(\"DocRPC\", [\"ErrorUtils\",], function(a, b, c, d, e, f) {\n    var g = b(\"ErrorUtils\"), h = {\n        _apis: {\n        },\n        _dispatch: function(i) {\n            var j;\n            try {\n                i = JSON.parse(i);\n            } catch (k) {\n                throw new Error(((\"DocRPC unparsable dispatch: \\\"\" + i) + \"\\\"\"));\n            };\n            if (h._apis.hasOwnProperty(i.api)) {\n                var l = h._apis[i.api];\n                if (l[i.method]) {\n                    j = g.applyWithGuard(l[i.method], l, i.args);\n                };\n            }\n        ;\n            if ((j === undefined)) {\n                j = null;\n            };\n            return JSON.stringify(j);\n        },\n        publish: function(i, j) {\n            h._apis[j] = i;\n        },\n        proxy: function(i, j, k) {\n            var l = {\n            };\n            k.forEach(function(m) {\n                l[m] = function() {\n                    var n = {\n                        api: j,\n                        method: m,\n                        args: Array.prototype.slice.call(arguments)\n                    }, o;\n                    try {\n                        if (i.closed) {\n                            throw new Error(\"DocRPC window closed\")\n                        };\n                        o = i.DocRPC._dispatch(JSON.stringify(n));\n                    } catch (p) {\n                        g.reportError(p);\n                        return;\n                    };\n                    if ((typeof (o) == \"string\")) {\n                        try {\n                            o = JSON.parse(o);\n                        } catch (p) {\n                            throw new Error(((((((\"DocRPC \" + j) + \".\") + m) + \" unparsable return: \\\"\") + o) + \"\\\"\"));\n                        }\n                    };\n                    return o;\n                };\n            });\n            return l;\n        }\n    };\n    e.exports = a.DocRPC = h;\n});\n__d(\"ChannelTransport\", [\"copyProperties\",\"bind\",\"AjaxRequest\",\"URI\",\"JSLogger\",\"DocRPC\",\"ChannelConstants\",\"UserAgent\",], function(a, b, c, d, e, f) {\n    var g = b(\"copyProperties\"), h = b(\"bind\"), i = b(\"AjaxRequest\"), j = b(\"URI\"), k = b(\"JSLogger\"), l = b(\"DocRPC\"), m = b(\"ChannelConstants\"), n = b(\"UserAgent\"), o = k.create(\"channel\");\n    function p() {\n        return (((1048576 * Math.random()) | 0)).toString(36);\n    };\n    function q(y, z) {\n        var aa = y.subdomain;\n        aa = ((aa === null) ? \"\" : ((aa + \"-\")));\n        var ba = new j(z).setDomain(((aa + y.host) + \".facebook.com\")).setPort(y.port).setSecure(j().isSecure());\n        return ba;\n    };\n    function r(y) {\n        var z = {\n            partition: y.partition,\n            cb: p()\n        }, aa = q(y, \"/p\").setQueryData(z);\n        o.log(\"start_p\", {\n            uri: aa.toString()\n        });\n        var ba = new i(\"GET\", aa);\n        if (i.supportsCORS()) {\n            ba.xhr.withCredentials = true;\n        };\n        var ca = function(da) {\n            o.log(\"finish_p\", {\n                xhr: (da.toJSON ? da.toJSON() : da)\n            });\n        };\n        ba.timeout = y.P_TIMEOUT;\n        ba.onError = ba.onSuccess = ca;\n        ba.send();\n    };\n    function s(y, z, aa) {\n        var ba = new Image(), ca = 0, da = function(ga) {\n            ba.abort();\n            return (ga ? z() : aa());\n        };\n        ba.onload = function() {\n            o.log(\"ping_ok\", {\n                duration: (Date.now() - ca)\n            });\n            da(true);\n        };\n        ba.onerror = function() {\n            r(y);\n            da(false);\n        };\n        var ea = setTimeout(ba.onerror, 10000, false);\n        ba.abort = function() {\n            if (ea) {\n                clearTimeout(ea);\n                ea = null;\n            }\n        ;\n            ba.onload = ba.onerror = null;\n        };\n        var fa = {\n            partition: y.partition,\n            cb: p()\n        };\n        ca = Date.now();\n        ba.src = q(y, \"/ping\").setQueryData(fa);\n        return ba;\n    };\n    function t(y, z, aa, ba) {\n        var ca = new Date(), da = ((((ca - y.userActive)) / 1000) | 0);\n        if ((da < 0)) {\n            o.warn(\"idle_regression\", {\n                idleTime: da,\n                now: ca.getTime(),\n                userActive: y.userActive\n            });\n        };\n        var ea = {\n            channel: y.user_channel,\n            seq: y.seq,\n            partition: y.partition,\n            clientid: y.sessionID,\n            cb: p(),\n            idle: da,\n            cap: 0\n        };\n        if ((da < 60)) {\n            ea.state = \"active\";\n        };\n        if (y.streamingCapable) {\n            ea.mode = \"stream\";\n            ea.format = \"json\";\n        }\n    ;\n        if (y.profile) {\n            ea.profile = y.profile;\n        };\n        if ((y.webrtcSupport && (((n.chrome() >= 24) || (n.firefox() >= 22))))) {\n            ea.cap = m.CAPABILITY_VOIP;\n        };\n        var fa = q(y, \"/pull\").setQueryData(ea), ga = new i(\"GET\", fa);\n        if (i.supportsCORS()) {\n            ga.xhr.withCredentials = true;\n        };\n        ga.timeout = (y.streamingCapable ? y.STREAMING_TIMEOUT : y.LONGPOLL_TIMEOUT);\n        ga.onJSON = z;\n        ga.onSuccess = aa;\n        ga.onError = function() {\n            var ha = ((((this.status == 12002) && (this._time >= y.MIN_12002_TIMEOUT))) || (((this.status == 504) && (this._time >= y.MIN_504_TIMEOUT)))), ia = (ha ? aa : ba);\n            return (ia && ia.apply(this, arguments));\n        };\n        ga.send();\n        y.inStreaming = y.streamingCapable;\n        return ga;\n    };\n    function u(y) {\n        this.manager = y;\n        ((this.init && this.init()));\n    };\n    function v(y) {\n        u.apply(this, arguments);\n    };\n    g(v.prototype, {\n        logName: \"CORS\",\n        enterState: function(y, z) {\n            if (this._request) {\n                this._request.abort();\n                this._request = null;\n            }\n        ;\n            if ((y == \"init\")) {\n                setTimeout(h(this.manager, \"exitState\", {\n                    status: m.OK,\n                    stateId: z.stateId\n                }), 3000, false);\n            };\n            if (!/pull|ping/.test(y)) {\n                return\n            };\n            var aa = this.manager;\n            if ((y == \"ping\")) {\n                this._request = s(z, h(aa, \"exitState\", {\n                    status: m.OK,\n                    stateId: z.stateId\n                }), h(aa, \"exitState\", {\n                    status: m.ERROR,\n                    stateId: z.stateId\n                }));\n            }\n             else if ((y == \"pull\")) {\n                this._request = t(z, h(aa, \"_processTransportData\", z.stateId), h(aa, \"exitState\", {\n                    status: m.OK,\n                    stateId: z.stateId\n                }), h(aa, \"exitState\", {\n                    status: m.ERROR,\n                    stateId: z.stateId\n                }));\n            }\n        ;\n        }\n    });\n    function w(y) {\n        o.log(\"iframe_init_constructor\");\n        u.apply(this, arguments);\n        this._iframe = document.createElement(\"iframe\");\n        this._iframe.style.display = \"none\";\n        document.body.appendChild(this._iframe);\n        l.publish(this, \"outerTransport\");\n    };\n    g(w.prototype, {\n        logName: \"iframe\",\n        _initIframe: function(y) {\n            o.log(\"iframe_init_start\");\n            window.onchanneliframeready = function() {\n                o.log(\"iframe_resources\");\n                return y.resources;\n            };\n            window.onchanneliframeloaded = function() {\n                o.log(\"iframe_loaded\");\n            };\n            if (y) {\n                this._iframeURI = q(y, y.path);\n                if (y.bustIframe) {\n                    var z = {\n                        partition: y.partition,\n                        cb: p()\n                    };\n                    this._iframeURI.setQueryData(z);\n                }\n            ;\n            }\n             else this._iframeURI = \"about:blank\";\n        ;\n            this._iframeProxy = null;\n            try {\n                this._iframe.contentWindow.location.replace(this._iframeURI);\n                o.log(\"iframe_uri_set\");\n            } catch (aa) {\n                o.error(\"iframe_uri_set_error\", aa);\n                this.exitState({\n                    status: m.ERROR,\n                    stateId: y.stateId\n                }, (aa + \"\"));\n            };\n        },\n        enterState: function(y, z) {\n            if ((y == \"init\")) {\n                this._initIframe(z);\n            }\n             else if (/idle|ping|pull/.test(y)) {\n                if (this._iframeProxy) {\n                    this._iframeProxy.enterState.apply(this._iframeProxy, arguments);\n                }\n                 else if ((y != \"idle\")) {\n                    this.exitState({\n                        status: m.ERROR,\n                        stateId: z.stateId\n                    }, \"iframe not yet loaded\");\n                }\n            ;\n            }\n             else if ((y == \"shutdown\")) {\n                this._initIframe();\n            }\n            \n        ;\n        },\n        _processTransportData: function() {\n            this.manager._processTransportData.apply(this.manager, arguments);\n        },\n        exitState: function(y) {\n            if (((this.manager.state == \"init\") && (y.status == m.OK))) {\n                this._iframeProxy = l.proxy(this._iframe.contentWindow, \"innerTransport\", [\"enterState\",], ((this._iframeURI + \"\")).replace(/iframe.*/, \"\"));\n            };\n            if ((/ping|pull/.test(this.manager.state) && !this._iframeProxy)) {\n                return\n            };\n            this.manager.exitState.apply(this.manager, arguments);\n        }\n    });\n    function x() {\n        this.init = this.init.bind(this);\n        u.apply(this, arguments);\n    };\n    g(x.prototype, {\n        logName: \"iframe(inner)\",\n        init: function() {\n            l.publish(this, \"innerTransport\");\n            try {\n                var z = l.proxy(window.parent, \"outerTransport\", [\"_processTransportData\",\"exitState\",], top.DocRPC.origin);\n                g(this, z);\n                this.exitState({\n                    status: m.OK,\n                    stateId: 1000000\n                });\n            } catch (y) {\n                o.error(\"iframe_inner_init_error\", y);\n            };\n        },\n        enterState: function(y, z) {\n            if (this._request) {\n                this._request.abort();\n                this._request = null;\n            }\n        ;\n            if ((y == \"ping\")) {\n                this._request = s(z, h(this, \"exitState\", {\n                    status: m.OK,\n                    stateId: z.stateId\n                }), h(this, \"exitState\", {\n                    status: m.ERROR,\n                    stateId: z.stateId\n                }));\n            }\n             else if ((y == \"pull\")) {\n                this._request = t(z, h(this, \"_processTransportData\", z.stateId), h(this, \"exitState\", {\n                    status: m.OK,\n                    stateId: z.stateId\n                }), h(this, \"exitState\", {\n                    status: m.ERROR,\n                    stateId: z.stateId\n                }));\n            }\n        ;\n        }\n    });\n    e.exports = {\n        getURI: q,\n        Transport: u,\n        CORSTransport: v,\n        IframeTransport: w,\n        IframeInnerTransport: x\n    };\n});\n__d(\"MovingStat\", [], function(a, b, c, d, e, f) {\n    function g(h) {\n        h = (h || 60000);\n        var i = {\n            t: new Date(),\n            count: 0,\n            v: 0\n        }, j = i, k = 0, l = 0;\n        function m() {\n            var n = (new Date() - h);\n            while (((j && j.next) && (j.t < n))) {\n                k -= j.v;\n                l -= j.count;\n                j = j.next;\n            };\n        };\n        this.add = function(n) {\n            k += n;\n            l++;\n            var o = new Date();\n            if (((o - i.t) < 1000)) {\n                i.v += n;\n                i.count++;\n            }\n             else {\n                i.next = {\n                    t: o,\n                    v: n,\n                    count: 1\n                };\n                i = i.next;\n                m();\n            }\n        ;\n        };\n        this.tally = function(n) {\n            n = (n || 1000);\n            m();\n            return {\n                sum: k,\n                count: l,\n                timeAverage: ((k * n) / h)\n            };\n        };\n    };\n    e.exports = g;\n});\n__d(\"ChannelManager\", [\"Event\",\"function-extensions\",\"AjaxRequest\",\"Arbiter\",\"AsyncRequest\",\"ChannelConstants\",\"ChannelInitialData\",\"ChannelSubdomain\",\"ChannelTransport\",\"Env\",\"FBAjaxRequest\",\"JSLogger\",\"MovingStat\",\"PresenceCookieManager\",\"PresenceState\",\"PresenceUtil\",\"Run\",\"SystemEvents\",\"URI\",\"UserActivity\",\"copyProperties\",\"createArrayFrom\",\"ChatVisibility\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\");\n    b(\"function-extensions\");\n    var h = b(\"AjaxRequest\"), i = b(\"Arbiter\"), j = b(\"AsyncRequest\"), k = b(\"ChannelConstants\"), l = b(\"ChannelInitialData\"), m = b(\"ChannelSubdomain\"), n = b(\"ChannelTransport\"), o = b(\"Env\"), p = b(\"FBAjaxRequest\"), q = b(\"JSLogger\"), r = b(\"MovingStat\"), s = b(\"PresenceCookieManager\"), t = b(\"PresenceState\"), u = b(\"PresenceUtil\"), v = b(\"Run\"), w = b(\"SystemEvents\"), x = b(\"URI\"), y = b(\"UserActivity\"), z = b(\"copyProperties\"), aa = b(\"createArrayFrom\"), ba = b(\"ChatVisibility\"), ca, da = q.create(\"channel\"), ea = null;\n    function fa(qa) {\n        ea = qa;\n    };\n    var ga = {\n        idle: {\n            ok: \"init!\"\n        },\n        init: {\n            ok: \"pull!\",\n            error: \"reconnect\",\n            sys_online: \"init\",\n            sys_timetravel: \"init\"\n        },\n        pull: {\n            ok: \"pull!\",\n            error: \"ping\",\n            error_missing: \"pull\",\n            error_msg_type: \"pull\",\n            refresh_0: \"reconnect\",\n            refresh_110: \"reconnect\",\n            refresh_111: \"reconnect\",\n            refresh_112: \"pull\",\n            refresh_113: \"pull\",\n            refresh_117: \"reconnect\"\n        },\n        ping: {\n            ok: \"pull!\",\n            error: \"ping\",\n            error_stale: \"reconnect!\"\n        },\n        reconnect: {\n            ok: \"init!\",\n            error: \"reconnect\",\n            sys_online: \"reconnect\",\n            sys_timetravel: \"reconnect\"\n        },\n        shutdown: {\n        },\n        _all: {\n            error_max: \"shutdown!\",\n            error_shutdown: \"shutdown!\",\n            sys_owner: \"reconnect\",\n            sys_nonowner: \"idle!\",\n            sys_online: \"ping\",\n            sys_offline: \"idle!\",\n            sys_timetravel: \"ping\"\n        }\n    }, ha = {\n        userActive: (ba.isOnline() ? Date.now() : 0),\n        sessionID: (((Math.random() * 2147483648) | 0)).toString(16),\n        streamingCapable: false,\n        inStreaming: false,\n        LONGPOLL_TIMEOUT: 60000,\n        STREAMING_TIMEOUT: 60000,\n        P_TIMEOUT: 30000,\n        IFRAME_LOAD_TIMEOUT: 30000,\n        MIN_RETRY_INTERVAL: 5000,\n        MAX_RETRY_INTERVAL: 30000,\n        MIN_12002_TIMEOUT: 9000,\n        MIN_504_TIMEOUT: 20000,\n        STALL_THRESHOLD: 180000,\n        JUMPSTART_THRESHOLD: 90000,\n        MIN_INIT_PROBE_DELAY: 3000,\n        INIT_PROBE_DELAY_RANDOMIZE_RANGE: 12000,\n        PROBE_DELAY: 60000,\n        PROBE_HEARTBEATS_INTERVAL_LOW: 1000,\n        PROBE_HEARTBEATS_INTERVAL_HIGH: 3000,\n        STREAMING_EXIT_STATE_ON_CONTINUE: false\n    }, ia = 1, ja = {\n    }, ka = 0;\n    function la() {\n        return (j.lastSuccessTime ? Math.round((((Date.now() - j.lastSuccessTime)) / 1000)) : -1);\n    };\n    function ma() {\n        var qa = {\n        };\n        if (ca.getConfig(\"host\")) {\n            qa[ca.getConfig(\"user_channel\")] = ca.getConfig(\"seq\", 0);\n        };\n        return qa;\n    };\n    function na() {\n        var qa = Date.now(), ra = Date.now(), sa = {\n            total: 0\n        }, ta = \"idle\", ua = false;\n        w.subscribe([w.USER,w.ONLINE,w.TIME_TRAVEL,], function(xa, ya) {\n            pa(true);\n            ra = null;\n            ca.lastPullTime = Date.now();\n            var za;\n            switch (xa) {\n              case w.USER:\n                za = (w.isPageOwner() ? k.SYS_OWNER : k.SYS_NONOWNER);\n                break;\n              case w.ONLINE:\n                za = (ya ? k.SYS_ONLINE : k.SYS_OFFLINE);\n                break;\n              case w.TIME_TRAVEL:\n                za = k.SYS_TIMETRAVEL;\n                break;\n            };\n            ca.exitState({\n                status: za,\n                stateId: ia\n            });\n        });\n        var va = function(xa, ya) {\n            var za = Date.now(), ab;\n            if (ya) {\n                qa = za;\n                ab = (ya.nextState || ya.state);\n            }\n             else ab = ta;\n        ;\n            w.checkTimeTravel();\n            if (ra) {\n                var bb = Math.round((((za - ra)) / 1000));\n                if ((bb > 0)) {\n                    sa[ta] = (((sa[ta] || 0)) + bb);\n                    sa.total += bb;\n                }\n            ;\n            }\n        ;\n            ta = ab;\n            ra = za;\n            if (!xa) {\n                sa.lastSuccessTime = la();\n                sa.online = w.isOnline();\n                da.log(\"rollup\", sa);\n            }\n        ;\n        };\n        i.subscribe(k.ON_ENTER_STATE, va);\n        setInterval(va, 60000, false);\n        i.subscribe(q.DUMP_EVENT, function(xa, ya) {\n            ya.channelRollup = sa;\n        });\n        var wa = function() {\n            if ((ca.isShutdown() || ca.shouldIdle())) {\n                return\n            };\n            w.checkTimeTravel();\n            var xa = (Date.now() - ((ca.lastPullTime || o.start)));\n            if ((!ua && (xa > ha.STALL_THRESHOLD))) {\n                var ya = la();\n                da.error(\"stall\", {\n                    lastSuccessTime: ya,\n                    rollupState: ta\n                });\n                ua = true;\n            }\n        ;\n            var za = (Date.now() - qa);\n            if (((ca.state == \"pull\") && (za > ha.JUMPSTART_THRESHOLD))) {\n                qa = null;\n                da.warn(\"jumpstart\", {\n                    state: ca.state,\n                    dormant: za\n                });\n                ca.enterState(\"init\");\n            }\n        ;\n        };\n        setInterval(wa, 10000, false);\n    };\n    function oa() {\n        var qa = Date.now(), ra = 1;\n        function sa() {\n            setTimeout(sa, (ra * 1000), false);\n            var xa = ca.state;\n            if (((xa == \"idle\") && ca.shouldIdle())) {\n                return\n            };\n            da.bump(\"conn_t\", ra);\n            if ((xa == \"pull\")) {\n                da.bump(\"conn_t_pull\", ra);\n            };\n        };\n        sa();\n        var ta = [15,30,60,120,240,], ua = false, va = false;\n        function wa(xa) {\n            setTimeout(function() {\n                da.rate((\"pullenter_\" + xa), ua);\n                da.rate((\"pullexit_\" + xa), va);\n            }, (xa * 1000), false);\n        };\n        while (ta.length) {\n            wa(ta.shift());;\n        };\n        i.subscribe(k.ON_ENTER_STATE, function(xa, ya) {\n            if ((ya.state == \"pull\")) {\n                ua = true;\n            };\n            qa = Date.now();\n        });\n        i.subscribe(k.ON_EXIT_STATE, function(xa, ya) {\n            if (((ya.state != \"pull\") || !qa)) {\n                return\n            };\n            var za = \"other\";\n            if ((ya.status == k.OK)) {\n                va = true;\n                za = \"ok\";\n            }\n             else if ((ya.xhr && ya.xhr.errorType)) {\n                za = (/ar:(\\w+)/.test(ya.xhr.errorType) && RegExp.$1);\n            }\n             else if (/^sys_/.test(ya.status)) {\n                return\n            }\n            \n        ;\n            var ab = (((Date.now() - qa)) / 1000);\n            if ((ab < 0)) {\n                return;\n            }\n             else if ((ab > 3600)) {\n                ab = 3600;\n            }\n        ;\n            da.bump(\"conn_num\");\n            da.bump(\"conn_exit\", ab);\n            da.bump((\"conn_num_\" + za));\n            da.bump((\"conn_exit_\" + za), ab);\n        });\n    };\n    function pa(qa) {\n        if (qa) {\n            ka = 0;\n            ja = {\n            };\n        }\n         else ka++;\n    ;\n    };\n    ca = {\n        state: \"idle\",\n        nextState: null,\n        lastPullTime: Date.now(),\n        heartbeats: [],\n        setTestCallback: fa,\n        init: function(qa) {\n            this.init = function() {\n            \n            };\n            if ((typeof (y) != \"undefined\")) {\n                y.subscribe(function() {\n                    if (ba.isOnline()) {\n                        ha.userActive = Date.now();\n                    };\n                }.bind(this));\n            }\n             else da.error(\"user_activity_undefined\");\n        ;\n            s.register(\"ch\", ma);\n            var ra = this.getConfig(\"max_conn\", 2), sa = Math.floor((Math.random() * 32));\n            ha.subdomain = m.allocate(ra, sa);\n            if ((typeof window.onpageshow != \"undefined\")) {\n                g.listen(window, \"pagehide\", m.clear);\n            }\n             else v.onUnload(m.clear);\n        ;\n            this._transportRate = new r(30000);\n            var ta = (((h.supportsCORS() && !ha.forceIframe)) ? \"CORSTransport\" : \"IframeTransport\");\n            this.transport = new n[ta](this);\n            if (qa) {\n                this.enterState.apply(this, arguments);\n            };\n            i.subscribe(q.DUMP_EVENT, function(event, va) {\n                va.transportRate = this._transportRate.tally();\n                va.transportType = ta;\n                va.transportVersion = 2;\n            }.bind(this));\n            na();\n            oa();\n            if ((((ca.getConfig(\"tryStreaming\") && ca.getConfig(\"host\")) && h.supportsCORS()) && !ha.forceIframe)) {\n                var ua = (ha.MIN_INIT_PROBE_DELAY + (Math.random() * ha.INIT_PROBE_DELAY_RANDOMIZE_RANGE));\n                setTimeout(this._probeTest, ua, false);\n            }\n        ;\n        },\n        configure: function() {\n            var qa = aa(arguments);\n            da.log(\"configure\", qa);\n            qa.forEach(z.bind(null, ha));\n            i.inform(k.ON_CONFIG, this);\n        },\n        getConfig: function(qa, ra) {\n            return ((qa in ha) ? ha[qa] : ra);\n        },\n        isShutdown: function() {\n            return (this.state == \"shutdown\");\n        },\n        shouldIdle: function() {\n            return !((w.isPageOwner() && w.isOnline()));\n        },\n        _sendIframeError: function(qa) {\n            var ra = new j().setURI(\"/ajax/presence/reconnect.php\").setData({\n                reason: qa,\n                fb_dtsg: o.fb_dtsg\n            }).setOption(\"suppressErrorHandlerWarning\", true).setOption(\"retries\", 1).setMethod(\"GET\").setReadOnly(true).setAllowCrossPageTransition(true);\n            (ra.specifiesWriteRequiredParams() && ra.send());\n        },\n        _getDelay: function() {\n            var qa = Math.min((ha.MIN_RETRY_INTERVAL * Math.pow(2, Math.max(0, (ka - 1)))), ha.MAX_RETRY_INTERVAL);\n            return ((qa * ((13517 + (Math.random() / 2)))) | 0);\n        },\n        enterState: function() {\n            if (this._inEnterState) {\n                da.warn(\"enterstate_recursion\");\n            };\n            this._inEnterState = true;\n            try {\n                this._enterState.apply(this, arguments);\n                this._inEnterState = false;\n            } catch (qa) {\n                this._inEnterState = false;\n                throw qa;\n            };\n        },\n        _enterState: function(qa) {\n            var ra = 0, sa = aa(arguments);\n            if (this.isShutdown()) {\n                return\n            };\n            if (((qa != \"idle!\") && this.shouldIdle())) {\n                return\n            };\n            ia++;\n            ha.stateId = ia;\n            clearTimeout(this._deferredTransition);\n            this._deferredTransition = null;\n            this.transport.enterState(\"idle\");\n            this.state = \"idle\";\n            this.nextState = null;\n            if (/!$/.test(qa)) {\n                var ta = this._transportRate.tally().timeAverage, ua = ca.getConfig(\"MAX_CHANNEL_STATES_PER_SEC\", 1);\n                if ((ta >= ua)) {\n                    if (!this._throttled) {\n                        this._throttled = true;\n                        da.warn(\"throttled\");\n                    }\n                ;\n                    da.bump(\"throttle\");\n                    ra = (1000 / ua);\n                }\n            ;\n            }\n             else if (!(/#$/.test(qa))) {\n                ra = this._getDelay();\n            }\n        ;\n            qa = qa.replace(/\\W*$/, \"\");\n            if (!ga[qa]) {\n                throw new Error((\"invalid state:\" + qa))\n            };\n            var va;\n            if ((ra <= 0)) {\n                va = {\n                    state: qa\n                };\n                this._transportRate.add(1);\n                this.state = qa;\n                var wa = this[(\"_enter_\" + this.state)];\n                if (wa) {\n                    sa.shift();\n                    wa.apply(this, sa);\n                }\n            ;\n                if (/init|idle|pull|ping/.test(this.state)) {\n                    if ((ha.streamingCapable && /pull/.test(this.state))) {\n                        this.heartbeats = [];\n                    };\n                    this.transport.enterState(this.state, ha);\n                    if ((this.state == \"ping\")) {\n                        va.url = n.getURI(ha).toString();\n                        va.port = (ha.port || \"undefined\");\n                    }\n                ;\n                }\n            ;\n            }\n             else {\n                this.state = \"idle\";\n                this.nextState = qa;\n                va = {\n                    state: this.state,\n                    delay: ra,\n                    nextState: qa\n                };\n                sa[0] = (qa + \"#\");\n                this._deferredTransition = (function() {\n                    this._deferredTransition = null;\n                    this.enterState.apply(this, sa);\n                }).bind(this).defer(ra, false);\n            }\n        ;\n            if (/pull/.test(qa)) {\n                va.client_id = ha.sessionID;\n                va.streaming = ha.inStreaming;\n            }\n        ;\n            da.log((\"enter_\" + this.state), va);\n            i.inform(k.ON_ENTER_STATE, va);\n        },\n        exitState: function(qa, ra) {\n            var sa = qa.stateId, ta = qa.status;\n            if ((this.isShutdown() || (sa < ia))) {\n                return\n            };\n            var ua = aa(arguments), va = this.state;\n            ua[0] = qa.status;\n            var wa = {\n                state: va,\n                status: ta\n            };\n            if (/pull/.test(va)) {\n                wa.client_id = ha.sessionID;\n                wa.streaming = ha.inStreaming;\n            }\n        ;\n            if ((/ping/.test(va) && (ta != k.OK))) {\n                wa.url = n.getURI(ha).toString();\n            };\n            if (this.nextState) {\n                wa.nextState = this.nextState;\n            };\n            if ((ra && ra.errorType)) {\n                wa.xhr = (ra.toJSON ? ra.toJSON() : ra);\n                delete wa.xhr.json;\n            }\n        ;\n            if ((ra && ra.json)) {\n                if (ra.json.t) {\n                    wa.t = ra.json.t;\n                };\n                if (ra.json.reason) {\n                    wa.reason = ra.json.reason;\n                };\n                if (ra.json.seq) {\n                    wa.seq = ra.json.seq;\n                };\n            }\n        ;\n            da.log((\"exit_\" + va), wa);\n            i.inform(k.ON_EXIT_STATE, wa);\n            var xa = this[(\"_exit_\" + va)];\n            if (xa) {\n                ta = (xa.apply(this, ua) || ta);\n            };\n            if ((ta != k.OK)) {\n                pa();\n                ja[va] = (((ja[va] || 0)) + 1);\n            }\n        ;\n            var ya = (ga[(this.nextState || va)][ta] || ga._all[ta]), za = (ya && ya.replace(/!*$/, \"\"));\n            if (!za) {\n                da.error(\"terminal_transition\", wa);\n                this._shutdownHint = k.HINT_INVALID_STATE;\n                ya = \"shutdown!\";\n            }\n        ;\n            this._lastState = va;\n            this._lastStatus = ta;\n            this.enterState(ya);\n        },\n        _processTransportData: function(qa, ra) {\n            var sa = ra.json, ta = sa.t;\n            if ((\"s\" in sa)) {\n                sa.seq = sa.s;\n                delete sa.s;\n            }\n        ;\n            var ua = ha.seq;\n            if ((\"seq\" in sa)) {\n                ha.seq = sa.seq;\n                t.doSync();\n            }\n        ;\n            switch (ta) {\n              case \"continue\":\n                if ((ha.inStreaming && (this.heartbeats.length < 1))) {\n                    ha.streamingCapable = false;\n                    da.log(\"switch_to_longpoll\");\n                    setTimeout(this._probeTest, ha.PROBE_DELAY, false);\n                }\n            ;\n                pa(true);\n                if ((!ha.inStreaming || ha.STREAMING_EXIT_STATE_ON_CONTINUE)) {\n                    this.exitState({\n                        status: k.OK,\n                        stateId: qa\n                    });\n                };\n                break;\n              case \"refresh\":\n            \n              case \"refreshDelay\":\n                this.exitState({\n                    status: (\"refresh_\" + ((sa.reason || 0))),\n                    stateId: qa\n                }, ra);\n                break;\n              case \"fullReload\":\n                s.clear();\n                da.log(\"invalid_history\");\n                i.inform(k.ON_INVALID_HISTORY);\n                this.exitState({\n                    status: k.ERROR_MISSING,\n                    stateId: qa\n                }, ra);\n                break;\n              case \"msg\":\n                var va, wa, xa, ya;\n                pa(true);\n                wa = sa.ms;\n                xa = (ha.seq - wa.length);\n                for (va = 0; (va < wa.length); va++, xa++) {\n                    if ((xa >= ua)) {\n                        ya = wa[va];\n                        if (ya.type) {\n                            if (((ya.type === \"messaging\") && ya.message)) {\n                                var za = (ya.unread_counts && ya.unread_counts.inbox);\n                                da.debug(\"message\", {\n                                    type: \"messaging\",\n                                    inbox_unread: za,\n                                    tid: ya.message.tid,\n                                    mid: ya.message.mid\n                                });\n                            }\n                             else if ((ya.type === \"m_messaging\")) {\n                                da.debug(\"message\", {\n                                    type: \"m_messaging\",\n                                    tid: ya.tid,\n                                    mid: ya.uuid\n                                });\n                            }\n                             else da.debug(\"message\", {\n                                type: ya.type\n                            });\n                            \n                        ;\n                            i.inform(k.getArbiterType(ya.type), {\n                                obj: ya\n                            });\n                        }\n                    ;\n                    }\n                     else da.warn(\"seq_regression\", {\n                        seq: xa,\n                        last_seq: ua,\n                        messages: wa.length\n                    });\n                ;\n                };\n                break;\n              case \"heartbeat\":\n                if (ha.inStreaming) {\n                    var ab = Date.now();\n                    if ((this.heartbeats.length > 0)) {\n                        var bb = (ab - this.heartbeats[(this.heartbeats.length - 1)]);\n                        da.log(\"heartbeat_interval\", {\n                            client_id: ha.sessionID,\n                            interval: bb\n                        });\n                    }\n                ;\n                    this.heartbeats.push(ab);\n                }\n            ;\n                break;\n              default:\n                da.error(\"unknown_msg_type\", {\n                    type: ta\n                });\n                break;\n            };\n        },\n        _enter_init: function() {\n            if ((ja.init >= ca.getConfig(\"MAX_INIT_FAILS\", 2))) {\n                return this.exitState.bind(this, {\n                    status: k.ERROR_MAX,\n                    stateId: ia\n                }).defer()\n            };\n            this._initTimer = this.exitState.bind(this, {\n                status: k.ERROR,\n                stateId: ia\n            }, \"timeout\").defer(ha.IFRAME_LOAD_TIMEOUT, false);\n        },\n        _enter_reconnect: function(qa) {\n            var ra = ia;\n            if (!u.hasUserCookie()) {\n                da.warn(\"no_user_cookie\");\n                (function() {\n                    ca._shutdownHint = k.HINT_AUTH;\n                    ca.exitState({\n                        status: k.ERROR_SHUTDOWN,\n                        stateId: ra\n                    });\n                }).defer();\n                return;\n            }\n        ;\n            var sa = {\n                reason: qa,\n                fb_dtsg: o.fb_dtsg\n            };\n            if (o.fb_isb) {\n                sa.fb_isb = o.fb_isb;\n            };\n            if (ea) {\n                ea(sa);\n            };\n            var ta = new p(\"GET\", \"/ajax/presence/reconnect.php\", sa);\n            ta.onSuccess = (function() {\n                ca.configure(ta.json);\n                s.store();\n                this.exitState({\n                    status: k.OK,\n                    stateId: ra\n                });\n            }).bind(this);\n            ta.onError = (function() {\n                var ua = (ta.json && ta.json.error);\n                if (((ta.errorType == h.TRANSPORT_ERROR) || (ta.errorType == h.PROXY_ERROR))) {\n                    this._shutdownHint = k.HINT_CONN;\n                };\n                if ((ua && (ua == 1356007))) {\n                    this._shutdownHint = k.HINT_MAINT;\n                }\n                 else if ((((ua == 1357001) || (ua == 1357004)) || (ua == 1348009))) {\n                    this._shutdownHint = k.HINT_AUTH;\n                }\n                 else this._shutdownHint = null;\n                \n            ;\n                this.exitState({\n                    status: (this._shutdownHint ? k.ERROR_SHUTDOWN : k.ERROR),\n                    stateId: ra\n                }, ta);\n            }).bind(this);\n            ta.send();\n        },\n        _enter_shutdown: function() {\n            i.inform(k.ON_SHUTDOWN, {\n                reason: this._shutdownHint\n            });\n        },\n        _exit_init: function(qa) {\n            if (this._initTimer) {\n                this._initTimer = clearTimeout(this._initTimer);\n            };\n            if ((qa == k.ERROR_MAX)) {\n                this._sendIframeError(k.reason_IFrameLoadGiveUp);\n            };\n        },\n        _exit_pull: function(qa) {\n            if ((qa == k.OK)) {\n                this.lastPullTime = Date.now();\n            };\n        },\n        _exit_ping: function(qa) {\n            if ((qa == k.OK)) {\n                var ra = (Date.now() - ((this.lastPullTime || o.start)));\n                if ((ra > ha.STALL_THRESHOLD)) {\n                    return k.ERROR_STALE\n                };\n            }\n        ;\n        },\n        _probeTest: function() {\n            ha.streamingCapable = false;\n            var qa = [], ra = {\n                mode: \"stream\",\n                format: \"json\"\n            }, sa = new x(\"/probe\").setDomain((ha.host + \".facebook.com\")).setPort(ha.port).setSecure(x().isSecure()).setQueryData(ra), ta = new h(\"GET\", sa);\n            ta.onJSON = function(ua, va) {\n                if (((ua && ua.json) && (ua.json.t === \"heartbeat\"))) {\n                    qa.push(Date.now());\n                    if ((qa.length >= 2)) {\n                        var wa = (qa[1] - qa[0]);\n                        if (((wa >= ha.PROBE_HEARTBEATS_INTERVAL_LOW) && (wa <= ha.PROBE_HEARTBEATS_INTERVAL_HIGH))) {\n                            ha.streamingCapable = true;\n                            da.log(\"switch_to_streaming\");\n                        }\n                    ;\n                        da.log(\"probe_ok\", {\n                            time: wa\n                        });\n                    }\n                ;\n                }\n            ;\n            };\n            ta.onSuccess = function(ua) {\n                if ((qa.length != 2)) {\n                    ha.streamingCapable = false;\n                    da.error(\"probe_error\", {\n                        error: (\"beats.length = \" + qa.length)\n                    });\n                }\n            ;\n            };\n            ta.onError = function(ua) {\n                ha.streamingCapable = false;\n                da.error(\"probe_error\", ua);\n            };\n            da.log(\"probe_request\");\n            ta.send();\n        }\n    };\n    e.exports = ca;\n    if (l.channelConfig) {\n        ca.configure(l.channelConfig);\n        if (/shutdown/.test(l.state)) {\n            ca._shutdownHint = k[l.reason];\n        };\n        ca.init(l.state, l.reason);\n    }\n;\n});\n__d(\"ChannelConnection\", [\"Arbiter\",\"copyProperties\",\"ChatConfig\",\"Run\",\"SystemEvents\",\"ChannelConstants\",\"ChannelManager\",\"JSLogger\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"copyProperties\"), i = b(\"ChatConfig\"), j = b(\"Run\"), k = b(\"SystemEvents\"), l = b(\"ChannelConstants\"), m = b(\"ChannelManager\"), n = b(\"JSLogger\"), o = n.create(\"channel_connection\"), p = null, q = null, r = null, s = null, t = 0, u = h(new g(), {\n        CONNECTED: \"chat-connection/connected\",\n        RECONNECTING: \"chat-connection/reconnecting\",\n        SHUTDOWN: \"chat-connection/shutdown\",\n        MUTE_WARNING: \"chat-connection/mute\",\n        UNMUTE_WARNING: \"chat-connection/unmute\"\n    });\n    function v() {\n        if (q) {\n            clearTimeout(q);\n            q = null;\n        }\n    ;\n    };\n    function w() {\n        v();\n        o.log(\"unmute_warning\");\n        u.inform(u.UNMUTE_WARNING);\n    };\n    function x(ba) {\n        v();\n        q = w.defer(ba, false);\n        o.log(\"mute_warning\", {\n            time: ba\n        });\n        u.inform(u.MUTE_WARNING);\n    };\n    function y() {\n        if (r) {\n            clearTimeout(r);\n            r = null;\n        }\n    ;\n    };\n    function z(ba, ca) {\n        y();\n        if (((ba === l.ON_ENTER_STATE) && (((ca.nextState || ca.state)) === \"pull\"))) {\n            if ((s !== u.CONNECTED)) {\n                o.log(\"connected\");\n                var da = !s;\n                s = u.CONNECTED;\n                t = 0;\n                u.inform(u.CONNECTED, {\n                    init: da\n                });\n            }\n        ;\n        }\n         else if (((ba === l.ON_ENTER_STATE) && (((((ca.nextState || ca.state)) === \"ping\") || ((!ca.nextState && (ca.state === \"idle\"))))))) {\n            r = (function() {\n                var ea = null;\n                if (!(((ca.state === \"idle\") && !ca.nextState))) {\n                    ea = ((ca.delay || 0));\n                };\n                o.log(\"reconnecting\", {\n                    delay: ea\n                });\n                if (u.disconnected()) {\n                    o.log(\"reconnecting_ui\", {\n                        delay: ea\n                    });\n                };\n                s = u.RECONNECTING;\n                (((ca.state === \"idle\")) && t++);\n                if ((t > 1)) {\n                    u.inform(u.RECONNECTING, ea);\n                }\n                 else if ((!ca.nextState && (ca.state === \"idle\"))) {\n                    z(ba, ca);\n                }\n            ;\n            }).defer(500, false);\n        }\n         else if ((ba === l.ON_SHUTDOWN)) {\n            o.log(\"shutdown\", {\n                reason: ca.reason\n            });\n            s = u.SHUTDOWN;\n            t = 0;\n            u.inform(u.SHUTDOWN, ca.reason);\n        }\n        \n        \n    ;\n    };\n    function aa(ba) {\n        if (((m.state === \"ping\") || m.isShutdown())) {\n            return\n        };\n        o.log(\"reconnect\", {\n            now: ba\n        });\n        u.inform(u.RECONNECTING, 0);\n        if (!!ba) {\n            if ((p !== null)) {\n                clearTimeout(p);\n                p = null;\n            }\n        ;\n            m.enterState(\"ping!\");\n        }\n         else if (!p) {\n            p = setTimeout(function() {\n                m.enterState(\"ping!\");\n                p = null;\n            }, i.get(\"channel_manual_reconnect_defer_msec\"), false);\n        }\n    ;\n    };\n    if (m.isShutdown()) {\n        z(l.ON_SHUTDOWN, m._shutdownHint);\n    }\n     else z(l.ON_ENTER_STATE, {\n        state: m.state,\n        nextState: m.nextState,\n        delay: 0\n    });\n;\n    g.subscribe([l.ON_ENTER_STATE,l.ON_SHUTDOWN,], z);\n    k.subscribe(k.TIME_TRAVEL, function() {\n        aa();\n        x(i.get(\"mute_warning_time_msec\"));\n    });\n    j.onBeforeUnload(y, false);\n    h(u, {\n        disconnected: function() {\n            return ((s === u.SHUTDOWN) || ((((s === u.RECONNECTING) && !q) && (t > 1))));\n        },\n        isShutdown: function() {\n            return (s === u.SHUTDOWN);\n        },\n        reconnect: aa,\n        unmuteWarning: w\n    });\n    e.exports = u;\n});\n__d(\"ChatFavoriteList\", [\"AsyncRequest\",\"arrayContains\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = b(\"arrayContains\"), i = b(\"emptyFunction\"), j = false, k = [], l = [], m = false;\n    function n() {\n        var r = k.join(\",\");\n        new g(\"/ajax/chat/favorite_list.php\").setData({\n            favorite_list: r\n        }).setHandler(i).setErrorHandler(i).send();\n    };\n    function o(r) {\n        return r.toString();\n    };\n    function p(r) {\n        if ((k.length != r.length)) {\n            return true\n        };\n        for (var s = 0; (s < r.length); s++) {\n            if ((k[s] !== r[s].toString())) {\n                return true\n            };\n        };\n        return false;\n    };\n    var q = {\n        isEditMode: function() {\n            var r = null;\n            d([\"ChatSidebar\",], function(s) {\n                r = s;\n            });\n            return ((j && r) && r.isEnabled());\n        },\n        toggleEditMode: function() {\n            j = !j;\n            if (j) {\n                l = k.slice();\n            };\n        },\n        get: function() {\n            if (j) {\n                return l.slice();\n            }\n             else return k.slice()\n        ;\n        },\n        isFavored: function(r) {\n            return h(l, r.toString());\n        },\n        init: function(r) {\n            k = r.slice().map(o);\n            l = k.slice();\n        },\n        toggleID: function(r) {\n            if (!j) {\n                return\n            };\n            r = r.toString();\n            var s = l.indexOf(r);\n            if ((s >= 0)) {\n                l.splice(s, 1);\n            }\n             else l.push(r);\n        ;\n            m = true;\n        },\n        hasChanged: function() {\n            if (m) {\n                m = false;\n                return true;\n            }\n        ;\n            return false;\n        },\n        updateList: function(r) {\n            if (!j) {\n                return\n            };\n            l = r.map(o);\n        },\n        save: function() {\n            if (p(l)) {\n                k = l;\n                n();\n            }\n        ;\n        }\n    };\n    e.exports = q;\n});\n__d(\"ChatContexts\", [], function(a, b, c, d, e, f) {\n    var g = {\n    };\n    function h(k) {\n        var l = (k ? k.subtext : \"\");\n        return l;\n    };\n    function i(k, l) {\n        g[k] = l;\n    };\n    var j = {\n        get: function(k) {\n            if ((k in g)) {\n                return g[k];\n            }\n             else return null\n        ;\n        },\n        update: function(k) {\n            for (var l in k) {\n                i(l, k[l]);;\n            };\n        },\n        getShortDisplay: function(k) {\n            return h(j.get(k));\n        }\n    };\n    e.exports = j;\n});\n__d(\"LastMobileActiveTimes\", [\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"tx\"), h = 0, i = {\n    };\n    function j(n) {\n        if ((!h || !n)) {\n            return \"\"\n        };\n        var o = (h - n), p = Math.floor((o / 60)), q = Math.floor((p / 60)), r = Math.floor((q / 24));\n        if ((p <= 1)) {\n            return g._(\"{count}m\", {\n                count: 1\n            });\n        }\n         else if ((p < 60)) {\n            return g._(\"{count}m\", {\n                count: p\n            });\n        }\n         else if ((q < 24)) {\n            return g._(\"{count}h\", {\n                count: q\n            });\n        }\n         else if ((r < 3)) {\n            return g._(\"{count}d\", {\n                count: r\n            });\n        }\n         else return \"\"\n        \n        \n        \n    ;\n    };\n    function k(n, o) {\n        i[n] = o;\n    };\n    function l(n) {\n        if ((n in i)) {\n            return i[n];\n        }\n         else return 0\n    ;\n    };\n    var m = {\n        update: function(n, o) {\n            h = (o / 1000);\n            for (var p in n) {\n                k(p, n[p]);;\n            };\n        },\n        getShortDisplay: function(n) {\n            return j(l(n));\n        }\n    };\n    e.exports = m;\n});\n__d(\"ServerTime\", [\"PresenceInitialData\",], function(a, b, c, d, e, f) {\n    var g = b(\"PresenceInitialData\"), h;\n    function i(k) {\n        h = (Date.now() - k);\n    };\n    i(g.serverTime);\n    var j = {\n        get: function() {\n            return (Date.now() - h);\n        },\n        getSkew: function() {\n            return h;\n        },\n        update: function(k) {\n            i(k);\n        }\n    };\n    e.exports = j;\n});\n__d(\"PresenceStatus\", [\"AvailableListConstants\",\"ChatConfig\",\"ChatVisibility\",\"Env\",\"PresencePrivacy\",\"ServerTime\",\"createObjectFrom\",], function(a, b, c, d, e, f) {\n    var g = b(\"AvailableListConstants\"), h = b(\"ChatConfig\"), i = b(\"ChatVisibility\"), j = b(\"Env\"), k = b(\"PresencePrivacy\"), l = b(\"ServerTime\"), m = b(\"createObjectFrom\"), n = {\n    }, o = {\n    }, p = {\n    }, q = {\n    }, r = {\n        resetPresenceData: function() {\n            n = {\n            };\n            q = {\n            };\n            p = {\n            };\n        },\n        reset: function() {\n            r.resetPresenceData();\n            o = {\n            };\n        },\n        get: function(s) {\n            if ((s == j.user)) {\n                return (i.isOnline() ? g.ACTIVE : g.OFFLINE)\n            };\n            var t = g.OFFLINE;\n            if ((s in n)) {\n                t = n[s];\n            };\n            if (!k.allows(s)) {\n                t = g.OFFLINE;\n            };\n            if ((t == g.OFFLINE)) {\n                if (o[s]) {\n                    t = g.MOBILE;\n                }\n            };\n            return t;\n        },\n        getGroup: function(s) {\n            if (!h.get(\"chat_group_presence\", 0)) {\n                return g.OFFLINE\n            };\n            return (s.some(function(t) {\n                if ((t == j.user)) {\n                    return false\n                };\n                return ((r.get(t) === g.ACTIVE));\n            }) ? g.ACTIVE : g.OFFLINE);\n        },\n        set: function(s, t, u, v) {\n            if ((s == j.user)) {\n                return false\n            };\n            switch (t) {\n              case g.OFFLINE:\n            \n              case g.IDLE:\n            \n              case g.ACTIVE:\n            \n              case g.MOBILE:\n                break;\n              default:\n                return false;\n            };\n            var w = (r.get(s) != t);\n            if (u) {\n                p[s] = l.get();\n                q[s] = v;\n            }\n        ;\n            n[s] = t;\n            return w;\n        },\n        setMobileFriends: function(s) {\n            o = m(s);\n        },\n        getOnlineIDs: function() {\n            var s, t = [];\n            for (s in n) {\n                if ((r.get(s) === g.ACTIVE)) {\n                    t.push(s);\n                };\n            };\n            return t;\n        },\n        getAvailableIDs: function() {\n            var s = r.getOnlineIDs(), t;\n            for (t in o) {\n                if (n[t]) {\n                    continue;\n                };\n                s.push(t);\n            };\n            return s;\n        },\n        getOnlineCount: function() {\n            return r.getOnlineIDs().length;\n        },\n        getPresenceStats: function() {\n            var s = 0, t = 0, u = 0, v = 0, w = 0;\n            for (var x in n) {\n                s += 1;\n                switch (r.get(x)) {\n                  case g.OFFLINE:\n                    t += 1;\n                    break;\n                  case g.IDLE:\n                    u += 1;\n                    break;\n                  case g.ACTIVE:\n                    v += 1;\n                    break;\n                  case g.MOBILE:\n                    w += 1;\n                    break;\n                  default:\n                    break;\n                };\n            };\n            return {\n                total: s,\n                offline: t,\n                idle: u,\n                active: v,\n                mobile: w\n            };\n        },\n        getDebugInfo: function(s) {\n            return {\n                id: s,\n                presence: n[s],\n                overlaySource: q[s],\n                overlayTime: p[s],\n                mobile: o[s]\n            };\n        }\n    };\n    e.exports = r;\n});\n__d(\"PresencePoller\", [\"AvailableListConstants\",\"AvailableListInitialData\",\"BanzaiODS\",\"ChannelConnection\",\"ChatContexts\",\"ChatFavoriteList\",\"ChatVisibility\",\"Env\",\"JSLogger\",\"LastMobileActiveTimes\",\"Poller\",\"PresenceStatus\",\"PresenceUtil\",\"ServerTime\",\"ShortProfiles\",\"UserActivity\",\"copyProperties\",\"debounceAcrossTransitions\",], function(a, b, c, d, e, f) {\n    var g = b(\"AvailableListConstants\"), h = b(\"AvailableListInitialData\"), i = b(\"BanzaiODS\"), j = b(\"ChannelConnection\"), k = b(\"ChatContexts\"), l = b(\"ChatFavoriteList\"), m = b(\"ChatVisibility\"), n = b(\"Env\"), o = b(\"JSLogger\"), p = b(\"LastMobileActiveTimes\"), q = b(\"Poller\"), r = b(\"PresenceStatus\"), s = b(\"PresenceUtil\"), t = b(\"ServerTime\"), u = b(\"ShortProfiles\"), v = b(\"UserActivity\"), w = b(\"copyProperties\"), x = b(\"debounceAcrossTransitions\"), y = 5, z = \"/ajax/chat/buddy_list.php\", aa = 1800000, ba = h.pollInterval, ca = h.lazyPollInterval, da = h.lazyThreshold, ea = o.create(\"available_list\"), fa = \"presence_poller\";\n    function ga(ha) {\n        this.$PresencePoller0 = ha;\n        this.$PresencePoller1 = false;\n        this.$PresencePoller2 = h.chatNotif;\n        this.$PresencePoller3 = new q({\n            interval: ba,\n            setupRequest: this.$PresencePoller4.bind(this),\n            clearOnQuicklingEvents: false,\n            dontStart: true\n        });\n        this.$PresencePoller5 = Date.now();\n        this.$PresencePoller6 = Date.now();\n        this.$PresencePoller7 = Date.now();\n        this.$PresencePoller8 = h.updateTime;\n        this.$PresencePoller9 = false;\n        this.$PresencePollera = 0;\n        if (h.favoriteList) {\n            l.init(h.favoriteList);\n        };\n        this.$PresencePollerb(\"available_initial_data\", h.updateTime, h.availableList, h.lastActiveTimes, h.mobileFriends);\n        v.subscribe(function(ia, ja) {\n            if ((ja.idleness > ba)) {\n                this.forceUpdate();\n            };\n        }.bind(this));\n    };\n    ga.prototype.start = function() {\n        this.$PresencePoller3.start.bind(this.$PresencePoller3).defer();\n    };\n    ga.prototype.forceUpdate = function() {\n        if (!this.$PresencePoller9) {\n            this.$PresencePoller3.request();\n        };\n    };\n    ga.prototype.getIsUserIdle = function() {\n        return this.$PresencePoller1;\n    };\n    ga.prototype.getWebChatNotification = function() {\n        return this.$PresencePoller2;\n    };\n    ga.prototype.getCallback = function() {\n        return this.$PresencePoller0;\n    };\n    ga.prototype.$PresencePollerc = function() {\n        return x(function() {\n            this.$PresencePoller0(g.ON_AVAILABILITY_CHANGED);\n        }.bind(this), 0)();\n    };\n    ga.prototype.$PresencePollerb = function(ha, ia, ja, ka, la) {\n        this.$PresencePoller8 = ia;\n        if (!Array.isArray(ja)) {\n            r.resetPresenceData();\n            for (var ma in ja) {\n                r.set(ma, ja[ma].a, false, ha);;\n            };\n        }\n    ;\n        if (ka) {\n            p.update(ka, ia);\n        };\n        if (la) {\n            r.setMobileFriends(la);\n        };\n        this.$PresencePollerc();\n    };\n    ga.prototype.$PresencePoller4 = function(ha) {\n        if ((j.isShutdown() || !m.isOnline())) {\n            this.$PresencePoller3.skip();\n            i.bumpEntityKey(fa, \"skip.offline\");\n            return;\n        }\n    ;\n        if (((Date.now() - this.$PresencePoller5) < ba)) {\n            this.$PresencePoller3.skip();\n            i.bumpEntityKey(fa, \"skip.recent\");\n            return;\n        }\n    ;\n        i.bumpEntityKey(fa, \"request\");\n        this.$PresencePoller5 = Date.now();\n        var ia = (((Date.now() - this.$PresencePoller7) > aa)), ja = u.getCachedProfileIDs().join(\",\");\n        this.$PresencePoller9 = true;\n        ha.setHandler(this.$PresencePollerd.bind(this)).setErrorHandler(this.$PresencePollere.bind(this)).setOption(\"suppressErrorAlerts\", true).setOption(\"retries\", 1).setData({\n            user: n.user,\n            cached_user_info_ids: ja,\n            fetch_mobile: ia\n        }).setURI(z).setAllowCrossPageTransition(true);\n    };\n    ga.prototype.$PresencePollerd = function(ha) {\n        var ia = ha.getPayload(), ja = ia.buddy_list;\n        if (!ja) {\n            this.$PresencePollere(ha);\n            return;\n        }\n    ;\n        i.bumpEntityKey(fa, \"response\");\n        this.$PresencePoller9 = false;\n        this.$PresencePollerf();\n        this.$PresencePoller6 = Date.now();\n        t.update(ia.time);\n        this.$PresencePollera = 0;\n        this.$PresencePollerg();\n        var ka = ja.userInfos;\n        if (ka) {\n            u.setMulti(ka);\n        };\n        var la = ja.chatContexts;\n        (la && k.update(la));\n        this.$PresencePoller1 = ja.userIsIdle;\n        if ((ja.chatNotif !== undefined)) {\n            this.$PresencePoller2 = ja.chatNotif;\n            this.$PresencePoller0(g.ON_CHAT_NOTIFICATION_CHANGED, this.$PresencePoller2);\n        }\n    ;\n        this.$PresencePollerb(\"buddy_list_poller\", ia.time, ja.nowAvailableList, ja.last_active_times, ja.mobile_friends);\n    };\n    ga.prototype.$PresencePollere = function(ha) {\n        i.bumpEntityKey(fa, \"error\");\n        if (s.checkMaintenanceError(ha)) {\n            return\n        };\n        this.$PresencePoller9 = false;\n        this.$PresencePollera++;\n        if ((this.$PresencePollera++ >= y)) {\n            this.$PresencePoller0(g.ON_UPDATE_ERROR);\n        };\n    };\n    ga.prototype.$PresencePollerg = function() {\n        var ha = (v.isActive(da) ? ba : ca);\n        i.bumpEntityKey(fa, (\"period.\" + ha));\n        this.$PresencePoller3.setInterval(ha);\n    };\n    ga.prototype.$PresencePollerf = function() {\n        var ha = Date.now(), ia = (ha - this.$PresencePoller6);\n        ea.log(\"buddylist_presence_stats\", w({\n            duration: ia\n        }, r.getPresenceStats()));\n    };\n    e.exports = ga;\n});\n__d(\"AvailableList\", [\"function-extensions\",\"Arbiter\",\"ArbiterMixin\",\"AsyncRequest\",\"AvailableListConstants\",\"ChannelImplementation\",\"ChannelConstants\",\"ChatConfig\",\"ChatFavoriteList\",\"JSLogger\",\"PresencePoller\",\"PresencePrivacy\",\"PresenceStatus\",\"ShortProfiles\",\"TypingDetector\",\"copyProperties\",\"debounceAcrossTransitions\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    b(\"function-extensions\");\n    var g = b(\"Arbiter\"), h = b(\"ArbiterMixin\"), i = b(\"AsyncRequest\"), j = b(\"AvailableListConstants\"), k = b(\"ChannelImplementation\").instance, l = b(\"ChannelConstants\"), m = b(\"ChatConfig\"), n = b(\"ChatFavoriteList\"), o = b(\"JSLogger\"), p = b(\"PresencePoller\"), q = b(\"PresencePrivacy\"), r = b(\"PresenceStatus\"), s = b(\"ShortProfiles\"), t = b(\"TypingDetector\"), u = b(\"copyProperties\"), v = b(\"debounceAcrossTransitions\"), w = b(\"emptyFunction\"), x = u({\n    }, j, h);\n    x.subscribe([j.ON_AVAILABILITY_CHANGED,j.ON_UPDATE_ERROR,], function(ea, fa) {\n        g.inform(ea, fa);\n    });\n    var y = v(function() {\n        x.inform(j.ON_AVAILABILITY_CHANGED);\n    }, 0);\n    function z(ea, fa, ga, ha) {\n        var ia = r.set(ea, fa, ga, ha);\n        if (ia) {\n            y();\n        };\n    };\n    function aa(ea) {\n        var fa = (ea.payload.availability || {\n        });\n        for (var ga in fa) {\n            z(ga, fa[ga], true, \"mercury_tabs\");;\n        };\n    };\n    function ba(ea) {\n        var fa = x.getDebugInfo(ea), ga = ((fa.presence == j.ACTIVE)), ha = new i(\"/ajax/mercury/tabs_presence.php\").setData({\n            target_id: ea,\n            to_online: ga,\n            presence_source: fa.overlaySource,\n            presence_time: fa.overlayTime\n        }).setHandler(aa).setErrorHandler(w).setAllowCrossPageTransition(true).send();\n    };\n    function ca(ea, fa) {\n        fa.chat_config = m.getDebugInfo();\n        fa.available_list_debug_info = {\n        };\n        x.getAvailableIDs().forEach(function(ga) {\n            fa.available_list_debug_info[ga] = x.getDebugInfo(ga);\n        });\n        fa.available_list_poll_interval = (x._poller && x._poller.getInterval());\n    };\n    var da = new p(function(event) {\n        x.inform(event);\n    });\n    u(x, {\n        get: function(ea) {\n            return r.get(ea);\n        },\n        updateForID: function(ea) {\n            ba(ea);\n        },\n        getWebChatNotification: function() {\n            return da.getWebChatNotification();\n        },\n        isUserIdle: function() {\n            return da.getIsUserIdle();\n        },\n        isReady: function() {\n            return true;\n        },\n        set: function(ea, fa, ga) {\n            z(ea, fa, true, ga);\n        },\n        update: function() {\n            da.forceUpdate();\n        },\n        isIdle: function(ea) {\n            return (x.get(ea) == j.IDLE);\n        },\n        getOnlineIDs: function() {\n            return r.getOnlineIDs();\n        },\n        getAvailableIDs: function() {\n            return r.getAvailableIDs();\n        },\n        getOnlineCount: function() {\n            return r.getOnlineCount();\n        },\n        getDebugInfo: function(ea) {\n            var fa = r.getDebugInfo(ea), ga = s.getNow(ea);\n            if (ga) {\n                fa.name = ga.name;\n            };\n            return fa;\n        }\n    });\n    da.start();\n    g.subscribe(o.DUMP_EVENT, ca);\n    g.subscribe(l.getArbiterType(\"favorite_list\"), function(ea, fa) {\n        var ga = fa.obj, ha = (ga.value ? ga.value.split(\",\") : []);\n        n.init(ha);\n        y();\n    });\n    q.subscribe([\"privacy-changed\",\"privacy-availability-changed\",\"privacy-user-presence-response\",], y);\n    k.subscribe([k.CONNECTED,k.RECONNECTING,k.SHUTDOWN,k.MUTE_WARNING,k.UNMUTE_WARNING,], y);\n    g.subscribe(l.getArbiterType(\"buddylist_overlay\"), function(ea, fa) {\n        var ga = fa.obj.overlay;\n        for (var ha in ga) {\n            x.set(ha, ga[ha].a, (ga[ha].s || \"channel\"));;\n        };\n    });\n    g.subscribe([l.getArbiterType(\"typ\"),l.getArbiterType(\"ttyp\"),], function(ea, fa) {\n        var ga = fa.obj;\n        if ((ga.st === t.TYPING)) {\n            var ha = ga.from;\n            x.set(ha, j.ACTIVE, \"channel-typing\");\n        }\n    ;\n    });\n    a.AvailableList = e.exports = x;\n});\n__d(\"ChatImpressionLogger\", [\"AvailableList\",\"AsyncSignal\",\"ChatConfig\",\"ChatVisibility\",\"Poller\",], function(a, b, c, d, e, f) {\n    var g = b(\"AvailableList\"), h = b(\"AsyncSignal\"), i = b(\"ChatConfig\"), j = b(\"ChatVisibility\"), k = b(\"Poller\"), l = null, m = null, n = {\n        init: function(o) {\n            l = o;\n            var p = i.get(\"chat_impression_logging_periodical\", 0);\n            if (p) {\n                var q = i.get(\"periodical_impression_logging_config.interval\");\n                m = new k({\n                    interval: q,\n                    setupRequest: this.logImps.bind(this),\n                    clearOnQuicklingEvents: false\n                });\n            }\n        ;\n            this.init = function() {\n            \n            };\n        },\n        logImps: function(o) {\n            if (!j.isOnline()) {\n                return\n            };\n            var p = {\n                source: \"periodical_imps\"\n            }, q = l.getCachedSortedList(), r = [];\n            for (var s = 0; (s < q.length); s++) {\n                r[s] = g.get(q[s]);;\n            };\n            p.sorted_list = q.toString();\n            p.list_availability = r.toString();\n            o.setURI(\"/ajax/chat/imps_logging.php\").setData(p);\n        },\n        getOrderedList: function() {\n            return l;\n        },\n        logImpressions: function(o) {\n            var p = [], q = [];\n            if (i.get(\"chat_impression_logging_with_click\")) {\n                p = l.getCachedSortedList();\n                for (var r = 0; (r < p.length); r++) {\n                    q[r] = g.get(p[r]);;\n                };\n            }\n        ;\n            o.sorted_list = p.toString();\n            o.list_availability = q.toString();\n            new h(\"/ajax/chat/ct.php\", o).send();\n        }\n    };\n    e.exports = n;\n});\n__d(\"ChatTypeaheadConstants\", [], function(a, b, c, d, e, f) {\n    var g = {\n        USER_TYPE: \"user\",\n        THREAD_TYPE: \"thread\",\n        FRIEND_TYPE: \"friend\",\n        NON_FRIEND_TYPE: \"non_friend\",\n        HEADER_TYPE: \"header\"\n    };\n    e.exports = g;\n});\n__d(\"Chat\", [\"Arbiter\",\"AvailableList\",\"ChatImpressionLogger\",\"ChatTypeaheadConstants\",\"MercuryParticipantTypes\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"AvailableList\"), i = b(\"ChatImpressionLogger\"), j = b(\"ChatTypeaheadConstants\"), k = b(\"MercuryParticipantTypes\");\n    function l(q, r) {\n        var s = (r && r.source);\n        if ((((((((s && (s === \"ordered_list\")) || (s === \"more_online_friends\")) || (s === \"online_friends\")) || (s === \"recent_threads_in_divebar_new\")) || (s === \"recent_threads_in_divebar\")) || (s === \"presence\")) || (s === \"typeahead\"))) {\n            r.viewport_width = document.body.clientWidth;\n            r.target = q;\n            r.target_presence = h.get(q);\n            i.logImpressions(r);\n        }\n    ;\n    };\n    var m = {\n        buddyListNub: \"buddylist-nub/initialized\",\n        sidebar: \"sidebar/initialized\"\n    };\n    function n(q, r) {\n        g.subscribe(m[q], function(event, s) {\n            r(s);\n        });\n    };\n    function o() {\n        return (((Math.random() * 2147483648) | 0)).toString(16);\n    };\n    var p = {\n        openTab: function(q, r, s) {\n            if (((window.External && window.External.Chat) && window.External.Chat.openWindow)) {\n                window.External.Chat.openWindow(q);\n            };\n            l.curry(q, s).defer();\n            d([\"MercuryThreads\",], function(t) {\n                if ((((!r || (r === k.FRIEND)) || (r === j.FRIEND_TYPE)) || (r === j.USER_TYPE))) {\n                    var u = t.get().getCanonicalThreadToUser(q), v = o();\n                    g.inform(\"chat/open-tab\", {\n                        thread_id: u.thread_id,\n                        signature_id: v\n                    });\n                    return;\n                }\n            ;\n                if ((r === j.THREAD_TYPE)) {\n                    d([\"ChatOpenTab\",], function(w) {\n                        if (q) {\n                            w.openThread(q);\n                        }\n                         else w.openEmptyTab();\n                    ;\n                    });\n                };\n            });\n        },\n        openBuddyList: function() {\n            n(\"buddyListNub\", function(q) {\n                q.show();\n                n(\"sidebar\", function(r) {\n                    r.enable();\n                });\n            });\n        },\n        closeBuddyList: function() {\n            n(\"buddyListNub\", function(q) {\n                q.hide();\n            });\n        },\n        toggleSidebar: function() {\n            n(\"sidebar\", function(q) {\n                q.toggle();\n            });\n        },\n        goOnline: function(q) {\n            d([\"ChatVisibility\",], function(r) {\n                r.goOnline(q);\n            });\n        },\n        isOnline: function() {\n            var q = null;\n            d([\"ChatVisibility\",], function(r) {\n                q = r;\n            });\n            return (q && q.isOnline());\n        }\n    };\n    a.Chat = e.exports = p;\n}, 3);\n__d(\"OrderedFriendsList\", [\"AvailableList\",\"ChatConfig\",\"createArrayFrom\",\"ShortProfiles\",\"InitialChatFriendsList\",], function(a, b, c, d, e, f) {\n    var g = b(\"AvailableList\"), h = b(\"ChatConfig\"), i = b(\"createArrayFrom\"), j = b(\"ShortProfiles\"), k = [], l = {\n    }, m = [], n = {\n        contains: function(o) {\n            return (o in l);\n        },\n        compare: function(o, p) {\n            var q = n.getRank(o), r = n.getRank(p);\n            if ((q !== r)) {\n                return (q - r)\n            };\n            var s = j.getNowUnsafe(o), t = j.getNowUnsafe(p), u = ((((s || {\n            })).name || \"~\")).toLowerCase(), v = ((((t || {\n            })).name || \"~\")).toLowerCase();\n            if ((u !== v)) {\n                return ((u < v) ? -1 : 1)\n            };\n            return 0;\n        },\n        getList: function() {\n            if (h.get(\"chat_web_ranking_with_presence\")) {\n                n.reRank();\n            };\n            var o = i(k);\n            o = o.filter(function(p) {\n                var q = j.getNowUnsafe(p);\n                return (!q || (q.type == \"friend\"));\n            });\n            return o;\n        },\n        getRank: function(o) {\n            return ((o in l) ? l[o] : k.length);\n        },\n        reRank: function() {\n            var o = {\n            }, p = {\n            };\n            m.forEach(function(r, s) {\n                var t = r.substr(0, (r.length - 2)), u = r.substring((r.length - 1));\n                if ((typeof (p.uid) == \"undefined\")) {\n                    if ((typeof (o.uid) == \"undefined\")) {\n                        o[t] = g.get(t);\n                    };\n                    var v = o[t];\n                    if ((v == u)) {\n                        p[s] = t;\n                    };\n                }\n            ;\n            });\n            k = [];\n            for (var q in p) {\n                k.push(p[q]);;\n            };\n            k.forEach(function(r, s) {\n                l[r] = s;\n            });\n        }\n    };\n    (function() {\n        var o = b(\"InitialChatFriendsList\");\n        k = (o.list.length ? o.list : []);\n        if (h.get(\"chat_web_ranking_with_presence\")) {\n            m = k.slice();\n            n.reRank();\n        }\n    ;\n        k.forEach(function(p, q) {\n            l[p] = q;\n        });\n    })();\n    e.exports = (a.OrderedFriendsList || n);\n});\n__d(\"ChatSidebarConstants\", [], function(a, b, c, d, e, f) {\n    var g = {\n        LITESTAND_IMAGE_SIZE: 24,\n        LITESTAND_BLENDED_SIZE: 32,\n        IMAGE_SIZE: 28\n    };\n    e.exports = g;\n});\n__d(\"ChatTypeaheadBehavior\", [\"Chat\",\"ChatConfig\",\"ChatFavoriteList\",\"CSS\",\"DOM\",\"Rect\",\"copyProperties\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Chat\"), h = b(\"ChatConfig\"), i = b(\"ChatFavoriteList\"), j = b(\"CSS\"), k = b(\"DOM\"), l = b(\"Rect\"), m = b(\"copyProperties\"), n = b(\"tx\");\n    function o(p) {\n        this._typeahead = p;\n    };\n    m(o.prototype, {\n        _subscriptions: null,\n        enable: function() {\n            var p = this._typeahead;\n            this._subscriptions = [p.subscribe(\"focus\", function() {\n                p.getData().refreshData();\n            }),p.subscribe(\"blur\", function(q) {\n                p.getCore().reset();\n            }),p.subscribe(\"respond\", function(q, r) {\n                if ((r.value && (r.value === p.getCore().getValue()))) {\n                    if (!r.results.length) {\n                        var s = h.get(\"divebar_typeahead_group_fof\", 0);\n                        if ((s && !r.isAsync)) {\n                            return\n                        };\n                        var t = k.create(\"div\", {\n                            className: \"noResults\"\n                        }, \"Friend not found.\");\n                        k.setContent(p.getView().getElement(), t);\n                    }\n                ;\n                    j.addClass(p.getElement(), \"hasValue\");\n                }\n            ;\n            }),p.subscribe(\"reset\", function() {\n                j.removeClass(p.getElement(), \"hasValue\");\n            }),p.subscribe(\"select\", function(q, r) {\n                if (i.isEditMode()) {\n                    i.toggleID(r.selected.uid);\n                    i.save();\n                }\n                 else {\n                    var s = j.hasClass(document.documentElement, \"sidebarMode\"), t = {\n                        mode: (s ? \"sidebar\" : \"chatNub\"),\n                        source: \"typeahead\",\n                        type: r.selected.type,\n                        typeahead: true\n                    };\n                    g.openTab(r.selected.uid, r.selected.type, t);\n                }\n            ;\n            }),p.subscribe(\"highlight\", function(q, r) {\n                if ((r.index >= 0)) {\n                    var s = p.getView().getItems()[r.index];\n                    if (s) {\n                        var t = new l(s), u = s.offsetParent, v = t.boundWithin(new l(u)).getPositionVector();\n                        t.getPositionVector().sub(v).scrollElementBy(u);\n                    }\n                ;\n                }\n            ;\n            }),];\n        },\n        disable: function() {\n            this._subscriptions.forEach(function(p) {\n                this._typeahead.unsubscribe(p);\n            }.bind(this));\n            this._subscriptions = null;\n        }\n    });\n    e.exports = o;\n});\n__d(\"ChatTypeaheadCore\", [\"function-extensions\",\"Class\",\"Event\",\"Keys\",\"TypeaheadCore\",\"copyProperties\",\"emptyFunction\",\"shield\",], function(a, b, c, d, e, f) {\n    b(\"function-extensions\");\n    var g = b(\"Class\"), h = b(\"Event\"), i = b(\"Keys\"), j = b(\"TypeaheadCore\"), k = b(\"copyProperties\"), l = b(\"emptyFunction\"), m = b(\"shield\");\n    function n(o) {\n        this.parent.construct(this, o);\n    };\n    g.extend(n, j);\n    k(n.prototype, {\n        init: function(o, p, q) {\n            this.parent.init(o, p, q);\n            this.informBeginActive = false;\n            this.informEndActive = false;\n            this.data.subscribe(\"respond\", function() {\n                if (this.informBeginActive) {\n                    this.informBeginActive = false;\n                    this.inform(\"sidebar/typeahead/active\", true);\n                }\n                 else if (this.informEndActive) {\n                    this.informEndActive = false;\n                    this.inform(\"sidebar/typeahead/active\", false);\n                }\n                \n            ;\n            }.bind(this));\n        },\n        handleTab: l,\n        keydown: function(event) {\n            var o = h.getKeyCode(event);\n            if ((o === i.ESC)) {\n                m(this.reset, this).defer();\n                return event.kill();\n            }\n        ;\n            return this.parent.keydown(event);\n        },\n        checkValue: function() {\n            var o = this.getValue(), p = this.value;\n            if ((o == p)) {\n                return\n            };\n            if ((p && !o)) {\n                this.typeaheadActive = false;\n                this.informEndActive = true;\n            }\n             else if ((!p && o)) {\n                this.typeaheadActive = true;\n                this.informBeginActive = true;\n                this.inform(\"sidebar/typeahead/preActive\");\n            }\n            \n        ;\n            this.parent.checkValue();\n        }\n    });\n    e.exports = n;\n});\n__d(\"ChatTypeaheadDataSource\", [\"Class\",\"DataSource\",\"Env\",\"JSLogger\",\"MercuryParticipantTypes\",\"OrderedFriendsList\",\"Run\",\"ShortProfiles\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Class\"), h = b(\"DataSource\"), i = b(\"Env\"), j = b(\"JSLogger\"), k = b(\"MercuryParticipantTypes\"), l = b(\"OrderedFriendsList\"), m = b(\"Run\"), n = b(\"ShortProfiles\"), o = b(\"copyProperties\");\n    function p(q) {\n        q = (q || {\n        });\n        q.kanaNormalization = true;\n        this.parent.construct(this, q);\n        this.persistOnRefresh = (q.persistOnRefresh !== false);\n        this.showOfflineUsers = !!q.showOfflineUsers;\n        this._jslog = j.create(\"chat_typeahead\");\n        this._jslog.log(\"created\");\n    };\n    g.extend(p, h);\n    o(p.prototype, {\n        init: function() {\n            this._jslog.log(\"init\");\n            this.parent.init();\n            this._update();\n        },\n        bootstrap: function() {\n            this._jslog.log(\"bootstrap\");\n            this.parent.bootstrap();\n            if (this.showOfflineUsers) {\n                this._jslog.log(\"show_offline_users\");\n                this._jslog.log(\"ensured_short_profiles\");\n                if (n.hasAll()) {\n                    this._update();\n                }\n                 else {\n                    this._jslog.log(\"fetch_all_short_profiles\");\n                    n.fetchAll();\n                    this.inform(\"activity\", {\n                        activity: true\n                    });\n                    var q = n.subscribe(\"updated\", function() {\n                        this.inform(\"activity\", {\n                            activity: false\n                        });\n                        this._update();\n                    }.bind(this));\n                    if (!this.persistOnRefresh) {\n                        m.onLeave(function() {\n                            n.unsubscribe(q);\n                        });\n                    };\n                }\n            ;\n            }\n        ;\n        },\n        _update: function() {\n            d([\"AvailableList\",], function(q) {\n                var r = this.value;\n                this.dirty();\n                var s = n.getCachedProfileIDs(), t = s.filter(function(v) {\n                    var w = n.getNow(v);\n                    return (w.type === k.FRIEND);\n                });\n                t.sort(l.compare);\n                var u = [];\n                t.forEach(function(v) {\n                    if ((v == i.user)) {\n                        return\n                    };\n                    var w = q.get(v);\n                    if ((!this.showOfflineUsers && (w !== q.ACTIVE))) {\n                        return\n                    };\n                    var x = n.getNow(v), y = x.additionalName;\n                    if (x.hasOwnProperty(\"searchTokens\")) {\n                        y = ((y !== null) ? ((y + \" \") + x.searchTokens.join(\" \")) : x.searchTokens.join(\" \"));\n                    };\n                    u.push({\n                        uid: v,\n                        text: x.name,\n                        tokens: y,\n                        localized_text: x.name,\n                        additional_text: x.additionalName,\n                        photo: x.thumbSrc,\n                        type: x.type\n                    });\n                }.bind(this));\n                if (u.length) {\n                    this.addEntries(u);\n                };\n                this.value = r;\n                if (r) {\n                    this.query(r);\n                };\n            }.bind(this));\n        },\n        refreshData: function() {\n            d([\"AvailableList\",], function(q) {\n                q.update();\n            }.bind(this));\n        }\n    });\n    e.exports = p;\n});\n__d(\"ChatSidebarHeader.react\", [\"React\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"React\"), h = b(\"cx\"), i = g.createClass({\n        displayName: \"ReactChatSidebarHeader\",\n        render: function() {\n            return (g.DOM.div({\n                className: \"_55ob\"\n            }, g.DOM.div({\n                className: \"_55oc\"\n            }, this.props.name)));\n        }\n    });\n    e.exports = i;\n});\n__d(\"ChatSidebarItem.react\", [\"AvailableListConstants\",\"ChatConfig\",\"ChatFavoriteList\",\"ChatSidebarConstants\",\"Image.react\",\"Link.react\",\"React\",\"SplitImage.react\",\"cx\",\"ix\",], function(a, b, c, d, e, f) {\n    var g = b(\"AvailableListConstants\"), h = b(\"ChatConfig\"), i = b(\"ChatFavoriteList\"), j = b(\"ChatSidebarConstants\"), k = b(\"Image.react\"), l = b(\"Link.react\"), m = b(\"React\"), n = b(\"SplitImage.react\"), o = b(\"cx\"), p = b(\"ix\"), q = 9, r = m.createClass({\n        displayName: \"ChatSidebarItem\",\n        render: function() {\n            var s = ((((\"_55ln\") + ((this.props.context ? (\" \" + \"_55lo\") : \"\"))) + (((this.props.unreadCount && h.get(\"litestand_buddylist_count\")) ? (\" \" + \"_5bom\") : \"\")))), t;\n            if (this.props.litestandSidebar) {\n                t = m.DOM.div({\n                    \"aria-label\": this.props.name,\n                    className: \"_4_vf\",\n                    \"data-hover\": \"tooltip\",\n                    \"data-tooltip-position\": \"right\"\n                });\n            };\n            return (l({\n                className: s,\n                href: this.props.href,\n                onClick: this.props.onClick,\n                rel: \"ignore\"\n            }, m.DOM.div({\n                className: \"_55lp\"\n            }, this.renderFavorite(), m.DOM.div({\n                className: \"_56p9\"\n            }, this.renderImage(), m.DOM.div({\n                className: \"_568w\"\n            })), m.DOM.div({\n                className: \"_5bon\"\n            }, this.renderUnreadCount(), this.renderStatus()), m.DOM.div({\n                className: \"_55lr\"\n            }, this.props.name), m.DOM.div({\n                className: \"_55ls\"\n            }, this.props.context)), t));\n        },\n        renderFavorite: function() {\n            if ((this.props.isAdded === undefined)) {\n                return null\n            };\n            var s = null;\n            if (this.props.litestandSidebar) {\n                s = (this.props.isAdded ? p(\"/images/litestand/bookmarks/sidebar/remove.png\") : p(\"/images/litestand/bookmarks/sidebar/add.png\"));\n            }\n             else s = (this.props.isAdded ? p(\"/images/chat/delete.png\") : p(\"/images/chat/add.png\"));\n        ;\n            var t = (((\"_568x\") + ((!this.props.showEditButton ? (\" \" + \"hidden_elem\") : \"\"))));\n            return (m.DOM.div({\n                className: t,\n                onClick: this.props.onEditClick\n            }, k({\n                className: \"_568y\",\n                src: s\n            })));\n        },\n        renderImage: function() {\n            var s = (this.props.imageSize || j.IMAGE_SIZE);\n            return n({\n                size: s,\n                srcs: this.props.images\n            });\n        },\n        renderUnreadCount: function() {\n            var s = this.props.unreadCount;\n            if ((!s || !h.get(\"litestand_buddylist_count\"))) {\n                return null\n            };\n            var t = (((\"_5boo\") + (((s > q) ? (\" \" + \"_5bop\") : \"\"))));\n            if ((s > q)) {\n                s = (q + \"+\");\n            };\n            return (m.DOM.div({\n                className: t\n            }, s));\n        },\n        renderStatus: function() {\n            var s = this.getStatusSrc();\n            if (!s) {\n                return null\n            };\n            if (((this.props.unreadCount && h.get(\"litestand_blended_sidebar\")) && h.get(\"litestand_buddylist_count\"))) {\n                return\n            };\n            var t = (h.get(\"divebar_favorite_list\", 0) && i.isEditMode());\n            if (t) {\n                return\n            };\n            return (m.DOM.div({\n                className: \"_568z\"\n            }, m.DOM.div({\n                className: \"_568-\"\n            }, this.props.statusTime), k({\n                className: \"_568_\",\n                src: s\n            })));\n        },\n        getStatusSrc: function() {\n            switch (this.props.status) {\n              case g.ACTIVE:\n            \n              case g.IDLE:\n                if (this.props.litestandSidebar) {\n                    return (h.get(\"litestand_blended_sidebar\") ? p(\"/images/litestand/sidebar/blended/online.png\") : p(\"/images/litestand/sidebar/online.png\"))\n                };\n                return p(\"/images/chat/status/online.png\");\n              case g.MOBILE:\n                if (this.props.litestandSidebar) {\n                    return (h.get(\"litestand_blended_sidebar\") ? p(\"/images/litestand/sidebar/blended/pushable.png\") : p(\"/images/litestand/sidebar/pushable.png\"))\n                };\n                return p(\"/images/chat/status/mobile.png\");\n            };\n            return null;\n        }\n    });\n    e.exports = r;\n});\n__d(\"ChatSidebarThread.react\", [\"ChatSidebarItem.react\",\"WebMessengerPermalinkConstants\",\"React\",\"MercuryThreadMetadataRawRenderer\",], function(a, b, c, d, e, f) {\n    var g = b(\"ChatSidebarItem.react\"), h = b(\"WebMessengerPermalinkConstants\"), i = b(\"React\"), j = b(\"MercuryThreadMetadataRawRenderer\"), k = i.createClass({\n        displayName: \"ChatSidebarThread\",\n        render: function() {\n            var n = this.props.name, o = l(this.props.threadID, this.props.participants), p = (n ? o : undefined), q = h.getURIPathForThreadID(this.props.threadID), r = m(this.props.image, this.props.participants), s = (n ? n : o);\n            return (g({\n                context: p,\n                href: {\n                    url: q\n                },\n                imageSize: this.props.imageSize,\n                images: r,\n                litestandSidebar: this.props.litestandSidebar,\n                name: s,\n                status: this.props.status,\n                unreadCount: this.props.unreadCount\n            }));\n        }\n    });\n    function l(n, o) {\n        return j.renderRawParticipantList(n, o, o.length, {\n            names_renderer: j.renderShortNames\n        });\n    };\n    function m(n, o) {\n        if (n) {\n            return n\n        };\n        return o.map(function(p) {\n            return p.image_src;\n        });\n    };\n    e.exports = k;\n});\n__d(\"ChatSidebarUser.react\", [\"ChatFavoriteList\",\"WebMessengerPermalinkConstants\",\"ChatConfig\",\"React\",\"ChatSidebarItem.react\",], function(a, b, c, d, e, f) {\n    var g = b(\"ChatFavoriteList\"), h = b(\"WebMessengerPermalinkConstants\"), i = b(\"ChatConfig\"), j = b(\"React\"), k = b(\"ChatSidebarItem.react\"), l = j.createClass({\n        displayName: \"ChatSidebarUser\",\n        render: function() {\n            var m = h.getURIPathForIDOrVanity(this.props.userID), n = g.isFavored(this.props.userID), o = function() {\n                g.toggleID(this.props.userID);\n            }.bind(this), p = (i.get(\"divebar_favorite_list\", 0) ? n : undefined);\n            return (k({\n                href: {\n                    url: m\n                },\n                imageSize: this.props.imageSize,\n                images: this.props.image,\n                litestandSidebar: this.props.litestandSidebar,\n                isAdded: p,\n                showEditButton: g.isEditMode(),\n                name: this.props.name,\n                onEditClick: o,\n                status: this.props.status,\n                statusTime: this.props.statusTime,\n                context: this.props.context\n            }));\n        }\n    });\n    e.exports = l;\n});\n__d(\"ChatTypeaheadRenderer\", [\"AvailableListConstants\",\"ChatConfig\",\"ChatSidebarConstants\",\"ChatSidebarHeader.react\",\"ChatSidebarThread.react\",\"ChatSidebarUser.react\",\"ChatTypeaheadConstants\",\"DOM\",\"LastMobileActiveTimes\",\"MercuryParticipants\",\"PresenceStatus\",\"React\",], function(a, b, c, d, e, f) {\n    var g = b(\"AvailableListConstants\"), h = b(\"ChatConfig\"), i = b(\"ChatSidebarConstants\"), j = b(\"ChatSidebarHeader.react\"), k = b(\"ChatSidebarThread.react\"), l = b(\"ChatSidebarUser.react\"), m = b(\"ChatTypeaheadConstants\"), n = b(\"DOM\"), o = b(\"LastMobileActiveTimes\"), p = b(\"MercuryParticipants\"), q = b(\"PresenceStatus\"), r = b(\"React\"), s = {\n    };\n    function t(z, aa) {\n        if (!((z in s))) {\n            s[z] = n.create(\"li\");\n        };\n        r.renderComponent(aa, s[z]);\n        return s[z];\n    };\n    function u(z) {\n        return t(z.text, j({\n            name: z.text\n        }));\n    };\n    function v() {\n        if ((h.get(\"litestand\", 0) && !h.get(\"test_old_divebar\"))) {\n            return (h.get(\"litestand_blended_sidebar\") ? i.LITESTAND_BLENDED_SIZE : i.LITESTAND_IMAGE_SIZE)\n        };\n        return i.IMAGE_SIZE;\n    };\n    function w(z) {\n        var aa = z.mercury_thread.participants.map(function(ba) {\n            return p.getUserID(ba);\n        });\n        return t(z.uid, k({\n            image: z.mercury_thread.image_src,\n            imageSize: v(),\n            litestandSidebar: (h.get(\"litestand\", 0) && !h.get(\"test_old_divebar\")),\n            name: z.mercury_thread.name,\n            participants: z.participants_to_render,\n            status: q.getGroup(aa),\n            threadID: z.uid\n        }));\n    };\n    function x(z) {\n        var aa = q.get(z.uid), ba = (((aa === g.MOBILE)) ? o.getShortDisplay(z.uid) : null), ca = ((z.render_type == \"non_friend\") ? z.subtext : null);\n        return t(z.uid, l({\n            image: z.photo,\n            imageSize: v(),\n            litestandSidebar: h.get(\"litestand\", 0),\n            name: z.text,\n            status: aa,\n            statusTime: ba,\n            userID: z.uid,\n            context: ca\n        }));\n    };\n    function y(z, aa) {\n        if ((z.type === m.HEADER_TYPE)) {\n            return u(z)\n        };\n        if ((z.type == m.THREAD_TYPE)) {\n            return w(z)\n        };\n        return x(z);\n    };\n    e.exports = y;\n});\n__d(\"ChatTypeaheadView\", [\"BucketedTypeaheadView\",\"ChatConfig\",\"Class\",\"ChatTypeaheadConstants\",\"copyProperties\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"BucketedTypeaheadView\"), h = b(\"ChatConfig\"), i = b(\"Class\"), j = b(\"ChatTypeaheadConstants\"), k = b(\"copyProperties\"), l = b(\"tx\"), m = h.get(\"divebar_typeahead_group_fof\", 0);\n    function n(o, p) {\n        this.parent.construct(this, o, p);\n        this.typeObjects = {\n        };\n        this.typeObjectsOrder = [];\n        this.typeObjects[j.NON_FRIEND_TYPE] = {\n            uid: j.NON_FRIEND_TYPE,\n            type: j.HEADER_TYPE,\n            text: \"FRIENDS OF FRIENDS\"\n        };\n        this.typeObjectsOrder.push(j.NON_FRIEND_TYPE);\n        this.typeObjects[j.THREAD_TYPE] = {\n            uid: j.THREAD_TYPE,\n            type: j.HEADER_TYPE,\n            text: \"GROUP CONVERSATIONS\"\n        };\n        this.typeObjectsOrder.push(j.THREAD_TYPE);\n        this.typeObjects[j.FRIEND_TYPE] = {\n            disabled: true,\n            uid: j.FRIEND_TYPE,\n            type: j.HEADER_TYPE,\n            text: \"FRIENDS\"\n        };\n        this.typeObjectsOrder.push(j.FRIEND_TYPE);\n    };\n    i.extend(n, g);\n    k(n.prototype, {\n        buildBuckets: function(o, p) {\n            if (m) {\n                p = p.reverse();\n            };\n            p = this.parent.buildBuckets(o, p);\n            if (!m) {\n                p = p.filter(function(q) {\n                    return (q && !q.disabled);\n                });\n            };\n            return p;\n        },\n        getDefaultIndex: function(o) {\n            if (!m) {\n                return this.parent.getDefaultIndex(o)\n            };\n            if ((o.length === 0)) {\n                return -1\n            };\n            var p = (o.length - 1);\n            while ((!this.isHighlightable(o[p]) && (p >= 0))) {\n                p--;;\n            };\n            return p;\n        }\n    });\n    e.exports = n;\n});\n__d(\"legacy:ChatTypeaheadBehavior\", [\"ChatTypeaheadBehavior\",], function(a, b, c, d) {\n    var e = b(\"ChatTypeaheadBehavior\");\n    if (!a.TypeaheadBehaviors) {\n        a.TypeaheadBehaviors = {\n        };\n    };\n    a.TypeaheadBehaviors.chatTypeahead = function(f) {\n        f.enableBehavior(e);\n    };\n}, 3);\n__d(\"legacy:cookie\", [\"Cookie\",], function(a, b, c, d) {\n    var e = b(\"Cookie\");\n    a.getCookie = e.get;\n    a.setCookie = e.set;\n    a.clearCookie = e.clear;\n}, 3);\n__d(\"LayerHideOnSuccess\", [\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"copyProperties\");\n    function h(i) {\n        this._layer = i;\n    };\n    g(h.prototype, {\n        _subscription: null,\n        enable: function() {\n            this._subscription = this._layer.subscribe(\"success\", this._layer.hide.bind(this._layer));\n        },\n        disable: function() {\n            if (this._subscription) {\n                this._subscription.unsubscribe();\n                this._subscription = null;\n            }\n        ;\n        }\n    });\n    e.exports = h;\n});\n__d(\"Overlay\", [\"Class\",\"CSS\",\"DataStore\",\"DOM\",\"Layer\",\"LayerButtons\",\"LayerDestroyOnHide\",\"LayerFadeOnHide\",\"LayerFadeOnShow\",\"LayerFormHooks\",\"LayerHideOnBlur\",\"LayerHideOnEscape\",\"LayerHideOnSuccess\",\"LayerHideOnTransition\",\"LayerTabIsolation\",\"LayerMouseHooks\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Class\"), h = b(\"CSS\"), i = b(\"DataStore\"), j = b(\"DOM\"), k = b(\"Layer\"), l = b(\"LayerButtons\"), m = b(\"LayerDestroyOnHide\"), n = b(\"LayerFadeOnHide\"), o = b(\"LayerFadeOnShow\"), p = b(\"LayerFormHooks\"), q = b(\"LayerHideOnBlur\"), r = b(\"LayerHideOnEscape\"), s = b(\"LayerHideOnSuccess\"), t = b(\"LayerHideOnTransition\"), u = b(\"LayerTabIsolation\"), v = b(\"LayerMouseHooks\"), w = b(\"copyProperties\");\n    function x(y, z) {\n        y = w({\n            buildWrapper: true\n        }, (y || {\n        }));\n        this._shouldBuildWrapper = y.buildWrapper;\n        this.parent.construct(this, y, z);\n    };\n    g.extend(x, k);\n    w(x.prototype, {\n        _configure: function(y, z) {\n            this.parent._configure(y, z);\n            var aa = this.getRoot();\n            this._overlay = (j.scry(aa, \"div.uiOverlay\")[0] || aa);\n            h.hide(aa);\n            j.appendContent(this.getInsertParent(), aa);\n            i.set(this._overlay, \"overlay\", this);\n            var ba = i.get(this._overlay, \"width\");\n            (ba && this.setWidth(ba));\n            if (this.setFixed) {\n                this.setFixed((i.get(this._overlay, \"fixed\") == \"true\"));\n            };\n            if ((i.get(this._overlay, \"fadeonshow\") != \"false\")) {\n                this.enableBehavior(o);\n            };\n            if ((i.get(this._overlay, \"fadeonhide\") != \"false\")) {\n                this.enableBehavior(n);\n            };\n            if ((i.get(this._overlay, \"hideonsuccess\") != \"false\")) {\n                this.enableBehavior(s);\n            };\n            if ((i.get(this._overlay, \"hideonblur\") == \"true\")) {\n                this.enableBehavior(q);\n            };\n            if ((i.get(this._overlay, \"destroyonhide\") != \"false\")) {\n                this.enableBehavior(m);\n            };\n            return this;\n        },\n        _getDefaultBehaviors: function() {\n            return this.parent._getDefaultBehaviors().concat([l,p,v,r,t,u,]);\n        },\n        initWithoutBuildingWrapper: function() {\n            this._shouldBuildWrapper = false;\n            return this.init.apply(this, arguments);\n        },\n        _buildWrapper: function(y, z) {\n            z = this.parent._buildWrapper(y, z);\n            if (!this._shouldBuildWrapper) {\n                this._contentRoot = z;\n                return z;\n            }\n        ;\n            this._contentRoot = j.create(\"div\", {\n                className: \"uiOverlayContent\"\n            }, z);\n            return j.create(\"div\", {\n                className: \"uiOverlay\"\n            }, this._contentRoot);\n        },\n        getContentRoot: function() {\n            return this._contentRoot;\n        },\n        destroy: function() {\n            i.remove(this.getRoot(), \"overlay\");\n            this.parent.destroy();\n        }\n    });\n    e.exports = x;\n});\n__d(\"ReminderStory\", [\"AsyncRequest\",\"endsWith\",\"Event\",\"DOMQuery\",\"ScrollableArea\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = b(\"endsWith\"), i = b(\"Event\"), j = b(\"DOMQuery\"), k = b(\"ScrollableArea\");\n    function l(m, n, o) {\n        i.listen(m, \"click\", function(p) {\n            n.show();\n            if (o) {\n                var q = {\n                    context_data: o\n                };\n                new g().setURI(\"/growth/reminder/logging.php\").setData(q).send();\n            }\n        ;\n        });\n        n.subscribe(\"aftershow\", function() {\n            var p = n.getRoot(), q = j.scry(p, \".inlineReplyTextArea\");\n            if ((q.length > 0)) {\n                q[0].focus();\n            };\n            var r = j.scry(p, \".jewelItemNew\"), s = [];\n            for (var t in r) {\n                var u = r[t].getAttribute(\"id\");\n                if ((u && h(u, \"_1_req\"))) {\n                    s = s.concat(u.replace(\"_1_req\", \"\"));\n                };\n            };\n            if ((s.length > 0)) {\n                new g().setURI(\"/friends/requests/log_impressions\").setData({\n                    ids: s.join(\",\"),\n                    ref: \"reminder_box\"\n                }).send();\n            };\n            var v = j.find(p, \"#SuggestBelowInvite\");\n            if (v) {\n                new g().setURI(\"/ajax/pages/reminder/recommendations\").send();\n            };\n            k.poke(j.scry(p, \".uiScrollableArea\")[0]);\n        });\n    };\n    e.exports = l;\n});\n__d(\"ContextualDialogFooterLink\", [\"Event\",\"copyProperties\",\"CSS\",\"DOM\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"copyProperties\"), i = b(\"CSS\"), j = b(\"DOM\");\n    function k(l) {\n        this._layer = l;\n    };\n    h(k.prototype, {\n        _subscriptions: null,\n        enable: function() {\n            var l = this._layer.getRoot(), m = j.scry(l, \".uiContextualDialogFooterLink\")[0], n = \"uiContextualDialogHoverFooterArrow\";\n            this._subscriptions = [g.listen(m, \"mouseenter\", i.addClass.curry(l, n)),g.listen(m, \"mouseleave\", i.removeClass.curry(l, n)),];\n        },\n        disable: function() {\n            this._subscriptions.forEach(function(l) {\n                l.remove();\n            });\n            this._subscriptions = null;\n        }\n    });\n    e.exports = k;\n});\n__d(\"LegacyContextualDialog\", [\"Arbiter\",\"ArbiterMixin\",\"ARIA\",\"Bootloader\",\"Class\",\"ContextualDialogFooterLink\",\"ContextualThing\",\"CSS\",\"DataStore\",\"DOM\",\"Event\",\"Locale\",\"Overlay\",\"Parent\",\"Style\",\"Vector\",\"$\",\"copyProperties\",\"getOverlayZIndex\",\"shield\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ArbiterMixin\"), i = b(\"ARIA\"), j = b(\"Bootloader\"), k = b(\"Class\"), l = b(\"ContextualDialogFooterLink\"), m = b(\"ContextualThing\"), n = b(\"CSS\"), o = b(\"DataStore\"), p = b(\"DOM\"), q = b(\"Event\"), r = b(\"Locale\"), s = b(\"Overlay\"), t = b(\"Parent\"), u = b(\"Style\"), v = b(\"Vector\"), w = b(\"$\"), x = b(\"copyProperties\"), y = b(\"getOverlayZIndex\"), z = b(\"shield\");\n    function aa(ba, ca) {\n        this.parent.construct(this, ba, ca);\n    };\n    k.extend(aa, s);\n    x(aa, h, {\n        ARROW_OFFSET: 15,\n        ARROW_LENGTH: 16,\n        ARROW_INSET: 22,\n        TOP_MARGIN: 50,\n        BOTTOM_MARGIN: 30,\n        LEFT_MARGIN: 15,\n        RIGHT_MARGIN: 30,\n        MIN_TOP_GAP: 5,\n        POSITION_TO_CLASS: {\n            above: \"uiContextualDialogAbove\",\n            below: \"uiContextualDialogBelow\",\n            left: \"uiContextualDialogLeft\",\n            right: \"uiContextualDialogRight\"\n        },\n        RIGHT_ALIGNED_CLASS: \"uiContextualDialogRightAligned\",\n        ARROW_CLASS: {\n            bottom: \"uiContextualDialogArrowBottom\",\n            top: \"uiContextualDialogArrowTop\",\n            right: \"uiContextualDialogArrowRight\",\n            left: \"uiContextualDialogArrowLeft\"\n        },\n        POSITION_TO_ARROW: {\n            above: \"bottom\",\n            below: \"top\",\n            left: \"right\",\n            right: \"left\"\n        },\n        getInstance: function(ba) {\n            var ca = o.get(ba, \"LegacyContextualDialog\");\n            if (!ca) {\n                var da = t.byClass(ba, \"uiOverlay\");\n                if (da) {\n                    ca = o.get(da, \"overlay\");\n                };\n            }\n        ;\n            return ca;\n        }\n    });\n    x(aa.prototype, {\n        _scrollListener: null,\n        _scrollParent: null,\n        _width: null,\n        _fixed: false,\n        _hasFooter: false,\n        _showSubscription: null,\n        _hideSubscription: null,\n        _setContextSubscription: null,\n        _resizeListener: null,\n        _reflowSubscription: null,\n        _configure: function(ba, ca) {\n            this.parent._configure(ba, ca);\n            var da = this.getRoot(), ea = o.get.curry(da);\n            this.setAlignH(ea(\"alignh\", \"left\"));\n            this.setOffsetX(ea(\"offsetx\", 0));\n            this.setOffsetY(ea(\"offsety\", 0));\n            this.setPosition(ea(\"position\", \"above\"));\n            this._hasFooter = ea(\"hasfooter\", false);\n            if (this._hasFooter) {\n                var fa = p.scry(da, \".uiContextualDialogFooterLink\")[0];\n                (fa && this.enableBehavior(l));\n            }\n        ;\n            this._setContextSubscription = this.subscribe(\"beforeshow\", function() {\n                this.unsubscribe(this._setContextSubscription);\n                this._setContextSubscription = null;\n                var ha = ea(\"context\");\n                if (ha) {\n                    this.setContext(w(ha));\n                }\n                 else {\n                    ha = ea(\"contextselector\");\n                    if (ha) {\n                        this.setContext(p.find(document, ha));\n                    };\n                }\n            ;\n            }.bind(this));\n            this._content = p.scry(da, \".uiContextualDialogContent\")[0];\n            if (this._content) {\n                this._content.setAttribute(\"role\", \"dialog\");\n                var ga = p.scry(this._content, \".legacyContextualDialogTitle\")[0];\n                if (ga) {\n                    this._content.setAttribute(\"aria-labelledby\", p.getID(ga));\n                };\n            }\n        ;\n            this._showSubscription = this.subscribe(\"show\", function() {\n                var ha = z(this.updatePosition, this);\n                this._resizeListener = q.listen(window, \"resize\", ha);\n                this._reflowSubscription = g.subscribe(\"reflow\", ha);\n                this._setupScrollListener(this._scrollParent);\n                m.register(da, this.context);\n                g.inform(\"layer_shown\", {\n                    type: \"ContextualDialog\"\n                });\n            }.bind(this));\n            this._hideSubscription = this.subscribe(\"hide\", function() {\n                this._teardownResizeAndReflowListeners();\n                this._teardownScrollListener();\n                g.inform(\"layer_hidden\", {\n                    type: \"ContextualDialog\"\n                });\n            }.bind(this));\n            return this;\n        },\n        _buildWrapper: function(ba, ca) {\n            var da = this.parent._buildWrapper(ba, ca);\n            if (!this._shouldBuildWrapper) {\n                return da\n            };\n            n.addClass(da, \"uiContextualDialog\");\n            return p.create(\"div\", {\n                className: \"uiContextualDialogPositioner\"\n            }, da);\n        },\n        setWidth: function(ba) {\n            this._width = Math.floor(ba);\n            return this;\n        },\n        setFixed: function(ba) {\n            ba = !!ba;\n            n.conditionClass(this.getRoot(), \"uiContextualDialogFixed\", ba);\n            this._fixed = ba;\n            return this;\n        },\n        setAlignH: function(ba) {\n            this.alignH = ba;\n            this._updateAlignmentClass();\n            (this._shown && this.updatePosition());\n            (this.position && this._updateArrow());\n            return this;\n        },\n        getContent: function() {\n            return this._content;\n        },\n        getContext: function() {\n            return this.context;\n        },\n        setContext: function(ba) {\n            if (this._setContextSubscription) {\n                this.unsubscribe(this._setContextSubscription);\n                this._setContextSubscription = null;\n            }\n        ;\n            ba = w(ba);\n            if ((this.context && (this.context != ba))) {\n                o.remove(this.context, \"LegacyContextualDialog\");\n            };\n            this.context = ba;\n            i.setPopup(this.getCausalElement(), this.getRoot());\n            var ca = t.byClass(ba, \"fbPhotoSnowlift\");\n            this.setInsertParent((ca || document.body));\n            if ((this._scrollListener && (this._scrollParent !== ca))) {\n                this._teardownScrollListener();\n                this._setupScrollListener(ca);\n            }\n        ;\n            this._scrollParent = ca;\n            var da = y(ba, this._insertParent);\n            u.set(this.getRoot(), \"z-index\", ((da > 200) ? da : \"\"));\n            o.set(this.context, \"LegacyContextualDialog\", this);\n            return this;\n        },\n        getCausalElement: function() {\n            return (this.parent.getCausalElement() || this.context);\n        },\n        listen: function(ba, ca) {\n            return q.listen(this.getRoot(), ba, ca);\n        },\n        setOffsetX: function(ba) {\n            this.offsetX = (parseInt(ba, 10) || 0);\n            (this._shown && this.updatePosition());\n            return this;\n        },\n        setOffsetY: function(ba) {\n            this.offsetY = (parseInt(ba, 10) || 0);\n            (this._shown && this.updatePosition());\n            return this;\n        },\n        setPosition: function(ba) {\n            this.position = ba;\n            for (var ca in aa.POSITION_TO_CLASS) {\n                n.conditionClass(this.getRoot(), aa.POSITION_TO_CLASS[ca], (ba == ca));;\n            };\n            this._updateAlignmentClass();\n            (this._shown && this.updatePosition());\n            this._updateArrow();\n            return this;\n        },\n        updatePosition: function() {\n            if (!this.context) {\n                return false\n            };\n            if (this._width) {\n                u.set(this._overlay, \"width\", (this._width + \"px\"));\n            };\n            var ba = (this._fixed ? \"viewport\" : \"document\"), ca = v.getElementPosition(this.context, ba), da = this._scrollParent;\n            if (da) {\n                ca = ca.sub(v.getElementPosition(da, \"document\")).add(da.scrollLeft, da.scrollTop);\n            };\n            var ea = v.getElementDimensions(this.context), fa = ((this.position == \"above\") || (this.position == \"below\")), ga = r.isRTL();\n            if (((((this.position == \"right\") || ((fa && (this.alignH == \"right\"))))) != ga)) {\n                ca = ca.add(ea.x, 0);\n            };\n            if ((this.position == \"below\")) {\n                ca = ca.add(0, ea.y);\n            };\n            var ha = new v(0, 0);\n            if ((fa && (this.alignH == \"center\"))) {\n                ha = ha.add((((ea.x - this._width)) / 2), 0);\n            }\n             else {\n                var ia = (fa ? ea.x : ea.y), ja = (2 * aa.ARROW_INSET);\n                if ((ia < ja)) {\n                    var ka = ((ia / 2) - aa.ARROW_INSET);\n                    if ((fa && (((this.alignH == \"right\") != ga)))) {\n                        ka = -ka;\n                    };\n                    ha = ha.add((fa ? ka : 0), (fa ? 0 : ka));\n                }\n            ;\n            }\n        ;\n            ha = ha.add(this.offsetX, this.offsetY);\n            if (ga) {\n                ha = ha.mul(-1, 1);\n            };\n            ca = ca.add(ha);\n            if (this._fixed) {\n                ca = new v(ca.x, ca.y, \"document\");\n            };\n            ca.setElementPosition(this.getRoot());\n            this._adjustVerticalPosition();\n            this._adjustHorizontalPosition();\n            return true;\n        },\n        scrollTo: function() {\n            if (this.context) {\n                j.loadModules([\"DOMScroll\",], function(ba) {\n                    ba.scrollTo(this.context, true, true);\n                }.bind(this));\n            };\n        },\n        destroy: function() {\n            this.unsubscribe(this._showSubscription);\n            this.unsubscribe(this._hideSubscription);\n            if (this._setContextSubscription) {\n                this.unsubscribe(this._setContextSubscription);\n                this._setContextSubscription = null;\n            }\n        ;\n            this._teardownScrollListener();\n            this._teardownResizeAndReflowListeners();\n            (this.context && o.remove(this.context, \"LegacyContextualDialog\"));\n            this.parent.destroy();\n        },\n        _adjustVerticalPosition: function() {\n            if (((this.position != \"left\") && (this.position != \"right\"))) {\n                u.set(this._overlay, \"top\", \"\");\n                return;\n            }\n        ;\n            var ba = this.getRoot(), ca = v.getElementPosition(ba, \"viewport\").y, da = v.getElementDimensions(this._overlay).y, ea = v.getViewportDimensions().y, fa = Math.min(Math.max(ca, aa.MIN_TOP_GAP), aa.TOP_MARGIN), ga = Math.min(Math.max(0, (((ca + da) + aa.BOTTOM_MARGIN) - ea)), Math.max(-fa, (ca - fa)), (da - (2 * aa.ARROW_INSET)));\n            u.set(this._overlay, \"top\", (((-1 * ga)) + \"px\"));\n            u.set(this._arrow, \"top\", (aa.ARROW_OFFSET + \"px\"));\n            u.set(this._arrow, \"marginTop\", (ga + \"px\"));\n        },\n        _adjustHorizontalPosition: function() {\n            if (((((this.position != \"above\") && (this.position != \"below\"))) || (this.alignH != \"left\"))) {\n                u.set(this._overlay, \"left\", \"\");\n                u.set(this._overlay, \"right\", \"\");\n                return;\n            }\n        ;\n            var ba = this.getRoot(), ca = v.getElementPosition(ba, \"viewport\").x, da = v.getElementDimensions(this._overlay).x, ea = v.getViewportDimensions().x, fa = r.isRTL(), ga;\n            if (!fa) {\n                ga = (((ca + da) + aa.RIGHT_MARGIN) - ea);\n            }\n             else ga = ((aa.LEFT_MARGIN + da) - ca);\n        ;\n            ga = Math.min(Math.max(0, ga), (da - (2 * aa.ARROW_INSET)));\n            u.set(this._overlay, (fa ? \"right\" : \"left\"), ((-1 * ga) + \"px\"));\n            u.set(this._arrow, (fa ? \"right\" : \"left\"), (aa.ARROW_OFFSET + \"px\"));\n            u.set(this._arrow, (fa ? \"marginRight\" : \"marginLeft\"), (ga + \"px\"));\n        },\n        _updateArrow: function() {\n            var ba = 0;\n            if (((this.position == \"above\") || (this.position == \"below\"))) {\n                switch (this.alignH) {\n                  case \"center\":\n                    ba = 50;\n                    break;\n                  case \"right\":\n                    ba = 100;\n                    break;\n                }\n            };\n            this._renderArrow(aa.POSITION_TO_ARROW[this.position], ba);\n        },\n        _renderArrow: function(ba, ca) {\n            for (var da in aa.ARROW_CLASS) {\n                n.conditionClass(this._overlay, aa.ARROW_CLASS[da], (ba == da));;\n            };\n            n.conditionClass(this._overlay, \"uiContextualDialogWithFooterArrowBottom\", ((ba == \"bottom\") && this._hasFooter));\n            if ((ba == \"none\")) {\n                return\n            };\n            if (!this._arrow) {\n                this._arrow = p.create(\"i\", {\n                    className: \"uiContextualDialogArrow\"\n                });\n                p.appendContent(this._overlay, this._arrow);\n            }\n        ;\n            u.set(this._arrow, \"top\", \"\");\n            u.set(this._arrow, \"left\", \"\");\n            u.set(this._arrow, \"right\", \"\");\n            u.set(this._arrow, \"margin\", \"\");\n            var ea = ((ba == \"top\") || (ba == \"bottom\")), fa = (ea ? ((r.isRTL() ? \"right\" : \"left\")) : \"top\");\n            ca = (ca || 0);\n            u.set(this._arrow, fa, (ca + \"%\"));\n            var ga = (aa.ARROW_LENGTH + (aa.ARROW_OFFSET * 2)), ha = -((((ga * ca) / 100) - aa.ARROW_OFFSET));\n            u.set(this._arrow, (\"margin-\" + fa), (ha + \"px\"));\n        },\n        _updateAlignmentClass: function() {\n            n.conditionClass(this.getRoot(), aa.RIGHT_ALIGNED_CLASS, ((((this.position == \"above\") || (this.position == \"below\"))) && (this.alignH == \"right\")));\n        },\n        _setupScrollListener: function(ba) {\n            this._scrollListener = q.listen((ba || window), \"scroll\", z(this._adjustVerticalPosition, this));\n        },\n        _teardownScrollListener: function() {\n            if (this._scrollListener) {\n                this._scrollListener.remove();\n                this._scrollListener = null;\n            }\n        ;\n        },\n        _teardownResizeAndReflowListeners: function() {\n            if (this._resizeListener) {\n                this._resizeListener.remove();\n                this._resizeListener = null;\n            }\n        ;\n            if (this._reflowSubscription) {\n                this._reflowSubscription.unsubscribe();\n                this._reflowSubscription = null;\n            }\n        ;\n        }\n    });\n    e.exports = aa;\n});\n__d(\"TooltipLink\", [\"Parent\",\"Tooltip\",], function(a, b, c, d, e, f) {\n    var g = b(\"Parent\"), h = b(\"Tooltip\"), i = {\n        setTooltipText: function(j, k) {\n            j = g.byTag(j, \"a\");\n            (j && h.set(j, k));\n        }\n    };\n    e.exports = i;\n});");
// 11686
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o7,"s0988ba831300c838862d577d2c79f679c56e4b86");
// 11687
geval("if (JSBNG__self.CavalryLogger) {\n    CavalryLogger.start_js([\"EzMPG\",]);\n}\n;\n;\n__d(\"ChannelSubdomain\", [\"Cookie\",\"JSLogger\",], function(a, b, c, d, e, f) {\n    var g = b(\"Cookie\"), h = b(\"JSLogger\"), i = h.create(\"channel\"), j = 7, k = null;\n    function l(o, p) {\n        var q = null, r = m(), s;\n        o--;\n        var t = Math.min(32, ((j * o)));\n        t = Math.max(t, 1);\n        var u = false;\n        for (var v = 0; ((v < 32)); v++) {\n            s = ((((v + p)) % t));\n            if (!((r & ((1 << s))))) {\n                u = true;\n                break;\n            }\n        ;\n        ;\n        };\n    ;\n        if (u) {\n            k = s;\n            q = ((k % j));\n            g.set(\"sub\", ((r | ((1 << k)))));\n        }\n         else {\n            k = -1;\n            q = null;\n            i.error(\"subdomain_overflow\", {\n                slot: k,\n                max: o\n            });\n        }\n    ;\n    ;\n        return q;\n    };\n;\n    function m() {\n        var o = ((g.get(\"sub\") || 0));\n        o = parseInt(o, 10);\n        return ((isNaN(o) ? 0 : o));\n    };\n;\n    function n() {\n        if (((((k !== null)) && ((k >= 0))))) {\n            var o = ((m() & ~((1 << k))));\n            if (o) {\n                g.set(\"sub\", o);\n            }\n             else g.clear(\"sub\");\n        ;\n        ;\n        }\n    ;\n    ;\n    };\n;\n    e.exports = {\n        allocate: l,\n        clear: n\n    };\n});\n__d(\"DocRPC\", [\"ErrorUtils\",], function(a, b, c, d, e, f) {\n    var g = b(\"ErrorUtils\"), h = {\n        _apis: {\n        },\n        _dispatch: function(i) {\n            var j;\n            try {\n                i = JSON.parse(i);\n            } catch (k) {\n                throw new Error(((((\"DocRPC unparsable dispatch: \\\"\" + i)) + \"\\\"\")));\n            };\n        ;\n            if (h._apis.hasOwnProperty(i.api)) {\n                var l = h._apis[i.api];\n                if (l[i.method]) {\n                    j = g.applyWithGuard(l[i.method], l, i.args);\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            if (((j === undefined))) {\n                j = null;\n            }\n        ;\n        ;\n            return JSON.stringify(j);\n        },\n        publish: function(i, j) {\n            h._apis[j] = i;\n        },\n        proxy: function(i, j, k) {\n            var l = {\n            };\n            k.forEach(function(m) {\n                l[m] = function() {\n                    var n = {\n                        api: j,\n                        method: m,\n                        args: Array.prototype.slice.call(arguments)\n                    }, o;\n                    try {\n                        if (i.JSBNG__closed) {\n                            throw new Error(\"DocRPC window closed\");\n                        }\n                    ;\n                    ;\n                        o = i.DocRPC._dispatch(JSON.stringify(n));\n                    } catch (p) {\n                        g.reportError(p);\n                        return;\n                    };\n                ;\n                    if (((typeof (o) == \"string\"))) {\n                        try {\n                            o = JSON.parse(o);\n                        } catch (p) {\n                            throw new Error(((((((((((((\"DocRPC \" + j)) + \".\")) + m)) + \" unparsable return: \\\"\")) + o)) + \"\\\"\")));\n                        };\n                    }\n                ;\n                ;\n                    return o;\n                };\n            });\n            return l;\n        }\n    };\n    e.exports = a.DocRPC = h;\n});\n__d(\"ChannelTransport\", [\"copyProperties\",\"bind\",\"AjaxRequest\",\"URI\",\"JSLogger\",\"DocRPC\",\"ChannelConstants\",\"UserAgent\",], function(a, b, c, d, e, f) {\n    var g = b(\"copyProperties\"), h = b(\"bind\"), i = b(\"AjaxRequest\"), j = b(\"URI\"), k = b(\"JSLogger\"), l = b(\"DocRPC\"), m = b(\"ChannelConstants\"), n = b(\"UserAgent\"), o = k.create(\"channel\");\n    function p() {\n        return ((((1048576 * Math.JSBNG__random())) | 0)).toString(36);\n    };\n;\n    function q(y, z) {\n        var aa = y.subdomain;\n        aa = ((((aa === null)) ? \"\" : ((aa + \"-\"))));\n        var ba = new j(z).setDomain(((((aa + y.host)) + \".facebook.com\"))).setPort(y.port).setSecure(j().isSecure());\n        return ba;\n    };\n;\n    function r(y) {\n        var z = {\n            partition: y.partition,\n            cb: p()\n        }, aa = q(y, \"/p\").setQueryData(z);\n        o.log(\"start_p\", {\n            uri: aa.toString()\n        });\n        var ba = new i(\"GET\", aa);\n        if (i.supportsCORS()) {\n            ba.xhr.withCredentials = true;\n        }\n    ;\n    ;\n        var ca = function(da) {\n            o.log(\"finish_p\", {\n                xhr: ((da.toJSON ? da.toJSON() : da))\n            });\n        };\n        ba.timeout = y.P_TIMEOUT;\n        ba.onError = ba.onSuccess = ca;\n        ba.send();\n    };\n;\n    function s(y, z, aa) {\n        var ba = new JSBNG__Image(), ca = 0, da = function(ga) {\n            ba.abort();\n            return ((ga ? z() : aa()));\n        };\n        ba.JSBNG__onload = function() {\n            o.log(\"ping_ok\", {\n                duration: ((JSBNG__Date.now() - ca))\n            });\n            da(true);\n        };\n        ba.JSBNG__onerror = function() {\n            r(y);\n            da(false);\n        };\n        var ea = JSBNG__setTimeout(ba.JSBNG__onerror, 10000, false);\n        ba.abort = function() {\n            if (ea) {\n                JSBNG__clearTimeout(ea);\n                ea = null;\n            }\n        ;\n        ;\n            ba.JSBNG__onload = ba.JSBNG__onerror = null;\n        };\n        var fa = {\n            partition: y.partition,\n            cb: p()\n        };\n        ca = JSBNG__Date.now();\n        ba.src = q(y, \"/ping\").setQueryData(fa);\n        return ba;\n    };\n;\n    function t(y, z, aa, ba) {\n        var ca = new JSBNG__Date(), da = ((((((ca - y.userActive)) / 1000)) | 0));\n        if (((da < 0))) {\n            o.warn(\"idle_regression\", {\n                idleTime: da,\n                now: ca.getTime(),\n                userActive: y.userActive\n            });\n        }\n    ;\n    ;\n        var ea = {\n            channel: y.user_channel,\n            seq: y.seq,\n            partition: y.partition,\n            clientid: y.sessionID,\n            cb: p(),\n            idle: da,\n            cap: 0\n        };\n        if (((da < 60))) {\n            ea.state = \"active\";\n        }\n    ;\n    ;\n        if (y.streamingCapable) {\n            ea.mode = \"stream\";\n            ea.format = \"json\";\n        }\n    ;\n    ;\n        if (y.profile) {\n            ea.profile = y.profile;\n        }\n    ;\n    ;\n        if (((y.webrtcSupport && ((((n.chrome() >= 24)) || ((n.firefox() >= 22))))))) {\n            ea.cap = m.CAPABILITY_VOIP;\n        }\n    ;\n    ;\n        var fa = q(y, \"/pull\").setQueryData(ea), ga = new i(\"GET\", fa);\n        if (i.supportsCORS()) {\n            ga.xhr.withCredentials = true;\n        }\n    ;\n    ;\n        ga.timeout = ((y.streamingCapable ? y.STREAMING_TIMEOUT : y.LONGPOLL_TIMEOUT));\n        ga.onJSON = z;\n        ga.onSuccess = aa;\n        ga.onError = function() {\n            var ha = ((((((this.JSBNG__status == 12002)) && ((this._time >= y.MIN_12002_TIMEOUT)))) || ((((this.JSBNG__status == 504)) && ((this._time >= y.MIN_504_TIMEOUT)))))), ia = ((ha ? aa : ba));\n            return ((ia && ia.apply(this, arguments)));\n        };\n        ga.send();\n        y.inStreaming = y.streamingCapable;\n        return ga;\n    };\n;\n    function u(y) {\n        this.manager = y;\n        ((this.init && this.init()));\n    };\n;\n    function v(y) {\n        u.apply(this, arguments);\n    };\n;\n    g(v.prototype, {\n        logName: \"CORS\",\n        enterState: function(y, z) {\n            if (this._request) {\n                this._request.abort();\n                this._request = null;\n            }\n        ;\n        ;\n            if (((y == \"init\"))) {\n                JSBNG__setTimeout(h(this.manager, \"exitState\", {\n                    JSBNG__status: m.OK,\n                    stateId: z.stateId\n                }), 3000, false);\n            }\n        ;\n        ;\n            if (!/pull|ping/.test(y)) {\n                return;\n            }\n        ;\n        ;\n            var aa = this.manager;\n            if (((y == \"ping\"))) {\n                this._request = s(z, h(aa, \"exitState\", {\n                    JSBNG__status: m.OK,\n                    stateId: z.stateId\n                }), h(aa, \"exitState\", {\n                    JSBNG__status: m.ERROR,\n                    stateId: z.stateId\n                }));\n            }\n             else if (((y == \"pull\"))) {\n                this._request = t(z, h(aa, \"_processTransportData\", z.stateId), h(aa, \"exitState\", {\n                    JSBNG__status: m.OK,\n                    stateId: z.stateId\n                }), h(aa, \"exitState\", {\n                    JSBNG__status: m.ERROR,\n                    stateId: z.stateId\n                }));\n            }\n            \n        ;\n        ;\n        }\n    });\n    function w(y) {\n        o.log(\"iframe_init_constructor\");\n        u.apply(this, arguments);\n        this._iframe = JSBNG__document.createElement(\"div\");\n        this._iframe.style.display = \"none\";\n        JSBNG__document.body.appendChild(this._iframe);\n        l.publish(this, \"outerTransport\");\n    };\n;\n    g(w.prototype, {\n        logName: \"div\",\n        _initIframe: function(y) {\n            o.log(\"iframe_init_start\");\n            window.onchanneliframeready = function() {\n                o.log(\"iframe_resources\");\n                return y.resources;\n            };\n            window.onchanneliframeloaded = function() {\n                o.log(\"iframe_loaded\");\n            };\n            if (y) {\n                this._iframeURI = q(y, y.path);\n                if (y.bustIframe) {\n                    var z = {\n                        partition: y.partition,\n                        cb: p()\n                    };\n                    this._iframeURI.setQueryData(z);\n                }\n            ;\n            ;\n            }\n             else this._iframeURI = \"about:blank\";\n        ;\n        ;\n            this._iframeProxy = null;\n            try {\n                this._iframe.contentWindow.JSBNG__location.replace(this._iframeURI);\n                o.log(\"iframe_uri_set\");\n            } catch (aa) {\n                o.error(\"iframe_uri_set_error\", aa);\n                this.exitState({\n                    JSBNG__status: m.ERROR,\n                    stateId: y.stateId\n                }, ((aa + \"\")));\n            };\n        ;\n        },\n        enterState: function(y, z) {\n            if (((y == \"init\"))) {\n                this._initIframe(z);\n            }\n             else if (/idle|ping|pull/.test(y)) {\n                if (this._iframeProxy) {\n                    this._iframeProxy.enterState.apply(this._iframeProxy, arguments);\n                }\n                 else if (((y != \"idle\"))) {\n                    this.exitState({\n                        JSBNG__status: m.ERROR,\n                        stateId: z.stateId\n                    }, \"iframe not yet loaded\");\n                }\n                \n            ;\n            ;\n            }\n             else if (((y == \"shutdown\"))) {\n                this._initIframe();\n            }\n            \n            \n        ;\n        ;\n        },\n        _processTransportData: function() {\n            this.manager._processTransportData.apply(this.manager, arguments);\n        },\n        exitState: function(y) {\n            if (((((this.manager.state == \"init\")) && ((y.JSBNG__status == m.OK))))) {\n                this._iframeProxy = l.proxy(this._iframe.contentWindow, \"innerTransport\", [\"enterState\",], ((this._iframeURI + \"\")).replace(/iframe.*/, \"\"));\n            }\n        ;\n        ;\n            if (((/ping|pull/.test(this.manager.state) && !this._iframeProxy))) {\n                return;\n            }\n        ;\n        ;\n            this.manager.exitState.apply(this.manager, arguments);\n        }\n    });\n    function x() {\n        this.init = this.init.bind(this);\n        u.apply(this, arguments);\n    };\n;\n    g(x.prototype, {\n        logName: \"iframe(inner)\",\n        init: function() {\n            l.publish(this, \"innerTransport\");\n            try {\n                var z = l.proxy(window.parent, \"outerTransport\", [\"_processTransportData\",\"exitState\",], JSBNG__top.DocRPC.origin);\n                g(this, z);\n                this.exitState({\n                    JSBNG__status: m.OK,\n                    stateId: 1000000\n                });\n            } catch (y) {\n                o.error(\"iframe_inner_init_error\", y);\n            };\n        ;\n        },\n        enterState: function(y, z) {\n            if (this._request) {\n                this._request.abort();\n                this._request = null;\n            }\n        ;\n        ;\n            if (((y == \"ping\"))) {\n                this._request = s(z, h(this, \"exitState\", {\n                    JSBNG__status: m.OK,\n                    stateId: z.stateId\n                }), h(this, \"exitState\", {\n                    JSBNG__status: m.ERROR,\n                    stateId: z.stateId\n                }));\n            }\n             else if (((y == \"pull\"))) {\n                this._request = t(z, h(this, \"_processTransportData\", z.stateId), h(this, \"exitState\", {\n                    JSBNG__status: m.OK,\n                    stateId: z.stateId\n                }), h(this, \"exitState\", {\n                    JSBNG__status: m.ERROR,\n                    stateId: z.stateId\n                }));\n            }\n            \n        ;\n        ;\n        }\n    });\n    e.exports = {\n        getURI: q,\n        Transport: u,\n        CORSTransport: v,\n        IframeTransport: w,\n        IframeInnerTransport: x\n    };\n});\n__d(\"MovingStat\", [], function(a, b, c, d, e, f) {\n    function g(h) {\n        h = ((h || 60000));\n        var i = {\n            t: new JSBNG__Date(),\n            count: 0,\n            v: 0\n        }, j = i, k = 0, l = 0;\n        function m() {\n            var n = ((new JSBNG__Date() - h));\n            while (((((j && j.next)) && ((j.t < n))))) {\n                k -= j.v;\n                l -= j.count;\n                j = j.next;\n            };\n        ;\n        };\n    ;\n        this.add = function(n) {\n            k += n;\n            l++;\n            var o = new JSBNG__Date();\n            if (((((o - i.t)) < 1000))) {\n                i.v += n;\n                i.count++;\n            }\n             else {\n                i.next = {\n                    t: o,\n                    v: n,\n                    count: 1\n                };\n                i = i.next;\n                m();\n            }\n        ;\n        ;\n        };\n        this.tally = function(n) {\n            n = ((n || 1000));\n            m();\n            return {\n                sum: k,\n                count: l,\n                timeAverage: ((((k * n)) / h))\n            };\n        };\n    };\n;\n    e.exports = g;\n});\n__d(\"ChannelManager\", [\"JSBNG__Event\",\"function-extensions\",\"AjaxRequest\",\"Arbiter\",\"AsyncRequest\",\"ChannelConstants\",\"ChannelInitialData\",\"ChannelSubdomain\",\"ChannelTransport\",\"Env\",\"FBAjaxRequest\",\"JSLogger\",\"MovingStat\",\"PresenceCookieManager\",\"PresenceState\",\"PresenceUtil\",\"Run\",\"SystemEvents\",\"URI\",\"UserActivity\",\"copyProperties\",\"createArrayFrom\",\"ChatVisibility\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\");\n    b(\"function-extensions\");\n    var h = b(\"AjaxRequest\"), i = b(\"Arbiter\"), j = b(\"AsyncRequest\"), k = b(\"ChannelConstants\"), l = b(\"ChannelInitialData\"), m = b(\"ChannelSubdomain\"), n = b(\"ChannelTransport\"), o = b(\"Env\"), p = b(\"FBAjaxRequest\"), q = b(\"JSLogger\"), r = b(\"MovingStat\"), s = b(\"PresenceCookieManager\"), t = b(\"PresenceState\"), u = b(\"PresenceUtil\"), v = b(\"Run\"), w = b(\"SystemEvents\"), x = b(\"URI\"), y = b(\"UserActivity\"), z = b(\"copyProperties\"), aa = b(\"createArrayFrom\"), ba = b(\"ChatVisibility\"), ca, da = q.create(\"channel\"), ea = null;\n    function fa(qa) {\n        ea = qa;\n    };\n;\n    var ga = {\n        idle: {\n            ok: \"init!\"\n        },\n        init: {\n            ok: \"pull!\",\n            error: \"reconnect\",\n            sys_online: \"init\",\n            sys_timetravel: \"init\"\n        },\n        pull: {\n            ok: \"pull!\",\n            error: \"ping\",\n            error_missing: \"pull\",\n            error_msg_type: \"pull\",\n            refresh_0: \"reconnect\",\n            refresh_110: \"reconnect\",\n            refresh_111: \"reconnect\",\n            refresh_112: \"pull\",\n            refresh_113: \"pull\",\n            refresh_117: \"reconnect\"\n        },\n        ping: {\n            ok: \"pull!\",\n            error: \"ping\",\n            error_stale: \"reconnect!\"\n        },\n        reconnect: {\n            ok: \"init!\",\n            error: \"reconnect\",\n            sys_online: \"reconnect\",\n            sys_timetravel: \"reconnect\"\n        },\n        shutdown: {\n        },\n        _all: {\n            error_max: \"shutdown!\",\n            error_shutdown: \"shutdown!\",\n            sys_owner: \"reconnect\",\n            sys_nonowner: \"idle!\",\n            sys_online: \"ping\",\n            sys_offline: \"idle!\",\n            sys_timetravel: \"ping\"\n        }\n    }, ha = {\n        userActive: ((ba.isOnline() ? JSBNG__Date.now() : 0)),\n        sessionID: ((((Math.JSBNG__random() * 2147483648)) | 0)).toString(16),\n        streamingCapable: false,\n        inStreaming: false,\n        LONGPOLL_TIMEOUT: 60000,\n        STREAMING_TIMEOUT: 60000,\n        P_TIMEOUT: 30000,\n        IFRAME_LOAD_TIMEOUT: 30000,\n        MIN_RETRY_INTERVAL: 5000,\n        MAX_RETRY_INTERVAL: 30000,\n        MIN_12002_TIMEOUT: 9000,\n        MIN_504_TIMEOUT: 20000,\n        STALL_THRESHOLD: 180000,\n        JUMPSTART_THRESHOLD: 90000,\n        MIN_INIT_PROBE_DELAY: 3000,\n        INIT_PROBE_DELAY_RANDOMIZE_RANGE: 12000,\n        PROBE_DELAY: 60000,\n        PROBE_HEARTBEATS_INTERVAL_LOW: 1000,\n        PROBE_HEARTBEATS_INTERVAL_HIGH: 3000,\n        STREAMING_EXIT_STATE_ON_CONTINUE: false\n    }, ia = 1, ja = {\n    }, ka = 0;\n    function la() {\n        return ((j.lastSuccessTime ? Math.round(((((JSBNG__Date.now() - j.lastSuccessTime)) / 1000))) : -1));\n    };\n;\n    function ma() {\n        var qa = {\n        };\n        if (ca.getConfig(\"host\")) {\n            qa[ca.getConfig(\"user_channel\")] = ca.getConfig(\"seq\", 0);\n        }\n    ;\n    ;\n        return qa;\n    };\n;\n    function na() {\n        var qa = JSBNG__Date.now(), ra = JSBNG__Date.now(), sa = {\n            total: 0\n        }, ta = \"idle\", ua = false;\n        w.subscribe([w.USER,w.ONLINE,w.TIME_TRAVEL,], function(xa, ya) {\n            pa(true);\n            ra = null;\n            ca.lastPullTime = JSBNG__Date.now();\n            var za;\n            switch (xa) {\n              case w.USER:\n                za = ((w.isPageOwner() ? k.SYS_OWNER : k.SYS_NONOWNER));\n                break;\n              case w.ONLINE:\n                za = ((ya ? k.SYS_ONLINE : k.SYS_OFFLINE));\n                break;\n              case w.TIME_TRAVEL:\n                za = k.SYS_TIMETRAVEL;\n                break;\n            };\n        ;\n            ca.exitState({\n                JSBNG__status: za,\n                stateId: ia\n            });\n        });\n        var va = function(xa, ya) {\n            var za = JSBNG__Date.now(), ab;\n            if (ya) {\n                qa = za;\n                ab = ((ya.nextState || ya.state));\n            }\n             else ab = ta;\n        ;\n        ;\n            w.checkTimeTravel();\n            if (ra) {\n                var bb = Math.round(((((za - ra)) / 1000)));\n                if (((bb > 0))) {\n                    sa[ta] = ((((sa[ta] || 0)) + bb));\n                    sa.total += bb;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            ta = ab;\n            ra = za;\n            if (!xa) {\n                sa.lastSuccessTime = la();\n                sa.online = w.isOnline();\n                da.log(\"rollup\", sa);\n            }\n        ;\n        ;\n        };\n        i.subscribe(k.ON_ENTER_STATE, va);\n        JSBNG__setInterval(va, 60000, false);\n        i.subscribe(q.DUMP_EVENT, function(xa, ya) {\n            ya.channelRollup = sa;\n        });\n        var wa = function() {\n            if (((ca.isShutdown() || ca.shouldIdle()))) {\n                return;\n            }\n        ;\n        ;\n            w.checkTimeTravel();\n            var xa = ((JSBNG__Date.now() - ((ca.lastPullTime || o.start))));\n            if (((!ua && ((xa > ha.STALL_THRESHOLD))))) {\n                var ya = la();\n                da.error(\"stall\", {\n                    lastSuccessTime: ya,\n                    rollupState: ta\n                });\n                ua = true;\n            }\n        ;\n        ;\n            var za = ((JSBNG__Date.now() - qa));\n            if (((((ca.state == \"pull\")) && ((za > ha.JUMPSTART_THRESHOLD))))) {\n                qa = null;\n                da.warn(\"jumpstart\", {\n                    state: ca.state,\n                    dormant: za\n                });\n                ca.enterState(\"init\");\n            }\n        ;\n        ;\n        };\n        JSBNG__setInterval(wa, 10000, false);\n    };\n;\n    function oa() {\n        var qa = JSBNG__Date.now(), ra = 1;\n        function sa() {\n            JSBNG__setTimeout(sa, ((ra * 1000)), false);\n            var xa = ca.state;\n            if (((((xa == \"idle\")) && ca.shouldIdle()))) {\n                return;\n            }\n        ;\n        ;\n            da.bump(\"conn_t\", ra);\n            if (((xa == \"pull\"))) {\n                da.bump(\"conn_t_pull\", ra);\n            }\n        ;\n        ;\n        };\n    ;\n        sa();\n        var ta = [15,30,60,120,240,], ua = false, va = false;\n        function wa(xa) {\n            JSBNG__setTimeout(function() {\n                da.rate(((\"pullenter_\" + xa)), ua);\n                da.rate(((\"pullexit_\" + xa)), va);\n            }, ((xa * 1000)), false);\n        };\n    ;\n        while (ta.length) {\n            wa(ta.shift());\n        ;\n        };\n    ;\n        i.subscribe(k.ON_ENTER_STATE, function(xa, ya) {\n            if (((ya.state == \"pull\"))) {\n                ua = true;\n            }\n        ;\n        ;\n            qa = JSBNG__Date.now();\n        });\n        i.subscribe(k.ON_EXIT_STATE, function(xa, ya) {\n            if (((((ya.state != \"pull\")) || !qa))) {\n                return;\n            }\n        ;\n        ;\n            var za = \"other\";\n            if (((ya.JSBNG__status == k.OK))) {\n                va = true;\n                za = \"ok\";\n            }\n             else if (((ya.xhr && ya.xhr.errorType))) {\n                za = ((/ar:(\\w+)/.test(ya.xhr.errorType) && RegExp.$1));\n            }\n             else if (/^sys_/.test(ya.JSBNG__status)) {\n                return;\n            }\n            \n            \n        ;\n        ;\n            var ab = ((((JSBNG__Date.now() - qa)) / 1000));\n            if (((ab < 0))) {\n                return;\n            }\n             else if (((ab > 3600))) {\n                ab = 3600;\n            }\n            \n        ;\n        ;\n            da.bump(\"conn_num\");\n            da.bump(\"conn_exit\", ab);\n            da.bump(((\"conn_num_\" + za)));\n            da.bump(((\"conn_exit_\" + za)), ab);\n        });\n    };\n;\n    function pa(qa) {\n        if (qa) {\n            ka = 0;\n            ja = {\n            };\n        }\n         else ka++;\n    ;\n    ;\n    };\n;\n    ca = {\n        state: \"idle\",\n        nextState: null,\n        lastPullTime: JSBNG__Date.now(),\n        heartbeats: [],\n        setTestCallback: fa,\n        init: function(qa) {\n            this.init = function() {\n            \n            };\n            if (((typeof (y) != \"undefined\"))) {\n                y.subscribe(function() {\n                    if (ba.isOnline()) {\n                        ha.userActive = JSBNG__Date.now();\n                    }\n                ;\n                ;\n                }.bind(this));\n            }\n             else da.error(\"user_activity_undefined\");\n        ;\n        ;\n            s.register(\"ch\", ma);\n            var ra = this.getConfig(\"max_conn\", 2), sa = Math.floor(((Math.JSBNG__random() * 32)));\n            ha.subdomain = m.allocate(ra, sa);\n            if (((typeof window.JSBNG__onpageshow != \"undefined\"))) {\n                g.listen(window, \"pagehide\", m.clear);\n            }\n             else v.onUnload(m.clear);\n        ;\n        ;\n            this._transportRate = new r(30000);\n            var ta = ((((h.supportsCORS() && !ha.forceIframe)) ? \"CORSTransport\" : \"IframeTransport\"));\n            this.transport = new n[ta](this);\n            if (qa) {\n                this.enterState.apply(this, arguments);\n            }\n        ;\n        ;\n            i.subscribe(q.DUMP_EVENT, function(JSBNG__event, va) {\n                va.transportRate = this._transportRate.tally();\n                va.transportType = ta;\n                va.transportVersion = 2;\n            }.bind(this));\n            na();\n            oa();\n            if (((((((ca.getConfig(\"tryStreaming\") && ca.getConfig(\"host\"))) && h.supportsCORS())) && !ha.forceIframe))) {\n                var ua = ((ha.MIN_INIT_PROBE_DELAY + ((Math.JSBNG__random() * ha.INIT_PROBE_DELAY_RANDOMIZE_RANGE))));\n                JSBNG__setTimeout(this._probeTest, ua, false);\n            }\n        ;\n        ;\n        },\n        configure: function() {\n            var qa = aa(arguments);\n            da.log(\"configure\", qa);\n            qa.forEach(z.bind(null, ha));\n            i.inform(k.ON_CONFIG, this);\n        },\n        getConfig: function(qa, ra) {\n            return ((((qa in ha)) ? ha[qa] : ra));\n        },\n        isShutdown: function() {\n            return ((this.state == \"shutdown\"));\n        },\n        shouldIdle: function() {\n            return !((w.isPageOwner() && w.isOnline()));\n        },\n        _sendIframeError: function(qa) {\n            var ra = new j().setURI(\"/ajax/presence/reconnect.php\").setData({\n                reason: qa,\n                fb_dtsg: o.fb_dtsg\n            }).setOption(\"suppressErrorHandlerWarning\", true).setOption(\"retries\", 1).setMethod(\"GET\").setReadOnly(true).setAllowCrossPageTransition(true);\n            ((ra.specifiesWriteRequiredParams() && ra.send()));\n        },\n        _getDelay: function() {\n            var qa = Math.min(((ha.MIN_RETRY_INTERVAL * Math.pow(2, Math.max(0, ((ka - 1)))))), ha.MAX_RETRY_INTERVAL);\n            return ((((qa * ((13517 + ((Math.JSBNG__random() / 2)))))) | 0));\n        },\n        enterState: function() {\n            if (this._inEnterState) {\n                da.warn(\"enterstate_recursion\");\n            }\n        ;\n        ;\n            this._inEnterState = true;\n            try {\n                this._enterState.apply(this, arguments);\n                this._inEnterState = false;\n            } catch (qa) {\n                this._inEnterState = false;\n                throw qa;\n            };\n        ;\n        },\n        _enterState: function(qa) {\n            var ra = 0, sa = aa(arguments);\n            if (this.isShutdown()) {\n                return;\n            }\n        ;\n        ;\n            if (((((qa != \"idle!\")) && this.shouldIdle()))) {\n                return;\n            }\n        ;\n        ;\n            ia++;\n            ha.stateId = ia;\n            JSBNG__clearTimeout(this._deferredTransition);\n            this._deferredTransition = null;\n            this.transport.enterState(\"idle\");\n            this.state = \"idle\";\n            this.nextState = null;\n            if (/!$/.test(qa)) {\n                var ta = this._transportRate.tally().timeAverage, ua = ca.getConfig(\"MAX_CHANNEL_STATES_PER_SEC\", 1);\n                if (((ta >= ua))) {\n                    if (!this._throttled) {\n                        this._throttled = true;\n                        da.warn(\"throttled\");\n                    }\n                ;\n                ;\n                    da.bump(\"throttle\");\n                    ra = ((1000 / ua));\n                }\n            ;\n            ;\n            }\n             else if (!(/#$/.test(qa))) {\n                ra = this._getDelay();\n            }\n            \n        ;\n        ;\n            qa = qa.replace(/\\W*$/, \"\");\n            if (!ga[qa]) {\n                throw new Error(((\"invalid state:\" + qa)));\n            }\n        ;\n        ;\n            var va;\n            if (((ra <= 0))) {\n                va = {\n                    state: qa\n                };\n                this._transportRate.add(1);\n                this.state = qa;\n                var wa = this[((\"_enter_\" + this.state))];\n                if (wa) {\n                    sa.shift();\n                    wa.apply(this, sa);\n                }\n            ;\n            ;\n                if (/init|idle|pull|ping/.test(this.state)) {\n                    if (((ha.streamingCapable && /pull/.test(this.state)))) {\n                        this.heartbeats = [];\n                    }\n                ;\n                ;\n                    this.transport.enterState(this.state, ha);\n                    if (((this.state == \"ping\"))) {\n                        va.url = n.getURI(ha).toString();\n                        va.port = ((ha.port || \"undefined\"));\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n            }\n             else {\n                this.state = \"idle\";\n                this.nextState = qa;\n                va = {\n                    state: this.state,\n                    delay: ra,\n                    nextState: qa\n                };\n                sa[0] = ((qa + \"#\"));\n                this._deferredTransition = (function() {\n                    this._deferredTransition = null;\n                    this.enterState.apply(this, sa);\n                }).bind(this).defer(ra, false);\n            }\n        ;\n        ;\n            if (/pull/.test(qa)) {\n                va.client_id = ha.sessionID;\n                va.streaming = ha.inStreaming;\n            }\n        ;\n        ;\n            da.log(((\"enter_\" + this.state)), va);\n            i.inform(k.ON_ENTER_STATE, va);\n        },\n        exitState: function(qa, ra) {\n            var sa = qa.stateId, ta = qa.JSBNG__status;\n            if (((this.isShutdown() || ((sa < ia))))) {\n                return;\n            }\n        ;\n        ;\n            var ua = aa(arguments), va = this.state;\n            ua[0] = qa.JSBNG__status;\n            var wa = {\n                state: va,\n                JSBNG__status: ta\n            };\n            if (/pull/.test(va)) {\n                wa.client_id = ha.sessionID;\n                wa.streaming = ha.inStreaming;\n            }\n        ;\n        ;\n            if (((/ping/.test(va) && ((ta != k.OK))))) {\n                wa.url = n.getURI(ha).toString();\n            }\n        ;\n        ;\n            if (this.nextState) {\n                wa.nextState = this.nextState;\n            }\n        ;\n        ;\n            if (((ra && ra.errorType))) {\n                wa.xhr = ((ra.toJSON ? ra.toJSON() : ra));\n                delete wa.xhr.json;\n            }\n        ;\n        ;\n            if (((ra && ra.json))) {\n                if (ra.json.t) {\n                    wa.t = ra.json.t;\n                }\n            ;\n            ;\n                if (ra.json.reason) {\n                    wa.reason = ra.json.reason;\n                }\n            ;\n            ;\n                if (ra.json.seq) {\n                    wa.seq = ra.json.seq;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            da.log(((\"exit_\" + va)), wa);\n            i.inform(k.ON_EXIT_STATE, wa);\n            var xa = this[((\"_exit_\" + va))];\n            if (xa) {\n                ta = ((xa.apply(this, ua) || ta));\n            }\n        ;\n        ;\n            if (((ta != k.OK))) {\n                pa();\n                ja[va] = ((((ja[va] || 0)) + 1));\n            }\n        ;\n        ;\n            var ya = ((ga[((this.nextState || va))][ta] || ga._all[ta])), za = ((ya && ya.replace(/!*$/, \"\")));\n            if (!za) {\n                da.error(\"terminal_transition\", wa);\n                this._shutdownHint = k.HINT_INVALID_STATE;\n                ya = \"shutdown!\";\n            }\n        ;\n        ;\n            this._lastState = va;\n            this._lastStatus = ta;\n            this.enterState(ya);\n        },\n        _processTransportData: function(qa, ra) {\n            var sa = ra.json, ta = sa.t;\n            if (((\"s\" in sa))) {\n                sa.seq = sa.s;\n                delete sa.s;\n            }\n        ;\n        ;\n            var ua = ha.seq;\n            if (((\"seq\" in sa))) {\n                ha.seq = sa.seq;\n                t.doSync();\n            }\n        ;\n        ;\n            switch (ta) {\n              case \"continue\":\n                if (((ha.inStreaming && ((this.heartbeats.length < 1))))) {\n                    ha.streamingCapable = false;\n                    da.log(\"switch_to_longpoll\");\n                    JSBNG__setTimeout(this._probeTest, ha.PROBE_DELAY, false);\n                }\n            ;\n            ;\n                pa(true);\n                if (((!ha.inStreaming || ha.STREAMING_EXIT_STATE_ON_CONTINUE))) {\n                    this.exitState({\n                        JSBNG__status: k.OK,\n                        stateId: qa\n                    });\n                }\n            ;\n            ;\n                break;\n              case \"refresh\":\n            \n              case \"refreshDelay\":\n                this.exitState({\n                    JSBNG__status: ((\"refresh_\" + ((sa.reason || 0)))),\n                    stateId: qa\n                }, ra);\n                break;\n              case \"fullReload\":\n                s.clear();\n                da.log(\"invalid_history\");\n                i.inform(k.ON_INVALID_HISTORY);\n                this.exitState({\n                    JSBNG__status: k.ERROR_MISSING,\n                    stateId: qa\n                }, ra);\n                break;\n              case \"msg\":\n                var va, wa, xa, ya;\n                pa(true);\n                wa = sa.ms;\n                xa = ((ha.seq - wa.length));\n                for (va = 0; ((va < wa.length)); va++, xa++) {\n                    if (((xa >= ua))) {\n                        ya = wa[va];\n                        if (ya.type) {\n                            if (((((ya.type === \"messaging\")) && ya.message))) {\n                                var za = ((ya.unread_counts && ya.unread_counts.inbox));\n                                da.debug(\"message\", {\n                                    type: \"messaging\",\n                                    inbox_unread: za,\n                                    tid: ya.message.tid,\n                                    mid: ya.message.mid\n                                });\n                            }\n                             else if (((ya.type === \"m_messaging\"))) {\n                                da.debug(\"message\", {\n                                    type: \"m_messaging\",\n                                    tid: ya.tid,\n                                    mid: ya.uuid\n                                });\n                            }\n                             else da.debug(\"message\", {\n                                type: ya.type\n                            });\n                            \n                        ;\n                        ;\n                            i.inform(k.getArbiterType(ya.type), {\n                                obj: ya\n                            });\n                        }\n                    ;\n                    ;\n                    }\n                     else da.warn(\"seq_regression\", {\n                        seq: xa,\n                        last_seq: ua,\n                        messages: wa.length\n                    });\n                ;\n                ;\n                };\n            ;\n                break;\n              case \"heartbeat\":\n                if (ha.inStreaming) {\n                    var ab = JSBNG__Date.now();\n                    if (((this.heartbeats.length > 0))) {\n                        var bb = ((ab - this.heartbeats[((this.heartbeats.length - 1))]));\n                        da.log(\"heartbeat_interval\", {\n                            client_id: ha.sessionID,\n                            interval: bb\n                        });\n                    }\n                ;\n                ;\n                    this.heartbeats.push(ab);\n                }\n            ;\n            ;\n                break;\n              default:\n                da.error(\"unknown_msg_type\", {\n                    type: ta\n                });\n                break;\n            };\n        ;\n        },\n        _enter_init: function() {\n            if (((ja.init >= ca.getConfig(\"MAX_INIT_FAILS\", 2)))) {\n                return this.exitState.bind(this, {\n                    JSBNG__status: k.ERROR_MAX,\n                    stateId: ia\n                }).defer();\n            }\n        ;\n        ;\n            this._initTimer = this.exitState.bind(this, {\n                JSBNG__status: k.ERROR,\n                stateId: ia\n            }, \"timeout\").defer(ha.IFRAME_LOAD_TIMEOUT, false);\n        },\n        _enter_reconnect: function(qa) {\n            var ra = ia;\n            if (!u.hasUserCookie()) {\n                da.warn(\"no_user_cookie\");\n                (function() {\n                    ca._shutdownHint = k.HINT_AUTH;\n                    ca.exitState({\n                        JSBNG__status: k.ERROR_SHUTDOWN,\n                        stateId: ra\n                    });\n                }).defer();\n                return;\n            }\n        ;\n        ;\n            var sa = {\n                reason: qa,\n                fb_dtsg: o.fb_dtsg\n            };\n            if (o.fb_isb) {\n                sa.fb_isb = o.fb_isb;\n            }\n        ;\n        ;\n            if (ea) {\n                ea(sa);\n            }\n        ;\n        ;\n            var ta = new p(\"GET\", \"/ajax/presence/reconnect.php\", sa);\n            ta.onSuccess = (function() {\n                ca.configure(ta.json);\n                s.store();\n                this.exitState({\n                    JSBNG__status: k.OK,\n                    stateId: ra\n                });\n            }).bind(this);\n            ta.onError = (function() {\n                var ua = ((ta.json && ta.json.error));\n                if (((((ta.errorType == h.TRANSPORT_ERROR)) || ((ta.errorType == h.PROXY_ERROR))))) {\n                    this._shutdownHint = k.HINT_CONN;\n                }\n            ;\n            ;\n                if (((ua && ((ua == 1356007))))) {\n                    this._shutdownHint = k.HINT_MAINT;\n                }\n                 else if (((((((ua == 1357001)) || ((ua == 1357004)))) || ((ua == 1348009))))) {\n                    this._shutdownHint = k.HINT_AUTH;\n                }\n                 else this._shutdownHint = null;\n                \n            ;\n            ;\n                this.exitState({\n                    JSBNG__status: ((this._shutdownHint ? k.ERROR_SHUTDOWN : k.ERROR)),\n                    stateId: ra\n                }, ta);\n            }).bind(this);\n            ta.send();\n        },\n        _enter_shutdown: function() {\n            i.inform(k.ON_SHUTDOWN, {\n                reason: this._shutdownHint\n            });\n        },\n        _exit_init: function(qa) {\n            if (this._initTimer) {\n                this._initTimer = JSBNG__clearTimeout(this._initTimer);\n            }\n        ;\n        ;\n            if (((qa == k.ERROR_MAX))) {\n                this._sendIframeError(k.reason_IFrameLoadGiveUp);\n            }\n        ;\n        ;\n        },\n        _exit_pull: function(qa) {\n            if (((qa == k.OK))) {\n                this.lastPullTime = JSBNG__Date.now();\n            }\n        ;\n        ;\n        },\n        _exit_ping: function(qa) {\n            if (((qa == k.OK))) {\n                var ra = ((JSBNG__Date.now() - ((this.lastPullTime || o.start))));\n                if (((ra > ha.STALL_THRESHOLD))) {\n                    return k.ERROR_STALE;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n        },\n        _probeTest: function() {\n            ha.streamingCapable = false;\n            var qa = [], ra = {\n                mode: \"stream\",\n                format: \"json\"\n            }, sa = new x(\"/probe\").setDomain(((ha.host + \".facebook.com\"))).setPort(ha.port).setSecure(x().isSecure()).setQueryData(ra), ta = new h(\"GET\", sa);\n            ta.onJSON = function(ua, va) {\n                if (((((ua && ua.json)) && ((ua.json.t === \"heartbeat\"))))) {\n                    qa.push(JSBNG__Date.now());\n                    if (((qa.length >= 2))) {\n                        var wa = ((qa[1] - qa[0]));\n                        if (((((wa >= ha.PROBE_HEARTBEATS_INTERVAL_LOW)) && ((wa <= ha.PROBE_HEARTBEATS_INTERVAL_HIGH))))) {\n                            ha.streamingCapable = true;\n                            da.log(\"switch_to_streaming\");\n                        }\n                    ;\n                    ;\n                        da.log(\"probe_ok\", {\n                            time: wa\n                        });\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n            };\n            ta.onSuccess = function(ua) {\n                if (((qa.length != 2))) {\n                    ha.streamingCapable = false;\n                    da.error(\"probe_error\", {\n                        error: ((\"beats.length = \" + qa.length))\n                    });\n                }\n            ;\n            ;\n            };\n            ta.onError = function(ua) {\n                ha.streamingCapable = false;\n                da.error(\"probe_error\", ua);\n            };\n            da.log(\"probe_request\");\n            ta.send();\n        }\n    };\n    e.exports = ca;\n    if (l.channelConfig) {\n        ca.configure(l.channelConfig);\n        if (/shutdown/.test(l.state)) {\n            ca._shutdownHint = k[l.reason];\n        }\n    ;\n    ;\n        ca.init(l.state, l.reason);\n    }\n;\n;\n});\n__d(\"ChannelConnection\", [\"Arbiter\",\"copyProperties\",\"ChatConfig\",\"Run\",\"SystemEvents\",\"ChannelConstants\",\"ChannelManager\",\"JSLogger\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"copyProperties\"), i = b(\"ChatConfig\"), j = b(\"Run\"), k = b(\"SystemEvents\"), l = b(\"ChannelConstants\"), m = b(\"ChannelManager\"), n = b(\"JSLogger\"), o = n.create(\"channel_connection\"), p = null, q = null, r = null, s = null, t = 0, u = h(new g(), {\n        CONNECTED: \"chat-connection/connected\",\n        RECONNECTING: \"chat-connection/reconnecting\",\n        SHUTDOWN: \"chat-connection/shutdown\",\n        MUTE_WARNING: \"chat-connection/mute\",\n        UNMUTE_WARNING: \"chat-connection/unmute\"\n    });\n    function v() {\n        if (q) {\n            JSBNG__clearTimeout(q);\n            q = null;\n        }\n    ;\n    ;\n    };\n;\n    function w() {\n        v();\n        o.log(\"unmute_warning\");\n        u.inform(u.UNMUTE_WARNING);\n    };\n;\n    function x(ba) {\n        v();\n        q = w.defer(ba, false);\n        o.log(\"mute_warning\", {\n            time: ba\n        });\n        u.inform(u.MUTE_WARNING);\n    };\n;\n    function y() {\n        if (r) {\n            JSBNG__clearTimeout(r);\n            r = null;\n        }\n    ;\n    ;\n    };\n;\n    function z(ba, ca) {\n        y();\n        if (((((ba === l.ON_ENTER_STATE)) && ((((ca.nextState || ca.state)) === \"pull\"))))) {\n            if (((s !== u.CONNECTED))) {\n                o.log(\"connected\");\n                var da = !s;\n                s = u.CONNECTED;\n                t = 0;\n                u.inform(u.CONNECTED, {\n                    init: da\n                });\n            }\n        ;\n        ;\n        }\n         else if (((((ba === l.ON_ENTER_STATE)) && ((((((ca.nextState || ca.state)) === \"ping\")) || ((!ca.nextState && ((ca.state === \"idle\"))))))))) {\n            r = (function() {\n                var ea = null;\n                if (!((((ca.state === \"idle\")) && !ca.nextState))) {\n                    ea = ((ca.delay || 0));\n                }\n            ;\n            ;\n                o.log(\"reconnecting\", {\n                    delay: ea\n                });\n                if (u.disconnected()) {\n                    o.log(\"reconnecting_ui\", {\n                        delay: ea\n                    });\n                }\n            ;\n            ;\n                s = u.RECONNECTING;\n                ((((ca.state === \"idle\")) && t++));\n                if (((t > 1))) {\n                    u.inform(u.RECONNECTING, ea);\n                }\n                 else if (((!ca.nextState && ((ca.state === \"idle\"))))) {\n                    z(ba, ca);\n                }\n                \n            ;\n            ;\n            }).defer(500, false);\n        }\n         else if (((ba === l.ON_SHUTDOWN))) {\n            o.log(\"shutdown\", {\n                reason: ca.reason\n            });\n            s = u.SHUTDOWN;\n            t = 0;\n            u.inform(u.SHUTDOWN, ca.reason);\n        }\n        \n        \n    ;\n    ;\n    };\n;\n    function aa(ba) {\n        if (((((m.state === \"ping\")) || m.isShutdown()))) {\n            return;\n        }\n    ;\n    ;\n        o.log(\"reconnect\", {\n            now: ba\n        });\n        u.inform(u.RECONNECTING, 0);\n        if (!!ba) {\n            if (((p !== null))) {\n                JSBNG__clearTimeout(p);\n                p = null;\n            }\n        ;\n        ;\n            m.enterState(\"ping!\");\n        }\n         else if (!p) {\n            p = JSBNG__setTimeout(function() {\n                m.enterState(\"ping!\");\n                p = null;\n            }, i.get(\"channel_manual_reconnect_defer_msec\"), false);\n        }\n        \n    ;\n    ;\n    };\n;\n    if (m.isShutdown()) {\n        z(l.ON_SHUTDOWN, m._shutdownHint);\n    }\n     else z(l.ON_ENTER_STATE, {\n        state: m.state,\n        nextState: m.nextState,\n        delay: 0\n    });\n;\n;\n    g.subscribe([l.ON_ENTER_STATE,l.ON_SHUTDOWN,], z);\n    k.subscribe(k.TIME_TRAVEL, function() {\n        aa();\n        x(i.get(\"mute_warning_time_msec\"));\n    });\n    j.onBeforeUnload(y, false);\n    h(u, {\n        disconnected: function() {\n            return ((((s === u.SHUTDOWN)) || ((((((s === u.RECONNECTING)) && !q)) && ((t > 1))))));\n        },\n        isShutdown: function() {\n            return ((s === u.SHUTDOWN));\n        },\n        reconnect: aa,\n        unmuteWarning: w\n    });\n    e.exports = u;\n});\n__d(\"ChatFavoriteList\", [\"AsyncRequest\",\"arrayContains\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = b(\"arrayContains\"), i = b(\"emptyFunction\"), j = false, k = [], l = [], m = false;\n    function n() {\n        var r = k.join(\",\");\n        new g(\"/ajax/chat/favorite_list.php\").setData({\n            favorite_list: r\n        }).setHandler(i).setErrorHandler(i).send();\n    };\n;\n    function o(r) {\n        return r.toString();\n    };\n;\n    function p(r) {\n        if (((k.length != r.length))) {\n            return true;\n        }\n    ;\n    ;\n        for (var s = 0; ((s < r.length)); s++) {\n            if (((k[s] !== r[s].toString()))) {\n                return true;\n            }\n        ;\n        ;\n        };\n    ;\n        return false;\n    };\n;\n    var q = {\n        isEditMode: function() {\n            var r = null;\n            d([\"ChatSidebar\",], function(s) {\n                r = s;\n            });\n            return ((((j && r)) && r.isEnabled()));\n        },\n        toggleEditMode: function() {\n            j = !j;\n            if (j) {\n                l = k.slice();\n            }\n        ;\n        ;\n        },\n        get: function() {\n            if (j) {\n                return l.slice();\n            }\n             else return k.slice()\n        ;\n        },\n        isFavored: function(r) {\n            return h(l, r.toString());\n        },\n        init: function(r) {\n            k = r.slice().map(o);\n            l = k.slice();\n        },\n        toggleID: function(r) {\n            if (!j) {\n                return;\n            }\n        ;\n        ;\n            r = r.toString();\n            var s = l.indexOf(r);\n            if (((s >= 0))) {\n                l.splice(s, 1);\n            }\n             else l.push(r);\n        ;\n        ;\n            m = true;\n        },\n        hasChanged: function() {\n            if (m) {\n                m = false;\n                return true;\n            }\n        ;\n        ;\n            return false;\n        },\n        updateList: function(r) {\n            if (!j) {\n                return;\n            }\n        ;\n        ;\n            l = r.map(o);\n        },\n        save: function() {\n            if (p(l)) {\n                k = l;\n                n();\n            }\n        ;\n        ;\n        }\n    };\n    e.exports = q;\n});\n__d(\"ChatContexts\", [], function(a, b, c, d, e, f) {\n    var g = {\n    };\n    function h(k) {\n        var l = ((k ? k.subtext : \"\"));\n        return l;\n    };\n;\n    function i(k, l) {\n        g[k] = l;\n    };\n;\n    var j = {\n        get: function(k) {\n            if (((k in g))) {\n                return g[k];\n            }\n             else return null\n        ;\n        },\n        update: function(k) {\n            {\n                var fin202keys = ((window.top.JSBNG_Replay.forInKeys)((k))), fin202i = (0);\n                var l;\n                for (; (fin202i < fin202keys.length); (fin202i++)) {\n                    ((l) = (fin202keys[fin202i]));\n                    {\n                        i(l, k[l]);\n                    ;\n                    };\n                };\n            };\n        ;\n        },\n        getShortDisplay: function(k) {\n            return h(j.get(k));\n        }\n    };\n    e.exports = j;\n});\n__d(\"LastMobileActiveTimes\", [\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"tx\"), h = 0, i = {\n    };\n    function j(n) {\n        if (((!h || !n))) {\n            return \"\";\n        }\n    ;\n    ;\n        var o = ((h - n)), p = Math.floor(((o / 60))), q = Math.floor(((p / 60))), r = Math.floor(((q / 24)));\n        if (((p <= 1))) {\n            return g._(\"{count}m\", {\n                count: 1\n            });\n        }\n         else if (((p < 60))) {\n            return g._(\"{count}m\", {\n                count: p\n            });\n        }\n         else if (((q < 24))) {\n            return g._(\"{count}h\", {\n                count: q\n            });\n        }\n         else if (((r < 3))) {\n            return g._(\"{count}d\", {\n                count: r\n            });\n        }\n         else return \"\"\n        \n        \n        \n    ;\n    };\n;\n    function k(n, o) {\n        i[n] = o;\n    };\n;\n    function l(n) {\n        if (((n in i))) {\n            return i[n];\n        }\n         else return 0\n    ;\n    };\n;\n    var m = {\n        update: function(n, o) {\n            h = ((o / 1000));\n            {\n                var fin203keys = ((window.top.JSBNG_Replay.forInKeys)((n))), fin203i = (0);\n                var p;\n                for (; (fin203i < fin203keys.length); (fin203i++)) {\n                    ((p) = (fin203keys[fin203i]));\n                    {\n                        k(p, n[p]);\n                    ;\n                    };\n                };\n            };\n        ;\n        },\n        getShortDisplay: function(n) {\n            return j(l(n));\n        }\n    };\n    e.exports = m;\n});\n__d(\"ServerTime\", [\"PresenceInitialData\",], function(a, b, c, d, e, f) {\n    var g = b(\"PresenceInitialData\"), h;\n    function i(k) {\n        h = ((JSBNG__Date.now() - k));\n    };\n;\n    i(g.serverTime);\n    var j = {\n        get: function() {\n            return ((JSBNG__Date.now() - h));\n        },\n        getSkew: function() {\n            return h;\n        },\n        update: function(k) {\n            i(k);\n        }\n    };\n    e.exports = j;\n});\n__d(\"PresenceStatus\", [\"AvailableListConstants\",\"ChatConfig\",\"ChatVisibility\",\"Env\",\"PresencePrivacy\",\"ServerTime\",\"createObjectFrom\",], function(a, b, c, d, e, f) {\n    var g = b(\"AvailableListConstants\"), h = b(\"ChatConfig\"), i = b(\"ChatVisibility\"), j = b(\"Env\"), k = b(\"PresencePrivacy\"), l = b(\"ServerTime\"), m = b(\"createObjectFrom\"), n = {\n    }, o = {\n    }, p = {\n    }, q = {\n    }, r = {\n        resetPresenceData: function() {\n            n = {\n            };\n            q = {\n            };\n            p = {\n            };\n        },\n        reset: function() {\n            r.resetPresenceData();\n            o = {\n            };\n        },\n        get: function(s) {\n            if (((s == j.user))) {\n                return ((i.isOnline() ? g.ACTIVE : g.OFFLINE));\n            }\n        ;\n        ;\n            var t = g.OFFLINE;\n            if (((s in n))) {\n                t = n[s];\n            }\n        ;\n        ;\n            if (!k.allows(s)) {\n                t = g.OFFLINE;\n            }\n        ;\n        ;\n            if (((t == g.OFFLINE))) {\n                if (o[s]) {\n                    t = g.MOBILE;\n                }\n            ;\n            }\n        ;\n        ;\n            return t;\n        },\n        getGroup: function(s) {\n            if (!h.get(\"chat_group_presence\", 0)) {\n                return g.OFFLINE;\n            }\n        ;\n        ;\n            return ((s.some(function(t) {\n                if (((t == j.user))) {\n                    return false;\n                }\n            ;\n            ;\n                return ((r.get(t) === g.ACTIVE));\n            }) ? g.ACTIVE : g.OFFLINE));\n        },\n        set: function(s, t, u, v) {\n            if (((s == j.user))) {\n                return false;\n            }\n        ;\n        ;\n            switch (t) {\n              case g.OFFLINE:\n            \n              case g.IDLE:\n            \n              case g.ACTIVE:\n            \n              case g.MOBILE:\n                break;\n              default:\n                return false;\n            };\n        ;\n            var w = ((r.get(s) != t));\n            if (u) {\n                p[s] = l.get();\n                q[s] = v;\n            }\n        ;\n        ;\n            n[s] = t;\n            return w;\n        },\n        setMobileFriends: function(s) {\n            o = m(s);\n        },\n        getOnlineIDs: function() {\n            var s, t = [];\n            {\n                var fin204keys = ((window.top.JSBNG_Replay.forInKeys)((n))), fin204i = (0);\n                (0);\n                for (; (fin204i < fin204keys.length); (fin204i++)) {\n                    ((s) = (fin204keys[fin204i]));\n                    {\n                        if (((r.get(s) === g.ACTIVE))) {\n                            t.push(s);\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            return t;\n        },\n        getAvailableIDs: function() {\n            var s = r.getOnlineIDs(), t;\n            {\n                var fin205keys = ((window.top.JSBNG_Replay.forInKeys)((o))), fin205i = (0);\n                (0);\n                for (; (fin205i < fin205keys.length); (fin205i++)) {\n                    ((t) = (fin205keys[fin205i]));\n                    {\n                        if (n[t]) {\n                            continue;\n                        }\n                    ;\n                    ;\n                        s.push(t);\n                    };\n                };\n            };\n        ;\n            return s;\n        },\n        getOnlineCount: function() {\n            return r.getOnlineIDs().length;\n        },\n        getPresenceStats: function() {\n            var s = 0, t = 0, u = 0, v = 0, w = 0;\n            {\n                var fin206keys = ((window.top.JSBNG_Replay.forInKeys)((n))), fin206i = (0);\n                var x;\n                for (; (fin206i < fin206keys.length); (fin206i++)) {\n                    ((x) = (fin206keys[fin206i]));\n                    {\n                        s += 1;\n                        switch (r.get(x)) {\n                          case g.OFFLINE:\n                            t += 1;\n                            break;\n                          case g.IDLE:\n                            u += 1;\n                            break;\n                          case g.ACTIVE:\n                            v += 1;\n                            break;\n                          case g.MOBILE:\n                            w += 1;\n                            break;\n                          default:\n                            break;\n                        };\n                    ;\n                    };\n                };\n            };\n        ;\n            return {\n                total: s,\n                offline: t,\n                idle: u,\n                active: v,\n                mobile: w\n            };\n        },\n        getDebugInfo: function(s) {\n            return {\n                id: s,\n                presence: n[s],\n                overlaySource: q[s],\n                overlayTime: p[s],\n                mobile: o[s]\n            };\n        }\n    };\n    e.exports = r;\n});\n__d(\"PresencePoller\", [\"AvailableListConstants\",\"AvailableListInitialData\",\"BanzaiODS\",\"ChannelConnection\",\"ChatContexts\",\"ChatFavoriteList\",\"ChatVisibility\",\"Env\",\"JSLogger\",\"LastMobileActiveTimes\",\"Poller\",\"PresenceStatus\",\"PresenceUtil\",\"ServerTime\",\"ShortProfiles\",\"UserActivity\",\"copyProperties\",\"debounceAcrossTransitions\",], function(a, b, c, d, e, f) {\n    var g = b(\"AvailableListConstants\"), h = b(\"AvailableListInitialData\"), i = b(\"BanzaiODS\"), j = b(\"ChannelConnection\"), k = b(\"ChatContexts\"), l = b(\"ChatFavoriteList\"), m = b(\"ChatVisibility\"), n = b(\"Env\"), o = b(\"JSLogger\"), p = b(\"LastMobileActiveTimes\"), q = b(\"Poller\"), r = b(\"PresenceStatus\"), s = b(\"PresenceUtil\"), t = b(\"ServerTime\"), u = b(\"ShortProfiles\"), v = b(\"UserActivity\"), w = b(\"copyProperties\"), x = b(\"debounceAcrossTransitions\"), y = 5, z = \"/ajax/chat/buddy_list.php\", aa = 1800000, ba = h.pollInterval, ca = h.lazyPollInterval, da = h.lazyThreshold, ea = o.create(\"available_list\"), fa = \"presence_poller\";\n    function ga(ha) {\n        this.$PresencePoller0 = ha;\n        this.$PresencePoller1 = false;\n        this.$PresencePoller2 = h.chatNotif;\n        this.$PresencePoller3 = new q({\n            interval: ba,\n            setupRequest: this.$PresencePoller4.bind(this),\n            clearOnQuicklingEvents: false,\n            dontStart: true\n        });\n        this.$PresencePoller5 = JSBNG__Date.now();\n        this.$PresencePoller6 = JSBNG__Date.now();\n        this.$PresencePoller7 = JSBNG__Date.now();\n        this.$PresencePoller8 = h.updateTime;\n        this.$PresencePoller9 = false;\n        this.$PresencePollera = 0;\n        if (h.favoriteList) {\n            l.init(h.favoriteList);\n        }\n    ;\n    ;\n        this.$PresencePollerb(\"available_initial_data\", h.updateTime, h.availableList, h.lastActiveTimes, h.mobileFriends);\n        v.subscribe(function(ia, ja) {\n            if (((ja.idleness > ba))) {\n                this.forceUpdate();\n            }\n        ;\n        ;\n        }.bind(this));\n    };\n;\n    ga.prototype.start = function() {\n        this.$PresencePoller3.start.bind(this.$PresencePoller3).defer();\n    };\n    ga.prototype.forceUpdate = function() {\n        if (!this.$PresencePoller9) {\n            this.$PresencePoller3.request();\n        }\n    ;\n    ;\n    };\n    ga.prototype.getIsUserIdle = function() {\n        return this.$PresencePoller1;\n    };\n    ga.prototype.getWebChatNotification = function() {\n        return this.$PresencePoller2;\n    };\n    ga.prototype.getCallback = function() {\n        return this.$PresencePoller0;\n    };\n    ga.prototype.$PresencePollerc = function() {\n        return x(function() {\n            this.$PresencePoller0(g.ON_AVAILABILITY_CHANGED);\n        }.bind(this), 0)();\n    };\n    ga.prototype.$PresencePollerb = function(ha, ia, ja, ka, la) {\n        this.$PresencePoller8 = ia;\n        if (!Array.isArray(ja)) {\n            r.resetPresenceData();\n            {\n                var fin207keys = ((window.top.JSBNG_Replay.forInKeys)((ja))), fin207i = (0);\n                var ma;\n                for (; (fin207i < fin207keys.length); (fin207i++)) {\n                    ((ma) = (fin207keys[fin207i]));\n                    {\n                        r.set(ma, ja[ma].a, false, ha);\n                    ;\n                    };\n                };\n            };\n        ;\n        }\n    ;\n    ;\n        if (ka) {\n            p.update(ka, ia);\n        }\n    ;\n    ;\n        if (la) {\n            r.setMobileFriends(la);\n        }\n    ;\n    ;\n        this.$PresencePollerc();\n    };\n    ga.prototype.$PresencePoller4 = function(ha) {\n        if (((j.isShutdown() || !m.isOnline()))) {\n            this.$PresencePoller3.skip();\n            i.bumpEntityKey(fa, \"skip.offline\");\n            return;\n        }\n    ;\n    ;\n        if (((((JSBNG__Date.now() - this.$PresencePoller5)) < ba))) {\n            this.$PresencePoller3.skip();\n            i.bumpEntityKey(fa, \"skip.recent\");\n            return;\n        }\n    ;\n    ;\n        i.bumpEntityKey(fa, \"request\");\n        this.$PresencePoller5 = JSBNG__Date.now();\n        var ia = ((((JSBNG__Date.now() - this.$PresencePoller7)) > aa)), ja = u.getCachedProfileIDs().join(\",\");\n        this.$PresencePoller9 = true;\n        ha.setHandler(this.$PresencePollerd.bind(this)).setErrorHandler(this.$PresencePollere.bind(this)).setOption(\"suppressErrorAlerts\", true).setOption(\"retries\", 1).setData({\n            user: n.user,\n            cached_user_info_ids: ja,\n            fetch_mobile: ia\n        }).setURI(z).setAllowCrossPageTransition(true);\n    };\n    ga.prototype.$PresencePollerd = function(ha) {\n        var ia = ha.getPayload(), ja = ia.buddy_list;\n        if (!ja) {\n            this.$PresencePollere(ha);\n            return;\n        }\n    ;\n    ;\n        i.bumpEntityKey(fa, \"response\");\n        this.$PresencePoller9 = false;\n        this.$PresencePollerf();\n        this.$PresencePoller6 = JSBNG__Date.now();\n        t.update(ia.time);\n        this.$PresencePollera = 0;\n        this.$PresencePollerg();\n        var ka = ja.userInfos;\n        if (ka) {\n            u.setMulti(ka);\n        }\n    ;\n    ;\n        var la = ja.chatContexts;\n        ((la && k.update(la)));\n        this.$PresencePoller1 = ja.userIsIdle;\n        if (((ja.chatNotif !== undefined))) {\n            this.$PresencePoller2 = ja.chatNotif;\n            this.$PresencePoller0(g.ON_CHAT_NOTIFICATION_CHANGED, this.$PresencePoller2);\n        }\n    ;\n    ;\n        this.$PresencePollerb(\"buddy_list_poller\", ia.time, ja.nowAvailableList, ja.last_active_times, ja.mobile_friends);\n    };\n    ga.prototype.$PresencePollere = function(ha) {\n        i.bumpEntityKey(fa, \"error\");\n        if (s.checkMaintenanceError(ha)) {\n            return;\n        }\n    ;\n    ;\n        this.$PresencePoller9 = false;\n        this.$PresencePollera++;\n        if (((this.$PresencePollera++ >= y))) {\n            this.$PresencePoller0(g.ON_UPDATE_ERROR);\n        }\n    ;\n    ;\n    };\n    ga.prototype.$PresencePollerg = function() {\n        var ha = ((v.isActive(da) ? ba : ca));\n        i.bumpEntityKey(fa, ((\"period.\" + ha)));\n        this.$PresencePoller3.JSBNG__setInterval(ha);\n    };\n    ga.prototype.$PresencePollerf = function() {\n        var ha = JSBNG__Date.now(), ia = ((ha - this.$PresencePoller6));\n        ea.log(\"buddylist_presence_stats\", w({\n            duration: ia\n        }, r.getPresenceStats()));\n    };\n    e.exports = ga;\n});\n__d(\"AvailableList\", [\"function-extensions\",\"Arbiter\",\"ArbiterMixin\",\"AsyncRequest\",\"AvailableListConstants\",\"ChannelImplementation\",\"ChannelConstants\",\"ChatConfig\",\"ChatFavoriteList\",\"JSLogger\",\"PresencePoller\",\"PresencePrivacy\",\"PresenceStatus\",\"ShortProfiles\",\"TypingDetector\",\"copyProperties\",\"debounceAcrossTransitions\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    b(\"function-extensions\");\n    var g = b(\"Arbiter\"), h = b(\"ArbiterMixin\"), i = b(\"AsyncRequest\"), j = b(\"AvailableListConstants\"), k = b(\"ChannelImplementation\").instance, l = b(\"ChannelConstants\"), m = b(\"ChatConfig\"), n = b(\"ChatFavoriteList\"), o = b(\"JSLogger\"), p = b(\"PresencePoller\"), q = b(\"PresencePrivacy\"), r = b(\"PresenceStatus\"), s = b(\"ShortProfiles\"), t = b(\"TypingDetector\"), u = b(\"copyProperties\"), v = b(\"debounceAcrossTransitions\"), w = b(\"emptyFunction\"), x = u({\n    }, j, h);\n    x.subscribe([j.ON_AVAILABILITY_CHANGED,j.ON_UPDATE_ERROR,], function(ea, fa) {\n        g.inform(ea, fa);\n    });\n    var y = v(function() {\n        x.inform(j.ON_AVAILABILITY_CHANGED);\n    }, 0);\n    function z(ea, fa, ga, ha) {\n        var ia = r.set(ea, fa, ga, ha);\n        if (ia) {\n            y();\n        }\n    ;\n    ;\n    };\n;\n    function aa(ea) {\n        var fa = ((ea.payload.availability || {\n        }));\n        {\n            var fin208keys = ((window.top.JSBNG_Replay.forInKeys)((fa))), fin208i = (0);\n            var ga;\n            for (; (fin208i < fin208keys.length); (fin208i++)) {\n                ((ga) = (fin208keys[fin208i]));\n                {\n                    z(ga, fa[ga], true, \"mercury_tabs\");\n                ;\n                };\n            };\n        };\n    ;\n    };\n;\n    function ba(ea) {\n        var fa = x.getDebugInfo(ea), ga = ((fa.presence == j.ACTIVE)), ha = new i(\"/ajax/mercury/tabs_presence.php\").setData({\n            target_id: ea,\n            to_online: ga,\n            presence_source: fa.overlaySource,\n            presence_time: fa.overlayTime\n        }).setHandler(aa).setErrorHandler(w).setAllowCrossPageTransition(true).send();\n    };\n;\n    function ca(ea, fa) {\n        fa.chat_config = m.getDebugInfo();\n        fa.available_list_debug_info = {\n        };\n        x.getAvailableIDs().forEach(function(ga) {\n            fa.available_list_debug_info[ga] = x.getDebugInfo(ga);\n        });\n        fa.available_list_poll_interval = ((x._poller && x._poller.getInterval()));\n    };\n;\n    var da = new p(function(JSBNG__event) {\n        x.inform(JSBNG__event);\n    });\n    u(x, {\n        get: function(ea) {\n            return r.get(ea);\n        },\n        updateForID: function(ea) {\n            ba(ea);\n        },\n        getWebChatNotification: function() {\n            return da.getWebChatNotification();\n        },\n        isUserIdle: function() {\n            return da.getIsUserIdle();\n        },\n        isReady: function() {\n            return true;\n        },\n        set: function(ea, fa, ga) {\n            z(ea, fa, true, ga);\n        },\n        update: function() {\n            da.forceUpdate();\n        },\n        isIdle: function(ea) {\n            return ((x.get(ea) == j.IDLE));\n        },\n        getOnlineIDs: function() {\n            return r.getOnlineIDs();\n        },\n        getAvailableIDs: function() {\n            return r.getAvailableIDs();\n        },\n        getOnlineCount: function() {\n            return r.getOnlineCount();\n        },\n        getDebugInfo: function(ea) {\n            var fa = r.getDebugInfo(ea), ga = s.getNow(ea);\n            if (ga) {\n                fa.JSBNG__name = ga.JSBNG__name;\n            }\n        ;\n        ;\n            return fa;\n        }\n    });\n    da.start();\n    g.subscribe(o.DUMP_EVENT, ca);\n    g.subscribe(l.getArbiterType(\"favorite_list\"), function(ea, fa) {\n        var ga = fa.obj, ha = ((ga.value ? ga.value.split(\",\") : []));\n        n.init(ha);\n        y();\n    });\n    q.subscribe([\"privacy-changed\",\"privacy-availability-changed\",\"privacy-user-presence-response\",], y);\n    k.subscribe([k.CONNECTED,k.RECONNECTING,k.SHUTDOWN,k.MUTE_WARNING,k.UNMUTE_WARNING,], y);\n    g.subscribe(l.getArbiterType(\"buddylist_overlay\"), function(ea, fa) {\n        var ga = fa.obj.overlay;\n        {\n            var fin209keys = ((window.top.JSBNG_Replay.forInKeys)((ga))), fin209i = (0);\n            var ha;\n            for (; (fin209i < fin209keys.length); (fin209i++)) {\n                ((ha) = (fin209keys[fin209i]));\n                {\n                    x.set(ha, ga[ha].a, ((ga[ha].s || \"channel\")));\n                ;\n                };\n            };\n        };\n    ;\n    });\n    g.subscribe([l.getArbiterType(\"typ\"),l.getArbiterType(\"ttyp\"),], function(ea, fa) {\n        var ga = fa.obj;\n        if (((ga.st === t.TYPING))) {\n            var ha = ga.from;\n            x.set(ha, j.ACTIVE, \"channel-typing\");\n        }\n    ;\n    ;\n    });\n    a.AvailableList = e.exports = x;\n});\n__d(\"ChatImpressionLogger\", [\"AvailableList\",\"AsyncSignal\",\"ChatConfig\",\"ChatVisibility\",\"Poller\",], function(a, b, c, d, e, f) {\n    var g = b(\"AvailableList\"), h = b(\"AsyncSignal\"), i = b(\"ChatConfig\"), j = b(\"ChatVisibility\"), k = b(\"Poller\"), l = null, m = null, n = {\n        init: function(o) {\n            l = o;\n            var p = i.get(\"chat_impression_logging_periodical\", 0);\n            if (p) {\n                var q = i.get(\"periodical_impression_logging_config.interval\");\n                m = new k({\n                    interval: q,\n                    setupRequest: this.logImps.bind(this),\n                    clearOnQuicklingEvents: false\n                });\n            }\n        ;\n        ;\n            this.init = function() {\n            \n            };\n        },\n        logImps: function(o) {\n            if (!j.isOnline()) {\n                return;\n            }\n        ;\n        ;\n            var p = {\n                source: \"periodical_imps\"\n            }, q = l.getCachedSortedList(), r = [];\n            for (var s = 0; ((s < q.length)); s++) {\n                r[s] = g.get(q[s]);\n            ;\n            };\n        ;\n            p.sorted_list = q.toString();\n            p.list_availability = r.toString();\n            o.setURI(\"/ajax/chat/imps_logging.php\").setData(p);\n        },\n        getOrderedList: function() {\n            return l;\n        },\n        logImpressions: function(o) {\n            var p = [], q = [];\n            if (i.get(\"chat_impression_logging_with_click\")) {\n                p = l.getCachedSortedList();\n                for (var r = 0; ((r < p.length)); r++) {\n                    q[r] = g.get(p[r]);\n                ;\n                };\n            ;\n            }\n        ;\n        ;\n            o.sorted_list = p.toString();\n            o.list_availability = q.toString();\n            new h(\"/ajax/chat/ct.php\", o).send();\n        }\n    };\n    e.exports = n;\n});\n__d(\"ChatTypeaheadConstants\", [], function(a, b, c, d, e, f) {\n    var g = {\n        USER_TYPE: \"user\",\n        THREAD_TYPE: \"thread\",\n        FRIEND_TYPE: \"friend\",\n        NON_FRIEND_TYPE: \"non_friend\",\n        HEADER_TYPE: \"header\"\n    };\n    e.exports = g;\n});\n__d(\"Chat\", [\"Arbiter\",\"AvailableList\",\"ChatImpressionLogger\",\"ChatTypeaheadConstants\",\"MercuryParticipantTypes\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"AvailableList\"), i = b(\"ChatImpressionLogger\"), j = b(\"ChatTypeaheadConstants\"), k = b(\"MercuryParticipantTypes\");\n    function l(q, r) {\n        var s = ((r && r.source));\n        if (((((((((((((((s && ((s === \"ordered_list\")))) || ((s === \"more_online_friends\")))) || ((s === \"online_friends\")))) || ((s === \"recent_threads_in_divebar_new\")))) || ((s === \"recent_threads_in_divebar\")))) || ((s === \"presence\")))) || ((s === \"typeahead\"))))) {\n            r.viewport_width = JSBNG__document.body.clientWidth;\n            r.target = q;\n            r.target_presence = h.get(q);\n            i.logImpressions(r);\n        }\n    ;\n    ;\n    };\n;\n    var m = {\n        buddyListNub: \"buddylist-nub/initialized\",\n        JSBNG__sidebar: \"sidebar/initialized\"\n    };\n    function n(q, r) {\n        g.subscribe(m[q], function(JSBNG__event, s) {\n            r(s);\n        });\n    };\n;\n    function o() {\n        return ((((Math.JSBNG__random() * 2147483648)) | 0)).toString(16);\n    };\n;\n    var p = {\n        openTab: function(q, r, s) {\n            if (((((window.External && window.External.Chat)) && window.External.Chat.openWindow))) {\n                window.External.Chat.openWindow(q);\n            }\n        ;\n        ;\n            l.curry(q, s).defer();\n            d([\"MercuryThreads\",], function(t) {\n                if (((((((!r || ((r === k.FRIEND)))) || ((r === j.FRIEND_TYPE)))) || ((r === j.USER_TYPE))))) {\n                    var u = t.get().getCanonicalThreadToUser(q), v = o();\n                    g.inform(\"chat/open-tab\", {\n                        thread_id: u.thread_id,\n                        signature_id: v\n                    });\n                    return;\n                }\n            ;\n            ;\n                if (((r === j.THREAD_TYPE))) {\n                    d([\"ChatOpenTab\",], function(w) {\n                        if (q) {\n                            w.openThread(q);\n                        }\n                         else w.openEmptyTab();\n                    ;\n                    ;\n                    });\n                }\n            ;\n            ;\n            });\n        },\n        openBuddyList: function() {\n            n(\"buddyListNub\", function(q) {\n                q.show();\n                n(\"JSBNG__sidebar\", function(r) {\n                    r.enable();\n                });\n            });\n        },\n        closeBuddyList: function() {\n            n(\"buddyListNub\", function(q) {\n                q.hide();\n            });\n        },\n        toggleSidebar: function() {\n            n(\"JSBNG__sidebar\", function(q) {\n                q.toggle();\n            });\n        },\n        goOnline: function(q) {\n            d([\"ChatVisibility\",], function(r) {\n                r.goOnline(q);\n            });\n        },\n        isOnline: function() {\n            var q = null;\n            d([\"ChatVisibility\",], function(r) {\n                q = r;\n            });\n            return ((q && q.isOnline()));\n        }\n    };\n    a.Chat = e.exports = p;\n}, 3);\n__d(\"OrderedFriendsList\", [\"AvailableList\",\"ChatConfig\",\"createArrayFrom\",\"ShortProfiles\",\"InitialChatFriendsList\",], function(a, b, c, d, e, f) {\n    var g = b(\"AvailableList\"), h = b(\"ChatConfig\"), i = b(\"createArrayFrom\"), j = b(\"ShortProfiles\"), k = [], l = {\n    }, m = [], n = {\n        contains: function(o) {\n            return ((o in l));\n        },\n        compare: function(o, p) {\n            var q = n.getRank(o), r = n.getRank(p);\n            if (((q !== r))) {\n                return ((q - r));\n            }\n        ;\n        ;\n            var s = j.getNowUnsafe(o), t = j.getNowUnsafe(p), u = ((((s || {\n            })).JSBNG__name || \"~\")).toLowerCase(), v = ((((t || {\n            })).JSBNG__name || \"~\")).toLowerCase();\n            if (((u !== v))) {\n                return ((((u < v)) ? -1 : 1));\n            }\n        ;\n        ;\n            return 0;\n        },\n        getList: function() {\n            if (h.get(\"chat_web_ranking_with_presence\")) {\n                n.reRank();\n            }\n        ;\n        ;\n            var o = i(k);\n            o = o.filter(function(p) {\n                var q = j.getNowUnsafe(p);\n                return ((!q || ((q.type == \"friend\"))));\n            });\n            return o;\n        },\n        getRank: function(o) {\n            return ((((o in l)) ? l[o] : k.length));\n        },\n        reRank: function() {\n            var o = {\n            }, p = {\n            };\n            m.forEach(function(r, s) {\n                var t = r.substr(0, ((r.length - 2))), u = r.substring(((r.length - 1)));\n                if (((typeof (p.uid) == \"undefined\"))) {\n                    if (((typeof (o.uid) == \"undefined\"))) {\n                        o[t] = g.get(t);\n                    }\n                ;\n                ;\n                    var v = o[t];\n                    if (((v == u))) {\n                        p[s] = t;\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n            });\n            k = [];\n            {\n                var fin210keys = ((window.top.JSBNG_Replay.forInKeys)((p))), fin210i = (0);\n                var q;\n                for (; (fin210i < fin210keys.length); (fin210i++)) {\n                    ((q) = (fin210keys[fin210i]));\n                    {\n                        k.push(p[q]);\n                    ;\n                    };\n                };\n            };\n        ;\n            k.forEach(function(r, s) {\n                l[r] = s;\n            });\n        }\n    };\n    (function() {\n        var o = b(\"InitialChatFriendsList\");\n        k = ((o.list.length ? o.list : []));\n        if (h.get(\"chat_web_ranking_with_presence\")) {\n            m = k.slice();\n            n.reRank();\n        }\n    ;\n    ;\n        k.forEach(function(p, q) {\n            l[p] = q;\n        });\n    })();\n    e.exports = ((a.OrderedFriendsList || n));\n});\n__d(\"ChatSidebarConstants\", [], function(a, b, c, d, e, f) {\n    var g = {\n        LITESTAND_IMAGE_SIZE: 24,\n        LITESTAND_BLENDED_SIZE: 32,\n        IMAGE_SIZE: 28\n    };\n    e.exports = g;\n});\n__d(\"ChatTypeaheadBehavior\", [\"Chat\",\"ChatConfig\",\"ChatFavoriteList\",\"CSS\",\"DOM\",\"JSBNG__Rect\",\"copyProperties\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Chat\"), h = b(\"ChatConfig\"), i = b(\"ChatFavoriteList\"), j = b(\"CSS\"), k = b(\"DOM\"), l = b(\"JSBNG__Rect\"), m = b(\"copyProperties\"), n = b(\"tx\");\n    function o(p) {\n        this._typeahead = p;\n    };\n;\n    m(o.prototype, {\n        _subscriptions: null,\n        enable: function() {\n            var p = this._typeahead;\n            this._subscriptions = [p.subscribe(\"JSBNG__focus\", function() {\n                p.getData().refreshData();\n            }),p.subscribe(\"JSBNG__blur\", function(q) {\n                p.getCore().reset();\n            }),p.subscribe(\"respond\", function(q, r) {\n                if (((r.value && ((r.value === p.getCore().getValue()))))) {\n                    if (!r.results.length) {\n                        var s = h.get(\"divebar_typeahead_group_fof\", 0);\n                        if (((s && !r.isAsync))) {\n                            return;\n                        }\n                    ;\n                    ;\n                        var t = k.create(\"div\", {\n                            className: \"noResults\"\n                        }, \"Friend not found.\");\n                        k.setContent(p.getView().getElement(), t);\n                    }\n                ;\n                ;\n                    j.addClass(p.getElement(), \"hasValue\");\n                }\n            ;\n            ;\n            }),p.subscribe(\"reset\", function() {\n                j.removeClass(p.getElement(), \"hasValue\");\n            }),p.subscribe(\"select\", function(q, r) {\n                if (i.isEditMode()) {\n                    i.toggleID(r.selected.uid);\n                    i.save();\n                }\n                 else {\n                    var s = j.hasClass(JSBNG__document.documentElement, \"sidebarMode\"), t = {\n                        mode: ((s ? \"JSBNG__sidebar\" : \"chatNub\")),\n                        source: \"typeahead\",\n                        type: r.selected.type,\n                        typeahead: true\n                    };\n                    g.openTab(r.selected.uid, r.selected.type, t);\n                }\n            ;\n            ;\n            }),p.subscribe(\"highlight\", function(q, r) {\n                if (((r.index >= 0))) {\n                    var s = p.getView().getItems()[r.index];\n                    if (s) {\n                        var t = new l(s), u = s.offsetParent, v = t.boundWithin(new l(u)).getPositionVector();\n                        t.getPositionVector().sub(v).scrollElementBy(u);\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n            }),];\n        },\n        disable: function() {\n            this._subscriptions.forEach(function(p) {\n                this._typeahead.unsubscribe(p);\n            }.bind(this));\n            this._subscriptions = null;\n        }\n    });\n    e.exports = o;\n});\n__d(\"ChatTypeaheadCore\", [\"function-extensions\",\"Class\",\"JSBNG__Event\",\"Keys\",\"TypeaheadCore\",\"copyProperties\",\"emptyFunction\",\"shield\",], function(a, b, c, d, e, f) {\n    b(\"function-extensions\");\n    var g = b(\"Class\"), h = b(\"JSBNG__Event\"), i = b(\"Keys\"), j = b(\"TypeaheadCore\"), k = b(\"copyProperties\"), l = b(\"emptyFunction\"), m = b(\"shield\");\n    function n(o) {\n        this.parent.construct(this, o);\n    };\n;\n    g.extend(n, j);\n    k(n.prototype, {\n        init: function(o, p, q) {\n            this.parent.init(o, p, q);\n            this.informBeginActive = false;\n            this.informEndActive = false;\n            this.data.subscribe(\"respond\", function() {\n                if (this.informBeginActive) {\n                    this.informBeginActive = false;\n                    this.inform(\"sidebar/typeahead/active\", true);\n                }\n                 else if (this.informEndActive) {\n                    this.informEndActive = false;\n                    this.inform(\"sidebar/typeahead/active\", false);\n                }\n                \n            ;\n            ;\n            }.bind(this));\n        },\n        handleTab: l,\n        keydown: function(JSBNG__event) {\n            var o = h.getKeyCode(JSBNG__event);\n            if (((o === i.ESC))) {\n                m(this.reset, this).defer();\n                return JSBNG__event.kill();\n            }\n        ;\n        ;\n            return this.parent.keydown(JSBNG__event);\n        },\n        checkValue: function() {\n            var o = this.getValue(), p = this.value;\n            if (((o == p))) {\n                return;\n            }\n        ;\n        ;\n            if (((p && !o))) {\n                this.typeaheadActive = false;\n                this.informEndActive = true;\n            }\n             else if (((!p && o))) {\n                this.typeaheadActive = true;\n                this.informBeginActive = true;\n                this.inform(\"sidebar/typeahead/preActive\");\n            }\n            \n        ;\n        ;\n            this.parent.checkValue();\n        }\n    });\n    e.exports = n;\n});\n__d(\"ChatTypeaheadDataSource\", [\"Class\",\"DataSource\",\"Env\",\"JSLogger\",\"MercuryParticipantTypes\",\"OrderedFriendsList\",\"Run\",\"ShortProfiles\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Class\"), h = b(\"DataSource\"), i = b(\"Env\"), j = b(\"JSLogger\"), k = b(\"MercuryParticipantTypes\"), l = b(\"OrderedFriendsList\"), m = b(\"Run\"), n = b(\"ShortProfiles\"), o = b(\"copyProperties\");\n    function p(q) {\n        q = ((q || {\n        }));\n        q.kanaNormalization = true;\n        this.parent.construct(this, q);\n        this.persistOnRefresh = ((q.persistOnRefresh !== false));\n        this.showOfflineUsers = !!q.showOfflineUsers;\n        this._jslog = j.create(\"chat_typeahead\");\n        this._jslog.log(\"created\");\n    };\n;\n    g.extend(p, h);\n    o(p.prototype, {\n        init: function() {\n            this._jslog.log(\"init\");\n            this.parent.init();\n            this._update();\n        },\n        bootstrap: function() {\n            this._jslog.log(\"bootstrap\");\n            this.parent.bootstrap();\n            if (this.showOfflineUsers) {\n                this._jslog.log(\"show_offline_users\");\n                this._jslog.log(\"ensured_short_profiles\");\n                if (n.hasAll()) {\n                    this._update();\n                }\n                 else {\n                    this._jslog.log(\"fetch_all_short_profiles\");\n                    n.fetchAll();\n                    this.inform(\"activity\", {\n                        activity: true\n                    });\n                    var q = n.subscribe(\"updated\", function() {\n                        this.inform(\"activity\", {\n                            activity: false\n                        });\n                        this._update();\n                    }.bind(this));\n                    if (!this.persistOnRefresh) {\n                        m.onLeave(function() {\n                            n.unsubscribe(q);\n                        });\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n        },\n        _update: function() {\n            d([\"AvailableList\",], function(q) {\n                var r = this.value;\n                this.dirty();\n                var s = n.getCachedProfileIDs(), t = s.filter(function(v) {\n                    var w = n.getNow(v);\n                    return ((w.type === k.FRIEND));\n                });\n                t.sort(l.compare);\n                var u = [];\n                t.forEach(function(v) {\n                    if (((v == i.user))) {\n                        return;\n                    }\n                ;\n                ;\n                    var w = q.get(v);\n                    if (((!this.showOfflineUsers && ((w !== q.ACTIVE))))) {\n                        return;\n                    }\n                ;\n                ;\n                    var x = n.getNow(v), y = x.additionalName;\n                    if (x.hasOwnProperty(\"searchTokens\")) {\n                        y = ((((y !== null)) ? ((((y + \" \")) + x.searchTokens.join(\" \"))) : x.searchTokens.join(\" \")));\n                    }\n                ;\n                ;\n                    u.push({\n                        uid: v,\n                        text: x.JSBNG__name,\n                        tokens: y,\n                        localized_text: x.JSBNG__name,\n                        additional_text: x.additionalName,\n                        photo: x.thumbSrc,\n                        type: x.type\n                    });\n                }.bind(this));\n                if (u.length) {\n                    this.addEntries(u);\n                }\n            ;\n            ;\n                this.value = r;\n                if (r) {\n                    this.query(r);\n                }\n            ;\n            ;\n            }.bind(this));\n        },\n        refreshData: function() {\n            d([\"AvailableList\",], function(q) {\n                q.update();\n            }.bind(this));\n        }\n    });\n    e.exports = p;\n});\n__d(\"ChatSidebarHeader.react\", [\"React\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"React\"), h = b(\"cx\"), i = g.createClass({\n        displayName: \"ReactChatSidebarHeader\",\n        render: function() {\n            return (g.DOM.div({\n                className: \"_55ob\"\n            }, g.DOM.div({\n                className: \"_55oc\"\n            }, this.props.JSBNG__name)));\n        }\n    });\n    e.exports = i;\n});\n__d(\"ChatSidebarItem.react\", [\"AvailableListConstants\",\"ChatConfig\",\"ChatFavoriteList\",\"ChatSidebarConstants\",\"JSBNG__Image.react\",\"Link.react\",\"React\",\"SplitImage.react\",\"cx\",\"ix\",], function(a, b, c, d, e, f) {\n    var g = b(\"AvailableListConstants\"), h = b(\"ChatConfig\"), i = b(\"ChatFavoriteList\"), j = b(\"ChatSidebarConstants\"), k = b(\"JSBNG__Image.react\"), l = b(\"Link.react\"), m = b(\"React\"), n = b(\"SplitImage.react\"), o = b(\"cx\"), p = b(\"ix\"), q = 9, r = m.createClass({\n        displayName: \"ChatSidebarItem\",\n        render: function() {\n            var s = (((((\"_55ln\") + ((this.props.context ? ((\" \" + \"_55lo\")) : \"\")))) + ((((this.props.unreadCount && h.get(\"litestand_buddylist_count\"))) ? ((\" \" + \"_5bom\")) : \"\")))), t;\n            if (this.props.litestandSidebar) {\n                t = m.DOM.div({\n                    \"aria-label\": this.props.JSBNG__name,\n                    className: \"_4_vf\",\n                    \"data-hover\": \"tooltip\",\n                    \"data-tooltip-position\": \"right\"\n                });\n            }\n        ;\n        ;\n            return (l({\n                className: s,\n                href: this.props.href,\n                onClick: this.props.onClick,\n                rel: \"ignore\"\n            }, m.DOM.div({\n                className: \"_55lp\"\n            }, this.renderFavorite(), m.DOM.div({\n                className: \"_56p9\"\n            }, this.renderImage(), m.DOM.div({\n                className: \"_568w\"\n            })), m.DOM.div({\n                className: \"_5bon\"\n            }, this.renderUnreadCount(), this.renderStatus()), m.DOM.div({\n                className: \"_55lr\"\n            }, this.props.JSBNG__name), m.DOM.div({\n                className: \"_55ls\"\n            }, this.props.context)), t));\n        },\n        renderFavorite: function() {\n            if (((this.props.isAdded === undefined))) {\n                return null;\n            }\n        ;\n        ;\n            var s = null;\n            if (this.props.litestandSidebar) {\n                s = ((this.props.isAdded ? p(\"/images/litestand/bookmarks/sidebar/remove.png\") : p(\"/images/litestand/bookmarks/sidebar/add.png\")));\n            }\n             else s = ((this.props.isAdded ? p(\"/images/chat/delete.png\") : p(\"/images/chat/add.png\")));\n        ;\n        ;\n            var t = (((\"_568x\") + ((!this.props.showEditButton ? ((\" \" + \"hidden_elem\")) : \"\"))));\n            return (m.DOM.div({\n                className: t,\n                onClick: this.props.onEditClick\n            }, k({\n                className: \"_568y\",\n                src: s\n            })));\n        },\n        renderImage: function() {\n            var s = ((this.props.imageSize || j.IMAGE_SIZE));\n            return n({\n                size: s,\n                srcs: this.props.images\n            });\n        },\n        renderUnreadCount: function() {\n            var s = this.props.unreadCount;\n            if (((!s || !h.get(\"litestand_buddylist_count\")))) {\n                return null;\n            }\n        ;\n        ;\n            var t = (((\"_5boo\") + ((((s > q)) ? ((\" \" + \"_5bop\")) : \"\"))));\n            if (((s > q))) {\n                s = ((q + \"+\"));\n            }\n        ;\n        ;\n            return (m.DOM.div({\n                className: t\n            }, s));\n        },\n        renderStatus: function() {\n            var s = this.getStatusSrc();\n            if (!s) {\n                return null;\n            }\n        ;\n        ;\n            if (((((this.props.unreadCount && h.get(\"litestand_blended_sidebar\"))) && h.get(\"litestand_buddylist_count\")))) {\n                return;\n            }\n        ;\n        ;\n            var t = ((h.get(\"divebar_favorite_list\", 0) && i.isEditMode()));\n            if (t) {\n                return;\n            }\n        ;\n        ;\n            return (m.DOM.div({\n                className: \"_568z\"\n            }, m.DOM.div({\n                className: \"_568-\"\n            }, this.props.statusTime), k({\n                className: \"_568_\",\n                src: s\n            })));\n        },\n        getStatusSrc: function() {\n            switch (this.props.JSBNG__status) {\n              case g.ACTIVE:\n            \n              case g.IDLE:\n                if (this.props.litestandSidebar) {\n                    return ((h.get(\"litestand_blended_sidebar\") ? p(\"/images/litestand/sidebar/blended/online.png\") : p(\"/images/litestand/sidebar/online.png\")));\n                }\n            ;\n            ;\n                return p(\"/images/chat/status/online.png\");\n              case g.MOBILE:\n                if (this.props.litestandSidebar) {\n                    return ((h.get(\"litestand_blended_sidebar\") ? p(\"/images/litestand/sidebar/blended/pushable.png\") : p(\"/images/litestand/sidebar/pushable.png\")));\n                }\n            ;\n            ;\n                return p(\"/images/chat/status/mobile.png\");\n            };\n        ;\n            return null;\n        }\n    });\n    e.exports = r;\n});\n__d(\"ChatSidebarThread.react\", [\"ChatSidebarItem.react\",\"WebMessengerPermalinkConstants\",\"React\",\"MercuryThreadMetadataRawRenderer\",], function(a, b, c, d, e, f) {\n    var g = b(\"ChatSidebarItem.react\"), h = b(\"WebMessengerPermalinkConstants\"), i = b(\"React\"), j = b(\"MercuryThreadMetadataRawRenderer\"), k = i.createClass({\n        displayName: \"ChatSidebarThread\",\n        render: function() {\n            var n = this.props.JSBNG__name, o = l(this.props.threadID, this.props.participants), p = ((n ? o : undefined)), q = h.getURIPathForThreadID(this.props.threadID), r = m(this.props.image, this.props.participants), s = ((n ? n : o));\n            return (g({\n                context: p,\n                href: {\n                    url: q\n                },\n                imageSize: this.props.imageSize,\n                images: r,\n                litestandSidebar: this.props.litestandSidebar,\n                JSBNG__name: s,\n                JSBNG__status: this.props.JSBNG__status,\n                unreadCount: this.props.unreadCount\n            }));\n        }\n    });\n    function l(n, o) {\n        return j.renderRawParticipantList(n, o, o.length, {\n            names_renderer: j.renderShortNames\n        });\n    };\n;\n    function m(n, o) {\n        if (n) {\n            return n;\n        }\n    ;\n    ;\n        return o.map(function(p) {\n            return p.image_src;\n        });\n    };\n;\n    e.exports = k;\n});\n__d(\"ChatSidebarUser.react\", [\"ChatFavoriteList\",\"WebMessengerPermalinkConstants\",\"ChatConfig\",\"React\",\"ChatSidebarItem.react\",], function(a, b, c, d, e, f) {\n    var g = b(\"ChatFavoriteList\"), h = b(\"WebMessengerPermalinkConstants\"), i = b(\"ChatConfig\"), j = b(\"React\"), k = b(\"ChatSidebarItem.react\"), l = j.createClass({\n        displayName: \"ChatSidebarUser\",\n        render: function() {\n            var m = h.getURIPathForIDOrVanity(this.props.userID), n = g.isFavored(this.props.userID), o = function() {\n                g.toggleID(this.props.userID);\n            }.bind(this), p = ((i.get(\"divebar_favorite_list\", 0) ? n : undefined));\n            return (k({\n                href: {\n                    url: m\n                },\n                imageSize: this.props.imageSize,\n                images: this.props.image,\n                litestandSidebar: this.props.litestandSidebar,\n                isAdded: p,\n                showEditButton: g.isEditMode(),\n                JSBNG__name: this.props.JSBNG__name,\n                onEditClick: o,\n                JSBNG__status: this.props.JSBNG__status,\n                statusTime: this.props.statusTime,\n                context: this.props.context\n            }));\n        }\n    });\n    e.exports = l;\n});\n__d(\"ChatTypeaheadRenderer\", [\"AvailableListConstants\",\"ChatConfig\",\"ChatSidebarConstants\",\"ChatSidebarHeader.react\",\"ChatSidebarThread.react\",\"ChatSidebarUser.react\",\"ChatTypeaheadConstants\",\"DOM\",\"LastMobileActiveTimes\",\"MercuryParticipants\",\"PresenceStatus\",\"React\",], function(a, b, c, d, e, f) {\n    var g = b(\"AvailableListConstants\"), h = b(\"ChatConfig\"), i = b(\"ChatSidebarConstants\"), j = b(\"ChatSidebarHeader.react\"), k = b(\"ChatSidebarThread.react\"), l = b(\"ChatSidebarUser.react\"), m = b(\"ChatTypeaheadConstants\"), n = b(\"DOM\"), o = b(\"LastMobileActiveTimes\"), p = b(\"MercuryParticipants\"), q = b(\"PresenceStatus\"), r = b(\"React\"), s = {\n    };\n    function t(z, aa) {\n        if (!((z in s))) {\n            s[z] = n.create(\"li\");\n        }\n    ;\n    ;\n        r.renderComponent(aa, s[z]);\n        return s[z];\n    };\n;\n    function u(z) {\n        return t(z.text, j({\n            JSBNG__name: z.text\n        }));\n    };\n;\n    function v() {\n        if (((h.get(\"litestand\", 0) && !h.get(\"test_old_divebar\")))) {\n            return ((h.get(\"litestand_blended_sidebar\") ? i.LITESTAND_BLENDED_SIZE : i.LITESTAND_IMAGE_SIZE));\n        }\n    ;\n    ;\n        return i.IMAGE_SIZE;\n    };\n;\n    function w(z) {\n        var aa = z.mercury_thread.participants.map(function(ba) {\n            return p.getUserID(ba);\n        });\n        return t(z.uid, k({\n            image: z.mercury_thread.image_src,\n            imageSize: v(),\n            litestandSidebar: ((h.get(\"litestand\", 0) && !h.get(\"test_old_divebar\"))),\n            JSBNG__name: z.mercury_thread.JSBNG__name,\n            participants: z.participants_to_render,\n            JSBNG__status: q.getGroup(aa),\n            threadID: z.uid\n        }));\n    };\n;\n    function x(z) {\n        var aa = q.get(z.uid), ba = ((((aa === g.MOBILE)) ? o.getShortDisplay(z.uid) : null)), ca = ((((z.render_type == \"non_friend\")) ? z.subtext : null));\n        return t(z.uid, l({\n            image: z.photo,\n            imageSize: v(),\n            litestandSidebar: h.get(\"litestand\", 0),\n            JSBNG__name: z.text,\n            JSBNG__status: aa,\n            statusTime: ba,\n            userID: z.uid,\n            context: ca\n        }));\n    };\n;\n    function y(z, aa) {\n        if (((z.type === m.HEADER_TYPE))) {\n            return u(z);\n        }\n    ;\n    ;\n        if (((z.type == m.THREAD_TYPE))) {\n            return w(z);\n        }\n    ;\n    ;\n        return x(z);\n    };\n;\n    e.exports = y;\n});\n__d(\"ChatTypeaheadView\", [\"BucketedTypeaheadView\",\"ChatConfig\",\"Class\",\"ChatTypeaheadConstants\",\"copyProperties\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"BucketedTypeaheadView\"), h = b(\"ChatConfig\"), i = b(\"Class\"), j = b(\"ChatTypeaheadConstants\"), k = b(\"copyProperties\"), l = b(\"tx\"), m = h.get(\"divebar_typeahead_group_fof\", 0);\n    function n(o, p) {\n        this.parent.construct(this, o, p);\n        this.typeObjects = {\n        };\n        this.typeObjectsOrder = [];\n        this.typeObjects[j.NON_FRIEND_TYPE] = {\n            uid: j.NON_FRIEND_TYPE,\n            type: j.HEADER_TYPE,\n            text: \"FRIENDS OF FRIENDS\"\n        };\n        this.typeObjectsOrder.push(j.NON_FRIEND_TYPE);\n        this.typeObjects[j.THREAD_TYPE] = {\n            uid: j.THREAD_TYPE,\n            type: j.HEADER_TYPE,\n            text: \"GROUP CONVERSATIONS\"\n        };\n        this.typeObjectsOrder.push(j.THREAD_TYPE);\n        this.typeObjects[j.FRIEND_TYPE] = {\n            disabled: true,\n            uid: j.FRIEND_TYPE,\n            type: j.HEADER_TYPE,\n            text: \"FRIENDS\"\n        };\n        this.typeObjectsOrder.push(j.FRIEND_TYPE);\n    };\n;\n    i.extend(n, g);\n    k(n.prototype, {\n        buildBuckets: function(o, p) {\n            if (m) {\n                p = p.reverse();\n            }\n        ;\n        ;\n            p = this.parent.buildBuckets(o, p);\n            if (!m) {\n                p = p.filter(function(q) {\n                    return ((q && !q.disabled));\n                });\n            }\n        ;\n        ;\n            return p;\n        },\n        getDefaultIndex: function(o) {\n            if (!m) {\n                return this.parent.getDefaultIndex(o);\n            }\n        ;\n        ;\n            if (((o.length === 0))) {\n                return -1;\n            }\n        ;\n        ;\n            var p = ((o.length - 1));\n            while (((!this.isHighlightable(o[p]) && ((p >= 0))))) {\n                p--;\n            ;\n            };\n        ;\n            return p;\n        }\n    });\n    e.exports = n;\n});\n__d(\"legacy:ChatTypeaheadBehavior\", [\"ChatTypeaheadBehavior\",], function(a, b, c, d) {\n    var e = b(\"ChatTypeaheadBehavior\");\n    if (!a.TypeaheadBehaviors) {\n        a.TypeaheadBehaviors = {\n        };\n    }\n;\n;\n    a.TypeaheadBehaviors.chatTypeahead = function(f) {\n        f.enableBehavior(e);\n    };\n}, 3);\n__d(\"legacy:cookie\", [\"Cookie\",], function(a, b, c, d) {\n    var e = b(\"Cookie\");\n    a.getCookie = e.get;\n    a.setCookie = e.set;\n    a.clearCookie = e.clear;\n}, 3);\n__d(\"LayerHideOnSuccess\", [\"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        _subscription: null,\n        enable: function() {\n            this._subscription = this._layer.subscribe(\"success\", this._layer.hide.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 = h;\n});\n__d(\"Overlay\", [\"Class\",\"CSS\",\"DataStore\",\"DOM\",\"Layer\",\"LayerButtons\",\"LayerDestroyOnHide\",\"LayerFadeOnHide\",\"LayerFadeOnShow\",\"LayerFormHooks\",\"LayerHideOnBlur\",\"LayerHideOnEscape\",\"LayerHideOnSuccess\",\"LayerHideOnTransition\",\"LayerTabIsolation\",\"LayerMouseHooks\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Class\"), h = b(\"CSS\"), i = b(\"DataStore\"), j = b(\"DOM\"), k = b(\"Layer\"), l = b(\"LayerButtons\"), m = b(\"LayerDestroyOnHide\"), n = b(\"LayerFadeOnHide\"), o = b(\"LayerFadeOnShow\"), p = b(\"LayerFormHooks\"), q = b(\"LayerHideOnBlur\"), r = b(\"LayerHideOnEscape\"), s = b(\"LayerHideOnSuccess\"), t = b(\"LayerHideOnTransition\"), u = b(\"LayerTabIsolation\"), v = b(\"LayerMouseHooks\"), w = b(\"copyProperties\");\n    function x(y, z) {\n        y = w({\n            buildWrapper: true\n        }, ((y || {\n        })));\n        this._shouldBuildWrapper = y.buildWrapper;\n        this.parent.construct(this, y, z);\n    };\n;\n    g.extend(x, k);\n    w(x.prototype, {\n        _configure: function(y, z) {\n            this.parent._configure(y, z);\n            var aa = this.getRoot();\n            this._overlay = ((j.scry(aa, \"div.uiOverlay\")[0] || aa));\n            h.hide(aa);\n            j.appendContent(this.getInsertParent(), aa);\n            i.set(this._overlay, \"overlay\", this);\n            var ba = i.get(this._overlay, \"width\");\n            ((ba && this.setWidth(ba)));\n            if (this.setFixed) {\n                this.setFixed(((i.get(this._overlay, \"fixed\") == \"true\")));\n            }\n        ;\n        ;\n            if (((i.get(this._overlay, \"fadeonshow\") != \"false\"))) {\n                this.enableBehavior(o);\n            }\n        ;\n        ;\n            if (((i.get(this._overlay, \"fadeonhide\") != \"false\"))) {\n                this.enableBehavior(n);\n            }\n        ;\n        ;\n            if (((i.get(this._overlay, \"hideonsuccess\") != \"false\"))) {\n                this.enableBehavior(s);\n            }\n        ;\n        ;\n            if (((i.get(this._overlay, \"hideonblur\") == \"true\"))) {\n                this.enableBehavior(q);\n            }\n        ;\n        ;\n            if (((i.get(this._overlay, \"destroyonhide\") != \"false\"))) {\n                this.enableBehavior(m);\n            }\n        ;\n        ;\n            return this;\n        },\n        _getDefaultBehaviors: function() {\n            return this.parent._getDefaultBehaviors().concat([l,p,v,r,t,u,]);\n        },\n        initWithoutBuildingWrapper: function() {\n            this._shouldBuildWrapper = false;\n            return this.init.apply(this, arguments);\n        },\n        _buildWrapper: function(y, z) {\n            z = this.parent._buildWrapper(y, z);\n            if (!this._shouldBuildWrapper) {\n                this._contentRoot = z;\n                return z;\n            }\n        ;\n        ;\n            this._contentRoot = j.create(\"div\", {\n                className: \"uiOverlayContent\"\n            }, z);\n            return j.create(\"div\", {\n                className: \"uiOverlay\"\n            }, this._contentRoot);\n        },\n        getContentRoot: function() {\n            return this._contentRoot;\n        },\n        destroy: function() {\n            i.remove(this.getRoot(), \"overlay\");\n            this.parent.destroy();\n        }\n    });\n    e.exports = x;\n});\n__d(\"ReminderStory\", [\"AsyncRequest\",\"endsWith\",\"JSBNG__Event\",\"DOMQuery\",\"ScrollableArea\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = b(\"endsWith\"), i = b(\"JSBNG__Event\"), j = b(\"DOMQuery\"), k = b(\"ScrollableArea\");\n    function l(m, n, o) {\n        i.listen(m, \"click\", function(p) {\n            n.show();\n            if (o) {\n                var q = {\n                    context_data: o\n                };\n                new g().setURI(\"/growth/reminder/logging.php\").setData(q).send();\n            }\n        ;\n        ;\n        });\n        n.subscribe(\"aftershow\", function() {\n            var p = n.getRoot(), q = j.scry(p, \".inlineReplyTextArea\");\n            if (((q.length > 0))) {\n                q[0].JSBNG__focus();\n            }\n        ;\n        ;\n            var r = j.scry(p, \".jewelItemNew\"), s = [];\n            {\n                var fin211keys = ((window.top.JSBNG_Replay.forInKeys)((r))), fin211i = (0);\n                var t;\n                for (; (fin211i < fin211keys.length); (fin211i++)) {\n                    ((t) = (fin211keys[fin211i]));\n                    {\n                        var u = r[t].getAttribute(\"id\");\n                        if (((u && h(u, \"_1_req\")))) {\n                            s = s.concat(u.replace(\"_1_req\", \"\"));\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            if (((s.length > 0))) {\n                new g().setURI(\"/friends/requests/log_impressions\").setData({\n                    ids: s.join(\",\"),\n                    ref: \"reminder_box\"\n                }).send();\n            }\n        ;\n        ;\n            var v = j.JSBNG__find(p, \"#SuggestBelowInvite\");\n            if (v) {\n                new g().setURI(\"/ajax/pages/reminder/recommendations\").send();\n            }\n        ;\n        ;\n            k.poke(j.scry(p, \".uiScrollableArea\")[0]);\n        });\n    };\n;\n    e.exports = l;\n});\n__d(\"ContextualDialogFooterLink\", [\"JSBNG__Event\",\"copyProperties\",\"CSS\",\"DOM\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"copyProperties\"), i = b(\"CSS\"), j = b(\"DOM\");\n    function k(l) {\n        this._layer = l;\n    };\n;\n    h(k.prototype, {\n        _subscriptions: null,\n        enable: function() {\n            var l = this._layer.getRoot(), m = j.scry(l, \".uiContextualDialogFooterLink\")[0], n = \"uiContextualDialogHoverFooterArrow\";\n            this._subscriptions = [g.listen(m, \"mouseenter\", i.addClass.curry(l, n)),g.listen(m, \"mouseleave\", i.removeClass.curry(l, n)),];\n        },\n        disable: function() {\n            this._subscriptions.forEach(function(l) {\n                l.remove();\n            });\n            this._subscriptions = null;\n        }\n    });\n    e.exports = k;\n});\n__d(\"LegacyContextualDialog\", [\"Arbiter\",\"ArbiterMixin\",\"ARIA\",\"Bootloader\",\"Class\",\"ContextualDialogFooterLink\",\"ContextualThing\",\"CSS\",\"DataStore\",\"DOM\",\"JSBNG__Event\",\"Locale\",\"Overlay\",\"Parent\",\"Style\",\"Vector\",\"$\",\"copyProperties\",\"getOverlayZIndex\",\"shield\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ArbiterMixin\"), i = b(\"ARIA\"), j = b(\"Bootloader\"), k = b(\"Class\"), l = b(\"ContextualDialogFooterLink\"), m = b(\"ContextualThing\"), n = b(\"CSS\"), o = b(\"DataStore\"), p = b(\"DOM\"), q = b(\"JSBNG__Event\"), r = b(\"Locale\"), s = b(\"Overlay\"), t = b(\"Parent\"), u = b(\"Style\"), v = b(\"Vector\"), w = b(\"$\"), x = b(\"copyProperties\"), y = b(\"getOverlayZIndex\"), z = b(\"shield\");\n    function aa(ba, ca) {\n        this.parent.construct(this, ba, ca);\n    };\n;\n    k.extend(aa, s);\n    x(aa, h, {\n        ARROW_OFFSET: 15,\n        ARROW_LENGTH: 16,\n        ARROW_INSET: 22,\n        TOP_MARGIN: 50,\n        BOTTOM_MARGIN: 30,\n        LEFT_MARGIN: 15,\n        RIGHT_MARGIN: 30,\n        MIN_TOP_GAP: 5,\n        POSITION_TO_CLASS: {\n            above: \"uiContextualDialogAbove\",\n            below: \"uiContextualDialogBelow\",\n            left: \"uiContextualDialogLeft\",\n            right: \"uiContextualDialogRight\"\n        },\n        RIGHT_ALIGNED_CLASS: \"uiContextualDialogRightAligned\",\n        ARROW_CLASS: {\n            bottom: \"uiContextualDialogArrowBottom\",\n            JSBNG__top: \"uiContextualDialogArrowTop\",\n            right: \"uiContextualDialogArrowRight\",\n            left: \"uiContextualDialogArrowLeft\"\n        },\n        POSITION_TO_ARROW: {\n            above: \"bottom\",\n            below: \"JSBNG__top\",\n            left: \"right\",\n            right: \"left\"\n        },\n        getInstance: function(ba) {\n            var ca = o.get(ba, \"LegacyContextualDialog\");\n            if (!ca) {\n                var da = t.byClass(ba, \"uiOverlay\");\n                if (da) {\n                    ca = o.get(da, \"overlay\");\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            return ca;\n        }\n    });\n    x(aa.prototype, {\n        _scrollListener: null,\n        _scrollParent: null,\n        _width: null,\n        _fixed: false,\n        _hasFooter: false,\n        _showSubscription: null,\n        _hideSubscription: null,\n        _setContextSubscription: null,\n        _resizeListener: null,\n        _reflowSubscription: null,\n        _configure: function(ba, ca) {\n            this.parent._configure(ba, ca);\n            var da = this.getRoot(), ea = o.get.curry(da);\n            this.setAlignH(ea(\"alignh\", \"left\"));\n            this.setOffsetX(ea(\"offsetx\", 0));\n            this.setOffsetY(ea(\"offsety\", 0));\n            this.setPosition(ea(\"position\", \"above\"));\n            this._hasFooter = ea(\"hasfooter\", false);\n            if (this._hasFooter) {\n                var fa = p.scry(da, \".uiContextualDialogFooterLink\")[0];\n                ((fa && this.enableBehavior(l)));\n            }\n        ;\n        ;\n            this._setContextSubscription = this.subscribe(\"beforeshow\", function() {\n                this.unsubscribe(this._setContextSubscription);\n                this._setContextSubscription = null;\n                var ha = ea(\"context\");\n                if (ha) {\n                    this.setContext(w(ha));\n                }\n                 else {\n                    ha = ea(\"contextselector\");\n                    if (ha) {\n                        this.setContext(p.JSBNG__find(JSBNG__document, ha));\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n            }.bind(this));\n            this._content = p.scry(da, \".uiContextualDialogContent\")[0];\n            if (this._content) {\n                this._content.setAttribute(\"role\", \"dialog\");\n                var ga = p.scry(this._content, \".legacyContextualDialogTitle\")[0];\n                if (ga) {\n                    this._content.setAttribute(\"aria-labelledby\", p.getID(ga));\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            this._showSubscription = this.subscribe(\"show\", function() {\n                var ha = z(this.updatePosition, this);\n                this._resizeListener = q.listen(window, \"resize\", ha);\n                this._reflowSubscription = g.subscribe(\"reflow\", ha);\n                this._setupScrollListener(this._scrollParent);\n                m.register(da, this.context);\n                g.inform(\"layer_shown\", {\n                    type: \"ContextualDialog\"\n                });\n            }.bind(this));\n            this._hideSubscription = this.subscribe(\"hide\", function() {\n                this._teardownResizeAndReflowListeners();\n                this._teardownScrollListener();\n                g.inform(\"layer_hidden\", {\n                    type: \"ContextualDialog\"\n                });\n            }.bind(this));\n            return this;\n        },\n        _buildWrapper: function(ba, ca) {\n            var da = this.parent._buildWrapper(ba, ca);\n            if (!this._shouldBuildWrapper) {\n                return da;\n            }\n        ;\n        ;\n            n.addClass(da, \"uiContextualDialog\");\n            return p.create(\"div\", {\n                className: \"uiContextualDialogPositioner\"\n            }, da);\n        },\n        setWidth: function(ba) {\n            this._width = Math.floor(ba);\n            return this;\n        },\n        setFixed: function(ba) {\n            ba = !!ba;\n            n.conditionClass(this.getRoot(), \"uiContextualDialogFixed\", ba);\n            this._fixed = ba;\n            return this;\n        },\n        setAlignH: function(ba) {\n            this.alignH = ba;\n            this._updateAlignmentClass();\n            ((this._shown && this.updatePosition()));\n            ((this.position && this._updateArrow()));\n            return this;\n        },\n        getContent: function() {\n            return this._content;\n        },\n        getContext: function() {\n            return this.context;\n        },\n        setContext: function(ba) {\n            if (this._setContextSubscription) {\n                this.unsubscribe(this._setContextSubscription);\n                this._setContextSubscription = null;\n            }\n        ;\n        ;\n            ba = w(ba);\n            if (((this.context && ((this.context != ba))))) {\n                o.remove(this.context, \"LegacyContextualDialog\");\n            }\n        ;\n        ;\n            this.context = ba;\n            i.setPopup(this.getCausalElement(), this.getRoot());\n            var ca = t.byClass(ba, \"fbPhotoSnowlift\");\n            this.setInsertParent(((ca || JSBNG__document.body)));\n            if (((this._scrollListener && ((this._scrollParent !== ca))))) {\n                this._teardownScrollListener();\n                this._setupScrollListener(ca);\n            }\n        ;\n        ;\n            this._scrollParent = ca;\n            var da = y(ba, this._insertParent);\n            u.set(this.getRoot(), \"z-index\", ((((da > 200)) ? da : \"\")));\n            o.set(this.context, \"LegacyContextualDialog\", this);\n            return this;\n        },\n        getCausalElement: function() {\n            return ((this.parent.getCausalElement() || this.context));\n        },\n        listen: function(ba, ca) {\n            return q.listen(this.getRoot(), ba, ca);\n        },\n        setOffsetX: function(ba) {\n            this.offsetX = ((parseInt(ba, 10) || 0));\n            ((this._shown && this.updatePosition()));\n            return this;\n        },\n        setOffsetY: function(ba) {\n            this.offsetY = ((parseInt(ba, 10) || 0));\n            ((this._shown && this.updatePosition()));\n            return this;\n        },\n        setPosition: function(ba) {\n            this.position = ba;\n            {\n                var fin212keys = ((window.top.JSBNG_Replay.forInKeys)((aa.POSITION_TO_CLASS))), fin212i = (0);\n                var ca;\n                for (; (fin212i < fin212keys.length); (fin212i++)) {\n                    ((ca) = (fin212keys[fin212i]));\n                    {\n                        n.conditionClass(this.getRoot(), aa.POSITION_TO_CLASS[ca], ((ba == ca)));\n                    ;\n                    };\n                };\n            };\n        ;\n            this._updateAlignmentClass();\n            ((this._shown && this.updatePosition()));\n            this._updateArrow();\n            return this;\n        },\n        updatePosition: function() {\n            if (!this.context) {\n                return false;\n            }\n        ;\n        ;\n            if (this._width) {\n                u.set(this._overlay, \"width\", ((this._width + \"px\")));\n            }\n        ;\n        ;\n            var ba = ((this._fixed ? \"viewport\" : \"JSBNG__document\")), ca = v.getElementPosition(this.context, ba), da = this._scrollParent;\n            if (da) {\n                ca = ca.sub(v.getElementPosition(da, \"JSBNG__document\")).add(da.scrollLeft, da.scrollTop);\n            }\n        ;\n        ;\n            var ea = v.getElementDimensions(this.context), fa = ((((this.position == \"above\")) || ((this.position == \"below\")))), ga = r.isRTL();\n            if (((((((this.position == \"right\")) || ((fa && ((this.alignH == \"right\")))))) != ga))) {\n                ca = ca.add(ea.x, 0);\n            }\n        ;\n        ;\n            if (((this.position == \"below\"))) {\n                ca = ca.add(0, ea.y);\n            }\n        ;\n        ;\n            var ha = new v(0, 0);\n            if (((fa && ((this.alignH == \"center\"))))) {\n                ha = ha.add(((((ea.x - this._width)) / 2)), 0);\n            }\n             else {\n                var ia = ((fa ? ea.x : ea.y)), ja = ((2 * aa.ARROW_INSET));\n                if (((ia < ja))) {\n                    var ka = ((((ia / 2)) - aa.ARROW_INSET));\n                    if (((fa && ((((this.alignH == \"right\")) != ga))))) {\n                        ka = -ka;\n                    }\n                ;\n                ;\n                    ha = ha.add(((fa ? ka : 0)), ((fa ? 0 : ka)));\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            ha = ha.add(this.offsetX, this.offsetY);\n            if (ga) {\n                ha = ha.mul(-1, 1);\n            }\n        ;\n        ;\n            ca = ca.add(ha);\n            if (this._fixed) {\n                ca = new v(ca.x, ca.y, \"JSBNG__document\");\n            }\n        ;\n        ;\n            ca.setElementPosition(this.getRoot());\n            this._adjustVerticalPosition();\n            this._adjustHorizontalPosition();\n            return true;\n        },\n        JSBNG__scrollTo: function() {\n            if (this.context) {\n                j.loadModules([\"DOMScroll\",], function(ba) {\n                    ba.JSBNG__scrollTo(this.context, true, true);\n                }.bind(this));\n            }\n        ;\n        ;\n        },\n        destroy: function() {\n            this.unsubscribe(this._showSubscription);\n            this.unsubscribe(this._hideSubscription);\n            if (this._setContextSubscription) {\n                this.unsubscribe(this._setContextSubscription);\n                this._setContextSubscription = null;\n            }\n        ;\n        ;\n            this._teardownScrollListener();\n            this._teardownResizeAndReflowListeners();\n            ((this.context && o.remove(this.context, \"LegacyContextualDialog\")));\n            this.parent.destroy();\n        },\n        _adjustVerticalPosition: function() {\n            if (((((this.position != \"left\")) && ((this.position != \"right\"))))) {\n                u.set(this._overlay, \"JSBNG__top\", \"\");\n                return;\n            }\n        ;\n        ;\n            var ba = this.getRoot(), ca = v.getElementPosition(ba, \"viewport\").y, da = v.getElementDimensions(this._overlay).y, ea = v.getViewportDimensions().y, fa = Math.min(Math.max(ca, aa.MIN_TOP_GAP), aa.TOP_MARGIN), ga = Math.min(Math.max(0, ((((((ca + da)) + aa.BOTTOM_MARGIN)) - ea))), Math.max(-fa, ((ca - fa))), ((da - ((2 * aa.ARROW_INSET)))));\n            u.set(this._overlay, \"JSBNG__top\", ((((-1 * ga)) + \"px\")));\n            u.set(this._arrow, \"JSBNG__top\", ((aa.ARROW_OFFSET + \"px\")));\n            u.set(this._arrow, \"marginTop\", ((ga + \"px\")));\n        },\n        _adjustHorizontalPosition: function() {\n            if (((((((this.position != \"above\")) && ((this.position != \"below\")))) || ((this.alignH != \"left\"))))) {\n                u.set(this._overlay, \"left\", \"\");\n                u.set(this._overlay, \"right\", \"\");\n                return;\n            }\n        ;\n        ;\n            var ba = this.getRoot(), ca = v.getElementPosition(ba, \"viewport\").x, da = v.getElementDimensions(this._overlay).x, ea = v.getViewportDimensions().x, fa = r.isRTL(), ga;\n            if (!fa) {\n                ga = ((((((ca + da)) + aa.RIGHT_MARGIN)) - ea));\n            }\n             else ga = ((((aa.LEFT_MARGIN + da)) - ca));\n        ;\n        ;\n            ga = Math.min(Math.max(0, ga), ((da - ((2 * aa.ARROW_INSET)))));\n            u.set(this._overlay, ((fa ? \"right\" : \"left\")), ((((-1 * ga)) + \"px\")));\n            u.set(this._arrow, ((fa ? \"right\" : \"left\")), ((aa.ARROW_OFFSET + \"px\")));\n            u.set(this._arrow, ((fa ? \"marginRight\" : \"marginLeft\")), ((ga + \"px\")));\n        },\n        _updateArrow: function() {\n            var ba = 0;\n            if (((((this.position == \"above\")) || ((this.position == \"below\"))))) {\n                switch (this.alignH) {\n                  case \"center\":\n                    ba = 50;\n                    break;\n                  case \"right\":\n                    ba = 100;\n                    break;\n                };\n            }\n        ;\n        ;\n            this._renderArrow(aa.POSITION_TO_ARROW[this.position], ba);\n        },\n        _renderArrow: function(ba, ca) {\n            {\n                var fin213keys = ((window.top.JSBNG_Replay.forInKeys)((aa.ARROW_CLASS))), fin213i = (0);\n                var da;\n                for (; (fin213i < fin213keys.length); (fin213i++)) {\n                    ((da) = (fin213keys[fin213i]));\n                    {\n                        n.conditionClass(this._overlay, aa.ARROW_CLASS[da], ((ba == da)));\n                    ;\n                    };\n                };\n            };\n        ;\n            n.conditionClass(this._overlay, \"uiContextualDialogWithFooterArrowBottom\", ((((ba == \"bottom\")) && this._hasFooter)));\n            if (((ba == \"none\"))) {\n                return;\n            }\n        ;\n        ;\n            if (!this._arrow) {\n                this._arrow = p.create(\"i\", {\n                    className: \"uiContextualDialogArrow\"\n                });\n                p.appendContent(this._overlay, this._arrow);\n            }\n        ;\n        ;\n            u.set(this._arrow, \"JSBNG__top\", \"\");\n            u.set(this._arrow, \"left\", \"\");\n            u.set(this._arrow, \"right\", \"\");\n            u.set(this._arrow, \"margin\", \"\");\n            var ea = ((((ba == \"JSBNG__top\")) || ((ba == \"bottom\")))), fa = ((ea ? ((r.isRTL() ? \"right\" : \"left\")) : \"JSBNG__top\"));\n            ca = ((ca || 0));\n            u.set(this._arrow, fa, ((ca + \"%\")));\n            var ga = ((aa.ARROW_LENGTH + ((aa.ARROW_OFFSET * 2)))), ha = -((((((ga * ca)) / 100)) - aa.ARROW_OFFSET));\n            u.set(this._arrow, ((\"margin-\" + fa)), ((ha + \"px\")));\n        },\n        _updateAlignmentClass: function() {\n            n.conditionClass(this.getRoot(), aa.RIGHT_ALIGNED_CLASS, ((((((this.position == \"above\")) || ((this.position == \"below\")))) && ((this.alignH == \"right\")))));\n        },\n        _setupScrollListener: function(ba) {\n            this._scrollListener = q.listen(((ba || window)), \"JSBNG__scroll\", z(this._adjustVerticalPosition, this));\n        },\n        _teardownScrollListener: function() {\n            if (this._scrollListener) {\n                this._scrollListener.remove();\n                this._scrollListener = null;\n            }\n        ;\n        ;\n        },\n        _teardownResizeAndReflowListeners: function() {\n            if (this._resizeListener) {\n                this._resizeListener.remove();\n                this._resizeListener = null;\n            }\n        ;\n        ;\n            if (this._reflowSubscription) {\n                this._reflowSubscription.unsubscribe();\n                this._reflowSubscription = null;\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = aa;\n});\n__d(\"TooltipLink\", [\"Parent\",\"Tooltip\",], function(a, b, c, d, e, f) {\n    var g = b(\"Parent\"), h = b(\"Tooltip\"), i = {\n        setTooltipText: function(j, k) {\n            j = g.byTag(j, \"a\");\n            ((j && h.set(j, k)));\n        }\n    };\n    e.exports = i;\n});");
// 12308
JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_190[0](o208,false,"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yr/r/r-aTsS_RKim.js",o209);
// undefined
o208 = null;
// undefined
o209 = null;
// 12312
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o7,"if (self.CavalryLogger) {\n    CavalryLogger.start_js([\"brbS1\",]);\n}\n;\n__d(\"BlackbirdUpsellConstants\", [], function(a, b, c, d, e, f) {\n    e.exports = {\n        ACTION_UPSELL: \"upsell\",\n        CLICK_TYPE_DISMISS_PROMO: \"dismiss_promo\",\n        ACTION_EDUCATE: \"educate\",\n        CLICK_TYPE_ENABLE_CHAT: \"enable_chat\",\n        CLICK_TYPE_OPEN_SETTINGS: \"open_settings\"\n    };\n});\n__d(\"GenderConst\", [], function(a, b, c, d, e, f) {\n    var g = {\n        UNKNOWN: 0,\n        FEMALE_SINGULAR: 1,\n        MALE_SINGULAR: 2,\n        FEMALE_SINGULAR_GUESS: 3,\n        MALE_SINGULAR_GUESS: 4,\n        MIXED_SINGULAR: 5,\n        MIXED_PLURAL: 5,\n        NEUTER_SINGULAR: 6,\n        UNKNOWN_SINGULAR: 7,\n        FEMALE_PLURAL: 8,\n        MALE_PLURAL: 9,\n        NEUTER_PLURAL: 10,\n        UNKNOWN_PLURAL: 11\n    };\n    e.exports = g;\n});\n__d(\"AsyncLoader\", [\"copyProperties\",\"AsyncRequest\",\"BaseAsyncLoader\",], function(a, b, c, d, e, f) {\n    var g = b(\"copyProperties\"), h = b(\"AsyncRequest\"), 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        new h(k).setData({\n            ids: l\n        }).setHandler(n).setErrorHandler(o).setAllowCrossPageTransition(true).setMethod(\"GET\").setReadOnly(true).send();\n    };\n    e.exports = j;\n});\n__d(\"BlackbirdUpsell\", [\"Event\",\"Arbiter\",\"AsyncRequest\",\"LegacyContextualDialog\",\"DOM\",\"LayerDestroyOnHide\",\"LayerHideOnTransition\",\"PresencePrivacy\",\"copyProperties\",\"BlackbirdUpsellConfig\",\"BlackbirdUpsellConstants\",\"BlackbirdUpsellTemplates\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"Arbiter\"), i = b(\"AsyncRequest\"), j = b(\"LegacyContextualDialog\"), k = b(\"DOM\"), l = b(\"LayerDestroyOnHide\"), m = b(\"LayerHideOnTransition\"), n = b(\"PresencePrivacy\"), o = b(\"copyProperties\"), p = b(\"BlackbirdUpsellConfig\"), q = b(\"BlackbirdUpsellConstants\"), r = b(\"BlackbirdUpsellTemplates\"), s = \"/ajax/chat/blackbird/update_clicks.php\", t = \"/ajax/chat/blackbird/update_impressions.php\", u = \"/ajax/chat/blackbird/dismiss.php\", v = 235, w = null, x = null, y = false, z = false;\n    function aa() {\n    \n    };\n    o(aa, {\n        shouldShow: function() {\n            if (this._dialogDismissed) {\n                return false\n            };\n            if (this.isEducation()) {\n                return ((!!p.EducationGK && !p.EducationDismissed) && (p.EducationImpressions < p.EducationImpressionLimit));\n            }\n             else return (((!!p.UpsellGK && !p.UpsellDismissed) && (p.UpsellImpressions < p.UpsellImpressionLimit)) && (p.FriendCount >= p.UpsellMinFriendCount))\n        ;\n        },\n        isEducation: function() {\n            return (p.TimeOffline <= p.EducationTimeOfflineThresdhold);\n        },\n        getOfflineContent: function() {\n            if (this.isEducation()) {\n                return this._getEducationContent();\n            }\n             else return this._getUpsellContent()\n        ;\n        },\n        _getEducationContent: function() {\n            ga();\n            var ka = r[\":fb:chat:blackbird:offline-educate\"].build(), la = ka.getNode(\"chatSettingsButton\");\n            g.listen(la, \"click\", function() {\n                h.inform(\"chat/advanced-settings-dialog-opened\");\n                ja(q.CLICK_TYPE_OPEN_SETTINGS);\n                da();\n            });\n            return ka.getRoot();\n        },\n        _getUpsellContent: function() {\n            fa();\n            var ka = r[\":fb:chat:blackbird:upsell\"].build(), la = ka.getNode(\"chatSettingsButton\");\n            g.listen(la, \"click\", function() {\n                h.inform(\"chat/advanced-settings-dialog-opened\");\n                ia(q.CLICK_TYPE_OPEN_SETTINGS);\n                ca();\n            });\n            var ma = ka.getNode(\"enableChatButton\");\n            g.listen(ma, \"click\", function() {\n                ia(q.CLICK_TYPE_ENABLE_CHAT);\n                ca();\n            });\n            return ka.getRoot();\n        },\n        getBlackbirdContent: function(ka) {\n            ga();\n            switch (ka) {\n              case n.ONLINE:\n                return r[\":fb:chat:blackbird:most-friends-educate\"].build().getRoot();\n              case n.OFFLINE:\n                return r[\":fb:chat:blackbird:some-friends-educate\"].build().getRoot();\n            };\n        },\n        showOfflineDialog: function(ka) {\n            this.showDialog(ka, this.getOfflineContent.bind(this));\n        },\n        showBlackbirdDialog: function(ka, la) {\n            this.showDialog(ka, this.getBlackbirdContent.curry(la));\n        },\n        showDialog: function(ka, la) {\n            (!w && this._constructDialog());\n            k.setContent(x, la());\n            w.setContext(ka);\n            w.show();\n        },\n        hide: function() {\n            if ((w && w.isShown())) {\n                w.hide();\n            };\n        },\n        dismiss: function() {\n            this.hide();\n            if (this.isEducation()) {\n                da();\n            }\n             else ca();\n        ;\n        },\n        registerDismissClick: function() {\n            if (this.isEducation()) {\n                ja(q.CLICK_TYPE_DISMISS_PROMO);\n            }\n             else ia(q.CLICK_TYPE_DISMISS_PROMO);\n        ;\n        },\n        isVisible: function() {\n            return (z && !y);\n        },\n        _constructDialog: function() {\n            var ka = r[\":fb:chat:blackbird:dialog-frame\"].build();\n            x = ka.getNode(\"dialogContent\");\n            w = new j();\n            w.init(ka.getRoot());\n            w.setPosition(\"above\").setWidth(v).setFixed(true).disableBehavior(l).disableBehavior(m);\n            g.listen(ka.getNode(\"dialogCloseButton\"), \"click\", this.dismiss.bind(this));\n            g.listen(ka.getNode(\"dialogCloseButton\"), \"click\", this.registerDismissClick.bind(this));\n        }\n    });\n    function ba(ka, la) {\n        if ((!y && z)) {\n            y = true;\n            n.inform(\"privacy-user-presence-changed\");\n            var ma = new i(u);\n            ma.setData({\n                source: ka,\n                impressions: la,\n                time_offline: p.TimeOffline\n            });\n            ma.setErrorHandler(function() {\n                y = false;\n            });\n            ma.send();\n        }\n    ;\n    };\n    function ca() {\n        ba(q.ACTION_UPSELL, p.UpsellImpressions);\n    };\n    function da() {\n        ba(q.ACTION_EDUCATE, p.EducationImpressions);\n    };\n    function ea(ka, la) {\n        if (!z) {\n            z = true;\n            var ma = new i(t);\n            ma.setData({\n                action: ka,\n                impressions: la,\n                time_offline: p.TimeOffline\n            });\n            ma.setErrorHandler(function() {\n                z = false;\n            });\n            ma.send();\n        }\n    ;\n    };\n    function fa() {\n        ea(q.ACTION_UPSELL, p.UpsellImpressions);\n    };\n    function ga() {\n        ea(q.ACTION_EDUCATE, p.EducationImpressions);\n    };\n    function ha(ka, la, ma, na) {\n        var oa = new i(s);\n        oa.setData({\n            action: ka,\n            impressions: ma,\n            source: la,\n            time_offline: na\n        });\n        oa.send();\n    };\n    function ia(ka) {\n        ha(ka, q.ACTION_UPSELL, p.UpsellImpressions, p.TimeOffline);\n    };\n    function ja(ka) {\n        ha(ka, q.ACTION_EDUCATE, p.EducateImpressions, p.TimeOffline);\n    };\n    h.subscribe(\"chat/advanced-settings-dialog-opened\", aa.dismiss.bind(aa));\n    h.subscribe(\"chat-visibility/go-online\", aa.dismiss.bind(aa));\n    h.subscribe(\"chat-visibility/go-offline\", aa.dismiss.bind(aa));\n    e.exports = aa;\n});\n__d(\"ChatFavoriteNux\", [\"AsyncRequest\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = null, i = false, j = {\n        tryShow: function(k) {\n            if ((h && !i)) {\n                h.setContext(k);\n                h.show();\n                i = true;\n            }\n        ;\n        },\n        tryHide: function() {\n            if ((h && i)) {\n                h.hide();\n                h = null;\n            }\n        ;\n        },\n        registerDialog: function(k) {\n            h = k;\n            if (k) {\n                k.subscribe(\"confirm\", this.dismissDialog);\n            };\n        },\n        dismissDialog: function() {\n            if (h) {\n                new g(\"/ajax/chat/dismiss_favorite_nux.php\").send();\n                h.hide();\n                h = null;\n            }\n        ;\n        }\n    };\n    e.exports = j;\n});\n__d(\"ChatGroupThreadsController\", [\"ArbiterMixin\",\"ChatConfig\",\"InitialMultichatList\",\"MercuryOrderedThreadlist\",\"MercuryServerRequests\",\"MercuryThreadInformer\",\"MercuryThreads\",\"MessagingTag\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"ArbiterMixin\"), h = b(\"ChatConfig\"), i = b(\"InitialMultichatList\"), j = b(\"MercuryOrderedThreadlist\").get(), k = b(\"MercuryServerRequests\").get(), l = b(\"MercuryThreadInformer\").get(), m = b(\"MercuryThreads\").get(), n = b(\"MessagingTag\"), o = b(\"copyProperties\"), p, q = [], r = h.get(\"max_sidebar_multichats\", 3);\n    function s(x) {\n        var y = m.getThreadMetaNow(x);\n        return ((y && !y.is_canonical) && m.canReply(x));\n    };\n    var t = i.payload;\n    if (t) {\n        k.handleUpdate(t);\n        var u = (t.threads || []);\n        q = u.map(function(x) {\n            return x.thread_id;\n        });\n    }\n;\n    if (q.length) {\n        var v = m.getThreadMetaNow(q[(q.length - 1)]);\n        p = (v && ((v.timestamp - 1)));\n    }\n;\n    if (!p) {\n        p = Date.now();\n    };\n    var w = {\n    };\n    o(w, g, {\n        getThreadIDs: function() {\n            var x = 0;\n            return q.filter(function(y) {\n                return (((x < r) && s(y)) && ++x);\n            });\n        }\n    });\n    l.subscribe(\"threadlist-updated\", function() {\n        q = j.getThreadlistUntilTimestamp(p, n.INBOX, n.GROUPS).filter(s);\n        w.inform(\"update\");\n    });\n    e.exports = w;\n});\n__d(\"ChatHovercard\", [\"Arbiter\",\"AsyncLoader\",\"Hovercard\",\"JSLogger\",\"debounce\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"AsyncLoader\"), i = b(\"Hovercard\"), j = b(\"JSLogger\"), k = b(\"debounce\"), l = 5, m = new h(\"/ajax/chat/hovercard/sidebar.php\", \"hover\"), n = j.create(\"chat_hovercard\");\n    g.subscribe(\"Hovercard/dirty\", m.reset.bind(m));\n    function o(s, t) {\n        m.get(s, function(u) {\n            (function() {\n                if (!u) {\n                    n.error(\"fetch_failure\", {\n                        id: s\n                    });\n                    return;\n                }\n            ;\n                var v = i.getDialog(u);\n                if (!v) {\n                    n.error(\"no_hovercard\", {\n                        id: s,\n                        endpoint: u\n                    });\n                    return;\n                }\n            ;\n                if ((s == t.getActiveID())) {\n                    t.showHovercard(s, v);\n                };\n            }).defer();\n        });\n    };\n    function p(s, t) {\n        var u = [];\n        function v(y) {\n            if (((y >= 0) && (y < s.length))) {\n                u.push(s[y]);\n            };\n        };\n        var w = s.indexOf(t);\n        if ((w > -1)) {\n            v(w);\n            for (var x = 1; (x < l); x++) {\n                v((w + x));\n                v((w - x));\n            };\n        }\n    ;\n        return u.filter(function(y) {\n            return y;\n        });\n    };\n    function q(s, t) {\n        var u = t.getActiveID();\n        if (u) {\n            var v = s.getShowingUsers(), w = p(v, u);\n            m.get(w, function() {\n            \n            });\n        }\n    ;\n    };\n    function r(s) {\n        var t = s.getHoverController();\n        t.registerDefault(o);\n        t.subscribe(\"hover\", k(q.curry(s, t), 100));\n    };\n    e.exports = r;\n});\n__d(\"ChatOptions\", [\"Arbiter\",\"ChannelConstants\",\"JSLogger\",\"PresenceUtil\",\"copyProperties\",\"ChatOptionsInitialData\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ChannelConstants\"), i = b(\"JSLogger\"), j = b(\"PresenceUtil\"), k = b(\"copyProperties\"), l = i.create(\"chat_options\"), m = {\n    };\n    (function() {\n        var o = b(\"ChatOptionsInitialData\");\n        for (var p in o) {\n            var q = o[p];\n            m[p] = !!q;\n        };\n    })();\n    var n = k(new g(), {\n        getSetting: function(o) {\n            return m[o];\n        },\n        setSetting: function(o, p, q) {\n            if ((this.getSetting(o) == p)) {\n                return\n            };\n            if (q) {\n                q = (\"from_\" + q);\n                l.log(q, {\n                    name: o,\n                    new_value: p,\n                    old_value: this.getSetting(o)\n                });\n            }\n        ;\n            m[o] = !!p;\n            g.inform(\"chat/option-changed\", {\n                name: o,\n                value: p\n            });\n        }\n    });\n    g.subscribe(h.getArbiterType(\"setting\"), function(o, p) {\n        var q = p.obj;\n        if ((q.window_id === j.getSessionID())) {\n            return\n        };\n        n.setSetting(q.setting, !!q.value, \"channel\");\n    });\n    g.subscribe(i.DUMP_EVENT, function(o, p) {\n        p.chat_options = m;\n    });\n    e.exports = n;\n});\n__d(\"ChatOrderedListHover\", [\"function-extensions\",\"ArbiterMixin\",\"ChatFavoriteList\",\"CSS\",\"ErrorUtils\",\"Event\",\"LayerHideOnBlur\",\"Parent\",\"copyProperties\",\"cx\",\"setTimeoutAcrossTransitions\",\"shield\",], function(a, b, c, d, e, f) {\n    b(\"function-extensions\");\n    var g = b(\"ArbiterMixin\"), h = b(\"ChatFavoriteList\"), i = b(\"CSS\"), j = b(\"ErrorUtils\"), k = b(\"Event\"), l = b(\"LayerHideOnBlur\"), m = b(\"Parent\"), n = b(\"copyProperties\"), o = b(\"cx\"), p = b(\"setTimeoutAcrossTransitions\"), q = b(\"shield\");\n    function r(u) {\n        i.addClass(u, \"fetching\");\n    };\n    function s(u) {\n        i.removeClass(u, \"fetching\");\n    };\n    function t(u) {\n        this._orderedList = u;\n        this._root = u.getRoot();\n        k.listen(this._root, \"mouseover\", this._mouseOver.bind(this));\n        k.listen(this._root, \"mouseleave\", this._mouseLeave.bind(this));\n        u.subscribe(\"click\", q(this._hide, this));\n    };\n    n(t.prototype, g, {\n        _root: null,\n        _activeItem: null,\n        _hideTimeout: null,\n        _showTimeout: null,\n        _showingDialog: null,\n        _showingID: null,\n        _handlers: {\n        },\n        _defaultHandler: null,\n        _mouseOver: function(event) {\n            if (this._paused) {\n                return\n            };\n            var u = event.getTarget(), v = (m.byClass(u, \"_42fz\") || m.byClass(u, \"_5a58\"));\n            (v && this._setActiveItem(v));\n        },\n        _mouseLeave: function(event) {\n            this._setActiveItem(null);\n        },\n        _clearTimeouts: function() {\n            (this._showTimeout && clearTimeout(this._showTimeout));\n            this._showTimeout = null;\n            (this._hideTimeout && clearTimeout(this._hideTimeout));\n            this._hideTimeout = null;\n        },\n        _hide: function() {\n            if (this._showingDialog) {\n                this._showingDialog.hide();\n                this._showingDialog = null;\n                this._showingID = null;\n            }\n        ;\n        },\n        _show: function() {\n            var u = this.getActiveID(), v = false;\n            if (this._handlers[u]) {\n                v = true;\n                j.applyWithGuard(this._handlers[u], {\n                }, [u,this,]);\n            }\n             else if (this._defaultHandler) {\n                v = true;\n                j.applyWithGuard(this._defaultHandler, {\n                }, [u,this,]);\n            }\n            \n        ;\n            if ((v && (this._showingID != this.getActiveID()))) {\n                r(this._activeItem);\n            };\n        },\n        _setActiveItem: function(u) {\n            if (h.isEditMode()) {\n                this._clearTimeouts();\n                this._hide();\n                return;\n            }\n        ;\n            if ((u != this._activeItem)) {\n                this._clearTimeouts();\n                (this._activeItem && s(this._activeItem));\n                this._activeItem = null;\n                var v = (u ? 0 : 100);\n                this._hideTimeout = p(function() {\n                    if ((this.getActiveID() != this._showingID)) {\n                        this._hide();\n                    };\n                }.bind(this), v);\n                if (u) {\n                    this._activeItem = u;\n                    var w = (v + 500);\n                    this._showTimeout = p(function() {\n                        this._show();\n                    }.bind(this), w);\n                    this.inform(\"hover\");\n                }\n                 else this.inform(\"leave\");\n            ;\n            }\n        ;\n        },\n        register: function(u, v) {\n            if (!this._handlers[u]) {\n                this._handlers[u] = v;\n                return {\n                    unregister: function() {\n                        if ((u == this._showingID)) {\n                            this._hide();\n                        };\n                        delete this._handlers[u];\n                        var w = this._orderedList.getAllNodes(), x = w[u];\n                        (x && s(x));\n                    }.bind(this)\n                };\n            }\n        ;\n        },\n        registerDefault: function(u) {\n            this._defaultHandler = u;\n        },\n        getActiveID: function() {\n            var u = (this._activeItem && this._orderedList.getUserForNode(this._activeItem));\n            return (u || null);\n        },\n        showHovercard: function(u, v) {\n            if (((u == this.getActiveID()) && (u != this._showingID))) {\n                this._clearTimeouts();\n                s(this._activeItem);\n                this._hide();\n                this._showingDialog = v;\n                this._showingID = u;\n                var w = v.subscribe(\"mouseenter\", this._setActiveItem.bind(this, this._activeItem)), x = v.subscribe(\"mouseleave\", function() {\n                    w.unsubscribe();\n                    this._setActiveItem(null);\n                }.bind(this)), y = v.subscribe(\"hide\", function() {\n                    this.inform(\"hovercard_hide\");\n                    w.unsubscribe();\n                    x.unsubscribe();\n                    y.unsubscribe();\n                }.bind(this));\n                v.enableBehavior(l).setContext(this._activeItem).setPosition(\"left\").show();\n                this.inform(\"hovercard_show\");\n            }\n        ;\n        },\n        setPaused: function(u) {\n            this._paused = u;\n        }\n    });\n    e.exports = t;\n});\n__d(\"ChatQuietLinks\", [\"Event\",\"DOM\",\"UserAgent\",\"DataStore\",\"Parent\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"DOM\"), i = b(\"UserAgent\"), j = b(\"DataStore\"), k = b(\"Parent\"), l = {\n    }, m = {\n        silenceLinks: function(q) {\n            n(q, this.removeEmptyHrefs.bind(this));\n        },\n        nukeLinks: function(q) {\n            n(q, this.removeAllHrefs.bind(this));\n        },\n        removeEmptyHrefs: function(q) {\n            o(q, function(r) {\n                return (!r || (r === \"#\"));\n            });\n        },\n        removeAllHrefs: function(q) {\n            o(q);\n        },\n        removeMessagesHrefs: function(q) {\n            o(q, function(r) {\n                return ((!r || (r === \"#\")) || (r.indexOf(\"/messages/\") != -1));\n            });\n        }\n    };\n    function n(q, r) {\n        var s = !!i.chrome(), t = ((!!i.chrome() || (i.ie() >= 9)) || (i.firefox() >= 4));\n        if (l[h.getID(q)]) {\n            return\n        };\n        l[h.getID(q)] = true;\n        if (!t) {\n            return\n        };\n        if (!s) {\n            (r && r(q));\n            return;\n        }\n    ;\n        g.listen(q, \"mouseover\", function u(v) {\n            var w = k.byTag(v.getTarget(), \"a\");\n            if (w) {\n                var x = w.getAttribute(\"href\");\n                if (p(x)) {\n                    j.set(w, \"stashedHref\", w.getAttribute(\"href\"));\n                    w.removeAttribute(\"href\");\n                }\n            ;\n            }\n        ;\n        });\n        g.listen(q, \"mouseout\", function u(v) {\n            var w = k.byTag(v.getTarget(), \"a\"), x = (w && j.remove(w, \"stashedHref\"));\n            if (p(x)) {\n                w.setAttribute(\"href\", x);\n            };\n        });\n        g.listen(q, \"mousedown\", function(u) {\n            if (!u.isDefaultRequested()) {\n                return true\n            };\n            var v = k.byTag(u.getTarget(), \"a\"), w = (v && j.get(v, \"stashedHref\"));\n            if (p(w)) {\n                v.setAttribute(\"href\", w);\n            };\n        });\n    };\n    function o(q, r) {\n        var s = h.scry(q, \"a\");\n        if (r) {\n            s = s.filter(function(t) {\n                return r(t.getAttribute(\"href\"));\n            });\n        };\n        s.forEach(function(t) {\n            t.removeAttribute(\"href\");\n            t.setAttribute(\"tabindex\", 0);\n        });\n    };\n    function p(q) {\n        return (q && (q !== \"#\"));\n    };\n    e.exports = m;\n});\n__d(\"ChatSidebarThreadlist.react\", [\"ChatConfig\",\"ChatGroupThreadsController\",\"ChatSidebarConstants\",\"ChatSidebarItem.react\",\"ChatSidebarThread.react\",\"MercuryServerRequests\",\"MercuryThreads\",\"MercuryParticipants\",\"PresenceStatus\",\"React\",\"copyProperties\",\"cx\",\"fbt\",\"ix\",], function(a, b, c, d, e, f) {\n    var g = b(\"ChatConfig\"), h = b(\"ChatGroupThreadsController\"), i = b(\"ChatSidebarConstants\"), j = b(\"ChatSidebarItem.react\"), k = b(\"ChatSidebarThread.react\"), l = b(\"MercuryServerRequests\").get(), m = b(\"MercuryThreads\").get(), n = b(\"MercuryParticipants\"), o = b(\"PresenceStatus\"), p = b(\"React\"), q = b(\"copyProperties\"), r = b(\"cx\"), s = b(\"fbt\"), t = b(\"ix\"), u = p.createClass({\n        displayName: \"ChatSidebarThreadlist\",\n        render: function() {\n            var v = this.state.threadData, w = this.state.participantData, x = i.IMAGE_SIZE, y = t(\"/images/chat/sidebar/newGroupChat.png\");\n            if (this.props.litestandSidebar) {\n                x = (g.get(\"litestand_blended_sidebar\") ? i.LITESTAND_BLENDED_SIZE : i.LITESTAND_IMAGE_SIZE);\n                y = (g.get(\"litestand_blended_sidebar\") ? t(\"/images/litestand/sidebar/blended/new_group_chat.png\") : t(\"/images/chat/sidebar/newGroupChatLitestand.png\"));\n            }\n        ;\n            var z = \"New Group Chat...\";\n            z = g.get(\"divebar_group_new_button_name\", z);\n            var aa = [];\n            if (this.props.showNewGroupsButton) {\n                aa.push(p.DOM.li({\n                    className: ((((\"_56yg\") + ((\" \" + \"_56yj\"))) + ((this.props.offlineItems ? (\" \" + \"_570-\") : \"\")))),\n                    key: \"new\"\n                }, j({\n                    images: y,\n                    imageSize: x,\n                    litestandSidebar: this.props.litestandSidebar,\n                    name: z\n                })));\n            };\n            var ba = {\n            };\n            for (var ca in v) {\n                var da = v[ca], ea = da.participants.map(function(ia) {\n                    return ((w || {\n                    }))[ia];\n                }).filter(function(ia) {\n                    return ia;\n                }), fa = da.participants.map(function(ia) {\n                    return n.getUserID(ia);\n                }), ga = fa.sort().join(\"|\");\n                if ((!ba[ga] && ea.length)) {\n                    ba[ga] = 1;\n                    var ha = l.getServerThreadIDNow(ca);\n                    aa.push(p.DOM.li({\n                        className: ((((\"_5a58\") + ((\" \" + \"_56yg\"))) + ((this.props.offlineItems ? (\" \" + \"_570-\") : \"\")))),\n                        \"data-serverthreadid\": ha,\n                        \"data-threadid\": ca,\n                        key: ca\n                    }, k({\n                        image: da.image_src,\n                        imageSize: x,\n                        litestandSidebar: this.props.litestandSidebar,\n                        name: da.name,\n                        participants: ea,\n                        status: o.getGroup(fa),\n                        threadID: ca,\n                        unreadCount: da.unread_count\n                    })));\n                }\n            ;\n            };\n            return p.DOM.ul(null, aa);\n        },\n        getInitialState: function() {\n            return {\n            };\n        },\n        componentWillMount: function() {\n            var v = function() {\n                this.setState(this._calculateState());\n            }.bind(this);\n            this.token = h.subscribe(\"update\", v);\n            v();\n        },\n        componentWillUnmount: function() {\n            (this.token && this.token.unsubscribe());\n            this.token = null;\n        },\n        _calculateState: function() {\n            var v = false, w = {\n            }, x = {\n            }, y = h.getThreadIDs(), z = y.length;\n            y.forEach(function(ba) {\n                m.getThreadMeta(ba, function(ca) {\n                    x[ba] = ca;\n                    n.getMulti(ca.participants, function(da) {\n                        delete da[n.user];\n                        if (v) {\n                            this.setState(this._calculateState());\n                        }\n                         else q(w, da);\n                    ;\n                        z--;\n                    }.bind(this));\n                }.bind(this));\n            }.bind(this));\n            if ((z === 0)) {\n                return {\n                    threadData: x,\n                    participantData: w\n                };\n            }\n             else {\n                v = true;\n                var aa = (this.state || {\n                });\n                return {\n                    threadData: q(aa.threadData, x),\n                    participantData: q(aa.participantData, w)\n                };\n            }\n        ;\n        }\n    });\n    e.exports = u;\n});\n__d(\"runAfterScrollingStops\", [\"Arbiter\",\"Event\",\"Run\",\"debounceAcrossTransitions\",\"emptyFunction\",\"throttle\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"Event\"), i = b(\"Run\"), j = b(\"debounceAcrossTransitions\"), k = b(\"emptyFunction\"), l = b(\"throttle\");\n    function m(x, y, z) {\n        if ((y && p[y])) {\n            return\n        };\n        if (!o) {\n            g.subscribe(\"page_transition\", w);\n            o = true;\n        }\n    ;\n        if (!n) {\n            x();\n            return;\n        }\n    ;\n        (y && (p[y] = 1));\n        q.push(x);\n        if (!z) {\n            if (s) {\n                i.onLeave(w);\n                s = false;\n            }\n        ;\n            r.push((q.length - 1));\n        }\n    ;\n    };\n    var n, o, p = {\n    }, q = [], r = [], s = true, t = 500, u = j(function() {\n        n = false;\n        var x = q;\n        q = [];\n        r = [];\n        p = {\n        };\n        for (var y = 0, z = x.length; (y < z); ++y) {\n            x[y]();;\n        };\n    }, t);\n    function v() {\n        n = true;\n        u();\n    };\n    function w() {\n        var x = r;\n        r = [];\n        s = true;\n        for (var y = 0, z = x.length; (y < z); ++y) {\n            q[x[y]] = k;;\n        };\n    };\n    h.listen(window, \"scroll\", l.acrossTransitions(v, 250));\n    e.exports = m;\n});\n__d(\"ChatOrderedList\", [\"Animation\",\"Arbiter\",\"ArbiterMixin\",\"AsyncDialog\",\"AsyncRequest\",\"AvailableList\",\"AvailableListConstants\",\"Bootloader\",\"CSS\",\"ChannelImplementation\",\"Chat\",\"ChatConfig\",\"ChatContexts\",\"ChatFavoriteList\",\"ChatFavoriteNux\",\"ChatGroupThreadsController\",\"ChatOrderedListHover\",\"ChatQuietLinks\",\"ChatSidebarThreadlist.react\",\"ChatTypeaheadConstants\",\"ChatVisibility\",\"DOM\",\"DataStore\",\"Ease\",\"Event\",\"ImageSourceRequest\",\"ImageSourceType\",\"JSLogger\",\"JSXDOM\",\"LastMobileActiveTimes\",\"MercuryParticipantTypes\",\"MercuryThreadInformer\",\"MercuryThreads\",\"OrderedFriendsList\",\"Parent\",\"PhotoResizeModeConst\",\"PresencePrivacy\",\"React\",\"Rect\",\"ShortProfiles\",\"Style\",\"Tooltip\",\"TypeaheadUtil\",\"URI\",\"Vector\",\"XHPTemplate\",\"copyProperties\",\"createObjectFrom\",\"csx\",\"cx\",\"debounceAcrossTransitions\",\"guid\",\"requestAnimationFrame\",\"runAfterScrollingStops\",\"shield\",\"throttle\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Animation\"), h = b(\"Arbiter\"), i = b(\"ArbiterMixin\"), j = b(\"AsyncDialog\"), k = b(\"AsyncRequest\"), l = b(\"AvailableList\"), m = b(\"AvailableListConstants\"), n = b(\"Bootloader\"), o = b(\"CSS\"), p = b(\"ChannelImplementation\").instance, q = b(\"Chat\"), r = b(\"ChatConfig\"), s = b(\"ChatContexts\"), t = b(\"ChatFavoriteList\"), u = b(\"ChatFavoriteNux\"), v = b(\"ChatGroupThreadsController\"), w = b(\"ChatOrderedListHover\"), x = b(\"ChatQuietLinks\"), y = b(\"ChatSidebarThreadlist.react\"), z = b(\"ChatTypeaheadConstants\"), aa = b(\"ChatVisibility\"), ba = b(\"DOM\"), ca = b(\"DataStore\"), da = b(\"Ease\"), ea = b(\"Event\"), fa = b(\"ImageSourceRequest\"), ga = b(\"ImageSourceType\"), ha = b(\"JSLogger\"), ia = b(\"JSXDOM\"), ja = b(\"LastMobileActiveTimes\"), ka = b(\"MercuryParticipantTypes\"), la = b(\"MercuryThreadInformer\").get(), ma = b(\"MercuryThreads\").get(), na = b(\"OrderedFriendsList\"), oa = b(\"Parent\"), pa = b(\"PhotoResizeModeConst\"), qa = b(\"PresencePrivacy\"), ra = b(\"React\"), sa = b(\"Rect\"), ta = b(\"ShortProfiles\"), ua = b(\"Style\"), va = b(\"Tooltip\"), wa = b(\"TypeaheadUtil\"), xa = b(\"URI\"), ya = b(\"Vector\"), za = b(\"XHPTemplate\"), ab = b(\"copyProperties\"), bb = b(\"createObjectFrom\"), cb = b(\"csx\"), db = b(\"cx\"), eb = b(\"debounceAcrossTransitions\"), fb = b(\"guid\"), gb = b(\"requestAnimationFrame\"), hb = b(\"runAfterScrollingStops\"), ib = b(\"shield\"), jb = b(\"throttle\"), kb = b(\"tx\"), lb = r.get(\"chat_ranked_by_coefficient\", 0), mb = null, nb, ob, pb = 9;\n    function qb(xb, yb, zb, ac, bc, cc) {\n        this._isSidebar = xb;\n        this._isLitestand = (r.get(\"litestand\", 0) || r.get(\"test_litestand_sidebar\", 0));\n        this._isLitestandSidebar = (this._isSidebar && this._isLitestand);\n        this._hasChatFlyout = (this._isSidebar && r.get(\"litestand_sidebar_chat_flyout\", 0));\n        this._isSidebarFlyout = !!oa.byClass(yb, \"_57dj\");\n        this._isLeftCollapsedSidebar = !!oa.byClass(yb, \"_5ap0\");\n        this._root = yb;\n        this._itemsMap = {\n        };\n        this._isVisible = false;\n        this._excludedIds = {\n        };\n        this._numTopFriends = 5;\n        this._hasRendered = false;\n        this._preventRendering = false;\n        this._hoverController = null;\n        this._template = zb;\n        this._messageTemplate = ac;\n        this._favoriteMode = r.get(\"divebar_favorite_list\", 0);\n        this._contextualDialog = bc;\n        this._cachedItemHeight = null;\n        this._cachedItemPadding = null;\n        if ((cc && ba.scry(cc, \"._54y_\").length)) {\n            o.show(cc);\n            this._pymk = cc;\n        }\n    ;\n        this._usePlaceholder = (this._isLitestand && this._isSidebar);\n        if (r.get(\"groups_in_divebar\")) {\n            this._groupThreadsNode = ia.li({\n                className: \"_56yf\"\n            });\n            this._updateGroupThreads();\n            this._groupsList = (this._favoriteMode && ba.find(this._root, \"._56yh\"));\n        }\n    ;\n        if (this._favoriteMode) {\n            this._favoriteSidebar = ba.find(this._root, \"._42g5\");\n            this._editButton = ba.scry(this._root, \"._57m9 ._54sl\")[0];\n            this._favoriteList = ba.find(this._root, \"._54sm\");\n            this._activeNowList = ba.find(this._root, \"._54sn\");\n            this._activeNowLabel = ba.scry(this._root, \"._42g9\")[0];\n            if (this._activeNowLabel) {\n                this._activeNowArea = oa.byClass(this._activeNowLabel, \"_57yh\");\n            };\n        }\n    ;\n        if (this._hasChatFlyout) {\n            this._sidebarFlyoutItemContainer = ba.find(this._root, \"._57yi\");\n        };\n        this._orderedList = ba.find(this._root, \".fbChatOrderedList\");\n        this._scrollableOrderedList = oa.byClass(this._root, \"scrollableOrderedList\");\n        this._chatSidebar = oa.byClass(this._root, \"fbChatSidebar\");\n        this._scrollableArea = oa.byClass(this._root, \"scrollable\");\n        ea.listen(this._root, \"click\", this._onClick.bind(this));\n        ea.listen(this._root, \"mouseenter\", this._mouseEnter.bind(this));\n        ea.listen(this._root, \"mouseleave\", this._mouseLeave.bind(this));\n        if (this._editButton) {\n            ea.listen(this._editButton, \"click\", this.toggleEditMode.bind(this));\n            h.subscribe([\"LitestandSidebarBookmarks/close\",\"LitestandSidebar/collapse\",], this._onEditEnd.bind(this));\n        }\n    ;\n        h.subscribe([\"LitestandSidebar/collapse\",\"LitestandSidebar/expand\",], function(event) {\n            if (this._isLitestandSidebar) {\n                this.getHoverController().setPaused((event === \"LitestandSidebar/collapse\"));\n            };\n            this.render();\n        }.bind(this));\n        l.subscribe(m.ON_AVAILABILITY_CHANGED, ib(this.update, this));\n        qa.subscribe(\"privacy-changed\", ib(this.update, this));\n        p.subscribe([p.CONNECTED,p.RECONNECTING,p.SHUTDOWN,p.MUTE_WARNING,p.UNMUTE_WARNING,], ib(this.update, this));\n        this.inform(\"initialized\", this, h.BEHAVIOR_PERSISTENT);\n        this.render();\n        h.subscribe(ha.DUMP_EVENT, function(dc, ec) {\n            ec.chat_lists = (ec.chat_lists || {\n                sorted_list: this.getCachedSortedList(),\n                ordered_list: na.getList(),\n                available_list: qb.getAvailableList(this._excludedIds),\n                excluded_list: this._excludedIds\n            });\n        }.bind(this));\n        h.subscribe(\"ChatOrderedList/itemHeightChange\", function() {\n            this._cachedItemHeight = null;\n            this._cachedItemPadding = null;\n        }.bind(this));\n        this._renderUnreadCount = r.get(\"divebar_message_count\");\n        if (this._renderUnreadCount) {\n            la.subscribe(\"threads-updated\", function(dc, ec) {\n                for (var fc in ec) {\n                    var gc = ma.getCanonicalUserInThread(fc);\n                    if (((!this._renderedTopUsers || !((gc in this._renderedTopUsers))) || !this._itemsMap[gc])) {\n                        continue;\n                    };\n                    ma.getThreadMeta(fc, function(hc) {\n                        var ic = (hc && hc.unread_count);\n                        this._updateUnreadCount(gc, ic);\n                    }.bind(this));\n                };\n            }.bind(this));\n        };\n    };\n    function rb(xb, yb) {\n        var zb = sb(xb, yb);\n        if ((zb !== 0)) {\n            return zb\n        };\n        if (!lb) {\n            var ac = vb(xb, yb);\n            if ((ac !== 0)) {\n                return ac\n            };\n        }\n    ;\n        return na.compare(xb, yb);\n    };\n    function sb(xb, yb) {\n        var zb = qa.allows(xb), ac = qa.allows(yb);\n        if ((zb !== ac)) {\n            return (zb ? -1 : 1)\n        };\n        return 0;\n    };\n    var tb = {\n    };\n    function ub(xb) {\n        return (tb[xb] || (tb[xb] = wa.flatten(xb)));\n    };\n    function vb(xb, yb) {\n        var zb = ta.getNowUnsafe(xb), ac = ta.getNowUnsafe(yb), bc = ub((((zb || {\n        })).name || \"~\")), cc = ub((((ac || {\n        })).name || \"~\"));\n        if ((bc !== cc)) {\n            return ((bc < cc) ? -1 : 1)\n        };\n        return 0;\n    };\n    function wb(xb, yb) {\n        var zb = (l.get(xb) === m.MOBILE), ac = (l.get(yb) === m.MOBILE);\n        if ((zb !== ac)) {\n            return (ac ? -1 : 1)\n        };\n        return vb(xb, yb);\n    };\n    ab(qb, {\n        CONTEXT_CLASSES: {\n            nearby: \"_56xw\",\n            visiting: \"_56xx\",\n            neighbourhood: \"_56xy\",\n            listening: \"_56xz\"\n        },\n        getSortedList: function(xb, yb) {\n            var zb = na.getList().filter(function(cc) {\n                return (!((cc in xb)) && (qa.getFriendVisibility(cc) !== qa.BLACKLISTED));\n            }), ac = [];\n            if (!aa.isOnline()) {\n                Array.prototype.push.apply(ac, zb);\n            }\n             else {\n                if ((qa.getOnlinePolicy() === qa.ONLINE_TO_WHITELIST)) {\n                    zb = this._filterByWhitelist(zb);\n                };\n                if (r.get(\"chat_web_ranking_with_presence\")) {\n                    Array.prototype.push.apply(ac, zb);\n                }\n                 else ac = this._splitOutTopFriends(zb, yb);\n            ;\n            }\n        ;\n            ac = ac.slice(0, yb);\n            if ((ac.length === yb)) {\n                var bc = qb.getAvailableList(ac.concat(xb)).length;\n                (bc && ac.splice(-1));\n            }\n        ;\n            if (!r.get(\"chat_web_ranking_with_presence\")) {\n                ac.sort(rb);\n            };\n            mb = ac.slice();\n            return ac;\n        },\n        _filterByWhitelist: function(xb) {\n            var yb = xb, zb = {\n            }, ac, bc;\n            xb = [];\n            for (ac = 0; (ac < yb.length); ++ac) {\n                bc = yb[ac];\n                if (qa.allows(bc)) {\n                    zb[bc] = true;\n                    xb.push(bc);\n                }\n            ;\n            };\n            var cc = qa.getWhitelist();\n            for (ac = 0; (ac < cc.length); ++ac) {\n                bc = cc[ac];\n                if (!((bc in zb))) {\n                    xb.push(bc);\n                };\n            };\n            for (ac = 0; (ac < yb.length); ++ac) {\n                bc = yb[ac];\n                if (!qa.allows(bc)) {\n                    xb.push(bc);\n                };\n            };\n            return xb;\n        },\n        _splitOutTopFriends: function(xb, yb) {\n            var zb = [], ac = [], bc = r.get(\"ordered_list.top_friends\", 0), cc = r.get(\"ordered_list.top_mobile\", 0), dc = yb, ec = xb.length;\n            for (var fc = 0; ((fc < ec) && (dc > 0)); fc++) {\n                var gc = xb[fc], hc = l.get(gc), ic = (hc === m.ACTIVE);\n                if (((ic || (((hc === m.MOBILE) && (fc < cc)))) || (fc < bc))) {\n                    zb.push(gc);\n                    (ic && dc--);\n                }\n                 else ac.push(gc);\n            ;\n            };\n            if ((fc < ec)) {\n                Array.prototype.push.apply(ac, xb.slice(fc));\n            };\n            if ((zb.length < yb)) {\n                Array.prototype.push.apply(zb, ac);\n            };\n            return zb;\n        },\n        getAvailableList: function(xb) {\n            var yb;\n            if ((r.get(\"divebar_show_mobile_more_friends\") || r.get(\"divebar_show_mobile_more_friends_alphabetical\"))) {\n                yb = l.getAvailableIDs();\n            };\n            if (!yb) {\n                yb = l.getOnlineIDs();\n            };\n            return yb.filter(function(zb) {\n                return !((zb in xb));\n            });\n        },\n        _pause: function() {\n            ob = true;\n        },\n        _unpause: function() {\n            ob = false;\n        },\n        _registerToggleRenderItem: function(xb) {\n            ea.listen(xb, \"click\", function() {\n                ob = !ob;\n                o.conditionClass(xb, \"checked\", ob);\n            });\n        }\n    });\n    ab(qb.prototype, i, {\n        getAllNodes: function() {\n            var xb = {\n            }, yb = ba.scry(this._root, \"li._42fz\");\n            for (var zb = 0; (zb < yb.length); zb++) {\n                var ac = ca.get(yb[zb], \"id\");\n                if (ac) {\n                    xb[ac] = yb[zb];\n                };\n            };\n            return xb;\n        },\n        getShowingUsers: function() {\n            return ba.scry(this._root, \"li._42fz,li._5a58\").map(this.getUserForNode);\n        },\n        getUserForNode: function(xb) {\n            return (ca.get(xb, \"id\") || ca.get(xb, \"serverthreadid\"));\n        },\n        getHoverController: function() {\n            if (!this._hoverController) {\n                this._hoverController = new w(this, this._contextualDialog);\n                if ((this._isLitestandSidebar && this._isLitestandSidebarCollapsed())) {\n                    this._hoverController.setPaused(true);\n                };\n            }\n        ;\n            return this._hoverController;\n        },\n        _isLitestandSidebarCollapsed: function() {\n            if (this._isLeftCollapsedSidebar) {\n                return true\n            };\n            if (nb) {\n                return !nb.isExpanded()\n            };\n            n.loadModules([\"LitestandSidebar\",], function(xb) {\n                nb = xb;\n            });\n            return o.hasClass(document.documentElement, \"_4kdq\");\n        },\n        getPaddingOffset: function() {\n            return (this._favoriteMode ? 24 : 8);\n        },\n        _calculateItemMeasurements: function() {\n            var xb = this._orderedList, yb = this._template.build(), zb = yb.getRoot();\n            ba.setContent(yb.getNode(\"name\"), \"test\");\n            if (this._favoriteSidebar) {\n                xb = this._favoriteList;\n                o.addClass(this._favoriteSidebar, \"_4zmr\");\n            }\n        ;\n            zb.style.visibility = \"hidden\";\n            ba.appendContent(xb, zb);\n            this._cachedItemHeight = ya.getElementDimensions(zb).y;\n            this._cachedItemPadding = (ua.getFloat(yb.getNode(\"anchor\"), \"padding\") || 0);\n            ba.remove(zb);\n            if (this._favoriteSidebar) {\n                o.removeClass(this._favoriteSidebar, \"_4zmr\");\n            };\n        },\n        getItemHeight: function() {\n            if ((this._cachedItemHeight === null)) {\n                this._calculateItemMeasurements();\n            };\n            return this._cachedItemHeight;\n        },\n        getItemPadding: function() {\n            if ((this._cachedItemPadding === null)) {\n                this._calculateItemMeasurements();\n            };\n            return this._cachedItemPadding;\n        },\n        _updateGroupThreads: function() {\n            if (this._groupThreadsNode) {\n                var xb = qa.getVisibility(), yb = y({\n                    offlineItems: (p.disconnected() || !xb),\n                    litestandSidebar: ((((this._isSidebar && this._isLitestand) && !r.get(\"test_old_divebar\"))) || this._isSidebarFlyout),\n                    showNewGroupsButton: r.get(\"divebar_has_new_groups_button\", false)\n                });\n                ra.renderComponent(yb, this._groupThreadsNode);\n            }\n        ;\n        },\n        _placeholderUpdate: function() {\n            if ((!this._usePlaceholder || !this._scrollContainer)) {\n                return\n            };\n            var xb = (this._root.offsetTop - this._scrollContainer.scrollTop);\n            this._scrollContainerHeight = (this._scrollContainerHeight || this._scrollContainer.offsetHeight);\n            var yb = this.getItemHeight(), zb = Math.ceil((this._scrollContainerHeight / yb)), ac = ((xb < 0) ? Math.max((Math.floor((-xb / yb)) - zb), 0) : 0), bc = ((ac + zb) + zb);\n            this._cachedItems = (this._cachedItems || ba.scry(this._root, \"li._42fz\"));\n            for (var cc = 0, dc = this._cachedItems.length; (cc < dc); cc++) {\n                o.conditionClass(this._cachedItems[cc], \"_50zv\", ((cc < ac) || (cc > bc)));;\n            };\n        },\n        _getListItem: function(xb, yb) {\n            var zb = this._itemsMap[xb];\n            if (!zb) {\n                return\n            };\n            var ac = l.get(xb), bc = (qa.allows(xb) && !p.disconnected());\n            if ((zb.buttonNode === undefined)) {\n                zb.buttonNode = ba.scry(zb.node, \"._54sk\")[0];\n                zb.contextNode = ba.find(zb.node, \"._52zk\");\n                zb.timeNode = ba.scry(zb.node, \".active_time\")[0];\n                zb.statusNodes = ba.scry(zb.node, \"img.status\");\n            }\n        ;\n            o.conditionClass(zb.node, \"_42f-\", yb);\n            o.conditionClass(zb.node, \"_54sj\", yb);\n            o.conditionClass(zb.node, \"_52s3\", (this._isLitestand && yb));\n            if (zb.buttonNode) {\n                if (!this._isLitestand) {\n                    o.conditionClass(zb.buttonNode, \"_42f_\", yb);\n                    o.conditionClass(zb.buttonNode, \"_42g0\", !yb);\n                }\n            \n            };\n            var cc = {\n                active: false,\n                mobile: false\n            };\n            cc.active = (ac === m.ACTIVE);\n            cc.mobile = (ac === m.MOBILE);\n            if (cc.mobile) {\n                var dc = ja.getShortDisplay(xb);\n                if ((zb.timeNode && (zb.lastActiveTime !== dc))) {\n                    zb.lastActiveTime = dc;\n                    ba.setContent(zb.timeNode, dc);\n                }\n            ;\n            }\n             else if (zb.lastActiveTime) {\n                zb.lastActiveTime = null;\n                ba.empty(zb.timeNode);\n            }\n            \n        ;\n            for (var ec in cc) {\n                o.conditionClass(zb.node, ec, (cc[ec] && bc));;\n            };\n            o.conditionClass(zb.node, \"invis\", !bc);\n            zb.statusNodes.forEach(function(fc) {\n                if (((ac === m.ACTIVE) && bc)) {\n                    fc.alt = \"Online\";\n                }\n                 else if (((ac === m.MOBILE) && bc)) {\n                    fc.alt = \"Mobile\";\n                }\n                 else fc.alt = \"\";\n                \n            ;\n            });\n            this._applyContext(xb, zb);\n            return zb.node;\n        },\n        getRoot: function() {\n            return this._root;\n        },\n        getSortedList: function(xb) {\n            return qb.getSortedList((xb || this._excludedIds), this._numTopFriends);\n        },\n        getCachedSortedList: function(xb) {\n            if ((mb == null)) {\n                mb = this.getSortedList(xb);\n            };\n            return mb;\n        },\n        toggleFavoriteSidebar: function(xb, yb) {\n            function zb(cc, dc) {\n                o.conditionShow(dc, cc);\n                var ec = oa.byClass(dc, \"uiContextualLayerPositioner\");\n                (ec && o.conditionShow(ec, cc));\n            };\n            o.conditionShow(this._orderedList, !xb);\n            if (this._favoriteSidebar) {\n                o.conditionShow(this._favoriteSidebar, xb);\n            };\n            var ac = ba.scry((this._scrollableOrderedList || this._root), \"._42i3\");\n            ac.forEach(zb.curry(xb));\n            var bc = ba.scry((this._scrollableOrderedList || this._root), \"._56yi\");\n            (bc.length && zb(yb, bc[0]));\n        },\n        hide: function() {\n            if (!this._isVisible) {\n                return\n            };\n            this._isVisible = false;\n            u.tryHide();\n            o.hide((this._scrollableOrderedList || this._root));\n            this.inform(\"hide\");\n        },\n        _onFavoriteOrderChange: function() {\n            var xb = this.sortableGroup.getOrder();\n            t.updateList(xb);\n            t.save();\n        },\n        _getFavoriteItems: function() {\n            var xb = [], yb = t.get();\n            for (var zb = 0; (zb < yb.length); zb++) {\n                var ac = this._itemsMap[yb[zb]];\n                if (ac) {\n                    xb.push(ac.node);\n                };\n            };\n            return xb;\n        },\n        _getChatTabOpenLogData: function(xb) {\n            var yb = o.hasClass(document.documentElement, \"sidebarMode\"), zb = {\n                mode: (yb ? \"sidebar\" : \"chatNub\"),\n                typehead: false\n            };\n            if ((this._scrollableArea && this._scrollContainer)) {\n                var ac = ya.getElementPosition(this._scrollableArea, \"viewport\").y, bc = ya.getElementPosition(xb, \"viewport\").y, cc = this._scrollContainer.scrollTop;\n                if ((bc > ac)) {\n                    zb.visible_slot = Math.round((((bc - ac)) / 32));\n                    var dc = Math.round((cc / 32));\n                    zb.global_slot = (zb.visible_slot + dc);\n                }\n            ;\n            }\n        ;\n            if (yb) {\n                zb.sidebar_height = (this._chatSidebar && this._chatSidebar.clientHeight);\n                if (this._scrollContainer) {\n                    zb.buddylist_height = this._scrollContainer.clientHeight;\n                };\n            }\n        ;\n            return zb;\n        },\n        _resetFavoriteBounds: function() {\n            var xb = t.get(), yb = xb.length;\n            if (yb) {\n                var zb = xb[0], ac = xb[(yb - 1)], bc = this._itemsMap[zb], cc = this._itemsMap[ac], dc = new sa(ya.getElementPosition(bc.node).y, 0, (ya.getElementPosition(cc.node).y + ya.getElementDimensions(cc.node).y), 0);\n                this.sortableGroup.setBoundingBox(dc);\n            }\n        ;\n        },\n        _createSortableGroup: function() {\n            if (this.sortableGroup) {\n                this.sortableGroup.destroy();\n            };\n            n.loadModules([\"SortableGroup\",], function(xb) {\n                this.sortableGroup = new xb().setBeforeGrabCallback(this._resetFavoriteBounds.bind(this)).setOrderChangeHandler(this._onFavoriteOrderChange.bind(this));\n                if (this._isLitestand) {\n                    this.sortableGroup.gutter = 1;\n                };\n                var yb = this._getFavoriteItems();\n                for (var zb = 0; (zb < yb.length); zb++) {\n                    var ac = yb[zb];\n                    this.sortableGroup.addSortable(ca.get(ac, \"id\"), ac);\n                };\n            }.bind(this));\n        },\n        toggleEditMode: function() {\n            u.dismissDialog();\n            t.toggleEditMode();\n            if (t.isEditMode()) {\n                this._createSortableGroup();\n                ba.setContent(this._editButton, \"DONE\");\n                o.addClass(this._favoriteSidebar, \"_4-d6\");\n                this.inform(\"editStart\");\n            }\n             else this._onEditEnd();\n        ;\n        },\n        _onEditEnd: function() {\n            if (t.isEditMode()) {\n                t.toggleEditMode();\n            };\n            ba.setContent(this._editButton, \"EDIT\");\n            o.removeClass(this._favoriteSidebar, \"_4-d6\");\n            this.inform(\"editEnd\");\n        },\n        _onClick: function(event) {\n            var xb = event.getTarget(), yb = oa.byTag(xb, \"li\");\n            if (t.isEditMode()) {\n                var zb = oa.byClass(xb, \"_54sk\");\n                if ((zb && yb)) {\n                    var ac = ca.get(yb, \"id\");\n                    if (ac) {\n                        t.toggleID(ac);\n                        t.save();\n                    }\n                ;\n                    this.update();\n                }\n            ;\n                event.prevent();\n                return false;\n            }\n        ;\n            if (yb) {\n                if (o.hasClass(yb, \"blackbirdWhitelist\")) {\n                    var bc = new xa(\"/ajax/chat/privacy/settings_dialog.php\").addQueryData({\n                        ref: \"whitelist_separator\"\n                    });\n                    j.send(new k(bc));\n                    event.prevent();\n                    return false;\n                }\n            ;\n                var cc = ca.get(yb, \"id\"), dc = o.hasClass(yb, \"_56yg\");\n                if ((cc || dc)) {\n                    var ec = this._getChatTabOpenLogData(yb), fc = o.hasClass(document.documentElement, \"sidebarMode\"), gc = (qa.getOnlinePolicy() === qa.ONLINE_TO_WHITELIST), hc = (gc ? \"white_list\" : \"ordered_list\");\n                    if (dc) {\n                        cc = yb.getAttribute(\"data-threadid\");\n                        hc = (cc ? \"recent_threads_in_divebar\" : \"recent_threads_in_divebar_new\");\n                    }\n                     else if (((fc && this._favoriteMode) && !gc)) {\n                        while (yb.parentNode) {\n                            yb = yb.parentNode;\n                            if (o.hasClass(yb, \"_42g8\")) {\n                                hc = \"more_online_friends\";\n                                break;\n                            }\n                        ;\n                            if (o.hasClass(yb, \"_42g7\")) {\n                                break;\n                            };\n                        };\n                    }\n                     else while (yb.previousSibling) {\n                        yb = yb.previousSibling;\n                        if (o.hasClass(yb, \"_554m\")) {\n                            if (o.hasClass(yb, \"moreOnlineFriends\")) {\n                                hc = \"more_online_friends\";\n                                break;\n                            }\n                        ;\n                            if (o.hasClass(yb, \"blackbirdWhitelist\")) {\n                                hc = \"blackbird_offline_section\";\n                                break;\n                            }\n                        ;\n                        }\n                    ;\n                    }\n                    \n                ;\n                    ec.source = hc;\n                    var ic = (dc ? z.THREAD_TYPE : ka.FRIEND);\n                    q.openTab(cc, ic, ec);\n                    this.inform(\"click\", {\n                        id: cc\n                    });\n                }\n                 else if ((o.hasClass(yb, \"_554m\") && oa.byClass(xb, \"_554n\"))) {\n                    this.scrollTo(yb);\n                }\n                 else if (o.hasClass(yb, \"_55nf\")) {\n                    return\n                }\n                \n            ;\n                return false;\n            }\n        ;\n        },\n        _mouseEnter: function() {\n            this._preventRendering = true;\n        },\n        _mouseLeave: function() {\n            this._preventRendering = false;\n        },\n        setExcludedIds: function(xb) {\n            this._excludedIds = bb((xb || []));\n        },\n        setNumTopFriends: function(xb) {\n            if ((xb !== this._numTopFriends)) {\n                this._numTopFriends = xb;\n                this.render();\n            }\n        ;\n        },\n        _getOfflineToSectionItems: function() {\n            var xb = (\"subheader-text-\" + fb()), yb = ba.create(\"a\", {\n                href: \"#\",\n                \"aria-describedby\": xb\n            }, ba.tx._(\"Edit\")), zb = [], ac = ba.tx._(\"MORE FRIENDS\");\n            zb.push(ia.li({\n                className: \"_554m\"\n            }, ia.div({\n                className: \"_554o\"\n            }, ia.div({\n                className: \"_554n\"\n            }, ia.span({\n                className: \"_554p\"\n            }, ac), ia.div({\n                className: \"_554q\"\n            }, ia.span({\n                className: \"_554r\"\n            }))))));\n            zb.push(ia.li({\n                className: \"_554m blackbirdWhitelist\"\n            }, ia.div({\n                className: \"_554o\"\n            }, ia.div({\n                className: \"fbChatOrderedList/separatorInner\"\n            }, ia.div({\n                className: \"fbChatOrderedList/separatorSubheader\"\n            }, ia.span({\n                id: xb,\n                className: \"_554t\"\n            }, kb._(\"These friends can't see you on chat. {=link}\", {\n                \"=link\": yb\n            })))))));\n            return zb;\n        },\n        _renderOrderedList: function() {\n            if (((!this._isVisible || ((this._preventRendering && this._hasRendered))) || ob)) {\n                return\n            };\n            this._hasRendered = true;\n            this._cachedItems = null;\n            var xb = [], yb, zb, ac = false, bc = false, cc = r.get(\"divebar_has_new_groups_button\", false), dc = o.hasClass(document.documentElement, \"sidebarMode\"), ec = qa.getVisibility(), fc = (qa.getOnlinePolicy() === qa.ONLINE_TO_WHITELIST), gc = (this._isLitestandSidebar && this._isLitestandSidebarCollapsed()), hc = r.get(\"groups_in_divebar\");\n            (hc && this._updateGroupThreads());\n            var ic = (hc && v.getThreadIDs().length), jc = (((dc && this._favoriteMode) && ec) && !fc);\n            if ((((jc && hc) && ic) && this._groupThreadsNode)) {\n                ba.setContent(this._groupsList, this._groupThreadsNode);\n                x.nukeLinks(this._groupThreadsNode);\n                x.nukeLinks(this._favoriteList);\n                this.inform(\"render\");\n            }\n        ;\n            var kc = ((jc && this._groupThreadsNode) && this._groupsList), lc = (kc && ic), mc = (this._isLitestand && !oa.byClass(this._root, \"_4w59\"));\n            if ((kc && ((ic || (mc && cc))))) {\n                ba.setContent(this._groupsList, this._groupThreadsNode);\n                o.show(this._groupsList);\n                x.nukeLinks(this._favoriteList);\n                this.inform(\"render\");\n            }\n             else (this._groupsList && o.hide(this._groupsList));\n        ;\n            var nc = (ic || 0);\n            if ((cc && ((lc || !jc)))) {\n                nc++;\n            };\n            if ((this._hasChatFlyout && this._isLitestandSidebarCollapsed())) {\n                nc++;\n            };\n            var oc = [], pc, qc;\n            if (jc) {\n                (this._chatSidebar && o.addClass(this._chatSidebar, \"fbSidebarFavoriteList\"));\n                oc = t.get();\n                if (gc) {\n                    oc = oc.slice(0, Math.max(0, (this._numTopFriends - nc)));\n                };\n                for (pc = 0, qc = oc.length; (pc < qc); pc++) {\n                    yb = oc[pc];\n                    zb = this._getListItem(yb, true);\n                    if (zb) {\n                        xb.push(zb);\n                    }\n                     else {\n                        bc = true;\n                        this._renderListItem(yb, this.update.bind(this));\n                    }\n                ;\n                };\n            }\n        ;\n            this.toggleFavoriteSidebar(jc, lc);\n            var rc = (gc ? 1 : 0), sc = qb.getSortedList(bb(oc), Math.max(0, (((this._numTopFriends - oc.length) - nc) + rc)));\n            if (jc) {\n                if ((oc.length && sc.length)) {\n                    var tc = ba.create(\"li\", {\n                        className: \"_42g3\"\n                    });\n                    xb.push(tc);\n                }\n            ;\n            }\n             else if ((ic || cc)) {\n                (this._groupThreadsNode && xb.push(this._groupThreadsNode));\n            }\n        ;\n            var uc = (qa.getVisibility() && (qa.getOnlinePolicy() == qa.ONLINE_TO_WHITELIST));\n            for (var vc = 0, wc = sc.length; (vc < wc); vc++) {\n                yb = sc[vc];\n                if (uc) {\n                    if (!qa.allows(yb)) {\n                        if (((vc + 2) >= sc.length)) {\n                            break;\n                        };\n                        uc = false;\n                        var xc = this._getOfflineToSectionItems();\n                        xb.push(xc[0]);\n                        xb.push(xc[1]);\n                        wc -= 2;\n                    }\n                \n                };\n                zb = this._getListItem(yb);\n                if (zb) {\n                    xb.push(zb);\n                }\n                 else this._renderListItem(yb, this.render.bind(this));\n            ;\n            };\n            if (jc) {\n                ba.setContent(this._favoriteList, xb);\n                if (xb.length) {\n                    x.nukeLinks(this._favoriteList);\n                };\n                this.inform(\"render\");\n            }\n        ;\n            var yc;\n            if (gc) {\n                yc = [];\n            }\n             else yc = qb.getAvailableList(this._excludedIds);\n        ;\n            var zc = oc.concat(sc), ad = bb(zc);\n            yc = yc.filter(function(jd) {\n                return !((jd in ad));\n            });\n            if (this._renderUnreadCount) {\n                var bd = [];\n                if (this._renderedTopUsers) {\n                    var cd = Object.keys(this._renderedTopUsers).filter(function(jd) {\n                        return !((jd in ad));\n                    });\n                    cd.forEach(function(jd) {\n                        this._updateUnreadCount(jd, 0);\n                    }.bind(this));\n                    zc.forEach(function(jd) {\n                        if (!((jd in this._renderedTopUsers))) {\n                            bd.push(jd);\n                        };\n                    }.bind(this));\n                }\n                 else bd = zc;\n            ;\n                bd.forEach(function(jd) {\n                    ma.getThreadMeta(ma.getThreadIdForUser(jd), function(kd) {\n                        this._updateUnreadCount(jd, (kd && kd.unread_count));\n                    }.bind(this));\n                }.bind(this));\n                this._renderedTopUsers = ad;\n            }\n        ;\n            if (r.get(\"divebar_show_mobile_more_friends_alphabetical\")) {\n                yc.sort(vb);\n            }\n             else yc.sort(wb);\n        ;\n            var dd = \"MORE FRIENDS\";\n            if (jc) {\n                xb = [];\n            }\n             else if ((yc.length && xb.length)) {\n                var ed;\n                if (this._isLitestand) {\n                    ed = ia.span(null, ia.span({\n                        className: \"_554u\"\n                    }, dd, \" \\u00b7 \", yc.length), ia.span({\n                        className: \"_554v\"\n                    }, \" +\", yc.length));\n                }\n                 else ed = kb._(\"{MORE ONLINE FRIENDS} ({=count})\", {\n                    \"MORE ONLINE FRIENDS\": dd,\n                    \"=count\": yc.length\n                });\n            ;\n                if (this._pymk) {\n                    ac = true;\n                    xb.push(this._pymk);\n                }\n            ;\n                xb.push(ia.li({\n                    className: \"_554m moreOnlineFriends\"\n                }, ia.div({\n                    className: \"_554o\"\n                }, ia.div({\n                    className: \"_554n\"\n                }, ia.span({\n                    className: \"_554p\"\n                }, ed), ia.div({\n                    className: \"_554q\"\n                }, ia.span({\n                    className: \"_554r\"\n                }))))));\n            }\n            \n        ;\n            for (pc = 0, qc = yc.length; (pc < qc); pc++) {\n                yb = yc[pc];\n                zb = this._getListItem(yb);\n                if (zb) {\n                    xb.push(zb);\n                }\n                 else this._renderListItem(yb, this.render.bind(this));\n            ;\n            };\n            if (((!sc.length && !yc.length) && !nc)) {\n                var fd = this._messageTemplate.render(), gd = za.getNode(fd, \"message\");\n                ba.setContent(gd, \"No one is available to chat.\");\n                xb.push(fd);\n            }\n        ;\n            if (this._hasChatFlyout) {\n                var hd = (this._isLitestandSidebarCollapsed() ? this._getSidebarFlyoutItem() : null);\n                ba.setContent(this._sidebarFlyoutItemContainer, hd);\n            }\n        ;\n            if (xb.length) {\n                if (jc) {\n                    o.show(this._activeNowList);\n                    if (this._activeNowLabel) {\n                        var id;\n                        o.show(this._activeNowArea);\n                        if (this._isLitestand) {\n                            id = ia.span(null, ia.span({\n                                className: \"_554u\"\n                            }, dd, \" \\u00b7 \", yc.length), ia.span({\n                                className: \"_554v\"\n                            }, \" +\", yc.length));\n                        }\n                         else id = kb._(\"{MORE ONLINE FRIENDS} ({=count})\", {\n                            \"MORE ONLINE FRIENDS\": \"ACTIVE NOW\",\n                            \"=count\": yc.length\n                        });\n                    ;\n                        ba.setContent(this._activeNowLabel, id);\n                    }\n                ;\n                    ba.setContent(this._activeNowList, xb);\n                    x.nukeLinks(this._activeNowList);\n                }\n                 else {\n                    if ((this._pymk && !ac)) {\n                        xb.push(this._pymk);\n                    };\n                    ba.setContent(this._orderedList, xb);\n                    if (this._pymk) {\n                        x.removeMessagesHrefs(this.getRoot());\n                    }\n                     else x.nukeLinks(this.getRoot());\n                ;\n                }\n            ;\n                this.inform(\"render\");\n                this._placeholderUpdate();\n                if (!this._renderingAfterScroll) {\n                    this._renderingAfterScroll = true;\n                    this.render = eb(hb.curry(this._renderOrderedList.bind(this), \"ChatOrderedList/render\", true), 300);\n                }\n            ;\n            }\n             else if (jc) {\n                o.hide(this._activeNowList);\n                if (this._activeNowArea) {\n                    o.hide(this._activeNowArea);\n                };\n            }\n            \n        ;\n            if (jc) {\n                (this._editButton && u.tryShow(this._editButton));\n            }\n             else u.tryHide();\n        ;\n            if ((jc && !bc)) {\n                if ((t.isEditMode() && t.hasChanged())) {\n                    this._createSortableGroup();\n                }\n            };\n        },\n        render: function() {\n            this.render = eb(this._renderOrderedList.bind(this), 300);\n            this.render();\n        },\n        _renderListItem: function(xb, yb) {\n            ta.get(xb, function(zb) {\n                var ac = this._template.render(), bc = za.getNode(ac, \"profile-photo\");\n                if (r.get(\"chat_use_client_side_image_requests\", 0)) {\n                    var cc = (this._isLitestand ? 24 : 28);\n                    new fa().setFBID(zb.id).setType(ga.PROFILE_PICTURE).setDimensions(cc, cc).setResizeMode(pa.COVER).setCallback(function(hc) {\n                        bc.setAttribute(\"src\", hc.uri);\n                    }).send();\n                }\n                 else bc.setAttribute(\"src\", zb.thumbSrc);\n            ;\n                var dc = za.getNode(ac, \"name\");\n                ba.setContent(dc, zb.name);\n                var ec = za.getNode(ac, \"accessible-name\");\n                ba.setContent(ec, zb.name);\n                var fc = za.getNode(ac, \"anchor\");\n                fc.setAttribute(\"href\", (\"/messages/\" + xb));\n                var gc = za.getNode(ac, \"tooltip\");\n                (gc && va.set(gc, zb.name, \"right\"));\n                ca.set(ac, \"id\", xb);\n                this._itemsMap[xb] = {\n                    node: ac\n                };\n                (yb && yb(ac));\n            }.bind(this));\n        },\n        _updateUnreadCount: function(xb, yb) {\n            var zb = this._itemsMap[xb];\n            if (!zb) {\n                return\n            };\n            if (this._isSidebar) {\n                this._unreadMessages = (this._unreadMessages || {\n                });\n                if (!!yb) {\n                    this._unreadMessages[xb] = true;\n                }\n                 else delete this._unreadMessages[xb];\n            ;\n                h.inform(\"buddylist-nub/updateCount\", {\n                    count: Object.keys(this._unreadMessages).length\n                });\n            }\n        ;\n            zb.unreadCount = (zb.unreadCount || ba.find(zb.node, \"._550_\"));\n            yb = (yb ? yb : 0);\n            ba.setContent(zb.unreadCount, ((yb > pb) ? (pb + \"+\") : yb));\n            o.conditionClass(zb.unreadCount, \"_550z\", (yb > pb));\n            o.conditionClass(zb.node, \"_550-\", yb);\n        },\n        _getSidebarFlyoutItem: function() {\n            if (this._flyoutItem) {\n                return this._flyoutItem\n            };\n            this._flyoutItem = (ia.li({\n                className: \"_57dk\"\n            }, ia.div({\n                className: \"_57dl\"\n            })));\n            ea.listen(this._flyoutItem, \"mouseenter\", function() {\n                var yb = ia.span(null, \"Chat\", \" \\u00b7 \", l.getOnlineCount());\n                if ((this._flyoutInstance && this._flyoutInstance.isShown())) {\n                    va.remove(this._flyoutItem);\n                }\n                 else va.set(this._flyoutItem, yb, \"right\");\n            ;\n            }.bind(this));\n            var xb = this._showLitestandChatFlyout.bind(this);\n            h.subscribe(\"ChatBeeper/clicked\", xb);\n            ea.listen(this._flyoutItem, \"click\", xb);\n            return this._flyoutItem;\n        },\n        _showLitestandChatFlyout: function() {\n            if (this._loadingFlyout) {\n                return\n            };\n            if (this._flyoutInstance) {\n                this._flyoutInstance.toggle();\n                return;\n            }\n        ;\n            this._loadingFlyout = true;\n            new k(\"/ajax/chat/litestand_flyout\").setData({\n                contextID: ba.getID(this._flyoutItem)\n            }).setAllowCrossPageTransition(true).send();\n            var xb = h.subscribe(\"LitestandChatSidebarFlyout/init\", function(yb, zb) {\n                this._flyoutInstance = zb;\n                this._loadingFlyout = false;\n                xb.unsubscribe();\n                this.subscribe(\"render\", zb.contextPositionInvalidated.bind(zb));\n            }.bind(this));\n        },\n        show: function() {\n            if (this._isVisible) {\n                return\n            };\n            this._isVisible = true;\n            o.show((this._scrollableOrderedList || this._root));\n            this.render();\n            this.inform(\"show\");\n        },\n        isVisible: function() {\n            return this._isVisible;\n        },\n        update: function() {\n            this._hasRendered = false;\n            if (!this._renderRequest) {\n                this._renderRequest = gb(function() {\n                    this.render();\n                    this._renderRequest = null;\n                }.bind(this));\n            };\n        },\n        setScrollContainer: function(xb) {\n            if (ba.contains(xb, this._root)) {\n                this._scrollContainer = xb;\n                if (this._usePlaceholder) {\n                    ea.listen(xb, \"scroll\", jb.acrossTransitions(this._placeholderUpdate.bind(this)));\n                    ea.listen(window, \"resize\", jb.acrossTransitions(function() {\n                        this._scrollContainerHeight = null;\n                        this._placeholderUpdate();\n                    }.bind(this), 250));\n                }\n            ;\n            }\n        ;\n        },\n        scrollTo: function(xb) {\n            if (!this._scrollContainer) {\n                return\n            };\n            var yb = this._scrollContainer.scrollHeight, zb = this._scrollContainer.clientHeight, ac = this._scrollContainer.scrollTop, bc = Math.min(xb.offsetTop, (yb - zb));\n            if ((ac !== bc)) {\n                var cc = (this._isLitestand ? 600 : ((Math.abs((bc - ac)) / this._scrollContainer.clientHeight) * 500)), dc = (this._isLitestand ? da.easeOutExpo : g.ease.end);\n                new g(this._scrollContainer).to(\"scrollTop\", bc).ease(dc).duration(cc).go();\n            }\n        ;\n        },\n        _applyContext: function(xb, yb) {\n            var zb = (s.getShortDisplay(xb) || \"\");\n            if (yb.contextNode) {\n                ba.setContent(yb.contextNode, zb);\n                o.conditionClass(yb.node, \"_52zj\", zb);\n                var ac = s.get(xb), bc = (ac ? ac.type : null);\n                for (var cc in qb.CONTEXT_CLASSES) {\n                    var dc = ((cc === bc)), ec = (qb.CONTEXT_CLASSES[cc] || \"_56x-\");\n                    o.conditionClass(yb.contextNode, ec, dc);\n                };\n            }\n        ;\n        }\n    });\n    e.exports = qb;\n});\n__d(\"TypingDetectorController\", [\"AsyncRequest\",\"AvailableList\",\"AvailableListConstants\",\"ChannelConnection\",\"ChatVisibility\",\"Keys\",\"PresencePrivacy\",\"ShortProfiles\",\"TypingDetector\",\"copyProperties\",\"emptyFunction\",\"shield\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = b(\"AvailableList\"), i = b(\"AvailableListConstants\"), j = b(\"ChannelConnection\"), k = b(\"ChatVisibility\"), l = b(\"Keys\"), m = b(\"PresencePrivacy\"), n = b(\"ShortProfiles\"), o = b(\"TypingDetector\"), p = b(\"copyProperties\"), q = b(\"emptyFunction\"), r = b(\"shield\");\n    function s(u) {\n        if (!k.isOnline()) {\n            return false\n        };\n        if (u) {\n            var v = n.getNow(u);\n            return ((v && (v.type == \"friend\")) && m.allows(u));\n        }\n    ;\n        return true;\n    };\n    function t(u, v, w, x, y) {\n        this.userID = u;\n        this.input = v;\n        this.source = w;\n        this.threadID = y;\n        this.remoteState = o.INACTIVE;\n        this.notifyTimer = null;\n        x = (x || {\n        });\n        this.notifyDelay = (x.notifyDelay || this.notifyDelay);\n        this._typingDetector = new o(v);\n        this._typingDetector.init(x);\n        this._typingDetector.subscribe(\"change\", this._stateChange.bind(this));\n    };\n    p(t.prototype, {\n        notifyDelay: 1000,\n        setUserAndThread: function(u, v) {\n            if (((this.userID !== u) || (this.threadID !== v))) {\n                this.resetState();\n                this.userID = u;\n                this.threadID = v;\n            }\n        ;\n        },\n        setIgnoreEnter: function(u) {\n            var v = (u ? [l.RETURN,] : []);\n            this._typingDetector.setIgnoreKeys(v);\n        },\n        resetState: function() {\n            this.remoteState = t.INACTIVE;\n            this._typingDetector.reset();\n            clearTimeout(this.notifyTimer);\n            this.notifyTimer = null;\n        },\n        _stateChange: function(u, v) {\n            if ((v != o.QUITTING)) {\n                clearTimeout(this.notifyTimer);\n                this.notifyTimer = r(this._notifyState, this, v).defer(this.notifyDelay, false);\n            }\n             else this._notifyState(v, true);\n        ;\n        },\n        _notifyState: function(u, v) {\n            if ((!this.userID && !this.threadID)) {\n                return\n            };\n            var w = this.userID, x = s(w);\n            if ((x && (u != this.remoteState))) {\n                this.remoteState = u;\n                if (j.disconnected()) {\n                    return\n                };\n                var y = {\n                    typ: u,\n                    to: w,\n                    source: this.source,\n                    thread: this.threadID\n                };\n                new g().setHandler(this._onTypResponse.bind(this, w)).setErrorHandler(q).setData(y).setURI(\"/ajax/messaging/typ.php\").setAllowCrossPageTransition(true).setOption(\"asynchronous\", !v).send();\n            }\n        ;\n        },\n        _onTypResponse: function(u, v) {\n            var w = (v.getPayload() || {\n            });\n            if (w.offline) {\n                h.set(u, i.OFFLINE, \"typing_response\");\n            };\n        }\n    });\n    e.exports = t;\n});\n__d(\"ChatBehavior\", [\"Arbiter\",\"AvailableList\",\"AvailableListConstants\",\"ChatConfig\",\"copyProperties\",\"MercuryConstants\",\"ChatSidebarCalloutData\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"AvailableList\"), i = b(\"AvailableListConstants\"), j = b(\"ChatConfig\"), k = b(\"copyProperties\"), l = b(\"MercuryConstants\").ChatNotificationConstants, m = b(\"ChatSidebarCalloutData\").isShown, n = h.getWebChatNotification(), o = m, p = true, q = k(new g(), {\n        ON_CHANGED: \"changed\",\n        notifiesUserMessages: function() {\n            return (n !== l.NO_USER_MESSAGE_NOTIFICATION);\n        },\n        ignoresRemoteTabRaise: function() {\n            return o;\n        },\n        showsTabUnreadUI: function() {\n            if (j.get(\"web_messenger_suppress_tab_unread\")) {\n                return p\n            };\n            return true;\n        }\n    });\n    function r() {\n        q.inform(q.ON_CHANGED);\n    };\n    h.subscribe(i.ON_CHAT_NOTIFICATION_CHANGED, function() {\n        var s = n, t = h.getWebChatNotification();\n        n = t;\n        if ((s != t)) {\n            r();\n        };\n    });\n    g.subscribe(\"chat/set_does_page_occlude_tabs\", function(s, t) {\n        o = !!t;\n        r();\n    });\n    g.subscribe(\"chat/set_show_tab_unread_ui\", function(s, t) {\n        p = !!t;\n        r();\n    });\n    e.exports = q;\n});\n__d(\"ChatSidebarSheet\", [\"JSXDOM\",\"Event\",\"function-extensions\",\"ArbiterMixin\",\"BlackbirdUpsell\",\"ChannelConnection\",\"ChannelConstants\",\"ChatBehavior\",\"ChatConfig\",\"ChatVisibility\",\"CSS\",\"DOM\",\"JSLogger\",\"PresencePrivacy\",\"Tooltip\",\"csx\",\"cx\",\"copyProperties\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSXDOM\"), h = b(\"Event\");\n    b(\"function-extensions\");\n    var i = b(\"ArbiterMixin\"), j = b(\"BlackbirdUpsell\"), k = b(\"ChannelConnection\"), l = b(\"ChannelConstants\"), m = b(\"ChatBehavior\"), n = b(\"ChatConfig\"), o = b(\"ChatVisibility\"), p = b(\"CSS\"), q = b(\"DOM\"), r = b(\"JSLogger\"), s = b(\"PresencePrivacy\"), t = b(\"Tooltip\"), u = b(\"csx\"), v = b(\"cx\"), w = b(\"copyProperties\"), x = b(\"tx\"), y = r.create(\"sidebar_sheet\");\n    function z(ca) {\n        switch (ca) {\n          case l.HINT_AUTH:\n            return \"Your session has timed out. Please log in.\";\n          case l.HINT_CONN:\n            return x._(\"Facebook {Chat} is currently unavailable.\", {\n                Chat: \"Chat\"\n            });\n          case l.HINT_MAINT:\n            return x._(\"Facebook {Chat} is currently down for maintenance.\", {\n                Chat: \"Chat\"\n            });\n          default:\n            return x._(\"Facebook {Chat} is currently unavailable.\", {\n                Chat: \"Chat\"\n            });\n        };\n    };\n    function aa(ca) {\n        var da;\n        if ((ca === null)) {\n            da = \"Unable to connect to chat. Check your Internet connection.\";\n        }\n         else if ((ca > n.get(\"warning_countdown_threshold_msec\"))) {\n            var ea = q.create(\"a\", {\n                href: \"#\",\n                className: \"fbChatReconnectLink\"\n            }, \"Try again\");\n            da = q.tx._(\"Unable to connect to chat. {try-again-link}\", {\n                \"try-again-link\": ea\n            });\n        }\n         else if ((ca > 1000)) {\n            da = x._(\"Unable to connect to chat. Reconnecting in {seconds}...\", {\n                seconds: Math.floor((ca / 1000))\n            });\n        }\n         else da = \"Unable to connect to chat. Reconnecting...\";\n        \n        \n    ;\n        return da;\n    };\n    function ba(ca) {\n        this._root = ca;\n        this._litestandOffline = q.scry(ca, \"._52d2\");\n        this._message = q.find(ca, \"div.fbChatSidebarMessage div.message\");\n        k.subscribe([k.CONNECTED,k.SHUTDOWN,k.RECONNECTING,], this._handleConnectionChange.bind(this));\n        k.subscribe([k.MUTE_WARNING,k.UNMUTE_WARNING,], this._render.bind(this));\n        s.subscribe(\"privacy-user-presence-changed\", this._render.bind(this));\n        m.subscribe(m.ON_CHANGED, this._render.bind(this));\n        this._render();\n    };\n    w(ba.prototype, i, {\n        _channelStatus: null,\n        _channelData: null,\n        _handleConnectionChange: function(ca, da) {\n            this._channelStatus = ca;\n            this._channelData = da;\n            this._render();\n        },\n        _showWarningTimeout: null,\n        _warningMsgEventListener: null,\n        _renderChannelDisconnect: function() {\n            if ((this._channelStatus === k.SHUTDOWN)) {\n                return q.setContent(this._message, z(this._channelData));\n            }\n             else if ((this._channelStatus === k.RECONNECTING)) {\n                var ca = this._channelData;\n                q.setContent(this._message, aa(ca));\n                if ((ca > 1000)) {\n                    if ((ca > n.get(\"warning_countdown_threshold_msec\"))) {\n                        this._warningMsgEventListener = h.listen(this._message, \"click\", function(event) {\n                            if (p.hasClass(event.getTarget(), \"fbChatReconnectLink\")) {\n                                k.reconnect();\n                                return false;\n                            }\n                        ;\n                        });\n                    };\n                    this._showWarningTimeout = setTimeout(this._handleConnectionChange.bind(this, k.RECONNECTING, (ca - 1000)), 1000, false);\n                }\n            ;\n            }\n            \n        ;\n        },\n        _goOnlineEventListener: null,\n        _renderOffline: function() {\n            if (this._isLitestand) {\n                return\n            };\n            if ((this._litestandOffline && this._litestandOffline.length)) {\n                this._renderLitestandOffline();\n            };\n            var ca = \"fbChatGoOnlineLink\", da = \"Turn on chat\", ea = q.create(\"a\", {\n                href: \"#\",\n                className: ca\n            }, da), fa = q.tx._(\"{=Go online} to see who's available.\", {\n                \"=Go online\": ea\n            });\n            q.setContent(this._message, fa);\n            this._goOnlineEventListener = h.listen(this._message, \"click\", function(event) {\n                if (p.hasClass(event.getTarget(), ca)) {\n                    y.log(\"sidebar_go_online\");\n                    o.goOnline();\n                    return false;\n                }\n            ;\n            });\n        },\n        _renderLitestandOffline: function() {\n            this._litestandOffline = this._litestandOffline[0];\n            this._isLitestand = true;\n            var ca = g.div({\n                className: \"_4_vf\"\n            }), da = g.a({\n                className: \"_52cx _52i7\",\n                href: \"#\"\n            }, g.i({\n                className: \"_52c_\"\n            }), g.div({\n                className: \"_52cz\"\n            }, g.div({\n                className: \"_52c-\"\n            }, g.i({\n                className: \"_52d1\"\n            }), g.div({\n                className: \"_52cy\"\n            }, q.tx._(\"Turn on Chat\")))), g.i({\n                className: \"_52d0\"\n            }), ca);\n            t.set(ca, q.tx._(\"Turn on Chat\"), \"right\", \"center\");\n            q.replace(this._litestandOffline, da);\n            this._litestandOffline = null;\n            h.listen(da, \"click\", function(event) {\n                y.log(\"sidebar_go_online\");\n                o.goOnline();\n                event.prevent();\n            });\n        },\n        _renderBlackbirdUpsell: function() {\n            q.setContent(this._message, j.getOfflineContent());\n        },\n        _renderBlackbird: function(ca) {\n            q.setContent(this._message, j.getBlackbirdContent(ca));\n        },\n        _clear: function() {\n            if (this._showWarningTimeout) {\n                clearTimeout(this._showWarningTimeout);\n                this._showWarningTimeout = null;\n            }\n        ;\n            if (this._warningMsgEventListener) {\n                this._warningMsgEventListener.remove();\n                this._warningMsgEventListener = null;\n            }\n        ;\n            if (this._goOnlineEventListener) {\n                this._goOnlineEventListener.remove();\n                this._goOnlineEventListener = null;\n            }\n        ;\n            p.removeClass(this._root, \"upsell\");\n            p.removeClass(this._root, \"offline\");\n            p.removeClass(this._root, \"blackbird\");\n            p.removeClass(this._root, \"error\");\n            p.removeClass(this._root, \"notice\");\n            q.empty(this._message);\n        },\n        _render: function() {\n            this._clear();\n            if (j.shouldShow()) {\n                if (o.hasBlackbirdEnabled()) {\n                    var ca = (o.isOnline() ? \"blackbird\" : \"upsell\");\n                    p.addClass(this._root, ca);\n                    this._renderBlackbird(s.getVisibility());\n                }\n                 else if (!o.isOnline()) {\n                    p.addClass(this._root, \"upsell\");\n                    this._renderBlackbirdUpsell();\n                }\n                \n            ;\n            }\n             else if (!o.isOnline()) {\n                p.addClass(this._root, \"offline\");\n                this._renderOffline();\n            }\n             else if (k.disconnected()) {\n                p.addClass(this._root, \"error\");\n                this._renderChannelDisconnect();\n            }\n             else if (!m.notifiesUserMessages()) {\n                p.addClass(this._root, \"notice\");\n                q.setContent(this._message, \"Alerts are off while you use another client to chat.\");\n            }\n            \n            \n            \n        ;\n            this.inform(\"updated\");\n        }\n    });\n    e.exports = ba;\n});\n__d(\"FBDesktopPlugin\", [\"CacheStorage\",\"DOM\",\"Env\",\"FBDesktopDetect\",\"URI\",\"Style\",], function(a, b, c, d, e, f) {\n    var g = b(\"CacheStorage\"), h = b(\"DOM\"), i = b(\"Env\"), j = b(\"FBDesktopDetect\"), k = b(\"URI\"), l = b(\"Style\"), m = new g(\"localstorage\", \"_socialfox_\"), n = {\n        _plugin: \"_not_checked\",\n        arbiterInform: function(o, p) {\n            var q = JSON.stringify({\n                name: o,\n                payload: p\n            });\n            this._transmitCommand(\"arbiterinform\", q);\n        },\n        bringToFront: function() {\n            this._transmitCommand(\"bringtofront\");\n        },\n        dock: function() {\n            this._transmitCommand(\"dock\");\n        },\n        getPlugin: function() {\n            if ((this._plugin === \"_not_checked\")) {\n                this._plugin = null;\n                if (j.isPluginInstalled()) {\n                    var o = h.create(\"object\", {\n                        id: \"kiwi_plugin\",\n                        type: j.mimeType\n                    });\n                    l.set(o, \"width\", 0);\n                    l.set(o, \"height\", 0);\n                    var p = h.create(\"div\", {\n                    }, o);\n                    l.set(p, \"width\", 0);\n                    l.set(p, \"height\", 0);\n                    document.body.appendChild(p);\n                    this._plugin = o;\n                }\n            ;\n            }\n        ;\n            return this._plugin;\n        },\n        getUserID: function() {\n            var o = this.getPlugin();\n            return ((o && (\"getUserID\" in o)) && o.getUserID());\n        },\n        getVersion: function() {\n            var o = this.getPlugin();\n            return ((o && (\"getVersion\" in o)) && o.getVersion());\n        },\n        isAppRunning: function() {\n            var o = this.getPlugin();\n            return ((o && (\"isAppRunning\" in o)) && o.isAppRunning());\n        },\n        launchApp: function() {\n            var o = this.getPlugin();\n            return ((o && (\"launchApp\" in o)) && o.launchApp());\n        },\n        login: function(o, p) {\n            if (((p && o) && (o.length > 0))) {\n                var q = this.getPlugin();\n                if (q) {\n                    this._transmitCommand((((\"relogin\\u000a\" + o) + \"\\u000a\") + p));\n                    return;\n                }\n            ;\n            }\n        ;\n        },\n        logout: function(o) {\n            o = (o || \"0\");\n            var p = this.getPlugin();\n            if (p) {\n                p.logout(o);\n            };\n        },\n        recheck: function() {\n            if ((this._plugin === null)) {\n                this._plugin = \"_not_checked\";\n            };\n        },\n        shouldSuppressBeeper: function() {\n            return this.isAppRunning();\n        },\n        shouldSuppressMessages: function() {\n            if ((m && m.get(\"connected\"))) {\n                return true\n            };\n            var o = this.getUserID();\n            if (o) {\n                return (o === i.user);\n            }\n             else return this.isAppRunning()\n        ;\n        },\n        shouldSuppressSidebar: function() {\n            var o = this.getPlugin(), p = ((o && (\"isAppDocked\" in o)) && o.isAppDocked()), q = (m && (m.get(\"active\") === \"true\"));\n            return (p || q);\n        },\n        transferAuthToken: function(o, p) {\n            if ((o && (o.length > 0))) {\n                var q = this.getPlugin();\n                if (q) {\n                    q.setAccessToken(o, p);\n                    var r = setInterval(function() {\n                        q.setAccessToken(o, p);\n                    }, 500);\n                    setTimeout(function() {\n                        clearInterval(r);\n                    }, (10 * 1000));\n                }\n            ;\n            }\n        ;\n            if (this.redirectHome) {\n                window.location.href = k().setPath().toString();\n            };\n        },\n        _transmitCommand: function(o, p) {\n            p = (p || \"\");\n            var q = this.getPlugin();\n            if ((q && (\"transmitCommand\" in q))) {\n                q.transmitCommand(o, p);\n            };\n        }\n    };\n    e.exports = n;\n});\n__d(\"ChatSidebar\", [\"ChatOrderedList\",\"ChatTypeaheadBehavior\",\"ChatTypeaheadCore\",\"ChatTypeaheadDataSource\",\"ChatTypeaheadRenderer\",\"ChatTypeaheadView\",\"Typeahead\",\"Arbiter\",\"ArbiterMixin\",\"AsyncRequest\",\"AvailableList\",\"AvailableListConstants\",\"Bootloader\",\"ChannelConnection\",\"Chat\",\"ChatConfig\",\"ChatHovercard\",\"ChatImpressionLogger\",\"ChatOptions\",\"ChatSidebarSheet\",\"ChatVisibility\",\"CSS\",\"DOM\",\"DOMDimensions\",\"Event\",\"FBDesktopPlugin\",\"JSLogger\",\"JSXDOM\",\"KeyEventController\",\"OrderedFriendsList\",\"Parent\",\"PresencePrivacy\",\"ScrollableArea\",\"Style\",\"UserAgent\",\"ViewportBounds\",\"copyProperties\",\"createArrayFrom\",\"csx\",\"cx\",\"debounce\",\"emptyFunction\",\"fbt\",\"ge\",\"tx\",], function(a, b, c, d, e, f) {\n    b(\"ChatOrderedList\");\n    b(\"ChatTypeaheadBehavior\");\n    b(\"ChatTypeaheadCore\");\n    b(\"ChatTypeaheadDataSource\");\n    b(\"ChatTypeaheadRenderer\");\n    b(\"ChatTypeaheadView\");\n    b(\"Typeahead\");\n    var g = b(\"Arbiter\"), h = b(\"ArbiterMixin\"), i = b(\"AsyncRequest\"), j = b(\"AvailableList\"), k = b(\"AvailableListConstants\"), l = b(\"Bootloader\"), m = b(\"ChannelConnection\"), n = b(\"Chat\"), o = b(\"ChatConfig\"), p = b(\"ChatHovercard\"), q = b(\"ChatImpressionLogger\"), r = b(\"ChatOptions\"), s = b(\"ChatSidebarSheet\"), t = b(\"ChatVisibility\"), u = b(\"CSS\"), v = b(\"DOM\"), w = b(\"DOMDimensions\"), x = b(\"Event\"), y = b(\"FBDesktopPlugin\"), z = b(\"JSLogger\"), aa = b(\"JSXDOM\"), ba = b(\"KeyEventController\"), ca = b(\"OrderedFriendsList\"), da = b(\"Parent\"), ea = b(\"PresencePrivacy\"), fa = b(\"ScrollableArea\"), ga = b(\"Style\"), ha = b(\"UserAgent\"), ia = b(\"ViewportBounds\"), ja = b(\"copyProperties\"), ka = b(\"createArrayFrom\"), la = b(\"csx\"), ma = b(\"cx\"), na = b(\"debounce\"), oa = b(\"emptyFunction\"), pa = b(\"fbt\"), qa = b(\"ge\"), ra = b(\"tx\"), sa, ta = false, ua = false, va = false, wa = false, xa = false, ya = false, za, ab, bb, cb, db, eb = null, fb, gb, hb, ib, jb, kb, lb = 28, mb = 38, nb = z.create(\"chat_sidebar\");\n    function ob() {\n        if (gb) {\n            return\n        };\n        u.removeClass(document.documentElement, \"sidebarMode\");\n        if ((!wa || !yb.isVisible())) {\n            g.inform(\"reflow\");\n            return;\n        }\n    ;\n        va = false;\n        eb = null;\n        za.hide();\n        cb.getCore().reset();\n        u.hide(ab);\n        nb.rate(\"sidebar_hide\", wa);\n        yb.inform(\"sidebar/hide\", yb);\n        g.inform(\"sidebar/hide\", yb);\n        g.inform(\"reflow\");\n    };\n    function pb() {\n        var zb = yb.shouldShowSidebar();\n        u.conditionClass(document.documentElement, \"sidebarCapable\", zb);\n        if ((yb.isEnabled() && zb)) {\n            sb();\n            var ac;\n            if (fb) {\n                var bc = u.hasClass(ab, \"_4w59\");\n                if (bc) {\n                    return\n                };\n                kb = (kb || v.find(ab, \"._50g0\"));\n                if (fb.has_favorites_editing) {\n                    jb = (jb || v.scry(ab, \"._52s9\")[0]);\n                };\n                ac = [kb,];\n            }\n             else ac = ka(ab.childNodes);\n        ;\n            var cc = rb(ac), dc = (za.getItemHeight() || 32), ec = (za.getPaddingOffset() || 8), fc;\n            if (gb) {\n                if (gb.isExpanded()) {\n                    ec = (ec + lb);\n                    if ((fb && fb.always_show_one_see_more)) {\n                        ec += dc;\n                    };\n                }\n            ;\n                if (!n.isOnline()) {\n                    ec += mb;\n                };\n                var gc = Math.floor((za.getItemPadding() / 2));\n                fc = Math.floor(((((cc - ec) + gc)) / dc));\n                if (!za.isVisible()) {\n                    ga.set(sa, \"height\", (cc + \"px\"));\n                };\n            }\n             else {\n                fc = Math.floor((((cc - ec)) / ((dc + 1))));\n                ga.set(sa, \"height\", (cc + \"px\"));\n            }\n        ;\n            za.setNumTopFriends(fc);\n            var hc = Math.floor((((cc - ec)) / dc));\n            if (ub()) {\n                hc = ((((hc - 2)) > 0) ? (hc - 2) : 0);\n            };\n            cb.getData().setMaxResults(hc);\n            yb.inform(\"sidebar/resized\", yb);\n            g.inform(\"sidebar/resized\", yb);\n            g.inform(\"reflow\");\n        }\n         else ob();\n    ;\n        if (!wa) {\n            wb();\n            wa = true;\n        }\n    ;\n        eb = null;\n    };\n    function qb() {\n        if ((cb && yb.isVisible())) {\n            cb.getCore().getElement().focus();\n        };\n    };\n    function rb(zb) {\n        if (!zb) {\n            if (fb) {\n                kb = (kb || v.find(ab, \"._50g0\"));\n                zb = [kb,];\n            }\n             else zb = ka(ab.childNodes);\n        \n        };\n        var ac = db.height;\n        if ((gb && hb)) {\n            ac -= hb.getFullHeight();\n        };\n        zb.forEach(function(bc) {\n            if ((bc && (bc !== sa))) {\n                ac -= w.getElementDimensions(bc).height;\n            };\n        });\n        return Math.max(0, ac);\n    };\n    function sb() {\n        if (yb.isVisible()) {\n            return\n        };\n        va = true;\n        eb = null;\n        u.show(ab);\n        u.addClass(document.documentElement, \"sidebarMode\");\n        za.show();\n        nb.rate(\"sidebar_show\", wa);\n        yb.inform(\"sidebar/show\", yb);\n        g.inform(\"sidebar/show\", yb);\n        (ib && xb());\n    };\n    function tb() {\n        r.setSetting(\"sidebar_mode\", yb.isEnabled(), \"sidebar\");\n        new i(\"/ajax/chat/settings.php\").setHandler(oa).setErrorHandler(oa).setData({\n            sidebar_mode: yb.isEnabled()\n        }).setAllowCrossPageTransition(true).send();\n    };\n    function ub() {\n        return o.get(\"divebar_typeahead_group_fof\", 0);\n    };\n    function vb() {\n        return (ca.getList().length <= o.get(\"sidebar.min_friends\"));\n    };\n    function wb() {\n        var zb = true;\n        if (!yb.isEnabled()) {\n            nb.log(\"state_not_enabled\");\n            zb = false;\n        }\n    ;\n        if (!yb.isViewportCapable()) {\n            nb.log(\"state_not_shown_viewport\");\n            zb = false;\n        }\n    ;\n        if (ua) {\n            nb.log(\"state_not_shown_hidden\");\n            zb = false;\n        }\n    ;\n        if (vb()) {\n            nb.log(\"state_not_shown_num_friends\");\n            zb = false;\n        }\n    ;\n        if (y.shouldSuppressSidebar()) {\n            nb.log(\"state_not_shown_fbdesktop\");\n            zb = false;\n        }\n    ;\n        nb.log((zb ? \"state_shown\" : \"state_not_shown\"));\n    };\n    function xb() {\n        if (!yb.isVisible()) {\n            return\n        };\n        var zb;\n        if (!t.isOnline()) {\n            zb = \"Offline\";\n        }\n         else if (m.disconnected()) {\n            zb = \"Connection Lost\";\n        }\n         else zb = ra._(\"{Chat} {number-available}\", {\n            Chat: \"Chat\",\n            \"number-available\": ((\"(\" + j.getOnlineCount()) + \")\")\n        });\n        \n    ;\n        v.setContent(ib, zb);\n    };\n    var yb = {\n        init: function(zb, ac, bc, cc) {\n            yb.init = oa;\n            xa = true;\n            ab = zb;\n            za = ac;\n            cb = bc;\n            bb = cc;\n            sa = v.find(zb, \"div.fbChatSidebarBody\");\n            gb = (cc && cc.ls_module);\n            fb = (cc && cc.ls_config);\n            if (gb) {\n                g.subscribe(\"ViewportSizeChange\", function() {\n                    g.inform(\"ChatOrderedList/itemHeightChange\");\n                    pb();\n                });\n                g.subscribe(\"Sidebar/BookmarksHeightChange\", pb);\n                l.loadModules([\"LitestandSidebarBookmarksDisplay\",], function(ec) {\n                    hb = ec;\n                });\n            }\n             else x.listen(window, \"resize\", pb);\n        ;\n            ba.registerKey(\"q\", function() {\n                var ec = null;\n                if (kb) {\n                    ec = v.scry(kb, \".inputsearch\")[0];\n                }\n                 else ec = v.scry(zb, \".inputsearch\")[0];\n            ;\n                if (ec) {\n                    ec.focus();\n                    return false;\n                }\n            ;\n            });\n            new p(ac);\n            var dc = new s(zb);\n            dc.subscribe(\"updated\", pb);\n            g.subscribe(\"sidebar/invalidate\", pb);\n            ac.setScrollContainer(da.byClass(ac.getRoot(), \"uiScrollableAreaWrap\"));\n            ac.subscribe([\"render\",\"show\",\"hide\",], na(function(ec) {\n                if (((ec === \"render\") && !ya)) {\n                    ya = true;\n                    yb.inform(\"sidebar/chatRendered\", null, g.BEHAVIOR_PERSISTENT);\n                }\n            ;\n                var fc = ac.getRoot(), gc = fa.getInstance(fc);\n                (gc && gc.adjustGripper());\n            }));\n            ac.subscribe([\"editStart\",\"editEnd\",], function(ec) {\n                u.conditionClass(cb.getView().element, \"_4-d6\", (ec == \"editStart\"));\n            });\n            if ((ha.firefox() >= 17)) {\n                x.listen(window, \"storage\", function(ec) {\n                    if (((ec.key == \"_socialfox_active\") && (ec.oldValue != ec.newValue))) {\n                        pb();\n                    };\n                });\n            };\n            g.subscribe(\"chat/option-changed\", function(ec, fc) {\n                if ((fc.name == \"sidebar_mode\")) {\n                    ta = !!r.getSetting(\"sidebar_mode\");\n                    pb();\n                }\n            ;\n            });\n            bc.getCore().subscribe(\"sidebar/typeahead/active\", yb.updateOnActiveTypeahead);\n            bc.subscribe(\"reset\", function() {\n                if ((!bc.getCore().getValue() && !za.isVisible())) {\n                    yb.updateOnActiveTypeahead(null, false);\n                };\n            });\n            if (gb) {\n                bc.getCore().subscribe(\"sidebar/typeahead/preActive\", function(ec, fc) {\n                    if ((ta && cb.getView().isVisible())) {\n                        g.inform(ec, fc);\n                    }\n                     else pb();\n                ;\n                });\n            }\n             else g.subscribe(\"buddylist-nub/initialized\", function(ec, fc) {\n                x.listen(fc.getButton(), \"click\", function(event) {\n                    yb.enable();\n                    return !yb.shouldShowSidebar();\n                });\n            });\n        ;\n            ta = !!r.getSetting(\"sidebar_mode\");\n            (ha.ie() && x.listen(zb, \"click\", function(ec) {\n                if (da.byClass(ec.getTarget(), \"_57du\")) {\n                    qb();\n                };\n            }));\n            ea.subscribe(\"privacy-user-presence-changed\", pb);\n            pb();\n            q.init(za);\n            if (!gb) {\n                ia.addRight(yb.getVisibleWidth);\n            };\n            yb.inform(\"sidebar/initialized\", yb, g.BEHAVIOR_PERSISTENT);\n            g.inform(\"sidebar/initialized\", yb, g.BEHAVIOR_PERSISTENT);\n            if (o.get(\"litestand_blended_sidebar\")) {\n                ib = v.find(zb, \"._5bct\");\n                j.subscribe(k.ON_AVAILABILITY_CHANGED, na(xb, 2000));\n                m.subscribe([m.CONNECTED,m.RECONNECTING,m.SHUTDOWN,], xb);\n                ea.subscribe(\"privacy-changed\", xb);\n                xb();\n            }\n        ;\n        },\n        updateOnActiveTypeahead: function(zb, ac) {\n            if (!va) {\n                return\n            };\n            if (ac) {\n                za.hide();\n                if (gb) {\n                    u.addClass(ab, \"_5384\");\n                    var bc = rb();\n                    if (jb) {\n                        bc += w.getElementDimensions(jb).height;\n                    };\n                    ga.set(sa, \"height\", (bc + \"px\"));\n                }\n            ;\n            }\n             else {\n                za.show();\n                if (gb) {\n                    ga.set(sa, \"height\", \"auto\");\n                    u.removeClass(ab, \"_5384\");\n                    g.inform(\"sidebar/typeahead/active\", false);\n                    pb();\n                }\n                 else pb();\n            ;\n            }\n        ;\n        },\n        isInitialized: function() {\n            return wa;\n        },\n        disable: function() {\n            if (!yb.isEnabled()) {\n                return\n            };\n            ta = false;\n            tb();\n            ob();\n        },\n        enable: function() {\n            if (yb.isEnabled()) {\n                return\n            };\n            ta = true;\n            tb();\n            pb();\n            qb.defer();\n        },\n        forceEnsureLoaded: function() {\n            if (xa) {\n                return\n            };\n            if (qa(\"pagelet_sidebar\")) {\n                return\n            };\n            d([\"UIPagelet\",], function(zb) {\n                var ac = aa.div({\n                    id: \"pagelet_sidebar\"\n                });\n                v.appendContent(document.body, ac);\n                zb.loadFromEndpoint(\"SidebarPagelet\", \"pagelet_sidebar\");\n            });\n            xa = true;\n        },\n        ensureLoaded: function() {\n            if (!ta) {\n                return\n            };\n            yb.forceEnsureLoaded();\n        },\n        hide: function() {\n            if (ua) {\n                return\n            };\n            ua = true;\n            ob();\n        },\n        unhide: function() {\n            if (!ua) {\n                return\n            };\n            ua = false;\n            pb();\n        },\n        getBody: function() {\n            return sa;\n        },\n        getRoot: function() {\n            return ab;\n        },\n        getVisibleWidth: function() {\n            if ((!va || !ab)) {\n                return 0\n            };\n            if ((eb === null)) {\n                eb = ab.offsetWidth;\n            };\n            return eb;\n        },\n        isEnabled: function() {\n            return ta;\n        },\n        isViewportCapable: function() {\n            db = w.getViewportWithoutScrollbarDimensions();\n            if (gb) {\n                return true\n            };\n            var zb = o.get(\"sidebar.minimum_width\");\n            return (db.width > zb);\n        },\n        shouldShowSidebar: function() {\n            var zb = yb.isViewportCapable();\n            return (gb || ((((zb && !ua) && ((!vb() || o.get(\"litestand_blended_sidebar\", false)))) && !y.shouldSuppressSidebar())));\n        },\n        isVisible: function() {\n            return va;\n        },\n        resize: pb,\n        toggle: function() {\n            if (gb) {\n                gb.toggle();\n            }\n             else (yb.isEnabled() ? yb.disable() : yb.enable());\n        ;\n        },\n        isLitestandSidebar: function() {\n            return !!gb;\n        }\n    };\n    ja(yb, h);\n    e.exports = yb;\n});\n__d(\"VideoCallingTour\", [\"Arbiter\",\"ArbiterMixin\",\"Chat\",\"ChatSidebar\",\"ChatVisibility\",\"CSS\",\"DOM\",\"PresencePrivacy\",\"Run\",\"Toggler\",\"Vector\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ArbiterMixin\"), i = b(\"Chat\"), j = b(\"ChatSidebar\"), k = b(\"ChatVisibility\"), l = b(\"CSS\"), m = b(\"DOM\"), n = b(\"PresencePrivacy\"), o = b(\"Run\"), p = b(\"Toggler\"), q = b(\"Vector\"), r = b(\"copyProperties\"), s, t, u, v, w = [], x = function() {\n    \n    };\n    function y() {\n        if (j.isVisible()) {\n            z();\n        }\n         else if (u) {\n            aa();\n        }\n    ;\n    };\n    function z() {\n        s.setContext(t.getBody());\n        ba();\n        s.show();\n        ca();\n    };\n    function aa() {\n        if (!v) {\n            v = p.createInstance(u.getRoot());\n        };\n        var fa = m.scry(u.getRoot(), \"div.fbNubFlyout\")[0];\n        if (fa) {\n            s.setContext(fa);\n            ba();\n            s.show();\n            ca();\n        }\n    ;\n    };\n    function ba() {\n        var fa = q.getElementDimensions(s.getContext()).y;\n        s.setOffsetY((fa * 61688));\n        s.updatePosition();\n    };\n    function ca() {\n        if (u) {\n            w.push(u.subscribe(\"hide\", function() {\n                da();\n                if (!j.isVisible()) {\n                    s.hide();\n                };\n            }), u.subscribe(\"show\", function() {\n                s.show();\n            }), u.subscribe(\"resize\", function() {\n                ba();\n                s.updatePosition();\n            }));\n        };\n        w.push(g.subscribe(\"sidebar/show\", z), g.subscribe(\"sidebar/hide\", aa), g.subscribe(\"sidebar/resized\", ba));\n    };\n    function da() {\n        if (v) {\n            v.setSticky(false);\n            v = null;\n        }\n    ;\n    };\n    function ea() {\n        while (w.length) {\n            w.pop().unsubscribe();;\n        };\n        if (u) {\n            da();\n        };\n        s.hide();\n        l.show(\"fbVideoCallingGetStarted\");\n    };\n    r(x, h, {\n        start: function(fa) {\n            s = fa;\n            l.hide(\"fbVideoCallingGetStarted\");\n            k.goOnline(function() {\n                w.push(n.subscribe(\"privacy-user-presence-changed\", ea));\n                o.onLeave(ea);\n                i.openBuddyList();\n                var ga = null;\n                w.push(j.subscribe(\"sidebar/initialized\", function(ha, ia) {\n                    t = ia;\n                    clearTimeout(ga);\n                    ga = y.defer();\n                }), x.subscribe(\"videocallingtour/end\", ea));\n                w.push(g.subscribe(\"buddylist-nub/initialized\", function(ha, ia) {\n                    u = ia;\n                    clearTimeout(ga);\n                    ga = y.defer();\n                }));\n            });\n            x.inform(\"videocallingtour/start\");\n        }\n    });\n    e.exports = x;\n});\n__d(\"ModuleDependencies\", [], function(a, b, c, d, e, f) {\n    function g(k, l, m) {\n        var n = a.require.__debug.modules[m], o = a.require.__debug.deps;\n        if (l[m]) {\n            return\n        };\n        l[m] = true;\n        if (!n) {\n            (o[m] && (k[m] = true));\n            return;\n        }\n    ;\n        if ((!n.dependencies || !n.dependencies.length)) {\n            if (n.waiting) {\n                k[m] = true;\n            };\n            return;\n        }\n    ;\n        n.dependencies.forEach(function(p) {\n            g(k, l, p);\n        });\n    };\n    function h(k) {\n        if (a.require.__debug) {\n            var l = {\n            };\n            g(l, {\n            }, k);\n            var m = Object.keys(l);\n            m.sort();\n            return m;\n        }\n    ;\n        return null;\n    };\n    function i() {\n        var k = {\n            loading: {\n            },\n            missing: []\n        };\n        if (!a.require.__debug) {\n            return k\n        };\n        var l = {\n        }, m = a.require.__debug.modules, n = a.require.__debug.deps;\n        for (var o in m) {\n            var p = m[o];\n            if (p.waiting) {\n                var q = {\n                };\n                g(q, {\n                }, p.id);\n                delete q[p.id];\n                k.loading[p.id] = Object.keys(q);\n                k.loading[p.id].sort();\n                k.loading[p.id].forEach(function(r) {\n                    if ((!((r in m)) && n[r])) {\n                        l[r] = 1;\n                    };\n                });\n            }\n        ;\n        };\n        k.missing = Object.keys(l);\n        k.missing.sort();\n        return k;\n    };\n    var j = {\n        getMissing: h,\n        getNotLoadedModules: i\n    };\n    e.exports = j;\n});\n__d(\"ChatPeopleSuggestionList.react\", [\"ChatSidebarItem.react\",\"fbt\",\"React\",\"ShortProfiles\",\"PresenceStatus\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"ChatSidebarItem.react\"), h = b(\"fbt\"), i = b(\"React\"), j = b(\"ShortProfiles\"), k = b(\"PresenceStatus\"), l = b(\"cx\"), m = i.createClass({\n        displayName: \"ChatPeopleSuggestionList\",\n        _renderPeopleList: function() {\n            var n = [];\n            this.props.uids.map(function(o) {\n                var p = j.getNow(o);\n                if (p) {\n                    n.push(i.DOM.li(null, g({\n                        isAdded: false,\n                        showEditButton: true,\n                        images: p.thumbSrc,\n                        name: p.name,\n                        status: k.get(o),\n                        onClick: this.props.onClick.curry(o)\n                    })));\n                };\n            }.bind(this));\n            return n;\n        },\n        render: function() {\n            return (i.DOM.div(null, i.DOM.div({\n                className: \"_57zm\"\n            }, i.DOM.span({\n                className: \"_57zn\"\n            }, \"SUGGESTIONS\")), i.DOM.ul({\n                className: \"_56ym\"\n            }, this._renderPeopleList())));\n        }\n    });\n    e.exports = m;\n});\n__d(\"Dock\", [\"function-extensions\",\"Event\",\"shield\",\"WebMessengerWidthControl\",\"Arbiter\",\"ArbiterMixin\",\"ChatQuietLinks\",\"CSS\",\"DataStore\",\"DOM\",\"Parent\",\"Style\",\"Toggler\",\"Vector\",\"copyProperties\",\"csx\",\"emptyFunction\",\"ge\",], function(a, b, c, d, e, f) {\n    b(\"function-extensions\");\n    var g = b(\"Event\"), h = b(\"shield\");\n    b(\"WebMessengerWidthControl\");\n    var i = b(\"Arbiter\"), j = b(\"ArbiterMixin\"), k = b(\"ChatQuietLinks\"), l = b(\"CSS\"), m = b(\"DataStore\"), n = b(\"DOM\"), o = b(\"Parent\"), p = b(\"Style\"), q = b(\"Toggler\"), r = b(\"Vector\"), s = b(\"copyProperties\"), t = b(\"csx\"), u = b(\"emptyFunction\"), v = b(\"ge\");\n    function w() {\n    \n    };\n    s(w, j, {\n        MIN_HEIGHT: 140,\n        INITIAL_FLYOUT_HEIGHT_OFFSET: 10,\n        init: function(x) {\n            this.init = u;\n            this.rootEl = x;\n            this.calculateViewportDimensions();\n            this.calculateFlyoutHeightOffset();\n            k.removeEmptyHrefs(this.rootEl);\n            g.listen(x, \"click\", this._onClick.bind(this));\n            g.listen(window, \"resize\", this._onWindowResize.bind(this));\n            q.subscribe([\"show\",\"hide\",], function(y, z) {\n                var aa = z.getActive();\n                if (!n.contains(x, aa)) {\n                    return\n                };\n                if (l.hasClass(aa, \"fbNub\")) {\n                    this.notifyNub(aa, y);\n                    if ((y === \"show\")) {\n                        this._resizeNubFlyout(aa);\n                    };\n                }\n                 else {\n                    var ba = o.byClass(aa, \"fbNubFlyout\");\n                    if (ba) {\n                        l.conditionClass(ba, \"menuOpened\", (y === \"show\"));\n                    };\n                }\n            ;\n            }.bind(this));\n            this.inform(\"init\", {\n            }, i.BEHAVIOR_PERSISTENT);\n        },\n        calculateViewportDimensions: function() {\n            return (this.viewportDimensions = r.getViewportDimensions());\n        },\n        calculateFlyoutHeightOffset: function() {\n            this.flyoutHeightOffset = (this.INITIAL_FLYOUT_HEIGHT_OFFSET + r.getElementDimensions(this.rootEl).y);\n            var x = v(\"blueBar\");\n            if (x) {\n                var y = (p.isFixed(x) ? \"viewport\" : \"document\");\n                this.flyoutHeightOffset += (r.getElementPosition(x, y).y + r.getElementDimensions(x).y);\n            }\n        ;\n        },\n        toggle: function(x) {\n            var y = this._findFlyout(x);\n            if (!y) {\n                return\n            };\n            this.subscribe(\"init\", function() {\n                q.toggle(x);\n            });\n        },\n        show: function(x) {\n            this.subscribe(\"init\", function() {\n                q.show(x);\n            });\n        },\n        showNub: function(x) {\n            l.show(x);\n        },\n        hide: function(x) {\n            this.subscribe(\"init\", function() {\n                var y = q.getInstance(x);\n                (n.contains(x, y.getActive()) && y.hide());\n            });\n        },\n        hideNub: function(x) {\n            l.hide(x);\n            this.hide(x);\n        },\n        setUseMaxHeight: function(x, y) {\n            l.conditionClass(x, \"maxHeight\", (y !== false));\n            this._resizeNubFlyout(x);\n        },\n        _resizeNubFlyout: function(x) {\n            var y = this._findFlyout(x);\n            if ((!y || !((l.hasClass(x, \"openToggler\") || l.hasClass(x, \"opened\"))))) {\n                return\n            };\n            var z = n.find(y, \"div.fbNubFlyoutOuter\"), aa = n.find(z, \"div.fbNubFlyoutInner\"), ba = n.find(aa, \"div.fbNubFlyoutBody\"), ca = ba.scrollTop, da = ba.offsetHeight;\n            p.set(ba, \"height\", \"auto\");\n            var ea = r.getElementDimensions(y), fa = r.getElementDimensions(ba), ga = this.getMaxFlyoutHeight(x);\n            p.set(y, \"max-height\", (ga + \"px\"));\n            p.set(z, \"max-height\", (ga + \"px\"));\n            ea = r.getElementDimensions(y);\n            var ha = r.getElementDimensions(aa), ia = (ha.y - fa.y), ja = (ea.y - ia), ka = parseInt((ba.style.height || ba.clientHeight), 10), la = (ja !== ka);\n            if (((ea.y > ia) && la)) {\n                p.set(ba, \"height\", (ja + \"px\"));\n            };\n            l.removeClass(y, \"swapDirection\");\n            var ma = r.getElementPosition(y).x;\n            l.conditionClass(y, \"swapDirection\", function() {\n                if ((ma < 0)) {\n                    return true\n                };\n                return (((ma + ea.x) > this.viewportDimensions.x));\n            }.bind(this)());\n            if ((la && ((ca + da) >= fa.y))) {\n                ba.scrollTop = ba.scrollHeight;\n            }\n             else ba.scrollTop = ca;\n        ;\n            this.notifyNub(x, \"resize\");\n        },\n        getMaxFlyoutHeight: function(x) {\n            var y = this._findFlyout(x), z = r.getElementPosition(y, \"viewport\"), aa = r.getElementDimensions(y), ba = (Math.max(this.MIN_HEIGHT, (this.viewportDimensions.y - this.flyoutHeightOffset)) - (((this.viewportDimensions.y - z.y) - aa.y)));\n            return Math.max(ba, 0);\n        },\n        resizeAllFlyouts: function() {\n            var x = n.scry(this.rootEl, \"div._50-v.openToggler\");\n            x = x.concat(n.scry(this.rootEl, \"div._50-v.opened\"));\n            var y = x.length;\n            while (y--) {\n                this._resizeNubFlyout(x[y]);;\n            };\n        },\n        _onClick: function(event) {\n            var x = event.getTarget(), y = o.byClass(x, \"fbNub\");\n            if (y) {\n                if (o.byClass(x, \"fbNubFlyoutTitlebar\")) {\n                    var z = o.byTag(x, \"a\"), aa = ((x.nodeName == \"INPUT\") && (x.getAttribute(\"type\") == \"submit\"));\n                    if ((!z && !aa)) {\n                        this.hide(y);\n                        return false;\n                    }\n                ;\n                }\n            ;\n                this.notifyNub(y, \"click\");\n            }\n        ;\n        },\n        _onWindowResize: function(event) {\n            this.calculateViewportDimensions();\n            this.resizeAllFlyouts();\n        },\n        _findFlyout: function(x) {\n            return (l.hasClass(x, \"fbNubFlyout\") ? x : (n.scry(x, \"div.fbNubFlyout\")[0] || null));\n        },\n        registerNubController: function(x, y) {\n            m.set(x, \"dock:nub:controller\", y);\n            y.subscribe(\"nub/button/content-changed\", h(this.inform, this, \"resize\", x));\n            y.subscribe(\"nub/flyout/content-changed\", h(this._resizeNubFlyout, this, x));\n        },\n        unregisterNubController: function(x) {\n            m.remove(x, \"dock:nub:controller\");\n        },\n        notifyNub: function(x, y, z) {\n            var aa = m.get(x, \"dock:nub:controller\");\n            (aa && aa.inform(y, z));\n        }\n    });\n    e.exports = (a.Dock || w);\n});\n__d(\"NubController\", [\"ArbiterMixin\",\"Dock\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"ArbiterMixin\"), h = b(\"Dock\"), i = b(\"copyProperties\");\n    function j() {\n    \n    };\n    i(j.prototype, g, {\n        init: function(k) {\n            this.el = k;\n            h.registerNubController(k, this);\n            return this;\n        },\n        buttonContentChanged: function() {\n            this.inform(\"nub/button/content-changed\");\n        },\n        flyoutContentChanged: function() {\n            this.inform(\"nub/flyout/content-changed\");\n        },\n        hide: function() {\n            h.hide(this.el);\n        },\n        show: function() {\n            h.show(this.el);\n        }\n    });\n    e.exports = j;\n});\n__d(\"DropdownContextualHelpLink\", [\"DOM\",\"ge\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOM\"), h = b(\"ge\"), i = {\n        set: function(j) {\n            var k = h(\"navHelpCenter\");\n            if ((k !== null)) {\n                g.replace(k, j);\n            };\n        }\n    };\n    e.exports = i;\n});\n__d(\"ChatActivity\", [\"Event\",\"Arbiter\",\"AvailableList\",\"AvailableListConstants\",\"JSLogger\",\"MercuryConfig\",\"PresenceState\",\"UserActivity\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"Arbiter\"), i = b(\"AvailableList\"), j = b(\"AvailableListConstants\"), k = b(\"JSLogger\"), l = b(\"MercuryConfig\"), m = b(\"PresenceState\"), n = b(\"UserActivity\"), o = b(\"copyProperties\"), p = (l.activity_limit || 60000), q = (l.idle_limit || 1800000), r = (l.idle_poll_interval || 300000), s = k.create(\"chat_activity\"), t = Date.now(), u = t, v = true;\n    function w() {\n        var aa = Date.now();\n        return !!((v && (((aa - t) < p))));\n    };\n    var x = o(new h(), {\n        isActive: w\n    });\n    function y() {\n        var aa = t;\n        t = Date.now();\n        if (((t - aa) > q)) {\n            s.debug(\"idle_to_active\", aa);\n            m.doSync();\n        }\n    ;\n        x.inform(\"activity\");\n    };\n    i.subscribe(j.ON_AVAILABILITY_CHANGED, function() {\n        if (!i.isUserIdle()) {\n            u = Date.now();\n        };\n    });\n    g.listen(window, \"focus\", function() {\n        v = true;\n        y();\n    });\n    g.listen(window, \"blur\", function() {\n        v = false;\n    });\n    n.subscribe(function() {\n        y();\n    });\n    function z(aa) {\n        var ba = ((aa && aa.at) && m.verifyNumber(aa.at));\n        if ((typeof ba !== \"number\")) {\n            ba = null;\n        };\n        return (ba || 0);\n    };\n    setInterval(function() {\n        var aa = Date.now(), ba = z(m.get()), ca = Math.max(t, ba, u);\n        if (((aa - ca) > q)) {\n            s.debug(\"idle\", {\n                cookie: ba,\n                local: t,\n                presence: u\n            });\n            x.inform(\"idle\", (aa - ca));\n        }\n    ;\n    }, r);\n    m.registerStateStorer(function(aa) {\n        var ba = z(aa);\n        if ((ba < t)) {\n            aa.at = t;\n        };\n        return aa;\n    });\n    h.subscribe(k.DUMP_EVENT, function(aa, ba) {\n        ba.chat_activity = {\n            activity_limit: p,\n            idle_limit: q,\n            idle_poll_interval: r,\n            last_active_time: t,\n            last_global_active_time: u\n        };\n    });\n    e.exports = x;\n});\n__d(\"MercuryNotificationRenderer\", [\"MercuryAssert\",\"MercuryMessages\",\"MercuryParticipants\",\"MercuryThreads\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"MercuryAssert\"), h = b(\"MercuryMessages\").get(), i = b(\"MercuryParticipants\"), j = b(\"MercuryThreads\").get(), k = b(\"tx\");\n    function l(m, n) {\n        g.isThreadID(m);\n        j.getThreadMeta(m, function(o) {\n            h.getThreadMessagesRange(m, 0, 1, function(p) {\n                var q = (p.length && p[(p.length - 1)]);\n                if ((q && (q.author != i.user))) {\n                    i.get(q.author, function(r) {\n                        if (o.name) {\n                            n(k._(\"{senderName} messaged {groupName}\", {\n                                senderName: r.short_name,\n                                groupName: o.name\n                            }));\n                        }\n                         else n(k._(\"{name} messaged you\", {\n                            name: r.short_name\n                        }));\n                    ;\n                    });\n                }\n                 else n(\"New message!\");\n            ;\n            });\n        });\n    };\n    e.exports = {\n        renderDocumentTitle: l\n    };\n});\n__d(\"MercuryTimestampTracker\", [\"MercuryActionTypeConstants\",\"MercuryPayloadSource\",\"MercurySingletonMixin\",\"MercuryServerRequests\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"MercuryActionTypeConstants\"), h = b(\"MercuryPayloadSource\"), i = b(\"MercurySingletonMixin\"), j = b(\"MercuryServerRequests\"), k = b(\"copyProperties\");\n    function l(m) {\n        this._fbid = m;\n        this._serverRequests = j.getForFBID(this._fbid);\n        this._lastTimestamp = 0;\n        this._serverRequests.subscribe(\"update-messages\", function(n, o) {\n            if ((!o.actions || !o.actions.length)) {\n                return\n            };\n            if (((o.payload_source == h.CLIENT_SEND_MESSAGE) || (o.payload_source == h.UNKNOWN))) {\n                return\n            };\n            for (var p = 0; (p < o.actions.length); p++) {\n                var q = o.actions[p], r = q.action_type;\n                if ((((r == g.USER_GENERATED_MESSAGE) && q.thread_id) && (q.timestamp > this._lastTimestamp))) {\n                    this._lastTimestamp = q.timestamp;\n                };\n            };\n        }.bind(this));\n    };\n    k(l.prototype, {\n        getLastUserMessageTimestamp: function() {\n            return this._lastTimestamp;\n        }\n    });\n    k(l, i);\n    e.exports = l;\n});\n__d(\"ChatTitleBarBlinker\", [\"ChatActivity\",\"DocumentTitle\",\"JSLogger\",\"MercuryThreadInformer\",\"MercuryNotificationRenderer\",\"PresenceState\",\"MercuryTimestampTracker\",], function(a, b, c, d, e, f) {\n    var g = b(\"ChatActivity\"), h = b(\"DocumentTitle\"), i = b(\"JSLogger\"), j = b(\"MercuryThreadInformer\").get(), k = b(\"MercuryNotificationRenderer\"), l = b(\"PresenceState\"), m = b(\"MercuryTimestampTracker\").get(), n = i.create(\"chat_title\"), o = null, p = 0, q = false;\n    function r() {\n        if (o) {\n            o.stop();\n            o = null;\n            return true;\n        }\n    ;\n        return false;\n    };\n    function s(x) {\n        var y = (x || m.getLastUserMessageTimestamp());\n        if ((p <= y)) {\n            p = y;\n            if ((r() || q)) {\n                l.doSync();\n            };\n        }\n    ;\n    };\n    var t = {\n        blink: function(x, y) {\n            if ((!o && (p < y))) {\n                k.renderDocumentTitle(x, function(z) {\n                    if (!o) {\n                        o = h.blink(z);\n                    };\n                });\n            };\n        },\n        stopBlinking: function() {\n            s();\n        },\n        blinkingElsewhere: function() {\n            q = true;\n        }\n    };\n    function u(x) {\n        var y = l.verifyNumber(x.sb2);\n        if ((!y || (y <= p))) {\n            return null\n        };\n        return y;\n    };\n    function v(x) {\n        var y = (x && u(x));\n        if (y) {\n            p = y;\n            n.debug(\"load\", p);\n            r();\n            q = false;\n        }\n    ;\n    };\n    function w(x) {\n        var y = u(x);\n        if (!y) {\n            n.debug(\"store\", p);\n            x.sb2 = p;\n            q = false;\n        }\n    ;\n        return x;\n    };\n    l.registerStateStorer(w);\n    l.registerStateLoader(v);\n    j.subscribe(\"thread-read-changed\", function(x, y) {\n        var z = m.getLastUserMessageTimestamp(), aa = 0;\n        for (var ba in y) {\n            if (((y[ba].mark_as_read && (y[ba].timestamp >= z)) && (y[ba].timestamp > aa))) {\n                aa = y[ba].timestamp;\n            };\n        };\n        (aa && s(aa));\n    });\n    g.subscribe(\"activity\", function() {\n        s();\n    });\n    (function() {\n        var x = l.getInitial();\n        if (x) {\n            p = (u(x) || 0);\n        };\n    })();\n    e.exports = t;\n});\n__d(\"swfobject\", [\"AsyncRequest\",\"Bootloader\",\"ControlledReferer\",\"copyProperties\",\"CSS\",\"DOM\",\"function-extensions\",\"ge\",\"htmlSpecialChars\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = b(\"Bootloader\"), i = b(\"ControlledReferer\"), j = b(\"copyProperties\"), k = b(\"CSS\"), l = b(\"DOM\");\n    b(\"function-extensions\");\n    var m = b(\"ge\"), n = b(\"htmlSpecialChars\");\n    if ((typeof o == \"undefined\")) {\n        var o = {\n        }\n    };\n    if ((typeof o.util == \"undefined\")) {\n        o.util = {\n        };\n    };\n    if ((typeof o.SWFObjectUtil == \"undefined\")) {\n        o.SWFObjectUtil = {\n        };\n    };\n    o.SWFObject = function(u, v, w, x, y, z, aa, ba, ca, da) {\n        if (!document.getElementById) {\n            return\n        };\n        this.DETECT_KEY = (da ? da : \"detectflash\");\n        this.skipDetect = o.util.getRequestParameter(this.DETECT_KEY);\n        this.params = {\n        };\n        this.variables = {\n        };\n        this.attributes = [];\n        this.fallback_html = \"\";\n        this.fallback_js_fcn = function() {\n        \n        };\n        if (u) {\n            this.setAttribute(\"swf\", u);\n        };\n        if (v) {\n            this.setAttribute(\"id\", v);\n        };\n        if (w) {\n            this.setAttribute(\"width\", w);\n        };\n        if (x) {\n            this.setAttribute(\"height\", x);\n        };\n        this.installedVer = o.SWFObjectUtil.getPlayerVersion();\n        if (y) {\n            if (!((y instanceof Array))) {\n                y = [y,];\n            };\n            var ea;\n            y.forEach(function(ha) {\n                ea = new o.PlayerVersion(ha.toString().split(\".\"));\n                if ((ea.major == this.installedVer.major)) {\n                    this.setAttribute(\"version\", ea);\n                    return;\n                }\n                 else if ((!this.getAttribute(\"version\") || (ea.major < this.getAttribute(\"version\").major))) {\n                    this.setAttribute(\"version\", ea);\n                }\n            ;\n            }.bind(this));\n        }\n    ;\n        if (((!window.opera && document.all) && (this.installedVer.major > 7))) {\n            if (!o.unloadSet) {\n                o.SWFObjectUtil.prepUnload = function() {\n                    var ha = function() {\n                    \n                    }, ia = function() {\n                    \n                    };\n                    window.attachEvent(\"onunload\", o.SWFObjectUtil.cleanupSWFs);\n                };\n                window.attachEvent(\"onbeforeunload\", o.SWFObjectUtil.prepUnload);\n                o.unloadSet = true;\n            }\n        \n        };\n        if (z) {\n            this.addParam(\"bgcolor\", z);\n        };\n        var fa = (aa ? aa : \"high\");\n        this.addParam(\"quality\", fa);\n        this.setAttribute(\"useExpressInstall\", false);\n        this.setAttribute(\"doExpressInstall\", false);\n        var ga = ((ba) ? ba : window.location);\n        this.setAttribute(\"xiRedirectUrl\", ga);\n        this.setAttribute(\"redirectUrl\", \"\");\n        if (ca) {\n            this.setAttribute(\"redirectUrl\", ca);\n        };\n        this.setAttribute(\"useIframe\", false);\n    };\n    o.SWFObject.ieWorkaroundApplied = false;\n    o.SWFObject.ensureIEWorkaroundAttached = function() {\n        if ((!o.SWFObject.ieWorkaroundApplied && document.attachEvent)) {\n            o.SWFObject.ieWorkaroundApplied = true;\n            document.attachEvent(\"onpropertychange\", o.SWFObject.onDocumentPropertyChange);\n        }\n    ;\n    };\n    o.SWFObject.onDocumentPropertyChange = function(event) {\n        if ((event.propertyName == \"title\")) {\n            var u = document.title;\n            if (((u != null) && (u.indexOf(\"#!\") != -1))) {\n                u = u.substring(0, u.indexOf(\"#!\"));\n                document.title = u;\n            }\n        ;\n        }\n    ;\n    };\n    j(o.SWFObject.prototype, {\n        useExpressInstall: function(u) {\n            this.xiSWFPath = (!u ? \"/swf/expressinstall.swf\" : u);\n            this.setAttribute(\"useExpressInstall\", true);\n        },\n        setAttribute: function(u, v) {\n            this.attributes[u] = v;\n        },\n        getAttribute: function(u) {\n            return (this.attributes[u] || \"\");\n        },\n        addParam: function(u, v) {\n            this.params[u] = v;\n        },\n        getParams: function() {\n            return this.params;\n        },\n        addVariable: function(u, v) {\n            this.variables[u] = v;\n        },\n        getVariable: function(u) {\n            return (this.variables[u] || \"\");\n        },\n        getVariables: function() {\n            return this.variables;\n        },\n        getVariablePairs: function() {\n            var u = [], v, w = this.getVariables();\n            for (v in w) {\n                u[u.length] = ((v + \"=\") + w[v]);;\n            };\n            return u.join(\"&\");\n        },\n        getSWFHTML: function() {\n            var u, v, w;\n            if (((navigator.plugins && navigator.mimeTypes) && navigator.mimeTypes.length)) {\n                if (this.getAttribute(\"doExpressInstall\")) {\n                    this.addVariable(\"MMplayerType\", \"PlugIn\");\n                    this.setAttribute(\"swf\", this.xiSWFPath);\n                }\n            ;\n                v = {\n                    type: \"application/x-shockwave-flash\",\n                    src: this.getAttribute(\"swf\"),\n                    width: this.getAttribute(\"width\"),\n                    height: this.getAttribute(\"height\"),\n                    style: (this.getAttribute(\"style\") || \"display: block;\"),\n                    id: this.getAttribute(\"id\"),\n                    name: this.getAttribute(\"id\")\n                };\n                var x = this.getParams();\n                for (var y in x) {\n                    v[y] = x[y];;\n                };\n                w = this.getVariablePairs();\n                if (w) {\n                    v.flashvars = w;\n                };\n                u = t(\"embed\", v, null);\n            }\n             else {\n                if (this.getAttribute(\"doExpressInstall\")) {\n                    this.addVariable(\"MMplayerType\", \"ActiveX\");\n                    this.setAttribute(\"swf\", this.xiSWFPath);\n                }\n            ;\n                v = {\n                    id: this.getAttribute(\"id\"),\n                    classid: \"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\",\n                    width: this.getAttribute(\"width\"),\n                    height: this.getAttribute(\"height\"),\n                    style: (this.getAttribute(\"style\") || \"display: block;\")\n                };\n                var z = t(\"param\", {\n                    name: \"movie\",\n                    value: this.getAttribute(\"swf\")\n                }, null), x = this.getParams();\n                for (var y in x) {\n                    z += t(\"param\", {\n                        name: y,\n                        value: x[y]\n                    }, null);;\n                };\n                w = this.getVariablePairs();\n                if (w) {\n                    z += t(\"param\", {\n                        name: \"flashvars\",\n                        value: w\n                    }, null);\n                };\n                u = t(\"object\", v, z);\n            }\n        ;\n            return u;\n        },\n        write: function(u) {\n            if (this.getAttribute(\"useExpressInstall\")) {\n                var v = new o.PlayerVersion([6,0,65,]);\n                if ((this.installedVer.versionIsValid(v) && !this.installedVer.versionIsValid(this.getAttribute(\"version\")))) {\n                    this.setAttribute(\"doExpressInstall\", true);\n                    this.addVariable(\"MMredirectURL\", escape(this.getAttribute(\"xiRedirectUrl\")));\n                    document.title = (document.title.slice(0, 47) + \" - Flash Player Installation\");\n                    this.addVariable(\"MMdoctitle\", document.title);\n                }\n            ;\n            }\n        ;\n            var w = (((typeof u == \"string\")) ? document.getElementById(u) : u);\n            if (!w) {\n                return false\n            };\n            k.addClass(w, \"swfObject\");\n            w.setAttribute(\"data-swfid\", this.getAttribute(\"id\"));\n            if (((this.skipDetect || this.getAttribute(\"doExpressInstall\")) || this.installedVer.versionIsValid(this.getAttribute(\"version\")))) {\n                if (!this.getAttribute(\"useIframe\")) {\n                    o.SWFObject.ensureIEWorkaroundAttached();\n                    w.innerHTML = this.getSWFHTML();\n                }\n                 else this._createIframe(w);\n            ;\n                return true;\n            }\n             else {\n                if ((this.getAttribute(\"redirectUrl\") != \"\")) {\n                    document.location.replace(this.getAttribute(\"redirectUrl\"));\n                };\n                var x = ((((((this.getAttribute(\"version\").major + \".\") + this.getAttribute(\"version\").minor) + \".\") + this.getAttribute(\"version\").release) + \".\") + this.getAttribute(\"version\").build), y = ((((((this.installedVer.major + \".\") + this.installedVer.minor) + \".\") + this.installedVer.release) + \".\") + this.installedVer.build);\n                this.fallback_js_fcn(y, x);\n                w.innerHTML = this.fallback_html;\n            }\n        ;\n            return false;\n        },\n        _createIframe: function(u) {\n            var v = l.create(\"iframe\", {\n                width: this.getAttribute(\"width\"),\n                height: this.getAttribute(\"height\"),\n                frameBorder: 0\n            });\n            l.empty(u);\n            u.appendChild(v);\n            i.useFacebookRefererHtml(v, this.getSWFHTML(), this.getAttribute(\"iframeSource\"));\n        }\n    });\n    o.SWFObjectUtil.getPlayerVersion = function() {\n        var u = new o.PlayerVersion([0,0,0,0,]), v;\n        if ((navigator.plugins && navigator.mimeTypes.length)) {\n            for (var w = 0; (w < navigator.plugins.length); w++) {\n                try {\n                    var y = navigator.plugins[w];\n                    if ((y.name == \"Shockwave Flash\")) {\n                        v = new o.PlayerVersion(y.description.replace(/([a-zA-Z]|\\s)+/, \"\").replace(/(\\s+(r|d)|\\s+b[0-9]+)/, \".\").split(\".\"));\n                        if ((((typeof u == \"undefined\") || (v.major > u.major)) || (((v.major == u.major) && (((v.minor > u.minor) || (((v.minor == u.minor) && (((v.release > u.release) || (((v.release == u.release) && (v.build > u.build))))))))))))) {\n                            u = v;\n                        };\n                    }\n                ;\n                } catch (x) {\n                \n                };\n            };\n        }\n         else if ((navigator.userAgent && (navigator.userAgent.indexOf(\"Windows CE\") >= 0))) {\n            var z = 1, aa = 3;\n            while (z) {\n                try {\n                    aa++;\n                    z = new ActiveXObject((\"ShockwaveFlash.ShockwaveFlash.\" + aa));\n                    u = new o.PlayerVersion([aa,0,0,]);\n                } catch (ba) {\n                    z = null;\n                };\n            };\n        }\n         else {\n            try {\n                var z = new ActiveXObject(\"ShockwaveFlash.ShockwaveFlash.7\");\n            } catch (ca) {\n                try {\n                    var z = new ActiveXObject(\"ShockwaveFlash.ShockwaveFlash.6\");\n                    u = new o.PlayerVersion([6,0,21,]);\n                    z.AllowScriptAccess = \"always\";\n                } catch (da) {\n                    if ((u.major == 6)) {\n                        return u\n                    };\n                };\n                try {\n                    z = new ActiveXObject(\"ShockwaveFlash.ShockwaveFlash\");\n                } catch (ea) {\n                \n                };\n            };\n            if ((z != null)) {\n                u = new o.PlayerVersion(z.GetVariable(\"$version\").split(\" \")[1].split(\",\"));\n            };\n        }\n        \n    ;\n        return u;\n    };\n    o.PlayerVersion = function(u) {\n        this.major = ((u[0] != null) ? parseInt(u[0], 10) : 0);\n        this.minor = ((u[1] != null) ? parseInt(u[1], 10) : 0);\n        this.release = ((u[2] != null) ? parseInt(u[2], 10) : 0);\n        this.build = ((u[3] != null) ? parseInt(u[3], 10) : 0);\n    };\n    o.PlayerVersion.prototype.versionIsValid = function(u) {\n        if ((this.major < u.major)) {\n            return false\n        };\n        if ((this.major > u.major)) {\n            return true\n        };\n        if ((this.minor < u.minor)) {\n            return false\n        };\n        if ((this.minor > u.minor)) {\n            return true\n        };\n        if ((this.release < u.release)) {\n            return false\n        };\n        if ((this.release > u.release)) {\n            return true\n        };\n        if ((this.build < u.build)) {\n            return false\n        };\n        return true;\n    };\n    o.util = {\n        getRequestParameter: function(u) {\n            var v = (document.location.search || document.location.hash);\n            if ((u == null)) {\n                return v\n            };\n            if (v) {\n                var w = v.substring(1).split(\"&\");\n                for (var x = 0; (x < w.length); x++) {\n                    if ((w[x].substring(0, w[x].indexOf(\"=\")) == u)) {\n                        return w[x].substring(((w[x].indexOf(\"=\") + 1)))\n                    };\n                };\n            }\n        ;\n            return \"\";\n        }\n    };\n    o.SWFObjectUtil.cleanupSWFs = function() {\n        var u = document.getElementsByTagName(\"OBJECT\");\n        for (var v = (u.length - 1); (v >= 0); v--) {\n            u[v].style.display = \"none\";\n            for (var w in u[v]) {\n                if ((typeof u[v][w] == \"function\")) {\n                    u[v][w] = function() {\n                    \n                    };\n                };\n            };\n        };\n    };\n    if ((!document.getElementById && document.all)) {\n        document.getElementById = function(u) {\n            return document.all[u];\n        };\n    };\n    var p = o.util.getRequestParameter, q = o.SWFObject, r = o.SWFObject;\n    o.spawn_flash_update_dialog = function() {\n        new g().setURI(\"/ajax/flash_update_dialog.php\").setMethod(\"GET\").setReadOnly(true).send();\n    };\n    function s(u, v) {\n        var w = m(u), x = o.SWFObjectUtil.getPlayerVersion(), y;\n        v.forEach(function(ba) {\n            ba = new o.PlayerVersion(ba.toString().split(\".\"));\n            if ((ba.major == x.major)) {\n                y = ba;\n                return;\n            }\n             else if (((typeof y == \"undefined\") || (ba.major < y.major))) {\n                y = ba;\n            }\n        ;\n        }.bind(this));\n        if ((w && (x.major > 0))) {\n            var z = ((((((x.major + \".\") + x.minor) + \".\") + x.release) + \".\") + x.build), aa = ((((((y.major + \".\") + y.minor) + \".\") + y.release) + \".\") + y.build);\n            l.setContent(w, l.tx._(\"Flash {required-version} is required to view this content. Your current version is {current-version}. Please download the latest Flash Player.\", {\n                \"required-version\": aa,\n                \"current-version\": z\n            }));\n        }\n    ;\n    };\n    o.showFlashErrorDialog = function(u, v) {\n        h.loadModules([\"ErrorDialog\",], function(w) {\n            w.show(u, v);\n        });\n    };\n    function t(u, v, w) {\n        var x = /^[A-Za-z0-9\\-]+$/;\n        if (!u.match(x)) {\n            throw new Error((\"Invalid tag \" + u))\n        };\n        var y = (\"\\u003C\" + u);\n        for (var z in v) {\n            if (!z.match(x)) {\n                throw new Error((\"Invalid attr \" + z))\n            };\n            y += ((((\" \" + z) + \"=\\\"\") + n(v[z])) + \"\\\"\");\n        };\n        if ((w === null)) {\n            return (y + \"/\\u003E\");\n        }\n         else return (((((y + \"\\u003E\") + w) + \"\\u003C/\") + u) + \"\\u003E\")\n    ;\n    };\n    e.exports = (a.deconcept || o);\n});\n__d(\"swfobject2\", [], function(a, b, c, d, e, f) {\n    var g = function() {\n        var h = \"undefined\", i = \"object\", j = \"Shockwave Flash\", k = \"ShockwaveFlash.ShockwaveFlash\", l = \"application/x-shockwave-flash\", m = \"SWFObjectExprInst\", n = \"onreadystatechange\", o = window, p = document, q = navigator, r = false, s = [ka,], t = [], u = [], v = [], w, x, y, z, aa = false, ba = false, ca, da, ea = true, fa = function() {\n            var eb = (((typeof p.getElementById != h) && (typeof p.getElementsByTagName != h)) && (typeof p.createElement != h)), fb = q.userAgent.toLowerCase(), gb = q.platform.toLowerCase(), hb = (gb ? /win/.test(gb) : /win/.test(fb)), ib = (gb ? /mac/.test(gb) : /mac/.test(fb)), jb = (/webkit/.test(fb) ? parseFloat(fb.replace(/^.*webkit\\/(\\d+(\\.\\d+)?).*$/, \"$1\")) : false), kb = !+\"\\u000b1\", lb = [0,0,0,], mb = null;\n            if (((typeof q.plugins != h) && (typeof q.plugins[j] == i))) {\n                mb = q.plugins[j].description;\n                if ((mb && !((((typeof q.mimeTypes != h) && q.mimeTypes[l]) && !q.mimeTypes[l].enabledPlugin)))) {\n                    r = true;\n                    kb = false;\n                    mb = mb.replace(/^.*\\s+(\\S+\\s+\\S+$)/, \"$1\");\n                    lb[0] = parseInt(mb.replace(/^(.*)\\..*$/, \"$1\"), 10);\n                    lb[1] = parseInt(mb.replace(/^.*\\.(.*)\\s.*$/, \"$1\"), 10);\n                    lb[2] = (/[a-zA-Z]/.test(mb) ? parseInt(mb.replace(/^.*[a-zA-Z]+(.*)$/, \"$1\"), 10) : 0);\n                }\n            ;\n            }\n             else if ((typeof o.ActiveXObject != h)) {\n                try {\n                    var ob = new ActiveXObject(k);\n                    if (ob) {\n                        mb = ob.GetVariable(\"$version\");\n                        if (mb) {\n                            kb = true;\n                            mb = mb.split(\" \")[1].split(\",\");\n                            lb = [parseInt(mb[0], 10),parseInt(mb[1], 10),parseInt(mb[2], 10),];\n                        }\n                    ;\n                    }\n                ;\n                } catch (nb) {\n                \n                }\n            }\n        ;\n            return {\n                w3: eb,\n                pv: lb,\n                wk: jb,\n                ie: kb,\n                win: hb,\n                mac: ib\n            };\n        }(), ga = function() {\n            if (!fa.w3) {\n                return\n            };\n            if (((((typeof p.readyState != h) && (p.readyState == \"complete\"))) || (((typeof p.readyState == h) && ((p.getElementsByTagName(\"body\")[0] || p.body)))))) {\n                ha();\n            };\n            if (!aa) {\n                if ((typeof p.addEventListener != h)) {\n                    p.addEventListener(\"DOMContentLoaded\", ha, false);\n                };\n                if ((fa.ie && fa.win)) {\n                    p.attachEvent(n, function() {\n                        if ((p.readyState == \"complete\")) {\n                            p.detachEvent(n, arguments.callee);\n                            ha();\n                        }\n                    ;\n                    });\n                    if ((o == top)) {\n                        (function() {\n                            if (aa) {\n                                return\n                            };\n                            try {\n                                p.documentElement.doScroll(\"left\");\n                            } catch (eb) {\n                                setTimeout(arguments.callee, 0);\n                                return;\n                            };\n                            ha();\n                        })();\n                    };\n                }\n            ;\n                if (fa.wk) {\n                    (function() {\n                        if (aa) {\n                            return\n                        };\n                        if (!/loaded|complete/.test(p.readyState)) {\n                            setTimeout(arguments.callee, 0);\n                            return;\n                        }\n                    ;\n                        ha();\n                    })();\n                };\n                ja(ha);\n            }\n        ;\n        }();\n        function ha() {\n            if (aa) {\n                return\n            };\n            try {\n                var fb = p.getElementsByTagName(\"body\")[0].appendChild(xa(\"span\"));\n                fb.parentNode.removeChild(fb);\n            } catch (eb) {\n                return;\n            };\n            aa = true;\n            var gb = s.length;\n            for (var hb = 0; (hb < gb); hb++) {\n                s[hb]();;\n            };\n        };\n        function ia(eb) {\n            if (aa) {\n                eb();\n            }\n             else s[s.length] = eb;\n        ;\n        };\n        function ja(eb) {\n            if ((typeof o.addEventListener != h)) {\n                o.addEventListener(\"load\", eb, false);\n            }\n             else if ((typeof p.addEventListener != h)) {\n                p.addEventListener(\"load\", eb, false);\n            }\n             else if ((typeof o.attachEvent != h)) {\n                ya(o, \"onload\", eb);\n            }\n             else if ((typeof o.onload == \"function\")) {\n                var fb = o.onload;\n                o.onload = function() {\n                    fb();\n                    eb();\n                };\n            }\n             else o.onload = eb;\n            \n            \n            \n        ;\n        };\n        function ka() {\n            if (r) {\n                la();\n            }\n             else ma();\n        ;\n        };\n        function la() {\n            var eb = p.getElementsByTagName(\"body\")[0], fb = xa(i);\n            fb.setAttribute(\"type\", l);\n            fb.setAttribute(\"style\", \"visibility: hidden; position: absolute; top: -1000px;\");\n            var gb = eb.appendChild(fb);\n            if (gb) {\n                var hb = 0;\n                (function() {\n                    if ((typeof gb.GetVariable != h)) {\n                        var ib = gb.GetVariable(\"$version\");\n                        if (ib) {\n                            ib = ib.split(\" \")[1].split(\",\");\n                            fa.pv = [parseInt(ib[0], 10),parseInt(ib[1], 10),parseInt(ib[2], 10),];\n                        }\n                    ;\n                    }\n                     else if ((hb < 10)) {\n                        hb++;\n                        setTimeout(arguments.callee, 10);\n                        return;\n                    }\n                    \n                ;\n                    gb = null;\n                    ma();\n                })();\n            }\n             else ma();\n        ;\n        };\n        function ma() {\n            var eb = t.length;\n            if ((eb > 0)) {\n                for (var fb = 0; (fb < eb); fb++) {\n                    var gb = t[fb].id, hb = t[fb].callbackFn, ib = {\n                        success: false,\n                        id: gb\n                    };\n                    if ((fa.pv[0] > 0)) {\n                        var jb = wa(gb);\n                        if (jb) {\n                            if ((za(t[fb].swfVersion) && !((fa.wk && (fa.wk < 312))))) {\n                                bb(gb, true);\n                                if (hb) {\n                                    ib.success = true;\n                                    ib.ref = na(gb);\n                                    hb(ib);\n                                }\n                            ;\n                            }\n                             else if ((t[fb].expressInstall && oa())) {\n                                var kb = {\n                                };\n                                kb.data = t[fb].expressInstall;\n                                kb.width = (jb.getAttribute(\"width\") || \"0\");\n                                kb.height = (jb.getAttribute(\"height\") || \"0\");\n                                if (jb.getAttribute(\"class\")) {\n                                    kb.styleclass = jb.getAttribute(\"class\");\n                                };\n                                if (jb.getAttribute(\"align\")) {\n                                    kb.align = jb.getAttribute(\"align\");\n                                };\n                                var lb = {\n                                }, mb = jb.getElementsByTagName(\"param\"), nb = mb.length;\n                                for (var ob = 0; (ob < nb); ob++) {\n                                    if ((mb[ob].getAttribute(\"name\").toLowerCase() != \"movie\")) {\n                                        lb[mb[ob].getAttribute(\"name\")] = mb[ob].getAttribute(\"value\");\n                                    };\n                                };\n                                pa(kb, lb, gb, hb);\n                            }\n                             else {\n                                qa(jb);\n                                if (hb) {\n                                    hb(ib);\n                                };\n                            }\n                            \n                        \n                        };\n                    }\n                     else {\n                        bb(gb, true);\n                        if (hb) {\n                            var pb = na(gb);\n                            if ((pb && (typeof pb.SetVariable != h))) {\n                                ib.success = true;\n                                ib.ref = pb;\n                            }\n                        ;\n                            hb(ib);\n                        }\n                    ;\n                    }\n                ;\n                }\n            };\n        };\n        function na(eb) {\n            var fb = null, gb = wa(eb);\n            if ((gb && (gb.nodeName == \"OBJECT\"))) {\n                if ((typeof gb.SetVariable != h)) {\n                    fb = gb;\n                }\n                 else {\n                    var hb = gb.getElementsByTagName(i)[0];\n                    if (hb) {\n                        fb = hb;\n                    };\n                }\n            \n            };\n            return fb;\n        };\n        function oa() {\n            return (((!ba && za(\"6.0.65\")) && ((fa.win || fa.mac))) && !((fa.wk && (fa.wk < 312))));\n        };\n        function pa(eb, fb, gb, hb) {\n            ba = true;\n            y = (hb || null);\n            z = {\n                success: false,\n                id: gb\n            };\n            var ib = wa(gb);\n            if (ib) {\n                if ((ib.nodeName == \"OBJECT\")) {\n                    w = ra(ib);\n                    x = null;\n                }\n                 else {\n                    w = ib;\n                    x = gb;\n                }\n            ;\n                eb.id = m;\n                if (((typeof eb.width == h) || ((!/%$/.test(eb.width) && (parseInt(eb.width, 10) < 310))))) {\n                    eb.width = \"310\";\n                };\n                if (((typeof eb.height == h) || ((!/%$/.test(eb.height) && (parseInt(eb.height, 10) < 137))))) {\n                    eb.height = \"137\";\n                };\n                p.title = (p.title.slice(0, 47) + \" - Flash Player Installation\");\n                var jb = ((fa.ie && fa.win) ? \"ActiveX\" : \"PlugIn\"), kb = (((((\"MMredirectURL=\" + o.location.toString().replace(/&/g, \"%26\")) + \"&MMplayerType=\") + jb) + \"&MMdoctitle=\") + p.title);\n                if ((typeof fb.flashvars != h)) {\n                    fb.flashvars += (\"&\" + kb);\n                }\n                 else fb.flashvars = kb;\n            ;\n                if (((fa.ie && fa.win) && (ib.readyState != 4))) {\n                    var lb = xa(\"div\");\n                    gb += \"SWFObjectNew\";\n                    lb.setAttribute(\"id\", gb);\n                    ib.parentNode.insertBefore(lb, ib);\n                    ib.style.display = \"none\";\n                    (function() {\n                        if ((ib.readyState == 4)) {\n                            ib.parentNode.removeChild(ib);\n                        }\n                         else setTimeout(arguments.callee, 10);\n                    ;\n                    })();\n                }\n            ;\n                sa(eb, fb, gb);\n            }\n        ;\n        };\n        function qa(eb) {\n            if (((fa.ie && fa.win) && (eb.readyState != 4))) {\n                var fb = xa(\"div\");\n                eb.parentNode.insertBefore(fb, eb);\n                fb.parentNode.replaceChild(ra(eb), fb);\n                eb.style.display = \"none\";\n                (function() {\n                    if ((eb.readyState == 4)) {\n                        eb.parentNode.removeChild(eb);\n                    }\n                     else setTimeout(arguments.callee, 10);\n                ;\n                })();\n            }\n             else eb.parentNode.replaceChild(ra(eb), eb);\n        ;\n        };\n        function ra(eb) {\n            var fb = xa(\"div\");\n            if ((fa.win && fa.ie)) {\n                fb.innerHTML = eb.innerHTML;\n            }\n             else {\n                var gb = eb.getElementsByTagName(i)[0];\n                if (gb) {\n                    var hb = gb.childNodes;\n                    if (hb) {\n                        var ib = hb.length;\n                        for (var jb = 0; (jb < ib); jb++) {\n                            if ((!(((hb[jb].nodeType == 1) && (hb[jb].nodeName == \"PARAM\"))) && !((hb[jb].nodeType == 8)))) {\n                                fb.appendChild(hb[jb].cloneNode(true));\n                            };\n                        };\n                    }\n                ;\n                }\n            ;\n            }\n        ;\n            return fb;\n        };\n        function sa(eb, fb, gb) {\n            var hb, ib = wa(gb);\n            if ((fa.wk && (fa.wk < 312))) {\n                return hb\n            };\n            if (ib) {\n                if ((typeof eb.id == h)) {\n                    eb.id = gb;\n                };\n                if ((fa.ie && fa.win)) {\n                    var jb = \"\";\n                    for (var kb in eb) {\n                        if ((eb[kb] != Object.prototype[kb])) {\n                            if ((kb.toLowerCase() == \"data\")) {\n                                fb.movie = eb[kb];\n                            }\n                             else if ((kb.toLowerCase() == \"styleclass\")) {\n                                jb += ((\" class=\\\"\" + eb[kb]) + \"\\\"\");\n                            }\n                             else if ((kb.toLowerCase() != \"classid\")) {\n                                jb += ((((\" \" + kb) + \"=\\\"\") + eb[kb]) + \"\\\"\");\n                            }\n                            \n                        \n                        };\n                    };\n                    var lb = \"\";\n                    for (var mb in fb) {\n                        if ((fb[mb] != Object.prototype[mb])) {\n                            lb += ((((\"\\u003Cparam name=\\\"\" + mb) + \"\\\" value=\\\"\") + fb[mb]) + \"\\\" /\\u003E\");\n                        };\n                    };\n                    ib.outerHTML = ((((\"\\u003Cobject classid=\\\"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\\\"\" + jb) + \"\\u003E\") + lb) + \"\\u003C/object\\u003E\");\n                    u[u.length] = eb.id;\n                    hb = wa(eb.id);\n                }\n                 else {\n                    var nb = xa(i);\n                    nb.setAttribute(\"type\", l);\n                    for (var ob in eb) {\n                        if ((eb[ob] != Object.prototype[ob])) {\n                            if ((ob.toLowerCase() == \"styleclass\")) {\n                                nb.setAttribute(\"class\", eb[ob]);\n                            }\n                             else if ((ob.toLowerCase() != \"classid\")) {\n                                nb.setAttribute(ob, eb[ob]);\n                            }\n                        \n                        };\n                    };\n                    for (var pb in fb) {\n                        if (((fb[pb] != Object.prototype[pb]) && (pb.toLowerCase() != \"movie\"))) {\n                            ta(nb, pb, fb[pb]);\n                        };\n                    };\n                    ib.parentNode.replaceChild(nb, ib);\n                    hb = nb;\n                }\n            ;\n            }\n        ;\n            return hb;\n        };\n        function ta(eb, fb, gb) {\n            var hb = xa(\"param\");\n            hb.setAttribute(\"name\", fb);\n            hb.setAttribute(\"value\", gb);\n            eb.appendChild(hb);\n        };\n        function ua(eb) {\n            var fb = wa(eb);\n            if ((fb && (fb.nodeName == \"OBJECT\"))) {\n                if ((fa.ie && fa.win)) {\n                    fb.style.display = \"none\";\n                    (function() {\n                        if ((fb.readyState == 4)) {\n                            va(eb);\n                        }\n                         else setTimeout(arguments.callee, 10);\n                    ;\n                    })();\n                }\n                 else fb.parentNode.removeChild(fb);\n            \n            };\n        };\n        function va(eb) {\n            var fb = wa(eb);\n            if (fb) {\n                for (var gb in fb) {\n                    if ((typeof fb[gb] == \"function\")) {\n                        fb[gb] = null;\n                    };\n                };\n                fb.parentNode.removeChild(fb);\n            }\n        ;\n        };\n        function wa(eb) {\n            var fb = null;\n            try {\n                fb = p.getElementById(eb);\n            } catch (gb) {\n            \n            };\n            return fb;\n        };\n        function xa(eb) {\n            return p.createElement(eb);\n        };\n        function ya(eb, fb, gb) {\n            eb.attachEvent(fb, gb);\n            v[v.length] = [eb,fb,gb,];\n        };\n        function za(eb) {\n            var fb = fa.pv, gb = eb.split(\".\");\n            gb[0] = parseInt(gb[0], 10);\n            gb[1] = (parseInt(gb[1], 10) || 0);\n            gb[2] = (parseInt(gb[2], 10) || 0);\n            return (((((fb[0] > gb[0]) || (((fb[0] == gb[0]) && (fb[1] > gb[1])))) || ((((fb[0] == gb[0]) && (fb[1] == gb[1])) && (fb[2] >= gb[2]))))) ? true : false);\n        };\n        function ab(eb, fb, gb, hb) {\n            if ((fa.ie && fa.mac)) {\n                return\n            };\n            var ib = p.getElementsByTagName(\"head\")[0];\n            if (!ib) {\n                return\n            };\n            var jb = (((gb && (typeof gb == \"string\"))) ? gb : \"screen\");\n            if (hb) {\n                ca = null;\n                da = null;\n            }\n        ;\n            if ((!ca || (da != jb))) {\n                var kb = xa(\"style\");\n                kb.setAttribute(\"type\", \"text/css\");\n                kb.setAttribute(\"media\", jb);\n                ca = ib.appendChild(kb);\n                if ((((fa.ie && fa.win) && (typeof p.styleSheets != h)) && (p.styleSheets.length > 0))) {\n                    ca = p.styleSheets[(p.styleSheets.length - 1)];\n                };\n                da = jb;\n            }\n        ;\n            if ((fa.ie && fa.win)) {\n                if ((ca && (typeof ca.addRule == i))) {\n                    ca.addRule(eb, fb);\n                };\n            }\n             else if ((ca && (typeof p.createTextNode != h))) {\n                ca.appendChild(p.createTextNode((((eb + \" {\") + fb) + \"}\")));\n            }\n        ;\n        };\n        function bb(eb, fb) {\n            if (!ea) {\n                return\n            };\n            var gb = (fb ? \"visible\" : \"hidden\");\n            if ((aa && wa(eb))) {\n                wa(eb).style.visibility = gb;\n            }\n             else ab((\"#\" + eb), (\"visibility:\" + gb));\n        ;\n        };\n        function cb(eb) {\n            var fb = /[\\\\\\\"<>\\.;]/, gb = (fb.exec(eb) != null);\n            return ((gb && (typeof encodeURIComponent != h)) ? encodeURIComponent(eb) : eb);\n        };\n        var db = function() {\n            if ((fa.ie && fa.win)) {\n                window.attachEvent(\"onunload\", function() {\n                    var eb = v.length;\n                    for (var fb = 0; (fb < eb); fb++) {\n                        v[fb][0].detachEvent(v[fb][1], v[fb][2]);;\n                    };\n                    var gb = u.length;\n                    for (var hb = 0; (hb < gb); hb++) {\n                        ua(u[hb]);;\n                    };\n                    for (var ib in fa) {\n                        fa[ib] = null;;\n                    };\n                    fa = null;\n                    for (var jb in g) {\n                        g[jb] = null;;\n                    };\n                    g = null;\n                });\n            };\n        }();\n        return {\n            registerObject: function(eb, fb, gb, hb) {\n                if (((fa.w3 && eb) && fb)) {\n                    var ib = {\n                    };\n                    ib.id = eb;\n                    ib.swfVersion = fb;\n                    ib.expressInstall = gb;\n                    ib.callbackFn = hb;\n                    t[t.length] = ib;\n                    bb(eb, false);\n                }\n                 else if (hb) {\n                    hb({\n                        success: false,\n                        id: eb\n                    });\n                }\n            ;\n            },\n            getObjectById: function(eb) {\n                if (fa.w3) {\n                    return na(eb)\n                };\n            },\n            embedSWF: function(eb, fb, gb, hb, ib, jb, kb, lb, mb, nb) {\n                var ob = {\n                    success: false,\n                    id: fb\n                };\n                if (((((((fa.w3 && !((fa.wk && (fa.wk < 312)))) && eb) && fb) && gb) && hb) && ib)) {\n                    bb(fb, false);\n                    ia(function() {\n                        gb += \"\";\n                        hb += \"\";\n                        var pb = {\n                        };\n                        if ((mb && (typeof mb === i))) {\n                            for (var qb in mb) {\n                                pb[qb] = mb[qb];;\n                            }\n                        };\n                        pb.data = eb;\n                        pb.width = gb;\n                        pb.height = hb;\n                        var rb = {\n                        };\n                        if ((lb && (typeof lb === i))) {\n                            for (var sb in lb) {\n                                rb[sb] = lb[sb];;\n                            }\n                        };\n                        if ((kb && (typeof kb === i))) {\n                            for (var tb in kb) {\n                                if ((typeof rb.flashvars != h)) {\n                                    rb.flashvars += (((\"&\" + tb) + \"=\") + kb[tb]);\n                                }\n                                 else rb.flashvars = ((tb + \"=\") + kb[tb]);\n                            ;\n                            }\n                        };\n                        if (za(ib)) {\n                            var ub = sa(pb, rb, fb);\n                            if ((pb.id == fb)) {\n                                bb(fb, true);\n                            };\n                            ob.success = true;\n                            ob.ref = ub;\n                        }\n                         else if ((jb && oa())) {\n                            pb.data = jb;\n                            pa(pb, rb, fb, nb);\n                            return;\n                        }\n                         else bb(fb, true);\n                        \n                    ;\n                        if (nb) {\n                            nb(ob);\n                        };\n                    });\n                }\n                 else if (nb) {\n                    nb(ob);\n                }\n            ;\n            },\n            switchOffAutoHideShow: function() {\n                ea = false;\n            },\n            ua: fa,\n            getFlashPlayerVersion: function() {\n                return {\n                    major: fa.pv[0],\n                    minor: fa.pv[1],\n                    release: fa.pv[2]\n                };\n            },\n            hasFlashPlayerVersion: za,\n            createSWF: function(eb, fb, gb) {\n                if (fa.w3) {\n                    return sa(eb, fb, gb);\n                }\n                 else return undefined\n            ;\n            },\n            showExpressInstall: function(eb, fb, gb, hb) {\n                if ((fa.w3 && oa())) {\n                    pa(eb, fb, gb, hb);\n                };\n            },\n            removeSWF: function(eb) {\n                if (fa.w3) {\n                    ua(eb);\n                };\n            },\n            createCSS: function(eb, fb, gb, hb) {\n                if (fa.w3) {\n                    ab(eb, fb, gb, hb);\n                };\n            },\n            addDomLoadEvent: ia,\n            addLoadEvent: ja,\n            getQueryParamValue: function(eb) {\n                var fb = (p.location.search || p.location.hash);\n                if (fb) {\n                    if (/\\?/.test(fb)) {\n                        fb = fb.split(\"?\")[1];\n                    };\n                    if ((eb == null)) {\n                        return cb(fb)\n                    };\n                    var gb = fb.split(\"&\");\n                    for (var hb = 0; (hb < gb.length); hb++) {\n                        if ((gb[hb].substring(0, gb[hb].indexOf(\"=\")) == eb)) {\n                            return cb(gb[hb].substring(((gb[hb].indexOf(\"=\") + 1))))\n                        };\n                    };\n                }\n            ;\n                return \"\";\n            },\n            expressInstallCallback: function() {\n                if (ba) {\n                    var eb = wa(m);\n                    if ((eb && w)) {\n                        eb.parentNode.replaceChild(w, eb);\n                        if (x) {\n                            bb(x, true);\n                            if ((fa.ie && fa.win)) {\n                                w.style.display = \"block\";\n                            };\n                        }\n                    ;\n                        if (y) {\n                            y(z);\n                        };\n                    }\n                ;\n                    ba = false;\n                }\n            ;\n            }\n        };\n    }();\n    e.exports = g;\n});\n__d(\"SoundPlayer\", [\"Arbiter\",\"ChatConfig\",\"swfobject\",\"swfobject2\",\"URI\",\"createArrayFrom\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ChatConfig\"), i = b(\"swfobject\").SWFObject, j = b(\"swfobject2\"), k = b(\"URI\"), l = b(\"createArrayFrom\"), m = {\n    }, n = null, o = false, p = \"so_sound_player\", q = \"/swf/SoundPlayer.swf?v=1\", r = \"10.0.22.87\", s = null, t = h.get(\"sound.useswfobject_2\", false), u = h.get(\"sound.force_flash\", false);\n    function v(da) {\n        var ea = k(da);\n        if (!ea.getDomain()) {\n            return k().setPath(ea.getPath()).toString()\n        };\n        return da;\n    };\n    function w(da) {\n        var ea = k(da).getPath();\n        if (/\\.mp3$/.test(ea)) {\n            return \"audio/mpeg\"\n        };\n        if (/\\.og[ga]$/.test(ea)) {\n            return \"audio/ogg\"\n        };\n        return \"\";\n    };\n    function x() {\n        if ((!s && !u)) {\n            var da = document.createElement(\"audio\");\n            if ((!da || !da.canPlayType)) {\n                return null\n            };\n            da.setAttribute(\"preload\", \"auto\");\n            document.body.appendChild(da);\n            s = da;\n        }\n    ;\n        return s;\n    };\n    function y() {\n        var da = (document[p] || window[p]);\n        if (da) {\n            if ((!da.playSound && da.length)) {\n                da = da[0];\n            }\n        };\n        return ((((da && da.playSound) && da.loopSound)) ? da : null);\n    };\n    function z() {\n        return o;\n    };\n    function aa(da, ea, fa) {\n        n = {\n            path: da,\n            sync: ea,\n            loop: fa\n        };\n    };\n    function ba() {\n        o = true;\n        if (n) {\n            var da = y();\n            if (n.loop) {\n                da.loopSound(n.path, n.sync);\n            }\n             else da.playSound(n.path, n.sync);\n        ;\n        }\n    ;\n    };\n    var ca = {\n        init: function(da) {\n            da = l(da);\n            var ea;\n            for (var fa = 0; (fa < da.length); ++fa) {\n                ea = da[fa];\n                if (m[ea]) {\n                    return\n                };\n            };\n            var ga = x();\n            for (fa = 0; (ga && (fa < da.length)); ++fa) {\n                ea = da[fa];\n                if (ga.canPlayType(ea)) {\n                    m[ea] = true;\n                    return;\n                }\n            ;\n            };\n            m[\"audio/mpeg\"] = true;\n            if (y()) {\n                return\n            };\n            try {\n                g.registerCallback(ba, [\"sound/player_ready\",\"sound/ready\",]);\n                var ia = document.createElement(\"div\");\n                ia.id = \"sound_player_holder\";\n                document.body.appendChild(ia);\n                if (t) {\n                    j.embedSWF(q, ia.id, \"1px\", \"1px\", r, null, {\n                        swf_id: p\n                    }, {\n                        allowscriptaccess: \"always\",\n                        wmode: \"transparent\"\n                    }, null, function(ka) {\n                        window[p] = ka.ref;\n                        g.inform(\"sound/player_ready\");\n                    });\n                }\n                 else {\n                    var ja = new i(q, p, \"1px\", \"1px\", [r,], \"#ffffff\");\n                    ja.addParam(\"allowscriptaccess\", \"always\");\n                    ja.addParam(\"wmode\", \"transparent\");\n                    ja.addVariable(\"swf_id\", p);\n                    ja.fallback_html = \" \";\n                    ja.write(ia.id);\n                    window[p] = ja;\n                    g.inform(\"sound/player_ready\");\n                }\n            ;\n            } catch (ha) {\n            \n            };\n        },\n        play: function(da, ea) {\n            da = l(da);\n            var fa = x(), ga, ha;\n            for (var ia = 0; (fa && (ia < da.length)); ++ia) {\n                ga = da[ia];\n                ha = w(ga);\n                if (!fa.canPlayType(ha)) {\n                    continue;\n                };\n                ca.init([ha,]);\n                fa.src = v(ga);\n                if (ea) {\n                    fa.setAttribute(\"loop\", \"\");\n                }\n                 else fa.removeAttribute(\"loop\");\n            ;\n                fa.play();\n                return;\n            };\n            for (ia = 0; (ia < da.length); ++ia) {\n                ga = v(da[ia]);\n                ha = w(ga);\n                if ((ha != \"audio/mpeg\")) {\n                    continue;\n                };\n                ca.init([ha,]);\n                var ja = y();\n                if (!z()) {\n                    aa(ga, true, ea);\n                    return;\n                }\n                 else if (ja) {\n                    if (ea) {\n                        ja.loopSound(ga, true);\n                    }\n                     else ja.playSound(ga, true);\n                ;\n                    return;\n                }\n                \n            ;\n            };\n        },\n        stop: function(da) {\n            da = l(da);\n            for (var ea = 0; (ea < da.length); ++ea) {\n                var fa = v(da[ea]), ga = x(), ha = y();\n                if ((ga && (ga.src == fa))) {\n                    ga.pause();\n                    ga.src = undefined;\n                }\n                 else (ha && ha.stopSound(fa));\n            ;\n            };\n        }\n    };\n    e.exports = ca;\n});\n__d(\"SoundSynchronizer\", [\"hasArrayNature\",\"SoundPlayer\",\"createArrayFrom\",], function(a, b, c, d, e, f) {\n    var g = b(\"hasArrayNature\"), h = b(\"SoundPlayer\"), i = b(\"createArrayFrom\"), j = \"fb_sounds_playing3\";\n    function k() {\n        if (window.localStorage) {\n            try {\n                var p = window.localStorage[j];\n                if (p) {\n                    p = JSON.parse(p);\n                    if (g(p)) {\n                        return p\n                    };\n                }\n            ;\n            } catch (o) {\n            \n            }\n        };\n        return [];\n    };\n    function l(o) {\n        if (window.localStorage) {\n            var p = k();\n            p.push(o);\n            while ((p.length > 5)) {\n                p.shift();;\n            };\n            try {\n                window.localStorage[j] = JSON.stringify(p);\n            } catch (q) {\n            \n            };\n        }\n    ;\n    };\n    function m(o) {\n        return k().some(function(p) {\n            return (p === o);\n        });\n    };\n    var n = {\n        play: function(o, p, q) {\n            o = i(o);\n            p = (p || ((o[0] + Math.floor((Date.now() / 1000)))));\n            if (m(p)) {\n                return\n            };\n            h.play(o, q);\n            l(p);\n        },\n        isSupported: function() {\n            return !!window.localStorage;\n        }\n    };\n    e.exports = n;\n});\n__d(\"SoundRPC\", [\"Event\",\"SoundSynchronizer\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"SoundSynchronizer\");\n    function i(k, l, m) {\n        h.play(k, l, m);\n    };\n    var j = {\n        playLocal: i,\n        playRemote: function(k, l, m, n) {\n            var o = {\n                paths: l,\n                sync: m,\n                loop: n\n            };\n            k.postMessage(JSON.stringify(o), \"*\");\n        },\n        supportsRPC: function() {\n            return !!window.postMessage;\n        },\n        _listen: function() {\n            g.listen(window, \"message\", function(k) {\n                if (!/\\.facebook.com$/.test(k.origin)) {\n                    return\n                };\n                var l = JSON.parse(k.data);\n                i(l.paths, l.sync, l.loop);\n            });\n        }\n    };\n    e.exports = j;\n});\n__d(\"Sound\", [\"SoundPlayer\",\"SoundRPC\",\"SoundSynchronizer\",\"URI\",\"UserAgent\",], function(a, b, c, d, e, f) {\n    var g = b(\"SoundPlayer\"), h = b(\"SoundRPC\"), i = b(\"SoundSynchronizer\"), j = b(\"URI\"), k = b(\"UserAgent\"), l = null, m = {\n        init: function(q) {\n            if (!l) {\n                g.init(q);\n            };\n        },\n        play: function(q, r, s) {\n            if (l) {\n                h.playRemote(l.contentWindow, q, r, false);\n            }\n             else h.playLocal(q, r, s);\n        ;\n        },\n        stop: function(q) {\n            if (!l) {\n                g.stop(q);\n            };\n        }\n    }, n = new j(location.href);\n    if ((n.getSubdomain() && (n.getSubdomain() !== \"www\"))) {\n        n.setSubdomain(\"www\");\n    };\n    var o = n.getDomain();\n    function p() {\n        if ((k.ie() < 9)) {\n            return false\n        };\n        return (i.isSupported() && h.supportsRPC());\n    };\n    if (((n.isFacebookURI() && (location.host !== o)) && p())) {\n        l = document.createElement(\"iframe\");\n        l.setAttribute(\"src\", ((\"//\" + o) + \"/sound_iframe.php\"));\n        l.style.display = \"none\";\n        document.body.appendChild(l);\n    }\n;\n    e.exports = m;\n});\n__d(\"MercuryBrowserAlerts\", [\"ArbiterMixin\",\"ChatActivity\",\"ChatConfig\",\"ChatOptions\",\"ChatTitleBarBlinker\",\"MercuryParticipants\",\"MercuryThreadMuter\",\"MercuryThreads\",\"MessagingTag\",\"Sound\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"ArbiterMixin\"), h = b(\"ChatActivity\"), i = b(\"ChatConfig\"), j = b(\"ChatOptions\"), k = b(\"ChatTitleBarBlinker\"), l = b(\"MercuryParticipants\"), m = b(\"MercuryThreadMuter\"), n = b(\"MercuryThreads\").get(), o = b(\"MessagingTag\"), p = b(\"Sound\"), q = b(\"copyProperties\");\n    p.init([\"audio/ogg\",\"audio/mpeg\",]);\n    function r(t) {\n        if (j.getSetting(\"sound\")) {\n            p.play([i.get(\"sound.notif_ogg_url\"),i.get(\"sound.notif_mp3_url\"),], t, false);\n        };\n    };\n    var s = {\n        messageReceived: function(t) {\n            if ((((t.author == l.user) || !t.is_unread) || (((t.folder != o.INBOX) && (t.folder != o.ARCHIVED))))) {\n                return\n            };\n            var u = t.thread_id, v = h.isActive();\n            if (v) {\n                var w = false;\n                s.inform(\"before-alert\", {\n                    threadID: u,\n                    cancelAlert: function() {\n                        w = true;\n                    }\n                });\n            }\n        ;\n            n.getThreadMeta(u, function(x) {\n                var y = m.isThreadMuted(x);\n                if (y) {\n                    return\n                };\n                var z = t.timestamp;\n                if (v) {\n                    (!w && r(z));\n                }\n                 else {\n                    k.blink(u, z);\n                    r(z);\n                }\n            ;\n                k.blinkingElsewhere();\n            }.bind(this));\n        }\n    };\n    e.exports = q(s, g);\n});\n__d(\"ActiveXSupport\", [], function(a, b, c, d, e, f) {\n    var g = null, h = {\n        isSupported: function() {\n            if ((g !== null)) {\n                return g\n            };\n            try {\n                g = (!!window.ActiveXObject && !!new ActiveXObject(\"htmlfile\"));\n            } catch (i) {\n                g = false;\n            };\n            return g;\n        }\n    };\n    e.exports = h;\n});\n__d(\"VideoCallSupport\", [\"MercuryConfig\",\"UserAgent\",], function(a, b, c, d, e, f) {\n    var g = b(\"MercuryConfig\"), h = b(\"UserAgent\"), i = {\n        newVCIsSupported: function() {\n            return (g.NewVCGK && (((h.chrome() >= 24) || (h.firefox() >= 22))));\n        }\n    };\n    e.exports = i;\n});\n__d(\"VideoCallRecordMessageDialog\", [\"AsyncDialog\",\"AsyncRequest\",\"Dialog\",\"URI\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncDialog\"), h = b(\"AsyncRequest\"), i = b(\"Dialog\"), j = b(\"URI\"), k = b(\"tx\"), l = {\n        get: function(m, n) {\n            var o = \"Would you like to leave a message?\", p = \"New Message\";\n            return new i().setTitle(k._(\"{firstname} is Unavailable\", {\n                firstname: n\n            })).setBody(o).setButtons([{\n                name: \"record-message\",\n                label: p\n            },i.CANCEL,]).setHandler(function() {\n                var q = j(\"/ajax/messaging/composer.php\").setQueryData({\n                    ids: [m,],\n                    autoloadvideo: true\n                }).toString();\n                g.send(new h(q));\n            });\n        }\n    };\n    e.exports = l;\n});\n__d(\"VideoCallCore\", [\"Event\",\"ActiveXSupport\",\"Arbiter\",\"AsyncRequest\",\"AvailableList\",\"AvailableListConstants\",\"Bootloader\",\"ChannelConstants\",\"Cookie\",\"CSS\",\"Dialog\",\"MercuryConfig\",\"UserAgent\",\"VideoCallSupport\",\"emptyFunction\",\"ge\",\"VideoCallTemplates\",\"ShortProfiles\",\"VideoCallRecordMessageDialog\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"ActiveXSupport\"), i = b(\"Arbiter\"), j = b(\"AsyncRequest\"), k = b(\"AvailableList\"), l = b(\"AvailableListConstants\"), m = b(\"Bootloader\"), n = b(\"ChannelConstants\"), o = b(\"Cookie\"), p = b(\"CSS\"), q = b(\"Dialog\"), r = b(\"MercuryConfig\"), s = b(\"UserAgent\"), t = b(\"VideoCallSupport\"), u = b(\"emptyFunction\"), v = b(\"ge\");\n    b(\"VideoCallTemplates\");\n    var w = [], x = [], y = {\n        isSupported: function() {\n            if (t.newVCIsSupported()) {\n                return true\n            };\n            if (s.windows()) {\n                if (((s.ie() >= 9) && !s.ie64())) {\n                    return h.isSupported();\n                }\n                 else return ((((((s.ie() >= 7) && !s.ie64())) || (s.firefox() >= 3.6)) || (s.chrome() >= 5)) || (s.opera() >= 12))\n            ;\n            }\n             else if ((s.osx() > 10.4)) {\n                return (((((s.firefox() >= 3.6) || (s.chrome() >= 5)) || (s.webkit() >= 500)) || (s.opera() >= 12)))\n            }\n        ;\n            return false;\n        },\n        isInstalled: function() {\n            var ca = false;\n            if (this.isSupported()) {\n                if (z()) {\n                    var da = null;\n                    try {\n                        da = new ActiveXObject(\"SkypeLimited.SkypeWebPlugin\");\n                        ca = !!da;\n                    } catch (ea) {\n                    \n                    };\n                    da = null;\n                }\n                 else {\n                    ca = aa();\n                    if (r.VideoCallingNoJavaGK) {\n                        if ((ca && (s.osx() >= 10.8))) {\n                            if ((ca.description && (ca.description.charAt(0) != \"v\"))) {\n                                ca = false;\n                            }\n                        }\n                    };\n                }\n            \n            };\n            return ca;\n        },\n        mightReloadPostInstall: function() {\n            return s.windows();\n        },\n        onVideoMessage: function(ca) {\n            w.push(ca);\n            m.loadModules([\"VideoCallController\",], u);\n        },\n        onRTCMessage: function(ca) {\n            if (t.newVCIsSupported()) {\n                x.push(ca);\n                m.loadModules([\"FBRTCCallController\",], u);\n            }\n        ;\n        },\n        setMessageHandler: function(ca) {\n            this.onVideoMessage = ca;\n            if (ca) {\n                while (w.length) {\n                    ca(w.shift());;\n                }\n            };\n        },\n        setRTCMessageHandler: function(ca) {\n            this.onRTCMessage = ca;\n            if (ca) {\n                while (x.length) {\n                    ca(x.shift());;\n                }\n            };\n        },\n        availableForCall: function(ca) {\n            var da = k.get(ca);\n            return ((da == l.ACTIVE) || (da == l.IDLE));\n        },\n        onProfileButtonClick: function(ca) {\n            y.startCallOrLeaveMessage(ca, \"profile_button_click\");\n        },\n        attachListenerToProfileButton: function(ca) {\n            var da = v(\"videoCallProfileButton\");\n            if (da) {\n                if (!y.isSupported()) {\n                    p.hide(da);\n                    return;\n                }\n            ;\n                g.listen(da, \"click\", function(event) {\n                    y.startCallOrLeaveMessage(ca, \"profile_button_click_timeline\");\n                });\n            }\n        ;\n        },\n        startCallOrLeaveMessage: function(ca, da) {\n            if (this.availableForCall(ca)) {\n                y.showOutgoingCallDialog(ca, da);\n            }\n             else b(\"ShortProfiles\").get(ca, function(ea) {\n                b(\"VideoCallRecordMessageDialog\").get(ca, ea.firstName).show();\n            });\n        ;\n        },\n        showOutgoingCallDialog: function(ca, da) {\n            var ea = (da || \"unknown\");\n            y.logClick(ca, ea);\n            var fa = ((y.isInstalled() || r.NewVCGK) ? \"outgoing_dialog.php\" : \"intro.php\"), ga = (((\"/ajax/chat/video/\" + fa) + \"?idTarget=\") + ca);\n            new q().setAllowCrossPageTransition(true).setAsync(new j(ga)).show();\n        },\n        logClick: function(ca, da) {\n            new j().setURI(\"/ajax/chat/video/log_click.php\").setData({\n                targetUserID: ca,\n                clickSource: da\n            }).setAllowCrossPageTransition(true).setErrorHandler(u).send();\n        }\n    };\n    function z() {\n        return ((s.ie() && s.windows()) && !s.opera());\n    };\n    function aa() {\n        if (!navigator) {\n            return null\n        };\n        navigator.plugins.refresh(false);\n        var ca = navigator.mimeTypes[\"application/skypesdk-plugin\"];\n        return (ca && ca.enabledPlugin);\n    };\n    function ba() {\n        if (!y.mightReloadPostInstall()) {\n            return\n        };\n        var ca = o.get(\"vcpwn\");\n        if (ca) {\n            o.clear(\"vcpwn\");\n            var da = o.get(\"vctid\");\n            if (da) {\n                o.clear(\"vctid\");\n                if (o.get(\"vctid\")) {\n                    return\n                };\n                if ((da && y.isInstalled())) {\n                    var ea = (\"/ajax/chat/video/outgoing_dialog.php?idTarget=\" + da);\n                    new q().setAllowCrossPageTransition(true).setAsync(new j(ea)).show();\n                }\n            ;\n            }\n        ;\n        }\n    ;\n    };\n    i.subscribe(n.getArbiterType(\"video\"), function(ca, da) {\n        y.onVideoMessage(da.obj);\n    });\n    i.subscribe(n.getArbiterType(\"webrtc\"), function(ca, da) {\n        y.onRTCMessage(da.obj);\n    });\n    i.subscribe(n.getArbiterType(\"chat_event\"), function(ca, da) {\n        if ((da.obj.event_name == \"missed-call\")) {\n            m.loadModules([\"VideoCallController\",], function(ea) {\n                ea.onMissedCallEvent(da.obj);\n            });\n        };\n    });\n    ba();\n    e.exports = y;\n});\n__d(\"ChatApp\", [\"CSS\",\"JSLogger\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSS\"), h = b(\"JSLogger\"), i = false, j = false, k = false, l = null, m = {\n        init: function(n, o, p) {\n            if (l) {\n                h.create(\"chat_app\").error(\"repeated_init\");\n                return;\n            }\n        ;\n            l = n;\n            d([\"TabsViewport\",\"ChatTabController\",\"ChatTabViewCoordinator\",\"MercuryServerRequests\",\"MercuryChannelHandler\",\"MercuryStateCheck\",], function(q, r, s, t, u, v) {\n                t.get().handleUpdate(p);\n                this.tabsViewport = new q(o);\n                this.tabController = new r(this.tabsViewport);\n                this.tabViewCoordinator = new s(o, this.tabsViewport);\n                i = j = true;\n            }.bind(this));\n        },\n        hide: function() {\n            if ((!i || k)) {\n                return\n            };\n            g.hide(l);\n            k = true;\n        },\n        unhide: function() {\n            if (i) {\n                if (k) {\n                    g.show(l);\n                    this.tabsViewport.checkWidth();\n                    d([\"Dock\",], function(n) {\n                        n.resizeAllFlyouts();\n                    });\n                    k = false;\n                }\n            ;\n            }\n             else if (!j) {\n                d([\"UIPagelet\",], function(n) {\n                    n.loadFromEndpoint(\"ChatTabsPagelet\", \"ChatTabsPagelet\");\n                    n.loadFromEndpoint(\"BuddylistPagelet\", \"BuddylistPagelet\");\n                });\n                j = true;\n            }\n            \n        ;\n        }\n    };\n    e.exports = m;\n});\n__d(\"DataViewPolyfill\", [\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"copyProperties\");\n    function h(i, j, k) {\n        if ((j === undefined)) {\n            this._ba = new Uint8Array(i);\n        }\n         else if ((k === undefined)) {\n            this._ba = new Uint8Array(i, j);\n        }\n         else this._ba = new Uint8Array(i, j, k);\n        \n    ;\n        this.byteLength = this._ba.byteLength;\n    };\n    g(h, {\n        isSupported: function() {\n            return !!a.Uint8Array;\n        }\n    });\n    g(h.prototype, {\n        getUint8: function(i) {\n            if ((i >= this._ba.length)) {\n                throw new Error(\"Trying to read beyond bounds of DataViewPolyfill\")\n            };\n            return this._ba[i];\n        },\n        getUint16: function(i, j) {\n            var k = this.getUint8(i), l = this.getUint8((i + 1));\n            return (j ? (((l * 256)) + k) : (((k * 256)) + l));\n        },\n        getUint32: function(i, j) {\n            var k = this.getUint8(i), l = this.getUint8((i + 1)), m = this.getUint8((i + 2)), n = this.getUint8((i + 3));\n            return (j ? (((((((((n * 256) + m)) * 256) + l)) * 256)) + k) : (((((((((k * 256) + l)) * 256) + m)) * 256)) + n));\n        }\n    });\n    e.exports = h;\n});\n__d(\"getImageSize\", [\"DataViewPolyfill\",], function(a, b, c, d, e, f) {\n    var g = b(\"DataViewPolyfill\"), h = (a.DataView || g);\n    function i(m) {\n        return {\n            width: m.getUint16(6, true),\n            height: m.getUint16(8, true)\n        };\n    };\n    function j(m) {\n        return {\n            width: m.getUint32(16, false),\n            height: m.getUint32(20, false)\n        };\n    };\n    function k(m) {\n        var n = m.byteLength, o = 2;\n        while ((o < n)) {\n            var p = m.getUint16(o, false);\n            o += 2;\n            if (((p == 65472) || (p == 65474))) {\n                return {\n                    width: m.getUint16((o + 5), false),\n                    height: m.getUint16((o + 3), false)\n                };\n            }\n             else o += m.getUint16(o, false);\n        ;\n        };\n        return null;\n    };\n    function l(m) {\n        var n = new h(m);\n        if (((n.getUint8(0) == 255) && (n.getUint8(1) == 216))) {\n            return k(n)\n        };\n        if ((((n.getUint8(0) == 71) && (n.getUint8(1) == 73)) && (n.getUint8(2) == 70))) {\n            return i(n)\n        };\n        if (((((n.getUint8(0) == 137) && (n.getUint8(1) == 80)) && (n.getUint8(2) == 78)) && (n.getUint8(3) == 71))) {\n            return j(n)\n        };\n        return null;\n    };\n    e.exports = l;\n    l.gif = i;\n    l.png = j;\n    l.jpeg = k;\n});\n__d(\"ChatAutoSendPhotoUploader\", [\"ArbiterMixin\",\"DOM\",\"Event\",\"FileForm\",\"FileFormResetOnSubmit\",\"FileInput\",\"FormSubmitOnChange\",\"MercuryAttachmentType\",\"SubscriptionsHandler\",\"copyProperties\",\"csx\",\"getImageSize\",\"removeFromArray\",\"shield\",], function(a, b, c, d, e, f) {\n    var g = b(\"ArbiterMixin\"), h = b(\"DOM\"), i = b(\"Event\"), j = b(\"FileForm\"), k = b(\"FileFormResetOnSubmit\"), l = b(\"FileInput\"), m = b(\"FormSubmitOnChange\"), n = b(\"MercuryAttachmentType\"), o = b(\"SubscriptionsHandler\"), p = b(\"copyProperties\"), q = b(\"csx\"), r = b(\"getImageSize\"), s = b(\"removeFromArray\"), t = b(\"shield\"), u = 0;\n    function v(w, x, y) {\n        this._idElem = y;\n        this._input = x;\n        this._subscriptionsHandler = new o();\n        this._uploadBatches = [];\n        var z = new j(w, [m,k,]), aa = h.find(w, \"._4q60\"), ba = h.find(aa, \"._4q61\");\n        new l(aa, ba, x);\n        this._subscriptionsHandler.addSubscriptions(z.subscribe(\"submit\", this._onFileSubmit.bind(this)), z.subscribe(\"success\", this._onFileUploadSuccess.bind(this)), z.subscribe(\"failure\", this._onFileUploadFailure.bind(this)), i.listen(ba, \"click\", t(this.inform, this, \"open\")));\n    };\n    p(v.prototype, g, {\n        isUploading: function() {\n            return (this._uploadBatches.length > 0);\n        },\n        destroy: function() {\n            this._subscriptionsHandler.release();\n        },\n        _getPreviewAttachment: function(w) {\n            var x = {\n                attach_type: n.PHOTO,\n                preview_uploading: true\n            };\n            if (w) {\n                x.preview_width = w.width;\n                x.preview_height = w.height;\n            }\n        ;\n            return x;\n        },\n        _onFileSubmit: function() {\n            u += 1;\n            var w = (\"upload_\" + u);\n            this._idElem.value = w;\n            this._uploadBatches.push(w);\n            if (((((typeof FileReader !== \"undefined\") && FileReader.prototype.readAsArrayBuffer) && this._input.files) && (this._input.files.length === 1))) {\n                var x = new FileReader();\n                x.onload = function() {\n                    this.inform(\"submit\", {\n                        upload_id: w,\n                        raw_attachments: [this._getPreviewAttachment(r(x.result)),]\n                    });\n                }.bind(this);\n                x.onerror = function() {\n                    this.inform(\"submit\", {\n                        upload_id: w,\n                        raw_attachments: [this._getPreviewAttachment(null),]\n                    });\n                }.bind(this);\n                x.readAsArrayBuffer(this._input.files[0]);\n            }\n             else {\n                var y = 1;\n                if (this._input.files) {\n                    y = this._input.files.length;\n                };\n                var z = [];\n                for (var aa = 0; (aa < y); ++aa) {\n                    z.push(this._getPreviewAttachment(null));;\n                };\n                this.inform(\"submit\", {\n                    upload_id: w,\n                    raw_attachments: z\n                });\n            }\n        ;\n        },\n        _onFileUploadSuccess: function(event, w) {\n            var x = w.response.getPayload(), y = x.uploadID;\n            s(this._uploadBatches, y);\n            var z = [];\n            x.metadata.forEach(function(aa) {\n                z.push(aa.image_id);\n            });\n            this.inform(\"all-uploads-completed\", {\n                upload_id: x.uploadID,\n                image_ids: z\n            });\n        },\n        _onFileUploadFailure: function(event, w) {\n            var x = this._uploadBatches[(this._uploadBatches.length - 1)];\n            s(this._uploadBatches, x);\n            this.inform(\"all-uploads-failed\", {\n                upload_id: x\n            });\n        }\n    });\n    e.exports = v;\n});\n__d(\"ChatTabModel\", [\"function-extensions\",\"Arbiter\",\"ArbiterMixin\",\"ChatBehavior\",\"ChatConfig\",\"JSLogger\",\"MercuryAssert\",\"MercuryServerRequests\",\"MercuryThreads\",\"MercuryTimestampTracker\",\"PresenceInitialData\",\"PresenceState\",\"PresenceUtil\",\"areObjectsEqual\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    b(\"function-extensions\");\n    var g = b(\"Arbiter\"), h = b(\"ArbiterMixin\"), i = b(\"ChatBehavior\"), j = b(\"ChatConfig\"), k = b(\"JSLogger\"), l = b(\"MercuryAssert\"), m = b(\"MercuryServerRequests\").get(), n = b(\"MercuryThreads\").get(), o = b(\"MercuryTimestampTracker\").get(), p = b(\"PresenceInitialData\"), q = b(\"PresenceState\"), r = b(\"PresenceUtil\"), s = b(\"areObjectsEqual\"), t = b(\"copyProperties\"), u = [], v = null, w = null, x = null, y = null;\n    function z() {\n        return parseInt(p.serverTime, 10);\n    };\n    var aa = (j.get(\"tab_max_load_age\") || 3600000), ba = (z() - aa), ca = 0, da = 20, ea = k.create(\"chat_tab_model\"), fa = false;\n    function ga(xa) {\n        var ya = q.verifyNumber(xa.uct2);\n        if ((!ya || (typeof ya !== \"number\"))) {\n            ea.warn(\"bad_cookie_version\", xa.uct2);\n            return null;\n        }\n    ;\n        if (((ya < ca) || (ya < ba))) {\n            return null\n        };\n        return ya;\n    };\n    function ha(xa) {\n        var ya = ga(xa);\n        if (!ya) {\n            var za = {\n            };\n            za.old_tabs = ((xa && xa.t2) && JSON.stringify(xa.t2));\n            za.old_promoted = (xa && xa.lm2);\n            za.old_time = (xa && xa.uct2);\n            za.old_reason = (xa && xa.tr);\n            za.old_window = (xa && xa.tw);\n            var ab;\n            if ((w && xa.t2)) {\n                for (var bb = 0; (bb < xa.t2.length); bb++) {\n                    var cb = xa.t2[bb];\n                    if ((cb.i === w)) {\n                        ab = cb.r;\n                    };\n                }\n            };\n            var db = [];\n            u.forEach(function(eb) {\n                if (!eb.fragile) {\n                    var fb = {\n                        i: eb.id,\n                        si: eb.server_id\n                    };\n                    if ((eb.raised || (((eb.id === w) && ab)))) {\n                        fb.r = 1;\n                    };\n                    db.push(fb);\n                }\n            ;\n            });\n            xa.t2 = db;\n            xa.uct2 = ca;\n            xa.lm2 = v;\n            xa.tr = y;\n            xa.tw = r.getSessionID();\n            za.new_tabs = JSON.stringify(xa.t2);\n            za.new_promoted = xa.lm2;\n            za.new_time = xa.uct2;\n            za.new_reason = xa.tr;\n            za.new_window = xa.tw;\n            ea.debug(\"store\", za);\n        }\n    ;\n        return xa;\n    };\n    function ia(xa) {\n        if (xa) {\n            var ya = ga(xa);\n            if ((ya && (ya !== ca))) {\n                var za = {\n                };\n                za.old_tabs = JSON.stringify(u);\n                za.old_promoted = v;\n                za.old_time = ca;\n                za.old_reason = y;\n                za.window_id = r.getSessionID();\n                za.cookie_tabs = ((xa && xa.t2) && JSON.stringify(xa.t2));\n                za.cookie_promoted = (xa && xa.lm2);\n                za.cookie_time = (xa && xa.uct2);\n                za.cookie_reason = (xa && xa.tr);\n                za.cookie_window = (xa && xa.tw);\n                ca = ya;\n                y = \"load\";\n                var ab = ja(xa.t2, (xa.lm2 || null));\n                za.load_result = ab;\n                za.new_tabs = JSON.stringify(u);\n                za.new_promoted = v;\n                za.new_time = ca;\n                za.new_reason = y;\n                var event = \"load\";\n                if (!fa) {\n                    event += \"_init\";\n                };\n                ea.log(event, za);\n                return ab;\n            }\n        ;\n        }\n    ;\n        return false;\n    };\n    function ja(xa, ya) {\n        if (ka(xa, ya)) {\n            var za = u.filter(function(cb) {\n                return cb.fragile;\n            }), ab = {\n            };\n            v = null;\n            u = xa.map(function(cb) {\n                var db = {\n                    id: cb.i,\n                    server_id: cb.si\n                };\n                if ((db.id == ya)) {\n                    v = db.id;\n                };\n                if ((w == cb.i)) {\n                    var eb = pa(w);\n                    if ((eb != -1)) {\n                        db.raised = u[eb].raised;\n                        return db;\n                    }\n                     else return null\n                ;\n                }\n            ;\n                if (cb.r) {\n                    db.raised = true;\n                };\n                ab[db.id] = db;\n                return db;\n            });\n            u = u.filter(function(cb) {\n                return (cb != null);\n            });\n            if (x) {\n                for (var bb in x) {\n                    if ((!ab[bb] || !ab[bb].raised)) {\n                        delete x[bb];\n                    };\n                }\n            };\n            za = za.filter(function(cb) {\n                return !ab[cb.id];\n            });\n            u = u.concat(za);\n            oa();\n            return true;\n        }\n    ;\n        return false;\n    };\n    function ka(xa, ya) {\n        if ((ya != v)) {\n            return true\n        };\n        var za = u.filter(function(cb) {\n            return !cb.fragile;\n        });\n        if ((xa.length != za.length)) {\n            return true\n        };\n        for (var ab = 0, bb = xa.length; (ab < bb); ab++) {\n            if ((xa[ab].id === w)) {\n                continue;\n            };\n            if (!s(xa[ab], za[ab])) {\n                return true\n            };\n        };\n        return false;\n    };\n    function la(xa, ya, za) {\n        var ab = ia(q.get());\n        if (((ya === undefined) || (ya > ca))) {\n            if (xa()) {\n                ab = true;\n                y = (za || null);\n                na(ya);\n            }\n        ;\n        }\n         else ea.error(\"rejected\", {\n            change_time: ya,\n            state_time: ca\n        });\n    ;\n        (ab && ma());\n    };\n    function ma() {\n        if (fa) {\n            va.inform(\"chat/tabs-changed\", va.get());\n        };\n    };\n    function na(xa) {\n        if ((xa === undefined)) {\n            xa = Math.max((o.getLastUserMessageTimestamp() || 1), (ca + 1));\n        };\n        ca = xa;\n        q.doSync();\n    };\n    function oa() {\n        var xa = (u.length - da);\n        if ((xa > 0)) {\n            u = u.filter(function(ya) {\n                return (ya.raised || (xa-- <= 0));\n            });\n        };\n    };\n    function pa(xa) {\n        for (var ya = 0; (ya < u.length); ya++) {\n            if ((u[ya].id == xa)) {\n                return ya\n            };\n        };\n        return -1;\n    };\n    function qa(xa, ya) {\n        var za = n.getThreadMetaNow(xa);\n        if (!za) {\n            return false\n        };\n        if (za.is_canonical_user) {\n            return sa(xa, ya);\n        }\n         else {\n            var ab = ra(xa);\n            if (ab) {\n                m.getServerThreadID(xa, function(bb) {\n                    if (ta(xa, bb)) {\n                        na();\n                        ma();\n                    }\n                ;\n                });\n            };\n            return ab;\n        }\n    ;\n    };\n    function ra(xa) {\n        if ((pa(xa) === -1)) {\n            u.push({\n                id: xa,\n                fragile: true\n            });\n            ea.log(\"open_fragile_tab\", {\n                tabs: JSON.stringify(u),\n                opened: xa,\n                window_id: r.getSessionID()\n            });\n            return true;\n        }\n    ;\n        return false;\n    };\n    function sa(xa, ya) {\n        var za = pa(xa);\n        if ((za != -1)) {\n            if (u[za].fragile) {\n                u.splice(za, 1);\n            }\n             else {\n                u[za].signatureID = ya;\n                return true;\n            }\n        \n        };\n        for (var ab = 0; (ab <= u.length); ab++) {\n            if (((ab == u.length) || u[ab].fragile)) {\n                u.splice(ab, 0, {\n                    id: xa,\n                    signatureID: ya\n                });\n                oa();\n                ea.log(\"open_tab\", {\n                    tabs: JSON.stringify(u),\n                    opened: xa,\n                    window_id: r.getSessionID()\n                });\n                return true;\n            }\n        ;\n        };\n    };\n    function ta(xa, ya) {\n        var za = pa(xa);\n        if (((za != -1) && u[za].fragile)) {\n            var ab = u[za];\n            ab.fragile = false;\n            ab.server_id = ya;\n            var bb = [];\n            u.forEach(function(cb) {\n                if ((cb.id != xa)) {\n                    if ((ab && cb.fragile)) {\n                        bb.push(ab);\n                        ab = null;\n                    }\n                ;\n                    bb.push(cb);\n                }\n            ;\n            });\n            if (ab) {\n                bb.push(ab);\n            };\n            u = bb;\n            ea.log(\"make_permanent\", {\n                tabs: JSON.stringify(u),\n                tab_id: xa,\n                window_id: r.getSessionID()\n            });\n            return true;\n        }\n    ;\n        return false;\n    };\n    function ua(xa) {\n        var ya = pa(xa);\n        if ((xa == v)) {\n            v = null;\n        };\n        if ((ya != -1)) {\n            u.splice(ya, 1);\n            ea.log(\"close_tab\", {\n                tabs: JSON.stringify(u),\n                closed: xa,\n                window_id: r.getSessionID()\n            });\n            return true;\n        }\n    ;\n        return false;\n    };\n    q.registerStateStorer(ha);\n    q.registerStateLoader(function(xa) {\n        if (ia(xa)) {\n            ma();\n        };\n    });\n    function va() {\n    \n    };\n    t(va, h, {\n        indexOf: function(xa) {\n            return pa(xa);\n        },\n        getTab: function(xa) {\n            l.isThreadID(xa);\n            var ya = this.indexOf(xa);\n            if ((ya > -1)) {\n                var za = u[ya];\n                return t({\n                }, za);\n            }\n        ;\n            return null;\n        },\n        getEmptyTab: function() {\n            for (var xa = 0; (xa < u.length); xa++) {\n                var ya = u[xa].id;\n                if (n.isNewEmptyLocalThread(ya)) {\n                    return ya\n                };\n            };\n            return null;\n        },\n        getServerTime: function() {\n            return z();\n        },\n        closeAllTabs: function() {\n            if (u.length) {\n                ea.log(\"close_all_tabs\", {\n                    closed_tabs: JSON.stringify(u),\n                    window_id: r.getSessionID()\n                });\n                u = [];\n                v = null;\n                if (x) {\n                    x = {\n                    };\n                };\n                na();\n                ma();\n            }\n        ;\n        },\n        closeFragileTabs: function() {\n            var xa = [];\n            for (var ya = 0; (ya < u.length); ya++) {\n                if ((u[ya].fragile && !n.isNewEmptyLocalThread(u[ya].id))) {\n                    xa.push(u[ya]);\n                    u.splice(ya);\n                    ma();\n                    break;\n                }\n            ;\n            };\n            ea.log(\"close_fragile_tabs\", {\n                tabs: JSON.stringify(u),\n                fragile_closed: xa,\n                window_id: r.getSessionID()\n            });\n        },\n        closeTab: function(xa, ya) {\n            l.isThreadID(xa);\n            var za = false;\n            if (x) {\n                delete x[xa];\n                za = true;\n            }\n        ;\n            la(function() {\n                if (ua(xa)) {\n                    za = true;\n                };\n                return za;\n            }, undefined, ya);\n        },\n        closeTabAndDemote: function(xa, ya, za) {\n            l.isThreadID(xa);\n            var ab = false;\n            if (x) {\n                delete x[xa];\n                ab = true;\n            }\n        ;\n            la(function() {\n                if (ua(xa)) {\n                    if (v) {\n                        var bb = pa(v);\n                        if ((bb > ya)) {\n                            var cb = u.splice(bb, 1)[0];\n                            u.splice(ya, 0, cb);\n                            v = null;\n                        }\n                    ;\n                    }\n                ;\n                    ab = true;\n                }\n            ;\n                return ab;\n            }, undefined, za);\n        },\n        raiseTab: function(xa, ya, za) {\n            l.isThreadID(xa);\n            var ab = false;\n            if ((x && ya)) {\n                x[xa] = true;\n                ab = true;\n            }\n        ;\n            if ((!ya && (xa === w))) {\n                (ab && ma());\n                return;\n            }\n        ;\n            la(function() {\n                if (qa(xa, za)) {\n                    ab = true;\n                };\n                var bb = pa(xa);\n                if (((bb != -1) && !u[bb].raised)) {\n                    u[bb].raised = true;\n                    ab = true;\n                    ea.log(\"raise_tab\", {\n                        tabs: JSON.stringify(u),\n                        raised: xa,\n                        window_id: r.getSessionID()\n                    });\n                }\n            ;\n                return ab;\n            });\n        },\n        get: function() {\n            var xa = u.map(function(ya) {\n                var za = t({\n                }, ya);\n                delete za.fragile;\n                if (x) {\n                    za.raised = x[za.id];\n                };\n                return za;\n            });\n            return {\n                tabs: xa,\n                promoted: v\n            };\n        },\n        openFragileTab: function(xa) {\n            l.isThreadID(xa);\n            if (ra(xa)) {\n                ma();\n            };\n        },\n        openTab: function(xa) {\n            l.isThreadID(xa);\n            la(qa.curry(xa));\n        },\n        lowerTab: function(xa) {\n            l.isThreadID(xa);\n            var ya = false;\n            if (x) {\n                delete x[xa];\n                ya = true;\n            }\n        ;\n            la(function() {\n                var za = pa(xa);\n                if (((za != -1) && u[za].raised)) {\n                    delete u[za].raised;\n                    ea.log(\"lower_tab\", {\n                        tabs: JSON.stringify(u),\n                        lowered: xa,\n                        window_id: r.getSessionID()\n                    });\n                    ya = true;\n                }\n            ;\n                return ya;\n            });\n        },\n        raiseAndPromoteTab: function(xa, ya, za, ab, bb) {\n            l.isThreadID(xa);\n            var cb = false;\n            if ((x && ya)) {\n                x[xa] = true;\n                cb = true;\n            }\n        ;\n            if ((!ya && (xa === w))) {\n                (cb && ma());\n                return;\n            }\n        ;\n            la(function() {\n                if (qa(xa, za)) {\n                    cb = true;\n                };\n                var db = pa(xa);\n                if (((db != -1) && ((!u[db].raised || (v != xa))))) {\n                    u[db].raised = true;\n                    v = xa;\n                    cb = true;\n                    ea.log(\"raise_and_promote_tab\", {\n                        tabs: JSON.stringify(u),\n                        promoted: xa,\n                        window_id: r.getSessionID()\n                    });\n                }\n            ;\n                return cb;\n            }, ab, bb);\n        },\n        promoteThreadInPlaceOfThread: function(xa, ya) {\n            l.isThreadID(xa);\n            l.isThreadID(ya);\n            la(function() {\n                var za = pa(xa), ab = pa(ya);\n                if ((v === ya)) {\n                    v = xa;\n                };\n                var bb = u[za];\n                u[za] = u[ab];\n                u[ab] = bb;\n                return true;\n            });\n        },\n        squelchTab: function(xa) {\n            l.isThreadID(xa);\n            w = xa;\n            this.lowerTab(xa);\n            ea.log(\"squelch_tab\", {\n                squelched: xa,\n                tabs: JSON.stringify(u),\n                window_id: r.getSessionID()\n            });\n        },\n        clearSquelchedTab: function() {\n            if (w) {\n                ea.log(\"unsquelch_tab\", {\n                    squelched: w,\n                    tabs: JSON.stringify(u),\n                    window_id: r.getSessionID()\n                });\n            };\n            w = null;\n        },\n        persistLocalRaised: function() {\n            if (x) {\n                la(function() {\n                    var xa = false;\n                    u.forEach(function(ya) {\n                        if ((ya.raised != x[ya.id])) {\n                            xa = true;\n                            if (x[ya.id]) {\n                                ya.raised = true;\n                            }\n                             else delete ya.raised;\n                        ;\n                        }\n                    ;\n                    });\n                    return xa;\n                });\n                ea.log(\"persist_local_raise\", {\n                    tabs: JSON.stringify(u),\n                    window_id: r.getSessionID()\n                });\n            }\n        ;\n        }\n    });\n    g.subscribe(k.DUMP_EVENT, function(xa, ya) {\n        ya.chat_tabs = {\n            promoted: v,\n            tabs: u.map(function(za) {\n                return t({\n                }, za);\n            }),\n            time: ca,\n            max_load_age: aa\n        };\n    });\n    function wa() {\n        var xa = i.ignoresRemoteTabRaise();\n        if ((xa && !x)) {\n            ea.log(\"start_ignore_remote_raise\");\n            x = {\n            };\n            ma();\n        }\n         else if ((!xa && x)) {\n            ea.log(\"stop_ignore_remote_raise\");\n            x = null;\n            ma();\n        }\n        \n    ;\n    };\n    i.subscribe(i.ON_CHANGED, wa);\n    wa();\n    ia(q.getInitial(), true);\n    if ((ca === 0)) {\n        ca = (z() - 600000);\n    };\n    fa = true;\n    e.exports = va;\n});\n__d(\"VideoCallPromo\", [\"ArbiterMixin\",\"AsyncRequest\",\"ChatConfig\",\"ChatVisibility\",\"LegacyContextualDialog\",\"CSS\",\"MercuryParticipants\",\"MercuryThreads\",\"ChatTabTemplates\",\"VideoCallCore\",\"copyProperties\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"ArbiterMixin\"), h = b(\"AsyncRequest\"), i = b(\"ChatConfig\"), j = b(\"ChatVisibility\"), k = b(\"LegacyContextualDialog\"), l = b(\"CSS\"), m = b(\"MercuryParticipants\"), n = b(\"MercuryThreads\").get(), o = b(\"ChatTabTemplates\"), p = b(\"VideoCallCore\"), q = b(\"copyProperties\"), r = b(\"emptyFunction\");\n    function s() {\n        this._dialog = null;\n    };\n    function t(v) {\n        if (!((p.isSupported() && i.get(\"video.show_promo\")))) {\n            return false\n        };\n        var w = n.getCanonicalUserInThread(v);\n        if (!w) {\n            return false\n        };\n        return (j.isOnline() && p.availableForCall(w));\n    };\n    function u(v) {\n        new h().setURI(\"/ajax/chat/video/log_promo.php\").setData({\n            viewedUserID: v\n        }).setAllowCrossPageTransition(true).setErrorHandler(r).send();\n    };\n    q(s.prototype, g);\n    q(s.prototype, {\n        render: function(v, w) {\n            var x = t(w);\n            if (!x) {\n                return\n            };\n            var y = n.getCanonicalUserInThread(w);\n            m.get((\"fbid:\" + y), function(z) {\n                if (!z.call_promo) {\n                    return\n                };\n                var aa = o[\":fb:mercury:call:promo\"].build();\n                this._dialog = new k();\n                this._dialog.init(aa.getRoot()).setWidth(250).setAlignH(\"center\").setContext(v).show();\n                l.addClass(this._dialog.getRoot(), \"uiContextualDialogWithFooterArrowBottom\");\n                l.addClass(v, \"video_call_promo\");\n                u(n.getCanonicalUserInThread(w));\n                this.inform(\"chat/dialog-rendered\", {\n                    dialog: this,\n                    thread_id: w\n                });\n            }.bind(this));\n        },\n        updatePosition: function() {\n            if ((this._dialog && this._dialog.isShown())) {\n                this._dialog.updatePosition();\n            };\n        },\n        hide: function() {\n            if ((this._dialog && this._dialog.isShown())) {\n                this._dialog.hide();\n                this._dialog = null;\n            }\n        ;\n        }\n    });\n    e.exports = s;\n});\n__d(\"VideoCallTourDialog\", [\"ArbiterMixin\",\"LegacyContextualDialog\",\"CSS\",\"MercuryThreads\",\"ChatTabTemplates\",\"VideoCallCore\",\"VideoCallingTour\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"ArbiterMixin\"), h = b(\"LegacyContextualDialog\"), i = b(\"CSS\"), j = b(\"MercuryThreads\").get(), k = b(\"ChatTabTemplates\"), l = b(\"VideoCallCore\"), m = b(\"VideoCallingTour\"), n = b(\"copyProperties\");\n    function o() {\n        this._dialog = null;\n    };\n    n(o.prototype, g);\n    n(o.prototype, {\n        render: function(p, q) {\n            var r = j.getCanonicalUserInThread(q);\n            if ((!r || !l.availableForCall(r))) {\n                return\n            };\n            var s = k[\":fb:mercury:call:tour\"].build();\n            this._dialog = new h();\n            this._dialog.init(s.getRoot()).setWidth(250).setAlignH(\"center\").setContext(p).show();\n            i.addClass(this._dialog.getRoot(), \"uiContextualDialogWithFooterArrowBottom\");\n            i.addClass(p, \"video_call_tour\");\n            this.inform(\"chat/dialog-rendered\", {\n                dialog: this,\n                thread_id: q\n            });\n            m.inform(\"videocallingtour/end\");\n        },\n        updatePosition: function() {\n            if ((this._dialog && this._dialog.isShown())) {\n                this._dialog.updatePosition();\n            };\n        },\n        hide: function() {\n            if ((this._dialog && this._dialog.isShown())) {\n                this._dialog.hide();\n                this._dialog = null;\n            }\n        ;\n        }\n    });\n    e.exports = o;\n});\n__d(\"ChatContextualDialogController\", [\"Event\",\"ArbiterMixin\",\"ChatTabModel\",\"VideoCallingTour\",\"VideoCallPromo\",\"VideoCallTourDialog\",\"copyProperties\",\"setTimeoutAcrossTransitions\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"ArbiterMixin\"), i = b(\"ChatTabModel\"), j = b(\"VideoCallingTour\"), k = b(\"VideoCallPromo\"), l = b(\"VideoCallTourDialog\"), m = b(\"copyProperties\"), n = b(\"setTimeoutAcrossTransitions\"), o = 60000, p = false, q = false, r = function(y, z) {\n        this._videoCallPromo = new k();\n        this._videoCallTour = new l();\n        this._threadID = y;\n        this._tabMainElement = z;\n        this._openDialog = null;\n        this._subscriptionTokens = [];\n        this._scrollListener = null;\n        this._timeout = null;\n    };\n    function s(y, event, z) {\n        if (y._openDialog) {\n            y._openDialog.updatePosition();\n        };\n    };\n    function t(y) {\n        if (y._openDialog) {\n            y._openDialog.updatePosition();\n        };\n    };\n    function u(y) {\n        if (y._openDialog) {\n            y._openDialog.hide();\n            y._openDialog = null;\n        }\n    ;\n        if (y._timeout) {\n            clearTimeout(y._timeout);\n            y._timeout = null;\n        }\n    ;\n        while (y._subscriptionTokens.length) {\n            y._subscriptionTokens.pop().unsubscribe();;\n        };\n        if (y._scrollListener) {\n            y._scrollListener.remove();\n            y._scrollListener = null;\n        }\n    ;\n    };\n    function v(y, event, z) {\n        if ((z.thread_id === y._threadID)) {\n            y._openDialog = z.dialog;\n            p = true;\n            x(y);\n            y._timeout = n(y.destroy.bind(y, y._threadID), o);\n            y._scrollListener = g.listen(window, \"scroll\", t.curry(y));\n        }\n    ;\n    };\n    function w(y, z) {\n        if (!y._openDialog) {\n            y._subscriptionTokens.push(z.subscribe(\"chat/dialog-rendered\", v.curry(y)));\n            z.render(y._tabMainElement, y._threadID);\n        }\n    ;\n    };\n    function x(y) {\n        y._subscriptionTokens.push(i.subscribe(\"chat/tabs-changed\", s.curry(y)), r.subscribe(\"dialog/close-all\", u.curry(y)));\n    };\n    m(r, h);\n    m(r.prototype, {\n        destroy: function() {\n            u(this);\n        },\n        tabFocused: function() {\n            if (q) {\n                w(this, this._videoCallTour);\n                return;\n            }\n        ;\n            if (!p) {\n                w(this, this._videoCallPromo);\n            };\n        },\n        tabNotActive: function() {\n            u(this);\n        },\n        hideVideoCallouts: function() {\n            u(this);\n        }\n    });\n    j.subscribe(\"videocallingtour/start\", function() {\n        q = true;\n        r.inform(\"dialog/close-all\");\n    });\n    j.subscribe(\"videocallingtour/end\", function() {\n        q = false;\n    });\n    e.exports = r;\n});\n__d(\"ChatPrivacyActionController\", [\"ChatVisibility\",\"JSLogger\",\"PresencePrivacy\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"ChatVisibility\"), h = b(\"JSLogger\"), i = b(\"PresencePrivacy\"), j = b(\"copyProperties\"), k = function(l, m) {\n        this._userID = l;\n        this._logger = h.create(\"blackbird\");\n        this._getState = function() {\n            if (g.isOnline()) {\n                return (i.allows(this._userID) ? k.NORMAL : k.BLOCKED)\n            };\n            return k.OFFLINE;\n        };\n        this._togglePrivacy = function() {\n            var n = this._getState();\n            switch (this._getState()) {\n              case k.OFFLINE:\n                if (g.isOnline()) {\n                    this._logger.error(\"tabs_already_online\");\n                    break;\n                }\n            ;\n                this._logger.log(\"tabs_go_online\", {\n                    tab_id: this._userID\n                });\n                g.goOnline(function() {\n                    if (!i.allows(this._userID)) {\n                        if ((this._getState() !== k.BLOCKED)) {\n                            this._logger.error(\"privacy_action_controller_blocked_inconsistency\");\n                        };\n                        this._togglePrivacy();\n                    }\n                ;\n                }.bind(this));\n                break;\n              case k.BLOCKED:\n                i.allow(this._userID);\n                this._logger.log(\"tabs_unblock\", {\n                    tab_id: this._userID\n                });\n                break;\n              case k.NORMAL:\n                i.disallow(this._userID);\n                this._logger.log(\"tabs_block\", {\n                    tab_id: this._userID\n                });\n                break;\n            };\n        };\n        (function() {\n            var n = function() {\n                (m && m(this._getState()));\n            }.bind(this);\n            n();\n            this._subscribeToken = i.subscribe(\"privacy-changed\", n);\n        }.bind(this)).defer();\n    };\n    k.OFFLINE = \"offline\";\n    k.BLOCKED = \"blocked\";\n    k.NORMAL = \"normal\";\n    j(k.prototype, {\n        togglePrivacy: function() {\n            this._logger.log(\"gear_menu_toggle_privacy\", {\n                tab_id: this._userID\n            });\n            this._togglePrivacy();\n        },\n        destroy: function() {\n            i.unsubscribe(this._subscribeToken);\n        }\n    });\n    e.exports = k;\n});\n__d(\"MercuryTypingIndicator\", [\"Animation\",\"CSS\",\"DOM\",\"MercuryTypingReceiver\",\"MercuryParticipants\",\"Style\",\"ChatTabTemplates\",\"MercuryThreadInformer\",\"Tooltip\",\"copyProperties\",\"cx\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Animation\"), h = b(\"CSS\"), i = b(\"DOM\"), j = b(\"MercuryTypingReceiver\"), k = b(\"MercuryParticipants\"), l = b(\"Style\"), m = b(\"ChatTabTemplates\"), n = b(\"MercuryThreadInformer\").get(), o = b(\"Tooltip\"), p = b(\"copyProperties\"), q = b(\"cx\"), r = b(\"tx\"), s = [];\n    n.subscribe(\"messages-received\", function(v, w) {\n        s.forEach(function(x) {\n            var y = w[x._threadID];\n            (y && x.receivedMessages(y));\n        });\n    });\n    j.subscribe(\"state-changed\", function(v, w) {\n        s.forEach(function(x) {\n            var y = w[x._threadID];\n            (y && x._handleStateChanged(y));\n        });\n    });\n    function t(v) {\n        var w = m[\":fb:chat:conversation:message-group\"].build(), x = m[\":fb:mercury:typing-indicator:typing\"].build();\n        h.addClass(w.getRoot(), \"_50kd\");\n        var y = w.getNode(\"profileLink\");\n        o.set(y, v.name, \"left\");\n        y.href = v.href;\n        w.setNodeContent(\"profileName\", v.name);\n        w.setNodeProperty(\"profilePhoto\", \"src\", v.image_src);\n        var z = r._(\"{name} is typing...\", {\n            name: v.short_name\n        });\n        o.set(x.getRoot(), z, \"above\");\n        i.appendContent(w.getNode(\"messages\"), x.getRoot());\n        return w;\n    };\n    function u(v, w, x) {\n        this._animations = {\n        };\n        this._activeUsers = {\n        };\n        this._typingIndicator = w;\n        this._messagesView = x;\n        this._threadID = v;\n        this._subscription = j.subscribe(\"state-changed\", function(y, z) {\n            var aa = z[this._threadID];\n            (aa && this._handleStateChanged(aa));\n        }.bind(this));\n        s.push(this);\n    };\n    p(u.prototype, {\n        destroy: function() {\n            Object.keys(this._activeUsers).forEach(this._removeUserBubble.bind(this));\n            this._controller.destroy();\n            s.remove(this);\n        },\n        receivedMessages: function(v) {\n            v.forEach(function(w) {\n                if (!k.isAuthor(w.author)) {\n                    this._removeUserBubble(w.author);\n                };\n            }.bind(this));\n        },\n        _handleStateChanged: function(v) {\n            for (var w in this._activeUsers) {\n                if ((v.indexOf(w) === -1)) {\n                    this._slideOutUserBubble(w);\n                    delete this._activeUsers[w];\n                }\n            ;\n            };\n            if (v.length) {\n                k.getMulti(v, function(x) {\n                    var y = this._messagesView.isScrolledToBottom(), z = {\n                    };\n                    for (var aa in x) {\n                        var ba = this._activeUsers[aa];\n                        z[aa] = (ba || t(x[aa]).getRoot());\n                        if (!ba) {\n                            i.appendContent(this._typingIndicator, z[aa]);\n                        };\n                    };\n                    var ca = (Object.keys(z).length > 0);\n                    (y && this._messagesView.scrollToBottom(ca));\n                    this._activeUsers = z;\n                }.bind(this));\n            };\n        },\n        _removeUserBubble: function(v, w) {\n            var x = this._getCurrentAnimation(v, w);\n            if (x) {\n                x.animation.stop();\n                i.remove(x.elem);\n                delete this._animations[v];\n            }\n        ;\n            if ((v in this._activeUsers)) {\n                i.remove(this._activeUsers[v]);\n                delete this._activeUsers[v];\n            }\n        ;\n            (w && i.remove(w));\n        },\n        _slideOutUserBubble: function(v) {\n            var w = this._activeUsers[v];\n            if (this._getCurrentAnimation(v, w)) {\n                return;\n            }\n             else if (w) {\n                l.set(w, \"overflow\", \"hidden\");\n                var x = (new g(w)).from(\"opacity\", 1).from(\"height\", w.offsetHeight).to(\"height\", 0).to(\"opacity\", 0).ease(g.ease.end).duration(250).ondone(this._removeUserBubble.bind(this, v, w)).go();\n                this._animations[v] = {\n                    animation: x,\n                    elem: w\n                };\n            }\n            \n        ;\n        },\n        _getCurrentAnimation: function(v, w) {\n            if ((this._animations[v] && ((!w || (this._animations[v].elem === w))))) {\n                return this._animations[v]\n            };\n        }\n    });\n    e.exports = u;\n});\n__d(\"ChatTabMessagesView\", [\"JSXDOM\",\"Animation\",\"Arbiter\",\"ArbiterMixin\",\"MercuryAttachment\",\"MercuryAttachmentRenderer\",\"ChannelConstants\",\"ChatConfig\",\"ChatVisibility\",\"createArrayFrom\",\"CSS\",\"DOM\",\"Env\",\"Event\",\"JoinableConversationMessageFilter\",\"LiveTimer\",\"MercuryActionTypeConstants\",\"MercuryAPIArgsSource\",\"MercuryLastMessageIndicator\",\"MercuryLogMessageType\",\"MercurySourceType\",\"shield\",\"MercuryMessages\",\"MercuryServerRequests\",\"MercuryThreadMetadataRawRenderer\",\"MercuryThreadMetadataRenderer\",\"MercuryThreads\",\"MercuryThreadlistConstants\",\"MercuryTypingIndicator\",\"MercuryMessageRenderer\",\"Parent\",\"MercuryParticipants\",\"React\",\"ServerTime\",\"MercuryStatusTemplates\",\"Style\",\"ChatTabTemplates\",\"MercuryThreadInformer\",\"Timestamp.react\",\"Tooltip\",\"VideoCallCore\",\"copyProperties\",\"csx\",\"cx\",\"formatDate\",\"isRTL\",\"removeFromArray\",\"throttle\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSXDOM\"), h = b(\"Animation\"), i = b(\"Arbiter\"), j = b(\"ArbiterMixin\"), k = b(\"MercuryAttachment\"), l = b(\"MercuryAttachmentRenderer\"), m = b(\"ChannelConstants\"), n = b(\"ChatConfig\"), o = b(\"ChatVisibility\"), p = b(\"createArrayFrom\"), q = b(\"CSS\"), r = b(\"DOM\"), s = b(\"Env\"), t = b(\"Event\"), u = b(\"JoinableConversationMessageFilter\"), v = b(\"LiveTimer\"), w = b(\"MercuryActionTypeConstants\"), x = b(\"MercuryAPIArgsSource\"), y = b(\"MercuryLastMessageIndicator\"), z = b(\"MercuryLogMessageType\"), aa = b(\"MercurySourceType\"), ba = b(\"shield\"), ca = b(\"MercuryMessages\").get(), da = b(\"MercuryServerRequests\").get(), ea = b(\"MercuryThreadMetadataRawRenderer\"), fa = b(\"MercuryThreadMetadataRenderer\").get(), ga = b(\"MercuryThreads\").get(), ha = b(\"MercuryThreadlistConstants\"), ia = b(\"MercuryTypingIndicator\"), ja = b(\"MercuryMessageRenderer\"), ka = b(\"Parent\"), la = b(\"MercuryParticipants\"), ma = b(\"React\"), na = b(\"ServerTime\"), oa = b(\"MercuryStatusTemplates\"), pa = b(\"Style\"), qa = b(\"ChatTabTemplates\"), ra = b(\"MercuryThreadInformer\").get(), sa = b(\"Timestamp.react\"), ta = b(\"Tooltip\"), ua = b(\"VideoCallCore\"), va = b(\"copyProperties\"), wa = b(\"csx\"), xa = b(\"cx\"), ya = b(\"formatDate\"), za = b(\"isRTL\"), ab = b(\"removeFromArray\"), bb = b(\"throttle\"), cb = b(\"tx\"), db, eb = 34, fb = ((1000 * 60) * 60), gb = 70, hb = null, ib = 20;\n    function jb(tb) {\n        return ya(new Date(tb), (n.get(\"24h_times\") ? \"H:i\" : \"g:ia\"));\n    };\n    function kb(tb) {\n        var ub = qa[\":fb:chat:conversation:message-group\"].build(), vb = ub.getNode(\"profileLink\"), wb = n.get(\"chat_tab_bubbles\"), xb = la.isAuthor(tb.author), yb = da.tokenizeThreadID(tb.thread_id), zb = (yb.type !== \"user\"), ac = (!xb || !wb);\n        if (!wb) {\n            ub.setNodeContent(\"timestamp\", jb(tb.timestamp));\n        };\n        q.conditionClass(ub.getRoot(), \"_50kd\", (!xb && wb));\n        q.conditionClass(ub.getRoot(), \"_50x4\", ((zb && !xb) && wb));\n        q.conditionShow(vb, ac);\n        la.get(tb.author, function(bc) {\n            if (ac) {\n                vb.href = bc.href;\n                var cc = (xb ? \"You\" : bc.name);\n                if ((!xb && wb)) {\n                    cc = g.div({\n                        className: \"_522l\"\n                    }, g.div({\n                        className: \"_522m\"\n                    }, jb(tb.timestamp)), bc.name);\n                };\n                ta.set(vb, cc, \"left\");\n                if (((!xb && wb) && zb)) {\n                    ub.setNodeContent(\"profileName\", bc.name);\n                };\n                ub.setNodeProperty(\"profilePhoto\", \"src\", bc.image_src);\n            }\n        ;\n        });\n        return ub;\n    };\n    function lb(tb) {\n        var ub = qa[\":fb:chat:conversation:message:event\"].build(), vb = n.get(\"chat_tab_bubbles\"), wb = jb(tb.timestamp);\n        if (vb) {\n            ub.getRoot().setAttribute(\"title\", wb);\n        }\n         else ub.setNodeContent(\"timestamp\", wb);\n    ;\n        ja.renderLogMessage(ub.getNode(\"icon\"), ub.getNode(\"message\"), ub.getNode(\"attachment\"), tb);\n        var xb = nb(tb);\n        if (xb) {\n            r.appendContent(ub.getNode(\"message\"), xb);\n        };\n        return ub.getRoot();\n    };\n    function mb(tb, ub) {\n        if (!n.get(\"chat_tab_bubbles\")) {\n            return\n        };\n        if ((hb === null)) {\n            var vb = ub.childNodes[0];\n            pa.set(ub, \"overflow\", \"scroll\");\n            hb = (vb.clientWidth - gb);\n            pa.set(ub, \"overflow\", \"\");\n        }\n    ;\n        if (!q.hasClass(tb, \"_kso\")) {\n            var wb = r.scry(tb, \"._kso\");\n            if ((wb.length === 1)) {\n                tb = wb[0];\n            }\n             else return\n        ;\n        }\n    ;\n        pa.set(tb, \"max-width\", (hb + \"px\"));\n        var xb, yb, zb = tb.firstChild;\n        if (((tb.childNodes.length === 1) && zb.getAttribute(\"data-measureme\"))) {\n            xb = zb.getClientRects();\n            var ac = zb.offsetHeight;\n            if (((xb && (xb.length > 1)) && (xb[0].height < ac))) {\n                yb = true;\n                if (!db) {\n                    r.remove(zb);\n                    db = tb.offsetWidth;\n                    r.appendContent(tb, zb);\n                }\n            ;\n                var bc = zb.offsetWidth, cc = ((tb.offsetWidth - bc) - db);\n                if ((cc > 0)) {\n                    pa.set(tb, \"max-width\", (bc + \"px\"));\n                };\n            }\n        ;\n        }\n    ;\n        var dc = ka.byClass(tb, \"_50x4\");\n        if (dc) {\n            q.conditionClass(dc, \"_51lo\", (xb ? !yb : (tb.offsetHeight < eb)));\n        };\n    };\n    function nb(tb) {\n        var ub, vb;\n        if ((tb.log_message_type == z.VIDEO_CALL)) {\n            if ((tb.log_message_data.event_name == \"install_canceled\")) {\n                ub = r.tx._(\"Retry setup and call back.\");\n                vb = \"callback_cancelinstall_link\";\n                return ob(ub, tb.thread_id, tb.log_message_data.to, vb);\n            }\n             else if (((!tb.log_message_data.event_name && (tb.log_message_data.callee == la.user)) && !tb.log_message_data.answered)) {\n                ub = r.tx._(\"Call Back\");\n                vb = \"callback_link\";\n                return ob(ub, tb.thread_id, tb.log_message_data.caller.split(\":\")[1], vb);\n            }\n            \n        \n        };\n        return null;\n    };\n    function ob(tb, ub, vb, wb) {\n        if (ua.isSupported()) {\n            var xb = (!o.isOnline() || !ua.availableForCall(vb)), yb = r.create(\"a\", {\n                href: \"#\",\n                className: \"callBackLink\"\n            }, tb);\n            if (xb) {\n                q.hide(yb);\n            };\n            yb.setAttribute(\"data-gt\", JSON.stringify({\n                videochat: \"clicked_callback_link\"\n            }));\n            t.listen(yb, \"click\", function() {\n                rb.inform(\"video-call-clicked\", {\n                    userID: vb,\n                    threadID: ub,\n                    clickSource: wb\n                });\n            });\n            return yb;\n        }\n    ;\n        return null;\n    };\n    function pb(tb) {\n        var ub = qa[\":fb:mercury:chat:message:forward\"].build(), vb = ub.getNode(\"forwardText\");\n        if (vb) {\n            q.hide(ub.getRoot());\n            fa.renderTitanLink(tb.thread_id, ub.getNode(\"forwardLink\"), q.show.bind(q, ub.getRoot()));\n            if ((tb.forward_count > 1)) {\n                r.appendContent(vb, cb._(\"{count} forwarded messages\", {\n                    count: tb.forward_count\n                }));\n            }\n             else r.appendContent(vb, \"1 forwarded message\");\n        ;\n        }\n    ;\n        return ub.getRoot();\n    };\n    var qb = [];\n    function rb(tb, ub, vb, wb, xb, yb, zb) {\n        this.loadingIcon = xb;\n        this.threadID = tb;\n        this.sheetController = ub;\n        this.scrollContainer = vb;\n        this.conversationElem = wb;\n        this.messageElements = {\n        };\n        this.messageGroup = null;\n        this.prevMessage = null;\n        v.restart((na.get() / 1000));\n        this._fetchMultiplier = 1;\n        this._oldestMessageDisplayedTimestamp = null;\n        this._loadingMoreMessages = false;\n        this._currentMessageCount = 0;\n        this._hasReachedClearedMessages = false;\n        var ac = ha.MESSAGE_TIMESTAMP_THRESHOLD;\n        this._oldestMessageDisplayedTimestamp = (Date.now() - ac);\n        qb.push(this);\n        this._subscription = i.subscribe(\"overflow-applied-to-body\", this.scrollToBottom.bind(this));\n        t.listen(this.scrollContainer, \"scroll\", bb(this.scrolling, 50, this));\n        var bc = n.get(\"chat_tab_bubbles\");\n        this.lastMessageIndicator = new y(this.threadID, yb, bc, this);\n        if (bc) {\n            this.typingIndicator = new ia(this.threadID, zb, this);\n        };\n        ca.getThreadMessagesRange(this.threadID, 0, ha.RECENT_MESSAGES_LIMIT, this._updateTimestamp.bind(this));\n        this.rerender();\n    };\n    va(rb, j);\n    va(rb.prototype, {\n        scrolling: function() {\n            if ((((!this._loadingMoreMessages && this.isScrolledNearTop()) && !this.isScrolledToBottom()) && !this._hasReachedClearedMessages)) {\n                this.loadMoreMessages();\n            };\n            if (!this._newMessagesSheetOpened) {\n                return\n            };\n            if (this.isScrolledToBottom()) {\n                this.sheetController.closeNewMessagesSheet();\n                this._newMessagesSheetOpened = false;\n            }\n        ;\n        },\n        destroy: function() {\n            r.empty(this.conversationElem);\n            this._subscription.unsubscribe();\n            ab(qb, this);\n            (this.lastMessageIndicator && this.lastMessageIndicator.destroy());\n            this.destroyed = true;\n        },\n        _appendMessage: function(tb) {\n            if ((tb == this.prevMessage)) {\n                return\n            };\n            var ub = ha, vb = ub.GROUPING_THRESHOLD, wb = ((tb.action_type == w.LOG_MESSAGE) && (tb.log_message_type == z.SERVER_ERROR));\n            if (tb.is_cleared) {\n                this._hasReachedClearedMessages = true;\n                return;\n            }\n        ;\n            var xb;\n            if ((this.prevMessage !== null)) {\n                xb = (tb.timestamp - this.prevMessage.timestamp);\n            }\n             else xb = Infinity;\n        ;\n            if ((!wb && ((xb >= fb)))) {\n                var yb = Math.round((tb.timestamp / 1000)), zb = tb.timestamp_datetime, ac = qa[\":fb:chat:conversation:date-break\"].build();\n                ma.renderComponent(sa({\n                    time: yb,\n                    verbose: zb,\n                    text: zb\n                }), ac.getNode(\"date\"));\n                r.appendContent(this.conversationElem, ac.getRoot());\n                this.messageGroup = null;\n            }\n        ;\n            if ((tb.action_type == w.LOG_MESSAGE)) {\n                r.appendContent(this.conversationElem, lb(tb));\n                this.messageGroup = null;\n                this.prevMessage = tb;\n                return;\n            }\n        ;\n            var bc = n.get(\"chat_tab_bubbles\");\n            if ((((!this.messageGroup || (bc && (tb.author !== la.user))) || (this.prevMessage.author != tb.author)) || (this.prevMessage.timestamp < (tb.timestamp - vb)))) {\n                this.messageGroup = kb(tb);\n                r.appendContent(this.conversationElem, this.messageGroup.getRoot());\n            }\n        ;\n            var cc = this._makeSingleMessage(tb);\n            this.messageElements[tb.message_id] = cc;\n            r.appendContent(this.messageGroup.getNode(\"messages\"), cc);\n            mb(cc, this.scrollContainer);\n            this.prevMessage = tb;\n        },\n        rerender: function() {\n            if (!this._oldestMessageDisplayedTimestamp) {\n                return\n            };\n            var tb = (this._finishedFetchingMoreMessages && this.scrollContainer.scrollHeight), ub = (this._finishedFetchingMoreMessages && this.scrollContainer.scrollTop), vb = this.isScrolledToBottom();\n            r.empty(this.conversationElem);\n            this.messageElements = {\n            };\n            this.messageGroup = null;\n            this.prevMessage = null;\n            var wb = ca.getThreadMessagesSinceTimestamp(this.threadID, this._oldestMessageDisplayedTimestamp);\n            this._renderOlderMessages(wb, tb, ub, vb);\n            this._finishedFetchingMoreMessages = false;\n        },\n        update: function(tb) {\n            for (var ub in tb) {\n                var vb = this.messageElements[ub];\n                if (vb) {\n                    var wb = this.isScrolledToBottom(), xb = this._makeSingleMessage(ca.getMessagesFromIDs([ub,])[0]);\n                    this.messageElements[ub] = xb;\n                    r.replace(vb, xb);\n                    mb(xb, this.scrollContainer);\n                    if (wb) {\n                        this.scrollToBottom();\n                    };\n                }\n            ;\n            };\n        },\n        _getLoadingHeight: function() {\n            return (this.loadingHeight || this.loadingIcon.clientHeight);\n        },\n        _appendMessages: function(tb) {\n            tb.forEach(this._appendMessage.bind(this));\n            (this.lastMessageIndicator && this.lastMessageIndicator.setLastMessage(this.prevMessage));\n        },\n        _appendNewMessages: function(tb) {\n            tb = u.filterMessages(function(wb) {\n                this.sheetController.openUserJoinStatusSheet(wb);\n            }.bind(this), tb, true);\n            var ub = this.isScrolledToBottom(), vb = this._messagesOnlySentFromSelf(tb);\n            this._appendMessages(tb);\n            if (ub) {\n                this.scrollToBottom();\n            }\n             else if (!vb) {\n                this.sheetController.openNewMessagesSheet();\n                this._newMessagesSheetOpened = true;\n            }\n            \n        ;\n        },\n        _messagesOnlySentFromSelf: function(tb) {\n            for (var ub = 0; (ub < tb.length); ub++) {\n                if ((tb[ub].author !== la.user)) {\n                    return false\n                };\n            };\n            return true;\n        },\n        _renderOlderMessages: function(tb, ub, vb, wb) {\n            if (!tb) {\n                return\n            };\n            tb = u.filterMessages(function(xb) {\n                this.sheetController.openUserJoinStatusSheet(xb);\n            }.bind(this), tb, false);\n            this._appendMessages(tb);\n            if (wb) {\n                this.scrollToBottom();\n            }\n             else if (this._finishedFetchingMoreMessages) {\n                this.scrollToPosition((((this.scrollContainer.scrollHeight - ub) - this.loadingHeight) + vb));\n            }\n        ;\n        },\n        _updateTimestamp: function(tb) {\n            if ((tb && tb.length)) {\n                this._oldestMessageDisplayedTimestamp = tb[0].timestamp;\n                this._currentMessageCount = tb.length;\n            }\n        ;\n            this._loadingMoreMessages = false;\n            this._finishedFetchingMoreMessages = true;\n            q.hide(this.loadingIcon);\n        },\n        isScrolledToBottom: function() {\n            var tb = this.scrollContainer;\n            return ((tb.scrollTop + tb.clientHeight) >= (tb.scrollHeight - ib));\n        },\n        isScrolledNearTop: function() {\n            return (this.scrollContainer.scrollTop < this.scrollContainer.clientHeight);\n        },\n        scrollToBottom: function(tb) {\n            this.scrollToPosition(this.scrollContainer.scrollHeight, tb);\n        },\n        scrollToPosition: function(tb, ub) {\n            (this._scrollTopAnimation && this._scrollTopAnimation.stop());\n            if ((ub === true)) {\n                this._scrollTopAnimation = (new h(this.scrollContainer)).to(\"scrollTop\", tb).ease(h.ease.end).duration(400).go();\n            }\n             else this.scrollContainer.scrollTop = tb;\n        ;\n        },\n        loadMoreMessages: function() {\n            if ((ca.hasLoadedExactlyNMessages(this.threadID, this._currentMessageCount) && ca.hasLoadedAllMessages(this.threadID))) {\n                return\n            };\n            if (ga.isNewEmptyLocalThread(this.threadID)) {\n                return\n            };\n            q.show(this.loadingIcon);\n            this.loadingHeight = this._getLoadingHeight();\n            this._loadingMoreMessages = true;\n            if ((this._fetchMultiplier < 10)) {\n                this._fetchMultiplier += 1;\n            };\n            var tb = (ha.RECENT_MESSAGES_LIMIT * this._fetchMultiplier), ub = (this._currentMessageCount + tb), vb = ca.hasLoadedNMessages(this.threadID, ub);\n            ca.getThreadMessagesRange(this.threadID, 0, ub, this._updateTimestamp.bind(this), null, x.CHAT);\n            if (vb) {\n                this.rerender();\n            };\n        },\n        _makeSingleMessage: function(tb) {\n            var ub = this._renderSingleMessage(tb);\n            q.addClass(ub, \"_55r0\");\n            return ub;\n        },\n        _renderSingleMessage: function(tb) {\n            var ub = qa[\":fb:chat:conversation:message\"].render(), vb = n.get(\"chat_tab_bubbles\");\n            if ((vb && la.isAuthor(tb.author))) {\n                ub.setAttribute(\"title\", jb(tb.timestamp));\n            };\n            if (tb.subject) {\n                var wb = qa[\":fb:chat:conversation:message:subject\"].render();\n                r.setContent(wb, tb.subject);\n                r.appendContent(ub, wb);\n            }\n        ;\n            function xb(fc) {\n                if (vb) {\n                    fc = r.create(\"span\", {\n                        \"data-measureme\": 1\n                    }, fc);\n                };\n                return fc;\n            };\n            if (tb.is_filtered_content) {\n                var yb = oa[\":fb:mercury:filtered-message\"].build();\n                r.appendContent(ub, xb(yb.getRoot()));\n                return ub;\n            }\n        ;\n            if ((tb.body.substr(0, 4) == \"?OTR\")) {\n                r.setContent(ub, xb(\"[encrypted message]\"));\n                q.addClass(ub, \"_542c\");\n            }\n             else {\n                q.addClass(ub, (za(tb.body) ? \"direction_rtl\" : \"direction_ltr\"));\n                var zb = ja.formatMessageBody(tb.body);\n                r.appendContent(ub, xb(zb));\n            }\n        ;\n            if (tb.has_attachment) {\n                var ac = g.div(null), bc = this._appendMessageAttachments(ac, tb);\n                if (((vb && !tb.body) && !bc)) {\n                    return ac\n                };\n                r.appendContent(ub, p(ac.childNodes));\n            }\n        ;\n            if (tb.forward_count) {\n                r.appendContent(ub, pb(tb));\n            };\n            if (tb.is_spoof_warning) {\n                var cc = qa[\":fb:chat:conversation:message:undertext\"].build();\n                r.appendContent(cc.getNode(\"message\"), ub);\n                la.get(tb.author, function(fc) {\n                    fa.renderChatSpoofWarning(cc.getNode(\"status\"), tb.is_spoof_warning, fc);\n                });\n                return cc.getRoot();\n            }\n        ;\n            var dc = ea.renderStatusIndicator(tb.status, tb.error_data, ba(ca.resendMessage, ca, tb));\n            if (dc) {\n                var ec = qa[\":fb:chat:conversation:message:status\"].build();\n                r.appendContent(ec.getNode(\"message\"), ub);\n                r.appendContent(ec.getNode(\"status\"), dc);\n                return ec.getRoot();\n            }\n        ;\n            return ub;\n        },\n        _appendMessageAttachments: function(tb, ub) {\n            var vb = 0, wb = ub.attachments;\n            wb.sort(l.booleanLexicographicComparator([l.isPhotoAttachment,l.isShareAttachment,l.isFileAttachment,l.isErrorAttachment,]));\n            if ((ub.raw_attachments && (ub.raw_attachments.length > 0))) {\n                wb = k.convertRaw(ub.raw_attachments);\n            };\n            var xb = l.renderPhotoAttachments(wb.filter(l.isPhotoAttachment), ub, 176, 4);\n            if (xb) {\n                r.appendContent(tb, xb);\n            };\n            for (var yb = 0; (yb < wb.length); yb++) {\n                if (l.isPhotoAttachment(wb[yb])) {\n                    vb = 1;\n                    continue;\n                }\n            ;\n                var zb = l.renderAttachment(true, wb[yb], ub);\n                (zb.error && r.appendContent(tb, zb.error));\n                (zb.content && r.appendContent(tb, zb.content));\n                vb |= zb.bubblePreferred;\n            };\n            var ac = r.scry(tb, \"img\");\n            ac.forEach(function(bc) {\n                t.listen(bc, \"load\", ba(this._thumbLoaded, this, bc));\n            }.bind(this));\n            return !!vb;\n        },\n        _thumbLoaded: function(tb) {\n            var ub = (this.scrollContainer.scrollTop + this.scrollContainer.clientHeight);\n            if (((ub + tb.offsetHeight) >= this.scrollContainer.scrollHeight)) {\n                this.scrollToBottom();\n            };\n        }\n    });\n    ra.subscribe(\"messages-reordered\", function(tb, ub) {\n        qb.forEach(function(vb) {\n            (ub[vb.threadID] && vb.rerender());\n        });\n    });\n    ra.subscribe(\"messages-updated\", function(tb, ub) {\n        qb.forEach(function(vb) {\n            (ub[vb.threadID] && vb.update(ub[vb.threadID]));\n        });\n    });\n    ra.subscribe(\"messages-received\", function(tb, ub) {\n        qb.forEach(function(vb) {\n            var wb = ub[vb.threadID];\n            if ((wb && wb.length)) {\n                vb._currentMessageCount += wb.length;\n            };\n            (wb && vb._appendNewMessages(wb));\n        });\n    });\n    i.subscribe(m.getArbiterType(\"chat_event\"), function(tb, ub) {\n        if (sb(ub.obj)) {\n            var vb = (((s.user == ub.obj.from)) ? ub.obj.to : ub.obj.from), wb = ga.getThreadIdForUser(vb), xb = qb.filter(function(ac) {\n                return (ac.threadID === wb);\n            });\n            if ((xb.length > 0)) {\n                var yb = xb[0], zb = ca.constructLogMessageObject(aa.CHAT_WEB, wb, z.VIDEO_CALL, ub.obj);\n                zb.author = (\"fbid:\" + ub.obj.from);\n                yb._appendNewMessages([zb,]);\n            }\n        ;\n        }\n    ;\n    });\n    function sb(tb) {\n        return (((tb.event_name === \"installing\") || (tb.event_name === \"install_canceled\")));\n    };\n    e.exports = rb;\n});\n__d(\"MercuryPeopleSuggestions\", [\"KeyedCallbackManager\",\"MercuryServerDispatcher\",\"OrderedFriendsList\",\"ShortProfiles\",\"arrayContains\",], function(a, b, c, d, e, f) {\n    var g = b(\"KeyedCallbackManager\"), h = b(\"MercuryServerDispatcher\"), i = b(\"OrderedFriendsList\"), j = b(\"ShortProfiles\"), k = b(\"arrayContains\"), l = new g(), m = 6;\n    function n(s) {\n        return s.sort().join(\",\");\n    };\n    function o(s, t) {\n        if ((s.length < m)) {\n            var u = i.getList();\n            for (var v = 0; (v < u.length); v++) {\n                if (!((k(s, u[v]) || k(t, u[v])))) {\n                    s.push(u[v]);\n                    if ((s.length >= m)) {\n                        break;\n                    };\n                }\n            ;\n            };\n        }\n    ;\n        return s;\n    };\n    function p(s) {\n        h.trySend(\"/ajax/chat/people_suggest.php\", s);\n    };\n    function q(s, t, u) {\n        s = s.filter(function(w) {\n            return !k(t, w);\n        });\n        var v = o(s, t);\n        j.getMulti(v, function() {\n            u(v);\n        });\n    };\n    var r = {\n        getPeopleSuggestions: function(s, t) {\n            if (s) {\n                if (s.length) {\n                    var u = n(s), v = l.executeOrEnqueue(u, function(x) {\n                        q(x, s, t);\n                    }), w = l.getUnavailableResources(v);\n                    if (w.length) {\n                        p({\n                            query: u,\n                            size: m\n                        });\n                    };\n                    return v;\n                }\n                 else q([], [], t);\n            \n            };\n            return 0;\n        },\n        handleUpdate: function(s) {\n            if (s.query) {\n                var t = (s.suggestions || \"\"), u = (t.length ? t.split(\",\") : []);\n                l.setResource(s.query, u);\n            }\n        ;\n        }\n    };\n    h.registerEndpoints({\n        \"/ajax/chat/people_suggest.php\": {\n            mode: h.IMMEDIATE,\n            handler: r.handleUpdate\n        }\n    });\n    e.exports = r;\n});\n__d(\"ChatTabPeopleSuggestionView\", [\"ChatPeopleSuggestionList.react\",\"ChatQuietLinks\",\"CSS\",\"DOM\",\"Event\",\"MercuryPeopleSuggestions\",\"MercuryIDs\",\"React\",\"ShortProfiles\",\"Style\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"ChatPeopleSuggestionList.react\"), h = b(\"ChatQuietLinks\"), i = b(\"CSS\"), j = b(\"DOM\"), k = b(\"Event\"), l = b(\"MercuryPeopleSuggestions\"), m = b(\"MercuryIDs\"), n = b(\"React\"), o = b(\"ShortProfiles\"), p = b(\"Style\"), q = b(\"copyProperties\");\n    function r(s, t, u) {\n        this.sheetController = s;\n        this.viewNode = t;\n        this.loadingIcon = u;\n        this.addFriendsSheet = s.getAddFriendsTabSheet();\n        this.mercuryTypeahead = (this.addFriendsSheet && this.addFriendsSheet._typeahead);\n        this.typeaheadInput = (this.mercuryTypeahead && this.mercuryTypeahead._input);\n        this.typeaheadView = (this.mercuryTypeahead && this.mercuryTypeahead.getTypeahead().getView());\n        var v = this.showSuggestions.bind(this);\n        if (this.typeaheadInput) {\n            k.listen(this.typeaheadInput, \"focus\", v);\n        };\n        if (this.typeaheadView) {\n            this.typeaheadView.subscribe(\"reset\", v);\n            this.typeaheadView.subscribe(\"render\", this.clearSuggestions.bind(this));\n        }\n    ;\n        this.tokenizer = (this.mercuryTypeahead && this.mercuryTypeahead.getTokenizer());\n        if (this.tokenizer) {\n            this.tokenizer.subscribe(\"removeToken\", v);\n        };\n        this.showSuggestions();\n    };\n    q(r.prototype, {\n        addSelectedParticipant: function(s) {\n            var t = o.getNow(s);\n            if ((t && this.tokenizer)) {\n                this.tokenizer.addToken(this.tokenizer.createToken({\n                    uid: s,\n                    text: t.name\n                }));\n                this.showSuggestions();\n            }\n        ;\n        },\n        showSuggestions: function() {\n            if (this.mercuryTypeahead) {\n                var s = this.mercuryTypeahead.getSelectedParticipantIDs();\n                s = s.map(m.getUserIDFromParticipantID);\n                j.empty(this.viewNode);\n                i.show(this.loadingIcon);\n                l.getPeopleSuggestions(s, function(t) {\n                    var u = g({\n                        uids: t,\n                        onClick: this.addSelectedParticipant.bind(this)\n                    });\n                    i.hide(this.loadingIcon);\n                    n.renderComponent(u, this.viewNode);\n                    h.removeAllHrefs(this.viewNode);\n                }.bind(this));\n            }\n        ;\n        },\n        clearSuggestions: function() {\n            j.empty(this.viewNode);\n            i.hide(this.loadingIcon);\n            p.set(this.viewNode, \"margin-top\", 0);\n        },\n        destroy: function() {\n            this.clearSuggestions();\n        }\n    });\n    e.exports = r;\n});\n__d(\"ChatAddFriendsTabSheetRawRenderer\", [\"ContextualTypeaheadView\",\"DOM\",\"Event\",\"MercuryTypeahead\",\"ChatTabTemplates\",\"tx\",\"MercuryDataSourceWrapper\",], function(a, b, c, d, e, f) {\n    var g = b(\"ContextualTypeaheadView\"), h = b(\"DOM\"), i = b(\"Event\"), j = b(\"MercuryTypeahead\"), k = b(\"ChatTabTemplates\"), l = b(\"tx\"), m = b(\"MercuryDataSourceWrapper\").source, n = {\n        render: function(o, p, q, r, s, t) {\n            var u = (t ? k[\":fb:mercury:chat:tab-sheet:add-friends-empty-tab\"].build() : k[\":fb:mercury:chat:tab-sheet:add-friends\"].build()), v = new j(m, g);\n            v.setExcludedParticipants(r.participants);\n            if (!t) {\n                v.setPlaceholder(\"Add friends to this chat\");\n            };\n            v.build();\n            h.replace(u.getNode(\"participantsTypeahead\"), v.getElement());\n            h.setContent(q, u.getRoot());\n            v.getTokenizer().adjustWidth();\n            v.focus();\n            if (!t) {\n                var w = function() {\n                    var x = v.getSelectedParticipantIDs();\n                    if (x.length) {\n                        s(x);\n                    };\n                    p.close(o);\n                };\n                i.listen(u.getNode(\"doneButton\"), \"click\", w);\n            }\n        ;\n            return v;\n        }\n    };\n    e.exports = n;\n});\n__d(\"MultiChatController\", [\"Arbiter\",\"AsyncSignal\",\"copyProperties\",\"Form\",\"MercuryMessages\",\"MercuryServerRequests\",\"MercuryThreads\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"AsyncSignal\"), i = b(\"copyProperties\"), j = b(\"Form\"), k = b(\"MercuryMessages\").get(), l = b(\"MercuryServerRequests\").get(), m = b(\"MercuryThreads\").get();\n    function n() {\n    \n    };\n    i(n, {\n        subscribe: function(o, p) {\n            o.subscribe(\"confirm\", function() {\n                this.createGroupThreadFromChooserDialog(o, p);\n            }.bind(this));\n        },\n        createGroupThreadFromChooserDialog: function(o, p) {\n            var q = j.serialize(o.getRoot()), r = JSON.parse(q.profileChooserItems), s = [];\n            for (var t in r) {\n                if (r[t]) {\n                    s.push(t);\n                };\n            };\n            var u = n.createThreadForFBIDs(s);\n            l.subscribe(\"update-thread-ids\", function(v, w) {\n                for (var x in w) {\n                    if ((w[x] == u)) {\n                        new h(\"/ajax/groups/chat/log\", {\n                            group_id: p,\n                            message_id: x\n                        }).send();\n                    };\n                };\n            });\n            o.hide();\n        },\n        createThreadForTokens: function(o) {\n            if (!o.length) {\n                return\n            };\n            var p;\n            if ((o.length == 1)) {\n                p = (\"user:\" + o[0].split(\":\")[1]);\n            }\n             else p = (\"root:\" + k.generateNewClientMessageID(Date.now()));\n        ;\n            m.createNewLocalThread(p, o);\n            g.inform(\"chat/open-tab\", {\n                thread_id: p\n            });\n            return p;\n        },\n        createThreadForFBIDs: function(o) {\n            var p = [];\n            for (var q = 0; (q < o.length); q++) {\n                p.push((\"fbid:\" + o[q]));;\n            };\n            return n.createThreadForTokens(p);\n        }\n    });\n    e.exports = n;\n});\n__d(\"ChatAddFriendsTabSheet\", [\"Arbiter\",\"ChatAddFriendsTabSheetRawRenderer\",\"MercuryLogMessageType\",\"MercurySourceType\",\"MercuryMessages\",\"MultiChatController\",\"Style\",\"MercuryThreads\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ChatAddFriendsTabSheetRawRenderer\"), i = b(\"MercuryLogMessageType\"), j = b(\"MercurySourceType\"), k = b(\"MercuryMessages\").get(), l = b(\"MultiChatController\"), m = b(\"Style\"), n = b(\"MercuryThreads\").get(), o = b(\"copyProperties\");\n    function p(s, t, u) {\n        this._threadID = s;\n        this._rootElement = t;\n        this._sheetView = u;\n        this._typeahead = null;\n    };\n    o(p.prototype, {\n        render: function() {\n            n.getThreadMeta(this._threadID, function(s) {\n                var t = (s.is_canonical_user ? q : r);\n                this._typeahead = h.render(this, this._sheetView, this._rootElement, s, t.curry(s), n.isNewEmptyLocalThread(this._threadID));\n                this._typeahead.subscribe(\"resize\", function() {\n                    this._sheetView.inform(\"resize\");\n                }.bind(this));\n            }.bind(this));\n        },\n        getParticipants: function() {\n            if (!this._typeahead) {\n                return null\n            };\n            return this._typeahead.getSelectedParticipantIDs();\n        },\n        isPermanent: function() {\n            return true;\n        },\n        getType: function() {\n            return \"add_friends_type\";\n        },\n        open: function() {\n            this._sheetView.open(this);\n        },\n        close: function() {\n            this._sheetView.close(this);\n        },\n        getHeight: function() {\n            return m.get(this._rootElement, \"height\");\n        }\n    });\n    function q(s, t) {\n        var u = s.participants;\n        l.createThreadForTokens(u.concat(t));\n    };\n    function r(s, t) {\n        var u = s.thread_id;\n        if (n.isEmptyLocalThread(u)) {\n            n.addParticipantsToThreadLocally(u, t);\n            g.inform(\"chat/open-tab\", {\n                thread_id: u\n            });\n        }\n         else {\n            k.sendMessage(k.constructLogMessageObject(j.CHAT_WEB, u, i.SUBSCRIBE, {\n                added_participants: t\n            }));\n            g.inform(\"chat/open-tab\", {\n                thread_id: u\n            });\n        }\n    ;\n    };\n    e.exports = p;\n});\n__d(\"ChatNameConversationTabSheetRawRenderer\", [\"DOM\",\"Event\",\"Input\",\"Keys\",\"ChatTabTemplates\",\"fbt\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOM\"), h = b(\"Event\"), i = b(\"Input\"), j = b(\"Keys\"), k = b(\"ChatTabTemplates\"), l = b(\"fbt\"), m = {\n        render: function(n, o, p, q, r, s) {\n            var t = k[\":fb:mercury:chat:tab-sheet:name-conversation\"].build(), u = t.getNode(\"nameInput\"), v = t.getNode(\"doneButton\"), w = \"Done\", x = \"Hide\", y = q.name;\n            if (y) {\n                i.setValue(u, y);\n            }\n             else g.setContent(v, x);\n        ;\n            var z = function() {\n                var aa = i.getValue(u);\n                if (aa) {\n                    r(aa);\n                };\n                s();\n                o.close(n);\n            };\n            h.listen(u, \"input\", function() {\n                g.setContent(v, ((i.getValue(u).length === 0) ? x : w));\n            });\n            h.listen(v, \"click\", z);\n            h.listen(u, \"keyup\", function(aa) {\n                if ((aa.keyCode === j.RETURN)) {\n                    z();\n                    return false;\n                }\n            ;\n            });\n            g.setContent(p, t.getRoot());\n            (!n.isAutomatic() && u.focus());\n        }\n    };\n    e.exports = m;\n});\n__d(\"ChatNameConversationTabSheet\", [\"AsyncRequest\",\"ChatNameConversationTabSheetRawRenderer\",\"MercuryAPIArgsSource\",\"MercuryLogMessageType\",\"MercurySourceType\",\"MercuryMessages\",\"MercuryServerRequests\",\"MercuryThreads\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = b(\"ChatNameConversationTabSheetRawRenderer\"), i = b(\"MercuryAPIArgsSource\"), j = b(\"MercuryLogMessageType\"), k = b(\"MercurySourceType\"), l = b(\"MercuryMessages\").get(), m = b(\"MercuryServerRequests\").get(), n = b(\"MercuryThreads\").get(), o = b(\"copyProperties\"), p = \"/ajax/chat/multichat/name_conversation/dismiss.php\";\n    function q(t, u, v) {\n        this._threadID = t;\n        this._rootElement = u;\n        this._sheetView = v;\n        this._isAutomatic = false;\n    };\n    o(q.prototype, {\n        render: function() {\n            n.getThreadMeta(this._threadID, function(t) {\n                h.render(this, this._sheetView, this._rootElement, t, r.curry(t), s.curry(t));\n            }.bind(this));\n        },\n        isPermanent: function() {\n            return true;\n        },\n        getType: function() {\n            return \"name_conversation_type\";\n        },\n        open: function(t) {\n            this._isAutomatic = t;\n            this._sheetView.open(this);\n        },\n        close: function() {\n            this._sheetView.close(this);\n        },\n        isAutomatic: function() {\n            return this._isAutomatic;\n        }\n    });\n    function r(t, u) {\n        var v = t.name;\n        if ((((u || v)) && ((u != v)))) {\n            l.sendMessage(l.constructLogMessageObject(k.CHAT_WEB, t.thread_id, j.THREAD_NAME, {\n                name: u\n            }), null, i.CHAT);\n        };\n    };\n    function s(t) {\n        if (!t.name_conversation_sheet_dismissed) {\n            t.name_conversation_sheet_dismissed = true;\n            m.getServerThreadID(t.thread_id, function(u) {\n                new g(p).setData({\n                    thread_id: u\n                }).send();\n            });\n        }\n    ;\n    };\n    e.exports = q;\n});\n__d(\"ChatNewMessagesTabSheet\", [\"Event\",\"ArbiterMixin\",\"DOM\",\"ChatTabTemplates\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"ArbiterMixin\"), i = b(\"DOM\"), j = b(\"ChatTabTemplates\"), k = b(\"copyProperties\");\n    function l(m, n, o) {\n        this._threadID = m;\n        this._rootElement = n;\n        this._sheetView = o;\n    };\n    k(l.prototype, h, {\n        render: function() {\n            var m = j[\":fb:mercury:chat:tab-sheet:clickable-message-icon-sheet\"].build();\n            i.setContent(m.getNode(\"text\"), i.tx._(\"Scroll down to see new messages.\"));\n            i.setContent(this._rootElement, m.getRoot());\n            g.listen(m.getRoot(), \"click\", function() {\n                this.inform(\"clicked\", this._threadID);\n            }.bind(this));\n        },\n        isPermanent: function() {\n            return true;\n        },\n        getType: function() {\n            return \"new_messages_type\";\n        },\n        open: function() {\n            this._sheetView.open(this);\n        },\n        close: function() {\n            this._sheetView.close(this);\n        }\n    });\n    e.exports = l;\n});\n__d(\"ChatNoRecipientsTabSheet\", [\"DOM\",\"fbt\",\"MercuryParticipants\",\"ChatTabTemplates\",\"MercuryThreadInformer\",\"MercuryThreads\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOM\"), h = b(\"fbt\"), i = b(\"MercuryParticipants\"), j = b(\"ChatTabTemplates\"), k = b(\"MercuryThreadInformer\").get(), l = b(\"MercuryThreads\").get(), m = b(\"copyProperties\");\n    function n(o, p, q) {\n        this._threadID = o;\n        this._rootElement = p;\n        this._sheetView = q;\n        k.subscribe(\"threads-updated\", this._handleThreadsUpdated.bind(this));\n    };\n    m(n.prototype, {\n        render: function() {\n            var o = j[\":fb:mercury:chat:tab-sheet:message-icon-sheet\"].build();\n            g.setContent(o.getNode(\"text\"), \"Everyone has left the conversation.\");\n            g.setContent(this._rootElement, o.getRoot());\n        },\n        isPermanent: function() {\n            return true;\n        },\n        getType: function() {\n            return \"no_recipients_type\";\n        },\n        _handleThreadsUpdated: function() {\n            l.getThreadMeta(this._threadID, function(o) {\n                var p = i.user, q = o.participants.filter(function(r) {\n                    return (r != p);\n                });\n                if ((((q.length < 1) && !o.is_joinable) && !l.isNewEmptyLocalThread(this._threadID))) {\n                    this._sheetView.open(this);\n                }\n                 else this._sheetView.close(this);\n            ;\n            }.bind(this));\n        }\n    });\n    e.exports = n;\n});\n__d(\"ChatOfflineTabSheet\", [\"ChatPrivacyActionController\",\"ChatVisibility\",\"CSS\",\"DOM\",\"Event\",\"JSLogger\",\"MercuryParticipants\",\"MercuryThreads\",\"ChatTabTemplates\",\"copyProperties\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"ChatPrivacyActionController\"), h = b(\"ChatVisibility\"), i = b(\"CSS\"), j = b(\"DOM\"), k = b(\"Event\"), l = b(\"JSLogger\"), m = b(\"MercuryParticipants\"), n = b(\"MercuryThreads\").get(), o = b(\"ChatTabTemplates\"), p = b(\"copyProperties\"), q = b(\"cx\");\n    function r(s, t, u) {\n        this._rootElement = t;\n        this._sheetView = u;\n        this._logger = l.create(\"blackbird\");\n        this._canonicalUser = n.getCanonicalUserInThread(s);\n        if (this._canonicalUser) {\n            this._privacyActionController = new g(this._canonicalUser, this._handlePrivacyChange.bind(this));\n        };\n    };\n    p(r.prototype, {\n        render: function() {\n            if (!this._canonicalUser) {\n                this._logger.error(\"offline_sheet_open_with_non_friend\");\n                return;\n            }\n        ;\n            var s = o[\":fb:mercury:chat:tab-sheet:message-icon-sheet\"].build(), t = (\"fbid:\" + this._canonicalUser);\n            m.get(t, function(u) {\n                var v = \"fbChatGoOnlineLink\", w = j.tx._(\"turn on chat\"), x = j.create(\"a\", {\n                    href: \"#\",\n                    className: v\n                }, w), y = j.tx._(\"To chat with {name} and other friends, {link}.\", {\n                    name: u.short_name,\n                    link: x\n                });\n                j.setContent(s.getNode(\"text\"), y);\n                i.addClass(s.getRoot(), \"_1sk1\");\n                j.setContent(this._rootElement, s.getRoot());\n                k.listen(this._rootElement, \"click\", function(event) {\n                    if (i.hasClass(event.getTarget(), v)) {\n                        if (h.isOnline()) {\n                            this._logger.error(\"tab_sheet_already_online\");\n                        };\n                        this._privacyActionController.togglePrivacy();\n                        this._logger.log(\"tab_sheet_go_online\", {\n                            tab_id: this._canonicalUser\n                        });\n                        return false;\n                    }\n                ;\n                }.bind(this));\n            }.bind(this));\n        },\n        _handlePrivacyChange: function(s) {\n            if (!this._canonicalUser) {\n                this._logger.error(\"user_blocked_sheet_privacy_changed_non_friend\");\n            };\n            switch (s) {\n              case g.OFFLINE:\n                this._sheetView.open(this);\n                break;\n              case g.NORMAL:\n            \n              case g.BLOCKED:\n                this._sheetView.close(this);\n                break;\n            };\n        },\n        isPermanent: function() {\n            return true;\n        },\n        getType: function() {\n            return \"offline_type\";\n        },\n        destroy: function() {\n            (this._privacyActionController && this._privacyActionController.destroy());\n        }\n    });\n    e.exports = r;\n});\n__d(\"ChatUploadWarningTabSheet\", [\"DOM\",\"ChatTabTemplates\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOM\"), h = b(\"ChatTabTemplates\"), i = b(\"copyProperties\");\n    function j(k, l, m) {\n        this._threadID = k;\n        this._rootElement = l;\n        this._sheetView = m;\n    };\n    i(j.prototype, {\n        render: function() {\n            var k = h[\":fb:mercury:chat:tab-sheet:message-icon-sheet\"].build();\n            g.setContent(k.getNode(\"text\"), g.tx._(\"Please wait until the upload is complete before you send your message.\"));\n            g.setContent(this._rootElement, k.getRoot());\n        },\n        isPermanent: function() {\n            return false;\n        },\n        getType: function() {\n            return \"upload_warning_type\";\n        },\n        open: function() {\n            this._sheetView.open(this);\n        },\n        close: function() {\n            this._sheetView.close(this);\n        }\n    });\n    e.exports = j;\n});\n__d(\"ChatThreadIsMutedTabSheet\", [\"Event\",\"ArbiterMixin\",\"DOM\",\"ChatTabTemplates\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"ArbiterMixin\"), i = b(\"DOM\"), j = b(\"ChatTabTemplates\"), k = b(\"copyProperties\");\n    function l(m, n, o) {\n        this._threadID = m;\n        this._rootElement = n;\n        this._sheetView = o;\n    };\n    k(l.prototype, h, {\n        render: function() {\n            var m = j[\":fb:mercury:chat:tab-sheet:message-mute-sheet\"].build();\n            i.setContent(m.getNode(\"text\"), i.tx._(\"This conversation is muted. Chat tabs will not pop up for it and push notifications are off.\"));\n            i.setContent(this._rootElement, m.getRoot());\n            g.listen(m.getNode(\"unmuteButton\"), \"click\", function() {\n                this.inform(\"clicked\", this._threadID);\n            }.bind(this));\n        },\n        isPermanent: function() {\n            return false;\n        },\n        getType: function() {\n            return \"chat-thread-is-muted\";\n        },\n        open: function() {\n            this._sheetView.open(this);\n        },\n        close: function() {\n            this._sheetView.close(this);\n        }\n    });\n    e.exports = l;\n});\n__d(\"ChatUserBlockedTabSheet\", [\"ChatPrivacyActionController\",\"CSS\",\"DOM\",\"Event\",\"GenderConst\",\"JSLogger\",\"MercuryParticipants\",\"MercuryThreads\",\"ChatTabTemplates\",\"copyProperties\",\"cx\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"ChatPrivacyActionController\"), h = b(\"CSS\"), i = b(\"DOM\"), j = b(\"Event\"), k = b(\"GenderConst\"), l = b(\"JSLogger\"), m = b(\"MercuryParticipants\"), n = b(\"MercuryThreads\").get(), o = b(\"ChatTabTemplates\"), p = b(\"copyProperties\"), q = b(\"cx\"), r = b(\"tx\");\n    function s(t, u, v) {\n        this._rootElement = u;\n        this._sheetView = v;\n        this._logger = l.create(\"blackbird\");\n        this._canonicalUser = n.getCanonicalUserInThread(t);\n        if (this._canonicalUser) {\n            this._privacyActionController = new g(this._canonicalUser, this._handlePrivacyChange.bind(this));\n        };\n    };\n    p(s.prototype, {\n        render: function() {\n            if (!this._canonicalUser) {\n                this._logger.error(\"user_blocked_sheet_open_with_non_friend\");\n                return;\n            }\n        ;\n            var t = o[\":fb:mercury:chat:tab-sheet:user-blocked\"].build(), u = (\"fbid:\" + this._canonicalUser);\n            m.get(u, function(v) {\n                var w = null;\n                switch (v.gender) {\n                  case k.FEMALE_SINGULAR:\n                \n                  case k.FEMALE_SINGULAR_GUESS:\n                    w = r._(\"You turned off chat for {name} but you can still send her a message. \", {\n                        name: v.short_name\n                    });\n                    break;\n                  case k.MALE_SINGULAR:\n                \n                  case k.MALE_SINGULAR_GUESS:\n                    w = r._(\"You turned off chat for {name} but you can still send him a message. \", {\n                        name: v.short_name\n                    });\n                    break;\n                  default:\n                    w = r._(\"You turned off chat for {name} but you can still send them a message. \", {\n                        name: v.short_name\n                    });\n                };\n                i.setContent(t.getNode(\"text\"), w);\n                var x = r._(\"Turn on chat for {name}?\", {\n                    name: v.short_name\n                });\n                i.setContent(t.getNode(\"actionLink\"), x);\n                h.addClass(t.getRoot(), \"_1sk0\");\n                i.setContent(this._rootElement, t.getRoot());\n                j.listen(t.getNode(\"actionLink\"), \"click\", this._privacyActionController.togglePrivacy.bind(this._privacyActionController));\n            }.bind(this));\n        },\n        _handlePrivacyChange: function(t) {\n            if (!this._canonicalUser) {\n                this._logger.error(\"user_blocked_sheet_privacy_changed_non_friend\");\n            };\n            switch (t) {\n              case g.BLOCKED:\n                this._sheetView.open(this);\n                break;\n              case g.NORMAL:\n            \n              case g.OFFLINE:\n                this._sheetView.close(this);\n                break;\n            };\n        },\n        isPermanent: function() {\n            return true;\n        },\n        getType: function() {\n            return \"user_blocked_type\";\n        },\n        destroy: function() {\n            (this._privacyActionController && this._privacyActionController.destroy());\n        }\n    });\n    e.exports = s;\n});\n__d(\"ChatUserJoinStatusTabSheet\", [\"Class\",\"JoinStatusTabSheet\",\"ChatTabTemplates\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Class\"), h = b(\"JoinStatusTabSheet\"), i = b(\"ChatTabTemplates\"), j = b(\"copyProperties\");\n    function k(l, m) {\n        this.parent.construct(this, l, m);\n    };\n    g.extend(k, h);\n    j(k.prototype, {\n        _getTemplate: function() {\n            return i[\":fb:mercury:chat:tab-sheet:message-icon-sheet\"];\n        }\n    });\n    e.exports = k;\n});\n__d(\"ChatTabSheetController\", [\"ChatAddFriendsTabSheet\",\"ChatNameConversationTabSheet\",\"ChatNewMessagesTabSheet\",\"ChatNoRecipientsTabSheet\",\"ChatOfflineTabSheet\",\"ChatUploadWarningTabSheet\",\"ChatThreadIsMutedTabSheet\",\"ChatUserBlockedTabSheet\",\"ChatUserJoinStatusTabSheet\",\"copyProperties\",\"MercurySheetView\",\"MercuryThreads\",], function(a, b, c, d, e, f) {\n    var g = b(\"ChatAddFriendsTabSheet\"), h = b(\"ChatNameConversationTabSheet\"), i = b(\"ChatNewMessagesTabSheet\"), j = b(\"ChatNoRecipientsTabSheet\"), k = b(\"ChatOfflineTabSheet\"), l = b(\"ChatUploadWarningTabSheet\"), m = b(\"ChatThreadIsMutedTabSheet\"), n = b(\"ChatUserBlockedTabSheet\"), o = b(\"ChatUserJoinStatusTabSheet\"), p = b(\"copyProperties\"), q = b(\"MercurySheetView\"), r = b(\"MercuryThreads\").get(), s = function(t, u, v) {\n        this._sheetView = new q(t, u, v);\n        this._addFriendsTabSheet = new g(t, u, this._sheetView);\n        this._nameConversationTabSheet = new h(t, u, this._sheetView);\n        this._userBlockedTabSheet = new n(t, u, this._sheetView);\n        this._offlineTabSheet = new k(t, u, this._sheetView);\n        this._newMessagesTabSheet = new i(t, u, this._sheetView);\n        this._uploadWarningTabSheet = new l(t, u, this._sheetView);\n        this._threadIsMutedTabSheet = new m(t, u, this._sheetView);\n        this._userJoinStatusTabSheet = new o(u, this._sheetView);\n        if (!r.getCanonicalUserInThread(t)) {\n            this._noRecipientsTabSheet = new j(t, u, this._sheetView);\n        };\n    };\n    p(s.prototype, {\n        openAddFriendsSheet: function() {\n            this._addFriendsTabSheet.open();\n        },\n        openUserJoinStatusSheet: function(t) {\n            this._userJoinStatusTabSheet.addToQueue(t);\n        },\n        getAddFriendsTabSheet: function() {\n            return this._addFriendsTabSheet;\n        },\n        getAddFriendsParticipants: function() {\n            var t = this._addFriendsTabSheet.getParticipants();\n            this._addFriendsTabSheet.close();\n            return t;\n        },\n        openNameConversationSheet: function(t) {\n            this._nameConversationTabSheet.open(t);\n        },\n        openNewMessagesSheet: function() {\n            this._newMessagesTabSheet.open();\n        },\n        openUploadWarningTabSheet: function() {\n            this._uploadWarningTabSheet.open();\n        },\n        openThreadIsMutedTabSheet: function() {\n            this._threadIsMutedTabSheet.open();\n        },\n        closeAutomaticNameConversationSheet: function() {\n            if (this._nameConversationTabSheet.isAutomatic()) {\n                this._nameConversationTabSheet.close();\n            };\n        },\n        closeThreadIsMutedTabSheet: function() {\n            this._threadIsMutedTabSheet.close();\n        },\n        closeNewMessagesSheet: function() {\n            this._newMessagesTabSheet.close();\n        },\n        closeUploadWarningTabSheet: function() {\n            this._uploadWarningTabSheet.close();\n        },\n        onClickNewMessagesSheet: function(t) {\n            this._newMessageClickSub = this._newMessagesTabSheet.subscribe(\"clicked\", t);\n        },\n        onClickThreadIsMutedSheet: function(t) {\n            this._threadIsMutedClickSub = this._threadIsMutedTabSheet.subscribe(\"clicked\", t);\n        },\n        onResize: function(t) {\n            this._sheetView.subscribe(\"resize\", t);\n        },\n        destroy: function() {\n            this._sheetView.destroy();\n            this._offlineTabSheet.destroy();\n            this._userBlockedTabSheet.destroy();\n            (this._newMessageClickSub && this._newMessageClickSub.unsubscribe());\n            (this._threadIsMutedClickSub && this._threadIsMutedClickSub.unsubscribe());\n        }\n    });\n    e.exports = s;\n});\n__d(\"ChatTabView\", [\"Event\",\"function-extensions\",\"Arbiter\",\"ArbiterMixin\",\"AsyncDialog\",\"AsyncRequest\",\"AsyncSignal\",\"AvailableListConstants\",\"ChatBehavior\",\"ChatConfig\",\"ChatContextualDialogController\",\"ChatAutoSendPhotoUploader\",\"ChatPrivacyActionController\",\"ChatQuietLinks\",\"ChatTabMessagesView\",\"ChatTabPeopleSuggestionView\",\"ChatTabSheetController\",\"ChatVisibility\",\"MercuryConstants\",\"CSS\",\"Dialog\",\"Dock\",\"DOM\",\"Input\",\"JSLogger\",\"Keys\",\"Locale\",\"MercuryActionStatus\",\"MercuryFileUploader\",\"MercuryLogMessageType\",\"MercuryMessages\",\"MercuryParticipants\",\"MercuryServerRequests\",\"MercurySourceType\",\"MercuryStickers\",\"MercuryThreadInformer\",\"MercuryThreadMetadataRawRenderer\",\"MercuryThreadMetadataRenderer\",\"MercuryThreadMuter\",\"MercuryThreads\",\"MercuryTypingReceiver\",\"MessagesEmoticonView\",\"NubController\",\"Parent\",\"PhotosUploadWaterfall\",\"PresencePrivacy\",\"PresenceStatus\",\"Run\",\"Style\",\"SubscriptionsHandler\",\"ChatTabTemplates\",\"TextAreaControl\",\"Tooltip\",\"TypingDetectorController\",\"URI\",\"UserAgent\",\"VideoCallCore\",\"WaterfallIDGenerator\",\"copyProperties\",\"cx\",\"setIntervalAcrossTransitions\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\");\n    b(\"function-extensions\");\n    var h = b(\"Arbiter\"), i = b(\"ArbiterMixin\"), j = b(\"AsyncDialog\"), k = b(\"AsyncRequest\"), l = b(\"AsyncSignal\"), m = b(\"AvailableListConstants\"), n = b(\"ChatBehavior\"), o = b(\"ChatConfig\"), p = b(\"ChatContextualDialogController\"), q = b(\"ChatAutoSendPhotoUploader\"), r = b(\"ChatPrivacyActionController\"), s = b(\"ChatQuietLinks\"), t = b(\"ChatTabMessagesView\"), u = b(\"ChatTabPeopleSuggestionView\"), v = b(\"ChatTabSheetController\"), w = b(\"ChatVisibility\"), x = b(\"MercuryConstants\"), y = b(\"CSS\"), z = b(\"Dialog\"), aa = b(\"Dock\"), ba = b(\"DOM\"), ca = b(\"Input\"), da = b(\"JSLogger\"), ea = b(\"Keys\"), fa = b(\"Locale\"), ga = b(\"MercuryActionStatus\"), ha = b(\"MercuryFileUploader\"), ia = b(\"MercuryLogMessageType\"), ja = b(\"MercuryMessages\").get(), ka = b(\"MercuryParticipants\"), la = b(\"MercuryServerRequests\").get(), ma = b(\"MercurySourceType\"), na = b(\"MercuryStickers\"), oa = b(\"MercuryThreadInformer\").get(), pa = b(\"MercuryThreadMetadataRawRenderer\"), qa = b(\"MercuryThreadMetadataRenderer\").get(), ra = b(\"MercuryThreadMuter\"), sa = b(\"MercuryThreads\").get(), ta = b(\"MercuryTypingReceiver\"), ua = b(\"MessagesEmoticonView\"), va = b(\"NubController\"), wa = b(\"Parent\"), xa = b(\"PhotosUploadWaterfall\"), ya = b(\"PresencePrivacy\"), za = b(\"PresenceStatus\"), ab = b(\"Run\"), bb = b(\"Style\"), cb = b(\"SubscriptionsHandler\"), db = b(\"ChatTabTemplates\"), eb = b(\"TextAreaControl\"), fb = b(\"Tooltip\"), gb = b(\"TypingDetectorController\"), hb = b(\"URI\"), ib = b(\"UserAgent\"), jb = b(\"VideoCallCore\"), kb = b(\"WaterfallIDGenerator\"), lb = b(\"copyProperties\"), mb = b(\"cx\"), nb = b(\"setIntervalAcrossTransitions\"), ob = b(\"tx\"), pb = /^\\s*$/, qb = da.create(\"tab_view\"), rb = {\n    }, sb = null, tb, ub;\n    function vb(qc, rc) {\n        var sc = ba.create(\"div\");\n        rc = rc.filter(function(tc) {\n            return (tc != ka.user);\n        });\n        if (!rc.length) {\n            return fb.remove(qc)\n        };\n        ka.getMulti(rc, function(tc) {\n            for (var uc in tc) {\n                var vc = tc[uc], wc = db[\":fb:mercury:chat:multichat-tooltip-item\"].build();\n                ba.setContent(wc.getNode(\"name\"), vc.name);\n                var xc = ka.getUserID(uc), yc = (xc && (za.get(xc) == m.ACTIVE));\n                y.conditionShow(wc.getNode(\"icon\"), yc);\n                y.conditionClass(wc.getNode(\"name\"), \"tooltipItemWithIcon\", yc);\n                ba.appendContent(sc, wc.getRoot());\n            };\n            fb.set(qc, sc, \"above\");\n        });\n    };\n    var wb = {\n    }, xb = null, yb = false;\n    function zb(qc, rc, sc) {\n        if (sc) {\n            wb[qc] = rc;\n            if (!xb) {\n                xb = nb(ac, 600);\n            };\n        }\n         else {\n            y.removeClass(rc, \"highlightTitle\");\n            delete wb[qc];\n        }\n    ;\n    };\n    function ac() {\n        for (var qc in wb) {\n            var rc = wb[qc];\n            if (rc.parentNode) {\n                y.conditionClass(rc, \"highlightTitle\", yb);\n            }\n             else delete wb[qc];\n        ;\n        };\n        yb = !yb;\n        if (!Object.keys(wb).length) {\n            clearInterval(xb);\n            xb = null;\n        }\n    ;\n    };\n    function bc(qc) {\n        var rc = la.tokenizeThreadID(qc);\n        switch (rc.type) {\n          case \"user\":\n            return db[\":fb:mercury:chat:user-tab\"].build();\n        };\n        return db[\":fb:mercury:chat:multichat-tab\"].build();\n    };\n    function cc(qc) {\n        var rc = (qc._tabTemplate.getNode(\"input\").value || \"\"), sc = qc._fileUploader.getAttachments();\n        if (ic(qc)) {\n            ec(qc, rc, sc, function(tc) {\n                var uc = qc._fileUploader.getImageIDs();\n                if ((uc.length > 0)) {\n                    tc.photo_fbids = uc;\n                    tc.has_attachment = true;\n                }\n            ;\n                ja.sendMessage(tc);\n                qc._fileUploader.removeAttachments();\n                qc._getNode(\"input\").value = \"\";\n                (qc._lastMessageIndicator && qc._lastMessageIndicator.resetState());\n                (qc._messagesView && qc._messagesView.scrollToBottom());\n            });\n        };\n    };\n    function dc(qc, rc) {\n        if ((rc === 0)) {\n            return\n        };\n        mc(qc, xa.POST_PUBLISHED, {\n            count: rc\n        });\n        qc._waterfallID = kb.generate();\n    };\n    function ec(qc, rc, sc, tc) {\n        sa.getThreadMeta(qc._threadID, function(uc) {\n            var vc = ja.constructUserGeneratedMessageObject(rc, ma.CHAT_WEB, qc._threadID);\n            if ((sc.length > 0)) {\n                vc.has_attachment = true;\n                vc.raw_attachments = sc;\n            }\n        ;\n            if (sa.isNewEmptyLocalThread(qc._threadID)) {\n                var wc = qc._sheetController.getAddFriendsParticipants();\n                if (((wc === null) || (wc.length === 0))) {\n                    return;\n                }\n                 else if ((wc.length === 1)) {\n                    var xc = (\"user:\" + ka.getUserID(wc[0]));\n                    vc.thread_id = xc;\n                }\n                 else sa.addParticipantsToThreadLocally(qc._threadID, wc);\n                \n            ;\n            }\n        ;\n            if (sa.isEmptyLocalThread(qc._threadID)) {\n                var yc = la.tokenizeThreadID(qc._threadID);\n                vc.message_id = yc.value;\n                vc.specific_to_list = uc.participants;\n            }\n        ;\n            if ((typeof vc != \"undefined\")) {\n                vc.signatureID = qc._signatureID;\n            };\n            vc.ui_push_phase = x.UIPushPhase;\n            tc(vc);\n            if ((qc._threadID !== vc.thread_id)) {\n                nc.inform(\"closed-tab\", qc._threadID);\n                h.inform(\"chat/open-tab\", {\n                    thread_id: vc.thread_id\n                });\n            }\n        ;\n        });\n    };\n    function fc(qc) {\n        qc._blocked = true;\n        qc._sheetController.openUploadWarningTabSheet();\n    };\n    function gc(qc) {\n        return ((qc._fileUploader.isUploading() || qc._photoUploader.isUploading()));\n    };\n    function hc(qc) {\n        return qc._fileUploader.isUploading();\n    };\n    function ic(qc) {\n        var rc = (qc._tabTemplate.getNode(\"input\").value || \"\");\n        if (!pb.test(rc)) {\n            return true\n        };\n        if (((qc._fileUploader.getAttachments().length > 0) || (qc._fileUploader.getImageIDs().length > 0))) {\n            return true\n        };\n        return false;\n    };\n    function jc(qc) {\n        if (qc._blocked) {\n            if (hc(qc)) {\n                return\n            };\n            qc._blocked = false;\n            cc(qc);\n            qc._sheetController.closeUploadWarningTabSheet();\n        }\n    ;\n    };\n    function kc(qc) {\n        qc._nubController.flyoutContentChanged();\n        qc._attachmentsDiv.scrollTop = qc._attachmentsDiv.scrollHeight;\n    };\n    function lc(qc, rc, sc) {\n        qc._subscriptionsHandler.addSubscriptions(qc._photoUploader.subscribe(rc, function(tc, uc) {\n            mc(qc, sc, uc);\n        }));\n    };\n    function mc(qc, rc, sc) {\n        xa.sendSignal(lb({\n            qn: qc._waterfallID,\n            step: rc,\n            uploader: xa.APP_CHAT\n        }, (sc || {\n        })));\n    };\n    function nc(qc, rc, sc) {\n        if (rc) {\n            la.ensureThreadIsFetched(rc);\n        };\n        this._threadID = qc;\n        this._signatureID = sc;\n        this._eventListeners = [];\n        this._tabTemplate = bc(qc);\n        this._tabElem = this._tabTemplate.getRoot();\n        this._waterfallID = kb.generate();\n        if (!((this._getNode instanceof Function))) {\n            qb.log(\"getnode_undefined\", {\n                is_getnode_set: !!this._getNode,\n                is_prototype_set: !!nc.prototype,\n                is_window: (window == this),\n                is_chat_tab_view: (this instanceof nc),\n                ctor_name: (this.constructor && this.constructor.name)\n            });\n        };\n        this._subscriptionsHandler = new cb();\n        this._fileUploader = new ha(this._tabTemplate.getNode(\"attachmentShelf\"), this._tabTemplate.getNode(\"attachButtonForm\"), this._tabTemplate.getNode(\"fileInput\"), this._tabTemplate.getNode(\"attachID\"));\n        this._initializeUploader(this._fileUploader);\n        this._initializeAutoSendPhotoUploader();\n        this._attachmentsDiv = this._getNode(\"attachmentShelf\");\n        this._sheetController = new v(this._threadID, this._getNode(\"sheet\"), this._tabElem);\n        this._sheetController.onClickNewMessagesSheet(function() {\n            (this._messagesView && this._messagesView.scrollToBottom());\n            this.focus();\n            nc.inform(\"read\", this._threadID);\n        }.bind(this));\n        this._sheetController.onClickThreadIsMutedSheet(function() {\n            ra.showMuteChangeDialog(0, this._threadID);\n            this.focus();\n        }.bind(this));\n        this._nubController = new va().init(this._tabElem);\n        this._sheetController.onResize(this._nubController.flyoutContentChanged.bind(this._nubController));\n        this._contextualDialogController = new p(this._threadID, this._getNode(\"videoCallLink\"));\n        if ((sb === null)) {\n            sb = !o.get(\"seen_autosend_photo_nux\");\n        };\n        if ((tb === undefined)) {\n            tb = o.get(\"show_sticker_nux\");\n        };\n        this._messagesView = null;\n        var tc = this._getNode(\"conversationLink\");\n        if (tc) {\n            y.hide(tc);\n            qa.renderTitanLink(qc, tc, y.show.bind(y, tc));\n        }\n    ;\n        if (!sa.getCanonicalUserInThread(this._threadID)) {\n            this._titlebarTooltipAnchor = this._getNode(\"titlebarText\");\n        };\n        var uc = this._getCanonicalUserID();\n        if (this._isTitleTextLinked()) {\n            ka.get((\"fbid:\" + uc), function(fd) {\n                if (fd.href) {\n                    var gd = this._getNode(\"titlebarText\");\n                    gd.setAttribute(\"href\", fd.href);\n                    gd.removeAttribute(\"rel\");\n                    y.removeClass(gd, \"noLink\");\n                }\n            ;\n            }.bind(this));\n        };\n        var vc = this._getNode(\"inputContainer\").clientHeight;\n        eb.getInstance(this._getNode(\"input\")).subscribe(\"resize\", function() {\n            var fd = this._getNode(\"inputContainer\").clientHeight;\n            if ((fd != vc)) {\n                this._nubController.flyoutContentChanged();\n            };\n            vc = fd;\n        }.bind(this));\n        var wc = null, xc = this._getNode(\"inputContainer\");\n        this._nubController.subscribe(\"resize\", function() {\n            if (!wc) {\n                wc = this._tabElem.clientWidth;\n            };\n            var fd = 2, gd = (wc - ((xc.clientWidth + fd))), hd = (fa.isRTL() ? \"left\" : \"right\");\n            bb.set(this._iconsContainerNode, hd, (gd + \"px\"));\n            eb.getInstance(this._getNode(\"input\")).update();\n        }.bind(this));\n        var yc = o.get(\"chat_tab_height\");\n        if (yc) {\n            var zc = this._tabTemplate.getNode(\"chatWrapper\");\n            bb.set(zc, \"height\", (yc + \"px\"));\n        }\n    ;\n        this._listen(\"closeButton\", \"click\", this._closeClicked);\n        this._listen(\"titlebarCloseButton\", \"click\", this._closeClicked);\n        this._listen(\"titlebarCloseButton\", \"mousedown\", this._closePreClicked);\n        this._listen(\"dockButton\", \"click\", this._nubClicked);\n        this._listen(\"dockButton\", \"keydown\", this._dockKeyDown);\n        this._listen(\"nubFlyoutTitlebar\", \"click\", this._titleClicked);\n        this._listen(\"chatConv\", \"click\", this._chatConvClicked);\n        this._listen(\"inputContainer\", \"click\", this._inputContainerClicked);\n        this._listen(\"addFriendLink\", \"click\", this._addFriendLinkClicked, true);\n        this._listen(\"addToThreadLink\", \"click\", this._addFriendLinkClicked, true);\n        this._listen(\"nameConversationLink\", \"click\", this._nameConversationLinkClicked, true);\n        this._listen(\"clearWindowLink\", \"click\", this._clearHistory, true);\n        this._listen(\"unsubscribeLink\", \"click\", this._unsubscribeLinkClicked, true);\n        this._listen(\"videoCallLink\", \"click\", this._callClicked, true);\n        this._listen(\"reportSpamLink\", \"click\", this._reportSpamClicked, true);\n        this._listen(\"muteThreadLink\", \"click\", this._showMuteSettingDialog.bind(this, -1), true);\n        this._listen(\"unmuteThreadLink\", \"click\", this._showMuteSettingDialog.bind(this, 0), true);\n        this._listen(\"input\", \"focus\", this._focusTab);\n        this._listen(\"input\", \"blur\", this._blurTab);\n        this._listen(\"sheet\", \"keydown\", function(event) {\n            if ((!event.getModifiers().any && (event.keyCode === ea.TAB))) {\n                this._getNode(\"input\").focus();\n                event.kill();\n            }\n        ;\n        }.bind(this));\n        this._iconsContainerNode = this._getNode(\"iconsContainer\");\n        var ad = this._getNode(\"emoticons\");\n        this._emoticonView = null;\n        if (ad) {\n            this._emoticonView = new ua(ad, this._getNode(\"input\"));\n        };\n        var bd = this._getNode(\"stickers\");\n        if (bd) {\n            this._stickerController = new na(bd);\n            this._subscriptionsHandler.addSubscriptions(this._stickerController.subscribe(\"stickerselected\", function(fd, gd) {\n                this._stickerSelected(gd.id);\n            }.bind(this)));\n        }\n    ;\n        if (ib.firefox()) {\n            this._listen(\"input\", \"keypress\", this._inputKeyDown);\n        }\n         else this._listen(\"input\", \"keydown\", this._inputKeyDown);\n    ;\n        this._privacyLink = this._getNode(\"privacyLink\");\n        if (this._privacyLink) {\n            this._privacyActionController = new r(uc, this._updatePrivacyLink.bind(this));\n            this._eventListeners.push(g.listen(this._privacyLink, \"click\", this._privacyActionController.togglePrivacy.bind(this._privacyActionController)));\n        }\n    ;\n        sa.getThreadMeta(this._threadID, function(fd) {\n            var gd = (uc || ((o.get(\"chat_multi_typ_send\") && !fd.is_canonical)));\n            if (gd) {\n                la.getServerThreadID(this._threadID, function(hd) {\n                    this._lastMessageIndicator = new gb(uc, this._getNode(\"input\"), \"mercury-chat\", null, hd);\n                }.bind(this));\n            };\n            this._setUpMutingSettings(fd);\n        }.bind(this));\n        var cd = this._getNode(\"muteGroupLink\");\n        if (cd) {\n            var dd = sa.getCanonicalGroupInThread(this._threadID);\n            if (dd) {\n                cd.setAttribute(\"ajaxify\", hb(cd.getAttribute(\"ajaxify\")).addQueryData({\n                    id: dd\n                }));\n            };\n        }\n    ;\n        s.removeEmptyHrefs(this._tabElem);\n        rb[qc] = this;\n        this.updateAvailableStatus();\n        this.updateTab();\n        this._setCloseTooltip(false);\n        var ed = {\n            threadID: qc,\n            userID: uc,\n            signatureID: this._signatureID\n        };\n        new l(\"/ajax/chat/opentab_tracking.php\", ed).send();\n        ab.onBeforeUnload(function() {\n            if ((ic(this) || gc(this))) {\n                return \"You haven't sent your message yet. Do you want to leave without sending?\"\n            };\n            if (ja.getNumberLocalMessages(this._threadID)) {\n                return \"Your message is still being sent. Are you sure you want to leave?\"\n            };\n            return null;\n        }.bind(this), false);\n        ab.onUnload(function() {\n            oc(this);\n        }.bind(this));\n    };\n    function oc(qc) {\n        if (qc._photoUploader.isUploading()) {\n            mc(qc, xa.CANCEL_DURING_UPLOAD);\n        };\n    };\n    function pc() {\n        for (var qc in rb) {\n            rb[qc].updateAvailableStatus();\n            rb[qc].updateMultichatTooltip();\n        };\n    };\n    h.subscribe([\"buddylist/availability-changed\",], pc);\n    ya.subscribe([\"privacy-changed\",\"privacy-availability-changed\",], pc);\n    n.subscribe(n.ON_CHANGED, function() {\n        for (var qc in rb) {\n            sa.getThreadMeta(qc, function(rc) {\n                rb[qc]._updateUnreadCount(rc);\n            });;\n        };\n    });\n    ta.subscribe(\"state-changed\", function(qc, rc) {\n        for (var sc in rc) {\n            var tc = (rc[sc] && rc[sc].length), uc = rb[sc];\n            (uc && uc.showTypingIndicator(tc));\n        };\n    });\n    oa.subscribe(\"threads-updated\", function(qc, rc) {\n        for (var sc in rb) {\n            (rc[sc] && rb[sc].updateTab());;\n        };\n    });\n    oa.subscribe(\"threads-deleted\", function(qc, rc) {\n        for (var sc in rb) {\n            (rc[sc] && nc.inform(\"thread-deleted\", sc));;\n        };\n    });\n    lb(nc, i, {\n        get: function(qc) {\n            return rb[qc];\n        }\n    });\n    lb(nc.prototype, {\n        getThreadID: function() {\n            return this._threadID;\n        },\n        showAddFriend: function() {\n            (function() {\n                this._sheetController.openAddFriendsSheet();\n            }).bind(this).defer();\n        },\n        showPeopleSuggestions: function() {\n            (function() {\n                this._peopleSuggestions = new u(this._sheetController, this._getNode(\"conversation\"), this._getNode(\"loadingIndicator\"));\n            }).bind(this).defer();\n        },\n        showNameConversation: function(qc) {\n            (function() {\n                this._sheetController.openNameConversationSheet(qc);\n            }).bind(this).defer();\n        },\n        hideAutomaticNameConversation: function() {\n            (function() {\n                this._sheetController.closeAutomaticNameConversationSheet();\n            }).bind(this).defer();\n        },\n        isVisible: function() {\n            return y.shown(this._tabElem);\n        },\n        setVisibleState: function(qc, rc) {\n            var sc = y.shown(this._tabElem), tc = y.hasClass(this._tabElem, \"opened\");\n            y.conditionShow(this._tabElem, qc);\n            y.conditionClass(this._tabElem, \"opened\", rc);\n            if (((!((sc && tc)) && qc) && rc)) {\n                if (!this._messagesView) {\n                    this._messagesView = new t(this._threadID, this._sheetController, this._getNode(\"chatConv\"), this._getNode(\"conversation\"), this._getNode(\"loadingIndicator\"), this._getNode(\"lastMessageIndicator\"), this._getNode(\"typingIndicator\"));\n                };\n                this._nubController.flyoutContentChanged();\n                this._messagesView.scrollToBottom();\n            }\n        ;\n            if (((sc && tc) && !((qc && rc)))) {\n                this._contextualDialogController.tabNotActive();\n            };\n        },\n        focus: function() {\n            var qc = (y.hasClass(this._tabElem, \"opened\") ? \"input\" : \"dockButton\");\n            this._getNode(qc).focus();\n        },\n        isFocused: function() {\n            var qc = document.activeElement;\n            return (wa.byClass(qc, \"_50mz\") === this._tabElem);\n        },\n        hasEmptyInput: function() {\n            return pb.test(this._getNode(\"input\").value);\n        },\n        getInputElem: function() {\n            return this._getNode(\"input\");\n        },\n        setInput: function(qc) {\n            this._getNode(\"input\").value = qc;\n        },\n        insertBefore: function(qc) {\n            ba.insertBefore(qc._tabElem, this._tabElem);\n        },\n        appendTo: function(qc) {\n            ba.appendContent(qc, this._tabElem);\n        },\n        nextTabIs: function(qc) {\n            var rc = (qc && qc._tabElem);\n            return (this._tabElem.nextSibling == rc);\n        },\n        getScrollTop: function() {\n            return ba.find(this._tabElem, \".scrollable\").scrollTop;\n        },\n        setScrollTop: function(qc) {\n            ba.find(this._tabElem, \".scrollable\").scrollTop = qc;\n        },\n        destroy: function() {\n            ba.remove(this._tabElem);\n            (this._emoticonView && this._emoticonView.destroy());\n            (this._stickerController && this._stickerController.destroy());\n            while (this._eventListeners.length) {\n                this._eventListeners.pop().remove();;\n            };\n            (this._messagesView && this._messagesView.destroy());\n            this._sheetController.destroy();\n            this._fileUploader.destroy();\n            this._photoUploader.destroy();\n            this._subscriptionsHandler.release();\n            this._contextualDialogController.destroy();\n            (this._privacyActionController && this._privacyActionController.destroy());\n            delete rb[this._threadID];\n            aa.unregisterNubController(this._nubController);\n            ca.reset(this._getNode(\"input\"));\n        },\n        updateAvailableStatus: function() {\n            sa.getThreadMeta(this._threadID, function(qc) {\n                var rc = m.OFFLINE, sc = this._getCanonicalUserID();\n                if (sc) {\n                    rc = za.get(sc);\n                }\n                 else {\n                    var tc = qc.participants.map(function(vc) {\n                        return ka.getUserID(vc);\n                    });\n                    rc = za.getGroup(tc);\n                }\n            ;\n                if (!w.isOnline()) {\n                    rc = m.OFFLINE;\n                };\n                if (sc) {\n                    this._updateCallLink(rc);\n                };\n                y.conditionClass(this._tabElem, \"_5238\", (rc === m.ACTIVE));\n                y.conditionClass(this._tabElem, \"_5239\", (rc === m.MOBILE));\n                var uc = this._getNode(\"presenceIndicator\");\n                switch (rc) {\n                  case m.ACTIVE:\n                    uc.setAttribute(\"alt\", \"Online\");\n                    break;\n                  case m.MOBILE:\n                    uc.setAttribute(\"alt\", \"Mobile\");\n                    break;\n                  default:\n                    uc.removeAttribute(\"alt\");\n                    break;\n                };\n            }.bind(this));\n        },\n        updateTab: function() {\n            sa.getThreadMeta(this._threadID, function(qc) {\n                if (!qc.is_subscribed) {\n                    nc.inform(\"unsubscribed\", this._threadID);\n                    return;\n                }\n            ;\n                qa.renderAndSeparatedParticipantList(this._threadID, [this._getNode(\"name\"),this._getNode(\"titlebarText\"),], {\n                    names_renderer: pa.renderShortNames,\n                    check_length: true\n                });\n                if ((qc.is_joinable && !o.get(\"joinable_conversation_is_modal\"))) {\n                    this._updateJoinableAddFriendSheet(qc);\n                };\n                this._updateMutingSettings(qc);\n                this._updateUnreadCount(qc);\n                this.updateMultichatTooltip();\n                this._updateArchiveWarning(qc);\n                this._updateNewThread(qc);\n                this._updateNameConversationSheet(qc);\n            }.bind(this));\n        },\n        _updateNameConversationSheet: function(qc) {\n            if ((((!qc.name && !qc.is_canonical) && !qc.name_conversation_sheet_dismissed) && !sa.isEmptyLocalThread(qc.thread_id))) {\n                this.showNameConversation(true);\n            }\n             else this.hideAutomaticNameConversation();\n        ;\n        },\n        _updateJoinableAddFriendSheet: function(qc) {\n            var rc = ka.user, sc = qc.participants.filter(function(tc) {\n                return (tc != rc);\n            });\n            if ((qc.is_joinable && (sc.length < 1))) {\n                this.showAddFriend();\n            };\n        },\n        updateSignatureID: function(qc) {\n            this._signatureID = qc;\n        },\n        _showPhotoNUXIfNecessary: function() {\n            if (sb) {\n                sb = false;\n                new k(\"/ajax/chat/photo_nux.php\").setRelativeTo(this._getNode(\"photoAttachLink\")).setData({\n                    threadID: this._threadID\n                }).send();\n                return true;\n            }\n        ;\n        },\n        _showStickerNUXIfNecessary: function() {\n            if (tb) {\n                tb = false;\n                new k(\"/ajax/messaging/stickers/nux\").setRelativeTo(this._getNode(\"emoticons\")).setData({\n                    threadID: this._threadID\n                }).send();\n                return true;\n            }\n        ;\n        },\n        _setUpMutingSettings: function(qc) {\n            var rc = ra.isThreadMuted(qc);\n            if (rc) {\n                this._sheetController.openThreadIsMutedTabSheet();\n            };\n            this._updateActionMenu(rc);\n        },\n        _updateMutingSettings: function(qc) {\n            var rc = ra.isThreadMuted(qc);\n            if ((rc && y.shown(this._getNode(\"muteThreadLink\").parentNode))) {\n                this._sheetController.openThreadIsMutedTabSheet();\n            }\n             else if ((!rc && y.shown(this._getNode(\"unmuteThreadLink\").parentNode))) {\n                this._sheetController.closeThreadIsMutedTabSheet();\n            }\n        ;\n            this._updateActionMenu(rc);\n        },\n        _updateActionMenu: function(qc) {\n            y.conditionShow(this._getNode(\"muteThreadLink\").parentNode, !qc);\n            y.conditionShow(this._getNode(\"unmuteThreadLink\").parentNode, qc);\n        },\n        _updateArchiveWarning: function(qc) {\n            var rc = false;\n            ka.get(ka.user, function(sc) {\n                rc = sc.employee;\n                if (rc) {\n                    ka.getMulti(qc.participants, this._showArchiveWarningIfAllParticipantsAreEmployees.bind(this));\n                };\n            }.bind(this));\n        },\n        _updateNewThread: function(qc) {\n            var rc = sa.isNewEmptyLocalThread(qc.thread_id);\n            y.conditionShow(this._getNode(\"dropdown\"), !rc);\n            if (rc) {\n                this.showAddFriend();\n                if (o.get(\"www_chat_compose_suggestions\", 0)) {\n                    this.showPeopleSuggestions();\n                };\n            }\n             else if (this._peopleSuggestions) {\n                this._peopleSuggestions.destroy();\n                this._peopleSuggestions = null;\n            }\n            \n        ;\n        },\n        _showArchiveWarningIfAllParticipantsAreEmployees: function(qc) {\n            var rc = true;\n            for (var sc in qc) {\n                rc = (rc && qc[sc].employee);;\n            };\n            var tc = this._getNode(\"titanArchiveWarning\");\n            if (tc) {\n                if (this._titlebarTooltipAnchor) {\n                    y.conditionClass(this._titlebarTooltipAnchor, \"narrowTitleBar\", rc);\n                };\n                y.conditionShow(tc, rc);\n            }\n        ;\n        },\n        updateMultichatTooltip: function() {\n            sa.getThreadMeta(this._threadID, function(qc) {\n                if (!qc.is_canonical) {\n                    vb(this._titlebarTooltipAnchor, qc.participants);\n                };\n            }.bind(this));\n        },\n        _getNode: function(qc) {\n            return this._tabTemplate.getNode(qc);\n        },\n        _getCanonicalUserID: function() {\n            return sa.getCanonicalUserInThread(this._threadID);\n        },\n        _listen: function(qc, event, rc, sc) {\n            var tc = this._getNode(qc);\n            if (tc) {\n                this._eventListeners.push(g.listen(tc, event, rc.bind(this)));\n            }\n             else if (!sc) {\n                throw new Error(((\"Could not find node \\\"\" + qc) + \"\\\"\"))\n            }\n        ;\n        },\n        _closePreClicked: function(qc) {\n            this._closeMouseDown = true;\n        },\n        _closeClicked: function(qc) {\n            oc(this);\n            nc.inform(\"closed-tab\", this._threadID);\n            qc.kill();\n        },\n        _nubClicked: function(qc) {\n            qc.kill();\n            return nc.inform(\"nub-activated\", this._threadID);\n        },\n        _dockKeyDown: function(event) {\n            if (((event.keyCode === ea.RETURN) || (event.keyCode === ea.SPACE))) {\n                nc.inform(\"nub-activated\", this._threadID);\n                event.kill();\n            }\n             else this._handleHotkeyPressed(event);\n        ;\n        },\n        _handleHotkeyPressed: function(event) {\n            if ((event.keyCode === ea.ESC)) {\n                oc(this);\n                nc.inform(\"esc-pressed\", this._threadID);\n                event.kill();\n            }\n             else if (((event.keyCode === ea.TAB) && !event.ctrlKey)) {\n                var qc = nc.inform(\"tab-pressed\", {\n                    id: this._threadID,\n                    shiftPressed: event.shiftKey\n                });\n                (!qc && event.kill());\n            }\n            \n        ;\n        },\n        _isTitleTextLinked: function() {\n            var qc = this._getCanonicalUserID();\n            return (qc && o.get(\"chat_tab_title_link_timeline\"));\n        },\n        _titleClicked: function(event) {\n            var qc = event.getTarget(), rc = wa.byClass(qc, \"titlebarText\"), sc = (rc && this._isTitleTextLinked());\n            if (((!sc && !wa.byClass(qc, \"uiSelector\")) && !wa.byClass(qc, \"addToThread\"))) {\n                nc.inform(\"lower-activated\", this._threadID);\n                event.kill();\n            }\n        ;\n        },\n        _callClicked: function(qc) {\n            var rc = this._getCanonicalUserID();\n            if (jb.availableForCall(rc)) {\n                var sc = \"chat_tab_icon\";\n                if ((qc.target && y.hasClass(qc.target, \"video_call_promo\"))) {\n                    sc = \"chat_tab_icon_promo\";\n                }\n                 else if ((qc.target && y.hasClass(qc.target, \"video_call_tour\"))) {\n                    sc = \"chat_tab_icon_tour\";\n                }\n            ;\n                nc.inform(\"video-call-clicked\", {\n                    threadID: this._threadID,\n                    userID: rc,\n                    clickSource: sc\n                });\n            }\n        ;\n            return false;\n        },\n        _addFriendLinkClicked: function() {\n            this.showAddFriend();\n        },\n        _nameConversationLinkClicked: function() {\n            this.showNameConversation();\n        },\n        _clearHistory: function() {\n            var qc = sa.getThreadMetaNow(this._threadID);\n            if (qc) {\n                var rc = this._getCanonicalUserID();\n                la.clearChat(this._threadID, rc, qc.timestamp);\n            }\n        ;\n        },\n        _unsubscribeLinkClicked: function() {\n            var qc = [];\n            qc.push({\n                name: \"unsubscribe\",\n                label: \"Leave Conversation\",\n                handler: this._unsubscribeToThread.bind(this)\n            });\n            qc.push(z.CANCEL);\n            new z().setTitle(\"Leave Conversation?\").setBody(\"You will stop receiving messages from this conversation and people will see that you left.\").setButtons(qc).show();\n        },\n        _reportSpamClicked: function() {\n            var qc = this._getCanonicalUserID(), rc = hb(\"/ajax/chat/report.php\").addQueryData({\n                id: qc\n            }).addQueryData({\n                src: \"top_report_link\"\n            });\n            j.send(new k(rc));\n        },\n        _showMuteSettingDialog: function(qc) {\n            ra.showMuteChangeDialog(qc, this._threadID);\n        },\n        _focusTab: function() {\n            y.addClass(this._tabElem, \"focusedTab\");\n            if (this._peopleSuggestions) {\n                this._peopleSuggestions.clearSuggestions();\n            };\n            this.tryMarkAsRead();\n            this._contextualDialogController.tabFocused();\n            if ((!ub && ((this._showPhotoNUXIfNecessary() || this._showStickerNUXIfNecessary())))) {\n                h.subscribe([\"ChatNUX/show\",\"ChatNUX/hide\",], function(event) {\n                    ub = (event === \"ChatNUX/show\");\n                });\n            };\n            this._closeMouseDown = false;\n            this._setCloseTooltip(true);\n        },\n        _blurTab: function() {\n            y.removeClass(this._tabElem, \"focusedTab\");\n            (!this._closeMouseDown && this._setCloseTooltip(false));\n        },\n        _setCloseTooltip: function(qc) {\n            var rc = this._getNode(\"titlebarCloseButton\"), sc = (qc ? \"Press Esc to close\" : \"Close tab\");\n            fb.set(rc, sc, \"above\");\n        },\n        _inputKeyDown: function(event) {\n            if (((event.keyCode === ea.RETURN) && !event.shiftKey)) {\n                if (hc(this)) {\n                    fc(this);\n                    event.kill();\n                    return;\n                }\n            ;\n                cc(this);\n                event.kill();\n                return;\n            }\n        ;\n            if ((((event.keyCode === ea.DOWN) && event.shiftKey) && (this._getNode(\"input\").value === \"\"))) {\n                nc.inform(\"lower-activated\", this._threadID);\n                event.kill();\n                return;\n            }\n        ;\n            this._handleHotkeyPressed(event);\n        },\n        tryMarkAsRead: function() {\n            if ((!this._messagesView || this._messagesView.isScrolledToBottom())) {\n                nc.inform(\"read\", this._threadID);\n                return true;\n            }\n        ;\n            return false;\n        },\n        _chatConvClicked: function(qc) {\n            this.tryMarkAsRead();\n            if ((wa.byTag(qc.getTarget(), \"a\") || ba.getSelection())) {\n                return\n            };\n            this.focus();\n        },\n        _inputContainerClicked: function(qc) {\n            this.tryMarkAsRead();\n            this.focus();\n        },\n        showTypingIndicator: function(qc) {\n            var rc = sa.getThreadMetaNow(this._threadID), sc = (this._getCanonicalUserID() || (((o.get(\"chat_multi_typ\") && rc) && !rc.is_canonical)));\n            if (sc) {\n                y.conditionClass(this._tabElem, \"typing\", qc);\n            };\n        },\n        _updateUnreadCount: function(qc) {\n            var rc = qc.unread_count;\n            if ((typeof rc != \"undefined\")) {\n                var sc = (!!rc && ((!n.showsTabUnreadUI || n.showsTabUnreadUI()))), tc = this._getNode(\"numMessages\");\n                y.conditionShow(tc, sc);\n                y.conditionClass(this._tabElem, \"highlightTab\", sc);\n                zb(this._threadID, this._tabElem, sc);\n                ba.setContent(tc, rc);\n            }\n        ;\n        },\n        _updateCallLink: function(qc) {\n            var rc = this._getNode(\"videoCallLink\");\n            if (w.isOnline()) {\n                var sc = this._getCanonicalUserID(), tc = (\"fbid:\" + sc);\n                ka.get(tc, function(uc) {\n                    if (jb.availableForCall(sc)) {\n                        fb.set(rc, ob._(\"Start a video call with {firstname}\", {\n                            firstname: uc.short_name\n                        }));\n                        this._updateCallBackLinks(this._tabElem, true);\n                    }\n                     else {\n                        fb.set(rc, ob._(\"{firstname} is currently unavailable for video calling\", {\n                            firstname: uc.short_name\n                        }));\n                        this._hideVideoCallouts();\n                        this._updateCallBackLinks(this._tabElem, false);\n                    }\n                ;\n                }.bind(this));\n            }\n             else {\n                fb.set(rc, \"You must be online to make a call.\");\n                this._hideVideoCallouts();\n                this._updateCallBackLinks(document.body, false);\n            }\n        ;\n        },\n        _updateCallBackLinks: function(qc, rc) {\n            var sc = ba.scry(qc, \"a.callBackLink\");\n            if (rc) {\n                sc.forEach(y.show);\n            }\n             else sc.forEach(y.hide);\n        ;\n        },\n        _hideVideoCallouts: function() {\n            this._contextualDialogController.hideVideoCallouts();\n        },\n        _updatePrivacyLink: function(qc) {\n            if ((qc == r.OFFLINE)) {\n                ba.setContent(this._privacyLink, \"Go online\");\n            }\n             else {\n                var rc = this._getCanonicalUserID(), sc = (\"fbid:\" + rc);\n                ka.get(sc, function(tc) {\n                    var uc = null;\n                    if ((qc == r.BLOCKED)) {\n                        uc = ob._(\"Turn On Chat for {name}\", {\n                            name: tc.short_name\n                        });\n                    }\n                     else uc = ob._(\"Turn Off Chat for {name}\", {\n                        name: tc.short_name\n                    });\n                ;\n                    ba.setContent(this._privacyLink, uc);\n                }.bind(this));\n            }\n        ;\n        },\n        _unsubscribeToThread: function() {\n            if (sa.isEmptyLocalThread(this._threadID)) {\n                nc.inform(\"unsubscribed\", this._threadID);\n            }\n             else {\n                var qc = ja.constructLogMessageObject(ma.CHAT_WEB, this._threadID, ia.UNSUBSCRIBE, {\n                });\n                ja.sendMessage(qc);\n            }\n        ;\n            return true;\n        },\n        _initializeUploader: function(qc) {\n            this._subscriptionsHandler.addSubscriptions(qc.subscribe([\"all-uploads-completed\",\"upload-canceled\",], function() {\n                jc(this);\n            }.bind(this)), qc.subscribe(\"dom-updated\", function() {\n                kc(this);\n            }.bind(this)), qc.subscribe(\"submit\", function() {\n                this._getNode(\"input\").focus();\n            }.bind(this)));\n        },\n        _initializeAutoSendPhotoUploader: function() {\n            this._photoUploader = new q(this._tabTemplate.getNode(\"photoAttachButtonForm\"), this._tabTemplate.getNode(\"photoFileInput\"), this._tabTemplate.getNode(\"photoAttachID\"));\n            var qc = {\n            };\n            lc(this, \"submit\", xa.UPLOAD_START);\n            lc(this, \"all-uploads-completed\", xa.ALL_UPLOADS_DONE);\n            lc(this, \"all-uploads-failed\", xa.CLIENT_ERROR);\n            this._subscriptionsHandler.addSubscriptions(this._photoUploader.subscribe(\"submit\", function(rc, sc) {\n                ec(this, \"\", sc.raw_attachments, function(tc) {\n                    qc[sc.upload_id] = tc;\n                    tc.do_not_send_to_server = true;\n                    tc.status = ga.RESENDING;\n                    ja.sendMessage(tc);\n                });\n                this._getNode(\"input\").focus();\n            }.bind(this)), this._photoUploader.subscribe(\"all-uploads-failed\", function(rc, sc) {\n                var tc = qc[sc.upload_id];\n                delete qc[sc.upload_id];\n                ja.deleteMessages(tc.thread_id, [tc.message_id,]);\n            }.bind(this)), this._photoUploader.subscribe(\"all-uploads-completed\", function(rc, sc) {\n                var tc = qc[sc.upload_id];\n                delete qc[sc.upload_id];\n                delete tc.raw_attachments;\n                tc.image_ids = sc.image_ids;\n                tc.do_not_send_to_server = false;\n                ja.sendMessage(tc);\n                var uc = (sc.image_ids.length || sc.attachments.length);\n                dc(this, uc);\n            }.bind(this)));\n        },\n        _stickerSelected: function(qc) {\n            ec(this, \"\", [], function(rc) {\n                rc.has_attachment = true;\n                rc.sticker_id = qc;\n                ja.sendMessage(rc);\n                this.focus();\n            }.bind(this));\n        },\n        _emoticonView: null\n    });\n    e.exports = nc;\n});\n__d(\"ChatNewMessageHandler\", [\"ChatActivity\",\"ChatTabModel\",\"ChatTabView\",\"JSLogger\",\"MercuryAssert\",\"MercuryBrowserAlerts\",\"MercuryUnseenState\",], function(a, b, c, d, e, f) {\n    var g = b(\"ChatActivity\"), h = b(\"ChatTabModel\"), i = b(\"ChatTabView\"), j = b(\"JSLogger\"), k = b(\"MercuryAssert\"), l = b(\"MercuryBrowserAlerts\"), m = b(\"MercuryUnseenState\").get(), n = j.create(\"chat_new_message\"), o = {\n        _raiseTab: function(p, q) {\n            var r = h.getTab(p), s = false;\n            if (r) {\n                s = r.raised;\n            }\n             else {\n                h.raiseTab(p, false);\n                s = true;\n            }\n        ;\n            q.to_new_tab = !r;\n            q.to_raised_tab = !!s;\n        },\n        _notify: function(p, q, r) {\n            var s = i.get(p);\n            r.view_is_visible = (s && s.isVisible());\n            r.view_is_focused = (s && s.isFocused());\n            if (!r.view_is_visible) {\n                n.log(\"message_to_hidden\");\n            };\n            r.is_active = g.isActive();\n            l.messageReceived(q);\n        },\n        _promoteTab: function(p, q, r) {\n            if (((r && !r[p]) && q)) {\n                h.promoteThreadInPlaceOfThread(p, q);\n            };\n        },\n        newMessage: function(p, q, r, s) {\n            k.isThreadID(p);\n            var t = {\n                thread_id: p,\n                message_id: q.message_id\n            };\n            this._raiseTab(p, t);\n            this._promoteTab(p, r, s);\n            this._notify(p, q, t);\n            n.log(\"message\", t);\n        }\n    };\n    l.subscribe(\"before-alert\", function(p, event) {\n        var q = event.threadID, r = i.get(q), s = h.getTab(q);\n        if ((((((s && s.raised) && r) && r.isVisible()) && r.isFocused()) && r.tryMarkAsRead())) {\n            m.markThreadSeen(q);\n            event.cancelAlert();\n        }\n    ;\n    });\n    e.exports = o;\n});\n__d(\"ChatTabPresence\", [\"AvailableList\",\"ChatTabModel\",\"MercuryThreads\",], function(a, b, c, d, e, f) {\n    var g = b(\"AvailableList\"), h = b(\"ChatTabModel\"), i = b(\"MercuryThreads\").get(), j = {\n    };\n    function k(l) {\n        var m = i.getCanonicalUserInThread(l);\n        if (m) {\n            g.updateForID(m);\n        };\n    };\n    h.subscribe(\"chat/tabs-changed\", function(event, l) {\n        l.tabs.forEach(function(m) {\n            if ((m.raised && !j[m.id])) {\n                k(m.id);\n            };\n        });\n        j = {\n        };\n        l.tabs.forEach(function(m) {\n            if (m.raised) {\n                j[m.id] = true;\n            };\n        });\n    });\n    e.exports = {\n    };\n});\n__d(\"ChatTabPolicy\", [\"ChatBehavior\",\"FBDesktopPlugin\",\"JSLogger\",\"MercuryActionTypeConstants\",\"MercuryAssert\",\"MercuryParticipants\",\"MercuryParticipantTypes\",\"MercurySourceType\",\"MercuryThreadMode\",\"MercuryThreadMuter\",\"MercuryUnseenState\",\"MessagingTag\",\"PresencePrivacy\",\"ShortProfiles\",], function(a, b, c, d, e, f) {\n    var g = b(\"ChatBehavior\"), h = b(\"FBDesktopPlugin\"), i = b(\"JSLogger\"), j = b(\"MercuryActionTypeConstants\"), k = b(\"MercuryAssert\"), l = b(\"MercuryParticipants\"), m = b(\"MercuryParticipantTypes\"), n = b(\"MercurySourceType\"), o = b(\"MercuryThreadMode\"), p = b(\"MercuryThreadMuter\"), q = b(\"MercuryUnseenState\").get(), r = b(\"MessagingTag\"), s = b(\"PresencePrivacy\"), t = b(\"ShortProfiles\"), u = i.create(\"tab_policy\");\n    function v(w, x) {\n        q.markThreadSeen(w, x);\n    };\n    e.exports = {\n        messageIsAllowed: function(w, x, y) {\n            var z = w.thread_id, aa = x.message_id;\n            k.isThreadID(z);\n            k.isParticipantID(x.author);\n            var ba;\n            if (p.isThreadMuted(w)) {\n                ba = {\n                    thread_id: z,\n                    message_id: aa,\n                    mute_settings: w.mute_settings\n                };\n                u.log(\"message_thread_muted\", ba);\n                return;\n            }\n        ;\n            if ((w.mode == o.OBJECT_ORIGINATED)) {\n                ba = {\n                    thread_id: z,\n                    message_id: aa,\n                    mode: w.mode\n                };\n                u.log(\"message_object_originated\", ba);\n                return;\n            }\n        ;\n            if (((x.source == n.EMAIL) || (x.source == n.TITAN_EMAIL_REPLY))) {\n                ba = {\n                    thread_id: z,\n                    message_id: aa,\n                    source: x.source\n                };\n                u.log(\"message_source_not_allowed\", ba);\n                return;\n            }\n        ;\n            var ca = l.getUserID(x.author);\n            if (!ca) {\n                u.log(\"message_bad_author\", {\n                    thread_id: z,\n                    message_id: aa,\n                    user: ca\n                });\n                return;\n            }\n        ;\n            if ((x.action_type != j.USER_GENERATED_MESSAGE)) {\n                ba = {\n                    thread_id: z,\n                    message_id: aa,\n                    type: x.action_type\n                };\n                u.log(\"message_non_user_generated\", ba);\n                return;\n            }\n        ;\n            if ((w.is_canonical_user && !g.notifiesUserMessages())) {\n                u.log(\"message_jabber\", {\n                    thread_id: z,\n                    message_id: aa\n                });\n                v(z, true);\n                return;\n            }\n        ;\n            if ((w.is_canonical && !w.canonical_fbid)) {\n                u.log(\"message_canonical_contact\", {\n                    thread_id: z,\n                    message_id: aa\n                });\n                return;\n            }\n        ;\n            if (h.shouldSuppressMessages()) {\n                u.log(\"message_desktop\", {\n                    thread_id: z,\n                    message_id: aa\n                });\n                return;\n            }\n        ;\n            if ((w.folder != r.INBOX)) {\n                u.log(\"message_folder\", {\n                    thread_id: z,\n                    message_id: aa,\n                    folder: w.folder\n                });\n                return;\n            }\n        ;\n            var da = l.getUserID(l.user);\n            t.getMulti([ca,da,], function(ea) {\n                if (!s.allows(ca)) {\n                    u.log(\"message_privacy\", {\n                        thread_id: z,\n                        message_id: aa,\n                        user: ca\n                    });\n                    return;\n                }\n            ;\n                var fa = (ea[ca].employee && ea[da].employee);\n                if ((!fa && (ea[ca].type !== m.FRIEND))) {\n                    u.log(\"message_non_friend\", {\n                        thread_id: z,\n                        message_id: aa,\n                        user: ca\n                    });\n                    return;\n                }\n            ;\n                y();\n            });\n        }\n    };\n});\n__d(\"ChatTabViewSelector\", [\"Event\",\"Arbiter\",\"CSS\",\"DataStore\",\"DOM\",\"MenuDeprecated\",\"MercuryThreadInformer\",\"MercuryThreads\",\"NubController\",\"ChatTabTemplates\",\"MercuryThreadMetadataRenderer\",\"Toggler\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"Arbiter\"), i = b(\"CSS\"), j = b(\"DataStore\"), k = b(\"DOM\"), l = b(\"MenuDeprecated\"), m = b(\"MercuryThreadInformer\").get(), n = b(\"MercuryThreads\").get(), o = b(\"NubController\"), p = b(\"ChatTabTemplates\"), q = b(\"MercuryThreadMetadataRenderer\").get(), r = b(\"Toggler\"), s = b(\"copyProperties\");\n    function t(u) {\n        var v = p[\":fb:chat:tab:selector\"].build(), w = v.getRoot(), x = v.getNode(\"menu\"), y = k.find(x, \".uiMenuInner\"), z = {\n        }, aa = new o().init(w);\n        i.hide(w);\n        k.insertBefore(u, w);\n        function ba(ea) {\n            var fa = 0;\n            for (var ga in z) {\n                var ha = z[ga], ia = n.getThreadMetaNow(ga), ja = ha.getNode(\"unreadCount\"), ka = (((ia && ia.unread_count)) || 0);\n                fa += ka;\n                if ((ka > 9)) {\n                    ka = \"+\";\n                };\n                i.conditionClass(ja, \"invisible_elem\", !ka);\n                k.setContent(ja, ka);\n            };\n            var la = v.getNode(\"numMessages\");\n            i.conditionShow(la, fa);\n            k.setContent(la, fa);\n        };\n        this.setTabData = function(ea) {\n            z = {\n            };\n            if ((ea.length < 1)) {\n                i.hide(w);\n                return;\n            }\n        ;\n            i.show(w);\n            k.empty(y);\n            ea.forEach(function(fa) {\n                var ga = p[\":fb:chat:tab:selector:item\"].build();\n                z[fa.id] = ga;\n                var ha = ga.getNode(\"content\");\n                q.renderAndSeparatedParticipantList(fa.id, ha);\n                k.prependContent(y, ga.getRoot());\n                j.set(ga.getRoot(), \"threadID\", fa.id);\n                var ia = ga.getNode(\"closeButton\");\n                g.listen(ia, \"click\", function(event) {\n                    t.inform(\"selector/close-tab\", fa.id);\n                    event.kill();\n                });\n            });\n            aa.flyoutContentChanged();\n            k.setContent(v.getNode(\"numTabs\"), ea.length);\n            ba();\n        };\n        function ca(event, ea) {\n            if ((ea.menu != x)) {\n                return\n            };\n            var fa = j.get(ea.item, \"threadID\");\n            t.inform(\"selected\", fa);\n            r.hide(w);\n        };\n        function da(event, ea) {\n            l.register(x);\n        };\n        l.subscribe(\"select\", ca.bind(this));\n        r.listen(\"show\", w, function() {\n            h.inform(\"layer_shown\", {\n                type: \"ChatTabSelector\"\n            });\n            da();\n        });\n        r.listen(\"hide\", w, function() {\n            h.inform(\"layer_hidden\", {\n                type: \"ChatTabSelector\"\n            });\n        });\n        m.subscribe(\"threads-updated\", ba);\n    };\n    s(t, new h());\n    e.exports = t;\n});\n__d(\"ChatTabController\", [\"ChatTabPresence\",\"ChatTypeaheadBehavior\",\"Arbiter\",\"ChatActivity\",\"ChatBehavior\",\"ChatConfig\",\"ChatNewMessageHandler\",\"ChatTabMessagesView\",\"ChatTabModel\",\"ChatTabPolicy\",\"ChatTabView\",\"ChatTabViewSelector\",\"JSLogger\",\"MercuryParticipants\",\"MercuryServerRequests\",\"MercuryThreadInformer\",\"MercuryThreads\",\"MercuryUnseenState\",\"Style\",\"UserAgent\",\"VideoCallCore\",], function(a, b, c, d, e, f) {\n    b(\"ChatTabPresence\");\n    b(\"ChatTypeaheadBehavior\");\n    var g = b(\"Arbiter\"), h = b(\"ChatActivity\"), i = b(\"ChatBehavior\"), j = b(\"ChatConfig\"), k = b(\"ChatNewMessageHandler\"), l = b(\"ChatTabMessagesView\"), m = b(\"ChatTabModel\"), n = b(\"ChatTabPolicy\"), o = b(\"ChatTabView\"), p = b(\"ChatTabViewSelector\"), q = b(\"JSLogger\"), r = b(\"MercuryParticipants\"), s = b(\"MercuryServerRequests\").get(), t = b(\"MercuryThreadInformer\").get(), u = b(\"MercuryThreads\").get(), v = b(\"MercuryUnseenState\").get(), w = b(\"Style\"), x = b(\"UserAgent\"), y = b(\"VideoCallCore\"), z = (j.get(\"tab_auto_close_timeout\") || 7200000), aa = q.create(\"tab_controller\");\n    function ba(na) {\n        u.changeThreadReadStatus(na, true);\n        ca(na);\n    };\n    function ca(na) {\n        v.markThreadSeen(na);\n    };\n    function da(na, oa, pa) {\n        var qa = m.get().tabs;\n        na += (oa ? 1 : -1);\n        while (((na >= 0) && (na < qa.length))) {\n            var ra = qa[na], sa = o.get(ra.id);\n            if (((sa && sa.isVisible()) && ((!pa || ra.raised)))) {\n                sa.focus();\n                return true;\n            }\n        ;\n            na += (oa ? 1 : -1);\n        };\n        return false;\n    };\n    function ea(na, oa, pa) {\n        var qa = oa.shouldPromoteOnRaise(na);\n        g.inform(\"chat/promote-tab\", na);\n        if (qa) {\n            m.raiseAndPromoteTab(na, true, pa);\n        }\n         else m.raiseTab(na, true, pa);\n    ;\n        var ra = o.get(na);\n        (ra && ra.focus());\n    };\n    function fa(na, oa, pa) {\n        var qa = pa.getMaxTabsToShow(), ra = m.indexOf(na);\n        m.closeTabAndDemote(na, (qa - 2), oa);\n        return ra;\n    };\n    function ga(na) {\n        var oa = Object.keys((na.getTabsToShow() || {\n        })), pa = (1 * 60), qa = null, ra = Infinity;\n        for (var sa = 0; (sa < oa.length); sa++) {\n            var ta = oa[sa], ua = u.getThreadMetaNow(ta);\n            if ((!o.get(ta).hasEmptyInput() || !ua)) {\n                continue;\n            };\n            var va = (((m.getServerTime() - ua.timestamp)) / 1000);\n            if ((!ua.timestamp || (((ua.timestamp && (ua.timestamp < ra)) && (va > pa))))) {\n                qa = ua.thread_id;\n                ra = ua.timestamp;\n            }\n        ;\n        };\n        return qa;\n    };\n    function ha(na) {\n        p.subscribe(\"selected\", function(pa, qa) {\n            ea(qa, na);\n        });\n        g.subscribe(\"chat/open-tab\", function(pa, qa) {\n            ea(qa.thread_id, na, qa.signature_id);\n        });\n        g.subscribe(\"page_transition\", function(pa, qa) {\n            m.closeFragileTabs();\n        });\n        o.subscribe(\"read\", function(event, pa) {\n            ba(pa);\n        });\n        h.subscribe(\"idle\", function(pa, qa) {\n            if ((qa > z)) {\n                var ra = m.get().tabs;\n                ra.forEach(function(sa) {\n                    var ta = sa.id;\n                    u.getThreadMeta(ta, function(ua) {\n                        if (!ua.unread_count) {\n                            aa.log(\"autoclose_idle_seen\", {\n                                thread_id: ta,\n                                idleness: qa\n                            });\n                            m.closeTab(ta, \"autoclose_idle_seen\");\n                        }\n                    ;\n                    });\n                });\n            }\n        ;\n        });\n        o.subscribe(\"nub-activated\", function(pa, qa) {\n            ea(qa, na);\n        });\n        o.subscribe(\"lower-activated\", function(pa, qa) {\n            m.lowerTab(qa);\n            var ra = o.get(qa);\n            (ra && ra.focus());\n        });\n        function oa(pa, qa) {\n            y.showOutgoingCallDialog(qa.userID, qa.clickSource);\n            m.lowerTab(qa.threadID);\n        };\n        o.subscribe(\"video-call-clicked\", oa);\n        l.subscribe(\"video-call-clicked\", oa);\n        o.subscribe(\"closed-tab\", function(pa, qa) {\n            aa.log(\"close_view\", {\n                thread_id: qa\n            });\n            fa(qa, \"close_view\", na);\n            return false;\n        });\n        o.subscribe(\"thread-deleted\", function(pa, qa) {\n            aa.log(\"close_thread_deleted\", {\n                thread_id: qa\n            });\n            fa(qa, \"close_thread_deleted\", na);\n            return false;\n        });\n        o.subscribe(\"unsubscribed\", function(pa, qa) {\n            aa.log(\"close_view_unsubscribed\", {\n                thread_id: qa\n            });\n            fa(qa, \"close_view_unsubscribed\", na);\n            return false;\n        });\n        o.subscribe(\"esc-pressed\", function(pa, qa) {\n            aa.log(\"close_esc\", {\n                thread_id: qa\n            });\n            var ra = fa(qa, \"close_esc\", na);\n            (function() {\n                (da((ra - 1), true, true) || da(ra, false, true));\n            }).defer();\n        });\n        p.subscribe(\"selector/close-tab\", function(pa, qa) {\n            aa.log(\"close_chat_from_selector\", {\n                thread_id: qa\n            });\n            fa(qa, \"close_chat_from_selector\", na);\n        });\n        t.subscribe(\"messages-received\", function(pa, qa) {\n            for (var ra in qa) {\n                var sa = qa[ra];\n                for (var ta = 0; (ta < sa.length); ta++) {\n                    var ua = sa[ta];\n                    if ((ua.author != r.user)) {\n                        if (!ua.is_unread) {\n                            aa.log(\"message_already_read\", {\n                                action_id: ua.action_id,\n                                thread_id: ua.thread_id\n                            });\n                            continue;\n                        }\n                    ;\n                        u.getThreadMeta(ra, function(va) {\n                            n.messageIsAllowed(va, ua, function() {\n                                var wa = (na.hasRoomForRaisedTab() ? undefined : ga(na));\n                                k.newMessage(ra, ua, wa, na.getTabsToShow());\n                            });\n                        });\n                    }\n                ;\n                };\n            };\n        });\n        t.subscribe(\"thread-read-changed\", function(pa, qa) {\n            for (var ra in qa) {\n                if (!qa[ra].mark_as_read) {\n                    aa.log(\"autoclose_marked_unread\", {\n                        thread_id: ra\n                    });\n                    m.closeTab(ra, \"autoclose_marked_unread\");\n                }\n            ;\n            };\n        });\n        o.subscribe(\"tab-pressed\", function(pa, qa) {\n            return !da(m.indexOf(qa.id), qa.shiftPressed);\n        });\n        g.subscribe(q.DUMP_EVENT, function(pa, qa) {\n            qa.chat_controller = {\n                auto_close_timeout: z\n            };\n        });\n    };\n    if (x.firefox()) {\n        var ia = function() {\n            return ((w.get(document.body, \"overflowX\") + \" \") + w.get(document.body, \"overflowY\"));\n        }, ja = ia(), ka = function() {\n            var na = ia();\n            if ((na !== ja)) {\n                ja = na;\n                g.inform(\"overflow-applied-to-body\");\n            }\n        ;\n        };\n        if ((\"MutationObserver\" in window)) {\n            var la = new MutationObserver(ka), ma = {\n                attributes: true,\n                attributeFilter: [\"class\",\"style\",]\n            };\n            la.observe(document.documentElement, ma);\n        }\n         else document.documentElement.addEventListener(\"DOMAttrModified\", function(event) {\n            if (((event.getTarget() === document.documentElement) && (((event.attrName === \"class\") || (event.attrName === \"style\"))))) {\n                ka();\n            };\n        }, false);\n    ;\n    }\n;\n    e.exports = ha;\n});\n__d(\"ChatTabViewCoordinator\", [\"Arbiter\",\"ChatTabModel\",\"ChatTabView\",\"ChatTabViewSelector\",\"CSS\",\"VideoCallCore\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ChatTabModel\"), i = b(\"ChatTabView\"), j = b(\"ChatTabViewSelector\"), k = b(\"CSS\"), l = b(\"VideoCallCore\");\n    function m(n, o) {\n        var p = new j(n), q = {\n        }, r = false;\n        function s() {\n            var w = h.get(), x = {\n            };\n            w.tabs.forEach(function(z) {\n                x[z.id] = 1;\n            });\n            for (var y in q) {\n                if (!x[y]) {\n                    q[y].destroy();\n                    delete (q[y]);\n                }\n            ;\n            };\n            t(w);\n            u(w);\n        };\n        function t(w) {\n            var x = null;\n            w.tabs.forEach(function(y) {\n                var z = y.id, aa = false;\n                if (!q[z]) {\n                    q[z] = new i(z, y.server_id, y.signatureID);\n                    aa = true;\n                }\n                 else q[z].updateSignatureID(y.signatureID);\n            ;\n                if ((aa || !q[z].nextTabIs(x))) {\n                    var ba = q[z].getScrollTop();\n                    if (x) {\n                        q[z].insertBefore(x);\n                    }\n                     else q[z].appendTo(n);\n                ;\n                    if (ba) {\n                        q[z].setScrollTop(ba);\n                    };\n                }\n            ;\n                x = q[z];\n            });\n        };\n        function u(w) {\n            var x = o.getTabsToShow(w), y = [], z = false;\n            w.tabs.forEach(function(aa) {\n                if (!x[aa.id]) {\n                    q[aa.id].setVisibleState(false, aa.raised);\n                    y.push(aa);\n                }\n            ;\n            });\n            w.tabs.forEach(function(aa) {\n                if (x[aa.id]) {\n                    q[aa.id].setVisibleState(true, aa.raised);\n                    z |= aa.raised;\n                }\n            ;\n            });\n            p.setTabData(y);\n            v(z);\n        };\n        function v(w) {\n            if ((!w && r)) {\n                g.inform(\"layer_hidden\", {\n                    type: \"ChatTab\"\n                });\n                r = false;\n            }\n             else if ((w && !r)) {\n                g.inform(\"layer_shown\", {\n                    type: \"ChatTab\"\n                });\n                r = true;\n            }\n            \n        ;\n        };\n        if (l.isSupported()) {\n            k.addClass(n, \"videoCallEnabled\");\n        };\n        o.subscribe(\"tabs-changed\", s);\n        s();\n    };\n    e.exports = m;\n});\n__d(\"TabsViewport\", [\"Arbiter\",\"ArbiterMixin\",\"ChatTabModel\",\"Dock\",\"DOM\",\"DOMDimensions\",\"Event\",\"Parent\",\"Vector\",\"ViewportBounds\",\"areObjectsEqual\",\"copyProperties\",\"csx\",\"shield\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ArbiterMixin\"), i = b(\"ChatTabModel\"), j = b(\"Dock\"), k = b(\"DOM\"), l = b(\"DOMDimensions\"), m = b(\"Event\"), n = b(\"Parent\"), o = b(\"Vector\"), p = b(\"ViewportBounds\"), q = b(\"areObjectsEqual\"), r = b(\"copyProperties\"), s = b(\"csx\"), t = b(\"shield\"), u = 164, v = 264;\n    function w(x) {\n        this._root = x;\n        var y = this._recalculateWidth.bind(this);\n        m.listen(window, \"resize\", y);\n        j.subscribe(\"resize\", y);\n        g.subscribe([\"LitestandSidebar/expand\",\"LitestandSidebar/collapse\",], y);\n        g.subscribeOnce([\"sidebar/initialized\",\"LitestandSidebar/initialized\",], y, g.SUBSCRIBE_NEW);\n        i.subscribe(\"chat/tabs-changed\", t(this._recalculateTabs, this, true));\n        this._recalculateWidth();\n        this._initialized = true;\n    };\n    r(w.prototype, h, {\n        _root: null,\n        _initialized: false,\n        _availableWidth: 0,\n        _maxShown: 1,\n        _viewState: null,\n        _recalculateWidth: function() {\n            var x = w._getAvailableDockWidth(this._root), y = Math.max(1, Math.floor((x / v))), z = (y != this._maxShown);\n            if ((((!this._viewState || z) || (x <= this._viewState.usedWidth)) || (x > this._viewState.widthToShowNext))) {\n                this._availableWidth = x;\n                this._maxShown = y;\n                this._viewState = null;\n                this._recalculateTabs(z);\n            }\n        ;\n        },\n        _onTabsChanged: function() {\n            if (this._initialized) {\n                this.inform(\"tabs-changed\");\n                this.inform(\"max-to-show-changed\", this._maxShown);\n                this.inform(\"max-to-show-change-completed\");\n            }\n        ;\n        },\n        _recalculateTabs: function(x) {\n            var y = w._getTabsToShow(i.get(), this._availableWidth);\n            if ((x || !q(this._viewState, y))) {\n                this._viewState = y;\n                this._onTabsChanged();\n            }\n        ;\n        },\n        getMaxTabsToShow: function() {\n            return this._maxShown;\n        },\n        checkWidth: function() {\n            this._recalculateWidth();\n        },\n        hasRoomForRaisedTab: function() {\n            return ((this._availableWidth - this._viewState.usedWidth) > v);\n        },\n        getTabsToShow: function() {\n            return JSON.parse(JSON.stringify(this._viewState.tabsToShow));\n        },\n        shouldPromoteOnRaise: function(x) {\n            if (!this._viewState.tabsToShow[x]) {\n                return true\n            };\n            if ((this._viewState.nextToHide != x)) {\n                return false\n            };\n            var y = i.getTab(x), z = (y && y.raised);\n            return (!z && (((this._availableWidth - this._viewState.usedWidth) < 100)));\n        }\n    });\n    r(w, {\n        _getAvailableDockWidth: function(x) {\n            var y = l.getViewportWithoutScrollbarDimensions().width;\n            y -= (p.getLeft() + p.getRight());\n            y -= 50;\n            var z = n.byClass(x, \"fbDock\"), aa = k.find(z, \"._56ox\"), ba = o.getElementDimensions(aa).x;\n            y -= ba;\n            var ca = k.find(z, \"._56oy\");\n            ba += o.getElementDimensions(ca).x;\n            var da = o.getElementDimensions(z), ea = (da.x - ba);\n            y -= ea;\n            y -= 15;\n            return Math.max(y, 0);\n        },\n        _getTabsToShow: function(x, y) {\n            y = Math.max(y, (v + 1));\n            function z(oa) {\n                return (oa.raised ? v : u);\n            };\n            var aa = JSON.parse(JSON.stringify(x.tabs)), ba = -1, ca = null;\n            if (x.promoted) {\n                aa.forEach(function(oa, pa) {\n                    if ((oa.id === x.promoted)) {\n                        ba = pa;\n                        ca = oa;\n                    }\n                ;\n                });\n            };\n            var da = 0, ea = 0, fa = !ca;\n            aa.forEach(function(oa, pa) {\n                var qa = z(oa);\n                oa.leftmostOffset = (da + v);\n                da += qa;\n                if ((oa.leftmostOffset < y)) {\n                    ea++;\n                };\n                fa |= (pa == ba);\n                oa.alreadyPlacedPromoted = fa;\n            });\n            function ga(oa, pa, qa) {\n                var ra = {\n                };\n                for (var sa = 0; (sa < pa); sa++) {\n                    var ta = oa[sa];\n                    if ((!ta.alreadyPlacedPromoted && (sa == (pa - 1)))) {\n                        ra[qa] = true;\n                    }\n                     else ra[ta.id] = true;\n                ;\n                };\n                return ra;\n            };\n            var ha = ga(aa, ea, x.promoted), ia = ga(aa, (ea - 1), x.promoted), ja = null;\n            for (var ka in ha) {\n                if (!ia[ka]) {\n                    ja = ka;\n                };\n            };\n            var la = aa[(ea - 1)], ma = (la ? la.leftmostOffset : 0), na = Infinity;\n            if ((ea < aa.length)) {\n                na = aa[ea].leftmostOffset;\n            };\n            return {\n                nextToHide: ja,\n                tabsToShow: ha,\n                usedWidth: ma,\n                widthToShowNext: na\n            };\n        }\n    });\n    e.exports = w;\n});\n__d(\"LinkshimHandler\", [\"Event\",\"LinkshimAsyncLink\",\"LinkshimHandlerConfig\",\"URI\",\"shield\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"LinkshimAsyncLink\"), i = b(\"LinkshimHandlerConfig\"), j = b(\"URI\"), k = b(\"shield\"), l = {\n        setUpLinkshimHandling: function(r) {\n            var s = j(r.getAttribute(\"href\")), t = m(s);\n            if ((t && n(s))) {\n                g.listen(r, \"mouseover\", k(h.swap, null, r, t));\n                var u = p(s);\n                g.listen(r, \"click\", function() {\n                    if (i.supports_meta_referrer) {\n                        h.referrer_log(r, u, o(s).toString());\n                    }\n                     else h.swap(r, s);\n                ;\n                });\n            }\n        ;\n        }\n    };\n    function m(r) {\n        return (r.getQueryData().u ? new j(r.getQueryData().u) : null);\n    };\n    function n(r) {\n        return r.getQueryData().hasOwnProperty(\"s\");\n    };\n    function o(r) {\n        return j(\"/si/ajax/l/render_linkshim_log/\").setSubdomain(\"www\").setQueryData(r.getQueryData());\n    };\n    function p(r) {\n        var s;\n        if (q()) {\n            s = j(r).addQueryData({\n                render_verification: true\n            });\n        }\n         else s = m(r);\n    ;\n        return s;\n    };\n    function q() {\n        var r = (i.render_verification_rate || 0);\n        return (Math.floor(((Math.random() * r) + 1)) === r);\n    };\n    e.exports = l;\n});\n__d(\"legacy:CompactTypeaheadRenderer\", [\"CompactTypeaheadRenderer\",], function(a, b, c, d) {\n    if (!a.TypeaheadRenderers) {\n        a.TypeaheadRenderers = {\n        };\n    };\n    a.TypeaheadRenderers.compact = b(\"CompactTypeaheadRenderer\");\n}, 3);");
// 12313
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o7,"sa12b713637f060cce8695ac62ceaa2dbc01621b6");
// 12314
geval("if (JSBNG__self.CavalryLogger) {\n    CavalryLogger.start_js([\"brbS1\",]);\n}\n;\n;\n__d(\"BlackbirdUpsellConstants\", [], function(a, b, c, d, e, f) {\n    e.exports = {\n        ACTION_UPSELL: \"upsell\",\n        CLICK_TYPE_DISMISS_PROMO: \"dismiss_promo\",\n        ACTION_EDUCATE: \"educate\",\n        CLICK_TYPE_ENABLE_CHAT: \"enable_chat\",\n        CLICK_TYPE_OPEN_SETTINGS: \"open_settings\"\n    };\n});\n__d(\"GenderConst\", [], function(a, b, c, d, e, f) {\n    var g = {\n        UNKNOWN: 0,\n        FEMALE_SINGULAR: 1,\n        MALE_SINGULAR: 2,\n        FEMALE_SINGULAR_GUESS: 3,\n        MALE_SINGULAR_GUESS: 4,\n        MIXED_SINGULAR: 5,\n        MIXED_PLURAL: 5,\n        NEUTER_SINGULAR: 6,\n        UNKNOWN_SINGULAR: 7,\n        FEMALE_PLURAL: 8,\n        MALE_PLURAL: 9,\n        NEUTER_PLURAL: 10,\n        UNKNOWN_PLURAL: 11\n    };\n    e.exports = g;\n});\n__d(\"AsyncLoader\", [\"copyProperties\",\"AsyncRequest\",\"BaseAsyncLoader\",], function(a, b, c, d, e, f) {\n    var g = b(\"copyProperties\"), h = b(\"AsyncRequest\"), 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        new h(k).setData({\n            ids: l\n        }).setHandler(n).setErrorHandler(o).setAllowCrossPageTransition(true).setMethod(\"GET\").setReadOnly(true).send();\n    };\n    e.exports = j;\n});\n__d(\"BlackbirdUpsell\", [\"JSBNG__Event\",\"Arbiter\",\"AsyncRequest\",\"LegacyContextualDialog\",\"DOM\",\"LayerDestroyOnHide\",\"LayerHideOnTransition\",\"PresencePrivacy\",\"copyProperties\",\"BlackbirdUpsellConfig\",\"BlackbirdUpsellConstants\",\"BlackbirdUpsellTemplates\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"Arbiter\"), i = b(\"AsyncRequest\"), j = b(\"LegacyContextualDialog\"), k = b(\"DOM\"), l = b(\"LayerDestroyOnHide\"), m = b(\"LayerHideOnTransition\"), n = b(\"PresencePrivacy\"), o = b(\"copyProperties\"), p = b(\"BlackbirdUpsellConfig\"), q = b(\"BlackbirdUpsellConstants\"), r = b(\"BlackbirdUpsellTemplates\"), s = \"/ajax/chat/blackbird/update_clicks.php\", t = \"/ajax/chat/blackbird/update_impressions.php\", u = \"/ajax/chat/blackbird/dismiss.php\", v = 235, w = null, x = null, y = false, z = false;\n    function aa() {\n    \n    };\n;\n    o(aa, {\n        shouldShow: function() {\n            if (this._dialogDismissed) {\n                return false;\n            }\n        ;\n        ;\n            if (this.isEducation()) {\n                return ((((!!p.EducationGK && !p.EducationDismissed)) && ((p.EducationImpressions < p.EducationImpressionLimit))));\n            }\n             else return ((((((!!p.UpsellGK && !p.UpsellDismissed)) && ((p.UpsellImpressions < p.UpsellImpressionLimit)))) && ((p.FriendCount >= p.UpsellMinFriendCount))))\n        ;\n        },\n        isEducation: function() {\n            return ((p.TimeOffline <= p.EducationTimeOfflineThresdhold));\n        },\n        getOfflineContent: function() {\n            if (this.isEducation()) {\n                return this._getEducationContent();\n            }\n             else return this._getUpsellContent()\n        ;\n        },\n        _getEducationContent: function() {\n            ga();\n            var ka = r[\":fb:chat:blackbird:offline-educate\"].build(), la = ka.getNode(\"chatSettingsButton\");\n            g.listen(la, \"click\", function() {\n                h.inform(\"chat/advanced-settings-dialog-opened\");\n                ja(q.CLICK_TYPE_OPEN_SETTINGS);\n                da();\n            });\n            return ka.getRoot();\n        },\n        _getUpsellContent: function() {\n            fa();\n            var ka = r[\":fb:chat:blackbird:upsell\"].build(), la = ka.getNode(\"chatSettingsButton\");\n            g.listen(la, \"click\", function() {\n                h.inform(\"chat/advanced-settings-dialog-opened\");\n                ia(q.CLICK_TYPE_OPEN_SETTINGS);\n                ca();\n            });\n            var ma = ka.getNode(\"enableChatButton\");\n            g.listen(ma, \"click\", function() {\n                ia(q.CLICK_TYPE_ENABLE_CHAT);\n                ca();\n            });\n            return ka.getRoot();\n        },\n        getBlackbirdContent: function(ka) {\n            ga();\n            switch (ka) {\n              case n.ONLINE:\n                return r[\":fb:chat:blackbird:most-friends-educate\"].build().getRoot();\n              case n.OFFLINE:\n                return r[\":fb:chat:blackbird:some-friends-educate\"].build().getRoot();\n            };\n        ;\n        },\n        showOfflineDialog: function(ka) {\n            this.showDialog(ka, this.getOfflineContent.bind(this));\n        },\n        showBlackbirdDialog: function(ka, la) {\n            this.showDialog(ka, this.getBlackbirdContent.curry(la));\n        },\n        showDialog: function(ka, la) {\n            ((!w && this._constructDialog()));\n            k.setContent(x, la());\n            w.setContext(ka);\n            w.show();\n        },\n        hide: function() {\n            if (((w && w.isShown()))) {\n                w.hide();\n            }\n        ;\n        ;\n        },\n        dismiss: function() {\n            this.hide();\n            if (this.isEducation()) {\n                da();\n            }\n             else ca();\n        ;\n        ;\n        },\n        registerDismissClick: function() {\n            if (this.isEducation()) {\n                ja(q.CLICK_TYPE_DISMISS_PROMO);\n            }\n             else ia(q.CLICK_TYPE_DISMISS_PROMO);\n        ;\n        ;\n        },\n        isVisible: function() {\n            return ((z && !y));\n        },\n        _constructDialog: function() {\n            var ka = r[\":fb:chat:blackbird:dialog-frame\"].build();\n            x = ka.getNode(\"dialogContent\");\n            w = new j();\n            w.init(ka.getRoot());\n            w.setPosition(\"above\").setWidth(v).setFixed(true).disableBehavior(l).disableBehavior(m);\n            g.listen(ka.getNode(\"dialogCloseButton\"), \"click\", this.dismiss.bind(this));\n            g.listen(ka.getNode(\"dialogCloseButton\"), \"click\", this.registerDismissClick.bind(this));\n        }\n    });\n    function ba(ka, la) {\n        if (((!y && z))) {\n            y = true;\n            n.inform(\"privacy-user-presence-changed\");\n            var ma = new i(u);\n            ma.setData({\n                source: ka,\n                impressions: la,\n                time_offline: p.TimeOffline\n            });\n            ma.setErrorHandler(function() {\n                y = false;\n            });\n            ma.send();\n        }\n    ;\n    ;\n    };\n;\n    function ca() {\n        ba(q.ACTION_UPSELL, p.UpsellImpressions);\n    };\n;\n    function da() {\n        ba(q.ACTION_EDUCATE, p.EducationImpressions);\n    };\n;\n    function ea(ka, la) {\n        if (!z) {\n            z = true;\n            var ma = new i(t);\n            ma.setData({\n                action: ka,\n                impressions: la,\n                time_offline: p.TimeOffline\n            });\n            ma.setErrorHandler(function() {\n                z = false;\n            });\n            ma.send();\n        }\n    ;\n    ;\n    };\n;\n    function fa() {\n        ea(q.ACTION_UPSELL, p.UpsellImpressions);\n    };\n;\n    function ga() {\n        ea(q.ACTION_EDUCATE, p.EducationImpressions);\n    };\n;\n    function ha(ka, la, ma, na) {\n        var oa = new i(s);\n        oa.setData({\n            action: ka,\n            impressions: ma,\n            source: la,\n            time_offline: na\n        });\n        oa.send();\n    };\n;\n    function ia(ka) {\n        ha(ka, q.ACTION_UPSELL, p.UpsellImpressions, p.TimeOffline);\n    };\n;\n    function ja(ka) {\n        ha(ka, q.ACTION_EDUCATE, p.EducateImpressions, p.TimeOffline);\n    };\n;\n    h.subscribe(\"chat/advanced-settings-dialog-opened\", aa.dismiss.bind(aa));\n    h.subscribe(\"chat-visibility/go-online\", aa.dismiss.bind(aa));\n    h.subscribe(\"chat-visibility/go-offline\", aa.dismiss.bind(aa));\n    e.exports = aa;\n});\n__d(\"ChatFavoriteNux\", [\"AsyncRequest\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = null, i = false, j = {\n        tryShow: function(k) {\n            if (((h && !i))) {\n                h.setContext(k);\n                h.show();\n                i = true;\n            }\n        ;\n        ;\n        },\n        tryHide: function() {\n            if (((h && i))) {\n                h.hide();\n                h = null;\n            }\n        ;\n        ;\n        },\n        registerDialog: function(k) {\n            h = k;\n            if (k) {\n                k.subscribe(\"JSBNG__confirm\", this.dismissDialog);\n            }\n        ;\n        ;\n        },\n        dismissDialog: function() {\n            if (h) {\n                new g(\"/ajax/chat/dismiss_favorite_nux.php\").send();\n                h.hide();\n                h = null;\n            }\n        ;\n        ;\n        }\n    };\n    e.exports = j;\n});\n__d(\"ChatGroupThreadsController\", [\"ArbiterMixin\",\"ChatConfig\",\"InitialMultichatList\",\"MercuryOrderedThreadlist\",\"MercuryServerRequests\",\"MercuryThreadInformer\",\"MercuryThreads\",\"MessagingTag\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"ArbiterMixin\"), h = b(\"ChatConfig\"), i = b(\"InitialMultichatList\"), j = b(\"MercuryOrderedThreadlist\").get(), k = b(\"MercuryServerRequests\").get(), l = b(\"MercuryThreadInformer\").get(), m = b(\"MercuryThreads\").get(), n = b(\"MessagingTag\"), o = b(\"copyProperties\"), p, q = [], r = h.get(\"max_sidebar_multichats\", 3);\n    function s(x) {\n        var y = m.getThreadMetaNow(x);\n        return ((((y && !y.is_canonical)) && m.canReply(x)));\n    };\n;\n    var t = i.payload;\n    if (t) {\n        k.handleUpdate(t);\n        var u = ((t.threads || []));\n        q = u.map(function(x) {\n            return x.thread_id;\n        });\n    }\n;\n;\n    if (q.length) {\n        var v = m.getThreadMetaNow(q[((q.length - 1))]);\n        p = ((v && ((v.timestamp - 1))));\n    }\n;\n;\n    if (!p) {\n        p = JSBNG__Date.now();\n    }\n;\n;\n    var w = {\n    };\n    o(w, g, {\n        getThreadIDs: function() {\n            var x = 0;\n            return q.filter(function(y) {\n                return ((((((x < r)) && s(y))) && ++x));\n            });\n        }\n    });\n    l.subscribe(\"threadlist-updated\", function() {\n        q = j.getThreadlistUntilTimestamp(p, n.INBOX, n.GROUPS).filter(s);\n        w.inform(\"update\");\n    });\n    e.exports = w;\n});\n__d(\"ChatHovercard\", [\"Arbiter\",\"AsyncLoader\",\"Hovercard\",\"JSLogger\",\"debounce\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"AsyncLoader\"), i = b(\"Hovercard\"), j = b(\"JSLogger\"), k = b(\"debounce\"), l = 5, m = new h(\"/ajax/chat/hovercard/sidebar.php\", \"hover\"), n = j.create(\"chat_hovercard\");\n    g.subscribe(\"Hovercard/dirty\", m.reset.bind(m));\n    function o(s, t) {\n        m.get(s, function(u) {\n            (function() {\n                if (!u) {\n                    n.error(\"fetch_failure\", {\n                        id: s\n                    });\n                    return;\n                }\n            ;\n            ;\n                var v = i.getDialog(u);\n                if (!v) {\n                    n.error(\"no_hovercard\", {\n                        id: s,\n                        endpoint: u\n                    });\n                    return;\n                }\n            ;\n            ;\n                if (((s == t.getActiveID()))) {\n                    t.showHovercard(s, v);\n                }\n            ;\n            ;\n            }).defer();\n        });\n    };\n;\n    function p(s, t) {\n        var u = [];\n        function v(y) {\n            if (((((y >= 0)) && ((y < s.length))))) {\n                u.push(s[y]);\n            }\n        ;\n        ;\n        };\n    ;\n        var w = s.indexOf(t);\n        if (((w > -1))) {\n            v(w);\n            for (var x = 1; ((x < l)); x++) {\n                v(((w + x)));\n                v(((w - x)));\n            };\n        ;\n        }\n    ;\n    ;\n        return u.filter(function(y) {\n            return y;\n        });\n    };\n;\n    function q(s, t) {\n        var u = t.getActiveID();\n        if (u) {\n            var v = s.getShowingUsers(), w = p(v, u);\n            m.get(w, function() {\n            \n            });\n        }\n    ;\n    ;\n    };\n;\n    function r(s) {\n        var t = s.getHoverController();\n        t.registerDefault(o);\n        t.subscribe(\"hover\", k(q.curry(s, t), 100));\n    };\n;\n    e.exports = r;\n});\n__d(\"ChatOptions\", [\"Arbiter\",\"ChannelConstants\",\"JSLogger\",\"PresenceUtil\",\"copyProperties\",\"ChatOptionsInitialData\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ChannelConstants\"), i = b(\"JSLogger\"), j = b(\"PresenceUtil\"), k = b(\"copyProperties\"), l = i.create(\"chat_options\"), m = {\n    };\n    (function() {\n        var o = b(\"ChatOptionsInitialData\");\n        {\n            var fin214keys = ((window.top.JSBNG_Replay.forInKeys)((o))), fin214i = (0);\n            var p;\n            for (; (fin214i < fin214keys.length); (fin214i++)) {\n                ((p) = (fin214keys[fin214i]));\n                {\n                    var q = o[p];\n                    m[p] = !!q;\n                };\n            };\n        };\n    ;\n    })();\n    var n = k(new g(), {\n        getSetting: function(o) {\n            return m[o];\n        },\n        setSetting: function(o, p, q) {\n            if (((this.getSetting(o) == p))) {\n                return;\n            }\n        ;\n        ;\n            if (q) {\n                q = ((\"from_\" + q));\n                l.log(q, {\n                    JSBNG__name: o,\n                    new_value: p,\n                    old_value: this.getSetting(o)\n                });\n            }\n        ;\n        ;\n            m[o] = !!p;\n            g.inform(\"chat/option-changed\", {\n                JSBNG__name: o,\n                value: p\n            });\n        }\n    });\n    g.subscribe(h.getArbiterType(\"setting\"), function(o, p) {\n        var q = p.obj;\n        if (((q.window_id === j.getSessionID()))) {\n            return;\n        }\n    ;\n    ;\n        n.setSetting(q.setting, !!q.value, \"channel\");\n    });\n    g.subscribe(i.DUMP_EVENT, function(o, p) {\n        p.chat_options = m;\n    });\n    e.exports = n;\n});\n__d(\"ChatOrderedListHover\", [\"function-extensions\",\"ArbiterMixin\",\"ChatFavoriteList\",\"CSS\",\"ErrorUtils\",\"JSBNG__Event\",\"LayerHideOnBlur\",\"Parent\",\"copyProperties\",\"cx\",\"setTimeoutAcrossTransitions\",\"shield\",], function(a, b, c, d, e, f) {\n    b(\"function-extensions\");\n    var g = b(\"ArbiterMixin\"), h = b(\"ChatFavoriteList\"), i = b(\"CSS\"), j = b(\"ErrorUtils\"), k = b(\"JSBNG__Event\"), l = b(\"LayerHideOnBlur\"), m = b(\"Parent\"), n = b(\"copyProperties\"), o = b(\"cx\"), p = b(\"setTimeoutAcrossTransitions\"), q = b(\"shield\");\n    function r(u) {\n        i.addClass(u, \"fetching\");\n    };\n;\n    function s(u) {\n        i.removeClass(u, \"fetching\");\n    };\n;\n    function t(u) {\n        this._orderedList = u;\n        this._root = u.getRoot();\n        k.listen(this._root, \"mouseover\", this._mouseOver.bind(this));\n        k.listen(this._root, \"mouseleave\", this._mouseLeave.bind(this));\n        u.subscribe(\"click\", q(this._hide, this));\n    };\n;\n    n(t.prototype, g, {\n        _root: null,\n        _activeItem: null,\n        _hideTimeout: null,\n        _showTimeout: null,\n        _showingDialog: null,\n        _showingID: null,\n        _handlers: {\n        },\n        _defaultHandler: null,\n        _mouseOver: function(JSBNG__event) {\n            if (this._paused) {\n                return;\n            }\n        ;\n        ;\n            var u = JSBNG__event.getTarget(), v = ((m.byClass(u, \"_42fz\") || m.byClass(u, \"_5a58\")));\n            ((v && this._setActiveItem(v)));\n        },\n        _mouseLeave: function(JSBNG__event) {\n            this._setActiveItem(null);\n        },\n        _clearTimeouts: function() {\n            ((this._showTimeout && JSBNG__clearTimeout(this._showTimeout)));\n            this._showTimeout = null;\n            ((this._hideTimeout && JSBNG__clearTimeout(this._hideTimeout)));\n            this._hideTimeout = null;\n        },\n        _hide: function() {\n            if (this._showingDialog) {\n                this._showingDialog.hide();\n                this._showingDialog = null;\n                this._showingID = null;\n            }\n        ;\n        ;\n        },\n        _show: function() {\n            var u = this.getActiveID(), v = false;\n            if (this._handlers[u]) {\n                v = true;\n                j.applyWithGuard(this._handlers[u], {\n                }, [u,this,]);\n            }\n             else if (this._defaultHandler) {\n                v = true;\n                j.applyWithGuard(this._defaultHandler, {\n                }, [u,this,]);\n            }\n            \n        ;\n        ;\n            if (((v && ((this._showingID != this.getActiveID()))))) {\n                r(this._activeItem);\n            }\n        ;\n        ;\n        },\n        _setActiveItem: function(u) {\n            if (h.isEditMode()) {\n                this._clearTimeouts();\n                this._hide();\n                return;\n            }\n        ;\n        ;\n            if (((u != this._activeItem))) {\n                this._clearTimeouts();\n                ((this._activeItem && s(this._activeItem)));\n                this._activeItem = null;\n                var v = ((u ? 0 : 100));\n                this._hideTimeout = p(function() {\n                    if (((this.getActiveID() != this._showingID))) {\n                        this._hide();\n                    }\n                ;\n                ;\n                }.bind(this), v);\n                if (u) {\n                    this._activeItem = u;\n                    var w = ((v + 500));\n                    this._showTimeout = p(function() {\n                        this._show();\n                    }.bind(this), w);\n                    this.inform(\"hover\");\n                }\n                 else this.inform(\"leave\");\n            ;\n            ;\n            }\n        ;\n        ;\n        },\n        register: function(u, v) {\n            if (!this._handlers[u]) {\n                this._handlers[u] = v;\n                return {\n                    unregister: function() {\n                        if (((u == this._showingID))) {\n                            this._hide();\n                        }\n                    ;\n                    ;\n                        delete this._handlers[u];\n                        var w = this._orderedList.getAllNodes(), x = w[u];\n                        ((x && s(x)));\n                    }.bind(this)\n                };\n            }\n        ;\n        ;\n        },\n        registerDefault: function(u) {\n            this._defaultHandler = u;\n        },\n        getActiveID: function() {\n            var u = ((this._activeItem && this._orderedList.getUserForNode(this._activeItem)));\n            return ((u || null));\n        },\n        showHovercard: function(u, v) {\n            if (((((u == this.getActiveID())) && ((u != this._showingID))))) {\n                this._clearTimeouts();\n                s(this._activeItem);\n                this._hide();\n                this._showingDialog = v;\n                this._showingID = u;\n                var w = v.subscribe(\"mouseenter\", this._setActiveItem.bind(this, this._activeItem)), x = v.subscribe(\"mouseleave\", function() {\n                    w.unsubscribe();\n                    this._setActiveItem(null);\n                }.bind(this)), y = v.subscribe(\"hide\", function() {\n                    this.inform(\"hovercard_hide\");\n                    w.unsubscribe();\n                    x.unsubscribe();\n                    y.unsubscribe();\n                }.bind(this));\n                v.enableBehavior(l).setContext(this._activeItem).setPosition(\"left\").show();\n                this.inform(\"hovercard_show\");\n            }\n        ;\n        ;\n        },\n        setPaused: function(u) {\n            this._paused = u;\n        }\n    });\n    e.exports = t;\n});\n__d(\"ChatQuietLinks\", [\"JSBNG__Event\",\"DOM\",\"UserAgent\",\"DataStore\",\"Parent\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"DOM\"), i = b(\"UserAgent\"), j = b(\"DataStore\"), k = b(\"Parent\"), l = {\n    }, m = {\n        silenceLinks: function(q) {\n            n(q, this.removeEmptyHrefs.bind(this));\n        },\n        nukeLinks: function(q) {\n            n(q, this.removeAllHrefs.bind(this));\n        },\n        removeEmptyHrefs: function(q) {\n            o(q, function(r) {\n                return ((!r || ((r === \"#\"))));\n            });\n        },\n        removeAllHrefs: function(q) {\n            o(q);\n        },\n        removeMessagesHrefs: function(q) {\n            o(q, function(r) {\n                return ((((!r || ((r === \"#\")))) || ((r.indexOf(\"/messages/\") != -1))));\n            });\n        }\n    };\n    function n(q, r) {\n        var s = !!i.chrome(), t = ((((!!i.chrome() || ((i.ie() >= 9)))) || ((i.firefox() >= 4))));\n        if (l[h.getID(q)]) {\n            return;\n        }\n    ;\n    ;\n        l[h.getID(q)] = true;\n        if (!t) {\n            return;\n        }\n    ;\n    ;\n        if (!s) {\n            ((r && r(q)));\n            return;\n        }\n    ;\n    ;\n        g.listen(q, \"mouseover\", function u(v) {\n            var w = k.byTag(v.getTarget(), \"a\");\n            if (w) {\n                var x = w.getAttribute(\"href\");\n                if (p(x)) {\n                    j.set(w, \"stashedHref\", w.getAttribute(\"href\"));\n                    w.removeAttribute(\"href\");\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n        });\n        g.listen(q, \"mouseout\", function u(v) {\n            var w = k.byTag(v.getTarget(), \"a\"), x = ((w && j.remove(w, \"stashedHref\")));\n            if (p(x)) {\n                w.setAttribute(\"href\", x);\n            }\n        ;\n        ;\n        });\n        g.listen(q, \"mousedown\", function(u) {\n            if (!u.isDefaultRequested()) {\n                return true;\n            }\n        ;\n        ;\n            var v = k.byTag(u.getTarget(), \"a\"), w = ((v && j.get(v, \"stashedHref\")));\n            if (p(w)) {\n                v.setAttribute(\"href\", w);\n            }\n        ;\n        ;\n        });\n    };\n;\n    function o(q, r) {\n        var s = h.scry(q, \"a\");\n        if (r) {\n            s = s.filter(function(t) {\n                return r(t.getAttribute(\"href\"));\n            });\n        }\n    ;\n    ;\n        s.forEach(function(t) {\n            t.removeAttribute(\"href\");\n            t.setAttribute(\"tabindex\", 0);\n        });\n    };\n;\n    function p(q) {\n        return ((q && ((q !== \"#\"))));\n    };\n;\n    e.exports = m;\n});\n__d(\"ChatSidebarThreadlist.react\", [\"ChatConfig\",\"ChatGroupThreadsController\",\"ChatSidebarConstants\",\"ChatSidebarItem.react\",\"ChatSidebarThread.react\",\"MercuryServerRequests\",\"MercuryThreads\",\"MercuryParticipants\",\"PresenceStatus\",\"React\",\"copyProperties\",\"cx\",\"fbt\",\"ix\",], function(a, b, c, d, e, f) {\n    var g = b(\"ChatConfig\"), h = b(\"ChatGroupThreadsController\"), i = b(\"ChatSidebarConstants\"), j = b(\"ChatSidebarItem.react\"), k = b(\"ChatSidebarThread.react\"), l = b(\"MercuryServerRequests\").get(), m = b(\"MercuryThreads\").get(), n = b(\"MercuryParticipants\"), o = b(\"PresenceStatus\"), p = b(\"React\"), q = b(\"copyProperties\"), r = b(\"cx\"), s = b(\"fbt\"), t = b(\"ix\"), u = p.createClass({\n        displayName: \"ChatSidebarThreadlist\",\n        render: function() {\n            var v = this.state.threadData, w = this.state.participantData, x = i.IMAGE_SIZE, y = t(\"/images/chat/sidebar/newGroupChat.png\");\n            if (this.props.litestandSidebar) {\n                x = ((g.get(\"litestand_blended_sidebar\") ? i.LITESTAND_BLENDED_SIZE : i.LITESTAND_IMAGE_SIZE));\n                y = ((g.get(\"litestand_blended_sidebar\") ? t(\"/images/litestand/sidebar/blended/new_group_chat.png\") : t(\"/images/chat/sidebar/newGroupChatLitestand.png\")));\n            }\n        ;\n        ;\n            var z = \"New Group Chat...\";\n            z = g.get(\"divebar_group_new_button_name\", z);\n            var aa = [];\n            if (this.props.showNewGroupsButton) {\n                aa.push(p.DOM.li({\n                    className: (((((\"_56yg\") + ((\" \" + \"_56yj\")))) + ((this.props.offlineItems ? ((\" \" + \"_570-\")) : \"\")))),\n                    key: \"new\"\n                }, j({\n                    images: y,\n                    imageSize: x,\n                    litestandSidebar: this.props.litestandSidebar,\n                    JSBNG__name: z\n                })));\n            }\n        ;\n        ;\n            var ba = {\n            };\n            {\n                var fin215keys = ((window.top.JSBNG_Replay.forInKeys)((v))), fin215i = (0);\n                var ca;\n                for (; (fin215i < fin215keys.length); (fin215i++)) {\n                    ((ca) = (fin215keys[fin215i]));\n                    {\n                        var da = v[ca], ea = da.participants.map(function(ia) {\n                            return ((w || {\n                            }))[ia];\n                        }).filter(function(ia) {\n                            return ia;\n                        }), fa = da.participants.map(function(ia) {\n                            return n.getUserID(ia);\n                        }), ga = fa.sort().join(\"|\");\n                        if (((!ba[ga] && ea.length))) {\n                            ba[ga] = 1;\n                            var ha = l.getServerThreadIDNow(ca);\n                            aa.push(p.DOM.li({\n                                className: (((((\"_5a58\") + ((\" \" + \"_56yg\")))) + ((this.props.offlineItems ? ((\" \" + \"_570-\")) : \"\")))),\n                                \"data-serverthreadid\": ha,\n                                \"data-threadid\": ca,\n                                key: ca\n                            }, k({\n                                image: da.image_src,\n                                imageSize: x,\n                                litestandSidebar: this.props.litestandSidebar,\n                                JSBNG__name: da.JSBNG__name,\n                                participants: ea,\n                                JSBNG__status: o.getGroup(fa),\n                                threadID: ca,\n                                unreadCount: da.unread_count\n                            })));\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            return p.DOM.ul(null, aa);\n        },\n        getInitialState: function() {\n            return {\n            };\n        },\n        componentWillMount: function() {\n            var v = function() {\n                this.setState(this._calculateState());\n            }.bind(this);\n            this.token = h.subscribe(\"update\", v);\n            v();\n        },\n        componentWillUnmount: function() {\n            ((this.token && this.token.unsubscribe()));\n            this.token = null;\n        },\n        _calculateState: function() {\n            var v = false, w = {\n            }, x = {\n            }, y = h.getThreadIDs(), z = y.length;\n            y.forEach(function(ba) {\n                m.getThreadMeta(ba, function(ca) {\n                    x[ba] = ca;\n                    n.getMulti(ca.participants, function(da) {\n                        delete da[n.user];\n                        if (v) {\n                            this.setState(this._calculateState());\n                        }\n                         else q(w, da);\n                    ;\n                    ;\n                        z--;\n                    }.bind(this));\n                }.bind(this));\n            }.bind(this));\n            if (((z === 0))) {\n                return {\n                    threadData: x,\n                    participantData: w\n                };\n            }\n             else {\n                v = true;\n                var aa = ((this.state || {\n                }));\n                return {\n                    threadData: q(aa.threadData, x),\n                    participantData: q(aa.participantData, w)\n                };\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = u;\n});\n__d(\"runAfterScrollingStops\", [\"Arbiter\",\"JSBNG__Event\",\"Run\",\"debounceAcrossTransitions\",\"emptyFunction\",\"throttle\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"JSBNG__Event\"), i = b(\"Run\"), j = b(\"debounceAcrossTransitions\"), k = b(\"emptyFunction\"), l = b(\"throttle\");\n    function m(x, y, z) {\n        if (((y && p[y]))) {\n            return;\n        }\n    ;\n    ;\n        if (!o) {\n            g.subscribe(\"page_transition\", w);\n            o = true;\n        }\n    ;\n    ;\n        if (!n) {\n            x();\n            return;\n        }\n    ;\n    ;\n        ((y && (p[y] = 1)));\n        q.push(x);\n        if (!z) {\n            if (s) {\n                i.onLeave(w);\n                s = false;\n            }\n        ;\n        ;\n            r.push(((q.length - 1)));\n        }\n    ;\n    ;\n    };\n;\n    var n, o, p = {\n    }, q = [], r = [], s = true, t = 500, u = j(function() {\n        n = false;\n        var x = q;\n        q = [];\n        r = [];\n        p = {\n        };\n        for (var y = 0, z = x.length; ((y < z)); ++y) {\n            x[y]();\n        ;\n        };\n    ;\n    }, t);\n    function v() {\n        n = true;\n        u();\n    };\n;\n    function w() {\n        var x = r;\n        r = [];\n        s = true;\n        for (var y = 0, z = x.length; ((y < z)); ++y) {\n            q[x[y]] = k;\n        ;\n        };\n    ;\n    };\n;\n    h.listen(window, \"JSBNG__scroll\", l.acrossTransitions(v, 250));\n    e.exports = m;\n});\n__d(\"ChatOrderedList\", [\"Animation\",\"Arbiter\",\"ArbiterMixin\",\"AsyncDialog\",\"AsyncRequest\",\"AvailableList\",\"AvailableListConstants\",\"Bootloader\",\"CSS\",\"ChannelImplementation\",\"Chat\",\"ChatConfig\",\"ChatContexts\",\"ChatFavoriteList\",\"ChatFavoriteNux\",\"ChatGroupThreadsController\",\"ChatOrderedListHover\",\"ChatQuietLinks\",\"ChatSidebarThreadlist.react\",\"ChatTypeaheadConstants\",\"ChatVisibility\",\"DOM\",\"DataStore\",\"Ease\",\"JSBNG__Event\",\"ImageSourceRequest\",\"ImageSourceType\",\"JSLogger\",\"JSXDOM\",\"LastMobileActiveTimes\",\"MercuryParticipantTypes\",\"MercuryThreadInformer\",\"MercuryThreads\",\"OrderedFriendsList\",\"Parent\",\"PhotoResizeModeConst\",\"PresencePrivacy\",\"React\",\"JSBNG__Rect\",\"ShortProfiles\",\"Style\",\"Tooltip\",\"TypeaheadUtil\",\"URI\",\"Vector\",\"XHPTemplate\",\"copyProperties\",\"createObjectFrom\",\"csx\",\"cx\",\"debounceAcrossTransitions\",\"guid\",\"JSBNG__requestAnimationFrame\",\"runAfterScrollingStops\",\"shield\",\"throttle\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Animation\"), h = b(\"Arbiter\"), i = b(\"ArbiterMixin\"), j = b(\"AsyncDialog\"), k = b(\"AsyncRequest\"), l = b(\"AvailableList\"), m = b(\"AvailableListConstants\"), n = b(\"Bootloader\"), o = b(\"CSS\"), p = b(\"ChannelImplementation\").instance, q = b(\"Chat\"), r = b(\"ChatConfig\"), s = b(\"ChatContexts\"), t = b(\"ChatFavoriteList\"), u = b(\"ChatFavoriteNux\"), v = b(\"ChatGroupThreadsController\"), w = b(\"ChatOrderedListHover\"), x = b(\"ChatQuietLinks\"), y = b(\"ChatSidebarThreadlist.react\"), z = b(\"ChatTypeaheadConstants\"), aa = b(\"ChatVisibility\"), ba = b(\"DOM\"), ca = b(\"DataStore\"), da = b(\"Ease\"), ea = b(\"JSBNG__Event\"), fa = b(\"ImageSourceRequest\"), ga = b(\"ImageSourceType\"), ha = b(\"JSLogger\"), ia = b(\"JSXDOM\"), ja = b(\"LastMobileActiveTimes\"), ka = b(\"MercuryParticipantTypes\"), la = b(\"MercuryThreadInformer\").get(), ma = b(\"MercuryThreads\").get(), na = b(\"OrderedFriendsList\"), oa = b(\"Parent\"), pa = b(\"PhotoResizeModeConst\"), qa = b(\"PresencePrivacy\"), ra = b(\"React\"), sa = b(\"JSBNG__Rect\"), ta = b(\"ShortProfiles\"), ua = b(\"Style\"), va = b(\"Tooltip\"), wa = b(\"TypeaheadUtil\"), xa = b(\"URI\"), ya = b(\"Vector\"), za = b(\"XHPTemplate\"), ab = b(\"copyProperties\"), bb = b(\"createObjectFrom\"), cb = b(\"csx\"), db = b(\"cx\"), eb = b(\"debounceAcrossTransitions\"), fb = b(\"guid\"), gb = b(\"JSBNG__requestAnimationFrame\"), hb = b(\"runAfterScrollingStops\"), ib = b(\"shield\"), jb = b(\"throttle\"), kb = b(\"tx\"), lb = r.get(\"chat_ranked_by_coefficient\", 0), mb = null, nb, ob, pb = 9;\n    function qb(xb, yb, zb, ac, bc, cc) {\n        this._isSidebar = xb;\n        this._isLitestand = ((r.get(\"litestand\", 0) || r.get(\"test_litestand_sidebar\", 0)));\n        this._isLitestandSidebar = ((this._isSidebar && this._isLitestand));\n        this._hasChatFlyout = ((this._isSidebar && r.get(\"litestand_sidebar_chat_flyout\", 0)));\n        this._isSidebarFlyout = !!oa.byClass(yb, \"_57dj\");\n        this._isLeftCollapsedSidebar = !!oa.byClass(yb, \"_5ap0\");\n        this._root = yb;\n        this._itemsMap = {\n        };\n        this._isVisible = false;\n        this._excludedIds = {\n        };\n        this._numTopFriends = 5;\n        this._hasRendered = false;\n        this._preventRendering = false;\n        this._hoverController = null;\n        this._template = zb;\n        this._messageTemplate = ac;\n        this._favoriteMode = r.get(\"divebar_favorite_list\", 0);\n        this._contextualDialog = bc;\n        this._cachedItemHeight = null;\n        this._cachedItemPadding = null;\n        if (((cc && ba.scry(cc, \"._54y_\").length))) {\n            o.show(cc);\n            this._pymk = cc;\n        }\n    ;\n    ;\n        this._usePlaceholder = ((this._isLitestand && this._isSidebar));\n        if (r.get(\"groups_in_divebar\")) {\n            this._groupThreadsNode = ia.li({\n                className: \"_56yf\"\n            });\n            this._updateGroupThreads();\n            this._groupsList = ((this._favoriteMode && ba.JSBNG__find(this._root, \"._56yh\")));\n        }\n    ;\n    ;\n        if (this._favoriteMode) {\n            this._favoriteSidebar = ba.JSBNG__find(this._root, \"._42g5\");\n            this._editButton = ba.scry(this._root, \"._57m9 ._54sl\")[0];\n            this._favoriteList = ba.JSBNG__find(this._root, \"._54sm\");\n            this._activeNowList = ba.JSBNG__find(this._root, \"._54sn\");\n            this._activeNowLabel = ba.scry(this._root, \"._42g9\")[0];\n            if (this._activeNowLabel) {\n                this._activeNowArea = oa.byClass(this._activeNowLabel, \"_57yh\");\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n        if (this._hasChatFlyout) {\n            this._sidebarFlyoutItemContainer = ba.JSBNG__find(this._root, \"._57yi\");\n        }\n    ;\n    ;\n        this._orderedList = ba.JSBNG__find(this._root, \".fbChatOrderedList\");\n        this._scrollableOrderedList = oa.byClass(this._root, \"scrollableOrderedList\");\n        this._chatSidebar = oa.byClass(this._root, \"fbChatSidebar\");\n        this._scrollableArea = oa.byClass(this._root, \"scrollable\");\n        ea.listen(this._root, \"click\", this._onClick.bind(this));\n        ea.listen(this._root, \"mouseenter\", this._mouseEnter.bind(this));\n        ea.listen(this._root, \"mouseleave\", this._mouseLeave.bind(this));\n        if (this._editButton) {\n            ea.listen(this._editButton, \"click\", this.toggleEditMode.bind(this));\n            h.subscribe([\"LitestandSidebarBookmarks/close\",\"LitestandSidebar/collapse\",], this._onEditEnd.bind(this));\n        }\n    ;\n    ;\n        h.subscribe([\"LitestandSidebar/collapse\",\"LitestandSidebar/expand\",], function(JSBNG__event) {\n            if (this._isLitestandSidebar) {\n                this.getHoverController().setPaused(((JSBNG__event === \"LitestandSidebar/collapse\")));\n            }\n        ;\n        ;\n            this.render();\n        }.bind(this));\n        l.subscribe(m.ON_AVAILABILITY_CHANGED, ib(this.update, this));\n        qa.subscribe(\"privacy-changed\", ib(this.update, this));\n        p.subscribe([p.CONNECTED,p.RECONNECTING,p.SHUTDOWN,p.MUTE_WARNING,p.UNMUTE_WARNING,], ib(this.update, this));\n        this.inform(\"initialized\", this, h.BEHAVIOR_PERSISTENT);\n        this.render();\n        h.subscribe(ha.DUMP_EVENT, function(dc, ec) {\n            ec.chat_lists = ((ec.chat_lists || {\n                sorted_list: this.getCachedSortedList(),\n                ordered_list: na.getList(),\n                available_list: qb.getAvailableList(this._excludedIds),\n                excluded_list: this._excludedIds\n            }));\n        }.bind(this));\n        h.subscribe(\"ChatOrderedList/itemHeightChange\", function() {\n            this._cachedItemHeight = null;\n            this._cachedItemPadding = null;\n        }.bind(this));\n        this._renderUnreadCount = r.get(\"divebar_message_count\");\n        if (this._renderUnreadCount) {\n            la.subscribe(\"threads-updated\", function(dc, ec) {\n                {\n                    var fin216keys = ((window.top.JSBNG_Replay.forInKeys)((ec))), fin216i = (0);\n                    var fc;\n                    for (; (fin216i < fin216keys.length); (fin216i++)) {\n                        ((fc) = (fin216keys[fin216i]));\n                        {\n                            var gc = ma.getCanonicalUserInThread(fc);\n                            if (((((!this._renderedTopUsers || !((gc in this._renderedTopUsers)))) || !this._itemsMap[gc]))) {\n                                continue;\n                            }\n                        ;\n                        ;\n                            ma.getThreadMeta(fc, function(hc) {\n                                var ic = ((hc && hc.unread_count));\n                                this._updateUnreadCount(gc, ic);\n                            }.bind(this));\n                        };\n                    };\n                };\n            ;\n            }.bind(this));\n        }\n    ;\n    ;\n    };\n;\n    function rb(xb, yb) {\n        var zb = sb(xb, yb);\n        if (((zb !== 0))) {\n            return zb;\n        }\n    ;\n    ;\n        if (!lb) {\n            var ac = vb(xb, yb);\n            if (((ac !== 0))) {\n                return ac;\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n        return na.compare(xb, yb);\n    };\n;\n    function sb(xb, yb) {\n        var zb = qa.allows(xb), ac = qa.allows(yb);\n        if (((zb !== ac))) {\n            return ((zb ? -1 : 1));\n        }\n    ;\n    ;\n        return 0;\n    };\n;\n    var tb = {\n    };\n    function ub(xb) {\n        return ((tb[xb] || (tb[xb] = wa.flatten(xb))));\n    };\n;\n    function vb(xb, yb) {\n        var zb = ta.getNowUnsafe(xb), ac = ta.getNowUnsafe(yb), bc = ub(((((zb || {\n        })).JSBNG__name || \"~\"))), cc = ub(((((ac || {\n        })).JSBNG__name || \"~\")));\n        if (((bc !== cc))) {\n            return ((((bc < cc)) ? -1 : 1));\n        }\n    ;\n    ;\n        return 0;\n    };\n;\n    function wb(xb, yb) {\n        var zb = ((l.get(xb) === m.MOBILE)), ac = ((l.get(yb) === m.MOBILE));\n        if (((zb !== ac))) {\n            return ((ac ? -1 : 1));\n        }\n    ;\n    ;\n        return vb(xb, yb);\n    };\n;\n    ab(qb, {\n        CONTEXT_CLASSES: {\n            nearby: \"_56xw\",\n            visiting: \"_56xx\",\n            neighbourhood: \"_56xy\",\n            listening: \"_56xz\"\n        },\n        getSortedList: function(xb, yb) {\n            var zb = na.getList().filter(function(cc) {\n                return ((!((cc in xb)) && ((qa.getFriendVisibility(cc) !== qa.BLACKLISTED))));\n            }), ac = [];\n            if (!aa.isOnline()) {\n                Array.prototype.push.apply(ac, zb);\n            }\n             else {\n                if (((qa.getOnlinePolicy() === qa.ONLINE_TO_WHITELIST))) {\n                    zb = this._filterByWhitelist(zb);\n                }\n            ;\n            ;\n                if (r.get(\"chat_web_ranking_with_presence\")) {\n                    Array.prototype.push.apply(ac, zb);\n                }\n                 else ac = this._splitOutTopFriends(zb, yb);\n            ;\n            ;\n            }\n        ;\n        ;\n            ac = ac.slice(0, yb);\n            if (((ac.length === yb))) {\n                var bc = qb.getAvailableList(ac.concat(xb)).length;\n                ((bc && ac.splice(-1)));\n            }\n        ;\n        ;\n            if (!r.get(\"chat_web_ranking_with_presence\")) {\n                ac.sort(rb);\n            }\n        ;\n        ;\n            mb = ac.slice();\n            return ac;\n        },\n        _filterByWhitelist: function(xb) {\n            var yb = xb, zb = {\n            }, ac, bc;\n            xb = [];\n            for (ac = 0; ((ac < yb.length)); ++ac) {\n                bc = yb[ac];\n                if (qa.allows(bc)) {\n                    zb[bc] = true;\n                    xb.push(bc);\n                }\n            ;\n            ;\n            };\n        ;\n            var cc = qa.getWhitelist();\n            for (ac = 0; ((ac < cc.length)); ++ac) {\n                bc = cc[ac];\n                if (!((bc in zb))) {\n                    xb.push(bc);\n                }\n            ;\n            ;\n            };\n        ;\n            for (ac = 0; ((ac < yb.length)); ++ac) {\n                bc = yb[ac];\n                if (!qa.allows(bc)) {\n                    xb.push(bc);\n                }\n            ;\n            ;\n            };\n        ;\n            return xb;\n        },\n        _splitOutTopFriends: function(xb, yb) {\n            var zb = [], ac = [], bc = r.get(\"ordered_list.top_friends\", 0), cc = r.get(\"ordered_list.top_mobile\", 0), dc = yb, ec = xb.length;\n            for (var fc = 0; ((((fc < ec)) && ((dc > 0)))); fc++) {\n                var gc = xb[fc], hc = l.get(gc), ic = ((hc === m.ACTIVE));\n                if (((((ic || ((((hc === m.MOBILE)) && ((fc < cc)))))) || ((fc < bc))))) {\n                    zb.push(gc);\n                    ((ic && dc--));\n                }\n                 else ac.push(gc);\n            ;\n            ;\n            };\n        ;\n            if (((fc < ec))) {\n                Array.prototype.push.apply(ac, xb.slice(fc));\n            }\n        ;\n        ;\n            if (((zb.length < yb))) {\n                Array.prototype.push.apply(zb, ac);\n            }\n        ;\n        ;\n            return zb;\n        },\n        getAvailableList: function(xb) {\n            var yb;\n            if (((r.get(\"divebar_show_mobile_more_friends\") || r.get(\"divebar_show_mobile_more_friends_alphabetical\")))) {\n                yb = l.getAvailableIDs();\n            }\n        ;\n        ;\n            if (!yb) {\n                yb = l.getOnlineIDs();\n            }\n        ;\n        ;\n            return yb.filter(function(zb) {\n                return !((zb in xb));\n            });\n        },\n        _pause: function() {\n            ob = true;\n        },\n        _unpause: function() {\n            ob = false;\n        },\n        _registerToggleRenderItem: function(xb) {\n            ea.listen(xb, \"click\", function() {\n                ob = !ob;\n                o.conditionClass(xb, \"checked\", ob);\n            });\n        }\n    });\n    ab(qb.prototype, i, {\n        getAllNodes: function() {\n            var xb = {\n            }, yb = ba.scry(this._root, \"li._42fz\");\n            for (var zb = 0; ((zb < yb.length)); zb++) {\n                var ac = ca.get(yb[zb], \"id\");\n                if (ac) {\n                    xb[ac] = yb[zb];\n                }\n            ;\n            ;\n            };\n        ;\n            return xb;\n        },\n        getShowingUsers: function() {\n            return ba.scry(this._root, \"li._42fz,li._5a58\").map(this.getUserForNode);\n        },\n        getUserForNode: function(xb) {\n            return ((ca.get(xb, \"id\") || ca.get(xb, \"serverthreadid\")));\n        },\n        getHoverController: function() {\n            if (!this._hoverController) {\n                this._hoverController = new w(this, this._contextualDialog);\n                if (((this._isLitestandSidebar && this._isLitestandSidebarCollapsed()))) {\n                    this._hoverController.setPaused(true);\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            return this._hoverController;\n        },\n        _isLitestandSidebarCollapsed: function() {\n            if (this._isLeftCollapsedSidebar) {\n                return true;\n            }\n        ;\n        ;\n            if (nb) {\n                return !nb.isExpanded();\n            }\n        ;\n        ;\n            n.loadModules([\"LitestandSidebar\",], function(xb) {\n                nb = xb;\n            });\n            return o.hasClass(JSBNG__document.documentElement, \"_4kdq\");\n        },\n        getPaddingOffset: function() {\n            return ((this._favoriteMode ? 24 : 8));\n        },\n        _calculateItemMeasurements: function() {\n            var xb = this._orderedList, yb = this._template.build(), zb = yb.getRoot();\n            ba.setContent(yb.getNode(\"JSBNG__name\"), \"test\");\n            if (this._favoriteSidebar) {\n                xb = this._favoriteList;\n                o.addClass(this._favoriteSidebar, \"_4zmr\");\n            }\n        ;\n        ;\n            zb.style.visibility = \"hidden\";\n            ba.appendContent(xb, zb);\n            this._cachedItemHeight = ya.getElementDimensions(zb).y;\n            this._cachedItemPadding = ((ua.getFloat(yb.getNode(\"anchor\"), \"padding\") || 0));\n            ba.remove(zb);\n            if (this._favoriteSidebar) {\n                o.removeClass(this._favoriteSidebar, \"_4zmr\");\n            }\n        ;\n        ;\n        },\n        getItemHeight: function() {\n            if (((this._cachedItemHeight === null))) {\n                this._calculateItemMeasurements();\n            }\n        ;\n        ;\n            return this._cachedItemHeight;\n        },\n        getItemPadding: function() {\n            if (((this._cachedItemPadding === null))) {\n                this._calculateItemMeasurements();\n            }\n        ;\n        ;\n            return this._cachedItemPadding;\n        },\n        _updateGroupThreads: function() {\n            if (this._groupThreadsNode) {\n                var xb = qa.getVisibility(), yb = y({\n                    offlineItems: ((p.disconnected() || !xb)),\n                    litestandSidebar: ((((((this._isSidebar && this._isLitestand)) && !r.get(\"test_old_divebar\"))) || this._isSidebarFlyout)),\n                    showNewGroupsButton: r.get(\"divebar_has_new_groups_button\", false)\n                });\n                ra.renderComponent(yb, this._groupThreadsNode);\n            }\n        ;\n        ;\n        },\n        _placeholderUpdate: function() {\n            if (((!this._usePlaceholder || !this._scrollContainer))) {\n                return;\n            }\n        ;\n        ;\n            var xb = ((this._root.offsetTop - this._scrollContainer.scrollTop));\n            this._scrollContainerHeight = ((this._scrollContainerHeight || this._scrollContainer.offsetHeight));\n            var yb = this.getItemHeight(), zb = Math.ceil(((this._scrollContainerHeight / yb))), ac = ((((xb < 0)) ? Math.max(((Math.floor(((-xb / yb))) - zb)), 0) : 0)), bc = ((((ac + zb)) + zb));\n            this._cachedItems = ((this._cachedItems || ba.scry(this._root, \"li._42fz\")));\n            for (var cc = 0, dc = this._cachedItems.length; ((cc < dc)); cc++) {\n                o.conditionClass(this._cachedItems[cc], \"_50zv\", ((((cc < ac)) || ((cc > bc)))));\n            ;\n            };\n        ;\n        },\n        _getListItem: function(xb, yb) {\n            var zb = this._itemsMap[xb];\n            if (!zb) {\n                return;\n            }\n        ;\n        ;\n            var ac = l.get(xb), bc = ((qa.allows(xb) && !p.disconnected()));\n            if (((zb.buttonNode === undefined))) {\n                zb.buttonNode = ba.scry(zb.node, \"._54sk\")[0];\n                zb.contextNode = ba.JSBNG__find(zb.node, \"._52zk\");\n                zb.timeNode = ba.scry(zb.node, \".active_time\")[0];\n                zb.statusNodes = ba.scry(zb.node, \"img.JSBNG__status\");\n            }\n        ;\n        ;\n            o.conditionClass(zb.node, \"_42f-\", yb);\n            o.conditionClass(zb.node, \"_54sj\", yb);\n            o.conditionClass(zb.node, \"_52s3\", ((this._isLitestand && yb)));\n            if (zb.buttonNode) {\n                if (!this._isLitestand) {\n                    o.conditionClass(zb.buttonNode, \"_42f_\", yb);\n                    o.conditionClass(zb.buttonNode, \"_42g0\", !yb);\n                }\n            ;\n            }\n        ;\n        ;\n            var cc = {\n                active: false,\n                mobile: false\n            };\n            cc.active = ((ac === m.ACTIVE));\n            cc.mobile = ((ac === m.MOBILE));\n            if (cc.mobile) {\n                var dc = ja.getShortDisplay(xb);\n                if (((zb.timeNode && ((zb.lastActiveTime !== dc))))) {\n                    zb.lastActiveTime = dc;\n                    ba.setContent(zb.timeNode, dc);\n                }\n            ;\n            ;\n            }\n             else if (zb.lastActiveTime) {\n                zb.lastActiveTime = null;\n                ba.empty(zb.timeNode);\n            }\n            \n        ;\n        ;\n            {\n                var fin217keys = ((window.top.JSBNG_Replay.forInKeys)((cc))), fin217i = (0);\n                var ec;\n                for (; (fin217i < fin217keys.length); (fin217i++)) {\n                    ((ec) = (fin217keys[fin217i]));\n                    {\n                        o.conditionClass(zb.node, ec, ((cc[ec] && bc)));\n                    ;\n                    };\n                };\n            };\n        ;\n            o.conditionClass(zb.node, \"invis\", !bc);\n            zb.statusNodes.forEach(function(fc) {\n                if (((((ac === m.ACTIVE)) && bc))) {\n                    fc.alt = \"Online\";\n                }\n                 else if (((((ac === m.MOBILE)) && bc))) {\n                    fc.alt = \"Mobile\";\n                }\n                 else fc.alt = \"\";\n                \n            ;\n            ;\n            });\n            this._applyContext(xb, zb);\n            return zb.node;\n        },\n        getRoot: function() {\n            return this._root;\n        },\n        getSortedList: function(xb) {\n            return qb.getSortedList(((xb || this._excludedIds)), this._numTopFriends);\n        },\n        getCachedSortedList: function(xb) {\n            if (((mb == null))) {\n                mb = this.getSortedList(xb);\n            }\n        ;\n        ;\n            return mb;\n        },\n        toggleFavoriteSidebar: function(xb, yb) {\n            function zb(cc, dc) {\n                o.conditionShow(dc, cc);\n                var ec = oa.byClass(dc, \"uiContextualLayerPositioner\");\n                ((ec && o.conditionShow(ec, cc)));\n            };\n        ;\n            o.conditionShow(this._orderedList, !xb);\n            if (this._favoriteSidebar) {\n                o.conditionShow(this._favoriteSidebar, xb);\n            }\n        ;\n        ;\n            var ac = ba.scry(((this._scrollableOrderedList || this._root)), \"._42i3\");\n            ac.forEach(zb.curry(xb));\n            var bc = ba.scry(((this._scrollableOrderedList || this._root)), \"._56yi\");\n            ((bc.length && zb(yb, bc[0])));\n        },\n        hide: function() {\n            if (!this._isVisible) {\n                return;\n            }\n        ;\n        ;\n            this._isVisible = false;\n            u.tryHide();\n            o.hide(((this._scrollableOrderedList || this._root)));\n            this.inform(\"hide\");\n        },\n        _onFavoriteOrderChange: function() {\n            var xb = this.sortableGroup.getOrder();\n            t.updateList(xb);\n            t.save();\n        },\n        _getFavoriteItems: function() {\n            var xb = [], yb = t.get();\n            for (var zb = 0; ((zb < yb.length)); zb++) {\n                var ac = this._itemsMap[yb[zb]];\n                if (ac) {\n                    xb.push(ac.node);\n                }\n            ;\n            ;\n            };\n        ;\n            return xb;\n        },\n        _getChatTabOpenLogData: function(xb) {\n            var yb = o.hasClass(JSBNG__document.documentElement, \"sidebarMode\"), zb = {\n                mode: ((yb ? \"JSBNG__sidebar\" : \"chatNub\")),\n                typehead: false\n            };\n            if (((this._scrollableArea && this._scrollContainer))) {\n                var ac = ya.getElementPosition(this._scrollableArea, \"viewport\").y, bc = ya.getElementPosition(xb, \"viewport\").y, cc = this._scrollContainer.scrollTop;\n                if (((bc > ac))) {\n                    zb.visible_slot = Math.round(((((bc - ac)) / 32)));\n                    var dc = Math.round(((cc / 32)));\n                    zb.global_slot = ((zb.visible_slot + dc));\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            if (yb) {\n                zb.sidebar_height = ((this._chatSidebar && this._chatSidebar.clientHeight));\n                if (this._scrollContainer) {\n                    zb.buddylist_height = this._scrollContainer.clientHeight;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            return zb;\n        },\n        _resetFavoriteBounds: function() {\n            var xb = t.get(), yb = xb.length;\n            if (yb) {\n                var zb = xb[0], ac = xb[((yb - 1))], bc = this._itemsMap[zb], cc = this._itemsMap[ac], dc = new sa(ya.getElementPosition(bc.node).y, 0, ((ya.getElementPosition(cc.node).y + ya.getElementDimensions(cc.node).y)), 0);\n                this.sortableGroup.setBoundingBox(dc);\n            }\n        ;\n        ;\n        },\n        _createSortableGroup: function() {\n            if (this.sortableGroup) {\n                this.sortableGroup.destroy();\n            }\n        ;\n        ;\n            n.loadModules([\"SortableGroup\",], function(xb) {\n                this.sortableGroup = new xb().setBeforeGrabCallback(this._resetFavoriteBounds.bind(this)).setOrderChangeHandler(this._onFavoriteOrderChange.bind(this));\n                if (this._isLitestand) {\n                    this.sortableGroup.gutter = 1;\n                }\n            ;\n            ;\n                var yb = this._getFavoriteItems();\n                for (var zb = 0; ((zb < yb.length)); zb++) {\n                    var ac = yb[zb];\n                    this.sortableGroup.addSortable(ca.get(ac, \"id\"), ac);\n                };\n            ;\n            }.bind(this));\n        },\n        toggleEditMode: function() {\n            u.dismissDialog();\n            t.toggleEditMode();\n            if (t.isEditMode()) {\n                this._createSortableGroup();\n                ba.setContent(this._editButton, \"DONE\");\n                o.addClass(this._favoriteSidebar, \"_4-d6\");\n                this.inform(\"editStart\");\n            }\n             else this._onEditEnd();\n        ;\n        ;\n        },\n        _onEditEnd: function() {\n            if (t.isEditMode()) {\n                t.toggleEditMode();\n            }\n        ;\n        ;\n            ba.setContent(this._editButton, \"EDIT\");\n            o.removeClass(this._favoriteSidebar, \"_4-d6\");\n            this.inform(\"editEnd\");\n        },\n        _onClick: function(JSBNG__event) {\n            var xb = JSBNG__event.getTarget(), yb = oa.byTag(xb, \"li\");\n            if (t.isEditMode()) {\n                var zb = oa.byClass(xb, \"_54sk\");\n                if (((zb && yb))) {\n                    var ac = ca.get(yb, \"id\");\n                    if (ac) {\n                        t.toggleID(ac);\n                        t.save();\n                    }\n                ;\n                ;\n                    this.update();\n                }\n            ;\n            ;\n                JSBNG__event.prevent();\n                return false;\n            }\n        ;\n        ;\n            if (yb) {\n                if (o.hasClass(yb, \"blackbirdWhitelist\")) {\n                    var bc = new xa(\"/ajax/chat/privacy/settings_dialog.php\").addQueryData({\n                        ref: \"whitelist_separator\"\n                    });\n                    j.send(new k(bc));\n                    JSBNG__event.prevent();\n                    return false;\n                }\n            ;\n            ;\n                var cc = ca.get(yb, \"id\"), dc = o.hasClass(yb, \"_56yg\");\n                if (((cc || dc))) {\n                    var ec = this._getChatTabOpenLogData(yb), fc = o.hasClass(JSBNG__document.documentElement, \"sidebarMode\"), gc = ((qa.getOnlinePolicy() === qa.ONLINE_TO_WHITELIST)), hc = ((gc ? \"white_list\" : \"ordered_list\"));\n                    if (dc) {\n                        cc = yb.getAttribute(\"data-threadid\");\n                        hc = ((cc ? \"recent_threads_in_divebar\" : \"recent_threads_in_divebar_new\"));\n                    }\n                     else if (((((fc && this._favoriteMode)) && !gc))) {\n                        while (yb.parentNode) {\n                            yb = yb.parentNode;\n                            if (o.hasClass(yb, \"_42g8\")) {\n                                hc = \"more_online_friends\";\n                                break;\n                            }\n                        ;\n                        ;\n                            if (o.hasClass(yb, \"_42g7\")) {\n                                break;\n                            }\n                        ;\n                        ;\n                        };\n                    ;\n                    }\n                     else while (yb.previousSibling) {\n                        yb = yb.previousSibling;\n                        if (o.hasClass(yb, \"_554m\")) {\n                            if (o.hasClass(yb, \"moreOnlineFriends\")) {\n                                hc = \"more_online_friends\";\n                                break;\n                            }\n                        ;\n                        ;\n                            if (o.hasClass(yb, \"blackbirdWhitelist\")) {\n                                hc = \"blackbird_offline_section\";\n                                break;\n                            }\n                        ;\n                        ;\n                        }\n                    ;\n                    ;\n                    }\n                    \n                ;\n                ;\n                    ec.source = hc;\n                    var ic = ((dc ? z.THREAD_TYPE : ka.FRIEND));\n                    q.openTab(cc, ic, ec);\n                    this.inform(\"click\", {\n                        id: cc\n                    });\n                }\n                 else if (((o.hasClass(yb, \"_554m\") && oa.byClass(xb, \"_554n\")))) {\n                    this.JSBNG__scrollTo(yb);\n                }\n                 else if (o.hasClass(yb, \"_55nf\")) {\n                    return;\n                }\n                \n                \n            ;\n            ;\n                return false;\n            }\n        ;\n        ;\n        },\n        _mouseEnter: function() {\n            this._preventRendering = true;\n        },\n        _mouseLeave: function() {\n            this._preventRendering = false;\n        },\n        setExcludedIds: function(xb) {\n            this._excludedIds = bb(((xb || [])));\n        },\n        setNumTopFriends: function(xb) {\n            if (((xb !== this._numTopFriends))) {\n                this._numTopFriends = xb;\n                this.render();\n            }\n        ;\n        ;\n        },\n        _getOfflineToSectionItems: function() {\n            var xb = ((\"subheader-text-\" + fb())), yb = ba.create(\"a\", {\n                href: \"#\",\n                \"aria-describedby\": xb\n            }, ba.tx._(\"Edit\")), zb = [], ac = ba.tx._(\"MORE FRIENDS\");\n            zb.push(ia.li({\n                className: \"_554m\"\n            }, ia.div({\n                className: \"_554o\"\n            }, ia.div({\n                className: \"_554n\"\n            }, ia.span({\n                className: \"_554p\"\n            }, ac), ia.div({\n                className: \"_554q\"\n            }, ia.span({\n                className: \"_554r\"\n            }))))));\n            zb.push(ia.li({\n                className: \"_554m blackbirdWhitelist\"\n            }, ia.div({\n                className: \"_554o\"\n            }, ia.div({\n                className: \"fbChatOrderedList/separatorInner\"\n            }, ia.div({\n                className: \"fbChatOrderedList/separatorSubheader\"\n            }, ia.span({\n                id: xb,\n                className: \"_554t\"\n            }, kb._(\"These friends can't see you on chat. {=link}\", {\n                \"=link\": yb\n            })))))));\n            return zb;\n        },\n        _renderOrderedList: function() {\n            if (((((!this._isVisible || ((this._preventRendering && this._hasRendered)))) || ob))) {\n                return;\n            }\n        ;\n        ;\n            this._hasRendered = true;\n            this._cachedItems = null;\n            var xb = [], yb, zb, ac = false, bc = false, cc = r.get(\"divebar_has_new_groups_button\", false), dc = o.hasClass(JSBNG__document.documentElement, \"sidebarMode\"), ec = qa.getVisibility(), fc = ((qa.getOnlinePolicy() === qa.ONLINE_TO_WHITELIST)), gc = ((this._isLitestandSidebar && this._isLitestandSidebarCollapsed())), hc = r.get(\"groups_in_divebar\");\n            ((hc && this._updateGroupThreads()));\n            var ic = ((hc && v.getThreadIDs().length)), jc = ((((((dc && this._favoriteMode)) && ec)) && !fc));\n            if (((((((jc && hc)) && ic)) && this._groupThreadsNode))) {\n                ba.setContent(this._groupsList, this._groupThreadsNode);\n                x.nukeLinks(this._groupThreadsNode);\n                x.nukeLinks(this._favoriteList);\n                this.inform(\"render\");\n            }\n        ;\n        ;\n            var kc = ((((jc && this._groupThreadsNode)) && this._groupsList)), lc = ((kc && ic)), mc = ((this._isLitestand && !oa.byClass(this._root, \"_4w59\")));\n            if (((kc && ((ic || ((mc && cc))))))) {\n                ba.setContent(this._groupsList, this._groupThreadsNode);\n                o.show(this._groupsList);\n                x.nukeLinks(this._favoriteList);\n                this.inform(\"render\");\n            }\n             else ((this._groupsList && o.hide(this._groupsList)));\n        ;\n        ;\n            var nc = ((ic || 0));\n            if (((cc && ((lc || !jc))))) {\n                nc++;\n            }\n        ;\n        ;\n            if (((this._hasChatFlyout && this._isLitestandSidebarCollapsed()))) {\n                nc++;\n            }\n        ;\n        ;\n            var oc = [], pc, qc;\n            if (jc) {\n                ((this._chatSidebar && o.addClass(this._chatSidebar, \"fbSidebarFavoriteList\")));\n                oc = t.get();\n                if (gc) {\n                    oc = oc.slice(0, Math.max(0, ((this._numTopFriends - nc))));\n                }\n            ;\n            ;\n                for (pc = 0, qc = oc.length; ((pc < qc)); pc++) {\n                    yb = oc[pc];\n                    zb = this._getListItem(yb, true);\n                    if (zb) {\n                        xb.push(zb);\n                    }\n                     else {\n                        bc = true;\n                        this._renderListItem(yb, this.update.bind(this));\n                    }\n                ;\n                ;\n                };\n            ;\n            }\n        ;\n        ;\n            this.toggleFavoriteSidebar(jc, lc);\n            var rc = ((gc ? 1 : 0)), sc = qb.getSortedList(bb(oc), Math.max(0, ((((((this._numTopFriends - oc.length)) - nc)) + rc))));\n            if (jc) {\n                if (((oc.length && sc.length))) {\n                    var tc = ba.create(\"li\", {\n                        className: \"_42g3\"\n                    });\n                    xb.push(tc);\n                }\n            ;\n            ;\n            }\n             else if (((ic || cc))) {\n                ((this._groupThreadsNode && xb.push(this._groupThreadsNode)));\n            }\n            \n        ;\n        ;\n            var uc = ((qa.getVisibility() && ((qa.getOnlinePolicy() == qa.ONLINE_TO_WHITELIST))));\n            for (var vc = 0, wc = sc.length; ((vc < wc)); vc++) {\n                yb = sc[vc];\n                if (uc) {\n                    if (!qa.allows(yb)) {\n                        if (((((vc + 2)) >= sc.length))) {\n                            break;\n                        }\n                    ;\n                    ;\n                        uc = false;\n                        var xc = this._getOfflineToSectionItems();\n                        xb.push(xc[0]);\n                        xb.push(xc[1]);\n                        wc -= 2;\n                    }\n                ;\n                }\n            ;\n            ;\n                zb = this._getListItem(yb);\n                if (zb) {\n                    xb.push(zb);\n                }\n                 else this._renderListItem(yb, this.render.bind(this));\n            ;\n            ;\n            };\n        ;\n            if (jc) {\n                ba.setContent(this._favoriteList, xb);\n                if (xb.length) {\n                    x.nukeLinks(this._favoriteList);\n                }\n            ;\n            ;\n                this.inform(\"render\");\n            }\n        ;\n        ;\n            var yc;\n            if (gc) {\n                yc = [];\n            }\n             else yc = qb.getAvailableList(this._excludedIds);\n        ;\n        ;\n            var zc = oc.concat(sc), ad = bb(zc);\n            yc = yc.filter(function(jd) {\n                return !((jd in ad));\n            });\n            if (this._renderUnreadCount) {\n                var bd = [];\n                if (this._renderedTopUsers) {\n                    var cd = Object.keys(this._renderedTopUsers).filter(function(jd) {\n                        return !((jd in ad));\n                    });\n                    cd.forEach(function(jd) {\n                        this._updateUnreadCount(jd, 0);\n                    }.bind(this));\n                    zc.forEach(function(jd) {\n                        if (!((jd in this._renderedTopUsers))) {\n                            bd.push(jd);\n                        }\n                    ;\n                    ;\n                    }.bind(this));\n                }\n                 else bd = zc;\n            ;\n            ;\n                bd.forEach(function(jd) {\n                    ma.getThreadMeta(ma.getThreadIdForUser(jd), function(kd) {\n                        this._updateUnreadCount(jd, ((kd && kd.unread_count)));\n                    }.bind(this));\n                }.bind(this));\n                this._renderedTopUsers = ad;\n            }\n        ;\n        ;\n            if (r.get(\"divebar_show_mobile_more_friends_alphabetical\")) {\n                yc.sort(vb);\n            }\n             else yc.sort(wb);\n        ;\n        ;\n            var dd = \"MORE FRIENDS\";\n            if (jc) {\n                xb = [];\n            }\n             else if (((yc.length && xb.length))) {\n                var ed;\n                if (this._isLitestand) {\n                    ed = ia.span(null, ia.span({\n                        className: \"_554u\"\n                    }, dd, \" \\u00b7 \", yc.length), ia.span({\n                        className: \"_554v\"\n                    }, \" +\", yc.length));\n                }\n                 else ed = kb._(\"{MORE ONLINE FRIENDS} ({=count})\", {\n                    \"MORE ONLINE FRIENDS\": dd,\n                    \"=count\": yc.length\n                });\n            ;\n            ;\n                if (this._pymk) {\n                    ac = true;\n                    xb.push(this._pymk);\n                }\n            ;\n            ;\n                xb.push(ia.li({\n                    className: \"_554m moreOnlineFriends\"\n                }, ia.div({\n                    className: \"_554o\"\n                }, ia.div({\n                    className: \"_554n\"\n                }, ia.span({\n                    className: \"_554p\"\n                }, ed), ia.div({\n                    className: \"_554q\"\n                }, ia.span({\n                    className: \"_554r\"\n                }))))));\n            }\n            \n        ;\n        ;\n            for (pc = 0, qc = yc.length; ((pc < qc)); pc++) {\n                yb = yc[pc];\n                zb = this._getListItem(yb);\n                if (zb) {\n                    xb.push(zb);\n                }\n                 else this._renderListItem(yb, this.render.bind(this));\n            ;\n            ;\n            };\n        ;\n            if (((((!sc.length && !yc.length)) && !nc))) {\n                var fd = this._messageTemplate.render(), gd = za.getNode(fd, \"message\");\n                ba.setContent(gd, \"No one is available to chat.\");\n                xb.push(fd);\n            }\n        ;\n        ;\n            if (this._hasChatFlyout) {\n                var hd = ((this._isLitestandSidebarCollapsed() ? this._getSidebarFlyoutItem() : null));\n                ba.setContent(this._sidebarFlyoutItemContainer, hd);\n            }\n        ;\n        ;\n            if (xb.length) {\n                if (jc) {\n                    o.show(this._activeNowList);\n                    if (this._activeNowLabel) {\n                        var id;\n                        o.show(this._activeNowArea);\n                        if (this._isLitestand) {\n                            id = ia.span(null, ia.span({\n                                className: \"_554u\"\n                            }, dd, \" \\u00b7 \", yc.length), ia.span({\n                                className: \"_554v\"\n                            }, \" +\", yc.length));\n                        }\n                         else id = kb._(\"{MORE ONLINE FRIENDS} ({=count})\", {\n                            \"MORE ONLINE FRIENDS\": \"ACTIVE NOW\",\n                            \"=count\": yc.length\n                        });\n                    ;\n                    ;\n                        ba.setContent(this._activeNowLabel, id);\n                    }\n                ;\n                ;\n                    ba.setContent(this._activeNowList, xb);\n                    x.nukeLinks(this._activeNowList);\n                }\n                 else {\n                    if (((this._pymk && !ac))) {\n                        xb.push(this._pymk);\n                    }\n                ;\n                ;\n                    ba.setContent(this._orderedList, xb);\n                    if (this._pymk) {\n                        x.removeMessagesHrefs(this.getRoot());\n                    }\n                     else x.nukeLinks(this.getRoot());\n                ;\n                ;\n                }\n            ;\n            ;\n                this.inform(\"render\");\n                this._placeholderUpdate();\n                if (!this._renderingAfterScroll) {\n                    this._renderingAfterScroll = true;\n                    this.render = eb(hb.curry(this._renderOrderedList.bind(this), \"ChatOrderedList/render\", true), 300);\n                }\n            ;\n            ;\n            }\n             else if (jc) {\n                o.hide(this._activeNowList);\n                if (this._activeNowArea) {\n                    o.hide(this._activeNowArea);\n                }\n            ;\n            ;\n            }\n            \n        ;\n        ;\n            if (jc) {\n                ((this._editButton && u.tryShow(this._editButton)));\n            }\n             else u.tryHide();\n        ;\n        ;\n            if (((jc && !bc))) {\n                if (((t.isEditMode() && t.hasChanged()))) {\n                    this._createSortableGroup();\n                }\n            ;\n            }\n        ;\n        ;\n        },\n        render: function() {\n            this.render = eb(this._renderOrderedList.bind(this), 300);\n            this.render();\n        },\n        _renderListItem: function(xb, yb) {\n            ta.get(xb, function(zb) {\n                var ac = this._template.render(), bc = za.getNode(ac, \"profile-photo\");\n                if (r.get(\"chat_use_client_side_image_requests\", 0)) {\n                    var cc = ((this._isLitestand ? 24 : 28));\n                    new fa().setFBID(zb.id).setType(ga.PROFILE_PICTURE).setDimensions(cc, cc).setResizeMode(pa.COVER).setCallback(function(hc) {\n                        bc.setAttribute(\"src\", hc.uri);\n                    }).send();\n                }\n                 else bc.setAttribute(\"src\", zb.thumbSrc);\n            ;\n            ;\n                var dc = za.getNode(ac, \"JSBNG__name\");\n                ba.setContent(dc, zb.JSBNG__name);\n                var ec = za.getNode(ac, \"accessible-name\");\n                ba.setContent(ec, zb.JSBNG__name);\n                var fc = za.getNode(ac, \"anchor\");\n                fc.setAttribute(\"href\", ((\"/messages/\" + xb)));\n                var gc = za.getNode(ac, \"tooltip\");\n                ((gc && va.set(gc, zb.JSBNG__name, \"right\")));\n                ca.set(ac, \"id\", xb);\n                this._itemsMap[xb] = {\n                    node: ac\n                };\n                ((yb && yb(ac)));\n            }.bind(this));\n        },\n        _updateUnreadCount: function(xb, yb) {\n            var zb = this._itemsMap[xb];\n            if (!zb) {\n                return;\n            }\n        ;\n        ;\n            if (this._isSidebar) {\n                this._unreadMessages = ((this._unreadMessages || {\n                }));\n                if (!!yb) {\n                    this._unreadMessages[xb] = true;\n                }\n                 else delete this._unreadMessages[xb];\n            ;\n            ;\n                h.inform(\"buddylist-nub/updateCount\", {\n                    count: Object.keys(this._unreadMessages).length\n                });\n            }\n        ;\n        ;\n            zb.unreadCount = ((zb.unreadCount || ba.JSBNG__find(zb.node, \"._550_\")));\n            yb = ((yb ? yb : 0));\n            ba.setContent(zb.unreadCount, ((((yb > pb)) ? ((pb + \"+\")) : yb)));\n            o.conditionClass(zb.unreadCount, \"_550z\", ((yb > pb)));\n            o.conditionClass(zb.node, \"_550-\", yb);\n        },\n        _getSidebarFlyoutItem: function() {\n            if (this._flyoutItem) {\n                return this._flyoutItem;\n            }\n        ;\n        ;\n            this._flyoutItem = (ia.li({\n                className: \"_57dk\"\n            }, ia.div({\n                className: \"_57dl\"\n            })));\n            ea.listen(this._flyoutItem, \"mouseenter\", function() {\n                var yb = ia.span(null, \"Chat\", \" \\u00b7 \", l.getOnlineCount());\n                if (((this._flyoutInstance && this._flyoutInstance.isShown()))) {\n                    va.remove(this._flyoutItem);\n                }\n                 else va.set(this._flyoutItem, yb, \"right\");\n            ;\n            ;\n            }.bind(this));\n            var xb = this._showLitestandChatFlyout.bind(this);\n            h.subscribe(\"ChatBeeper/clicked\", xb);\n            ea.listen(this._flyoutItem, \"click\", xb);\n            return this._flyoutItem;\n        },\n        _showLitestandChatFlyout: function() {\n            if (this._loadingFlyout) {\n                return;\n            }\n        ;\n        ;\n            if (this._flyoutInstance) {\n                this._flyoutInstance.toggle();\n                return;\n            }\n        ;\n        ;\n            this._loadingFlyout = true;\n            new k(\"/ajax/chat/litestand_flyout\").setData({\n                contextID: ba.getID(this._flyoutItem)\n            }).setAllowCrossPageTransition(true).send();\n            var xb = h.subscribe(\"LitestandChatSidebarFlyout/init\", function(yb, zb) {\n                this._flyoutInstance = zb;\n                this._loadingFlyout = false;\n                xb.unsubscribe();\n                this.subscribe(\"render\", zb.contextPositionInvalidated.bind(zb));\n            }.bind(this));\n        },\n        show: function() {\n            if (this._isVisible) {\n                return;\n            }\n        ;\n        ;\n            this._isVisible = true;\n            o.show(((this._scrollableOrderedList || this._root)));\n            this.render();\n            this.inform(\"show\");\n        },\n        isVisible: function() {\n            return this._isVisible;\n        },\n        update: function() {\n            this._hasRendered = false;\n            if (!this._renderRequest) {\n                this._renderRequest = gb(function() {\n                    this.render();\n                    this._renderRequest = null;\n                }.bind(this));\n            }\n        ;\n        ;\n        },\n        setScrollContainer: function(xb) {\n            if (ba.contains(xb, this._root)) {\n                this._scrollContainer = xb;\n                if (this._usePlaceholder) {\n                    ea.listen(xb, \"JSBNG__scroll\", jb.acrossTransitions(this._placeholderUpdate.bind(this)));\n                    ea.listen(window, \"resize\", jb.acrossTransitions(function() {\n                        this._scrollContainerHeight = null;\n                        this._placeholderUpdate();\n                    }.bind(this), 250));\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n        },\n        JSBNG__scrollTo: function(xb) {\n            if (!this._scrollContainer) {\n                return;\n            }\n        ;\n        ;\n            var yb = this._scrollContainer.scrollHeight, zb = this._scrollContainer.clientHeight, ac = this._scrollContainer.scrollTop, bc = Math.min(xb.offsetTop, ((yb - zb)));\n            if (((ac !== bc))) {\n                var cc = ((this._isLitestand ? 600 : ((((Math.abs(((bc - ac))) / this._scrollContainer.clientHeight)) * 500)))), dc = ((this._isLitestand ? da.easeOutExpo : g.ease.end));\n                new g(this._scrollContainer).to(\"scrollTop\", bc).ease(dc).duration(cc).go();\n            }\n        ;\n        ;\n        },\n        _applyContext: function(xb, yb) {\n            var zb = ((s.getShortDisplay(xb) || \"\"));\n            if (yb.contextNode) {\n                ba.setContent(yb.contextNode, zb);\n                o.conditionClass(yb.node, \"_52zj\", zb);\n                var ac = s.get(xb), bc = ((ac ? ac.type : null));\n                {\n                    var fin218keys = ((window.top.JSBNG_Replay.forInKeys)((qb.CONTEXT_CLASSES))), fin218i = (0);\n                    var cc;\n                    for (; (fin218i < fin218keys.length); (fin218i++)) {\n                        ((cc) = (fin218keys[fin218i]));\n                        {\n                            var dc = ((cc === bc)), ec = ((qb.CONTEXT_CLASSES[cc] || \"_56x-\"));\n                            o.conditionClass(yb.contextNode, ec, dc);\n                        };\n                    };\n                };\n            ;\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = qb;\n});\n__d(\"TypingDetectorController\", [\"AsyncRequest\",\"AvailableList\",\"AvailableListConstants\",\"ChannelConnection\",\"ChatVisibility\",\"Keys\",\"PresencePrivacy\",\"ShortProfiles\",\"TypingDetector\",\"copyProperties\",\"emptyFunction\",\"shield\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = b(\"AvailableList\"), i = b(\"AvailableListConstants\"), j = b(\"ChannelConnection\"), k = b(\"ChatVisibility\"), l = b(\"Keys\"), m = b(\"PresencePrivacy\"), n = b(\"ShortProfiles\"), o = b(\"TypingDetector\"), p = b(\"copyProperties\"), q = b(\"emptyFunction\"), r = b(\"shield\");\n    function s(u) {\n        if (!k.isOnline()) {\n            return false;\n        }\n    ;\n    ;\n        if (u) {\n            var v = n.getNow(u);\n            return ((((v && ((v.type == \"friend\")))) && m.allows(u)));\n        }\n    ;\n    ;\n        return true;\n    };\n;\n    function t(u, v, w, x, y) {\n        this.userID = u;\n        this.input = v;\n        this.source = w;\n        this.threadID = y;\n        this.remoteState = o.INACTIVE;\n        this.notifyTimer = null;\n        x = ((x || {\n        }));\n        this.notifyDelay = ((x.notifyDelay || this.notifyDelay));\n        this._typingDetector = new o(v);\n        this._typingDetector.init(x);\n        this._typingDetector.subscribe(\"change\", this._stateChange.bind(this));\n    };\n;\n    p(t.prototype, {\n        notifyDelay: 1000,\n        setUserAndThread: function(u, v) {\n            if (((((this.userID !== u)) || ((this.threadID !== v))))) {\n                this.resetState();\n                this.userID = u;\n                this.threadID = v;\n            }\n        ;\n        ;\n        },\n        setIgnoreEnter: function(u) {\n            var v = ((u ? [l.RETURN,] : []));\n            this._typingDetector.setIgnoreKeys(v);\n        },\n        resetState: function() {\n            this.remoteState = t.INACTIVE;\n            this._typingDetector.reset();\n            JSBNG__clearTimeout(this.notifyTimer);\n            this.notifyTimer = null;\n        },\n        _stateChange: function(u, v) {\n            if (((v != o.QUITTING))) {\n                JSBNG__clearTimeout(this.notifyTimer);\n                this.notifyTimer = r(this._notifyState, this, v).defer(this.notifyDelay, false);\n            }\n             else this._notifyState(v, true);\n        ;\n        ;\n        },\n        _notifyState: function(u, v) {\n            if (((!this.userID && !this.threadID))) {\n                return;\n            }\n        ;\n        ;\n            var w = this.userID, x = s(w);\n            if (((x && ((u != this.remoteState))))) {\n                this.remoteState = u;\n                if (j.disconnected()) {\n                    return;\n                }\n            ;\n            ;\n                var y = {\n                    typ: u,\n                    to: w,\n                    source: this.source,\n                    thread: this.threadID\n                };\n                new g().setHandler(this._onTypResponse.bind(this, w)).setErrorHandler(q).setData(y).setURI(\"/ajax/messaging/typ.php\").setAllowCrossPageTransition(true).setOption(\"asynchronous\", !v).send();\n            }\n        ;\n        ;\n        },\n        _onTypResponse: function(u, v) {\n            var w = ((v.getPayload() || {\n            }));\n            if (w.offline) {\n                h.set(u, i.OFFLINE, \"typing_response\");\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = t;\n});\n__d(\"ChatBehavior\", [\"Arbiter\",\"AvailableList\",\"AvailableListConstants\",\"ChatConfig\",\"copyProperties\",\"MercuryConstants\",\"ChatSidebarCalloutData\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"AvailableList\"), i = b(\"AvailableListConstants\"), j = b(\"ChatConfig\"), k = b(\"copyProperties\"), l = b(\"MercuryConstants\").ChatNotificationConstants, m = b(\"ChatSidebarCalloutData\").isShown, n = h.getWebChatNotification(), o = m, p = true, q = k(new g(), {\n        ON_CHANGED: \"changed\",\n        notifiesUserMessages: function() {\n            return ((n !== l.NO_USER_MESSAGE_NOTIFICATION));\n        },\n        ignoresRemoteTabRaise: function() {\n            return o;\n        },\n        showsTabUnreadUI: function() {\n            if (j.get(\"web_messenger_suppress_tab_unread\")) {\n                return p;\n            }\n        ;\n        ;\n            return true;\n        }\n    });\n    function r() {\n        q.inform(q.ON_CHANGED);\n    };\n;\n    h.subscribe(i.ON_CHAT_NOTIFICATION_CHANGED, function() {\n        var s = n, t = h.getWebChatNotification();\n        n = t;\n        if (((s != t))) {\n            r();\n        }\n    ;\n    ;\n    });\n    g.subscribe(\"chat/set_does_page_occlude_tabs\", function(s, t) {\n        o = !!t;\n        r();\n    });\n    g.subscribe(\"chat/set_show_tab_unread_ui\", function(s, t) {\n        p = !!t;\n        r();\n    });\n    e.exports = q;\n});\n__d(\"ChatSidebarSheet\", [\"JSXDOM\",\"JSBNG__Event\",\"function-extensions\",\"ArbiterMixin\",\"BlackbirdUpsell\",\"ChannelConnection\",\"ChannelConstants\",\"ChatBehavior\",\"ChatConfig\",\"ChatVisibility\",\"CSS\",\"DOM\",\"JSLogger\",\"PresencePrivacy\",\"Tooltip\",\"csx\",\"cx\",\"copyProperties\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSXDOM\"), h = b(\"JSBNG__Event\");\n    b(\"function-extensions\");\n    var i = b(\"ArbiterMixin\"), j = b(\"BlackbirdUpsell\"), k = b(\"ChannelConnection\"), l = b(\"ChannelConstants\"), m = b(\"ChatBehavior\"), n = b(\"ChatConfig\"), o = b(\"ChatVisibility\"), p = b(\"CSS\"), q = b(\"DOM\"), r = b(\"JSLogger\"), s = b(\"PresencePrivacy\"), t = b(\"Tooltip\"), u = b(\"csx\"), v = b(\"cx\"), w = b(\"copyProperties\"), x = b(\"tx\"), y = r.create(\"sidebar_sheet\");\n    function z(ca) {\n        switch (ca) {\n          case l.HINT_AUTH:\n            return \"Your session has timed out. Please log in.\";\n          case l.HINT_CONN:\n            return x._(\"Facebook {Chat} is currently unavailable.\", {\n                Chat: \"Chat\"\n            });\n          case l.HINT_MAINT:\n            return x._(\"Facebook {Chat} is currently down for maintenance.\", {\n                Chat: \"Chat\"\n            });\n          default:\n            return x._(\"Facebook {Chat} is currently unavailable.\", {\n                Chat: \"Chat\"\n            });\n        };\n    ;\n    };\n;\n    function aa(ca) {\n        var da;\n        if (((ca === null))) {\n            da = \"Unable to connect to chat. Check your Internet connection.\";\n        }\n         else if (((ca > n.get(\"warning_countdown_threshold_msec\")))) {\n            var ea = q.create(\"a\", {\n                href: \"#\",\n                className: \"fbChatReconnectLink\"\n            }, \"Try again\");\n            da = q.tx._(\"Unable to connect to chat. {try-again-link}\", {\n                \"try-again-link\": ea\n            });\n        }\n         else if (((ca > 1000))) {\n            da = x._(\"Unable to connect to chat. Reconnecting in {seconds}...\", {\n                seconds: Math.floor(((ca / 1000)))\n            });\n        }\n         else da = \"Unable to connect to chat. Reconnecting...\";\n        \n        \n    ;\n    ;\n        return da;\n    };\n;\n    function ba(ca) {\n        this._root = ca;\n        this._litestandOffline = q.scry(ca, \"._52d2\");\n        this._message = q.JSBNG__find(ca, \"div.fbChatSidebarMessage div.message\");\n        k.subscribe([k.CONNECTED,k.SHUTDOWN,k.RECONNECTING,], this._handleConnectionChange.bind(this));\n        k.subscribe([k.MUTE_WARNING,k.UNMUTE_WARNING,], this._render.bind(this));\n        s.subscribe(\"privacy-user-presence-changed\", this._render.bind(this));\n        m.subscribe(m.ON_CHANGED, this._render.bind(this));\n        this._render();\n    };\n;\n    w(ba.prototype, i, {\n        _channelStatus: null,\n        _channelData: null,\n        _handleConnectionChange: function(ca, da) {\n            this._channelStatus = ca;\n            this._channelData = da;\n            this._render();\n        },\n        _showWarningTimeout: null,\n        _warningMsgEventListener: null,\n        _renderChannelDisconnect: function() {\n            if (((this._channelStatus === k.SHUTDOWN))) {\n                return q.setContent(this._message, z(this._channelData));\n            }\n             else if (((this._channelStatus === k.RECONNECTING))) {\n                var ca = this._channelData;\n                q.setContent(this._message, aa(ca));\n                if (((ca > 1000))) {\n                    if (((ca > n.get(\"warning_countdown_threshold_msec\")))) {\n                        this._warningMsgEventListener = h.listen(this._message, \"click\", function(JSBNG__event) {\n                            if (p.hasClass(JSBNG__event.getTarget(), \"fbChatReconnectLink\")) {\n                                k.reconnect();\n                                return false;\n                            }\n                        ;\n                        ;\n                        });\n                    }\n                ;\n                ;\n                    this._showWarningTimeout = JSBNG__setTimeout(this._handleConnectionChange.bind(this, k.RECONNECTING, ((ca - 1000))), 1000, false);\n                }\n            ;\n            ;\n            }\n            \n        ;\n        ;\n        },\n        _goOnlineEventListener: null,\n        _renderOffline: function() {\n            if (this._isLitestand) {\n                return;\n            }\n        ;\n        ;\n            if (((this._litestandOffline && this._litestandOffline.length))) {\n                this._renderLitestandOffline();\n            }\n        ;\n        ;\n            var ca = \"fbChatGoOnlineLink\", da = \"Turn on chat\", ea = q.create(\"a\", {\n                href: \"#\",\n                className: ca\n            }, da), fa = q.tx._(\"{=Go online} to see who's available.\", {\n                \"=Go online\": ea\n            });\n            q.setContent(this._message, fa);\n            this._goOnlineEventListener = h.listen(this._message, \"click\", function(JSBNG__event) {\n                if (p.hasClass(JSBNG__event.getTarget(), ca)) {\n                    y.log(\"sidebar_go_online\");\n                    o.goOnline();\n                    return false;\n                }\n            ;\n            ;\n            });\n        },\n        _renderLitestandOffline: function() {\n            this._litestandOffline = this._litestandOffline[0];\n            this._isLitestand = true;\n            var ca = g.div({\n                className: \"_4_vf\"\n            }), da = g.a({\n                className: \"_52cx _52i7\",\n                href: \"#\"\n            }, g.i({\n                className: \"_52c_\"\n            }), g.div({\n                className: \"_52cz\"\n            }, g.div({\n                className: \"_52c-\"\n            }, g.i({\n                className: \"_52d1\"\n            }), g.div({\n                className: \"_52cy\"\n            }, q.tx._(\"Turn on Chat\")))), g.i({\n                className: \"_52d0\"\n            }), ca);\n            t.set(ca, q.tx._(\"Turn on Chat\"), \"right\", \"center\");\n            q.replace(this._litestandOffline, da);\n            this._litestandOffline = null;\n            h.listen(da, \"click\", function(JSBNG__event) {\n                y.log(\"sidebar_go_online\");\n                o.goOnline();\n                JSBNG__event.prevent();\n            });\n        },\n        _renderBlackbirdUpsell: function() {\n            q.setContent(this._message, j.getOfflineContent());\n        },\n        _renderBlackbird: function(ca) {\n            q.setContent(this._message, j.getBlackbirdContent(ca));\n        },\n        _clear: function() {\n            if (this._showWarningTimeout) {\n                JSBNG__clearTimeout(this._showWarningTimeout);\n                this._showWarningTimeout = null;\n            }\n        ;\n        ;\n            if (this._warningMsgEventListener) {\n                this._warningMsgEventListener.remove();\n                this._warningMsgEventListener = null;\n            }\n        ;\n        ;\n            if (this._goOnlineEventListener) {\n                this._goOnlineEventListener.remove();\n                this._goOnlineEventListener = null;\n            }\n        ;\n        ;\n            p.removeClass(this._root, \"upsell\");\n            p.removeClass(this._root, \"offline\");\n            p.removeClass(this._root, \"blackbird\");\n            p.removeClass(this._root, \"error\");\n            p.removeClass(this._root, \"notice\");\n            q.empty(this._message);\n        },\n        _render: function() {\n            this._clear();\n            if (j.shouldShow()) {\n                if (o.hasBlackbirdEnabled()) {\n                    var ca = ((o.isOnline() ? \"blackbird\" : \"upsell\"));\n                    p.addClass(this._root, ca);\n                    this._renderBlackbird(s.getVisibility());\n                }\n                 else if (!o.isOnline()) {\n                    p.addClass(this._root, \"upsell\");\n                    this._renderBlackbirdUpsell();\n                }\n                \n            ;\n            ;\n            }\n             else if (!o.isOnline()) {\n                p.addClass(this._root, \"offline\");\n                this._renderOffline();\n            }\n             else if (k.disconnected()) {\n                p.addClass(this._root, \"error\");\n                this._renderChannelDisconnect();\n            }\n             else if (!m.notifiesUserMessages()) {\n                p.addClass(this._root, \"notice\");\n                q.setContent(this._message, \"Alerts are off while you use another client to chat.\");\n            }\n            \n            \n            \n        ;\n        ;\n            this.inform(\"updated\");\n        }\n    });\n    e.exports = ba;\n});\n__d(\"FBDesktopPlugin\", [\"CacheStorage\",\"DOM\",\"Env\",\"FBDesktopDetect\",\"URI\",\"Style\",], function(a, b, c, d, e, f) {\n    var g = b(\"CacheStorage\"), h = b(\"DOM\"), i = b(\"Env\"), j = b(\"FBDesktopDetect\"), k = b(\"URI\"), l = b(\"Style\"), m = new g(\"localstorage\", \"_socialfox_\"), n = {\n        _plugin: \"_not_checked\",\n        arbiterInform: function(o, p) {\n            var q = JSON.stringify({\n                JSBNG__name: o,\n                payload: p\n            });\n            this._transmitCommand(\"arbiterinform\", q);\n        },\n        bringToFront: function() {\n            this._transmitCommand(\"bringtofront\");\n        },\n        dock: function() {\n            this._transmitCommand(\"dock\");\n        },\n        getPlugin: function() {\n            if (((this._plugin === \"_not_checked\"))) {\n                this._plugin = null;\n                if (j.isPluginInstalled()) {\n                    var o = h.create(\"object\", {\n                        id: \"kiwi_plugin\",\n                        type: j.mimeType\n                    });\n                    l.set(o, \"width\", 0);\n                    l.set(o, \"height\", 0);\n                    var p = h.create(\"div\", {\n                    }, o);\n                    l.set(p, \"width\", 0);\n                    l.set(p, \"height\", 0);\n                    JSBNG__document.body.appendChild(p);\n                    this._plugin = o;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            return this._plugin;\n        },\n        getUserID: function() {\n            var o = this.getPlugin();\n            return ((((o && ((\"getUserID\" in o)))) && o.getUserID()));\n        },\n        getVersion: function() {\n            var o = this.getPlugin();\n            return ((((o && ((\"getVersion\" in o)))) && o.getVersion()));\n        },\n        isAppRunning: function() {\n            var o = this.getPlugin();\n            return ((((o && ((\"isAppRunning\" in o)))) && o.isAppRunning()));\n        },\n        launchApp: function() {\n            var o = this.getPlugin();\n            return ((((o && ((\"launchApp\" in o)))) && o.launchApp()));\n        },\n        login: function(o, p) {\n            if (((((p && o)) && ((o.length > 0))))) {\n                var q = this.getPlugin();\n                if (q) {\n                    this._transmitCommand(((((((\"relogin\\u000a\" + o)) + \"\\u000a\")) + p)));\n                    return;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n        },\n        logout: function(o) {\n            o = ((o || \"0\"));\n            var p = this.getPlugin();\n            if (p) {\n                p.logout(o);\n            }\n        ;\n        ;\n        },\n        recheck: function() {\n            if (((this._plugin === null))) {\n                this._plugin = \"_not_checked\";\n            }\n        ;\n        ;\n        },\n        shouldSuppressBeeper: function() {\n            return this.isAppRunning();\n        },\n        shouldSuppressMessages: function() {\n            if (((m && m.get(\"connected\")))) {\n                return true;\n            }\n        ;\n        ;\n            var o = this.getUserID();\n            if (o) {\n                return ((o === i.user));\n            }\n             else return this.isAppRunning()\n        ;\n        },\n        shouldSuppressSidebar: function() {\n            var o = this.getPlugin(), p = ((((o && ((\"isAppDocked\" in o)))) && o.isAppDocked())), q = ((m && ((m.get(\"active\") === \"true\"))));\n            return ((p || q));\n        },\n        transferAuthToken: function(o, p) {\n            if (((o && ((o.length > 0))))) {\n                var q = this.getPlugin();\n                if (q) {\n                    q.setAccessToken(o, p);\n                    var r = JSBNG__setInterval(function() {\n                        q.setAccessToken(o, p);\n                    }, 500);\n                    JSBNG__setTimeout(function() {\n                        JSBNG__clearInterval(r);\n                    }, ((10 * 1000)));\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            if (this.redirectHome) {\n                window.JSBNG__location.href = k().setPath().toString();\n            }\n        ;\n        ;\n        },\n        _transmitCommand: function(o, p) {\n            p = ((p || \"\"));\n            var q = this.getPlugin();\n            if (((q && ((\"transmitCommand\" in q))))) {\n                q.transmitCommand(o, p);\n            }\n        ;\n        ;\n        }\n    };\n    e.exports = n;\n});\n__d(\"ChatSidebar\", [\"ChatOrderedList\",\"ChatTypeaheadBehavior\",\"ChatTypeaheadCore\",\"ChatTypeaheadDataSource\",\"ChatTypeaheadRenderer\",\"ChatTypeaheadView\",\"Typeahead\",\"Arbiter\",\"ArbiterMixin\",\"AsyncRequest\",\"AvailableList\",\"AvailableListConstants\",\"Bootloader\",\"ChannelConnection\",\"Chat\",\"ChatConfig\",\"ChatHovercard\",\"ChatImpressionLogger\",\"ChatOptions\",\"ChatSidebarSheet\",\"ChatVisibility\",\"CSS\",\"DOM\",\"DOMDimensions\",\"JSBNG__Event\",\"FBDesktopPlugin\",\"JSLogger\",\"JSXDOM\",\"KeyEventController\",\"OrderedFriendsList\",\"Parent\",\"PresencePrivacy\",\"ScrollableArea\",\"Style\",\"UserAgent\",\"ViewportBounds\",\"copyProperties\",\"createArrayFrom\",\"csx\",\"cx\",\"debounce\",\"emptyFunction\",\"fbt\",\"ge\",\"tx\",], function(a, b, c, d, e, f) {\n    b(\"ChatOrderedList\");\n    b(\"ChatTypeaheadBehavior\");\n    b(\"ChatTypeaheadCore\");\n    b(\"ChatTypeaheadDataSource\");\n    b(\"ChatTypeaheadRenderer\");\n    b(\"ChatTypeaheadView\");\n    b(\"Typeahead\");\n    var g = b(\"Arbiter\"), h = b(\"ArbiterMixin\"), i = b(\"AsyncRequest\"), j = b(\"AvailableList\"), k = b(\"AvailableListConstants\"), l = b(\"Bootloader\"), m = b(\"ChannelConnection\"), n = b(\"Chat\"), o = b(\"ChatConfig\"), p = b(\"ChatHovercard\"), q = b(\"ChatImpressionLogger\"), r = b(\"ChatOptions\"), s = b(\"ChatSidebarSheet\"), t = b(\"ChatVisibility\"), u = b(\"CSS\"), v = b(\"DOM\"), w = b(\"DOMDimensions\"), x = b(\"JSBNG__Event\"), y = b(\"FBDesktopPlugin\"), z = b(\"JSLogger\"), aa = b(\"JSXDOM\"), ba = b(\"KeyEventController\"), ca = b(\"OrderedFriendsList\"), da = b(\"Parent\"), ea = b(\"PresencePrivacy\"), fa = b(\"ScrollableArea\"), ga = b(\"Style\"), ha = b(\"UserAgent\"), ia = b(\"ViewportBounds\"), ja = b(\"copyProperties\"), ka = b(\"createArrayFrom\"), la = b(\"csx\"), ma = b(\"cx\"), na = b(\"debounce\"), oa = b(\"emptyFunction\"), pa = b(\"fbt\"), qa = b(\"ge\"), ra = b(\"tx\"), sa, ta = false, ua = false, va = false, wa = false, xa = false, ya = false, za, ab, bb, cb, db, eb = null, fb, gb, hb, ib, jb, kb, lb = 28, mb = 38, nb = z.create(\"chat_sidebar\");\n    function ob() {\n        if (gb) {\n            return;\n        }\n    ;\n    ;\n        u.removeClass(JSBNG__document.documentElement, \"sidebarMode\");\n        if (((!wa || !yb.isVisible()))) {\n            g.inform(\"reflow\");\n            return;\n        }\n    ;\n    ;\n        va = false;\n        eb = null;\n        za.hide();\n        cb.getCore().reset();\n        u.hide(ab);\n        nb.rate(\"sidebar_hide\", wa);\n        yb.inform(\"sidebar/hide\", yb);\n        g.inform(\"sidebar/hide\", yb);\n        g.inform(\"reflow\");\n    };\n;\n    function pb() {\n        var zb = yb.shouldShowSidebar();\n        u.conditionClass(JSBNG__document.documentElement, \"sidebarCapable\", zb);\n        if (((yb.isEnabled() && zb))) {\n            sb();\n            var ac;\n            if (fb) {\n                var bc = u.hasClass(ab, \"_4w59\");\n                if (bc) {\n                    return;\n                }\n            ;\n            ;\n                kb = ((kb || v.JSBNG__find(ab, \"._50g0\")));\n                if (fb.has_favorites_editing) {\n                    jb = ((jb || v.scry(ab, \"._52s9\")[0]));\n                }\n            ;\n            ;\n                ac = [kb,];\n            }\n             else ac = ka(ab.childNodes);\n        ;\n        ;\n            var cc = rb(ac), dc = ((za.getItemHeight() || 32)), ec = ((za.getPaddingOffset() || 8)), fc;\n            if (gb) {\n                if (gb.isExpanded()) {\n                    ec = ((ec + lb));\n                    if (((fb && fb.always_show_one_see_more))) {\n                        ec += dc;\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n                if (!n.isOnline()) {\n                    ec += mb;\n                }\n            ;\n            ;\n                var gc = Math.floor(((za.getItemPadding() / 2)));\n                fc = Math.floor(((((((cc - ec)) + gc)) / dc)));\n                if (!za.isVisible()) {\n                    ga.set(sa, \"height\", ((cc + \"px\")));\n                }\n            ;\n            ;\n            }\n             else {\n                fc = Math.floor(((((cc - ec)) / ((dc + 1)))));\n                ga.set(sa, \"height\", ((cc + \"px\")));\n            }\n        ;\n        ;\n            za.setNumTopFriends(fc);\n            var hc = Math.floor(((((cc - ec)) / dc)));\n            if (ub()) {\n                hc = ((((((hc - 2)) > 0)) ? ((hc - 2)) : 0));\n            }\n        ;\n        ;\n            cb.getData().setMaxResults(hc);\n            yb.inform(\"sidebar/resized\", yb);\n            g.inform(\"sidebar/resized\", yb);\n            g.inform(\"reflow\");\n        }\n         else ob();\n    ;\n    ;\n        if (!wa) {\n            wb();\n            wa = true;\n        }\n    ;\n    ;\n        eb = null;\n    };\n;\n    function qb() {\n        if (((cb && yb.isVisible()))) {\n            cb.getCore().getElement().JSBNG__focus();\n        }\n    ;\n    ;\n    };\n;\n    function rb(zb) {\n        if (!zb) {\n            if (fb) {\n                kb = ((kb || v.JSBNG__find(ab, \"._50g0\")));\n                zb = [kb,];\n            }\n             else zb = ka(ab.childNodes);\n        ;\n        }\n    ;\n    ;\n        var ac = db.height;\n        if (((gb && hb))) {\n            ac -= hb.getFullHeight();\n        }\n    ;\n    ;\n        zb.forEach(function(bc) {\n            if (((bc && ((bc !== sa))))) {\n                ac -= w.getElementDimensions(bc).height;\n            }\n        ;\n        ;\n        });\n        return Math.max(0, ac);\n    };\n;\n    function sb() {\n        if (yb.isVisible()) {\n            return;\n        }\n    ;\n    ;\n        va = true;\n        eb = null;\n        u.show(ab);\n        u.addClass(JSBNG__document.documentElement, \"sidebarMode\");\n        za.show();\n        nb.rate(\"sidebar_show\", wa);\n        yb.inform(\"sidebar/show\", yb);\n        g.inform(\"sidebar/show\", yb);\n        ((ib && xb()));\n    };\n;\n    function tb() {\n        r.setSetting(\"sidebar_mode\", yb.isEnabled(), \"JSBNG__sidebar\");\n        new i(\"/ajax/chat/settings.php\").setHandler(oa).setErrorHandler(oa).setData({\n            sidebar_mode: yb.isEnabled()\n        }).setAllowCrossPageTransition(true).send();\n    };\n;\n    function ub() {\n        return o.get(\"divebar_typeahead_group_fof\", 0);\n    };\n;\n    function vb() {\n        return ((ca.getList().length <= o.get(\"JSBNG__sidebar.min_friends\")));\n    };\n;\n    function wb() {\n        var zb = true;\n        if (!yb.isEnabled()) {\n            nb.log(\"state_not_enabled\");\n            zb = false;\n        }\n    ;\n    ;\n        if (!yb.isViewportCapable()) {\n            nb.log(\"state_not_shown_viewport\");\n            zb = false;\n        }\n    ;\n    ;\n        if (ua) {\n            nb.log(\"state_not_shown_hidden\");\n            zb = false;\n        }\n    ;\n    ;\n        if (vb()) {\n            nb.log(\"state_not_shown_num_friends\");\n            zb = false;\n        }\n    ;\n    ;\n        if (y.shouldSuppressSidebar()) {\n            nb.log(\"state_not_shown_fbdesktop\");\n            zb = false;\n        }\n    ;\n    ;\n        nb.log(((zb ? \"state_shown\" : \"state_not_shown\")));\n    };\n;\n    function xb() {\n        if (!yb.isVisible()) {\n            return;\n        }\n    ;\n    ;\n        var zb;\n        if (!t.isOnline()) {\n            zb = \"Offline\";\n        }\n         else if (m.disconnected()) {\n            zb = \"Connection Lost\";\n        }\n         else zb = ra._(\"{Chat} {number-available}\", {\n            Chat: \"Chat\",\n            \"number-available\": ((((\"(\" + j.getOnlineCount())) + \")\"))\n        });\n        \n    ;\n    ;\n        v.setContent(ib, zb);\n    };\n;\n    var yb = {\n        init: function(zb, ac, bc, cc) {\n            yb.init = oa;\n            xa = true;\n            ab = zb;\n            za = ac;\n            cb = bc;\n            bb = cc;\n            sa = v.JSBNG__find(zb, \"div.fbChatSidebarBody\");\n            gb = ((cc && cc.ls_module));\n            fb = ((cc && cc.ls_config));\n            if (gb) {\n                g.subscribe(\"ViewportSizeChange\", function() {\n                    g.inform(\"ChatOrderedList/itemHeightChange\");\n                    pb();\n                });\n                g.subscribe(\"Sidebar/BookmarksHeightChange\", pb);\n                l.loadModules([\"LitestandSidebarBookmarksDisplay\",], function(ec) {\n                    hb = ec;\n                });\n            }\n             else x.listen(window, \"resize\", pb);\n        ;\n        ;\n            ba.registerKey(\"q\", function() {\n                var ec = null;\n                if (kb) {\n                    ec = v.scry(kb, \".inputsearch\")[0];\n                }\n                 else ec = v.scry(zb, \".inputsearch\")[0];\n            ;\n            ;\n                if (ec) {\n                    ec.JSBNG__focus();\n                    return false;\n                }\n            ;\n            ;\n            });\n            new p(ac);\n            var dc = new s(zb);\n            dc.subscribe(\"updated\", pb);\n            g.subscribe(\"sidebar/invalidate\", pb);\n            ac.setScrollContainer(da.byClass(ac.getRoot(), \"uiScrollableAreaWrap\"));\n            ac.subscribe([\"render\",\"show\",\"hide\",], na(function(ec) {\n                if (((((ec === \"render\")) && !ya))) {\n                    ya = true;\n                    yb.inform(\"sidebar/chatRendered\", null, g.BEHAVIOR_PERSISTENT);\n                }\n            ;\n            ;\n                var fc = ac.getRoot(), gc = fa.getInstance(fc);\n                ((gc && gc.adjustGripper()));\n            }));\n            ac.subscribe([\"editStart\",\"editEnd\",], function(ec) {\n                u.conditionClass(cb.getView().element, \"_4-d6\", ((ec == \"editStart\")));\n            });\n            if (((ha.firefox() >= 17))) {\n                x.listen(window, \"storage\", function(ec) {\n                    if (((((ec.key == \"_socialfox_active\")) && ((ec.oldValue != ec.newValue))))) {\n                        pb();\n                    }\n                ;\n                ;\n                });\n            }\n        ;\n        ;\n            g.subscribe(\"chat/option-changed\", function(ec, fc) {\n                if (((fc.JSBNG__name == \"sidebar_mode\"))) {\n                    ta = !!r.getSetting(\"sidebar_mode\");\n                    pb();\n                }\n            ;\n            ;\n            });\n            bc.getCore().subscribe(\"sidebar/typeahead/active\", yb.updateOnActiveTypeahead);\n            bc.subscribe(\"reset\", function() {\n                if (((!bc.getCore().getValue() && !za.isVisible()))) {\n                    yb.updateOnActiveTypeahead(null, false);\n                }\n            ;\n            ;\n            });\n            if (gb) {\n                bc.getCore().subscribe(\"sidebar/typeahead/preActive\", function(ec, fc) {\n                    if (((ta && cb.getView().isVisible()))) {\n                        g.inform(ec, fc);\n                    }\n                     else pb();\n                ;\n                ;\n                });\n            }\n             else g.subscribe(\"buddylist-nub/initialized\", function(ec, fc) {\n                x.listen(fc.getButton(), \"click\", function(JSBNG__event) {\n                    yb.enable();\n                    return !yb.shouldShowSidebar();\n                });\n            });\n        ;\n        ;\n            ta = !!r.getSetting(\"sidebar_mode\");\n            ((ha.ie() && x.listen(zb, \"click\", function(ec) {\n                if (da.byClass(ec.getTarget(), \"_57du\")) {\n                    qb();\n                }\n            ;\n            ;\n            })));\n            ea.subscribe(\"privacy-user-presence-changed\", pb);\n            pb();\n            q.init(za);\n            if (!gb) {\n                ia.addRight(yb.getVisibleWidth);\n            }\n        ;\n        ;\n            yb.inform(\"sidebar/initialized\", yb, g.BEHAVIOR_PERSISTENT);\n            g.inform(\"sidebar/initialized\", yb, g.BEHAVIOR_PERSISTENT);\n            if (o.get(\"litestand_blended_sidebar\")) {\n                ib = v.JSBNG__find(zb, \"._5bct\");\n                j.subscribe(k.ON_AVAILABILITY_CHANGED, na(xb, 2000));\n                m.subscribe([m.CONNECTED,m.RECONNECTING,m.SHUTDOWN,], xb);\n                ea.subscribe(\"privacy-changed\", xb);\n                xb();\n            }\n        ;\n        ;\n        },\n        updateOnActiveTypeahead: function(zb, ac) {\n            if (!va) {\n                return;\n            }\n        ;\n        ;\n            if (ac) {\n                za.hide();\n                if (gb) {\n                    u.addClass(ab, \"_5384\");\n                    var bc = rb();\n                    if (jb) {\n                        bc += w.getElementDimensions(jb).height;\n                    }\n                ;\n                ;\n                    ga.set(sa, \"height\", ((bc + \"px\")));\n                }\n            ;\n            ;\n            }\n             else {\n                za.show();\n                if (gb) {\n                    ga.set(sa, \"height\", \"auto\");\n                    u.removeClass(ab, \"_5384\");\n                    g.inform(\"sidebar/typeahead/active\", false);\n                    pb();\n                }\n                 else pb();\n            ;\n            ;\n            }\n        ;\n        ;\n        },\n        isInitialized: function() {\n            return wa;\n        },\n        disable: function() {\n            if (!yb.isEnabled()) {\n                return;\n            }\n        ;\n        ;\n            ta = false;\n            tb();\n            ob();\n        },\n        enable: function() {\n            if (yb.isEnabled()) {\n                return;\n            }\n        ;\n        ;\n            ta = true;\n            tb();\n            pb();\n            qb.defer();\n        },\n        forceEnsureLoaded: function() {\n            if (xa) {\n                return;\n            }\n        ;\n        ;\n            if (qa(\"pagelet_sidebar\")) {\n                return;\n            }\n        ;\n        ;\n            d([\"UIPagelet\",], function(zb) {\n                var ac = aa.div({\n                    id: \"pagelet_sidebar\"\n                });\n                v.appendContent(JSBNG__document.body, ac);\n                zb.loadFromEndpoint(\"SidebarPagelet\", \"pagelet_sidebar\");\n            });\n            xa = true;\n        },\n        ensureLoaded: function() {\n            if (!ta) {\n                return;\n            }\n        ;\n        ;\n            yb.forceEnsureLoaded();\n        },\n        hide: function() {\n            if (ua) {\n                return;\n            }\n        ;\n        ;\n            ua = true;\n            ob();\n        },\n        unhide: function() {\n            if (!ua) {\n                return;\n            }\n        ;\n        ;\n            ua = false;\n            pb();\n        },\n        getBody: function() {\n            return sa;\n        },\n        getRoot: function() {\n            return ab;\n        },\n        getVisibleWidth: function() {\n            if (((!va || !ab))) {\n                return 0;\n            }\n        ;\n        ;\n            if (((eb === null))) {\n                eb = ab.offsetWidth;\n            }\n        ;\n        ;\n            return eb;\n        },\n        isEnabled: function() {\n            return ta;\n        },\n        isViewportCapable: function() {\n            db = w.getViewportWithoutScrollbarDimensions();\n            if (gb) {\n                return true;\n            }\n        ;\n        ;\n            var zb = o.get(\"JSBNG__sidebar.minimum_width\");\n            return ((db.width > zb));\n        },\n        shouldShowSidebar: function() {\n            var zb = yb.isViewportCapable();\n            return ((gb || ((((((zb && !ua)) && ((!vb() || o.get(\"litestand_blended_sidebar\", false))))) && !y.shouldSuppressSidebar()))));\n        },\n        isVisible: function() {\n            return va;\n        },\n        resize: pb,\n        toggle: function() {\n            if (gb) {\n                gb.toggle();\n            }\n             else ((yb.isEnabled() ? yb.disable() : yb.enable()));\n        ;\n        ;\n        },\n        isLitestandSidebar: function() {\n            return !!gb;\n        }\n    };\n    ja(yb, h);\n    e.exports = yb;\n});\n__d(\"VideoCallingTour\", [\"Arbiter\",\"ArbiterMixin\",\"Chat\",\"ChatSidebar\",\"ChatVisibility\",\"CSS\",\"DOM\",\"PresencePrivacy\",\"Run\",\"Toggler\",\"Vector\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ArbiterMixin\"), i = b(\"Chat\"), j = b(\"ChatSidebar\"), k = b(\"ChatVisibility\"), l = b(\"CSS\"), m = b(\"DOM\"), n = b(\"PresencePrivacy\"), o = b(\"Run\"), p = b(\"Toggler\"), q = b(\"Vector\"), r = b(\"copyProperties\"), s, t, u, v, w = [], x = function() {\n    \n    };\n    function y() {\n        if (j.isVisible()) {\n            z();\n        }\n         else if (u) {\n            aa();\n        }\n        \n    ;\n    ;\n    };\n;\n    function z() {\n        s.setContext(t.getBody());\n        ba();\n        s.show();\n        ca();\n    };\n;\n    function aa() {\n        if (!v) {\n            v = p.createInstance(u.getRoot());\n        }\n    ;\n    ;\n        var fa = m.scry(u.getRoot(), \"div.fbNubFlyout\")[0];\n        if (fa) {\n            s.setContext(fa);\n            ba();\n            s.show();\n            ca();\n        }\n    ;\n    ;\n    };\n;\n    function ba() {\n        var fa = q.getElementDimensions(s.getContext()).y;\n        s.setOffsetY(((fa * 61688)));\n        s.updatePosition();\n    };\n;\n    function ca() {\n        if (u) {\n            w.push(u.subscribe(\"hide\", function() {\n                da();\n                if (!j.isVisible()) {\n                    s.hide();\n                }\n            ;\n            ;\n            }), u.subscribe(\"show\", function() {\n                s.show();\n            }), u.subscribe(\"resize\", function() {\n                ba();\n                s.updatePosition();\n            }));\n        }\n    ;\n    ;\n        w.push(g.subscribe(\"sidebar/show\", z), g.subscribe(\"sidebar/hide\", aa), g.subscribe(\"sidebar/resized\", ba));\n    };\n;\n    function da() {\n        if (v) {\n            v.setSticky(false);\n            v = null;\n        }\n    ;\n    ;\n    };\n;\n    function ea() {\n        while (w.length) {\n            w.pop().unsubscribe();\n        ;\n        };\n    ;\n        if (u) {\n            da();\n        }\n    ;\n    ;\n        s.hide();\n        l.show(\"fbVideoCallingGetStarted\");\n    };\n;\n    r(x, h, {\n        start: function(fa) {\n            s = fa;\n            l.hide(\"fbVideoCallingGetStarted\");\n            k.goOnline(function() {\n                w.push(n.subscribe(\"privacy-user-presence-changed\", ea));\n                o.onLeave(ea);\n                i.openBuddyList();\n                var ga = null;\n                w.push(j.subscribe(\"sidebar/initialized\", function(ha, ia) {\n                    t = ia;\n                    JSBNG__clearTimeout(ga);\n                    ga = y.defer();\n                }), x.subscribe(\"videocallingtour/end\", ea));\n                w.push(g.subscribe(\"buddylist-nub/initialized\", function(ha, ia) {\n                    u = ia;\n                    JSBNG__clearTimeout(ga);\n                    ga = y.defer();\n                }));\n            });\n            x.inform(\"videocallingtour/start\");\n        }\n    });\n    e.exports = x;\n});\n__d(\"ModuleDependencies\", [], function(a, b, c, d, e, f) {\n    function g(k, l, m) {\n        var n = a.require.__debug.modules[m], o = a.require.__debug.deps;\n        if (l[m]) {\n            return;\n        }\n    ;\n    ;\n        l[m] = true;\n        if (!n) {\n            ((o[m] && (k[m] = true)));\n            return;\n        }\n    ;\n    ;\n        if (((!n.dependencies || !n.dependencies.length))) {\n            if (n.waiting) {\n                k[m] = true;\n            }\n        ;\n        ;\n            return;\n        }\n    ;\n    ;\n        n.dependencies.forEach(function(p) {\n            g(k, l, p);\n        });\n    };\n;\n    function h(k) {\n        if (a.require.__debug) {\n            var l = {\n            };\n            g(l, {\n            }, k);\n            var m = Object.keys(l);\n            m.sort();\n            return m;\n        }\n    ;\n    ;\n        return null;\n    };\n;\n    function i() {\n        var k = {\n            loading: {\n            },\n            missing: []\n        };\n        if (!a.require.__debug) {\n            return k;\n        }\n    ;\n    ;\n        var l = {\n        }, m = a.require.__debug.modules, n = a.require.__debug.deps;\n        {\n            var fin219keys = ((window.top.JSBNG_Replay.forInKeys)((m))), fin219i = (0);\n            var o;\n            for (; (fin219i < fin219keys.length); (fin219i++)) {\n                ((o) = (fin219keys[fin219i]));\n                {\n                    var p = m[o];\n                    if (p.waiting) {\n                        var q = {\n                        };\n                        g(q, {\n                        }, p.id);\n                        delete q[p.id];\n                        k.loading[p.id] = Object.keys(q);\n                        k.loading[p.id].sort();\n                        k.loading[p.id].forEach(function(r) {\n                            if (((!((r in m)) && n[r]))) {\n                                l[r] = 1;\n                            }\n                        ;\n                        ;\n                        });\n                    }\n                ;\n                ;\n                };\n            };\n        };\n    ;\n        k.missing = Object.keys(l);\n        k.missing.sort();\n        return k;\n    };\n;\n    var j = {\n        getMissing: h,\n        getNotLoadedModules: i\n    };\n    e.exports = j;\n});\n__d(\"ChatPeopleSuggestionList.react\", [\"ChatSidebarItem.react\",\"fbt\",\"React\",\"ShortProfiles\",\"PresenceStatus\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"ChatSidebarItem.react\"), h = b(\"fbt\"), i = b(\"React\"), j = b(\"ShortProfiles\"), k = b(\"PresenceStatus\"), l = b(\"cx\"), m = i.createClass({\n        displayName: \"ChatPeopleSuggestionList\",\n        _renderPeopleList: function() {\n            var n = [];\n            this.props.uids.map(function(o) {\n                var p = j.getNow(o);\n                if (p) {\n                    n.push(i.DOM.li(null, g({\n                        isAdded: false,\n                        showEditButton: true,\n                        images: p.thumbSrc,\n                        JSBNG__name: p.JSBNG__name,\n                        JSBNG__status: k.get(o),\n                        onClick: this.props.onClick.curry(o)\n                    })));\n                }\n            ;\n            ;\n            }.bind(this));\n            return n;\n        },\n        render: function() {\n            return (i.DOM.div(null, i.DOM.div({\n                className: \"_57zm\"\n            }, i.DOM.span({\n                className: \"_57zn\"\n            }, \"SUGGESTIONS\")), i.DOM.ul({\n                className: \"_56ym\"\n            }, this._renderPeopleList())));\n        }\n    });\n    e.exports = m;\n});\n__d(\"Dock\", [\"function-extensions\",\"JSBNG__Event\",\"shield\",\"WebMessengerWidthControl\",\"Arbiter\",\"ArbiterMixin\",\"ChatQuietLinks\",\"CSS\",\"DataStore\",\"DOM\",\"Parent\",\"Style\",\"Toggler\",\"Vector\",\"copyProperties\",\"csx\",\"emptyFunction\",\"ge\",], function(a, b, c, d, e, f) {\n    b(\"function-extensions\");\n    var g = b(\"JSBNG__Event\"), h = b(\"shield\");\n    b(\"WebMessengerWidthControl\");\n    var i = b(\"Arbiter\"), j = b(\"ArbiterMixin\"), k = b(\"ChatQuietLinks\"), l = b(\"CSS\"), m = b(\"DataStore\"), n = b(\"DOM\"), o = b(\"Parent\"), p = b(\"Style\"), q = b(\"Toggler\"), r = b(\"Vector\"), s = b(\"copyProperties\"), t = b(\"csx\"), u = b(\"emptyFunction\"), v = b(\"ge\");\n    function w() {\n    \n    };\n;\n    s(w, j, {\n        MIN_HEIGHT: 140,\n        INITIAL_FLYOUT_HEIGHT_OFFSET: 10,\n        init: function(x) {\n            this.init = u;\n            this.rootEl = x;\n            this.calculateViewportDimensions();\n            this.calculateFlyoutHeightOffset();\n            k.removeEmptyHrefs(this.rootEl);\n            g.listen(x, \"click\", this._onClick.bind(this));\n            g.listen(window, \"resize\", this._onWindowResize.bind(this));\n            q.subscribe([\"show\",\"hide\",], function(y, z) {\n                var aa = z.getActive();\n                if (!n.contains(x, aa)) {\n                    return;\n                }\n            ;\n            ;\n                if (l.hasClass(aa, \"fbNub\")) {\n                    this.notifyNub(aa, y);\n                    if (((y === \"show\"))) {\n                        this._resizeNubFlyout(aa);\n                    }\n                ;\n                ;\n                }\n                 else {\n                    var ba = o.byClass(aa, \"fbNubFlyout\");\n                    if (ba) {\n                        l.conditionClass(ba, \"menuOpened\", ((y === \"show\")));\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n            }.bind(this));\n            this.inform(\"init\", {\n            }, i.BEHAVIOR_PERSISTENT);\n        },\n        calculateViewportDimensions: function() {\n            return (this.viewportDimensions = r.getViewportDimensions());\n        },\n        calculateFlyoutHeightOffset: function() {\n            this.flyoutHeightOffset = ((this.INITIAL_FLYOUT_HEIGHT_OFFSET + r.getElementDimensions(this.rootEl).y));\n            var x = v(\"blueBar\");\n            if (x) {\n                var y = ((p.isFixed(x) ? \"viewport\" : \"JSBNG__document\"));\n                this.flyoutHeightOffset += ((r.getElementPosition(x, y).y + r.getElementDimensions(x).y));\n            }\n        ;\n        ;\n        },\n        toggle: function(x) {\n            var y = this._findFlyout(x);\n            if (!y) {\n                return;\n            }\n        ;\n        ;\n            this.subscribe(\"init\", function() {\n                q.toggle(x);\n            });\n        },\n        show: function(x) {\n            this.subscribe(\"init\", function() {\n                q.show(x);\n            });\n        },\n        showNub: function(x) {\n            l.show(x);\n        },\n        hide: function(x) {\n            this.subscribe(\"init\", function() {\n                var y = q.getInstance(x);\n                ((n.contains(x, y.getActive()) && y.hide()));\n            });\n        },\n        hideNub: function(x) {\n            l.hide(x);\n            this.hide(x);\n        },\n        setUseMaxHeight: function(x, y) {\n            l.conditionClass(x, \"maxHeight\", ((y !== false)));\n            this._resizeNubFlyout(x);\n        },\n        _resizeNubFlyout: function(x) {\n            var y = this._findFlyout(x);\n            if (((!y || !((l.hasClass(x, \"openToggler\") || l.hasClass(x, \"opened\")))))) {\n                return;\n            }\n        ;\n        ;\n            var z = n.JSBNG__find(y, \"div.fbNubFlyoutOuter\"), aa = n.JSBNG__find(z, \"div.fbNubFlyoutInner\"), ba = n.JSBNG__find(aa, \"div.fbNubFlyoutBody\"), ca = ba.scrollTop, da = ba.offsetHeight;\n            p.set(ba, \"height\", \"auto\");\n            var ea = r.getElementDimensions(y), fa = r.getElementDimensions(ba), ga = this.getMaxFlyoutHeight(x);\n            p.set(y, \"max-height\", ((ga + \"px\")));\n            p.set(z, \"max-height\", ((ga + \"px\")));\n            ea = r.getElementDimensions(y);\n            var ha = r.getElementDimensions(aa), ia = ((ha.y - fa.y)), ja = ((ea.y - ia)), ka = parseInt(((ba.style.height || ba.clientHeight)), 10), la = ((ja !== ka));\n            if (((((ea.y > ia)) && la))) {\n                p.set(ba, \"height\", ((ja + \"px\")));\n            }\n        ;\n        ;\n            l.removeClass(y, \"swapDirection\");\n            var ma = r.getElementPosition(y).x;\n            l.conditionClass(y, \"swapDirection\", function() {\n                if (((ma < 0))) {\n                    return true;\n                }\n            ;\n            ;\n                return ((((ma + ea.x)) > this.viewportDimensions.x));\n            }.bind(this)());\n            if (((la && ((((ca + da)) >= fa.y))))) {\n                ba.scrollTop = ba.scrollHeight;\n            }\n             else ba.scrollTop = ca;\n        ;\n        ;\n            this.notifyNub(x, \"resize\");\n        },\n        getMaxFlyoutHeight: function(x) {\n            var y = this._findFlyout(x), z = r.getElementPosition(y, \"viewport\"), aa = r.getElementDimensions(y), ba = ((Math.max(this.MIN_HEIGHT, ((this.viewportDimensions.y - this.flyoutHeightOffset))) - ((((this.viewportDimensions.y - z.y)) - aa.y))));\n            return Math.max(ba, 0);\n        },\n        resizeAllFlyouts: function() {\n            var x = n.scry(this.rootEl, \"div._50-v.openToggler\");\n            x = x.concat(n.scry(this.rootEl, \"div._50-v.opened\"));\n            var y = x.length;\n            while (y--) {\n                this._resizeNubFlyout(x[y]);\n            ;\n            };\n        ;\n        },\n        _onClick: function(JSBNG__event) {\n            var x = JSBNG__event.getTarget(), y = o.byClass(x, \"fbNub\");\n            if (y) {\n                if (o.byClass(x, \"fbNubFlyoutTitlebar\")) {\n                    var z = o.byTag(x, \"a\"), aa = ((((x.nodeName == \"INPUT\")) && ((x.getAttribute(\"type\") == \"submit\"))));\n                    if (((!z && !aa))) {\n                        this.hide(y);\n                        return false;\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n                this.notifyNub(y, \"click\");\n            }\n        ;\n        ;\n        },\n        _onWindowResize: function(JSBNG__event) {\n            this.calculateViewportDimensions();\n            this.resizeAllFlyouts();\n        },\n        _findFlyout: function(x) {\n            return ((l.hasClass(x, \"fbNubFlyout\") ? x : ((n.scry(x, \"div.fbNubFlyout\")[0] || null))));\n        },\n        registerNubController: function(x, y) {\n            m.set(x, \"dock:nub:controller\", y);\n            y.subscribe(\"nub/button/content-changed\", h(this.inform, this, \"resize\", x));\n            y.subscribe(\"nub/flyout/content-changed\", h(this._resizeNubFlyout, this, x));\n        },\n        unregisterNubController: function(x) {\n            m.remove(x, \"dock:nub:controller\");\n        },\n        notifyNub: function(x, y, z) {\n            var aa = m.get(x, \"dock:nub:controller\");\n            ((aa && aa.inform(y, z)));\n        }\n    });\n    e.exports = ((a.Dock || w));\n});\n__d(\"NubController\", [\"ArbiterMixin\",\"Dock\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"ArbiterMixin\"), h = b(\"Dock\"), i = b(\"copyProperties\");\n    function j() {\n    \n    };\n;\n    i(j.prototype, g, {\n        init: function(k) {\n            this.el = k;\n            h.registerNubController(k, this);\n            return this;\n        },\n        buttonContentChanged: function() {\n            this.inform(\"nub/button/content-changed\");\n        },\n        flyoutContentChanged: function() {\n            this.inform(\"nub/flyout/content-changed\");\n        },\n        hide: function() {\n            h.hide(this.el);\n        },\n        show: function() {\n            h.show(this.el);\n        }\n    });\n    e.exports = j;\n});\n__d(\"DropdownContextualHelpLink\", [\"DOM\",\"ge\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOM\"), h = b(\"ge\"), i = {\n        set: function(j) {\n            var k = h(\"navHelpCenter\");\n            if (((k !== null))) {\n                g.replace(k, j);\n            }\n        ;\n        ;\n        }\n    };\n    e.exports = i;\n});\n__d(\"ChatActivity\", [\"JSBNG__Event\",\"Arbiter\",\"AvailableList\",\"AvailableListConstants\",\"JSLogger\",\"MercuryConfig\",\"PresenceState\",\"UserActivity\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"Arbiter\"), i = b(\"AvailableList\"), j = b(\"AvailableListConstants\"), k = b(\"JSLogger\"), l = b(\"MercuryConfig\"), m = b(\"PresenceState\"), n = b(\"UserActivity\"), o = b(\"copyProperties\"), p = ((l.activity_limit || 60000)), q = ((l.idle_limit || 1800000)), r = ((l.idle_poll_interval || 300000)), s = k.create(\"chat_activity\"), t = JSBNG__Date.now(), u = t, v = true;\n    function w() {\n        var aa = JSBNG__Date.now();\n        return !!((v && ((((aa - t)) < p))));\n    };\n;\n    var x = o(new h(), {\n        isActive: w\n    });\n    function y() {\n        var aa = t;\n        t = JSBNG__Date.now();\n        if (((((t - aa)) > q))) {\n            s.debug(\"idle_to_active\", aa);\n            m.doSync();\n        }\n    ;\n    ;\n        x.inform(\"activity\");\n    };\n;\n    i.subscribe(j.ON_AVAILABILITY_CHANGED, function() {\n        if (!i.isUserIdle()) {\n            u = JSBNG__Date.now();\n        }\n    ;\n    ;\n    });\n    g.listen(window, \"JSBNG__focus\", function() {\n        v = true;\n        y();\n    });\n    g.listen(window, \"JSBNG__blur\", function() {\n        v = false;\n    });\n    n.subscribe(function() {\n        y();\n    });\n    function z(aa) {\n        var ba = ((((aa && aa.at)) && m.verifyNumber(aa.at)));\n        if (((typeof ba !== \"number\"))) {\n            ba = null;\n        }\n    ;\n    ;\n        return ((ba || 0));\n    };\n;\n    JSBNG__setInterval(function() {\n        var aa = JSBNG__Date.now(), ba = z(m.get()), ca = Math.max(t, ba, u);\n        if (((((aa - ca)) > q))) {\n            s.debug(\"idle\", {\n                cookie: ba,\n                local: t,\n                presence: u\n            });\n            x.inform(\"idle\", ((aa - ca)));\n        }\n    ;\n    ;\n    }, r);\n    m.registerStateStorer(function(aa) {\n        var ba = z(aa);\n        if (((ba < t))) {\n            aa.at = t;\n        }\n    ;\n    ;\n        return aa;\n    });\n    h.subscribe(k.DUMP_EVENT, function(aa, ba) {\n        ba.chat_activity = {\n            activity_limit: p,\n            idle_limit: q,\n            idle_poll_interval: r,\n            last_active_time: t,\n            last_global_active_time: u\n        };\n    });\n    e.exports = x;\n});\n__d(\"MercuryNotificationRenderer\", [\"MercuryAssert\",\"MercuryMessages\",\"MercuryParticipants\",\"MercuryThreads\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"MercuryAssert\"), h = b(\"MercuryMessages\").get(), i = b(\"MercuryParticipants\"), j = b(\"MercuryThreads\").get(), k = b(\"tx\");\n    function l(m, n) {\n        g.isThreadID(m);\n        j.getThreadMeta(m, function(o) {\n            h.getThreadMessagesRange(m, 0, 1, function(p) {\n                var q = ((p.length && p[((p.length - 1))]));\n                if (((q && ((q.author != i.user))))) {\n                    i.get(q.author, function(r) {\n                        if (o.JSBNG__name) {\n                            n(k._(\"{senderName} messaged {groupName}\", {\n                                senderName: r.short_name,\n                                groupName: o.JSBNG__name\n                            }));\n                        }\n                         else n(k._(\"{name} messaged you\", {\n                            JSBNG__name: r.short_name\n                        }));\n                    ;\n                    ;\n                    });\n                }\n                 else n(\"New message!\");\n            ;\n            ;\n            });\n        });\n    };\n;\n    e.exports = {\n        renderDocumentTitle: l\n    };\n});\n__d(\"MercuryTimestampTracker\", [\"MercuryActionTypeConstants\",\"MercuryPayloadSource\",\"MercurySingletonMixin\",\"MercuryServerRequests\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"MercuryActionTypeConstants\"), h = b(\"MercuryPayloadSource\"), i = b(\"MercurySingletonMixin\"), j = b(\"MercuryServerRequests\"), k = b(\"copyProperties\");\n    function l(m) {\n        this._fbid = m;\n        this._serverRequests = j.getForFBID(this._fbid);\n        this._lastTimestamp = 0;\n        this._serverRequests.subscribe(\"update-messages\", function(n, o) {\n            if (((!o.actions || !o.actions.length))) {\n                return;\n            }\n        ;\n        ;\n            if (((((o.payload_source == h.CLIENT_SEND_MESSAGE)) || ((o.payload_source == h.UNKNOWN))))) {\n                return;\n            }\n        ;\n        ;\n            for (var p = 0; ((p < o.actions.length)); p++) {\n                var q = o.actions[p], r = q.action_type;\n                if (((((((r == g.USER_GENERATED_MESSAGE)) && q.thread_id)) && ((q.timestamp > this._lastTimestamp))))) {\n                    this._lastTimestamp = q.timestamp;\n                }\n            ;\n            ;\n            };\n        ;\n        }.bind(this));\n    };\n;\n    k(l.prototype, {\n        getLastUserMessageTimestamp: function() {\n            return this._lastTimestamp;\n        }\n    });\n    k(l, i);\n    e.exports = l;\n});\n__d(\"ChatTitleBarBlinker\", [\"ChatActivity\",\"DocumentTitle\",\"JSLogger\",\"MercuryThreadInformer\",\"MercuryNotificationRenderer\",\"PresenceState\",\"MercuryTimestampTracker\",], function(a, b, c, d, e, f) {\n    var g = b(\"ChatActivity\"), h = b(\"DocumentTitle\"), i = b(\"JSLogger\"), j = b(\"MercuryThreadInformer\").get(), k = b(\"MercuryNotificationRenderer\"), l = b(\"PresenceState\"), m = b(\"MercuryTimestampTracker\").get(), n = i.create(\"chat_title\"), o = null, p = 0, q = false;\n    function r() {\n        if (o) {\n            o.JSBNG__stop();\n            o = null;\n            return true;\n        }\n    ;\n    ;\n        return false;\n    };\n;\n    function s(x) {\n        var y = ((x || m.getLastUserMessageTimestamp()));\n        if (((p <= y))) {\n            p = y;\n            if (((r() || q))) {\n                l.doSync();\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n    };\n;\n    var t = {\n        blink: function(x, y) {\n            if (((!o && ((p < y))))) {\n                k.renderDocumentTitle(x, function(z) {\n                    if (!o) {\n                        o = h.blink(z);\n                    }\n                ;\n                ;\n                });\n            }\n        ;\n        ;\n        },\n        stopBlinking: function() {\n            s();\n        },\n        blinkingElsewhere: function() {\n            q = true;\n        }\n    };\n    function u(x) {\n        var y = l.verifyNumber(x.sb2);\n        if (((!y || ((y <= p))))) {\n            return null;\n        }\n    ;\n    ;\n        return y;\n    };\n;\n    function v(x) {\n        var y = ((x && u(x)));\n        if (y) {\n            p = y;\n            n.debug(\"load\", p);\n            r();\n            q = false;\n        }\n    ;\n    ;\n    };\n;\n    function w(x) {\n        var y = u(x);\n        if (!y) {\n            n.debug(\"store\", p);\n            x.sb2 = p;\n            q = false;\n        }\n    ;\n    ;\n        return x;\n    };\n;\n    l.registerStateStorer(w);\n    l.registerStateLoader(v);\n    j.subscribe(\"thread-read-changed\", function(x, y) {\n        var z = m.getLastUserMessageTimestamp(), aa = 0;\n        {\n            var fin220keys = ((window.top.JSBNG_Replay.forInKeys)((y))), fin220i = (0);\n            var ba;\n            for (; (fin220i < fin220keys.length); (fin220i++)) {\n                ((ba) = (fin220keys[fin220i]));\n                {\n                    if (((((y[ba].mark_as_read && ((y[ba].timestamp >= z)))) && ((y[ba].timestamp > aa))))) {\n                        aa = y[ba].timestamp;\n                    }\n                ;\n                ;\n                };\n            };\n        };\n    ;\n        ((aa && s(aa)));\n    });\n    g.subscribe(\"activity\", function() {\n        s();\n    });\n    (function() {\n        var x = l.getInitial();\n        if (x) {\n            p = ((u(x) || 0));\n        }\n    ;\n    ;\n    })();\n    e.exports = t;\n});\n__d(\"swfobject\", [\"AsyncRequest\",\"Bootloader\",\"ControlledReferer\",\"copyProperties\",\"CSS\",\"DOM\",\"function-extensions\",\"ge\",\"htmlSpecialChars\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = b(\"Bootloader\"), i = b(\"ControlledReferer\"), j = b(\"copyProperties\"), k = b(\"CSS\"), l = b(\"DOM\");\n    b(\"function-extensions\");\n    var m = b(\"ge\"), n = b(\"htmlSpecialChars\");\n    if (((typeof o == \"undefined\"))) {\n        var o = {\n        };\n    }\n;\n;\n    if (((typeof o.util == \"undefined\"))) {\n        o.util = {\n        };\n    }\n;\n;\n    if (((typeof o.SWFObjectUtil == \"undefined\"))) {\n        o.SWFObjectUtil = {\n        };\n    }\n;\n;\n    o.SWFObject = function(u, v, w, x, y, z, aa, ba, ca, da) {\n        if (!JSBNG__document.getElementById) {\n            return;\n        }\n    ;\n    ;\n        this.DETECT_KEY = ((da ? da : \"detectflash\"));\n        this.skipDetect = o.util.getRequestParameter(this.DETECT_KEY);\n        this.params = {\n        };\n        this.variables = {\n        };\n        this.attributes = [];\n        this.fallback_html = \"\";\n        this.fallback_js_fcn = function() {\n        \n        };\n        if (u) {\n            this.setAttribute(\"swf\", u);\n        }\n    ;\n    ;\n        if (v) {\n            this.setAttribute(\"id\", v);\n        }\n    ;\n    ;\n        if (w) {\n            this.setAttribute(\"width\", w);\n        }\n    ;\n    ;\n        if (x) {\n            this.setAttribute(\"height\", x);\n        }\n    ;\n    ;\n        this.installedVer = o.SWFObjectUtil.getPlayerVersion();\n        if (y) {\n            if (!((y instanceof Array))) {\n                y = [y,];\n            }\n        ;\n        ;\n            var ea;\n            y.forEach(function(ha) {\n                ea = new o.PlayerVersion(ha.toString().split(\".\"));\n                if (((ea.major == this.installedVer.major))) {\n                    this.setAttribute(\"version\", ea);\n                    return;\n                }\n                 else if (((!this.getAttribute(\"version\") || ((ea.major < this.getAttribute(\"version\").major))))) {\n                    this.setAttribute(\"version\", ea);\n                }\n                \n            ;\n            ;\n            }.bind(this));\n        }\n    ;\n    ;\n        if (((((!window.JSBNG__opera && JSBNG__document.all)) && ((this.installedVer.major > 7))))) {\n            if (!o.unloadSet) {\n                o.SWFObjectUtil.prepUnload = function() {\n                    var ha = function() {\n                    \n                    }, ia = function() {\n                    \n                    };\n                    window.JSBNG__attachEvent(\"JSBNG__onunload\", o.SWFObjectUtil.cleanupSWFs);\n                };\n                window.JSBNG__attachEvent(\"JSBNG__onbeforeunload\", o.SWFObjectUtil.prepUnload);\n                o.unloadSet = true;\n            }\n        ;\n        }\n    ;\n    ;\n        if (z) {\n            this.addParam(\"bgcolor\", z);\n        }\n    ;\n    ;\n        var fa = ((aa ? aa : \"high\"));\n        this.addParam(\"quality\", fa);\n        this.setAttribute(\"useExpressInstall\", false);\n        this.setAttribute(\"doExpressInstall\", false);\n        var ga = (((ba) ? ba : window.JSBNG__location));\n        this.setAttribute(\"xiRedirectUrl\", ga);\n        this.setAttribute(\"redirectUrl\", \"\");\n        if (ca) {\n            this.setAttribute(\"redirectUrl\", ca);\n        }\n    ;\n    ;\n        this.setAttribute(\"useIframe\", false);\n    };\n    o.SWFObject.ieWorkaroundApplied = false;\n    o.SWFObject.ensureIEWorkaroundAttached = function() {\n        if (((!o.SWFObject.ieWorkaroundApplied && JSBNG__document.JSBNG__attachEvent))) {\n            o.SWFObject.ieWorkaroundApplied = true;\n            JSBNG__document.JSBNG__attachEvent(\"onpropertychange\", o.SWFObject.onDocumentPropertyChange);\n        }\n    ;\n    ;\n    };\n    o.SWFObject.onDocumentPropertyChange = function(JSBNG__event) {\n        if (((JSBNG__event.propertyName == \"title\"))) {\n            var u = JSBNG__document.title;\n            if (((((u != null)) && ((u.indexOf(\"#!\") != -1))))) {\n                u = u.substring(0, u.indexOf(\"#!\"));\n                JSBNG__document.title = u;\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n    };\n    j(o.SWFObject.prototype, {\n        useExpressInstall: function(u) {\n            this.xiSWFPath = ((!u ? \"/swf/expressinstall.swf\" : u));\n            this.setAttribute(\"useExpressInstall\", true);\n        },\n        setAttribute: function(u, v) {\n            this.attributes[u] = v;\n        },\n        getAttribute: function(u) {\n            return ((this.attributes[u] || \"\"));\n        },\n        addParam: function(u, v) {\n            this.params[u] = v;\n        },\n        getParams: function() {\n            return this.params;\n        },\n        addVariable: function(u, v) {\n            this.variables[u] = v;\n        },\n        getVariable: function(u) {\n            return ((this.variables[u] || \"\"));\n        },\n        getVariables: function() {\n            return this.variables;\n        },\n        getVariablePairs: function() {\n            var u = [], v, w = this.getVariables();\n            {\n                var fin221keys = ((window.top.JSBNG_Replay.forInKeys)((w))), fin221i = (0);\n                (0);\n                for (; (fin221i < fin221keys.length); (fin221i++)) {\n                    ((v) = (fin221keys[fin221i]));\n                    {\n                        u[u.length] = ((((v + \"=\")) + w[v]));\n                    ;\n                    };\n                };\n            };\n        ;\n            return u.join(\"&\");\n        },\n        getSWFHTML: function() {\n            var u, v, w;\n            if (((((JSBNG__navigator.plugins && JSBNG__navigator.mimeTypes)) && JSBNG__navigator.mimeTypes.length))) {\n                if (this.getAttribute(\"doExpressInstall\")) {\n                    this.addVariable(\"MMplayerType\", \"PlugIn\");\n                    this.setAttribute(\"swf\", this.xiSWFPath);\n                }\n            ;\n            ;\n                v = {\n                    type: \"application/x-shockwave-flash\",\n                    src: this.getAttribute(\"swf\"),\n                    width: this.getAttribute(\"width\"),\n                    height: this.getAttribute(\"height\"),\n                    style: ((this.getAttribute(\"style\") || \"display: block;\")),\n                    id: this.getAttribute(\"id\"),\n                    JSBNG__name: this.getAttribute(\"id\")\n                };\n                var x = this.getParams();\n                {\n                    var fin222keys = ((window.top.JSBNG_Replay.forInKeys)((x))), fin222i = (0);\n                    var y;\n                    for (; (fin222i < fin222keys.length); (fin222i++)) {\n                        ((y) = (fin222keys[fin222i]));\n                        {\n                            v[y] = x[y];\n                        ;\n                        };\n                    };\n                };\n            ;\n                w = this.getVariablePairs();\n                if (w) {\n                    v.flashvars = w;\n                }\n            ;\n            ;\n                u = t(\"embed\", v, null);\n            }\n             else {\n                if (this.getAttribute(\"doExpressInstall\")) {\n                    this.addVariable(\"MMplayerType\", \"ActiveX\");\n                    this.setAttribute(\"swf\", this.xiSWFPath);\n                }\n            ;\n            ;\n                v = {\n                    id: this.getAttribute(\"id\"),\n                    classid: \"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\",\n                    width: this.getAttribute(\"width\"),\n                    height: this.getAttribute(\"height\"),\n                    style: ((this.getAttribute(\"style\") || \"display: block;\"))\n                };\n                var z = t(\"param\", {\n                    JSBNG__name: \"movie\",\n                    value: this.getAttribute(\"swf\")\n                }, null), x = this.getParams();\n                {\n                    var fin223keys = ((window.top.JSBNG_Replay.forInKeys)((x))), fin223i = (0);\n                    var y;\n                    for (; (fin223i < fin223keys.length); (fin223i++)) {\n                        ((y) = (fin223keys[fin223i]));\n                        {\n                            z += t(\"param\", {\n                                JSBNG__name: y,\n                                value: x[y]\n                            }, null);\n                        ;\n                        };\n                    };\n                };\n            ;\n                w = this.getVariablePairs();\n                if (w) {\n                    z += t(\"param\", {\n                        JSBNG__name: \"flashvars\",\n                        value: w\n                    }, null);\n                }\n            ;\n            ;\n                u = t(\"object\", v, z);\n            }\n        ;\n        ;\n            return u;\n        },\n        write: function(u) {\n            if (this.getAttribute(\"useExpressInstall\")) {\n                var v = new o.PlayerVersion([6,0,65,]);\n                if (((this.installedVer.versionIsValid(v) && !this.installedVer.versionIsValid(this.getAttribute(\"version\"))))) {\n                    this.setAttribute(\"doExpressInstall\", true);\n                    this.addVariable(\"MMredirectURL\", escape(this.getAttribute(\"xiRedirectUrl\")));\n                    JSBNG__document.title = ((JSBNG__document.title.slice(0, 47) + \" - Flash Player Installation\"));\n                    this.addVariable(\"MMdoctitle\", JSBNG__document.title);\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            var w = ((((typeof u == \"string\")) ? JSBNG__document.getElementById(u) : u));\n            if (!w) {\n                return false;\n            }\n        ;\n        ;\n            k.addClass(w, \"swfObject\");\n            w.setAttribute(\"data-swfid\", this.getAttribute(\"id\"));\n            if (((((this.skipDetect || this.getAttribute(\"doExpressInstall\"))) || this.installedVer.versionIsValid(this.getAttribute(\"version\"))))) {\n                if (!this.getAttribute(\"useIframe\")) {\n                    o.SWFObject.ensureIEWorkaroundAttached();\n                    w.innerHTML = this.getSWFHTML();\n                }\n                 else this._createIframe(w);\n            ;\n            ;\n                return true;\n            }\n             else {\n                if (((this.getAttribute(\"redirectUrl\") != \"\"))) {\n                    JSBNG__document.JSBNG__location.replace(this.getAttribute(\"redirectUrl\"));\n                }\n            ;\n            ;\n                var x = ((((((((((((this.getAttribute(\"version\").major + \".\")) + this.getAttribute(\"version\").minor)) + \".\")) + this.getAttribute(\"version\").release)) + \".\")) + this.getAttribute(\"version\").build)), y = ((((((((((((this.installedVer.major + \".\")) + this.installedVer.minor)) + \".\")) + this.installedVer.release)) + \".\")) + this.installedVer.build));\n                this.fallback_js_fcn(y, x);\n                w.innerHTML = this.fallback_html;\n            }\n        ;\n        ;\n            return false;\n        },\n        _createIframe: function(u) {\n            var v = l.create(\"div\", {\n                width: this.getAttribute(\"width\"),\n                height: this.getAttribute(\"height\"),\n                frameBorder: 0\n            });\n            l.empty(u);\n            u.appendChild(v);\n            i.useFacebookRefererHtml(v, this.getSWFHTML(), this.getAttribute(\"iframeSource\"));\n        }\n    });\n    o.SWFObjectUtil.getPlayerVersion = function() {\n        var u = new o.PlayerVersion([0,0,0,0,]), v;\n        if (((JSBNG__navigator.plugins && JSBNG__navigator.mimeTypes.length))) {\n            for (var w = 0; ((w < JSBNG__navigator.plugins.length)); w++) {\n                try {\n                    var y = JSBNG__navigator.plugins[w];\n                    if (((y.JSBNG__name == \"Shockwave Flash\"))) {\n                        v = new o.PlayerVersion(y.description.replace(/([a-zA-Z]|\\s)+/, \"\").replace(/(\\s+(r|d)|\\s+b[0-9]+)/, \".\").split(\".\"));\n                        if (((((((typeof u == \"undefined\")) || ((v.major > u.major)))) || ((((v.major == u.major)) && ((((v.minor > u.minor)) || ((((v.minor == u.minor)) && ((((v.release > u.release)) || ((((v.release == u.release)) && ((v.build > u.build))))))))))))))) {\n                            u = v;\n                        }\n                    ;\n                    ;\n                    }\n                ;\n                ;\n                } catch (x) {\n                \n                };\n            ;\n            };\n        ;\n        }\n         else if (((JSBNG__navigator.userAgent && ((JSBNG__navigator.userAgent.indexOf(\"Windows CE\") >= 0))))) {\n            var z = 1, aa = 3;\n            while (z) {\n                try {\n                    aa++;\n                    z = new ActiveXObject(((\"ShockwaveFlash.ShockwaveFlash.\" + aa)));\n                    u = new o.PlayerVersion([aa,0,0,]);\n                } catch (ba) {\n                    z = null;\n                };\n            ;\n            };\n        ;\n        }\n         else {\n            try {\n                var z = new ActiveXObject(\"ShockwaveFlash.ShockwaveFlash.7\");\n            } catch (ca) {\n                try {\n                    var z = new ActiveXObject(\"ShockwaveFlash.ShockwaveFlash.6\");\n                    u = new o.PlayerVersion([6,0,21,]);\n                    z.AllowScriptAccess = \"always\";\n                } catch (da) {\n                    if (((u.major == 6))) {\n                        return u;\n                    }\n                ;\n                ;\n                };\n            ;\n                try {\n                    z = new ActiveXObject(\"ShockwaveFlash.ShockwaveFlash\");\n                } catch (ea) {\n                \n                };\n            ;\n            };\n        ;\n            if (((z != null))) {\n                u = new o.PlayerVersion(z.GetVariable(\"$version\").split(\" \")[1].split(\",\"));\n            }\n        ;\n        ;\n        }\n        \n    ;\n    ;\n        return u;\n    };\n    o.PlayerVersion = function(u) {\n        this.major = ((((u[0] != null)) ? parseInt(u[0], 10) : 0));\n        this.minor = ((((u[1] != null)) ? parseInt(u[1], 10) : 0));\n        this.release = ((((u[2] != null)) ? parseInt(u[2], 10) : 0));\n        this.build = ((((u[3] != null)) ? parseInt(u[3], 10) : 0));\n    };\n    o.PlayerVersion.prototype.versionIsValid = function(u) {\n        if (((this.major < u.major))) {\n            return false;\n        }\n    ;\n    ;\n        if (((this.major > u.major))) {\n            return true;\n        }\n    ;\n    ;\n        if (((this.minor < u.minor))) {\n            return false;\n        }\n    ;\n    ;\n        if (((this.minor > u.minor))) {\n            return true;\n        }\n    ;\n    ;\n        if (((this.release < u.release))) {\n            return false;\n        }\n    ;\n    ;\n        if (((this.release > u.release))) {\n            return true;\n        }\n    ;\n    ;\n        if (((this.build < u.build))) {\n            return false;\n        }\n    ;\n    ;\n        return true;\n    };\n    o.util = {\n        getRequestParameter: function(u) {\n            var v = ((JSBNG__document.JSBNG__location.search || JSBNG__document.JSBNG__location.hash));\n            if (((u == null))) {\n                return v;\n            }\n        ;\n        ;\n            if (v) {\n                var w = v.substring(1).split(\"&\");\n                for (var x = 0; ((x < w.length)); x++) {\n                    if (((w[x].substring(0, w[x].indexOf(\"=\")) == u))) {\n                        return w[x].substring(((w[x].indexOf(\"=\") + 1)));\n                    }\n                ;\n                ;\n                };\n            ;\n            }\n        ;\n        ;\n            return \"\";\n        }\n    };\n    o.SWFObjectUtil.cleanupSWFs = function() {\n        var u = JSBNG__document.getElementsByTagName(\"OBJECT\");\n        for (var v = ((u.length - 1)); ((v >= 0)); v--) {\n            u[v].style.display = \"none\";\n            {\n                var fin224keys = ((window.top.JSBNG_Replay.forInKeys)((u[v]))), fin224i = (0);\n                var w;\n                for (; (fin224i < fin224keys.length); (fin224i++)) {\n                    ((w) = (fin224keys[fin224i]));\n                    {\n                        if (((typeof u[v][w] == \"function\"))) {\n                            u[v][w] = function() {\n                            \n                            };\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n        };\n    ;\n    };\n    if (((!JSBNG__document.getElementById && JSBNG__document.all))) {\n        JSBNG__document.getElementById = function(u) {\n            return JSBNG__document.all[u];\n        };\n    }\n;\n;\n    var p = o.util.getRequestParameter, q = o.SWFObject, r = o.SWFObject;\n    o.spawn_flash_update_dialog = function() {\n        new g().setURI(\"/ajax/flash_update_dialog.php\").setMethod(\"GET\").setReadOnly(true).send();\n    };\n    function s(u, v) {\n        var w = m(u), x = o.SWFObjectUtil.getPlayerVersion(), y;\n        v.forEach(function(ba) {\n            ba = new o.PlayerVersion(ba.toString().split(\".\"));\n            if (((ba.major == x.major))) {\n                y = ba;\n                return;\n            }\n             else if (((((typeof y == \"undefined\")) || ((ba.major < y.major))))) {\n                y = ba;\n            }\n            \n        ;\n        ;\n        }.bind(this));\n        if (((w && ((x.major > 0))))) {\n            var z = ((((((((((((x.major + \".\")) + x.minor)) + \".\")) + x.release)) + \".\")) + x.build)), aa = ((((((((((((y.major + \".\")) + y.minor)) + \".\")) + y.release)) + \".\")) + y.build));\n            l.setContent(w, l.tx._(\"Flash {required-version} is required to view this content. Your current version is {current-version}. Please download the latest Flash Player.\", {\n                \"required-version\": aa,\n                \"current-version\": z\n            }));\n        }\n    ;\n    ;\n    };\n;\n    o.showFlashErrorDialog = function(u, v) {\n        h.loadModules([\"ErrorDialog\",], function(w) {\n            w.show(u, v);\n        });\n    };\n    function t(u, v, w) {\n        var x = /^[A-Za-z0-9\\-]+$/;\n        if (!u.match(x)) {\n            throw new Error(((\"Invalid tag \" + u)));\n        }\n    ;\n    ;\n        var y = ((\"\\u003C\" + u));\n        {\n            var fin225keys = ((window.top.JSBNG_Replay.forInKeys)((v))), fin225i = (0);\n            var z;\n            for (; (fin225i < fin225keys.length); (fin225i++)) {\n                ((z) = (fin225keys[fin225i]));\n                {\n                    if (!z.match(x)) {\n                        throw new Error(((\"Invalid attr \" + z)));\n                    }\n                ;\n                ;\n                    y += ((((((((\" \" + z)) + \"=\\\"\")) + n(v[z]))) + \"\\\"\"));\n                };\n            };\n        };\n    ;\n        if (((w === null))) {\n            return ((y + \"/\\u003E\"));\n        }\n         else return ((((((((((y + \"\\u003E\")) + w)) + \"\\u003C/\")) + u)) + \"\\u003E\"))\n    ;\n    };\n;\n    e.exports = ((a.deconcept || o));\n});\n__d(\"swfobject2\", [], function(a, b, c, d, e, f) {\n    var g = function() {\n        var h = \"undefined\", i = \"object\", j = \"Shockwave Flash\", k = \"ShockwaveFlash.ShockwaveFlash\", l = \"application/x-shockwave-flash\", m = \"SWFObjectExprInst\", n = \"onreadystatechange\", o = window, p = JSBNG__document, q = JSBNG__navigator, r = false, s = [ka,], t = [], u = [], v = [], w, x, y, z, aa = false, ba = false, ca, da, ea = true, fa = function() {\n            var eb = ((((((typeof p.getElementById != h)) && ((typeof p.getElementsByTagName != h)))) && ((typeof p.createElement != h)))), fb = q.userAgent.toLowerCase(), gb = q.platform.toLowerCase(), hb = ((gb ? /win/.test(gb) : /win/.test(fb))), ib = ((gb ? /mac/.test(gb) : /mac/.test(fb))), jb = ((/webkit/.test(fb) ? parseFloat(fb.replace(/^.*webkit\\/(\\d+(\\.\\d+)?).*$/, \"$1\")) : false)), kb = !+\"\\u000b1\", lb = [0,0,0,], mb = null;\n            if (((((typeof q.plugins != h)) && ((typeof q.plugins[j] == i))))) {\n                mb = q.plugins[j].description;\n                if (((mb && !((((((typeof q.mimeTypes != h)) && q.mimeTypes[l])) && !q.mimeTypes[l].enabledPlugin))))) {\n                    r = true;\n                    kb = false;\n                    mb = mb.replace(/^.*\\s+(\\S+\\s+\\S+$)/, \"$1\");\n                    lb[0] = parseInt(mb.replace(/^(.*)\\..*$/, \"$1\"), 10);\n                    lb[1] = parseInt(mb.replace(/^.*\\.(.*)\\s.*$/, \"$1\"), 10);\n                    lb[2] = ((/[a-zA-Z]/.test(mb) ? parseInt(mb.replace(/^.*[a-zA-Z]+(.*)$/, \"$1\"), 10) : 0));\n                }\n            ;\n            ;\n            }\n             else if (((typeof o.ActiveXObject != h))) {\n                try {\n                    var ob = new ActiveXObject(k);\n                    if (ob) {\n                        mb = ob.GetVariable(\"$version\");\n                        if (mb) {\n                            kb = true;\n                            mb = mb.split(\" \")[1].split(\",\");\n                            lb = [parseInt(mb[0], 10),parseInt(mb[1], 10),parseInt(mb[2], 10),];\n                        }\n                    ;\n                    ;\n                    }\n                ;\n                ;\n                } catch (nb) {\n                \n                };\n            }\n            \n        ;\n        ;\n            return {\n                w3: eb,\n                pv: lb,\n                wk: jb,\n                ie: kb,\n                win: hb,\n                mac: ib\n            };\n        }(), ga = function() {\n            if (!fa.w3) {\n                return;\n            }\n        ;\n        ;\n            if (((((((typeof p.readyState != h)) && ((p.readyState == \"complete\")))) || ((((typeof p.readyState == h)) && ((p.getElementsByTagName(\"body\")[0] || p.body))))))) {\n                ha();\n            }\n        ;\n        ;\n            if (!aa) {\n                if (((typeof p.JSBNG__addEventListener != h))) {\n                    p.JSBNG__addEventListener(\"DOMContentLoaded\", ha, false);\n                }\n            ;\n            ;\n                if (((fa.ie && fa.win))) {\n                    p.JSBNG__attachEvent(n, function() {\n                        if (((p.readyState == \"complete\"))) {\n                            p.JSBNG__detachEvent(n, arguments.callee);\n                            ha();\n                        }\n                    ;\n                    ;\n                    });\n                    if (((o == JSBNG__top))) {\n                        (function() {\n                            if (aa) {\n                                return;\n                            }\n                        ;\n                        ;\n                            try {\n                                p.documentElement.doScroll(\"left\");\n                            } catch (eb) {\n                                JSBNG__setTimeout(arguments.callee, 0);\n                                return;\n                            };\n                        ;\n                            ha();\n                        })();\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n                if (fa.wk) {\n                    (function() {\n                        if (aa) {\n                            return;\n                        }\n                    ;\n                    ;\n                        if (!/loaded|complete/.test(p.readyState)) {\n                            JSBNG__setTimeout(arguments.callee, 0);\n                            return;\n                        }\n                    ;\n                    ;\n                        ha();\n                    })();\n                }\n            ;\n            ;\n                ja(ha);\n            }\n        ;\n        ;\n        }();\n        function ha() {\n            if (aa) {\n                return;\n            }\n        ;\n        ;\n            try {\n                var fb = p.getElementsByTagName(\"body\")[0].appendChild(xa(\"span\"));\n                fb.parentNode.removeChild(fb);\n            } catch (eb) {\n                return;\n            };\n        ;\n            aa = true;\n            var gb = s.length;\n            for (var hb = 0; ((hb < gb)); hb++) {\n                s[hb]();\n            ;\n            };\n        ;\n        };\n    ;\n        function ia(eb) {\n            if (aa) {\n                eb();\n            }\n             else s[s.length] = eb;\n        ;\n        ;\n        };\n    ;\n        function ja(eb) {\n            if (((typeof o.JSBNG__addEventListener != h))) {\n                o.JSBNG__addEventListener(\"load\", eb, false);\n            }\n             else if (((typeof p.JSBNG__addEventListener != h))) {\n                p.JSBNG__addEventListener(\"load\", eb, false);\n            }\n             else if (((typeof o.JSBNG__attachEvent != h))) {\n                ya(o, \"JSBNG__onload\", eb);\n            }\n             else if (((typeof o.JSBNG__onload == \"function\"))) {\n                var fb = o.JSBNG__onload;\n                o.JSBNG__onload = function() {\n                    fb();\n                    eb();\n                };\n            }\n             else o.JSBNG__onload = eb;\n            \n            \n            \n        ;\n        ;\n        };\n    ;\n        function ka() {\n            if (r) {\n                la();\n            }\n             else ma();\n        ;\n        ;\n        };\n    ;\n        function la() {\n            var eb = p.getElementsByTagName(\"body\")[0], fb = xa(i);\n            fb.setAttribute(\"type\", l);\n            fb.setAttribute(\"style\", \"visibility: hidden; position: absolute; top: -1000px;\");\n            var gb = eb.appendChild(fb);\n            if (gb) {\n                var hb = 0;\n                (function() {\n                    if (((typeof gb.GetVariable != h))) {\n                        var ib = gb.GetVariable(\"$version\");\n                        if (ib) {\n                            ib = ib.split(\" \")[1].split(\",\");\n                            fa.pv = [parseInt(ib[0], 10),parseInt(ib[1], 10),parseInt(ib[2], 10),];\n                        }\n                    ;\n                    ;\n                    }\n                     else if (((hb < 10))) {\n                        hb++;\n                        JSBNG__setTimeout(arguments.callee, 10);\n                        return;\n                    }\n                    \n                ;\n                ;\n                    gb = null;\n                    ma();\n                })();\n            }\n             else ma();\n        ;\n        ;\n        };\n    ;\n        function ma() {\n            var eb = t.length;\n            if (((eb > 0))) {\n                for (var fb = 0; ((fb < eb)); fb++) {\n                    var gb = t[fb].id, hb = t[fb].callbackFn, ib = {\n                        success: false,\n                        id: gb\n                    };\n                    if (((fa.pv[0] > 0))) {\n                        var jb = wa(gb);\n                        if (jb) {\n                            if (((za(t[fb].swfVersion) && !((fa.wk && ((fa.wk < 312))))))) {\n                                bb(gb, true);\n                                if (hb) {\n                                    ib.success = true;\n                                    ib.ref = na(gb);\n                                    hb(ib);\n                                }\n                            ;\n                            ;\n                            }\n                             else if (((t[fb].expressInstall && oa()))) {\n                                var kb = {\n                                };\n                                kb.data = t[fb].expressInstall;\n                                kb.width = ((jb.getAttribute(\"width\") || \"0\"));\n                                kb.height = ((jb.getAttribute(\"height\") || \"0\"));\n                                if (jb.getAttribute(\"class\")) {\n                                    kb.styleclass = jb.getAttribute(\"class\");\n                                }\n                            ;\n                            ;\n                                if (jb.getAttribute(\"align\")) {\n                                    kb.align = jb.getAttribute(\"align\");\n                                }\n                            ;\n                            ;\n                                var lb = {\n                                }, mb = jb.getElementsByTagName(\"param\"), nb = mb.length;\n                                for (var ob = 0; ((ob < nb)); ob++) {\n                                    if (((mb[ob].getAttribute(\"JSBNG__name\").toLowerCase() != \"movie\"))) {\n                                        lb[mb[ob].getAttribute(\"JSBNG__name\")] = mb[ob].getAttribute(\"value\");\n                                    }\n                                ;\n                                ;\n                                };\n                            ;\n                                pa(kb, lb, gb, hb);\n                            }\n                             else {\n                                qa(jb);\n                                if (hb) {\n                                    hb(ib);\n                                }\n                            ;\n                            ;\n                            }\n                            \n                        ;\n                        }\n                    ;\n                    ;\n                    }\n                     else {\n                        bb(gb, true);\n                        if (hb) {\n                            var pb = na(gb);\n                            if (((pb && ((typeof pb.SetVariable != h))))) {\n                                ib.success = true;\n                                ib.ref = pb;\n                            }\n                        ;\n                        ;\n                            hb(ib);\n                        }\n                    ;\n                    ;\n                    }\n                ;\n                ;\n                };\n            }\n        ;\n        ;\n        };\n    ;\n        function na(eb) {\n            var fb = null, gb = wa(eb);\n            if (((gb && ((gb.nodeName == \"OBJECT\"))))) {\n                if (((typeof gb.SetVariable != h))) {\n                    fb = gb;\n                }\n                 else {\n                    var hb = gb.getElementsByTagName(i)[0];\n                    if (hb) {\n                        fb = hb;\n                    }\n                ;\n                ;\n                }\n            ;\n            }\n        ;\n        ;\n            return fb;\n        };\n    ;\n        function oa() {\n            return ((((((!ba && za(\"6.0.65\"))) && ((fa.win || fa.mac)))) && !((fa.wk && ((fa.wk < 312))))));\n        };\n    ;\n        function pa(eb, fb, gb, hb) {\n            ba = true;\n            y = ((hb || null));\n            z = {\n                success: false,\n                id: gb\n            };\n            var ib = wa(gb);\n            if (ib) {\n                if (((ib.nodeName == \"OBJECT\"))) {\n                    w = ra(ib);\n                    x = null;\n                }\n                 else {\n                    w = ib;\n                    x = gb;\n                }\n            ;\n            ;\n                eb.id = m;\n                if (((((typeof eb.width == h)) || ((!/%$/.test(eb.width) && ((parseInt(eb.width, 10) < 310))))))) {\n                    eb.width = \"310\";\n                }\n            ;\n            ;\n                if (((((typeof eb.height == h)) || ((!/%$/.test(eb.height) && ((parseInt(eb.height, 10) < 137))))))) {\n                    eb.height = \"137\";\n                }\n            ;\n            ;\n                p.title = ((p.title.slice(0, 47) + \" - Flash Player Installation\"));\n                var jb = ((((fa.ie && fa.win)) ? \"ActiveX\" : \"PlugIn\")), kb = ((((((((((\"MMredirectURL=\" + o.JSBNG__location.toString().replace(/&/g, \"%26\"))) + \"&MMplayerType=\")) + jb)) + \"&MMdoctitle=\")) + p.title));\n                if (((typeof fb.flashvars != h))) {\n                    fb.flashvars += ((\"&\" + kb));\n                }\n                 else fb.flashvars = kb;\n            ;\n            ;\n                if (((((fa.ie && fa.win)) && ((ib.readyState != 4))))) {\n                    var lb = xa(\"div\");\n                    gb += \"SWFObjectNew\";\n                    lb.setAttribute(\"id\", gb);\n                    ib.parentNode.insertBefore(lb, ib);\n                    ib.style.display = \"none\";\n                    (function() {\n                        if (((ib.readyState == 4))) {\n                            ib.parentNode.removeChild(ib);\n                        }\n                         else JSBNG__setTimeout(arguments.callee, 10);\n                    ;\n                    ;\n                    })();\n                }\n            ;\n            ;\n                sa(eb, fb, gb);\n            }\n        ;\n        ;\n        };\n    ;\n        function qa(eb) {\n            if (((((fa.ie && fa.win)) && ((eb.readyState != 4))))) {\n                var fb = xa(\"div\");\n                eb.parentNode.insertBefore(fb, eb);\n                fb.parentNode.replaceChild(ra(eb), fb);\n                eb.style.display = \"none\";\n                (function() {\n                    if (((eb.readyState == 4))) {\n                        eb.parentNode.removeChild(eb);\n                    }\n                     else JSBNG__setTimeout(arguments.callee, 10);\n                ;\n                ;\n                })();\n            }\n             else eb.parentNode.replaceChild(ra(eb), eb);\n        ;\n        ;\n        };\n    ;\n        function ra(eb) {\n            var fb = xa(\"div\");\n            if (((fa.win && fa.ie))) {\n                fb.innerHTML = eb.innerHTML;\n            }\n             else {\n                var gb = eb.getElementsByTagName(i)[0];\n                if (gb) {\n                    var hb = gb.childNodes;\n                    if (hb) {\n                        var ib = hb.length;\n                        for (var jb = 0; ((jb < ib)); jb++) {\n                            if (((!((((hb[jb].nodeType == 1)) && ((hb[jb].nodeName == \"PARAM\")))) && !((hb[jb].nodeType == 8))))) {\n                                fb.appendChild(hb[jb].cloneNode(true));\n                            }\n                        ;\n                        ;\n                        };\n                    ;\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            return fb;\n        };\n    ;\n        function sa(eb, fb, gb) {\n            var hb, ib = wa(gb);\n            if (((fa.wk && ((fa.wk < 312))))) {\n                return hb;\n            }\n        ;\n        ;\n            if (ib) {\n                if (((typeof eb.id == h))) {\n                    eb.id = gb;\n                }\n            ;\n            ;\n                if (((fa.ie && fa.win))) {\n                    var jb = \"\";\n                    {\n                        var fin226keys = ((window.top.JSBNG_Replay.forInKeys)((eb))), fin226i = (0);\n                        var kb;\n                        for (; (fin226i < fin226keys.length); (fin226i++)) {\n                            ((kb) = (fin226keys[fin226i]));\n                            {\n                                if (((eb[kb] != Object.prototype[kb]))) {\n                                    if (((kb.toLowerCase() == \"data\"))) {\n                                        fb.movie = eb[kb];\n                                    }\n                                     else if (((kb.toLowerCase() == \"styleclass\"))) {\n                                        jb += ((((\" class=\\\"\" + eb[kb])) + \"\\\"\"));\n                                    }\n                                     else if (((kb.toLowerCase() != \"classid\"))) {\n                                        jb += ((((((((\" \" + kb)) + \"=\\\"\")) + eb[kb])) + \"\\\"\"));\n                                    }\n                                    \n                                    \n                                ;\n                                }\n                            ;\n                            ;\n                            };\n                        };\n                    };\n                ;\n                    var lb = \"\";\n                    {\n                        var fin227keys = ((window.top.JSBNG_Replay.forInKeys)((fb))), fin227i = (0);\n                        var mb;\n                        for (; (fin227i < fin227keys.length); (fin227i++)) {\n                            ((mb) = (fin227keys[fin227i]));\n                            {\n                                if (((fb[mb] != Object.prototype[mb]))) {\n                                    lb += ((((((((\"\\u003Cparam name=\\\"\" + mb)) + \"\\\" value=\\\"\")) + fb[mb])) + \"\\\" /\\u003E\"));\n                                }\n                            ;\n                            ;\n                            };\n                        };\n                    };\n                ;\n                    ib.outerHTML = ((((((((\"\\u003Cobject classid=\\\"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\\\"\" + jb)) + \"\\u003E\")) + lb)) + \"\\u003C/object\\u003E\"));\n                    u[u.length] = eb.id;\n                    hb = wa(eb.id);\n                }\n                 else {\n                    var nb = xa(i);\n                    nb.setAttribute(\"type\", l);\n                    {\n                        var fin228keys = ((window.top.JSBNG_Replay.forInKeys)((eb))), fin228i = (0);\n                        var ob;\n                        for (; (fin228i < fin228keys.length); (fin228i++)) {\n                            ((ob) = (fin228keys[fin228i]));\n                            {\n                                if (((eb[ob] != Object.prototype[ob]))) {\n                                    if (((ob.toLowerCase() == \"styleclass\"))) {\n                                        nb.setAttribute(\"class\", eb[ob]);\n                                    }\n                                     else if (((ob.toLowerCase() != \"classid\"))) {\n                                        nb.setAttribute(ob, eb[ob]);\n                                    }\n                                    \n                                ;\n                                }\n                            ;\n                            ;\n                            };\n                        };\n                    };\n                ;\n                    {\n                        var fin229keys = ((window.top.JSBNG_Replay.forInKeys)((fb))), fin229i = (0);\n                        var pb;\n                        for (; (fin229i < fin229keys.length); (fin229i++)) {\n                            ((pb) = (fin229keys[fin229i]));\n                            {\n                                if (((((fb[pb] != Object.prototype[pb])) && ((pb.toLowerCase() != \"movie\"))))) {\n                                    ta(nb, pb, fb[pb]);\n                                }\n                            ;\n                            ;\n                            };\n                        };\n                    };\n                ;\n                    ib.parentNode.replaceChild(nb, ib);\n                    hb = nb;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            return hb;\n        };\n    ;\n        function ta(eb, fb, gb) {\n            var hb = xa(\"param\");\n            hb.setAttribute(\"JSBNG__name\", fb);\n            hb.setAttribute(\"value\", gb);\n            eb.appendChild(hb);\n        };\n    ;\n        function ua(eb) {\n            var fb = wa(eb);\n            if (((fb && ((fb.nodeName == \"OBJECT\"))))) {\n                if (((fa.ie && fa.win))) {\n                    fb.style.display = \"none\";\n                    (function() {\n                        if (((fb.readyState == 4))) {\n                            va(eb);\n                        }\n                         else JSBNG__setTimeout(arguments.callee, 10);\n                    ;\n                    ;\n                    })();\n                }\n                 else fb.parentNode.removeChild(fb);\n            ;\n            }\n        ;\n        ;\n        };\n    ;\n        function va(eb) {\n            var fb = wa(eb);\n            if (fb) {\n                {\n                    var fin230keys = ((window.top.JSBNG_Replay.forInKeys)((fb))), fin230i = (0);\n                    var gb;\n                    for (; (fin230i < fin230keys.length); (fin230i++)) {\n                        ((gb) = (fin230keys[fin230i]));\n                        {\n                            if (((typeof fb[gb] == \"function\"))) {\n                                fb[gb] = null;\n                            }\n                        ;\n                        ;\n                        };\n                    };\n                };\n            ;\n                fb.parentNode.removeChild(fb);\n            }\n        ;\n        ;\n        };\n    ;\n        function wa(eb) {\n            var fb = null;\n            try {\n                fb = p.getElementById(eb);\n            } catch (gb) {\n            \n            };\n        ;\n            return fb;\n        };\n    ;\n        function xa(eb) {\n            return p.createElement(eb);\n        };\n    ;\n        function ya(eb, fb, gb) {\n            eb.JSBNG__attachEvent(fb, gb);\n            v[v.length] = [eb,fb,gb,];\n        };\n    ;\n        function za(eb) {\n            var fb = fa.pv, gb = eb.split(\".\");\n            gb[0] = parseInt(gb[0], 10);\n            gb[1] = ((parseInt(gb[1], 10) || 0));\n            gb[2] = ((parseInt(gb[2], 10) || 0));\n            return ((((((((fb[0] > gb[0])) || ((((fb[0] == gb[0])) && ((fb[1] > gb[1])))))) || ((((((fb[0] == gb[0])) && ((fb[1] == gb[1])))) && ((fb[2] >= gb[2])))))) ? true : false));\n        };\n    ;\n        function ab(eb, fb, gb, hb) {\n            if (((fa.ie && fa.mac))) {\n                return;\n            }\n        ;\n        ;\n            var ib = p.getElementsByTagName(\"head\")[0];\n            if (!ib) {\n                return;\n            }\n        ;\n        ;\n            var jb = ((((gb && ((typeof gb == \"string\")))) ? gb : \"JSBNG__screen\"));\n            if (hb) {\n                ca = null;\n                da = null;\n            }\n        ;\n        ;\n            if (((!ca || ((da != jb))))) {\n                var kb = xa(\"style\");\n                kb.setAttribute(\"type\", \"text/css\");\n                kb.setAttribute(\"media\", jb);\n                ca = ib.appendChild(kb);\n                if (((((((fa.ie && fa.win)) && ((typeof p.styleSheets != h)))) && ((p.styleSheets.length > 0))))) {\n                    ca = p.styleSheets[((p.styleSheets.length - 1))];\n                }\n            ;\n            ;\n                da = jb;\n            }\n        ;\n        ;\n            if (((fa.ie && fa.win))) {\n                if (((ca && ((typeof ca.addRule == i))))) {\n                    ca.addRule(eb, fb);\n                }\n            ;\n            ;\n            }\n             else if (((ca && ((typeof p.createTextNode != h))))) {\n                ca.appendChild(p.createTextNode(((((((eb + \" {\")) + fb)) + \"}\"))));\n            }\n            \n        ;\n        ;\n        };\n    ;\n        function bb(eb, fb) {\n            if (!ea) {\n                return;\n            }\n        ;\n        ;\n            var gb = ((fb ? \"visible\" : \"hidden\"));\n            if (((aa && wa(eb)))) {\n                wa(eb).style.visibility = gb;\n            }\n             else ab(((\"#\" + eb)), ((\"visibility:\" + gb)));\n        ;\n        ;\n        };\n    ;\n        function cb(eb) {\n            var fb = /[\\\\\\\"<>\\.;]/, gb = ((fb.exec(eb) != null));\n            return ((((gb && ((typeof encodeURIComponent != h)))) ? encodeURIComponent(eb) : eb));\n        };\n    ;\n        var db = function() {\n            if (((fa.ie && fa.win))) {\n                window.JSBNG__attachEvent(\"JSBNG__onunload\", function() {\n                    var eb = v.length;\n                    for (var fb = 0; ((fb < eb)); fb++) {\n                        v[fb][0].JSBNG__detachEvent(v[fb][1], v[fb][2]);\n                    ;\n                    };\n                ;\n                    var gb = u.length;\n                    for (var hb = 0; ((hb < gb)); hb++) {\n                        ua(u[hb]);\n                    ;\n                    };\n                ;\n                    {\n                        var fin231keys = ((window.top.JSBNG_Replay.forInKeys)((fa))), fin231i = (0);\n                        var ib;\n                        for (; (fin231i < fin231keys.length); (fin231i++)) {\n                            ((ib) = (fin231keys[fin231i]));\n                            {\n                                fa[ib] = null;\n                            ;\n                            };\n                        };\n                    };\n                ;\n                    fa = null;\n                    {\n                        var fin232keys = ((window.top.JSBNG_Replay.forInKeys)((g))), fin232i = (0);\n                        var jb;\n                        for (; (fin232i < fin232keys.length); (fin232i++)) {\n                            ((jb) = (fin232keys[fin232i]));\n                            {\n                                g[jb] = null;\n                            ;\n                            };\n                        };\n                    };\n                ;\n                    g = null;\n                });\n            }\n        ;\n        ;\n        }();\n        return {\n            registerObject: function(eb, fb, gb, hb) {\n                if (((((fa.w3 && eb)) && fb))) {\n                    var ib = {\n                    };\n                    ib.id = eb;\n                    ib.swfVersion = fb;\n                    ib.expressInstall = gb;\n                    ib.callbackFn = hb;\n                    t[t.length] = ib;\n                    bb(eb, false);\n                }\n                 else if (hb) {\n                    hb({\n                        success: false,\n                        id: eb\n                    });\n                }\n                \n            ;\n            ;\n            },\n            getObjectById: function(eb) {\n                if (fa.w3) {\n                    return na(eb);\n                }\n            ;\n            ;\n            },\n            embedSWF: function(eb, fb, gb, hb, ib, jb, kb, lb, mb, nb) {\n                var ob = {\n                    success: false,\n                    id: fb\n                };\n                if (((((((((((((fa.w3 && !((fa.wk && ((fa.wk < 312)))))) && eb)) && fb)) && gb)) && hb)) && ib))) {\n                    bb(fb, false);\n                    ia(function() {\n                        gb += \"\";\n                        hb += \"\";\n                        var pb = {\n                        };\n                        if (((mb && ((typeof mb === i))))) {\n                            {\n                                var fin233keys = ((window.top.JSBNG_Replay.forInKeys)((mb))), fin233i = (0);\n                                var qb;\n                                for (; (fin233i < fin233keys.length); (fin233i++)) {\n                                    ((qb) = (fin233keys[fin233i]));\n                                    {\n                                        pb[qb] = mb[qb];\n                                    ;\n                                    };\n                                };\n                            };\n                        }\n                    ;\n                    ;\n                        pb.data = eb;\n                        pb.width = gb;\n                        pb.height = hb;\n                        var rb = {\n                        };\n                        if (((lb && ((typeof lb === i))))) {\n                            {\n                                var fin234keys = ((window.top.JSBNG_Replay.forInKeys)((lb))), fin234i = (0);\n                                var sb;\n                                for (; (fin234i < fin234keys.length); (fin234i++)) {\n                                    ((sb) = (fin234keys[fin234i]));\n                                    {\n                                        rb[sb] = lb[sb];\n                                    ;\n                                    };\n                                };\n                            };\n                        }\n                    ;\n                    ;\n                        if (((kb && ((typeof kb === i))))) {\n                            {\n                                var fin235keys = ((window.top.JSBNG_Replay.forInKeys)((kb))), fin235i = (0);\n                                var tb;\n                                for (; (fin235i < fin235keys.length); (fin235i++)) {\n                                    ((tb) = (fin235keys[fin235i]));\n                                    {\n                                        if (((typeof rb.flashvars != h))) {\n                                            rb.flashvars += ((((((\"&\" + tb)) + \"=\")) + kb[tb]));\n                                        }\n                                         else rb.flashvars = ((((tb + \"=\")) + kb[tb]));\n                                    ;\n                                    ;\n                                    };\n                                };\n                            };\n                        }\n                    ;\n                    ;\n                        if (za(ib)) {\n                            var ub = sa(pb, rb, fb);\n                            if (((pb.id == fb))) {\n                                bb(fb, true);\n                            }\n                        ;\n                        ;\n                            ob.success = true;\n                            ob.ref = ub;\n                        }\n                         else if (((jb && oa()))) {\n                            pb.data = jb;\n                            pa(pb, rb, fb, nb);\n                            return;\n                        }\n                         else bb(fb, true);\n                        \n                    ;\n                    ;\n                        if (nb) {\n                            nb(ob);\n                        }\n                    ;\n                    ;\n                    });\n                }\n                 else if (nb) {\n                    nb(ob);\n                }\n                \n            ;\n            ;\n            },\n            switchOffAutoHideShow: function() {\n                ea = false;\n            },\n            ua: fa,\n            getFlashPlayerVersion: function() {\n                return {\n                    major: fa.pv[0],\n                    minor: fa.pv[1],\n                    release: fa.pv[2]\n                };\n            },\n            hasFlashPlayerVersion: za,\n            createSWF: function(eb, fb, gb) {\n                if (fa.w3) {\n                    return sa(eb, fb, gb);\n                }\n                 else return undefined\n            ;\n            },\n            showExpressInstall: function(eb, fb, gb, hb) {\n                if (((fa.w3 && oa()))) {\n                    pa(eb, fb, gb, hb);\n                }\n            ;\n            ;\n            },\n            removeSWF: function(eb) {\n                if (fa.w3) {\n                    ua(eb);\n                }\n            ;\n            ;\n            },\n            createCSS: function(eb, fb, gb, hb) {\n                if (fa.w3) {\n                    ab(eb, fb, gb, hb);\n                }\n            ;\n            ;\n            },\n            addDomLoadEvent: ia,\n            addLoadEvent: ja,\n            getQueryParamValue: function(eb) {\n                var fb = ((p.JSBNG__location.search || p.JSBNG__location.hash));\n                if (fb) {\n                    if (/\\?/.test(fb)) {\n                        fb = fb.split(\"?\")[1];\n                    }\n                ;\n                ;\n                    if (((eb == null))) {\n                        return cb(fb);\n                    }\n                ;\n                ;\n                    var gb = fb.split(\"&\");\n                    for (var hb = 0; ((hb < gb.length)); hb++) {\n                        if (((gb[hb].substring(0, gb[hb].indexOf(\"=\")) == eb))) {\n                            return cb(gb[hb].substring(((gb[hb].indexOf(\"=\") + 1))));\n                        }\n                    ;\n                    ;\n                    };\n                ;\n                }\n            ;\n            ;\n                return \"\";\n            },\n            expressInstallCallback: function() {\n                if (ba) {\n                    var eb = wa(m);\n                    if (((eb && w))) {\n                        eb.parentNode.replaceChild(w, eb);\n                        if (x) {\n                            bb(x, true);\n                            if (((fa.ie && fa.win))) {\n                                w.style.display = \"block\";\n                            }\n                        ;\n                        ;\n                        }\n                    ;\n                    ;\n                        if (y) {\n                            y(z);\n                        }\n                    ;\n                    ;\n                    }\n                ;\n                ;\n                    ba = false;\n                }\n            ;\n            ;\n            }\n        };\n    }();\n    e.exports = g;\n});\n__d(\"SoundPlayer\", [\"Arbiter\",\"ChatConfig\",\"swfobject\",\"swfobject2\",\"URI\",\"createArrayFrom\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ChatConfig\"), i = b(\"swfobject\").SWFObject, j = b(\"swfobject2\"), k = b(\"URI\"), l = b(\"createArrayFrom\"), m = {\n    }, n = null, o = false, p = \"so_sound_player\", q = \"/swf/SoundPlayer.swf?v=1\", r = \"10.0.22.87\", s = null, t = h.get(\"sound.useswfobject_2\", false), u = h.get(\"sound.force_flash\", false);\n    function v(da) {\n        var ea = k(da);\n        if (!ea.getDomain()) {\n            return k().setPath(ea.getPath()).toString();\n        }\n    ;\n    ;\n        return da;\n    };\n;\n    function w(da) {\n        var ea = k(da).getPath();\n        if (/\\.mp3$/.test(ea)) {\n            return \"audio/mpeg\";\n        }\n    ;\n    ;\n        if (/\\.og[ga]$/.test(ea)) {\n            return \"audio/ogg\";\n        }\n    ;\n    ;\n        return \"\";\n    };\n;\n    function x() {\n        if (((!s && !u))) {\n            var da = JSBNG__document.createElement(\"audio\");\n            if (((!da || !da.canPlayType))) {\n                return null;\n            }\n        ;\n        ;\n            da.setAttribute(\"preload\", \"auto\");\n            JSBNG__document.body.appendChild(da);\n            s = da;\n        }\n    ;\n    ;\n        return s;\n    };\n;\n    function y() {\n        var da = ((JSBNG__document[p] || window[p]));\n        if (da) {\n            if (((!da.playSound && da.length))) {\n                da = da[0];\n            }\n        ;\n        }\n    ;\n    ;\n        return ((((((da && da.playSound)) && da.loopSound)) ? da : null));\n    };\n;\n    function z() {\n        return o;\n    };\n;\n    function aa(da, ea, fa) {\n        n = {\n            path: da,\n            sync: ea,\n            loop: fa\n        };\n    };\n;\n    function ba() {\n        o = true;\n        if (n) {\n            var da = y();\n            if (n.loop) {\n                da.loopSound(n.path, n.sync);\n            }\n             else da.playSound(n.path, n.sync);\n        ;\n        ;\n        }\n    ;\n    ;\n    };\n;\n    var ca = {\n        init: function(da) {\n            da = l(da);\n            var ea;\n            for (var fa = 0; ((fa < da.length)); ++fa) {\n                ea = da[fa];\n                if (m[ea]) {\n                    return;\n                }\n            ;\n            ;\n            };\n        ;\n            var ga = x();\n            for (fa = 0; ((ga && ((fa < da.length)))); ++fa) {\n                ea = da[fa];\n                if (ga.canPlayType(ea)) {\n                    m[ea] = true;\n                    return;\n                }\n            ;\n            ;\n            };\n        ;\n            m[\"audio/mpeg\"] = true;\n            if (y()) {\n                return;\n            }\n        ;\n        ;\n            try {\n                g.registerCallback(ba, [\"sound/player_ready\",\"sound/ready\",]);\n                var ia = JSBNG__document.createElement(\"div\");\n                ia.id = \"sound_player_holder\";\n                JSBNG__document.body.appendChild(ia);\n                if (t) {\n                    j.embedSWF(q, ia.id, \"1px\", \"1px\", r, null, {\n                        swf_id: p\n                    }, {\n                        allowscriptaccess: \"always\",\n                        wmode: \"transparent\"\n                    }, null, function(ka) {\n                        window[p] = ka.ref;\n                        g.inform(\"sound/player_ready\");\n                    });\n                }\n                 else {\n                    var ja = new i(q, p, \"1px\", \"1px\", [r,], \"#ffffff\");\n                    ja.addParam(\"allowscriptaccess\", \"always\");\n                    ja.addParam(\"wmode\", \"transparent\");\n                    ja.addVariable(\"swf_id\", p);\n                    ja.fallback_html = \" \";\n                    ja.write(ia.id);\n                    window[p] = ja;\n                    g.inform(\"sound/player_ready\");\n                }\n            ;\n            ;\n            } catch (ha) {\n            \n            };\n        ;\n        },\n        play: function(da, ea) {\n            da = l(da);\n            var fa = x(), ga, ha;\n            for (var ia = 0; ((fa && ((ia < da.length)))); ++ia) {\n                ga = da[ia];\n                ha = w(ga);\n                if (!fa.canPlayType(ha)) {\n                    continue;\n                }\n            ;\n            ;\n                ca.init([ha,]);\n                fa.src = v(ga);\n                if (ea) {\n                    fa.setAttribute(\"loop\", \"\");\n                }\n                 else fa.removeAttribute(\"loop\");\n            ;\n            ;\n                fa.play();\n                return;\n            };\n        ;\n            for (ia = 0; ((ia < da.length)); ++ia) {\n                ga = v(da[ia]);\n                ha = w(ga);\n                if (((ha != \"audio/mpeg\"))) {\n                    continue;\n                }\n            ;\n            ;\n                ca.init([ha,]);\n                var ja = y();\n                if (!z()) {\n                    aa(ga, true, ea);\n                    return;\n                }\n                 else if (ja) {\n                    if (ea) {\n                        ja.loopSound(ga, true);\n                    }\n                     else ja.playSound(ga, true);\n                ;\n                ;\n                    return;\n                }\n                \n            ;\n            ;\n            };\n        ;\n        },\n        JSBNG__stop: function(da) {\n            da = l(da);\n            for (var ea = 0; ((ea < da.length)); ++ea) {\n                var fa = v(da[ea]), ga = x(), ha = y();\n                if (((ga && ((ga.src == fa))))) {\n                    ga.pause();\n                    ga.src = undefined;\n                }\n                 else ((ha && ha.stopSound(fa)));\n            ;\n            ;\n            };\n        ;\n        }\n    };\n    e.exports = ca;\n});\n__d(\"SoundSynchronizer\", [\"hasArrayNature\",\"SoundPlayer\",\"createArrayFrom\",], function(a, b, c, d, e, f) {\n    var g = b(\"hasArrayNature\"), h = b(\"SoundPlayer\"), i = b(\"createArrayFrom\"), j = \"fb_sounds_playing3\";\n    function k() {\n        if (window.JSBNG__localStorage) {\n            try {\n                var p = window.JSBNG__localStorage[j];\n                if (p) {\n                    p = JSON.parse(p);\n                    if (g(p)) {\n                        return p;\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n            } catch (o) {\n            \n            };\n        }\n    ;\n    ;\n        return [];\n    };\n;\n    function l(o) {\n        if (window.JSBNG__localStorage) {\n            var p = k();\n            p.push(o);\n            while (((p.length > 5))) {\n                p.shift();\n            ;\n            };\n        ;\n            try {\n                window.JSBNG__localStorage[j] = JSON.stringify(p);\n            } catch (q) {\n            \n            };\n        ;\n        }\n    ;\n    ;\n    };\n;\n    function m(o) {\n        return k().some(function(p) {\n            return ((p === o));\n        });\n    };\n;\n    var n = {\n        play: function(o, p, q) {\n            o = i(o);\n            p = ((p || ((o[0] + Math.floor(((JSBNG__Date.now() / 1000)))))));\n            if (m(p)) {\n                return;\n            }\n        ;\n        ;\n            h.play(o, q);\n            l(p);\n        },\n        isSupported: function() {\n            return !!window.JSBNG__localStorage;\n        }\n    };\n    e.exports = n;\n});\n__d(\"SoundRPC\", [\"JSBNG__Event\",\"SoundSynchronizer\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"SoundSynchronizer\");\n    function i(k, l, m) {\n        h.play(k, l, m);\n    };\n;\n    var j = {\n        playLocal: i,\n        playRemote: function(k, l, m, n) {\n            var o = {\n                paths: l,\n                sync: m,\n                loop: n\n            };\n            k.JSBNG__postMessage(JSON.stringify(o), \"*\");\n        },\n        supportsRPC: function() {\n            return !!window.JSBNG__postMessage;\n        },\n        _listen: function() {\n            g.listen(window, \"message\", function(k) {\n                if (!/\\.facebook.com$/.test(k.origin)) {\n                    return;\n                }\n            ;\n            ;\n                var l = JSON.parse(k.data);\n                i(l.paths, l.sync, l.loop);\n            });\n        }\n    };\n    e.exports = j;\n});\n__d(\"Sound\", [\"SoundPlayer\",\"SoundRPC\",\"SoundSynchronizer\",\"URI\",\"UserAgent\",], function(a, b, c, d, e, f) {\n    var g = b(\"SoundPlayer\"), h = b(\"SoundRPC\"), i = b(\"SoundSynchronizer\"), j = b(\"URI\"), k = b(\"UserAgent\"), l = null, m = {\n        init: function(q) {\n            if (!l) {\n                g.init(q);\n            }\n        ;\n        ;\n        },\n        play: function(q, r, s) {\n            if (l) {\n                h.playRemote(l.contentWindow, q, r, false);\n            }\n             else h.playLocal(q, r, s);\n        ;\n        ;\n        },\n        JSBNG__stop: function(q) {\n            if (!l) {\n                g.JSBNG__stop(q);\n            }\n        ;\n        ;\n        }\n    }, n = new j(JSBNG__location.href);\n    if (((n.getSubdomain() && ((n.getSubdomain() !== \"www\"))))) {\n        n.setSubdomain(\"www\");\n    }\n;\n;\n    var o = n.getDomain();\n    function p() {\n        if (((k.ie() < 9))) {\n            return false;\n        }\n    ;\n    ;\n        return ((i.isSupported() && h.supportsRPC()));\n    };\n;\n    if (((((n.isFacebookURI() && ((JSBNG__location.host !== o)))) && p()))) {\n        l = JSBNG__document.createElement(\"div\");\n        l.setAttribute(\"src\", ((((\"//\" + o)) + \"/sound_iframe.php\")));\n        l.style.display = \"none\";\n        JSBNG__document.body.appendChild(l);\n    }\n;\n;\n    e.exports = m;\n});\n__d(\"MercuryBrowserAlerts\", [\"ArbiterMixin\",\"ChatActivity\",\"ChatConfig\",\"ChatOptions\",\"ChatTitleBarBlinker\",\"MercuryParticipants\",\"MercuryThreadMuter\",\"MercuryThreads\",\"MessagingTag\",\"Sound\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"ArbiterMixin\"), h = b(\"ChatActivity\"), i = b(\"ChatConfig\"), j = b(\"ChatOptions\"), k = b(\"ChatTitleBarBlinker\"), l = b(\"MercuryParticipants\"), m = b(\"MercuryThreadMuter\"), n = b(\"MercuryThreads\").get(), o = b(\"MessagingTag\"), p = b(\"Sound\"), q = b(\"copyProperties\");\n    p.init([\"audio/ogg\",\"audio/mpeg\",]);\n    function r(t) {\n        if (j.getSetting(\"sound\")) {\n            p.play([i.get(\"sound.notif_ogg_url\"),i.get(\"sound.notif_mp3_url\"),], t, false);\n        }\n    ;\n    ;\n    };\n;\n    var s = {\n        messageReceived: function(t) {\n            if (((((((t.author == l.user)) || !t.is_unread)) || ((((t.folder != o.INBOX)) && ((t.folder != o.ARCHIVED))))))) {\n                return;\n            }\n        ;\n        ;\n            var u = t.thread_id, v = h.isActive();\n            if (v) {\n                var w = false;\n                s.inform(\"before-alert\", {\n                    threadID: u,\n                    cancelAlert: function() {\n                        w = true;\n                    }\n                });\n            }\n        ;\n        ;\n            n.getThreadMeta(u, function(x) {\n                var y = m.isThreadMuted(x);\n                if (y) {\n                    return;\n                }\n            ;\n            ;\n                var z = t.timestamp;\n                if (v) {\n                    ((!w && r(z)));\n                }\n                 else {\n                    k.blink(u, z);\n                    r(z);\n                }\n            ;\n            ;\n                k.blinkingElsewhere();\n            }.bind(this));\n        }\n    };\n    e.exports = q(s, g);\n});\n__d(\"ActiveXSupport\", [], function(a, b, c, d, e, f) {\n    var g = null, h = {\n        isSupported: function() {\n            if (((g !== null))) {\n                return g;\n            }\n        ;\n        ;\n            try {\n                g = ((!!window.ActiveXObject && !!new ActiveXObject(\"htmlfile\")));\n            } catch (i) {\n                g = false;\n            };\n        ;\n            return g;\n        }\n    };\n    e.exports = h;\n});\n__d(\"VideoCallSupport\", [\"MercuryConfig\",\"UserAgent\",], function(a, b, c, d, e, f) {\n    var g = b(\"MercuryConfig\"), h = b(\"UserAgent\"), i = {\n        newVCIsSupported: function() {\n            return ((g.NewVCGK && ((((h.chrome() >= 24)) || ((h.firefox() >= 22))))));\n        }\n    };\n    e.exports = i;\n});\n__d(\"VideoCallRecordMessageDialog\", [\"AsyncDialog\",\"AsyncRequest\",\"Dialog\",\"URI\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncDialog\"), h = b(\"AsyncRequest\"), i = b(\"Dialog\"), j = b(\"URI\"), k = b(\"tx\"), l = {\n        get: function(m, n) {\n            var o = \"Would you like to leave a message?\", p = \"New Message\";\n            return new i().setTitle(k._(\"{firstname} is Unavailable\", {\n                firstname: n\n            })).setBody(o).setButtons([{\n                JSBNG__name: \"record-message\",\n                label: p\n            },i.CANCEL,]).setHandler(function() {\n                var q = j(\"/ajax/messaging/composer.php\").setQueryData({\n                    ids: [m,],\n                    autoloadvideo: true\n                }).toString();\n                g.send(new h(q));\n            });\n        }\n    };\n    e.exports = l;\n});\n__d(\"VideoCallCore\", [\"JSBNG__Event\",\"ActiveXSupport\",\"Arbiter\",\"AsyncRequest\",\"AvailableList\",\"AvailableListConstants\",\"Bootloader\",\"ChannelConstants\",\"Cookie\",\"CSS\",\"Dialog\",\"MercuryConfig\",\"UserAgent\",\"VideoCallSupport\",\"emptyFunction\",\"ge\",\"VideoCallTemplates\",\"ShortProfiles\",\"VideoCallRecordMessageDialog\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"ActiveXSupport\"), i = b(\"Arbiter\"), j = b(\"AsyncRequest\"), k = b(\"AvailableList\"), l = b(\"AvailableListConstants\"), m = b(\"Bootloader\"), n = b(\"ChannelConstants\"), o = b(\"Cookie\"), p = b(\"CSS\"), q = b(\"Dialog\"), r = b(\"MercuryConfig\"), s = b(\"UserAgent\"), t = b(\"VideoCallSupport\"), u = b(\"emptyFunction\"), v = b(\"ge\");\n    b(\"VideoCallTemplates\");\n    var w = [], x = [], y = {\n        isSupported: function() {\n            if (t.newVCIsSupported()) {\n                return true;\n            }\n        ;\n        ;\n            if (s.windows()) {\n                if (((((s.ie() >= 9)) && !s.ie64()))) {\n                    return h.isSupported();\n                }\n                 else return ((((((((((s.ie() >= 7)) && !s.ie64())) || ((s.firefox() >= 3.6)))) || ((s.chrome() >= 5)))) || ((s.JSBNG__opera() >= 12))))\n            ;\n            }\n             else if (((s.osx() > 10.4))) {\n                return ((((((((s.firefox() >= 3.6)) || ((s.chrome() >= 5)))) || ((s.webkit() >= 500)))) || ((s.JSBNG__opera() >= 12))));\n            }\n            \n        ;\n        ;\n            return false;\n        },\n        isInstalled: function() {\n            var ca = false;\n            if (this.isSupported()) {\n                if (z()) {\n                    var da = null;\n                    try {\n                        da = new ActiveXObject(\"SkypeLimited.SkypeWebPlugin\");\n                        ca = !!da;\n                    } catch (ea) {\n                    \n                    };\n                ;\n                    da = null;\n                }\n                 else {\n                    ca = aa();\n                    if (r.VideoCallingNoJavaGK) {\n                        if (((ca && ((s.osx() >= 10.8))))) {\n                            if (((ca.description && ((ca.description.charAt(0) != \"v\"))))) {\n                                ca = false;\n                            }\n                        ;\n                        }\n                    ;\n                    }\n                ;\n                ;\n                }\n            ;\n            }\n        ;\n        ;\n            return ca;\n        },\n        mightReloadPostInstall: function() {\n            return s.windows();\n        },\n        onVideoMessage: function(ca) {\n            w.push(ca);\n            m.loadModules([\"VideoCallController\",], u);\n        },\n        onRTCMessage: function(ca) {\n            if (t.newVCIsSupported()) {\n                x.push(ca);\n                m.loadModules([\"FBRTCCallController\",], u);\n            }\n        ;\n        ;\n        },\n        setMessageHandler: function(ca) {\n            this.onVideoMessage = ca;\n            if (ca) {\n                while (w.length) {\n                    ca(w.shift());\n                ;\n                };\n            }\n        ;\n        ;\n        },\n        setRTCMessageHandler: function(ca) {\n            this.onRTCMessage = ca;\n            if (ca) {\n                while (x.length) {\n                    ca(x.shift());\n                ;\n                };\n            }\n        ;\n        ;\n        },\n        availableForCall: function(ca) {\n            var da = k.get(ca);\n            return ((((da == l.ACTIVE)) || ((da == l.IDLE))));\n        },\n        onProfileButtonClick: function(ca) {\n            y.startCallOrLeaveMessage(ca, \"profile_button_click\");\n        },\n        attachListenerToProfileButton: function(ca) {\n            var da = v(\"videoCallProfileButton\");\n            if (da) {\n                if (!y.isSupported()) {\n                    p.hide(da);\n                    return;\n                }\n            ;\n            ;\n                g.listen(da, \"click\", function(JSBNG__event) {\n                    y.startCallOrLeaveMessage(ca, \"profile_button_click_timeline\");\n                });\n            }\n        ;\n        ;\n        },\n        startCallOrLeaveMessage: function(ca, da) {\n            if (this.availableForCall(ca)) {\n                y.showOutgoingCallDialog(ca, da);\n            }\n             else b(\"ShortProfiles\").get(ca, function(ea) {\n                b(\"VideoCallRecordMessageDialog\").get(ca, ea.firstName).show();\n            });\n        ;\n        ;\n        },\n        showOutgoingCallDialog: function(ca, da) {\n            var ea = ((da || \"unknown\"));\n            y.logClick(ca, ea);\n            var fa = ((((y.isInstalled() || r.NewVCGK)) ? \"outgoing_dialog.php\" : \"intro.php\")), ga = ((((((\"/ajax/chat/video/\" + fa)) + \"?idTarget=\")) + ca));\n            new q().setAllowCrossPageTransition(true).setAsync(new j(ga)).show();\n        },\n        logClick: function(ca, da) {\n            new j().setURI(\"/ajax/chat/video/log_click.php\").setData({\n                targetUserID: ca,\n                clickSource: da\n            }).setAllowCrossPageTransition(true).setErrorHandler(u).send();\n        }\n    };\n    function z() {\n        return ((((s.ie() && s.windows())) && !s.JSBNG__opera()));\n    };\n;\n    function aa() {\n        if (!JSBNG__navigator) {\n            return null;\n        }\n    ;\n    ;\n        JSBNG__navigator.plugins.refresh(false);\n        var ca = JSBNG__navigator.mimeTypes[\"application/skypesdk-plugin\"];\n        return ((ca && ca.enabledPlugin));\n    };\n;\n    function ba() {\n        if (!y.mightReloadPostInstall()) {\n            return;\n        }\n    ;\n    ;\n        var ca = o.get(\"vcpwn\");\n        if (ca) {\n            o.clear(\"vcpwn\");\n            var da = o.get(\"vctid\");\n            if (da) {\n                o.clear(\"vctid\");\n                if (o.get(\"vctid\")) {\n                    return;\n                }\n            ;\n            ;\n                if (((da && y.isInstalled()))) {\n                    var ea = ((\"/ajax/chat/video/outgoing_dialog.php?idTarget=\" + da));\n                    new q().setAllowCrossPageTransition(true).setAsync(new j(ea)).show();\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n    };\n;\n    i.subscribe(n.getArbiterType(\"video\"), function(ca, da) {\n        y.onVideoMessage(da.obj);\n    });\n    i.subscribe(n.getArbiterType(\"webrtc\"), function(ca, da) {\n        y.onRTCMessage(da.obj);\n    });\n    i.subscribe(n.getArbiterType(\"chat_event\"), function(ca, da) {\n        if (((da.obj.event_name == \"missed-call\"))) {\n            m.loadModules([\"VideoCallController\",], function(ea) {\n                ea.onMissedCallEvent(da.obj);\n            });\n        }\n    ;\n    ;\n    });\n    ba();\n    e.exports = y;\n});\n__d(\"ChatApp\", [\"CSS\",\"JSLogger\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSS\"), h = b(\"JSLogger\"), i = false, j = false, k = false, l = null, m = {\n        init: function(n, o, p) {\n            if (l) {\n                h.create(\"chat_app\").error(\"repeated_init\");\n                return;\n            }\n        ;\n        ;\n            l = n;\n            d([\"TabsViewport\",\"ChatTabController\",\"ChatTabViewCoordinator\",\"MercuryServerRequests\",\"MercuryChannelHandler\",\"MercuryStateCheck\",], function(q, r, s, t, u, v) {\n                t.get().handleUpdate(p);\n                this.tabsViewport = new q(o);\n                this.tabController = new r(this.tabsViewport);\n                this.tabViewCoordinator = new s(o, this.tabsViewport);\n                i = j = true;\n            }.bind(this));\n        },\n        hide: function() {\n            if (((!i || k))) {\n                return;\n            }\n        ;\n        ;\n            g.hide(l);\n            k = true;\n        },\n        unhide: function() {\n            if (i) {\n                if (k) {\n                    g.show(l);\n                    this.tabsViewport.checkWidth();\n                    d([\"Dock\",], function(n) {\n                        n.resizeAllFlyouts();\n                    });\n                    k = false;\n                }\n            ;\n            ;\n            }\n             else if (!j) {\n                d([\"UIPagelet\",], function(n) {\n                    n.loadFromEndpoint(\"ChatTabsPagelet\", \"ChatTabsPagelet\");\n                    n.loadFromEndpoint(\"BuddylistPagelet\", \"BuddylistPagelet\");\n                });\n                j = true;\n            }\n            \n        ;\n        ;\n        }\n    };\n    e.exports = m;\n});\n__d(\"DataViewPolyfill\", [\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"copyProperties\");\n    function h(i, j, k) {\n        if (((j === undefined))) {\n            this._ba = new JSBNG__Uint8Array(i);\n        }\n         else if (((k === undefined))) {\n            this._ba = new JSBNG__Uint8Array(i, j);\n        }\n         else this._ba = new JSBNG__Uint8Array(i, j, k);\n        \n    ;\n    ;\n        this.byteLength = this._ba.byteLength;\n    };\n;\n    g(h, {\n        isSupported: function() {\n            return !!a.JSBNG__Uint8Array;\n        }\n    });\n    g(h.prototype, {\n        getUint8: function(i) {\n            if (((i >= this._ba.length))) {\n                throw new Error(\"Trying to read beyond bounds of DataViewPolyfill\");\n            }\n        ;\n        ;\n            return this._ba[i];\n        },\n        getUint16: function(i, j) {\n            var k = this.getUint8(i), l = this.getUint8(((i + 1)));\n            return ((j ? ((((l * 256)) + k)) : ((((k * 256)) + l))));\n        },\n        getUint32: function(i, j) {\n            var k = this.getUint8(i), l = this.getUint8(((i + 1))), m = this.getUint8(((i + 2))), n = this.getUint8(((i + 3)));\n            return ((j ? ((((((((((((n * 256)) + m)) * 256)) + l)) * 256)) + k)) : ((((((((((((k * 256)) + l)) * 256)) + m)) * 256)) + n))));\n        }\n    });\n    e.exports = h;\n});\n__d(\"getImageSize\", [\"DataViewPolyfill\",], function(a, b, c, d, e, f) {\n    var g = b(\"DataViewPolyfill\"), h = ((a.JSBNG__DataView || g));\n    function i(m) {\n        return {\n            width: m.getUint16(6, true),\n            height: m.getUint16(8, true)\n        };\n    };\n;\n    function j(m) {\n        return {\n            width: m.getUint32(16, false),\n            height: m.getUint32(20, false)\n        };\n    };\n;\n    function k(m) {\n        var n = m.byteLength, o = 2;\n        while (((o < n))) {\n            var p = m.getUint16(o, false);\n            o += 2;\n            if (((((p == 65472)) || ((p == 65474))))) {\n                return {\n                    width: m.getUint16(((o + 5)), false),\n                    height: m.getUint16(((o + 3)), false)\n                };\n            }\n             else o += m.getUint16(o, false);\n        ;\n        ;\n        };\n    ;\n        return null;\n    };\n;\n    function l(m) {\n        var n = new h(m);\n        if (((((n.getUint8(0) == 255)) && ((n.getUint8(1) == 216))))) {\n            return k(n);\n        }\n    ;\n    ;\n        if (((((((n.getUint8(0) == 71)) && ((n.getUint8(1) == 73)))) && ((n.getUint8(2) == 70))))) {\n            return i(n);\n        }\n    ;\n    ;\n        if (((((((((n.getUint8(0) == 137)) && ((n.getUint8(1) == 80)))) && ((n.getUint8(2) == 78)))) && ((n.getUint8(3) == 71))))) {\n            return j(n);\n        }\n    ;\n    ;\n        return null;\n    };\n;\n    e.exports = l;\n    l.gif = i;\n    l.png = j;\n    l.jpeg = k;\n});\n__d(\"ChatAutoSendPhotoUploader\", [\"ArbiterMixin\",\"DOM\",\"JSBNG__Event\",\"FileForm\",\"FileFormResetOnSubmit\",\"FileInput\",\"FormSubmitOnChange\",\"MercuryAttachmentType\",\"SubscriptionsHandler\",\"copyProperties\",\"csx\",\"getImageSize\",\"removeFromArray\",\"shield\",], function(a, b, c, d, e, f) {\n    var g = b(\"ArbiterMixin\"), h = b(\"DOM\"), i = b(\"JSBNG__Event\"), j = b(\"FileForm\"), k = b(\"FileFormResetOnSubmit\"), l = b(\"FileInput\"), m = b(\"FormSubmitOnChange\"), n = b(\"MercuryAttachmentType\"), o = b(\"SubscriptionsHandler\"), p = b(\"copyProperties\"), q = b(\"csx\"), r = b(\"getImageSize\"), s = b(\"removeFromArray\"), t = b(\"shield\"), u = 0;\n    function v(w, x, y) {\n        this._idElem = y;\n        this._input = x;\n        this._subscriptionsHandler = new o();\n        this._uploadBatches = [];\n        var z = new j(w, [m,k,]), aa = h.JSBNG__find(w, \"._4q60\"), ba = h.JSBNG__find(aa, \"._4q61\");\n        new l(aa, ba, x);\n        this._subscriptionsHandler.addSubscriptions(z.subscribe(\"submit\", this._onFileSubmit.bind(this)), z.subscribe(\"success\", this._onFileUploadSuccess.bind(this)), z.subscribe(\"failure\", this._onFileUploadFailure.bind(this)), i.listen(ba, \"click\", t(this.inform, this, \"open\")));\n    };\n;\n    p(v.prototype, g, {\n        isUploading: function() {\n            return ((this._uploadBatches.length > 0));\n        },\n        destroy: function() {\n            this._subscriptionsHandler.release();\n        },\n        _getPreviewAttachment: function(w) {\n            var x = {\n                attach_type: n.PHOTO,\n                preview_uploading: true\n            };\n            if (w) {\n                x.preview_width = w.width;\n                x.preview_height = w.height;\n            }\n        ;\n        ;\n            return x;\n        },\n        _onFileSubmit: function() {\n            u += 1;\n            var w = ((\"upload_\" + u));\n            this._idElem.value = w;\n            this._uploadBatches.push(w);\n            if (((((((((typeof JSBNG__FileReader !== \"undefined\")) && JSBNG__FileReader.prototype.readAsArrayBuffer)) && this._input.files)) && ((this._input.files.length === 1))))) {\n                var x = new JSBNG__FileReader();\n                x.JSBNG__onload = function() {\n                    this.inform(\"submit\", {\n                        upload_id: w,\n                        raw_attachments: [this._getPreviewAttachment(r(x.result)),]\n                    });\n                }.bind(this);\n                x.JSBNG__onerror = function() {\n                    this.inform(\"submit\", {\n                        upload_id: w,\n                        raw_attachments: [this._getPreviewAttachment(null),]\n                    });\n                }.bind(this);\n                x.readAsArrayBuffer(this._input.files[0]);\n            }\n             else {\n                var y = 1;\n                if (this._input.files) {\n                    y = this._input.files.length;\n                }\n            ;\n            ;\n                var z = [];\n                for (var aa = 0; ((aa < y)); ++aa) {\n                    z.push(this._getPreviewAttachment(null));\n                ;\n                };\n            ;\n                this.inform(\"submit\", {\n                    upload_id: w,\n                    raw_attachments: z\n                });\n            }\n        ;\n        ;\n        },\n        _onFileUploadSuccess: function(JSBNG__event, w) {\n            var x = w.response.getPayload(), y = x.uploadID;\n            s(this._uploadBatches, y);\n            var z = [];\n            x.metadata.forEach(function(aa) {\n                z.push(aa.image_id);\n            });\n            this.inform(\"all-uploads-completed\", {\n                upload_id: x.uploadID,\n                image_ids: z\n            });\n        },\n        _onFileUploadFailure: function(JSBNG__event, w) {\n            var x = this._uploadBatches[((this._uploadBatches.length - 1))];\n            s(this._uploadBatches, x);\n            this.inform(\"all-uploads-failed\", {\n                upload_id: x\n            });\n        }\n    });\n    e.exports = v;\n});\n__d(\"ChatTabModel\", [\"function-extensions\",\"Arbiter\",\"ArbiterMixin\",\"ChatBehavior\",\"ChatConfig\",\"JSLogger\",\"MercuryAssert\",\"MercuryServerRequests\",\"MercuryThreads\",\"MercuryTimestampTracker\",\"PresenceInitialData\",\"PresenceState\",\"PresenceUtil\",\"areObjectsEqual\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    b(\"function-extensions\");\n    var g = b(\"Arbiter\"), h = b(\"ArbiterMixin\"), i = b(\"ChatBehavior\"), j = b(\"ChatConfig\"), k = b(\"JSLogger\"), l = b(\"MercuryAssert\"), m = b(\"MercuryServerRequests\").get(), n = b(\"MercuryThreads\").get(), o = b(\"MercuryTimestampTracker\").get(), p = b(\"PresenceInitialData\"), q = b(\"PresenceState\"), r = b(\"PresenceUtil\"), s = b(\"areObjectsEqual\"), t = b(\"copyProperties\"), u = [], v = null, w = null, x = null, y = null;\n    function z() {\n        return parseInt(p.serverTime, 10);\n    };\n;\n    var aa = ((j.get(\"tab_max_load_age\") || 3600000)), ba = ((z() - aa)), ca = 0, da = 20, ea = k.create(\"chat_tab_model\"), fa = false;\n    function ga(xa) {\n        var ya = q.verifyNumber(xa.uct2);\n        if (((!ya || ((typeof ya !== \"number\"))))) {\n            ea.warn(\"bad_cookie_version\", xa.uct2);\n            return null;\n        }\n    ;\n    ;\n        if (((((ya < ca)) || ((ya < ba))))) {\n            return null;\n        }\n    ;\n    ;\n        return ya;\n    };\n;\n    function ha(xa) {\n        var ya = ga(xa);\n        if (!ya) {\n            var za = {\n            };\n            za.old_tabs = ((((xa && xa.t2)) && JSON.stringify(xa.t2)));\n            za.old_promoted = ((xa && xa.lm2));\n            za.old_time = ((xa && xa.uct2));\n            za.old_reason = ((xa && xa.tr));\n            za.old_window = ((xa && xa.tw));\n            var ab;\n            if (((w && xa.t2))) {\n                for (var bb = 0; ((bb < xa.t2.length)); bb++) {\n                    var cb = xa.t2[bb];\n                    if (((cb.i === w))) {\n                        ab = cb.r;\n                    }\n                ;\n                ;\n                };\n            }\n        ;\n        ;\n            var db = [];\n            u.forEach(function(eb) {\n                if (!eb.fragile) {\n                    var fb = {\n                        i: eb.id,\n                        si: eb.server_id\n                    };\n                    if (((eb.raised || ((((eb.id === w)) && ab))))) {\n                        fb.r = 1;\n                    }\n                ;\n                ;\n                    db.push(fb);\n                }\n            ;\n            ;\n            });\n            xa.t2 = db;\n            xa.uct2 = ca;\n            xa.lm2 = v;\n            xa.tr = y;\n            xa.tw = r.getSessionID();\n            za.new_tabs = JSON.stringify(xa.t2);\n            za.new_promoted = xa.lm2;\n            za.new_time = xa.uct2;\n            za.new_reason = xa.tr;\n            za.new_window = xa.tw;\n            ea.debug(\"store\", za);\n        }\n    ;\n    ;\n        return xa;\n    };\n;\n    function ia(xa) {\n        if (xa) {\n            var ya = ga(xa);\n            if (((ya && ((ya !== ca))))) {\n                var za = {\n                };\n                za.old_tabs = JSON.stringify(u);\n                za.old_promoted = v;\n                za.old_time = ca;\n                za.old_reason = y;\n                za.window_id = r.getSessionID();\n                za.cookie_tabs = ((((xa && xa.t2)) && JSON.stringify(xa.t2)));\n                za.cookie_promoted = ((xa && xa.lm2));\n                za.cookie_time = ((xa && xa.uct2));\n                za.cookie_reason = ((xa && xa.tr));\n                za.cookie_window = ((xa && xa.tw));\n                ca = ya;\n                y = \"load\";\n                var ab = ja(xa.t2, ((xa.lm2 || null)));\n                za.load_result = ab;\n                za.new_tabs = JSON.stringify(u);\n                za.new_promoted = v;\n                za.new_time = ca;\n                za.new_reason = y;\n                var JSBNG__event = \"load\";\n                if (!fa) {\n                    JSBNG__event += \"_init\";\n                }\n            ;\n            ;\n                ea.log(JSBNG__event, za);\n                return ab;\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n        return false;\n    };\n;\n    function ja(xa, ya) {\n        if (ka(xa, ya)) {\n            var za = u.filter(function(cb) {\n                return cb.fragile;\n            }), ab = {\n            };\n            v = null;\n            u = xa.map(function(cb) {\n                var db = {\n                    id: cb.i,\n                    server_id: cb.si\n                };\n                if (((db.id == ya))) {\n                    v = db.id;\n                }\n            ;\n            ;\n                if (((w == cb.i))) {\n                    var eb = pa(w);\n                    if (((eb != -1))) {\n                        db.raised = u[eb].raised;\n                        return db;\n                    }\n                     else return null\n                ;\n                }\n            ;\n            ;\n                if (cb.r) {\n                    db.raised = true;\n                }\n            ;\n            ;\n                ab[db.id] = db;\n                return db;\n            });\n            u = u.filter(function(cb) {\n                return ((cb != null));\n            });\n            if (x) {\n                {\n                    var fin236keys = ((window.top.JSBNG_Replay.forInKeys)((x))), fin236i = (0);\n                    var bb;\n                    for (; (fin236i < fin236keys.length); (fin236i++)) {\n                        ((bb) = (fin236keys[fin236i]));\n                        {\n                            if (((!ab[bb] || !ab[bb].raised))) {\n                                delete x[bb];\n                            }\n                        ;\n                        ;\n                        };\n                    };\n                };\n            }\n        ;\n        ;\n            za = za.filter(function(cb) {\n                return !ab[cb.id];\n            });\n            u = u.concat(za);\n            oa();\n            return true;\n        }\n    ;\n    ;\n        return false;\n    };\n;\n    function ka(xa, ya) {\n        if (((ya != v))) {\n            return true;\n        }\n    ;\n    ;\n        var za = u.filter(function(cb) {\n            return !cb.fragile;\n        });\n        if (((xa.length != za.length))) {\n            return true;\n        }\n    ;\n    ;\n        for (var ab = 0, bb = xa.length; ((ab < bb)); ab++) {\n            if (((xa[ab].id === w))) {\n                continue;\n            }\n        ;\n        ;\n            if (!s(xa[ab], za[ab])) {\n                return true;\n            }\n        ;\n        ;\n        };\n    ;\n        return false;\n    };\n;\n    function la(xa, ya, za) {\n        var ab = ia(q.get());\n        if (((((ya === undefined)) || ((ya > ca))))) {\n            if (xa()) {\n                ab = true;\n                y = ((za || null));\n                na(ya);\n            }\n        ;\n        ;\n        }\n         else ea.error(\"rejected\", {\n            change_time: ya,\n            state_time: ca\n        });\n    ;\n    ;\n        ((ab && ma()));\n    };\n;\n    function ma() {\n        if (fa) {\n            va.inform(\"chat/tabs-changed\", va.get());\n        }\n    ;\n    ;\n    };\n;\n    function na(xa) {\n        if (((xa === undefined))) {\n            xa = Math.max(((o.getLastUserMessageTimestamp() || 1)), ((ca + 1)));\n        }\n    ;\n    ;\n        ca = xa;\n        q.doSync();\n    };\n;\n    function oa() {\n        var xa = ((u.length - da));\n        if (((xa > 0))) {\n            u = u.filter(function(ya) {\n                return ((ya.raised || ((xa-- <= 0))));\n            });\n        }\n    ;\n    ;\n    };\n;\n    function pa(xa) {\n        for (var ya = 0; ((ya < u.length)); ya++) {\n            if (((u[ya].id == xa))) {\n                return ya;\n            }\n        ;\n        ;\n        };\n    ;\n        return -1;\n    };\n;\n    function qa(xa, ya) {\n        var za = n.getThreadMetaNow(xa);\n        if (!za) {\n            return false;\n        }\n    ;\n    ;\n        if (za.is_canonical_user) {\n            return sa(xa, ya);\n        }\n         else {\n            var ab = ra(xa);\n            if (ab) {\n                m.getServerThreadID(xa, function(bb) {\n                    if (ta(xa, bb)) {\n                        na();\n                        ma();\n                    }\n                ;\n                ;\n                });\n            }\n        ;\n        ;\n            return ab;\n        }\n    ;\n    ;\n    };\n;\n    function ra(xa) {\n        if (((pa(xa) === -1))) {\n            u.push({\n                id: xa,\n                fragile: true\n            });\n            ea.log(\"open_fragile_tab\", {\n                tabs: JSON.stringify(u),\n                opened: xa,\n                window_id: r.getSessionID()\n            });\n            return true;\n        }\n    ;\n    ;\n        return false;\n    };\n;\n    function sa(xa, ya) {\n        var za = pa(xa);\n        if (((za != -1))) {\n            if (u[za].fragile) {\n                u.splice(za, 1);\n            }\n             else {\n                u[za].signatureID = ya;\n                return true;\n            }\n        ;\n        }\n    ;\n    ;\n        for (var ab = 0; ((ab <= u.length)); ab++) {\n            if (((((ab == u.length)) || u[ab].fragile))) {\n                u.splice(ab, 0, {\n                    id: xa,\n                    signatureID: ya\n                });\n                oa();\n                ea.log(\"open_tab\", {\n                    tabs: JSON.stringify(u),\n                    opened: xa,\n                    window_id: r.getSessionID()\n                });\n                return true;\n            }\n        ;\n        ;\n        };\n    ;\n    };\n;\n    function ta(xa, ya) {\n        var za = pa(xa);\n        if (((((za != -1)) && u[za].fragile))) {\n            var ab = u[za];\n            ab.fragile = false;\n            ab.server_id = ya;\n            var bb = [];\n            u.forEach(function(cb) {\n                if (((cb.id != xa))) {\n                    if (((ab && cb.fragile))) {\n                        bb.push(ab);\n                        ab = null;\n                    }\n                ;\n                ;\n                    bb.push(cb);\n                }\n            ;\n            ;\n            });\n            if (ab) {\n                bb.push(ab);\n            }\n        ;\n        ;\n            u = bb;\n            ea.log(\"make_permanent\", {\n                tabs: JSON.stringify(u),\n                tab_id: xa,\n                window_id: r.getSessionID()\n            });\n            return true;\n        }\n    ;\n    ;\n        return false;\n    };\n;\n    function ua(xa) {\n        var ya = pa(xa);\n        if (((xa == v))) {\n            v = null;\n        }\n    ;\n    ;\n        if (((ya != -1))) {\n            u.splice(ya, 1);\n            ea.log(\"close_tab\", {\n                tabs: JSON.stringify(u),\n                JSBNG__closed: xa,\n                window_id: r.getSessionID()\n            });\n            return true;\n        }\n    ;\n    ;\n        return false;\n    };\n;\n    q.registerStateStorer(ha);\n    q.registerStateLoader(function(xa) {\n        if (ia(xa)) {\n            ma();\n        }\n    ;\n    ;\n    });\n    function va() {\n    \n    };\n;\n    t(va, h, {\n        indexOf: function(xa) {\n            return pa(xa);\n        },\n        getTab: function(xa) {\n            l.isThreadID(xa);\n            var ya = this.indexOf(xa);\n            if (((ya > -1))) {\n                var za = u[ya];\n                return t({\n                }, za);\n            }\n        ;\n        ;\n            return null;\n        },\n        getEmptyTab: function() {\n            for (var xa = 0; ((xa < u.length)); xa++) {\n                var ya = u[xa].id;\n                if (n.isNewEmptyLocalThread(ya)) {\n                    return ya;\n                }\n            ;\n            ;\n            };\n        ;\n            return null;\n        },\n        getServerTime: function() {\n            return z();\n        },\n        closeAllTabs: function() {\n            if (u.length) {\n                ea.log(\"close_all_tabs\", {\n                    closed_tabs: JSON.stringify(u),\n                    window_id: r.getSessionID()\n                });\n                u = [];\n                v = null;\n                if (x) {\n                    x = {\n                    };\n                }\n            ;\n            ;\n                na();\n                ma();\n            }\n        ;\n        ;\n        },\n        closeFragileTabs: function() {\n            var xa = [];\n            for (var ya = 0; ((ya < u.length)); ya++) {\n                if (((u[ya].fragile && !n.isNewEmptyLocalThread(u[ya].id)))) {\n                    xa.push(u[ya]);\n                    u.splice(ya);\n                    ma();\n                    break;\n                }\n            ;\n            ;\n            };\n        ;\n            ea.log(\"close_fragile_tabs\", {\n                tabs: JSON.stringify(u),\n                fragile_closed: xa,\n                window_id: r.getSessionID()\n            });\n        },\n        closeTab: function(xa, ya) {\n            l.isThreadID(xa);\n            var za = false;\n            if (x) {\n                delete x[xa];\n                za = true;\n            }\n        ;\n        ;\n            la(function() {\n                if (ua(xa)) {\n                    za = true;\n                }\n            ;\n            ;\n                return za;\n            }, undefined, ya);\n        },\n        closeTabAndDemote: function(xa, ya, za) {\n            l.isThreadID(xa);\n            var ab = false;\n            if (x) {\n                delete x[xa];\n                ab = true;\n            }\n        ;\n        ;\n            la(function() {\n                if (ua(xa)) {\n                    if (v) {\n                        var bb = pa(v);\n                        if (((bb > ya))) {\n                            var cb = u.splice(bb, 1)[0];\n                            u.splice(ya, 0, cb);\n                            v = null;\n                        }\n                    ;\n                    ;\n                    }\n                ;\n                ;\n                    ab = true;\n                }\n            ;\n            ;\n                return ab;\n            }, undefined, za);\n        },\n        raiseTab: function(xa, ya, za) {\n            l.isThreadID(xa);\n            var ab = false;\n            if (((x && ya))) {\n                x[xa] = true;\n                ab = true;\n            }\n        ;\n        ;\n            if (((!ya && ((xa === w))))) {\n                ((ab && ma()));\n                return;\n            }\n        ;\n        ;\n            la(function() {\n                if (qa(xa, za)) {\n                    ab = true;\n                }\n            ;\n            ;\n                var bb = pa(xa);\n                if (((((bb != -1)) && !u[bb].raised))) {\n                    u[bb].raised = true;\n                    ab = true;\n                    ea.log(\"raise_tab\", {\n                        tabs: JSON.stringify(u),\n                        raised: xa,\n                        window_id: r.getSessionID()\n                    });\n                }\n            ;\n            ;\n                return ab;\n            });\n        },\n        get: function() {\n            var xa = u.map(function(ya) {\n                var za = t({\n                }, ya);\n                delete za.fragile;\n                if (x) {\n                    za.raised = x[za.id];\n                }\n            ;\n            ;\n                return za;\n            });\n            return {\n                tabs: xa,\n                promoted: v\n            };\n        },\n        openFragileTab: function(xa) {\n            l.isThreadID(xa);\n            if (ra(xa)) {\n                ma();\n            }\n        ;\n        ;\n        },\n        openTab: function(xa) {\n            l.isThreadID(xa);\n            la(qa.curry(xa));\n        },\n        lowerTab: function(xa) {\n            l.isThreadID(xa);\n            var ya = false;\n            if (x) {\n                delete x[xa];\n                ya = true;\n            }\n        ;\n        ;\n            la(function() {\n                var za = pa(xa);\n                if (((((za != -1)) && u[za].raised))) {\n                    delete u[za].raised;\n                    ea.log(\"lower_tab\", {\n                        tabs: JSON.stringify(u),\n                        lowered: xa,\n                        window_id: r.getSessionID()\n                    });\n                    ya = true;\n                }\n            ;\n            ;\n                return ya;\n            });\n        },\n        raiseAndPromoteTab: function(xa, ya, za, ab, bb) {\n            l.isThreadID(xa);\n            var cb = false;\n            if (((x && ya))) {\n                x[xa] = true;\n                cb = true;\n            }\n        ;\n        ;\n            if (((!ya && ((xa === w))))) {\n                ((cb && ma()));\n                return;\n            }\n        ;\n        ;\n            la(function() {\n                if (qa(xa, za)) {\n                    cb = true;\n                }\n            ;\n            ;\n                var db = pa(xa);\n                if (((((db != -1)) && ((!u[db].raised || ((v != xa))))))) {\n                    u[db].raised = true;\n                    v = xa;\n                    cb = true;\n                    ea.log(\"raise_and_promote_tab\", {\n                        tabs: JSON.stringify(u),\n                        promoted: xa,\n                        window_id: r.getSessionID()\n                    });\n                }\n            ;\n            ;\n                return cb;\n            }, ab, bb);\n        },\n        promoteThreadInPlaceOfThread: function(xa, ya) {\n            l.isThreadID(xa);\n            l.isThreadID(ya);\n            la(function() {\n                var za = pa(xa), ab = pa(ya);\n                if (((v === ya))) {\n                    v = xa;\n                }\n            ;\n            ;\n                var bb = u[za];\n                u[za] = u[ab];\n                u[ab] = bb;\n                return true;\n            });\n        },\n        squelchTab: function(xa) {\n            l.isThreadID(xa);\n            w = xa;\n            this.lowerTab(xa);\n            ea.log(\"squelch_tab\", {\n                squelched: xa,\n                tabs: JSON.stringify(u),\n                window_id: r.getSessionID()\n            });\n        },\n        clearSquelchedTab: function() {\n            if (w) {\n                ea.log(\"unsquelch_tab\", {\n                    squelched: w,\n                    tabs: JSON.stringify(u),\n                    window_id: r.getSessionID()\n                });\n            }\n        ;\n        ;\n            w = null;\n        },\n        persistLocalRaised: function() {\n            if (x) {\n                la(function() {\n                    var xa = false;\n                    u.forEach(function(ya) {\n                        if (((ya.raised != x[ya.id]))) {\n                            xa = true;\n                            if (x[ya.id]) {\n                                ya.raised = true;\n                            }\n                             else delete ya.raised;\n                        ;\n                        ;\n                        }\n                    ;\n                    ;\n                    });\n                    return xa;\n                });\n                ea.log(\"persist_local_raise\", {\n                    tabs: JSON.stringify(u),\n                    window_id: r.getSessionID()\n                });\n            }\n        ;\n        ;\n        }\n    });\n    g.subscribe(k.DUMP_EVENT, function(xa, ya) {\n        ya.chat_tabs = {\n            promoted: v,\n            tabs: u.map(function(za) {\n                return t({\n                }, za);\n            }),\n            time: ca,\n            max_load_age: aa\n        };\n    });\n    function wa() {\n        var xa = i.ignoresRemoteTabRaise();\n        if (((xa && !x))) {\n            ea.log(\"start_ignore_remote_raise\");\n            x = {\n            };\n            ma();\n        }\n         else if (((!xa && x))) {\n            ea.log(\"stop_ignore_remote_raise\");\n            x = null;\n            ma();\n        }\n        \n    ;\n    ;\n    };\n;\n    i.subscribe(i.ON_CHANGED, wa);\n    wa();\n    ia(q.getInitial(), true);\n    if (((ca === 0))) {\n        ca = ((z() - 600000));\n    }\n;\n;\n    fa = true;\n    e.exports = va;\n});\n__d(\"VideoCallPromo\", [\"ArbiterMixin\",\"AsyncRequest\",\"ChatConfig\",\"ChatVisibility\",\"LegacyContextualDialog\",\"CSS\",\"MercuryParticipants\",\"MercuryThreads\",\"ChatTabTemplates\",\"VideoCallCore\",\"copyProperties\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"ArbiterMixin\"), h = b(\"AsyncRequest\"), i = b(\"ChatConfig\"), j = b(\"ChatVisibility\"), k = b(\"LegacyContextualDialog\"), l = b(\"CSS\"), m = b(\"MercuryParticipants\"), n = b(\"MercuryThreads\").get(), o = b(\"ChatTabTemplates\"), p = b(\"VideoCallCore\"), q = b(\"copyProperties\"), r = b(\"emptyFunction\");\n    function s() {\n        this._dialog = null;\n    };\n;\n    function t(v) {\n        if (!((p.isSupported() && i.get(\"video.show_promo\")))) {\n            return false;\n        }\n    ;\n    ;\n        var w = n.getCanonicalUserInThread(v);\n        if (!w) {\n            return false;\n        }\n    ;\n    ;\n        return ((j.isOnline() && p.availableForCall(w)));\n    };\n;\n    function u(v) {\n        new h().setURI(\"/ajax/chat/video/log_promo.php\").setData({\n            viewedUserID: v\n        }).setAllowCrossPageTransition(true).setErrorHandler(r).send();\n    };\n;\n    q(s.prototype, g);\n    q(s.prototype, {\n        render: function(v, w) {\n            var x = t(w);\n            if (!x) {\n                return;\n            }\n        ;\n        ;\n            var y = n.getCanonicalUserInThread(w);\n            m.get(((\"fbid:\" + y)), function(z) {\n                if (!z.call_promo) {\n                    return;\n                }\n            ;\n            ;\n                var aa = o[\":fb:mercury:call:promo\"].build();\n                this._dialog = new k();\n                this._dialog.init(aa.getRoot()).setWidth(250).setAlignH(\"center\").setContext(v).show();\n                l.addClass(this._dialog.getRoot(), \"uiContextualDialogWithFooterArrowBottom\");\n                l.addClass(v, \"video_call_promo\");\n                u(n.getCanonicalUserInThread(w));\n                this.inform(\"chat/dialog-rendered\", {\n                    dialog: this,\n                    thread_id: w\n                });\n            }.bind(this));\n        },\n        updatePosition: function() {\n            if (((this._dialog && this._dialog.isShown()))) {\n                this._dialog.updatePosition();\n            }\n        ;\n        ;\n        },\n        hide: function() {\n            if (((this._dialog && this._dialog.isShown()))) {\n                this._dialog.hide();\n                this._dialog = null;\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = s;\n});\n__d(\"VideoCallTourDialog\", [\"ArbiterMixin\",\"LegacyContextualDialog\",\"CSS\",\"MercuryThreads\",\"ChatTabTemplates\",\"VideoCallCore\",\"VideoCallingTour\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"ArbiterMixin\"), h = b(\"LegacyContextualDialog\"), i = b(\"CSS\"), j = b(\"MercuryThreads\").get(), k = b(\"ChatTabTemplates\"), l = b(\"VideoCallCore\"), m = b(\"VideoCallingTour\"), n = b(\"copyProperties\");\n    function o() {\n        this._dialog = null;\n    };\n;\n    n(o.prototype, g);\n    n(o.prototype, {\n        render: function(p, q) {\n            var r = j.getCanonicalUserInThread(q);\n            if (((!r || !l.availableForCall(r)))) {\n                return;\n            }\n        ;\n        ;\n            var s = k[\":fb:mercury:call:tour\"].build();\n            this._dialog = new h();\n            this._dialog.init(s.getRoot()).setWidth(250).setAlignH(\"center\").setContext(p).show();\n            i.addClass(this._dialog.getRoot(), \"uiContextualDialogWithFooterArrowBottom\");\n            i.addClass(p, \"video_call_tour\");\n            this.inform(\"chat/dialog-rendered\", {\n                dialog: this,\n                thread_id: q\n            });\n            m.inform(\"videocallingtour/end\");\n        },\n        updatePosition: function() {\n            if (((this._dialog && this._dialog.isShown()))) {\n                this._dialog.updatePosition();\n            }\n        ;\n        ;\n        },\n        hide: function() {\n            if (((this._dialog && this._dialog.isShown()))) {\n                this._dialog.hide();\n                this._dialog = null;\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = o;\n});\n__d(\"ChatContextualDialogController\", [\"JSBNG__Event\",\"ArbiterMixin\",\"ChatTabModel\",\"VideoCallingTour\",\"VideoCallPromo\",\"VideoCallTourDialog\",\"copyProperties\",\"setTimeoutAcrossTransitions\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"ArbiterMixin\"), i = b(\"ChatTabModel\"), j = b(\"VideoCallingTour\"), k = b(\"VideoCallPromo\"), l = b(\"VideoCallTourDialog\"), m = b(\"copyProperties\"), n = b(\"setTimeoutAcrossTransitions\"), o = 60000, p = false, q = false, r = function(y, z) {\n        this._videoCallPromo = new k();\n        this._videoCallTour = new l();\n        this._threadID = y;\n        this._tabMainElement = z;\n        this._openDialog = null;\n        this._subscriptionTokens = [];\n        this._scrollListener = null;\n        this._timeout = null;\n    };\n    function s(y, JSBNG__event, z) {\n        if (y._openDialog) {\n            y._openDialog.updatePosition();\n        }\n    ;\n    ;\n    };\n;\n    function t(y) {\n        if (y._openDialog) {\n            y._openDialog.updatePosition();\n        }\n    ;\n    ;\n    };\n;\n    function u(y) {\n        if (y._openDialog) {\n            y._openDialog.hide();\n            y._openDialog = null;\n        }\n    ;\n    ;\n        if (y._timeout) {\n            JSBNG__clearTimeout(y._timeout);\n            y._timeout = null;\n        }\n    ;\n    ;\n        while (y._subscriptionTokens.length) {\n            y._subscriptionTokens.pop().unsubscribe();\n        ;\n        };\n    ;\n        if (y._scrollListener) {\n            y._scrollListener.remove();\n            y._scrollListener = null;\n        }\n    ;\n    ;\n    };\n;\n    function v(y, JSBNG__event, z) {\n        if (((z.thread_id === y._threadID))) {\n            y._openDialog = z.dialog;\n            p = true;\n            x(y);\n            y._timeout = n(y.destroy.bind(y, y._threadID), o);\n            y._scrollListener = g.listen(window, \"JSBNG__scroll\", t.curry(y));\n        }\n    ;\n    ;\n    };\n;\n    function w(y, z) {\n        if (!y._openDialog) {\n            y._subscriptionTokens.push(z.subscribe(\"chat/dialog-rendered\", v.curry(y)));\n            z.render(y._tabMainElement, y._threadID);\n        }\n    ;\n    ;\n    };\n;\n    function x(y) {\n        y._subscriptionTokens.push(i.subscribe(\"chat/tabs-changed\", s.curry(y)), r.subscribe(\"dialog/close-all\", u.curry(y)));\n    };\n;\n    m(r, h);\n    m(r.prototype, {\n        destroy: function() {\n            u(this);\n        },\n        tabFocused: function() {\n            if (q) {\n                w(this, this._videoCallTour);\n                return;\n            }\n        ;\n        ;\n            if (!p) {\n                w(this, this._videoCallPromo);\n            }\n        ;\n        ;\n        },\n        tabNotActive: function() {\n            u(this);\n        },\n        hideVideoCallouts: function() {\n            u(this);\n        }\n    });\n    j.subscribe(\"videocallingtour/start\", function() {\n        q = true;\n        r.inform(\"dialog/close-all\");\n    });\n    j.subscribe(\"videocallingtour/end\", function() {\n        q = false;\n    });\n    e.exports = r;\n});\n__d(\"ChatPrivacyActionController\", [\"ChatVisibility\",\"JSLogger\",\"PresencePrivacy\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"ChatVisibility\"), h = b(\"JSLogger\"), i = b(\"PresencePrivacy\"), j = b(\"copyProperties\"), k = function(l, m) {\n        this._userID = l;\n        this._logger = h.create(\"blackbird\");\n        this._getState = function() {\n            if (g.isOnline()) {\n                return ((i.allows(this._userID) ? k.NORMAL : k.BLOCKED));\n            }\n        ;\n        ;\n            return k.OFFLINE;\n        };\n        this._togglePrivacy = function() {\n            var n = this._getState();\n            switch (this._getState()) {\n              case k.OFFLINE:\n                if (g.isOnline()) {\n                    this._logger.error(\"tabs_already_online\");\n                    break;\n                }\n            ;\n            ;\n                this._logger.log(\"tabs_go_online\", {\n                    tab_id: this._userID\n                });\n                g.goOnline(function() {\n                    if (!i.allows(this._userID)) {\n                        if (((this._getState() !== k.BLOCKED))) {\n                            this._logger.error(\"privacy_action_controller_blocked_inconsistency\");\n                        }\n                    ;\n                    ;\n                        this._togglePrivacy();\n                    }\n                ;\n                ;\n                }.bind(this));\n                break;\n              case k.BLOCKED:\n                i.allow(this._userID);\n                this._logger.log(\"tabs_unblock\", {\n                    tab_id: this._userID\n                });\n                break;\n              case k.NORMAL:\n                i.disallow(this._userID);\n                this._logger.log(\"tabs_block\", {\n                    tab_id: this._userID\n                });\n                break;\n            };\n        ;\n        };\n        (function() {\n            var n = function() {\n                ((m && m(this._getState())));\n            }.bind(this);\n            n();\n            this._subscribeToken = i.subscribe(\"privacy-changed\", n);\n        }.bind(this)).defer();\n    };\n    k.OFFLINE = \"offline\";\n    k.BLOCKED = \"blocked\";\n    k.NORMAL = \"normal\";\n    j(k.prototype, {\n        togglePrivacy: function() {\n            this._logger.log(\"gear_menu_toggle_privacy\", {\n                tab_id: this._userID\n            });\n            this._togglePrivacy();\n        },\n        destroy: function() {\n            i.unsubscribe(this._subscribeToken);\n        }\n    });\n    e.exports = k;\n});\n__d(\"MercuryTypingIndicator\", [\"Animation\",\"CSS\",\"DOM\",\"MercuryTypingReceiver\",\"MercuryParticipants\",\"Style\",\"ChatTabTemplates\",\"MercuryThreadInformer\",\"Tooltip\",\"copyProperties\",\"cx\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Animation\"), h = b(\"CSS\"), i = b(\"DOM\"), j = b(\"MercuryTypingReceiver\"), k = b(\"MercuryParticipants\"), l = b(\"Style\"), m = b(\"ChatTabTemplates\"), n = b(\"MercuryThreadInformer\").get(), o = b(\"Tooltip\"), p = b(\"copyProperties\"), q = b(\"cx\"), r = b(\"tx\"), s = [];\n    n.subscribe(\"messages-received\", function(v, w) {\n        s.forEach(function(x) {\n            var y = w[x._threadID];\n            ((y && x.receivedMessages(y)));\n        });\n    });\n    j.subscribe(\"state-changed\", function(v, w) {\n        s.forEach(function(x) {\n            var y = w[x._threadID];\n            ((y && x._handleStateChanged(y)));\n        });\n    });\n    function t(v) {\n        var w = m[\":fb:chat:conversation:message-group\"].build(), x = m[\":fb:mercury:typing-indicator:typing\"].build();\n        h.addClass(w.getRoot(), \"_50kd\");\n        var y = w.getNode(\"profileLink\");\n        o.set(y, v.JSBNG__name, \"left\");\n        y.href = v.href;\n        w.setNodeContent(\"profileName\", v.JSBNG__name);\n        w.setNodeProperty(\"profilePhoto\", \"src\", v.image_src);\n        var z = r._(\"{name} is typing...\", {\n            JSBNG__name: v.short_name\n        });\n        o.set(x.getRoot(), z, \"above\");\n        i.appendContent(w.getNode(\"messages\"), x.getRoot());\n        return w;\n    };\n;\n    function u(v, w, x) {\n        this._animations = {\n        };\n        this._activeUsers = {\n        };\n        this._typingIndicator = w;\n        this._messagesView = x;\n        this._threadID = v;\n        this._subscription = j.subscribe(\"state-changed\", function(y, z) {\n            var aa = z[this._threadID];\n            ((aa && this._handleStateChanged(aa)));\n        }.bind(this));\n        s.push(this);\n    };\n;\n    p(u.prototype, {\n        destroy: function() {\n            Object.keys(this._activeUsers).forEach(this._removeUserBubble.bind(this));\n            this._controller.destroy();\n            s.remove(this);\n        },\n        receivedMessages: function(v) {\n            v.forEach(function(w) {\n                if (!k.isAuthor(w.author)) {\n                    this._removeUserBubble(w.author);\n                }\n            ;\n            ;\n            }.bind(this));\n        },\n        _handleStateChanged: function(v) {\n            {\n                var fin237keys = ((window.top.JSBNG_Replay.forInKeys)((this._activeUsers))), fin237i = (0);\n                var w;\n                for (; (fin237i < fin237keys.length); (fin237i++)) {\n                    ((w) = (fin237keys[fin237i]));\n                    {\n                        if (((v.indexOf(w) === -1))) {\n                            this._slideOutUserBubble(w);\n                            delete this._activeUsers[w];\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            if (v.length) {\n                k.getMulti(v, function(x) {\n                    var y = this._messagesView.isScrolledToBottom(), z = {\n                    };\n                    {\n                        var fin238keys = ((window.top.JSBNG_Replay.forInKeys)((x))), fin238i = (0);\n                        var aa;\n                        for (; (fin238i < fin238keys.length); (fin238i++)) {\n                            ((aa) = (fin238keys[fin238i]));\n                            {\n                                var ba = this._activeUsers[aa];\n                                z[aa] = ((ba || t(x[aa]).getRoot()));\n                                if (!ba) {\n                                    i.appendContent(this._typingIndicator, z[aa]);\n                                }\n                            ;\n                            ;\n                            };\n                        };\n                    };\n                ;\n                    var ca = ((Object.keys(z).length > 0));\n                    ((y && this._messagesView.scrollToBottom(ca)));\n                    this._activeUsers = z;\n                }.bind(this));\n            }\n        ;\n        ;\n        },\n        _removeUserBubble: function(v, w) {\n            var x = this._getCurrentAnimation(v, w);\n            if (x) {\n                x.animation.JSBNG__stop();\n                i.remove(x.elem);\n                delete this._animations[v];\n            }\n        ;\n        ;\n            if (((v in this._activeUsers))) {\n                i.remove(this._activeUsers[v]);\n                delete this._activeUsers[v];\n            }\n        ;\n        ;\n            ((w && i.remove(w)));\n        },\n        _slideOutUserBubble: function(v) {\n            var w = this._activeUsers[v];\n            if (this._getCurrentAnimation(v, w)) {\n                return;\n            }\n             else if (w) {\n                l.set(w, \"overflow\", \"hidden\");\n                var x = (new g(w)).from(\"opacity\", 1).from(\"height\", w.offsetHeight).to(\"height\", 0).to(\"opacity\", 0).ease(g.ease.end).duration(250).ondone(this._removeUserBubble.bind(this, v, w)).go();\n                this._animations[v] = {\n                    animation: x,\n                    elem: w\n                };\n            }\n            \n        ;\n        ;\n        },\n        _getCurrentAnimation: function(v, w) {\n            if (((this._animations[v] && ((!w || ((this._animations[v].elem === w))))))) {\n                return this._animations[v];\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = u;\n});\n__d(\"ChatTabMessagesView\", [\"JSXDOM\",\"Animation\",\"Arbiter\",\"ArbiterMixin\",\"MercuryAttachment\",\"MercuryAttachmentRenderer\",\"ChannelConstants\",\"ChatConfig\",\"ChatVisibility\",\"createArrayFrom\",\"CSS\",\"DOM\",\"Env\",\"JSBNG__Event\",\"JoinableConversationMessageFilter\",\"LiveTimer\",\"MercuryActionTypeConstants\",\"MercuryAPIArgsSource\",\"MercuryLastMessageIndicator\",\"MercuryLogMessageType\",\"MercurySourceType\",\"shield\",\"MercuryMessages\",\"MercuryServerRequests\",\"MercuryThreadMetadataRawRenderer\",\"MercuryThreadMetadataRenderer\",\"MercuryThreads\",\"MercuryThreadlistConstants\",\"MercuryTypingIndicator\",\"MercuryMessageRenderer\",\"Parent\",\"MercuryParticipants\",\"React\",\"ServerTime\",\"MercuryStatusTemplates\",\"Style\",\"ChatTabTemplates\",\"MercuryThreadInformer\",\"Timestamp.react\",\"Tooltip\",\"VideoCallCore\",\"copyProperties\",\"csx\",\"cx\",\"formatDate\",\"isRTL\",\"removeFromArray\",\"throttle\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSXDOM\"), h = b(\"Animation\"), i = b(\"Arbiter\"), j = b(\"ArbiterMixin\"), k = b(\"MercuryAttachment\"), l = b(\"MercuryAttachmentRenderer\"), m = b(\"ChannelConstants\"), n = b(\"ChatConfig\"), o = b(\"ChatVisibility\"), p = b(\"createArrayFrom\"), q = b(\"CSS\"), r = b(\"DOM\"), s = b(\"Env\"), t = b(\"JSBNG__Event\"), u = b(\"JoinableConversationMessageFilter\"), v = b(\"LiveTimer\"), w = b(\"MercuryActionTypeConstants\"), x = b(\"MercuryAPIArgsSource\"), y = b(\"MercuryLastMessageIndicator\"), z = b(\"MercuryLogMessageType\"), aa = b(\"MercurySourceType\"), ba = b(\"shield\"), ca = b(\"MercuryMessages\").get(), da = b(\"MercuryServerRequests\").get(), ea = b(\"MercuryThreadMetadataRawRenderer\"), fa = b(\"MercuryThreadMetadataRenderer\").get(), ga = b(\"MercuryThreads\").get(), ha = b(\"MercuryThreadlistConstants\"), ia = b(\"MercuryTypingIndicator\"), ja = b(\"MercuryMessageRenderer\"), ka = b(\"Parent\"), la = b(\"MercuryParticipants\"), ma = b(\"React\"), na = b(\"ServerTime\"), oa = b(\"MercuryStatusTemplates\"), pa = b(\"Style\"), qa = b(\"ChatTabTemplates\"), ra = b(\"MercuryThreadInformer\").get(), sa = b(\"Timestamp.react\"), ta = b(\"Tooltip\"), ua = b(\"VideoCallCore\"), va = b(\"copyProperties\"), wa = b(\"csx\"), xa = b(\"cx\"), ya = b(\"formatDate\"), za = b(\"isRTL\"), ab = b(\"removeFromArray\"), bb = b(\"throttle\"), cb = b(\"tx\"), db, eb = 34, fb = ((((1000 * 60)) * 60)), gb = 70, hb = null, ib = 20;\n    function jb(tb) {\n        return ya(new JSBNG__Date(tb), ((n.get(\"24h_times\") ? \"H:i\" : \"g:ia\")));\n    };\n;\n    function kb(tb) {\n        var ub = qa[\":fb:chat:conversation:message-group\"].build(), vb = ub.getNode(\"profileLink\"), wb = n.get(\"chat_tab_bubbles\"), xb = la.isAuthor(tb.author), yb = da.tokenizeThreadID(tb.thread_id), zb = ((yb.type !== \"user\")), ac = ((!xb || !wb));\n        if (!wb) {\n            ub.setNodeContent(\"timestamp\", jb(tb.timestamp));\n        }\n    ;\n    ;\n        q.conditionClass(ub.getRoot(), \"_50kd\", ((!xb && wb)));\n        q.conditionClass(ub.getRoot(), \"_50x4\", ((((zb && !xb)) && wb)));\n        q.conditionShow(vb, ac);\n        la.get(tb.author, function(bc) {\n            if (ac) {\n                vb.href = bc.href;\n                var cc = ((xb ? \"You\" : bc.JSBNG__name));\n                if (((!xb && wb))) {\n                    cc = g.div({\n                        className: \"_522l\"\n                    }, g.div({\n                        className: \"_522m\"\n                    }, jb(tb.timestamp)), bc.JSBNG__name);\n                }\n            ;\n            ;\n                ta.set(vb, cc, \"left\");\n                if (((((!xb && wb)) && zb))) {\n                    ub.setNodeContent(\"profileName\", bc.JSBNG__name);\n                }\n            ;\n            ;\n                ub.setNodeProperty(\"profilePhoto\", \"src\", bc.image_src);\n            }\n        ;\n        ;\n        });\n        return ub;\n    };\n;\n    function lb(tb) {\n        var ub = qa[\":fb:chat:conversation:message:event\"].build(), vb = n.get(\"chat_tab_bubbles\"), wb = jb(tb.timestamp);\n        if (vb) {\n            ub.getRoot().setAttribute(\"title\", wb);\n        }\n         else ub.setNodeContent(\"timestamp\", wb);\n    ;\n    ;\n        ja.renderLogMessage(ub.getNode(\"icon\"), ub.getNode(\"message\"), ub.getNode(\"attachment\"), tb);\n        var xb = nb(tb);\n        if (xb) {\n            r.appendContent(ub.getNode(\"message\"), xb);\n        }\n    ;\n    ;\n        return ub.getRoot();\n    };\n;\n    function mb(tb, ub) {\n        if (!n.get(\"chat_tab_bubbles\")) {\n            return;\n        }\n    ;\n    ;\n        if (((hb === null))) {\n            var vb = ub.childNodes[0];\n            pa.set(ub, \"overflow\", \"JSBNG__scroll\");\n            hb = ((vb.clientWidth - gb));\n            pa.set(ub, \"overflow\", \"\");\n        }\n    ;\n    ;\n        if (!q.hasClass(tb, \"_kso\")) {\n            var wb = r.scry(tb, \"._kso\");\n            if (((wb.length === 1))) {\n                tb = wb[0];\n            }\n             else return\n        ;\n        }\n    ;\n    ;\n        pa.set(tb, \"max-width\", ((hb + \"px\")));\n        var xb, yb, zb = tb.firstChild;\n        if (((((tb.childNodes.length === 1)) && zb.getAttribute(\"data-measureme\")))) {\n            xb = zb.getClientRects();\n            var ac = zb.offsetHeight;\n            if (((((xb && ((xb.length > 1)))) && ((xb[0].height < ac))))) {\n                yb = true;\n                if (!db) {\n                    r.remove(zb);\n                    db = tb.offsetWidth;\n                    r.appendContent(tb, zb);\n                }\n            ;\n            ;\n                var bc = zb.offsetWidth, cc = ((((tb.offsetWidth - bc)) - db));\n                if (((cc > 0))) {\n                    pa.set(tb, \"max-width\", ((bc + \"px\")));\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n        var dc = ka.byClass(tb, \"_50x4\");\n        if (dc) {\n            q.conditionClass(dc, \"_51lo\", ((xb ? !yb : ((tb.offsetHeight < eb)))));\n        }\n    ;\n    ;\n    };\n;\n    function nb(tb) {\n        var ub, vb;\n        if (((tb.log_message_type == z.VIDEO_CALL))) {\n            if (((tb.log_message_data.event_name == \"install_canceled\"))) {\n                ub = r.tx._(\"Retry setup and call back.\");\n                vb = \"callback_cancelinstall_link\";\n                return ob(ub, tb.thread_id, tb.log_message_data.to, vb);\n            }\n             else if (((((!tb.log_message_data.event_name && ((tb.log_message_data.callee == la.user)))) && !tb.log_message_data.answered))) {\n                ub = r.tx._(\"Call Back\");\n                vb = \"callback_link\";\n                return ob(ub, tb.thread_id, tb.log_message_data.caller.split(\":\")[1], vb);\n            }\n            \n        ;\n        }\n    ;\n    ;\n        return null;\n    };\n;\n    function ob(tb, ub, vb, wb) {\n        if (ua.isSupported()) {\n            var xb = ((!o.isOnline() || !ua.availableForCall(vb))), yb = r.create(\"a\", {\n                href: \"#\",\n                className: \"callBackLink\"\n            }, tb);\n            if (xb) {\n                q.hide(yb);\n            }\n        ;\n        ;\n            yb.setAttribute(\"data-gt\", JSON.stringify({\n                videochat: \"clicked_callback_link\"\n            }));\n            t.listen(yb, \"click\", function() {\n                rb.inform(\"video-call-clicked\", {\n                    userID: vb,\n                    threadID: ub,\n                    clickSource: wb\n                });\n            });\n            return yb;\n        }\n    ;\n    ;\n        return null;\n    };\n;\n    function pb(tb) {\n        var ub = qa[\":fb:mercury:chat:message:forward\"].build(), vb = ub.getNode(\"forwardText\");\n        if (vb) {\n            q.hide(ub.getRoot());\n            fa.renderTitanLink(tb.thread_id, ub.getNode(\"forwardLink\"), q.show.bind(q, ub.getRoot()));\n            if (((tb.forward_count > 1))) {\n                r.appendContent(vb, cb._(\"{count} forwarded messages\", {\n                    count: tb.forward_count\n                }));\n            }\n             else r.appendContent(vb, \"1 forwarded message\");\n        ;\n        ;\n        }\n    ;\n    ;\n        return ub.getRoot();\n    };\n;\n    var qb = [];\n    function rb(tb, ub, vb, wb, xb, yb, zb) {\n        this.loadingIcon = xb;\n        this.threadID = tb;\n        this.sheetController = ub;\n        this.scrollContainer = vb;\n        this.conversationElem = wb;\n        this.messageElements = {\n        };\n        this.messageGroup = null;\n        this.prevMessage = null;\n        v.restart(((na.get() / 1000)));\n        this._fetchMultiplier = 1;\n        this._oldestMessageDisplayedTimestamp = null;\n        this._loadingMoreMessages = false;\n        this._currentMessageCount = 0;\n        this._hasReachedClearedMessages = false;\n        var ac = ha.MESSAGE_TIMESTAMP_THRESHOLD;\n        this._oldestMessageDisplayedTimestamp = ((JSBNG__Date.now() - ac));\n        qb.push(this);\n        this._subscription = i.subscribe(\"overflow-applied-to-body\", this.scrollToBottom.bind(this));\n        t.listen(this.scrollContainer, \"JSBNG__scroll\", bb(this.scrolling, 50, this));\n        var bc = n.get(\"chat_tab_bubbles\");\n        this.lastMessageIndicator = new y(this.threadID, yb, bc, this);\n        if (bc) {\n            this.typingIndicator = new ia(this.threadID, zb, this);\n        }\n    ;\n    ;\n        ca.getThreadMessagesRange(this.threadID, 0, ha.RECENT_MESSAGES_LIMIT, this._updateTimestamp.bind(this));\n        this.rerender();\n    };\n;\n    va(rb, j);\n    va(rb.prototype, {\n        scrolling: function() {\n            if (((((((!this._loadingMoreMessages && this.isScrolledNearTop())) && !this.isScrolledToBottom())) && !this._hasReachedClearedMessages))) {\n                this.loadMoreMessages();\n            }\n        ;\n        ;\n            if (!this._newMessagesSheetOpened) {\n                return;\n            }\n        ;\n        ;\n            if (this.isScrolledToBottom()) {\n                this.sheetController.closeNewMessagesSheet();\n                this._newMessagesSheetOpened = false;\n            }\n        ;\n        ;\n        },\n        destroy: function() {\n            r.empty(this.conversationElem);\n            this._subscription.unsubscribe();\n            ab(qb, this);\n            ((this.lastMessageIndicator && this.lastMessageIndicator.destroy()));\n            this.destroyed = true;\n        },\n        _appendMessage: function(tb) {\n            if (((tb == this.prevMessage))) {\n                return;\n            }\n        ;\n        ;\n            var ub = ha, vb = ub.GROUPING_THRESHOLD, wb = ((((tb.action_type == w.LOG_MESSAGE)) && ((tb.log_message_type == z.SERVER_ERROR))));\n            if (tb.is_cleared) {\n                this._hasReachedClearedMessages = true;\n                return;\n            }\n        ;\n        ;\n            var xb;\n            if (((this.prevMessage !== null))) {\n                xb = ((tb.timestamp - this.prevMessage.timestamp));\n            }\n             else xb = Infinity;\n        ;\n        ;\n            if (((!wb && ((xb >= fb))))) {\n                var yb = Math.round(((tb.timestamp / 1000))), zb = tb.timestamp_datetime, ac = qa[\":fb:chat:conversation:date-break\"].build();\n                ma.renderComponent(sa({\n                    time: yb,\n                    verbose: zb,\n                    text: zb\n                }), ac.getNode(\"date\"));\n                r.appendContent(this.conversationElem, ac.getRoot());\n                this.messageGroup = null;\n            }\n        ;\n        ;\n            if (((tb.action_type == w.LOG_MESSAGE))) {\n                r.appendContent(this.conversationElem, lb(tb));\n                this.messageGroup = null;\n                this.prevMessage = tb;\n                return;\n            }\n        ;\n        ;\n            var bc = n.get(\"chat_tab_bubbles\");\n            if (((((((!this.messageGroup || ((bc && ((tb.author !== la.user)))))) || ((this.prevMessage.author != tb.author)))) || ((this.prevMessage.timestamp < ((tb.timestamp - vb))))))) {\n                this.messageGroup = kb(tb);\n                r.appendContent(this.conversationElem, this.messageGroup.getRoot());\n            }\n        ;\n        ;\n            var cc = this._makeSingleMessage(tb);\n            this.messageElements[tb.message_id] = cc;\n            r.appendContent(this.messageGroup.getNode(\"messages\"), cc);\n            mb(cc, this.scrollContainer);\n            this.prevMessage = tb;\n        },\n        rerender: function() {\n            if (!this._oldestMessageDisplayedTimestamp) {\n                return;\n            }\n        ;\n        ;\n            var tb = ((this._finishedFetchingMoreMessages && this.scrollContainer.scrollHeight)), ub = ((this._finishedFetchingMoreMessages && this.scrollContainer.scrollTop)), vb = this.isScrolledToBottom();\n            r.empty(this.conversationElem);\n            this.messageElements = {\n            };\n            this.messageGroup = null;\n            this.prevMessage = null;\n            var wb = ca.getThreadMessagesSinceTimestamp(this.threadID, this._oldestMessageDisplayedTimestamp);\n            this._renderOlderMessages(wb, tb, ub, vb);\n            this._finishedFetchingMoreMessages = false;\n        },\n        update: function(tb) {\n            {\n                var fin239keys = ((window.top.JSBNG_Replay.forInKeys)((tb))), fin239i = (0);\n                var ub;\n                for (; (fin239i < fin239keys.length); (fin239i++)) {\n                    ((ub) = (fin239keys[fin239i]));\n                    {\n                        var vb = this.messageElements[ub];\n                        if (vb) {\n                            var wb = this.isScrolledToBottom(), xb = this._makeSingleMessage(ca.getMessagesFromIDs([ub,])[0]);\n                            this.messageElements[ub] = xb;\n                            r.replace(vb, xb);\n                            mb(xb, this.scrollContainer);\n                            if (wb) {\n                                this.scrollToBottom();\n                            }\n                        ;\n                        ;\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n        },\n        _getLoadingHeight: function() {\n            return ((this.loadingHeight || this.loadingIcon.clientHeight));\n        },\n        _appendMessages: function(tb) {\n            tb.forEach(this._appendMessage.bind(this));\n            ((this.lastMessageIndicator && this.lastMessageIndicator.setLastMessage(this.prevMessage)));\n        },\n        _appendNewMessages: function(tb) {\n            tb = u.filterMessages(function(wb) {\n                this.sheetController.openUserJoinStatusSheet(wb);\n            }.bind(this), tb, true);\n            var ub = this.isScrolledToBottom(), vb = this._messagesOnlySentFromSelf(tb);\n            this._appendMessages(tb);\n            if (ub) {\n                this.scrollToBottom();\n            }\n             else if (!vb) {\n                this.sheetController.openNewMessagesSheet();\n                this._newMessagesSheetOpened = true;\n            }\n            \n        ;\n        ;\n        },\n        _messagesOnlySentFromSelf: function(tb) {\n            for (var ub = 0; ((ub < tb.length)); ub++) {\n                if (((tb[ub].author !== la.user))) {\n                    return false;\n                }\n            ;\n            ;\n            };\n        ;\n            return true;\n        },\n        _renderOlderMessages: function(tb, ub, vb, wb) {\n            if (!tb) {\n                return;\n            }\n        ;\n        ;\n            tb = u.filterMessages(function(xb) {\n                this.sheetController.openUserJoinStatusSheet(xb);\n            }.bind(this), tb, false);\n            this._appendMessages(tb);\n            if (wb) {\n                this.scrollToBottom();\n            }\n             else if (this._finishedFetchingMoreMessages) {\n                this.scrollToPosition(((((((this.scrollContainer.scrollHeight - ub)) - this.loadingHeight)) + vb)));\n            }\n            \n        ;\n        ;\n        },\n        _updateTimestamp: function(tb) {\n            if (((tb && tb.length))) {\n                this._oldestMessageDisplayedTimestamp = tb[0].timestamp;\n                this._currentMessageCount = tb.length;\n            }\n        ;\n        ;\n            this._loadingMoreMessages = false;\n            this._finishedFetchingMoreMessages = true;\n            q.hide(this.loadingIcon);\n        },\n        isScrolledToBottom: function() {\n            var tb = this.scrollContainer;\n            return ((((tb.scrollTop + tb.clientHeight)) >= ((tb.scrollHeight - ib))));\n        },\n        isScrolledNearTop: function() {\n            return ((this.scrollContainer.scrollTop < this.scrollContainer.clientHeight));\n        },\n        scrollToBottom: function(tb) {\n            this.scrollToPosition(this.scrollContainer.scrollHeight, tb);\n        },\n        scrollToPosition: function(tb, ub) {\n            ((this._scrollTopAnimation && this._scrollTopAnimation.JSBNG__stop()));\n            if (((ub === true))) {\n                this._scrollTopAnimation = (new h(this.scrollContainer)).to(\"scrollTop\", tb).ease(h.ease.end).duration(400).go();\n            }\n             else this.scrollContainer.scrollTop = tb;\n        ;\n        ;\n        },\n        loadMoreMessages: function() {\n            if (((ca.hasLoadedExactlyNMessages(this.threadID, this._currentMessageCount) && ca.hasLoadedAllMessages(this.threadID)))) {\n                return;\n            }\n        ;\n        ;\n            if (ga.isNewEmptyLocalThread(this.threadID)) {\n                return;\n            }\n        ;\n        ;\n            q.show(this.loadingIcon);\n            this.loadingHeight = this._getLoadingHeight();\n            this._loadingMoreMessages = true;\n            if (((this._fetchMultiplier < 10))) {\n                this._fetchMultiplier += 1;\n            }\n        ;\n        ;\n            var tb = ((ha.RECENT_MESSAGES_LIMIT * this._fetchMultiplier)), ub = ((this._currentMessageCount + tb)), vb = ca.hasLoadedNMessages(this.threadID, ub);\n            ca.getThreadMessagesRange(this.threadID, 0, ub, this._updateTimestamp.bind(this), null, x.CHAT);\n            if (vb) {\n                this.rerender();\n            }\n        ;\n        ;\n        },\n        _makeSingleMessage: function(tb) {\n            var ub = this._renderSingleMessage(tb);\n            q.addClass(ub, \"_55r0\");\n            return ub;\n        },\n        _renderSingleMessage: function(tb) {\n            var ub = qa[\":fb:chat:conversation:message\"].render(), vb = n.get(\"chat_tab_bubbles\");\n            if (((vb && la.isAuthor(tb.author)))) {\n                ub.setAttribute(\"title\", jb(tb.timestamp));\n            }\n        ;\n        ;\n            if (tb.subject) {\n                var wb = qa[\":fb:chat:conversation:message:subject\"].render();\n                r.setContent(wb, tb.subject);\n                r.appendContent(ub, wb);\n            }\n        ;\n        ;\n            function xb(fc) {\n                if (vb) {\n                    fc = r.create(\"span\", {\n                        \"data-measureme\": 1\n                    }, fc);\n                }\n            ;\n            ;\n                return fc;\n            };\n        ;\n            if (tb.is_filtered_content) {\n                var yb = oa[\":fb:mercury:filtered-message\"].build();\n                r.appendContent(ub, xb(yb.getRoot()));\n                return ub;\n            }\n        ;\n        ;\n            if (((tb.body.substr(0, 4) == \"?OTR\"))) {\n                r.setContent(ub, xb(\"[encrypted message]\"));\n                q.addClass(ub, \"_542c\");\n            }\n             else {\n                q.addClass(ub, ((za(tb.body) ? \"direction_rtl\" : \"direction_ltr\")));\n                var zb = ja.formatMessageBody(tb.body);\n                r.appendContent(ub, xb(zb));\n            }\n        ;\n        ;\n            if (tb.has_attachment) {\n                var ac = g.div(null), bc = this._appendMessageAttachments(ac, tb);\n                if (((((vb && !tb.body)) && !bc))) {\n                    return ac;\n                }\n            ;\n            ;\n                r.appendContent(ub, p(ac.childNodes));\n            }\n        ;\n        ;\n            if (tb.forward_count) {\n                r.appendContent(ub, pb(tb));\n            }\n        ;\n        ;\n            if (tb.is_spoof_warning) {\n                var cc = qa[\":fb:chat:conversation:message:undertext\"].build();\n                r.appendContent(cc.getNode(\"message\"), ub);\n                la.get(tb.author, function(fc) {\n                    fa.renderChatSpoofWarning(cc.getNode(\"JSBNG__status\"), tb.is_spoof_warning, fc);\n                });\n                return cc.getRoot();\n            }\n        ;\n        ;\n            var dc = ea.renderStatusIndicator(tb.JSBNG__status, tb.error_data, ba(ca.resendMessage, ca, tb));\n            if (dc) {\n                var ec = qa[\":fb:chat:conversation:message:status\"].build();\n                r.appendContent(ec.getNode(\"message\"), ub);\n                r.appendContent(ec.getNode(\"JSBNG__status\"), dc);\n                return ec.getRoot();\n            }\n        ;\n        ;\n            return ub;\n        },\n        _appendMessageAttachments: function(tb, ub) {\n            var vb = 0, wb = ub.attachments;\n            wb.sort(l.booleanLexicographicComparator([l.isPhotoAttachment,l.isShareAttachment,l.isFileAttachment,l.isErrorAttachment,]));\n            if (((ub.raw_attachments && ((ub.raw_attachments.length > 0))))) {\n                wb = k.convertRaw(ub.raw_attachments);\n            }\n        ;\n        ;\n            var xb = l.renderPhotoAttachments(wb.filter(l.isPhotoAttachment), ub, 176, 4);\n            if (xb) {\n                r.appendContent(tb, xb);\n            }\n        ;\n        ;\n            for (var yb = 0; ((yb < wb.length)); yb++) {\n                if (l.isPhotoAttachment(wb[yb])) {\n                    vb = 1;\n                    continue;\n                }\n            ;\n            ;\n                var zb = l.renderAttachment(true, wb[yb], ub);\n                ((zb.error && r.appendContent(tb, zb.error)));\n                ((zb.JSBNG__content && r.appendContent(tb, zb.JSBNG__content)));\n                vb |= zb.bubblePreferred;\n            };\n        ;\n            var ac = r.scry(tb, \"img\");\n            ac.forEach(function(bc) {\n                t.listen(bc, \"load\", ba(this._thumbLoaded, this, bc));\n            }.bind(this));\n            return !!vb;\n        },\n        _thumbLoaded: function(tb) {\n            var ub = ((this.scrollContainer.scrollTop + this.scrollContainer.clientHeight));\n            if (((((ub + tb.offsetHeight)) >= this.scrollContainer.scrollHeight))) {\n                this.scrollToBottom();\n            }\n        ;\n        ;\n        }\n    });\n    ra.subscribe(\"messages-reordered\", function(tb, ub) {\n        qb.forEach(function(vb) {\n            ((ub[vb.threadID] && vb.rerender()));\n        });\n    });\n    ra.subscribe(\"messages-updated\", function(tb, ub) {\n        qb.forEach(function(vb) {\n            ((ub[vb.threadID] && vb.update(ub[vb.threadID])));\n        });\n    });\n    ra.subscribe(\"messages-received\", function(tb, ub) {\n        qb.forEach(function(vb) {\n            var wb = ub[vb.threadID];\n            if (((wb && wb.length))) {\n                vb._currentMessageCount += wb.length;\n            }\n        ;\n        ;\n            ((wb && vb._appendNewMessages(wb)));\n        });\n    });\n    i.subscribe(m.getArbiterType(\"chat_event\"), function(tb, ub) {\n        if (sb(ub.obj)) {\n            var vb = ((((s.user == ub.obj.from)) ? ub.obj.to : ub.obj.from)), wb = ga.getThreadIdForUser(vb), xb = qb.filter(function(ac) {\n                return ((ac.threadID === wb));\n            });\n            if (((xb.length > 0))) {\n                var yb = xb[0], zb = ca.constructLogMessageObject(aa.CHAT_WEB, wb, z.VIDEO_CALL, ub.obj);\n                zb.author = ((\"fbid:\" + ub.obj.from));\n                yb._appendNewMessages([zb,]);\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n    });\n    function sb(tb) {\n        return ((((tb.event_name === \"installing\")) || ((tb.event_name === \"install_canceled\"))));\n    };\n;\n    e.exports = rb;\n});\n__d(\"MercuryPeopleSuggestions\", [\"KeyedCallbackManager\",\"MercuryServerDispatcher\",\"OrderedFriendsList\",\"ShortProfiles\",\"arrayContains\",], function(a, b, c, d, e, f) {\n    var g = b(\"KeyedCallbackManager\"), h = b(\"MercuryServerDispatcher\"), i = b(\"OrderedFriendsList\"), j = b(\"ShortProfiles\"), k = b(\"arrayContains\"), l = new g(), m = 6;\n    function n(s) {\n        return s.sort().join(\",\");\n    };\n;\n    function o(s, t) {\n        if (((s.length < m))) {\n            var u = i.getList();\n            for (var v = 0; ((v < u.length)); v++) {\n                if (!((k(s, u[v]) || k(t, u[v])))) {\n                    s.push(u[v]);\n                    if (((s.length >= m))) {\n                        break;\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n            };\n        ;\n        }\n    ;\n    ;\n        return s;\n    };\n;\n    function p(s) {\n        h.trySend(\"/ajax/chat/people_suggest.php\", s);\n    };\n;\n    function q(s, t, u) {\n        s = s.filter(function(w) {\n            return !k(t, w);\n        });\n        var v = o(s, t);\n        j.getMulti(v, function() {\n            u(v);\n        });\n    };\n;\n    var r = {\n        getPeopleSuggestions: function(s, t) {\n            if (s) {\n                if (s.length) {\n                    var u = n(s), v = l.executeOrEnqueue(u, function(x) {\n                        q(x, s, t);\n                    }), w = l.getUnavailableResources(v);\n                    if (w.length) {\n                        p({\n                            query: u,\n                            size: m\n                        });\n                    }\n                ;\n                ;\n                    return v;\n                }\n                 else q([], [], t);\n            ;\n            }\n        ;\n        ;\n            return 0;\n        },\n        handleUpdate: function(s) {\n            if (s.query) {\n                var t = ((s.suggestions || \"\")), u = ((t.length ? t.split(\",\") : []));\n                l.setResource(s.query, u);\n            }\n        ;\n        ;\n        }\n    };\n    h.registerEndpoints({\n        \"/ajax/chat/people_suggest.php\": {\n            mode: h.IMMEDIATE,\n            handler: r.handleUpdate\n        }\n    });\n    e.exports = r;\n});\n__d(\"ChatTabPeopleSuggestionView\", [\"ChatPeopleSuggestionList.react\",\"ChatQuietLinks\",\"CSS\",\"DOM\",\"JSBNG__Event\",\"MercuryPeopleSuggestions\",\"MercuryIDs\",\"React\",\"ShortProfiles\",\"Style\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"ChatPeopleSuggestionList.react\"), h = b(\"ChatQuietLinks\"), i = b(\"CSS\"), j = b(\"DOM\"), k = b(\"JSBNG__Event\"), l = b(\"MercuryPeopleSuggestions\"), m = b(\"MercuryIDs\"), n = b(\"React\"), o = b(\"ShortProfiles\"), p = b(\"Style\"), q = b(\"copyProperties\");\n    function r(s, t, u) {\n        this.sheetController = s;\n        this.viewNode = t;\n        this.loadingIcon = u;\n        this.addFriendsSheet = s.getAddFriendsTabSheet();\n        this.mercuryTypeahead = ((this.addFriendsSheet && this.addFriendsSheet._typeahead));\n        this.typeaheadInput = ((this.mercuryTypeahead && this.mercuryTypeahead._input));\n        this.typeaheadView = ((this.mercuryTypeahead && this.mercuryTypeahead.getTypeahead().getView()));\n        var v = this.showSuggestions.bind(this);\n        if (this.typeaheadInput) {\n            k.listen(this.typeaheadInput, \"JSBNG__focus\", v);\n        }\n    ;\n    ;\n        if (this.typeaheadView) {\n            this.typeaheadView.subscribe(\"reset\", v);\n            this.typeaheadView.subscribe(\"render\", this.clearSuggestions.bind(this));\n        }\n    ;\n    ;\n        this.tokenizer = ((this.mercuryTypeahead && this.mercuryTypeahead.getTokenizer()));\n        if (this.tokenizer) {\n            this.tokenizer.subscribe(\"removeToken\", v);\n        }\n    ;\n    ;\n        this.showSuggestions();\n    };\n;\n    q(r.prototype, {\n        addSelectedParticipant: function(s) {\n            var t = o.getNow(s);\n            if (((t && this.tokenizer))) {\n                this.tokenizer.addToken(this.tokenizer.createToken({\n                    uid: s,\n                    text: t.JSBNG__name\n                }));\n                this.showSuggestions();\n            }\n        ;\n        ;\n        },\n        showSuggestions: function() {\n            if (this.mercuryTypeahead) {\n                var s = this.mercuryTypeahead.getSelectedParticipantIDs();\n                s = s.map(m.getUserIDFromParticipantID);\n                j.empty(this.viewNode);\n                i.show(this.loadingIcon);\n                l.getPeopleSuggestions(s, function(t) {\n                    var u = g({\n                        uids: t,\n                        onClick: this.addSelectedParticipant.bind(this)\n                    });\n                    i.hide(this.loadingIcon);\n                    n.renderComponent(u, this.viewNode);\n                    h.removeAllHrefs(this.viewNode);\n                }.bind(this));\n            }\n        ;\n        ;\n        },\n        clearSuggestions: function() {\n            j.empty(this.viewNode);\n            i.hide(this.loadingIcon);\n            p.set(this.viewNode, \"margin-top\", 0);\n        },\n        destroy: function() {\n            this.clearSuggestions();\n        }\n    });\n    e.exports = r;\n});\n__d(\"ChatAddFriendsTabSheetRawRenderer\", [\"ContextualTypeaheadView\",\"DOM\",\"JSBNG__Event\",\"MercuryTypeahead\",\"ChatTabTemplates\",\"tx\",\"MercuryDataSourceWrapper\",], function(a, b, c, d, e, f) {\n    var g = b(\"ContextualTypeaheadView\"), h = b(\"DOM\"), i = b(\"JSBNG__Event\"), j = b(\"MercuryTypeahead\"), k = b(\"ChatTabTemplates\"), l = b(\"tx\"), m = b(\"MercuryDataSourceWrapper\").source, n = {\n        render: function(o, p, q, r, s, t) {\n            var u = ((t ? k[\":fb:mercury:chat:tab-sheet:add-friends-empty-tab\"].build() : k[\":fb:mercury:chat:tab-sheet:add-friends\"].build())), v = new j(m, g);\n            v.setExcludedParticipants(r.participants);\n            if (!t) {\n                v.setPlaceholder(\"Add friends to this chat\");\n            }\n        ;\n        ;\n            v.build();\n            h.replace(u.getNode(\"participantsTypeahead\"), v.getElement());\n            h.setContent(q, u.getRoot());\n            v.getTokenizer().adjustWidth();\n            v.JSBNG__focus();\n            if (!t) {\n                var w = function() {\n                    var x = v.getSelectedParticipantIDs();\n                    if (x.length) {\n                        s(x);\n                    }\n                ;\n                ;\n                    p.close(o);\n                };\n                i.listen(u.getNode(\"doneButton\"), \"click\", w);\n            }\n        ;\n        ;\n            return v;\n        }\n    };\n    e.exports = n;\n});\n__d(\"MultiChatController\", [\"Arbiter\",\"AsyncSignal\",\"copyProperties\",\"Form\",\"MercuryMessages\",\"MercuryServerRequests\",\"MercuryThreads\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"AsyncSignal\"), i = b(\"copyProperties\"), j = b(\"Form\"), k = b(\"MercuryMessages\").get(), l = b(\"MercuryServerRequests\").get(), m = b(\"MercuryThreads\").get();\n    function n() {\n    \n    };\n;\n    i(n, {\n        subscribe: function(o, p) {\n            o.subscribe(\"JSBNG__confirm\", function() {\n                this.createGroupThreadFromChooserDialog(o, p);\n            }.bind(this));\n        },\n        createGroupThreadFromChooserDialog: function(o, p) {\n            var q = j.serialize(o.getRoot()), r = JSON.parse(q.profileChooserItems), s = [];\n            {\n                var fin240keys = ((window.top.JSBNG_Replay.forInKeys)((r))), fin240i = (0);\n                var t;\n                for (; (fin240i < fin240keys.length); (fin240i++)) {\n                    ((t) = (fin240keys[fin240i]));\n                    {\n                        if (r[t]) {\n                            s.push(t);\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            var u = n.createThreadForFBIDs(s);\n            l.subscribe(\"update-thread-ids\", function(v, w) {\n                {\n                    var fin241keys = ((window.top.JSBNG_Replay.forInKeys)((w))), fin241i = (0);\n                    var x;\n                    for (; (fin241i < fin241keys.length); (fin241i++)) {\n                        ((x) = (fin241keys[fin241i]));\n                        {\n                            if (((w[x] == u))) {\n                                new h(\"/ajax/groups/chat/log\", {\n                                    group_id: p,\n                                    message_id: x\n                                }).send();\n                            }\n                        ;\n                        ;\n                        };\n                    };\n                };\n            ;\n            });\n            o.hide();\n        },\n        createThreadForTokens: function(o) {\n            if (!o.length) {\n                return;\n            }\n        ;\n        ;\n            var p;\n            if (((o.length == 1))) {\n                p = ((\"user:\" + o[0].split(\":\")[1]));\n            }\n             else p = ((\"root:\" + k.generateNewClientMessageID(JSBNG__Date.now())));\n        ;\n        ;\n            m.createNewLocalThread(p, o);\n            g.inform(\"chat/open-tab\", {\n                thread_id: p\n            });\n            return p;\n        },\n        createThreadForFBIDs: function(o) {\n            var p = [];\n            for (var q = 0; ((q < o.length)); q++) {\n                p.push(((\"fbid:\" + o[q])));\n            ;\n            };\n        ;\n            return n.createThreadForTokens(p);\n        }\n    });\n    e.exports = n;\n});\n__d(\"ChatAddFriendsTabSheet\", [\"Arbiter\",\"ChatAddFriendsTabSheetRawRenderer\",\"MercuryLogMessageType\",\"MercurySourceType\",\"MercuryMessages\",\"MultiChatController\",\"Style\",\"MercuryThreads\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ChatAddFriendsTabSheetRawRenderer\"), i = b(\"MercuryLogMessageType\"), j = b(\"MercurySourceType\"), k = b(\"MercuryMessages\").get(), l = b(\"MultiChatController\"), m = b(\"Style\"), n = b(\"MercuryThreads\").get(), o = b(\"copyProperties\");\n    function p(s, t, u) {\n        this._threadID = s;\n        this._rootElement = t;\n        this._sheetView = u;\n        this._typeahead = null;\n    };\n;\n    o(p.prototype, {\n        render: function() {\n            n.getThreadMeta(this._threadID, function(s) {\n                var t = ((s.is_canonical_user ? q : r));\n                this._typeahead = h.render(this, this._sheetView, this._rootElement, s, t.curry(s), n.isNewEmptyLocalThread(this._threadID));\n                this._typeahead.subscribe(\"resize\", function() {\n                    this._sheetView.inform(\"resize\");\n                }.bind(this));\n            }.bind(this));\n        },\n        getParticipants: function() {\n            if (!this._typeahead) {\n                return null;\n            }\n        ;\n        ;\n            return this._typeahead.getSelectedParticipantIDs();\n        },\n        isPermanent: function() {\n            return true;\n        },\n        getType: function() {\n            return \"add_friends_type\";\n        },\n        open: function() {\n            this._sheetView.open(this);\n        },\n        close: function() {\n            this._sheetView.close(this);\n        },\n        getHeight: function() {\n            return m.get(this._rootElement, \"height\");\n        }\n    });\n    function q(s, t) {\n        var u = s.participants;\n        l.createThreadForTokens(u.concat(t));\n    };\n;\n    function r(s, t) {\n        var u = s.thread_id;\n        if (n.isEmptyLocalThread(u)) {\n            n.addParticipantsToThreadLocally(u, t);\n            g.inform(\"chat/open-tab\", {\n                thread_id: u\n            });\n        }\n         else {\n            k.sendMessage(k.constructLogMessageObject(j.CHAT_WEB, u, i.SUBSCRIBE, {\n                added_participants: t\n            }));\n            g.inform(\"chat/open-tab\", {\n                thread_id: u\n            });\n        }\n    ;\n    ;\n    };\n;\n    e.exports = p;\n});\n__d(\"ChatNameConversationTabSheetRawRenderer\", [\"DOM\",\"JSBNG__Event\",\"Input\",\"Keys\",\"ChatTabTemplates\",\"fbt\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOM\"), h = b(\"JSBNG__Event\"), i = b(\"Input\"), j = b(\"Keys\"), k = b(\"ChatTabTemplates\"), l = b(\"fbt\"), m = {\n        render: function(n, o, p, q, r, s) {\n            var t = k[\":fb:mercury:chat:tab-sheet:name-conversation\"].build(), u = t.getNode(\"nameInput\"), v = t.getNode(\"doneButton\"), w = \"Done\", x = \"Hide\", y = q.JSBNG__name;\n            if (y) {\n                i.setValue(u, y);\n            }\n             else g.setContent(v, x);\n        ;\n        ;\n            var z = function() {\n                var aa = i.getValue(u);\n                if (aa) {\n                    r(aa);\n                }\n            ;\n            ;\n                s();\n                o.close(n);\n            };\n            h.listen(u, \"input\", function() {\n                g.setContent(v, ((((i.getValue(u).length === 0)) ? x : w)));\n            });\n            h.listen(v, \"click\", z);\n            h.listen(u, \"keyup\", function(aa) {\n                if (((aa.keyCode === j.RETURN))) {\n                    z();\n                    return false;\n                }\n            ;\n            ;\n            });\n            g.setContent(p, t.getRoot());\n            ((!n.isAutomatic() && u.JSBNG__focus()));\n        }\n    };\n    e.exports = m;\n});\n__d(\"ChatNameConversationTabSheet\", [\"AsyncRequest\",\"ChatNameConversationTabSheetRawRenderer\",\"MercuryAPIArgsSource\",\"MercuryLogMessageType\",\"MercurySourceType\",\"MercuryMessages\",\"MercuryServerRequests\",\"MercuryThreads\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = b(\"ChatNameConversationTabSheetRawRenderer\"), i = b(\"MercuryAPIArgsSource\"), j = b(\"MercuryLogMessageType\"), k = b(\"MercurySourceType\"), l = b(\"MercuryMessages\").get(), m = b(\"MercuryServerRequests\").get(), n = b(\"MercuryThreads\").get(), o = b(\"copyProperties\"), p = \"/ajax/chat/multichat/name_conversation/dismiss.php\";\n    function q(t, u, v) {\n        this._threadID = t;\n        this._rootElement = u;\n        this._sheetView = v;\n        this._isAutomatic = false;\n    };\n;\n    o(q.prototype, {\n        render: function() {\n            n.getThreadMeta(this._threadID, function(t) {\n                h.render(this, this._sheetView, this._rootElement, t, r.curry(t), s.curry(t));\n            }.bind(this));\n        },\n        isPermanent: function() {\n            return true;\n        },\n        getType: function() {\n            return \"name_conversation_type\";\n        },\n        open: function(t) {\n            this._isAutomatic = t;\n            this._sheetView.open(this);\n        },\n        close: function() {\n            this._sheetView.close(this);\n        },\n        isAutomatic: function() {\n            return this._isAutomatic;\n        }\n    });\n    function r(t, u) {\n        var v = t.JSBNG__name;\n        if (((((u || v)) && ((u != v))))) {\n            l.sendMessage(l.constructLogMessageObject(k.CHAT_WEB, t.thread_id, j.THREAD_NAME, {\n                JSBNG__name: u\n            }), null, i.CHAT);\n        }\n    ;\n    ;\n    };\n;\n    function s(t) {\n        if (!t.name_conversation_sheet_dismissed) {\n            t.name_conversation_sheet_dismissed = true;\n            m.getServerThreadID(t.thread_id, function(u) {\n                new g(p).setData({\n                    thread_id: u\n                }).send();\n            });\n        }\n    ;\n    ;\n    };\n;\n    e.exports = q;\n});\n__d(\"ChatNewMessagesTabSheet\", [\"JSBNG__Event\",\"ArbiterMixin\",\"DOM\",\"ChatTabTemplates\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"ArbiterMixin\"), i = b(\"DOM\"), j = b(\"ChatTabTemplates\"), k = b(\"copyProperties\");\n    function l(m, n, o) {\n        this._threadID = m;\n        this._rootElement = n;\n        this._sheetView = o;\n    };\n;\n    k(l.prototype, h, {\n        render: function() {\n            var m = j[\":fb:mercury:chat:tab-sheet:clickable-message-icon-sheet\"].build();\n            i.setContent(m.getNode(\"text\"), i.tx._(\"Scroll down to see new messages.\"));\n            i.setContent(this._rootElement, m.getRoot());\n            g.listen(m.getRoot(), \"click\", function() {\n                this.inform(\"clicked\", this._threadID);\n            }.bind(this));\n        },\n        isPermanent: function() {\n            return true;\n        },\n        getType: function() {\n            return \"new_messages_type\";\n        },\n        open: function() {\n            this._sheetView.open(this);\n        },\n        close: function() {\n            this._sheetView.close(this);\n        }\n    });\n    e.exports = l;\n});\n__d(\"ChatNoRecipientsTabSheet\", [\"DOM\",\"fbt\",\"MercuryParticipants\",\"ChatTabTemplates\",\"MercuryThreadInformer\",\"MercuryThreads\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOM\"), h = b(\"fbt\"), i = b(\"MercuryParticipants\"), j = b(\"ChatTabTemplates\"), k = b(\"MercuryThreadInformer\").get(), l = b(\"MercuryThreads\").get(), m = b(\"copyProperties\");\n    function n(o, p, q) {\n        this._threadID = o;\n        this._rootElement = p;\n        this._sheetView = q;\n        k.subscribe(\"threads-updated\", this._handleThreadsUpdated.bind(this));\n    };\n;\n    m(n.prototype, {\n        render: function() {\n            var o = j[\":fb:mercury:chat:tab-sheet:message-icon-sheet\"].build();\n            g.setContent(o.getNode(\"text\"), \"Everyone has left the conversation.\");\n            g.setContent(this._rootElement, o.getRoot());\n        },\n        isPermanent: function() {\n            return true;\n        },\n        getType: function() {\n            return \"no_recipients_type\";\n        },\n        _handleThreadsUpdated: function() {\n            l.getThreadMeta(this._threadID, function(o) {\n                var p = i.user, q = o.participants.filter(function(r) {\n                    return ((r != p));\n                });\n                if (((((((q.length < 1)) && !o.is_joinable)) && !l.isNewEmptyLocalThread(this._threadID)))) {\n                    this._sheetView.open(this);\n                }\n                 else this._sheetView.close(this);\n            ;\n            ;\n            }.bind(this));\n        }\n    });\n    e.exports = n;\n});\n__d(\"ChatOfflineTabSheet\", [\"ChatPrivacyActionController\",\"ChatVisibility\",\"CSS\",\"DOM\",\"JSBNG__Event\",\"JSLogger\",\"MercuryParticipants\",\"MercuryThreads\",\"ChatTabTemplates\",\"copyProperties\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"ChatPrivacyActionController\"), h = b(\"ChatVisibility\"), i = b(\"CSS\"), j = b(\"DOM\"), k = b(\"JSBNG__Event\"), l = b(\"JSLogger\"), m = b(\"MercuryParticipants\"), n = b(\"MercuryThreads\").get(), o = b(\"ChatTabTemplates\"), p = b(\"copyProperties\"), q = b(\"cx\");\n    function r(s, t, u) {\n        this._rootElement = t;\n        this._sheetView = u;\n        this._logger = l.create(\"blackbird\");\n        this._canonicalUser = n.getCanonicalUserInThread(s);\n        if (this._canonicalUser) {\n            this._privacyActionController = new g(this._canonicalUser, this._handlePrivacyChange.bind(this));\n        }\n    ;\n    ;\n    };\n;\n    p(r.prototype, {\n        render: function() {\n            if (!this._canonicalUser) {\n                this._logger.error(\"offline_sheet_open_with_non_friend\");\n                return;\n            }\n        ;\n        ;\n            var s = o[\":fb:mercury:chat:tab-sheet:message-icon-sheet\"].build(), t = ((\"fbid:\" + this._canonicalUser));\n            m.get(t, function(u) {\n                var v = \"fbChatGoOnlineLink\", w = j.tx._(\"turn on chat\"), x = j.create(\"a\", {\n                    href: \"#\",\n                    className: v\n                }, w), y = j.tx._(\"To chat with {name} and other friends, {link}.\", {\n                    JSBNG__name: u.short_name,\n                    link: x\n                });\n                j.setContent(s.getNode(\"text\"), y);\n                i.addClass(s.getRoot(), \"_1sk1\");\n                j.setContent(this._rootElement, s.getRoot());\n                k.listen(this._rootElement, \"click\", function(JSBNG__event) {\n                    if (i.hasClass(JSBNG__event.getTarget(), v)) {\n                        if (h.isOnline()) {\n                            this._logger.error(\"tab_sheet_already_online\");\n                        }\n                    ;\n                    ;\n                        this._privacyActionController.togglePrivacy();\n                        this._logger.log(\"tab_sheet_go_online\", {\n                            tab_id: this._canonicalUser\n                        });\n                        return false;\n                    }\n                ;\n                ;\n                }.bind(this));\n            }.bind(this));\n        },\n        _handlePrivacyChange: function(s) {\n            if (!this._canonicalUser) {\n                this._logger.error(\"user_blocked_sheet_privacy_changed_non_friend\");\n            }\n        ;\n        ;\n            switch (s) {\n              case g.OFFLINE:\n                this._sheetView.open(this);\n                break;\n              case g.NORMAL:\n            \n              case g.BLOCKED:\n                this._sheetView.close(this);\n                break;\n            };\n        ;\n        },\n        isPermanent: function() {\n            return true;\n        },\n        getType: function() {\n            return \"offline_type\";\n        },\n        destroy: function() {\n            ((this._privacyActionController && this._privacyActionController.destroy()));\n        }\n    });\n    e.exports = r;\n});\n__d(\"ChatUploadWarningTabSheet\", [\"DOM\",\"ChatTabTemplates\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOM\"), h = b(\"ChatTabTemplates\"), i = b(\"copyProperties\");\n    function j(k, l, m) {\n        this._threadID = k;\n        this._rootElement = l;\n        this._sheetView = m;\n    };\n;\n    i(j.prototype, {\n        render: function() {\n            var k = h[\":fb:mercury:chat:tab-sheet:message-icon-sheet\"].build();\n            g.setContent(k.getNode(\"text\"), g.tx._(\"Please wait until the upload is complete before you send your message.\"));\n            g.setContent(this._rootElement, k.getRoot());\n        },\n        isPermanent: function() {\n            return false;\n        },\n        getType: function() {\n            return \"upload_warning_type\";\n        },\n        open: function() {\n            this._sheetView.open(this);\n        },\n        close: function() {\n            this._sheetView.close(this);\n        }\n    });\n    e.exports = j;\n});\n__d(\"ChatThreadIsMutedTabSheet\", [\"JSBNG__Event\",\"ArbiterMixin\",\"DOM\",\"ChatTabTemplates\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"ArbiterMixin\"), i = b(\"DOM\"), j = b(\"ChatTabTemplates\"), k = b(\"copyProperties\");\n    function l(m, n, o) {\n        this._threadID = m;\n        this._rootElement = n;\n        this._sheetView = o;\n    };\n;\n    k(l.prototype, h, {\n        render: function() {\n            var m = j[\":fb:mercury:chat:tab-sheet:message-mute-sheet\"].build();\n            i.setContent(m.getNode(\"text\"), i.tx._(\"This conversation is muted. Chat tabs will not pop up for it and push notifications are off.\"));\n            i.setContent(this._rootElement, m.getRoot());\n            g.listen(m.getNode(\"unmuteButton\"), \"click\", function() {\n                this.inform(\"clicked\", this._threadID);\n            }.bind(this));\n        },\n        isPermanent: function() {\n            return false;\n        },\n        getType: function() {\n            return \"chat-thread-is-muted\";\n        },\n        open: function() {\n            this._sheetView.open(this);\n        },\n        close: function() {\n            this._sheetView.close(this);\n        }\n    });\n    e.exports = l;\n});\n__d(\"ChatUserBlockedTabSheet\", [\"ChatPrivacyActionController\",\"CSS\",\"DOM\",\"JSBNG__Event\",\"GenderConst\",\"JSLogger\",\"MercuryParticipants\",\"MercuryThreads\",\"ChatTabTemplates\",\"copyProperties\",\"cx\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"ChatPrivacyActionController\"), h = b(\"CSS\"), i = b(\"DOM\"), j = b(\"JSBNG__Event\"), k = b(\"GenderConst\"), l = b(\"JSLogger\"), m = b(\"MercuryParticipants\"), n = b(\"MercuryThreads\").get(), o = b(\"ChatTabTemplates\"), p = b(\"copyProperties\"), q = b(\"cx\"), r = b(\"tx\");\n    function s(t, u, v) {\n        this._rootElement = u;\n        this._sheetView = v;\n        this._logger = l.create(\"blackbird\");\n        this._canonicalUser = n.getCanonicalUserInThread(t);\n        if (this._canonicalUser) {\n            this._privacyActionController = new g(this._canonicalUser, this._handlePrivacyChange.bind(this));\n        }\n    ;\n    ;\n    };\n;\n    p(s.prototype, {\n        render: function() {\n            if (!this._canonicalUser) {\n                this._logger.error(\"user_blocked_sheet_open_with_non_friend\");\n                return;\n            }\n        ;\n        ;\n            var t = o[\":fb:mercury:chat:tab-sheet:user-blocked\"].build(), u = ((\"fbid:\" + this._canonicalUser));\n            m.get(u, function(v) {\n                var w = null;\n                switch (v.gender) {\n                  case k.FEMALE_SINGULAR:\n                \n                  case k.FEMALE_SINGULAR_GUESS:\n                    w = r._(\"You turned off chat for {name} but you can still send her a message. \", {\n                        JSBNG__name: v.short_name\n                    });\n                    break;\n                  case k.MALE_SINGULAR:\n                \n                  case k.MALE_SINGULAR_GUESS:\n                    w = r._(\"You turned off chat for {name} but you can still send him a message. \", {\n                        JSBNG__name: v.short_name\n                    });\n                    break;\n                  default:\n                    w = r._(\"You turned off chat for {name} but you can still send them a message. \", {\n                        JSBNG__name: v.short_name\n                    });\n                };\n            ;\n                i.setContent(t.getNode(\"text\"), w);\n                var x = r._(\"Turn on chat for {name}?\", {\n                    JSBNG__name: v.short_name\n                });\n                i.setContent(t.getNode(\"actionLink\"), x);\n                h.addClass(t.getRoot(), \"_1sk0\");\n                i.setContent(this._rootElement, t.getRoot());\n                j.listen(t.getNode(\"actionLink\"), \"click\", this._privacyActionController.togglePrivacy.bind(this._privacyActionController));\n            }.bind(this));\n        },\n        _handlePrivacyChange: function(t) {\n            if (!this._canonicalUser) {\n                this._logger.error(\"user_blocked_sheet_privacy_changed_non_friend\");\n            }\n        ;\n        ;\n            switch (t) {\n              case g.BLOCKED:\n                this._sheetView.open(this);\n                break;\n              case g.NORMAL:\n            \n              case g.OFFLINE:\n                this._sheetView.close(this);\n                break;\n            };\n        ;\n        },\n        isPermanent: function() {\n            return true;\n        },\n        getType: function() {\n            return \"user_blocked_type\";\n        },\n        destroy: function() {\n            ((this._privacyActionController && this._privacyActionController.destroy()));\n        }\n    });\n    e.exports = s;\n});\n__d(\"ChatUserJoinStatusTabSheet\", [\"Class\",\"JoinStatusTabSheet\",\"ChatTabTemplates\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Class\"), h = b(\"JoinStatusTabSheet\"), i = b(\"ChatTabTemplates\"), j = b(\"copyProperties\");\n    function k(l, m) {\n        this.parent.construct(this, l, m);\n    };\n;\n    g.extend(k, h);\n    j(k.prototype, {\n        _getTemplate: function() {\n            return i[\":fb:mercury:chat:tab-sheet:message-icon-sheet\"];\n        }\n    });\n    e.exports = k;\n});\n__d(\"ChatTabSheetController\", [\"ChatAddFriendsTabSheet\",\"ChatNameConversationTabSheet\",\"ChatNewMessagesTabSheet\",\"ChatNoRecipientsTabSheet\",\"ChatOfflineTabSheet\",\"ChatUploadWarningTabSheet\",\"ChatThreadIsMutedTabSheet\",\"ChatUserBlockedTabSheet\",\"ChatUserJoinStatusTabSheet\",\"copyProperties\",\"MercurySheetView\",\"MercuryThreads\",], function(a, b, c, d, e, f) {\n    var g = b(\"ChatAddFriendsTabSheet\"), h = b(\"ChatNameConversationTabSheet\"), i = b(\"ChatNewMessagesTabSheet\"), j = b(\"ChatNoRecipientsTabSheet\"), k = b(\"ChatOfflineTabSheet\"), l = b(\"ChatUploadWarningTabSheet\"), m = b(\"ChatThreadIsMutedTabSheet\"), n = b(\"ChatUserBlockedTabSheet\"), o = b(\"ChatUserJoinStatusTabSheet\"), p = b(\"copyProperties\"), q = b(\"MercurySheetView\"), r = b(\"MercuryThreads\").get(), s = function(t, u, v) {\n        this._sheetView = new q(t, u, v);\n        this._addFriendsTabSheet = new g(t, u, this._sheetView);\n        this._nameConversationTabSheet = new h(t, u, this._sheetView);\n        this._userBlockedTabSheet = new n(t, u, this._sheetView);\n        this._offlineTabSheet = new k(t, u, this._sheetView);\n        this._newMessagesTabSheet = new i(t, u, this._sheetView);\n        this._uploadWarningTabSheet = new l(t, u, this._sheetView);\n        this._threadIsMutedTabSheet = new m(t, u, this._sheetView);\n        this._userJoinStatusTabSheet = new o(u, this._sheetView);\n        if (!r.getCanonicalUserInThread(t)) {\n            this._noRecipientsTabSheet = new j(t, u, this._sheetView);\n        }\n    ;\n    ;\n    };\n    p(s.prototype, {\n        openAddFriendsSheet: function() {\n            this._addFriendsTabSheet.open();\n        },\n        openUserJoinStatusSheet: function(t) {\n            this._userJoinStatusTabSheet.addToQueue(t);\n        },\n        getAddFriendsTabSheet: function() {\n            return this._addFriendsTabSheet;\n        },\n        getAddFriendsParticipants: function() {\n            var t = this._addFriendsTabSheet.getParticipants();\n            this._addFriendsTabSheet.close();\n            return t;\n        },\n        openNameConversationSheet: function(t) {\n            this._nameConversationTabSheet.open(t);\n        },\n        openNewMessagesSheet: function() {\n            this._newMessagesTabSheet.open();\n        },\n        openUploadWarningTabSheet: function() {\n            this._uploadWarningTabSheet.open();\n        },\n        openThreadIsMutedTabSheet: function() {\n            this._threadIsMutedTabSheet.open();\n        },\n        closeAutomaticNameConversationSheet: function() {\n            if (this._nameConversationTabSheet.isAutomatic()) {\n                this._nameConversationTabSheet.close();\n            }\n        ;\n        ;\n        },\n        closeThreadIsMutedTabSheet: function() {\n            this._threadIsMutedTabSheet.close();\n        },\n        closeNewMessagesSheet: function() {\n            this._newMessagesTabSheet.close();\n        },\n        closeUploadWarningTabSheet: function() {\n            this._uploadWarningTabSheet.close();\n        },\n        onClickNewMessagesSheet: function(t) {\n            this._newMessageClickSub = this._newMessagesTabSheet.subscribe(\"clicked\", t);\n        },\n        onClickThreadIsMutedSheet: function(t) {\n            this._threadIsMutedClickSub = this._threadIsMutedTabSheet.subscribe(\"clicked\", t);\n        },\n        onResize: function(t) {\n            this._sheetView.subscribe(\"resize\", t);\n        },\n        destroy: function() {\n            this._sheetView.destroy();\n            this._offlineTabSheet.destroy();\n            this._userBlockedTabSheet.destroy();\n            ((this._newMessageClickSub && this._newMessageClickSub.unsubscribe()));\n            ((this._threadIsMutedClickSub && this._threadIsMutedClickSub.unsubscribe()));\n        }\n    });\n    e.exports = s;\n});\n__d(\"ChatTabView\", [\"JSBNG__Event\",\"function-extensions\",\"Arbiter\",\"ArbiterMixin\",\"AsyncDialog\",\"AsyncRequest\",\"AsyncSignal\",\"AvailableListConstants\",\"ChatBehavior\",\"ChatConfig\",\"ChatContextualDialogController\",\"ChatAutoSendPhotoUploader\",\"ChatPrivacyActionController\",\"ChatQuietLinks\",\"ChatTabMessagesView\",\"ChatTabPeopleSuggestionView\",\"ChatTabSheetController\",\"ChatVisibility\",\"MercuryConstants\",\"CSS\",\"Dialog\",\"Dock\",\"DOM\",\"Input\",\"JSLogger\",\"Keys\",\"Locale\",\"MercuryActionStatus\",\"MercuryFileUploader\",\"MercuryLogMessageType\",\"MercuryMessages\",\"MercuryParticipants\",\"MercuryServerRequests\",\"MercurySourceType\",\"MercuryStickers\",\"MercuryThreadInformer\",\"MercuryThreadMetadataRawRenderer\",\"MercuryThreadMetadataRenderer\",\"MercuryThreadMuter\",\"MercuryThreads\",\"MercuryTypingReceiver\",\"MessagesEmoticonView\",\"NubController\",\"Parent\",\"PhotosUploadWaterfall\",\"PresencePrivacy\",\"PresenceStatus\",\"Run\",\"Style\",\"SubscriptionsHandler\",\"ChatTabTemplates\",\"TextAreaControl\",\"Tooltip\",\"TypingDetectorController\",\"URI\",\"UserAgent\",\"VideoCallCore\",\"WaterfallIDGenerator\",\"copyProperties\",\"cx\",\"setIntervalAcrossTransitions\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\");\n    b(\"function-extensions\");\n    var h = b(\"Arbiter\"), i = b(\"ArbiterMixin\"), j = b(\"AsyncDialog\"), k = b(\"AsyncRequest\"), l = b(\"AsyncSignal\"), m = b(\"AvailableListConstants\"), n = b(\"ChatBehavior\"), o = b(\"ChatConfig\"), p = b(\"ChatContextualDialogController\"), q = b(\"ChatAutoSendPhotoUploader\"), r = b(\"ChatPrivacyActionController\"), s = b(\"ChatQuietLinks\"), t = b(\"ChatTabMessagesView\"), u = b(\"ChatTabPeopleSuggestionView\"), v = b(\"ChatTabSheetController\"), w = b(\"ChatVisibility\"), x = b(\"MercuryConstants\"), y = b(\"CSS\"), z = b(\"Dialog\"), aa = b(\"Dock\"), ba = b(\"DOM\"), ca = b(\"Input\"), da = b(\"JSLogger\"), ea = b(\"Keys\"), fa = b(\"Locale\"), ga = b(\"MercuryActionStatus\"), ha = b(\"MercuryFileUploader\"), ia = b(\"MercuryLogMessageType\"), ja = b(\"MercuryMessages\").get(), ka = b(\"MercuryParticipants\"), la = b(\"MercuryServerRequests\").get(), ma = b(\"MercurySourceType\"), na = b(\"MercuryStickers\"), oa = b(\"MercuryThreadInformer\").get(), pa = b(\"MercuryThreadMetadataRawRenderer\"), qa = b(\"MercuryThreadMetadataRenderer\").get(), ra = b(\"MercuryThreadMuter\"), sa = b(\"MercuryThreads\").get(), ta = b(\"MercuryTypingReceiver\"), ua = b(\"MessagesEmoticonView\"), va = b(\"NubController\"), wa = b(\"Parent\"), xa = b(\"PhotosUploadWaterfall\"), ya = b(\"PresencePrivacy\"), za = b(\"PresenceStatus\"), ab = b(\"Run\"), bb = b(\"Style\"), cb = b(\"SubscriptionsHandler\"), db = b(\"ChatTabTemplates\"), eb = b(\"TextAreaControl\"), fb = b(\"Tooltip\"), gb = b(\"TypingDetectorController\"), hb = b(\"URI\"), ib = b(\"UserAgent\"), jb = b(\"VideoCallCore\"), kb = b(\"WaterfallIDGenerator\"), lb = b(\"copyProperties\"), mb = b(\"cx\"), nb = b(\"setIntervalAcrossTransitions\"), ob = b(\"tx\"), pb = /^\\s*$/, qb = da.create(\"tab_view\"), rb = {\n    }, sb = null, tb, ub;\n    function vb(qc, rc) {\n        var sc = ba.create(\"div\");\n        rc = rc.filter(function(tc) {\n            return ((tc != ka.user));\n        });\n        if (!rc.length) {\n            return fb.remove(qc);\n        }\n    ;\n    ;\n        ka.getMulti(rc, function(tc) {\n            {\n                var fin242keys = ((window.top.JSBNG_Replay.forInKeys)((tc))), fin242i = (0);\n                var uc;\n                for (; (fin242i < fin242keys.length); (fin242i++)) {\n                    ((uc) = (fin242keys[fin242i]));\n                    {\n                        var vc = tc[uc], wc = db[\":fb:mercury:chat:multichat-tooltip-item\"].build();\n                        ba.setContent(wc.getNode(\"JSBNG__name\"), vc.JSBNG__name);\n                        var xc = ka.getUserID(uc), yc = ((xc && ((za.get(xc) == m.ACTIVE))));\n                        y.conditionShow(wc.getNode(\"icon\"), yc);\n                        y.conditionClass(wc.getNode(\"JSBNG__name\"), \"tooltipItemWithIcon\", yc);\n                        ba.appendContent(sc, wc.getRoot());\n                    };\n                };\n            };\n        ;\n            fb.set(qc, sc, \"above\");\n        });\n    };\n;\n    var wb = {\n    }, xb = null, yb = false;\n    function zb(qc, rc, sc) {\n        if (sc) {\n            wb[qc] = rc;\n            if (!xb) {\n                xb = nb(ac, 600);\n            }\n        ;\n        ;\n        }\n         else {\n            y.removeClass(rc, \"highlightTitle\");\n            delete wb[qc];\n        }\n    ;\n    ;\n    };\n;\n    function ac() {\n        {\n            var fin243keys = ((window.top.JSBNG_Replay.forInKeys)((wb))), fin243i = (0);\n            var qc;\n            for (; (fin243i < fin243keys.length); (fin243i++)) {\n                ((qc) = (fin243keys[fin243i]));\n                {\n                    var rc = wb[qc];\n                    if (rc.parentNode) {\n                        y.conditionClass(rc, \"highlightTitle\", yb);\n                    }\n                     else delete wb[qc];\n                ;\n                ;\n                };\n            };\n        };\n    ;\n        yb = !yb;\n        if (!Object.keys(wb).length) {\n            JSBNG__clearInterval(xb);\n            xb = null;\n        }\n    ;\n    ;\n    };\n;\n    function bc(qc) {\n        var rc = la.tokenizeThreadID(qc);\n        switch (rc.type) {\n          case \"user\":\n            return db[\":fb:mercury:chat:user-tab\"].build();\n        };\n    ;\n        return db[\":fb:mercury:chat:multichat-tab\"].build();\n    };\n;\n    function cc(qc) {\n        var rc = ((qc._tabTemplate.getNode(\"input\").value || \"\")), sc = qc._fileUploader.getAttachments();\n        if (ic(qc)) {\n            ec(qc, rc, sc, function(tc) {\n                var uc = qc._fileUploader.getImageIDs();\n                if (((uc.length > 0))) {\n                    tc.photo_fbids = uc;\n                    tc.has_attachment = true;\n                }\n            ;\n            ;\n                ja.sendMessage(tc);\n                qc._fileUploader.removeAttachments();\n                qc._getNode(\"input\").value = \"\";\n                ((qc._lastMessageIndicator && qc._lastMessageIndicator.resetState()));\n                ((qc._messagesView && qc._messagesView.scrollToBottom()));\n            });\n        }\n    ;\n    ;\n    };\n;\n    function dc(qc, rc) {\n        if (((rc === 0))) {\n            return;\n        }\n    ;\n    ;\n        mc(qc, xa.POST_PUBLISHED, {\n            count: rc\n        });\n        qc._waterfallID = kb.generate();\n    };\n;\n    function ec(qc, rc, sc, tc) {\n        sa.getThreadMeta(qc._threadID, function(uc) {\n            var vc = ja.constructUserGeneratedMessageObject(rc, ma.CHAT_WEB, qc._threadID);\n            if (((sc.length > 0))) {\n                vc.has_attachment = true;\n                vc.raw_attachments = sc;\n            }\n        ;\n        ;\n            if (sa.isNewEmptyLocalThread(qc._threadID)) {\n                var wc = qc._sheetController.getAddFriendsParticipants();\n                if (((((wc === null)) || ((wc.length === 0))))) {\n                    return;\n                }\n                 else if (((wc.length === 1))) {\n                    var xc = ((\"user:\" + ka.getUserID(wc[0])));\n                    vc.thread_id = xc;\n                }\n                 else sa.addParticipantsToThreadLocally(qc._threadID, wc);\n                \n            ;\n            ;\n            }\n        ;\n        ;\n            if (sa.isEmptyLocalThread(qc._threadID)) {\n                var yc = la.tokenizeThreadID(qc._threadID);\n                vc.message_id = yc.value;\n                vc.specific_to_list = uc.participants;\n            }\n        ;\n        ;\n            if (((typeof vc != \"undefined\"))) {\n                vc.signatureID = qc._signatureID;\n            }\n        ;\n        ;\n            vc.ui_push_phase = x.UIPushPhase;\n            tc(vc);\n            if (((qc._threadID !== vc.thread_id))) {\n                nc.inform(\"closed-tab\", qc._threadID);\n                h.inform(\"chat/open-tab\", {\n                    thread_id: vc.thread_id\n                });\n            }\n        ;\n        ;\n        });\n    };\n;\n    function fc(qc) {\n        qc._blocked = true;\n        qc._sheetController.openUploadWarningTabSheet();\n    };\n;\n    function gc(qc) {\n        return ((qc._fileUploader.isUploading() || qc._photoUploader.isUploading()));\n    };\n;\n    function hc(qc) {\n        return qc._fileUploader.isUploading();\n    };\n;\n    function ic(qc) {\n        var rc = ((qc._tabTemplate.getNode(\"input\").value || \"\"));\n        if (!pb.test(rc)) {\n            return true;\n        }\n    ;\n    ;\n        if (((((qc._fileUploader.getAttachments().length > 0)) || ((qc._fileUploader.getImageIDs().length > 0))))) {\n            return true;\n        }\n    ;\n    ;\n        return false;\n    };\n;\n    function jc(qc) {\n        if (qc._blocked) {\n            if (hc(qc)) {\n                return;\n            }\n        ;\n        ;\n            qc._blocked = false;\n            cc(qc);\n            qc._sheetController.closeUploadWarningTabSheet();\n        }\n    ;\n    ;\n    };\n;\n    function kc(qc) {\n        qc._nubController.flyoutContentChanged();\n        qc._attachmentsDiv.scrollTop = qc._attachmentsDiv.scrollHeight;\n    };\n;\n    function lc(qc, rc, sc) {\n        qc._subscriptionsHandler.addSubscriptions(qc._photoUploader.subscribe(rc, function(tc, uc) {\n            mc(qc, sc, uc);\n        }));\n    };\n;\n    function mc(qc, rc, sc) {\n        xa.sendSignal(lb({\n            qn: qc._waterfallID,\n            step: rc,\n            uploader: xa.APP_CHAT\n        }, ((sc || {\n        }))));\n    };\n;\n    function nc(qc, rc, sc) {\n        if (rc) {\n            la.ensureThreadIsFetched(rc);\n        }\n    ;\n    ;\n        this._threadID = qc;\n        this._signatureID = sc;\n        this._eventListeners = [];\n        this._tabTemplate = bc(qc);\n        this._tabElem = this._tabTemplate.getRoot();\n        this._waterfallID = kb.generate();\n        if (!((this._getNode instanceof Function))) {\n            qb.log(\"getnode_undefined\", {\n                is_getnode_set: !!this._getNode,\n                is_prototype_set: !!nc.prototype,\n                is_window: ((window == this)),\n                is_chat_tab_view: ((this instanceof nc)),\n                ctor_name: ((this.constructor && this.constructor.JSBNG__name))\n            });\n        }\n    ;\n    ;\n        this._subscriptionsHandler = new cb();\n        this._fileUploader = new ha(this._tabTemplate.getNode(\"attachmentShelf\"), this._tabTemplate.getNode(\"attachButtonForm\"), this._tabTemplate.getNode(\"fileInput\"), this._tabTemplate.getNode(\"attachID\"));\n        this._initializeUploader(this._fileUploader);\n        this._initializeAutoSendPhotoUploader();\n        this._attachmentsDiv = this._getNode(\"attachmentShelf\");\n        this._sheetController = new v(this._threadID, this._getNode(\"sheet\"), this._tabElem);\n        this._sheetController.onClickNewMessagesSheet(function() {\n            ((this._messagesView && this._messagesView.scrollToBottom()));\n            this.JSBNG__focus();\n            nc.inform(\"read\", this._threadID);\n        }.bind(this));\n        this._sheetController.onClickThreadIsMutedSheet(function() {\n            ra.showMuteChangeDialog(0, this._threadID);\n            this.JSBNG__focus();\n        }.bind(this));\n        this._nubController = new va().init(this._tabElem);\n        this._sheetController.onResize(this._nubController.flyoutContentChanged.bind(this._nubController));\n        this._contextualDialogController = new p(this._threadID, this._getNode(\"videoCallLink\"));\n        if (((sb === null))) {\n            sb = !o.get(\"seen_autosend_photo_nux\");\n        }\n    ;\n    ;\n        if (((tb === undefined))) {\n            tb = o.get(\"show_sticker_nux\");\n        }\n    ;\n    ;\n        this._messagesView = null;\n        var tc = this._getNode(\"conversationLink\");\n        if (tc) {\n            y.hide(tc);\n            qa.renderTitanLink(qc, tc, y.show.bind(y, tc));\n        }\n    ;\n    ;\n        if (!sa.getCanonicalUserInThread(this._threadID)) {\n            this._titlebarTooltipAnchor = this._getNode(\"titlebarText\");\n        }\n    ;\n    ;\n        var uc = this._getCanonicalUserID();\n        if (this._isTitleTextLinked()) {\n            ka.get(((\"fbid:\" + uc)), function(fd) {\n                if (fd.href) {\n                    var gd = this._getNode(\"titlebarText\");\n                    gd.setAttribute(\"href\", fd.href);\n                    gd.removeAttribute(\"rel\");\n                    y.removeClass(gd, \"noLink\");\n                }\n            ;\n            ;\n            }.bind(this));\n        }\n    ;\n    ;\n        var vc = this._getNode(\"inputContainer\").clientHeight;\n        eb.getInstance(this._getNode(\"input\")).subscribe(\"resize\", function() {\n            var fd = this._getNode(\"inputContainer\").clientHeight;\n            if (((fd != vc))) {\n                this._nubController.flyoutContentChanged();\n            }\n        ;\n        ;\n            vc = fd;\n        }.bind(this));\n        var wc = null, xc = this._getNode(\"inputContainer\");\n        this._nubController.subscribe(\"resize\", function() {\n            if (!wc) {\n                wc = this._tabElem.clientWidth;\n            }\n        ;\n        ;\n            var fd = 2, gd = ((wc - ((xc.clientWidth + fd)))), hd = ((fa.isRTL() ? \"left\" : \"right\"));\n            bb.set(this._iconsContainerNode, hd, ((gd + \"px\")));\n            eb.getInstance(this._getNode(\"input\")).update();\n        }.bind(this));\n        var yc = o.get(\"chat_tab_height\");\n        if (yc) {\n            var zc = this._tabTemplate.getNode(\"chatWrapper\");\n            bb.set(zc, \"height\", ((yc + \"px\")));\n        }\n    ;\n    ;\n        this._listen(\"closeButton\", \"click\", this._closeClicked);\n        this._listen(\"titlebarCloseButton\", \"click\", this._closeClicked);\n        this._listen(\"titlebarCloseButton\", \"mousedown\", this._closePreClicked);\n        this._listen(\"dockButton\", \"click\", this._nubClicked);\n        this._listen(\"dockButton\", \"keydown\", this._dockKeyDown);\n        this._listen(\"nubFlyoutTitlebar\", \"click\", this._titleClicked);\n        this._listen(\"chatConv\", \"click\", this._chatConvClicked);\n        this._listen(\"inputContainer\", \"click\", this._inputContainerClicked);\n        this._listen(\"addFriendLink\", \"click\", this._addFriendLinkClicked, true);\n        this._listen(\"addToThreadLink\", \"click\", this._addFriendLinkClicked, true);\n        this._listen(\"nameConversationLink\", \"click\", this._nameConversationLinkClicked, true);\n        this._listen(\"clearWindowLink\", \"click\", this._clearHistory, true);\n        this._listen(\"unsubscribeLink\", \"click\", this._unsubscribeLinkClicked, true);\n        this._listen(\"videoCallLink\", \"click\", this._callClicked, true);\n        this._listen(\"reportSpamLink\", \"click\", this._reportSpamClicked, true);\n        this._listen(\"muteThreadLink\", \"click\", this._showMuteSettingDialog.bind(this, -1), true);\n        this._listen(\"unmuteThreadLink\", \"click\", this._showMuteSettingDialog.bind(this, 0), true);\n        this._listen(\"input\", \"JSBNG__focus\", this._focusTab);\n        this._listen(\"input\", \"JSBNG__blur\", this._blurTab);\n        this._listen(\"sheet\", \"keydown\", function(JSBNG__event) {\n            if (((!JSBNG__event.getModifiers().any && ((JSBNG__event.keyCode === ea.TAB))))) {\n                this._getNode(\"input\").JSBNG__focus();\n                JSBNG__event.kill();\n            }\n        ;\n        ;\n        }.bind(this));\n        this._iconsContainerNode = this._getNode(\"iconsContainer\");\n        var ad = this._getNode(\"emoticons\");\n        this._emoticonView = null;\n        if (ad) {\n            this._emoticonView = new ua(ad, this._getNode(\"input\"));\n        }\n    ;\n    ;\n        var bd = this._getNode(\"stickers\");\n        if (bd) {\n            this._stickerController = new na(bd);\n            this._subscriptionsHandler.addSubscriptions(this._stickerController.subscribe(\"stickerselected\", function(fd, gd) {\n                this._stickerSelected(gd.id);\n            }.bind(this)));\n        }\n    ;\n    ;\n        if (ib.firefox()) {\n            this._listen(\"input\", \"keypress\", this._inputKeyDown);\n        }\n         else this._listen(\"input\", \"keydown\", this._inputKeyDown);\n    ;\n    ;\n        this._privacyLink = this._getNode(\"privacyLink\");\n        if (this._privacyLink) {\n            this._privacyActionController = new r(uc, this._updatePrivacyLink.bind(this));\n            this._eventListeners.push(g.listen(this._privacyLink, \"click\", this._privacyActionController.togglePrivacy.bind(this._privacyActionController)));\n        }\n    ;\n    ;\n        sa.getThreadMeta(this._threadID, function(fd) {\n            var gd = ((uc || ((o.get(\"chat_multi_typ_send\") && !fd.is_canonical))));\n            if (gd) {\n                la.getServerThreadID(this._threadID, function(hd) {\n                    this._lastMessageIndicator = new gb(uc, this._getNode(\"input\"), \"mercury-chat\", null, hd);\n                }.bind(this));\n            }\n        ;\n        ;\n            this._setUpMutingSettings(fd);\n        }.bind(this));\n        var cd = this._getNode(\"muteGroupLink\");\n        if (cd) {\n            var dd = sa.getCanonicalGroupInThread(this._threadID);\n            if (dd) {\n                cd.setAttribute(\"ajaxify\", hb(cd.getAttribute(\"ajaxify\")).addQueryData({\n                    id: dd\n                }));\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n        s.removeEmptyHrefs(this._tabElem);\n        rb[qc] = this;\n        this.updateAvailableStatus();\n        this.updateTab();\n        this._setCloseTooltip(false);\n        var ed = {\n            threadID: qc,\n            userID: uc,\n            signatureID: this._signatureID\n        };\n        new l(\"/ajax/chat/opentab_tracking.php\", ed).send();\n        ab.onBeforeUnload(function() {\n            if (((ic(this) || gc(this)))) {\n                return \"You haven't sent your message yet. Do you want to leave without sending?\";\n            }\n        ;\n        ;\n            if (ja.getNumberLocalMessages(this._threadID)) {\n                return \"Your message is still being sent. Are you sure you want to leave?\";\n            }\n        ;\n        ;\n            return null;\n        }.bind(this), false);\n        ab.onUnload(function() {\n            oc(this);\n        }.bind(this));\n    };\n;\n    function oc(qc) {\n        if (qc._photoUploader.isUploading()) {\n            mc(qc, xa.CANCEL_DURING_UPLOAD);\n        }\n    ;\n    ;\n    };\n;\n    function pc() {\n        {\n            var fin244keys = ((window.top.JSBNG_Replay.forInKeys)((rb))), fin244i = (0);\n            var qc;\n            for (; (fin244i < fin244keys.length); (fin244i++)) {\n                ((qc) = (fin244keys[fin244i]));\n                {\n                    rb[qc].updateAvailableStatus();\n                    rb[qc].updateMultichatTooltip();\n                };\n            };\n        };\n    ;\n    };\n;\n    h.subscribe([\"buddylist/availability-changed\",], pc);\n    ya.subscribe([\"privacy-changed\",\"privacy-availability-changed\",], pc);\n    n.subscribe(n.ON_CHANGED, function() {\n        {\n            var fin245keys = ((window.top.JSBNG_Replay.forInKeys)((rb))), fin245i = (0);\n            var qc;\n            for (; (fin245i < fin245keys.length); (fin245i++)) {\n                ((qc) = (fin245keys[fin245i]));\n                {\n                    sa.getThreadMeta(qc, function(rc) {\n                        rb[qc]._updateUnreadCount(rc);\n                    });\n                ;\n                };\n            };\n        };\n    ;\n    });\n    ta.subscribe(\"state-changed\", function(qc, rc) {\n        {\n            var fin246keys = ((window.top.JSBNG_Replay.forInKeys)((rc))), fin246i = (0);\n            var sc;\n            for (; (fin246i < fin246keys.length); (fin246i++)) {\n                ((sc) = (fin246keys[fin246i]));\n                {\n                    var tc = ((rc[sc] && rc[sc].length)), uc = rb[sc];\n                    ((uc && uc.showTypingIndicator(tc)));\n                };\n            };\n        };\n    ;\n    });\n    oa.subscribe(\"threads-updated\", function(qc, rc) {\n        {\n            var fin247keys = ((window.top.JSBNG_Replay.forInKeys)((rb))), fin247i = (0);\n            var sc;\n            for (; (fin247i < fin247keys.length); (fin247i++)) {\n                ((sc) = (fin247keys[fin247i]));\n                {\n                    ((rc[sc] && rb[sc].updateTab()));\n                ;\n                };\n            };\n        };\n    ;\n    });\n    oa.subscribe(\"threads-deleted\", function(qc, rc) {\n        {\n            var fin248keys = ((window.top.JSBNG_Replay.forInKeys)((rb))), fin248i = (0);\n            var sc;\n            for (; (fin248i < fin248keys.length); (fin248i++)) {\n                ((sc) = (fin248keys[fin248i]));\n                {\n                    ((rc[sc] && nc.inform(\"thread-deleted\", sc)));\n                ;\n                };\n            };\n        };\n    ;\n    });\n    lb(nc, i, {\n        get: function(qc) {\n            return rb[qc];\n        }\n    });\n    lb(nc.prototype, {\n        getThreadID: function() {\n            return this._threadID;\n        },\n        showAddFriend: function() {\n            (function() {\n                this._sheetController.openAddFriendsSheet();\n            }).bind(this).defer();\n        },\n        showPeopleSuggestions: function() {\n            (function() {\n                this._peopleSuggestions = new u(this._sheetController, this._getNode(\"conversation\"), this._getNode(\"loadingIndicator\"));\n            }).bind(this).defer();\n        },\n        showNameConversation: function(qc) {\n            (function() {\n                this._sheetController.openNameConversationSheet(qc);\n            }).bind(this).defer();\n        },\n        hideAutomaticNameConversation: function() {\n            (function() {\n                this._sheetController.closeAutomaticNameConversationSheet();\n            }).bind(this).defer();\n        },\n        isVisible: function() {\n            return y.shown(this._tabElem);\n        },\n        setVisibleState: function(qc, rc) {\n            var sc = y.shown(this._tabElem), tc = y.hasClass(this._tabElem, \"opened\");\n            y.conditionShow(this._tabElem, qc);\n            y.conditionClass(this._tabElem, \"opened\", rc);\n            if (((((!((sc && tc)) && qc)) && rc))) {\n                if (!this._messagesView) {\n                    this._messagesView = new t(this._threadID, this._sheetController, this._getNode(\"chatConv\"), this._getNode(\"conversation\"), this._getNode(\"loadingIndicator\"), this._getNode(\"lastMessageIndicator\"), this._getNode(\"typingIndicator\"));\n                }\n            ;\n            ;\n                this._nubController.flyoutContentChanged();\n                this._messagesView.scrollToBottom();\n            }\n        ;\n        ;\n            if (((((sc && tc)) && !((qc && rc))))) {\n                this._contextualDialogController.tabNotActive();\n            }\n        ;\n        ;\n        },\n        JSBNG__focus: function() {\n            var qc = ((y.hasClass(this._tabElem, \"opened\") ? \"input\" : \"dockButton\"));\n            this._getNode(qc).JSBNG__focus();\n        },\n        isFocused: function() {\n            var qc = JSBNG__document.activeElement;\n            return ((wa.byClass(qc, \"_50mz\") === this._tabElem));\n        },\n        hasEmptyInput: function() {\n            return pb.test(this._getNode(\"input\").value);\n        },\n        getInputElem: function() {\n            return this._getNode(\"input\");\n        },\n        setInput: function(qc) {\n            this._getNode(\"input\").value = qc;\n        },\n        insertBefore: function(qc) {\n            ba.insertBefore(qc._tabElem, this._tabElem);\n        },\n        appendTo: function(qc) {\n            ba.appendContent(qc, this._tabElem);\n        },\n        nextTabIs: function(qc) {\n            var rc = ((qc && qc._tabElem));\n            return ((this._tabElem.nextSibling == rc));\n        },\n        getScrollTop: function() {\n            return ba.JSBNG__find(this._tabElem, \".scrollable\").scrollTop;\n        },\n        setScrollTop: function(qc) {\n            ba.JSBNG__find(this._tabElem, \".scrollable\").scrollTop = qc;\n        },\n        destroy: function() {\n            ba.remove(this._tabElem);\n            ((this._emoticonView && this._emoticonView.destroy()));\n            ((this._stickerController && this._stickerController.destroy()));\n            while (this._eventListeners.length) {\n                this._eventListeners.pop().remove();\n            ;\n            };\n        ;\n            ((this._messagesView && this._messagesView.destroy()));\n            this._sheetController.destroy();\n            this._fileUploader.destroy();\n            this._photoUploader.destroy();\n            this._subscriptionsHandler.release();\n            this._contextualDialogController.destroy();\n            ((this._privacyActionController && this._privacyActionController.destroy()));\n            delete rb[this._threadID];\n            aa.unregisterNubController(this._nubController);\n            ca.reset(this._getNode(\"input\"));\n        },\n        updateAvailableStatus: function() {\n            sa.getThreadMeta(this._threadID, function(qc) {\n                var rc = m.OFFLINE, sc = this._getCanonicalUserID();\n                if (sc) {\n                    rc = za.get(sc);\n                }\n                 else {\n                    var tc = qc.participants.map(function(vc) {\n                        return ka.getUserID(vc);\n                    });\n                    rc = za.getGroup(tc);\n                }\n            ;\n            ;\n                if (!w.isOnline()) {\n                    rc = m.OFFLINE;\n                }\n            ;\n            ;\n                if (sc) {\n                    this._updateCallLink(rc);\n                }\n            ;\n            ;\n                y.conditionClass(this._tabElem, \"_5238\", ((rc === m.ACTIVE)));\n                y.conditionClass(this._tabElem, \"_5239\", ((rc === m.MOBILE)));\n                var uc = this._getNode(\"presenceIndicator\");\n                switch (rc) {\n                  case m.ACTIVE:\n                    uc.setAttribute(\"alt\", \"Online\");\n                    break;\n                  case m.MOBILE:\n                    uc.setAttribute(\"alt\", \"Mobile\");\n                    break;\n                  default:\n                    uc.removeAttribute(\"alt\");\n                    break;\n                };\n            ;\n            }.bind(this));\n        },\n        updateTab: function() {\n            sa.getThreadMeta(this._threadID, function(qc) {\n                if (!qc.is_subscribed) {\n                    nc.inform(\"unsubscribed\", this._threadID);\n                    return;\n                }\n            ;\n            ;\n                qa.renderAndSeparatedParticipantList(this._threadID, [this._getNode(\"JSBNG__name\"),this._getNode(\"titlebarText\"),], {\n                    names_renderer: pa.renderShortNames,\n                    check_length: true\n                });\n                if (((qc.is_joinable && !o.get(\"joinable_conversation_is_modal\")))) {\n                    this._updateJoinableAddFriendSheet(qc);\n                }\n            ;\n            ;\n                this._updateMutingSettings(qc);\n                this._updateUnreadCount(qc);\n                this.updateMultichatTooltip();\n                this._updateArchiveWarning(qc);\n                this._updateNewThread(qc);\n                this._updateNameConversationSheet(qc);\n            }.bind(this));\n        },\n        _updateNameConversationSheet: function(qc) {\n            if (((((((!qc.JSBNG__name && !qc.is_canonical)) && !qc.name_conversation_sheet_dismissed)) && !sa.isEmptyLocalThread(qc.thread_id)))) {\n                this.showNameConversation(true);\n            }\n             else this.hideAutomaticNameConversation();\n        ;\n        ;\n        },\n        _updateJoinableAddFriendSheet: function(qc) {\n            var rc = ka.user, sc = qc.participants.filter(function(tc) {\n                return ((tc != rc));\n            });\n            if (((qc.is_joinable && ((sc.length < 1))))) {\n                this.showAddFriend();\n            }\n        ;\n        ;\n        },\n        updateSignatureID: function(qc) {\n            this._signatureID = qc;\n        },\n        _showPhotoNUXIfNecessary: function() {\n            if (sb) {\n                sb = false;\n                new k(\"/ajax/chat/photo_nux.php\").setRelativeTo(this._getNode(\"photoAttachLink\")).setData({\n                    threadID: this._threadID\n                }).send();\n                return true;\n            }\n        ;\n        ;\n        },\n        _showStickerNUXIfNecessary: function() {\n            if (tb) {\n                tb = false;\n                new k(\"/ajax/messaging/stickers/nux\").setRelativeTo(this._getNode(\"emoticons\")).setData({\n                    threadID: this._threadID\n                }).send();\n                return true;\n            }\n        ;\n        ;\n        },\n        _setUpMutingSettings: function(qc) {\n            var rc = ra.isThreadMuted(qc);\n            if (rc) {\n                this._sheetController.openThreadIsMutedTabSheet();\n            }\n        ;\n        ;\n            this._updateActionMenu(rc);\n        },\n        _updateMutingSettings: function(qc) {\n            var rc = ra.isThreadMuted(qc);\n            if (((rc && y.shown(this._getNode(\"muteThreadLink\").parentNode)))) {\n                this._sheetController.openThreadIsMutedTabSheet();\n            }\n             else if (((!rc && y.shown(this._getNode(\"unmuteThreadLink\").parentNode)))) {\n                this._sheetController.closeThreadIsMutedTabSheet();\n            }\n            \n        ;\n        ;\n            this._updateActionMenu(rc);\n        },\n        _updateActionMenu: function(qc) {\n            y.conditionShow(this._getNode(\"muteThreadLink\").parentNode, !qc);\n            y.conditionShow(this._getNode(\"unmuteThreadLink\").parentNode, qc);\n        },\n        _updateArchiveWarning: function(qc) {\n            var rc = false;\n            ka.get(ka.user, function(sc) {\n                rc = sc.employee;\n                if (rc) {\n                    ka.getMulti(qc.participants, this._showArchiveWarningIfAllParticipantsAreEmployees.bind(this));\n                }\n            ;\n            ;\n            }.bind(this));\n        },\n        _updateNewThread: function(qc) {\n            var rc = sa.isNewEmptyLocalThread(qc.thread_id);\n            y.conditionShow(this._getNode(\"dropdown\"), !rc);\n            if (rc) {\n                this.showAddFriend();\n                if (o.get(\"www_chat_compose_suggestions\", 0)) {\n                    this.showPeopleSuggestions();\n                }\n            ;\n            ;\n            }\n             else if (this._peopleSuggestions) {\n                this._peopleSuggestions.destroy();\n                this._peopleSuggestions = null;\n            }\n            \n        ;\n        ;\n        },\n        _showArchiveWarningIfAllParticipantsAreEmployees: function(qc) {\n            var rc = true;\n            {\n                var fin249keys = ((window.top.JSBNG_Replay.forInKeys)((qc))), fin249i = (0);\n                var sc;\n                for (; (fin249i < fin249keys.length); (fin249i++)) {\n                    ((sc) = (fin249keys[fin249i]));\n                    {\n                        rc = ((rc && qc[sc].employee));\n                    ;\n                    };\n                };\n            };\n        ;\n            var tc = this._getNode(\"titanArchiveWarning\");\n            if (tc) {\n                if (this._titlebarTooltipAnchor) {\n                    y.conditionClass(this._titlebarTooltipAnchor, \"narrowTitleBar\", rc);\n                }\n            ;\n            ;\n                y.conditionShow(tc, rc);\n            }\n        ;\n        ;\n        },\n        updateMultichatTooltip: function() {\n            sa.getThreadMeta(this._threadID, function(qc) {\n                if (!qc.is_canonical) {\n                    vb(this._titlebarTooltipAnchor, qc.participants);\n                }\n            ;\n            ;\n            }.bind(this));\n        },\n        _getNode: function(qc) {\n            return this._tabTemplate.getNode(qc);\n        },\n        _getCanonicalUserID: function() {\n            return sa.getCanonicalUserInThread(this._threadID);\n        },\n        _listen: function(qc, JSBNG__event, rc, sc) {\n            var tc = this._getNode(qc);\n            if (tc) {\n                this._eventListeners.push(g.listen(tc, JSBNG__event, rc.bind(this)));\n            }\n             else if (!sc) {\n                throw new Error(((((\"Could not find node \\\"\" + qc)) + \"\\\"\")));\n            }\n            \n        ;\n        ;\n        },\n        _closePreClicked: function(qc) {\n            this._closeMouseDown = true;\n        },\n        _closeClicked: function(qc) {\n            oc(this);\n            nc.inform(\"closed-tab\", this._threadID);\n            qc.kill();\n        },\n        _nubClicked: function(qc) {\n            qc.kill();\n            return nc.inform(\"nub-activated\", this._threadID);\n        },\n        _dockKeyDown: function(JSBNG__event) {\n            if (((((JSBNG__event.keyCode === ea.RETURN)) || ((JSBNG__event.keyCode === ea.SPACE))))) {\n                nc.inform(\"nub-activated\", this._threadID);\n                JSBNG__event.kill();\n            }\n             else this._handleHotkeyPressed(JSBNG__event);\n        ;\n        ;\n        },\n        _handleHotkeyPressed: function(JSBNG__event) {\n            if (((JSBNG__event.keyCode === ea.ESC))) {\n                oc(this);\n                nc.inform(\"esc-pressed\", this._threadID);\n                JSBNG__event.kill();\n            }\n             else if (((((JSBNG__event.keyCode === ea.TAB)) && !JSBNG__event.ctrlKey))) {\n                var qc = nc.inform(\"tab-pressed\", {\n                    id: this._threadID,\n                    shiftPressed: JSBNG__event.shiftKey\n                });\n                ((!qc && JSBNG__event.kill()));\n            }\n            \n        ;\n        ;\n        },\n        _isTitleTextLinked: function() {\n            var qc = this._getCanonicalUserID();\n            return ((qc && o.get(\"chat_tab_title_link_timeline\")));\n        },\n        _titleClicked: function(JSBNG__event) {\n            var qc = JSBNG__event.getTarget(), rc = wa.byClass(qc, \"titlebarText\"), sc = ((rc && this._isTitleTextLinked()));\n            if (((((!sc && !wa.byClass(qc, \"uiSelector\"))) && !wa.byClass(qc, \"addToThread\")))) {\n                nc.inform(\"lower-activated\", this._threadID);\n                JSBNG__event.kill();\n            }\n        ;\n        ;\n        },\n        _callClicked: function(qc) {\n            var rc = this._getCanonicalUserID();\n            if (jb.availableForCall(rc)) {\n                var sc = \"chat_tab_icon\";\n                if (((qc.target && y.hasClass(qc.target, \"video_call_promo\")))) {\n                    sc = \"chat_tab_icon_promo\";\n                }\n                 else if (((qc.target && y.hasClass(qc.target, \"video_call_tour\")))) {\n                    sc = \"chat_tab_icon_tour\";\n                }\n                \n            ;\n            ;\n                nc.inform(\"video-call-clicked\", {\n                    threadID: this._threadID,\n                    userID: rc,\n                    clickSource: sc\n                });\n            }\n        ;\n        ;\n            return false;\n        },\n        _addFriendLinkClicked: function() {\n            this.showAddFriend();\n        },\n        _nameConversationLinkClicked: function() {\n            this.showNameConversation();\n        },\n        _clearHistory: function() {\n            var qc = sa.getThreadMetaNow(this._threadID);\n            if (qc) {\n                var rc = this._getCanonicalUserID();\n                la.clearChat(this._threadID, rc, qc.timestamp);\n            }\n        ;\n        ;\n        },\n        _unsubscribeLinkClicked: function() {\n            var qc = [];\n            qc.push({\n                JSBNG__name: \"unsubscribe\",\n                label: \"Leave Conversation\",\n                handler: this._unsubscribeToThread.bind(this)\n            });\n            qc.push(z.CANCEL);\n            new z().setTitle(\"Leave Conversation?\").setBody(\"You will stop receiving messages from this conversation and people will see that you left.\").setButtons(qc).show();\n        },\n        _reportSpamClicked: function() {\n            var qc = this._getCanonicalUserID(), rc = hb(\"/ajax/chat/report.php\").addQueryData({\n                id: qc\n            }).addQueryData({\n                src: \"top_report_link\"\n            });\n            j.send(new k(rc));\n        },\n        _showMuteSettingDialog: function(qc) {\n            ra.showMuteChangeDialog(qc, this._threadID);\n        },\n        _focusTab: function() {\n            y.addClass(this._tabElem, \"focusedTab\");\n            if (this._peopleSuggestions) {\n                this._peopleSuggestions.clearSuggestions();\n            }\n        ;\n        ;\n            this.tryMarkAsRead();\n            this._contextualDialogController.tabFocused();\n            if (((!ub && ((this._showPhotoNUXIfNecessary() || this._showStickerNUXIfNecessary()))))) {\n                h.subscribe([\"ChatNUX/show\",\"ChatNUX/hide\",], function(JSBNG__event) {\n                    ub = ((JSBNG__event === \"ChatNUX/show\"));\n                });\n            }\n        ;\n        ;\n            this._closeMouseDown = false;\n            this._setCloseTooltip(true);\n        },\n        _blurTab: function() {\n            y.removeClass(this._tabElem, \"focusedTab\");\n            ((!this._closeMouseDown && this._setCloseTooltip(false)));\n        },\n        _setCloseTooltip: function(qc) {\n            var rc = this._getNode(\"titlebarCloseButton\"), sc = ((qc ? \"Press Esc to close\" : \"Close tab\"));\n            fb.set(rc, sc, \"above\");\n        },\n        _inputKeyDown: function(JSBNG__event) {\n            if (((((JSBNG__event.keyCode === ea.RETURN)) && !JSBNG__event.shiftKey))) {\n                if (hc(this)) {\n                    fc(this);\n                    JSBNG__event.kill();\n                    return;\n                }\n            ;\n            ;\n                cc(this);\n                JSBNG__event.kill();\n                return;\n            }\n        ;\n        ;\n            if (((((((JSBNG__event.keyCode === ea.DOWN)) && JSBNG__event.shiftKey)) && ((this._getNode(\"input\").value === \"\"))))) {\n                nc.inform(\"lower-activated\", this._threadID);\n                JSBNG__event.kill();\n                return;\n            }\n        ;\n        ;\n            this._handleHotkeyPressed(JSBNG__event);\n        },\n        tryMarkAsRead: function() {\n            if (((!this._messagesView || this._messagesView.isScrolledToBottom()))) {\n                nc.inform(\"read\", this._threadID);\n                return true;\n            }\n        ;\n        ;\n            return false;\n        },\n        _chatConvClicked: function(qc) {\n            this.tryMarkAsRead();\n            if (((wa.byTag(qc.getTarget(), \"a\") || ba.JSBNG__getSelection()))) {\n                return;\n            }\n        ;\n        ;\n            this.JSBNG__focus();\n        },\n        _inputContainerClicked: function(qc) {\n            this.tryMarkAsRead();\n            this.JSBNG__focus();\n        },\n        showTypingIndicator: function(qc) {\n            var rc = sa.getThreadMetaNow(this._threadID), sc = ((this._getCanonicalUserID() || ((((o.get(\"chat_multi_typ\") && rc)) && !rc.is_canonical))));\n            if (sc) {\n                y.conditionClass(this._tabElem, \"typing\", qc);\n            }\n        ;\n        ;\n        },\n        _updateUnreadCount: function(qc) {\n            var rc = qc.unread_count;\n            if (((typeof rc != \"undefined\"))) {\n                var sc = ((!!rc && ((!n.showsTabUnreadUI || n.showsTabUnreadUI())))), tc = this._getNode(\"numMessages\");\n                y.conditionShow(tc, sc);\n                y.conditionClass(this._tabElem, \"highlightTab\", sc);\n                zb(this._threadID, this._tabElem, sc);\n                ba.setContent(tc, rc);\n            }\n        ;\n        ;\n        },\n        _updateCallLink: function(qc) {\n            var rc = this._getNode(\"videoCallLink\");\n            if (w.isOnline()) {\n                var sc = this._getCanonicalUserID(), tc = ((\"fbid:\" + sc));\n                ka.get(tc, function(uc) {\n                    if (jb.availableForCall(sc)) {\n                        fb.set(rc, ob._(\"Start a video call with {firstname}\", {\n                            firstname: uc.short_name\n                        }));\n                        this._updateCallBackLinks(this._tabElem, true);\n                    }\n                     else {\n                        fb.set(rc, ob._(\"{firstname} is currently unavailable for video calling\", {\n                            firstname: uc.short_name\n                        }));\n                        this._hideVideoCallouts();\n                        this._updateCallBackLinks(this._tabElem, false);\n                    }\n                ;\n                ;\n                }.bind(this));\n            }\n             else {\n                fb.set(rc, \"You must be online to make a call.\");\n                this._hideVideoCallouts();\n                this._updateCallBackLinks(JSBNG__document.body, false);\n            }\n        ;\n        ;\n        },\n        _updateCallBackLinks: function(qc, rc) {\n            var sc = ba.scry(qc, \"a.callBackLink\");\n            if (rc) {\n                sc.forEach(y.show);\n            }\n             else sc.forEach(y.hide);\n        ;\n        ;\n        },\n        _hideVideoCallouts: function() {\n            this._contextualDialogController.hideVideoCallouts();\n        },\n        _updatePrivacyLink: function(qc) {\n            if (((qc == r.OFFLINE))) {\n                ba.setContent(this._privacyLink, \"Go online\");\n            }\n             else {\n                var rc = this._getCanonicalUserID(), sc = ((\"fbid:\" + rc));\n                ka.get(sc, function(tc) {\n                    var uc = null;\n                    if (((qc == r.BLOCKED))) {\n                        uc = ob._(\"Turn On Chat for {name}\", {\n                            JSBNG__name: tc.short_name\n                        });\n                    }\n                     else uc = ob._(\"Turn Off Chat for {name}\", {\n                        JSBNG__name: tc.short_name\n                    });\n                ;\n                ;\n                    ba.setContent(this._privacyLink, uc);\n                }.bind(this));\n            }\n        ;\n        ;\n        },\n        _unsubscribeToThread: function() {\n            if (sa.isEmptyLocalThread(this._threadID)) {\n                nc.inform(\"unsubscribed\", this._threadID);\n            }\n             else {\n                var qc = ja.constructLogMessageObject(ma.CHAT_WEB, this._threadID, ia.UNSUBSCRIBE, {\n                });\n                ja.sendMessage(qc);\n            }\n        ;\n        ;\n            return true;\n        },\n        _initializeUploader: function(qc) {\n            this._subscriptionsHandler.addSubscriptions(qc.subscribe([\"all-uploads-completed\",\"upload-canceled\",], function() {\n                jc(this);\n            }.bind(this)), qc.subscribe(\"dom-updated\", function() {\n                kc(this);\n            }.bind(this)), qc.subscribe(\"submit\", function() {\n                this._getNode(\"input\").JSBNG__focus();\n            }.bind(this)));\n        },\n        _initializeAutoSendPhotoUploader: function() {\n            this._photoUploader = new q(this._tabTemplate.getNode(\"photoAttachButtonForm\"), this._tabTemplate.getNode(\"photoFileInput\"), this._tabTemplate.getNode(\"photoAttachID\"));\n            var qc = {\n            };\n            lc(this, \"submit\", xa.UPLOAD_START);\n            lc(this, \"all-uploads-completed\", xa.ALL_UPLOADS_DONE);\n            lc(this, \"all-uploads-failed\", xa.CLIENT_ERROR);\n            this._subscriptionsHandler.addSubscriptions(this._photoUploader.subscribe(\"submit\", function(rc, sc) {\n                ec(this, \"\", sc.raw_attachments, function(tc) {\n                    qc[sc.upload_id] = tc;\n                    tc.do_not_send_to_server = true;\n                    tc.JSBNG__status = ga.RESENDING;\n                    ja.sendMessage(tc);\n                });\n                this._getNode(\"input\").JSBNG__focus();\n            }.bind(this)), this._photoUploader.subscribe(\"all-uploads-failed\", function(rc, sc) {\n                var tc = qc[sc.upload_id];\n                delete qc[sc.upload_id];\n                ja.deleteMessages(tc.thread_id, [tc.message_id,]);\n            }.bind(this)), this._photoUploader.subscribe(\"all-uploads-completed\", function(rc, sc) {\n                var tc = qc[sc.upload_id];\n                delete qc[sc.upload_id];\n                delete tc.raw_attachments;\n                tc.image_ids = sc.image_ids;\n                tc.do_not_send_to_server = false;\n                ja.sendMessage(tc);\n                var uc = ((sc.image_ids.length || sc.attachments.length));\n                dc(this, uc);\n            }.bind(this)));\n        },\n        _stickerSelected: function(qc) {\n            ec(this, \"\", [], function(rc) {\n                rc.has_attachment = true;\n                rc.sticker_id = qc;\n                ja.sendMessage(rc);\n                this.JSBNG__focus();\n            }.bind(this));\n        },\n        _emoticonView: null\n    });\n    e.exports = nc;\n});\n__d(\"ChatNewMessageHandler\", [\"ChatActivity\",\"ChatTabModel\",\"ChatTabView\",\"JSLogger\",\"MercuryAssert\",\"MercuryBrowserAlerts\",\"MercuryUnseenState\",], function(a, b, c, d, e, f) {\n    var g = b(\"ChatActivity\"), h = b(\"ChatTabModel\"), i = b(\"ChatTabView\"), j = b(\"JSLogger\"), k = b(\"MercuryAssert\"), l = b(\"MercuryBrowserAlerts\"), m = b(\"MercuryUnseenState\").get(), n = j.create(\"chat_new_message\"), o = {\n        _raiseTab: function(p, q) {\n            var r = h.getTab(p), s = false;\n            if (r) {\n                s = r.raised;\n            }\n             else {\n                h.raiseTab(p, false);\n                s = true;\n            }\n        ;\n        ;\n            q.to_new_tab = !r;\n            q.to_raised_tab = !!s;\n        },\n        _notify: function(p, q, r) {\n            var s = i.get(p);\n            r.view_is_visible = ((s && s.isVisible()));\n            r.view_is_focused = ((s && s.isFocused()));\n            if (!r.view_is_visible) {\n                n.log(\"message_to_hidden\");\n            }\n        ;\n        ;\n            r.is_active = g.isActive();\n            l.messageReceived(q);\n        },\n        _promoteTab: function(p, q, r) {\n            if (((((r && !r[p])) && q))) {\n                h.promoteThreadInPlaceOfThread(p, q);\n            }\n        ;\n        ;\n        },\n        newMessage: function(p, q, r, s) {\n            k.isThreadID(p);\n            var t = {\n                thread_id: p,\n                message_id: q.message_id\n            };\n            this._raiseTab(p, t);\n            this._promoteTab(p, r, s);\n            this._notify(p, q, t);\n            n.log(\"message\", t);\n        }\n    };\n    l.subscribe(\"before-alert\", function(p, JSBNG__event) {\n        var q = JSBNG__event.threadID, r = i.get(q), s = h.getTab(q);\n        if (((((((((((s && s.raised)) && r)) && r.isVisible())) && r.isFocused())) && r.tryMarkAsRead()))) {\n            m.markThreadSeen(q);\n            JSBNG__event.cancelAlert();\n        }\n    ;\n    ;\n    });\n    e.exports = o;\n});\n__d(\"ChatTabPresence\", [\"AvailableList\",\"ChatTabModel\",\"MercuryThreads\",], function(a, b, c, d, e, f) {\n    var g = b(\"AvailableList\"), h = b(\"ChatTabModel\"), i = b(\"MercuryThreads\").get(), j = {\n    };\n    function k(l) {\n        var m = i.getCanonicalUserInThread(l);\n        if (m) {\n            g.updateForID(m);\n        }\n    ;\n    ;\n    };\n;\n    h.subscribe(\"chat/tabs-changed\", function(JSBNG__event, l) {\n        l.tabs.forEach(function(m) {\n            if (((m.raised && !j[m.id]))) {\n                k(m.id);\n            }\n        ;\n        ;\n        });\n        j = {\n        };\n        l.tabs.forEach(function(m) {\n            if (m.raised) {\n                j[m.id] = true;\n            }\n        ;\n        ;\n        });\n    });\n    e.exports = {\n    };\n});\n__d(\"ChatTabPolicy\", [\"ChatBehavior\",\"FBDesktopPlugin\",\"JSLogger\",\"MercuryActionTypeConstants\",\"MercuryAssert\",\"MercuryParticipants\",\"MercuryParticipantTypes\",\"MercurySourceType\",\"MercuryThreadMode\",\"MercuryThreadMuter\",\"MercuryUnseenState\",\"MessagingTag\",\"PresencePrivacy\",\"ShortProfiles\",], function(a, b, c, d, e, f) {\n    var g = b(\"ChatBehavior\"), h = b(\"FBDesktopPlugin\"), i = b(\"JSLogger\"), j = b(\"MercuryActionTypeConstants\"), k = b(\"MercuryAssert\"), l = b(\"MercuryParticipants\"), m = b(\"MercuryParticipantTypes\"), n = b(\"MercurySourceType\"), o = b(\"MercuryThreadMode\"), p = b(\"MercuryThreadMuter\"), q = b(\"MercuryUnseenState\").get(), r = b(\"MessagingTag\"), s = b(\"PresencePrivacy\"), t = b(\"ShortProfiles\"), u = i.create(\"tab_policy\");\n    function v(w, x) {\n        q.markThreadSeen(w, x);\n    };\n;\n    e.exports = {\n        messageIsAllowed: function(w, x, y) {\n            var z = w.thread_id, aa = x.message_id;\n            k.isThreadID(z);\n            k.isParticipantID(x.author);\n            var ba;\n            if (p.isThreadMuted(w)) {\n                ba = {\n                    thread_id: z,\n                    message_id: aa,\n                    mute_settings: w.mute_settings\n                };\n                u.log(\"message_thread_muted\", ba);\n                return;\n            }\n        ;\n        ;\n            if (((w.mode == o.OBJECT_ORIGINATED))) {\n                ba = {\n                    thread_id: z,\n                    message_id: aa,\n                    mode: w.mode\n                };\n                u.log(\"message_object_originated\", ba);\n                return;\n            }\n        ;\n        ;\n            if (((((x.source == n.EMAIL)) || ((x.source == n.TITAN_EMAIL_REPLY))))) {\n                ba = {\n                    thread_id: z,\n                    message_id: aa,\n                    source: x.source\n                };\n                u.log(\"message_source_not_allowed\", ba);\n                return;\n            }\n        ;\n        ;\n            var ca = l.getUserID(x.author);\n            if (!ca) {\n                u.log(\"message_bad_author\", {\n                    thread_id: z,\n                    message_id: aa,\n                    user: ca\n                });\n                return;\n            }\n        ;\n        ;\n            if (((x.action_type != j.USER_GENERATED_MESSAGE))) {\n                ba = {\n                    thread_id: z,\n                    message_id: aa,\n                    type: x.action_type\n                };\n                u.log(\"message_non_user_generated\", ba);\n                return;\n            }\n        ;\n        ;\n            if (((w.is_canonical_user && !g.notifiesUserMessages()))) {\n                u.log(\"message_jabber\", {\n                    thread_id: z,\n                    message_id: aa\n                });\n                v(z, true);\n                return;\n            }\n        ;\n        ;\n            if (((w.is_canonical && !w.canonical_fbid))) {\n                u.log(\"message_canonical_contact\", {\n                    thread_id: z,\n                    message_id: aa\n                });\n                return;\n            }\n        ;\n        ;\n            if (h.shouldSuppressMessages()) {\n                u.log(\"message_desktop\", {\n                    thread_id: z,\n                    message_id: aa\n                });\n                return;\n            }\n        ;\n        ;\n            if (((w.folder != r.INBOX))) {\n                u.log(\"message_folder\", {\n                    thread_id: z,\n                    message_id: aa,\n                    folder: w.folder\n                });\n                return;\n            }\n        ;\n        ;\n            var da = l.getUserID(l.user);\n            t.getMulti([ca,da,], function(ea) {\n                if (!s.allows(ca)) {\n                    u.log(\"message_privacy\", {\n                        thread_id: z,\n                        message_id: aa,\n                        user: ca\n                    });\n                    return;\n                }\n            ;\n            ;\n                var fa = ((ea[ca].employee && ea[da].employee));\n                if (((!fa && ((ea[ca].type !== m.FRIEND))))) {\n                    u.log(\"message_non_friend\", {\n                        thread_id: z,\n                        message_id: aa,\n                        user: ca\n                    });\n                    return;\n                }\n            ;\n            ;\n                y();\n            });\n        }\n    };\n});\n__d(\"ChatTabViewSelector\", [\"JSBNG__Event\",\"Arbiter\",\"CSS\",\"DataStore\",\"DOM\",\"MenuDeprecated\",\"MercuryThreadInformer\",\"MercuryThreads\",\"NubController\",\"ChatTabTemplates\",\"MercuryThreadMetadataRenderer\",\"Toggler\",\"copyProperties\",], 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(\"MenuDeprecated\"), m = b(\"MercuryThreadInformer\").get(), n = b(\"MercuryThreads\").get(), o = b(\"NubController\"), p = b(\"ChatTabTemplates\"), q = b(\"MercuryThreadMetadataRenderer\").get(), r = b(\"Toggler\"), s = b(\"copyProperties\");\n    function t(u) {\n        var v = p[\":fb:chat:tab:selector\"].build(), w = v.getRoot(), x = v.getNode(\"menu\"), y = k.JSBNG__find(x, \".uiMenuInner\"), z = {\n        }, aa = new o().init(w);\n        i.hide(w);\n        k.insertBefore(u, w);\n        function ba(ea) {\n            var fa = 0;\n            {\n                var fin250keys = ((window.top.JSBNG_Replay.forInKeys)((z))), fin250i = (0);\n                var ga;\n                for (; (fin250i < fin250keys.length); (fin250i++)) {\n                    ((ga) = (fin250keys[fin250i]));\n                    {\n                        var ha = z[ga], ia = n.getThreadMetaNow(ga), ja = ha.getNode(\"unreadCount\"), ka = ((((ia && ia.unread_count)) || 0));\n                        fa += ka;\n                        if (((ka > 9))) {\n                            ka = \"+\";\n                        }\n                    ;\n                    ;\n                        i.conditionClass(ja, \"invisible_elem\", !ka);\n                        k.setContent(ja, ka);\n                    };\n                };\n            };\n        ;\n            var la = v.getNode(\"numMessages\");\n            i.conditionShow(la, fa);\n            k.setContent(la, fa);\n        };\n    ;\n        this.setTabData = function(ea) {\n            z = {\n            };\n            if (((ea.length < 1))) {\n                i.hide(w);\n                return;\n            }\n        ;\n        ;\n            i.show(w);\n            k.empty(y);\n            ea.forEach(function(fa) {\n                var ga = p[\":fb:chat:tab:selector:item\"].build();\n                z[fa.id] = ga;\n                var ha = ga.getNode(\"JSBNG__content\");\n                q.renderAndSeparatedParticipantList(fa.id, ha);\n                k.prependContent(y, ga.getRoot());\n                j.set(ga.getRoot(), \"threadID\", fa.id);\n                var ia = ga.getNode(\"closeButton\");\n                g.listen(ia, \"click\", function(JSBNG__event) {\n                    t.inform(\"selector/close-tab\", fa.id);\n                    JSBNG__event.kill();\n                });\n            });\n            aa.flyoutContentChanged();\n            k.setContent(v.getNode(\"numTabs\"), ea.length);\n            ba();\n        };\n        function ca(JSBNG__event, ea) {\n            if (((ea.menu != x))) {\n                return;\n            }\n        ;\n        ;\n            var fa = j.get(ea.item, \"threadID\");\n            t.inform(\"selected\", fa);\n            r.hide(w);\n        };\n    ;\n        function da(JSBNG__event, ea) {\n            l.register(x);\n        };\n    ;\n        l.subscribe(\"select\", ca.bind(this));\n        r.listen(\"show\", w, function() {\n            h.inform(\"layer_shown\", {\n                type: \"ChatTabSelector\"\n            });\n            da();\n        });\n        r.listen(\"hide\", w, function() {\n            h.inform(\"layer_hidden\", {\n                type: \"ChatTabSelector\"\n            });\n        });\n        m.subscribe(\"threads-updated\", ba);\n    };\n;\n    s(t, new h());\n    e.exports = t;\n});\n__d(\"ChatTabController\", [\"ChatTabPresence\",\"ChatTypeaheadBehavior\",\"Arbiter\",\"ChatActivity\",\"ChatBehavior\",\"ChatConfig\",\"ChatNewMessageHandler\",\"ChatTabMessagesView\",\"ChatTabModel\",\"ChatTabPolicy\",\"ChatTabView\",\"ChatTabViewSelector\",\"JSLogger\",\"MercuryParticipants\",\"MercuryServerRequests\",\"MercuryThreadInformer\",\"MercuryThreads\",\"MercuryUnseenState\",\"Style\",\"UserAgent\",\"VideoCallCore\",], function(a, b, c, d, e, f) {\n    b(\"ChatTabPresence\");\n    b(\"ChatTypeaheadBehavior\");\n    var g = b(\"Arbiter\"), h = b(\"ChatActivity\"), i = b(\"ChatBehavior\"), j = b(\"ChatConfig\"), k = b(\"ChatNewMessageHandler\"), l = b(\"ChatTabMessagesView\"), m = b(\"ChatTabModel\"), n = b(\"ChatTabPolicy\"), o = b(\"ChatTabView\"), p = b(\"ChatTabViewSelector\"), q = b(\"JSLogger\"), r = b(\"MercuryParticipants\"), s = b(\"MercuryServerRequests\").get(), t = b(\"MercuryThreadInformer\").get(), u = b(\"MercuryThreads\").get(), v = b(\"MercuryUnseenState\").get(), w = b(\"Style\"), x = b(\"UserAgent\"), y = b(\"VideoCallCore\"), z = ((j.get(\"tab_auto_close_timeout\") || 7200000)), aa = q.create(\"tab_controller\");\n    function ba(na) {\n        u.changeThreadReadStatus(na, true);\n        ca(na);\n    };\n;\n    function ca(na) {\n        v.markThreadSeen(na);\n    };\n;\n    function da(na, oa, pa) {\n        var qa = m.get().tabs;\n        na += ((oa ? 1 : -1));\n        while (((((na >= 0)) && ((na < qa.length))))) {\n            var ra = qa[na], sa = o.get(ra.id);\n            if (((((sa && sa.isVisible())) && ((!pa || ra.raised))))) {\n                sa.JSBNG__focus();\n                return true;\n            }\n        ;\n        ;\n            na += ((oa ? 1 : -1));\n        };\n    ;\n        return false;\n    };\n;\n    function ea(na, oa, pa) {\n        var qa = oa.shouldPromoteOnRaise(na);\n        g.inform(\"chat/promote-tab\", na);\n        if (qa) {\n            m.raiseAndPromoteTab(na, true, pa);\n        }\n         else m.raiseTab(na, true, pa);\n    ;\n    ;\n        var ra = o.get(na);\n        ((ra && ra.JSBNG__focus()));\n    };\n;\n    function fa(na, oa, pa) {\n        var qa = pa.getMaxTabsToShow(), ra = m.indexOf(na);\n        m.closeTabAndDemote(na, ((qa - 2)), oa);\n        return ra;\n    };\n;\n    function ga(na) {\n        var oa = Object.keys(((na.getTabsToShow() || {\n        }))), pa = ((1 * 60)), qa = null, ra = Infinity;\n        for (var sa = 0; ((sa < oa.length)); sa++) {\n            var ta = oa[sa], ua = u.getThreadMetaNow(ta);\n            if (((!o.get(ta).hasEmptyInput() || !ua))) {\n                continue;\n            }\n        ;\n        ;\n            var va = ((((m.getServerTime() - ua.timestamp)) / 1000));\n            if (((!ua.timestamp || ((((ua.timestamp && ((ua.timestamp < ra)))) && ((va > pa))))))) {\n                qa = ua.thread_id;\n                ra = ua.timestamp;\n            }\n        ;\n        ;\n        };\n    ;\n        return qa;\n    };\n;\n    function ha(na) {\n        p.subscribe(\"selected\", function(pa, qa) {\n            ea(qa, na);\n        });\n        g.subscribe(\"chat/open-tab\", function(pa, qa) {\n            ea(qa.thread_id, na, qa.signature_id);\n        });\n        g.subscribe(\"page_transition\", function(pa, qa) {\n            m.closeFragileTabs();\n        });\n        o.subscribe(\"read\", function(JSBNG__event, pa) {\n            ba(pa);\n        });\n        h.subscribe(\"idle\", function(pa, qa) {\n            if (((qa > z))) {\n                var ra = m.get().tabs;\n                ra.forEach(function(sa) {\n                    var ta = sa.id;\n                    u.getThreadMeta(ta, function(ua) {\n                        if (!ua.unread_count) {\n                            aa.log(\"autoclose_idle_seen\", {\n                                thread_id: ta,\n                                idleness: qa\n                            });\n                            m.closeTab(ta, \"autoclose_idle_seen\");\n                        }\n                    ;\n                    ;\n                    });\n                });\n            }\n        ;\n        ;\n        });\n        o.subscribe(\"nub-activated\", function(pa, qa) {\n            ea(qa, na);\n        });\n        o.subscribe(\"lower-activated\", function(pa, qa) {\n            m.lowerTab(qa);\n            var ra = o.get(qa);\n            ((ra && ra.JSBNG__focus()));\n        });\n        function oa(pa, qa) {\n            y.showOutgoingCallDialog(qa.userID, qa.clickSource);\n            m.lowerTab(qa.threadID);\n        };\n    ;\n        o.subscribe(\"video-call-clicked\", oa);\n        l.subscribe(\"video-call-clicked\", oa);\n        o.subscribe(\"closed-tab\", function(pa, qa) {\n            aa.log(\"close_view\", {\n                thread_id: qa\n            });\n            fa(qa, \"close_view\", na);\n            return false;\n        });\n        o.subscribe(\"thread-deleted\", function(pa, qa) {\n            aa.log(\"close_thread_deleted\", {\n                thread_id: qa\n            });\n            fa(qa, \"close_thread_deleted\", na);\n            return false;\n        });\n        o.subscribe(\"unsubscribed\", function(pa, qa) {\n            aa.log(\"close_view_unsubscribed\", {\n                thread_id: qa\n            });\n            fa(qa, \"close_view_unsubscribed\", na);\n            return false;\n        });\n        o.subscribe(\"esc-pressed\", function(pa, qa) {\n            aa.log(\"close_esc\", {\n                thread_id: qa\n            });\n            var ra = fa(qa, \"close_esc\", na);\n            (function() {\n                ((da(((ra - 1)), true, true) || da(ra, false, true)));\n            }).defer();\n        });\n        p.subscribe(\"selector/close-tab\", function(pa, qa) {\n            aa.log(\"close_chat_from_selector\", {\n                thread_id: qa\n            });\n            fa(qa, \"close_chat_from_selector\", na);\n        });\n        t.subscribe(\"messages-received\", function(pa, qa) {\n            {\n                var fin251keys = ((window.top.JSBNG_Replay.forInKeys)((qa))), fin251i = (0);\n                var ra;\n                for (; (fin251i < fin251keys.length); (fin251i++)) {\n                    ((ra) = (fin251keys[fin251i]));\n                    {\n                        var sa = qa[ra];\n                        for (var ta = 0; ((ta < sa.length)); ta++) {\n                            var ua = sa[ta];\n                            if (((ua.author != r.user))) {\n                                if (!ua.is_unread) {\n                                    aa.log(\"message_already_read\", {\n                                        action_id: ua.action_id,\n                                        thread_id: ua.thread_id\n                                    });\n                                    continue;\n                                }\n                            ;\n                            ;\n                                u.getThreadMeta(ra, function(va) {\n                                    n.messageIsAllowed(va, ua, function() {\n                                        var wa = ((na.hasRoomForRaisedTab() ? undefined : ga(na)));\n                                        k.newMessage(ra, ua, wa, na.getTabsToShow());\n                                    });\n                                });\n                            }\n                        ;\n                        ;\n                        };\n                    ;\n                    };\n                };\n            };\n        ;\n        });\n        t.subscribe(\"thread-read-changed\", function(pa, qa) {\n            {\n                var fin252keys = ((window.top.JSBNG_Replay.forInKeys)((qa))), fin252i = (0);\n                var ra;\n                for (; (fin252i < fin252keys.length); (fin252i++)) {\n                    ((ra) = (fin252keys[fin252i]));\n                    {\n                        if (!qa[ra].mark_as_read) {\n                            aa.log(\"autoclose_marked_unread\", {\n                                thread_id: ra\n                            });\n                            m.closeTab(ra, \"autoclose_marked_unread\");\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n        });\n        o.subscribe(\"tab-pressed\", function(pa, qa) {\n            return !da(m.indexOf(qa.id), qa.shiftPressed);\n        });\n        g.subscribe(q.DUMP_EVENT, function(pa, qa) {\n            qa.chat_controller = {\n                auto_close_timeout: z\n            };\n        });\n    };\n;\n    if (x.firefox()) {\n        var ia = function() {\n            return ((((w.get(JSBNG__document.body, \"overflowX\") + \" \")) + w.get(JSBNG__document.body, \"overflowY\")));\n        }, ja = ia(), ka = function() {\n            var na = ia();\n            if (((na !== ja))) {\n                ja = na;\n                g.inform(\"overflow-applied-to-body\");\n            }\n        ;\n        ;\n        };\n        if (((\"JSBNG__MutationObserver\" in window))) {\n            var la = new JSBNG__MutationObserver(ka), ma = {\n                attributes: true,\n                attributeFilter: [\"class\",\"style\",]\n            };\n            la.observe(JSBNG__document.documentElement, ma);\n        }\n         else JSBNG__document.documentElement.JSBNG__addEventListener(\"DOMAttrModified\", function(JSBNG__event) {\n            if (((((JSBNG__event.getTarget() === JSBNG__document.documentElement)) && ((((JSBNG__event.attrName === \"class\")) || ((JSBNG__event.attrName === \"style\"))))))) {\n                ka();\n            }\n        ;\n        ;\n        }, false);\n    ;\n    ;\n    }\n;\n;\n    e.exports = ha;\n});\n__d(\"ChatTabViewCoordinator\", [\"Arbiter\",\"ChatTabModel\",\"ChatTabView\",\"ChatTabViewSelector\",\"CSS\",\"VideoCallCore\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ChatTabModel\"), i = b(\"ChatTabView\"), j = b(\"ChatTabViewSelector\"), k = b(\"CSS\"), l = b(\"VideoCallCore\");\n    function m(n, o) {\n        var p = new j(n), q = {\n        }, r = false;\n        function s() {\n            var w = h.get(), x = {\n            };\n            w.tabs.forEach(function(z) {\n                x[z.id] = 1;\n            });\n            {\n                var fin253keys = ((window.top.JSBNG_Replay.forInKeys)((q))), fin253i = (0);\n                var y;\n                for (; (fin253i < fin253keys.length); (fin253i++)) {\n                    ((y) = (fin253keys[fin253i]));\n                    {\n                        if (!x[y]) {\n                            q[y].destroy();\n                            delete (q[y]);\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            t(w);\n            u(w);\n        };\n    ;\n        function t(w) {\n            var x = null;\n            w.tabs.forEach(function(y) {\n                var z = y.id, aa = false;\n                if (!q[z]) {\n                    q[z] = new i(z, y.server_id, y.signatureID);\n                    aa = true;\n                }\n                 else q[z].updateSignatureID(y.signatureID);\n            ;\n            ;\n                if (((aa || !q[z].nextTabIs(x)))) {\n                    var ba = q[z].getScrollTop();\n                    if (x) {\n                        q[z].insertBefore(x);\n                    }\n                     else q[z].appendTo(n);\n                ;\n                ;\n                    if (ba) {\n                        q[z].setScrollTop(ba);\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n                x = q[z];\n            });\n        };\n    ;\n        function u(w) {\n            var x = o.getTabsToShow(w), y = [], z = false;\n            w.tabs.forEach(function(aa) {\n                if (!x[aa.id]) {\n                    q[aa.id].setVisibleState(false, aa.raised);\n                    y.push(aa);\n                }\n            ;\n            ;\n            });\n            w.tabs.forEach(function(aa) {\n                if (x[aa.id]) {\n                    q[aa.id].setVisibleState(true, aa.raised);\n                    z |= aa.raised;\n                }\n            ;\n            ;\n            });\n            p.setTabData(y);\n            v(z);\n        };\n    ;\n        function v(w) {\n            if (((!w && r))) {\n                g.inform(\"layer_hidden\", {\n                    type: \"ChatTab\"\n                });\n                r = false;\n            }\n             else if (((w && !r))) {\n                g.inform(\"layer_shown\", {\n                    type: \"ChatTab\"\n                });\n                r = true;\n            }\n            \n        ;\n        ;\n        };\n    ;\n        if (l.isSupported()) {\n            k.addClass(n, \"videoCallEnabled\");\n        }\n    ;\n    ;\n        o.subscribe(\"tabs-changed\", s);\n        s();\n    };\n;\n    e.exports = m;\n});\n__d(\"TabsViewport\", [\"Arbiter\",\"ArbiterMixin\",\"ChatTabModel\",\"Dock\",\"DOM\",\"DOMDimensions\",\"JSBNG__Event\",\"Parent\",\"Vector\",\"ViewportBounds\",\"areObjectsEqual\",\"copyProperties\",\"csx\",\"shield\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ArbiterMixin\"), i = b(\"ChatTabModel\"), j = b(\"Dock\"), k = b(\"DOM\"), l = b(\"DOMDimensions\"), m = b(\"JSBNG__Event\"), n = b(\"Parent\"), o = b(\"Vector\"), p = b(\"ViewportBounds\"), q = b(\"areObjectsEqual\"), r = b(\"copyProperties\"), s = b(\"csx\"), t = b(\"shield\"), u = 164, v = 264;\n    function w(x) {\n        this._root = x;\n        var y = this._recalculateWidth.bind(this);\n        m.listen(window, \"resize\", y);\n        j.subscribe(\"resize\", y);\n        g.subscribe([\"LitestandSidebar/expand\",\"LitestandSidebar/collapse\",], y);\n        g.subscribeOnce([\"sidebar/initialized\",\"LitestandSidebar/initialized\",], y, g.SUBSCRIBE_NEW);\n        i.subscribe(\"chat/tabs-changed\", t(this._recalculateTabs, this, true));\n        this._recalculateWidth();\n        this._initialized = true;\n    };\n;\n    r(w.prototype, h, {\n        _root: null,\n        _initialized: false,\n        _availableWidth: 0,\n        _maxShown: 1,\n        _viewState: null,\n        _recalculateWidth: function() {\n            var x = w._getAvailableDockWidth(this._root), y = Math.max(1, Math.floor(((x / v)))), z = ((y != this._maxShown));\n            if (((((((!this._viewState || z)) || ((x <= this._viewState.usedWidth)))) || ((x > this._viewState.widthToShowNext))))) {\n                this._availableWidth = x;\n                this._maxShown = y;\n                this._viewState = null;\n                this._recalculateTabs(z);\n            }\n        ;\n        ;\n        },\n        _onTabsChanged: function() {\n            if (this._initialized) {\n                this.inform(\"tabs-changed\");\n                this.inform(\"max-to-show-changed\", this._maxShown);\n                this.inform(\"max-to-show-change-completed\");\n            }\n        ;\n        ;\n        },\n        _recalculateTabs: function(x) {\n            var y = w._getTabsToShow(i.get(), this._availableWidth);\n            if (((x || !q(this._viewState, y)))) {\n                this._viewState = y;\n                this._onTabsChanged();\n            }\n        ;\n        ;\n        },\n        getMaxTabsToShow: function() {\n            return this._maxShown;\n        },\n        checkWidth: function() {\n            this._recalculateWidth();\n        },\n        hasRoomForRaisedTab: function() {\n            return ((((this._availableWidth - this._viewState.usedWidth)) > v));\n        },\n        getTabsToShow: function() {\n            return JSON.parse(JSON.stringify(this._viewState.tabsToShow));\n        },\n        shouldPromoteOnRaise: function(x) {\n            if (!this._viewState.tabsToShow[x]) {\n                return true;\n            }\n        ;\n        ;\n            if (((this._viewState.nextToHide != x))) {\n                return false;\n            }\n        ;\n        ;\n            var y = i.getTab(x), z = ((y && y.raised));\n            return ((!z && ((((this._availableWidth - this._viewState.usedWidth)) < 100))));\n        }\n    });\n    r(w, {\n        _getAvailableDockWidth: function(x) {\n            var y = l.getViewportWithoutScrollbarDimensions().width;\n            y -= ((p.getLeft() + p.getRight()));\n            y -= 50;\n            var z = n.byClass(x, \"fbDock\"), aa = k.JSBNG__find(z, \"._56ox\"), ba = o.getElementDimensions(aa).x;\n            y -= ba;\n            var ca = k.JSBNG__find(z, \"._56oy\");\n            ba += o.getElementDimensions(ca).x;\n            var da = o.getElementDimensions(z), ea = ((da.x - ba));\n            y -= ea;\n            y -= 15;\n            return Math.max(y, 0);\n        },\n        _getTabsToShow: function(x, y) {\n            y = Math.max(y, ((v + 1)));\n            function z(oa) {\n                return ((oa.raised ? v : u));\n            };\n        ;\n            var aa = JSON.parse(JSON.stringify(x.tabs)), ba = -1, ca = null;\n            if (x.promoted) {\n                aa.forEach(function(oa, pa) {\n                    if (((oa.id === x.promoted))) {\n                        ba = pa;\n                        ca = oa;\n                    }\n                ;\n                ;\n                });\n            }\n        ;\n        ;\n            var da = 0, ea = 0, fa = !ca;\n            aa.forEach(function(oa, pa) {\n                var qa = z(oa);\n                oa.leftmostOffset = ((da + v));\n                da += qa;\n                if (((oa.leftmostOffset < y))) {\n                    ea++;\n                }\n            ;\n            ;\n                fa |= ((pa == ba));\n                oa.alreadyPlacedPromoted = fa;\n            });\n            function ga(oa, pa, qa) {\n                var ra = {\n                };\n                for (var sa = 0; ((sa < pa)); sa++) {\n                    var ta = oa[sa];\n                    if (((!ta.alreadyPlacedPromoted && ((sa == ((pa - 1))))))) {\n                        ra[qa] = true;\n                    }\n                     else ra[ta.id] = true;\n                ;\n                ;\n                };\n            ;\n                return ra;\n            };\n        ;\n            var ha = ga(aa, ea, x.promoted), ia = ga(aa, ((ea - 1)), x.promoted), ja = null;\n            {\n                var fin254keys = ((window.top.JSBNG_Replay.forInKeys)((ha))), fin254i = (0);\n                var ka;\n                for (; (fin254i < fin254keys.length); (fin254i++)) {\n                    ((ka) = (fin254keys[fin254i]));\n                    {\n                        if (!ia[ka]) {\n                            ja = ka;\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            var la = aa[((ea - 1))], ma = ((la ? la.leftmostOffset : 0)), na = Infinity;\n            if (((ea < aa.length))) {\n                na = aa[ea].leftmostOffset;\n            }\n        ;\n        ;\n            return {\n                nextToHide: ja,\n                tabsToShow: ha,\n                usedWidth: ma,\n                widthToShowNext: na\n            };\n        }\n    });\n    e.exports = w;\n});\n__d(\"LinkshimHandler\", [\"JSBNG__Event\",\"LinkshimAsyncLink\",\"LinkshimHandlerConfig\",\"URI\",\"shield\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"LinkshimAsyncLink\"), i = b(\"LinkshimHandlerConfig\"), j = b(\"URI\"), k = b(\"shield\"), l = {\n        setUpLinkshimHandling: function(r) {\n            var s = j(r.getAttribute(\"href\")), t = m(s);\n            if (((t && n(s)))) {\n                g.listen(r, \"mouseover\", k(h.swap, null, r, t));\n                var u = p(s);\n                g.listen(r, \"click\", function() {\n                    if (i.supports_meta_referrer) {\n                        h.referrer_log(r, u, o(s).toString());\n                    }\n                     else h.swap(r, s);\n                ;\n                ;\n                });\n            }\n        ;\n        ;\n        }\n    };\n    function m(r) {\n        return ((r.getQueryData().u ? new j(r.getQueryData().u) : null));\n    };\n;\n    function n(r) {\n        return r.getQueryData().hasOwnProperty(\"s\");\n    };\n;\n    function o(r) {\n        return j(\"/si/ajax/l/render_linkshim_log/\").setSubdomain(\"www\").setQueryData(r.getQueryData());\n    };\n;\n    function p(r) {\n        var s;\n        if (q()) {\n            s = j(r).addQueryData({\n                render_verification: true\n            });\n        }\n         else s = m(r);\n    ;\n    ;\n        return s;\n    };\n;\n    function q() {\n        var r = ((i.render_verification_rate || 0));\n        return ((Math.floor(((((Math.JSBNG__random() * r)) + 1))) === r));\n    };\n;\n    e.exports = l;\n});\n__d(\"legacy:CompactTypeaheadRenderer\", [\"CompactTypeaheadRenderer\",], function(a, b, c, d) {\n    if (!a.TypeaheadRenderers) {\n        a.TypeaheadRenderers = {\n        };\n    }\n;\n;\n    a.TypeaheadRenderers.compact = b(\"CompactTypeaheadRenderer\");\n}, 3);");
// 13257
fpc.call(JSBNG_Replay.s5e7dba3ea700a5261ca8857ec975a807389e8969_270[0], o96,o97);
// undefined
o97 = null;
// 13262
JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_190[0](o98,false,"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/y1/r/-lwVuunZG1z.js",o206);
// undefined
o98 = null;
// undefined
o206 = null;
// 13266
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o7,"if (self.CavalryLogger) {\n    CavalryLogger.start_js([\"H+v1W\",]);\n}\n;\n__d(\"CanvasAppRequestUpdater\", [\"Arbiter\",\"CSS\",\"ChannelConstants\",\"DOM\",\"copyProperties\",\"csx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"CSS\"), i = b(\"ChannelConstants\"), j = b(\"DOM\"), k = b(\"copyProperties\"), l = b(\"csx\");\n    function m(n) {\n        this._root = n;\n        g.subscribe(i.getArbiterType(\"app_request_create\"), function(o, p) {\n            var q = j.scry(this._root, (\".item_\" + p.obj.appid))[0], r = (q && j.scry(q, \"._1k71\")[0]);\n            (r && j.appendContent(r, p.obj.request));\n            (q && this._updateBookmark(q, 1));\n        }.bind(this));\n        g.subscribe(i.getArbiterType(\"app_request_delete\"), function(o, p) {\n            var q = j.scry(this._root, (\".item_\" + p.obj.appid))[0], r = (q && j.scry(q, ((\"[data-requestid='\" + p.obj.requestid) + \"']\"))[0]);\n            (r && j.remove(r.parentNode));\n            (q && this._updateBookmark(q, -1));\n        }.bind(this));\n    };\n    k(m.prototype, {\n        _updateBookmark: function(n, o) {\n            var p = j.find(n, \"._1k72\"), q = j.find(n, \".countValue\"), r = parseInt(j.getText(q), 10), s = Math.max(0, (r + o));\n            j.setContent(q, s);\n            if ((s < 1)) {\n                h.hide(q.parentNode);\n                h.hide(p);\n            }\n             else {\n                h.show(q.parentNode);\n                h.show(p);\n            }\n        ;\n        }\n    });\n    e.exports = m;\n});\n__d(\"CanvasFlyoutLoader\", [\"AsyncRequest\",\"Event\",\"shield\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = b(\"Event\"), i = b(\"shield\"), j = {\n        endpoint: \"/ajax/canvas/flyouts\",\n        init: function(k, l, m) {\n            this.root = k;\n            this.largeApps = l;\n            this.seeAllApps = m;\n            this.handler = h.listen(k, \"mouseenter\", i(this.loadFlyouts, this));\n        },\n        loadFlyouts: function() {\n            this.handler.remove();\n            this.handler = null;\n            var k = {\n                items: this.largeApps,\n                all_apps: this.seeAllApps\n            };\n            new g().setURI(this.endpoint).setRelativeTo(this.root).setMethod(\"post\").setReadOnly(true).setData(k).setAllowCrossPageTransition(true).send();\n        }\n    };\n    e.exports = j;\n});\n__d(\"CanvasRecommendationFlyoutLoader\", [\"AsyncRequest\",\"Event\",\"shield\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = b(\"Event\"), i = b(\"shield\"), j = {\n        endpoint: \"/ajax/canvas/recommendation/flyouts\",\n        init: function(k, l, m, n) {\n            this.root = k;\n            this.apps = l;\n            this.editorialApps = m;\n            if (n) {\n                this.egoRedirectUrls = n;\n            };\n            this.handler = h.listen(k, \"mouseenter\", i(this.loadFlyouts, this));\n        },\n        loadFlyouts: function() {\n            this.handler.remove();\n            this.handler = null;\n            var k = {\n                items: this.apps\n            };\n            if (this.editorialApps) {\n                k.editorial_items = this.editorialApps;\n            };\n            if (this.egoRedirectUrls) {\n                k.egoredirecturls = this.egoRedirectUrls;\n            };\n            new g().setURI(this.endpoint).setRelativeTo(this.root).setMethod(\"post\").setReadOnly(true).setData(k).setAllowCrossPageTransition(true).send();\n        }\n    };\n    e.exports = j;\n});\n__d(\"BuddyListNub\", [\"JSXDOM\",\"Event\",\"Arbiter\",\"AvailableList\",\"BlackbirdUpsell\",\"ChannelConnection\",\"ChannelConstants\",\"ChatConfig\",\"ChatVisibility\",\"Class\",\"CSS\",\"Dock\",\"DOM\",\"HTML\",\"Keys\",\"NubController\",\"OrderedFriendsList\",\"Parent\",\"PresencePrivacy\",\"Toggler\",\"copyProperties\",\"csx\",\"cx\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSXDOM\"), h = b(\"Event\"), i = b(\"Arbiter\"), j = b(\"AvailableList\"), k = b(\"BlackbirdUpsell\"), l = b(\"ChannelConnection\"), m = b(\"ChannelConstants\"), n = b(\"ChatConfig\"), o = b(\"ChatVisibility\"), p = b(\"Class\"), q = b(\"CSS\"), r = b(\"Dock\"), s = b(\"DOM\"), t = b(\"HTML\"), u = b(\"Keys\"), v = b(\"NubController\"), w = b(\"OrderedFriendsList\"), x = b(\"Parent\"), y = b(\"PresencePrivacy\"), z = b(\"Toggler\"), aa = b(\"copyProperties\"), ba = b(\"csx\"), ca = b(\"cx\"), da = b(\"tx\"), ea = 32, fa = 10;\n    function ga(ha, ia, ja) {\n        this.parent.construct(this);\n        this.parent.init(ha);\n        this.root = ha;\n        this.orderedList = ia;\n        this.typeahead = ja;\n        this.button = s.find(ha, \"a.fbNubButton\");\n        this.unreadCount = s.find(ha, \"span._5ayx\");\n        this.label = s.find(ha, \"span.label\");\n        this.body = s.scry(ha, \"div.fbNubFlyoutBody\")[0];\n        this.container = x.byClass(ha, \"_56ox\");\n        var ka = s.find(ha, \"div.fbNubFlyoutTitlebar\");\n        z.createInstance(ka).setSticky(false);\n        ia.subscribe(\"render\", this.flyoutContentChanged.bind(this));\n        ia.setScrollContainer(this.body);\n        j.subscribe(\"buddylist/availability-changed\", this._updateCount.bind(this));\n        i.subscribe(\"chat/connect\", this._handleConnect.bind(this));\n        y.subscribe(\"privacy-user-presence-changed\", this._handleVisibilityChange.bind(this));\n        this.message = s.find(ha, \"div._4mq1\");\n        this.warningMsgText = null;\n        this.warningMsgEventListener = null;\n        this.showWarningTimeout = null;\n        l.subscribe(l.CONNECTED, this._handleChannelConnected.bind(this));\n        l.subscribe(l.SHUTDOWN, this._handleChannelShutdown.bind(this));\n        l.subscribe(l.RECONNECTING, this._handleChannelReconnecting.bind(this));\n        l.subscribe([l.MUTE_WARNING,l.UNMUTE_WARNING,], this._updateView.bind(this));\n        this.subscribe(\"show\", this.onShow.bind(this));\n        this.subscribe(\"hide\", this.onHide.bind(this));\n        this.subscribe(\"resize\", this.onResize.bind(this));\n        h.listen(ha, \"keydown\", this._onKeyDown.bind(this));\n        h.listen(this.button, \"click\", this.onButtonClick.bind(this));\n        ja.subscribe([\"respond\",\"reset\",], function(la, ma) {\n            if (this._isOpen) {\n                var na = this.orderedList.isVisible();\n                if ((((ma && ma.value) && (ma.value === ja.getCore().getValue())) && ja.getView().isVisible())) {\n                    r.setUseMaxHeight(this.root, false);\n                    this.orderedList.hide();\n                }\n                 else this._showBuddyList();\n            ;\n                if ((na !== this.orderedList.isVisible())) {\n                    this.flyoutContentChanged();\n                };\n            }\n        ;\n        }.bind(this));\n        i.subscribe(\"sidebar/show\", this.hide.bind(this));\n        if (n.get(\"litestand_buddylist_count\")) {\n            i.subscribe(\"buddylist-nub/updateCount\", function(la, ma) {\n                this._unreadMessageCount = ma.count;\n                this._updateView();\n            }.bind(this));\n        };\n        this._orderedListCount = w.getList().length;\n        i.inform(\"buddylist-nub/initialized\", this, i.BEHAVIOR_PERSISTENT);\n        this._handleVisibilityChange();\n    };\n    p.extend(ga, v);\n    aa(ga.prototype, {\n        getButton: function() {\n            return this.button;\n        },\n        getRoot: function() {\n            return this.root;\n        },\n        _handleConnect: function(ha) {\n            this._updateView(true);\n        },\n        _getShutdownReason: function(ha) {\n            switch (ha) {\n              case m.HINT_AUTH:\n                return \"Your session has timed out. Please log in.\";\n              case m.HINT_CONN:\n                return da._(\"Facebook {Chat} is currently unavailable.\", {\n                    Chat: \"Chat\"\n                });\n              case m.HINT_MAINT:\n                return da._(\"Facebook {Chat} is currently down for maintenance.\", {\n                    Chat: \"Chat\"\n                });\n              default:\n                return da._(\"Facebook {Chat} is currently unavailable.\", {\n                    Chat: \"Chat\"\n                });\n            };\n        },\n        _getReconnectMsg: function(ha) {\n            var ia;\n            if ((ha === null)) {\n                ia = \"Unable to connect to chat. Check your Internet connection.\";\n            }\n             else if ((ha > n.get(\"warning_countdown_threshold_msec\"))) {\n                var ja = s.create(\"a\", {\n                    href: \"#\",\n                    className: \"fbChatReconnectLink\"\n                }, \"Try again\"), ka = s.create(\"div\", null, ja), la = ka.innerHTML;\n                ia = t(da._(\"Unable to connect to chat. {try-again-link}\", {\n                    \"try-again-link\": la\n                }));\n            }\n             else if ((ha > 1000)) {\n                ia = da._(\"Unable to connect to chat. Reconnecting in {seconds}...\", {\n                    seconds: Math.floor((ha / 1000))\n                });\n            }\n             else ia = \"Unable to connect to chat. Reconnecting...\";\n            \n            \n        ;\n            return ia;\n        },\n        _resetShowWarningTimeout: function() {\n            if (this.showWarningTimeout) {\n                clearTimeout(this.showWarningTimeout);\n                this.showWarningTimeout = null;\n            }\n        ;\n        },\n        _handleChannelConnected: function(ha) {\n            this._resetShowWarningTimeout();\n            if (this.orderedList.isVisible()) {\n                o.goOnline();\n            };\n            this.warningMsgText = null;\n            this._updateView();\n        },\n        _handleChannelShutdown: function(ha, ia) {\n            this._resetShowWarningTimeout();\n            this.warningMsgText = this._getShutdownReason(ia);\n            this._updateView();\n        },\n        _handleChannelReconnecting: function(ha, ia) {\n            this._resetShowWarningTimeout();\n            this.warningMsgText = this._getReconnectMsg(ia);\n            if ((ia > 1000)) {\n                if ((ia > n.get(\"warning_countdown_threshold_msec\"))) {\n                    if (this.warningMsgEventListener) {\n                        this.warningMsgEventListener.remove();\n                        this.warningMsgEventListener = null;\n                    }\n                ;\n                    this.warningMsgEventListener = h.listen(this.message, \"click\", function(event) {\n                        if (q.hasClass(event.getTarget(), \"fbChatReconnectLink\")) {\n                            this._tryReconnect();\n                            event.kill();\n                        }\n                    ;\n                    }.bind(this));\n                }\n            ;\n                this.showWarningTimeout = setTimeout(this._handleChannelReconnecting.bind(this, ha, (ia - 1000)), 1000, false);\n            }\n        ;\n            this._updateView();\n        },\n        _tryReconnect: function() {\n            if (l.disconnected()) {\n                l.reconnect();\n            };\n        },\n        _handleVisibilityChange: function() {\n            this._updateView();\n            if (k.shouldShow()) {\n                if (o.hasBlackbirdEnabled()) {\n                    k.showBlackbirdDialog(this.getButton(), y.getVisibility());\n                }\n                 else if (!o.isOnline()) {\n                    k.showOfflineDialog(this.getButton());\n                }\n            ;\n            }\n             else k.hide();\n        ;\n            if (!o.isOnline()) {\n                this.hide();\n            };\n        },\n        _updateView: function(ha) {\n            var ia = this.container;\n            if (ia) {\n                q.conditionClass(ia, \"offline\", !o.isOnline());\n                q.conditionClass(ia, \"error\", l.disconnected());\n            }\n        ;\n            if (l.disconnected()) {\n                s.setContent(this.message, this.warningMsgText);\n            };\n            var ja, ka;\n            if (!o.isOnline()) {\n                ja = da._(\"{Chat} (Off)\", {\n                    Chat: \"Chat\"\n                });\n            }\n             else if (l.disconnected()) {\n                ja = da._(\"{Chat} (Disconnected)\", {\n                    Chat: \"Chat\"\n                });\n            }\n             else {\n                var la = j.getOnlineCount();\n                if (la) {\n                    ja = da._(\"{Chat} {number-available}\", {\n                        Chat: \"Chat\",\n                        \"number-available\": g.span({\n                            className: \"count\"\n                        }, \" (\", g.strong(null, la), \") \")\n                    });\n                }\n                 else {\n                    ja = \"Chat\";\n                    ka = true;\n                }\n            ;\n            }\n            \n        ;\n            this._setUnread(this._unreadMessageCount);\n            this._setLabel(ja, ka);\n            this.buttonContentChanged();\n        },\n        onButtonClick: function() {\n            this._conditionallyShowTypeahead();\n            if (q.shown(this.typeahead.getElement())) {\n                var ha = this.subscribe(\"show\", function() {\n                    this.typeahead.getCore().getElement().focus();\n                    k.dismiss();\n                }.bind(this));\n                this.unsubscribe.bind(this, ha).defer();\n            }\n        ;\n        },\n        onHide: function() {\n            this._isOpen = false;\n            if (this._buddyListRenderSubscription) {\n                this.orderedList.unsubscribe(this._buddyListRenderSubscription);\n                this._buddyListRenderSubscription = null;\n            }\n        ;\n            this.orderedList.hide();\n            this.typeahead.getCore().reset();\n        },\n        _onKeyDown: function(event) {\n            var ha = h.getKeyCode(event);\n            if (((ha === u.ESC) && !q.hasClass(this.root, \"menuOpened\"))) {\n                this.hide();\n                return false;\n            }\n        ;\n        },\n        onResize: function() {\n            var ha = (r.getMaxFlyoutHeight(this.root) - 60), ia = Math.max(250, ha);\n            this.orderedList.setNumTopFriends(Math.floor((ia / ea)));\n        },\n        _showBuddyList: function() {\n            if (!this._buddyListRenderSubscription) {\n                this._buddyListRenderSubscription = this.orderedList.subscribe(\"render\", r.setUseMaxHeight.bind(r, this.root, false));\n            };\n            this.orderedList.show();\n        },\n        onShow: function() {\n            this._isOpen = true;\n            if (l.disconnected()) {\n                this._tryReconnect();\n                this._showBuddyList();\n            }\n             else o.goOnline(this._showBuddyList.bind(this));\n        ;\n        },\n        _setLabel: function(ha, ia) {\n            var ja = this.label.cloneNode(true);\n            s.setContent(ja, ha);\n            s.replace(this.label, ja);\n            this.label = ja;\n            (this.throbber && q.conditionShow(this.throbber, !!ia));\n        },\n        _setUnread: function(ha) {\n            q.conditionShow(this.unreadCount, !!ha);\n            if (ha) {\n                ha = g.span({\n                    className: \"_51jx _5ayw\"\n                }, ha);\n                s.setContent(this.unreadCount, ha);\n            }\n        ;\n        },\n        _conditionallyShowTypeahead: function() {\n            q.conditionShow(this.typeahead.getElement(), (this._orderedListCount >= fa));\n        },\n        _updateCount: function() {\n            this._updateView();\n            this._conditionallyShowTypeahead();\n        }\n    });\n    e.exports = ga;\n});\n__d(\"LiveBarData\", [\"function-extensions\",\"Arbiter\",\"ArbiterMixin\",\"AsyncRequest\",\"ChannelConstants\",\"LayerDestroyOnHide\",\"copyProperties\",\"setTimeoutAcrossTransitions\",], function(a, b, c, d, e, f) {\n    b(\"function-extensions\");\n    var g = b(\"Arbiter\"), h = b(\"ArbiterMixin\"), i = b(\"AsyncRequest\"), j = b(\"ChannelConstants\"), k = b(\"LayerDestroyOnHide\"), l = b(\"copyProperties\"), m = b(\"setTimeoutAcrossTransitions\"), n = false, o = {\n    }, p = {\n    }, q = {\n    };\n    function r(y) {\n        if (((((y.expires * 1000)) - Date.now()) > 0)) {\n            return true\n        };\n        return false;\n    };\n    function s(y) {\n        var z = y.payload.actions;\n        if (!((z && z.length))) {\n            return\n        };\n        var aa;\n        for (var ba = 0; (ba < z.length); ba++) {\n            aa = z[ba].actor_id;\n            if ((!o[aa] || (z[ba].action_id != o[aa].action_id))) {\n                continue;\n            };\n            if ((z[ba].delete_action || z[ba].remove)) {\n                v(z[ba]);\n                continue;\n            }\n        ;\n        };\n    };\n    function t(y) {\n        var z = false;\n        for (var aa = 0; (aa < y.length); aa++) {\n            if ((y[aa].delete_action || y[aa].remove)) {\n                v(y[aa]);\n                continue;\n            }\n        ;\n            var ba = y[aa].actor_id, ca = y[aa].action_id;\n            if (o[ba]) {\n                if ((o[ba].action_id == ca)) {\n                    continue;\n                };\n                v(o[ba]);\n            }\n        ;\n            z = true;\n            o[ba] = y[aa];\n            u(y[aa]);\n        };\n        if (z) {\n            x.inform(\"new-actions\");\n        };\n    };\n    function u(y) {\n        var z = (((y.expires * 1000)) - Date.now());\n        p[y.actor_id] = m(v.curry(y), Math.max(0, z));\n    };\n    function v(y) {\n        if (!o[y.actor_id]) {\n            return\n        };\n        if ((o[y.actor_id].action_id != y.action_id)) {\n            return\n        };\n        delete o[y.actor_id];\n        var z = y.actor_id;\n        if (p[z]) {\n            clearTimeout(p[z]);\n            delete p[z];\n        }\n    ;\n        w(z);\n        x.inform(\"remove-action\", y);\n    };\n    function w(y) {\n        var z = q[y];\n        if (z) {\n            z.enableBehavior(k);\n            if (!z.isShown()) {\n                z.destroy();\n            };\n            delete q[y];\n        }\n    ;\n    };\n    g.subscribe(j.getArbiterType(\"livebar_update\"), function(y, z) {\n        t(z.obj.actions);\n    });\n    var x = {\n    };\n    l(x, h, {\n        fetch: function() {\n            if (n) {\n                return\n            };\n            var y = [];\n            for (var z in o) {\n                var aa = o[z];\n                if (aa.suppress_callout) {\n                    continue;\n                };\n                if (!q[aa.actor_id]) {\n                    y.push(o[z]);\n                };\n            };\n            if ((y.length > 0)) {\n                n = true;\n                new i().setURI(\"/ajax/chat/livebar.php\").setData({\n                    actions: y\n                }).setHandler(s).setFinallyHandler(function() {\n                    n = false;\n                }).setAllowCrossPageTransition(true).send();\n            }\n        ;\n        },\n        addActions: t,\n        getAction: function(y) {\n            var z = o[y];\n            if ((z && r(z))) {\n                return z\n            };\n            return null;\n        },\n        getDialog: function(y) {\n            var z = this.getAction(y);\n            if ((z && q[z.actor_id])) {\n                return q[z.actor_id]\n            };\n            return null;\n        },\n        setDialog: function(y, z, aa) {\n            var ba = o[y];\n            if ((ba && (ba.action_id == z))) {\n                w(y);\n                q[y] = aa;\n                x.inform(\"dialog-fetched\", y);\n            }\n        ;\n        }\n    });\n    e.exports = x;\n});\n__d(\"LiveBar\", [\"ChatOrderedList\",\"function-extensions\",\"LegacyContextualDialog\",\"ChatConfig\",\"CSS\",\"LiveBarData\",\"copyProperties\",\"setTimeoutAcrossTransitions\",\"shield\",], function(a, b, c, d, e, f) {\n    b(\"ChatOrderedList\");\n    b(\"function-extensions\");\n    b(\"LegacyContextualDialog\");\n    var g = b(\"ChatConfig\"), h = b(\"CSS\"), i = b(\"LiveBarData\"), j = b(\"copyProperties\"), k = b(\"setTimeoutAcrossTransitions\"), l = b(\"shield\"), m = (g.get(\"livebar_fetch_defer\") || 1000);\n    function n(o, p, q) {\n        this._orderedList = o;\n        this._root = o.getRoot();\n        this._liveBarTypes = q;\n        this._hoverController = o.getHoverController();\n        this._hoverController.subscribe(\"hover\", this._mouseMove.bind(this));\n        this._hoverController.subscribe(\"leave\", this._mouseLeave.bind(this));\n        o.subscribe(\"render\", l(this._handleChatListUpdate, this));\n        i.subscribe(\"new-actions\", this._updateIcons.bind(this));\n        i.subscribe(\"remove-action\", this._handleRemoveAction.bind(this));\n        i.subscribe(\"dialog-fetched\", function(r, s) {\n            this._setDialogContent(s);\n        }.bind(this));\n        i.addActions(p);\n    };\n    j(n, {\n        setDialog: function(o, p, q) {\n            i.setDialog(o, p, q);\n        }\n    });\n    j(n.prototype, {\n        _root: null,\n        _liveBarTypes: null,\n        _hoverController: null,\n        _registrations: {\n        },\n        _renderedIcons: {\n        },\n        _fetchTimer: null,\n        _mouseLeftRoot: false,\n        _chatListRendered: false,\n        _getLiveBarTypes: function() {\n            return this._liveBarTypes;\n        },\n        _handleChatListUpdate: function() {\n            if (!this._chatListRendered) {\n                this._chatListRendered = true;\n                this._updateIcons();\n            }\n        ;\n        },\n        _handleShow: function(o) {\n            this._setDialogContent(o);\n        },\n        _mouseMove: function() {\n            if (!this._fetchTimer) {\n                this._fetchTimer = k(this._fetch.bind(this), m);\n                this._mouseLeftRoot = false;\n            }\n        ;\n        },\n        _mouseLeave: function() {\n            this._mouseLeftRoot = true;\n            clearTimeout(this._fetchTimer);\n            this._fetchTimer = null;\n        },\n        _setDialogContent: function(o) {\n            var p = i.getDialog(o);\n            if (p) {\n                this._hoverController.showHovercard(o, p);\n            };\n        },\n        _fetch: function() {\n            if (this._mouseLeftRoot) {\n                return\n            };\n            this._fetchTimer = null;\n            i.fetch();\n        },\n        _updateIcons: function() {\n            if (!this._chatListRendered) {\n                return\n            };\n            var o = this._orderedList.getAllNodes(), p = this._getLiveBarTypes();\n            for (var q in o) {\n                var r = i.getAction(q);\n                if ((r && ((!this._renderedIcons[q] || (this._renderedIcons[q] != r.action_id))))) {\n                    for (var s = 0; (s < p.length); s++) {\n                        h.removeClass(o[q], p[s]);;\n                    };\n                    h.addClass(o[q], r.livebar_type);\n                    this._renderedIcons[q] = r.action_id;\n                    var t = this._hoverController.register(q, this._handleShow.bind(this));\n                    if (t) {\n                        this._registrations[q] = t;\n                    };\n                }\n            ;\n            };\n        },\n        _handleRemoveAction: function(o, p) {\n            var q = p.action_id, r = p.actor_id;\n            (this._registrations[r] && this._registrations[r].unregister());\n            delete this._registrations[r];\n            if ((this._renderedIcons[r] == q)) {\n                var s = this._getLiveBarTypes(), t = this._orderedList.getAllNodes();\n                if (t[r]) {\n                    for (var u = 0; (u < s.length); u++) {\n                        h.removeClass(t[r], s[u]);;\n                    }\n                };\n                delete this._renderedIcons[r];\n            }\n        ;\n        }\n    });\n    e.exports = n;\n});\n__d(\"LiveBarDark\", [\"Class\",\"LiveBar\",\"copyProperties\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"Class\"), h = b(\"LiveBar\"), i = b(\"copyProperties\"), j = b(\"emptyFunction\");\n    function k(l, m, n) {\n        this.parent.construct(this, l, m, n);\n    };\n    g.extend(k, h);\n    i(k.prototype, {\n        _setupDialogContent: j,\n        _show: j,\n        _updateIcons: j,\n        _handleRemoveAction: j,\n        _handleChatListUpdate: j\n    });\n    e.exports = k;\n});\n__d(\"ChatSidebarDropdown\", [\"Arbiter\",\"AsyncRequest\",\"Chat\",\"ChatOptions\",\"ChatVisibility\",\"CSS\",\"DOM\",\"Event\",\"JSLogger\",\"PresenceState\",\"SelectorDeprecated\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"AsyncRequest\"), i = b(\"Chat\"), j = b(\"ChatOptions\"), k = b(\"ChatVisibility\"), l = b(\"CSS\"), m = b(\"DOM\"), n = b(\"Event\"), o = b(\"JSLogger\"), p = b(\"PresenceState\"), q = b(\"SelectorDeprecated\"), r = b(\"copyProperties\");\n    function s(t, u) {\n        this._root = t;\n        this._logger = o.create(\"blackbird\");\n        this._displayBrowserNotificationsIfNeeded();\n        q.listen(t, \"select\", this._onSelect.bind(this));\n        q.listen(t, \"toggle\", this._onToggle.bind(this));\n        if (u) {\n            q.listen(t, \"close\", u.allowCollapse.curry(true, \"SidebarMenu\"));\n            q.listen(t, \"open\", u.allowCollapse.curry(false, \"SidebarMenu\"));\n        }\n    ;\n        g.subscribe(\"chat/option-changed\", this._onOptionChanged.bind(this));\n    };\n    r(s, {\n        registerEditFavorites: function(t, u, v) {\n            function w(x) {\n                l.conditionShow(t, !x);\n                l.conditionShow(u, x);\n            };\n            n.listen(t, \"click\", function() {\n                v.toggleEditMode();\n                w(true);\n            });\n            n.listen(u, \"click\", function() {\n                v.toggleEditMode();\n                w(false);\n            });\n            v.subscribe(\"editStart\", w.curry(true));\n            v.subscribe(\"editEnd\", w.curry(false));\n        }\n    });\n    r(s.prototype, {\n        changeSetting: function(t, u) {\n            if (this._pendingChange) {\n                return false\n            };\n            this._pendingChange = true;\n            var v = {\n            };\n            v[t] = u;\n            j.setSetting(t, u, \"sidebar_menu\");\n            new h(\"/ajax/chat/settings.php\").setHandler(this._onChangeSettingResponse.bind(this, t, u)).setErrorHandler(this._onChangeSettingError.bind(this, t, u)).setFinallyHandler(this._onChangeFinally.bind(this)).setData(v).setAllowCrossPageTransition(true).send();\n        },\n        _displayBrowserNotificationsIfNeeded: function() {\n            if (window.webkitNotifications) {\n                m.scry(document, \"li.sidebar-browser-notif\").forEach(l.show);\n                if ((window.webkitNotifications.checkPermission() !== 0)) {\n                    m.scry(document, \"li.sidebar-browser-notif\").forEach(function(t) {\n                        l.removeClass(t, \"checked\");\n                    });\n                };\n            }\n        ;\n        },\n        _conditionEnabled: function(t, u) {\n            var v = q.getOption(this._root, t);\n            (v && q.setOptionEnabled(v, u));\n        },\n        _onChangeSettingResponse: function(t, u, v) {\n            p.doSync();\n        },\n        _onChangeSettingError: function(t, u, v) {\n            j.setSetting(t, !u, \"sidebar_menu_error\");\n        },\n        _onChangeFinally: function() {\n            this._pendingChange = false;\n        },\n        _onOptionChanged: function(t, u) {\n            var v = u.name, w = u.value;\n            if (((v === \"sound\") || (v === \"browser_notif\"))) {\n                var x = q.getOption(this._root, v);\n                if ((w !== q.isOptionSelected(x))) {\n                    q.setSelected(this._root, v, w);\n                };\n            }\n        ;\n        },\n        _onSelect: function(t) {\n            if (this._pendingChange) {\n                return false\n            };\n            var u = false, v = false, w = q.getOptionValue(t.option);\n            switch (w) {\n              case \"sidebar\":\n                return this.toggleSidebar();\n              case \"online\":\n                if (!k.isOnline()) {\n                    k.goOnline();\n                }\n                 else v = true;\n            ;\n                u = true;\n                break;\n              case \"offline\":\n                if (k.isOnline()) {\n                    k.goOffline();\n                }\n                 else v = true;\n            ;\n                u = true;\n                break;\n              case \"advanced_settings\":\n            \n              case \"turn_off_dialog\":\n                g.inform(\"chat/advanced-settings-dialog-opened\");\n                u = true;\n                break;\n            };\n            if (v) {\n                this._logger.error(\"sidebar_dropdown_visibility_error\", {\n                    action: w\n                });\n            }\n             else this._logger.log(\"sidebar_dropdown_set_visibility\", {\n                action: w\n            });\n        ;\n            if (u) {\n                q.toggle(this._root);\n                return false;\n            }\n        ;\n        },\n        _onToggle: function(t) {\n            if (this._pendingChange) {\n                return false\n            };\n            var u = q.getOptionValue(t.option), v = q.isOptionSelected(t.option);\n            switch (u) {\n              case \"visibility\":\n                if (!k) {\n                    this._jslogger.error(\"on_toggle_visibility_undefined\");\n                    return;\n                }\n            ;\n                k.toggleVisibility();\n                this._logger.log(\"sidebar_dropdown_toggle_visibility\", {\n                    available: v\n                });\n                break;\n              case \"browser_notif\":\n                if (((v && window.webkitNotifications) && (window.webkitNotifications.checkPermission() !== 0))) {\n                    window.webkitNotifications.requestPermission(function() {\n                        this.changeSetting(u, v);\n                    }.bind(this));\n                }\n                 else this.changeSetting(u, v);\n            ;\n                break;\n              case \"sound\":\n                this.changeSetting(u, v);\n                break;\n            };\n            q.toggle(this._root);\n        },\n        _onVisibilityChanged: function() {\n            var t = k.isOnline(), u = q.getOption(this._root, \"visibility\");\n            if ((t !== q.isOptionSelected(u))) {\n                q.setSelected(this._root, \"visibility\", t);\n            };\n        },\n        toggleSidebar: function() {\n            i.toggleSidebar();\n            q.toggle(this._root);\n            return false;\n        }\n    });\n    e.exports = s;\n});\n__d(\"ChatSidebarLog\", [\"AsyncSignal\",\"Bootloader\",\"ModuleDependencies\",\"JSLogger\",\"Run\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncSignal\"), h = b(\"Bootloader\"), i = b(\"ModuleDependencies\"), j = b(\"JSLogger\"), k = b(\"Run\"), l = j.create(\"chat_sidebar_load\"), m = null, n = false, o = (((Math.random() * 2147483648) | 0)).toString(36);\n    k.onLoad(function() {\n        n = true;\n    });\n    try {\n        d([\"ChatSidebar\",], function(t) {\n            m = t;\n        });\n    } catch (p) {\n        l.warn(\"exception\", {\n            reason: p.toString()\n        });\n    };\n    function q(t, u) {\n        if ((t.length > u)) {\n            return t[u]\n        };\n        return null;\n    };\n    function r(t) {\n        setTimeout(function() {\n            var u = i.getMissing(\"ChatSidebar\"), v = h.getErrorUrls(), w = h.getLoadingUrls(), x = [];\n            for (var y in w) {\n                x.push({\n                    url: y,\n                    time: w[y]\n                });;\n            };\n            x.sort(function(aa, ba) {\n                return (ba.time - aa.time);\n            });\n            var z = {\n                page_loaded: n,\n                page_id: o,\n                timeout: t,\n                missing_total: u.length,\n                module_1: q(u, 0),\n                module_2: q(u, 1),\n                module_3: q(u, 2),\n                error_url_total: v.length,\n                error_url_1: q(v, 0),\n                error_url_2: q(v, 1),\n                error_url_3: q(v, 2),\n                loading_url_total: x.length,\n                loading_url_1: (q(x, 0) ? q(x, 0).url : null),\n                loading_time_1: (q(x, 0) ? q(x, 0).time : null),\n                loading_url_2: (q(x, 1) ? q(x, 1).url : null),\n                loading_time_2: (q(x, 1) ? q(x, 1).time : null),\n                loading_url_3: (q(x, 2) ? q(x, 2).url : null),\n                loading_time_3: (q(x, 2) ? q(x, 2).time : null)\n            };\n            if (!m) {\n                l.warn((\"require_\" + t), {\n                    missing: u\n                });\n                z.symptom = \"require\";\n            }\n        ;\n            if ((m && !m.isInitialized())) {\n                l.warn((\"init_\" + t), {\n                    missing: u\n                });\n                z.symptom = \"init\";\n            }\n        ;\n            if (z.symptom) {\n                new g(\"/ajax/chat/sidebar_load.php\", z).send();\n            };\n        }, t);\n    };\n    var s = {\n        start: function() {\n            r(5000);\n            r(10000);\n            r(15000);\n            r(30000);\n            r(60000);\n        }\n    };\n    e.exports = s;\n});\n__d(\"NotificationConstants\", [], function(a, b, c, d, e, f) {\n    e.exports = {\n        PayloadSourceType: {\n            UNKNOWN: 0,\n            USER_ACTION: 1,\n            LIVE_SEND: 2,\n            ENDPOINT: 3,\n            INITIAL_LOAD: 4,\n            OTHER_APPLICATION: 5\n        }\n    };\n});\n__d(\"NotificationTokens\", [\"Env\",], function(a, b, c, d, e, f) {\n    var g = b(\"Env\"), h = {\n        tokenizeIDs: function(i) {\n            return i.map(function(j) {\n                return ((g.user + \":\") + j);\n            });\n        },\n        untokenizeIDs: function(i) {\n            return i.map(function(j) {\n                return j.split(\":\")[1];\n            });\n        }\n    };\n    e.exports = h;\n});\n__d(\"NotificationImpressions\", [\"AsyncSignal\",\"NotificationTokens\",\"URI\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncSignal\"), h = b(\"NotificationTokens\"), i = b(\"URI\"), j = \"/ajax/notifications/impression.php\";\n    function k(l, m) {\n        var n = {\n            ref: m\n        };\n        h.untokenizeIDs(l).forEach(function(o, p) {\n            n[((\"alert_ids[\" + p) + \"]\")] = o;\n        });\n        new g(i(j).getQualifiedURI().toString(), n).send();\n    };\n    e.exports = {\n        log: k\n    };\n});\n__d(\"NotificationPhotoThumbnail\", [], function(a, b, c, d, e, f) {\n    function g(i) {\n        return ((i.style == \"photo\") ? i.media.image : null);\n    };\n    var h = {\n        getThumbnail: function(i, j) {\n            var k;\n            if ((i && i.length)) {\n                k = g(i[0]);\n                if (k) {\n                    return k\n                };\n            }\n        ;\n            if (j) {\n                var l = j.attachments;\n                if ((l && l.length)) {\n                    return g(l[0])\n                };\n            }\n        ;\n            return null;\n        }\n    };\n    e.exports = h;\n});\n__d(\"NotificationUpdates\", [\"Arbiter\",\"ChannelConstants\",\"JSLogger\",\"NotificationConstants\",\"NotificationTokens\",\"LiveTimer\",\"copyProperties\",\"createObjectFrom\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ChannelConstants\"), i = b(\"JSLogger\"), j = b(\"NotificationConstants\"), k = b(\"NotificationTokens\"), l = b(\"LiveTimer\"), m = b(\"copyProperties\"), n = b(\"createObjectFrom\"), o = {\n    }, p = {\n    }, q = {\n    }, r = {\n    }, s = [], t = 0, u = i.create(\"notification_updates\");\n    function v() {\n        if (t) {\n            return\n        };\n        var z = o, aa = p, ba = q, ca = r;\n        o = {\n        };\n        p = {\n        };\n        q = {\n        };\n        r = {\n        };\n        x(\"notifications-updated\", z);\n        if (Object.keys(aa).length) {\n            x(\"seen-state-updated\", aa);\n        };\n        if (Object.keys(ba).length) {\n            x(\"read-state-updated\", ba);\n        };\n        if (Object.keys(ca).length) {\n            x(\"hidden-state-updated\", ca);\n        };\n        s.pop();\n    };\n    function w() {\n        if (s.length) {\n            return s[(s.length - 1)]\n        };\n        return j.PayloadSourceType.UNKNOWN;\n    };\n    function x(event, z) {\n        y.inform(event, {\n            updates: z,\n            source: w()\n        });\n    };\n    g.subscribe(h.getArbiterType(\"notification_json\"), function(z, aa) {\n        var ba = Date.now(), ca = aa.obj.nodes;\n        if (ca) {\n            ca.forEach(function(da) {\n                da.receivedTime = ba;\n            });\n            u.debug(\"notifications_received\", ca);\n            y.handleUpdate(j.PayloadSourceType.LIVE_SEND, aa.obj);\n        }\n    ;\n    });\n    g.subscribe(h.getArbiterType(\"notifications_seen\"), function(z, aa) {\n        var ba = k.tokenizeIDs(aa.obj.alert_ids);\n        y.handleUpdate(j.PayloadSourceType.LIVE_SEND, {\n            seenState: n(ba)\n        });\n    });\n    g.subscribe(h.getArbiterType(\"notifications_read\"), function(z, aa) {\n        var ba = k.tokenizeIDs(aa.obj.alert_ids);\n        y.handleUpdate(j.PayloadSourceType.LIVE_SEND, {\n            readState: n(ba)\n        });\n    });\n    var y = m(new g(), {\n        handleUpdate: function(z, aa) {\n            if (aa.servertime) {\n                l.restart(aa.servertime);\n            };\n            if (Object.keys(aa).length) {\n                this.synchronizeInforms(function() {\n                    s.push(z);\n                    var ba = m({\n                        payloadsource: w()\n                    }, aa);\n                    this.inform(\"update-notifications\", ba);\n                    this.inform(\"update-seen\", ba);\n                    this.inform(\"update-read\", ba);\n                    this.inform(\"update-hidden\", ba);\n                }.bind(this));\n            };\n        },\n        didUpdateNotifications: function(z) {\n            m(o, n(z));\n            v();\n        },\n        didUpdateSeenState: function(z) {\n            m(p, n(z));\n            v();\n        },\n        didUpdateReadState: function(z) {\n            m(q, n(z));\n            v();\n        },\n        didUpdateHiddenState: function(z) {\n            m(r, n(z));\n            v();\n        },\n        synchronizeInforms: function(z) {\n            t++;\n            try {\n                z();\n            } catch (aa) {\n                throw aa;\n            } finally {\n                t--;\n                v();\n            };\n        }\n    });\n    e.exports = y;\n});\n__d(\"NotificationStore\", [\"KeyedCallbackManager\",\"NotificationConstants\",\"NotificationUpdates\",\"RangedCallbackManager\",\"MercuryServerDispatcher\",], function(a, b, c, d, e, f) {\n    var g = b(\"KeyedCallbackManager\"), h = b(\"NotificationConstants\"), i = b(\"NotificationUpdates\"), j = b(\"RangedCallbackManager\"), k = b(\"MercuryServerDispatcher\"), l = new g(), m = new j(function(p) {\n        var q = l.getResource(p);\n        return q.creation_time;\n    }, function(p, q) {\n        return (q - p);\n    }), n = {\n    };\n    i.subscribe(\"update-notifications\", function(p, q) {\n        if (q.page_info) {\n            n = q.page_info;\n        };\n        if ((q.nodes === undefined)) {\n            return\n        };\n        var r, s = [], t = {\n        }, u = (q.nodes || []), v;\n        u.forEach(function(w) {\n            r = w.alert_id;\n            v = l.getResource(r);\n            if ((!v || (v.creation_time < w.creation_time))) {\n                s.push(r);\n                t[r] = w;\n            }\n        ;\n        });\n        l.addResourcesAndExecute(t);\n        m.addResources(s);\n        i.didUpdateNotifications(s);\n    });\n    k.registerEndpoints({\n        \"/ajax/notifications/client/get.php\": {\n            mode: k.IMMEDIATE,\n            handler: function(p) {\n                i.handleUpdate(h.PayloadSourceType.ENDPOINT, p);\n            }\n        }\n    });\n    var o = {\n        getNotifications: function(p, q) {\n            var r = m.executeOrEnqueue(0, p, function(w) {\n                var x = l.executeOrEnqueue(w, function(y) {\n                    q(y);\n                });\n            }), s = m.getUnavailableResources(r);\n            if (s.length) {\n                m.unsubscribe(r);\n                if (!o.canFetchMore()) {\n                    l.executeOrEnqueue(m.getAllResources(), q);\n                    return;\n                }\n            ;\n                var t = (n.end_cursor || null), u;\n                if (t) {\n                    var v = Math.max.apply(null, s);\n                    u = ((v - m.getCurrentArraySize()) + 1);\n                }\n                 else u = p;\n            ;\n                k.trySend(\"/ajax/notifications/client/get.php\", {\n                    cursor: t,\n                    length: u\n                });\n            }\n        ;\n        },\n        getAll: function(p) {\n            o.getNotifications(o.getCount(), p);\n        },\n        getCount: function() {\n            return m.getCurrentArraySize();\n        },\n        canFetchMore: function() {\n            if (n.hasOwnProperty(\"has_next_page\")) {\n                return n.has_next_page\n            };\n            return true;\n        }\n    };\n    e.exports = o;\n});\n__d(\"NotificationUserActions\", [\"AsyncRequest\",\"AsyncSignal\",\"NotificationConstants\",\"NotificationStore\",\"NotificationTokens\",\"NotificationUpdates\",\"URI\",\"createObjectFrom\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = b(\"AsyncSignal\"), i = b(\"NotificationConstants\"), j = b(\"NotificationStore\"), k = b(\"NotificationTokens\"), l = b(\"NotificationUpdates\"), m = b(\"URI\"), n = b(\"createObjectFrom\"), o = b(\"emptyFunction\"), p = i.PayloadSourceType.USER_ACTION, q = \"mark_spam\", r = \"turn_off\", s = \"undo\", t = \"first_receipt_yes\", u = \"first_receipt_no\";\n    function v(aa) {\n        var ba = m(\"/ajax/notifications/mark_read.php\").getQualifiedURI().toString();\n        new h(ba, aa).send();\n    };\n    function w(aa) {\n        var ba = {\n        };\n        aa.forEach(function(ca, da) {\n            ba[((\"alert_ids[\" + da) + \"]\")] = ca;\n        });\n        return ba;\n    };\n    function x(aa, ba, ca, da) {\n        var ea = k.untokenizeIDs([aa,])[0];\n        new g(\"/ajax/notifications/negative_req.php\").setData({\n            notification_id: ea,\n            client_rendered: true,\n            request_type: ba\n        }).setHandler((ca || o)).setErrorHandler((da || o)).send();\n    };\n    function y(aa, ba, ca, da, ea) {\n        var fa = (ea ? s : r);\n        j.getAll(function(ga) {\n            var ha = Object.keys(ga).filter(function(ia) {\n                var ja = ga[ia];\n                return !!(((ja.application && ja.application.id) && (ja.application.id == ba)));\n            });\n            x(aa, fa, function(ia) {\n                ca(ia);\n                l.handleUpdate(p, {\n                    hiddenState: n(ha, !ea)\n                });\n            }, da);\n        });\n    };\n    var z = {\n        markNotificationsAsSeen: function(aa) {\n            l.handleUpdate(p, {\n                seenState: n(aa)\n            });\n            var ba = k.untokenizeIDs(aa), ca = w(ba);\n            ca.seen = true;\n            v(ca);\n            if (a.presenceNotifications) {\n                a.presenceNotifications.alertList.markSeen(ba);\n            };\n        },\n        markNotificationsAsRead: function(aa) {\n            l.handleUpdate(p, {\n                readState: n(aa)\n            });\n            var ba = k.untokenizeIDs(aa);\n            v(w(ba));\n            if (a.presenceNotifications) {\n                a.presenceNotifications.markRead(false, ba);\n            };\n        },\n        markNotificationAsHidden: function(aa, ba, ca) {\n            l.handleUpdate(p, {\n                hiddenState: n([aa,])\n            });\n            x(aa, r, ba, ca);\n        },\n        markNotificationAsVisible: function(aa, ba, ca) {\n            l.handleUpdate(p, {\n                hiddenState: n([aa,], false)\n            });\n            x(aa, s, ba, ca);\n        },\n        markNotificationAsSpam: function(aa, ba, ca) {\n            l.handleUpdate(p, {\n                hiddenState: n([aa,], false)\n            });\n            x(aa, q, ba, ca);\n        },\n        markAppAsHidden: function(aa, ba, ca, da) {\n            var ea = false;\n            y(aa, ba, ca, da, ea);\n        },\n        markAppAsVisible: function(aa, ba, ca, da) {\n            var ea = true;\n            y(aa, ba, ca, da, ea);\n        },\n        markFirstReceiptYes: function(aa, ba, ca) {\n            x(aa, t, ba, ca);\n        },\n        markFirstReceiptNo: function(aa, ba, ca) {\n            x(aa, u, ba, ca);\n        }\n    };\n    e.exports = z;\n});\n__d(\"NotificationBeeperItemContents.react\", [\"Animation\",\"CloseButton.react\",\"ImageBlock.react\",\"NotificationURI\",\"NotificationUserActions\",\"React\",\"TextWithEntities.react\",\"Timestamp.react\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Animation\"), h = b(\"CloseButton.react\"), i = b(\"ImageBlock.react\"), j = b(\"NotificationURI\"), k = b(\"NotificationUserActions\"), l = b(\"React\"), m = b(\"TextWithEntities.react\"), n = b(\"Timestamp.react\"), o = b(\"cx\");\n    function p(r, s) {\n        return l.DOM.span({\n            className: \"fwb\"\n        }, r);\n    };\n    var q = l.createClass({\n        displayName: \"NotificationBeeperItemContents\",\n        _markAsRead: function() {\n            k.markNotificationsAsRead([this.props.beep.notificationID,]);\n            this.props.onHide();\n        },\n        _onClose: function() {\n            this._markAsRead();\n            this.props.onHide();\n        },\n        _doFlash: function() {\n            new g(this.refs.inner.getDOMNode()).from(\"opacity\", \"0\").to(\"opacity\", \"1\").duration(200).go();\n        },\n        componentDidUpdate: function(r) {\n            if ((r.beep.beepID !== this.props.beep.beepID)) {\n                this._doFlash();\n            };\n        },\n        render: function() {\n            var r = this.props.beep, s = r.icon.uri, t = (r.link ? j.localize(r.link) : \"#\"), u = (r.photo && j.snowliftable(t));\n            return (l.DOM.div({\n                ref: \"inner\"\n            }, h({\n                className: \"_3soc\",\n                onClick: this._onClose,\n                size: \"medium\"\n            }), l.DOM.a({\n                href: t,\n                ajaxify: (u ? t : null),\n                onClick: this._markAsRead,\n                rel: (u ? \"theater\" : null),\n                className: \"_3soi\"\n            }, i({\n                className: \"_3soj\"\n            }, l.DOM.img({\n                src: r.actors[0].profile_picture.uri,\n                className: \"_3sok\"\n            }), l.DOM.div({\n                className: \"_3sol\"\n            }, m({\n                renderEmoticons: true,\n                renderEmoji: true,\n                interpolator: p,\n                ranges: r.text.ranges,\n                aggregatedranges: r.text.aggregated_ranges,\n                text: r.text.text\n            }), i({\n                className: \"_3som\"\n            }, l.DOM.img({\n                src: s\n            }), n({\n                time: r.timestamp.time,\n                text: r.timestamp.text,\n                verbose: r.timestamp.verbose\n            })))))));\n        }\n    });\n    e.exports = q;\n});\n__d(\"NotificationBeeperItem.react\", [\"Animation\",\"BrowserSupport\",\"NotificationBeeperItemContents.react\",\"React\",\"cx\",\"setTimeoutAcrossTransitions\",], function(a, b, c, d, e, f) {\n    var g = b(\"Animation\"), h = b(\"BrowserSupport\"), i = b(\"NotificationBeeperItemContents.react\"), j = b(\"React\"), k = b(\"cx\"), l = b(\"setTimeoutAcrossTransitions\"), m = j.createClass({\n        displayName: \"NotificationBeeperItem\",\n        getInitialState: function() {\n            return {\n                fadedIn: false,\n                hidden: false\n            };\n        },\n        componentDidMount: function() {\n            var n;\n            if (h.hasCSSAnimations()) {\n                n = this.setState.bind(this, {\n                    fadedIn: true\n                });\n            }\n             else n = function() {\n                new g(this.refs.item.getDOMNode()).from(\"top\", \"-30px\").from(\"opacity\", \"0\").to(\"top\", \"0px\").to(\"opacity\", \"1\").duration(200).ondone(this.setState.bind(this, {\n                    fadedIn: true\n                })).go();\n            }.bind(this);\n        ;\n            l(n, 50);\n            this.props.onInserted(this.props.beep);\n        },\n        render: function() {\n            var n = this.props.beep, o = ((((\"_3sod\") + ((this.state.fadedIn ? (\" \" + \"_3soe\") : \"\"))) + ((this.state.hidden ? (\" \" + \"_3sof\") : \"\")))), p = (n.beepRenderer || i);\n            return (j.DOM.li({\n                className: o,\n                ref: \"item\",\n                \"data-gt\": n.tracking\n            }, p({\n                beep: n,\n                onHide: this.setState.bind(this, {\n                    hidden: true\n                })\n            })));\n        }\n    });\n    e.exports = m;\n});\n__d(\"NotificationSound\", [\"Sound\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Sound\"), h = b(\"copyProperties\"), i = 5000;\n    g.init([\"audio/mpeg\",]);\n    function j(k) {\n        this._soundPath = k;\n        this._lastPlayed = 0;\n    };\n    h(j.prototype, {\n        play: function(k) {\n            if (!this._soundPath) {\n                return\n            };\n            var l = Date.now();\n            if ((((l - this._lastPlayed)) < i)) {\n                return\n            };\n            this._lastPlayed = l;\n            g.play(this._soundPath, k);\n        }\n    });\n    e.exports = j;\n});\n__d(\"NotificationBeeper.react\", [\"Animation\",\"Arbiter\",\"ChannelConstants\",\"NotificationBeeperItem.react\",\"NotificationConstants\",\"NotificationImpressions\",\"NotificationPhotoThumbnail\",\"NotificationSound\",\"NotificationUpdates\",\"NotificationUserActions\",\"React\",\"Style\",\"cx\",\"isEmpty\",\"merge\",\"setTimeoutAcrossTransitions\",\"shield\",], function(a, b, c, d, e, f) {\n    var g = b(\"Animation\"), h = b(\"Arbiter\"), i = b(\"ChannelConstants\"), j = b(\"NotificationBeeperItem.react\"), k = b(\"NotificationConstants\"), l = b(\"NotificationImpressions\"), m = b(\"NotificationPhotoThumbnail\"), n = b(\"NotificationSound\"), o = b(\"NotificationUpdates\"), p = b(\"NotificationUserActions\"), q = b(\"React\"), r = b(\"Style\"), s = b(\"cx\"), t = b(\"isEmpty\"), u = b(\"merge\"), v = b(\"setTimeoutAcrossTransitions\"), w = b(\"shield\"), x = 5000, y = 2000, z = \"beeper\", aa = k.PayloadSourceType.LIVE_SEND, ba = k.PayloadSourceType.OTHER_APPLICATION, ca = q.createClass({\n        displayName: \"NotificationBeeper\",\n        getInitialState: function() {\n            return {\n                soundEnabled: this.props.soundEnabled,\n                hovering: false,\n                fading: false,\n                paused: false,\n                pendingBeeps: {\n                },\n                renderedBeeps: {\n                }\n            };\n        },\n        componentWillMount: function() {\n            var ea = i.getArbiterType(\"notif_sound_pref_changed\"), fa = \"update-notifications\";\n            this.subscriptions = [o.subscribe(fa, function(ga, ha) {\n                if (((ha.payloadsource === aa) || (ha.payloadsource === ba))) {\n                    var ia = ha.nodes;\n                    if ((ia && ia.length)) {\n                        this._handleBeepChanges(da(ia));\n                    };\n                }\n            ;\n            }.bind(this)),h.subscribe(ea, function(ga, ha) {\n                this.setState({\n                    soundEnabled: ha.obj.enabled\n                });\n            }.bind(this)),];\n            h.inform(\"NotificationBeeper/mounted\", null, h.BEHAVIOR_PERSISTENT);\n        },\n        componentWillUnmount: function() {\n            this.subscriptions.forEach(function(ea) {\n                ea.unsubscribe();\n            });\n            this.subscriptions = null;\n        },\n        _onMouseEnter: function() {\n            if (this.state.paused) {\n                return\n            };\n            (this._hideWait && clearTimeout(this._hideWait));\n            if (this.state.fading) {\n                this._animation.stop();\n                this._animation = null;\n                r.set(this.refs.container.getDOMNode(), \"opacity\", \"0.96\");\n            }\n        ;\n            var ea = Object.keys(this.state.renderedBeeps);\n            if (this.props.unseenVsUnread) {\n                p.markNotificationsAsSeen(ea);\n            }\n             else p.markNotificationsAsRead(ea);\n        ;\n            this.setState({\n                hovering: true,\n                fading: false,\n                pendingBeeps: {\n                },\n                renderedBeeps: u(this.state.renderedBeeps, this.state.pendingBeeps)\n            });\n        },\n        _onMouseLeave: function() {\n            if (this.state.paused) {\n                return\n            };\n            this._waitToHide(y);\n            this.setState({\n                hovering: false\n            });\n        },\n        _onInsertedItem: function(ea) {\n            if (!this.state.hovering) {\n                this._waitToHide();\n            };\n            if ((this.state.soundEnabled && ea.sound)) {\n                if (!this._notifSound) {\n                    this._notifSound = new n(this.props.soundPath);\n                };\n                this._notifSound.play(ea.beepID);\n            }\n        ;\n            if (this.props.shouldLogImpressions) {\n                l.log([ea.notificationID,], z);\n            };\n        },\n        _waitToHide: function(ea) {\n            (this._hideWait && clearTimeout(this._hideWait));\n            this._hideWait = v(w(this._hide, this), (ea || x));\n        },\n        _hide: function() {\n            (this._animation && this._animation.stop());\n            this._animation = new g(this.refs.container.getDOMNode()).from(\"opacity\", \"0.96\").to(\"opacity\", \"0\").duration(1500).ondone(this._finishHide).go();\n            this.setState({\n                fading: true\n            });\n        },\n        _finishHide: function() {\n            var ea = this.state.pendingBeeps;\n            this.setState({\n                fading: false,\n                pendingBeeps: {\n                },\n                renderedBeeps: {\n                }\n            });\n            v(this.setState.bind(this, {\n                renderedBeeps: ea\n            }));\n            r.set(this.refs.container.getDOMNode(), \"opacity\", \"0.96\");\n        },\n        _handleBeepChanges: function(ea) {\n            var fa = (this.state.fading ? this.state.pendingBeeps : this.state.renderedBeeps);\n            Object.keys(ea).reverse().forEach(function(ga) {\n                var ha = ea[ga], ia = ha.beepID, ja = (this.state.renderedBeeps[ga] || {\n                });\n                if ((ja.beepID != ia)) {\n                    delete fa[ga];\n                    fa[ga] = ha;\n                }\n            ;\n            }.bind(this));\n            if (!this.state.paused) {\n                this._waitToHide();\n            };\n            this.forceUpdate();\n        },\n        _togglePause: function() {\n            if (!this.state.paused) {\n                (this._animation && this._animation.stop());\n                (this._hideWait && clearTimeout(this._hideWait));\n            }\n             else this._waitToHide();\n        ;\n            this.setState({\n                paused: !this.state.paused\n            });\n        },\n        render: function() {\n            var ea = this.state.renderedBeeps, fa = {\n            };\n            Object.keys(ea).reverse().forEach(function(ja) {\n                var ka = ea[ja];\n                fa[ja] = j({\n                    beep: ka,\n                    onInserted: this._onInsertedItem\n                });\n            }, this);\n            var ga = !t(fa), ha = null;\n            if ((ga && this.props.canPause)) {\n                ha = q.DOM.li({\n                    className: \"_a_g\",\n                    onClick: this._togglePause\n                }, (this.state.paused ? \"Continue\" : \"Pause [fb]\"));\n            };\n            var ia = ((((!ga ? \"hidden_elem\" : \"\")) + ((\" \" + \"_50d1\"))));\n            return (q.DOM.ul({\n                ref: \"container\",\n                className: ia,\n                \"data-gt\": this.props.tracking,\n                onMouseEnter: this._onMouseEnter,\n                onMouseLeave: this._onMouseLeave\n            }, fa, ha));\n        }\n    });\n    function da(ea) {\n        var fa = {\n        };\n        ea.forEach(function(ga) {\n            var ha = ga.alert_id, ia = ((ha + \"-\") + ga.receivedTime), ja = m.getThumbnail(ga.attachments, ga.attached_story);\n            fa[ha] = {\n                notificationID: ha,\n                beepID: ia,\n                beepRenderer: ga.beepRenderer,\n                actors: ga.actors,\n                icon: ga.icon,\n                link: ga.url,\n                photo: ja,\n                text: (ga.unaggregatedTitle || ga.title),\n                timestamp: ga.timestamp,\n                receivedTime: ga.receivedTime,\n                sound: !!ga.sound,\n                tracking: ga.tracking\n            };\n        });\n        return fa;\n    };\n    e.exports = ca;\n});\n__d(\"FbdEventLog\", [\"URI\",\"AsyncSignal\",], function(a, b, c, d, e, f) {\n    var g = b(\"URI\"), h = b(\"AsyncSignal\"), i = {\n        log: function(j, k, l, m) {\n            if (!j) {\n                return\n            };\n            var n = g(\"/desktop/eventlog.php\"), o = new h(n.toString(), {\n                event: j,\n                category: (k || \"unknown\"),\n                payload: (l || \"\")\n            });\n            o.setHandler(m).send();\n        }\n    };\n    e.exports = i;\n});\n__d(\"DownloadDialog\", [\"Event\",\"Arbiter\",\"Class\",\"DataStore\",\"ModalMask\",\"Overlay\",\"Parent\",\"Style\",\"copyProperties\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"Arbiter\"), i = b(\"Class\"), j = b(\"DataStore\"), k = b(\"ModalMask\"), l = b(\"Overlay\"), m = b(\"Parent\"), n = b(\"Style\"), o = b(\"copyProperties\"), p = b(\"emptyFunction\");\n    function q() {\n        this.parent.construct(this);\n        return this;\n    };\n    i.extend(q, l);\n    o(q, {\n        POSITIONS: {\n            BOTTOM_LEFT: \"bottom_left\",\n            TOP_LEFT: \"top_left\",\n            IE9_BOTTOM: \"ie9_bottom\"\n        },\n        activeDialogs: {\n        },\n        dismissAll: function() {\n            for (var r in this.POSITIONS) {\n                this.hideDialog(this.POSITIONS[r]);;\n            };\n        },\n        hideDialog: function(r) {\n            var s = this.activeDialogs[r];\n            (s && s.hide());\n            this.activeDialogs[r] = null;\n        }\n    });\n    o(q.prototype, {\n        _cancelHandler: p,\n        _closeHandler: p,\n        _width: null,\n        position: q.POSITIONS.BOTTOM_LEFT,\n        init: function(r, s) {\n            this.parent.init(r);\n            this.position = s;\n            var t = ((j.get(this._root, \"modal\") === \"true\"));\n            q.hideDialog(s);\n            q.activeDialogs[s] = this;\n            g.listen(this._root, \"click\", function(event) {\n                if (m.byClass(event.getTarget(), \"closeButton\")) {\n                    if ((this._cancelHandler() !== false)) {\n                        q.hideDialog(this.position);\n                    }\n                };\n            }.bind(this));\n            this.subscribe(\"show\", function() {\n                if (t) {\n                    k.show();\n                };\n                h.inform(\"layer_shown\", {\n                    type: \"DownloadDialog\"\n                });\n            }.bind(this));\n            this.subscribe(\"hide\", function() {\n                if (t) {\n                    k.hide();\n                };\n                h.inform(\"layer_hidden\", {\n                    type: \"DownloadDialog\"\n                });\n                this._closeHandler();\n            }.bind(this));\n        },\n        setWidth: function(r) {\n            this._width = Math.floor(r);\n            return this;\n        },\n        updatePosition: function() {\n            if (this._width) {\n                n.set(this._overlay, \"width\", (this._width + \"px\"));\n            };\n            return true;\n        },\n        setCancelHandler: function(r) {\n            this._cancelHandler = (r || p);\n            return this;\n        },\n        setCloseHandler: function(r) {\n            this._closeHandler = (r || p);\n            return this;\n        }\n    });\n    e.exports = q;\n    a.DownloadDialog = q;\n});\n__d(\"FbdConversionTracking\", [\"AsyncRequest\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = b(\"emptyFunction\"), i = {\n        logClick: function(j, k) {\n            if (!k) {\n                k = \"desktop\";\n            };\n            new g().setURI(\"/ajax/desktop/log_clicks.php\").setData({\n                click_source: j,\n                promo: k\n            }).setAllowCrossPageTransition(true).setErrorHandler(h).send();\n        },\n        logConversion: function(j, k) {\n            if (!k) {\n                k = \"desktop\";\n            };\n            new g().setURI(\"/ajax/desktop/log_conversions.php\").setData({\n                conversion_action: j,\n                promo: k\n            }).setAllowCrossPageTransition(true).setErrorHandler(h).send();\n        }\n    };\n    e.exports = i;\n});\n__d(\"MegaphoneHelper\", [\"JSXDOM\",\"Animation\",\"Arbiter\",\"AsyncRequest\",\"DOM\",\"DOMDimensions\",\"Dialog\",\"LitestandMessages\",\"Parent\",\"Run\",\"Style\",\"csx\",\"cx\",\"ge\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSXDOM\"), h = b(\"Animation\"), i = b(\"Arbiter\"), j = b(\"AsyncRequest\"), k = b(\"DOM\"), l = b(\"DOMDimensions\"), m = b(\"Dialog\"), n = b(\"LitestandMessages\"), o = b(\"Parent\"), p = b(\"Run\"), q = b(\"Style\"), r = b(\"csx\"), s = b(\"cx\"), t = b(\"ge\");\n    function u() {\n        var w = k.scry(document.body, \".megaphone_story_wrapper\")[0];\n        (w && k.remove(w));\n        v.removeLitestandHomeWash();\n    };\n    var v = {\n        hideStory: function(w, x, y, z, aa) {\n            var ba = {\n                mp_id: w,\n                location: x,\n                context: z\n            };\n            new j().setURI(\"/ajax/megaphone/megaphone_hide.php\").setMethod(\"POST\").setData(ba).setHandler(function(da) {\n                (aa && aa(da));\n            }).send();\n            var ca = t(y);\n            if (ca) {\n                new h(ca).to(\"height\", 0).duration(500).hide().go();\n            };\n        },\n        createModalStory: function(w, x, y, z) {\n            var aa;\n            if ((!w.buttons || !w.buttons.length)) {\n                w.buttons = m.CLOSE;\n                aa = v.hideStory(x, y, z, null);\n            }\n        ;\n            var ba = new m(w);\n            if (aa) {\n                ba.setHandler(aa);\n            };\n            ba.show();\n        },\n        buttonOnClick: function(w, x, y, z, aa, ba) {\n            var ca = function() {\n                if (aa) {\n                    new j().setURI(z).send();\n                }\n                 else document.location.href = z;\n            ;\n            };\n            if (ba) {\n                v.hideStory(w, x, \"\", y, ca);\n            }\n             else ca();\n        ;\n        },\n        renderFullWidth: function(w, x, y) {\n            var z = t(w);\n            k.prependContent(z, x);\n            if (y) {\n                var aa = l.getElementDimensions(x), ba = g.div({\n                    className: \"_5847\"\n                });\n                q.set(ba, \"height\", (aa.height + \"px\"));\n                var ca = o.byClass(z, \"_4_37\");\n                k.prependContent(ca, ba);\n                p.onLeave(u);\n                i.subscribeOnce(n.FILTER_SWITCH_BEGIN, u);\n            }\n        ;\n            i.inform(\"Megaphone/show\", w, i.BEHAVIOR_PERSISTENT);\n        },\n        removeLitestandHomeWash: function() {\n            var w = k.find(document.body, \"._5847\");\n            k.remove(w);\n        }\n    };\n    e.exports = v;\n});\n__d(\"FbdInstall\", [\"$\",\"AsyncRequest\",\"CSS\",\"DOM\",\"DownloadDialog\",\"FbdConversionTracking\",\"FbdEventLog\",\"FBDesktopDetect\",\"FBDesktopPlugin\",\"MegaphoneHelper\",], function(a, b, c, d, e, f) {\n    var g = b(\"$\"), h = b(\"AsyncRequest\"), i = b(\"CSS\"), j = b(\"DOM\"), k = b(\"DownloadDialog\"), l = b(\"FbdConversionTracking\"), m = b(\"FbdEventLog\"), n = b(\"FBDesktopDetect\"), o = b(\"FBDesktopPlugin\"), p = b(\"MegaphoneHelper\"), q = 1000, r = (300 * q), s = {\n        cancelSetup: function() {\n            var t = JSON.stringify({\n                ref: this.ref\n            });\n            m.log(\"download_canceled\", \"setup\", t);\n            l.logConversion(\"download_canceled\");\n        },\n        hideMegaphone: function() {\n            if ((this.megaphoneId && this.megaphoneLoc)) {\n                p.hideStory(this.megaphoneId, this.megaphoneLoc, this.elementId, \"\", null);\n            };\n        },\n        init: function(t, u) {\n            this.downloadUrl = t;\n            this.ref = (u || \"unknown\");\n        },\n        initInstallWait: function(t, u, v) {\n            this.megaphoneId = t;\n            this.megaphoneLoc = u;\n            this.elementId = v;\n            this._waitForInstall(r);\n        },\n        promptDownload: function(t) {\n            t = (t || this.downloadUrl);\n            if (t) {\n                var u = JSON.stringify({\n                    ref: this.ref\n                });\n                m.log(\"download_prompted\", \"setup\", u);\n                l.logConversion(\"download_prompted\");\n                var v = j.create(\"iframe\", {\n                    src: t,\n                    className: \"hidden_elem\"\n                });\n                j.appendContent(document.body, v);\n            }\n        ;\n        },\n        _responseHandler: function(t) {\n            if (t.payload) {\n                this._authToken = t.payload.access_token;\n                this._userId = t.payload.id;\n            }\n        ;\n            if ((this._authToken && this._userId)) {\n                this._waitForRunningStart = Date.now();\n                setTimeout(this._waitForRunning.bind(this), q);\n            }\n        ;\n        },\n        setupPlugin: function() {\n            new h(\"/ajax/desktop/download\").send();\n            this.promptDownload();\n        },\n        updateSidebarLinkVisibility: function() {\n            if (!n.isPluginInstalled()) {\n                i.show(g(\"sidebar-messenger-install-link\"));\n                i.show(g(\"sidebar-messenger-install-separator\"));\n            }\n        ;\n        },\n        _waitForInstall: function(t) {\n            var u = JSON.stringify({\n                ref: this.ref\n            });\n            if (n.isPluginInstalled()) {\n                m.log(\"install_success\", \"setup\", u);\n                l.logConversion(\"install_success\");\n                o.recheck();\n                new h(\"/desktop/fbdesktop2/transfer.php\").setMethod(\"POST\").setHandler(this._responseHandler.bind(this)).send();\n                k.dismissAll();\n                this.hideMegaphone();\n                return;\n            }\n        ;\n            if ((t <= 0)) {\n                m.log(\"install_timeout\", \"setup\", u);\n                l.logConversion(\"install_timeout\");\n                k.dismissAll();\n            }\n             else setTimeout(this._waitForInstall.bind(this, (t - q)), q);\n        ;\n        },\n        _waitForRunning: function() {\n            var t = (Date.now() - this._waitForRunningStart);\n            if (o.isAppRunning()) {\n                o.transferAuthToken(this._authToken, this._userId);\n            }\n             else if ((t < r)) {\n                setTimeout(this._waitForRunning.bind(this), q);\n            }\n        ;\n        }\n    };\n    e.exports = s;\n});\n__d(\"legacy:fbdesktop2-install-js\", [\"FbdInstall\",], function(a, b, c, d) {\n    a.FbdInstall = b(\"FbdInstall\");\n}, 3);\n__d(\"legacy:fbdesktop-conversion-tracking\", [\"FbdConversionTracking\",], function(a, b, c, d) {\n    a.FbdConversionTracking = b(\"FbdConversionTracking\");\n}, 3);\n__d(\"SidebarTicker\", [\"Arbiter\",\"ChatSidebar\",\"CSS\",\"DOM\",\"Run\",\"TickerController\",\"$\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ChatSidebar\"), i = b(\"CSS\"), j = b(\"DOM\"), k = b(\"Run\"), l = b(\"TickerController\"), m = b(\"$\"), n = b(\"copyProperties\");\n    function o() {\n        this._ticker = m(\"pagelet_ticker\");\n        this._initSubscriptions();\n        if (i.hasClass(document.documentElement, \"sidebarMode\")) {\n            this._onSidebarShow();\n        };\n    };\n    o.hide = function() {\n        k.onAfterLoad(function() {\n            j.remove(m(\"pagelet_ticker\"));\n            j.remove(j.find(document.body, \"div.fbSidebarGripper\"));\n            h.resize();\n        });\n    };\n    n(o.prototype, {\n        _initSubscriptions: function() {\n            this._subscriptions = [g.subscribe(\"sidebar/show\", this._onSidebarShow.bind(this)),];\n        },\n        _onSidebarShow: function() {\n            l.show(this._ticker);\n        }\n    });\n    e.exports = o;\n});\n__d(\"SidebarTickerResizer\", [\"Arbiter\",\"AsyncRequest\",\"ChatSidebar\",\"SimpleDrag\",\"$\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"AsyncRequest\"), i = b(\"ChatSidebar\"), j = b(\"SimpleDrag\"), k = b(\"$\"), l = 1e-7;\n    function m(n) {\n        var o = k(\"pagelet_ticker\"), p = o.parentNode, q = this._saveResizedState.bind(this), r, s, t, u = function(x, event) {\n            r = event.clientY;\n            s = o.offsetHeight;\n            t = p.offsetHeight;\n        }, v = function(x, event) {\n            var y = (s + ((event.clientY - r))), z = (100 - ((((((t - y)) / t)) * 100)));\n            z = Math.max(l, Math.min(90, z));\n            o.style.height = (z + \"%\");\n            if ((x == \"end\")) {\n                q(z);\n                g.inform(\"Ticker/resized\");\n            }\n        ;\n            i.resize();\n        }, w = new j(n);\n        w.subscribe(\"start\", u);\n        w.subscribe([\"update\",\"end\",], v);\n    };\n    m.prototype._saveResizedState = function(n) {\n        new h(\"/ajax/feed/ticker/resize\").setData({\n            height: (\"\" + n)\n        }).setMethod(\"POST\").send();\n    };\n    e.exports = m;\n});\n__d(\"legacy:megaphone\", [\"MegaphoneHelper\",], function(a, b, c, d) {\n    a.MegaphoneHelper = b(\"MegaphoneHelper\");\n}, 3);\n__d(\"NotificationXOut\", [\"Arbiter\",\"Event\",\"userAction\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"Event\"), i = b(\"userAction\");\n    function j(p, q, r) {\n        g.inform(\"notif/negativeCancel\", {\n            id: p\n        });\n        k(q, r);\n        h.$E(r).kill();\n    };\n    function k(p, q) {\n        i(\"click\", null, q, null, {\n            gt: p\n        });\n    };\n    function l(p, q) {\n        k(p, q);\n        h.$E(q).prevent();\n    };\n    function m(p, q) {\n        h.listen(p, \"click\", k.curry(q));\n    };\n    function n(p, q, r) {\n        h.listen(p, \"click\", j.curry(q, r));\n    };\n    function o(p, q) {\n        h.listen(p, \"click\", l.curry(q));\n    };\n    e.exports = {\n        setupConfirmListener: m,\n        setupCancelListener: n,\n        setupNoListener: o\n    };\n});\n__d(\"LiveMessageReceiver\", [\"Arbiter\",\"ChannelConstants\",\"copyProperties\",\"emptyFunction\",\"shield\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ChannelConstants\"), i = b(\"copyProperties\"), j = b(\"emptyFunction\"), k = b(\"shield\");\n    function l(m) {\n        this.eventName = m;\n        this.subs = null;\n        this.handler = j;\n        this.shutdownHandler = null;\n        this.registered = false;\n        this.appId = 1;\n    };\n    i(l, {\n        getAppMessageType: function(m, n) {\n            return (((\"live_message/\" + m) + \":\") + n);\n        },\n        route: function(m) {\n            var n = function(o) {\n                var p = l.getAppMessageType(m.app_id, m.event_name);\n                g.inform(p, o, g.BEHAVIOR_PERSISTENT);\n            };\n            n(m.response);\n        }\n    });\n    i(l.prototype, {\n        setAppId: function(m) {\n            this.appId = m;\n            return this;\n        },\n        setHandler: function(m) {\n            this.handler = m;\n            this._dirty();\n            return this;\n        },\n        setRestartHandler: j,\n        setShutdownHandler: function(m) {\n            this.shutdownHandler = k(m);\n            this._dirty();\n            return this;\n        },\n        _dirty: function() {\n            if (this.registered) {\n                this.unregister();\n                this.register();\n            }\n        ;\n        },\n        register: function() {\n            var m = function(o, p) {\n                return this.handler(p);\n            }.bind(this), n = l.getAppMessageType(this.appId, this.eventName);\n            this.subs = {\n            };\n            this.subs.main = g.subscribe(n, m);\n            if (this.shutdownHandler) {\n                this.subs.shut = g.subscribe(h.ON_SHUTDOWN, this.shutdownHandler);\n            };\n            this.registered = true;\n            return this;\n        },\n        unregister: function() {\n            if (!this.subs) {\n                return this\n            };\n            for (var m in this.subs) {\n                if (this.subs[m]) {\n                    this.subs[m].unsubscribe();\n                };\n            };\n            this.subs = null;\n            this.registered = false;\n            return this;\n        }\n    });\n    e.exports = l;\n});\n__d(\"initLiveMessageReceiver\", [\"Arbiter\",\"ChannelConstants\",\"LiveMessageReceiver\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ChannelConstants\"), i = b(\"LiveMessageReceiver\");\n    g.subscribe(h.getArbiterType(\"app_msg\"), function(j, k) {\n        i.route(k.obj);\n    });\n});\n__d(\"Slideshow\", [\"ArbiterMixin\",\"CSS\",\"DOM\",\"Event\",\"Locale\",\"Parent\",\"copyProperties\",\"csx\",\"cx\",\"shield\",], function(a, b, c, d, e, f) {\n    var g = b(\"ArbiterMixin\"), h = b(\"CSS\"), i = b(\"DOM\"), j = b(\"Event\"), k = b(\"Locale\"), l = b(\"Parent\"), m = b(\"copyProperties\"), n = b(\"csx\"), o = b(\"cx\"), p = b(\"shield\");\n    function q(r, s) {\n        this._root = r;\n        this._config = s;\n        this._currentIndex = 0;\n        this._animating = false;\n        this._autoplayTimer = null;\n        this._init();\n    };\n    m(q.prototype, g, {\n        getIndex: function() {\n            return this._currentIndex;\n        },\n        getNumItems: function() {\n            return this._items.length;\n        },\n        page: function(r) {\n            if ((typeof r === \"undefined\")) {\n                r = \"next\";\n            };\n            if ((r === \"next\")) {\n                if ((this._config.wrap || (this.getIndex() < (this.getNumItems() - 1)))) {\n                    this._animateTo((this._currentIndex + 1));\n                };\n            }\n             else if ((r === \"prev\")) {\n                if ((this._config.wrap || (this.getIndex() > 0))) {\n                    this._animateTo((this._currentIndex - 1));\n                }\n            }\n        ;\n        },\n        pageTo: function(r) {\n            this._animateTo(r, p(this._setCurrent, this, r));\n        },\n        insert: function(r, s) {\n            if ((r > this._currentIndex)) {\n                i.insertAfter(this._items[(r - 1)], s);\n            }\n             else {\n                i.insertBefore(this._items[r], s);\n                this._currentIndex++;\n            }\n        ;\n            this._items.splice(r, 0, s);\n            this._updateArrowState(this._currentIndex);\n            this.inform(\"items_updated\");\n        },\n        push: function(r) {\n            this.insert(this._items.length, r);\n        },\n        _init: function() {\n            this._container = i.find(this._root, \"ul._2xq\");\n            this._items = i.scry(this._container, \"li._2xr\");\n            if (this._config.arrows) {\n                j.listen(this._root, \"click\", this._clickListener.bind(this));\n                var r = i.find(this._root, \"a._2xw\"), s = i.find(this._root, \"a._2xx\");\n                this._arrowLeft = (k.isRTL() ? r : s);\n                this._arrowRight = (k.isRTL() ? s : r);\n            }\n        ;\n            if (this._config.autoplay) {\n                j.listen(this._root, \"mouseenter\", this.stopAutoplay.bind(this));\n                j.listen(this._root, \"mouseleave\", this.resetAutoplay.bind(this));\n                this.resetAutoplay();\n            }\n        ;\n            this.subscribe([\"page_start\",\"page_end\",], function(t, u) {\n                h.conditionClass(this._root, \"_2xm\", (t === \"page_start\"));\n            }.bind(this));\n        },\n        _clickListener: function(event) {\n            var r = event.getTarget(), s = l.byTag(r, \"a\");\n            if ((s && !h.hasClass(s, \"_2xo\"))) {\n                if (h.hasClass(s, \"_2xw\")) {\n                    this.page(\"next\");\n                }\n                 else if (h.hasClass(s, \"_2xx\")) {\n                    this.page(\"prev\");\n                }\n            \n            };\n        },\n        _updateArrowState: function(r) {\n            if (!this._config.arrows) {\n                return\n            };\n            h.conditionClass(this._arrowRight, \"_2xo\", (this._items.length === 1));\n            h.conditionClass(this._arrowLeft, \"_2xo\", (this._items.length === 1));\n        },\n        _animateTo: function(r) {\n        \n        },\n        _setCurrent: function(r) {\n            h.removeClass(this._items[this._currentIndex], \"_2xn\");\n            h.addClass(this._items[r], \"_2xn\");\n            h.removeClass(this._root, \"_2xm\");\n            this._currentIndex = r;\n            this._animating = false;\n            this.inform(\"page_end\", r);\n        },\n        resetAutoplay: function() {\n            if (this._config.autoplay) {\n                clearTimeout(this._autoplayTimer);\n                this._autoplayTimer = setTimeout(this._autoplay.bind(this), this._config.autoplayTimeout);\n            }\n        ;\n        },\n        stopAutoplay: function() {\n            clearTimeout(this._autoplayTimer);\n            this._autoplayTimer = null;\n        },\n        _autoplay: function() {\n            this.resetAutoplay();\n            if ((this._items.length > 1)) {\n                this.page();\n            };\n        }\n    });\n    e.exports = q;\n});\n__d(\"Carousel\", [\"Animation\",\"Class\",\"CSS\",\"Ease\",\"Locale\",\"Slideshow\",\"Style\",\"copyProperties\",\"cx\",\"shield\",], function(a, b, c, d, e, f) {\n    var g = b(\"Animation\"), h = b(\"Class\"), i = b(\"CSS\"), j = b(\"Ease\"), k = b(\"Locale\"), l = b(\"Slideshow\"), m = b(\"Style\"), n = b(\"copyProperties\"), o = b(\"cx\"), p = b(\"shield\"), q = (k.isRTL() ? \"right\" : \"left\"), r = j.sineInOut;\n    function s(t, u) {\n        this.parent.construct(this, t, u);\n        this.subscribe(\"items_updated\", this._updateItemState.bind(this));\n    };\n    h.extend(s, l);\n    n(s.prototype, {\n        _updateItemState: function(t, u) {\n            this._setContainerPos(t);\n            m.set(this._container, \"width\", (((this._items.length * this._config.width)) + \"px\"));\n        },\n        _updateArrowState: function(t) {\n            if (!this._config.arrows) {\n                return\n            };\n            var u = this._config.wrap, v = this._items.length, w = Math.floor((v / this._config.photosperframe));\n            i.conditionClass(this._arrowRight, \"_2xo\", ((w === 1) || ((!u && (t === (w - 1))))));\n            i.conditionClass(this._arrowLeft, \"_2xo\", ((w === 1) || ((!u && (t === 0)))));\n        },\n        _animate: function(t, u) {\n            this._animating = true;\n            this.inform(\"page_start\", t);\n            new g(this._container).to(q, (-t * this._config.width)).duration(this._config.animationDuration).ease(r).ondone(u).go();\n        },\n        _setContainerPos: function(t) {\n            m.set(this._container, q, ((-t * this._config.width) + \"px\"));\n        },\n        _animateTo: function(t) {\n            if (this._animating) {\n                return\n            };\n            var u = this._items.length;\n            if (((((0 <= t) && (t < u))) || !this._config.wrap)) {\n                var v = (((t + u)) % u);\n                this._updateArrowState(v);\n                return this._animate(v, p(this._setCurrent, this, v));\n            }\n        ;\n            var w = (t % u), x = (w ? (u - 1) : 0), y = this._items[(u - 1)];\n            m.set(y, \"position\", \"absolute\");\n            m.set(y, q, (-this._config.width + \"px\"));\n            if ((x === 0)) {\n                this._setContainerPos(-1);\n            };\n            this._animate(w, function() {\n                m.set(y, \"position\", \"static\");\n                m.set(y, q, \"auto\");\n                this._setContainerPos(x);\n                this._setCurrent(x);\n            }.bind(this));\n        }\n    });\n    e.exports = s;\n});");
// 13267
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o7,"s610492c67064c0ead09a2fdf91c068744cb6c1ed");
// 13268
geval("if (JSBNG__self.CavalryLogger) {\n    CavalryLogger.start_js([\"H+v1W\",]);\n}\n;\n;\n__d(\"CanvasAppRequestUpdater\", [\"Arbiter\",\"CSS\",\"ChannelConstants\",\"DOM\",\"copyProperties\",\"csx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"CSS\"), i = b(\"ChannelConstants\"), j = b(\"DOM\"), k = b(\"copyProperties\"), l = b(\"csx\");\n    function m(n) {\n        this._root = n;\n        g.subscribe(i.getArbiterType(\"app_request_create\"), function(o, p) {\n            var q = j.scry(this._root, ((\".item_\" + p.obj.appid)))[0], r = ((q && j.scry(q, \"._1k71\")[0]));\n            ((r && j.appendContent(r, p.obj.request)));\n            ((q && this._updateBookmark(q, 1)));\n        }.bind(this));\n        g.subscribe(i.getArbiterType(\"app_request_delete\"), function(o, p) {\n            var q = j.scry(this._root, ((\".item_\" + p.obj.appid)))[0], r = ((q && j.scry(q, ((((\"[data-requestid='\" + p.obj.requestid)) + \"']\")))[0]));\n            ((r && j.remove(r.parentNode)));\n            ((q && this._updateBookmark(q, -1)));\n        }.bind(this));\n    };\n;\n    k(m.prototype, {\n        _updateBookmark: function(n, o) {\n            var p = j.JSBNG__find(n, \"._1k72\"), q = j.JSBNG__find(n, \".countValue\"), r = parseInt(j.getText(q), 10), s = Math.max(0, ((r + o)));\n            j.setContent(q, s);\n            if (((s < 1))) {\n                h.hide(q.parentNode);\n                h.hide(p);\n            }\n             else {\n                h.show(q.parentNode);\n                h.show(p);\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = m;\n});\n__d(\"CanvasFlyoutLoader\", [\"AsyncRequest\",\"JSBNG__Event\",\"shield\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = b(\"JSBNG__Event\"), i = b(\"shield\"), j = {\n        endpoint: \"/ajax/canvas/flyouts\",\n        init: function(k, l, m) {\n            this.root = k;\n            this.largeApps = l;\n            this.seeAllApps = m;\n            this.handler = h.listen(k, \"mouseenter\", i(this.loadFlyouts, this));\n        },\n        loadFlyouts: function() {\n            this.handler.remove();\n            this.handler = null;\n            var k = {\n                items: this.largeApps,\n                all_apps: this.seeAllApps\n            };\n            new g().setURI(this.endpoint).setRelativeTo(this.root).setMethod(\"post\").setReadOnly(true).setData(k).setAllowCrossPageTransition(true).send();\n        }\n    };\n    e.exports = j;\n});\n__d(\"CanvasRecommendationFlyoutLoader\", [\"AsyncRequest\",\"JSBNG__Event\",\"shield\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = b(\"JSBNG__Event\"), i = b(\"shield\"), j = {\n        endpoint: \"/ajax/canvas/recommendation/flyouts\",\n        init: function(k, l, m, n) {\n            this.root = k;\n            this.apps = l;\n            this.editorialApps = m;\n            if (n) {\n                this.egoRedirectUrls = n;\n            }\n        ;\n        ;\n            this.handler = h.listen(k, \"mouseenter\", i(this.loadFlyouts, this));\n        },\n        loadFlyouts: function() {\n            this.handler.remove();\n            this.handler = null;\n            var k = {\n                items: this.apps\n            };\n            if (this.editorialApps) {\n                k.editorial_items = this.editorialApps;\n            }\n        ;\n        ;\n            if (this.egoRedirectUrls) {\n                k.egoredirecturls = this.egoRedirectUrls;\n            }\n        ;\n        ;\n            new g().setURI(this.endpoint).setRelativeTo(this.root).setMethod(\"post\").setReadOnly(true).setData(k).setAllowCrossPageTransition(true).send();\n        }\n    };\n    e.exports = j;\n});\n__d(\"BuddyListNub\", [\"JSXDOM\",\"JSBNG__Event\",\"Arbiter\",\"AvailableList\",\"BlackbirdUpsell\",\"ChannelConnection\",\"ChannelConstants\",\"ChatConfig\",\"ChatVisibility\",\"Class\",\"CSS\",\"Dock\",\"DOM\",\"HTML\",\"Keys\",\"NubController\",\"OrderedFriendsList\",\"Parent\",\"PresencePrivacy\",\"Toggler\",\"copyProperties\",\"csx\",\"cx\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSXDOM\"), h = b(\"JSBNG__Event\"), i = b(\"Arbiter\"), j = b(\"AvailableList\"), k = b(\"BlackbirdUpsell\"), l = b(\"ChannelConnection\"), m = b(\"ChannelConstants\"), n = b(\"ChatConfig\"), o = b(\"ChatVisibility\"), p = b(\"Class\"), q = b(\"CSS\"), r = b(\"Dock\"), s = b(\"DOM\"), t = b(\"HTML\"), u = b(\"Keys\"), v = b(\"NubController\"), w = b(\"OrderedFriendsList\"), x = b(\"Parent\"), y = b(\"PresencePrivacy\"), z = b(\"Toggler\"), aa = b(\"copyProperties\"), ba = b(\"csx\"), ca = b(\"cx\"), da = b(\"tx\"), ea = 32, fa = 10;\n    function ga(ha, ia, ja) {\n        this.parent.construct(this);\n        this.parent.init(ha);\n        this.root = ha;\n        this.orderedList = ia;\n        this.typeahead = ja;\n        this.button = s.JSBNG__find(ha, \"a.fbNubButton\");\n        this.unreadCount = s.JSBNG__find(ha, \"span._5ayx\");\n        this.label = s.JSBNG__find(ha, \"span.label\");\n        this.body = s.scry(ha, \"div.fbNubFlyoutBody\")[0];\n        this.container = x.byClass(ha, \"_56ox\");\n        var ka = s.JSBNG__find(ha, \"div.fbNubFlyoutTitlebar\");\n        z.createInstance(ka).setSticky(false);\n        ia.subscribe(\"render\", this.flyoutContentChanged.bind(this));\n        ia.setScrollContainer(this.body);\n        j.subscribe(\"buddylist/availability-changed\", this._updateCount.bind(this));\n        i.subscribe(\"chat/connect\", this._handleConnect.bind(this));\n        y.subscribe(\"privacy-user-presence-changed\", this._handleVisibilityChange.bind(this));\n        this.message = s.JSBNG__find(ha, \"div._4mq1\");\n        this.warningMsgText = null;\n        this.warningMsgEventListener = null;\n        this.showWarningTimeout = null;\n        l.subscribe(l.CONNECTED, this._handleChannelConnected.bind(this));\n        l.subscribe(l.SHUTDOWN, this._handleChannelShutdown.bind(this));\n        l.subscribe(l.RECONNECTING, this._handleChannelReconnecting.bind(this));\n        l.subscribe([l.MUTE_WARNING,l.UNMUTE_WARNING,], this._updateView.bind(this));\n        this.subscribe(\"show\", this.onShow.bind(this));\n        this.subscribe(\"hide\", this.onHide.bind(this));\n        this.subscribe(\"resize\", this.onResize.bind(this));\n        h.listen(ha, \"keydown\", this._onKeyDown.bind(this));\n        h.listen(this.button, \"click\", this.onButtonClick.bind(this));\n        ja.subscribe([\"respond\",\"reset\",], function(la, ma) {\n            if (this._isOpen) {\n                var na = this.orderedList.isVisible();\n                if (((((((ma && ma.value)) && ((ma.value === ja.getCore().getValue())))) && ja.getView().isVisible()))) {\n                    r.setUseMaxHeight(this.root, false);\n                    this.orderedList.hide();\n                }\n                 else this._showBuddyList();\n            ;\n            ;\n                if (((na !== this.orderedList.isVisible()))) {\n                    this.flyoutContentChanged();\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n        }.bind(this));\n        i.subscribe(\"sidebar/show\", this.hide.bind(this));\n        if (n.get(\"litestand_buddylist_count\")) {\n            i.subscribe(\"buddylist-nub/updateCount\", function(la, ma) {\n                this._unreadMessageCount = ma.count;\n                this._updateView();\n            }.bind(this));\n        }\n    ;\n    ;\n        this._orderedListCount = w.getList().length;\n        i.inform(\"buddylist-nub/initialized\", this, i.BEHAVIOR_PERSISTENT);\n        this._handleVisibilityChange();\n    };\n;\n    p.extend(ga, v);\n    aa(ga.prototype, {\n        getButton: function() {\n            return this.button;\n        },\n        getRoot: function() {\n            return this.root;\n        },\n        _handleConnect: function(ha) {\n            this._updateView(true);\n        },\n        _getShutdownReason: function(ha) {\n            switch (ha) {\n              case m.HINT_AUTH:\n                return \"Your session has timed out. Please log in.\";\n              case m.HINT_CONN:\n                return da._(\"Facebook {Chat} is currently unavailable.\", {\n                    Chat: \"Chat\"\n                });\n              case m.HINT_MAINT:\n                return da._(\"Facebook {Chat} is currently down for maintenance.\", {\n                    Chat: \"Chat\"\n                });\n              default:\n                return da._(\"Facebook {Chat} is currently unavailable.\", {\n                    Chat: \"Chat\"\n                });\n            };\n        ;\n        },\n        _getReconnectMsg: function(ha) {\n            var ia;\n            if (((ha === null))) {\n                ia = \"Unable to connect to chat. Check your Internet connection.\";\n            }\n             else if (((ha > n.get(\"warning_countdown_threshold_msec\")))) {\n                var ja = s.create(\"a\", {\n                    href: \"#\",\n                    className: \"fbChatReconnectLink\"\n                }, \"Try again\"), ka = s.create(\"div\", null, ja), la = ka.innerHTML;\n                ia = t(da._(\"Unable to connect to chat. {try-again-link}\", {\n                    \"try-again-link\": la\n                }));\n            }\n             else if (((ha > 1000))) {\n                ia = da._(\"Unable to connect to chat. Reconnecting in {seconds}...\", {\n                    seconds: Math.floor(((ha / 1000)))\n                });\n            }\n             else ia = \"Unable to connect to chat. Reconnecting...\";\n            \n            \n        ;\n        ;\n            return ia;\n        },\n        _resetShowWarningTimeout: function() {\n            if (this.showWarningTimeout) {\n                JSBNG__clearTimeout(this.showWarningTimeout);\n                this.showWarningTimeout = null;\n            }\n        ;\n        ;\n        },\n        _handleChannelConnected: function(ha) {\n            this._resetShowWarningTimeout();\n            if (this.orderedList.isVisible()) {\n                o.goOnline();\n            }\n        ;\n        ;\n            this.warningMsgText = null;\n            this._updateView();\n        },\n        _handleChannelShutdown: function(ha, ia) {\n            this._resetShowWarningTimeout();\n            this.warningMsgText = this._getShutdownReason(ia);\n            this._updateView();\n        },\n        _handleChannelReconnecting: function(ha, ia) {\n            this._resetShowWarningTimeout();\n            this.warningMsgText = this._getReconnectMsg(ia);\n            if (((ia > 1000))) {\n                if (((ia > n.get(\"warning_countdown_threshold_msec\")))) {\n                    if (this.warningMsgEventListener) {\n                        this.warningMsgEventListener.remove();\n                        this.warningMsgEventListener = null;\n                    }\n                ;\n                ;\n                    this.warningMsgEventListener = h.listen(this.message, \"click\", function(JSBNG__event) {\n                        if (q.hasClass(JSBNG__event.getTarget(), \"fbChatReconnectLink\")) {\n                            this._tryReconnect();\n                            JSBNG__event.kill();\n                        }\n                    ;\n                    ;\n                    }.bind(this));\n                }\n            ;\n            ;\n                this.showWarningTimeout = JSBNG__setTimeout(this._handleChannelReconnecting.bind(this, ha, ((ia - 1000))), 1000, false);\n            }\n        ;\n        ;\n            this._updateView();\n        },\n        _tryReconnect: function() {\n            if (l.disconnected()) {\n                l.reconnect();\n            }\n        ;\n        ;\n        },\n        _handleVisibilityChange: function() {\n            this._updateView();\n            if (k.shouldShow()) {\n                if (o.hasBlackbirdEnabled()) {\n                    k.showBlackbirdDialog(this.getButton(), y.getVisibility());\n                }\n                 else if (!o.isOnline()) {\n                    k.showOfflineDialog(this.getButton());\n                }\n                \n            ;\n            ;\n            }\n             else k.hide();\n        ;\n        ;\n            if (!o.isOnline()) {\n                this.hide();\n            }\n        ;\n        ;\n        },\n        _updateView: function(ha) {\n            var ia = this.container;\n            if (ia) {\n                q.conditionClass(ia, \"offline\", !o.isOnline());\n                q.conditionClass(ia, \"error\", l.disconnected());\n            }\n        ;\n        ;\n            if (l.disconnected()) {\n                s.setContent(this.message, this.warningMsgText);\n            }\n        ;\n        ;\n            var ja, ka;\n            if (!o.isOnline()) {\n                ja = da._(\"{Chat} (Off)\", {\n                    Chat: \"Chat\"\n                });\n            }\n             else if (l.disconnected()) {\n                ja = da._(\"{Chat} (Disconnected)\", {\n                    Chat: \"Chat\"\n                });\n            }\n             else {\n                var la = j.getOnlineCount();\n                if (la) {\n                    ja = da._(\"{Chat} {number-available}\", {\n                        Chat: \"Chat\",\n                        \"number-available\": g.span({\n                            className: \"count\"\n                        }, \" (\", g.strong(null, la), \") \")\n                    });\n                }\n                 else {\n                    ja = \"Chat\";\n                    ka = true;\n                }\n            ;\n            ;\n            }\n            \n        ;\n        ;\n            this._setUnread(this._unreadMessageCount);\n            this._setLabel(ja, ka);\n            this.buttonContentChanged();\n        },\n        onButtonClick: function() {\n            this._conditionallyShowTypeahead();\n            if (q.shown(this.typeahead.getElement())) {\n                var ha = this.subscribe(\"show\", function() {\n                    this.typeahead.getCore().getElement().JSBNG__focus();\n                    k.dismiss();\n                }.bind(this));\n                this.unsubscribe.bind(this, ha).defer();\n            }\n        ;\n        ;\n        },\n        onHide: function() {\n            this._isOpen = false;\n            if (this._buddyListRenderSubscription) {\n                this.orderedList.unsubscribe(this._buddyListRenderSubscription);\n                this._buddyListRenderSubscription = null;\n            }\n        ;\n        ;\n            this.orderedList.hide();\n            this.typeahead.getCore().reset();\n        },\n        _onKeyDown: function(JSBNG__event) {\n            var ha = h.getKeyCode(JSBNG__event);\n            if (((((ha === u.ESC)) && !q.hasClass(this.root, \"menuOpened\")))) {\n                this.hide();\n                return false;\n            }\n        ;\n        ;\n        },\n        onResize: function() {\n            var ha = ((r.getMaxFlyoutHeight(this.root) - 60)), ia = Math.max(250, ha);\n            this.orderedList.setNumTopFriends(Math.floor(((ia / ea))));\n        },\n        _showBuddyList: function() {\n            if (!this._buddyListRenderSubscription) {\n                this._buddyListRenderSubscription = this.orderedList.subscribe(\"render\", r.setUseMaxHeight.bind(r, this.root, false));\n            }\n        ;\n        ;\n            this.orderedList.show();\n        },\n        onShow: function() {\n            this._isOpen = true;\n            if (l.disconnected()) {\n                this._tryReconnect();\n                this._showBuddyList();\n            }\n             else o.goOnline(this._showBuddyList.bind(this));\n        ;\n        ;\n        },\n        _setLabel: function(ha, ia) {\n            var ja = this.label.cloneNode(true);\n            s.setContent(ja, ha);\n            s.replace(this.label, ja);\n            this.label = ja;\n            ((this.throbber && q.conditionShow(this.throbber, !!ia)));\n        },\n        _setUnread: function(ha) {\n            q.conditionShow(this.unreadCount, !!ha);\n            if (ha) {\n                ha = g.span({\n                    className: \"_51jx _5ayw\"\n                }, ha);\n                s.setContent(this.unreadCount, ha);\n            }\n        ;\n        ;\n        },\n        _conditionallyShowTypeahead: function() {\n            q.conditionShow(this.typeahead.getElement(), ((this._orderedListCount >= fa)));\n        },\n        _updateCount: function() {\n            this._updateView();\n            this._conditionallyShowTypeahead();\n        }\n    });\n    e.exports = ga;\n});\n__d(\"LiveBarData\", [\"function-extensions\",\"Arbiter\",\"ArbiterMixin\",\"AsyncRequest\",\"ChannelConstants\",\"LayerDestroyOnHide\",\"copyProperties\",\"setTimeoutAcrossTransitions\",], function(a, b, c, d, e, f) {\n    b(\"function-extensions\");\n    var g = b(\"Arbiter\"), h = b(\"ArbiterMixin\"), i = b(\"AsyncRequest\"), j = b(\"ChannelConstants\"), k = b(\"LayerDestroyOnHide\"), l = b(\"copyProperties\"), m = b(\"setTimeoutAcrossTransitions\"), n = false, o = {\n    }, p = {\n    }, q = {\n    };\n    function r(y) {\n        if (((((((y.expires * 1000)) - JSBNG__Date.now())) > 0))) {\n            return true;\n        }\n    ;\n    ;\n        return false;\n    };\n;\n    function s(y) {\n        var z = y.payload.actions;\n        if (!((z && z.length))) {\n            return;\n        }\n    ;\n    ;\n        var aa;\n        for (var ba = 0; ((ba < z.length)); ba++) {\n            aa = z[ba].actor_id;\n            if (((!o[aa] || ((z[ba].action_id != o[aa].action_id))))) {\n                continue;\n            }\n        ;\n        ;\n            if (((z[ba].delete_action || z[ba].remove))) {\n                v(z[ba]);\n                continue;\n            }\n        ;\n        ;\n        };\n    ;\n    };\n;\n    function t(y) {\n        var z = false;\n        for (var aa = 0; ((aa < y.length)); aa++) {\n            if (((y[aa].delete_action || y[aa].remove))) {\n                v(y[aa]);\n                continue;\n            }\n        ;\n        ;\n            var ba = y[aa].actor_id, ca = y[aa].action_id;\n            if (o[ba]) {\n                if (((o[ba].action_id == ca))) {\n                    continue;\n                }\n            ;\n            ;\n                v(o[ba]);\n            }\n        ;\n        ;\n            z = true;\n            o[ba] = y[aa];\n            u(y[aa]);\n        };\n    ;\n        if (z) {\n            x.inform(\"new-actions\");\n        }\n    ;\n    ;\n    };\n;\n    function u(y) {\n        var z = ((((y.expires * 1000)) - JSBNG__Date.now()));\n        p[y.actor_id] = m(v.curry(y), Math.max(0, z));\n    };\n;\n    function v(y) {\n        if (!o[y.actor_id]) {\n            return;\n        }\n    ;\n    ;\n        if (((o[y.actor_id].action_id != y.action_id))) {\n            return;\n        }\n    ;\n    ;\n        delete o[y.actor_id];\n        var z = y.actor_id;\n        if (p[z]) {\n            JSBNG__clearTimeout(p[z]);\n            delete p[z];\n        }\n    ;\n    ;\n        w(z);\n        x.inform(\"remove-action\", y);\n    };\n;\n    function w(y) {\n        var z = q[y];\n        if (z) {\n            z.enableBehavior(k);\n            if (!z.isShown()) {\n                z.destroy();\n            }\n        ;\n        ;\n            delete q[y];\n        }\n    ;\n    ;\n    };\n;\n    g.subscribe(j.getArbiterType(\"livebar_update\"), function(y, z) {\n        t(z.obj.actions);\n    });\n    var x = {\n    };\n    l(x, h, {\n        fetch: function() {\n            if (n) {\n                return;\n            }\n        ;\n        ;\n            var y = [];\n            {\n                var fin255keys = ((window.top.JSBNG_Replay.forInKeys)((o))), fin255i = (0);\n                var z;\n                for (; (fin255i < fin255keys.length); (fin255i++)) {\n                    ((z) = (fin255keys[fin255i]));\n                    {\n                        var aa = o[z];\n                        if (aa.suppress_callout) {\n                            continue;\n                        }\n                    ;\n                    ;\n                        if (!q[aa.actor_id]) {\n                            y.push(o[z]);\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            if (((y.length > 0))) {\n                n = true;\n                new i().setURI(\"/ajax/chat/livebar.php\").setData({\n                    actions: y\n                }).setHandler(s).setFinallyHandler(function() {\n                    n = false;\n                }).setAllowCrossPageTransition(true).send();\n            }\n        ;\n        ;\n        },\n        addActions: t,\n        getAction: function(y) {\n            var z = o[y];\n            if (((z && r(z)))) {\n                return z;\n            }\n        ;\n        ;\n            return null;\n        },\n        getDialog: function(y) {\n            var z = this.getAction(y);\n            if (((z && q[z.actor_id]))) {\n                return q[z.actor_id];\n            }\n        ;\n        ;\n            return null;\n        },\n        setDialog: function(y, z, aa) {\n            var ba = o[y];\n            if (((ba && ((ba.action_id == z))))) {\n                w(y);\n                q[y] = aa;\n                x.inform(\"dialog-fetched\", y);\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = x;\n});\n__d(\"LiveBar\", [\"ChatOrderedList\",\"function-extensions\",\"LegacyContextualDialog\",\"ChatConfig\",\"CSS\",\"LiveBarData\",\"copyProperties\",\"setTimeoutAcrossTransitions\",\"shield\",], function(a, b, c, d, e, f) {\n    b(\"ChatOrderedList\");\n    b(\"function-extensions\");\n    b(\"LegacyContextualDialog\");\n    var g = b(\"ChatConfig\"), h = b(\"CSS\"), i = b(\"LiveBarData\"), j = b(\"copyProperties\"), k = b(\"setTimeoutAcrossTransitions\"), l = b(\"shield\"), m = ((g.get(\"livebar_fetch_defer\") || 1000));\n    function n(o, p, q) {\n        this._orderedList = o;\n        this._root = o.getRoot();\n        this._liveBarTypes = q;\n        this._hoverController = o.getHoverController();\n        this._hoverController.subscribe(\"hover\", this._mouseMove.bind(this));\n        this._hoverController.subscribe(\"leave\", this._mouseLeave.bind(this));\n        o.subscribe(\"render\", l(this._handleChatListUpdate, this));\n        i.subscribe(\"new-actions\", this._updateIcons.bind(this));\n        i.subscribe(\"remove-action\", this._handleRemoveAction.bind(this));\n        i.subscribe(\"dialog-fetched\", function(r, s) {\n            this._setDialogContent(s);\n        }.bind(this));\n        i.addActions(p);\n    };\n;\n    j(n, {\n        setDialog: function(o, p, q) {\n            i.setDialog(o, p, q);\n        }\n    });\n    j(n.prototype, {\n        _root: null,\n        _liveBarTypes: null,\n        _hoverController: null,\n        _registrations: {\n        },\n        _renderedIcons: {\n        },\n        _fetchTimer: null,\n        _mouseLeftRoot: false,\n        _chatListRendered: false,\n        _getLiveBarTypes: function() {\n            return this._liveBarTypes;\n        },\n        _handleChatListUpdate: function() {\n            if (!this._chatListRendered) {\n                this._chatListRendered = true;\n                this._updateIcons();\n            }\n        ;\n        ;\n        },\n        _handleShow: function(o) {\n            this._setDialogContent(o);\n        },\n        _mouseMove: function() {\n            if (!this._fetchTimer) {\n                this._fetchTimer = k(this._fetch.bind(this), m);\n                this._mouseLeftRoot = false;\n            }\n        ;\n        ;\n        },\n        _mouseLeave: function() {\n            this._mouseLeftRoot = true;\n            JSBNG__clearTimeout(this._fetchTimer);\n            this._fetchTimer = null;\n        },\n        _setDialogContent: function(o) {\n            var p = i.getDialog(o);\n            if (p) {\n                this._hoverController.showHovercard(o, p);\n            }\n        ;\n        ;\n        },\n        _fetch: function() {\n            if (this._mouseLeftRoot) {\n                return;\n            }\n        ;\n        ;\n            this._fetchTimer = null;\n            i.fetch();\n        },\n        _updateIcons: function() {\n            if (!this._chatListRendered) {\n                return;\n            }\n        ;\n        ;\n            var o = this._orderedList.getAllNodes(), p = this._getLiveBarTypes();\n            {\n                var fin256keys = ((window.top.JSBNG_Replay.forInKeys)((o))), fin256i = (0);\n                var q;\n                for (; (fin256i < fin256keys.length); (fin256i++)) {\n                    ((q) = (fin256keys[fin256i]));\n                    {\n                        var r = i.getAction(q);\n                        if (((r && ((!this._renderedIcons[q] || ((this._renderedIcons[q] != r.action_id))))))) {\n                            for (var s = 0; ((s < p.length)); s++) {\n                                h.removeClass(o[q], p[s]);\n                            ;\n                            };\n                        ;\n                            h.addClass(o[q], r.livebar_type);\n                            this._renderedIcons[q] = r.action_id;\n                            var t = this._hoverController.register(q, this._handleShow.bind(this));\n                            if (t) {\n                                this._registrations[q] = t;\n                            }\n                        ;\n                        ;\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n        },\n        _handleRemoveAction: function(o, p) {\n            var q = p.action_id, r = p.actor_id;\n            ((this._registrations[r] && this._registrations[r].unregister()));\n            delete this._registrations[r];\n            if (((this._renderedIcons[r] == q))) {\n                var s = this._getLiveBarTypes(), t = this._orderedList.getAllNodes();\n                if (t[r]) {\n                    for (var u = 0; ((u < s.length)); u++) {\n                        h.removeClass(t[r], s[u]);\n                    ;\n                    };\n                }\n            ;\n            ;\n                delete this._renderedIcons[r];\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = n;\n});\n__d(\"LiveBarDark\", [\"Class\",\"LiveBar\",\"copyProperties\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"Class\"), h = b(\"LiveBar\"), i = b(\"copyProperties\"), j = b(\"emptyFunction\");\n    function k(l, m, n) {\n        this.parent.construct(this, l, m, n);\n    };\n;\n    g.extend(k, h);\n    i(k.prototype, {\n        _setupDialogContent: j,\n        _show: j,\n        _updateIcons: j,\n        _handleRemoveAction: j,\n        _handleChatListUpdate: j\n    });\n    e.exports = k;\n});\n__d(\"ChatSidebarDropdown\", [\"Arbiter\",\"AsyncRequest\",\"Chat\",\"ChatOptions\",\"ChatVisibility\",\"CSS\",\"DOM\",\"JSBNG__Event\",\"JSLogger\",\"PresenceState\",\"SelectorDeprecated\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"AsyncRequest\"), i = b(\"Chat\"), j = b(\"ChatOptions\"), k = b(\"ChatVisibility\"), l = b(\"CSS\"), m = b(\"DOM\"), n = b(\"JSBNG__Event\"), o = b(\"JSLogger\"), p = b(\"PresenceState\"), q = b(\"SelectorDeprecated\"), r = b(\"copyProperties\");\n    function s(t, u) {\n        this._root = t;\n        this._logger = o.create(\"blackbird\");\n        this._displayBrowserNotificationsIfNeeded();\n        q.listen(t, \"select\", this._onSelect.bind(this));\n        q.listen(t, \"toggle\", this._onToggle.bind(this));\n        if (u) {\n            q.listen(t, \"close\", u.allowCollapse.curry(true, \"SidebarMenu\"));\n            q.listen(t, \"open\", u.allowCollapse.curry(false, \"SidebarMenu\"));\n        }\n    ;\n    ;\n        g.subscribe(\"chat/option-changed\", this._onOptionChanged.bind(this));\n    };\n;\n    r(s, {\n        registerEditFavorites: function(t, u, v) {\n            function w(x) {\n                l.conditionShow(t, !x);\n                l.conditionShow(u, x);\n            };\n        ;\n            n.listen(t, \"click\", function() {\n                v.toggleEditMode();\n                w(true);\n            });\n            n.listen(u, \"click\", function() {\n                v.toggleEditMode();\n                w(false);\n            });\n            v.subscribe(\"editStart\", w.curry(true));\n            v.subscribe(\"editEnd\", w.curry(false));\n        }\n    });\n    r(s.prototype, {\n        changeSetting: function(t, u) {\n            if (this._pendingChange) {\n                return false;\n            }\n        ;\n        ;\n            this._pendingChange = true;\n            var v = {\n            };\n            v[t] = u;\n            j.setSetting(t, u, \"sidebar_menu\");\n            new h(\"/ajax/chat/settings.php\").setHandler(this._onChangeSettingResponse.bind(this, t, u)).setErrorHandler(this._onChangeSettingError.bind(this, t, u)).setFinallyHandler(this._onChangeFinally.bind(this)).setData(v).setAllowCrossPageTransition(true).send();\n        },\n        _displayBrowserNotificationsIfNeeded: function() {\n            if (window.JSBNG__webkitNotifications) {\n                m.scry(JSBNG__document, \"li.sidebar-browser-notif\").forEach(l.show);\n                if (((window.JSBNG__webkitNotifications.checkPermission() !== 0))) {\n                    m.scry(JSBNG__document, \"li.sidebar-browser-notif\").forEach(function(t) {\n                        l.removeClass(t, \"checked\");\n                    });\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n        },\n        _conditionEnabled: function(t, u) {\n            var v = q.getOption(this._root, t);\n            ((v && q.setOptionEnabled(v, u)));\n        },\n        _onChangeSettingResponse: function(t, u, v) {\n            p.doSync();\n        },\n        _onChangeSettingError: function(t, u, v) {\n            j.setSetting(t, !u, \"sidebar_menu_error\");\n        },\n        _onChangeFinally: function() {\n            this._pendingChange = false;\n        },\n        _onOptionChanged: function(t, u) {\n            var v = u.JSBNG__name, w = u.value;\n            if (((((v === \"sound\")) || ((v === \"browser_notif\"))))) {\n                var x = q.getOption(this._root, v);\n                if (((w !== q.isOptionSelected(x)))) {\n                    q.setSelected(this._root, v, w);\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n        },\n        _onSelect: function(t) {\n            if (this._pendingChange) {\n                return false;\n            }\n        ;\n        ;\n            var u = false, v = false, w = q.getOptionValue(t.option);\n            switch (w) {\n              case \"JSBNG__sidebar\":\n                return this.toggleSidebar();\n              case \"online\":\n                if (!k.isOnline()) {\n                    k.goOnline();\n                }\n                 else v = true;\n            ;\n            ;\n                u = true;\n                break;\n              case \"offline\":\n                if (k.isOnline()) {\n                    k.goOffline();\n                }\n                 else v = true;\n            ;\n            ;\n                u = true;\n                break;\n              case \"advanced_settings\":\n            \n              case \"turn_off_dialog\":\n                g.inform(\"chat/advanced-settings-dialog-opened\");\n                u = true;\n                break;\n            };\n        ;\n            if (v) {\n                this._logger.error(\"sidebar_dropdown_visibility_error\", {\n                    action: w\n                });\n            }\n             else this._logger.log(\"sidebar_dropdown_set_visibility\", {\n                action: w\n            });\n        ;\n        ;\n            if (u) {\n                q.toggle(this._root);\n                return false;\n            }\n        ;\n        ;\n        },\n        _onToggle: function(t) {\n            if (this._pendingChange) {\n                return false;\n            }\n        ;\n        ;\n            var u = q.getOptionValue(t.option), v = q.isOptionSelected(t.option);\n            switch (u) {\n              case \"visibility\":\n                if (!k) {\n                    this._jslogger.error(\"on_toggle_visibility_undefined\");\n                    return;\n                }\n            ;\n            ;\n                k.toggleVisibility();\n                this._logger.log(\"sidebar_dropdown_toggle_visibility\", {\n                    available: v\n                });\n                break;\n              case \"browser_notif\":\n                if (((((v && window.JSBNG__webkitNotifications)) && ((window.JSBNG__webkitNotifications.checkPermission() !== 0))))) {\n                    window.JSBNG__webkitNotifications.requestPermission(function() {\n                        this.changeSetting(u, v);\n                    }.bind(this));\n                }\n                 else this.changeSetting(u, v);\n            ;\n            ;\n                break;\n              case \"sound\":\n                this.changeSetting(u, v);\n                break;\n            };\n        ;\n            q.toggle(this._root);\n        },\n        _onVisibilityChanged: function() {\n            var t = k.isOnline(), u = q.getOption(this._root, \"visibility\");\n            if (((t !== q.isOptionSelected(u)))) {\n                q.setSelected(this._root, \"visibility\", t);\n            }\n        ;\n        ;\n        },\n        toggleSidebar: function() {\n            i.toggleSidebar();\n            q.toggle(this._root);\n            return false;\n        }\n    });\n    e.exports = s;\n});\n__d(\"ChatSidebarLog\", [\"AsyncSignal\",\"Bootloader\",\"ModuleDependencies\",\"JSLogger\",\"Run\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncSignal\"), h = b(\"Bootloader\"), i = b(\"ModuleDependencies\"), j = b(\"JSLogger\"), k = b(\"Run\"), l = j.create(\"chat_sidebar_load\"), m = null, n = false, o = ((((Math.JSBNG__random() * 2147483648)) | 0)).toString(36);\n    k.onLoad(function() {\n        n = true;\n    });\n    try {\n        d([\"ChatSidebar\",], function(t) {\n            m = t;\n        });\n    } catch (p) {\n        l.warn(\"exception\", {\n            reason: p.toString()\n        });\n    };\n;\n    function q(t, u) {\n        if (((t.length > u))) {\n            return t[u];\n        }\n    ;\n    ;\n        return null;\n    };\n;\n    function r(t) {\n        JSBNG__setTimeout(function() {\n            var u = i.getMissing(\"ChatSidebar\"), v = h.getErrorUrls(), w = h.getLoadingUrls(), x = [];\n            {\n                var fin257keys = ((window.top.JSBNG_Replay.forInKeys)((w))), fin257i = (0);\n                var y;\n                for (; (fin257i < fin257keys.length); (fin257i++)) {\n                    ((y) = (fin257keys[fin257i]));\n                    {\n                        x.push({\n                            url: y,\n                            time: w[y]\n                        });\n                    ;\n                    };\n                };\n            };\n        ;\n            x.sort(function(aa, ba) {\n                return ((ba.time - aa.time));\n            });\n            var z = {\n                page_loaded: n,\n                page_id: o,\n                timeout: t,\n                missing_total: u.length,\n                module_1: q(u, 0),\n                module_2: q(u, 1),\n                module_3: q(u, 2),\n                error_url_total: v.length,\n                error_url_1: q(v, 0),\n                error_url_2: q(v, 1),\n                error_url_3: q(v, 2),\n                loading_url_total: x.length,\n                loading_url_1: ((q(x, 0) ? q(x, 0).url : null)),\n                loading_time_1: ((q(x, 0) ? q(x, 0).time : null)),\n                loading_url_2: ((q(x, 1) ? q(x, 1).url : null)),\n                loading_time_2: ((q(x, 1) ? q(x, 1).time : null)),\n                loading_url_3: ((q(x, 2) ? q(x, 2).url : null)),\n                loading_time_3: ((q(x, 2) ? q(x, 2).time : null))\n            };\n            if (!m) {\n                l.warn(((\"require_\" + t)), {\n                    missing: u\n                });\n                z.symptom = \"require\";\n            }\n        ;\n        ;\n            if (((m && !m.isInitialized()))) {\n                l.warn(((\"init_\" + t)), {\n                    missing: u\n                });\n                z.symptom = \"init\";\n            }\n        ;\n        ;\n            if (z.symptom) {\n                new g(\"/ajax/chat/sidebar_load.php\", z).send();\n            }\n        ;\n        ;\n        }, t);\n    };\n;\n    var s = {\n        start: function() {\n            r(5000);\n            r(10000);\n            r(15000);\n            r(30000);\n            r(60000);\n        }\n    };\n    e.exports = s;\n});\n__d(\"NotificationConstants\", [], function(a, b, c, d, e, f) {\n    e.exports = {\n        PayloadSourceType: {\n            UNKNOWN: 0,\n            USER_ACTION: 1,\n            LIVE_SEND: 2,\n            ENDPOINT: 3,\n            INITIAL_LOAD: 4,\n            OTHER_APPLICATION: 5\n        }\n    };\n});\n__d(\"NotificationTokens\", [\"Env\",], function(a, b, c, d, e, f) {\n    var g = b(\"Env\"), h = {\n        tokenizeIDs: function(i) {\n            return i.map(function(j) {\n                return ((((g.user + \":\")) + j));\n            });\n        },\n        untokenizeIDs: function(i) {\n            return i.map(function(j) {\n                return j.split(\":\")[1];\n            });\n        }\n    };\n    e.exports = h;\n});\n__d(\"NotificationImpressions\", [\"AsyncSignal\",\"NotificationTokens\",\"URI\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncSignal\"), h = b(\"NotificationTokens\"), i = b(\"URI\"), j = \"/ajax/notifications/impression.php\";\n    function k(l, m) {\n        var n = {\n            ref: m\n        };\n        h.untokenizeIDs(l).forEach(function(o, p) {\n            n[((((\"alert_ids[\" + p)) + \"]\"))] = o;\n        });\n        new g(i(j).getQualifiedURI().toString(), n).send();\n    };\n;\n    e.exports = {\n        log: k\n    };\n});\n__d(\"NotificationPhotoThumbnail\", [], function(a, b, c, d, e, f) {\n    function g(i) {\n        return ((((i.style == \"photo\")) ? i.media.image : null));\n    };\n;\n    var h = {\n        getThumbnail: function(i, j) {\n            var k;\n            if (((i && i.length))) {\n                k = g(i[0]);\n                if (k) {\n                    return k;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            if (j) {\n                var l = j.attachments;\n                if (((l && l.length))) {\n                    return g(l[0]);\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            return null;\n        }\n    };\n    e.exports = h;\n});\n__d(\"NotificationUpdates\", [\"Arbiter\",\"ChannelConstants\",\"JSLogger\",\"NotificationConstants\",\"NotificationTokens\",\"LiveTimer\",\"copyProperties\",\"createObjectFrom\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ChannelConstants\"), i = b(\"JSLogger\"), j = b(\"NotificationConstants\"), k = b(\"NotificationTokens\"), l = b(\"LiveTimer\"), m = b(\"copyProperties\"), n = b(\"createObjectFrom\"), o = {\n    }, p = {\n    }, q = {\n    }, r = {\n    }, s = [], t = 0, u = i.create(\"notification_updates\");\n    function v() {\n        if (t) {\n            return;\n        }\n    ;\n    ;\n        var z = o, aa = p, ba = q, ca = r;\n        o = {\n        };\n        p = {\n        };\n        q = {\n        };\n        r = {\n        };\n        x(\"notifications-updated\", z);\n        if (Object.keys(aa).length) {\n            x(\"seen-state-updated\", aa);\n        }\n    ;\n    ;\n        if (Object.keys(ba).length) {\n            x(\"read-state-updated\", ba);\n        }\n    ;\n    ;\n        if (Object.keys(ca).length) {\n            x(\"hidden-state-updated\", ca);\n        }\n    ;\n    ;\n        s.pop();\n    };\n;\n    function w() {\n        if (s.length) {\n            return s[((s.length - 1))];\n        }\n    ;\n    ;\n        return j.PayloadSourceType.UNKNOWN;\n    };\n;\n    function x(JSBNG__event, z) {\n        y.inform(JSBNG__event, {\n            updates: z,\n            source: w()\n        });\n    };\n;\n    g.subscribe(h.getArbiterType(\"notification_json\"), function(z, aa) {\n        var ba = JSBNG__Date.now(), ca = aa.obj.nodes;\n        if (ca) {\n            ca.forEach(function(da) {\n                da.receivedTime = ba;\n            });\n            u.debug(\"notifications_received\", ca);\n            y.handleUpdate(j.PayloadSourceType.LIVE_SEND, aa.obj);\n        }\n    ;\n    ;\n    });\n    g.subscribe(h.getArbiterType(\"notifications_seen\"), function(z, aa) {\n        var ba = k.tokenizeIDs(aa.obj.alert_ids);\n        y.handleUpdate(j.PayloadSourceType.LIVE_SEND, {\n            seenState: n(ba)\n        });\n    });\n    g.subscribe(h.getArbiterType(\"notifications_read\"), function(z, aa) {\n        var ba = k.tokenizeIDs(aa.obj.alert_ids);\n        y.handleUpdate(j.PayloadSourceType.LIVE_SEND, {\n            readState: n(ba)\n        });\n    });\n    var y = m(new g(), {\n        handleUpdate: function(z, aa) {\n            if (aa.servertime) {\n                l.restart(aa.servertime);\n            }\n        ;\n        ;\n            if (Object.keys(aa).length) {\n                this.synchronizeInforms(function() {\n                    s.push(z);\n                    var ba = m({\n                        payloadsource: w()\n                    }, aa);\n                    this.inform(\"update-notifications\", ba);\n                    this.inform(\"update-seen\", ba);\n                    this.inform(\"update-read\", ba);\n                    this.inform(\"update-hidden\", ba);\n                }.bind(this));\n            }\n        ;\n        ;\n        },\n        didUpdateNotifications: function(z) {\n            m(o, n(z));\n            v();\n        },\n        didUpdateSeenState: function(z) {\n            m(p, n(z));\n            v();\n        },\n        didUpdateReadState: function(z) {\n            m(q, n(z));\n            v();\n        },\n        didUpdateHiddenState: function(z) {\n            m(r, n(z));\n            v();\n        },\n        synchronizeInforms: function(z) {\n            t++;\n            try {\n                z();\n            } catch (aa) {\n                throw aa;\n            } finally {\n                t--;\n                v();\n            };\n        ;\n        }\n    });\n    e.exports = y;\n});\n__d(\"NotificationStore\", [\"KeyedCallbackManager\",\"NotificationConstants\",\"NotificationUpdates\",\"RangedCallbackManager\",\"MercuryServerDispatcher\",], function(a, b, c, d, e, f) {\n    var g = b(\"KeyedCallbackManager\"), h = b(\"NotificationConstants\"), i = b(\"NotificationUpdates\"), j = b(\"RangedCallbackManager\"), k = b(\"MercuryServerDispatcher\"), l = new g(), m = new j(function(p) {\n        var q = l.getResource(p);\n        return q.creation_time;\n    }, function(p, q) {\n        return ((q - p));\n    }), n = {\n    };\n    i.subscribe(\"update-notifications\", function(p, q) {\n        if (q.page_info) {\n            n = q.page_info;\n        }\n    ;\n    ;\n        if (((q.nodes === undefined))) {\n            return;\n        }\n    ;\n    ;\n        var r, s = [], t = {\n        }, u = ((q.nodes || [])), v;\n        u.forEach(function(w) {\n            r = w.alert_id;\n            v = l.getResource(r);\n            if (((!v || ((v.creation_time < w.creation_time))))) {\n                s.push(r);\n                t[r] = w;\n            }\n        ;\n        ;\n        });\n        l.addResourcesAndExecute(t);\n        m.addResources(s);\n        i.didUpdateNotifications(s);\n    });\n    k.registerEndpoints({\n        \"/ajax/notifications/client/get.php\": {\n            mode: k.IMMEDIATE,\n            handler: function(p) {\n                i.handleUpdate(h.PayloadSourceType.ENDPOINT, p);\n            }\n        }\n    });\n    var o = {\n        getNotifications: function(p, q) {\n            var r = m.executeOrEnqueue(0, p, function(w) {\n                var x = l.executeOrEnqueue(w, function(y) {\n                    q(y);\n                });\n            }), s = m.getUnavailableResources(r);\n            if (s.length) {\n                m.unsubscribe(r);\n                if (!o.canFetchMore()) {\n                    l.executeOrEnqueue(m.getAllResources(), q);\n                    return;\n                }\n            ;\n            ;\n                var t = ((n.end_cursor || null)), u;\n                if (t) {\n                    var v = Math.max.apply(null, s);\n                    u = ((((v - m.getCurrentArraySize())) + 1));\n                }\n                 else u = p;\n            ;\n            ;\n                k.trySend(\"/ajax/notifications/client/get.php\", {\n                    cursor: t,\n                    length: u\n                });\n            }\n        ;\n        ;\n        },\n        getAll: function(p) {\n            o.getNotifications(o.getCount(), p);\n        },\n        getCount: function() {\n            return m.getCurrentArraySize();\n        },\n        canFetchMore: function() {\n            if (n.hasOwnProperty(\"has_next_page\")) {\n                return n.has_next_page;\n            }\n        ;\n        ;\n            return true;\n        }\n    };\n    e.exports = o;\n});\n__d(\"NotificationUserActions\", [\"AsyncRequest\",\"AsyncSignal\",\"NotificationConstants\",\"NotificationStore\",\"NotificationTokens\",\"NotificationUpdates\",\"URI\",\"createObjectFrom\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = b(\"AsyncSignal\"), i = b(\"NotificationConstants\"), j = b(\"NotificationStore\"), k = b(\"NotificationTokens\"), l = b(\"NotificationUpdates\"), m = b(\"URI\"), n = b(\"createObjectFrom\"), o = b(\"emptyFunction\"), p = i.PayloadSourceType.USER_ACTION, q = \"mark_spam\", r = \"turn_off\", s = \"undo\", t = \"first_receipt_yes\", u = \"first_receipt_no\";\n    function v(aa) {\n        var ba = m(\"/ajax/notifications/mark_read.php\").getQualifiedURI().toString();\n        new h(ba, aa).send();\n    };\n;\n    function w(aa) {\n        var ba = {\n        };\n        aa.forEach(function(ca, da) {\n            ba[((((\"alert_ids[\" + da)) + \"]\"))] = ca;\n        });\n        return ba;\n    };\n;\n    function x(aa, ba, ca, da) {\n        var ea = k.untokenizeIDs([aa,])[0];\n        new g(\"/ajax/notifications/negative_req.php\").setData({\n            notification_id: ea,\n            client_rendered: true,\n            request_type: ba\n        }).setHandler(((ca || o))).setErrorHandler(((da || o))).send();\n    };\n;\n    function y(aa, ba, ca, da, ea) {\n        var fa = ((ea ? s : r));\n        j.getAll(function(ga) {\n            var ha = Object.keys(ga).filter(function(ia) {\n                var ja = ga[ia];\n                return !!((((ja.application && ja.application.id)) && ((ja.application.id == ba))));\n            });\n            x(aa, fa, function(ia) {\n                ca(ia);\n                l.handleUpdate(p, {\n                    hiddenState: n(ha, !ea)\n                });\n            }, da);\n        });\n    };\n;\n    var z = {\n        markNotificationsAsSeen: function(aa) {\n            l.handleUpdate(p, {\n                seenState: n(aa)\n            });\n            var ba = k.untokenizeIDs(aa), ca = w(ba);\n            ca.seen = true;\n            v(ca);\n            if (a.presenceNotifications) {\n                a.presenceNotifications.alertList.markSeen(ba);\n            }\n        ;\n        ;\n        },\n        markNotificationsAsRead: function(aa) {\n            l.handleUpdate(p, {\n                readState: n(aa)\n            });\n            var ba = k.untokenizeIDs(aa);\n            v(w(ba));\n            if (a.presenceNotifications) {\n                a.presenceNotifications.markRead(false, ba);\n            }\n        ;\n        ;\n        },\n        markNotificationAsHidden: function(aa, ba, ca) {\n            l.handleUpdate(p, {\n                hiddenState: n([aa,])\n            });\n            x(aa, r, ba, ca);\n        },\n        markNotificationAsVisible: function(aa, ba, ca) {\n            l.handleUpdate(p, {\n                hiddenState: n([aa,], false)\n            });\n            x(aa, s, ba, ca);\n        },\n        markNotificationAsSpam: function(aa, ba, ca) {\n            l.handleUpdate(p, {\n                hiddenState: n([aa,], false)\n            });\n            x(aa, q, ba, ca);\n        },\n        markAppAsHidden: function(aa, ba, ca, da) {\n            var ea = false;\n            y(aa, ba, ca, da, ea);\n        },\n        markAppAsVisible: function(aa, ba, ca, da) {\n            var ea = true;\n            y(aa, ba, ca, da, ea);\n        },\n        markFirstReceiptYes: function(aa, ba, ca) {\n            x(aa, t, ba, ca);\n        },\n        markFirstReceiptNo: function(aa, ba, ca) {\n            x(aa, u, ba, ca);\n        }\n    };\n    e.exports = z;\n});\n__d(\"NotificationBeeperItemContents.react\", [\"Animation\",\"CloseButton.react\",\"ImageBlock.react\",\"NotificationURI\",\"NotificationUserActions\",\"React\",\"TextWithEntities.react\",\"Timestamp.react\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Animation\"), h = b(\"CloseButton.react\"), i = b(\"ImageBlock.react\"), j = b(\"NotificationURI\"), k = b(\"NotificationUserActions\"), l = b(\"React\"), m = b(\"TextWithEntities.react\"), n = b(\"Timestamp.react\"), o = b(\"cx\");\n    function p(r, s) {\n        return l.DOM.span({\n            className: \"fwb\"\n        }, r);\n    };\n;\n    var q = l.createClass({\n        displayName: \"NotificationBeeperItemContents\",\n        _markAsRead: function() {\n            k.markNotificationsAsRead([this.props.beep.notificationID,]);\n            this.props.onHide();\n        },\n        _onClose: function() {\n            this._markAsRead();\n            this.props.onHide();\n        },\n        _doFlash: function() {\n            new g(this.refs.JSBNG__inner.getDOMNode()).from(\"opacity\", \"0\").to(\"opacity\", \"1\").duration(200).go();\n        },\n        componentDidUpdate: function(r) {\n            if (((r.beep.beepID !== this.props.beep.beepID))) {\n                this._doFlash();\n            }\n        ;\n        ;\n        },\n        render: function() {\n            var r = this.props.beep, s = r.icon.uri, t = ((r.link ? j.localize(r.link) : \"#\")), u = ((r.photo && j.snowliftable(t)));\n            return (l.DOM.div({\n                ref: \"JSBNG__inner\"\n            }, h({\n                className: \"_3soc\",\n                onClick: this._onClose,\n                size: \"medium\"\n            }), l.DOM.a({\n                href: t,\n                ajaxify: ((u ? t : null)),\n                onClick: this._markAsRead,\n                rel: ((u ? \"theater\" : null)),\n                className: \"_3soi\"\n            }, i({\n                className: \"_3soj\"\n            }, l.DOM.img({\n                src: r.actors[0].profile_picture.uri,\n                className: \"_3sok\"\n            }), l.DOM.div({\n                className: \"_3sol\"\n            }, m({\n                renderEmoticons: true,\n                renderEmoji: true,\n                interpolator: p,\n                ranges: r.text.ranges,\n                aggregatedranges: r.text.aggregated_ranges,\n                text: r.text.text\n            }), i({\n                className: \"_3som\"\n            }, l.DOM.img({\n                src: s\n            }), n({\n                time: r.timestamp.time,\n                text: r.timestamp.text,\n                verbose: r.timestamp.verbose\n            })))))));\n        }\n    });\n    e.exports = q;\n});\n__d(\"NotificationBeeperItem.react\", [\"Animation\",\"BrowserSupport\",\"NotificationBeeperItemContents.react\",\"React\",\"cx\",\"setTimeoutAcrossTransitions\",], function(a, b, c, d, e, f) {\n    var g = b(\"Animation\"), h = b(\"BrowserSupport\"), i = b(\"NotificationBeeperItemContents.react\"), j = b(\"React\"), k = b(\"cx\"), l = b(\"setTimeoutAcrossTransitions\"), m = j.createClass({\n        displayName: \"NotificationBeeperItem\",\n        getInitialState: function() {\n            return {\n                fadedIn: false,\n                hidden: false\n            };\n        },\n        componentDidMount: function() {\n            var n;\n            if (h.hasCSSAnimations()) {\n                n = this.setState.bind(this, {\n                    fadedIn: true\n                });\n            }\n             else n = function() {\n                new g(this.refs.item.getDOMNode()).from(\"JSBNG__top\", \"-30px\").from(\"opacity\", \"0\").to(\"JSBNG__top\", \"0px\").to(\"opacity\", \"1\").duration(200).ondone(this.setState.bind(this, {\n                    fadedIn: true\n                })).go();\n            }.bind(this);\n        ;\n        ;\n            l(n, 50);\n            this.props.onInserted(this.props.beep);\n        },\n        render: function() {\n            var n = this.props.beep, o = (((((\"_3sod\") + ((this.state.fadedIn ? ((\" \" + \"_3soe\")) : \"\")))) + ((this.state.hidden ? ((\" \" + \"_3sof\")) : \"\")))), p = ((n.beepRenderer || i));\n            return (j.DOM.li({\n                className: o,\n                ref: \"item\",\n                \"data-gt\": n.tracking\n            }, p({\n                beep: n,\n                onHide: this.setState.bind(this, {\n                    hidden: true\n                })\n            })));\n        }\n    });\n    e.exports = m;\n});\n__d(\"NotificationSound\", [\"Sound\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Sound\"), h = b(\"copyProperties\"), i = 5000;\n    g.init([\"audio/mpeg\",]);\n    function j(k) {\n        this._soundPath = k;\n        this._lastPlayed = 0;\n    };\n;\n    h(j.prototype, {\n        play: function(k) {\n            if (!this._soundPath) {\n                return;\n            }\n        ;\n        ;\n            var l = JSBNG__Date.now();\n            if (((((l - this._lastPlayed)) < i))) {\n                return;\n            }\n        ;\n        ;\n            this._lastPlayed = l;\n            g.play(this._soundPath, k);\n        }\n    });\n    e.exports = j;\n});\n__d(\"NotificationBeeper.react\", [\"Animation\",\"Arbiter\",\"ChannelConstants\",\"NotificationBeeperItem.react\",\"NotificationConstants\",\"NotificationImpressions\",\"NotificationPhotoThumbnail\",\"NotificationSound\",\"NotificationUpdates\",\"NotificationUserActions\",\"React\",\"Style\",\"cx\",\"isEmpty\",\"merge\",\"setTimeoutAcrossTransitions\",\"shield\",], function(a, b, c, d, e, f) {\n    var g = b(\"Animation\"), h = b(\"Arbiter\"), i = b(\"ChannelConstants\"), j = b(\"NotificationBeeperItem.react\"), k = b(\"NotificationConstants\"), l = b(\"NotificationImpressions\"), m = b(\"NotificationPhotoThumbnail\"), n = b(\"NotificationSound\"), o = b(\"NotificationUpdates\"), p = b(\"NotificationUserActions\"), q = b(\"React\"), r = b(\"Style\"), s = b(\"cx\"), t = b(\"isEmpty\"), u = b(\"merge\"), v = b(\"setTimeoutAcrossTransitions\"), w = b(\"shield\"), x = 5000, y = 2000, z = \"beeper\", aa = k.PayloadSourceType.LIVE_SEND, ba = k.PayloadSourceType.OTHER_APPLICATION, ca = q.createClass({\n        displayName: \"NotificationBeeper\",\n        getInitialState: function() {\n            return {\n                soundEnabled: this.props.soundEnabled,\n                hovering: false,\n                fading: false,\n                paused: false,\n                pendingBeeps: {\n                },\n                renderedBeeps: {\n                }\n            };\n        },\n        componentWillMount: function() {\n            var ea = i.getArbiterType(\"notif_sound_pref_changed\"), fa = \"update-notifications\";\n            this.subscriptions = [o.subscribe(fa, function(ga, ha) {\n                if (((((ha.payloadsource === aa)) || ((ha.payloadsource === ba))))) {\n                    var ia = ha.nodes;\n                    if (((ia && ia.length))) {\n                        this._handleBeepChanges(da(ia));\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n            }.bind(this)),h.subscribe(ea, function(ga, ha) {\n                this.setState({\n                    soundEnabled: ha.obj.enabled\n                });\n            }.bind(this)),];\n            h.inform(\"NotificationBeeper/mounted\", null, h.BEHAVIOR_PERSISTENT);\n        },\n        componentWillUnmount: function() {\n            this.subscriptions.forEach(function(ea) {\n                ea.unsubscribe();\n            });\n            this.subscriptions = null;\n        },\n        _onMouseEnter: function() {\n            if (this.state.paused) {\n                return;\n            }\n        ;\n        ;\n            ((this._hideWait && JSBNG__clearTimeout(this._hideWait)));\n            if (this.state.fading) {\n                this._animation.JSBNG__stop();\n                this._animation = null;\n                r.set(this.refs.container.getDOMNode(), \"opacity\", \"0.96\");\n            }\n        ;\n        ;\n            var ea = Object.keys(this.state.renderedBeeps);\n            if (this.props.unseenVsUnread) {\n                p.markNotificationsAsSeen(ea);\n            }\n             else p.markNotificationsAsRead(ea);\n        ;\n        ;\n            this.setState({\n                hovering: true,\n                fading: false,\n                pendingBeeps: {\n                },\n                renderedBeeps: u(this.state.renderedBeeps, this.state.pendingBeeps)\n            });\n        },\n        _onMouseLeave: function() {\n            if (this.state.paused) {\n                return;\n            }\n        ;\n        ;\n            this._waitToHide(y);\n            this.setState({\n                hovering: false\n            });\n        },\n        _onInsertedItem: function(ea) {\n            if (!this.state.hovering) {\n                this._waitToHide();\n            }\n        ;\n        ;\n            if (((this.state.soundEnabled && ea.sound))) {\n                if (!this._notifSound) {\n                    this._notifSound = new n(this.props.soundPath);\n                }\n            ;\n            ;\n                this._notifSound.play(ea.beepID);\n            }\n        ;\n        ;\n            if (this.props.shouldLogImpressions) {\n                l.log([ea.notificationID,], z);\n            }\n        ;\n        ;\n        },\n        _waitToHide: function(ea) {\n            ((this._hideWait && JSBNG__clearTimeout(this._hideWait)));\n            this._hideWait = v(w(this._hide, this), ((ea || x)));\n        },\n        _hide: function() {\n            ((this._animation && this._animation.JSBNG__stop()));\n            this._animation = new g(this.refs.container.getDOMNode()).from(\"opacity\", \"0.96\").to(\"opacity\", \"0\").duration(1500).ondone(this._finishHide).go();\n            this.setState({\n                fading: true\n            });\n        },\n        _finishHide: function() {\n            var ea = this.state.pendingBeeps;\n            this.setState({\n                fading: false,\n                pendingBeeps: {\n                },\n                renderedBeeps: {\n                }\n            });\n            v(this.setState.bind(this, {\n                renderedBeeps: ea\n            }));\n            r.set(this.refs.container.getDOMNode(), \"opacity\", \"0.96\");\n        },\n        _handleBeepChanges: function(ea) {\n            var fa = ((this.state.fading ? this.state.pendingBeeps : this.state.renderedBeeps));\n            Object.keys(ea).reverse().forEach(function(ga) {\n                var ha = ea[ga], ia = ha.beepID, ja = ((this.state.renderedBeeps[ga] || {\n                }));\n                if (((ja.beepID != ia))) {\n                    delete fa[ga];\n                    fa[ga] = ha;\n                }\n            ;\n            ;\n            }.bind(this));\n            if (!this.state.paused) {\n                this._waitToHide();\n            }\n        ;\n        ;\n            this.forceUpdate();\n        },\n        _togglePause: function() {\n            if (!this.state.paused) {\n                ((this._animation && this._animation.JSBNG__stop()));\n                ((this._hideWait && JSBNG__clearTimeout(this._hideWait)));\n            }\n             else this._waitToHide();\n        ;\n        ;\n            this.setState({\n                paused: !this.state.paused\n            });\n        },\n        render: function() {\n            var ea = this.state.renderedBeeps, fa = {\n            };\n            Object.keys(ea).reverse().forEach(function(ja) {\n                var ka = ea[ja];\n                fa[ja] = j({\n                    beep: ka,\n                    onInserted: this._onInsertedItem\n                });\n            }, this);\n            var ga = !t(fa), ha = null;\n            if (((ga && this.props.canPause))) {\n                ha = q.DOM.li({\n                    className: \"_a_g\",\n                    onClick: this._togglePause\n                }, ((this.state.paused ? \"Continue\" : \"Pause [fb]\")));\n            }\n        ;\n        ;\n            var ia = ((((!ga ? \"hidden_elem\" : \"\")) + ((\" \" + \"_50d1\"))));\n            return (q.DOM.ul({\n                ref: \"container\",\n                className: ia,\n                \"data-gt\": this.props.tracking,\n                onMouseEnter: this._onMouseEnter,\n                onMouseLeave: this._onMouseLeave\n            }, fa, ha));\n        }\n    });\n    function da(ea) {\n        var fa = {\n        };\n        ea.forEach(function(ga) {\n            var ha = ga.alert_id, ia = ((((ha + \"-\")) + ga.receivedTime)), ja = m.getThumbnail(ga.attachments, ga.attached_story);\n            fa[ha] = {\n                notificationID: ha,\n                beepID: ia,\n                beepRenderer: ga.beepRenderer,\n                actors: ga.actors,\n                icon: ga.icon,\n                link: ga.url,\n                photo: ja,\n                text: ((ga.unaggregatedTitle || ga.title)),\n                timestamp: ga.timestamp,\n                receivedTime: ga.receivedTime,\n                sound: !!ga.sound,\n                tracking: ga.tracking\n            };\n        });\n        return fa;\n    };\n;\n    e.exports = ca;\n});\n__d(\"FbdEventLog\", [\"URI\",\"AsyncSignal\",], function(a, b, c, d, e, f) {\n    var g = b(\"URI\"), h = b(\"AsyncSignal\"), i = {\n        log: function(j, k, l, m) {\n            if (!j) {\n                return;\n            }\n        ;\n        ;\n            var n = g(\"/desktop/eventlog.php\"), o = new h(n.toString(), {\n                JSBNG__event: j,\n                category: ((k || \"unknown\")),\n                payload: ((l || \"\"))\n            });\n            o.setHandler(m).send();\n        }\n    };\n    e.exports = i;\n});\n__d(\"DownloadDialog\", [\"JSBNG__Event\",\"Arbiter\",\"Class\",\"DataStore\",\"ModalMask\",\"Overlay\",\"Parent\",\"Style\",\"copyProperties\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"Arbiter\"), i = b(\"Class\"), j = b(\"DataStore\"), k = b(\"ModalMask\"), l = b(\"Overlay\"), m = b(\"Parent\"), n = b(\"Style\"), o = b(\"copyProperties\"), p = b(\"emptyFunction\");\n    function q() {\n        this.parent.construct(this);\n        return this;\n    };\n;\n    i.extend(q, l);\n    o(q, {\n        POSITIONS: {\n            BOTTOM_LEFT: \"bottom_left\",\n            TOP_LEFT: \"top_left\",\n            IE9_BOTTOM: \"ie9_bottom\"\n        },\n        activeDialogs: {\n        },\n        dismissAll: function() {\n            {\n                var fin258keys = ((window.top.JSBNG_Replay.forInKeys)((this.POSITIONS))), fin258i = (0);\n                var r;\n                for (; (fin258i < fin258keys.length); (fin258i++)) {\n                    ((r) = (fin258keys[fin258i]));\n                    {\n                        this.hideDialog(this.POSITIONS[r]);\n                    ;\n                    };\n                };\n            };\n        ;\n        },\n        hideDialog: function(r) {\n            var s = this.activeDialogs[r];\n            ((s && s.hide()));\n            this.activeDialogs[r] = null;\n        }\n    });\n    o(q.prototype, {\n        _cancelHandler: p,\n        _closeHandler: p,\n        _width: null,\n        position: q.POSITIONS.BOTTOM_LEFT,\n        init: function(r, s) {\n            this.parent.init(r);\n            this.position = s;\n            var t = ((j.get(this._root, \"modal\") === \"true\"));\n            q.hideDialog(s);\n            q.activeDialogs[s] = this;\n            g.listen(this._root, \"click\", function(JSBNG__event) {\n                if (m.byClass(JSBNG__event.getTarget(), \"closeButton\")) {\n                    if (((this._cancelHandler() !== false))) {\n                        q.hideDialog(this.position);\n                    }\n                ;\n                }\n            ;\n            ;\n            }.bind(this));\n            this.subscribe(\"show\", function() {\n                if (t) {\n                    k.show();\n                }\n            ;\n            ;\n                h.inform(\"layer_shown\", {\n                    type: \"DownloadDialog\"\n                });\n            }.bind(this));\n            this.subscribe(\"hide\", function() {\n                if (t) {\n                    k.hide();\n                }\n            ;\n            ;\n                h.inform(\"layer_hidden\", {\n                    type: \"DownloadDialog\"\n                });\n                this._closeHandler();\n            }.bind(this));\n        },\n        setWidth: function(r) {\n            this._width = Math.floor(r);\n            return this;\n        },\n        updatePosition: function() {\n            if (this._width) {\n                n.set(this._overlay, \"width\", ((this._width + \"px\")));\n            }\n        ;\n        ;\n            return true;\n        },\n        setCancelHandler: function(r) {\n            this._cancelHandler = ((r || p));\n            return this;\n        },\n        setCloseHandler: function(r) {\n            this._closeHandler = ((r || p));\n            return this;\n        }\n    });\n    e.exports = q;\n    a.DownloadDialog = q;\n});\n__d(\"FbdConversionTracking\", [\"AsyncRequest\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = b(\"emptyFunction\"), i = {\n        logClick: function(j, k) {\n            if (!k) {\n                k = \"desktop\";\n            }\n        ;\n        ;\n            new g().setURI(\"/ajax/desktop/log_clicks.php\").setData({\n                click_source: j,\n                promo: k\n            }).setAllowCrossPageTransition(true).setErrorHandler(h).send();\n        },\n        logConversion: function(j, k) {\n            if (!k) {\n                k = \"desktop\";\n            }\n        ;\n        ;\n            new g().setURI(\"/ajax/desktop/log_conversions.php\").setData({\n                conversion_action: j,\n                promo: k\n            }).setAllowCrossPageTransition(true).setErrorHandler(h).send();\n        }\n    };\n    e.exports = i;\n});\n__d(\"MegaphoneHelper\", [\"JSXDOM\",\"Animation\",\"Arbiter\",\"AsyncRequest\",\"DOM\",\"DOMDimensions\",\"Dialog\",\"LitestandMessages\",\"Parent\",\"Run\",\"Style\",\"csx\",\"cx\",\"ge\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSXDOM\"), h = b(\"Animation\"), i = b(\"Arbiter\"), j = b(\"AsyncRequest\"), k = b(\"DOM\"), l = b(\"DOMDimensions\"), m = b(\"Dialog\"), n = b(\"LitestandMessages\"), o = b(\"Parent\"), p = b(\"Run\"), q = b(\"Style\"), r = b(\"csx\"), s = b(\"cx\"), t = b(\"ge\");\n    function u() {\n        var w = k.scry(JSBNG__document.body, \".megaphone_story_wrapper\")[0];\n        ((w && k.remove(w)));\n        v.removeLitestandHomeWash();\n    };\n;\n    var v = {\n        hideStory: function(w, x, y, z, aa) {\n            var ba = {\n                mp_id: w,\n                JSBNG__location: x,\n                context: z\n            };\n            new j().setURI(\"/ajax/megaphone/megaphone_hide.php\").setMethod(\"POST\").setData(ba).setHandler(function(da) {\n                ((aa && aa(da)));\n            }).send();\n            var ca = t(y);\n            if (ca) {\n                new h(ca).to(\"height\", 0).duration(500).hide().go();\n            }\n        ;\n        ;\n        },\n        createModalStory: function(w, x, y, z) {\n            var aa;\n            if (((!w.buttons || !w.buttons.length))) {\n                w.buttons = m.CLOSE;\n                aa = v.hideStory(x, y, z, null);\n            }\n        ;\n        ;\n            var ba = new m(w);\n            if (aa) {\n                ba.setHandler(aa);\n            }\n        ;\n        ;\n            ba.show();\n        },\n        buttonOnClick: function(w, x, y, z, aa, ba) {\n            var ca = function() {\n                if (aa) {\n                    new j().setURI(z).send();\n                }\n                 else JSBNG__document.JSBNG__location.href = z;\n            ;\n            ;\n            };\n            if (ba) {\n                v.hideStory(w, x, \"\", y, ca);\n            }\n             else ca();\n        ;\n        ;\n        },\n        renderFullWidth: function(w, x, y) {\n            var z = t(w);\n            k.prependContent(z, x);\n            if (y) {\n                var aa = l.getElementDimensions(x), ba = g.div({\n                    className: \"_5847\"\n                });\n                q.set(ba, \"height\", ((aa.height + \"px\")));\n                var ca = o.byClass(z, \"_4_37\");\n                k.prependContent(ca, ba);\n                p.onLeave(u);\n                i.subscribeOnce(n.FILTER_SWITCH_BEGIN, u);\n            }\n        ;\n        ;\n            i.inform(\"Megaphone/show\", w, i.BEHAVIOR_PERSISTENT);\n        },\n        removeLitestandHomeWash: function() {\n            var w = k.JSBNG__find(JSBNG__document.body, \"._5847\");\n            k.remove(w);\n        }\n    };\n    e.exports = v;\n});\n__d(\"FbdInstall\", [\"$\",\"AsyncRequest\",\"CSS\",\"DOM\",\"DownloadDialog\",\"FbdConversionTracking\",\"FbdEventLog\",\"FBDesktopDetect\",\"FBDesktopPlugin\",\"MegaphoneHelper\",], function(a, b, c, d, e, f) {\n    var g = b(\"$\"), h = b(\"AsyncRequest\"), i = b(\"CSS\"), j = b(\"DOM\"), k = b(\"DownloadDialog\"), l = b(\"FbdConversionTracking\"), m = b(\"FbdEventLog\"), n = b(\"FBDesktopDetect\"), o = b(\"FBDesktopPlugin\"), p = b(\"MegaphoneHelper\"), q = 1000, r = ((300 * q)), s = {\n        cancelSetup: function() {\n            var t = JSON.stringify({\n                ref: this.ref\n            });\n            m.log(\"download_canceled\", \"setup\", t);\n            l.logConversion(\"download_canceled\");\n        },\n        hideMegaphone: function() {\n            if (((this.megaphoneId && this.megaphoneLoc))) {\n                p.hideStory(this.megaphoneId, this.megaphoneLoc, this.elementId, \"\", null);\n            }\n        ;\n        ;\n        },\n        init: function(t, u) {\n            this.downloadUrl = t;\n            this.ref = ((u || \"unknown\"));\n        },\n        initInstallWait: function(t, u, v) {\n            this.megaphoneId = t;\n            this.megaphoneLoc = u;\n            this.elementId = v;\n            this._waitForInstall(r);\n        },\n        promptDownload: function(t) {\n            t = ((t || this.downloadUrl));\n            if (t) {\n                var u = JSON.stringify({\n                    ref: this.ref\n                });\n                m.log(\"download_prompted\", \"setup\", u);\n                l.logConversion(\"download_prompted\");\n                var v = j.create(\"div\", {\n                    src: t,\n                    className: \"hidden_elem\"\n                });\n                j.appendContent(JSBNG__document.body, v);\n            }\n        ;\n        ;\n        },\n        _responseHandler: function(t) {\n            if (t.payload) {\n                this._authToken = t.payload.access_token;\n                this._userId = t.payload.id;\n            }\n        ;\n        ;\n            if (((this._authToken && this._userId))) {\n                this._waitForRunningStart = JSBNG__Date.now();\n                JSBNG__setTimeout(this._waitForRunning.bind(this), q);\n            }\n        ;\n        ;\n        },\n        setupPlugin: function() {\n            new h(\"/ajax/desktop/download\").send();\n            this.promptDownload();\n        },\n        updateSidebarLinkVisibility: function() {\n            if (!n.isPluginInstalled()) {\n                i.show(g(\"sidebar-messenger-install-link\"));\n                i.show(g(\"sidebar-messenger-install-separator\"));\n            }\n        ;\n        ;\n        },\n        _waitForInstall: function(t) {\n            var u = JSON.stringify({\n                ref: this.ref\n            });\n            if (n.isPluginInstalled()) {\n                m.log(\"install_success\", \"setup\", u);\n                l.logConversion(\"install_success\");\n                o.recheck();\n                new h(\"/desktop/fbdesktop2/transfer.php\").setMethod(\"POST\").setHandler(this._responseHandler.bind(this)).send();\n                k.dismissAll();\n                this.hideMegaphone();\n                return;\n            }\n        ;\n        ;\n            if (((t <= 0))) {\n                m.log(\"install_timeout\", \"setup\", u);\n                l.logConversion(\"install_timeout\");\n                k.dismissAll();\n            }\n             else JSBNG__setTimeout(this._waitForInstall.bind(this, ((t - q))), q);\n        ;\n        ;\n        },\n        _waitForRunning: function() {\n            var t = ((JSBNG__Date.now() - this._waitForRunningStart));\n            if (o.isAppRunning()) {\n                o.transferAuthToken(this._authToken, this._userId);\n            }\n             else if (((t < r))) {\n                JSBNG__setTimeout(this._waitForRunning.bind(this), q);\n            }\n            \n        ;\n        ;\n        }\n    };\n    e.exports = s;\n});\n__d(\"legacy:fbdesktop2-install-js\", [\"FbdInstall\",], function(a, b, c, d) {\n    a.FbdInstall = b(\"FbdInstall\");\n}, 3);\n__d(\"legacy:fbdesktop-conversion-tracking\", [\"FbdConversionTracking\",], function(a, b, c, d) {\n    a.FbdConversionTracking = b(\"FbdConversionTracking\");\n}, 3);\n__d(\"SidebarTicker\", [\"Arbiter\",\"ChatSidebar\",\"CSS\",\"DOM\",\"Run\",\"TickerController\",\"$\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ChatSidebar\"), i = b(\"CSS\"), j = b(\"DOM\"), k = b(\"Run\"), l = b(\"TickerController\"), m = b(\"$\"), n = b(\"copyProperties\");\n    function o() {\n        this._ticker = m(\"pagelet_ticker\");\n        this._initSubscriptions();\n        if (i.hasClass(JSBNG__document.documentElement, \"sidebarMode\")) {\n            this._onSidebarShow();\n        }\n    ;\n    ;\n    };\n;\n    o.hide = function() {\n        k.onAfterLoad(function() {\n            j.remove(m(\"pagelet_ticker\"));\n            j.remove(j.JSBNG__find(JSBNG__document.body, \"div.fbSidebarGripper\"));\n            h.resize();\n        });\n    };\n    n(o.prototype, {\n        _initSubscriptions: function() {\n            this._subscriptions = [g.subscribe(\"sidebar/show\", this._onSidebarShow.bind(this)),];\n        },\n        _onSidebarShow: function() {\n            l.show(this._ticker);\n        }\n    });\n    e.exports = o;\n});\n__d(\"SidebarTickerResizer\", [\"Arbiter\",\"AsyncRequest\",\"ChatSidebar\",\"SimpleDrag\",\"$\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"AsyncRequest\"), i = b(\"ChatSidebar\"), j = b(\"SimpleDrag\"), k = b(\"$\"), l = 1e-7;\n    function m(n) {\n        var o = k(\"pagelet_ticker\"), p = o.parentNode, q = this._saveResizedState.bind(this), r, s, t, u = function(x, JSBNG__event) {\n            r = JSBNG__event.clientY;\n            s = o.offsetHeight;\n            t = p.offsetHeight;\n        }, v = function(x, JSBNG__event) {\n            var y = ((s + ((JSBNG__event.clientY - r)))), z = ((100 - ((((((t - y)) / t)) * 100))));\n            z = Math.max(l, Math.min(90, z));\n            o.style.height = ((z + \"%\"));\n            if (((x == \"end\"))) {\n                q(z);\n                g.inform(\"Ticker/resized\");\n            }\n        ;\n        ;\n            i.resize();\n        }, w = new j(n);\n        w.subscribe(\"start\", u);\n        w.subscribe([\"update\",\"end\",], v);\n    };\n;\n    m.prototype._saveResizedState = function(n) {\n        new h(\"/ajax/feed/ticker/resize\").setData({\n            height: ((\"\" + n))\n        }).setMethod(\"POST\").send();\n    };\n    e.exports = m;\n});\n__d(\"legacy:megaphone\", [\"MegaphoneHelper\",], function(a, b, c, d) {\n    a.MegaphoneHelper = b(\"MegaphoneHelper\");\n}, 3);\n__d(\"NotificationXOut\", [\"Arbiter\",\"JSBNG__Event\",\"userAction\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"JSBNG__Event\"), i = b(\"userAction\");\n    function j(p, q, r) {\n        g.inform(\"notif/negativeCancel\", {\n            id: p\n        });\n        k(q, r);\n        h.$E(r).kill();\n    };\n;\n    function k(p, q) {\n        i(\"click\", null, q, null, {\n            gt: p\n        });\n    };\n;\n    function l(p, q) {\n        k(p, q);\n        h.$E(q).prevent();\n    };\n;\n    function m(p, q) {\n        h.listen(p, \"click\", k.curry(q));\n    };\n;\n    function n(p, q, r) {\n        h.listen(p, \"click\", j.curry(q, r));\n    };\n;\n    function o(p, q) {\n        h.listen(p, \"click\", l.curry(q));\n    };\n;\n    e.exports = {\n        setupConfirmListener: m,\n        setupCancelListener: n,\n        setupNoListener: o\n    };\n});\n__d(\"LiveMessageReceiver\", [\"Arbiter\",\"ChannelConstants\",\"copyProperties\",\"emptyFunction\",\"shield\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ChannelConstants\"), i = b(\"copyProperties\"), j = b(\"emptyFunction\"), k = b(\"shield\");\n    function l(m) {\n        this.eventName = m;\n        this.subs = null;\n        this.handler = j;\n        this.shutdownHandler = null;\n        this.registered = false;\n        this.appId = 1;\n    };\n;\n    i(l, {\n        getAppMessageType: function(m, n) {\n            return ((((((\"live_message/\" + m)) + \":\")) + n));\n        },\n        route: function(m) {\n            var n = function(o) {\n                var p = l.getAppMessageType(m.app_id, m.event_name);\n                g.inform(p, o, g.BEHAVIOR_PERSISTENT);\n            };\n            n(m.response);\n        }\n    });\n    i(l.prototype, {\n        setAppId: function(m) {\n            this.appId = m;\n            return this;\n        },\n        setHandler: function(m) {\n            this.handler = m;\n            this._dirty();\n            return this;\n        },\n        setRestartHandler: j,\n        setShutdownHandler: function(m) {\n            this.shutdownHandler = k(m);\n            this._dirty();\n            return this;\n        },\n        _dirty: function() {\n            if (this.registered) {\n                this.unregister();\n                this.register();\n            }\n        ;\n        ;\n        },\n        register: function() {\n            var m = function(o, p) {\n                return this.handler(p);\n            }.bind(this), n = l.getAppMessageType(this.appId, this.eventName);\n            this.subs = {\n            };\n            this.subs.main = g.subscribe(n, m);\n            if (this.shutdownHandler) {\n                this.subs.shut = g.subscribe(h.ON_SHUTDOWN, this.shutdownHandler);\n            }\n        ;\n        ;\n            this.registered = true;\n            return this;\n        },\n        unregister: function() {\n            if (!this.subs) {\n                return this;\n            }\n        ;\n        ;\n            {\n                var fin259keys = ((window.top.JSBNG_Replay.forInKeys)((this.subs))), fin259i = (0);\n                var m;\n                for (; (fin259i < fin259keys.length); (fin259i++)) {\n                    ((m) = (fin259keys[fin259i]));\n                    {\n                        if (this.subs[m]) {\n                            this.subs[m].unsubscribe();\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            this.subs = null;\n            this.registered = false;\n            return this;\n        }\n    });\n    e.exports = l;\n});\n__d(\"initLiveMessageReceiver\", [\"Arbiter\",\"ChannelConstants\",\"LiveMessageReceiver\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ChannelConstants\"), i = b(\"LiveMessageReceiver\");\n    g.subscribe(h.getArbiterType(\"app_msg\"), function(j, k) {\n        i.route(k.obj);\n    });\n});\n__d(\"Slideshow\", [\"ArbiterMixin\",\"CSS\",\"DOM\",\"JSBNG__Event\",\"Locale\",\"Parent\",\"copyProperties\",\"csx\",\"cx\",\"shield\",], function(a, b, c, d, e, f) {\n    var g = b(\"ArbiterMixin\"), h = b(\"CSS\"), i = b(\"DOM\"), j = b(\"JSBNG__Event\"), k = b(\"Locale\"), l = b(\"Parent\"), m = b(\"copyProperties\"), n = b(\"csx\"), o = b(\"cx\"), p = b(\"shield\");\n    function q(r, s) {\n        this._root = r;\n        this._config = s;\n        this._currentIndex = 0;\n        this._animating = false;\n        this._autoplayTimer = null;\n        this._init();\n    };\n;\n    m(q.prototype, g, {\n        getIndex: function() {\n            return this._currentIndex;\n        },\n        getNumItems: function() {\n            return this._items.length;\n        },\n        page: function(r) {\n            if (((typeof r === \"undefined\"))) {\n                r = \"next\";\n            }\n        ;\n        ;\n            if (((r === \"next\"))) {\n                if (((this._config.wrap || ((this.getIndex() < ((this.getNumItems() - 1))))))) {\n                    this._animateTo(((this._currentIndex + 1)));\n                }\n            ;\n            ;\n            }\n             else if (((r === \"prev\"))) {\n                if (((this._config.wrap || ((this.getIndex() > 0))))) {\n                    this._animateTo(((this._currentIndex - 1)));\n                }\n            ;\n            }\n            \n        ;\n        ;\n        },\n        pageTo: function(r) {\n            this._animateTo(r, p(this._setCurrent, this, r));\n        },\n        insert: function(r, s) {\n            if (((r > this._currentIndex))) {\n                i.insertAfter(this._items[((r - 1))], s);\n            }\n             else {\n                i.insertBefore(this._items[r], s);\n                this._currentIndex++;\n            }\n        ;\n        ;\n            this._items.splice(r, 0, s);\n            this._updateArrowState(this._currentIndex);\n            this.inform(\"items_updated\");\n        },\n        push: function(r) {\n            this.insert(this._items.length, r);\n        },\n        _init: function() {\n            this._container = i.JSBNG__find(this._root, \"ul._2xq\");\n            this._items = i.scry(this._container, \"li._2xr\");\n            if (this._config.arrows) {\n                j.listen(this._root, \"click\", this._clickListener.bind(this));\n                var r = i.JSBNG__find(this._root, \"a._2xw\"), s = i.JSBNG__find(this._root, \"a._2xx\");\n                this._arrowLeft = ((k.isRTL() ? r : s));\n                this._arrowRight = ((k.isRTL() ? s : r));\n            }\n        ;\n        ;\n            if (this._config.autoplay) {\n                j.listen(this._root, \"mouseenter\", this.stopAutoplay.bind(this));\n                j.listen(this._root, \"mouseleave\", this.resetAutoplay.bind(this));\n                this.resetAutoplay();\n            }\n        ;\n        ;\n            this.subscribe([\"page_start\",\"page_end\",], function(t, u) {\n                h.conditionClass(this._root, \"_2xm\", ((t === \"page_start\")));\n            }.bind(this));\n        },\n        _clickListener: function(JSBNG__event) {\n            var r = JSBNG__event.getTarget(), s = l.byTag(r, \"a\");\n            if (((s && !h.hasClass(s, \"_2xo\")))) {\n                if (h.hasClass(s, \"_2xw\")) {\n                    this.page(\"next\");\n                }\n                 else if (h.hasClass(s, \"_2xx\")) {\n                    this.page(\"prev\");\n                }\n                \n            ;\n            }\n        ;\n        ;\n        },\n        _updateArrowState: function(r) {\n            if (!this._config.arrows) {\n                return;\n            }\n        ;\n        ;\n            h.conditionClass(this._arrowRight, \"_2xo\", ((this._items.length === 1)));\n            h.conditionClass(this._arrowLeft, \"_2xo\", ((this._items.length === 1)));\n        },\n        _animateTo: function(r) {\n        \n        },\n        _setCurrent: function(r) {\n            h.removeClass(this._items[this._currentIndex], \"_2xn\");\n            h.addClass(this._items[r], \"_2xn\");\n            h.removeClass(this._root, \"_2xm\");\n            this._currentIndex = r;\n            this._animating = false;\n            this.inform(\"page_end\", r);\n        },\n        resetAutoplay: function() {\n            if (this._config.autoplay) {\n                JSBNG__clearTimeout(this._autoplayTimer);\n                this._autoplayTimer = JSBNG__setTimeout(this._autoplay.bind(this), this._config.autoplayTimeout);\n            }\n        ;\n        ;\n        },\n        stopAutoplay: function() {\n            JSBNG__clearTimeout(this._autoplayTimer);\n            this._autoplayTimer = null;\n        },\n        _autoplay: function() {\n            this.resetAutoplay();\n            if (((this._items.length > 1))) {\n                this.page();\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = q;\n});\n__d(\"Carousel\", [\"Animation\",\"Class\",\"CSS\",\"Ease\",\"Locale\",\"Slideshow\",\"Style\",\"copyProperties\",\"cx\",\"shield\",], function(a, b, c, d, e, f) {\n    var g = b(\"Animation\"), h = b(\"Class\"), i = b(\"CSS\"), j = b(\"Ease\"), k = b(\"Locale\"), l = b(\"Slideshow\"), m = b(\"Style\"), n = b(\"copyProperties\"), o = b(\"cx\"), p = b(\"shield\"), q = ((k.isRTL() ? \"right\" : \"left\")), r = j.sineInOut;\n    function s(t, u) {\n        this.parent.construct(this, t, u);\n        this.subscribe(\"items_updated\", this._updateItemState.bind(this));\n    };\n;\n    h.extend(s, l);\n    n(s.prototype, {\n        _updateItemState: function(t, u) {\n            this._setContainerPos(t);\n            m.set(this._container, \"width\", ((((this._items.length * this._config.width)) + \"px\")));\n        },\n        _updateArrowState: function(t) {\n            if (!this._config.arrows) {\n                return;\n            }\n        ;\n        ;\n            var u = this._config.wrap, v = this._items.length, w = Math.floor(((v / this._config.photosperframe)));\n            i.conditionClass(this._arrowRight, \"_2xo\", ((((w === 1)) || ((!u && ((t === ((w - 1)))))))));\n            i.conditionClass(this._arrowLeft, \"_2xo\", ((((w === 1)) || ((!u && ((t === 0)))))));\n        },\n        _animate: function(t, u) {\n            this._animating = true;\n            this.inform(\"page_start\", t);\n            new g(this._container).to(q, ((-t * this._config.width))).duration(this._config.animationDuration).ease(r).ondone(u).go();\n        },\n        _setContainerPos: function(t) {\n            m.set(this._container, q, ((((-t * this._config.width)) + \"px\")));\n        },\n        _animateTo: function(t) {\n            if (this._animating) {\n                return;\n            }\n        ;\n        ;\n            var u = this._items.length;\n            if (((((((0 <= t)) && ((t < u)))) || !this._config.wrap))) {\n                var v = ((((t + u)) % u));\n                this._updateArrowState(v);\n                return this._animate(v, p(this._setCurrent, this, v));\n            }\n        ;\n        ;\n            var w = ((t % u)), x = ((w ? ((u - 1)) : 0)), y = this._items[((u - 1))];\n            m.set(y, \"position\", \"absolute\");\n            m.set(y, q, ((-this._config.width + \"px\")));\n            if (((x === 0))) {\n                this._setContainerPos(-1);\n            }\n        ;\n        ;\n            this._animate(w, function() {\n                m.set(y, \"position\", \"static\");\n                m.set(y, q, \"auto\");\n                this._setContainerPos(x);\n                this._setCurrent(x);\n            }.bind(this));\n        }\n    });\n    e.exports = s;\n});");
// 13447
JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_190[0](o3,false,"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yl/r/OUIW4Mbs_w6.js",o5);
// undefined
o3 = null;
// undefined
o5 = null;
// 13459
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o7,"if (self.CavalryLogger) {\n    CavalryLogger.start_js([\"LpC/l\",]);\n}\n;\n__d(\"DOMWrapper\", [], function(a, b, c, d, e, f) {\n    var g, h, i = {\n        setRoot: function(j) {\n            g = j;\n        },\n        getRoot: function() {\n            return (g || document.body);\n        },\n        setWindow: function(j) {\n            h = j;\n        },\n        getWindow: function() {\n            return (h || self);\n        }\n    };\n    e.exports = i;\n});\n__d(\"Flash\", [\"DOMWrapper\",\"QueryString\",\"UserAgent\",\"copyProperties\",\"guid\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOMWrapper\"), h = b(\"QueryString\"), i = b(\"UserAgent\"), j = b(\"copyProperties\"), k = b(\"guid\"), l = {\n    }, m, n = g.getWindow().document;\n    function o(t) {\n        var u = n.getElementById(t);\n        if (u) {\n            u.parentNode.removeChild(u);\n        };\n        delete l[t];\n    };\n    function p() {\n        for (var t in l) {\n            if (l.hasOwnProperty(t)) {\n                o(t);\n            };\n        };\n    };\n    function q(t) {\n        return t.replace(/\\d+/g, function(u) {\n            return (\"000\".substring(u.length) + u);\n        });\n    };\n    function r(t) {\n        if (!m) {\n            if ((i.ie() >= 9)) {\n                window.attachEvent(\"onunload\", p);\n            };\n            m = true;\n        }\n    ;\n        l[t] = t;\n    };\n    var s = {\n        embed: function(t, u, v, w) {\n            var x = k();\n            t = encodeURI(t);\n            v = j({\n                allowscriptaccess: \"always\",\n                flashvars: w,\n                movie: t\n            }, (v || {\n            }));\n            if ((typeof v.flashvars == \"object\")) {\n                v.flashvars = h.encode(v.flashvars);\n            };\n            var y = [];\n            for (var z in v) {\n                if ((v.hasOwnProperty(z) && v[z])) {\n                    y.push(((((\"\\u003Cparam name=\\\"\" + encodeURI(z)) + \"\\\" value=\\\"\") + encodeURI(v[z])) + \"\\\"\\u003E\"));\n                };\n            };\n            var aa = n.createElement(\"div\"), ba = (((((((((\"\\u003Cobject \" + ((i.ie() ? \"classid=\\\"clsid:d27cdb6e-ae6d-11cf-96b8-444553540000\\\" \" : \"type=\\\"application/x-shockwave-flash\\\"\"))) + \"data=\\\"\") + t) + \"\\\" \") + \"id=\\\"\") + x) + \"\\\"\\u003E\") + y.join(\"\")) + \"\\u003C/object\\u003E\");\n            aa.innerHTML = ba;\n            var ca = u.appendChild(aa.firstChild);\n            r(x);\n            return ca;\n        },\n        remove: o,\n        getVersion: function() {\n            var t = \"Shockwave Flash\", u = \"application/x-shockwave-flash\", v = \"ShockwaveFlash.ShockwaveFlash\", w;\n            if ((navigator.plugins && (typeof navigator.plugins[t] == \"object\"))) {\n                var x = navigator.plugins[t].description;\n                if ((((x && navigator.mimeTypes) && navigator.mimeTypes[u]) && navigator.mimeTypes[u].enabledPlugin)) {\n                    w = x.match(/\\d+/g);\n                };\n            }\n        ;\n            if (!w) {\n                try {\n                    w = (new ActiveXObject(v)).GetVariable(\"$version\").match(/(\\d+),(\\d+),(\\d+),(\\d+)/);\n                    w = Array.prototype.slice.call(w, 1);\n                } catch (y) {\n                \n                }\n            };\n            return w;\n        },\n        checkMinVersion: function(t) {\n            var u = s.getVersion();\n            if (!u) {\n                return false\n            };\n            return (q(u.join(\".\")) >= q(t));\n        },\n        isAvailable: function() {\n            return !!s.getVersion();\n        }\n    };\n    e.exports = s;\n});\n__d(\"MercuryAudioPlayer\", [\"Event\",\"Arbiter\",\"DOM\",\"Flash\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"Arbiter\"), i = b(\"DOM\"), j = b(\"Flash\"), k = b(\"copyProperties\"), l = 200;\n    function m() {\n        var v = i.create(\"audio\"), w = false;\n        try {\n            if (!!v.canPlayType) {\n                if (v.canPlayType(\"video/mp4;\").replace(/^no$/, \"\")) {\n                    w = true;\n                }\n            };\n        } finally {\n            return w;\n        };\n    };\n    function n() {\n        return j.isAvailable();\n    };\n    var o = function() {\n        this.interval = null;\n        this.arbiterInstance = null;\n        this.audio = i.create(\"audio\");\n        g.listen(this.audio, \"playing\", function() {\n            this.informAttachment(\"playing\", this.audio.currentTime);\n            this.interval = setInterval(function() {\n                this.informAttachment(\"playing\", this.audio.currentTime);\n            }.bind(this), l);\n        }.bind(this));\n        g.listen(this.audio, \"ended\", function() {\n            clearInterval(this.interval);\n            this.informAttachment(\"finished\");\n        }.bind(this));\n    };\n    k(o.prototype, {\n        setAudio: function(v, w) {\n            this.audio.setAttribute(\"src\", v);\n            this.arbiterInstance = w;\n        },\n        informAttachment: function(v, w) {\n            if (this.arbiterInstance) {\n                this.arbiterInstance.inform(v, w);\n            };\n        },\n        play: function() {\n            this.audio.play();\n            this.informAttachment(\"played\");\n        },\n        resume: function() {\n            this.audio.play();\n            this.informAttachment(\"played\");\n        },\n        pause: function() {\n            this.audio.pause();\n            clearInterval(this.interval);\n            this.informAttachment(\"paused\");\n        },\n        getType: function() {\n            return \"html5\";\n        }\n    });\n    var p = function() {\n        this.src = null;\n        this.arbiterInstance = null;\n        var v = i.create(\"div\");\n        document.body.appendChild(v);\n        this.swf = j.embed(\"/swf/SoundStreamPlayer.swf\", v, null, {\n        });\n        this.interval = null;\n        h.subscribe(\"soundstream/finished\", function() {\n            clearInterval(this.interval);\n            this.informAttachment(\"finished\");\n        }.bind(this));\n    };\n    k(p.prototype, {\n        setAudio: function(v, w) {\n            this.src = v;\n            this.arbiterInstance = w;\n        },\n        informAttachment: function(v, w) {\n            if (this.arbiterInstance) {\n                this.arbiterInstance.inform(v, w);\n            };\n        },\n        play: function() {\n            this.swf.playSound(this.src);\n            this.interval = setInterval(function() {\n                var v = this.swf.getCurrentTime();\n                this.informAttachment(\"playing\", v);\n            }.bind(this), l);\n            this.informAttachment(\"played\");\n        },\n        resume: function() {\n            this.swf.resume();\n            this.informAttachment(\"played\");\n        },\n        pause: function() {\n            clearInterval(this.interval);\n            this.swf.pause();\n            this.informAttachment(\"paused\");\n        },\n        getType: function() {\n            return \"flash\";\n        }\n    });\n    function q() {\n        if (m()) {\n            return new o();\n        }\n         else if (n()) {\n            return new p()\n        }\n    ;\n        return false;\n    };\n    var r = null, s = null, t = 0;\n    function u(v, w) {\n        this.src = v;\n        this.arbiterInstance = w;\n        this.audio_id = ++t;\n        ((r !== null) || (r = q()));\n        if (!r) {\n            return false\n        };\n    };\n    k(u.prototype, {\n        getType: function() {\n            if (!r) {\n                return false;\n            }\n             else return r.getType()\n        ;\n        },\n        play: function(v) {\n            if ((v && (s == this.audio_id))) {\n                r.resume();\n            }\n             else {\n                this.pause();\n                s = this.audio_id;\n                r.setAudio(this.src, this.arbiterInstance);\n                r.play();\n            }\n        ;\n        },\n        pause: function() {\n            r.pause();\n        }\n    });\n    e.exports = u;\n});\n__d(\"MercuryAttachmentAudioClip.react\", [\"Arbiter\",\"ArbiterMixin\",\"MercuryAudioPlayer\",\"Env\",\"JSLogger\",\"LeftRight.react\",\"React\",\"cx\",\"shield\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ArbiterMixin\"), i = b(\"MercuryAudioPlayer\"), j = b(\"Env\"), k = b(\"JSLogger\"), l = b(\"LeftRight.react\"), m = b(\"React\"), n = b(\"cx\"), o = b(\"shield\"), p = b(\"tx\"), q = \"MercuryAttachmentAudioClip/play\", r = k.create(\"mercury_audio_clip\"), s = m.createClass({\n        displayName: \"AudioClip\",\n        mixins: [h,],\n        getInitialState: function() {\n            this.subscribe(\"playing\", this.updateTime);\n            this.subscribe(\"played\", o(this.setState, this, {\n                playing: true,\n                started: true\n            }));\n            this.subscribe(\"paused\", o(this.setState, this, {\n                playing: false\n            }));\n            this.subscribe(\"finished\", o(this.setState, this, {\n                playing: false,\n                started: false,\n                time: this.props.duration\n            }));\n            this.logged = false;\n            var t = (this.props.downloadOnly ? false : new i(this.props.src, this));\n            g.subscribe(q, function(u, v) {\n                if ((this.props.src != v)) {\n                    this.setState({\n                        time: 0\n                    });\n                };\n            }.bind(this));\n            return {\n                time: 0,\n                playing: false,\n                started: false,\n                duration: this.props.duration,\n                audioPlayer: t\n            };\n        },\n        updateTime: function(t, u) {\n            this.setState({\n                time: u\n            });\n        },\n        play: function() {\n            if (this.state.playing) {\n                this.state.audioPlayer.pause();\n            }\n             else {\n                this.state.audioPlayer.play(this.state.started);\n                g.inform(q, this.props.src);\n                if (!this.logged) {\n                    this.logged = true;\n                    r.log(\"play\", {\n                        uid: j.user,\n                        duration: this.props.duration\n                    });\n                }\n            ;\n            }\n        ;\n        },\n        _formatSeconds: function(t) {\n            if (t) {\n                t = Math.ceil(t);\n                var u = (t % 60);\n                if ((u < 10)) {\n                    u = (\"0\" + u);\n                };\n                var v = Math.floor((t / 60));\n                return ((v + \":\") + u);\n            }\n             else return null\n        ;\n        },\n        _renderPlayer: function(t, u) {\n            return (m.DOM.a({\n                className: \"_1miz\",\n                style: {\n                    width: t\n                },\n                onClick: this.play\n            }, m.DOM.span({\n                className: \"_1mi-\"\n            }, m.DOM.i({\n                className: \"_1mi_\"\n            })), m.DOM.span({\n                className: \"_1mj0\"\n            }, u), m.DOM.div({\n                className: \"_1mj1\"\n            })));\n        },\n        render: function() {\n            var t = this.state.time, u = this.state.playing, v = this._formatSeconds(this.state.duration), w = (this.props.width || 170), x = null, y = Math.ceil((((t * ((w + 2)))) / this.state.duration));\n            if ((this.state.audioPlayer && this.state.audioPlayer.getType())) {\n                var z = this._renderPlayer(w, v), aa = this._renderPlayer(w, v), ba = ((((\"_1mj2\") + (((u && ((t !== 0))) ? (\" \" + \"_1mj3\") : \"\"))) + (((u && ((t === 0))) ? (\" \" + \"_4g4x\") : \"\"))));\n                x = (m.DOM.div({\n                    className: ba\n                }, z, m.DOM.div({\n                    className: \"_1mj4\",\n                    style: {\n                        width: y\n                    }\n                }, aa)));\n            }\n             else x = (m.DOM.div({\n                className: \"_1mj2\"\n            }, m.DOM.div({\n                className: \"_1miz\"\n            }, l(null, m.DOM.a({\n                className: \"_1mj5\",\n                href: this.props.src\n            }, m.DOM.span({\n                className: \"_3qi6\"\n            }, m.DOM.i({\n                className: \"_1mj6\"\n            })), m.DOM.span({\n                className: \"_1mj7\"\n            }, \"Voice Message\"), m.DOM.span({\n                className: \"_1mj8\"\n            }, v)), m.DOM.a({\n                href: this.props.src,\n                className: \"_1mj9\"\n            }, m.DOM.i({\n                className: \"_1mja\"\n            }))))));\n        ;\n            return (m.DOM.div({\n                className: \"_1mjb\"\n            }, x));\n        }\n    });\n    e.exports = s;\n});\n__d(\"MercuryStickersFlyoutList.react\", [\"Animation\",\"React\",\"Image.react\",\"cx\",\"fbt\",\"ix\",], function(a, b, c, d, e, f) {\n    var g = b(\"Animation\"), h = b(\"React\"), i = b(\"Image.react\"), j = b(\"cx\"), k = b(\"fbt\"), l = b(\"ix\"), m = 5, n = \"Sticker Store\", o = h.createClass({\n        displayName: \"MercuryStickersFlyoutList\",\n        _calculateNumPages: function(q) {\n            return Math.max(1, Math.ceil((((q.length - 1)) / m)));\n        },\n        getInitialState: function() {\n            return {\n                animating: false,\n                selectedId: this.props.packs[0].id,\n                page: 0,\n                numPages: this._calculateNumPages(this.props.packs)\n            };\n        },\n        componentWillReceiveProps: function(q) {\n            this.setState({\n                numPages: this._calculateNumPages(q.packs)\n            });\n        },\n        shouldComponentUpdate: function(q, r) {\n            return !r.animating;\n        },\n        _canGoPrev: function() {\n            return (this.state.page > 0);\n        },\n        _canGoNext: function() {\n            return ((this.state.page + 1) < this.state.numPages);\n        },\n        _setPage: function(q) {\n            if (this.state.animating) {\n                return\n            };\n            this.setState({\n                animating: true,\n                page: q\n            });\n            var r = this.refs.positioner.getDOMNode();\n            new g(r).to(\"marginLeft\", (-r.childNodes[q].offsetLeft + \"px\")).ondone(function() {\n                this.setState({\n                    animating: false\n                });\n            }.bind(this)).duration(200).go();\n        },\n        _back: function() {\n            (this._canGoPrev() && this._setPage((this.state.page - 1)));\n        },\n        _next: function() {\n            (this._canGoNext() && this._setPage((this.state.page + 1)));\n        },\n        render: function() {\n            var q = this.props.packs, r = this.props.onPackClick, s = [];\n            q.forEach(function(y, z) {\n                s.push(p({\n                    key: y.id,\n                    onClick: function() {\n                        (r && r(y.id));\n                        this.setState({\n                            selectedId: y.id\n                        });\n                    }.bind(this),\n                    pack: y,\n                    selected: (this.state.selectedId === y.id)\n                }));\n            }.bind(this));\n            var t = [], u = [];\n            s.forEach(function(y, z) {\n                u.push(y);\n                if (((z > 0) && ((((z % m) === 0) || (z === (s.length - 1)))))) {\n                    t.push(h.DOM.div({\n                        className: \"_58_z\"\n                    }, u));\n                    u = [];\n                }\n            ;\n            });\n            var v = ((((\"_58_w\") + ((\" \" + \"lfloat\"))) + ((!this._canGoPrev() ? (\" \" + \"hidden_elem\") : \"\")))), w = ((((\"_58_x\") + ((\" \" + \"rfloat\"))) + ((!this._canGoNext() ? (\" \" + \"hidden_elem\") : \"\")))), x;\n            if ((t.length > 1)) {\n                x = h.DOM.a({\n                    className: w,\n                    onClick: this._next\n                }, i({\n                    className: \"_590q\",\n                    src: l(\"/images/messaging/stickers/selector/rightarrow.png\")\n                }));\n            };\n            return (h.DOM.div({\n                className: \"_5908\"\n            }, h.DOM.a({\n                ajaxify: \"/ajax/messaging/stickers/store\",\n                \"aria-label\": n,\n                className: \"_59wb rfloat\",\n                \"data-hover\": \"tooltip\",\n                ref: \"store\",\n                rel: \"dialog\"\n            }, i({\n                className: \"_5bo3\",\n                src: l(\"/images/messaging/stickers/selector/store.png\")\n            })), h.DOM.a({\n                className: v,\n                onClick: this._back\n            }, i({\n                className: \"_590q\",\n                src: l(\"/images/messaging/stickers/selector/leftarrow.png\")\n            })), x, h.DOM.div({\n                className: \"_590r\"\n            }, h.DOM.div({\n                className: \"_58_y\",\n                ref: \"positioner\"\n            }, t))));\n        }\n    }), p = h.createClass({\n        displayName: \"PackIcon\",\n        render: function() {\n            var q = this.props.pack, r = (((\"_55bn\") + ((this.props.selected ? (\" \" + \"_55bo\") : \"\"))));\n            return (h.DOM.a({\n                \"aria-label\": q.name,\n                className: r,\n                \"data-id\": q.id,\n                \"data-hover\": \"tooltip\",\n                onClick: function() {\n                    (this.props.onClick && this.props.onClick(q.id));\n                }.bind(this)\n            }, h.DOM.img({\n                className: \"_55bw\",\n                src: q.icon\n            }), h.DOM.img({\n                className: \"_590u\",\n                src: q.selectedIcon\n            })));\n        }\n    });\n    e.exports = o;\n});\n__d(\"str2rstr\", [], function(a, b, c, d, e, f) {\n    function g(h) {\n        var i = \"\", j, k;\n        for (var l = 0; (l < h.length); l++) {\n            j = h.charCodeAt(l);\n            k = (((l + 1) < h.length) ? h.charCodeAt((l + 1)) : 0);\n            if (((((55296 <= j) && (j <= 56319)) && (56320 <= k)) && (k <= 57343))) {\n                j = ((65536 + ((((j & 1023)) << 10))) + ((k & 1023)));\n                l++;\n            }\n        ;\n            if ((j <= 127)) {\n                i += String.fromCharCode(j);\n            }\n             else if ((j <= 2047)) {\n                i += String.fromCharCode((192 | ((((j >>> 6)) & 31))), (128 | ((j & 63))));\n            }\n             else if ((j <= 65535)) {\n                i += String.fromCharCode((224 | ((((j >>> 12)) & 15))), (128 | ((((j >>> 6)) & 63))), (128 | ((j & 63))));\n            }\n             else if ((j <= 2097151)) {\n                i += String.fromCharCode((240 | ((((j >>> 18)) & 7))), (128 | ((((j >>> 12)) & 63))), (128 | ((((j >>> 6)) & 63))), (128 | ((j & 63))));\n            }\n            \n            \n        ;\n        };\n        return i;\n    };\n    e.exports = g;\n});\n__d(\"md5\", [\"str2rstr\",], function(a, b, c, d, e, f) {\n    var g = b(\"str2rstr\");\n    function h(u, v) {\n        var w = u[0], x = u[1], y = u[2], z = u[3];\n        w = j(w, x, y, z, v[0], 7, -680876936);\n        z = j(z, w, x, y, v[1], 12, -389564586);\n        y = j(y, z, w, x, v[2], 17, 606105819);\n        x = j(x, y, z, w, v[3], 22, -1044525330);\n        w = j(w, x, y, z, v[4], 7, -176418897);\n        z = j(z, w, x, y, v[5], 12, 1200080426);\n        y = j(y, z, w, x, v[6], 17, -1473231341);\n        x = j(x, y, z, w, v[7], 22, -45705983);\n        w = j(w, x, y, z, v[8], 7, 1770035416);\n        z = j(z, w, x, y, v[9], 12, -1958414417);\n        y = j(y, z, w, x, v[10], 17, -42063);\n        x = j(x, y, z, w, v[11], 22, -1990404162);\n        w = j(w, x, y, z, v[12], 7, 1804603682);\n        z = j(z, w, x, y, v[13], 12, -40341101);\n        y = j(y, z, w, x, v[14], 17, -1502002290);\n        x = j(x, y, z, w, v[15], 22, 1236535329);\n        w = k(w, x, y, z, v[1], 5, -165796510);\n        z = k(z, w, x, y, v[6], 9, -1069501632);\n        y = k(y, z, w, x, v[11], 14, 643717713);\n        x = k(x, y, z, w, v[0], 20, -373897302);\n        w = k(w, x, y, z, v[5], 5, -701558691);\n        z = k(z, w, x, y, v[10], 9, 38016083);\n        y = k(y, z, w, x, v[15], 14, -660478335);\n        x = k(x, y, z, w, v[4], 20, -405537848);\n        w = k(w, x, y, z, v[9], 5, 568446438);\n        z = k(z, w, x, y, v[14], 9, -1019803690);\n        y = k(y, z, w, x, v[3], 14, -187363961);\n        x = k(x, y, z, w, v[8], 20, 1163531501);\n        w = k(w, x, y, z, v[13], 5, -1444681467);\n        z = k(z, w, x, y, v[2], 9, -51403784);\n        y = k(y, z, w, x, v[7], 14, 1735328473);\n        x = k(x, y, z, w, v[12], 20, -1926607734);\n        w = l(w, x, y, z, v[5], 4, -378558);\n        z = l(z, w, x, y, v[8], 11, -2022574463);\n        y = l(y, z, w, x, v[11], 16, 1839030562);\n        x = l(x, y, z, w, v[14], 23, -35309556);\n        w = l(w, x, y, z, v[1], 4, -1530992060);\n        z = l(z, w, x, y, v[4], 11, 1272893353);\n        y = l(y, z, w, x, v[7], 16, -155497632);\n        x = l(x, y, z, w, v[10], 23, -1094730640);\n        w = l(w, x, y, z, v[13], 4, 681279174);\n        z = l(z, w, x, y, v[0], 11, -358537222);\n        y = l(y, z, w, x, v[3], 16, -722521979);\n        x = l(x, y, z, w, v[6], 23, 76029189);\n        w = l(w, x, y, z, v[9], 4, -640364487);\n        z = l(z, w, x, y, v[12], 11, -421815835);\n        y = l(y, z, w, x, v[15], 16, 530742520);\n        x = l(x, y, z, w, v[2], 23, -995338651);\n        w = m(w, x, y, z, v[0], 6, -198630844);\n        z = m(z, w, x, y, v[7], 10, 1126891415);\n        y = m(y, z, w, x, v[14], 15, -1416354905);\n        x = m(x, y, z, w, v[5], 21, -57434055);\n        w = m(w, x, y, z, v[12], 6, 1700485571);\n        z = m(z, w, x, y, v[3], 10, -1894986606);\n        y = m(y, z, w, x, v[10], 15, -1051523);\n        x = m(x, y, z, w, v[1], 21, -2054922799);\n        w = m(w, x, y, z, v[8], 6, 1873313359);\n        z = m(z, w, x, y, v[15], 10, -30611744);\n        y = m(y, z, w, x, v[6], 15, -1560198380);\n        x = m(x, y, z, w, v[13], 21, 1309151649);\n        w = m(w, x, y, z, v[4], 6, -145523070);\n        z = m(z, w, x, y, v[11], 10, -1120210379);\n        y = m(y, z, w, x, v[2], 15, 718787259);\n        x = m(x, y, z, w, v[9], 21, -343485551);\n        u[0] = s(w, u[0]);\n        u[1] = s(x, u[1]);\n        u[2] = s(y, u[2]);\n        u[3] = s(z, u[3]);\n    };\n    function i(u, v, w, x, y, z) {\n        v = s(s(v, u), s(x, z));\n        return s((((v << y)) | ((v >>> ((32 - y))))), w);\n    };\n    function j(u, v, w, x, y, z, aa) {\n        return i((((v & w)) | (((~v) & x))), u, v, y, z, aa);\n    };\n    function k(u, v, w, x, y, z, aa) {\n        return i((((v & x)) | ((w & (~x)))), u, v, y, z, aa);\n    };\n    function l(u, v, w, x, y, z, aa) {\n        return i(((v ^ w) ^ x), u, v, y, z, aa);\n    };\n    function m(u, v, w, x, y, z, aa) {\n        return i((w ^ ((v | (~x)))), u, v, y, z, aa);\n    };\n    function n(u) {\n        var v = u.length, w = [1732584193,-271733879,-1732584194,271733878,], x;\n        for (x = 64; (x <= u.length); x += 64) {\n            h(w, o(u.substring((x - 64), x)));;\n        };\n        u = u.substring((x - 64));\n        var y = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,];\n        for (x = 0; (x < u.length); x++) {\n            y[(x >> 2)] |= (u.charCodeAt(x) << ((((x & 3)) << 3)));;\n        };\n        y[(x >> 2)] |= (128 << ((((x & 3)) << 3)));\n        if ((x > 55)) {\n            h(w, y);\n            for (x = 0; (x < 16); x++) {\n                y[x] = 0;;\n            };\n        }\n    ;\n        y[14] = (v * 8);\n        h(w, y);\n        return w;\n    };\n    function o(u) {\n        var v = [], w = 0;\n        while ((w < 64)) {\n            v[(w >> 2)] = (((u.charCodeAt(w++) | ((u.charCodeAt(w++) << 8))) | ((u.charCodeAt(w++) << 16))) | ((u.charCodeAt(w++) << 24)));;\n        };\n        return v;\n    };\n    var p = \"0123456789abcdef\".split(\"\");\n    function q(u) {\n        var v = \"\", w = 0;\n        for (; (w < 4); w++) {\n            v += (p[(((u >> ((((w << 3)) + 4)))) & 15)] + p[(((u >> ((w << 3)))) & 15)]);;\n        };\n        return v;\n    };\n    function r(u) {\n        for (var v = 0; (v < u.length); v++) {\n            u[v] = q(u[v]);;\n        };\n        return u.join(\"\");\n    };\n    var s = function(u, v) {\n        return (((u + v)) & 4294967295);\n    };\n    function t(u) {\n        if (((null === u) || (undefined === u))) {\n            return null;\n        }\n         else {\n            for (var v = 0; (v < u.length); v++) {\n                if ((u[v] > \"\")) {\n                    u = g(u);\n                    break;\n                }\n            ;\n            };\n            return r(n(u));\n        }\n    ;\n    };\n    if ((t(\"hello\") != \"5d41402abc4b2a76b9719d911017c592\")) {\n        s = function(u, v) {\n            var w = (((u & 65535)) + ((v & 65535))), x = ((((u >> 16)) + ((v >> 16))) + ((w >> 16)));\n            return (((x << 16)) | ((w & 65535)));\n        };\n    };\n    e.exports = t;\n});\n__d(\"isRTL\", [], function(a, b, c, d, e, f) {\n    var g = (\"A-Za-z\\u00c0-\\u00d6\\u00d8-\\u00f6\\u00f8-\\u02b8\\u0300-\\u0590\\u0800-\\u1fff\" + \"\\u200e\\u2c00-\\ufb1c\\ufe00-\\ufe6f\\ufefd-\\uffff\"), h = \"\\u0591-\\u07ff\\u200f\\ufb1d-\\ufdff\\ufe70-\\ufefc\", i = new RegExp(((((\"^[^\" + g) + \"]*[\") + h) + \"]\")), j = new RegExp(((\"[\" + g) + \"]\"));\n    function k(l) {\n        var m = 0, n = 0;\n        l.split(/\\s+/, 20).forEach(function(o) {\n            if (/^https?:\\/\\//.test(o)) {\n                return\n            };\n            if (i.test(o)) {\n                n++;\n                m++;\n            }\n             else if (j.test(o)) {\n                m++;\n            }\n        ;\n        });\n        return !!((m && (((n / m) > 14503))));\n    };\n    e.exports = k;\n});\n__d(\"WaterfallIDGenerator\", [\"Env\",\"md5\",], function(a, b, c, d, e, f) {\n    var g = b(\"Env\"), h = b(\"md5\");\n    function i() {\n        var l = 2147483647;\n        return (Math.random() * l);\n    };\n    function j() {\n        return Math.floor((Date.now() / 1000));\n    };\n    var k = {\n        generate: function() {\n            return h([g.user,j(),i(),].join(\":\"));\n        }\n    };\n    e.exports = k;\n});\n__d(\"FeatureDetection\", [\"UserAgent\",], function(a, b, c, d, e, f) {\n    var g = b(\"UserAgent\");\n    e.exports = {\n        isFileAPISupported: function() {\n            if (((g.webkit() && !g.chrome()) && g.windows())) {\n                return false\n            };\n            return (((\"FileList\" in window)) && ((\"FormData\" in window)));\n        },\n        isBlobFactorySupported: function() {\n            return !!a.Blob;\n        }\n    };\n});\n__d(\"AsyncUploadBase\", [\"ArbiterMixin\",\"AsyncRequest\",\"AsyncResponse\",\"Form\",\"FeatureDetection\",\"copyProperties\",\"removeFromArray\",], function(a, b, c, d, e, f) {\n    var g = b(\"ArbiterMixin\"), h = b(\"AsyncRequest\"), i = b(\"AsyncResponse\"), j = b(\"Form\"), k = b(\"FeatureDetection\"), l = b(\"copyProperties\"), m = b(\"removeFromArray\");\n    function n(p) {\n        this.setURI(p);\n    };\n    n.isSupported = function() {\n        return k.isFileAPISupported();\n    };\n    l(n.prototype, g, {\n        _limit: 10,\n        setAllowCrossOrigin: function(p) {\n            this._allowCrossOrigin = !!p;\n            return this;\n        },\n        setData: function(p) {\n            this._data = p;\n            return this;\n        },\n        setLimit: function(p) {\n            this._limit = p;\n            return this;\n        },\n        setRelativeTo: function(p) {\n            this._relativeTo = p;\n            return this;\n        },\n        setStatusElement: function(p) {\n            this._statusElement = p;\n            return this;\n        },\n        setURI: function(p) {\n            this._uri = p;\n            return this;\n        },\n        suspend: function() {\n            this._suspended = true;\n            return this;\n        },\n        resume: function() {\n            this._suspended = false;\n            this._processQueue();\n            return this;\n        },\n        isUploading: function() {\n            return this._inFlight;\n        },\n        _createFileUpload: function(p, q, r) {\n            return new o(p, q, r);\n        },\n        _parseFiles: function(p) {\n            var q = {\n            };\n            for (var r in p) {\n                var s = p[r];\n                if (Array.isArray(s)) {\n                    q[r] = s;\n                }\n                 else {\n                    q[r] = [];\n                    if ((s instanceof window.FileList)) {\n                        for (var t = 0; (t < s.length); t++) {\n                            q[r].push(s.item(t));;\n                        };\n                    }\n                     else if (((s instanceof window.File) || (s instanceof window.Blob))) {\n                        q[r].push(s);\n                    }\n                ;\n                }\n            ;\n            };\n            return q;\n        },\n        _processQueue: function() {\n            if (this._suspended) {\n                return\n            };\n            while ((this._pending.length < this._limit)) {\n                if (!this._waiting.length) {\n                    break;\n                };\n                var p = this._waiting.shift();\n                this._processUpload(p);\n                this._pending.push(p);\n            };\n        },\n        _processUpload: function(p) {\n            var q = j.createFormData((p.getData() || this._data));\n            if (p.getFile()) {\n                q.append(p.getName(), p.getFile());\n                q.append(\"upload_id\", p.getFile().uploadID);\n            }\n        ;\n            var r = new h().setAllowCrossOrigin(this._allowCrossOrigin).setURI(this._uri).setRawData(q).setRelativeTo(this._relativeTo).setStatusElement(this._statusElement).setHandler(this._success.bind(this, p)).setErrorHandler(this._failure.bind(this, p)).setUploadProgressHandler(this._progress.bind(this, p)).setInitialHandler(this._initial.bind(this, p));\n            r.send();\n            p.setAsyncRequest(r);\n            this._inFlight = true;\n            this.inform(\"start\", p);\n        },\n        _abort: function(p) {\n            m(this._waiting, p);\n            p.abort();\n        },\n        _initial: function(p) {\n            this.inform(\"initial\", p);\n        },\n        _success: function(p, q) {\n            this._complete(p);\n            this.inform(\"success\", p.handleSuccess(q));\n            this._processQueue();\n        },\n        _failure: function(p, q) {\n            this._complete(p);\n            if ((this.inform(\"failure\", p.handleFailure(q)) !== false)) {\n                i.defaultErrorHandler(q);\n            };\n            this._processQueue();\n        },\n        _progress: function(p, event) {\n            this.inform(\"progress\", p.handleProgress(event));\n        },\n        _complete: function(p) {\n            m(this._pending, p);\n            if (!this._pending.length) {\n                this._inFlight = false;\n            };\n        }\n    });\n    var o = function(p, q, r) {\n        this._name = p;\n        this._file = q;\n        this._data = r;\n        this._success = null;\n        this._response = null;\n        this._progressEvent = null;\n        this._request = null;\n    };\n    l(o.prototype, {\n        getName: function() {\n            return this._name;\n        },\n        getFile: function() {\n            return this._file;\n        },\n        getData: function() {\n            return this._data;\n        },\n        isComplete: function() {\n            return (this._success !== null);\n        },\n        isSuccess: function() {\n            return (this._success === true);\n        },\n        getResponse: function() {\n            return this._response;\n        },\n        getProgressEvent: function() {\n            return this._progressEvent;\n        },\n        setAsyncRequest: function(p) {\n            this._request = p;\n            return this;\n        },\n        isWaiting: function() {\n            return !this._request;\n        },\n        abort: function() {\n            (this._request && this._request.abort());\n            this._request = null;\n        },\n        handleSuccess: function(p) {\n            this._success = true;\n            this._response = p;\n            this._progressEvent = null;\n            return this;\n        },\n        handleFailure: function(p) {\n            this._success = false;\n            this._response = p;\n            this._progressEvent = null;\n            return this;\n        },\n        handleProgress: function(event) {\n            this._progressEvent = event;\n            return this;\n        }\n    });\n    e.exports = n;\n});\n__d(\"AsyncUploadRequest\", [\"AsyncUploadBase\",\"Class\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncUploadBase\"), h = b(\"Class\"), i = b(\"copyProperties\");\n    function j(k) {\n        this.parent.construct(this, k);\n    };\n    j.isSupported = function() {\n        return g.isSupported();\n    };\n    h.extend(j, g);\n    i(j.prototype, {\n        setFiles: function(k) {\n            this._files = this._parseFiles(k);\n            return this;\n        },\n        send: function() {\n            if (this._inFlight) {\n                return\n            };\n            this._inFlight = true;\n            this._uploads = [];\n            for (var k in this._files) {\n                this._files[k].forEach(function(l) {\n                    this._uploads.push(this._createFileUpload(k, l));\n                }.bind(this));;\n            };\n            if (this._uploads.length) {\n                this._waiting = this._uploads.slice(0);\n                this._pending = [];\n                this._processQueue();\n            }\n             else this._processUpload(this._createFileUpload(null, null));\n        ;\n        },\n        _processQueue: function() {\n            this.parent._processQueue();\n            if ((!this._pending.length && !this._waiting.length)) {\n                this.inform(\"complete\", this._uploads);\n            };\n        }\n    });\n    e.exports = j;\n});\n__d(\"FileForm\", [\"ArbiterMixin\",\"AsyncRequest\",\"AsyncResponse\",\"AsyncUploadRequest\",\"BehaviorsMixin\",\"DataStore\",\"DOMQuery\",\"Env\",\"Event\",\"Form\",\"JSONPTransport\",\"Parent\",\"URI\",\"copyProperties\",\"shield\",], function(a, b, c, d, e, f) {\n    var g = b(\"ArbiterMixin\"), h = b(\"AsyncRequest\"), i = b(\"AsyncResponse\"), j = b(\"AsyncUploadRequest\"), k = b(\"BehaviorsMixin\"), l = b(\"DataStore\"), m = b(\"DOMQuery\"), n = b(\"Env\"), o = b(\"Event\"), p = b(\"Form\"), q = b(\"JSONPTransport\"), r = b(\"Parent\"), s = b(\"URI\"), t = b(\"copyProperties\"), u = b(\"shield\");\n    function v(y) {\n        var z = {\n        }, aa = m.scry(y, \"input[type=\\\"file\\\"]\");\n        aa.forEach(function(ba) {\n            z[ba.name] = ba.files;\n        });\n        return z;\n    };\n    function w(y) {\n        var z = m.scry(y, \"input[type=\\\"file\\\"]\");\n        z.forEach(function(aa) {\n            aa.files = null;\n        });\n    };\n    function x(y, z, aa) {\n        if ((y.getAttribute(\"rel\") === \"async\")) {\n            throw new Error(\"FileForm cannot be used with Primer forms.\")\n        };\n        if ((y.getAttribute(\"method\").toUpperCase() !== \"POST\")) {\n            throw new Error(\"FileForm must be used with POST forms.\")\n        };\n        this._form = y;\n        this._previousEncoding = this._form.enctype;\n        this._form.enctype = this._form.encoding = \"multipart/form-data\";\n        (z && this.enableBehaviors(z));\n        this._options = (aa || {\n        });\n        this.setAllowCrossOrigin(this._options.allowCrossOrigin);\n        this.setUploadInParallel(this._options.uploadInParallel);\n        this._listener = o.listen(this._form, \"submit\", this._submit.bind(this));\n        l.set(this._form, \"FileForm\", this);\n    };\n    t(x, {\n        EVENTS: [\"start\",\"submit\",\"initial\",\"progress\",\"success\",\"failure\",],\n        getInstance: function(y) {\n            return l.get(y, \"FileForm\");\n        }\n    });\n    t(x.prototype, g, k, {\n        getRoot: function() {\n            return this._form;\n        },\n        setAllowCrossOrigin: function(y) {\n            this._allowCrossOrigin = !!y;\n            return this;\n        },\n        setUploadInParallel: function(y) {\n            this._uploadInParallel = !!y;\n            return this;\n        },\n        _submit: function(event) {\n            if ((this.inform(\"submit\") === false)) {\n                event.prevent();\n                return;\n            }\n        ;\n            var y = (\"FormData\" in window);\n            if (y) {\n                if ((!s(this._form.action).isSameOrigin() && !this._allowCrossOrigin)) {\n                    y = false;\n                }\n            };\n            return (y ? this._sendViaXHR(event) : this._sendViaFrame(event));\n        },\n        _sendViaFrame: function(event) {\n            var y = this._request = new h();\n            y.setStatusElement(this._getStatusElement());\n            y.addStatusIndicator();\n            y.setOption(\"useIframeTransport\", true);\n            var z = y.handleResponse.bind(y), aa = new q(\"iframe\", this._form.action, z), ba = aa.getTransportFrame(), ca = aa.getRequestURI().addQueryData({\n                __iframe: true,\n                __user: n.user\n            });\n            this._form.setAttribute(\"action\", ca.toString());\n            this._form.setAttribute(\"target\", ba.name);\n            y.setJSONPTransport(aa);\n            y.setURI(ca);\n            y.setHandler(this.success.bind(this, null));\n            y.setErrorHandler(this.failure.bind(this, null));\n            y.setInitialHandler(u(this.initial, this, null));\n        },\n        _sendViaXHR: function(event) {\n            var y;\n            if ((this._uploadInParallel && j.isSupported())) {\n                y = new j().setData(p.serialize(this._form)).setFiles(v(this._form));\n                var z = [y.subscribe(\"progress\", function(aa, ba) {\n                    this.progress(ba, ba.getProgressEvent());\n                }.bind(this)),y.subscribe(\"initial\", function(aa, ba) {\n                    this.initial(ba, ba.getResponse());\n                }.bind(this)),y.subscribe(\"success\", function(aa, ba) {\n                    this.success(ba, ba.getResponse());\n                }.bind(this)),y.subscribe(\"start\", function(aa, ba) {\n                    this.inform(\"start\", {\n                        upload: ba\n                    });\n                }.bind(this)),y.subscribe(\"failure\", function(aa, ba) {\n                    this.failure(ba, ba.getResponse());\n                    return false;\n                }.bind(this)),y.subscribe(\"complete\", function() {\n                    while (z.length) {\n                        z.pop().unsubscribe();;\n                    };\n                }),];\n            }\n             else y = new h().setRawData(p.createFormData(this._form)).setHandler(this.success.bind(this, null)).setErrorHandler(this.failure.bind(this, null)).setUploadProgressHandler(this.progress.bind(this, null)).setInitialHandler(u(this.initial, this, null));\n        ;\n            y.setAllowCrossOrigin(this._allowCrossOrigin).setRelativeTo(this._form).setStatusElement(this._getStatusElement()).setURI(this._form.action).send();\n            this._request = y;\n            event.prevent();\n        },\n        initial: function(y) {\n            return this.inform(\"initial\", {\n                upload: y\n            });\n        },\n        success: function(y, z) {\n            var aa = {\n                response: z,\n                upload: y\n            };\n            if ((this.inform(\"success\", aa) !== false)) {\n                o.fire(this._form, \"success\", aa);\n            };\n            this._cleanup();\n        },\n        failure: function(y, z) {\n            var aa = {\n                response: z,\n                upload: y\n            };\n            if ((this.inform(\"failure\", aa) !== false)) {\n                if ((o.fire(this._form, \"error\", aa) !== false)) {\n                    i.defaultErrorHandler(z);\n                }\n            };\n            this._cleanup();\n        },\n        progress: function(y, event) {\n            this.inform(\"progress\", {\n                event: event,\n                upload: y\n            });\n        },\n        abort: function() {\n            if (this._request) {\n                this._request.abort();\n                this._cleanup();\n            }\n        ;\n        },\n        clear: function() {\n            w(this._form);\n        },\n        destroy: function() {\n            this._cleanup();\n            this._listener.remove();\n            this._listener = null;\n            this._form.enctype = this._form.encoding = this._previousEncoding;\n            l.remove(this._form, \"FileForm\");\n        },\n        _cleanup: function() {\n            this._request = null;\n        },\n        _getStatusElement: function() {\n            return (r.byClass(this._form, \"stat_elem\") || this._form);\n        }\n    });\n    e.exports = x;\n});\n__d(\"FileFormResetOnSubmit\", [\"DOMQuery\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOMQuery\"), h = b(\"copyProperties\");\n    function i(j) {\n        this._form = j;\n    };\n    h(i.prototype, {\n        enable: function() {\n            this._subscription = this._form.subscribe(\"submit\", Function.prototype.defer.bind(this._reset.bind(this)));\n        },\n        disable: function() {\n            this._subscription.unsubscribe();\n            this._subscription = null;\n        },\n        _reset: function() {\n            var j = g.scry(this._form.getRoot(), \"input[type=\\\"file\\\"]\");\n            j.forEach(function(k) {\n                k.value = \"\";\n            });\n        }\n    });\n    e.exports = i;\n});\n__d(\"submitForm\", [\"DOM\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOM\"), h = function(i) {\n        var j = g.scry(i, \"input[type=\\\"submit\\\"]\")[0];\n        if (j) {\n            j.click();\n        }\n         else {\n            j = g.create(\"input\", {\n                type: \"submit\",\n                className: \"hidden_elem\"\n            });\n            g.appendContent(i, j);\n            j.click();\n            g.remove(j);\n        }\n    ;\n    };\n    e.exports = h;\n});\n__d(\"FormSubmitOnChange\", [\"Event\",\"copyProperties\",\"submitForm\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"copyProperties\"), i = b(\"submitForm\");\n    function j(k) {\n        this._form = k;\n    };\n    h(j.prototype, {\n        _listener: null,\n        enable: function() {\n            this._listener = g.listen(this._form.getRoot(), \"change\", this._submit.bind(this));\n        },\n        disable: function() {\n            this._listener.remove();\n            this._listener = null;\n        },\n        _submit: function() {\n            i(this._form.getRoot());\n        }\n    });\n    e.exports = j;\n});\n__d(\"MercuryFileUploader\", [\"ArbiterMixin\",\"CSS\",\"Dialog\",\"DOM\",\"Event\",\"FileForm\",\"FileFormResetOnSubmit\",\"FileInput\",\"FormSubmitOnChange\",\"MercuryAttachment\",\"MercuryAttachmentTemplates\",\"MercuryConstants\",\"SubscriptionsHandler\",\"copyProperties\",\"csx\",\"getObjectValues\",\"shield\",\"startsWith\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"ArbiterMixin\"), h = b(\"CSS\"), i = b(\"Dialog\"), j = b(\"DOM\"), k = b(\"Event\"), l = b(\"FileForm\"), m = b(\"FileFormResetOnSubmit\"), n = b(\"FileInput\"), o = b(\"FormSubmitOnChange\"), p = b(\"MercuryAttachment\"), q = b(\"MercuryAttachmentTemplates\"), r = b(\"MercuryConstants\"), s = b(\"SubscriptionsHandler\"), t = b(\"copyProperties\"), u = b(\"csx\"), v = b(\"getObjectValues\"), w = b(\"shield\"), x = b(\"startsWith\"), y = b(\"tx\"), z = 0;\n    function aa(ca, da, ea, fa) {\n        this._parentElem = ca;\n        this._attachments = {\n        };\n        this._imageIDs = {\n        };\n        this._uploading = {\n        };\n        this._uploadTemplates = {\n        };\n        this._uploadStartTimes = {\n        };\n        this._subscriptionsHandler = new s();\n        this._fileForm = new l(da, [o,m,]);\n        this._fileForm.setAllowCrossOrigin(true);\n        this._fileForm.setUploadInParallel(true);\n        var ga = j.find(da, \"._4q60\"), ha = j.find(ga, \"._4q61\");\n        new n(ga, ha, ea);\n        h.hide(this._parentElem);\n        this._subscriptionsHandler.addSubscriptions(this._fileForm.subscribe(\"submit\", function() {\n            var ia = (\"upload_\" + z++);\n            fa.value = ia;\n            var ja = {\n                count: 0,\n                file_sizes: []\n            };\n            if (ea.files) {\n                for (var ka = 0; (ka < ea.files.length); ka++) {\n                    if ((ea.files[ka].size > r.AttachmentMaxSize)) {\n                        this._fileForm.abort();\n                        this._fileForm.clear();\n                        new i().setTitle(\"The file you have selected is too large\").setBody(\"The file you have selected is too large. The maximum size is 25MB.\").setButtons(i.OK).setSemiModal(true).show();\n                        return false;\n                    }\n                ;\n                };\n                for (var la = 0; (la < ea.files.length); la++) {\n                    this._addFileUploadRow(ia, ea.files[la].name);\n                    ja.count++;\n                    ja.file_sizes.push(ea.files[la].size);\n                };\n            }\n             else {\n                this._addFileUploadRow(ia, ea.value);\n                ja.count = 1;\n            }\n        ;\n            this.inform(\"submit\", ja);\n        }.bind(this)), this._fileForm.subscribe(\"success\", this._onFileUploadSuccess.bind(this)), this._fileForm.subscribe(\"failure\", this._onFileUploadFailure.bind(this)), k.listen(ha, \"click\", w(this.inform, this, \"open\")));\n    };\n    t(aa.prototype, g, {\n        isUploading: function() {\n            return !!Object.keys(this._uploading).length;\n        },\n        getAttachments: function() {\n            return v(this._attachments);\n        },\n        getImageIDs: function() {\n            return v(this._imageIDs);\n        },\n        removeAttachments: function() {\n            v(this._uploadTemplates).forEach(function(ca) {\n                if (ca) {\n                    j.remove(ca.getRoot());\n                };\n            });\n            this._attachments = {\n            };\n            this._imageIDs = {\n            };\n            this._uploadTemplates = {\n            };\n            this._uploading = {\n            };\n            this._uploadStartTimes = {\n            };\n            h.hide(this._parentElem);\n            this.inform(\"dom-updated\");\n        },\n        destroy: function() {\n            this._subscriptionsHandler.release();\n            this._fileForm.destroy();\n            this.removeAttachments();\n        },\n        _addFileUploadRow: function(ca, da) {\n            var ea = q[\":fb:mercury:upload-file-row\"].build(), fa = ba(da), ga = ((ca + \"/\") + fa);\n            this._uploadTemplates[ga] = ea;\n            this._uploading[ga] = true;\n            this._uploadStartTimes[ga] = Date.now();\n            j.appendContent(ea.getNode(\"iconText\"), fa);\n            k.listen(ea.getNode(\"closeFileUpload\"), \"click\", this._removeFileUploader.bind(this, ga));\n            j.appendContent(this._parentElem, ea.getRoot());\n            h.show(this._parentElem);\n            this.inform(\"dom-updated\");\n        },\n        _removeFileUploader: function(ca, event) {\n            if (this._uploading[ca]) {\n                this.inform(\"upload-canceled-during-upload\");\n            }\n             else if ((this._attachments[ca] || this._imageIDs[ca])) {\n                this.inform(\"upload-canceled-after-uploaded\");\n            }\n        ;\n            delete this._attachments[ca];\n            delete this._imageIDs[ca];\n            delete this._uploading[ca];\n            delete this._uploadStartTimes[ca];\n            var da = this._uploadTemplates[ca];\n            delete this._uploadTemplates[ca];\n            if (da) {\n                j.remove(da.getRoot());\n                this.inform(\"dom-updated\");\n            }\n        ;\n            this.inform(\"upload-canceled\");\n            return false;\n        },\n        _updateFileUploader: function(ca, da) {\n            var ea = this._uploadTemplates[ca], fa = p.getAttachIconClassByMime(da);\n            h.addClass(ea.getNode(\"iconText\"), fa);\n            h.addClass(ea.getRoot(), \"done\");\n        },\n        _onFileUploadSuccess: function(event, ca) {\n            var da = ca.response.getPayload(), ea = da.uploadID, fa = da.metadata;\n            for (var ga = 0; (ga < fa.length); ga++) {\n                var ha = ((ea + \"/\") + fa[ga].filename);\n                if (this._uploading[ha]) {\n                    delete this._uploading[ha];\n                    if (fa[ga].image_id) {\n                        this._imageIDs[ha] = fa[ga].image_id;\n                    }\n                     else this._attachments[ha] = fa[ga];\n                ;\n                    this._updateFileUploader(ha, fa[ga].filetype);\n                    this.inform(\"one-upload-completed\", {\n                        upload_time_ms: (Date.now() - this._uploadStartTimes[ha])\n                    });\n                }\n            ;\n            };\n            if (!this.isUploading()) {\n                this.inform(\"all-uploads-completed\", {\n                    count: this.getAttachments().length\n                });\n            };\n        },\n        _onFileUploadFailure: function(event, ca) {\n            this.inform(\"one-upload-failed\");\n        }\n    });\n    function ba(ca) {\n        if ((ca && x(ca, \"C:\\\\fakepath\\\\\"))) {\n            return ca.substring(12)\n        };\n        return ca;\n    };\n    e.exports = aa;\n});\n__d(\"JoinableConversationMessageFilter\", [\"MercuryLogMessageType\",\"MercuryThreads\",\"MercuryParticipants\",], function(a, b, c, d, e, f) {\n    var g = b(\"MercuryLogMessageType\"), h = b(\"MercuryThreads\").get(), i = b(\"MercuryParticipants\"), j = {\n        _isFilterable: function(k) {\n            var l = k.log_message_type;\n            if (!l) {\n                return false\n            };\n            if ((l == g.JOINABLE_JOINED)) {\n                return (k.log_message_data.joined_participant !== i.user)\n            };\n            if (((l == g.UNSUBSCRIBE) || (l == g.SUBSCRIBE))) {\n                var m = h.getThreadMetaNow(k.thread_id);\n                if ((m && m.is_joinable)) {\n                    return (k.author !== i.user)\n                };\n                return false;\n            }\n        ;\n            return false;\n        },\n        filterMessages: function(k, l, m) {\n            var n = [];\n            for (var o = 0; (o < l.length); o++) {\n                var p = l[o];\n                if (j._isFilterable(p)) {\n                    if (m) {\n                        k(p);\n                    };\n                }\n                 else n.push(p);\n            ;\n            };\n            return n;\n        }\n    };\n    e.exports = j;\n});\n__d(\"MercuryThreadMuter\", [\"AsyncDialog\",\"AsyncRequest\",\"Env\",\"MercuryThreads\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncDialog\"), h = b(\"AsyncRequest\"), i = b(\"Env\"), j = b(\"MercuryThreads\").get(), k = {\n        getUserIDEmail: function() {\n            return (i.user + \"@facebook.com\");\n        },\n        getThreadMuteSettingForUser: function(l) {\n            return (l.mute_settings && l.mute_settings[k.getUserIDEmail()]);\n        },\n        isThreadMuted: function(l) {\n            return (k.getThreadMuteSettingForUser(l) !== undefined);\n        },\n        showMuteChangeDialog: function(l, m) {\n            g.send(new h(\"/ajax/mercury/mute_thread_dialog.php\").setData({\n                muting: l\n            }), function(n) {\n                n.subscribe(\"confirm\", function() {\n                    this.hide();\n                    j.updateThreadMuteSetting(m, l);\n                }.bind(n));\n            });\n        }\n    };\n    e.exports = k;\n});\n__d(\"JoinStatusTabSheet\", [\"copyProperties\",\"DOM\",\"MercuryLogMessageType\",\"MercuryParticipants\",], function(a, b, c, d, e, f) {\n    var g = b(\"copyProperties\"), h = b(\"DOM\"), i = b(\"MercuryLogMessageType\"), j = b(\"MercuryParticipants\");\n    function k(l, m) {\n        this._rootElement = l;\n        this._messageQueue = [];\n        this._sheetView = m;\n    };\n    g(k.prototype, {\n        _setMessage: function(l, m) {\n            var n = l.author, o = l.log_message_type;\n            if ((o == i.JOINABLE_JOINED)) {\n                var p = l.log_message_data.joined_participant;\n                if ((p !== j.user)) {\n                    j.get(p, function(s) {\n                        h.setContent(m, h.tx._(\"{actor} joined the chat.\", {\n                            actor: s.name\n                        }));\n                    });\n                };\n            }\n             else if ((o == i.UNSUBSCRIBE)) {\n                if ((n !== j.user)) {\n                    j.get(n, function(s) {\n                        h.setContent(m, h.tx._(\"{actor} left the conversation.\", {\n                            actor: s.name\n                        }));\n                    });\n                };\n            }\n             else if ((o == i.SUBSCRIBE)) {\n                if ((n !== j.user)) {\n                    var q = l.log_message_data.added_participants;\n                    if ((q && (q.length > 0))) {\n                        var r = [n,q[0],];\n                        j.getMulti(r, function(s) {\n                            h.setContent(m, h.tx._(\"{actor} added {subscriber1}.\", {\n                                actor: s[n].name,\n                                subscriber1: s[q[0]].name\n                            }));\n                        });\n                    }\n                ;\n                }\n            \n            }\n            \n        ;\n        },\n        isPermanent: function() {\n            return false;\n        },\n        getCloseTimeout: function() {\n            return 2000;\n        },\n        getType: function() {\n            return \"join_status_type\";\n        },\n        addToQueue: function(l) {\n            this._messageQueue.push(l);\n            if ((this._messageQueue.length === 1)) {\n                this._open();\n            };\n        },\n        render: function() {\n            var l = this._messageQueue[0], m = this._getTemplate().build();\n            this._setMessage(l, m.getNode(\"text\"));\n            h.setContent(this._rootElement, m.getRoot());\n        },\n        _open: function() {\n            this._sheetView.open(this);\n        },\n        autoCloseCallback: function() {\n            this._messageQueue.shift();\n            if ((this._messageQueue.length > 0)) {\n                this._open();\n            };\n        },\n        couldNotReplace: function() {\n            this._open.bind(this).defer(this.getCloseTimeout(), false);\n        }\n    });\n    e.exports = k;\n});\n__d(\"WebMessengerEvents\", [\"Arbiter\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"copyProperties\"), i = h(new g(), {\n        MASTER_DOM_CHANGED: \"master-dom-changed\",\n        DETAIL_DOM_CHANGED: \"detail-dom-changed\",\n        FOCUS_COMPOSER: \"focus-composer\",\n        FOCUS_SEARCH: \"focus-search\",\n        FOCUS_AND_SELECT_SEARCH: \"focus-and-select-search\",\n        SUBMIT_REPLY: \"submit-reply\",\n        UPDATE_SELECTION: \"update-selection\",\n        masterDOMChanged: function() {\n            this.inform(i.MASTER_DOM_CHANGED);\n        },\n        detailDOMChanged: function() {\n            this.inform(i.DETAIL_DOM_CHANGED);\n        },\n        focusComposer: function() {\n            this.inform(i.FOCUS_COMPOSER);\n        },\n        focusSearch: function() {\n            this.inform(i.FOCUS_SEARCH);\n        },\n        focusAndSelectSearch: function() {\n            this.inform(i.FOCUS_AND_SELECT_SEARCH);\n        },\n        updateSelection: function(j) {\n            this.inform(i.UPDATE_SELECTION, j);\n        },\n        submitReply: function() {\n            this.inform(i.SUBMIT_REPLY);\n        }\n    });\n    e.exports = i;\n});\n__d(\"WebMessengerSubscriptionsHandler\", [\"SubscriptionsHandler\",], function(a, b, c, d, e, f) {\n    var g = b(\"SubscriptionsHandler\"), h = new g(\"webmessenger\");\n    e.exports = h;\n});\n__d(\"isWebMessengerURI\", [], function(a, b, c, d, e, f) {\n    function g(h) {\n        return (/^(\\/messages)/).test(h.getPath());\n    };\n    e.exports = g;\n});\n__d(\"WebMessengerWidthControl\", [\"Arbiter\",\"CSS\",\"CSSClassTransition\",\"DOMDimensions\",\"Event\",\"Style\",\"URI\",\"ViewportBounds\",\"WebMessengerEvents\",\"shield\",\"WebMessengerSubscriptionsHandler\",\"$\",\"cx\",\"isWebMessengerURI\",\"requestAnimationFrame\",\"throttle\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"CSS\"), i = b(\"CSSClassTransition\"), j = b(\"DOMDimensions\"), k = b(\"Event\"), l = b(\"Style\"), m = b(\"URI\"), n = b(\"ViewportBounds\"), o = b(\"WebMessengerEvents\"), p = b(\"shield\"), q = b(\"WebMessengerSubscriptionsHandler\"), r = b(\"$\"), s = b(\"cx\"), t = b(\"isWebMessengerURI\"), u = b(\"requestAnimationFrame\"), v = b(\"throttle\"), w = 205, x = 981, y = 257, z = 18, aa = 848, ba = 724, ca = 34096, da = 56, ea, fa, ga;\n    function ha(ma, na, oa) {\n        this.masterChanged = ma;\n        this.detailChaned = na;\n        q.addSubscriptions(k.listen(window, \"resize\", v(p(ia, this, this), 100)), g.subscribe([\"sidebar/initialized\",\"sidebar/show\",\"sidebar/hide\",], p(ia, this, this), g.SUBSCRIBE_NEW));\n        var pa = (la() ? da : 0);\n        if (oa) {\n            pa = w;\n        };\n        this._width = (la() ? 0 : aa);\n        ga = true;\n        ia(this, pa);\n    };\n    function ia(ma, na) {\n        var oa = (n.getRight() + n.getLeft());\n        oa = ((oa || na) || 0);\n        var pa = (j.getViewportWithoutScrollbarDimensions().width - oa), qa = Math.round(Math.max(0, ((pa / 2) - (x / 2))));\n        pa = ((x + qa) - y);\n        pa -= z;\n        pa = Math.max(ba, Math.min(aa, pa));\n        if ((!isNaN(pa) && (ma._width !== pa))) {\n            ma._width = pa;\n            var ra = Math.round((pa / ((1 + ca)))), sa = (pa - ra);\n            ma.masterChanged(sa);\n            ma.detailChaned(ra);\n            if (la()) {\n                var ta = (pa + y);\n                ja(function() {\n                    if (fa) {\n                        document.body.className = fa;\n                        fa = \"\";\n                    }\n                ;\n                    ka((ta + \"px\"));\n                    h.removeClass(document.body, \"_5262\");\n                    (ga && o.detailDOMChanged());\n                    ga = false;\n                }, fa);\n            }\n        ;\n        }\n    ;\n    };\n    function ja(ma, na) {\n        (na && h.addClass(document.documentElement, \"_5261\"));\n        u(ma);\n        (na && h.removeClass.curry(document.documentElement, \"_5261\").defer(1000, false));\n    };\n    function ka(ma) {\n        l.set(r(\"pageHead\"), \"width\", ma);\n        l.set(r(\"globalContainer\"), \"width\", ma);\n    };\n    function la() {\n        if (!ea) {\n            ea = h.hasClass(document.body, \"_6nw\");\n        };\n        return ea;\n    };\n    i.registerHandler(function(ma, na, oa, pa) {\n        function qa(ra) {\n            return (la() && t(m(ra)));\n        };\n        if (qa(pa)) {\n            fa = na;\n            return true;\n        }\n         else if (qa(oa)) {\n            ja(function() {\n                ma.className = na;\n                ka(\"\");\n            }, true);\n            return true;\n        }\n        \n    ;\n    });\n    e.exports = ha;\n});\n__d(\"TextInputControl\", [\"Event\",\"function-extensions\",\"Class\",\"DOMControl\",\"Input\",\"copyProperties\",\"debounce\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\");\n    b(\"function-extensions\");\n    var h = b(\"Class\"), i = b(\"DOMControl\"), j = b(\"Input\"), k = b(\"copyProperties\"), l = b(\"debounce\");\n    function m(n) {\n        this.parent.construct(this, n);\n        var o = this.getRoot(), p = l(this.update.bind(this), 0);\n        g.listen(o, {\n            input: p,\n            keydown: p,\n            paste: p\n        });\n    };\n    h.extend(m, i);\n    k(m.prototype, {\n        setMaxLength: function(n) {\n            j.setMaxLength(this.getRoot(), n);\n            return this;\n        },\n        getValue: function() {\n            return j.getValue(this.getRoot());\n        },\n        isEmpty: function() {\n            return j.isEmpty(this.getRoot());\n        },\n        setValue: function(n) {\n            j.setValue(this.getRoot(), n);\n            this.update();\n            return this;\n        },\n        clear: function() {\n            return this.setValue(\"\");\n        },\n        setPlaceholderText: function(n) {\n            j.setPlaceholder(this.getRoot(), n);\n            return this;\n        }\n    });\n    e.exports = m;\n});\n__d(\"TextMetrics\", [\"Event\",\"DOM\",\"Style\",\"UserAgent\",\"debounce\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"DOM\"), i = b(\"Style\"), j = b(\"UserAgent\"), k = b(\"debounce\"), l;\n    function m() {\n        if ((typeof l === \"undefined\")) {\n            var o = h.create(\"div\", {\n                className: \"webkitZoomTest\"\n            }), p = function() {\n                h.appendContent(document.body, o);\n                l = (100 / o.clientHeight);\n                h.remove(o);\n            };\n            g.listen(window, \"resize\", k(p, 100));\n            p();\n        }\n    ;\n        return l;\n    };\n    function n(o, p) {\n        this._node = o;\n        this._flexible = !!p;\n        var q = \"textarea\", r = \"textMetrics\";\n        if (this._flexible) {\n            q = \"div\";\n            r += \" textMetricsInline\";\n        }\n    ;\n        this._shadow = h.create(q, {\n            className: r\n        });\n        var s = [\"fontSize\",\"fontStyle\",\"fontWeight\",\"fontFamily\",\"wordWrap\",];\n        s.forEach(function(u) {\n            i.set(this._shadow, u, i.get(o, u));\n        }.bind(this));\n        var t = i.get(o, \"lineHeight\");\n        if ((j.chrome() || j.webkit())) {\n            t = (Math.round((parseInt(t, 10) * m())) + \"px\");\n        };\n        i.set(this._shadow, \"lineHeight\", t);\n        document.body.appendChild(this._shadow);\n    };\n    n.prototype.measure = function(o) {\n        var p = this._node, q = this._shadow;\n        o = (((o || p.value)) + \"...\");\n        if (!this._flexible) {\n            var r = ((p.clientWidth - i.getFloat(p, \"paddingLeft\")) - i.getFloat(p, \"paddingRight\"));\n            i.set(q, \"width\", (Math.max(r, 0) + \"px\"));\n        }\n    ;\n        h.setContent(q, o);\n        return {\n            width: q.scrollWidth,\n            height: q.scrollHeight\n        };\n    };\n    n.prototype.destroy = function() {\n        h.remove(this._shadow);\n    };\n    e.exports = n;\n});\n__d(\"TextAreaControl\", [\"Event\",\"Arbiter\",\"ArbiterMixin\",\"Class\",\"CSS\",\"DOMControl\",\"Style\",\"TextInputControl\",\"TextMetrics\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"Arbiter\"), i = b(\"ArbiterMixin\"), j = b(\"Class\"), k = b(\"CSS\"), l = b(\"DOMControl\"), m = b(\"Style\"), n = b(\"TextInputControl\"), o = b(\"TextMetrics\"), p = b(\"copyProperties\");\n    function q(s, t) {\n        return (m.getFloat(s, t) || 0);\n    };\n    function r(s) {\n        this.autogrow = k.hasClass(s, \"uiTextareaAutogrow\");\n        this.parent.construct(this, s);\n        this.width = null;\n        g.listen(s, \"focus\", this._handleFocus.bind(this));\n    };\n    j.extend(r, n);\n    p(r.prototype, i, {\n        setAutogrow: function(s) {\n            this.autogrow = s;\n            return this;\n        },\n        onupdate: function() {\n            this.parent.onupdate();\n            if (this.autogrow) {\n                var s = this.getRoot();\n                if (!this.metrics) {\n                    this.metrics = new o(s);\n                };\n                if ((typeof this.initialHeight === \"undefined\")) {\n                    this.isBorderBox = (((m.get(s, \"box-sizing\") === \"border-box\") || (m.get(s, \"-moz-box-sizing\") === \"border-box\")) || (m.get(s, \"-webkit-box-sizing\") === \"border-box\"));\n                    this.borderBoxOffset = (((q(s, \"padding-top\") + q(s, \"padding-bottom\")) + q(s, \"border-top-width\")) + q(s, \"border-bottom-width\"));\n                    this.initialHeight = (s.offsetHeight - this.borderBoxOffset);\n                }\n            ;\n                var t = this.metrics.measure(), u = Math.max(this.initialHeight, t.height);\n                if (this.isBorderBox) {\n                    u += this.borderBoxOffset;\n                };\n                if ((u !== this.height)) {\n                    this.height = u;\n                    m.set(s, \"height\", (u + \"px\"));\n                    h.inform(\"reflow\");\n                    this.inform(\"resize\");\n                }\n            ;\n            }\n             else if (this.metrics) {\n                this.metrics.destroy();\n                this.metrics = null;\n            }\n            \n        ;\n        },\n        resetHeight: function() {\n            this.height = -1;\n            this.update();\n        },\n        _handleFocus: function() {\n            this.width = null;\n        }\n    });\n    r.getInstance = function(s) {\n        return (l.getInstance(s) || new r(s));\n    };\n    e.exports = r;\n});\n__d(\"MessagesEmoticonView\", [\"DOM\",\"EmoticonsList\",\"Event\",\"Focus\",\"InputSelection\",\"Keys\",\"Parent\",\"SubscriptionsHandler\",\"TextAreaControl\",\"Toggler\",\"copyProperties\",\"endsWith\",\"startsWith\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOM\"), h = b(\"EmoticonsList\"), i = b(\"Event\"), j = b(\"Focus\"), k = b(\"InputSelection\"), l = b(\"Keys\"), m = b(\"Parent\"), n = b(\"SubscriptionsHandler\"), o = b(\"TextAreaControl\"), p = b(\"Toggler\"), q = b(\"copyProperties\"), r = b(\"endsWith\"), s = b(\"startsWith\"), t = h.symbols;\n    function u(w, x, y) {\n        var z = m.byClass(w, \"emoticon\");\n        if (!z) {\n            return\n        };\n        var aa = \"emoticon_\", ba = null;\n        z.className.split(\" \").forEach(function(ia) {\n            if (s(ia, aa)) {\n                ba = ia.substring(aa.length);\n            };\n        });\n        if (!t[ba]) {\n            return\n        };\n        var ca = o.getInstance(x), da = ca.getValue(), ea = t[ba], fa = da.substring(0, y.start), ga = da.substring(y.end);\n        if (((y.start > 0) && !r(fa, \" \"))) {\n            ea = (\" \" + ea);\n        };\n        if (!s(ga, \" \")) {\n            ea += \" \";\n        };\n        var ha = ((fa + ea) + ga);\n        y.start += ea.length;\n        y.end = y.start;\n        ca.setValue(ha);\n        k.set(x, y.start, y.end);\n        return true;\n    };\n    function v(w, x) {\n        var y = {\n            start: 0,\n            end: 0\n        };\n        function z() {\n            y = k.get(x);\n        };\n        var aa = g.find(w, \".uiToggleFlyout\");\n        this._subscriptions = new n();\n        this._subscriptions.addSubscriptions(p.subscribe(\"show\", function(ba, ca) {\n            if ((ca.active && g.contains(w, ca.active))) {\n                k.set(x, y.start, y.end);\n                var da = g.scry(aa, \"a.emoticon\")[0];\n                j.setWithoutOutline(da);\n            }\n        ;\n        }), i.listen(aa, \"click\", function(event) {\n            var ba = u(event.getTarget(), x, y);\n            (ba && p.hide(w));\n        }), i.listen(aa, \"keyup\", function(event) {\n            if ((event.keyCode === l.ESC)) {\n                p.hide(w);\n                k.set(x, y.start, y.end);\n            }\n        ;\n        }), i.listen(x, \"keyup\", z), i.listen(x, \"click\", z));\n    };\n    q(v.prototype, {\n        destroy: function() {\n            this._subscriptions.release();\n            this._subscriptions = null;\n        }\n    });\n    q(v, {\n        create: function(w, x) {\n            return new v(w, x);\n        }\n    });\n    e.exports = v;\n});\n__d(\"MercuryTypingReceiver\", [\"Arbiter\",\"ChannelConstants\",\"MercuryActionTypeConstants\",\"MercuryParticipants\",\"MercuryPayloadSource\",\"MercuryServerRequests\",\"MercuryThreads\",\"TypingDetector\",\"setTimeoutAcrossTransitions\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ChannelConstants\"), i = b(\"MercuryActionTypeConstants\"), j = b(\"MercuryParticipants\"), k = b(\"MercuryPayloadSource\"), l = b(\"MercuryServerRequests\").get(), m = b(\"MercuryThreads\").get(), n = b(\"TypingDetector\"), o = b(\"setTimeoutAcrossTransitions\"), p, q = {\n    }, r = 30000, s = new g();\n    function t(y) {\n        var z = (q[y] || {\n        }), aa = Object.keys(z);\n        aa.sort(function(ba, ca) {\n            return (z[ba] - z[ca]);\n        });\n        return aa;\n    };\n    function u() {\n        p = null;\n        var y = Date.now(), z = {\n        }, aa = false;\n        for (var ba in q) {\n            var ca = false;\n            for (var da in (q[ba] || {\n            })) {\n                if ((q[ba][da] < (y - r))) {\n                    delete q[ba][da];\n                    ca = true;\n                }\n                 else aa = true;\n            ;\n            };\n            if (ca) {\n                z[ba] = t(ba);\n            };\n        };\n        for (var ea in z) {\n            s.inform(\"state-changed\", z);\n            break;\n        };\n        if (aa) {\n            p = o(u, 3000);\n        };\n    };\n    function v(y, z) {\n        if ((y in q)) {\n            if ((z in q[y])) {\n                delete q[y][z];\n                w(y);\n            }\n        \n        };\n    };\n    function w(y) {\n        var z = {\n        };\n        z[y] = t(y);\n        s.inform(\"state-changed\", z);\n    };\n    function x(y) {\n        if (y.thread) {\n            return l.getClientThreadIDNow(y.thread)\n        };\n        if ((y.type === \"typ\")) {\n            return m.getThreadIdForUser(y.from)\n        };\n        return null;\n    };\n    g.subscribe([h.getArbiterType(\"typ\"),h.getArbiterType(\"ttyp\"),], function(y, z) {\n        var aa = z.obj, ba = x(aa);\n        if (ba) {\n            var ca = j.getIDForUser(aa.from);\n            if ((aa.st == n.TYPING)) {\n                q[ba] = (q[ba] || {\n                });\n                var da = q[ba][ca];\n                q[ba][ca] = Date.now();\n                if (!p) {\n                    p = o(u, 3000);\n                };\n                (!da && w(ba));\n            }\n             else if ((aa.st == n.INACTIVE)) {\n                v(ba, ca);\n            }\n        ;\n        }\n    ;\n    });\n    l.subscribe(\"update-typing-state\", function(y, z) {\n        var aa = z.payload_source;\n        if (((aa != k.CLIENT_CHANNEL_MESSAGE) && (aa != k.SERVER_ZAP))) {\n            return\n        };\n        var ba = z.actions;\n        if ((!ba || !ba.length)) {\n            return\n        };\n        var ca = i.USER_GENERATED_MESSAGE;\n        ba.forEach(function(da) {\n            if (((da.action_type == ca) && (da.author != j.user))) {\n                v(da.thread_id, da.author);\n            };\n        });\n    });\n    e.exports = s;\n});\n__d(\"formatUnixTimestamp\", [\"formatDate\",], function(a, b, c, d, e, f) {\n    var g = b(\"formatDate\");\n    function h(i, j, k, l) {\n        var m = new Date((i * 1000));\n        return g(m, j, k, l);\n    };\n    e.exports = h;\n});\n__d(\"MercuryIndicatorController\", [\"ArbiterMixin\",\"DOM\",\"MercuryActionTypeConstants\",\"MercuryConfig\",\"MercuryDelayedRoger\",\"MercuryMessageSourceTags\",\"MercuryParticipants\",\"MercuryRoger\",\"MercuryThreads\",\"MercuryTypingReceiver\",\"DateFormatConfig\",\"arrayContains\",\"copyProperties\",\"formatUnixTimestamp\",\"removeFromArray\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"ArbiterMixin\"), h = b(\"DOM\"), i = b(\"MercuryActionTypeConstants\"), j = b(\"MercuryConfig\"), k = b(\"MercuryDelayedRoger\"), l = b(\"MercuryMessageSourceTags\"), m = b(\"MercuryParticipants\"), n = b(\"MercuryRoger\"), o = b(\"MercuryThreads\").get(), p = b(\"MercuryTypingReceiver\"), q = b(\"DateFormatConfig\"), r = b(\"arrayContains\"), s = b(\"copyProperties\"), t = b(\"formatUnixTimestamp\"), u = b(\"removeFromArray\"), v = b(\"tx\"), w = [];\n    function x(y) {\n        this._threadID = y;\n        this._canonicalUser = o.getCanonicalUserInThread(y);\n        w.push(this);\n    };\n    s(x.prototype, g, {\n        destroy: function() {\n            u(w, this);\n        },\n        setLastMessage: function(y) {\n            this._lastMsg = y;\n            this._handleStateChange();\n        },\n        _informStateChanged: function(y) {\n            if (((y.activity == \"none\") && (this._currentActivity == \"none\"))) {\n                return\n            };\n            if ((this._lastMsg && m.isAuthor(this._lastMsg.author))) {\n                y.self_authored = true;\n            };\n            this._currentActivity = y.activity;\n            this.inform(\"state-changed\", y);\n        },\n        _notifySentFrom: function() {\n            var y, z, aa = this._lastMsg.location_text, ba = (this._lastMsg.source_tags || []);\n            if (aa) {\n                y = v._(\"Sent from {location}\", {\n                    location: aa\n                });\n                z = \"sentFromMobile\";\n            }\n             else if (r(ba, l.MESSENGER)) {\n                y = h.create(\"a\", {\n                    href: \"/mobile/messenger\",\n                    class: \"fcg\",\n                    target: \"_blank\"\n                }, \"Sent from Messenger\");\n                z = \"sentFromMobile\";\n            }\n             else if (r(ba, l.MOBILE)) {\n                y = h.create(\"a\", {\n                    href: \"/mobile\",\n                    class: \"fcg\",\n                    target: \"_blank\"\n                }, \"Sent from Mobile\");\n                z = \"sentFromMobile\";\n            }\n             else if (r(ba, l.EMAIL)) {\n                y = \"Sent from email\";\n                z = \"sentFromEmail\";\n            }\n             else {\n                this._informStateChanged({\n                    activity: \"none\"\n                });\n                return;\n            }\n            \n            \n            \n        ;\n            this._informStateChanged({\n                activity: z,\n                text: y\n            });\n        },\n        _notifySeenTimestamp: function(y) {\n            var z = (n.getSeenTimestamp(this._threadID, y[0]) * 44405), aa = (Date.now() * 44424);\n            if ((z < (aa - 518400))) {\n                ba = \"M j\";\n            }\n             else if ((z < (aa - 86400))) {\n                ba = \"D g:ia\";\n            }\n             else ba = \"g:ia\";\n            \n        ;\n            var ba = (q.formats[ba] || ba), ca = t(z, ba, false, true);\n            this._informStateChanged({\n                activity: \"seen-timestamp\",\n                text: v._(\"Seen {timestamp}\", {\n                    timestamp: ca\n                })\n            });\n        },\n        _checkNamesForCollision: function(y, z) {\n            var aa = false;\n            m.getMulti(y, function(ba) {\n                function ca(fa) {\n                    if ((typeof ba[fa] !== \"undefined\")) {\n                        return ba[fa].short_name.toLowerCase();\n                    }\n                     else return fa\n                ;\n                };\n                var da = z.map(ca), ea = y.map(ca);\n                aa = da.some(function(fa) {\n                    return (ea.indexOf(fa) !== ea.lastIndexOf(fa));\n                });\n            });\n            return aa;\n        },\n        _notifySeenBy: function(y) {\n            var z = this._lastMsg, aa = true;\n            m.getMulti(y, function(ba) {\n                aa = false;\n                if ((this._lastMsg != z)) {\n                    return\n                };\n                var ca = o.getThreadMetaNow(this._threadID), da = (ca ? ca.participants.length : 0), ea = (y.length + ((z.author != m.user))), fa, ga = false, ha = false, ia = ((da > 2) && (ea >= (da - 1)));\n                if ((!(ia) && (da > 0))) {\n                    ha = this._checkNamesForCollision(ca.participants, y);\n                };\n                if (ia) {\n                    fa = \"Seen by everyone\";\n                }\n                 else if ((y.length == 1)) {\n                    fa = v._(\"Seen by {user}\", {\n                        user: ba[y[0]].short_name\n                    });\n                }\n                 else if ((y.length == 2)) {\n                    fa = v._(\"Seen by {user1}, {user2}\", {\n                        user1: ba[y[0]].short_name,\n                        user2: ba[y[1]].short_name\n                    });\n                }\n                 else if ((y.length == 3)) {\n                    fa = v._(\"Seen by {user1}, {user2}, {user3}\", {\n                        user1: ba[y[0]].short_name,\n                        user2: ba[y[1]].short_name,\n                        user3: ba[y[2]].short_name\n                    });\n                }\n                 else if ((y.length > 3)) {\n                    var ja = (Object.keys(ba).length - 2), ka = v._(\"{num} more\", {\n                        num: ja\n                    }), la = h.create(\"span\", {\n                        className: \"more\"\n                    }, ka);\n                    fa = h.tx._(\"Seen by {user1}, {user2}, {=num more link}\", {\n                        user1: ba[y[0]].short_name,\n                        user2: ba[y[1]].short_name,\n                        \"=num more link\": la\n                    });\n                    ga = true;\n                }\n                \n                \n                \n                \n            ;\n                ga = (ga || ha);\n                this._informStateChanged({\n                    activity: \"seen-by\",\n                    text: fa,\n                    seenBy: y,\n                    hasNameCollision: ha,\n                    tooltip: ga\n                });\n            }.bind(this));\n            (aa && this._informStateChanged({\n                activity: \"none\"\n            }));\n        },\n        _notifyTyping: function(y) {\n            var z = this._lastMsg, aa = true;\n            m.getMulti(y, function(ba) {\n                aa = false;\n                if ((this._lastMsg != z)) {\n                    return\n                };\n                if ((this._canonicalUser || j.ChatMultiTypGK)) {\n                    var ca = o.getThreadMetaNow(this._threadID), da = (ca ? ca.participants.length : 0), ea, fa = false;\n                    if (((da > 2) && (y.length >= (da - 1)))) {\n                        ea = \"Everyone is typing...\";\n                    }\n                     else if ((y.length == 1)) {\n                        ea = v._(\"{name} is typing...\", {\n                            name: ba[y[0]].short_name\n                        });\n                    }\n                     else if ((y.length == 2)) {\n                        ea = v._(\"{user1} and {user2} are typing...\", {\n                            user1: ba[y[0]].short_name,\n                            user2: ba[y[1]].short_name\n                        });\n                    }\n                     else if ((y.length == 3)) {\n                        ea = v._(\"{user1}, {user2}, and {user3} are typing...\", {\n                            user1: ba[y[0]].short_name,\n                            user2: ba[y[1]].short_name,\n                            user3: ba[y[2]].short_name\n                        });\n                    }\n                     else if ((y.length > 3)) {\n                        var ga = (Object.keys(ba).length - 2), ha = v._(\"{num} more\", {\n                            num: ga\n                        }), ia = h.create(\"a\", {\n                            href: \"#\"\n                        }, ha);\n                        ea = h.tx._(\"{user1}, {user2}, and {=num more link} are typing...\", {\n                            user1: ba[y[0]].short_name,\n                            user2: ba[y[1]].short_name,\n                            \"=num more link\": ia\n                        });\n                        fa = true;\n                    }\n                    \n                    \n                    \n                    \n                ;\n                    this._informStateChanged({\n                        activity: \"typing\",\n                        text: ea,\n                        typing: y,\n                        tooltip: fa\n                    });\n                }\n            ;\n            }.bind(this));\n            (aa && this._informStateChanged({\n                activity: \"none\"\n            }));\n        },\n        _handleStateChange: function() {\n            var y = i.LOG_MESSAGE;\n            if ((!this._lastMsg || (this._lastMsg.action_type == y))) {\n                this._informStateChanged({\n                    activity: \"none\"\n                });\n                return;\n            }\n        ;\n            if ((this._typing && this._typing.length)) {\n                this._notifyTyping(this._typing);\n                return;\n            }\n        ;\n            if ((this._canonicalUser && (this._lastMsg.author != m.user))) {\n                this._notifySentFrom();\n                return;\n            }\n        ;\n            var z = k.getSeenBy(this._threadID, true);\n            if (z.length) {\n                if (this._canonicalUser) {\n                    this._notifySeenTimestamp(z);\n                    return;\n                }\n                 else {\n                    this._notifySeenBy(z);\n                    return;\n                }\n            \n            };\n            this._informStateChanged({\n                activity: \"none\"\n            });\n        }\n    });\n    p.subscribe(\"state-changed\", function(y, z) {\n        w.forEach(function(aa) {\n            var ba = z[aa._threadID];\n            if ((ba !== undefined)) {\n                aa._typing = ba;\n                aa._handleStateChange();\n            }\n        ;\n        });\n    });\n    k.subscribe(\"state-changed\", function(y, z) {\n        w.forEach(function(aa) {\n            (z[aa._threadID] && aa._handleStateChange());\n        });\n    });\n    e.exports = x;\n});\n__d(\"MercuryLastMessageIndicator\", [\"CSS\",\"MercuryIndicatorController\",\"DOM\",\"MercuryParticipants\",\"Tooltip\",\"copyProperties\",\"csx\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSS\"), h = b(\"MercuryIndicatorController\"), i = b(\"DOM\"), j = b(\"MercuryParticipants\"), k = b(\"Tooltip\"), l = b(\"copyProperties\"), m = b(\"csx\"), n = b(\"cx\");\n    function o(p, q, r, s) {\n        this._lastMessageIndicator = q;\n        this._hideTyping = (r || false);\n        this._messagesView = s;\n        this._controller = new h(p);\n        this._subscription = this._controller.subscribe(\"state-changed\", this._handleStateChanged.bind(this));\n    };\n    l(o.prototype, {\n        destroy: function() {\n            this._setClass(null);\n            this._subscription.unsubscribe();\n            this._controller.destroy();\n        },\n        setLastMessage: function(p) {\n            this._controller.setLastMessage(p);\n        },\n        _handleStateChanged: function(p, q) {\n            var r = this._messagesView.isScrolledToBottom();\n            this._rerender(q);\n            (r && this._messagesView.scrollToBottom());\n        },\n        _rerender: function(p) {\n            if ((p.activity == \"none\")) {\n                this._setClass(null);\n                return;\n            }\n        ;\n            if ((this._hideTyping && (p.activity == \"typing\"))) {\n                this._setClass(null);\n                return;\n            }\n        ;\n            g.conditionClass(this._lastMessageIndicator, \"_510e\", p.self_authored);\n            var q = i.find(this._lastMessageIndicator, \"._510f\");\n            if (p.text) {\n                i.setContent(q, p.text);\n            }\n             else i.empty(q);\n        ;\n            if ((p.activity.substring(0, 4) == \"seen\")) {\n                this._setClass(\"seen\");\n                if (((p.activity == \"seen-by\") && p.tooltip)) {\n                    j.getMulti(p.seenBy, function(r) {\n                        var s = i.create(\"div\");\n                        for (var t in r) {\n                            var u = i.create(\"div\");\n                            i.setContent(u, r[t].name);\n                            i.appendContent(s, u);\n                        };\n                        var v = p.hasNameCollision, w;\n                        if (v) {\n                            w = this._lastMessageIndicator;\n                        }\n                         else w = i.find(this._lastMessageIndicator, \"span.more\");\n                    ;\n                        k.set(w, s, \"above\", \"center\");\n                    }.bind(this));\n                }\n                 else k.remove(this._lastMessageIndicator);\n            ;\n            }\n             else this._setClass(p.activity);\n        ;\n        },\n        _setClass: function(p) {\n            if ((this._lastClass === p)) {\n                return\n            };\n            (this._lastClass && g.removeClass(this._lastMessageIndicator, this._lastClass));\n            (p && g.addClass(this._lastMessageIndicator, p));\n            this._lastClass = p;\n        }\n    });\n    e.exports = o;\n});\n__d(\"MercuryStateCheck\", [\"Arbiter\",\"ChannelConstants\",\"MercuryFolders\",\"MessagingTag\",\"MercuryServerRequests\",\"URI\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ChannelConstants\"), i = b(\"MercuryFolders\"), j = b(\"MessagingTag\"), k = b(\"MercuryServerRequests\").get(), l = b(\"URI\"), m = b(\"copyProperties\"), n = m(new g(), {\n        initialize: function() {\n            g.subscribe(h.ON_INVALID_HISTORY, o);\n            d([\"ChannelConnection\",], function(p) {\n                p.subscribe(p.CONNECTED, function(q, r) {\n                    if (!r.init) {\n                        o();\n                    };\n                });\n            });\n        }\n    });\n    function o() {\n        var p;\n        if ((l.getRequestURI().getPath().search(/messages/) !== -1)) {\n            p = i.getSupportedFolders();\n        }\n         else p = [j.INBOX,];\n    ;\n        k.fetchMissedMessages(p);\n    };\n    n.initialize();\n    e.exports = n;\n});\n__d(\"MercuryAttachmentRenderer\", [\"MercuryAttachmentTemplates\",\"MercuryAttachmentAudioClip.react\",\"CSS\",\"MercuryConstants\",\"DOM\",\"Image.react\",\"JSXDOM\",\"MercuryAttachment\",\"MercuryAttachmentType\",\"MercuryMessages\",\"MercuryParticipants\",\"React\",\"Style\",\"URI\",\"UserAgent\",\"cx\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"MercuryAttachmentTemplates\"), h = b(\"MercuryAttachmentAudioClip.react\"), i = b(\"CSS\"), j = b(\"MercuryConstants\"), k = b(\"DOM\"), l = b(\"Image.react\"), m = b(\"JSXDOM\"), n = b(\"MercuryAttachment\"), o = b(\"MercuryAttachmentType\"), p = b(\"MercuryMessages\").get(), q = b(\"MercuryParticipants\"), r = b(\"React\"), s = b(\"Style\"), t = b(\"URI\"), u = b(\"UserAgent\"), v = b(\"cx\"), w = b(\"tx\"), x = (u.ie() <= 8);\n    function y(ba, ca) {\n        var da = g[ca].build().setNodeContent(\"filename\", ba.name), ea = da.getNode(\"link\");\n        ea.setAttribute(\"href\", ba.url);\n        (ba.rel && ea.setAttribute(\"rel\", ba.rel));\n        i.addClass(da.getRoot(), n.getAttachIconClass(ba.icon_type));\n        return da;\n    };\n    function z(ba, ca) {\n        var da = g[ca].build().setNodeContent(\"filename\", ba.name);\n        i.addClass(da.getRoot(), n.getAttachIconClass(ba.icon_type));\n        return da;\n    };\n    var aa = {\n        renderAttachment: function(ba, ca, da, ea, fa) {\n            var ga = 100, ha = (ba ? 160 : 400), ia = ca.attach_type, ja = null, ka = null, la = true, ma = j.MercurySupportedShareType;\n            if ((ia == o.ERROR)) {\n                ja = aa.renderError(ca);\n            };\n            if (((!ba && (ia == o.SHARE)) && ca.share_xhp)) {\n                ka = aa.renderShareXHP(ca, da.id);\n            };\n            if ((ia == o.STICKER)) {\n                la = false;\n                ka = aa.renderSticker(ca);\n            }\n        ;\n            if ((!ka && (ia == o.SHARE))) {\n                var na = ca.share_data_type;\n                switch (na) {\n                  case ma.FB_PHOTO:\n                    ka = aa.renderPreview(ca, da, ea, fa);\n                    break;\n                  case ma.FB_VIDEO:\n                    ka = aa.renderVideoThumb(ca);\n                    break;\n                  case ma.FB_MUSIC_ALBUM:\n                \n                  case ma.FB_SONG:\n                \n                  case ma.FB_PLAYLIST:\n                \n                  case ma.FB_MUSICIAN:\n                \n                  case ma.FB_RADIO_STATION:\n                    ka = aa.renderMusic(ca);\n                    break;\n                  case ma.EXTERNAL:\n                \n                  case ma.FB_TEMPLATE:\n                \n                  case ma.FB_COUPON:\n                \n                  case ma.FB_SOCIAL_REPORT_PHOTO:\n                    ka = aa.renderExternalLink(ca);\n                    break;\n                  default:\n                    if (ca.name) {\n                        ka = aa.renderShareLink(ca, (da && da.id), ba);\n                    };\n                    break;\n                };\n            }\n        ;\n            if ((!ka && ca.preview_loading)) {\n                ka = aa.renderPreview(null);\n            };\n            if ((!ka && ca.preview_url)) {\n                ka = aa.renderPreview(ca, da, ea, fa);\n            };\n            if ((!ka && (ia == o.FILE))) {\n                if ((ca.metadata && (ca.metadata.type == j.MercuryAttachmentAudioClip))) {\n                    ka = k.create(\"div\");\n                    var oa = aa.renderAudioClip(ca, da.message_id, ga, ha);\n                    r.renderComponent(oa, ka);\n                }\n                 else ka = (ba ? aa.renderFileLink(ca) : aa.renderExtendedFileLink(ca));\n            \n            };\n            return {\n                error: ja,\n                content: ka,\n                bubblePreferred: la\n            };\n        },\n        renderError: function(ba) {\n            var ca = g[\":fb:mercury:attachment:error\"].build();\n            k.appendContent(ca.getNode(\"error\"), ba.error_msg);\n            return ca.getRoot();\n        },\n        renderExternalLink: function(ba) {\n            var ca = g[\":fb:mercury:attachment:external-link\"].build().setNodeContent(\"name\", ba.name);\n            (ba.base_url && ca.setNodeContent(\"shortLink\", ba.base_url));\n            var da = ca.getNode(\"preview\"), ea = ca.getNode(\"image-link\");\n            ea.setAttribute(\"href\", ba.url);\n            (ba.rel && ea.setAttribute(\"rel\", ba.rel));\n            if (ba.preview_url) {\n                var fa = ca.getNode(\"preview-image\");\n                fa.setAttribute(\"src\", ba.preview_url);\n                i.addClass(da, ba.preview_class);\n                i.show(fa);\n            }\n             else {\n                i.addClass(ca.getRoot(), \"noMedia\");\n                i.hide(da);\n            }\n        ;\n            ca.getNode(\"name\").setAttribute(\"href\", ba.url);\n            d([\"LinkshimHandler\",], function(ga) {\n                ga.setUpLinkshimHandling(ca.getNode(\"name\"));\n                ga.setUpLinkshimHandling(ca.getNode(\"image-link\"));\n            });\n            if (ba.rel) {\n                ca.getNode(\"name\").setAttribute(\"rel\", ba.rel);\n            };\n            return ca.getRoot();\n        },\n        renderFileLink: function(ba) {\n            var ca = null;\n            if ((ba.url === \"\")) {\n                ca = \":fb:mercury:attachment:file-name\";\n                return z(ba, ca).getRoot();\n            }\n             else {\n                ca = \":fb:mercury:attachment:file-link\";\n                return y(ba, ca).getRoot();\n            }\n        ;\n        },\n        renderAudioClip: function(ba, ca, da, ea) {\n            var fa = (ba.metadata.duration / 1000), ga = 200;\n            if ((da && ea)) {\n                if ((fa < 5)) {\n                    ga = da;\n                }\n                 else ga = ((((1 - Math.pow(10, (((fa - 5)) / -30)))) * ((ea - da))) + da);\n            \n            };\n            return h({\n                src: ba.url,\n                duration: (ba.metadata.duration / 1000),\n                showHelp: false,\n                width: ga\n            });\n        },\n        renderExtendedFileLink: function(ba) {\n            var ca = null;\n            if ((ba.url === \"\")) {\n                ca = \":fb:mercury:attachment:file-name\";\n                return z(ba, ca).getRoot();\n            }\n        ;\n            var ca = \":fb:mercury:attachment:extended-file-link\", da = y(ba, ca);\n            if (ba.open_url) {\n                var ea = da.getNode(\"openLinkContainer\");\n                i.show(ea);\n                var fa = da.getNode(\"openFile\");\n                fa.setAttribute(\"href\", ba.open_url);\n            }\n        ;\n            var ga = da.getNode(\"downloadFile\");\n            ga.setAttribute(\"href\", ba.url);\n            (ba.rel && ga.setAttribute(\"rel\", ba.rel));\n            return da.getRoot();\n        },\n        renderMusic: function(ba) {\n            var ca = g[\":fb:mercury:attachment:music\"].build().setNodeContent(\"filename\", ba.name), da = ca.getNode(\"link\");\n            da.setAttribute(\"href\", ba.url);\n            da.setAttribute(\"target\", \"_blank\");\n            (ba.rel && da.setAttribute(\"rel\", ba.rel));\n            var ea = ca.getNode(\"image-link\");\n            ea.setAttribute(\"href\", ba.url);\n            (ba.rel && ea.setAttribute(\"rel\", ba.rel));\n            var fa = ca.getNode(\"preview-image\");\n            fa.setAttribute(\"src\", ba.preview_url);\n            i.show(fa);\n            i.addClass(ca.getNode(\"icon_link\"), \"MercuryMusicIcon\");\n            return ca.getRoot();\n        },\n        resizeContain: function(ba, ca) {\n            var da = (ba.width / ba.height), ea = (ca.width / ca.height);\n            if ((ea < da)) {\n                return {\n                    width: Math.min((ba.height * ea), ca.width),\n                    height: Math.min(ba.height, ca.height)\n                };\n            }\n             else return {\n                width: Math.min(ba.width, ca.width),\n                height: Math.min((ba.width / ea), ca.height)\n            }\n        ;\n        },\n        renderPreview: function(ba, ca, da, ea) {\n            var fa = g[\":fb:mercury:attachment:preview\"].build(), ga = fa.getNode(\"image-link\");\n            if (ba) {\n                (ba.url && ga.setAttribute(\"href\", ba.url));\n                (ba.rel && ga.setAttribute(\"rel\", ba.rel));\n                var ha;\n                if (ba.preview_uploading) {\n                    i.addClass(ga, \"_57jm\");\n                    if ((da >= 176)) {\n                        ha = \"/images/photos/dots_large.png\";\n                    }\n                     else if ((da >= 86)) {\n                        ha = \"/images/photos/dots_medium.png\";\n                    }\n                     else ha = \"/images/photos/dots_small.png\";\n                    \n                ;\n                    s.set(ga, \"width\", (da + \"px\"));\n                    s.set(ga, \"max-width\", (da + \"px\"));\n                    if ((ba.preview_width && ba.preview_height)) {\n                        s.set(ga, \"padding-bottom\", (((((ba.preview_height / ba.preview_width)) * 100)) + \"%\"));\n                    };\n                }\n                 else if ((ba.metadata && ba.metadata.fbid)) {\n                    ha = t(\"/ajax/mercury/attachments/photo.php\").addQueryData({\n                        fbid: ba.metadata.fbid,\n                        mode: ea,\n                        width: da,\n                        height: da\n                    }).toString();\n                }\n                 else ha = t(ba.preview_url).addQueryData({\n                    mode: ea,\n                    width: da,\n                    height: da\n                }).toString();\n                \n            ;\n                var ia = fa.getNode(\"preview-image\");\n                if (ha) {\n                    if ((((ea === \"contain\") && ba.preview_width) && ba.preview_height)) {\n                        var ja = aa.resizeContain({\n                            width: da,\n                            height: da\n                        }, {\n                            width: ba.preview_width,\n                            height: ba.preview_height\n                        });\n                        ia.setAttribute(\"width\", ja.width);\n                        ia.setAttribute(\"height\", ja.height);\n                    }\n                ;\n                    if ((ba.preview_uploading || (((ea === \"cover\") && !x)))) {\n                        i.addClass(ga, \"_55pj\");\n                        s.set(ga, \"backgroundImage\", ((\"url(\" + ha) + \")\"));\n                    }\n                     else {\n                        ia.onload = function() {\n                            ia.removeAttribute(\"width\");\n                            ia.removeAttribute(\"height\");\n                        };\n                        ia.setAttribute(\"src\", ha);\n                    }\n                ;\n                }\n            ;\n                if (ca) {\n                    this.renderReportRespondLink(fa.getRoot(), ba, ca.message_id);\n                };\n            }\n             else i.addClass(ga, \"_ksa\");\n        ;\n            return fa.getRoot();\n        },\n        renderShareLink: function(ba, ca, da) {\n            var ea = g[\":fb:mercury:attachment:share-link\"].build().setNodeContent(\"name\", ba.name), fa = ea.getNode(\"link\");\n            fa.setAttribute(\"href\", ba.url);\n            (ba.rel && fa.setAttribute(\"rel\", ba.rel));\n            return ea.getRoot();\n        },\n        renderVideoThumb: function(ba) {\n            var ca = g[\":fb:mercury:attachment:video-thumb\"].build(), da = ca.getNode(\"thumb\");\n            da.setAttribute(\"href\", ba.url);\n            da.setAttribute(\"rel\", ba.rel);\n            var ea = k.find(ca.getRoot(), \"img\");\n            ea.src = ba.preview_url;\n            return ca.getRoot();\n        },\n        renderShareXHP: function(ba, ca) {\n            var da = k.create(\"div\");\n            if (ba) {\n                k.appendContent(da, ba.share_xhp);\n                this.renderReportRespondLink(da, ba, ca);\n            }\n        ;\n            return da;\n        },\n        renderSticker: function(ba) {\n            var ca = k.create(\"div\"), da = {\n                uri: ba.url,\n                width: ba.metadata.width,\n                height: ba.metadata.height\n            }, ea = l({\n                className: \"mvs\",\n                src: da\n            });\n            r.renderComponent(ea, ca);\n            return ca;\n        },\n        renderReportRespondLink: function(ba, ca, da) {\n            if (!ca.is_social_report_attachment) {\n                return null\n            };\n            switch (ca.share_data_type) {\n              case j.MercurySupportedShareType.FB_PHOTO:\n                break;\n              case j.MercurySupportedShareType.FB_SOCIAL_REPORT_PHOTO:\n                return null;\n              default:\n                return null;\n            };\n            var ea = null;\n            if (da) {\n                ea = p.getMessagesFromIDs([da,])[0];\n            };\n            if (!ea) {\n                return null\n            };\n            if ((ea.author === q.user)) {\n                return null\n            };\n            var fa = null;\n            q.get(ea.author, function(ga) {\n                fa = k.create(\"a\", {\n                    rel: \"dialog-post\",\n                    className: \"_z6l\",\n                    id: \"respond-link\",\n                    ajaxify: t(\"/ajax/report/social_resolution/photo/\").setQueryData({\n                        attachment_fbid: ca.attach_id,\n                        photo_fbid: ca.shared_object_id,\n                        sender_id: q.getUserID(ga.id)\n                    }).toString()\n                });\n                k.setContent(fa, w._(\"Respond to {name}'s request\", {\n                    name: ga.name\n                }));\n                k.appendContent(ba, fa);\n            });\n        },\n        renderPhotoAttachments: function(ba, ca, da, ea) {\n            var fa = ba.length;\n            if (!fa) {\n                return null\n            };\n            var ga = m.div({\n                className: \"_55pk\"\n            }), ha = (m.div({\n                className: \"_55pl\"\n            }, ga));\n            if ((fa === 1)) {\n                var ia = aa.renderPreview(ba[0], ca, da, \"contain\");\n                k.appendContent(ga, ia);\n                return ha;\n            }\n        ;\n            var ja = ((((fa == 2) || (fa == 4))) ? 2 : 3), ka = (((da - (((ja - 1)) * ea))) / ja), la = Math.ceil((fa / ja)), ma = ((la * ka) + (((la - 1)) * ea)), na = (m.div({\n                className: \"_55pm\",\n                style: ((\"padding-bottom: \" + (((ma / da) * 100))) + \"%;\")\n            }));\n            k.appendContent(ga, na);\n            for (var oa = 0; (oa < fa); ++oa) {\n                var pa = aa.renderPreview(ba[oa], ca, ka, \"cover\"), qa = (oa % ja), ra = Math.floor((oa / ja));\n                i.addClass(pa, \"_55pn\");\n                s.apply(pa, {\n                    width: ((((ka / da) * 100)) + \"%\"),\n                    left: ((((((qa * ((ka + ea)))) / da) * 100)) + \"%\"),\n                    top: ((((((ra * ((ka + ea)))) / ma) * 100)) + \"%\")\n                });\n                k.appendContent(na, pa);\n            };\n            return ha;\n        },\n        isPhotoAttachment: function(ba) {\n            return ((ba.attach_type == o.PHOTO) || (((ba.attach_type == o.FILE) && ba.preview_url)));\n        },\n        isShareAttachment: function(ba) {\n            return (ba.attach_type == o.SHARE);\n        },\n        isFileAttachment: function(ba) {\n            return (ba.attach_type == o.FILE);\n        },\n        isErrorAttachment: function(ba) {\n            return (ba.attach_type == o.ERROR);\n        },\n        booleanLexicographicComparator: function(ba) {\n            return function(ca, da) {\n                for (var ea = 0; (ea < ba.length); ++ea) {\n                    var fa = ba[ea](ca), ga = ba[ea](da);\n                    if ((fa && !ga)) {\n                        return -1;\n                    }\n                     else if ((!fa && ga)) {\n                        return 1\n                    }\n                ;\n                };\n                return 0;\n            };\n        }\n    };\n    e.exports = aa;\n});\n__d(\"URLScraper\", [\"ArbiterMixin\",\"DataStore\",\"Event\",\"URLMatcher\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"ArbiterMixin\"), h = b(\"DataStore\"), i = b(\"Event\"), j = b(\"URLMatcher\"), k = b(\"copyProperties\"), l = \"scraperLastPermissiveMatch\";\n    function m(n) {\n        this.input = n;\n        this.enable();\n    };\n    k(m.prototype, g, {\n        reset: function() {\n            h.set(this.input, l, null);\n        },\n        enable: function() {\n            if (this.events) {\n                return\n            };\n            var n = function(o) {\n                setTimeout(this.check.bind(this, o), 30);\n            };\n            this.events = i.listen(this.input, {\n                paste: n.bind(this, false),\n                keydown: n.bind(this, true)\n            });\n        },\n        disable: function() {\n            if (!this.events) {\n                return\n            };\n            for (var event in this.events) {\n                this.events[event].remove();;\n            };\n            this.events = null;\n        },\n        check: function(n) {\n            var o = this.input.value;\n            if ((n && m.trigger(o))) {\n                return\n            };\n            var p = m.match(o), q = j.permissiveMatch(o);\n            if ((q && ((q != h.get(this.input, l))))) {\n                h.set(this.input, l, q);\n                this.inform(\"match\", {\n                    url: (p || q),\n                    alt_url: q\n                });\n            }\n        ;\n        }\n    });\n    k(m, j);\n    e.exports = m;\n});\n__d(\"htmlHyperlink\", [\"Env\",\"htmlize\",\"UntrustedLink\",\"URI\",\"URLScraper\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Env\"), h = b(\"htmlize\"), i = b(\"UntrustedLink\"), j = b(\"URI\"), k = b(\"URLScraper\"), l = b(\"cx\");\n    function m(n, o, p, q) {\n        if (((typeof n === \"undefined\") || !n.toString)) {\n            return \"\"\n        };\n        if ((typeof o !== \"function\")) {\n            o = h;\n        };\n        if ((typeof p !== \"function\")) {\n            p = h;\n        };\n        var n = n.toString(), r = [], s;\n        while ((s = k.match(n))) {\n            var t = n.indexOf(s);\n            if ((t >= 0)) {\n                r.push(o(n.substring(0, t)));\n            };\n            var u = p(s), v = s.replace(/\"/g, \"%22\");\n            if (!(/^[a-z][a-z0-9\\-+.]+:\\/\\//i.test(s))) {\n                v = (\"http://\" + v);\n            };\n            if (j.isValidURI(v)) {\n                r.push(((((((\"\\u003Ca target=\\\"_blank\\\" rel=\\\"nofollow\\\" \" + \"class=\\\"\") + \"_553k\") + \"\\\" \") + \"href=\\\"\") + v) + \"\\\"\"));\n                if ((q && !j(v).isFacebookURI())) {\n                    a.UntrustedLink = i;\n                    r.push(((\" onmousedown=\\\"UntrustedLink.bootstrap(this, '\" + g.lhsh) + \"', event)\\\"\"));\n                }\n            ;\n                r.push(((\"\\u003E\" + u) + \"\\u003C/a\\u003E\"));\n            }\n             else r.push(u);\n        ;\n            n = n.substring((t + s.length));\n        };\n        (n && r.push(o(n)));\n        return r.join(\"\");\n    };\n    e.exports = m;\n});\n__d(\"MercuryMessageRenderer\", [\"MercuryAttachmentRenderer\",\"CSS\",\"DOM\",\"DOMQuery\",\"HTML\",\"MercuryEmoji\",\"MercuryLogMessageType\",\"MercuryParticipants\",\"Tooltip\",\"cx\",\"htmlHyperlink\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"MercuryAttachmentRenderer\"), h = b(\"CSS\"), i = b(\"DOM\"), j = b(\"DOMQuery\"), k = b(\"HTML\"), l = b(\"MercuryEmoji\"), m = b(\"MercuryLogMessageType\"), n = b(\"MercuryParticipants\"), o = b(\"Tooltip\"), p = b(\"cx\"), q = b(\"htmlHyperlink\"), r = b(\"tx\"), s = [\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\",], t = {\n        renderDate: function(ma) {\n            var na = new Date();\n            na.setHours(0);\n            na.setMinutes(0);\n            na.setSeconds(0);\n            na.setMilliseconds(0);\n            var oa = (((24 * 60) * 60) * 1000), pa = (na.getTime() - ma.getTime());\n            if ((pa <= 0)) {\n                return \"Today\";\n            }\n             else if ((pa < oa)) {\n                return \"Yesterday\"\n            }\n        ;\n            var qa = s[ma.getMonth()], ra = ma.getDate(), sa = ma.getFullYear();\n            if ((sa != na.getFullYear())) {\n                return r._(\"{month} {date}, {year}\", {\n                    month: qa,\n                    date: ra,\n                    year: sa\n                });\n            }\n             else return r._(\"{month} {date}\", {\n                month: qa,\n                date: ra\n            })\n        ;\n        },\n        renderTooltipFlyout: function(ma, na) {\n            na.forEach(function(oa) {\n                var pa = i.create(\"div\");\n                i.setContent(pa, oa.name);\n                i.appendContent(ma, pa);\n            });\n        },\n        renderLogMessage: function(ma, na, oa, pa) {\n            w(ma, pa);\n            x(na, pa);\n            y(oa, pa);\n        },\n        formatMessageBody: function(ma, na, oa) {\n            var pa = ((ma || \"\")).replace(/\\s+$/, \"\");\n            if (!na) {\n                return v(pa, false, oa)\n            };\n            var qa = Object.keys(na).map(function(ta) {\n                return window.parseInt(ta);\n            }).sort(function(ta, ua) {\n                return (ta - ua);\n            }), ra = [], sa = 0;\n            qa.forEach(function(ta) {\n                var ua = pa.slice(sa, ta);\n                if (ua) {\n                    ra.push(v(ua, false, oa));\n                };\n                sa = (ta + na[ta].length);\n                var va = pa.slice(ta, sa);\n                if (va) {\n                    ra.push(v(va, true, oa));\n                };\n            });\n            if ((sa < pa.length)) {\n                ra.push(v(pa.slice(sa), false, oa));\n            };\n            return ((ra.length === 0) ? null : ((ra.length === 1) ? ra[0] : i.create(\"span\", {\n            }, ra)));\n        }\n    };\n    function u(ma, na) {\n        var oa = ma.replace(/\\r\\n?/g, \"\\u000a\").split(/\\n{2,}/), pa = [];\n        for (var qa = 0; (qa < oa.length); qa++) {\n            var ra = oa[qa];\n            if (ra.length) {\n                pa.push(\"\\u003Cp\\u003E\");\n                pa.push(na(ra));\n                pa.push(\"\\u003C/p\\u003E\");\n            }\n        ;\n        };\n        return pa.join(\"\");\n    };\n    function v(ma, na, oa) {\n        var pa = null;\n        if (((ma.length === 0) && !na)) {\n            return pa\n        };\n        function qa(ra) {\n            return q(ra, l.htmlEmojiAndEmote, null, true);\n        };\n        pa = (oa ? u(ma, qa) : qa(ma));\n        if (na) {\n            return i.create(\"span\", {\n                className: \"highlight\"\n            }, k(pa))\n        };\n        return k(pa);\n    };\n    function w(ma, na) {\n        var oa = \"\", pa;\n        switch (na.log_message_type) {\n          case m.JOINABLE_CREATED:\n        \n          case m.JOINABLE_JOINED:\n        \n          case m.SUBSCRIBE:\n            oa = \"mercurySubscribeIcon\";\n            break;\n          case m.UNSUBSCRIBE:\n            oa = \"mercuryUnsubscribeIcon\";\n            break;\n          case m.THREAD_NAME:\n            oa = \"mercuryThreadNameIcon\";\n            break;\n          case m.THREAD_IMAGE:\n            oa = \"mercuryThreadImageIcon\";\n            break;\n          case m.VIDEO_CALL:\n            pa = na.log_message_data.answered;\n            if ((pa || la(na))) {\n                oa = \"mercuryVideoCallIcon\";\n            }\n             else oa = \"mercuryMissedVideoCallIcon\";\n        ;\n            break;\n          case m.PHONE_CALL:\n            pa = na.log_message_data.answered;\n            if (pa) {\n                oa = \"mercuryPhoneCallIcon\";\n            }\n             else oa = \"mercuryMissedPhoneCallIcon\";\n        ;\n            break;\n          case m.SERVER_ERROR:\n            oa = \"mercuryErrorIcon\";\n            break;\n        };\n        h.addClass(ma, oa);\n    };\n    function x(ma, na) {\n        switch (na.log_message_type) {\n          case m.JOINABLE_CREATED:\n            da(ma, na);\n            break;\n          case m.JOINABLE_JOINED:\n            ea(ma, na);\n            break;\n          case m.SUBSCRIBE:\n            ia(ma, na);\n            break;\n          case m.UNSUBSCRIBE:\n            ja(ma, na);\n            break;\n          case m.VIDEO_CALL:\n            if (la(na)) {\n                z(ma, na);\n            }\n             else ba(ma, na);\n        ;\n            break;\n          case m.PHONE_CALL:\n            aa(ma, na);\n            break;\n          case m.THREAD_NAME:\n            ca(ma, na);\n            break;\n          case m.THREAD_IMAGE:\n            fa(ma, na);\n            break;\n          case m.SERVER_ERROR:\n            ka(ma, na);\n            break;\n        };\n    };\n    function y(ma, na) {\n        var oa = na.log_message_type;\n        if ((oa == m.THREAD_IMAGE)) {\n            var pa = na.log_message_data.image;\n            if (pa) {\n                var qa = g.renderPreview((pa.preview_url ? pa : null));\n                i.setContent(ma, qa);\n                h.addClass(qa, \"_z6a\");\n                h.show(ma);\n            }\n        ;\n        }\n    ;\n    };\n    var z = function(ma, na) {\n        n.get(na.author, function(oa) {\n            var pa = i.create(\"span\", {\n                className: \"_511e\"\n            }, oa.short_name), qa;\n            switch (na.log_message_data.event_name) {\n              case \"installing\":\n                qa = i.tx._(\"{firstname} is setting up video calling...\", {\n                    firstname: pa\n                });\n                break;\n              case \"installed\":\n                qa = i.tx._(\"{firstname} finished setting up video calling.\", {\n                    firstname: pa\n                });\n                break;\n              case \"install_canceled\":\n                qa = i.tx._(\"You canceled the video calling installation. \", {\n                    firstname: pa\n                });\n                break;\n            };\n            if (qa) {\n                i.setContent(ma, qa);\n            };\n        });\n    }, aa = function(ma, na) {\n        var oa = na.log_message_data.caller, pa = na.log_message_data.callee, qa = [oa,pa,];\n        n.getMulti(qa, function(ra) {\n            if ((oa == n.user)) {\n                var sa = i.create(\"span\", {\n                    className: \"_511e\"\n                }, ra[pa].short_name), ta;\n                if (na.log_message_data.answered) {\n                    ta = i.tx._(\"You called {firstname}.\", {\n                        firstname: sa\n                    });\n                }\n                 else ta = i.tx._(\"{firstname} missed a call from you. \", {\n                    firstname: sa\n                });\n            ;\n            }\n             else {\n                var ua = i.create(\"span\", {\n                    className: \"_511e\"\n                }, ra[oa].short_name);\n                if (na.log_message_data.answered) {\n                    ta = i.tx._(\"{firstname} called you.\", {\n                        firstname: ua\n                    });\n                }\n                 else ta = i.tx._(\"You missed a call from {firstname}. \", {\n                    firstname: ua\n                });\n            ;\n            }\n        ;\n            i.setContent(ma, ta);\n        });\n    }, ba = function(ma, na) {\n        var oa = na.log_message_data.caller, pa = na.log_message_data.callee, qa = [oa,pa,];\n        n.getMulti(qa, function(ra) {\n            if ((oa == n.user)) {\n                var sa = i.create(\"span\", {\n                    className: \"_511e\"\n                }, ra[pa].short_name), ta;\n                if (na.log_message_data.answered) {\n                    ta = i.tx._(\"You called {firstname}.\", {\n                        firstname: sa\n                    });\n                }\n                 else ta = i.tx._(\"{firstname} missed a call from you. \", {\n                    firstname: sa\n                });\n            ;\n            }\n             else {\n                var ua = i.create(\"span\", {\n                    className: \"_511e\"\n                }, ra[oa].short_name);\n                if (na.log_message_data.answered) {\n                    ta = i.tx._(\"{firstname} called you.\", {\n                        firstname: ua\n                    });\n                }\n                 else ta = i.tx._(\"You missed a call from {firstname}. \", {\n                    firstname: ua\n                });\n            ;\n            }\n        ;\n            i.setContent(ma, ta);\n        });\n    }, ca = function(ma, na) {\n        var oa = na.log_message_data.name, pa = i.create(\"b\", {\n        }, oa);\n        if ((na.author == n.user)) {\n            if (oa) {\n                i.setContent(ma, i.tx._(\"You named the conversation: {name}.\", {\n                    name: pa\n                }));\n            }\n             else i.setContent(ma, i.tx._(\"You removed the conversation name.\"));\n        ;\n        }\n         else n.get(na.author, function(qa) {\n            var ra, sa = ga(qa);\n            if (oa) {\n                ra = i.tx._(\"{actor} named the conversation: {name}.\", {\n                    actor: sa,\n                    name: pa\n                });\n            }\n             else ra = i.tx._(\"{actor} removed the conversation name.\", {\n                actor: sa\n            });\n        ;\n            i.setContent(ma, ra);\n        });\n    ;\n    }, da = function(ma, na) {\n        if ((na.author == n.user)) {\n            i.setContent(ma, i.tx._(\"Other people can join this chat from News Feed and add their friends.\"));\n        }\n         else n.get(na.author, function(oa) {\n            var pa = ga(oa);\n            i.setContent(ma, i.tx._(\"{actor} shared this chat to News Feed. Other people can join and add their friends.\", {\n                actor: pa\n            }));\n        });\n    ;\n    }, ea = function(ma, na) {\n        var oa = na.log_message_data.joined_participant;\n        if ((oa == n.user)) {\n            i.setContent(ma, i.tx._(\"You joined the chat. Other people can join from News Feed and add their friends.\"));\n        }\n         else n.get(oa, function(pa) {\n            var qa = ga(pa);\n            i.setContent(ma, i.tx._(\"{actor} joined the chat.\", {\n                actor: qa\n            }));\n        });\n    ;\n    }, fa = function(ma, na) {\n        if ((na.author == n.user)) {\n            if (na.log_message_data.image) {\n                i.setContent(ma, i.tx._(\"You changed the conversation picture.\"));\n            }\n             else i.setContent(ma, i.tx._(\"You removed the conversation picture.\"));\n        ;\n        }\n         else n.get(na.author, function(oa) {\n            var pa = ga(oa), qa;\n            if (na.log_message_data.image) {\n                qa = i.tx._(\"{actor} changed the conversation picture.\", {\n                    actor: pa\n                });\n            }\n             else qa = i.tx._(\"{actor} removed the conversation picture.\", {\n                actor: pa\n            });\n        ;\n            i.setContent(ma, qa);\n        });\n    ;\n    }, ga = function(ma) {\n        if (ma.href) {\n            return i.create(\"a\", {\n                href: ma.href,\n                className: \"_511e\"\n            }, ma.name)\n        };\n        return ma.name;\n    }, ha = function(ma) {\n        var na = ma.indexOf(n.user);\n        if ((na > 0)) {\n            return ma.splice(na, 1).concat(ma)\n        };\n        return ma;\n    }, ia = function(ma, na) {\n        var oa = ha(na.log_message_data.added_participants), pa = null, qa;\n        if ((oa.length == 1)) {\n            pa = [na.author,oa[0],];\n            n.getMulti(pa, function(ra) {\n                if ((na.author == n.user)) {\n                    qa = i.tx._(\"You added {subscriber1}.\", {\n                        subscriber1: ga(ra[oa[0]])\n                    });\n                }\n                 else if ((oa[0] == n.user)) {\n                    qa = i.tx._(\"{actor} added you.\", {\n                        actor: ga(ra[na.author])\n                    });\n                }\n                 else qa = i.tx._(\"{actor} added {subscriber1}.\", {\n                    actor: ga(ra[na.author]),\n                    subscriber1: ga(ra[oa[0]])\n                });\n                \n            ;\n                i.setContent(ma, qa);\n            });\n        }\n         else if ((oa.length == 2)) {\n            pa = [na.author,].concat(oa);\n            n.getMulti(pa, function(ra) {\n                if ((na.author == n.user)) {\n                    qa = i.tx._(\"You added {subscriber1} and {subscriber2}.\", {\n                        subscriber1: ga(ra[oa[0]]),\n                        subscriber2: ga(ra[oa[1]])\n                    });\n                }\n                 else if ((oa[0] == n.user)) {\n                    qa = i.tx._(\"{actor} added you and {subscriber2}.\", {\n                        actor: ga(ra[na.author]),\n                        subscriber2: ga(ra[oa[1]])\n                    });\n                }\n                 else qa = i.tx._(\"{actor} added {subscriber1} and {subscriber2}.\", {\n                    actor: ga(ra[na.author]),\n                    subscriber1: ga(ra[oa[0]]),\n                    subscriber2: ga(ra[oa[1]])\n                });\n                \n            ;\n                i.setContent(ma, qa);\n            });\n        }\n         else if ((oa.length == 3)) {\n            pa = [na.author,].concat(oa);\n            n.getMulti(pa, function(ra) {\n                if ((na.author == n.user)) {\n                    qa = i.tx._(\"You added {subscriber1}, {subscriber2} and {subscriber3}.\", {\n                        subscriber1: ga(ra[oa[0]]),\n                        subscriber2: ga(ra[oa[1]]),\n                        subscriber3: ga(ra[oa[2]])\n                    });\n                }\n                 else if ((oa[0] == n.user)) {\n                    qa = i.tx._(\"{actor} added you, {subscriber2} and {subscriber3}.\", {\n                        actor: ga(ra[na.author]),\n                        subscriber2: ga(ra[oa[1]]),\n                        subscriber3: ga(ra[oa[2]])\n                    });\n                }\n                 else qa = i.tx._(\"{actor} added {subscriber1}, {subscriber2} and {subscriber3}.\", {\n                    actor: ga(ra[na.author]),\n                    subscriber1: ga(ra[oa[0]]),\n                    subscriber2: ga(ra[oa[1]]),\n                    subscriber3: ga(ra[oa[2]])\n                });\n                \n            ;\n                i.setContent(ma, qa);\n            });\n        }\n         else {\n            pa = [na.author,].concat(oa);\n            n.getMulti(pa, function(ra) {\n                var sa = i.tx._(\"{num} more\", {\n                    num: (oa.length - 2)\n                }), ta = i.create(\"span\", {\n                    className: \"more\"\n                }, sa), ua = i.create(\"div\");\n                t.renderTooltipFlyout(ua, oa.slice(2).map(function(wa) {\n                    return ra[wa];\n                }));\n                if ((na.author == n.user)) {\n                    qa = i.tx._(\"You added {subscriber1}, {subscriber2} and {more_people}.\", {\n                        subscriber1: ga(ra[oa[0]]),\n                        subscriber2: ga(ra[oa[1]]),\n                        more_people: ta\n                    });\n                }\n                 else if ((oa[0] == n.user)) {\n                    qa = i.tx._(\"{actor} added you, {subscriber2} and {more_people}.\", {\n                        actor: ga(ra[na.author]),\n                        subscriber2: ga(ra[oa[1]]),\n                        more_people: ta\n                    });\n                }\n                 else qa = i.tx._(\"{actor} added {subscriber1}, {subscriber2} and {more_people}.\", {\n                    actor: ga(ra[na.author]),\n                    subscriber1: ga(ra[oa[0]]),\n                    subscriber2: ga(ra[oa[1]]),\n                    more_people: ta\n                });\n                \n            ;\n                i.setContent(ma, qa);\n                var va = j.find(ma, \"span.more\");\n                o.set(va, ua, \"above\", \"center\");\n            });\n        }\n        \n        \n    ;\n    }, ja = function(ma, na) {\n        n.get(na.author, function(oa) {\n            var pa;\n            if ((na.author == n.user)) {\n                pa = i.tx._(\"You left the conversation.\");\n            }\n             else pa = i.tx._(\"{actor} left the conversation.\", {\n                actor: ga(oa)\n            });\n        ;\n            i.setContent(ma, pa);\n        });\n    }, ka = function(ma, na) {\n        var oa = \"We were unable to fetch previous messages in this conversation.\";\n        i.setContent(ma, oa);\n    }, la = function(ma) {\n        return ((ma.log_message_data.event_name === \"installing\") || (ma.log_message_data.event_name === \"install_canceled\"));\n    };\n    e.exports = t;\n});\n__d(\"MercurySheetPolicy\", [], function(a, b, c, d, e, f) {\n    var g = {\n        canReplaceOpenSheet: function(h, i) {\n            if ((h.getType() == i.getType())) {\n                return false\n            };\n            if ((h.isPermanent() && !i.isPermanent())) {\n                return false\n            };\n            return true;\n        }\n    };\n    e.exports = g;\n});\n__d(\"MercurySheetView\", [\"Animation\",\"ArbiterMixin\",\"MercurySheetPolicy\",\"CSS\",\"DOM\",\"Style\",\"MercurySheetTemplates\",\"Vector\",\"copyProperties\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Animation\"), h = b(\"ArbiterMixin\"), i = b(\"MercurySheetPolicy\"), j = b(\"CSS\"), k = b(\"DOM\"), l = b(\"Style\"), m = b(\"MercurySheetTemplates\"), n = b(\"Vector\"), o = b(\"copyProperties\"), p = b(\"cx\"), q = 5000, r = function(s, t, u) {\n        this._threadID = s;\n        this._rootElement = t;\n        this._tabMainElement = u;\n        this._openSheet = null;\n    };\n    o(r.prototype, h, {\n        destroy: function() {\n            k.empty(this._rootElement);\n        },\n        _openCommon: function(s, t) {\n            if ((this._openSheet && !i.canReplaceOpenSheet(this._openSheet, s))) {\n                if (s.couldNotReplace) {\n                    s.couldNotReplace();\n                };\n                return;\n            }\n        ;\n            this.clear(function() {\n                this._openSheet = s;\n                var u = m[\":fb:mercury:tab-sheet:loading\"].build().getRoot();\n                k.setContent(this._rootElement, u);\n                j.show(u);\n                j.show(this._rootElement);\n                s.render();\n                if (t) {\n                    j.addClass(this._tabMainElement, \"sheetSlide\");\n                    j.addClass(this._tabMainElement, \"_1sk4\");\n                    var v = n.getElementDimensions(this._rootElement).y;\n                    l.set(this._rootElement, \"bottom\", (v + \"px\"));\n                    this.inform(\"resize\");\n                    this._animation = new g(this._rootElement).to(\"bottom\", 0).duration(150).ease(g.ease.both).ondone(function() {\n                        j.removeClass(this._tabMainElement, \"sheetSlide\");\n                        j.removeClass(this._tabMainElement, \"_1sk4\");\n                        this.inform(\"resize\");\n                    }.bind(this)).go();\n                }\n                 else this.inform(\"resize\");\n            ;\n                if (!s.isPermanent()) {\n                    var w = q;\n                    if (s.getCloseTimeout) {\n                        w = s.getCloseTimeout();\n                    };\n                    var x = this.getAutoCloseCallback(s);\n                    this._sheetCloseHandler = this.close.bind(this, s, x).defer(w, false);\n                    if (s.timeoutCanBeReset) {\n                        s.setResetTimeoutCallback(this.resetTimeout.bind(this));\n                    };\n                }\n            ;\n            }.bind(this));\n        },\n        getAutoCloseCallback: function(s) {\n            if (!s.autoCloseCallback) {\n                return null\n            };\n            return s.autoCloseCallback.bind(s);\n        },\n        resetTimeout: function(s, t) {\n            clearTimeout(this._sheetCloseHandler);\n            var u = this.getAutoCloseCallback(s);\n            this._sheetCloseHandler = this.close.bind(this, s, u).defer(t, false);\n        },\n        set: function(s) {\n            return this._openCommon(s, false);\n        },\n        open: function(s) {\n            return this._openCommon(s, true);\n        },\n        close: function(s, t) {\n            if ((this._openSheet != s)) {\n                return\n            };\n            if (!this._openSheet) {\n                (t && t());\n                return;\n            }\n        ;\n            if (this._animation) {\n                this._animation.stop();\n            };\n            if (this._sheetCloseHandler) {\n                clearTimeout(this._sheetCloseHandler);\n                this._sheetCloseHandler = null;\n            }\n        ;\n            j.addClass(this._tabMainElement, \"sheetSlide\");\n            j.addClass(this._tabMainElement, \"_1sk4\");\n            var u = n.getElementDimensions(this._rootElement).y;\n            this.inform(\"resize\");\n            this._animation = new g(this._rootElement).to(\"bottom\", (u + \"px\")).duration(100).ease(g.ease.begin).ondone(function() {\n                k.empty(this._rootElement);\n                j.hide(this._rootElement);\n                j.removeClass(this._tabMainElement, \"sheetSlide\");\n                j.removeClass(this._tabMainElement, \"_1sk4\");\n                this._openSheet = null;\n                this.inform(\"resize\");\n                (t && t());\n            }.bind(this)).go();\n        },\n        clear: function(s) {\n            this.close(this._openSheet, s);\n        }\n    });\n    e.exports = r;\n});\n__d(\"MercuryStickersData\", [\"Arbiter\",\"MercuryStickersInitialData\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"MercuryStickersInitialData\"), i = h.packs, j = {\n        getPacks: function() {\n            return i;\n        },\n        updatePackData: function(k) {\n            i = k.packs;\n            g.inform(\"MercuryStickers/updatedPacks\");\n        }\n    };\n    e.exports = j;\n});\n__d(\"MercuryStickers\", [\"Arbiter\",\"ArbiterMixin\",\"CSS\",\"DOM\",\"Event\",\"MercuryStickersData\",\"MercuryStickersFlyoutList.react\",\"Parent\",\"React\",\"SubscriptionsHandler\",\"Toggler\",\"UIPagelet\",\"XUISpinner.react\",\"copyProperties\",\"csx\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ArbiterMixin\"), i = b(\"CSS\"), j = b(\"DOM\"), k = b(\"Event\"), l = b(\"MercuryStickersData\"), m = b(\"MercuryStickersFlyoutList.react\"), n = b(\"Parent\"), o = b(\"React\"), p = b(\"SubscriptionsHandler\"), q = b(\"Toggler\"), r = b(\"UIPagelet\"), s = b(\"XUISpinner.react\"), t = b(\"copyProperties\"), u = b(\"csx\"), v = b(\"cx\");\n    function w(x) {\n        this._packs = j.find(x, \"._5907\");\n        this._packSelector = j.find(x, \"._5906\");\n        this._loadedPacks = {\n            emoticons: true\n        };\n        var y = n.byClass(x, \"uiToggle\"), z = q.listen(\"show\", y, function() {\n            this._renderPackList();\n            this._subscriptions.addSubscriptions(g.subscribe(\"MercuryStickers/updatedPacks\", this._renderPackList.bind(this)));\n            this._selectPack(l.getPacks()[0].id);\n            q.unsubscribe(z);\n        }.bind(this));\n        this._subscriptions = new p();\n        this._subscriptions.addSubscriptions(k.listen(this._packs, \"click\", function(event) {\n            var aa = n.byClass(event.getTarget(), \"_55bp\");\n            if (aa) {\n                this._selectedSticker(aa);\n                q.hide(y);\n            }\n        ;\n        }.bind(this)));\n    };\n    t(w.prototype, h, {\n        _renderPackList: function() {\n            o.renderComponent(m({\n                onPackClick: this._selectPack.bind(this),\n                packs: l.getPacks()\n            }), this._packSelector);\n        },\n        _loadPack: function(x) {\n            if (this._loadedPacks[x]) {\n                return\n            };\n            var y = this._getPackWithID(x);\n            o.renderComponent(s({\n                className: \"_5905\"\n            }), y);\n            this._loadedPacks[x] = true;\n            r.loadFromEndpoint(\"StickerPackPagelet\", y, {\n                id: x\n            });\n        },\n        _getPackWithID: function(x) {\n            var y = j.scry(this._packs, (((\"._55bq\" + \"[data-id=\\\"\") + x) + \"\\\"]\"))[0];\n            if (!y) {\n                y = j.create(\"div\", {\n                    className: \"_55bq hidden_elem\",\n                    \"data-id\": x\n                });\n                j.appendContent(this._packs, y);\n            }\n        ;\n            return y;\n        },\n        _selectedSticker: function(x) {\n            var y = parseInt(x.getAttribute(\"data-id\"), 10);\n            this.inform(\"stickerselected\", {\n                id: y\n            });\n        },\n        _selectPack: function(x) {\n            j.scry(this._packs, \"._55bq\").forEach(i.hide);\n            this._loadPack(x);\n            i.show(this._getPackWithID(x));\n        },\n        destroy: function() {\n            (this._subscriptions && this._subscriptions.release());\n            this._subscriptions = null;\n        }\n    });\n    e.exports = w;\n});\n__d(\"Token\", [\"CSS\",\"DataStore\",\"DOM\",\"copyProperties\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSS\"), h = b(\"DataStore\"), i = b(\"DOM\"), j = b(\"copyProperties\"), k = b(\"tx\");\n    function l(m, n) {\n        this.info = m;\n        this.paramName = n;\n    };\n    j(l.prototype, {\n        getInfo: function() {\n            return this.info;\n        },\n        getText: function() {\n            return this.info.text;\n        },\n        getValue: function() {\n            return this.info.uid;\n        },\n        isFreeform: function() {\n            return !!this.info.freeform;\n        },\n        setSelected: function(m) {\n            g.conditionClass(this.getElement(), \"uiTokenSelected\", m);\n            return this;\n        },\n        getElement: function() {\n            if (!this.element) {\n                this.setElement(this.createElement());\n            };\n            return this.element;\n        },\n        setElement: function(m) {\n            h.set(m, \"Token\", this);\n            this.element = m;\n            return this;\n        },\n        isRemovable: function() {\n            return g.hasClass(this.element, \"removable\");\n        },\n        createElement: function(m, n) {\n            var o = this.paramName, p = this.getText(), q = this.getValue(), r = i.create(\"a\", {\n                href: \"#\",\n                \"aria-label\": k._(\"Remove {item}\", {\n                    item: p\n                }),\n                className: \"remove uiCloseButton uiCloseButtonSmall\"\n            });\n            if (m) {\n                g.addClass(r, \"uiCloseButtonSmallGray\");\n            };\n            var s = i.create(\"input\", {\n                type: \"hidden\",\n                value: q,\n                name: (o + \"[]\"),\n                autocomplete: \"off\"\n            }), t = i.create(\"input\", {\n                type: \"hidden\",\n                value: p,\n                name: ((\"text_\" + o) + \"[]\"),\n                autocomplete: \"off\"\n            }), u = i.create(\"span\", {\n                className: \"removable uiToken\"\n            }, [p,s,t,r,]);\n            if (m) {\n                g.addClass(u, \"uiTokenGray\");\n            };\n            if (n) {\n                var v = i.create(\"i\", {\n                    className: n\n                });\n                i.prependContent(u, v);\n            }\n        ;\n            return u;\n        }\n    });\n    e.exports = l;\n});\n__d(\"WeakToken\", [\"Class\",\"CSS\",\"Token\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Class\"), h = b(\"CSS\"), i = b(\"Token\"), j = b(\"copyProperties\");\n    function k(l, m) {\n        this.parent.construct(this, l, m);\n    };\n    g.extend(k, i);\n    j(k.prototype, {\n        createElement: function() {\n            var l = this.parent.createElement(true, \"UFIWeakReferenceIcon\");\n            h.addClass(l, \"uiTokenWeakReference\");\n            return l;\n        }\n    });\n    e.exports = k;\n});\n__d(\"Tokenizer\", [\"Arbiter\",\"ArbiterMixin\",\"CSS\",\"DOM\",\"DOMQuery\",\"DataStore\",\"Event\",\"Focus\",\"Input\",\"Keys\",\"Parent\",\"StickyPlaceholderInput\",\"Style\",\"TextMetrics\",\"Token\",\"UserAgent\",\"WeakToken\",\"copyProperties\",\"createObjectFrom\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ArbiterMixin\"), i = b(\"CSS\"), j = b(\"DOM\"), k = b(\"DOMQuery\"), l = b(\"DataStore\"), m = b(\"Event\"), n = b(\"Focus\"), o = b(\"Input\"), p = b(\"Keys\"), q = b(\"Parent\"), r = b(\"StickyPlaceholderInput\"), s = b(\"Style\"), t = b(\"TextMetrics\"), u = b(\"Token\"), v = b(\"UserAgent\"), w = b(\"WeakToken\"), x = b(\"copyProperties\"), y = b(\"createObjectFrom\"), z = b(\"emptyFunction\"), aa = 20;\n    function ba(ca, da) {\n        this.element = ca;\n        this.typeahead = da;\n        this.input = da.getCore().getElement();\n        l.set(this.element, \"Tokenizer\", this);\n    };\n    ba.getInstance = function(ca) {\n        var da = q.byClass(ca, \"uiTokenizer\");\n        return (da ? l.get(da, \"Tokenizer\") : null);\n    };\n    x(ba.prototype, h, {\n        inline: false,\n        maxTokens: null,\n        excludeDuplicates: true,\n        placeholder: \"\",\n        init: function(ca, da, ea, fa) {\n            this.init = z;\n            this.tokenarea = ca;\n            this.paramName = da;\n            if (!this.placeholder) {\n                this.placeholder = (this.input.getAttribute(\"data-placeholder\") || \"\");\n            };\n            x(this, (fa || {\n            }));\n            this.initEvents();\n            this.initTypeahead();\n            this.reset(ea);\n            this.initBehaviors();\n            this.adjustWidth.bind(this).defer();\n            g.inform(\"Tokenizer/init\", this, g.BEHAVIOR_PERSISTENT);\n        },\n        reset: function(ca) {\n            this.tokens = [];\n            this.unique = {\n            };\n            if (ca) {\n                this.populate(ca);\n            }\n             else j.empty(this.tokenarea);\n        ;\n            this.updateTokenarea();\n        },\n        populate: function(ca) {\n            var da = [];\n            this.tokens = this.getTokenElements().map(function(ea, fa) {\n                var ga = ca[fa];\n                da.push(this._tokenKey(ga));\n                return this.createToken(ga, ea);\n            }, this);\n            this.unique = y(da, this.tokens);\n        },\n        getElement: function() {\n            return this.element;\n        },\n        getTypeahead: function() {\n            return this.typeahead;\n        },\n        getInput: function() {\n            return this.input;\n        },\n        initBehaviors: function() {\n            this.behaviors = (this.behaviors || []);\n            if ((this.behaviors instanceof Array)) {\n                this.behaviors.forEach(function(ea) {\n                    ea.behavior(this, ea.config);\n                }.bind(this));\n            }\n             else for (var ca in ((this.behaviors || {\n            }))) {\n                var da = (window.TokenizerBehaviors && window.TokenizerBehaviors[ca]);\n                da.call(null, this, this.behaviors[ca]);\n            }\n        ;\n        },\n        initTypeahead: function() {\n            var ca = this.typeahead.getCore();\n            ca.resetOnSelect = true;\n            ca.setValueOnSelect = false;\n            ca.preventFocusChangeOnTab = true;\n            if (this.inline) {\n                var da = this.typeahead.getView();\n                i.addClass(da.getElement(), \"uiInlineTokenizerView\");\n            }\n        ;\n            this.typeahead.subscribe(\"select\", function(ea, fa) {\n                var ga = fa.selected;\n                if ((\"uid\" in ga)) {\n                    this.updateInput();\n                    this.addToken(this.createToken(ga));\n                }\n            ;\n            }.bind(this));\n            this.typeahead.subscribe(\"blur\", this.handleBlur.bind(this));\n        },\n        handleBlur: function(event) {\n            this.inform(\"blur\", {\n                event: event\n            });\n            this.updatePlaceholder();\n        },\n        initEvents: function() {\n            var ca = this.handleEvents.bind(this), da = ((v.firefox() < 4) ? \"keypress\" : \"keydown\");\n            m.listen(this.tokenarea, {\n                click: ca,\n                keydown: ca\n            });\n            m.listen(this.input, \"paste\", this.paste.bind(this));\n            m.listen(this.input, da, this.keydown.bind(this));\n        },\n        handleEvents: function(event) {\n            var ca = event.getTarget(), da = (ca && this.getTokenElementFromTarget(ca));\n            if (!da) {\n                return\n            };\n            if (((event.type != \"keydown\") || (m.getKeyCode(event) == p.RETURN))) {\n                this.processEvents(event, ca, da);\n            };\n        },\n        processEvents: function(event, ca, da) {\n            if (q.byClass(ca, \"remove\")) {\n                var ea = da.nextSibling;\n                ea = (ea && k.scry(da.nextSibling, \".remove\")[0]);\n                var fa = this.getTokenFromElement(da);\n                fa = this.addTokenData(fa, ca);\n                this.removeToken(fa);\n                this.focusOnTokenRemoval(event, ea);\n                event.kill();\n            }\n        ;\n        },\n        focusOnTokenRemoval: function(event, ca) {\n            n.set((((event.type == \"keydown\") && ca) || this.input));\n        },\n        addTokenData: function(ca, da) {\n            return ca;\n        },\n        keydown: function(event) {\n            this.inform(\"keydown\", {\n                event: event\n            });\n            var ca = m.getKeyCode(event), da = this.input;\n            if (((this.inline && (ca == p.BACKSPACE)) && o.isEmpty(da))) {\n                var ea = this.getLastToken();\n                if ((ea && ea.isRemovable())) {\n                    this.removeToken(ea);\n                };\n            }\n        ;\n            this.updateInput();\n        },\n        paste: function(event) {\n            this.inform(\"paste\", {\n                event: event\n            });\n            this.updateInput(true);\n        },\n        focusInput: function() {\n            n.set(this.input);\n        },\n        updateInput: function(ca) {\n            if (!this.inline) {\n                return\n            };\n            setTimeout(function() {\n                this.adjustWidth(this.input.value);\n                if (ca) {\n                    this.input.value = this.input.value;\n                };\n            }.bind(this), 20);\n            r.setPlaceholderText(this.input, \"\");\n            this.inform(\"resize\");\n        },\n        setPlaceholder: function(ca) {\n            this.placeholder = ca;\n            if (this.stickyPlaceholder) {\n                r.setPlaceholderText(this.input, ca);\n            };\n            this.updatePlaceholder();\n        },\n        updatePlaceholder: function() {\n            if ((!this.inline || this.input.value)) {\n                return\n            };\n            var ca = !this.tokens.length, da = \"\";\n            if ((ca || this.stickyPlaceholder)) {\n                this.adjustWidth(this.placeholder);\n                da = this.placeholder;\n            }\n             else this.adjustWidth(this.input.value);\n        ;\n            r.setPlaceholderText(this.input, da);\n        },\n        adjustWidth: function(ca) {\n            if ((!this.inline || !this._getIsInDOM())) {\n                return\n            };\n            if ((!ca && (this.input.value === \"\"))) {\n                ca = this.placeholder;\n            };\n            var da = aa;\n            if ((((ca !== this.placeholder) || !this.getTokens().length) || this.stickyPlaceholder)) {\n                var ea = this._getMetrics().measure(ca);\n                da = ((ea.width + this._getWidthOffset()) + 10);\n            }\n        ;\n            s.set(this.input, \"width\", (da + \"px\"));\n            this.inform(\"resize\");\n        },\n        getToken: function(ca) {\n            return (this.unique[ca] || null);\n        },\n        getTokens: function() {\n            return (this.tokens || []);\n        },\n        getTokenElements: function() {\n            return k.scry(this.tokenarea, \"span.uiToken\");\n        },\n        getTokenElementFromTarget: function(ca) {\n            return q.byClass(ca, \"uiToken\");\n        },\n        getTokenFromElement: function(ca) {\n            return l.get(ca, \"Token\");\n        },\n        getTokenValues: function() {\n            if (!this.tokens) {\n                return []\n            };\n            return this.tokens.map(function(ca) {\n                return ca.getValue();\n            });\n        },\n        getFirstToken: function() {\n            return (this.tokens[0] || null);\n        },\n        getLastToken: function() {\n            return (this.tokens[(this.tokens.length - 1)] || null);\n        },\n        hasMaxTokens: function() {\n            return (this.maxTokens && (this.maxTokens <= this.tokens.length));\n        },\n        createToken: function(ca, da) {\n            var ea = this.getToken(this._tokenKey(ca));\n            if (!ea) {\n                ea = (ca.weak_reference ? new w(ca, this.paramName) : new u(ca, this.paramName));\n            };\n            (da && ea.setElement(da));\n            return ea;\n        },\n        addToken: function(ca) {\n            if (this.hasMaxTokens()) {\n                return\n            };\n            var da = this._tokenKey(ca.getInfo());\n            if ((da in this.unique)) {\n                return\n            };\n            this.unique[da] = ca;\n            this.tokens.push(ca);\n            this.insertToken(ca);\n            this.updateTokenarea();\n            this.inform(\"addToken\", ca);\n            g.inform(\"Form/change\", {\n                node: this.element\n            });\n        },\n        insertToken: function(ca) {\n            j.appendContent(this.tokenarea, ca.getElement());\n        },\n        removeToken: function(ca) {\n            if (!ca) {\n                return\n            };\n            var da = this.tokens.indexOf(ca);\n            if ((da < 0)) {\n                return\n            };\n            this.tokens.splice(this.tokens.indexOf(ca), 1);\n            delete this.unique[this._tokenKey(ca.getInfo())];\n            j.remove(ca.getElement());\n            this.updateTokenarea();\n            this.inform(\"removeToken\", ca);\n            g.inform(\"Form/change\", {\n                node: this.element\n            });\n        },\n        removeAllTokens: function() {\n            this.reset();\n            this.inform(\"removeAllTokens\");\n        },\n        updateTokenarea: function() {\n            var ca = this.typeahead.getCore(), da = this.getTokenValues();\n            if (this.excludeDuplicates) {\n                (this._exclusions || (this._exclusions = ca.getExclusions()));\n                ca.setExclusions(da.concat(this._exclusions));\n            }\n        ;\n            ca.setEnabled(!this.hasMaxTokens());\n            this.updateTokenareaVisibility();\n            this.updatePlaceholder();\n            this.inform(\"resize\");\n        },\n        updateTokenareaVisibility: function() {\n            i.conditionShow(this.tokenarea, (this.tokens.length !== 0));\n        },\n        _tokenKey: function(ca) {\n            return (ca.uid + ((ca.freeform ? \":\" : \"\")));\n        },\n        _widthOffset: null,\n        _getWidthOffset: function() {\n            if ((this._widthOffset === null)) {\n                var ca = this.input.clientWidth, da = s.getFloat(this.input, \"width\");\n                if ((ca == da)) {\n                    this._widthOffset = (s.getFloat(this.input, \"paddingLeft\") + s.getFloat(this.input, \"paddingRight\"));\n                }\n                 else this._widthOffset = 0;\n            ;\n            }\n        ;\n            return this._widthOffset;\n        },\n        _metrics: null,\n        _getMetrics: function() {\n            if (!this._metrics) {\n                this._metrics = new t(this.input, this.inline);\n            };\n            return this._metrics;\n        },\n        _getIsInDOM: function() {\n            return (this._isInDOM || (this._isInDOM = k.contains(document.body, this.input)));\n        }\n    });\n    ba.init = function(ca, da) {\n        ca.init(da.tokenarea, da.param_name, da.initial_info, da.options);\n    };\n    e.exports = ba;\n});\n__d(\"MercuryTypeahead\", [\"Event\",\"ArbiterMixin\",\"DOM\",\"DOMDimensions\",\"Input\",\"Keys\",\"MercuryTypeaheadTemplates\",\"Tokenizer\",\"Typeahead\",\"TypeaheadCore\",\"copyProperties\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"ArbiterMixin\"), i = b(\"DOM\"), j = b(\"DOMDimensions\"), k = b(\"Input\"), l = b(\"Keys\"), m = b(\"MercuryTypeaheadTemplates\"), n = b(\"Tokenizer\"), o = b(\"Typeahead\"), p = b(\"TypeaheadCore\"), q = b(\"copyProperties\"), r = b(\"cx\"), s = function(t, u) {\n        this._domElement = null;\n        this._typeahead = null;\n        this._tokenizer = null;\n        this._placeholder = \"\";\n        this._exclusions = [];\n        this._viewNodeOrID = null;\n        this._viewOptions = {\n            renderer: \"compact\",\n            autoSelect: true\n        };\n        this._tokenizerBehaviors = [];\n        this._heightPrev = null;\n        this._dataSource = t;\n        this._view = u;\n    };\n    q(s.prototype, h);\n    q(s.prototype, {\n        setPlaceholder: function(t) {\n            this._placeholder = t;\n            return this;\n        },\n        setExcludedParticipants: function(t) {\n            this._exclusions = [];\n            t.forEach(function(u) {\n                var v = u.indexOf(\":\");\n                if ((u.substr(0, v) == \"fbid\")) {\n                    this._exclusions.push(u.substr((v + 1)));\n                };\n            }.bind(this));\n            return this;\n        },\n        setViewNodeID: function(t) {\n            this._viewNodeOrID = t;\n        },\n        setViewNode: function(t) {\n            this._viewNodeOrID = t;\n        },\n        setFullWidthView: function(t) {\n            var u = i.create(\"div\", {\n                className: \"_4ck uiTypeaheadView\"\n            });\n            i.setContent(t, u);\n            this.setViewNode(u);\n        },\n        setViewOption: function(t, u) {\n            this._viewOptions[t] = u;\n        },\n        addTokenizerBehavior: function(t) {\n            this._tokenizerBehaviors.push(t);\n        },\n        build: function(t) {\n            if (this._domElement) {\n                return\n            };\n            var u = m[\":fb:mercury:tokenizer\"].build(), v = m[\":fb:mercury:typeahead\"].build();\n            this._domElement = u.getRoot();\n            i.appendContent(this._domElement, v.getRoot());\n            var w = v.getNode(\"textfield\");\n            k.setPlaceholder(w, this._placeholder);\n            w.setAttribute(\"data-placeholder\", this._placeholder);\n            this._input = w;\n            var x = {\n                node_id: this._viewNodeOrID,\n                ctor: this._view,\n                options: this._viewOptions\n            }, y = {\n                ctor: p,\n                options: {\n                    setValueOnSelect: true\n                }\n            };\n            this._typeahead = new o(this._dataSource, x, y, v.getRoot());\n            this._typeahead.init();\n            var z = {\n                inline: true,\n                behaviors: this._tokenizerBehaviors\n            };\n            this._tokenizer = new n(this._domElement, this._typeahead);\n            this._tokenizer.init(u.getNode(\"tokenarea\"), \"participants\", [], z);\n            this._tokenizer.subscribe([\"addToken\",\"removeToken\",\"removeAllTokens\",], this._tokensChanged.bind(this));\n            this._tokenizer.subscribe(\"resize\", function() {\n                this.inform(\"resize\");\n            }.bind(this));\n            g.listen(w, \"focus\", function() {\n                this._resetDataSource();\n                this._typeahead.init();\n            }.bind(this));\n            g.listen(this._domElement, \"click\", this.focus.bind(this));\n            g.listen(w, \"keydown\", this.keydown.bind(this));\n            this._heightPrev = j.getElementDimensions(this._domElement).height;\n        },\n        getElement: function() {\n            return this._domElement;\n        },\n        getSelectedParticipantIDs: function() {\n            var t = [];\n            if (this._tokenizer) {\n                ((this._tokenizer.getTokenValues() || [])).forEach(function(u) {\n                    t.push((\"fbid:\" + u));\n                });\n            };\n            return t;\n        },\n        getTokens: function() {\n            var t = [];\n            if (this._tokenizer) {\n                t = this._tokenizer.getTokens();\n            };\n            return t;\n        },\n        getTokenizer: function() {\n            return this._tokenizer;\n        },\n        keydown: function(event) {\n            if ((this._tokenizer.inline && (event.keyCode == l.ESC))) {\n                if (k.isEmpty(this._input)) {\n                    var t = this._tokenizer.getLastToken();\n                    if ((t && t.isRemovable())) {\n                        this._tokenizer.removeToken(t);\n                    };\n                }\n                 else this._typeahead.getCore().reset();\n            ;\n                return false;\n            }\n        ;\n        },\n        reset: function() {\n            (this._tokenizer && this._tokenizer.removeAllTokens());\n            (this._typeahead && this._typeahead.getCore().reset());\n        },\n        focus: function() {\n            (this._tokenizer && this._tokenizer.focusInput());\n        },\n        getTypeahead: function() {\n            return this._typeahead;\n        },\n        _resetDataSource: function() {\n            this._dataSource.setExclusions(this._exclusions);\n        },\n        _tokensChanged: function() {\n            this.inform(\"tokens-changed\");\n        }\n    });\n    e.exports = s;\n});\n__d(\"PhotosUploadWaterfall\", [\"AsyncSignal\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncSignal\"), h = {\n        APP_FLASH: \"flash_pro\",\n        APP_SIMPLE: \"simple\",\n        APP_ARCHIVE: \"archive\",\n        APP_COMPOSER: \"composer\",\n        APP_MESSENGER: \"messenger\",\n        APP_HTML5: \"html5\",\n        APP_CHAT: \"chat\",\n        INSTALL_CANCEL: 1,\n        INSTALL_INSTALL: 2,\n        INSTALL_UPDATE: 3,\n        INSTALL_REINSTALL: 4,\n        INSTALL_PERMA_CANCEL: 5,\n        INSTALL_SILENT_SKIP: 6,\n        INSTALL_DOWNLOAD: 7,\n        CERROR_RESIZING_FAILED: 6,\n        CERROR_MARKER_EXTRACTION_FAILED: 9,\n        BEGIN: 1,\n        UPLOAD_START: 4,\n        ALL_UPLOADS_DONE: 6,\n        CLIENT_ERROR: 7,\n        RECOVERABLE_CLIENT_ERROR: 12,\n        IMAGES_SELECTED: 9,\n        UPGRADE_REQUIRED: 11,\n        VERSION: 15,\n        SELECT_START: 18,\n        SELECT_CANCELED: 19,\n        CANCEL: 22,\n        CANCEL_DURING_UPLOAD: 83,\n        ONE_RESIZING_START: 2,\n        ONE_UPLOAD_DONE: 29,\n        ONE_RESIZING_DONE: 34,\n        PROGRESS_BAR_STOPPED: 44,\n        MISSED_BEAT: 45,\n        HEART_ATTACK: 46,\n        PUBLISH_START: 100,\n        PUBLISH_SUCCESS: 101,\n        PUBLISH_FAILURE: 102,\n        SESSION_POSTED: 72,\n        POST_PUBLISHED: 80,\n        ONE_UPLOAD_CANCELED: 81,\n        ONE_UPLOAD_CANCELED_DURING_UPLOAD: 82,\n        RESIZER_AVAILABLE: 20,\n        OVERLAY_FIRST: 61,\n        ASYNC_AVAILABLE: 63,\n        FALLBACK_TO_FLASH: 13,\n        RETRY_UPLOAD: 17,\n        TAGGED_ALL_FACES: 14,\n        VAULT_IMAGES_SELECTED: 62,\n        VAULT_CREATE_POST_CANCEL: 65,\n        VAULT_SEND_IN_MESSAGE_CLICKED: 66,\n        VAULT_DELETE_CANCEL: 68,\n        VAULT_ADD_TO_ALBUM_CANCEL: 74,\n        VAULT_SHARE_IN_AN_ALBUM_CLICKED: 76,\n        VAULT_SHARE_OWN_TIMELINE_CLICKED: 77,\n        VAULT_SHARE_FRIENDS_TIMELINE_CLICKED: 78,\n        VAULT_SHARE_IN_A_GROUP_CLICKED: 79,\n        METHOD_DRAGDROP: \"dragdrop\",\n        METHOD_FILE_SELECTOR: \"file_selector\",\n        METHOD_VAULT: \"vault\",\n        METHOD_PHOTOS_OF_YOU: \"photos_of_you\",\n        METHOD_RECENT_PHOTOS: \"recent_photos\",\n        VAULTBOX: \"vaultbox\",\n        GRID: \"grid\",\n        SPOTLIGHT_VAULT_VIEWER: \"spotlight_vault_viewer\",\n        sendSignal: function(i, j) {\n            new g(\"/ajax/photos/waterfall.php\", {\n                data: JSON.stringify(i)\n            }).setHandler(j).send();\n        }\n    };\n    e.exports = h;\n});\n__d(\"FreeformTokenizerBehavior\", [\"Input\",\"Keys\",\"Event\",\"function-extensions\",], function(a, b, c, d, e, f) {\n    var g = b(\"Input\"), h = b(\"Keys\"), i = b(\"Event\");\n    b(\"function-extensions\");\n    function j(k, l) {\n        var m = (l.tokenize_on_blur !== false), n = (l.tokenize_on_paste !== false), o = (l.matcher && new RegExp(l.matcher, \"i\")), p = (l.paste_split && new RegExp(l.paste_split)), q = (l.select_on_comma !== false), r = (l.never_submit === true);\n        function s(event) {\n            var t = g.getValue(k.getInput()).trim();\n            if (((p && event) && (event.type == \"paste\"))) {\n                t = t.split(p);\n            }\n             else t = [t,];\n        ;\n            var u = false;\n            for (var v = 0; (v < t.length); v++) {\n                var w = t[v].trim();\n                if ((w && ((!o || o.test(w))))) {\n                    var x = {\n                        uid: w,\n                        text: w,\n                        freeform: true\n                    };\n                    k.addToken(k.createToken(x));\n                    u = true;\n                }\n            ;\n            };\n            if ((event && u)) {\n                k.getTypeahead().getCore().afterSelect();\n                event.kill();\n            }\n        ;\n        };\n        k.subscribe(\"keydown\", function(t, u) {\n            var event = u.event, v = i.getKeyCode(event);\n            if ((((q && (v == h.COMMA))) || (v == h.RETURN))) {\n                var w = k.getTypeahead().getView();\n                if (w.getSelection()) {\n                    w.select();\n                    event.kill();\n                }\n                 else s(event);\n            ;\n            }\n        ;\n            if (((v == h.RETURN) && r)) {\n                event.kill();\n            };\n        });\n        k.subscribe(\"paste\", function(t, u) {\n            if (n) {\n                s.bind(null, u.event).defer(20);\n            };\n        });\n        k.subscribe(\"blur\", function(t, u) {\n            if (m) {\n                s();\n            };\n            k.getTypeahead().getCore().reset();\n        });\n    };\n    e.exports = j;\n});");
// 13460
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o7,"scaff3dbb6c695995ec315b3795e7ed24f2b1e2f0");
// 13461
geval("if (JSBNG__self.CavalryLogger) {\n    CavalryLogger.start_js([\"LpC/l\",]);\n}\n;\n;\n__d(\"DOMWrapper\", [], function(a, b, c, d, e, f) {\n    var g, h, i = {\n        setRoot: function(j) {\n            g = j;\n        },\n        getRoot: function() {\n            return ((g || JSBNG__document.body));\n        },\n        setWindow: function(j) {\n            h = j;\n        },\n        getWindow: function() {\n            return ((h || JSBNG__self));\n        }\n    };\n    e.exports = i;\n});\n__d(\"Flash\", [\"DOMWrapper\",\"QueryString\",\"UserAgent\",\"copyProperties\",\"guid\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOMWrapper\"), h = b(\"QueryString\"), i = b(\"UserAgent\"), j = b(\"copyProperties\"), k = b(\"guid\"), l = {\n    }, m, n = g.getWindow().JSBNG__document;\n    function o(t) {\n        var u = n.getElementById(t);\n        if (u) {\n            u.parentNode.removeChild(u);\n        }\n    ;\n    ;\n        delete l[t];\n    };\n;\n    function p() {\n        {\n            var fin260keys = ((window.top.JSBNG_Replay.forInKeys)((l))), fin260i = (0);\n            var t;\n            for (; (fin260i < fin260keys.length); (fin260i++)) {\n                ((t) = (fin260keys[fin260i]));\n                {\n                    if (l.hasOwnProperty(t)) {\n                        o(t);\n                    }\n                ;\n                ;\n                };\n            };\n        };\n    ;\n    };\n;\n    function q(t) {\n        return t.replace(/\\d+/g, function(u) {\n            return ((\"000\".substring(u.length) + u));\n        });\n    };\n;\n    function r(t) {\n        if (!m) {\n            if (((i.ie() >= 9))) {\n                window.JSBNG__attachEvent(\"JSBNG__onunload\", p);\n            }\n        ;\n        ;\n            m = true;\n        }\n    ;\n    ;\n        l[t] = t;\n    };\n;\n    var s = {\n        embed: function(t, u, v, w) {\n            var x = k();\n            t = encodeURI(t);\n            v = j({\n                allowscriptaccess: \"always\",\n                flashvars: w,\n                movie: t\n            }, ((v || {\n            })));\n            if (((typeof v.flashvars == \"object\"))) {\n                v.flashvars = h.encode(v.flashvars);\n            }\n        ;\n        ;\n            var y = [];\n            {\n                var fin261keys = ((window.top.JSBNG_Replay.forInKeys)((v))), fin261i = (0);\n                var z;\n                for (; (fin261i < fin261keys.length); (fin261i++)) {\n                    ((z) = (fin261keys[fin261i]));\n                    {\n                        if (((v.hasOwnProperty(z) && v[z]))) {\n                            y.push(((((((((\"\\u003Cparam name=\\\"\" + encodeURI(z))) + \"\\\" value=\\\"\")) + encodeURI(v[z]))) + \"\\\"\\u003E\")));\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            var aa = n.createElement(\"div\"), ba = ((((((((((((((((((\"\\u003Cobject \" + ((i.ie() ? \"classid=\\\"clsid:d27cdb6e-ae6d-11cf-96b8-444553540000\\\" \" : \"type=\\\"application/x-shockwave-flash\\\"\")))) + \"data=\\\"\")) + t)) + \"\\\" \")) + \"id=\\\"\")) + x)) + \"\\\"\\u003E\")) + y.join(\"\"))) + \"\\u003C/object\\u003E\"));\n            aa.innerHTML = ba;\n            var ca = u.appendChild(aa.firstChild);\n            r(x);\n            return ca;\n        },\n        remove: o,\n        getVersion: function() {\n            var t = \"Shockwave Flash\", u = \"application/x-shockwave-flash\", v = \"ShockwaveFlash.ShockwaveFlash\", w;\n            if (((JSBNG__navigator.plugins && ((typeof JSBNG__navigator.plugins[t] == \"object\"))))) {\n                var x = JSBNG__navigator.plugins[t].description;\n                if (((((((x && JSBNG__navigator.mimeTypes)) && JSBNG__navigator.mimeTypes[u])) && JSBNG__navigator.mimeTypes[u].enabledPlugin))) {\n                    w = x.match(/\\d+/g);\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            if (!w) {\n                try {\n                    w = (new ActiveXObject(v)).GetVariable(\"$version\").match(/(\\d+),(\\d+),(\\d+),(\\d+)/);\n                    w = Array.prototype.slice.call(w, 1);\n                } catch (y) {\n                \n                };\n            }\n        ;\n        ;\n            return w;\n        },\n        checkMinVersion: function(t) {\n            var u = s.getVersion();\n            if (!u) {\n                return false;\n            }\n        ;\n        ;\n            return ((q(u.join(\".\")) >= q(t)));\n        },\n        isAvailable: function() {\n            return !!s.getVersion();\n        }\n    };\n    e.exports = s;\n});\n__d(\"MercuryAudioPlayer\", [\"JSBNG__Event\",\"Arbiter\",\"DOM\",\"Flash\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"Arbiter\"), i = b(\"DOM\"), j = b(\"Flash\"), k = b(\"copyProperties\"), l = 200;\n    function m() {\n        var v = i.create(\"audio\"), w = false;\n        try {\n            if (!!v.canPlayType) {\n                if (v.canPlayType(\"video/mp4;\").replace(/^no$/, \"\")) {\n                    w = true;\n                }\n            ;\n            }\n        ;\n        ;\n        } finally {\n            return w;\n        };\n    ;\n    };\n;\n    function n() {\n        return j.isAvailable();\n    };\n;\n    var o = function() {\n        this.interval = null;\n        this.arbiterInstance = null;\n        this.audio = i.create(\"audio\");\n        g.listen(this.audio, \"playing\", function() {\n            this.informAttachment(\"playing\", this.audio.currentTime);\n            this.interval = JSBNG__setInterval(function() {\n                this.informAttachment(\"playing\", this.audio.currentTime);\n            }.bind(this), l);\n        }.bind(this));\n        g.listen(this.audio, \"ended\", function() {\n            JSBNG__clearInterval(this.interval);\n            this.informAttachment(\"finished\");\n        }.bind(this));\n    };\n    k(o.prototype, {\n        setAudio: function(v, w) {\n            this.audio.setAttribute(\"src\", v);\n            this.arbiterInstance = w;\n        },\n        informAttachment: function(v, w) {\n            if (this.arbiterInstance) {\n                this.arbiterInstance.inform(v, w);\n            }\n        ;\n        ;\n        },\n        play: function() {\n            this.audio.play();\n            this.informAttachment(\"played\");\n        },\n        resume: function() {\n            this.audio.play();\n            this.informAttachment(\"played\");\n        },\n        pause: function() {\n            this.audio.pause();\n            JSBNG__clearInterval(this.interval);\n            this.informAttachment(\"paused\");\n        },\n        getType: function() {\n            return \"html5\";\n        }\n    });\n    var p = function() {\n        this.src = null;\n        this.arbiterInstance = null;\n        var v = i.create(\"div\");\n        JSBNG__document.body.appendChild(v);\n        this.swf = j.embed(\"/swf/SoundStreamPlayer.swf\", v, null, {\n        });\n        this.interval = null;\n        h.subscribe(\"soundstream/finished\", function() {\n            JSBNG__clearInterval(this.interval);\n            this.informAttachment(\"finished\");\n        }.bind(this));\n    };\n    k(p.prototype, {\n        setAudio: function(v, w) {\n            this.src = v;\n            this.arbiterInstance = w;\n        },\n        informAttachment: function(v, w) {\n            if (this.arbiterInstance) {\n                this.arbiterInstance.inform(v, w);\n            }\n        ;\n        ;\n        },\n        play: function() {\n            this.swf.playSound(this.src);\n            this.interval = JSBNG__setInterval(function() {\n                var v = this.swf.getCurrentTime();\n                this.informAttachment(\"playing\", v);\n            }.bind(this), l);\n            this.informAttachment(\"played\");\n        },\n        resume: function() {\n            this.swf.resume();\n            this.informAttachment(\"played\");\n        },\n        pause: function() {\n            JSBNG__clearInterval(this.interval);\n            this.swf.pause();\n            this.informAttachment(\"paused\");\n        },\n        getType: function() {\n            return \"flash\";\n        }\n    });\n    function q() {\n        if (m()) {\n            return new o();\n        }\n         else if (n()) {\n            return new p();\n        }\n        \n    ;\n    ;\n        return false;\n    };\n;\n    var r = null, s = null, t = 0;\n    function u(v, w) {\n        this.src = v;\n        this.arbiterInstance = w;\n        this.audio_id = ++t;\n        ((((r !== null)) || (r = q())));\n        if (!r) {\n            return false;\n        }\n    ;\n    ;\n    };\n;\n    k(u.prototype, {\n        getType: function() {\n            if (!r) {\n                return false;\n            }\n             else return r.getType()\n        ;\n        },\n        play: function(v) {\n            if (((v && ((s == this.audio_id))))) {\n                r.resume();\n            }\n             else {\n                this.pause();\n                s = this.audio_id;\n                r.setAudio(this.src, this.arbiterInstance);\n                r.play();\n            }\n        ;\n        ;\n        },\n        pause: function() {\n            r.pause();\n        }\n    });\n    e.exports = u;\n});\n__d(\"MercuryAttachmentAudioClip.react\", [\"Arbiter\",\"ArbiterMixin\",\"MercuryAudioPlayer\",\"Env\",\"JSLogger\",\"LeftRight.react\",\"React\",\"cx\",\"shield\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ArbiterMixin\"), i = b(\"MercuryAudioPlayer\"), j = b(\"Env\"), k = b(\"JSLogger\"), l = b(\"LeftRight.react\"), m = b(\"React\"), n = b(\"cx\"), o = b(\"shield\"), p = b(\"tx\"), q = \"MercuryAttachmentAudioClip/play\", r = k.create(\"mercury_audio_clip\"), s = m.createClass({\n        displayName: \"AudioClip\",\n        mixins: [h,],\n        getInitialState: function() {\n            this.subscribe(\"playing\", this.updateTime);\n            this.subscribe(\"played\", o(this.setState, this, {\n                playing: true,\n                started: true\n            }));\n            this.subscribe(\"paused\", o(this.setState, this, {\n                playing: false\n            }));\n            this.subscribe(\"finished\", o(this.setState, this, {\n                playing: false,\n                started: false,\n                time: this.props.duration\n            }));\n            this.logged = false;\n            var t = ((this.props.downloadOnly ? false : new i(this.props.src, this)));\n            g.subscribe(q, function(u, v) {\n                if (((this.props.src != v))) {\n                    this.setState({\n                        time: 0\n                    });\n                }\n            ;\n            ;\n            }.bind(this));\n            return {\n                time: 0,\n                playing: false,\n                started: false,\n                duration: this.props.duration,\n                audioPlayer: t\n            };\n        },\n        updateTime: function(t, u) {\n            this.setState({\n                time: u\n            });\n        },\n        play: function() {\n            if (this.state.playing) {\n                this.state.audioPlayer.pause();\n            }\n             else {\n                this.state.audioPlayer.play(this.state.started);\n                g.inform(q, this.props.src);\n                if (!this.logged) {\n                    this.logged = true;\n                    r.log(\"play\", {\n                        uid: j.user,\n                        duration: this.props.duration\n                    });\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n        },\n        _formatSeconds: function(t) {\n            if (t) {\n                t = Math.ceil(t);\n                var u = ((t % 60));\n                if (((u < 10))) {\n                    u = ((\"0\" + u));\n                }\n            ;\n            ;\n                var v = Math.floor(((t / 60)));\n                return ((((v + \":\")) + u));\n            }\n             else return null\n        ;\n        },\n        _renderPlayer: function(t, u) {\n            return (m.DOM.a({\n                className: \"_1miz\",\n                style: {\n                    width: t\n                },\n                onClick: this.play\n            }, m.DOM.span({\n                className: \"_1mi-\"\n            }, m.DOM.i({\n                className: \"_1mi_\"\n            })), m.DOM.span({\n                className: \"_1mj0\"\n            }, u), m.DOM.div({\n                className: \"_1mj1\"\n            })));\n        },\n        render: function() {\n            var t = this.state.time, u = this.state.playing, v = this._formatSeconds(this.state.duration), w = ((this.props.width || 170)), x = null, y = Math.ceil(((((t * ((w + 2)))) / this.state.duration)));\n            if (((this.state.audioPlayer && this.state.audioPlayer.getType()))) {\n                var z = this._renderPlayer(w, v), aa = this._renderPlayer(w, v), ba = (((((\"_1mj2\") + ((((u && ((t !== 0)))) ? ((\" \" + \"_1mj3\")) : \"\")))) + ((((u && ((t === 0)))) ? ((\" \" + \"_4g4x\")) : \"\"))));\n                x = (m.DOM.div({\n                    className: ba\n                }, z, m.DOM.div({\n                    className: \"_1mj4\",\n                    style: {\n                        width: y\n                    }\n                }, aa)));\n            }\n             else x = (m.DOM.div({\n                className: \"_1mj2\"\n            }, m.DOM.div({\n                className: \"_1miz\"\n            }, l(null, m.DOM.a({\n                className: \"_1mj5\",\n                href: this.props.src\n            }, m.DOM.span({\n                className: \"_3qi6\"\n            }, m.DOM.i({\n                className: \"_1mj6\"\n            })), m.DOM.span({\n                className: \"_1mj7\"\n            }, \"Voice Message\"), m.DOM.span({\n                className: \"_1mj8\"\n            }, v)), m.DOM.a({\n                href: this.props.src,\n                className: \"_1mj9\"\n            }, m.DOM.i({\n                className: \"_1mja\"\n            }))))));\n        ;\n        ;\n            return (m.DOM.div({\n                className: \"_1mjb\"\n            }, x));\n        }\n    });\n    e.exports = s;\n});\n__d(\"MercuryStickersFlyoutList.react\", [\"Animation\",\"React\",\"JSBNG__Image.react\",\"cx\",\"fbt\",\"ix\",], function(a, b, c, d, e, f) {\n    var g = b(\"Animation\"), h = b(\"React\"), i = b(\"JSBNG__Image.react\"), j = b(\"cx\"), k = b(\"fbt\"), l = b(\"ix\"), m = 5, n = \"Sticker Store\", o = h.createClass({\n        displayName: \"MercuryStickersFlyoutList\",\n        _calculateNumPages: function(q) {\n            return Math.max(1, Math.ceil(((((q.length - 1)) / m))));\n        },\n        getInitialState: function() {\n            return {\n                animating: false,\n                selectedId: this.props.packs[0].id,\n                page: 0,\n                numPages: this._calculateNumPages(this.props.packs)\n            };\n        },\n        componentWillReceiveProps: function(q) {\n            this.setState({\n                numPages: this._calculateNumPages(q.packs)\n            });\n        },\n        shouldComponentUpdate: function(q, r) {\n            return !r.animating;\n        },\n        _canGoPrev: function() {\n            return ((this.state.page > 0));\n        },\n        _canGoNext: function() {\n            return ((((this.state.page + 1)) < this.state.numPages));\n        },\n        _setPage: function(q) {\n            if (this.state.animating) {\n                return;\n            }\n        ;\n        ;\n            this.setState({\n                animating: true,\n                page: q\n            });\n            var r = this.refs.positioner.getDOMNode();\n            new g(r).to(\"marginLeft\", ((-r.childNodes[q].offsetLeft + \"px\"))).ondone(function() {\n                this.setState({\n                    animating: false\n                });\n            }.bind(this)).duration(200).go();\n        },\n        _back: function() {\n            ((this._canGoPrev() && this._setPage(((this.state.page - 1)))));\n        },\n        _next: function() {\n            ((this._canGoNext() && this._setPage(((this.state.page + 1)))));\n        },\n        render: function() {\n            var q = this.props.packs, r = this.props.onPackClick, s = [];\n            q.forEach(function(y, z) {\n                s.push(p({\n                    key: y.id,\n                    onClick: function() {\n                        ((r && r(y.id)));\n                        this.setState({\n                            selectedId: y.id\n                        });\n                    }.bind(this),\n                    pack: y,\n                    selected: ((this.state.selectedId === y.id))\n                }));\n            }.bind(this));\n            var t = [], u = [];\n            s.forEach(function(y, z) {\n                u.push(y);\n                if (((((z > 0)) && ((((((z % m)) === 0)) || ((z === ((s.length - 1))))))))) {\n                    t.push(h.DOM.div({\n                        className: \"_58_z\"\n                    }, u));\n                    u = [];\n                }\n            ;\n            ;\n            });\n            var v = (((((\"_58_w\") + ((\" \" + \"lfloat\")))) + ((!this._canGoPrev() ? ((\" \" + \"hidden_elem\")) : \"\")))), w = (((((\"_58_x\") + ((\" \" + \"rfloat\")))) + ((!this._canGoNext() ? ((\" \" + \"hidden_elem\")) : \"\")))), x;\n            if (((t.length > 1))) {\n                x = h.DOM.a({\n                    className: w,\n                    onClick: this._next\n                }, i({\n                    className: \"_590q\",\n                    src: l(\"/images/messaging/stickers/selector/rightarrow.png\")\n                }));\n            }\n        ;\n        ;\n            return (h.DOM.div({\n                className: \"_5908\"\n            }, h.DOM.a({\n                ajaxify: \"/ajax/messaging/stickers/store\",\n                \"aria-label\": n,\n                className: \"_59wb rfloat\",\n                \"data-hover\": \"tooltip\",\n                ref: \"store\",\n                rel: \"dialog\"\n            }, i({\n                className: \"_5bo3\",\n                src: l(\"/images/messaging/stickers/selector/store.png\")\n            })), h.DOM.a({\n                className: v,\n                onClick: this._back\n            }, i({\n                className: \"_590q\",\n                src: l(\"/images/messaging/stickers/selector/leftarrow.png\")\n            })), x, h.DOM.div({\n                className: \"_590r\"\n            }, h.DOM.div({\n                className: \"_58_y\",\n                ref: \"positioner\"\n            }, t))));\n        }\n    }), p = h.createClass({\n        displayName: \"PackIcon\",\n        render: function() {\n            var q = this.props.pack, r = (((\"_55bn\") + ((this.props.selected ? ((\" \" + \"_55bo\")) : \"\"))));\n            return (h.DOM.a({\n                \"aria-label\": q.JSBNG__name,\n                className: r,\n                \"data-id\": q.id,\n                \"data-hover\": \"tooltip\",\n                onClick: function() {\n                    ((this.props.onClick && this.props.onClick(q.id)));\n                }.bind(this)\n            }, h.DOM.img({\n                className: \"_55bw\",\n                src: q.icon\n            }), h.DOM.img({\n                className: \"_590u\",\n                src: q.selectedIcon\n            })));\n        }\n    });\n    e.exports = o;\n});\n__d(\"str2rstr\", [], function(a, b, c, d, e, f) {\n    function g(h) {\n        var i = \"\", j, k;\n        for (var l = 0; ((l < h.length)); l++) {\n            j = h.charCodeAt(l);\n            k = ((((((l + 1)) < h.length)) ? h.charCodeAt(((l + 1))) : 0));\n            if (((((((((55296 <= j)) && ((j <= 56319)))) && ((56320 <= k)))) && ((k <= 57343))))) {\n                j = ((((65536 + ((((j & 1023)) << 10)))) + ((k & 1023))));\n                l++;\n            }\n        ;\n        ;\n            if (((j <= 127))) {\n                i += String.fromCharCode(j);\n            }\n             else if (((j <= 2047))) {\n                i += String.fromCharCode(((192 | ((((j >>> 6)) & 31)))), ((128 | ((j & 63)))));\n            }\n             else if (((j <= 65535))) {\n                i += String.fromCharCode(((224 | ((((j >>> 12)) & 15)))), ((128 | ((((j >>> 6)) & 63)))), ((128 | ((j & 63)))));\n            }\n             else if (((j <= 2097151))) {\n                i += String.fromCharCode(((240 | ((((j >>> 18)) & 7)))), ((128 | ((((j >>> 12)) & 63)))), ((128 | ((((j >>> 6)) & 63)))), ((128 | ((j & 63)))));\n            }\n            \n            \n            \n        ;\n        ;\n        };\n    ;\n        return i;\n    };\n;\n    e.exports = g;\n});\n__d(\"md5\", [\"str2rstr\",], function(a, b, c, d, e, f) {\n    var g = b(\"str2rstr\");\n    function h(u, v) {\n        var w = u[0], x = u[1], y = u[2], z = u[3];\n        w = j(w, x, y, z, v[0], 7, -680876936);\n        z = j(z, w, x, y, v[1], 12, -389564586);\n        y = j(y, z, w, x, v[2], 17, 606105819);\n        x = j(x, y, z, w, v[3], 22, -1044525330);\n        w = j(w, x, y, z, v[4], 7, -176418897);\n        z = j(z, w, x, y, v[5], 12, 1200080426);\n        y = j(y, z, w, x, v[6], 17, -1473231341);\n        x = j(x, y, z, w, v[7], 22, -45705983);\n        w = j(w, x, y, z, v[8], 7, 1770035416);\n        z = j(z, w, x, y, v[9], 12, -1958414417);\n        y = j(y, z, w, x, v[10], 17, -42063);\n        x = j(x, y, z, w, v[11], 22, -1990404162);\n        w = j(w, x, y, z, v[12], 7, 1804603682);\n        z = j(z, w, x, y, v[13], 12, -40341101);\n        y = j(y, z, w, x, v[14], 17, -1502002290);\n        x = j(x, y, z, w, v[15], 22, 1236535329);\n        w = k(w, x, y, z, v[1], 5, -165796510);\n        z = k(z, w, x, y, v[6], 9, -1069501632);\n        y = k(y, z, w, x, v[11], 14, 643717713);\n        x = k(x, y, z, w, v[0], 20, -373897302);\n        w = k(w, x, y, z, v[5], 5, -701558691);\n        z = k(z, w, x, y, v[10], 9, 38016083);\n        y = k(y, z, w, x, v[15], 14, -660478335);\n        x = k(x, y, z, w, v[4], 20, -405537848);\n        w = k(w, x, y, z, v[9], 5, 568446438);\n        z = k(z, w, x, y, v[14], 9, -1019803690);\n        y = k(y, z, w, x, v[3], 14, -187363961);\n        x = k(x, y, z, w, v[8], 20, 1163531501);\n        w = k(w, x, y, z, v[13], 5, -1444681467);\n        z = k(z, w, x, y, v[2], 9, -51403784);\n        y = k(y, z, w, x, v[7], 14, 1735328473);\n        x = k(x, y, z, w, v[12], 20, -1926607734);\n        w = l(w, x, y, z, v[5], 4, -378558);\n        z = l(z, w, x, y, v[8], 11, -2022574463);\n        y = l(y, z, w, x, v[11], 16, 1839030562);\n        x = l(x, y, z, w, v[14], 23, -35309556);\n        w = l(w, x, y, z, v[1], 4, -1530992060);\n        z = l(z, w, x, y, v[4], 11, 1272893353);\n        y = l(y, z, w, x, v[7], 16, -155497632);\n        x = l(x, y, z, w, v[10], 23, -1094730640);\n        w = l(w, x, y, z, v[13], 4, 681279174);\n        z = l(z, w, x, y, v[0], 11, -358537222);\n        y = l(y, z, w, x, v[3], 16, -722521979);\n        x = l(x, y, z, w, v[6], 23, 76029189);\n        w = l(w, x, y, z, v[9], 4, -640364487);\n        z = l(z, w, x, y, v[12], 11, -421815835);\n        y = l(y, z, w, x, v[15], 16, 530742520);\n        x = l(x, y, z, w, v[2], 23, -995338651);\n        w = m(w, x, y, z, v[0], 6, -198630844);\n        z = m(z, w, x, y, v[7], 10, 1126891415);\n        y = m(y, z, w, x, v[14], 15, -1416354905);\n        x = m(x, y, z, w, v[5], 21, -57434055);\n        w = m(w, x, y, z, v[12], 6, 1700485571);\n        z = m(z, w, x, y, v[3], 10, -1894986606);\n        y = m(y, z, w, x, v[10], 15, -1051523);\n        x = m(x, y, z, w, v[1], 21, -2054922799);\n        w = m(w, x, y, z, v[8], 6, 1873313359);\n        z = m(z, w, x, y, v[15], 10, -30611744);\n        y = m(y, z, w, x, v[6], 15, -1560198380);\n        x = m(x, y, z, w, v[13], 21, 1309151649);\n        w = m(w, x, y, z, v[4], 6, -145523070);\n        z = m(z, w, x, y, v[11], 10, -1120210379);\n        y = m(y, z, w, x, v[2], 15, 718787259);\n        x = m(x, y, z, w, v[9], 21, -343485551);\n        u[0] = s(w, u[0]);\n        u[1] = s(x, u[1]);\n        u[2] = s(y, u[2]);\n        u[3] = s(z, u[3]);\n    };\n;\n    function i(u, v, w, x, y, z) {\n        v = s(s(v, u), s(x, z));\n        return s(((((v << y)) | ((v >>> ((32 - y)))))), w);\n    };\n;\n    function j(u, v, w, x, y, z, aa) {\n        return i(((((v & w)) | (((~v) & x)))), u, v, y, z, aa);\n    };\n;\n    function k(u, v, w, x, y, z, aa) {\n        return i(((((v & x)) | ((w & (~x))))), u, v, y, z, aa);\n    };\n;\n    function l(u, v, w, x, y, z, aa) {\n        return i(((((v ^ w)) ^ x)), u, v, y, z, aa);\n    };\n;\n    function m(u, v, w, x, y, z, aa) {\n        return i(((w ^ ((v | (~x))))), u, v, y, z, aa);\n    };\n;\n    function n(u) {\n        var v = u.length, w = [1732584193,-271733879,-1732584194,271733878,], x;\n        for (x = 64; ((x <= u.length)); x += 64) {\n            h(w, o(u.substring(((x - 64)), x)));\n        ;\n        };\n    ;\n        u = u.substring(((x - 64)));\n        var y = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,];\n        for (x = 0; ((x < u.length)); x++) {\n            y[((x >> 2))] |= ((u.charCodeAt(x) << ((((x & 3)) << 3))));\n        ;\n        };\n    ;\n        y[((x >> 2))] |= ((128 << ((((x & 3)) << 3))));\n        if (((x > 55))) {\n            h(w, y);\n            for (x = 0; ((x < 16)); x++) {\n                y[x] = 0;\n            ;\n            };\n        ;\n        }\n    ;\n    ;\n        y[14] = ((v * 8));\n        h(w, y);\n        return w;\n    };\n;\n    function o(u) {\n        var v = [], w = 0;\n        while (((w < 64))) {\n            v[((w >> 2))] = ((((((u.charCodeAt(w++) | ((u.charCodeAt(w++) << 8)))) | ((u.charCodeAt(w++) << 16)))) | ((u.charCodeAt(w++) << 24))));\n        ;\n        };\n    ;\n        return v;\n    };\n;\n    var p = \"0123456789abcdef\".split(\"\");\n    function q(u) {\n        var v = \"\", w = 0;\n        for (; ((w < 4)); w++) {\n            v += ((p[((((u >> ((((w << 3)) + 4)))) & 15))] + p[((((u >> ((w << 3)))) & 15))]));\n        ;\n        };\n    ;\n        return v;\n    };\n;\n    function r(u) {\n        for (var v = 0; ((v < u.length)); v++) {\n            u[v] = q(u[v]);\n        ;\n        };\n    ;\n        return u.join(\"\");\n    };\n;\n    var s = function(u, v) {\n        return ((((u + v)) & 4294967295));\n    };\n    function t(u) {\n        if (((((null === u)) || ((undefined === u))))) {\n            return null;\n        }\n         else {\n            for (var v = 0; ((v < u.length)); v++) {\n                if (((u[v] > \"\"))) {\n                    u = g(u);\n                    break;\n                }\n            ;\n            ;\n            };\n        ;\n            return r(n(u));\n        }\n    ;\n    ;\n    };\n;\n    if (((t(\"hello\") != \"5d41402abc4b2a76b9719d911017c592\"))) {\n        s = function(u, v) {\n            var w = ((((u & 65535)) + ((v & 65535)))), x = ((((((u >> 16)) + ((v >> 16)))) + ((w >> 16))));\n            return ((((x << 16)) | ((w & 65535))));\n        };\n    }\n;\n;\n    e.exports = t;\n});\n__d(\"isRTL\", [], function(a, b, c, d, e, f) {\n    var g = ((\"A-Za-z\\u00c0-\\u00d6\\u00d8-\\u00f6\\u00f8-\\u02b8\\u0300-\\u0590\\u0800-\\u1fff\" + \"\\u200e\\u2c00-\\ufb1c\\ufe00-\\ufe6f\\ufefd-\\uffff\")), h = \"\\u0591-\\u07ff\\u200f\\ufb1d-\\ufdff\\ufe70-\\ufefc\", i = new RegExp(((((((((\"^[^\" + g)) + \"]*[\")) + h)) + \"]\"))), j = new RegExp(((((\"[\" + g)) + \"]\")));\n    function k(l) {\n        var m = 0, n = 0;\n        l.split(/\\s+/, 20).forEach(function(o) {\n            if (/^https?:\\/\\//.test(o)) {\n                return;\n            }\n        ;\n        ;\n            if (i.test(o)) {\n                n++;\n                m++;\n            }\n             else if (j.test(o)) {\n                m++;\n            }\n            \n        ;\n        ;\n        });\n        return !!((m && ((((n / m)) > 14503))));\n    };\n;\n    e.exports = k;\n});\n__d(\"WaterfallIDGenerator\", [\"Env\",\"md5\",], function(a, b, c, d, e, f) {\n    var g = b(\"Env\"), h = b(\"md5\");\n    function i() {\n        var l = 2147483647;\n        return ((Math.JSBNG__random() * l));\n    };\n;\n    function j() {\n        return Math.floor(((JSBNG__Date.now() / 1000)));\n    };\n;\n    var k = {\n        generate: function() {\n            return h([g.user,j(),i(),].join(\":\"));\n        }\n    };\n    e.exports = k;\n});\n__d(\"FeatureDetection\", [\"UserAgent\",], function(a, b, c, d, e, f) {\n    var g = b(\"UserAgent\");\n    e.exports = {\n        isFileAPISupported: function() {\n            if (((((g.webkit() && !g.chrome())) && g.windows()))) {\n                return false;\n            }\n        ;\n        ;\n            return ((((\"JSBNG__FileList\" in window)) && ((\"JSBNG__FormData\" in window))));\n        },\n        isBlobFactorySupported: function() {\n            return !!a.JSBNG__Blob;\n        }\n    };\n});\n__d(\"AsyncUploadBase\", [\"ArbiterMixin\",\"AsyncRequest\",\"AsyncResponse\",\"Form\",\"FeatureDetection\",\"copyProperties\",\"removeFromArray\",], function(a, b, c, d, e, f) {\n    var g = b(\"ArbiterMixin\"), h = b(\"AsyncRequest\"), i = b(\"AsyncResponse\"), j = b(\"Form\"), k = b(\"FeatureDetection\"), l = b(\"copyProperties\"), m = b(\"removeFromArray\");\n    function n(p) {\n        this.setURI(p);\n    };\n;\n    n.isSupported = function() {\n        return k.isFileAPISupported();\n    };\n    l(n.prototype, g, {\n        _limit: 10,\n        setAllowCrossOrigin: function(p) {\n            this._allowCrossOrigin = !!p;\n            return this;\n        },\n        setData: function(p) {\n            this._data = p;\n            return this;\n        },\n        setLimit: function(p) {\n            this._limit = p;\n            return this;\n        },\n        setRelativeTo: function(p) {\n            this._relativeTo = p;\n            return this;\n        },\n        setStatusElement: function(p) {\n            this._statusElement = p;\n            return this;\n        },\n        setURI: function(p) {\n            this._uri = p;\n            return this;\n        },\n        suspend: function() {\n            this._suspended = true;\n            return this;\n        },\n        resume: function() {\n            this._suspended = false;\n            this._processQueue();\n            return this;\n        },\n        isUploading: function() {\n            return this._inFlight;\n        },\n        _createFileUpload: function(p, q, r) {\n            return new o(p, q, r);\n        },\n        _parseFiles: function(p) {\n            var q = {\n            };\n            {\n                var fin262keys = ((window.top.JSBNG_Replay.forInKeys)((p))), fin262i = (0);\n                var r;\n                for (; (fin262i < fin262keys.length); (fin262i++)) {\n                    ((r) = (fin262keys[fin262i]));\n                    {\n                        var s = p[r];\n                        if (Array.isArray(s)) {\n                            q[r] = s;\n                        }\n                         else {\n                            q[r] = [];\n                            if (((s instanceof window.JSBNG__FileList))) {\n                                for (var t = 0; ((t < s.length)); t++) {\n                                    q[r].push(s.item(t));\n                                ;\n                                };\n                            ;\n                            }\n                             else if (((((s instanceof window.JSBNG__File)) || ((s instanceof window.JSBNG__Blob))))) {\n                                q[r].push(s);\n                            }\n                            \n                        ;\n                        ;\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            return q;\n        },\n        _processQueue: function() {\n            if (this._suspended) {\n                return;\n            }\n        ;\n        ;\n            while (((this._pending.length < this._limit))) {\n                if (!this._waiting.length) {\n                    break;\n                }\n            ;\n            ;\n                var p = this._waiting.shift();\n                this._processUpload(p);\n                this._pending.push(p);\n            };\n        ;\n        },\n        _processUpload: function(p) {\n            var q = j.createFormData(((p.getData() || this._data)));\n            if (p.getFile()) {\n                q.append(p.getName(), p.getFile());\n                q.append(\"upload_id\", p.getFile().uploadID);\n            }\n        ;\n        ;\n            var r = new h().setAllowCrossOrigin(this._allowCrossOrigin).setURI(this._uri).setRawData(q).setRelativeTo(this._relativeTo).setStatusElement(this._statusElement).setHandler(this._success.bind(this, p)).setErrorHandler(this._failure.bind(this, p)).setUploadProgressHandler(this._progress.bind(this, p)).setInitialHandler(this._initial.bind(this, p));\n            r.send();\n            p.setAsyncRequest(r);\n            this._inFlight = true;\n            this.inform(\"start\", p);\n        },\n        _abort: function(p) {\n            m(this._waiting, p);\n            p.abort();\n        },\n        _initial: function(p) {\n            this.inform(\"initial\", p);\n        },\n        _success: function(p, q) {\n            this._complete(p);\n            this.inform(\"success\", p.handleSuccess(q));\n            this._processQueue();\n        },\n        _failure: function(p, q) {\n            this._complete(p);\n            if (((this.inform(\"failure\", p.handleFailure(q)) !== false))) {\n                i.defaultErrorHandler(q);\n            }\n        ;\n        ;\n            this._processQueue();\n        },\n        _progress: function(p, JSBNG__event) {\n            this.inform(\"progress\", p.handleProgress(JSBNG__event));\n        },\n        _complete: function(p) {\n            m(this._pending, p);\n            if (!this._pending.length) {\n                this._inFlight = false;\n            }\n        ;\n        ;\n        }\n    });\n    var o = function(p, q, r) {\n        this._name = p;\n        this._file = q;\n        this._data = r;\n        this._success = null;\n        this._response = null;\n        this._progressEvent = null;\n        this._request = null;\n    };\n    l(o.prototype, {\n        getName: function() {\n            return this._name;\n        },\n        getFile: function() {\n            return this._file;\n        },\n        getData: function() {\n            return this._data;\n        },\n        isComplete: function() {\n            return ((this._success !== null));\n        },\n        isSuccess: function() {\n            return ((this._success === true));\n        },\n        getResponse: function() {\n            return this._response;\n        },\n        getProgressEvent: function() {\n            return this._progressEvent;\n        },\n        setAsyncRequest: function(p) {\n            this._request = p;\n            return this;\n        },\n        isWaiting: function() {\n            return !this._request;\n        },\n        abort: function() {\n            ((this._request && this._request.abort()));\n            this._request = null;\n        },\n        handleSuccess: function(p) {\n            this._success = true;\n            this._response = p;\n            this._progressEvent = null;\n            return this;\n        },\n        handleFailure: function(p) {\n            this._success = false;\n            this._response = p;\n            this._progressEvent = null;\n            return this;\n        },\n        handleProgress: function(JSBNG__event) {\n            this._progressEvent = JSBNG__event;\n            return this;\n        }\n    });\n    e.exports = n;\n});\n__d(\"AsyncUploadRequest\", [\"AsyncUploadBase\",\"Class\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncUploadBase\"), h = b(\"Class\"), i = b(\"copyProperties\");\n    function j(k) {\n        this.parent.construct(this, k);\n    };\n;\n    j.isSupported = function() {\n        return g.isSupported();\n    };\n    h.extend(j, g);\n    i(j.prototype, {\n        setFiles: function(k) {\n            this._files = this._parseFiles(k);\n            return this;\n        },\n        send: function() {\n            if (this._inFlight) {\n                return;\n            }\n        ;\n        ;\n            this._inFlight = true;\n            this._uploads = [];\n            {\n                var fin263keys = ((window.top.JSBNG_Replay.forInKeys)((this._files))), fin263i = (0);\n                var k;\n                for (; (fin263i < fin263keys.length); (fin263i++)) {\n                    ((k) = (fin263keys[fin263i]));\n                    {\n                        this._files[k].forEach(function(l) {\n                            this._uploads.push(this._createFileUpload(k, l));\n                        }.bind(this));\n                    ;\n                    };\n                };\n            };\n        ;\n            if (this._uploads.length) {\n                this._waiting = this._uploads.slice(0);\n                this._pending = [];\n                this._processQueue();\n            }\n             else this._processUpload(this._createFileUpload(null, null));\n        ;\n        ;\n        },\n        _processQueue: function() {\n            this.parent._processQueue();\n            if (((!this._pending.length && !this._waiting.length))) {\n                this.inform(\"complete\", this._uploads);\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = j;\n});\n__d(\"FileForm\", [\"ArbiterMixin\",\"AsyncRequest\",\"AsyncResponse\",\"AsyncUploadRequest\",\"BehaviorsMixin\",\"DataStore\",\"DOMQuery\",\"Env\",\"JSBNG__Event\",\"Form\",\"JSONPTransport\",\"Parent\",\"URI\",\"copyProperties\",\"shield\",], function(a, b, c, d, e, f) {\n    var g = b(\"ArbiterMixin\"), h = b(\"AsyncRequest\"), i = b(\"AsyncResponse\"), j = b(\"AsyncUploadRequest\"), k = b(\"BehaviorsMixin\"), l = b(\"DataStore\"), m = b(\"DOMQuery\"), n = b(\"Env\"), o = b(\"JSBNG__Event\"), p = b(\"Form\"), q = b(\"JSONPTransport\"), r = b(\"Parent\"), s = b(\"URI\"), t = b(\"copyProperties\"), u = b(\"shield\");\n    function v(y) {\n        var z = {\n        }, aa = m.scry(y, \"input[type=\\\"file\\\"]\");\n        aa.forEach(function(ba) {\n            z[ba.JSBNG__name] = ba.files;\n        });\n        return z;\n    };\n;\n    function w(y) {\n        var z = m.scry(y, \"input[type=\\\"file\\\"]\");\n        z.forEach(function(aa) {\n            aa.files = null;\n        });\n    };\n;\n    function x(y, z, aa) {\n        if (((y.getAttribute(\"rel\") === \"async\"))) {\n            throw new Error(\"FileForm cannot be used with Primer forms.\");\n        }\n    ;\n    ;\n        if (((y.getAttribute(\"method\").toUpperCase() !== \"POST\"))) {\n            throw new Error(\"FileForm must be used with POST forms.\");\n        }\n    ;\n    ;\n        this._form = y;\n        this._previousEncoding = this._form.enctype;\n        this._form.enctype = this._form.encoding = \"multipart/form-data\";\n        ((z && this.enableBehaviors(z)));\n        this._options = ((aa || {\n        }));\n        this.setAllowCrossOrigin(this._options.allowCrossOrigin);\n        this.setUploadInParallel(this._options.uploadInParallel);\n        this._listener = o.listen(this._form, \"submit\", this._submit.bind(this));\n        l.set(this._form, \"FileForm\", this);\n    };\n;\n    t(x, {\n        EVENTS: [\"start\",\"submit\",\"initial\",\"progress\",\"success\",\"failure\",],\n        getInstance: function(y) {\n            return l.get(y, \"FileForm\");\n        }\n    });\n    t(x.prototype, g, k, {\n        getRoot: function() {\n            return this._form;\n        },\n        setAllowCrossOrigin: function(y) {\n            this._allowCrossOrigin = !!y;\n            return this;\n        },\n        setUploadInParallel: function(y) {\n            this._uploadInParallel = !!y;\n            return this;\n        },\n        _submit: function(JSBNG__event) {\n            if (((this.inform(\"submit\") === false))) {\n                JSBNG__event.prevent();\n                return;\n            }\n        ;\n        ;\n            var y = ((\"JSBNG__FormData\" in window));\n            if (y) {\n                if (((!s(this._form.action).isSameOrigin() && !this._allowCrossOrigin))) {\n                    y = false;\n                }\n            ;\n            }\n        ;\n        ;\n            return ((y ? this._sendViaXHR(JSBNG__event) : this._sendViaFrame(JSBNG__event)));\n        },\n        _sendViaFrame: function(JSBNG__event) {\n            var y = this._request = new h();\n            y.setStatusElement(this._getStatusElement());\n            y.addStatusIndicator();\n            y.setOption(\"useIframeTransport\", true);\n            var z = y.handleResponse.bind(y), aa = new q(\"div\", this._form.action, z), ba = aa.getTransportFrame(), ca = aa.getRequestURI().addQueryData({\n                __iframe: true,\n                __user: n.user\n            });\n            this._form.setAttribute(\"action\", ca.toString());\n            this._form.setAttribute(\"target\", ba.JSBNG__name);\n            y.setJSONPTransport(aa);\n            y.setURI(ca);\n            y.setHandler(this.success.bind(this, null));\n            y.setErrorHandler(this.failure.bind(this, null));\n            y.setInitialHandler(u(this.initial, this, null));\n        },\n        _sendViaXHR: function(JSBNG__event) {\n            var y;\n            if (((this._uploadInParallel && j.isSupported()))) {\n                y = new j().setData(p.serialize(this._form)).setFiles(v(this._form));\n                var z = [y.subscribe(\"progress\", function(aa, ba) {\n                    this.progress(ba, ba.getProgressEvent());\n                }.bind(this)),y.subscribe(\"initial\", function(aa, ba) {\n                    this.initial(ba, ba.getResponse());\n                }.bind(this)),y.subscribe(\"success\", function(aa, ba) {\n                    this.success(ba, ba.getResponse());\n                }.bind(this)),y.subscribe(\"start\", function(aa, ba) {\n                    this.inform(\"start\", {\n                        upload: ba\n                    });\n                }.bind(this)),y.subscribe(\"failure\", function(aa, ba) {\n                    this.failure(ba, ba.getResponse());\n                    return false;\n                }.bind(this)),y.subscribe(\"complete\", function() {\n                    while (z.length) {\n                        z.pop().unsubscribe();\n                    ;\n                    };\n                ;\n                }),];\n            }\n             else y = new h().setRawData(p.createFormData(this._form)).setHandler(this.success.bind(this, null)).setErrorHandler(this.failure.bind(this, null)).setUploadProgressHandler(this.progress.bind(this, null)).setInitialHandler(u(this.initial, this, null));\n        ;\n        ;\n            y.setAllowCrossOrigin(this._allowCrossOrigin).setRelativeTo(this._form).setStatusElement(this._getStatusElement()).setURI(this._form.action).send();\n            this._request = y;\n            JSBNG__event.prevent();\n        },\n        initial: function(y) {\n            return this.inform(\"initial\", {\n                upload: y\n            });\n        },\n        success: function(y, z) {\n            var aa = {\n                response: z,\n                upload: y\n            };\n            if (((this.inform(\"success\", aa) !== false))) {\n                o.fire(this._form, \"success\", aa);\n            }\n        ;\n        ;\n            this._cleanup();\n        },\n        failure: function(y, z) {\n            var aa = {\n                response: z,\n                upload: y\n            };\n            if (((this.inform(\"failure\", aa) !== false))) {\n                if (((o.fire(this._form, \"error\", aa) !== false))) {\n                    i.defaultErrorHandler(z);\n                }\n            ;\n            }\n        ;\n        ;\n            this._cleanup();\n        },\n        progress: function(y, JSBNG__event) {\n            this.inform(\"progress\", {\n                JSBNG__event: JSBNG__event,\n                upload: y\n            });\n        },\n        abort: function() {\n            if (this._request) {\n                this._request.abort();\n                this._cleanup();\n            }\n        ;\n        ;\n        },\n        clear: function() {\n            w(this._form);\n        },\n        destroy: function() {\n            this._cleanup();\n            this._listener.remove();\n            this._listener = null;\n            this._form.enctype = this._form.encoding = this._previousEncoding;\n            l.remove(this._form, \"FileForm\");\n        },\n        _cleanup: function() {\n            this._request = null;\n        },\n        _getStatusElement: function() {\n            return ((r.byClass(this._form, \"stat_elem\") || this._form));\n        }\n    });\n    e.exports = x;\n});\n__d(\"FileFormResetOnSubmit\", [\"DOMQuery\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOMQuery\"), h = b(\"copyProperties\");\n    function i(j) {\n        this._form = j;\n    };\n;\n    h(i.prototype, {\n        enable: function() {\n            this._subscription = this._form.subscribe(\"submit\", Function.prototype.defer.bind(this._reset.bind(this)));\n        },\n        disable: function() {\n            this._subscription.unsubscribe();\n            this._subscription = null;\n        },\n        _reset: function() {\n            var j = g.scry(this._form.getRoot(), \"input[type=\\\"file\\\"]\");\n            j.forEach(function(k) {\n                k.value = \"\";\n            });\n        }\n    });\n    e.exports = i;\n});\n__d(\"submitForm\", [\"DOM\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOM\"), h = function(i) {\n        var j = g.scry(i, \"input[type=\\\"submit\\\"]\")[0];\n        if (j) {\n            j.click();\n        }\n         else {\n            j = g.create(\"input\", {\n                type: \"submit\",\n                className: \"hidden_elem\"\n            });\n            g.appendContent(i, j);\n            j.click();\n            g.remove(j);\n        }\n    ;\n    ;\n    };\n    e.exports = h;\n});\n__d(\"FormSubmitOnChange\", [\"JSBNG__Event\",\"copyProperties\",\"submitForm\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"copyProperties\"), i = b(\"submitForm\");\n    function j(k) {\n        this._form = k;\n    };\n;\n    h(j.prototype, {\n        _listener: null,\n        enable: function() {\n            this._listener = g.listen(this._form.getRoot(), \"change\", this._submit.bind(this));\n        },\n        disable: function() {\n            this._listener.remove();\n            this._listener = null;\n        },\n        _submit: function() {\n            i(this._form.getRoot());\n        }\n    });\n    e.exports = j;\n});\n__d(\"MercuryFileUploader\", [\"ArbiterMixin\",\"CSS\",\"Dialog\",\"DOM\",\"JSBNG__Event\",\"FileForm\",\"FileFormResetOnSubmit\",\"FileInput\",\"FormSubmitOnChange\",\"MercuryAttachment\",\"MercuryAttachmentTemplates\",\"MercuryConstants\",\"SubscriptionsHandler\",\"copyProperties\",\"csx\",\"getObjectValues\",\"shield\",\"startsWith\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"ArbiterMixin\"), h = b(\"CSS\"), i = b(\"Dialog\"), j = b(\"DOM\"), k = b(\"JSBNG__Event\"), l = b(\"FileForm\"), m = b(\"FileFormResetOnSubmit\"), n = b(\"FileInput\"), o = b(\"FormSubmitOnChange\"), p = b(\"MercuryAttachment\"), q = b(\"MercuryAttachmentTemplates\"), r = b(\"MercuryConstants\"), s = b(\"SubscriptionsHandler\"), t = b(\"copyProperties\"), u = b(\"csx\"), v = b(\"getObjectValues\"), w = b(\"shield\"), x = b(\"startsWith\"), y = b(\"tx\"), z = 0;\n    function aa(ca, da, ea, fa) {\n        this._parentElem = ca;\n        this._attachments = {\n        };\n        this._imageIDs = {\n        };\n        this._uploading = {\n        };\n        this._uploadTemplates = {\n        };\n        this._uploadStartTimes = {\n        };\n        this._subscriptionsHandler = new s();\n        this._fileForm = new l(da, [o,m,]);\n        this._fileForm.setAllowCrossOrigin(true);\n        this._fileForm.setUploadInParallel(true);\n        var ga = j.JSBNG__find(da, \"._4q60\"), ha = j.JSBNG__find(ga, \"._4q61\");\n        new n(ga, ha, ea);\n        h.hide(this._parentElem);\n        this._subscriptionsHandler.addSubscriptions(this._fileForm.subscribe(\"submit\", function() {\n            var ia = ((\"upload_\" + z++));\n            fa.value = ia;\n            var ja = {\n                count: 0,\n                file_sizes: []\n            };\n            if (ea.files) {\n                for (var ka = 0; ((ka < ea.files.length)); ka++) {\n                    if (((ea.files[ka].size > r.AttachmentMaxSize))) {\n                        this._fileForm.abort();\n                        this._fileForm.clear();\n                        new i().setTitle(\"The file you have selected is too large\").setBody(\"The file you have selected is too large. The maximum size is 25MB.\").setButtons(i.OK).setSemiModal(true).show();\n                        return false;\n                    }\n                ;\n                ;\n                };\n            ;\n                for (var la = 0; ((la < ea.files.length)); la++) {\n                    this._addFileUploadRow(ia, ea.files[la].JSBNG__name);\n                    ja.count++;\n                    ja.file_sizes.push(ea.files[la].size);\n                };\n            ;\n            }\n             else {\n                this._addFileUploadRow(ia, ea.value);\n                ja.count = 1;\n            }\n        ;\n        ;\n            this.inform(\"submit\", ja);\n        }.bind(this)), this._fileForm.subscribe(\"success\", this._onFileUploadSuccess.bind(this)), this._fileForm.subscribe(\"failure\", this._onFileUploadFailure.bind(this)), k.listen(ha, \"click\", w(this.inform, this, \"open\")));\n    };\n;\n    t(aa.prototype, g, {\n        isUploading: function() {\n            return !!Object.keys(this._uploading).length;\n        },\n        getAttachments: function() {\n            return v(this._attachments);\n        },\n        getImageIDs: function() {\n            return v(this._imageIDs);\n        },\n        removeAttachments: function() {\n            v(this._uploadTemplates).forEach(function(ca) {\n                if (ca) {\n                    j.remove(ca.getRoot());\n                }\n            ;\n            ;\n            });\n            this._attachments = {\n            };\n            this._imageIDs = {\n            };\n            this._uploadTemplates = {\n            };\n            this._uploading = {\n            };\n            this._uploadStartTimes = {\n            };\n            h.hide(this._parentElem);\n            this.inform(\"dom-updated\");\n        },\n        destroy: function() {\n            this._subscriptionsHandler.release();\n            this._fileForm.destroy();\n            this.removeAttachments();\n        },\n        _addFileUploadRow: function(ca, da) {\n            var ea = q[\":fb:mercury:upload-file-row\"].build(), fa = ba(da), ga = ((((ca + \"/\")) + fa));\n            this._uploadTemplates[ga] = ea;\n            this._uploading[ga] = true;\n            this._uploadStartTimes[ga] = JSBNG__Date.now();\n            j.appendContent(ea.getNode(\"iconText\"), fa);\n            k.listen(ea.getNode(\"closeFileUpload\"), \"click\", this._removeFileUploader.bind(this, ga));\n            j.appendContent(this._parentElem, ea.getRoot());\n            h.show(this._parentElem);\n            this.inform(\"dom-updated\");\n        },\n        _removeFileUploader: function(ca, JSBNG__event) {\n            if (this._uploading[ca]) {\n                this.inform(\"upload-canceled-during-upload\");\n            }\n             else if (((this._attachments[ca] || this._imageIDs[ca]))) {\n                this.inform(\"upload-canceled-after-uploaded\");\n            }\n            \n        ;\n        ;\n            delete this._attachments[ca];\n            delete this._imageIDs[ca];\n            delete this._uploading[ca];\n            delete this._uploadStartTimes[ca];\n            var da = this._uploadTemplates[ca];\n            delete this._uploadTemplates[ca];\n            if (da) {\n                j.remove(da.getRoot());\n                this.inform(\"dom-updated\");\n            }\n        ;\n        ;\n            this.inform(\"upload-canceled\");\n            return false;\n        },\n        _updateFileUploader: function(ca, da) {\n            var ea = this._uploadTemplates[ca], fa = p.getAttachIconClassByMime(da);\n            h.addClass(ea.getNode(\"iconText\"), fa);\n            h.addClass(ea.getRoot(), \"done\");\n        },\n        _onFileUploadSuccess: function(JSBNG__event, ca) {\n            var da = ca.response.getPayload(), ea = da.uploadID, fa = da.metadata;\n            for (var ga = 0; ((ga < fa.length)); ga++) {\n                var ha = ((((ea + \"/\")) + fa[ga].filename));\n                if (this._uploading[ha]) {\n                    delete this._uploading[ha];\n                    if (fa[ga].image_id) {\n                        this._imageIDs[ha] = fa[ga].image_id;\n                    }\n                     else this._attachments[ha] = fa[ga];\n                ;\n                ;\n                    this._updateFileUploader(ha, fa[ga].filetype);\n                    this.inform(\"one-upload-completed\", {\n                        upload_time_ms: ((JSBNG__Date.now() - this._uploadStartTimes[ha]))\n                    });\n                }\n            ;\n            ;\n            };\n        ;\n            if (!this.isUploading()) {\n                this.inform(\"all-uploads-completed\", {\n                    count: this.getAttachments().length\n                });\n            }\n        ;\n        ;\n        },\n        _onFileUploadFailure: function(JSBNG__event, ca) {\n            this.inform(\"one-upload-failed\");\n        }\n    });\n    function ba(ca) {\n        if (((ca && x(ca, \"C:\\\\fakepath\\\\\")))) {\n            return ca.substring(12);\n        }\n    ;\n    ;\n        return ca;\n    };\n;\n    e.exports = aa;\n});\n__d(\"JoinableConversationMessageFilter\", [\"MercuryLogMessageType\",\"MercuryThreads\",\"MercuryParticipants\",], function(a, b, c, d, e, f) {\n    var g = b(\"MercuryLogMessageType\"), h = b(\"MercuryThreads\").get(), i = b(\"MercuryParticipants\"), j = {\n        _isFilterable: function(k) {\n            var l = k.log_message_type;\n            if (!l) {\n                return false;\n            }\n        ;\n        ;\n            if (((l == g.JOINABLE_JOINED))) {\n                return ((k.log_message_data.joined_participant !== i.user));\n            }\n        ;\n        ;\n            if (((((l == g.UNSUBSCRIBE)) || ((l == g.SUBSCRIBE))))) {\n                var m = h.getThreadMetaNow(k.thread_id);\n                if (((m && m.is_joinable))) {\n                    return ((k.author !== i.user));\n                }\n            ;\n            ;\n                return false;\n            }\n        ;\n        ;\n            return false;\n        },\n        filterMessages: function(k, l, m) {\n            var n = [];\n            for (var o = 0; ((o < l.length)); o++) {\n                var p = l[o];\n                if (j._isFilterable(p)) {\n                    if (m) {\n                        k(p);\n                    }\n                ;\n                ;\n                }\n                 else n.push(p);\n            ;\n            ;\n            };\n        ;\n            return n;\n        }\n    };\n    e.exports = j;\n});\n__d(\"MercuryThreadMuter\", [\"AsyncDialog\",\"AsyncRequest\",\"Env\",\"MercuryThreads\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncDialog\"), h = b(\"AsyncRequest\"), i = b(\"Env\"), j = b(\"MercuryThreads\").get(), k = {\n        getUserIDEmail: function() {\n            return ((i.user + \"@facebook.com\"));\n        },\n        getThreadMuteSettingForUser: function(l) {\n            return ((l.mute_settings && l.mute_settings[k.getUserIDEmail()]));\n        },\n        isThreadMuted: function(l) {\n            return ((k.getThreadMuteSettingForUser(l) !== undefined));\n        },\n        showMuteChangeDialog: function(l, m) {\n            g.send(new h(\"/ajax/mercury/mute_thread_dialog.php\").setData({\n                muting: l\n            }), function(n) {\n                n.subscribe(\"JSBNG__confirm\", function() {\n                    this.hide();\n                    j.updateThreadMuteSetting(m, l);\n                }.bind(n));\n            });\n        }\n    };\n    e.exports = k;\n});\n__d(\"JoinStatusTabSheet\", [\"copyProperties\",\"DOM\",\"MercuryLogMessageType\",\"MercuryParticipants\",], function(a, b, c, d, e, f) {\n    var g = b(\"copyProperties\"), h = b(\"DOM\"), i = b(\"MercuryLogMessageType\"), j = b(\"MercuryParticipants\");\n    function k(l, m) {\n        this._rootElement = l;\n        this._messageQueue = [];\n        this._sheetView = m;\n    };\n;\n    g(k.prototype, {\n        _setMessage: function(l, m) {\n            var n = l.author, o = l.log_message_type;\n            if (((o == i.JOINABLE_JOINED))) {\n                var p = l.log_message_data.joined_participant;\n                if (((p !== j.user))) {\n                    j.get(p, function(s) {\n                        h.setContent(m, h.tx._(\"{actor} joined the chat.\", {\n                            actor: s.JSBNG__name\n                        }));\n                    });\n                }\n            ;\n            ;\n            }\n             else if (((o == i.UNSUBSCRIBE))) {\n                if (((n !== j.user))) {\n                    j.get(n, function(s) {\n                        h.setContent(m, h.tx._(\"{actor} left the conversation.\", {\n                            actor: s.JSBNG__name\n                        }));\n                    });\n                }\n            ;\n            ;\n            }\n             else if (((o == i.SUBSCRIBE))) {\n                if (((n !== j.user))) {\n                    var q = l.log_message_data.added_participants;\n                    if (((q && ((q.length > 0))))) {\n                        var r = [n,q[0],];\n                        j.getMulti(r, function(s) {\n                            h.setContent(m, h.tx._(\"{actor} added {subscriber1}.\", {\n                                actor: s[n].JSBNG__name,\n                                subscriber1: s[q[0]].JSBNG__name\n                            }));\n                        });\n                    }\n                ;\n                ;\n                }\n            ;\n            }\n            \n            \n        ;\n        ;\n        },\n        isPermanent: function() {\n            return false;\n        },\n        getCloseTimeout: function() {\n            return 2000;\n        },\n        getType: function() {\n            return \"join_status_type\";\n        },\n        addToQueue: function(l) {\n            this._messageQueue.push(l);\n            if (((this._messageQueue.length === 1))) {\n                this._open();\n            }\n        ;\n        ;\n        },\n        render: function() {\n            var l = this._messageQueue[0], m = this._getTemplate().build();\n            this._setMessage(l, m.getNode(\"text\"));\n            h.setContent(this._rootElement, m.getRoot());\n        },\n        _open: function() {\n            this._sheetView.open(this);\n        },\n        autoCloseCallback: function() {\n            this._messageQueue.shift();\n            if (((this._messageQueue.length > 0))) {\n                this._open();\n            }\n        ;\n        ;\n        },\n        couldNotReplace: function() {\n            this._open.bind(this).defer(this.getCloseTimeout(), false);\n        }\n    });\n    e.exports = k;\n});\n__d(\"WebMessengerEvents\", [\"Arbiter\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"copyProperties\"), i = h(new g(), {\n        MASTER_DOM_CHANGED: \"master-dom-changed\",\n        DETAIL_DOM_CHANGED: \"detail-dom-changed\",\n        FOCUS_COMPOSER: \"focus-composer\",\n        FOCUS_SEARCH: \"focus-search\",\n        FOCUS_AND_SELECT_SEARCH: \"focus-and-select-search\",\n        SUBMIT_REPLY: \"submit-reply\",\n        UPDATE_SELECTION: \"update-selection\",\n        masterDOMChanged: function() {\n            this.inform(i.MASTER_DOM_CHANGED);\n        },\n        detailDOMChanged: function() {\n            this.inform(i.DETAIL_DOM_CHANGED);\n        },\n        focusComposer: function() {\n            this.inform(i.FOCUS_COMPOSER);\n        },\n        focusSearch: function() {\n            this.inform(i.FOCUS_SEARCH);\n        },\n        focusAndSelectSearch: function() {\n            this.inform(i.FOCUS_AND_SELECT_SEARCH);\n        },\n        updateSelection: function(j) {\n            this.inform(i.UPDATE_SELECTION, j);\n        },\n        submitReply: function() {\n            this.inform(i.SUBMIT_REPLY);\n        }\n    });\n    e.exports = i;\n});\n__d(\"WebMessengerSubscriptionsHandler\", [\"SubscriptionsHandler\",], function(a, b, c, d, e, f) {\n    var g = b(\"SubscriptionsHandler\"), h = new g(\"webmessenger\");\n    e.exports = h;\n});\n__d(\"isWebMessengerURI\", [], function(a, b, c, d, e, f) {\n    function g(h) {\n        return (/^(\\/messages)/).test(h.getPath());\n    };\n;\n    e.exports = g;\n});\n__d(\"WebMessengerWidthControl\", [\"Arbiter\",\"CSS\",\"CSSClassTransition\",\"DOMDimensions\",\"JSBNG__Event\",\"Style\",\"URI\",\"ViewportBounds\",\"WebMessengerEvents\",\"shield\",\"WebMessengerSubscriptionsHandler\",\"$\",\"cx\",\"isWebMessengerURI\",\"JSBNG__requestAnimationFrame\",\"throttle\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"CSS\"), i = b(\"CSSClassTransition\"), j = b(\"DOMDimensions\"), k = b(\"JSBNG__Event\"), l = b(\"Style\"), m = b(\"URI\"), n = b(\"ViewportBounds\"), o = b(\"WebMessengerEvents\"), p = b(\"shield\"), q = b(\"WebMessengerSubscriptionsHandler\"), r = b(\"$\"), s = b(\"cx\"), t = b(\"isWebMessengerURI\"), u = b(\"JSBNG__requestAnimationFrame\"), v = b(\"throttle\"), w = 205, x = 981, y = 257, z = 18, aa = 848, ba = 724, ca = 34096, da = 56, ea, fa, ga;\n    function ha(ma, na, oa) {\n        this.masterChanged = ma;\n        this.detailChaned = na;\n        q.addSubscriptions(k.listen(window, \"resize\", v(p(ia, this, this), 100)), g.subscribe([\"sidebar/initialized\",\"sidebar/show\",\"sidebar/hide\",], p(ia, this, this), g.SUBSCRIBE_NEW));\n        var pa = ((la() ? da : 0));\n        if (oa) {\n            pa = w;\n        }\n    ;\n    ;\n        this._width = ((la() ? 0 : aa));\n        ga = true;\n        ia(this, pa);\n    };\n;\n    function ia(ma, na) {\n        var oa = ((n.getRight() + n.getLeft()));\n        oa = ((((oa || na)) || 0));\n        var pa = ((j.getViewportWithoutScrollbarDimensions().width - oa)), qa = Math.round(Math.max(0, ((((pa / 2)) - ((x / 2))))));\n        pa = ((((x + qa)) - y));\n        pa -= z;\n        pa = Math.max(ba, Math.min(aa, pa));\n        if (((!isNaN(pa) && ((ma._width !== pa))))) {\n            ma._width = pa;\n            var ra = Math.round(((pa / ((1 + ca))))), sa = ((pa - ra));\n            ma.masterChanged(sa);\n            ma.detailChaned(ra);\n            if (la()) {\n                var ta = ((pa + y));\n                ja(function() {\n                    if (fa) {\n                        JSBNG__document.body.className = fa;\n                        fa = \"\";\n                    }\n                ;\n                ;\n                    ka(((ta + \"px\")));\n                    h.removeClass(JSBNG__document.body, \"_5262\");\n                    ((ga && o.detailDOMChanged()));\n                    ga = false;\n                }, fa);\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n    };\n;\n    function ja(ma, na) {\n        ((na && h.addClass(JSBNG__document.documentElement, \"_5261\")));\n        u(ma);\n        ((na && h.removeClass.curry(JSBNG__document.documentElement, \"_5261\").defer(1000, false)));\n    };\n;\n    function ka(ma) {\n        l.set(r(\"pageHead\"), \"width\", ma);\n        l.set(r(\"globalContainer\"), \"width\", ma);\n    };\n;\n    function la() {\n        if (!ea) {\n            ea = h.hasClass(JSBNG__document.body, \"_6nw\");\n        }\n    ;\n    ;\n        return ea;\n    };\n;\n    i.registerHandler(function(ma, na, oa, pa) {\n        function qa(ra) {\n            return ((la() && t(m(ra))));\n        };\n    ;\n        if (qa(pa)) {\n            fa = na;\n            return true;\n        }\n         else if (qa(oa)) {\n            ja(function() {\n                ma.className = na;\n                ka(\"\");\n            }, true);\n            return true;\n        }\n        \n    ;\n    ;\n    });\n    e.exports = ha;\n});\n__d(\"TextInputControl\", [\"JSBNG__Event\",\"function-extensions\",\"Class\",\"DOMControl\",\"Input\",\"copyProperties\",\"debounce\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\");\n    b(\"function-extensions\");\n    var h = b(\"Class\"), i = b(\"DOMControl\"), j = b(\"Input\"), k = b(\"copyProperties\"), l = b(\"debounce\");\n    function m(n) {\n        this.parent.construct(this, n);\n        var o = this.getRoot(), p = l(this.update.bind(this), 0);\n        g.listen(o, {\n            input: p,\n            keydown: p,\n            paste: p\n        });\n    };\n;\n    h.extend(m, i);\n    k(m.prototype, {\n        setMaxLength: function(n) {\n            j.setMaxLength(this.getRoot(), n);\n            return this;\n        },\n        getValue: function() {\n            return j.getValue(this.getRoot());\n        },\n        isEmpty: function() {\n            return j.isEmpty(this.getRoot());\n        },\n        setValue: function(n) {\n            j.setValue(this.getRoot(), n);\n            this.update();\n            return this;\n        },\n        clear: function() {\n            return this.setValue(\"\");\n        },\n        setPlaceholderText: function(n) {\n            j.setPlaceholder(this.getRoot(), n);\n            return this;\n        }\n    });\n    e.exports = m;\n});\n__d(\"JSBNG__TextMetrics\", [\"JSBNG__Event\",\"DOM\",\"Style\",\"UserAgent\",\"debounce\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"DOM\"), i = b(\"Style\"), j = b(\"UserAgent\"), k = b(\"debounce\"), l;\n    function m() {\n        if (((typeof l === \"undefined\"))) {\n            var o = h.create(\"div\", {\n                className: \"webkitZoomTest\"\n            }), p = function() {\n                h.appendContent(JSBNG__document.body, o);\n                l = ((100 / o.clientHeight));\n                h.remove(o);\n            };\n            g.listen(window, \"resize\", k(p, 100));\n            p();\n        }\n    ;\n    ;\n        return l;\n    };\n;\n    function n(o, p) {\n        this._node = o;\n        this._flexible = !!p;\n        var q = \"textarea\", r = \"textMetrics\";\n        if (this._flexible) {\n            q = \"div\";\n            r += \" textMetricsInline\";\n        }\n    ;\n    ;\n        this._shadow = h.create(q, {\n            className: r\n        });\n        var s = [\"fontSize\",\"fontStyle\",\"fontWeight\",\"fontFamily\",\"wordWrap\",];\n        s.forEach(function(u) {\n            i.set(this._shadow, u, i.get(o, u));\n        }.bind(this));\n        var t = i.get(o, \"lineHeight\");\n        if (((j.chrome() || j.webkit()))) {\n            t = ((Math.round(((parseInt(t, 10) * m()))) + \"px\"));\n        }\n    ;\n    ;\n        i.set(this._shadow, \"lineHeight\", t);\n        JSBNG__document.body.appendChild(this._shadow);\n    };\n;\n    n.prototype.measure = function(o) {\n        var p = this._node, q = this._shadow;\n        o = ((((o || p.value)) + \"...\"));\n        if (!this._flexible) {\n            var r = ((((p.clientWidth - i.getFloat(p, \"paddingLeft\"))) - i.getFloat(p, \"paddingRight\")));\n            i.set(q, \"width\", ((Math.max(r, 0) + \"px\")));\n        }\n    ;\n    ;\n        h.setContent(q, o);\n        return {\n            width: q.scrollWidth,\n            height: q.scrollHeight\n        };\n    };\n    n.prototype.destroy = function() {\n        h.remove(this._shadow);\n    };\n    e.exports = n;\n});\n__d(\"TextAreaControl\", [\"JSBNG__Event\",\"Arbiter\",\"ArbiterMixin\",\"Class\",\"CSS\",\"DOMControl\",\"Style\",\"TextInputControl\",\"JSBNG__TextMetrics\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"Arbiter\"), i = b(\"ArbiterMixin\"), j = b(\"Class\"), k = b(\"CSS\"), l = b(\"DOMControl\"), m = b(\"Style\"), n = b(\"TextInputControl\"), o = b(\"JSBNG__TextMetrics\"), p = b(\"copyProperties\");\n    function q(s, t) {\n        return ((m.getFloat(s, t) || 0));\n    };\n;\n    function r(s) {\n        this.autogrow = k.hasClass(s, \"uiTextareaAutogrow\");\n        this.parent.construct(this, s);\n        this.width = null;\n        g.listen(s, \"JSBNG__focus\", this._handleFocus.bind(this));\n    };\n;\n    j.extend(r, n);\n    p(r.prototype, i, {\n        setAutogrow: function(s) {\n            this.autogrow = s;\n            return this;\n        },\n        onupdate: function() {\n            this.parent.onupdate();\n            if (this.autogrow) {\n                var s = this.getRoot();\n                if (!this.metrics) {\n                    this.metrics = new o(s);\n                }\n            ;\n            ;\n                if (((typeof this.initialHeight === \"undefined\"))) {\n                    this.isBorderBox = ((((((m.get(s, \"box-sizing\") === \"border-box\")) || ((m.get(s, \"-moz-box-sizing\") === \"border-box\")))) || ((m.get(s, \"-webkit-box-sizing\") === \"border-box\"))));\n                    this.borderBoxOffset = ((((((q(s, \"padding-top\") + q(s, \"padding-bottom\"))) + q(s, \"border-top-width\"))) + q(s, \"border-bottom-width\")));\n                    this.initialHeight = ((s.offsetHeight - this.borderBoxOffset));\n                }\n            ;\n            ;\n                var t = this.metrics.measure(), u = Math.max(this.initialHeight, t.height);\n                if (this.isBorderBox) {\n                    u += this.borderBoxOffset;\n                }\n            ;\n            ;\n                if (((u !== this.height))) {\n                    this.height = u;\n                    m.set(s, \"height\", ((u + \"px\")));\n                    h.inform(\"reflow\");\n                    this.inform(\"resize\");\n                }\n            ;\n            ;\n            }\n             else if (this.metrics) {\n                this.metrics.destroy();\n                this.metrics = null;\n            }\n            \n        ;\n        ;\n        },\n        resetHeight: function() {\n            this.height = -1;\n            this.update();\n        },\n        _handleFocus: function() {\n            this.width = null;\n        }\n    });\n    r.getInstance = function(s) {\n        return ((l.getInstance(s) || new r(s)));\n    };\n    e.exports = r;\n});\n__d(\"MessagesEmoticonView\", [\"DOM\",\"EmoticonsList\",\"JSBNG__Event\",\"Focus\",\"InputSelection\",\"Keys\",\"Parent\",\"SubscriptionsHandler\",\"TextAreaControl\",\"Toggler\",\"copyProperties\",\"endsWith\",\"startsWith\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOM\"), h = b(\"EmoticonsList\"), i = b(\"JSBNG__Event\"), j = b(\"Focus\"), k = b(\"InputSelection\"), l = b(\"Keys\"), m = b(\"Parent\"), n = b(\"SubscriptionsHandler\"), o = b(\"TextAreaControl\"), p = b(\"Toggler\"), q = b(\"copyProperties\"), r = b(\"endsWith\"), s = b(\"startsWith\"), t = h.symbols;\n    function u(w, x, y) {\n        var z = m.byClass(w, \"emoticon\");\n        if (!z) {\n            return;\n        }\n    ;\n    ;\n        var aa = \"emoticon_\", ba = null;\n        z.className.split(\" \").forEach(function(ia) {\n            if (s(ia, aa)) {\n                ba = ia.substring(aa.length);\n            }\n        ;\n        ;\n        });\n        if (!t[ba]) {\n            return;\n        }\n    ;\n    ;\n        var ca = o.getInstance(x), da = ca.getValue(), ea = t[ba], fa = da.substring(0, y.start), ga = da.substring(y.end);\n        if (((((y.start > 0)) && !r(fa, \" \")))) {\n            ea = ((\" \" + ea));\n        }\n    ;\n    ;\n        if (!s(ga, \" \")) {\n            ea += \" \";\n        }\n    ;\n    ;\n        var ha = ((((fa + ea)) + ga));\n        y.start += ea.length;\n        y.end = y.start;\n        ca.setValue(ha);\n        k.set(x, y.start, y.end);\n        return true;\n    };\n;\n    function v(w, x) {\n        var y = {\n            start: 0,\n            end: 0\n        };\n        function z() {\n            y = k.get(x);\n        };\n    ;\n        var aa = g.JSBNG__find(w, \".uiToggleFlyout\");\n        this._subscriptions = new n();\n        this._subscriptions.addSubscriptions(p.subscribe(\"show\", function(ba, ca) {\n            if (((ca.active && g.contains(w, ca.active)))) {\n                k.set(x, y.start, y.end);\n                var da = g.scry(aa, \"a.emoticon\")[0];\n                j.setWithoutOutline(da);\n            }\n        ;\n        ;\n        }), i.listen(aa, \"click\", function(JSBNG__event) {\n            var ba = u(JSBNG__event.getTarget(), x, y);\n            ((ba && p.hide(w)));\n        }), i.listen(aa, \"keyup\", function(JSBNG__event) {\n            if (((JSBNG__event.keyCode === l.ESC))) {\n                p.hide(w);\n                k.set(x, y.start, y.end);\n            }\n        ;\n        ;\n        }), i.listen(x, \"keyup\", z), i.listen(x, \"click\", z));\n    };\n;\n    q(v.prototype, {\n        destroy: function() {\n            this._subscriptions.release();\n            this._subscriptions = null;\n        }\n    });\n    q(v, {\n        create: function(w, x) {\n            return new v(w, x);\n        }\n    });\n    e.exports = v;\n});\n__d(\"MercuryTypingReceiver\", [\"Arbiter\",\"ChannelConstants\",\"MercuryActionTypeConstants\",\"MercuryParticipants\",\"MercuryPayloadSource\",\"MercuryServerRequests\",\"MercuryThreads\",\"TypingDetector\",\"setTimeoutAcrossTransitions\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ChannelConstants\"), i = b(\"MercuryActionTypeConstants\"), j = b(\"MercuryParticipants\"), k = b(\"MercuryPayloadSource\"), l = b(\"MercuryServerRequests\").get(), m = b(\"MercuryThreads\").get(), n = b(\"TypingDetector\"), o = b(\"setTimeoutAcrossTransitions\"), p, q = {\n    }, r = 30000, s = new g();\n    function t(y) {\n        var z = ((q[y] || {\n        })), aa = Object.keys(z);\n        aa.sort(function(ba, ca) {\n            return ((z[ba] - z[ca]));\n        });\n        return aa;\n    };\n;\n    function u() {\n        p = null;\n        var y = JSBNG__Date.now(), z = {\n        }, aa = false;\n        {\n            var fin264keys = ((window.top.JSBNG_Replay.forInKeys)((q))), fin264i = (0);\n            var ba;\n            for (; (fin264i < fin264keys.length); (fin264i++)) {\n                ((ba) = (fin264keys[fin264i]));\n                {\n                    var ca = false;\n                    {\n                        var fin265keys = ((window.top.JSBNG_Replay.forInKeys)(((q[ba] || {\n                        })))), fin265i = (0);\n                        var da;\n                        for (; (fin265i < fin265keys.length); (fin265i++)) {\n                            ((da) = (fin265keys[fin265i]));\n                            {\n                                if (((q[ba][da] < ((y - r))))) {\n                                    delete q[ba][da];\n                                    ca = true;\n                                }\n                                 else aa = true;\n                            ;\n                            ;\n                            };\n                        };\n                    };\n                ;\n                    if (ca) {\n                        z[ba] = t(ba);\n                    }\n                ;\n                ;\n                };\n            };\n        };\n    ;\n        {\n            var fin266keys = ((window.top.JSBNG_Replay.forInKeys)((z))), fin266i = (0);\n            var ea;\n            for (; (fin266i < fin266keys.length); (fin266i++)) {\n                ((ea) = (fin266keys[fin266i]));\n                {\n                    s.inform(\"state-changed\", z);\n                    break;\n                };\n            };\n        };\n    ;\n        if (aa) {\n            p = o(u, 3000);\n        }\n    ;\n    ;\n    };\n;\n    function v(y, z) {\n        if (((y in q))) {\n            if (((z in q[y]))) {\n                delete q[y][z];\n                w(y);\n            }\n        ;\n        }\n    ;\n    ;\n    };\n;\n    function w(y) {\n        var z = {\n        };\n        z[y] = t(y);\n        s.inform(\"state-changed\", z);\n    };\n;\n    function x(y) {\n        if (y.thread) {\n            return l.getClientThreadIDNow(y.thread);\n        }\n    ;\n    ;\n        if (((y.type === \"typ\"))) {\n            return m.getThreadIdForUser(y.from);\n        }\n    ;\n    ;\n        return null;\n    };\n;\n    g.subscribe([h.getArbiterType(\"typ\"),h.getArbiterType(\"ttyp\"),], function(y, z) {\n        var aa = z.obj, ba = x(aa);\n        if (ba) {\n            var ca = j.getIDForUser(aa.from);\n            if (((aa.st == n.TYPING))) {\n                q[ba] = ((q[ba] || {\n                }));\n                var da = q[ba][ca];\n                q[ba][ca] = JSBNG__Date.now();\n                if (!p) {\n                    p = o(u, 3000);\n                }\n            ;\n            ;\n                ((!da && w(ba)));\n            }\n             else if (((aa.st == n.INACTIVE))) {\n                v(ba, ca);\n            }\n            \n        ;\n        ;\n        }\n    ;\n    ;\n    });\n    l.subscribe(\"update-typing-state\", function(y, z) {\n        var aa = z.payload_source;\n        if (((((aa != k.CLIENT_CHANNEL_MESSAGE)) && ((aa != k.SERVER_ZAP))))) {\n            return;\n        }\n    ;\n    ;\n        var ba = z.actions;\n        if (((!ba || !ba.length))) {\n            return;\n        }\n    ;\n    ;\n        var ca = i.USER_GENERATED_MESSAGE;\n        ba.forEach(function(da) {\n            if (((((da.action_type == ca)) && ((da.author != j.user))))) {\n                v(da.thread_id, da.author);\n            }\n        ;\n        ;\n        });\n    });\n    e.exports = s;\n});\n__d(\"formatUnixTimestamp\", [\"formatDate\",], function(a, b, c, d, e, f) {\n    var g = b(\"formatDate\");\n    function h(i, j, k, l) {\n        var m = new JSBNG__Date(((i * 1000)));\n        return g(m, j, k, l);\n    };\n;\n    e.exports = h;\n});\n__d(\"MercuryIndicatorController\", [\"ArbiterMixin\",\"DOM\",\"MercuryActionTypeConstants\",\"MercuryConfig\",\"MercuryDelayedRoger\",\"MercuryMessageSourceTags\",\"MercuryParticipants\",\"MercuryRoger\",\"MercuryThreads\",\"MercuryTypingReceiver\",\"DateFormatConfig\",\"arrayContains\",\"copyProperties\",\"formatUnixTimestamp\",\"removeFromArray\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"ArbiterMixin\"), h = b(\"DOM\"), i = b(\"MercuryActionTypeConstants\"), j = b(\"MercuryConfig\"), k = b(\"MercuryDelayedRoger\"), l = b(\"MercuryMessageSourceTags\"), m = b(\"MercuryParticipants\"), n = b(\"MercuryRoger\"), o = b(\"MercuryThreads\").get(), p = b(\"MercuryTypingReceiver\"), q = b(\"DateFormatConfig\"), r = b(\"arrayContains\"), s = b(\"copyProperties\"), t = b(\"formatUnixTimestamp\"), u = b(\"removeFromArray\"), v = b(\"tx\"), w = [];\n    function x(y) {\n        this._threadID = y;\n        this._canonicalUser = o.getCanonicalUserInThread(y);\n        w.push(this);\n    };\n;\n    s(x.prototype, g, {\n        destroy: function() {\n            u(w, this);\n        },\n        setLastMessage: function(y) {\n            this._lastMsg = y;\n            this._handleStateChange();\n        },\n        _informStateChanged: function(y) {\n            if (((((y.activity == \"none\")) && ((this._currentActivity == \"none\"))))) {\n                return;\n            }\n        ;\n        ;\n            if (((this._lastMsg && m.isAuthor(this._lastMsg.author)))) {\n                y.self_authored = true;\n            }\n        ;\n        ;\n            this._currentActivity = y.activity;\n            this.inform(\"state-changed\", y);\n        },\n        _notifySentFrom: function() {\n            var y, z, aa = this._lastMsg.location_text, ba = ((this._lastMsg.source_tags || []));\n            if (aa) {\n                y = v._(\"Sent from {location}\", {\n                    JSBNG__location: aa\n                });\n                z = \"sentFromMobile\";\n            }\n             else if (r(ba, l.MESSENGER)) {\n                y = h.create(\"a\", {\n                    href: \"/mobile/messenger\",\n                    class: \"fcg\",\n                    target: \"_blank\"\n                }, \"Sent from Messenger\");\n                z = \"sentFromMobile\";\n            }\n             else if (r(ba, l.MOBILE)) {\n                y = h.create(\"a\", {\n                    href: \"/mobile\",\n                    class: \"fcg\",\n                    target: \"_blank\"\n                }, \"Sent from Mobile\");\n                z = \"sentFromMobile\";\n            }\n             else if (r(ba, l.EMAIL)) {\n                y = \"Sent from email\";\n                z = \"sentFromEmail\";\n            }\n             else {\n                this._informStateChanged({\n                    activity: \"none\"\n                });\n                return;\n            }\n            \n            \n            \n        ;\n        ;\n            this._informStateChanged({\n                activity: z,\n                text: y\n            });\n        },\n        _notifySeenTimestamp: function(y) {\n            var z = ((n.getSeenTimestamp(this._threadID, y[0]) * 44405)), aa = ((JSBNG__Date.now() * 44424));\n            if (((z < ((aa - 518400))))) {\n                ba = \"M j\";\n            }\n             else if (((z < ((aa - 86400))))) {\n                ba = \"D g:ia\";\n            }\n             else ba = \"g:ia\";\n            \n        ;\n        ;\n            var ba = ((q.formats[ba] || ba)), ca = t(z, ba, false, true);\n            this._informStateChanged({\n                activity: \"seen-timestamp\",\n                text: v._(\"Seen {timestamp}\", {\n                    timestamp: ca\n                })\n            });\n        },\n        _checkNamesForCollision: function(y, z) {\n            var aa = false;\n            m.getMulti(y, function(ba) {\n                function ca(fa) {\n                    if (((typeof ba[fa] !== \"undefined\"))) {\n                        return ba[fa].short_name.toLowerCase();\n                    }\n                     else return fa\n                ;\n                };\n            ;\n                var da = z.map(ca), ea = y.map(ca);\n                aa = da.some(function(fa) {\n                    return ((ea.indexOf(fa) !== ea.lastIndexOf(fa)));\n                });\n            });\n            return aa;\n        },\n        _notifySeenBy: function(y) {\n            var z = this._lastMsg, aa = true;\n            m.getMulti(y, function(ba) {\n                aa = false;\n                if (((this._lastMsg != z))) {\n                    return;\n                }\n            ;\n            ;\n                var ca = o.getThreadMetaNow(this._threadID), da = ((ca ? ca.participants.length : 0)), ea = ((y.length + ((z.author != m.user)))), fa, ga = false, ha = false, ia = ((((da > 2)) && ((ea >= ((da - 1))))));\n                if (((!(ia) && ((da > 0))))) {\n                    ha = this._checkNamesForCollision(ca.participants, y);\n                }\n            ;\n            ;\n                if (ia) {\n                    fa = \"Seen by everyone\";\n                }\n                 else if (((y.length == 1))) {\n                    fa = v._(\"Seen by {user}\", {\n                        user: ba[y[0]].short_name\n                    });\n                }\n                 else if (((y.length == 2))) {\n                    fa = v._(\"Seen by {user1}, {user2}\", {\n                        user1: ba[y[0]].short_name,\n                        user2: ba[y[1]].short_name\n                    });\n                }\n                 else if (((y.length == 3))) {\n                    fa = v._(\"Seen by {user1}, {user2}, {user3}\", {\n                        user1: ba[y[0]].short_name,\n                        user2: ba[y[1]].short_name,\n                        user3: ba[y[2]].short_name\n                    });\n                }\n                 else if (((y.length > 3))) {\n                    var ja = ((Object.keys(ba).length - 2)), ka = v._(\"{num} more\", {\n                        num: ja\n                    }), la = h.create(\"span\", {\n                        className: \"more\"\n                    }, ka);\n                    fa = h.tx._(\"Seen by {user1}, {user2}, {=num more link}\", {\n                        user1: ba[y[0]].short_name,\n                        user2: ba[y[1]].short_name,\n                        \"=num more link\": la\n                    });\n                    ga = true;\n                }\n                \n                \n                \n                \n            ;\n            ;\n                ga = ((ga || ha));\n                this._informStateChanged({\n                    activity: \"seen-by\",\n                    text: fa,\n                    seenBy: y,\n                    hasNameCollision: ha,\n                    tooltip: ga\n                });\n            }.bind(this));\n            ((aa && this._informStateChanged({\n                activity: \"none\"\n            })));\n        },\n        _notifyTyping: function(y) {\n            var z = this._lastMsg, aa = true;\n            m.getMulti(y, function(ba) {\n                aa = false;\n                if (((this._lastMsg != z))) {\n                    return;\n                }\n            ;\n            ;\n                if (((this._canonicalUser || j.ChatMultiTypGK))) {\n                    var ca = o.getThreadMetaNow(this._threadID), da = ((ca ? ca.participants.length : 0)), ea, fa = false;\n                    if (((((da > 2)) && ((y.length >= ((da - 1))))))) {\n                        ea = \"Everyone is typing...\";\n                    }\n                     else if (((y.length == 1))) {\n                        ea = v._(\"{name} is typing...\", {\n                            JSBNG__name: ba[y[0]].short_name\n                        });\n                    }\n                     else if (((y.length == 2))) {\n                        ea = v._(\"{user1} and {user2} are typing...\", {\n                            user1: ba[y[0]].short_name,\n                            user2: ba[y[1]].short_name\n                        });\n                    }\n                     else if (((y.length == 3))) {\n                        ea = v._(\"{user1}, {user2}, and {user3} are typing...\", {\n                            user1: ba[y[0]].short_name,\n                            user2: ba[y[1]].short_name,\n                            user3: ba[y[2]].short_name\n                        });\n                    }\n                     else if (((y.length > 3))) {\n                        var ga = ((Object.keys(ba).length - 2)), ha = v._(\"{num} more\", {\n                            num: ga\n                        }), ia = h.create(\"a\", {\n                            href: \"#\"\n                        }, ha);\n                        ea = h.tx._(\"{user1}, {user2}, and {=num more link} are typing...\", {\n                            user1: ba[y[0]].short_name,\n                            user2: ba[y[1]].short_name,\n                            \"=num more link\": ia\n                        });\n                        fa = true;\n                    }\n                    \n                    \n                    \n                    \n                ;\n                ;\n                    this._informStateChanged({\n                        activity: \"typing\",\n                        text: ea,\n                        typing: y,\n                        tooltip: fa\n                    });\n                }\n            ;\n            ;\n            }.bind(this));\n            ((aa && this._informStateChanged({\n                activity: \"none\"\n            })));\n        },\n        _handleStateChange: function() {\n            var y = i.LOG_MESSAGE;\n            if (((!this._lastMsg || ((this._lastMsg.action_type == y))))) {\n                this._informStateChanged({\n                    activity: \"none\"\n                });\n                return;\n            }\n        ;\n        ;\n            if (((this._typing && this._typing.length))) {\n                this._notifyTyping(this._typing);\n                return;\n            }\n        ;\n        ;\n            if (((this._canonicalUser && ((this._lastMsg.author != m.user))))) {\n                this._notifySentFrom();\n                return;\n            }\n        ;\n        ;\n            var z = k.getSeenBy(this._threadID, true);\n            if (z.length) {\n                if (this._canonicalUser) {\n                    this._notifySeenTimestamp(z);\n                    return;\n                }\n                 else {\n                    this._notifySeenBy(z);\n                    return;\n                }\n            ;\n            }\n        ;\n        ;\n            this._informStateChanged({\n                activity: \"none\"\n            });\n        }\n    });\n    p.subscribe(\"state-changed\", function(y, z) {\n        w.forEach(function(aa) {\n            var ba = z[aa._threadID];\n            if (((ba !== undefined))) {\n                aa._typing = ba;\n                aa._handleStateChange();\n            }\n        ;\n        ;\n        });\n    });\n    k.subscribe(\"state-changed\", function(y, z) {\n        w.forEach(function(aa) {\n            ((z[aa._threadID] && aa._handleStateChange()));\n        });\n    });\n    e.exports = x;\n});\n__d(\"MercuryLastMessageIndicator\", [\"CSS\",\"MercuryIndicatorController\",\"DOM\",\"MercuryParticipants\",\"Tooltip\",\"copyProperties\",\"csx\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSS\"), h = b(\"MercuryIndicatorController\"), i = b(\"DOM\"), j = b(\"MercuryParticipants\"), k = b(\"Tooltip\"), l = b(\"copyProperties\"), m = b(\"csx\"), n = b(\"cx\");\n    function o(p, q, r, s) {\n        this._lastMessageIndicator = q;\n        this._hideTyping = ((r || false));\n        this._messagesView = s;\n        this._controller = new h(p);\n        this._subscription = this._controller.subscribe(\"state-changed\", this._handleStateChanged.bind(this));\n    };\n;\n    l(o.prototype, {\n        destroy: function() {\n            this._setClass(null);\n            this._subscription.unsubscribe();\n            this._controller.destroy();\n        },\n        setLastMessage: function(p) {\n            this._controller.setLastMessage(p);\n        },\n        _handleStateChanged: function(p, q) {\n            var r = this._messagesView.isScrolledToBottom();\n            this._rerender(q);\n            ((r && this._messagesView.scrollToBottom()));\n        },\n        _rerender: function(p) {\n            if (((p.activity == \"none\"))) {\n                this._setClass(null);\n                return;\n            }\n        ;\n        ;\n            if (((this._hideTyping && ((p.activity == \"typing\"))))) {\n                this._setClass(null);\n                return;\n            }\n        ;\n        ;\n            g.conditionClass(this._lastMessageIndicator, \"_510e\", p.self_authored);\n            var q = i.JSBNG__find(this._lastMessageIndicator, \"._510f\");\n            if (p.text) {\n                i.setContent(q, p.text);\n            }\n             else i.empty(q);\n        ;\n        ;\n            if (((p.activity.substring(0, 4) == \"seen\"))) {\n                this._setClass(\"seen\");\n                if (((((p.activity == \"seen-by\")) && p.tooltip))) {\n                    j.getMulti(p.seenBy, function(r) {\n                        var s = i.create(\"div\");\n                        {\n                            var fin267keys = ((window.top.JSBNG_Replay.forInKeys)((r))), fin267i = (0);\n                            var t;\n                            for (; (fin267i < fin267keys.length); (fin267i++)) {\n                                ((t) = (fin267keys[fin267i]));\n                                {\n                                    var u = i.create(\"div\");\n                                    i.setContent(u, r[t].JSBNG__name);\n                                    i.appendContent(s, u);\n                                };\n                            };\n                        };\n                    ;\n                        var v = p.hasNameCollision, w;\n                        if (v) {\n                            w = this._lastMessageIndicator;\n                        }\n                         else w = i.JSBNG__find(this._lastMessageIndicator, \"span.more\");\n                    ;\n                    ;\n                        k.set(w, s, \"above\", \"center\");\n                    }.bind(this));\n                }\n                 else k.remove(this._lastMessageIndicator);\n            ;\n            ;\n            }\n             else this._setClass(p.activity);\n        ;\n        ;\n        },\n        _setClass: function(p) {\n            if (((this._lastClass === p))) {\n                return;\n            }\n        ;\n        ;\n            ((this._lastClass && g.removeClass(this._lastMessageIndicator, this._lastClass)));\n            ((p && g.addClass(this._lastMessageIndicator, p)));\n            this._lastClass = p;\n        }\n    });\n    e.exports = o;\n});\n__d(\"MercuryStateCheck\", [\"Arbiter\",\"ChannelConstants\",\"MercuryFolders\",\"MessagingTag\",\"MercuryServerRequests\",\"URI\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ChannelConstants\"), i = b(\"MercuryFolders\"), j = b(\"MessagingTag\"), k = b(\"MercuryServerRequests\").get(), l = b(\"URI\"), m = b(\"copyProperties\"), n = m(new g(), {\n        initialize: function() {\n            g.subscribe(h.ON_INVALID_HISTORY, o);\n            d([\"ChannelConnection\",], function(p) {\n                p.subscribe(p.CONNECTED, function(q, r) {\n                    if (!r.init) {\n                        o();\n                    }\n                ;\n                ;\n                });\n            });\n        }\n    });\n    function o() {\n        var p;\n        if (((l.getRequestURI().getPath().search(/messages/) !== -1))) {\n            p = i.getSupportedFolders();\n        }\n         else p = [j.INBOX,];\n    ;\n    ;\n        k.fetchMissedMessages(p);\n    };\n;\n    n.initialize();\n    e.exports = n;\n});\n__d(\"MercuryAttachmentRenderer\", [\"MercuryAttachmentTemplates\",\"MercuryAttachmentAudioClip.react\",\"CSS\",\"MercuryConstants\",\"DOM\",\"JSBNG__Image.react\",\"JSXDOM\",\"MercuryAttachment\",\"MercuryAttachmentType\",\"MercuryMessages\",\"MercuryParticipants\",\"React\",\"Style\",\"URI\",\"UserAgent\",\"cx\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"MercuryAttachmentTemplates\"), h = b(\"MercuryAttachmentAudioClip.react\"), i = b(\"CSS\"), j = b(\"MercuryConstants\"), k = b(\"DOM\"), l = b(\"JSBNG__Image.react\"), m = b(\"JSXDOM\"), n = b(\"MercuryAttachment\"), o = b(\"MercuryAttachmentType\"), p = b(\"MercuryMessages\").get(), q = b(\"MercuryParticipants\"), r = b(\"React\"), s = b(\"Style\"), t = b(\"URI\"), u = b(\"UserAgent\"), v = b(\"cx\"), w = b(\"tx\"), x = ((u.ie() <= 8));\n    function y(ba, ca) {\n        var da = g[ca].build().setNodeContent(\"filename\", ba.JSBNG__name), ea = da.getNode(\"link\");\n        ea.setAttribute(\"href\", ba.url);\n        ((ba.rel && ea.setAttribute(\"rel\", ba.rel)));\n        i.addClass(da.getRoot(), n.getAttachIconClass(ba.icon_type));\n        return da;\n    };\n;\n    function z(ba, ca) {\n        var da = g[ca].build().setNodeContent(\"filename\", ba.JSBNG__name);\n        i.addClass(da.getRoot(), n.getAttachIconClass(ba.icon_type));\n        return da;\n    };\n;\n    var aa = {\n        renderAttachment: function(ba, ca, da, ea, fa) {\n            var ga = 100, ha = ((ba ? 160 : 400)), ia = ca.attach_type, ja = null, ka = null, la = true, ma = j.MercurySupportedShareType;\n            if (((ia == o.ERROR))) {\n                ja = aa.renderError(ca);\n            }\n        ;\n        ;\n            if (((((!ba && ((ia == o.SHARE)))) && ca.share_xhp))) {\n                ka = aa.renderShareXHP(ca, da.id);\n            }\n        ;\n        ;\n            if (((ia == o.STICKER))) {\n                la = false;\n                ka = aa.renderSticker(ca);\n            }\n        ;\n        ;\n            if (((!ka && ((ia == o.SHARE))))) {\n                var na = ca.share_data_type;\n                switch (na) {\n                  case ma.FB_PHOTO:\n                    ka = aa.renderPreview(ca, da, ea, fa);\n                    break;\n                  case ma.FB_VIDEO:\n                    ka = aa.renderVideoThumb(ca);\n                    break;\n                  case ma.FB_MUSIC_ALBUM:\n                \n                  case ma.FB_SONG:\n                \n                  case ma.FB_PLAYLIST:\n                \n                  case ma.FB_MUSICIAN:\n                \n                  case ma.FB_RADIO_STATION:\n                    ka = aa.renderMusic(ca);\n                    break;\n                  case ma.EXTERNAL:\n                \n                  case ma.FB_TEMPLATE:\n                \n                  case ma.FB_COUPON:\n                \n                  case ma.FB_SOCIAL_REPORT_PHOTO:\n                    ka = aa.renderExternalLink(ca);\n                    break;\n                  default:\n                    if (ca.JSBNG__name) {\n                        ka = aa.renderShareLink(ca, ((da && da.id)), ba);\n                    }\n                ;\n                ;\n                    break;\n                };\n            ;\n            }\n        ;\n        ;\n            if (((!ka && ca.preview_loading))) {\n                ka = aa.renderPreview(null);\n            }\n        ;\n        ;\n            if (((!ka && ca.preview_url))) {\n                ka = aa.renderPreview(ca, da, ea, fa);\n            }\n        ;\n        ;\n            if (((!ka && ((ia == o.FILE))))) {\n                if (((ca.metadata && ((ca.metadata.type == j.MercuryAttachmentAudioClip))))) {\n                    ka = k.create(\"div\");\n                    var oa = aa.renderAudioClip(ca, da.message_id, ga, ha);\n                    r.renderComponent(oa, ka);\n                }\n                 else ka = ((ba ? aa.renderFileLink(ca) : aa.renderExtendedFileLink(ca)));\n            ;\n            }\n        ;\n        ;\n            return {\n                error: ja,\n                JSBNG__content: ka,\n                bubblePreferred: la\n            };\n        },\n        renderError: function(ba) {\n            var ca = g[\":fb:mercury:attachment:error\"].build();\n            k.appendContent(ca.getNode(\"error\"), ba.error_msg);\n            return ca.getRoot();\n        },\n        renderExternalLink: function(ba) {\n            var ca = g[\":fb:mercury:attachment:external-link\"].build().setNodeContent(\"JSBNG__name\", ba.JSBNG__name);\n            ((ba.base_url && ca.setNodeContent(\"shortLink\", ba.base_url)));\n            var da = ca.getNode(\"preview\"), ea = ca.getNode(\"image-link\");\n            ea.setAttribute(\"href\", ba.url);\n            ((ba.rel && ea.setAttribute(\"rel\", ba.rel)));\n            if (ba.preview_url) {\n                var fa = ca.getNode(\"preview-image\");\n                fa.setAttribute(\"src\", ba.preview_url);\n                i.addClass(da, ba.preview_class);\n                i.show(fa);\n            }\n             else {\n                i.addClass(ca.getRoot(), \"noMedia\");\n                i.hide(da);\n            }\n        ;\n        ;\n            ca.getNode(\"JSBNG__name\").setAttribute(\"href\", ba.url);\n            d([\"LinkshimHandler\",], function(ga) {\n                ga.setUpLinkshimHandling(ca.getNode(\"JSBNG__name\"));\n                ga.setUpLinkshimHandling(ca.getNode(\"image-link\"));\n            });\n            if (ba.rel) {\n                ca.getNode(\"JSBNG__name\").setAttribute(\"rel\", ba.rel);\n            }\n        ;\n        ;\n            return ca.getRoot();\n        },\n        renderFileLink: function(ba) {\n            var ca = null;\n            if (((ba.url === \"\"))) {\n                ca = \":fb:mercury:attachment:file-name\";\n                return z(ba, ca).getRoot();\n            }\n             else {\n                ca = \":fb:mercury:attachment:file-link\";\n                return y(ba, ca).getRoot();\n            }\n        ;\n        ;\n        },\n        renderAudioClip: function(ba, ca, da, ea) {\n            var fa = ((ba.metadata.duration / 1000)), ga = 200;\n            if (((da && ea))) {\n                if (((fa < 5))) {\n                    ga = da;\n                }\n                 else ga = ((((((1 - Math.pow(10, ((((fa - 5)) / -30))))) * ((ea - da)))) + da));\n            ;\n            }\n        ;\n        ;\n            return h({\n                src: ba.url,\n                duration: ((ba.metadata.duration / 1000)),\n                showHelp: false,\n                width: ga\n            });\n        },\n        renderExtendedFileLink: function(ba) {\n            var ca = null;\n            if (((ba.url === \"\"))) {\n                ca = \":fb:mercury:attachment:file-name\";\n                return z(ba, ca).getRoot();\n            }\n        ;\n        ;\n            var ca = \":fb:mercury:attachment:extended-file-link\", da = y(ba, ca);\n            if (ba.open_url) {\n                var ea = da.getNode(\"openLinkContainer\");\n                i.show(ea);\n                var fa = da.getNode(\"openFile\");\n                fa.setAttribute(\"href\", ba.open_url);\n            }\n        ;\n        ;\n            var ga = da.getNode(\"downloadFile\");\n            ga.setAttribute(\"href\", ba.url);\n            ((ba.rel && ga.setAttribute(\"rel\", ba.rel)));\n            return da.getRoot();\n        },\n        renderMusic: function(ba) {\n            var ca = g[\":fb:mercury:attachment:music\"].build().setNodeContent(\"filename\", ba.JSBNG__name), da = ca.getNode(\"link\");\n            da.setAttribute(\"href\", ba.url);\n            da.setAttribute(\"target\", \"_blank\");\n            ((ba.rel && da.setAttribute(\"rel\", ba.rel)));\n            var ea = ca.getNode(\"image-link\");\n            ea.setAttribute(\"href\", ba.url);\n            ((ba.rel && ea.setAttribute(\"rel\", ba.rel)));\n            var fa = ca.getNode(\"preview-image\");\n            fa.setAttribute(\"src\", ba.preview_url);\n            i.show(fa);\n            i.addClass(ca.getNode(\"icon_link\"), \"MercuryMusicIcon\");\n            return ca.getRoot();\n        },\n        resizeContain: function(ba, ca) {\n            var da = ((ba.width / ba.height)), ea = ((ca.width / ca.height));\n            if (((ea < da))) {\n                return {\n                    width: Math.min(((ba.height * ea)), ca.width),\n                    height: Math.min(ba.height, ca.height)\n                };\n            }\n             else return {\n                width: Math.min(ba.width, ca.width),\n                height: Math.min(((ba.width / ea)), ca.height)\n            }\n        ;\n        },\n        renderPreview: function(ba, ca, da, ea) {\n            var fa = g[\":fb:mercury:attachment:preview\"].build(), ga = fa.getNode(\"image-link\");\n            if (ba) {\n                ((ba.url && ga.setAttribute(\"href\", ba.url)));\n                ((ba.rel && ga.setAttribute(\"rel\", ba.rel)));\n                var ha;\n                if (ba.preview_uploading) {\n                    i.addClass(ga, \"_57jm\");\n                    if (((da >= 176))) {\n                        ha = \"/images/photos/dots_large.png\";\n                    }\n                     else if (((da >= 86))) {\n                        ha = \"/images/photos/dots_medium.png\";\n                    }\n                     else ha = \"/images/photos/dots_small.png\";\n                    \n                ;\n                ;\n                    s.set(ga, \"width\", ((da + \"px\")));\n                    s.set(ga, \"max-width\", ((da + \"px\")));\n                    if (((ba.preview_width && ba.preview_height))) {\n                        s.set(ga, \"padding-bottom\", ((((((ba.preview_height / ba.preview_width)) * 100)) + \"%\")));\n                    }\n                ;\n                ;\n                }\n                 else if (((ba.metadata && ba.metadata.fbid))) {\n                    ha = t(\"/ajax/mercury/attachments/photo.php\").addQueryData({\n                        fbid: ba.metadata.fbid,\n                        mode: ea,\n                        width: da,\n                        height: da\n                    }).toString();\n                }\n                 else ha = t(ba.preview_url).addQueryData({\n                    mode: ea,\n                    width: da,\n                    height: da\n                }).toString();\n                \n            ;\n            ;\n                var ia = fa.getNode(\"preview-image\");\n                if (ha) {\n                    if (((((((ea === \"contain\")) && ba.preview_width)) && ba.preview_height))) {\n                        var ja = aa.resizeContain({\n                            width: da,\n                            height: da\n                        }, {\n                            width: ba.preview_width,\n                            height: ba.preview_height\n                        });\n                        ia.setAttribute(\"width\", ja.width);\n                        ia.setAttribute(\"height\", ja.height);\n                    }\n                ;\n                ;\n                    if (((ba.preview_uploading || ((((ea === \"cover\")) && !x))))) {\n                        i.addClass(ga, \"_55pj\");\n                        s.set(ga, \"backgroundImage\", ((((\"url(\" + ha)) + \")\")));\n                    }\n                     else {\n                        ia.JSBNG__onload = function() {\n                            ia.removeAttribute(\"width\");\n                            ia.removeAttribute(\"height\");\n                        };\n                        ia.setAttribute(\"src\", ha);\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n                if (ca) {\n                    this.renderReportRespondLink(fa.getRoot(), ba, ca.message_id);\n                }\n            ;\n            ;\n            }\n             else i.addClass(ga, \"_ksa\");\n        ;\n        ;\n            return fa.getRoot();\n        },\n        renderShareLink: function(ba, ca, da) {\n            var ea = g[\":fb:mercury:attachment:share-link\"].build().setNodeContent(\"JSBNG__name\", ba.JSBNG__name), fa = ea.getNode(\"link\");\n            fa.setAttribute(\"href\", ba.url);\n            ((ba.rel && fa.setAttribute(\"rel\", ba.rel)));\n            return ea.getRoot();\n        },\n        renderVideoThumb: function(ba) {\n            var ca = g[\":fb:mercury:attachment:video-thumb\"].build(), da = ca.getNode(\"thumb\");\n            da.setAttribute(\"href\", ba.url);\n            da.setAttribute(\"rel\", ba.rel);\n            var ea = k.JSBNG__find(ca.getRoot(), \"img\");\n            ea.src = ba.preview_url;\n            return ca.getRoot();\n        },\n        renderShareXHP: function(ba, ca) {\n            var da = k.create(\"div\");\n            if (ba) {\n                k.appendContent(da, ba.share_xhp);\n                this.renderReportRespondLink(da, ba, ca);\n            }\n        ;\n        ;\n            return da;\n        },\n        renderSticker: function(ba) {\n            var ca = k.create(\"div\"), da = {\n                uri: ba.url,\n                width: ba.metadata.width,\n                height: ba.metadata.height\n            }, ea = l({\n                className: \"mvs\",\n                src: da\n            });\n            r.renderComponent(ea, ca);\n            return ca;\n        },\n        renderReportRespondLink: function(ba, ca, da) {\n            if (!ca.is_social_report_attachment) {\n                return null;\n            }\n        ;\n        ;\n            switch (ca.share_data_type) {\n              case j.MercurySupportedShareType.FB_PHOTO:\n                break;\n              case j.MercurySupportedShareType.FB_SOCIAL_REPORT_PHOTO:\n                return null;\n              default:\n                return null;\n            };\n        ;\n            var ea = null;\n            if (da) {\n                ea = p.getMessagesFromIDs([da,])[0];\n            }\n        ;\n        ;\n            if (!ea) {\n                return null;\n            }\n        ;\n        ;\n            if (((ea.author === q.user))) {\n                return null;\n            }\n        ;\n        ;\n            var fa = null;\n            q.get(ea.author, function(ga) {\n                fa = k.create(\"a\", {\n                    rel: \"dialog-post\",\n                    className: \"_z6l\",\n                    id: \"respond-link\",\n                    ajaxify: t(\"/ajax/report/social_resolution/photo/\").setQueryData({\n                        attachment_fbid: ca.attach_id,\n                        photo_fbid: ca.shared_object_id,\n                        sender_id: q.getUserID(ga.id)\n                    }).toString()\n                });\n                k.setContent(fa, w._(\"Respond to {name}'s request\", {\n                    JSBNG__name: ga.JSBNG__name\n                }));\n                k.appendContent(ba, fa);\n            });\n        },\n        renderPhotoAttachments: function(ba, ca, da, ea) {\n            var fa = ba.length;\n            if (!fa) {\n                return null;\n            }\n        ;\n        ;\n            var ga = m.div({\n                className: \"_55pk\"\n            }), ha = (m.div({\n                className: \"_55pl\"\n            }, ga));\n            if (((fa === 1))) {\n                var ia = aa.renderPreview(ba[0], ca, da, \"contain\");\n                k.appendContent(ga, ia);\n                return ha;\n            }\n        ;\n        ;\n            var ja = ((((((fa == 2)) || ((fa == 4)))) ? 2 : 3)), ka = ((((da - ((((ja - 1)) * ea)))) / ja)), la = Math.ceil(((fa / ja))), ma = ((((la * ka)) + ((((la - 1)) * ea)))), na = (m.div({\n                className: \"_55pm\",\n                style: ((((\"padding-bottom: \" + ((((ma / da)) * 100)))) + \"%;\"))\n            }));\n            k.appendContent(ga, na);\n            for (var oa = 0; ((oa < fa)); ++oa) {\n                var pa = aa.renderPreview(ba[oa], ca, ka, \"cover\"), qa = ((oa % ja)), ra = Math.floor(((oa / ja)));\n                i.addClass(pa, \"_55pn\");\n                s.apply(pa, {\n                    width: ((((((ka / da)) * 100)) + \"%\")),\n                    left: ((((((((qa * ((ka + ea)))) / da)) * 100)) + \"%\")),\n                    JSBNG__top: ((((((((ra * ((ka + ea)))) / ma)) * 100)) + \"%\"))\n                });\n                k.appendContent(na, pa);\n            };\n        ;\n            return ha;\n        },\n        isPhotoAttachment: function(ba) {\n            return ((((ba.attach_type == o.PHOTO)) || ((((ba.attach_type == o.FILE)) && ba.preview_url))));\n        },\n        isShareAttachment: function(ba) {\n            return ((ba.attach_type == o.SHARE));\n        },\n        isFileAttachment: function(ba) {\n            return ((ba.attach_type == o.FILE));\n        },\n        isErrorAttachment: function(ba) {\n            return ((ba.attach_type == o.ERROR));\n        },\n        booleanLexicographicComparator: function(ba) {\n            return function(ca, da) {\n                for (var ea = 0; ((ea < ba.length)); ++ea) {\n                    var fa = ba[ea](ca), ga = ba[ea](da);\n                    if (((fa && !ga))) {\n                        return -1;\n                    }\n                     else if (((!fa && ga))) {\n                        return 1;\n                    }\n                    \n                ;\n                ;\n                };\n            ;\n                return 0;\n            };\n        }\n    };\n    e.exports = aa;\n});\n__d(\"URLScraper\", [\"ArbiterMixin\",\"DataStore\",\"JSBNG__Event\",\"URLMatcher\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"ArbiterMixin\"), h = b(\"DataStore\"), i = b(\"JSBNG__Event\"), j = b(\"URLMatcher\"), k = b(\"copyProperties\"), l = \"scraperLastPermissiveMatch\";\n    function m(n) {\n        this.input = n;\n        this.enable();\n    };\n;\n    k(m.prototype, g, {\n        reset: function() {\n            h.set(this.input, l, null);\n        },\n        enable: function() {\n            if (this.events) {\n                return;\n            }\n        ;\n        ;\n            var n = function(o) {\n                JSBNG__setTimeout(this.check.bind(this, o), 30);\n            };\n            this.events = i.listen(this.input, {\n                paste: n.bind(this, false),\n                keydown: n.bind(this, true)\n            });\n        },\n        disable: function() {\n            if (!this.events) {\n                return;\n            }\n        ;\n        ;\n            {\n                var fin268keys = ((window.top.JSBNG_Replay.forInKeys)((this.events))), fin268i = (0);\n                var JSBNG__event;\n                for (; (fin268i < fin268keys.length); (fin268i++)) {\n                    ((event) = (fin268keys[fin268i]));\n                    {\n                        this.events[JSBNG__event].remove();\n                    ;\n                    };\n                };\n            };\n        ;\n            this.events = null;\n        },\n        check: function(n) {\n            var o = this.input.value;\n            if (((n && m.trigger(o)))) {\n                return;\n            }\n        ;\n        ;\n            var p = m.match(o), q = j.permissiveMatch(o);\n            if (((q && ((q != h.get(this.input, l)))))) {\n                h.set(this.input, l, q);\n                this.inform(\"match\", {\n                    url: ((p || q)),\n                    alt_url: q\n                });\n            }\n        ;\n        ;\n        }\n    });\n    k(m, j);\n    e.exports = m;\n});\n__d(\"htmlHyperlink\", [\"Env\",\"htmlize\",\"UntrustedLink\",\"URI\",\"URLScraper\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Env\"), h = b(\"htmlize\"), i = b(\"UntrustedLink\"), j = b(\"URI\"), k = b(\"URLScraper\"), l = b(\"cx\");\n    function m(n, o, p, q) {\n        if (((((typeof n === \"undefined\")) || !n.toString))) {\n            return \"\";\n        }\n    ;\n    ;\n        if (((typeof o !== \"function\"))) {\n            o = h;\n        }\n    ;\n    ;\n        if (((typeof p !== \"function\"))) {\n            p = h;\n        }\n    ;\n    ;\n        var n = n.toString(), r = [], s;\n        while ((s = k.match(n))) {\n            var t = n.indexOf(s);\n            if (((t >= 0))) {\n                r.push(o(n.substring(0, t)));\n            }\n        ;\n        ;\n            var u = p(s), v = s.replace(/\"/g, \"%22\");\n            if (!(/^[a-z][a-z0-9\\-+.]+:\\/\\//i.test(s))) {\n                v = ((\"http://\" + v));\n            }\n        ;\n        ;\n            if (j.isValidURI(v)) {\n                r.push(((((((((((((\"\\u003Ca target=\\\"_blank\\\" rel=\\\"nofollow\\\" \" + \"class=\\\"\")) + \"_553k\")) + \"\\\" \")) + \"href=\\\"\")) + v)) + \"\\\"\")));\n                if (((q && !j(v).isFacebookURI()))) {\n                    a.UntrustedLink = i;\n                    r.push(((((\" onmousedown=\\\"UntrustedLink.bootstrap(this, '\" + g.lhsh)) + \"', event)\\\"\")));\n                }\n            ;\n            ;\n                r.push(((((\"\\u003E\" + u)) + \"\\u003C/a\\u003E\")));\n            }\n             else r.push(u);\n        ;\n        ;\n            n = n.substring(((t + s.length)));\n        };\n    ;\n        ((n && r.push(o(n))));\n        return r.join(\"\");\n    };\n;\n    e.exports = m;\n});\n__d(\"MercuryMessageRenderer\", [\"MercuryAttachmentRenderer\",\"CSS\",\"DOM\",\"DOMQuery\",\"HTML\",\"MercuryEmoji\",\"MercuryLogMessageType\",\"MercuryParticipants\",\"Tooltip\",\"cx\",\"htmlHyperlink\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"MercuryAttachmentRenderer\"), h = b(\"CSS\"), i = b(\"DOM\"), j = b(\"DOMQuery\"), k = b(\"HTML\"), l = b(\"MercuryEmoji\"), m = b(\"MercuryLogMessageType\"), n = b(\"MercuryParticipants\"), o = b(\"Tooltip\"), p = b(\"cx\"), q = b(\"htmlHyperlink\"), r = b(\"tx\"), s = [\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\",], t = {\n        renderDate: function(ma) {\n            var na = new JSBNG__Date();\n            na.setHours(0);\n            na.setMinutes(0);\n            na.setSeconds(0);\n            na.setMilliseconds(0);\n            var oa = ((((((24 * 60)) * 60)) * 1000)), pa = ((na.getTime() - ma.getTime()));\n            if (((pa <= 0))) {\n                return \"Today\";\n            }\n             else if (((pa < oa))) {\n                return \"Yesterday\";\n            }\n            \n        ;\n        ;\n            var qa = s[ma.getMonth()], ra = ma.getDate(), sa = ma.getFullYear();\n            if (((sa != na.getFullYear()))) {\n                return r._(\"{month} {date}, {year}\", {\n                    month: qa,\n                    date: ra,\n                    year: sa\n                });\n            }\n             else return r._(\"{month} {date}\", {\n                month: qa,\n                date: ra\n            })\n        ;\n        },\n        renderTooltipFlyout: function(ma, na) {\n            na.forEach(function(oa) {\n                var pa = i.create(\"div\");\n                i.setContent(pa, oa.JSBNG__name);\n                i.appendContent(ma, pa);\n            });\n        },\n        renderLogMessage: function(ma, na, oa, pa) {\n            w(ma, pa);\n            x(na, pa);\n            y(oa, pa);\n        },\n        formatMessageBody: function(ma, na, oa) {\n            var pa = ((ma || \"\")).replace(/\\s+$/, \"\");\n            if (!na) {\n                return v(pa, false, oa);\n            }\n        ;\n        ;\n            var qa = Object.keys(na).map(function(ta) {\n                return window.parseInt(ta);\n            }).sort(function(ta, ua) {\n                return ((ta - ua));\n            }), ra = [], sa = 0;\n            qa.forEach(function(ta) {\n                var ua = pa.slice(sa, ta);\n                if (ua) {\n                    ra.push(v(ua, false, oa));\n                }\n            ;\n            ;\n                sa = ((ta + na[ta].length));\n                var va = pa.slice(ta, sa);\n                if (va) {\n                    ra.push(v(va, true, oa));\n                }\n            ;\n            ;\n            });\n            if (((sa < pa.length))) {\n                ra.push(v(pa.slice(sa), false, oa));\n            }\n        ;\n        ;\n            return ((((ra.length === 0)) ? null : ((((ra.length === 1)) ? ra[0] : i.create(\"span\", {\n            }, ra)))));\n        }\n    };\n    function u(ma, na) {\n        var oa = ma.replace(/\\r\\n?/g, \"\\u000a\").split(/\\n{2,}/), pa = [];\n        for (var qa = 0; ((qa < oa.length)); qa++) {\n            var ra = oa[qa];\n            if (ra.length) {\n                pa.push(\"\\u003Cp\\u003E\");\n                pa.push(na(ra));\n                pa.push(\"\\u003C/p\\u003E\");\n            }\n        ;\n        ;\n        };\n    ;\n        return pa.join(\"\");\n    };\n;\n    function v(ma, na, oa) {\n        var pa = null;\n        if (((((ma.length === 0)) && !na))) {\n            return pa;\n        }\n    ;\n    ;\n        function qa(ra) {\n            return q(ra, l.htmlEmojiAndEmote, null, true);\n        };\n    ;\n        pa = ((oa ? u(ma, qa) : qa(ma)));\n        if (na) {\n            return i.create(\"span\", {\n                className: \"highlight\"\n            }, k(pa));\n        }\n    ;\n    ;\n        return k(pa);\n    };\n;\n    function w(ma, na) {\n        var oa = \"\", pa;\n        switch (na.log_message_type) {\n          case m.JOINABLE_CREATED:\n        \n          case m.JOINABLE_JOINED:\n        \n          case m.SUBSCRIBE:\n            oa = \"mercurySubscribeIcon\";\n            break;\n          case m.UNSUBSCRIBE:\n            oa = \"mercuryUnsubscribeIcon\";\n            break;\n          case m.THREAD_NAME:\n            oa = \"mercuryThreadNameIcon\";\n            break;\n          case m.THREAD_IMAGE:\n            oa = \"mercuryThreadImageIcon\";\n            break;\n          case m.VIDEO_CALL:\n            pa = na.log_message_data.answered;\n            if (((pa || la(na)))) {\n                oa = \"mercuryVideoCallIcon\";\n            }\n             else oa = \"mercuryMissedVideoCallIcon\";\n        ;\n        ;\n            break;\n          case m.PHONE_CALL:\n            pa = na.log_message_data.answered;\n            if (pa) {\n                oa = \"mercuryPhoneCallIcon\";\n            }\n             else oa = \"mercuryMissedPhoneCallIcon\";\n        ;\n        ;\n            break;\n          case m.SERVER_ERROR:\n            oa = \"mercuryErrorIcon\";\n            break;\n        };\n    ;\n        h.addClass(ma, oa);\n    };\n;\n    function x(ma, na) {\n        switch (na.log_message_type) {\n          case m.JOINABLE_CREATED:\n            da(ma, na);\n            break;\n          case m.JOINABLE_JOINED:\n            ea(ma, na);\n            break;\n          case m.SUBSCRIBE:\n            ia(ma, na);\n            break;\n          case m.UNSUBSCRIBE:\n            ja(ma, na);\n            break;\n          case m.VIDEO_CALL:\n            if (la(na)) {\n                z(ma, na);\n            }\n             else ba(ma, na);\n        ;\n        ;\n            break;\n          case m.PHONE_CALL:\n            aa(ma, na);\n            break;\n          case m.THREAD_NAME:\n            ca(ma, na);\n            break;\n          case m.THREAD_IMAGE:\n            fa(ma, na);\n            break;\n          case m.SERVER_ERROR:\n            ka(ma, na);\n            break;\n        };\n    ;\n    };\n;\n    function y(ma, na) {\n        var oa = na.log_message_type;\n        if (((oa == m.THREAD_IMAGE))) {\n            var pa = na.log_message_data.image;\n            if (pa) {\n                var qa = g.renderPreview(((pa.preview_url ? pa : null)));\n                i.setContent(ma, qa);\n                h.addClass(qa, \"_z6a\");\n                h.show(ma);\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n    };\n;\n    var z = function(ma, na) {\n        n.get(na.author, function(oa) {\n            var pa = i.create(\"span\", {\n                className: \"_511e\"\n            }, oa.short_name), qa;\n            switch (na.log_message_data.event_name) {\n              case \"installing\":\n                qa = i.tx._(\"{firstname} is setting up video calling...\", {\n                    firstname: pa\n                });\n                break;\n              case \"installed\":\n                qa = i.tx._(\"{firstname} finished setting up video calling.\", {\n                    firstname: pa\n                });\n                break;\n              case \"install_canceled\":\n                qa = i.tx._(\"You canceled the video calling installation. \", {\n                    firstname: pa\n                });\n                break;\n            };\n        ;\n            if (qa) {\n                i.setContent(ma, qa);\n            }\n        ;\n        ;\n        });\n    }, aa = function(ma, na) {\n        var oa = na.log_message_data.caller, pa = na.log_message_data.callee, qa = [oa,pa,];\n        n.getMulti(qa, function(ra) {\n            if (((oa == n.user))) {\n                var sa = i.create(\"span\", {\n                    className: \"_511e\"\n                }, ra[pa].short_name), ta;\n                if (na.log_message_data.answered) {\n                    ta = i.tx._(\"You called {firstname}.\", {\n                        firstname: sa\n                    });\n                }\n                 else ta = i.tx._(\"{firstname} missed a call from you. \", {\n                    firstname: sa\n                });\n            ;\n            ;\n            }\n             else {\n                var ua = i.create(\"span\", {\n                    className: \"_511e\"\n                }, ra[oa].short_name);\n                if (na.log_message_data.answered) {\n                    ta = i.tx._(\"{firstname} called you.\", {\n                        firstname: ua\n                    });\n                }\n                 else ta = i.tx._(\"You missed a call from {firstname}. \", {\n                    firstname: ua\n                });\n            ;\n            ;\n            }\n        ;\n        ;\n            i.setContent(ma, ta);\n        });\n    }, ba = function(ma, na) {\n        var oa = na.log_message_data.caller, pa = na.log_message_data.callee, qa = [oa,pa,];\n        n.getMulti(qa, function(ra) {\n            if (((oa == n.user))) {\n                var sa = i.create(\"span\", {\n                    className: \"_511e\"\n                }, ra[pa].short_name), ta;\n                if (na.log_message_data.answered) {\n                    ta = i.tx._(\"You called {firstname}.\", {\n                        firstname: sa\n                    });\n                }\n                 else ta = i.tx._(\"{firstname} missed a call from you. \", {\n                    firstname: sa\n                });\n            ;\n            ;\n            }\n             else {\n                var ua = i.create(\"span\", {\n                    className: \"_511e\"\n                }, ra[oa].short_name);\n                if (na.log_message_data.answered) {\n                    ta = i.tx._(\"{firstname} called you.\", {\n                        firstname: ua\n                    });\n                }\n                 else ta = i.tx._(\"You missed a call from {firstname}. \", {\n                    firstname: ua\n                });\n            ;\n            ;\n            }\n        ;\n        ;\n            i.setContent(ma, ta);\n        });\n    }, ca = function(ma, na) {\n        var oa = na.log_message_data.JSBNG__name, pa = i.create(\"b\", {\n        }, oa);\n        if (((na.author == n.user))) {\n            if (oa) {\n                i.setContent(ma, i.tx._(\"You named the conversation: {name}.\", {\n                    JSBNG__name: pa\n                }));\n            }\n             else i.setContent(ma, i.tx._(\"You removed the conversation name.\"));\n        ;\n        ;\n        }\n         else n.get(na.author, function(qa) {\n            var ra, sa = ga(qa);\n            if (oa) {\n                ra = i.tx._(\"{actor} named the conversation: {name}.\", {\n                    actor: sa,\n                    JSBNG__name: pa\n                });\n            }\n             else ra = i.tx._(\"{actor} removed the conversation name.\", {\n                actor: sa\n            });\n        ;\n        ;\n            i.setContent(ma, ra);\n        });\n    ;\n    ;\n    }, da = function(ma, na) {\n        if (((na.author == n.user))) {\n            i.setContent(ma, i.tx._(\"Other people can join this chat from News Feed and add their friends.\"));\n        }\n         else n.get(na.author, function(oa) {\n            var pa = ga(oa);\n            i.setContent(ma, i.tx._(\"{actor} shared this chat to News Feed. Other people can join and add their friends.\", {\n                actor: pa\n            }));\n        });\n    ;\n    ;\n    }, ea = function(ma, na) {\n        var oa = na.log_message_data.joined_participant;\n        if (((oa == n.user))) {\n            i.setContent(ma, i.tx._(\"You joined the chat. Other people can join from News Feed and add their friends.\"));\n        }\n         else n.get(oa, function(pa) {\n            var qa = ga(pa);\n            i.setContent(ma, i.tx._(\"{actor} joined the chat.\", {\n                actor: qa\n            }));\n        });\n    ;\n    ;\n    }, fa = function(ma, na) {\n        if (((na.author == n.user))) {\n            if (na.log_message_data.image) {\n                i.setContent(ma, i.tx._(\"You changed the conversation picture.\"));\n            }\n             else i.setContent(ma, i.tx._(\"You removed the conversation picture.\"));\n        ;\n        ;\n        }\n         else n.get(na.author, function(oa) {\n            var pa = ga(oa), qa;\n            if (na.log_message_data.image) {\n                qa = i.tx._(\"{actor} changed the conversation picture.\", {\n                    actor: pa\n                });\n            }\n             else qa = i.tx._(\"{actor} removed the conversation picture.\", {\n                actor: pa\n            });\n        ;\n        ;\n            i.setContent(ma, qa);\n        });\n    ;\n    ;\n    }, ga = function(ma) {\n        if (ma.href) {\n            return i.create(\"a\", {\n                href: ma.href,\n                className: \"_511e\"\n            }, ma.JSBNG__name);\n        }\n    ;\n    ;\n        return ma.JSBNG__name;\n    }, ha = function(ma) {\n        var na = ma.indexOf(n.user);\n        if (((na > 0))) {\n            return ma.splice(na, 1).concat(ma);\n        }\n    ;\n    ;\n        return ma;\n    }, ia = function(ma, na) {\n        var oa = ha(na.log_message_data.added_participants), pa = null, qa;\n        if (((oa.length == 1))) {\n            pa = [na.author,oa[0],];\n            n.getMulti(pa, function(ra) {\n                if (((na.author == n.user))) {\n                    qa = i.tx._(\"You added {subscriber1}.\", {\n                        subscriber1: ga(ra[oa[0]])\n                    });\n                }\n                 else if (((oa[0] == n.user))) {\n                    qa = i.tx._(\"{actor} added you.\", {\n                        actor: ga(ra[na.author])\n                    });\n                }\n                 else qa = i.tx._(\"{actor} added {subscriber1}.\", {\n                    actor: ga(ra[na.author]),\n                    subscriber1: ga(ra[oa[0]])\n                });\n                \n            ;\n            ;\n                i.setContent(ma, qa);\n            });\n        }\n         else if (((oa.length == 2))) {\n            pa = [na.author,].concat(oa);\n            n.getMulti(pa, function(ra) {\n                if (((na.author == n.user))) {\n                    qa = i.tx._(\"You added {subscriber1} and {subscriber2}.\", {\n                        subscriber1: ga(ra[oa[0]]),\n                        subscriber2: ga(ra[oa[1]])\n                    });\n                }\n                 else if (((oa[0] == n.user))) {\n                    qa = i.tx._(\"{actor} added you and {subscriber2}.\", {\n                        actor: ga(ra[na.author]),\n                        subscriber2: ga(ra[oa[1]])\n                    });\n                }\n                 else qa = i.tx._(\"{actor} added {subscriber1} and {subscriber2}.\", {\n                    actor: ga(ra[na.author]),\n                    subscriber1: ga(ra[oa[0]]),\n                    subscriber2: ga(ra[oa[1]])\n                });\n                \n            ;\n            ;\n                i.setContent(ma, qa);\n            });\n        }\n         else if (((oa.length == 3))) {\n            pa = [na.author,].concat(oa);\n            n.getMulti(pa, function(ra) {\n                if (((na.author == n.user))) {\n                    qa = i.tx._(\"You added {subscriber1}, {subscriber2} and {subscriber3}.\", {\n                        subscriber1: ga(ra[oa[0]]),\n                        subscriber2: ga(ra[oa[1]]),\n                        subscriber3: ga(ra[oa[2]])\n                    });\n                }\n                 else if (((oa[0] == n.user))) {\n                    qa = i.tx._(\"{actor} added you, {subscriber2} and {subscriber3}.\", {\n                        actor: ga(ra[na.author]),\n                        subscriber2: ga(ra[oa[1]]),\n                        subscriber3: ga(ra[oa[2]])\n                    });\n                }\n                 else qa = i.tx._(\"{actor} added {subscriber1}, {subscriber2} and {subscriber3}.\", {\n                    actor: ga(ra[na.author]),\n                    subscriber1: ga(ra[oa[0]]),\n                    subscriber2: ga(ra[oa[1]]),\n                    subscriber3: ga(ra[oa[2]])\n                });\n                \n            ;\n            ;\n                i.setContent(ma, qa);\n            });\n        }\n         else {\n            pa = [na.author,].concat(oa);\n            n.getMulti(pa, function(ra) {\n                var sa = i.tx._(\"{num} more\", {\n                    num: ((oa.length - 2))\n                }), ta = i.create(\"span\", {\n                    className: \"more\"\n                }, sa), ua = i.create(\"div\");\n                t.renderTooltipFlyout(ua, oa.slice(2).map(function(wa) {\n                    return ra[wa];\n                }));\n                if (((na.author == n.user))) {\n                    qa = i.tx._(\"You added {subscriber1}, {subscriber2} and {more_people}.\", {\n                        subscriber1: ga(ra[oa[0]]),\n                        subscriber2: ga(ra[oa[1]]),\n                        more_people: ta\n                    });\n                }\n                 else if (((oa[0] == n.user))) {\n                    qa = i.tx._(\"{actor} added you, {subscriber2} and {more_people}.\", {\n                        actor: ga(ra[na.author]),\n                        subscriber2: ga(ra[oa[1]]),\n                        more_people: ta\n                    });\n                }\n                 else qa = i.tx._(\"{actor} added {subscriber1}, {subscriber2} and {more_people}.\", {\n                    actor: ga(ra[na.author]),\n                    subscriber1: ga(ra[oa[0]]),\n                    subscriber2: ga(ra[oa[1]]),\n                    more_people: ta\n                });\n                \n            ;\n            ;\n                i.setContent(ma, qa);\n                var va = j.JSBNG__find(ma, \"span.more\");\n                o.set(va, ua, \"above\", \"center\");\n            });\n        }\n        \n        \n    ;\n    ;\n    }, ja = function(ma, na) {\n        n.get(na.author, function(oa) {\n            var pa;\n            if (((na.author == n.user))) {\n                pa = i.tx._(\"You left the conversation.\");\n            }\n             else pa = i.tx._(\"{actor} left the conversation.\", {\n                actor: ga(oa)\n            });\n        ;\n        ;\n            i.setContent(ma, pa);\n        });\n    }, ka = function(ma, na) {\n        var oa = \"We were unable to fetch previous messages in this conversation.\";\n        i.setContent(ma, oa);\n    }, la = function(ma) {\n        return ((((ma.log_message_data.event_name === \"installing\")) || ((ma.log_message_data.event_name === \"install_canceled\"))));\n    };\n    e.exports = t;\n});\n__d(\"MercurySheetPolicy\", [], function(a, b, c, d, e, f) {\n    var g = {\n        canReplaceOpenSheet: function(h, i) {\n            if (((h.getType() == i.getType()))) {\n                return false;\n            }\n        ;\n        ;\n            if (((h.isPermanent() && !i.isPermanent()))) {\n                return false;\n            }\n        ;\n        ;\n            return true;\n        }\n    };\n    e.exports = g;\n});\n__d(\"MercurySheetView\", [\"Animation\",\"ArbiterMixin\",\"MercurySheetPolicy\",\"CSS\",\"DOM\",\"Style\",\"MercurySheetTemplates\",\"Vector\",\"copyProperties\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Animation\"), h = b(\"ArbiterMixin\"), i = b(\"MercurySheetPolicy\"), j = b(\"CSS\"), k = b(\"DOM\"), l = b(\"Style\"), m = b(\"MercurySheetTemplates\"), n = b(\"Vector\"), o = b(\"copyProperties\"), p = b(\"cx\"), q = 5000, r = function(s, t, u) {\n        this._threadID = s;\n        this._rootElement = t;\n        this._tabMainElement = u;\n        this._openSheet = null;\n    };\n    o(r.prototype, h, {\n        destroy: function() {\n            k.empty(this._rootElement);\n        },\n        _openCommon: function(s, t) {\n            if (((this._openSheet && !i.canReplaceOpenSheet(this._openSheet, s)))) {\n                if (s.couldNotReplace) {\n                    s.couldNotReplace();\n                }\n            ;\n            ;\n                return;\n            }\n        ;\n        ;\n            this.clear(function() {\n                this._openSheet = s;\n                var u = m[\":fb:mercury:tab-sheet:loading\"].build().getRoot();\n                k.setContent(this._rootElement, u);\n                j.show(u);\n                j.show(this._rootElement);\n                s.render();\n                if (t) {\n                    j.addClass(this._tabMainElement, \"sheetSlide\");\n                    j.addClass(this._tabMainElement, \"_1sk4\");\n                    var v = n.getElementDimensions(this._rootElement).y;\n                    l.set(this._rootElement, \"bottom\", ((v + \"px\")));\n                    this.inform(\"resize\");\n                    this._animation = new g(this._rootElement).to(\"bottom\", 0).duration(150).ease(g.ease.both).ondone(function() {\n                        j.removeClass(this._tabMainElement, \"sheetSlide\");\n                        j.removeClass(this._tabMainElement, \"_1sk4\");\n                        this.inform(\"resize\");\n                    }.bind(this)).go();\n                }\n                 else this.inform(\"resize\");\n            ;\n            ;\n                if (!s.isPermanent()) {\n                    var w = q;\n                    if (s.getCloseTimeout) {\n                        w = s.getCloseTimeout();\n                    }\n                ;\n                ;\n                    var x = this.getAutoCloseCallback(s);\n                    this._sheetCloseHandler = this.close.bind(this, s, x).defer(w, false);\n                    if (s.timeoutCanBeReset) {\n                        s.setResetTimeoutCallback(this.resetTimeout.bind(this));\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n            }.bind(this));\n        },\n        getAutoCloseCallback: function(s) {\n            if (!s.autoCloseCallback) {\n                return null;\n            }\n        ;\n        ;\n            return s.autoCloseCallback.bind(s);\n        },\n        resetTimeout: function(s, t) {\n            JSBNG__clearTimeout(this._sheetCloseHandler);\n            var u = this.getAutoCloseCallback(s);\n            this._sheetCloseHandler = this.close.bind(this, s, u).defer(t, false);\n        },\n        set: function(s) {\n            return this._openCommon(s, false);\n        },\n        open: function(s) {\n            return this._openCommon(s, true);\n        },\n        close: function(s, t) {\n            if (((this._openSheet != s))) {\n                return;\n            }\n        ;\n        ;\n            if (!this._openSheet) {\n                ((t && t()));\n                return;\n            }\n        ;\n        ;\n            if (this._animation) {\n                this._animation.JSBNG__stop();\n            }\n        ;\n        ;\n            if (this._sheetCloseHandler) {\n                JSBNG__clearTimeout(this._sheetCloseHandler);\n                this._sheetCloseHandler = null;\n            }\n        ;\n        ;\n            j.addClass(this._tabMainElement, \"sheetSlide\");\n            j.addClass(this._tabMainElement, \"_1sk4\");\n            var u = n.getElementDimensions(this._rootElement).y;\n            this.inform(\"resize\");\n            this._animation = new g(this._rootElement).to(\"bottom\", ((u + \"px\"))).duration(100).ease(g.ease.begin).ondone(function() {\n                k.empty(this._rootElement);\n                j.hide(this._rootElement);\n                j.removeClass(this._tabMainElement, \"sheetSlide\");\n                j.removeClass(this._tabMainElement, \"_1sk4\");\n                this._openSheet = null;\n                this.inform(\"resize\");\n                ((t && t()));\n            }.bind(this)).go();\n        },\n        clear: function(s) {\n            this.close(this._openSheet, s);\n        }\n    });\n    e.exports = r;\n});\n__d(\"MercuryStickersData\", [\"Arbiter\",\"MercuryStickersInitialData\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"MercuryStickersInitialData\"), i = h.packs, j = {\n        getPacks: function() {\n            return i;\n        },\n        updatePackData: function(k) {\n            i = k.packs;\n            g.inform(\"MercuryStickers/updatedPacks\");\n        }\n    };\n    e.exports = j;\n});\n__d(\"MercuryStickers\", [\"Arbiter\",\"ArbiterMixin\",\"CSS\",\"DOM\",\"JSBNG__Event\",\"MercuryStickersData\",\"MercuryStickersFlyoutList.react\",\"Parent\",\"React\",\"SubscriptionsHandler\",\"Toggler\",\"UIPagelet\",\"XUISpinner.react\",\"copyProperties\",\"csx\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ArbiterMixin\"), i = b(\"CSS\"), j = b(\"DOM\"), k = b(\"JSBNG__Event\"), l = b(\"MercuryStickersData\"), m = b(\"MercuryStickersFlyoutList.react\"), n = b(\"Parent\"), o = b(\"React\"), p = b(\"SubscriptionsHandler\"), q = b(\"Toggler\"), r = b(\"UIPagelet\"), s = b(\"XUISpinner.react\"), t = b(\"copyProperties\"), u = b(\"csx\"), v = b(\"cx\");\n    function w(x) {\n        this._packs = j.JSBNG__find(x, \"._5907\");\n        this._packSelector = j.JSBNG__find(x, \"._5906\");\n        this._loadedPacks = {\n            emoticons: true\n        };\n        var y = n.byClass(x, \"uiToggle\"), z = q.listen(\"show\", y, function() {\n            this._renderPackList();\n            this._subscriptions.addSubscriptions(g.subscribe(\"MercuryStickers/updatedPacks\", this._renderPackList.bind(this)));\n            this._selectPack(l.getPacks()[0].id);\n            q.unsubscribe(z);\n        }.bind(this));\n        this._subscriptions = new p();\n        this._subscriptions.addSubscriptions(k.listen(this._packs, \"click\", function(JSBNG__event) {\n            var aa = n.byClass(JSBNG__event.getTarget(), \"_55bp\");\n            if (aa) {\n                this._selectedSticker(aa);\n                q.hide(y);\n            }\n        ;\n        ;\n        }.bind(this)));\n    };\n;\n    t(w.prototype, h, {\n        _renderPackList: function() {\n            o.renderComponent(m({\n                onPackClick: this._selectPack.bind(this),\n                packs: l.getPacks()\n            }), this._packSelector);\n        },\n        _loadPack: function(x) {\n            if (this._loadedPacks[x]) {\n                return;\n            }\n        ;\n        ;\n            var y = this._getPackWithID(x);\n            o.renderComponent(s({\n                className: \"_5905\"\n            }), y);\n            this._loadedPacks[x] = true;\n            r.loadFromEndpoint(\"StickerPackPagelet\", y, {\n                id: x\n            });\n        },\n        _getPackWithID: function(x) {\n            var y = j.scry(this._packs, ((((((\"._55bq\" + \"[data-id=\\\"\")) + x)) + \"\\\"]\")))[0];\n            if (!y) {\n                y = j.create(\"div\", {\n                    className: \"_55bq hidden_elem\",\n                    \"data-id\": x\n                });\n                j.appendContent(this._packs, y);\n            }\n        ;\n        ;\n            return y;\n        },\n        _selectedSticker: function(x) {\n            var y = parseInt(x.getAttribute(\"data-id\"), 10);\n            this.inform(\"stickerselected\", {\n                id: y\n            });\n        },\n        _selectPack: function(x) {\n            j.scry(this._packs, \"._55bq\").forEach(i.hide);\n            this._loadPack(x);\n            i.show(this._getPackWithID(x));\n        },\n        destroy: function() {\n            ((this._subscriptions && this._subscriptions.release()));\n            this._subscriptions = null;\n        }\n    });\n    e.exports = w;\n});\n__d(\"Token\", [\"CSS\",\"DataStore\",\"DOM\",\"copyProperties\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSS\"), h = b(\"DataStore\"), i = b(\"DOM\"), j = b(\"copyProperties\"), k = b(\"tx\");\n    function l(m, n) {\n        this.info = m;\n        this.paramName = n;\n    };\n;\n    j(l.prototype, {\n        getInfo: function() {\n            return this.info;\n        },\n        getText: function() {\n            return this.info.text;\n        },\n        getValue: function() {\n            return this.info.uid;\n        },\n        isFreeform: function() {\n            return !!this.info.freeform;\n        },\n        setSelected: function(m) {\n            g.conditionClass(this.getElement(), \"uiTokenSelected\", m);\n            return this;\n        },\n        getElement: function() {\n            if (!this.element) {\n                this.setElement(this.createElement());\n            }\n        ;\n        ;\n            return this.element;\n        },\n        setElement: function(m) {\n            h.set(m, \"Token\", this);\n            this.element = m;\n            return this;\n        },\n        isRemovable: function() {\n            return g.hasClass(this.element, \"removable\");\n        },\n        createElement: function(m, n) {\n            var o = this.paramName, p = this.getText(), q = this.getValue(), r = i.create(\"a\", {\n                href: \"#\",\n                \"aria-label\": k._(\"Remove {item}\", {\n                    item: p\n                }),\n                className: \"remove uiCloseButton uiCloseButtonSmall\"\n            });\n            if (m) {\n                g.addClass(r, \"uiCloseButtonSmallGray\");\n            }\n        ;\n        ;\n            var s = i.create(\"input\", {\n                type: \"hidden\",\n                value: q,\n                JSBNG__name: ((o + \"[]\")),\n                autocomplete: \"off\"\n            }), t = i.create(\"input\", {\n                type: \"hidden\",\n                value: p,\n                JSBNG__name: ((((\"text_\" + o)) + \"[]\")),\n                autocomplete: \"off\"\n            }), u = i.create(\"span\", {\n                className: \"removable uiToken\"\n            }, [p,s,t,r,]);\n            if (m) {\n                g.addClass(u, \"uiTokenGray\");\n            }\n        ;\n        ;\n            if (n) {\n                var v = i.create(\"i\", {\n                    className: n\n                });\n                i.prependContent(u, v);\n            }\n        ;\n        ;\n            return u;\n        }\n    });\n    e.exports = l;\n});\n__d(\"WeakToken\", [\"Class\",\"CSS\",\"Token\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Class\"), h = b(\"CSS\"), i = b(\"Token\"), j = b(\"copyProperties\");\n    function k(l, m) {\n        this.parent.construct(this, l, m);\n    };\n;\n    g.extend(k, i);\n    j(k.prototype, {\n        createElement: function() {\n            var l = this.parent.createElement(true, \"UFIWeakReferenceIcon\");\n            h.addClass(l, \"uiTokenWeakReference\");\n            return l;\n        }\n    });\n    e.exports = k;\n});\n__d(\"Tokenizer\", [\"Arbiter\",\"ArbiterMixin\",\"CSS\",\"DOM\",\"DOMQuery\",\"DataStore\",\"JSBNG__Event\",\"Focus\",\"Input\",\"Keys\",\"Parent\",\"StickyPlaceholderInput\",\"Style\",\"JSBNG__TextMetrics\",\"Token\",\"UserAgent\",\"WeakToken\",\"copyProperties\",\"createObjectFrom\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ArbiterMixin\"), i = b(\"CSS\"), j = b(\"DOM\"), k = b(\"DOMQuery\"), l = b(\"DataStore\"), m = b(\"JSBNG__Event\"), n = b(\"Focus\"), o = b(\"Input\"), p = b(\"Keys\"), q = b(\"Parent\"), r = b(\"StickyPlaceholderInput\"), s = b(\"Style\"), t = b(\"JSBNG__TextMetrics\"), u = b(\"Token\"), v = b(\"UserAgent\"), w = b(\"WeakToken\"), x = b(\"copyProperties\"), y = b(\"createObjectFrom\"), z = b(\"emptyFunction\"), aa = 20;\n    function ba(ca, da) {\n        this.element = ca;\n        this.typeahead = da;\n        this.input = da.getCore().getElement();\n        l.set(this.element, \"Tokenizer\", this);\n    };\n;\n    ba.getInstance = function(ca) {\n        var da = q.byClass(ca, \"uiTokenizer\");\n        return ((da ? l.get(da, \"Tokenizer\") : null));\n    };\n    x(ba.prototype, h, {\n        inline: false,\n        maxTokens: null,\n        excludeDuplicates: true,\n        placeholder: \"\",\n        init: function(ca, da, ea, fa) {\n            this.init = z;\n            this.tokenarea = ca;\n            this.paramName = da;\n            if (!this.placeholder) {\n                this.placeholder = ((this.input.getAttribute(\"data-placeholder\") || \"\"));\n            }\n        ;\n        ;\n            x(this, ((fa || {\n            })));\n            this.initEvents();\n            this.initTypeahead();\n            this.reset(ea);\n            this.initBehaviors();\n            this.adjustWidth.bind(this).defer();\n            g.inform(\"Tokenizer/init\", this, g.BEHAVIOR_PERSISTENT);\n        },\n        reset: function(ca) {\n            this.tokens = [];\n            this.unique = {\n            };\n            if (ca) {\n                this.populate(ca);\n            }\n             else j.empty(this.tokenarea);\n        ;\n        ;\n            this.updateTokenarea();\n        },\n        populate: function(ca) {\n            var da = [];\n            this.tokens = this.getTokenElements().map(function(ea, fa) {\n                var ga = ca[fa];\n                da.push(this._tokenKey(ga));\n                return this.createToken(ga, ea);\n            }, this);\n            this.unique = y(da, this.tokens);\n        },\n        getElement: function() {\n            return this.element;\n        },\n        getTypeahead: function() {\n            return this.typeahead;\n        },\n        getInput: function() {\n            return this.input;\n        },\n        initBehaviors: function() {\n            this.behaviors = ((this.behaviors || []));\n            if (((this.behaviors instanceof Array))) {\n                this.behaviors.forEach(function(ea) {\n                    ea.behavior(this, ea.config);\n                }.bind(this));\n            }\n             else {\n                var fin269keys = ((window.top.JSBNG_Replay.forInKeys)(((this.behaviors || {\n                })))), fin269i = (0);\n                var ca;\n                for (; (fin269i < fin269keys.length); (fin269i++)) {\n                    ((ca) = (fin269keys[fin269i]));\n                    {\n                        var da = ((window.TokenizerBehaviors && window.TokenizerBehaviors[ca]));\n                        da.call(null, this, this.behaviors[ca]);\n                    };\n                };\n            }\n        ;\n        ;\n        },\n        initTypeahead: function() {\n            var ca = this.typeahead.getCore();\n            ca.resetOnSelect = true;\n            ca.setValueOnSelect = false;\n            ca.preventFocusChangeOnTab = true;\n            if (this.inline) {\n                var da = this.typeahead.getView();\n                i.addClass(da.getElement(), \"uiInlineTokenizerView\");\n            }\n        ;\n        ;\n            this.typeahead.subscribe(\"select\", function(ea, fa) {\n                var ga = fa.selected;\n                if (((\"uid\" in ga))) {\n                    this.updateInput();\n                    this.addToken(this.createToken(ga));\n                }\n            ;\n            ;\n            }.bind(this));\n            this.typeahead.subscribe(\"JSBNG__blur\", this.handleBlur.bind(this));\n        },\n        handleBlur: function(JSBNG__event) {\n            this.inform(\"JSBNG__blur\", {\n                JSBNG__event: JSBNG__event\n            });\n            this.updatePlaceholder();\n        },\n        initEvents: function() {\n            var ca = this.handleEvents.bind(this), da = ((((v.firefox() < 4)) ? \"keypress\" : \"keydown\"));\n            m.listen(this.tokenarea, {\n                click: ca,\n                keydown: ca\n            });\n            m.listen(this.input, \"paste\", this.paste.bind(this));\n            m.listen(this.input, da, this.keydown.bind(this));\n        },\n        handleEvents: function(JSBNG__event) {\n            var ca = JSBNG__event.getTarget(), da = ((ca && this.getTokenElementFromTarget(ca)));\n            if (!da) {\n                return;\n            }\n        ;\n        ;\n            if (((((JSBNG__event.type != \"keydown\")) || ((m.getKeyCode(JSBNG__event) == p.RETURN))))) {\n                this.processEvents(JSBNG__event, ca, da);\n            }\n        ;\n        ;\n        },\n        processEvents: function(JSBNG__event, ca, da) {\n            if (q.byClass(ca, \"remove\")) {\n                var ea = da.nextSibling;\n                ea = ((ea && k.scry(da.nextSibling, \".remove\")[0]));\n                var fa = this.getTokenFromElement(da);\n                fa = this.addTokenData(fa, ca);\n                this.removeToken(fa);\n                this.focusOnTokenRemoval(JSBNG__event, ea);\n                JSBNG__event.kill();\n            }\n        ;\n        ;\n        },\n        focusOnTokenRemoval: function(JSBNG__event, ca) {\n            n.set(((((((JSBNG__event.type == \"keydown\")) && ca)) || this.input)));\n        },\n        addTokenData: function(ca, da) {\n            return ca;\n        },\n        keydown: function(JSBNG__event) {\n            this.inform(\"keydown\", {\n                JSBNG__event: JSBNG__event\n            });\n            var ca = m.getKeyCode(JSBNG__event), da = this.input;\n            if (((((this.inline && ((ca == p.BACKSPACE)))) && o.isEmpty(da)))) {\n                var ea = this.getLastToken();\n                if (((ea && ea.isRemovable()))) {\n                    this.removeToken(ea);\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            this.updateInput();\n        },\n        paste: function(JSBNG__event) {\n            this.inform(\"paste\", {\n                JSBNG__event: JSBNG__event\n            });\n            this.updateInput(true);\n        },\n        focusInput: function() {\n            n.set(this.input);\n        },\n        updateInput: function(ca) {\n            if (!this.inline) {\n                return;\n            }\n        ;\n        ;\n            JSBNG__setTimeout(function() {\n                this.adjustWidth(this.input.value);\n                if (ca) {\n                    this.input.value = this.input.value;\n                }\n            ;\n            ;\n            }.bind(this), 20);\n            r.setPlaceholderText(this.input, \"\");\n            this.inform(\"resize\");\n        },\n        setPlaceholder: function(ca) {\n            this.placeholder = ca;\n            if (this.stickyPlaceholder) {\n                r.setPlaceholderText(this.input, ca);\n            }\n        ;\n        ;\n            this.updatePlaceholder();\n        },\n        updatePlaceholder: function() {\n            if (((!this.inline || this.input.value))) {\n                return;\n            }\n        ;\n        ;\n            var ca = !this.tokens.length, da = \"\";\n            if (((ca || this.stickyPlaceholder))) {\n                this.adjustWidth(this.placeholder);\n                da = this.placeholder;\n            }\n             else this.adjustWidth(this.input.value);\n        ;\n        ;\n            r.setPlaceholderText(this.input, da);\n        },\n        adjustWidth: function(ca) {\n            if (((!this.inline || !this._getIsInDOM()))) {\n                return;\n            }\n        ;\n        ;\n            if (((!ca && ((this.input.value === \"\"))))) {\n                ca = this.placeholder;\n            }\n        ;\n        ;\n            var da = aa;\n            if (((((((ca !== this.placeholder)) || !this.getTokens().length)) || this.stickyPlaceholder))) {\n                var ea = this._getMetrics().measure(ca);\n                da = ((((ea.width + this._getWidthOffset())) + 10));\n            }\n        ;\n        ;\n            s.set(this.input, \"width\", ((da + \"px\")));\n            this.inform(\"resize\");\n        },\n        getToken: function(ca) {\n            return ((this.unique[ca] || null));\n        },\n        getTokens: function() {\n            return ((this.tokens || []));\n        },\n        getTokenElements: function() {\n            return k.scry(this.tokenarea, \"span.uiToken\");\n        },\n        getTokenElementFromTarget: function(ca) {\n            return q.byClass(ca, \"uiToken\");\n        },\n        getTokenFromElement: function(ca) {\n            return l.get(ca, \"Token\");\n        },\n        getTokenValues: function() {\n            if (!this.tokens) {\n                return [];\n            }\n        ;\n        ;\n            return this.tokens.map(function(ca) {\n                return ca.getValue();\n            });\n        },\n        getFirstToken: function() {\n            return ((this.tokens[0] || null));\n        },\n        getLastToken: function() {\n            return ((this.tokens[((this.tokens.length - 1))] || null));\n        },\n        hasMaxTokens: function() {\n            return ((this.maxTokens && ((this.maxTokens <= this.tokens.length))));\n        },\n        createToken: function(ca, da) {\n            var ea = this.getToken(this._tokenKey(ca));\n            if (!ea) {\n                ea = ((ca.weak_reference ? new w(ca, this.paramName) : new u(ca, this.paramName)));\n            }\n        ;\n        ;\n            ((da && ea.setElement(da)));\n            return ea;\n        },\n        addToken: function(ca) {\n            if (this.hasMaxTokens()) {\n                return;\n            }\n        ;\n        ;\n            var da = this._tokenKey(ca.getInfo());\n            if (((da in this.unique))) {\n                return;\n            }\n        ;\n        ;\n            this.unique[da] = ca;\n            this.tokens.push(ca);\n            this.insertToken(ca);\n            this.updateTokenarea();\n            this.inform(\"addToken\", ca);\n            g.inform(\"Form/change\", {\n                node: this.element\n            });\n        },\n        insertToken: function(ca) {\n            j.appendContent(this.tokenarea, ca.getElement());\n        },\n        removeToken: function(ca) {\n            if (!ca) {\n                return;\n            }\n        ;\n        ;\n            var da = this.tokens.indexOf(ca);\n            if (((da < 0))) {\n                return;\n            }\n        ;\n        ;\n            this.tokens.splice(this.tokens.indexOf(ca), 1);\n            delete this.unique[this._tokenKey(ca.getInfo())];\n            j.remove(ca.getElement());\n            this.updateTokenarea();\n            this.inform(\"removeToken\", ca);\n            g.inform(\"Form/change\", {\n                node: this.element\n            });\n        },\n        removeAllTokens: function() {\n            this.reset();\n            this.inform(\"removeAllTokens\");\n        },\n        updateTokenarea: function() {\n            var ca = this.typeahead.getCore(), da = this.getTokenValues();\n            if (this.excludeDuplicates) {\n                ((this._exclusions || (this._exclusions = ca.getExclusions())));\n                ca.setExclusions(da.concat(this._exclusions));\n            }\n        ;\n        ;\n            ca.setEnabled(!this.hasMaxTokens());\n            this.updateTokenareaVisibility();\n            this.updatePlaceholder();\n            this.inform(\"resize\");\n        },\n        updateTokenareaVisibility: function() {\n            i.conditionShow(this.tokenarea, ((this.tokens.length !== 0)));\n        },\n        _tokenKey: function(ca) {\n            return ((ca.uid + ((ca.freeform ? \":\" : \"\"))));\n        },\n        _widthOffset: null,\n        _getWidthOffset: function() {\n            if (((this._widthOffset === null))) {\n                var ca = this.input.clientWidth, da = s.getFloat(this.input, \"width\");\n                if (((ca == da))) {\n                    this._widthOffset = ((s.getFloat(this.input, \"paddingLeft\") + s.getFloat(this.input, \"paddingRight\")));\n                }\n                 else this._widthOffset = 0;\n            ;\n            ;\n            }\n        ;\n        ;\n            return this._widthOffset;\n        },\n        _metrics: null,\n        _getMetrics: function() {\n            if (!this._metrics) {\n                this._metrics = new t(this.input, this.inline);\n            }\n        ;\n        ;\n            return this._metrics;\n        },\n        _getIsInDOM: function() {\n            return ((this._isInDOM || (this._isInDOM = k.contains(JSBNG__document.body, this.input))));\n        }\n    });\n    ba.init = function(ca, da) {\n        ca.init(da.tokenarea, da.param_name, da.initial_info, da.options);\n    };\n    e.exports = ba;\n});\n__d(\"MercuryTypeahead\", [\"JSBNG__Event\",\"ArbiterMixin\",\"DOM\",\"DOMDimensions\",\"Input\",\"Keys\",\"MercuryTypeaheadTemplates\",\"Tokenizer\",\"Typeahead\",\"TypeaheadCore\",\"copyProperties\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"ArbiterMixin\"), i = b(\"DOM\"), j = b(\"DOMDimensions\"), k = b(\"Input\"), l = b(\"Keys\"), m = b(\"MercuryTypeaheadTemplates\"), n = b(\"Tokenizer\"), o = b(\"Typeahead\"), p = b(\"TypeaheadCore\"), q = b(\"copyProperties\"), r = b(\"cx\"), s = function(t, u) {\n        this._domElement = null;\n        this._typeahead = null;\n        this._tokenizer = null;\n        this._placeholder = \"\";\n        this._exclusions = [];\n        this._viewNodeOrID = null;\n        this._viewOptions = {\n            renderer: \"compact\",\n            autoSelect: true\n        };\n        this._tokenizerBehaviors = [];\n        this._heightPrev = null;\n        this._dataSource = t;\n        this._view = u;\n    };\n    q(s.prototype, h);\n    q(s.prototype, {\n        setPlaceholder: function(t) {\n            this._placeholder = t;\n            return this;\n        },\n        setExcludedParticipants: function(t) {\n            this._exclusions = [];\n            t.forEach(function(u) {\n                var v = u.indexOf(\":\");\n                if (((u.substr(0, v) == \"fbid\"))) {\n                    this._exclusions.push(u.substr(((v + 1))));\n                }\n            ;\n            ;\n            }.bind(this));\n            return this;\n        },\n        setViewNodeID: function(t) {\n            this._viewNodeOrID = t;\n        },\n        setViewNode: function(t) {\n            this._viewNodeOrID = t;\n        },\n        setFullWidthView: function(t) {\n            var u = i.create(\"div\", {\n                className: \"_4ck uiTypeaheadView\"\n            });\n            i.setContent(t, u);\n            this.setViewNode(u);\n        },\n        setViewOption: function(t, u) {\n            this._viewOptions[t] = u;\n        },\n        addTokenizerBehavior: function(t) {\n            this._tokenizerBehaviors.push(t);\n        },\n        build: function(t) {\n            if (this._domElement) {\n                return;\n            }\n        ;\n        ;\n            var u = m[\":fb:mercury:tokenizer\"].build(), v = m[\":fb:mercury:typeahead\"].build();\n            this._domElement = u.getRoot();\n            i.appendContent(this._domElement, v.getRoot());\n            var w = v.getNode(\"textfield\");\n            k.setPlaceholder(w, this._placeholder);\n            w.setAttribute(\"data-placeholder\", this._placeholder);\n            this._input = w;\n            var x = {\n                node_id: this._viewNodeOrID,\n                ctor: this._view,\n                options: this._viewOptions\n            }, y = {\n                ctor: p,\n                options: {\n                    setValueOnSelect: true\n                }\n            };\n            this._typeahead = new o(this._dataSource, x, y, v.getRoot());\n            this._typeahead.init();\n            var z = {\n                inline: true,\n                behaviors: this._tokenizerBehaviors\n            };\n            this._tokenizer = new n(this._domElement, this._typeahead);\n            this._tokenizer.init(u.getNode(\"tokenarea\"), \"participants\", [], z);\n            this._tokenizer.subscribe([\"addToken\",\"removeToken\",\"removeAllTokens\",], this._tokensChanged.bind(this));\n            this._tokenizer.subscribe(\"resize\", function() {\n                this.inform(\"resize\");\n            }.bind(this));\n            g.listen(w, \"JSBNG__focus\", function() {\n                this._resetDataSource();\n                this._typeahead.init();\n            }.bind(this));\n            g.listen(this._domElement, \"click\", this.JSBNG__focus.bind(this));\n            g.listen(w, \"keydown\", this.keydown.bind(this));\n            this._heightPrev = j.getElementDimensions(this._domElement).height;\n        },\n        getElement: function() {\n            return this._domElement;\n        },\n        getSelectedParticipantIDs: function() {\n            var t = [];\n            if (this._tokenizer) {\n                ((this._tokenizer.getTokenValues() || [])).forEach(function(u) {\n                    t.push(((\"fbid:\" + u)));\n                });\n            }\n        ;\n        ;\n            return t;\n        },\n        getTokens: function() {\n            var t = [];\n            if (this._tokenizer) {\n                t = this._tokenizer.getTokens();\n            }\n        ;\n        ;\n            return t;\n        },\n        getTokenizer: function() {\n            return this._tokenizer;\n        },\n        keydown: function(JSBNG__event) {\n            if (((this._tokenizer.inline && ((JSBNG__event.keyCode == l.ESC))))) {\n                if (k.isEmpty(this._input)) {\n                    var t = this._tokenizer.getLastToken();\n                    if (((t && t.isRemovable()))) {\n                        this._tokenizer.removeToken(t);\n                    }\n                ;\n                ;\n                }\n                 else this._typeahead.getCore().reset();\n            ;\n            ;\n                return false;\n            }\n        ;\n        ;\n        },\n        reset: function() {\n            ((this._tokenizer && this._tokenizer.removeAllTokens()));\n            ((this._typeahead && this._typeahead.getCore().reset()));\n        },\n        JSBNG__focus: function() {\n            ((this._tokenizer && this._tokenizer.focusInput()));\n        },\n        getTypeahead: function() {\n            return this._typeahead;\n        },\n        _resetDataSource: function() {\n            this._dataSource.setExclusions(this._exclusions);\n        },\n        _tokensChanged: function() {\n            this.inform(\"tokens-changed\");\n        }\n    });\n    e.exports = s;\n});\n__d(\"PhotosUploadWaterfall\", [\"AsyncSignal\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncSignal\"), h = {\n        APP_FLASH: \"flash_pro\",\n        APP_SIMPLE: \"simple\",\n        APP_ARCHIVE: \"archive\",\n        APP_COMPOSER: \"composer\",\n        APP_MESSENGER: \"messenger\",\n        APP_HTML5: \"html5\",\n        APP_CHAT: \"chat\",\n        INSTALL_CANCEL: 1,\n        INSTALL_INSTALL: 2,\n        INSTALL_UPDATE: 3,\n        INSTALL_REINSTALL: 4,\n        INSTALL_PERMA_CANCEL: 5,\n        INSTALL_SILENT_SKIP: 6,\n        INSTALL_DOWNLOAD: 7,\n        CERROR_RESIZING_FAILED: 6,\n        CERROR_MARKER_EXTRACTION_FAILED: 9,\n        BEGIN: 1,\n        UPLOAD_START: 4,\n        ALL_UPLOADS_DONE: 6,\n        CLIENT_ERROR: 7,\n        RECOVERABLE_CLIENT_ERROR: 12,\n        IMAGES_SELECTED: 9,\n        UPGRADE_REQUIRED: 11,\n        VERSION: 15,\n        SELECT_START: 18,\n        SELECT_CANCELED: 19,\n        CANCEL: 22,\n        CANCEL_DURING_UPLOAD: 83,\n        ONE_RESIZING_START: 2,\n        ONE_UPLOAD_DONE: 29,\n        ONE_RESIZING_DONE: 34,\n        PROGRESS_BAR_STOPPED: 44,\n        MISSED_BEAT: 45,\n        HEART_ATTACK: 46,\n        PUBLISH_START: 100,\n        PUBLISH_SUCCESS: 101,\n        PUBLISH_FAILURE: 102,\n        SESSION_POSTED: 72,\n        POST_PUBLISHED: 80,\n        ONE_UPLOAD_CANCELED: 81,\n        ONE_UPLOAD_CANCELED_DURING_UPLOAD: 82,\n        RESIZER_AVAILABLE: 20,\n        OVERLAY_FIRST: 61,\n        ASYNC_AVAILABLE: 63,\n        FALLBACK_TO_FLASH: 13,\n        RETRY_UPLOAD: 17,\n        TAGGED_ALL_FACES: 14,\n        VAULT_IMAGES_SELECTED: 62,\n        VAULT_CREATE_POST_CANCEL: 65,\n        VAULT_SEND_IN_MESSAGE_CLICKED: 66,\n        VAULT_DELETE_CANCEL: 68,\n        VAULT_ADD_TO_ALBUM_CANCEL: 74,\n        VAULT_SHARE_IN_AN_ALBUM_CLICKED: 76,\n        VAULT_SHARE_OWN_TIMELINE_CLICKED: 77,\n        VAULT_SHARE_FRIENDS_TIMELINE_CLICKED: 78,\n        VAULT_SHARE_IN_A_GROUP_CLICKED: 79,\n        METHOD_DRAGDROP: \"dragdrop\",\n        METHOD_FILE_SELECTOR: \"file_selector\",\n        METHOD_VAULT: \"vault\",\n        METHOD_PHOTOS_OF_YOU: \"photos_of_you\",\n        METHOD_RECENT_PHOTOS: \"recent_photos\",\n        VAULTBOX: \"vaultbox\",\n        GRID: \"grid\",\n        SPOTLIGHT_VAULT_VIEWER: \"spotlight_vault_viewer\",\n        sendSignal: function(i, j) {\n            new g(\"/ajax/photos/waterfall.php\", {\n                data: JSON.stringify(i)\n            }).setHandler(j).send();\n        }\n    };\n    e.exports = h;\n});\n__d(\"FreeformTokenizerBehavior\", [\"Input\",\"Keys\",\"JSBNG__Event\",\"function-extensions\",], function(a, b, c, d, e, f) {\n    var g = b(\"Input\"), h = b(\"Keys\"), i = b(\"JSBNG__Event\");\n    b(\"function-extensions\");\n    function j(k, l) {\n        var m = ((l.tokenize_on_blur !== false)), n = ((l.tokenize_on_paste !== false)), o = ((l.matcher && new RegExp(l.matcher, \"i\"))), p = ((l.paste_split && new RegExp(l.paste_split))), q = ((l.select_on_comma !== false)), r = ((l.never_submit === true));\n        function s(JSBNG__event) {\n            var t = g.getValue(k.getInput()).trim();\n            if (((((p && JSBNG__event)) && ((JSBNG__event.type == \"paste\"))))) {\n                t = t.split(p);\n            }\n             else t = [t,];\n        ;\n        ;\n            var u = false;\n            for (var v = 0; ((v < t.length)); v++) {\n                var w = t[v].trim();\n                if (((w && ((!o || o.test(w)))))) {\n                    var x = {\n                        uid: w,\n                        text: w,\n                        freeform: true\n                    };\n                    k.addToken(k.createToken(x));\n                    u = true;\n                }\n            ;\n            ;\n            };\n        ;\n            if (((JSBNG__event && u))) {\n                k.getTypeahead().getCore().afterSelect();\n                JSBNG__event.kill();\n            }\n        ;\n        ;\n        };\n    ;\n        k.subscribe(\"keydown\", function(t, u) {\n            var JSBNG__event = u.JSBNG__event, v = i.getKeyCode(JSBNG__event);\n            if (((((q && ((v == h.COMMA)))) || ((v == h.RETURN))))) {\n                var w = k.getTypeahead().getView();\n                if (w.JSBNG__getSelection()) {\n                    w.select();\n                    JSBNG__event.kill();\n                }\n                 else s(JSBNG__event);\n            ;\n            ;\n            }\n        ;\n        ;\n            if (((((v == h.RETURN)) && r))) {\n                JSBNG__event.kill();\n            }\n        ;\n        ;\n        });\n        k.subscribe(\"paste\", function(t, u) {\n            if (n) {\n                s.bind(null, u.JSBNG__event).defer(20);\n            }\n        ;\n        ;\n        });\n        k.subscribe(\"JSBNG__blur\", function(t, u) {\n            if (m) {\n                s();\n            }\n        ;\n        ;\n            k.getTypeahead().getCore().reset();\n        });\n    };\n;\n    e.exports = j;\n});");
// 14479
JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_190[0](o94,false,"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yC/r/3O1MmhNwV3-.js",o95);
// undefined
o94 = null;
// undefined
o95 = null;
// 14491
JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_96[0](21005.401999980677);
// 14663
fpc.call(JSBNG_Replay.sa0cdb1bc3c127a88a086a13f4a6ca1502f98adf1_257[0], o6,undefined);
// undefined
o6 = null;
// 14710
fpc.call(JSBNG_Replay.sf8457e5183159cd46485198114fb31bc4f940d4d_523[0], o99,undefined);
// undefined
o99 = null;
// 14711
JSBNG_Replay.s8ead2a036e92884168d3fc8f84e49d83e5bb9b50_757[0](false);
// 14721
fpc.call(JSBNG_Replay.s8ead2a036e92884168d3fc8f84e49d83e5bb9b50_739[0], o106,undefined);
// undefined
o106 = null;
// 14744
fpc.call(JSBNG_Replay.sf8457e5183159cd46485198114fb31bc4f940d4d_523[0], o196,undefined);
// undefined
o196 = null;
// 14768
o167.readyState = 2;
// 14766
fpc.call(JSBNG_Replay.s5e7dba3ea700a5261ca8857ec975a807389e8969_270[0], o200,o207);
// undefined
o207 = null;
// 14772
o167.readyState = 3;
// 14770
fpc.call(JSBNG_Replay.s5e7dba3ea700a5261ca8857ec975a807389e8969_270[0], o200,o210);
// undefined
o210 = null;
// 14776
o167.readyState = 4;
// undefined
o167 = null;
// 14831
o213.toString = f974244559_2135;
// undefined
o213 = null;
// 14774
fpc.call(JSBNG_Replay.s5e7dba3ea700a5261ca8857ec975a807389e8969_270[0], o200,o211);
// undefined
o200 = null;
// undefined
o211 = null;
// 14863
o2.readyState = 2;
// 14861
fpc.call(JSBNG_Replay.s5e7dba3ea700a5261ca8857ec975a807389e8969_270[0], o96,o212);
// undefined
o212 = null;
// 14867
o2.readyState = 3;
// 14865
fpc.call(JSBNG_Replay.s5e7dba3ea700a5261ca8857ec975a807389e8969_270[0], o96,o214);
// undefined
o214 = null;
// 14871
o2.readyState = 4;
// undefined
o2 = null;
// 14915
o217.toString = f974244559_2135;
// undefined
o217 = null;
// 14960
o216.JSBNG__status = null;
// undefined
o216 = null;
// 14869
fpc.call(JSBNG_Replay.s5e7dba3ea700a5261ca8857ec975a807389e8969_270[0], o96,o215);
// undefined
o96 = null;
// undefined
o215 = null;
// 15017
o1.readyState = 2;
// 15015
fpc.call(JSBNG_Replay.s5e7dba3ea700a5261ca8857ec975a807389e8969_270[0], o122,o205);
// undefined
o205 = null;
// 15021
o1.readyState = 3;
// 15019
fpc.call(JSBNG_Replay.s5e7dba3ea700a5261ca8857ec975a807389e8969_270[0], o122,o218);
// undefined
o218 = null;
// 15025
o1.readyState = 4;
// undefined
o1 = null;
// 15069
o221.toString = f974244559_2135;
// undefined
o221 = null;
// 15023
fpc.call(JSBNG_Replay.s5e7dba3ea700a5261ca8857ec975a807389e8969_270[0], o122,o219);
// undefined
o122 = null;
// undefined
o219 = null;
// 17832
JSBNG_Replay.s5e7dba3ea700a5261ca8857ec975a807389e8969_457[0](21492.93199996464);
// 17838
JSBNG_Replay.s5e7dba3ea700a5261ca8857ec975a807389e8969_457[0](21492.93199996464);
// 17919
fpc.call(JSBNG_Replay.sf8457e5183159cd46485198114fb31bc4f940d4d_523[0], o12,undefined);
// undefined
o12 = null;
// 17922
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o7,"if (self.CavalryLogger) {\n    CavalryLogger.start_js([\"3SGVa\",]);\n}\n;\n__d(\"SubscriptionLevels\", [], function(a, b, c, d, e, f) {\n    var g = {\n        ALL: \"162318810514679\",\n        DEFAULT: \"271670892858696\",\n        TOP: \"266156873403755\"\n    };\n    e.exports = g;\n});\n__d(\"EditSubscriptions\", [\"Event\",\"function-extensions\",\"Arbiter\",\"AsyncRequest\",\"CSS\",\"DOM\",\"MenuDeprecated\",\"Parent\",\"SubscriptionLevels\",\"arrayContains\",\"cx\",\"ge\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\");\n    b(\"function-extensions\");\n    var h = b(\"Arbiter\"), i = b(\"AsyncRequest\"), j = b(\"CSS\"), k = b(\"DOM\"), l = b(\"MenuDeprecated\"), m = b(\"Parent\"), n = b(\"SubscriptionLevels\"), o = b(\"arrayContains\"), p = b(\"cx\"), q = b(\"ge\"), r = 13, s = 45, t = [n.ALL,n.DEFAULT,n.TOP,], u = {\n    }, v = {\n    }, w = {\n    }, x = {\n    }, y = {\n    }, z = {\n    }, aa = {\n    }, ba = {\n    }, ca = {\n    }, da = {\n    }, ea = {\n    }, fa = \"/ajax/follow/follow_profile.php\", ga = \"/ajax/follow/unfollow_profile.php\", ha = \"/ajax/settings/notifications/notify_me.php\", ia = {\n    }, ja = {\n    }, ka = null, la = false;\n    function ma(jb) {\n        return o(t, jb);\n    };\n    function na(jb, kb, lb, mb) {\n        var nb = (m.byClass(mb, \"uiMenuItem\") || m.byClass(mb, \"_54ni\"));\n        if ((!nb || !k.contains(jb, nb))) {\n            return;\n        }\n         else if (j.hasClass(nb, \"SubscribeMenuSubscribeCheckbox\")) {\n            if (w[kb]) {\n                qa(jb, kb);\n            }\n             else pa(jb, kb);\n        ;\n            return false;\n        }\n         else if (j.hasClass(nb, \"SubscribeMenuUnsubscribe\")) {\n            qa(jb, kb);\n            return false;\n        }\n         else if (j.hasClass(nb, \"SubscribeMenuSettingsItem\")) {\n            db(jb, true);\n            return false;\n        }\n         else if (j.hasClass(nb, \"SubscriptionMenuGoBack\")) {\n            db(jb, false);\n            return false;\n        }\n         else if (j.hasClass(nb, \"SubscriptionMenuItem\")) {\n            oa(jb, kb, lb, nb);\n            return false;\n        }\n         else if (j.hasClass(nb, \"SubscribeMenuNotifyMeCheckbox\")) {\n            if (x[kb]) {\n                hb(jb, kb);\n            }\n             else gb(jb, kb);\n        ;\n            return false;\n        }\n        \n        \n        \n        \n        \n        \n    ;\n    };\n    function oa(jb, kb, lb, mb) {\n        if (j.hasClass(mb, \"SubscriptionMenuLevel\")) {\n            if (l.isItemChecked(mb)) {\n                return\n            };\n            bb(jb, kb, ua(mb), true, lb);\n        }\n         else if (j.hasClass(mb, \"SubscriptionMenuCategory\")) {\n            ya(kb, mb, !l.isItemChecked(mb), true, lb);\n        }\n         else if (j.hasClass(mb, \"SubscriptionAppStory\")) {\n            ab(kb, mb, !l.isItemChecked(mb), lb);\n        }\n        \n    ;\n    };\n    function pa(jb, kb) {\n        var lb = {\n            profile_id: kb\n        };\n        h.inform(\"FollowingUser\", lb);\n        new i().setURI(fa).setMethod(\"POST\").setData({\n            profile_id: kb,\n            location: ra(jb)\n        }).setErrorHandler(h.inform.curry(\"FollowUserFail\", lb)).send();\n    };\n    function qa(jb, kb) {\n        var lb = {\n            profile_id: kb\n        };\n        h.inform(\"UnfollowingUser\", lb);\n        new i().setURI(ga).setMethod(\"POST\").setData({\n            profile_id: kb,\n            location: ra(jb)\n        }).setErrorHandler(h.inform.curry(\"UnfollowUserFail\", lb)).send();\n    };\n    function ra(jb) {\n        if (j.hasClass(jb, \"followButtonFlyout\")) {\n            return r;\n        }\n         else return s\n    ;\n    };\n    function sa(jb, kb, lb) {\n        var mb = {\n            profile_id: jb,\n            level: ba[jb],\n            custom_categories: ca[jb],\n            location: lb\n        };\n        new i().setURI(\"/ajax/follow/manage_subscriptions.php\").setData(mb).send();\n    };\n    function ta(jb, kb) {\n        var lb = (ca[kb] || []), mb = l.getItems(jb);\n        mb.forEach(function(nb) {\n            if (j.hasClass(nb, \"SubscriptionMenuCategory\")) {\n                var ob = ua(nb);\n                if (o(lb, ob)) {\n                    wa(nb);\n                }\n                 else xa(nb);\n            ;\n            }\n             else if (j.hasClass(nb, \"SubscriptionAppStory\")) {\n                var pb = ua(nb);\n                if ((ja[kb] && ja[kb][pb])) {\n                    wa(nb);\n                }\n                 else xa(nb);\n            ;\n            }\n            \n        ;\n        });\n        bb(jb, kb, ba[kb], false);\n    };\n    function ua(jb) {\n        var kb = k.scry(jb, \"input\")[0];\n        return (kb && kb.value);\n    };\n    function va(jb) {\n        return k.find(jb, \"a.itemAnchor\");\n    };\n    function wa(jb) {\n        j.addClass(jb, \"checked\");\n        va(jb).setAttribute(\"aria-checked\", true);\n    };\n    function xa(jb) {\n        j.removeClass(jb, \"checked\");\n        va(jb).setAttribute(\"aria-checked\", false);\n    };\n    function ya(jb, kb, lb, mb, nb) {\n        if (lb) {\n            wa(kb);\n        }\n         else xa(kb);\n    ;\n        var ob = ua(kb);\n        if (ma(ob)) {\n            (lb && za(jb, ob));\n        }\n         else if (lb) {\n            if (!o(ca[jb], ob)) {\n                ca[jb].push(ob);\n            };\n        }\n         else {\n            var pb = ca[jb].indexOf(ob);\n            if ((pb !== -1)) {\n                ca[jb].splice(pb, 1);\n            };\n        }\n        \n    ;\n        if (mb) {\n            sa(jb, ob, nb);\n        };\n    };\n    function za(jb, kb) {\n        ba[jb] = kb;\n        h.inform(\"SubscriptionLevelUpdated\", {\n            profile_id: jb,\n            level: kb\n        });\n    };\n    function ab(jb, kb, lb, mb) {\n        var nb = \"/ajax/feed/filter_action/\", ob = ua(kb), pb = {\n            actor_id: jb,\n            app_id: ob\n        };\n        if (lb) {\n            wa(kb);\n            nb += \"resubscribe_user_app/\";\n            pb.action = \"resubscribe_user_app\";\n            if (!ja[jb]) {\n                ja[jb] = {\n                };\n            };\n            ja[jb][ob] = true;\n        }\n         else {\n            xa(kb);\n            nb += \"unsubscribe_user_app_checkbox/\";\n            pb.action = \"unsubscribe_user_app_checkbox\";\n            if (ja[jb]) {\n                ja[jb][ob] = false;\n            };\n        }\n    ;\n        new i().setURI(nb).setData(pb).send();\n    };\n    function bb(jb, kb, lb, mb, nb) {\n        var ob = k.scry(jb, \".SubscriptionMenuLevel\"), pb = null;\n        ob.forEach(function(qb) {\n            if ((ua(qb) == lb)) {\n                pb = qb;\n            }\n             else if (l.isItemChecked(qb)) {\n                ya(kb, qb, false, false);\n            }\n        ;\n        });\n        (pb && ya(kb, pb, true, mb, nb));\n    };\n    function cb(jb, kb, lb) {\n        w[kb] = lb;\n        j.conditionClass(jb, \"isUnsubscribed\", !lb);\n        var mb = k.scry(jb, \"li.SubscribeMenuSubscribeCheckbox\");\n        if ((mb.length !== 0)) {\n            var nb = mb[0];\n            if (lb) {\n                wa(nb);\n            }\n             else xa(nb);\n        ;\n        }\n    ;\n    };\n    function db(jb, kb) {\n        j.conditionClass(jb, \"subscriptionMenuOpen\", kb);\n    };\n    function eb(jb, kb, lb) {\n        var mb = k.find(jb, \".FriendListSubscriptionsMenu\"), nb = k.find(mb, \".uiMenuInner\");\n        if ((ka != null)) {\n            ka.forEach(function(ob) {\n                nb.removeChild(ob);\n            });\n        };\n        lb.forEach(function(ob) {\n            nb.appendChild(ob);\n        });\n        ka = lb;\n    };\n    h.subscribe(\"UnfollowUser\", function(jb, kb) {\n        if (da[kb.profile_id]) {\n            za(kb.profile_id, da[kb.profile_id]);\n            ca[kb.profile_id] = ea[kb.profile_id].slice();\n        }\n    ;\n    });\n    h.subscribe(\"UpdateSubscriptionLevel\", function(jb, kb) {\n        var lb = (kb.profile_id + \"\"), mb = (kb.level + \"\");\n        za(lb, mb);\n        var nb;\n        for (nb in u) {\n            if ((u[nb] === lb)) {\n                var ob = q(nb);\n                (ob && bb(ob, lb, mb, false));\n            }\n        ;\n        };\n    });\n    function fb(jb, kb, lb) {\n        x[kb] = lb;\n        var mb = (z[kb] && !la), nb = k.scry(jb, \"li.SubscribeMenuNotifyMeCheckbox\");\n        if ((nb.length !== 0)) {\n            var ob = nb[0];\n            j.conditionShow(ob, !mb);\n            j.conditionShow(k.find(jb, \"li.SubscribeMenuNotifyMeCheckboxSeparator\"), !mb);\n            if (lb) {\n                wa(ob);\n            }\n             else xa(ob);\n        ;\n        }\n    ;\n    };\n    function gb(jb, kb) {\n        var lb = {\n            profile_id: kb\n        };\n        h.inform(\"EnableNotifsForUser\", lb);\n        new i().setURI(ha).setMethod(\"POST\").setData({\n            notifier_id: kb,\n            enable: true\n        }).setErrorHandler(h.inform.curry(\"EnableNotifsForUserFail\", lb)).send();\n    };\n    function hb(jb, kb) {\n        var lb = {\n            profile_id: kb\n        };\n        h.inform(\"DisableNotifsForUser\", lb);\n        new i().setURI(ha).setMethod(\"POST\").setData({\n            notifier_id: kb,\n            enable: false\n        }).setErrorHandler(h.inform.curry(\"DisableNotifsForUserFail\", lb)).send();\n    };\n    var ib = {\n        init: function(jb, kb, lb) {\n            var mb = k.getID(jb);\n            if (!u[mb]) {\n                g.listen(jb, \"click\", function(nb) {\n                    return na(jb, u[mb], lb, nb.getTarget());\n                });\n            };\n            if (((lb === s) && ia[kb].length)) {\n                eb(jb, kb, ia[kb]);\n            };\n            if (ba[kb]) {\n                ta(jb, kb);\n            };\n            u[mb] = kb;\n            j.conditionClass(jb, \"NonFriendSubscriptionMenu\", !v[kb]);\n            j.conditionClass(jb, \"cannotSubscribe\", !y[kb]);\n            j.conditionClass(jb, \"noSubscriptionLevels\", (z[kb] && !aa[kb]));\n            j.conditionClass(jb, \"noSubscribeCheckbox\", (!v[kb] && !z[kb]));\n            cb(jb, kb, w[kb]);\n            fb(jb, kb, x[kb]);\n            h.subscribe([\"FollowUser\",\"FollowingUser\",\"UnfollowUserFail\",], function(nb, ob) {\n                cb(jb, kb, true);\n            }.bind(this));\n            h.subscribe([\"UnfollowUser\",\"UnfollowingUser\",\"FollowUserFail\",], function(nb, ob) {\n                h.inform(\"SubMenu/Reset\");\n                cb(jb, kb, false);\n            }.bind(this));\n            h.subscribe([\"EnableNotifsForUser\",\"DisableNotifsForUserFail\",], function(nb, ob) {\n                fb(jb, kb, true);\n            }.bind(this));\n            h.subscribe([\"DisableNotifsForUser\",\"EnableNotifsForUserFail\",], function(nb, ob) {\n                fb(jb, kb, false);\n            }.bind(this));\n            h.subscribe(\"listeditor/friend_lists_changed\", function(nb, ob) {\n                if (ob.notify_state) {\n                    var pb = (ob.added_uid ? ob.added_uid : ob.removed_uid);\n                    fb(jb, pb, ob.notify_state.is_notified);\n                }\n            ;\n            }.bind(this));\n            db(jb, false);\n        },\n        getSubscriptions: function(jb) {\n            return {\n                level: ba[jb],\n                custom_categories: ca[jb]\n            };\n        },\n        setSubscriptions: function(jb, kb, lb, mb, nb, ob, pb, qb, rb, sb, tb, ub, vb) {\n            za(jb, (pb + \"\"));\n            v[jb] = kb;\n            w[jb] = lb;\n            y[jb] = mb;\n            z[jb] = nb;\n            aa[jb] = ob;\n            da[jb] = (rb + \"\");\n            ca[jb] = qb.map(String);\n            ea[jb] = sb.map(String);\n            ia[jb] = vb;\n            x[jb] = tb;\n            la = ub;\n        }\n    };\n    e.exports = (a.EditSubscriptions || ib);\n});\n__d(\"DynamicFriendListEducation\", [\"Event\",\"Arbiter\",\"AsyncRequest\",\"Dialog\",\"PageTransitions\",\"arrayContains\",\"createArrayFrom\",\"removeFromArray\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"Arbiter\"), i = b(\"AsyncRequest\"), j = b(\"Dialog\"), k = b(\"PageTransitions\"), l = b(\"arrayContains\"), m = b(\"createArrayFrom\"), n = b(\"removeFromArray\"), o, p, q, r, s, t;\n    function u() {\n        (q && q.hide());\n        (r && r.hide());\n    };\n    function v(y) {\n        n(p, y);\n        u();\n        s({\n            accept_tag_education: true\n        });\n    };\n    function w() {\n        u();\n        s({\n            nux_cancel: true\n        });\n    };\n    var x = {\n        init: function(y, z) {\n            o = y;\n            p = m(z).map(String);\n            k.registerHandler(function() {\n                u();\n                o = false;\n                s = undefined;\n                p = [];\n            });\n        },\n        showDialog: function(y, z, aa) {\n            if ((o && l(p, y))) {\n                u();\n                h.inform(\"DynamicFriendListEducation/dialogOpen\", {\n                    uid: z,\n                    flid: y\n                });\n                s = aa;\n                q = new j().setAsync(new i(\"/ajax/friends/lists/smart_list_education.php\").setMethod(\"GET\").setData({\n                    flid: y,\n                    uid: z\n                }).setReadOnly(true)).setHandler(v.bind(this, y)).setCloseHandler(function() {\n                    h.inform(\"DynamicFriendListEducation/dialogClosed\", {\n                        uid: z,\n                        flid: y\n                    });\n                }).setCancelHandler(function() {\n                    h.inform(\"DynamicFriendListEducation/dialogCancel\", {\n                        uid: z,\n                        flid: y\n                    });\n                }).show();\n            }\n             else aa();\n        ;\n        },\n        showContextualDialog: function(y, z, aa, ba) {\n            if ((o && l(p, y))) {\n                u();\n                t = aa;\n                s = ba;\n                new i(\"/ajax/friends/lists/smart_list_contextual_education.php\").setMethod(\"GET\").setData({\n                    flid: y,\n                    uid: z\n                }).setReadOnly(true).send();\n            }\n             else ba();\n        ;\n        },\n        setContextualDialog: function(y, z, aa, ba) {\n            r = y;\n            r.setContext(t);\n            r.show();\n            g.listen(z, \"click\", v.bind(this, ba));\n            g.listen(aa, \"click\", w);\n        }\n    };\n    e.exports = x;\n});\n__d(\"FriendStatus\", [\"function-extensions\",\"Arbiter\",\"AsyncRequest\",\"arrayContains\",\"copyProperties\",\"createArrayFrom\",\"eachKeyVal\",], function(a, b, c, d, e, f) {\n    b(\"function-extensions\");\n    var g = b(\"Arbiter\"), h = b(\"AsyncRequest\"), i = b(\"arrayContains\"), j = b(\"copyProperties\"), k = b(\"createArrayFrom\"), l = b(\"eachKeyVal\");\n    function m(q, r, s) {\n        this.id = q;\n        this.update(r, s);\n    };\n    j(m.prototype, {\n        update: function(q, r) {\n            (q && (this.status = q));\n            if (r) {\n                this.lists = k(r).map(String);\n                this._informListChange();\n            }\n        ;\n        },\n        isComplete: function() {\n            return !!this.lists;\n        },\n        addToList: function(q) {\n            if ((this.lists && !i(this.lists, q))) {\n                this.lists.push(q);\n            };\n            this._informListChange();\n        },\n        removeFromList: function(q) {\n            if (this.lists) {\n                var r = this.lists.indexOf(q);\n                ((r !== -1) && this.lists.splice(r, 1));\n            }\n        ;\n            this._informListChange();\n        },\n        updateList: function(q, r) {\n            (r ? this.addToList(q) : this.removeFromList(q));\n        },\n        _informListChange: function() {\n            g.inform(\"FriendListMembershipChange\", {\n                uid: this.id,\n                lists: this.lists\n            });\n        }\n    });\n    j(m, {\n        ARE_FRIENDS: 1,\n        INCOMING_REQUEST: 2,\n        OUTGOING_REQUEST: 3,\n        CAN_REQUEST: 4\n    });\n    var n = {\n    }, o = {\n    };\n    function p(q, r, s) {\n        if (!n[s.uid]) {\n            n[s.uid] = new m(s.uid, q);\n        }\n         else n[s.uid].update(q);\n    ;\n        g.inform(\"FriendRequest/change\", {\n            uid: s.uid,\n            status: q\n        });\n    };\n    g.subscribe([\"FriendRequest/cancel\",\"FriendRequest/unfriend\",\"FriendRequest/sendFail\",], p.curry(m.CAN_REQUEST));\n    g.subscribe([\"FriendRequest/confirmFail\",], p.curry(m.INCOMING_REQUEST));\n    g.subscribe([\"FriendRequest/cancelFail\",\"FriendRequest/sent\",\"FriendRequest/sending\",], p.curry(m.OUTGOING_REQUEST));\n    g.subscribe([\"FriendRequest/confirm\",\"FriendRequest/confirming\",], p.curry(m.ARE_FRIENDS));\n    j(m, {\n        CLOSE_FRIENDS: null,\n        ACQUAINTANCES: null,\n        getFriend: function(q, r) {\n            if ((n[q] && n[q].isComplete())) {\n                r(n[q]);\n            }\n             else if (o[q]) {\n                o[q].push(r);\n            }\n             else {\n                o[q] = [r,];\n                new h().setURI(\"/ajax/friends/status.php\").setData({\n                    friend: q\n                }).setHandler(function(s) {\n                    var t = s.getPayload();\n                    m.initFriend.bind(m, q, t.status, t.lists).defer();\n                }).send();\n            }\n            \n        ;\n        },\n        initFriend: function(q, r, s) {\n            var t = (n[q] || new m(q));\n            t.update((t.status || r), (t.lists || s));\n            n[q] = t;\n            (o[q] && o[q].forEach(function(u) {\n                u(t);\n            }));\n            o[q] = null;\n        },\n        setSpecialLists: function(q) {\n            var r = (m.CLOSE_FRIENDS === null);\n            m.CLOSE_FRIENDS = (q.close + \"\");\n            m.ACQUAINTANCES = (q.acq + \"\");\n            if (r) {\n                l(n, function(s, t) {\n                    t._informListChange();\n                });\n            };\n        }\n    });\n    e.exports = m;\n});\n__d(\"FriendEditLists\", [\"Arbiter\",\"AsyncRequest\",\"CSS\",\"DOMQuery\",\"DynamicFriendListEducation\",\"EditSubscriptions\",\"FriendStatus\",\"MenuDeprecated\",\"Parent\",\"ScrollableArea\",\"URI\",\"$\",\"arrayContains\",\"copyProperties\",\"ge\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"AsyncRequest\"), i = b(\"CSS\"), j = b(\"DOMQuery\"), k = b(\"DynamicFriendListEducation\"), l = b(\"EditSubscriptions\"), m = b(\"FriendStatus\"), n = b(\"MenuDeprecated\"), o = b(\"Parent\"), p = b(\"ScrollableArea\"), q = b(\"URI\"), r = b(\"$\"), s = b(\"arrayContains\"), t = b(\"copyProperties\"), u = b(\"ge\"), v = 5, w = {\n    }, x = \"/ajax/profile/removefriendconfirm.php\", y = \"/ajax/friends/requests/cancel.php\", z = \"/ajax/choose/\", aa = \"/profile.php\", ba = \"/ajax/report/social.php\", ca, da;\n    function ea(pa, qa, ra) {\n        var sa = w[pa.id], ta = function(ua) {\n            var va = {\n                action: (ra ? \"add_list\" : \"del_list\"),\n                to_friend: sa.id,\n                friendlists: [qa,],\n                source: ca\n            };\n            if (ua) {\n                t(va, ua);\n            };\n            sa.updateList(qa, ra);\n            var wa;\n            if ((ra && (qa == m.CLOSE_FRIENDS))) {\n                wa = ha(pa, m.ACQUAINTANCES);\n                if (n.isItemChecked(wa)) {\n                    n.toggleItem(wa);\n                    ea(pa, m.ACQUAINTANCES, false);\n                }\n            ;\n            }\n             else if ((ra && (qa == m.ACQUAINTANCES))) {\n                wa = ha(pa, m.CLOSE_FRIENDS);\n                if (n.isItemChecked(wa)) {\n                    n.toggleItem(wa);\n                    ea(pa, m.CLOSE_FRIENDS, false);\n                }\n            ;\n            }\n            \n        ;\n            var xa = {\n                flid: qa,\n                uid: sa.id\n            }, ya = (ra ? \"FriendListHovercard/add\" : \"FriendListHovercard/remove\");\n            g.inform(ya, xa);\n            new h().setURI(\"/ajax/add_friend/action.php\").setData(va).send();\n        };\n        if (ra) {\n            k.showDialog(qa, sa.id, ta);\n        }\n         else ta();\n    ;\n    };\n    function fa(pa) {\n        var qa = j.scry(pa, \"input\")[0];\n        return (qa && qa.value);\n    };\n    function ga(pa, qa, ra) {\n        var sa = {\n            uid: qa.id\n        };\n        new h().setURI(y).setMethod(\"POST\").setData({\n            friend: qa.id\n        }).setHandler(g.inform.bind(g, \"FriendRequest/cancel\", sa)).setErrorHandler(g.inform.bind(g, \"FriendRequest/cancelFail\", sa)).setStatusElement(ra).send();\n    };\n    function ha(pa, qa) {\n        var ra = n.getItems(pa);\n        for (var sa = 0; (sa < ra.length); sa++) {\n            if ((fa(ra[sa]) == qa)) {\n                return ra[sa]\n            };\n        };\n        return null;\n    };\n    function ia(pa, qa) {\n        var ra = n.getItems(pa);\n        ra.forEach(function(sa) {\n            var ta = fa(sa), ua = s(qa.lists, ta);\n            if ((n.isItemChecked(sa) !== ua)) {\n                n.toggleItem(sa);\n            };\n        });\n    };\n    function ja(pa) {\n        var qa = n.getItems(pa), ra = (!i.hasClass(pa, \"followButtonFlyout\") && !i.hasClass(pa, \"likeButtonFlyout\")), sa = [], ta = [], ua = 0, va = 0;\n        qa.forEach(function(ab) {\n            if (i.hasClass(ab, \"neverHide\")) {\n                i.removeClass(ab, \"underShowMore\");\n                ua++;\n            }\n             else if (n.isItemChecked(ab)) {\n                sa.push(ab);\n            }\n             else if (((i.hasClass(ab, \"neverShow\") || i.hasClass(ab, \"FriendListCreateTrigger\")) || ((!ra && i.hasClass(ab, \"friendOptionsOnly\"))))) {\n                i.addClass(ab, \"underShowMore\");\n                va++;\n            }\n             else ta.push(ab);\n            \n            \n        ;\n        });\n        var wa = (v - ua), xa = sa.concat(ta), ya = va;\n        xa.forEach(function(ab) {\n            if (i.hasClass(ab, \"ShowMoreItem\")) {\n                wa--;\n                return;\n            }\n        ;\n            if (wa) {\n                i.removeClass(ab, \"underShowMore\");\n                wa--;\n            }\n             else {\n                i.addClass(ab, \"underShowMore\");\n                ya = true;\n            }\n        ;\n        });\n        i.conditionClass(pa, \"hasMoreFriendListItems\", ya);\n        var za = j.scry(pa, \".FriendListMenuShowMore\");\n        za.forEach(function(ab) {\n            i.removeClass(ab, \"FriendListMenuShowMore\");\n        });\n    };\n    function ka(pa, qa) {\n        i.conditionClass(pa, \"FriendListMemorializedUser\", qa);\n    };\n    function la(pa, qa) {\n        i.conditionClass(pa, \"FriendListCannotSuggestFriends\", !qa);\n    };\n    function ma(pa, qa) {\n        var ra = j.scry(pa, \".FriendListUnfriend\")[0], sa = j.scry(pa, \".FriendListCancel\")[0], ta = j.scry(pa, \".FriendListSuggestFriends\")[0], ua = j.scry(pa, \".FriendListFriendship\")[0], va = j.scry(pa, \".FriendListReportBlock\")[0];\n        if (sa) {\n            i.conditionShow(sa, (qa.status == m.OUTGOING_REQUEST));\n        };\n        if (ra) {\n            i.conditionShow(ra, (qa.status == m.ARE_FRIENDS));\n            var wa = j.find(ra, \"a\");\n            wa.setAttribute(\"ajaxify\", q(x).addQueryData({\n                uid: qa.id,\n                unref: da\n            }).toString());\n        }\n         else i.conditionClass(pa, \"NoFriendListActionSeparator\", (!sa || (qa.status != m.OUTGOING_REQUEST)));\n    ;\n        if (ta) {\n            j.find(ta, \"a\").setAttribute(\"href\", q(z).addQueryData({\n                type: \"suggest_friends\",\n                newcomer: qa.id,\n                ref: \"profile_others_dropdown\"\n            }).toString());\n        };\n        if (ua) {\n            i.conditionShow(ua, (qa.status == m.ARE_FRIENDS));\n            j.find(ua, \"a\").setAttribute(\"href\", q(aa).addQueryData({\n                and: qa.id\n            }).toString());\n        }\n    ;\n        if (va) {\n            j.find(va, \"a\").setAttribute(\"ajaxify\", q(ba).addQueryData({\n                content_type: 0,\n                cid: qa.id,\n                rid: qa.id\n            }).toString());\n        };\n    };\n    function na(pa, qa) {\n        var ra = j.scry(pa, \"div.FriendListSubscriptionsMenu\");\n        if ((ra.length !== 0)) {\n            l.init(pa, qa, 45);\n        };\n    };\n    g.subscribe(\"FriendRequest/change\", function(pa, qa) {\n        for (var ra in w) {\n            var sa = u(ra), ta = w[ra];\n            if (((sa && ta) && (ta.id == qa.uid))) {\n                ia(sa, ta);\n                ma(sa, ta);\n                ja(sa);\n            }\n        ;\n        };\n    });\n    n.subscribe(\"select\", function(pa, qa) {\n        if ((i.hasClass(qa.item, \"ShowMoreItem\") && i.hasClass(qa.menu, \"FriendListMenu\"))) {\n            i.addClass(qa.menu, \"FriendListMenuShowMore\");\n            p.poke(qa.item);\n        }\n    ;\n    });\n    var oa = {\n        init: function(pa, qa, ra, sa, ta, ua) {\n            pa = r(pa);\n            ca = ra;\n            da = ua;\n            if (!w[pa.id]) {\n                n.subscribe(\"select\", function(va, wa) {\n                    if (j.contains(pa, wa.item)) {\n                        if (o.byClass(wa.item, \"FriendListItem\")) {\n                            n.toggleItem(wa.item);\n                            var xa = fa(wa.item);\n                            ea(pa, xa, n.isItemChecked(wa.item));\n                        }\n                         else if (o.byClass(wa.item, \"FriendListCancel\")) {\n                            ga(pa, w[pa.id], wa.item);\n                        }\n                         else if (o.byClass(wa.item, \"FriendListUnfriend\")) {\n                            g.inform(\"FriendEditLists/unfriend\");\n                        }\n                        \n                    \n                    };\n                });\n            };\n            i.addClass(pa, \"async_saving\");\n            m.getFriend(qa, function(va) {\n                ka(pa, sa);\n                la(pa, ta);\n                ia(pa, va);\n                ma(pa, va);\n                w[pa.id] = va;\n                ja(pa);\n                na(pa, qa);\n                i.removeClass(pa, \"async_saving\");\n            }.bind(this));\n        }\n    };\n    e.exports = (a.FriendEditLists || oa);\n});\n__d(\"FriendListFlyoutController\", [\"Event\",\"Arbiter\",\"AsyncRequest\",\"Button\",\"ContextualLayer\",\"CSS\",\"DataStore\",\"Dialog\",\"DOM\",\"DOMQuery\",\"FriendEditLists\",\"FriendStatus\",\"Keys\",\"Layer\",\"LayerHideOnEscape\",\"LayerTabIsolation\",\"MenuDeprecated\",\"Parent\",\"ScrollableArea\",\"Style\",\"TabbableElements\",\"UserAgent\",\"cx\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"Arbiter\"), i = b(\"AsyncRequest\"), j = b(\"Button\"), k = b(\"ContextualLayer\"), l = b(\"CSS\"), m = b(\"DataStore\"), n = b(\"Dialog\"), o = b(\"DOM\"), p = b(\"DOMQuery\"), q = b(\"FriendEditLists\"), r = b(\"FriendStatus\"), s = b(\"Keys\"), t = b(\"Layer\"), u = b(\"LayerHideOnEscape\"), v = b(\"LayerTabIsolation\"), w = b(\"MenuDeprecated\"), x = b(\"Parent\"), y = b(\"ScrollableArea\"), z = b(\"Style\"), aa = b(\"TabbableElements\"), ba = b(\"UserAgent\"), ca = b(\"cx\"), da = b(\"emptyFunction\"), ea, fa, ga = null, ha = null, ia, ja, ka, la, ma, na, oa = 1500, pa, qa = [\"uiButtonConfirm\",\"uiButtonSpecial\",\"_42gz\",\"_42g-\",\"_4jy2\",\"_51tl\",\"_4jy1\",], ra = {\n        init: function(tb, ub) {\n            ra.init = da;\n            ea = tb;\n            ea.subscribe(\"mouseenter\", ab);\n            ea.subscribe(\"mouseleave\", ob);\n            ea.subscribe(\"hide\", cb);\n            ea.enableBehavior(v);\n            ea.enableBehavior(u);\n            pa = ub;\n            if (ga) {\n                o.setContent(ea.getContent(), [ga,ha,]);\n            };\n            var vb = function(wb) {\n                var xb = x.byClass(wb.getTarget(), \"enableFriendListFlyout\");\n                if (xb) {\n                    if ((ia === xb)) {\n                        clearTimeout(la);\n                    }\n                     else {\n                        (fa && qb());\n                        nb(xb);\n                    }\n                \n                };\n            };\n            g.listen(document.documentElement, {\n                mouseover: vb,\n                click: vb,\n                keydown: function(event) {\n                    var wb = event.getTarget();\n                    if (event.getModifiers().any) {\n                        return\n                    };\n                    if ((!fa || p.isNodeOfType(wb, [\"input\",\"textarea\",]))) {\n                        return\n                    };\n                    var xb = g.getKeyCode(event), yb;\n                    switch (xb) {\n                      case s.UP:\n                    \n                      case s.DOWN:\n                        var zb = za();\n                        yb = xa(zb);\n                        va(zb[(yb + (((xb === s.UP) ? -1 : 1)))]);\n                        return false;\n                      case s.SPACE:\n                        var ac = wa(wb);\n                        if (ac) {\n                            sa(ac);\n                            event.prevent();\n                        }\n                    ;\n                        break;\n                      default:\n                        var bc = String.fromCharCode(xb).toLowerCase(), cc = za();\n                        yb = xa(cc);\n                        var dc = yb, ec = cc.length;\n                        while ((((~yb && ((dc = (++dc % ec)) !== yb))) || ((!~yb && (++dc < ec))))) {\n                            var fc = w.getItemLabel(cc[dc]);\n                            if ((fc && (fc.charAt(0).toLowerCase() === bc))) {\n                                va(cc[dc]);\n                                return false;\n                            }\n                        ;\n                        };\n                    };\n                }\n            });\n            h.subscribe(\"FriendEditLists/unfriend\", qb);\n            h.subscribe(\"DynamicFriendListEducation/dialogOpen\", function() {\n                na = true;\n            });\n            h.subscribe(\"DynamicFriendListEducation/dialogClosed\", function() {\n                na = false;\n                ob();\n            });\n        },\n        initContent: function(tb) {\n            o.appendContent(document.body, tb);\n            db(tb);\n            (function() {\n                if (!ga) {\n                    ga = tb;\n                    (ea && o.setContent(ea.getContent(), [ga,ha,]));\n                    l.show(ga);\n                    g.listen(ga, \"click\", rb);\n                    (fa && kb(ia));\n                }\n                 else {\n                    o.remove(tb);\n                    tb = null;\n                }\n            ;\n            }).defer();\n        },\n        initNux: function(tb) {\n            if (ha) {\n                return\n            };\n            ha = tb;\n            (ea && o.setContent(ea.getContent(), [ga,ha,]));\n        },\n        show: function(tb) {\n            lb(tb);\n        },\n        hide: function(tb) {\n            ((tb === false) ? qb() : ob());\n        },\n        setActiveNode: function(tb) {\n            (fa && qb());\n            ia = tb;\n            ja = g.listen(tb, \"mouseleave\", function() {\n                ia = null;\n                (ja && ja.remove());\n            });\n        },\n        setCloseListener: function(tb, ub) {\n            m.set(tb, \"flfcloselistener\", ub);\n            if ((ia != tb)) {\n                m.set(tb, \"flfcloselistenertimeout\", sb.curry(tb).defer(oa));\n            };\n        },\n        setCloseListenerTimeout: function(tb) {\n            oa = tb;\n        }\n    };\n    function sa(tb) {\n        (ba.firefox() && ua(tb).blur());\n        w.inform(\"select\", {\n            menu: ta(tb),\n            item: tb\n        });\n    };\n    function ta(tb) {\n        if (l.hasClass(tb, \"uiMenuContainer\")) {\n            return tb\n        };\n        return x.byClass(tb, \"uiMenu\");\n    };\n    function ua(tb) {\n        return p.find(tb, \"a.itemAnchor\");\n    };\n    function va(tb) {\n        if ((tb && ya(tb))) {\n            w._removeSelected(ea.getContent());\n            l.addClass(tb, \"selected\");\n            ua(tb).focus();\n        }\n    ;\n    };\n    function wa(tb) {\n        return x.byClass(tb, \"uiMenuItem\");\n    };\n    function xa(tb) {\n        if (document.activeElement) {\n            var ub = wa(document.activeElement);\n            return tb.indexOf(ub);\n        }\n    ;\n        return -1;\n    };\n    function ya(tb) {\n        return ((!l.hasClass(tb, \"disabled\") && (z.get(tb, \"display\") !== \"none\")) && (z.get(x.byClass(tb, \"uiMenu\"), \"display\") !== \"none\"));\n    };\n    function za() {\n        return w.getItems(ea.getContent()).filter(ya);\n    };\n    function ab() {\n        clearTimeout(la);\n    };\n    function bb(tb) {\n        for (var ub = 0; (ub < qa.length); ub++) {\n            if (l.hasClass(tb, qa[ub])) {\n                return false\n            };\n        };\n        return true;\n    };\n    function cb() {\n        if (ia) {\n            if (bb(ia)) {\n                l.removeClass(ia, \"_52nd\");\n                if ((l.hasClass(ia, \"uiButton\") || l.hasClass(ia, \"_42fu\"))) {\n                    l.removeClass(ia, \"selected\");\n                };\n            }\n        ;\n            if (m.get(ia, \"flfcloselistener\")) {\n                var tb = ia;\n                m.set(ia, \"flfcloselistenertimeout\", sb.curry(tb).defer(oa));\n            }\n        ;\n        }\n    ;\n        fa = false;\n        jb();\n        ia = null;\n    };\n    function db(tb) {\n        var ub = p.scry(tb, \"[tabindex=\\\"0\\\"]\");\n        ub.forEach(function(vb) {\n            vb.tabIndex = \"-1\";\n        });\n        (ub[0] && (ub[0].tabIndex = \"0\"));\n    };\n    function eb(tb) {\n        if ((p.isNodeOfType(tb, \"label\") && l.hasClass(tb, \"uiButton\"))) {\n            tb = j.getInputElement(tb);\n        };\n        return tb;\n    };\n    function fb(tb) {\n        return m.get(eb(tb), \"profileid\");\n    };\n    function gb(tb) {\n        return (m.get(eb(tb), \"memorialized\") === \"true\");\n    };\n    function hb(tb) {\n        return (m.get(eb(tb), \"cansuggestfriends\") === \"true\");\n    };\n    function ib(tb) {\n        return m.get(eb(tb), \"unref\");\n    };\n    function jb() {\n        (ja && ja.remove());\n        ja = null;\n        (ma && t.unsubscribe(ma));\n        ma = null;\n        (la && clearTimeout(la));\n        la = null;\n    };\n    function kb(tb) {\n        var ub = fb(tb), vb = gb(tb), wb = hb(tb), xb = m.get(tb, \"flloc\"), yb = ib(tb);\n        q.init(ga, ub, xb, vb, wb, yb);\n        l.conditionClass(ga, \"followButtonFlyout\", l.hasClass(tb, \"profileFollowButton\"));\n        l.conditionClass(ga, \"friendButtonFlyout\", ((l.hasClass(tb, \"FriendRequestFriends\") || l.hasClass(tb, \"FriendRequestIncoming\")) || l.hasClass(tb, \"FriendRequestOutgoing\")));\n        l.conditionClass(ga, \"likeButtonFlyout\", l.hasClass(tb, \"profileLikeButton\"));\n        var zb = p.scry(ga, \"div.uiScrollableArea\")[0];\n        (zb && y.poke(zb));\n        var ac = aa.find(ga)[0];\n        (ac && ac.focus());\n    };\n    function lb(tb) {\n        if ((!ea || fa)) {\n            return\n        };\n        ea.setContext(tb);\n        ea.setCausalElement(tb);\n        tb.setAttribute(\"aria-expanded\", \"true\");\n        if (bb(tb)) {\n            l.addClass(tb, \"_52nd\");\n            if ((l.hasClass(tb, \"uiButton\") || l.hasClass(tb, \"_42fu\"))) {\n                l.addClass(tb, \"selected\");\n            };\n        }\n    ;\n        ea.show();\n        ia = tb;\n        fa = true;\n        var ub = null;\n        if (ga) {\n            ub = \"show\";\n            kb(tb);\n        }\n         else {\n            ub = \"init_show\";\n            new i().setURI(\"/ajax/friends/lists/flyout_content.php\").setStatusElement(ea.getContent()).send();\n        }\n    ;\n        jb();\n        ja = g.listen(tb, \"mouseleave\", ob);\n        ma = t.subscribe(\"show\", mb);\n        if (m.get(tb, \"flfcloselistener\")) {\n            clearTimeout(m.remove(tb, \"flfcloselistenertimeout\"));\n        };\n        var vb = fb(tb);\n        r.getFriend(vb, function(wb) {\n            if ((wb.status == r.ARE_FRIENDS)) {\n                new i().setURI(\"/ajax/friends/lists/flyout_log.php\").setData({\n                    target_id: fb(tb),\n                    unref: ib(tb),\n                    action: ub\n                }).send();\n            };\n            if (!ha) {\n                return\n            };\n            if ((wb.status == r.OUTGOING_REQUEST)) {\n                l.show(ha);\n                i.bootstrap(\"/ajax/friends/lists/nux_flyout.php\", null, true);\n            }\n             else l.hide(ha);\n        ;\n        });\n    };\n    function mb(tb, ub) {\n        if ((!((ub instanceof k)) || !p.contains(ia, ub.getContext()))) {\n            ob();\n        };\n    };\n    function nb(tb) {\n        ia = tb;\n        ka = lb.curry(tb).defer(pa);\n        ja = g.listen(tb, \"mouseleave\", function() {\n            clearTimeout(ka);\n            ia = null;\n            (ja && ja.remove());\n        });\n    };\n    function ob() {\n        la = qb.defer(150);\n    };\n    function pb() {\n        var tb = n.getCurrent(), ub = (tb && tb.getBody());\n        return !!((ub && p.scry(ub, \".friendListDialogTourCarousel\")[0]));\n    };\n    function qb() {\n        if ((na || pb())) {\n            return\n        };\n        ((ba.ie() < 8) && document.documentElement.focus());\n        if (ea) {\n            ea.hide();\n            var tb = ea.getCausalElement();\n            (tb && tb.setAttribute(\"aria-expanded\", \"false\"));\n        }\n    ;\n    };\n    function rb(event) {\n        var tb = x.byTag(event.getTarget(), \"a\");\n        if ((tb && l.hasClass(tb, \"FriendListActionItem\"))) {\n            ob();\n        };\n    };\n    function sb(tb) {\n        var ub = m.remove(tb, \"flfcloselistener\");\n        (ub && ub());\n    };\n    e.exports = (a.FriendListFlyoutController || ra);\n});\n__d(\"AddFriendButton\", [\"Event\",\"Animation\",\"Arbiter\",\"AsyncRequest\",\"AsyncResponse\",\"collectDataAttributes\",\"CSS\",\"DOMQuery\",\"FriendListFlyoutController\",\"FriendStatus\",\"ge\",\"goURI\",\"Style\",\"URI\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"Animation\"), i = b(\"Arbiter\"), j = b(\"AsyncRequest\"), k = b(\"AsyncResponse\"), l = b(\"collectDataAttributes\"), m = b(\"CSS\"), n = b(\"DOMQuery\"), o = b(\"FriendListFlyoutController\"), p = b(\"FriendStatus\"), q = b(\"ge\"), r = b(\"goURI\"), s = b(\"Style\"), t = b(\"URI\"), u = {\n        ERROR_ALREADY_ADDED: 1431005,\n        init: function(v, w, x, y, z, aa, ba, ca, da, ea, fa, ga) {\n            var ha = v.id, ia = null, ja = n.scry(v, \".addButton\")[0], ka = n.scry(v, \".addFriendText\")[0], la = n.scry(v, \".outgoingButton\")[0], ma = n.scry(v, \".incomingButton\")[0], na = n.scry(v, \".friendButton\")[0];\n            function oa(ua, va, wa) {\n                var xa = new t(ja.getAttribute(\"ajaxify\")), ya = l(v, [\"ft\",\"gt\",]);\n                new j().setURI(aa).setData({\n                    to_friend: w,\n                    action: ua,\n                    how_found: y,\n                    ref_param: z,\n                    link_data: ya,\n                    outgoing_id: la.id,\n                    xids: xa.getQueryData().xids,\n                    logging_location: ba,\n                    no_flyout_on_click: ca,\n                    ego_log_data: da,\n                    http_referer: fa\n                }).setErrorHandler(va).setServerDialogCancelHandler(wa).setRelativeTo(la).send();\n                if ((ga && (ua === \"add_friend\"))) {\n                    new j().setURI(\"/ajax/add_friend/chain_pymk.php\").send();\n                };\n            };\n            function pa(ua, va) {\n                if (ka) {\n                    m.hide(ka);\n                }\n                 else if (ja) {\n                    m.hide(ja);\n                }\n            ;\n                (la && m.hide(la));\n                (ma && m.hide(ma));\n                (na && m.hide(na));\n                if (ua) {\n                    m.show(ua);\n                };\n                if ((((\"Outgoing\" == va) && (ia != va)) && ea)) {\n                    new h(ua).from(\"backgroundColor\", \"#FFF8CC\").to(\"backgroundColor\", \"transparent\").from(\"borderColor\", \"#FFE222\").to(\"borderColor\", s.get(ua, \"borderLeftColor\")).duration(2000).go();\n                };\n                (ia && m.removeClass(v, (\"fStatus\" + ia)));\n                ia = va;\n                m.addClass(v, (\"fStatus\" + va));\n            };\n            function qa(ua) {\n                if (m.hasClass(ua, \"enableFriendListFlyout\")) {\n                    o.show(ua);\n                }\n                 else o.hide();\n            ;\n            };\n            var ra = i.subscribe(\"FriendRequest/change\", function(ua, va) {\n                ta();\n                if ((va.uid != w)) {\n                    return\n                };\n                switch (va.status) {\n                  case p.ARE_FRIENDS:\n                    return pa(na, \"Friends\");\n                  case p.INCOMING_REQUEST:\n                    return pa(ma, \"Incoming\");\n                  case p.OUTGOING_REQUEST:\n                    return pa(la, \"Outgoing\");\n                  case p.CAN_REQUEST:\n                    return pa((ka ? ka : ja), \"Requestable\");\n                };\n            }), sa;\n            if (x) {\n                sa = i.subscribe(\"FriendRequest/confirm\", function(ua, va) {\n                    ta();\n                    ((va.uid == w) && r(x));\n                });\n            };\n            (ja && g.listen(ja, \"click\", function() {\n                i.inform(\"FriendRequest/sending\", {\n                    uid: w\n                });\n                if (ca) {\n                    o.setActiveNode(la);\n                }\n                 else qa(la);\n            ;\n                oa(\"add_friend\", function(ua) {\n                    var va = ((ua.error == u.ERROR_ALREADY_ADDED) ? \"FriendRequest/sent\" : \"FriendRequest/sendFail\");\n                    i.inform(va, {\n                        uid: w\n                    });\n                    o.hide();\n                    k.defaultErrorHandler(ua);\n                }, function(ua) {\n                    i.inform(\"FriendRequest/sendFail\", {\n                        uid: w\n                    });\n                    o.hide();\n                });\n            }));\n            function ta() {\n                if (q(ha)) {\n                    return\n                };\n                (ra && ra.unsubscribe());\n                (sa && sa.unsubscribe());\n                ra = sa = null;\n            };\n        }\n    };\n    e.exports = u;\n});\n__d(\"FriendButtonIcon\", [\"Arbiter\",\"FriendStatus\",\"Button\",\"arrayContains\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"FriendStatus\"), i = b(\"Button\"), j = b(\"arrayContains\");\n    e.exports = {\n        register: function(k, l, m) {\n            g.subscribe(\"FriendListMembershipChange\", function(n, o) {\n                if ((o.uid == m)) {\n                    var p = j(o.lists, h.CLOSE_FRIENDS), q = j(o.lists, h.ACQUAINTANCES);\n                    if ((p && !q)) {\n                        i.setIcon(k, l.close);\n                    }\n                     else if ((q && !p)) {\n                        i.setIcon(k, l.acquaintance);\n                    }\n                     else i.setIcon(k, l.friend);\n                    \n                ;\n                }\n            ;\n            });\n        }\n    };\n});\n__d(\"PopoverMenuShowOnHover\", [\"Event\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"copyProperties\");\n    function i(j) {\n        this._popoverMenu = j;\n        this._listeners = [];\n    };\n    h(i.prototype, {\n        enable: function() {\n            this._attachMouseListeners(this._popoverMenu.getTriggerElem());\n            this._setMenuSubscription = this._popoverMenu.subscribe(\"setMenu\", this._onSetMenu.bind(this));\n        },\n        disable: function() {\n            while (this._listeners.length) {\n                this._listeners.pop().remove();;\n            };\n            if (this._setMenuSubscription) {\n                this._setMenuSubscription.unsubscribe();\n                this._setMenuSubscription = null;\n            }\n        ;\n        },\n        _onSetMenu: function() {\n            this._attachMouseListeners(this._popoverMenu.getMenu().getRoot());\n        },\n        _attachMouseListeners: function(j) {\n            var k = this._popoverMenu.getPopover();\n            this._listeners.push(g.listen(j, \"mouseenter\", k.showLayer.bind(k)), g.listen(j, \"mouseleave\", k.hideLayer.bind(k)));\n        }\n    });\n    e.exports = i;\n});\n__d(\"OGCollectionAddDialog\", [\"AsyncRequest\",\"DataStore\",\"DOMQuery\",\"Form\",\"MenuDeprecated\",\"URI\",\"collectDataAttributes\",\"copyProperties\",\"csx\",\"tidyEvent\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = b(\"DataStore\"), i = b(\"DOMQuery\"), j = b(\"Form\"), k = b(\"MenuDeprecated\"), l = b(\"URI\"), m = b(\"collectDataAttributes\"), n = b(\"copyProperties\"), o = b(\"csx\"), p = b(\"tidyEvent\"), q = \"OGCollectionAddDialog\";\n    function r(s, t, u, v, w) {\n        this._dialog = s;\n        this._surface = t;\n        this._endpoint = l(v);\n        this._loadEditMenu = w.loadEditMenu;\n        this._listener = h.get(String(u), q);\n        this._audienceSelector = i.find(this._dialog.getContent(), \".audienceSelector\");\n        this._menu = i.find(this._dialog.getContent(), \"._4-jt\");\n        k.register(this._menu);\n        this._menuSubscriptionToken = k.subscribe(\"select\", this._onMenuClick.bind(this));\n        p([this._dialog.subscribe(\"show\", this._onDialogShow.bind(this)),this._dialog.subscribe(\"hide\", this._onDialogHide.bind(this)),]);\n        this._dialog.show();\n    };\n    n(r, {\n        INSTANCE_KEY: q\n    });\n    n(r.prototype, {\n        _onDialogShow: function() {\n            this._listener.onDialogShow(this._dialog);\n        },\n        _onDialogHide: function() {\n            this._destroy();\n        },\n        _onMenuClick: function(s, t) {\n            if ((t.menu !== this._menu)) {\n                return\n            };\n            var u = t.item;\n            this._listener.onMenuClick(u);\n            var v = i.find(u, \"._5581\"), w = v.getAttribute(\"value\");\n            this._submitRequest(w);\n        },\n        _submitRequest: function(s) {\n            this._endpoint.addQueryData({\n                collection_token: s\n            });\n            this._dialog.hide();\n            this._request = new g(this._endpoint).setData(n(j.serialize(this._audienceSelector), {\n                action: \"add\",\n                load_edit_menu: this._loadEditMenu,\n                surface: this._surface\n            }, m(this._dialog.getContext(), [\"ft\",]))).setHandler(function() {\n                this._listener.onAddSuccess();\n            }.bind(this));\n            this._request.send();\n        },\n        _destroy: function() {\n            this._listener.onDialogHide();\n            k.unsubscribe(this._menuSubscriptionToken);\n        }\n    });\n    e.exports = r;\n});\n__d(\"OGCollectionAddMenu\", [\"CSS\",\"DataStore\",\"DOM\",\"DOMQuery\",\"Event\",\"OGCollectionAddDialog\",\"Parent\",\"TidyArbiterMixin\",\"copyProperties\",\"csx\",\"cx\",\"tidyEvent\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSS\"), h = b(\"DataStore\"), i = b(\"DOM\"), j = b(\"DOMQuery\"), k = b(\"Event\"), l = b(\"OGCollectionAddDialog\"), m = b(\"Parent\"), n = b(\"TidyArbiterMixin\"), o = b(\"copyProperties\"), p = b(\"csx\"), q = b(\"cx\"), r = b(\"tidyEvent\");\n    function s(t, u, v, w, x, y) {\n        this._image = u;\n        this._container = v;\n        this._placeholder = w;\n        this._surface = x;\n        this._showPlaceholder = y.showPlaceholder;\n        this._rateControl = i.scry(this._container.parentNode, \"._5586\")[0];\n        s.inform(\"addButton\", {\n            button: this._image,\n            root: this._container\n        });\n        r(k.listen(this._container, \"click\", function(z) {\n            var aa = m.byClass(z.getTarget(), \"_5859\");\n            if ((this.isDialogShowing() && aa)) {\n                z.kill();\n            };\n        }.bind(this)));\n        if ((this._surface === \"friend_timeline_lhc\")) {\n            this._handleAlwaysVisibleLHC();\n        };\n        h.set(String(t), l.INSTANCE_KEY, this);\n    };\n    o(s, n);\n    o(s.prototype, n, {\n        destroy: function() {\n            i.remove(this._container);\n            this._placeholder.destroy();\n        },\n        hide: function() {\n            g.hide(this._container);\n            this._placeholder.hide();\n        },\n        getParent: function() {\n            return this._container.parentNode;\n        },\n        insertMenuIntoDialog: function(t) {\n            this._placeholder.insertIntoDialog(t);\n        },\n        onMenuClick: function(t) {\n            var u = j.find(t, \"._5582\");\n            this._showRate = (this._rateControl && u.getAttribute(\"value\"));\n            g.hide(this._image);\n            if (this._showRate) {\n                g.show(this._rateControl);\n                k.fire(this._rateControl, \"click\");\n            }\n             else if (this._showPlaceholder) {\n                g.show(this._placeholder.getIcon());\n            }\n        ;\n        },\n        onAddSuccess: function() {\n            if ((!this._showPlaceholder && !this._showRate)) {\n                this.inform(\"reload\");\n            };\n        },\n        onDialogShow: function(t) {\n            var u = j.find(t.getContent(), \".audienceSelector\");\n            g.addClass(this._image, \"openToggler\");\n            s.inform(\"menuOpened\", {\n                audienceSelector: u.parentNode\n            });\n            this._dialogShowing = true;\n        },\n        onDialogHide: function() {\n            g.removeClass(this._image, \"openToggler\");\n            this._dialogShowing = false;\n        },\n        isDialogShowing: function() {\n            return this._dialogShowing;\n        },\n        _handleAlwaysVisibleLHC: function() {\n            var t = m.byClass(this._container, \"_4_ij\"), u = m.byClass(t, \"_5-r\");\n            if (g.hasClass(t, \"_58v0\")) {\n                r([this._alwaysVisibleToken = k.listen(u, \"mouseenter\", function() {\n                    g.removeClass(t, \"_58v0\");\n                    this._alwaysVisibleToken.remove();\n                }.bind(this)),]);\n            };\n        }\n    });\n    e.exports = s;\n});\n__d(\"TimelineAppSectionCuration\", [\"Animation\",\"AppSectionCurationState\",\"Arbiter\",\"AsyncSignal\",\"CSS\",\"DOM\",\"Ease\",\"Event\",\"OnVisible\",\"Parent\",\"Style\",\"TidyArbiterMixin\",\"TimelineSection\",\"copyProperties\",\"cx\",\"queryThenMutateDOM\",\"tidyEvent\",], function(a, b, c, d, e, f) {\n    var g = b(\"Animation\"), h = b(\"AppSectionCurationState\"), i = b(\"Arbiter\"), j = b(\"AsyncSignal\"), k = b(\"CSS\"), l = b(\"DOM\"), m = b(\"Ease\"), n = b(\"Event\"), o = b(\"OnVisible\"), p = b(\"Parent\"), q = b(\"Style\"), r = b(\"TidyArbiterMixin\"), s = b(\"TimelineSection\"), t = b(\"copyProperties\"), u = b(\"cx\"), v = b(\"queryThenMutateDOM\"), w = b(\"tidyEvent\"), x = 0, y = {\n    }, z = {\n    };\n    function aa(fa, ga, ha) {\n        var ia, ja, ka = (((ga != h.hide)) && ((ha != h.hide)));\n        v(function() {\n            ja = fa.offsetHeight;\n            ia = ((ga === h.hide) ? 0 : fa.firstChild.offsetHeight);\n        }, function() {\n            q.set(fa, \"height\", (ja + \"px\"));\n            q.set(fa, \"overflow\", \"hidden\");\n            (ia && k.addClass(fa.parentNode, \"_52bu\"));\n            o.checkBuffer.defer();\n            var la = l.getID(fa);\n            (z[la] && z[la].stop());\n            z[la] = new g(fa).to(\"height\", ia).ondone(function() {\n                delete z[la];\n                if (ia) {\n                    q.set(fa, \"overflow\", \"\");\n                    q.set(fa.parentNode, \"overflow\", \"\");\n                }\n            ;\n                (!ia && k.removeClass(fa.parentNode, \"_52bu\"));\n                i.inform(\"reflow\");\n            }).duration((Math.abs((ia - ja)) * ((ka ? 5 : 1.5)))).ease(m.sineOut).go();\n        });\n    };\n    function ba(fa, ga) {\n        if (fa) {\n            k.show(ga);\n            k.hide(fa);\n        }\n    ;\n    };\n    function ca(fa, ga) {\n        if (fa) {\n            k.show(fa);\n            k.hide(ga);\n        }\n    ;\n    };\n    function da(fa, ga) {\n        s.callWithSection(fa, function(ha) {\n            new j(\"/ajax/timeline/collections/app_recs/\", {\n                collection_token: ha.getActiveCollection().getToken(),\n                event_type: ga\n            }).send();\n        });\n    };\n    var ea = t({\n        addSection: function(fa, ga, ha) {\n            y[fa] = {\n                appClickLogged: false,\n                buttons: ga,\n                content: ha,\n                id: fa,\n                state: h.hide\n            };\n            q.set(ha, \"height\", \"0px\");\n            q.set(ha, \"overflow\", \"hidden\");\n            k.show(ha);\n            for (var ia in ga) {\n                w([n.listen(ga[ia].hide_button, \"click\", ea.informState.curry(h.hide, fa)),n.listen(ga[ia].show_button, \"click\", ea.informState.curry(ia, fa)),]);;\n            };\n            ea.register(fa, function(ja, ka, la, ma) {\n                new o(ha, aa.curry(ha, ja, ma), true, x);\n                for (var na in ga) {\n                    ca(ga[na].show_button, ga[na].hide_button);;\n                };\n                if (ga[ja]) {\n                    ba(ga[ja].show_button, ga[ja].hide_button);\n                };\n            });\n        },\n        informState: function(fa, ga) {\n            if ((y[ga] && (y[ga].state !== fa))) {\n                if (((fa === h.showApps) && !y[ga].appClickLogged)) {\n                    y[ga].appClickLogged = true;\n                    da(ga, \"add_apps_click\");\n                }\n            ;\n                var ha = y[ga].state;\n                y[ga].state = fa;\n                ea.inform(fa, {\n                    obj: y[ga],\n                    oldState: ha\n                });\n            }\n        ;\n        },\n        linkContent: function(fa, ga, ha) {\n            var ia = y[fa].buttons[h.showApps].show_button;\n            k.show(p.byClass(ia, \"hidden_elem\"));\n            new o(ia, function() {\n                if ((Math.floor((Math.random() * 100)) === 0)) {\n                    da(fa, \"add_apps_imp\");\n                };\n            }, true, x);\n            ea.register(fa, function(ja, ka, la, ma) {\n                if ((ja == h.showItems)) {\n                    if ((ma == h.showApps)) {\n                        q.set(y[fa].content.parentNode, \"overflow\", \"hidden\");\n                    };\n                    k.show(ga);\n                    k.hide(ha);\n                }\n                 else if ((ja == h.showApps)) {\n                    k.hide(ga);\n                    k.show(ha);\n                }\n                \n            ;\n            });\n        },\n        register: function(fa, ga) {\n            var ha = ea.subscribe([h.hide,h.showItems,h.showApps,], function(ia, ja) {\n                if ((ja.obj.id === fa)) {\n                    ga(ia, ja.obj, ha, ja.oldState);\n                };\n            });\n        },\n        getSectionState: function(fa) {\n            if (y[fa]) {\n                return y[fa].state\n            };\n        }\n    }, r);\n    e.exports = ea;\n});\n__d(\"TimelineMonitor\", [\"Arbiter\",\"Event\",\"Run\",\"Vector\",\"ViewportBounds\",\"ge\",\"queryThenMutateDOM\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"Event\"), i = b(\"Run\"), j = b(\"Vector\"), k = b(\"ViewportBounds\"), l = b(\"ge\"), m = b(\"queryThenMutateDOM\"), n = {\n    }, o = {\n    }, p = 0, q = [], r = null, s = false;\n    function t() {\n        n = {\n        };\n        o = {\n        };\n        p = 0;\n        q.length = 0;\n        (r && r.remove());\n        r = null;\n        s = false;\n    };\n    function u() {\n        if (!r) {\n            r = h.listen(window, \"scroll\", z);\n        };\n        if (!s) {\n            i.onLeave(t);\n            s = true;\n        }\n    ;\n        z();\n    };\n    var v = [], w = [];\n    function x() {\n        q.forEach(function(ea) {\n            var fa = aa.getSection(ea);\n            if ((fa && (fa !== o[ea.id]))) {\n                o[ea.id] = fa;\n                v.push({\n                    section: fa\n                });\n            }\n        ;\n        });\n        var ba = (k.getTop() + j.getScrollPosition().y);\n        for (var ca in n) {\n            var da = n[ca];\n            if (((((ba >= da.boundary) && (p <= da.boundary))) || (((ba <= da.boundary) && (p >= da.boundary))))) {\n                n[ca].fromAbove = (p < ba);\n                w.push(n[ca]);\n            }\n        ;\n        };\n        p = ba;\n    };\n    function y() {\n        v.forEach(function(ba) {\n            g.inform(aa.SECTION_CHANGE, ba);\n        });\n        w.forEach(function(ba) {\n            g.inform(aa.BOUNDARY_PASSED, ba);\n        });\n        v.length = 0;\n        w.length = 0;\n    };\n    function z() {\n        m(x, y, \"TimelineMonitor/scroll\");\n    };\n    var aa = {\n        BOUNDARY_PASSED: \"TimelineMonitor/boundary\",\n        SECTION_CHANGE: \"TimelineMonitor/change\",\n        getSection: function(ba) {\n            var ca = (k.getTop() + j.getScrollPosition().y), da = ba.childSections.getHead();\n            while (da) {\n                if ((l(da.nodeID) && (ca < (j.getElementPosition(da.getNode()).y + j.getElementDimensions(da.getNode()).y)))) {\n                    return da\n                };\n                da = da.getNext();\n            };\n        },\n        monitorBoundary: function(ba, ca) {\n            ca = (ca || ba);\n            if ((!n[ca] || (n[ca].boundary !== ba))) {\n                n[ca] = {\n                    boundary: ba,\n                    id: ca\n                };\n                u();\n            }\n        ;\n        },\n        monitorSection: function(ba) {\n            o[ba.id] = null;\n            q.push(ba);\n            u();\n            return aa.getSection(ba);\n        },\n        poke: function(ba) {\n            z();\n        }\n    };\n    e.exports = aa;\n});\n__d(\"TimelineAppSection\", [\"AppSectionCurationState\",\"Arbiter\",\"Class\",\"CSS\",\"DOM\",\"DOMQuery\",\"DOMScroll\",\"JSLogger\",\"MedleyPageletRequestData\",\"PageletSet\",\"Style\",\"TidyArbiter\",\"TidyArbiterMixin\",\"TimelineAppCollection\",\"TimelineAppSectionCuration\",\"TimelineDynamicSection\",\"TimelineMonitor\",\"TimelineSection\",\"TimelineSmartInsert\",\"TriggerablePageletLoader\",\"ViewportBounds\",\"copyProperties\",\"csx\",\"cx\",\"ge\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"AppSectionCurationState\"), h = b(\"Arbiter\"), i = b(\"Class\"), j = b(\"CSS\"), k = b(\"DOM\"), l = b(\"DOMQuery\"), m = b(\"DOMScroll\"), n = b(\"JSLogger\"), o = b(\"MedleyPageletRequestData\"), p = b(\"PageletSet\"), q = b(\"Style\"), r = b(\"TidyArbiter\"), s = b(\"TidyArbiterMixin\"), t = b(\"TimelineAppCollection\"), u = b(\"TimelineAppSectionCuration\"), v = b(\"TimelineDynamicSection\"), w = b(\"TimelineMonitor\"), x = b(\"TimelineSection\"), y = b(\"TimelineSmartInsert\"), z = b(\"TriggerablePageletLoader\"), aa = b(\"ViewportBounds\"), ba = b(\"copyProperties\"), ca = b(\"csx\"), da = b(\"cx\"), ea = b(\"ge\"), fa = b(\"tx\"), ga = 500, ha = 2, ia = 500, ja = 18, ka = \"_5bry\", la = \"_3s-\", ma = k.create(\"div\", {\n        className: \"_3s_\"\n    });\n    function na() {\n        return k.create(\"span\", {\n            className: \"_3s18\"\n        }, [k.create(\"a\", {\n            className: \"_3s19\",\n            href: \"#\"\n        }, \"More\"),k.create(\"span\", {\n            className: \"_3s1a\"\n        }),]);\n    };\n    var oa = n.create(\"collections\"), pa = {\n        notes: 295,\n        events: 345,\n        photos: 555,\n        app_quoraapp: 569,\n        friends: 603,\n        app_foodspotting: 621,\n        map: 621,\n        favorites: 645,\n        app_pinterestapp: 699,\n        app_instapp: 699,\n        books: 699,\n        movies: 699,\n        tv: 699,\n        music: 725\n    };\n    function qa(sa) {\n        return pa[sa.replace(\"pagelet_timeline_medley_\", \"\")];\n    };\n    function ra(sa, ta, ua, va) {\n        this.parent.construct(this, ra.getIDBySK(ta), sa, ua);\n        this._sk = ta;\n        this._title = va;\n    };\n    i.extend(ra, v);\n    ba(ra, {\n        createFromArray: function(sa) {\n            return sa.map(function(ta) {\n                return new ra(ta.controller, ta.sk, ta.label, ta.title);\n            });\n        },\n        getIDBySK: function(sa) {\n            return (\"pagelet_timeline_medley_\" + sa);\n        },\n        registerCollections: function(sa, ta, ua) {\n            x.callWithSection(ra.getIDBySK(sa), function(va) {\n                t.createFromArray(ta).forEach(va.appendSection.bind(va));\n                var wa = va.childSections.get(ua);\n                va.setActiveCollection(wa);\n                wa.setIsLoaded(true);\n            });\n        },\n        removeEmptyAppSection: function(sa) {\n            x.callWithSection(ra.getIDBySK(sa), function(ta) {\n                ta.remove();\n            });\n        }\n    }, s);\n    ba(ra.prototype, s, {\n        _createNode: function() {\n            var sa = this.parent._createNode();\n            sa.setAttribute(\"aria-labelledby\", (\"medley_header_\" + this._sk));\n            sa.setAttribute(\"aria-role\", \"region\");\n            k.prependContent(sa, k.create(\"div\", {\n                className: \"_3cz\"\n            }, [this._title,k.create(\"div\", {\n                className: \"_3dc\",\n                \"aria-role\": \"tablist\"\n            }),]));\n            this.resetMinHeight(sa);\n            return sa;\n        },\n        addAuxContent: function(sa) {\n            var ta = l.scry(this.getNode(), \"._6ph\")[0];\n            (ta && k.appendContent(ta, sa));\n            (this._activeCollection && this._checkTabDimensions(this._activeCollection));\n        },\n        nullStateCurationContent: function() {\n            if (!this._nullStateContent) {\n                return\n            };\n            var sa = l.find(this.getNode(), \"._1_cb\");\n            k.replace(sa.firstChild, this._nullStateContent);\n        },\n        addCurationContent: function(sa, ta, ua) {\n            var va = l.scry(this.getNode(), \"._1_cb\")[0];\n            (va && k.appendContent(va, sa));\n            if (ua) {\n                this._nullStateContent = ua;\n            };\n            this._checkCurationContent(ta);\n        },\n        createTriggerLoader: function(sa) {\n            var ta = function(ua) {\n                this._parentSection._lastLoadedSection = this;\n                this.setIsLoaded(true);\n                y.enable();\n                y.run(this.getNode(), function() {\n                    ua();\n                    this.unsetMinHeight();\n                    w.poke(this._parentSection.id);\n                }.bind(this), \"viewport\");\n            }.bind(this);\n            r.subscribe(\"Medley/requestDataSet\", function() {\n                this._triggerLoader = new z({\n                    controller: this._controller,\n                    data: this.getData(),\n                    displayCallback: ta,\n                    options: {\n                        constHeight: true\n                    },\n                    node: this.getNode()\n                }, [{\n                    node: this.getNode(),\n                    onVisibleBuffer: ga,\n                    onVisibleStrict: true,\n                    type: (sa ? z.TRIGGER_NOW : z.TRIGGER_ONVISIBLE)\n                },]);\n            }.bind(this));\n        },\n        freeze: function() {\n            j.addClass(this.getNode(), \"_c4e\");\n            if ((ea(this.nodeID) && !this.isLoaded())) {\n                (this._triggerLoader && this._triggerLoader.disableTriggers());\n            };\n            this.freezeChildren();\n        },\n        getData: function() {\n            if (!this._data) {\n                this._data = ba({\n                    sk: this._sk\n                }, o.get(), {\n                    overview: (this._parentSection._sk !== this._sk)\n                });\n            };\n            return this._data;\n        },\n        getActiveCollection: function() {\n            return this._activeCollection;\n        },\n        remove: function() {\n            if (p.hasPagelet(this.id)) {\n                p.removePagelet(this.id);\n            };\n            k.remove(this.getNode());\n            this._parentSection.childSections.remove(this.id);\n        },\n        setActiveCollection: function(sa) {\n            if (((this._activeCollection === sa) || !sa._tabNode)) {\n                return\n            };\n            if (this._activeCollection) {\n                h.inform(\"TimelineSideAds/refresh\");\n                oa.log(\"change_collection\", {\n                    previous_collection: this._activeCollection.getToken(),\n                    new_collection: sa.getToken()\n                });\n                this.resetMinHeight();\n                this._activeCollection.disableContentLoader();\n                j.hide(this._activeCollection.getNode());\n                j.removeClass(this._activeCollection._tabNode, la);\n                k.scry(this._activeCollection._tabNode, \"div._3s_\").forEach(k.remove);\n                k.appendContent(sa._tabNode, ma.cloneNode(true));\n                (this._activeCollection.auxContent && j.hide(this._activeCollection.auxContent));\n                (this._activeCollection.curationContent && j.hide(this._activeCollection.curationContent));\n                this._activeCollection._tabNode.setAttribute(\"aria-selected\", \"false\");\n            }\n        ;\n            (sa.auxContent && j.show(sa.auxContent));\n            this._checkCurationContent(sa);\n            j.addClass(sa._tabNode, la);\n            this._checkTabDimensions(sa);\n            this._activeCollection = sa;\n            ra.inform(\"changeCollection\");\n            if (!ea(sa.nodeID)) {\n                k.appendContent(l.find(this.getNode(), \"div._3i9\"), sa.getNode());\n            };\n            j.show(sa.getNode());\n            (sa.isLoaded() && this.unsetMinHeight());\n            sa._tabNode.setAttribute(\"aria-selected\", \"true\");\n            sa.enableContentLoader();\n        },\n        resetMinHeight: function(sa) {\n            (sa || (sa = this.getNode()));\n            var ta = (qa(this.id) || (sa.offsetHeight - ha));\n            ((ta > 0) && this._updateScrollAfterHeight(sa, ta));\n        },\n        scrollTo: function(sa, ta) {\n            var ua = aa.getElementPosition(this.getNode());\n            ua.y -= (sa || ja);\n            (ta && this._parentSection.toggleScrollLoad(false));\n            m.scrollTo(ua, ia, null, null, function() {\n                ua = aa.getElementPosition(this.getNode());\n                ua.y -= (sa || ja);\n                m.scrollTo(ua);\n                (ta && this._parentSection.toggleScrollLoad(true));\n            }.bind(this));\n        },\n        thaw: function() {\n            j.removeClass(this.getNode(), \"_c4e\");\n            (this._triggerLoader && this._triggerLoader.enableTriggers());\n            this.thawChildren();\n        },\n        unsetMinHeight: function() {\n            this._updateScrollAfterHeight(this.getNode(), 0);\n        },\n        _updateScrollAfterHeight: function(sa, ta) {\n            q.set(sa, \"min-height\", (ta + \"px\"));\n            h.inform(\"reflow\");\n        },\n        _checkCurationContent: function(sa) {\n            var ta = l.scry(this.getNode(), \"._2zh3\")[0];\n            if (ta) {\n                j.conditionShow(ta, sa.curationContent);\n                if (sa.curationContent) {\n                    j.show(sa.curationContent);\n                    if (sa.curationContentState) {\n                        u.informState(sa.curationContentState, this.id);\n                    };\n                }\n                 else u.informState(g.hide, this.id, g.showItems);\n            ;\n            }\n        ;\n        },\n        _getTabObj: function() {\n            if (!this._tabObj) {\n                this._tabObj = {\n                    aux: k.find(this.getNode(), \"._6ph\"),\n                    items: [],\n                    nav: k.find(this.getNode(), \"._1_ca\"),\n                    tabs: k.find(this.getNode(), \"._3dc\"),\n                    width: 0\n                };\n                j.addClass(this._tabObj.tabs, \"_5brz\");\n            }\n        ;\n            return this._tabObj;\n        },\n        _checkTabDimensions: function(sa) {\n            var ta = this._getTabObj(), ua = (ta.nav.offsetWidth - ta.aux.offsetWidth);\n            if ((ua >= ta.width)) {\n                if ((!ta.hidden && ((ua - ta.tabs.offsetWidth) >= 0))) {\n                    return\n                };\n                j.removeClass(ta.tabs, ka);\n            }\n        ;\n            if ((ta.hidden && (sa._tabNode.parentNode === ta.overflow))) {\n                k.prependContent(ta.overflow, ta.dropdown.previousSibling);\n                k.insertBefore(ta.dropdown, sa._tabNode);\n            }\n        ;\n            if ((((ua - ta.tabs.offsetWidth) >= 0) && !ta.hidden)) {\n                return\n            };\n            var va = ta.items.length;\n            if ((va && ta.hidden)) {\n                for (var wa = 0; (wa < va); wa++) {\n                    k.appendContent(ta.tabs, ta.items[wa]);;\n                };\n                k.remove(ta.dropdown);\n            }\n        ;\n            j.conditionClass(ta.tabs, ka, ((ua - ta.tabs.offsetWidth) < 0));\n            ta.width = ua;\n            ta.hidden = 0;\n            if (((ua - ta.tabs.offsetWidth) >= 0)) {\n                return\n            };\n            if (!ta.dropdown) {\n                ta.dropdown = na();\n                ta.overflow = k.find(ta.dropdown, \"._3s1a\");\n                ta.items = k.scry(this.getNode(), \"._3c_\");\n                va = ta.items.length;\n            }\n        ;\n            k.appendContent(ta.tabs, ta.dropdown);\n            var xa = 0;\n            for (wa = (va - 1); ((wa > 0) && (xa <= 0)); wa--) {\n                if ((ta.items[wa] !== sa._tabNode)) {\n                    k.prependContent(ta.overflow, ta.items[wa]);\n                    xa = (ua - ta.tabs.offsetWidth);\n                    ta.hidden++;\n                }\n            ;\n            };\n        }\n    });\n    e.exports = ra;\n});\n__d(\"TimelineCoverDisclaimer\", [\"Dialog\",], function(a, b, c, d, e, f) {\n    var g = b(\"Dialog\");\n    function h(i, j, k) {\n        if ((h.displayed === undefined)) {\n            h.displayed = true;\n        }\n         else return\n    ;\n        new g().setModal(true).setTitle(i).setBody(j).setButtonsMessage(k).setButtons(g.OK).show();\n    };\n    e.exports = h;\n});\n__d(\"legacy:TimelineCoverDisclaimer\", [\"TimelineCoverDisclaimer\",], function(a, b, c, d) {\n    a.TimelineCoverDisclaimer = b(\"TimelineCoverDisclaimer\");\n}, 3);\n__d(\"TimelineMedley\", [\"Class\",\"CSS\",\"DOM\",\"DOMPosition\",\"DOMQuery\",\"PageTransitions\",\"TimelineAppSection\",\"TimelineDynamicSectionConfig\",\"TimelineMonitor\",\"TimelineSection\",\"URI\",\"ViewportBounds\",\"copyProperties\",\"csx\",\"cx\",\"ge\",\"$\",], function(a, b, c, d, e, f) {\n    var g = b(\"Class\"), h = b(\"CSS\"), i = b(\"DOM\"), j = b(\"DOMPosition\"), k = b(\"DOMQuery\"), l = b(\"PageTransitions\"), m = b(\"TimelineAppSection\"), n = b(\"TimelineDynamicSectionConfig\"), o = b(\"TimelineMonitor\"), p = b(\"TimelineSection\"), q = b(\"URI\"), r = b(\"ViewportBounds\"), s = b(\"copyProperties\"), t = b(\"csx\"), u = b(\"cx\"), v = b(\"ge\"), w = b(\"$\"), x = \"timeline-medley\", y = \"about\", z = 2, aa = false;\n    function ba(ea) {\n        var fa = (ea.getQueryData().sk || ea.getPath().split(\"/\")[2]);\n        return (n.skmapping[fa] || fa);\n    };\n    function ca(ea) {\n        if (ea.getQueryData().id) {\n            return ea.getQueryData.id\n        };\n        return ea.getPath().split(\"/\")[1];\n    };\n    function da(ea, fa, ga) {\n        this.parent.construct(this, x);\n        this.isOverview = (ea.length > 1);\n        n.breaker = ga.breaker;\n        m.createFromArray(ea).forEach(this.appendSection.bind(this));\n        o.monitorSection(this);\n        this._lastLoadedSection = this.childSections.get(m.getIDBySK(fa)).setIsLoaded(true);\n        p.setActiveSectionID(this._lastLoadedSection.id);\n        if ((aa && this.isMedleyView())) {\n            this.addSectionPlaceholders();\n        };\n        var ha = q.getNextURI();\n        this._vanity = ca(ha);\n        this._sk = ba(ha);\n        if (this.isOverview) {\n            l.registerHandler(this._transitionHandler.bind(this));\n        };\n    };\n    g.extend(da, p);\n    s(da, {\n        loadToSection: function(ea, fa) {\n            p.setActiveSectionID(ea);\n            p.callWithSection(x, function(ga) {\n                var ha = ga.childSections.getHead(), ia = 0;\n                while ((ha && (ha.id !== ea))) {\n                    ia++;\n                    ha = ha.getNext();\n                };\n                if (!ia) {\n                    return fa(ha)\n                };\n                ia--;\n                (ia && ga.addUpcomingSectionPlaceholders(ga.childSections.getHead(), ia));\n                ga.addSectionPlaceholder(ha, ha.getPrev(), true);\n                var ja = ha.subscribe(\"loaded\", function() {\n                    fa(ha);\n                    ja.unsubscribe();\n                });\n            });\n        },\n        scrollToSection: function(ea, fa, ga) {\n            p.callWithSection(ea, function(ha) {\n                ha.scrollTo(fa, ga);\n            });\n        },\n        toggleScrollLoad: function(ea) {\n            aa = ea;\n            p.callWithSection(x, function(fa) {\n                fa.toggleScrollLoad(ea);\n            });\n        }\n    });\n    s(da.prototype, {\n        addSectionTeasers: function() {\n            if (!this.isMedleyView()) {\n                h.removeClass(this.getNode(), \"_c4f\");\n                this.thawChildren();\n                this.addSectionPlaceholders();\n                this.addSectionBreak();\n            }\n        ;\n        },\n        addUpcomingSectionPlaceholders: function(ea, fa) {\n            fa = (fa || z);\n            while (ea = ea.getNext()) {\n                if ((!this.addSectionPlaceholder(ea, ea.getPrev()) && (--fa <= 0))) {\n                    break;\n                };\n            };\n        },\n        addSectionPlaceholder: function(ea, fa, ga) {\n            if ((!ea.isLoaded() && v(ea.nodeID))) {\n                return false\n            };\n            if (!v(ea.nodeID)) {\n                i.insertAfter(fa.getNode(), ea.getNode());\n                ea.createTriggerLoader(ga);\n                return false;\n            }\n        ;\n            return true;\n        },\n        addSectionBreak: function() {\n            if (this._lastLoadedSection.getNext()) {\n                i.insertAfter(this.childSections.getHead().getNode(), n.breaker);\n            }\n             else i.remove(n.breaker);\n        ;\n        },\n        addSectionPlaceholders: function() {\n            this.addUpcomingSectionPlaceholders(this._lastLoadedSection);\n        },\n        getNode: function() {\n            return w(this.id);\n        },\n        isMedleyView: function() {\n            return (this._sk === y);\n        },\n        toggleScrollLoad: function(ea) {\n            aa = ea;\n            if (ea) {\n                this.thawChildren();\n                this.addSectionPlaceholders();\n            }\n             else this.freezeChildren();\n        ;\n        },\n        _transitionHandler: function(ea) {\n            if ((ca(ea) !== this._vanity)) {\n                return false\n            };\n            var fa = ba(ea);\n            if (!fa) {\n                return false\n            };\n            if ((fa === y)) {\n                return false;\n            }\n             else {\n                var ga = ea.getQueryData();\n                if (!ga.next_cursor) {\n                    return false\n                };\n                var ha = this.childSections.getHead();\n                while (ha) {\n                    if ((ha._sk === fa)) {\n                        if ((!ha._activeCollection && !k.scry(ha._activeCollection.getNode(), \"._3t3\")[0])) {\n                            return false\n                        };\n                        this._transitionToSection.bind(this, ha, ga).defer();\n                        return true;\n                    }\n                ;\n                    ha = ha.getNext();\n                };\n            }\n        ;\n            return false;\n        },\n        _transitionToSection: function(ea, fa) {\n            var ga = (j.getElementPosition(ea.getNode()).y - r.getTop());\n            i.scry(ea.getNode(), \"._51k9\").forEach(function(ja) {\n                h.removeClass(ja, \"_51k9\");\n            });\n            this._sk = ea._sk;\n            p.setActiveSectionID(ea.id);\n            ea.thaw();\n            h.addClass(this.getNode(), \"_c4f\");\n            this.freezeChildren();\n            var ha = k.find(ea._activeCollection.getNode(), \"._3t3\");\n            ea._activeCollection.addContentLoader(ha, fa.next_cursor);\n            ea._activeCollection._contentLoader.load({\n                node: ha\n            });\n            var ia = this.childSections.getHead();\n            while ((ia && (ia.id !== ea.id))) {\n                ia.remove();\n                ia = this.childSections.getHead();\n            };\n            p.inform(\"Medley/transitionToSection\", ea.id);\n            ea.scrollTo(((ga < 0) ? ga : 0));\n            l.transitionComplete();\n        }\n    });\n    e.exports = da;\n});\n__d(\"TimelineNavLight\", [\"CSS\",\"DOM\",\"DOMQuery\",\"Parent\",\"TimelineSection\",\"csx\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSS\"), h = b(\"DOM\"), i = b(\"DOMQuery\"), j = b(\"Parent\"), k = b(\"TimelineSection\"), l = b(\"csx\"), m = b(\"cx\");\n    function n(o) {\n        var p = i.scry(o, \"._6-7\")[0], q = i.scry(o, \"._6-6\"), r = j.byClass(o, \"_70k\").offsetWidth, s = q[(q.length - 1)];\n        if (((s.offsetLeft + s.offsetWidth) > r)) {\n            g.addClass(o, \"_5215\");\n        };\n        for (var t = (q.length - 1); (t > 1); t--) {\n            if (((q[t].offsetLeft + q[t].offsetWidth) > r)) {\n                h.remove(q[t]);\n            }\n             else break;\n        ;\n        };\n        var u = \"_529n\";\n        g.removeClass(j.byClass(o, u), u);\n        k.subscribe(\"Medley/transitionToSection\", function(v, w) {\n            if ((p && (w === p.getAttribute(\"data-medley-id\")))) {\n                return\n            };\n            (p && g.removeClass(p, \"_6-7\"));\n            for (var x = 0; (x < q.length); ++x) {\n                if ((q[x].getAttribute(\"data-medley-id\") === w)) {\n                    g.addClass(q[x], \"_6-7\");\n                    p = q[x];\n                    return;\n                }\n            ;\n            };\n        });\n    };\n    e.exports = n;\n});\n__d(\"TimelineOGCollectionAddSelector\", [\"AsyncRequest\",\"DOM\",\"Form\",\"TidyArbiterMixin\",\"copyProperties\",\"csx\",\"tidyEvent\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = b(\"DOM\"), i = b(\"Form\"), j = b(\"TidyArbiterMixin\"), k = b(\"copyProperties\"), l = b(\"csx\"), m = b(\"tidyEvent\");\n    function n(o, p, q, r) {\n        this._endpoint = q;\n        this._button = o;\n        this._buttonParent = o.parentNode;\n        this._audienceSelector = r;\n        var s = h.find(o, \"._4ihv\");\n        n.inform(\"addButton\", {\n            button: s,\n            root: this._buttonParent\n        });\n        m([p.getMenu().subscribe(\"rendered\", function(t, u) {\n            n.inform(\"menuOpened\", {\n                audienceSelector: r\n            });\n            h.appendContent(h.find(u, \"._54ng\"), r);\n        }),p.subscribe(\"itemselected\", this._onChange.bind(this)),]);\n    };\n    k(n, j);\n    k(n.prototype, j, {\n        _onChange: function(o, p) {\n            var q = p.getValue(), r = (this.inform(\"addedToCollection\", q) || {\n            });\n            new g(this._endpoint).setData(k(i.serialize(this._audienceSelector), r, {\n                action: \"add\",\n                collection_token: q,\n                mechanism: \"add_selector\"\n            })).send();\n        }\n    });\n    e.exports = n;\n});\n__d(\"TimelineCurationNUXController\", [\"AppSectionCurationState\",\"AsyncRequest\",\"CSS\",\"DOM\",\"Event\",\"OGCollectionAddMenu\",\"TimelineOGCollectionAddSelector\",\"URI\",\"$\",\"csx\",\"cx\",\"tidyEvent\",], function(a, b, c, d, e, f) {\n    var g = b(\"AppSectionCurationState\"), h = b(\"AsyncRequest\"), i = b(\"CSS\"), j = b(\"DOM\"), k = b(\"Event\"), l = b(\"OGCollectionAddMenu\"), m = b(\"TimelineOGCollectionAddSelector\"), n = b(\"URI\"), o = b(\"$\"), p = b(\"csx\"), q = b(\"cx\"), r = b(\"tidyEvent\"), s = 5, t = \"pagelet_timeline_medley_movies\", u = 165, v, w, x, y, z, aa, ba = [], ca = {\n        reports: 0,\n        about: 1,\n        section: 2,\n        section_privacy: 3,\n        add_button: 4,\n        privacy: 5,\n        0: \"reports\",\n        1: \"about\",\n        2: \"section\",\n        3: \"section_privacy\",\n        4: \"add_button\",\n        5: \"privacy\"\n    };\n    function da() {\n        ba.forEach(function(na) {\n            (na.button && na.button.setAttribute(\"data-hover\", \"tooltip\"));\n            (na.listener && na.listener.remove());\n        });\n        ba.length = 0;\n    };\n    function ea(na) {\n        if (z[na]) {\n            z[na].destroy();\n            delete z[na];\n            ((na === \"add_button\") && da());\n        }\n    ;\n        ((aa[na] && aa[na].parentNode) && j.remove(aa[na]));\n    };\n    function fa(na) {\n        if (!i.hasClass(na, \"_50_y\")) {\n            i.addClass(na, \"_50_y\");\n            d([\"Animation\",], function(oa) {\n                new oa(na).to(\"opacity\", 0).duration(300).ease(oa.ease.end).hide().go();\n            });\n        }\n    ;\n    };\n    function ga(na) {\n        ha(na);\n        var oa = (ca[na] + 1);\n        (oa && ia(ca[oa]));\n    };\n    function ha(na) {\n        new h(\"/ajax/timeline/collections/tour/curation/\").setAllowCrossPageTransition(true).setData({\n            step: na\n        }).send();\n        ea(na);\n    };\n    function ia(na) {\n        y = na;\n        switch (na) {\n          case \"reports\":\n            d([\"TimelineController\",], function(oa) {\n                oa.runOnceWhenSectionFullyLoaded(function() {\n                    ka(j.find(o(\"timeline_tab_content\"), \"._3rbg\"), na);\n                }, \"recent\", \"0\");\n            });\n            break;\n          case \"about\":\n            v = j.scry(o(\"fbTimelineHeadline\"), \"._6-6\")[1];\n            w = r(k.listen(v, \"click\", function() {\n                v = null;\n                w.remove();\n                y = \"section\";\n            }));\n            ka(v, na);\n            break;\n          case \"section\":\n            if (v) {\n                n(v.getAttribute(\"href\")).go();\n                v = null;\n                (w && w.remove());\n            }\n             else d([\"OnVisible\",\"TimelineMedley\",], function(oa, pa) {\n                j.appendContent(j.find(o(\"pagelet_timeline_main_column\"), \"._2w3\"), aa.section);\n                r(k.listen(aa.section, \"click\", function() {\n                    pa.scrollToSection(t, u, 1);\n                    fa(aa.section);\n                }));\n                pa.loadToSection(t, function() {\n                    ka(o(t), na);\n                    var qa = new oa(o(t), function() {\n                        fa(aa.section);\n                        qa.remove();\n                    }, false, -u);\n                });\n            });\n        ;\n            break;\n          case \"section_privacy\":\n            d([\"TimelineAppSectionCuration\",], function(oa) {\n                oa.informState(g.showItems, t);\n                ka(j.scry(o(t), \".audienceSelector\")[0], na);\n            });\n            break;\n          case \"privacy\":\n            k.fire(x, \"click\");\n            break;\n        };\n    };\n    function ja(na, oa) {\n        if (z.add_button) {\n            var pa = j.scry(oa, \"[data-hover]\")[0];\n            ba.push({\n                button: pa,\n                listener: r(k.listen(na, \"mouseenter\", function() {\n                    x = na;\n                    ka(na, \"add_button\");\n                }))\n            });\n            (pa && pa.removeAttribute(\"data-hover\"));\n        }\n    ;\n    };\n    function ka(na, oa) {\n        if (z[oa]) {\n            z[oa].setContext(na).setOffsetX(5).show();\n            if ((oa === \"privacy\")) {\n                ea(\"add_button\");\n            };\n        }\n    ;\n    };\n    function la(na, oa, pa) {\n        var qa = pa.getAttribute(\"data-action\");\n        if (((qa === \"next\") || (qa === \"done\"))) {\n            ga(na);\n        }\n         else ha(na);\n    ;\n    };\n    var ma = {\n        init: function(na) {\n            var oa = na.next_step, pa = ca[oa];\n            z = na.dialogs;\n            aa = (na.links ? na.links : []);\n            da();\n            if (((oa === \"section\") && (oa !== y))) {\n                ea(\"section\");\n                ea(\"section_privacy\");\n                pa += 2;\n                oa = ca[pa];\n            }\n        ;\n            for (var qa in z) {\n                r(z[qa].subscribe(\"button\", la.curry(qa)));;\n            };\n            if (z.add_button) {\n                var ra = (na.isViewingSelf ? m : l);\n                r([ra.subscribe(\"menuOpened\", function(sa, ta) {\n                    ka.curry(j.find(ta.audienceSelector, \".audienceSelector\"), \"privacy\").defer(s);\n                }),ra.subscribe(\"addButton\", function(sa, ta) {\n                    ja.curry(ta.button, ta.root).defer(s);\n                }),]);\n            }\n        ;\n            if ((na.isViewingSelf && (pa < ca.add_button))) {\n                ia(oa);\n            };\n        }\n    };\n    e.exports = ma;\n});\n__d(\"TimelineStickyRightColumn\", [\"Arbiter\",\"CSS\",\"DOMQuery\",\"Event\",\"PhotoSnowlift\",\"Run\",\"Style\",\"TimelineContentLoader\",\"Vector\",\"UserAgent\",\"csx\",\"queryThenMutateDOM\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"CSS\"), i = b(\"DOMQuery\"), j = b(\"Event\"), k = b(\"PhotoSnowlift\"), l = b(\"Run\"), m = b(\"Style\"), n = b(\"TimelineContentLoader\"), o = b(\"Vector\"), p = b(\"UserAgent\"), q = b(\"csx\"), r = b(\"queryThenMutateDOM\"), s = 100, t = 15, u = 15, v = 71, w = false, x = null, y = null, z, aa, ba, ca, da, ea, fa, ga;\n    function ha() {\n        if (k.getInstance().isOpen) {\n            return\n        };\n        z = n.getCurrentSection();\n        if ((!z || !z.rightColumnFinished)) {\n            return\n        };\n        var pa = i.scry(z.node, \"._3rbf\")[0], qa = i.scry(z.node, \"._3rbh\")[0];\n        aa = (pa ? pa.offsetHeight : 0);\n        ba = (qa ? qa.offsetHeight : 0);\n        ca = o.getViewportDimensions().y;\n        fa = (pa ? o.getElementPosition(pa).y : 0);\n        ga = (document.body.clientWidth < document.body.scrollWidth);\n    };\n    function ia() {\n        if (k.getInstance().isOpen) {\n            return\n        };\n        if ((y && (y !== z))) {\n            var pa = i.scry(y.node, \"._3rbh\")[0];\n            if (pa) {\n                ka(pa, \"\", \"\", \"\");\n            };\n        }\n    ;\n        var qa = i.scry(z.node, \"._3rbh\")[0];\n        if (!qa) {\n            return\n        };\n        if (ga) {\n            ka(qa, \"\", \"\", \"\");\n            return;\n        }\n    ;\n        if ((!z || !z.rightColumnFinished)) {\n            return\n        };\n        ja(z);\n        y = (h.hasClass(qa, \"fixed_always\") ? z : null);\n    };\n    function ja(pa) {\n        if (((ba >= aa) || (aa <= ca))) {\n            return\n        };\n        ea = da;\n        da = o.getScrollPosition().y;\n        var qa, ra = i.scry(pa.node, \"._3rbh\")[0];\n        if (!ra) {\n            return\n        };\n        if ((da <= (fa - la()))) {\n            ka(ra, \"\", \"\", \"\");\n            return;\n        }\n    ;\n        if (((aa + fa) <= (da + Math.min((ba + la()), ((ca - u) - v))))) {\n            ka(ra, \"absolute\", \"\", (u + \"px\"));\n            return;\n        }\n    ;\n        if ((ba > ((ca - u) - la()))) {\n            if ((da < ea)) {\n                var sa = false;\n                if ((ra.style.position === \"absolute\")) {\n                    if (((ra.style.top !== \"\") && (((da + la()) - fa) <= parseInt(ra.style.top, 10)))) {\n                        sa = true;\n                    }\n                     else if (((ra.style.bottom !== \"\") && (da <= ((((fa + aa) - la())) - ba)))) {\n                        sa = true;\n                    }\n                \n                };\n                if (sa) {\n                    ka(ra, \"fixed\", (la() + \"px\"), \"\");\n                    return;\n                }\n                 else if (((ra.style.position === \"absolute\") && ra.style.top)) {\n                    return;\n                }\n                 else if (h.hasClass(ra, \"fixed_always\")) {\n                    if ((parseInt(ra.style.top, 10) >= la())) {\n                        return\n                    };\n                    qa = ((da - fa) - ((ba - ((ca - v)))));\n                    if (ea) {\n                        qa += (ea - da);\n                    };\n                    ka(ra, \"absolute\", (qa + \"px\"), \"\");\n                    return;\n                }\n                \n                \n            ;\n            }\n             else {\n                var ta = false;\n                if (((ra.style.position === \"absolute\") || (((ra.style.position === \"\") && !h.hasClass(ra, \"fixed_always\"))))) {\n                    qa = (ra.style.top ? parseInt(ra.style.top, 10) : 0);\n                    if (((da + ca) >= (((fa + qa) + ba) + v))) {\n                        ta = true;\n                    };\n                }\n            ;\n                if (ta) {\n                    qa = (((ca - ba) - u) - v);\n                    ka(ra, \"fixed\", (qa + \"px\"), \"\");\n                    return;\n                }\n                 else if ((da == ea)) {\n                    return;\n                }\n                 else if (h.hasClass(ra, \"fixed_always\")) {\n                    if ((parseInt(ra.style.top, 10) >= la())) {\n                        qa = ((da - fa) + la());\n                        if (ea) {\n                            qa += (ea - da);\n                        };\n                        ka(ra, \"absolute\", (qa + \"px\"), \"\");\n                        return;\n                    }\n                ;\n                }\n                 else if ((ra.style.position === \"absolute\")) {\n                    return\n                }\n                \n                \n            ;\n            }\n        ;\n        }\n         else ka(ra, \"fixed\", (la() + \"px\"), \"\");\n    ;\n    };\n    function ka(pa, qa, ra, sa) {\n        m.set(pa, \"bottom\", sa);\n        if ((qa === \"fixed\")) {\n            h.addClass(pa, \"fixed_always\");\n            m.set(pa, \"position\", \"\");\n        }\n         else {\n            h.removeClass(pa, \"fixed_always\");\n            m.set(pa, \"position\", qa);\n        }\n    ;\n        m.set(pa, \"top\", ra);\n        g.inform(\"reflow\");\n    };\n    function la() {\n        return (h.hasClass(document.documentElement, \"tinyViewport\") ? t : s);\n    };\n    function ma() {\n        r(ha, ia);\n    };\n    function na() {\n        w = false;\n        y = null;\n        while (x.length) {\n            x.pop().remove();;\n        };\n        x = null;\n    };\n    var oa = {\n        init: function() {\n            if ((w || (p.ie() < 8))) {\n                return\n            };\n            w = true;\n            x = [j.listen(window, \"scroll\", ma),j.listen(window, \"resize\", ma),];\n            l.onLeave(na);\n        },\n        adjust: function() {\n            if (w) {\n                ha();\n                ia();\n            }\n        ;\n        }\n    };\n    e.exports = oa;\n});");
// 17923
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o7,"sb5aedabafe9890184848a2c0cd28bee9cd1edd94");
// 17924
geval("if (JSBNG__self.CavalryLogger) {\n    CavalryLogger.start_js([\"3SGVa\",]);\n}\n;\n;\n__d(\"SubscriptionLevels\", [], function(a, b, c, d, e, f) {\n    var g = {\n        ALL: \"162318810514679\",\n        DEFAULT: \"271670892858696\",\n        TOP: \"266156873403755\"\n    };\n    e.exports = g;\n});\n__d(\"EditSubscriptions\", [\"JSBNG__Event\",\"function-extensions\",\"Arbiter\",\"AsyncRequest\",\"CSS\",\"DOM\",\"MenuDeprecated\",\"Parent\",\"SubscriptionLevels\",\"arrayContains\",\"cx\",\"ge\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\");\n    b(\"function-extensions\");\n    var h = b(\"Arbiter\"), i = b(\"AsyncRequest\"), j = b(\"CSS\"), k = b(\"DOM\"), l = b(\"MenuDeprecated\"), m = b(\"Parent\"), n = b(\"SubscriptionLevels\"), o = b(\"arrayContains\"), p = b(\"cx\"), q = b(\"ge\"), r = 13, s = 45, t = [n.ALL,n.DEFAULT,n.TOP,], u = {\n    }, v = {\n    }, w = {\n    }, x = {\n    }, y = {\n    }, z = {\n    }, aa = {\n    }, ba = {\n    }, ca = {\n    }, da = {\n    }, ea = {\n    }, fa = \"/ajax/follow/follow_profile.php\", ga = \"/ajax/follow/unfollow_profile.php\", ha = \"/ajax/settings/notifications/notify_me.php\", ia = {\n    }, ja = {\n    }, ka = null, la = false;\n    function ma(jb) {\n        return o(t, jb);\n    };\n;\n    function na(jb, kb, lb, mb) {\n        var nb = ((m.byClass(mb, \"uiMenuItem\") || m.byClass(mb, \"_54ni\")));\n        if (((!nb || !k.contains(jb, nb)))) {\n            return;\n        }\n         else if (j.hasClass(nb, \"SubscribeMenuSubscribeCheckbox\")) {\n            if (w[kb]) {\n                qa(jb, kb);\n            }\n             else pa(jb, kb);\n        ;\n        ;\n            return false;\n        }\n         else if (j.hasClass(nb, \"SubscribeMenuUnsubscribe\")) {\n            qa(jb, kb);\n            return false;\n        }\n         else if (j.hasClass(nb, \"SubscribeMenuSettingsItem\")) {\n            db(jb, true);\n            return false;\n        }\n         else if (j.hasClass(nb, \"SubscriptionMenuGoBack\")) {\n            db(jb, false);\n            return false;\n        }\n         else if (j.hasClass(nb, \"SubscriptionMenuItem\")) {\n            oa(jb, kb, lb, nb);\n            return false;\n        }\n         else if (j.hasClass(nb, \"SubscribeMenuNotifyMeCheckbox\")) {\n            if (x[kb]) {\n                hb(jb, kb);\n            }\n             else gb(jb, kb);\n        ;\n        ;\n            return false;\n        }\n        \n        \n        \n        \n        \n        \n    ;\n    ;\n    };\n;\n    function oa(jb, kb, lb, mb) {\n        if (j.hasClass(mb, \"SubscriptionMenuLevel\")) {\n            if (l.isItemChecked(mb)) {\n                return;\n            }\n        ;\n        ;\n            bb(jb, kb, ua(mb), true, lb);\n        }\n         else if (j.hasClass(mb, \"SubscriptionMenuCategory\")) {\n            ya(kb, mb, !l.isItemChecked(mb), true, lb);\n        }\n         else if (j.hasClass(mb, \"SubscriptionAppStory\")) {\n            ab(kb, mb, !l.isItemChecked(mb), lb);\n        }\n        \n        \n    ;\n    ;\n    };\n;\n    function pa(jb, kb) {\n        var lb = {\n            profile_id: kb\n        };\n        h.inform(\"FollowingUser\", lb);\n        new i().setURI(fa).setMethod(\"POST\").setData({\n            profile_id: kb,\n            JSBNG__location: ra(jb)\n        }).setErrorHandler(h.inform.curry(\"FollowUserFail\", lb)).send();\n    };\n;\n    function qa(jb, kb) {\n        var lb = {\n            profile_id: kb\n        };\n        h.inform(\"UnfollowingUser\", lb);\n        new i().setURI(ga).setMethod(\"POST\").setData({\n            profile_id: kb,\n            JSBNG__location: ra(jb)\n        }).setErrorHandler(h.inform.curry(\"UnfollowUserFail\", lb)).send();\n    };\n;\n    function ra(jb) {\n        if (j.hasClass(jb, \"followButtonFlyout\")) {\n            return r;\n        }\n         else return s\n    ;\n    };\n;\n    function sa(jb, kb, lb) {\n        var mb = {\n            profile_id: jb,\n            level: ba[jb],\n            custom_categories: ca[jb],\n            JSBNG__location: lb\n        };\n        new i().setURI(\"/ajax/follow/manage_subscriptions.php\").setData(mb).send();\n    };\n;\n    function ta(jb, kb) {\n        var lb = ((ca[kb] || [])), mb = l.getItems(jb);\n        mb.forEach(function(nb) {\n            if (j.hasClass(nb, \"SubscriptionMenuCategory\")) {\n                var ob = ua(nb);\n                if (o(lb, ob)) {\n                    wa(nb);\n                }\n                 else xa(nb);\n            ;\n            ;\n            }\n             else if (j.hasClass(nb, \"SubscriptionAppStory\")) {\n                var pb = ua(nb);\n                if (((ja[kb] && ja[kb][pb]))) {\n                    wa(nb);\n                }\n                 else xa(nb);\n            ;\n            ;\n            }\n            \n        ;\n        ;\n        });\n        bb(jb, kb, ba[kb], false);\n    };\n;\n    function ua(jb) {\n        var kb = k.scry(jb, \"input\")[0];\n        return ((kb && kb.value));\n    };\n;\n    function va(jb) {\n        return k.JSBNG__find(jb, \"a.itemAnchor\");\n    };\n;\n    function wa(jb) {\n        j.addClass(jb, \"checked\");\n        va(jb).setAttribute(\"aria-checked\", true);\n    };\n;\n    function xa(jb) {\n        j.removeClass(jb, \"checked\");\n        va(jb).setAttribute(\"aria-checked\", false);\n    };\n;\n    function ya(jb, kb, lb, mb, nb) {\n        if (lb) {\n            wa(kb);\n        }\n         else xa(kb);\n    ;\n    ;\n        var ob = ua(kb);\n        if (ma(ob)) {\n            ((lb && za(jb, ob)));\n        }\n         else if (lb) {\n            if (!o(ca[jb], ob)) {\n                ca[jb].push(ob);\n            }\n        ;\n        ;\n        }\n         else {\n            var pb = ca[jb].indexOf(ob);\n            if (((pb !== -1))) {\n                ca[jb].splice(pb, 1);\n            }\n        ;\n        ;\n        }\n        \n    ;\n    ;\n        if (mb) {\n            sa(jb, ob, nb);\n        }\n    ;\n    ;\n    };\n;\n    function za(jb, kb) {\n        ba[jb] = kb;\n        h.inform(\"SubscriptionLevelUpdated\", {\n            profile_id: jb,\n            level: kb\n        });\n    };\n;\n    function ab(jb, kb, lb, mb) {\n        var nb = \"/ajax/feed/filter_action/\", ob = ua(kb), pb = {\n            actor_id: jb,\n            app_id: ob\n        };\n        if (lb) {\n            wa(kb);\n            nb += \"resubscribe_user_app/\";\n            pb.action = \"resubscribe_user_app\";\n            if (!ja[jb]) {\n                ja[jb] = {\n                };\n            }\n        ;\n        ;\n            ja[jb][ob] = true;\n        }\n         else {\n            xa(kb);\n            nb += \"unsubscribe_user_app_checkbox/\";\n            pb.action = \"unsubscribe_user_app_checkbox\";\n            if (ja[jb]) {\n                ja[jb][ob] = false;\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n        new i().setURI(nb).setData(pb).send();\n    };\n;\n    function bb(jb, kb, lb, mb, nb) {\n        var ob = k.scry(jb, \".SubscriptionMenuLevel\"), pb = null;\n        ob.forEach(function(qb) {\n            if (((ua(qb) == lb))) {\n                pb = qb;\n            }\n             else if (l.isItemChecked(qb)) {\n                ya(kb, qb, false, false);\n            }\n            \n        ;\n        ;\n        });\n        ((pb && ya(kb, pb, true, mb, nb)));\n    };\n;\n    function cb(jb, kb, lb) {\n        w[kb] = lb;\n        j.conditionClass(jb, \"isUnsubscribed\", !lb);\n        var mb = k.scry(jb, \"li.SubscribeMenuSubscribeCheckbox\");\n        if (((mb.length !== 0))) {\n            var nb = mb[0];\n            if (lb) {\n                wa(nb);\n            }\n             else xa(nb);\n        ;\n        ;\n        }\n    ;\n    ;\n    };\n;\n    function db(jb, kb) {\n        j.conditionClass(jb, \"subscriptionMenuOpen\", kb);\n    };\n;\n    function eb(jb, kb, lb) {\n        var mb = k.JSBNG__find(jb, \".FriendListSubscriptionsMenu\"), nb = k.JSBNG__find(mb, \".uiMenuInner\");\n        if (((ka != null))) {\n            ka.forEach(function(ob) {\n                nb.removeChild(ob);\n            });\n        }\n    ;\n    ;\n        lb.forEach(function(ob) {\n            nb.appendChild(ob);\n        });\n        ka = lb;\n    };\n;\n    h.subscribe(\"UnfollowUser\", function(jb, kb) {\n        if (da[kb.profile_id]) {\n            za(kb.profile_id, da[kb.profile_id]);\n            ca[kb.profile_id] = ea[kb.profile_id].slice();\n        }\n    ;\n    ;\n    });\n    h.subscribe(\"UpdateSubscriptionLevel\", function(jb, kb) {\n        var lb = ((kb.profile_id + \"\")), mb = ((kb.level + \"\"));\n        za(lb, mb);\n        var nb;\n        {\n            var fin270keys = ((window.top.JSBNG_Replay.forInKeys)((u))), fin270i = (0);\n            (0);\n            for (; (fin270i < fin270keys.length); (fin270i++)) {\n                ((nb) = (fin270keys[fin270i]));\n                {\n                    if (((u[nb] === lb))) {\n                        var ob = q(nb);\n                        ((ob && bb(ob, lb, mb, false)));\n                    }\n                ;\n                ;\n                };\n            };\n        };\n    ;\n    });\n    function fb(jb, kb, lb) {\n        x[kb] = lb;\n        var mb = ((z[kb] && !la)), nb = k.scry(jb, \"li.SubscribeMenuNotifyMeCheckbox\");\n        if (((nb.length !== 0))) {\n            var ob = nb[0];\n            j.conditionShow(ob, !mb);\n            j.conditionShow(k.JSBNG__find(jb, \"li.SubscribeMenuNotifyMeCheckboxSeparator\"), !mb);\n            if (lb) {\n                wa(ob);\n            }\n             else xa(ob);\n        ;\n        ;\n        }\n    ;\n    ;\n    };\n;\n    function gb(jb, kb) {\n        var lb = {\n            profile_id: kb\n        };\n        h.inform(\"EnableNotifsForUser\", lb);\n        new i().setURI(ha).setMethod(\"POST\").setData({\n            notifier_id: kb,\n            enable: true\n        }).setErrorHandler(h.inform.curry(\"EnableNotifsForUserFail\", lb)).send();\n    };\n;\n    function hb(jb, kb) {\n        var lb = {\n            profile_id: kb\n        };\n        h.inform(\"DisableNotifsForUser\", lb);\n        new i().setURI(ha).setMethod(\"POST\").setData({\n            notifier_id: kb,\n            enable: false\n        }).setErrorHandler(h.inform.curry(\"DisableNotifsForUserFail\", lb)).send();\n    };\n;\n    var ib = {\n        init: function(jb, kb, lb) {\n            var mb = k.getID(jb);\n            if (!u[mb]) {\n                g.listen(jb, \"click\", function(nb) {\n                    return na(jb, u[mb], lb, nb.getTarget());\n                });\n            }\n        ;\n        ;\n            if (((((lb === s)) && ia[kb].length))) {\n                eb(jb, kb, ia[kb]);\n            }\n        ;\n        ;\n            if (ba[kb]) {\n                ta(jb, kb);\n            }\n        ;\n        ;\n            u[mb] = kb;\n            j.conditionClass(jb, \"NonFriendSubscriptionMenu\", !v[kb]);\n            j.conditionClass(jb, \"cannotSubscribe\", !y[kb]);\n            j.conditionClass(jb, \"noSubscriptionLevels\", ((z[kb] && !aa[kb])));\n            j.conditionClass(jb, \"noSubscribeCheckbox\", ((!v[kb] && !z[kb])));\n            cb(jb, kb, w[kb]);\n            fb(jb, kb, x[kb]);\n            h.subscribe([\"FollowUser\",\"FollowingUser\",\"UnfollowUserFail\",], function(nb, ob) {\n                cb(jb, kb, true);\n            }.bind(this));\n            h.subscribe([\"UnfollowUser\",\"UnfollowingUser\",\"FollowUserFail\",], function(nb, ob) {\n                h.inform(\"SubMenu/Reset\");\n                cb(jb, kb, false);\n            }.bind(this));\n            h.subscribe([\"EnableNotifsForUser\",\"DisableNotifsForUserFail\",], function(nb, ob) {\n                fb(jb, kb, true);\n            }.bind(this));\n            h.subscribe([\"DisableNotifsForUser\",\"EnableNotifsForUserFail\",], function(nb, ob) {\n                fb(jb, kb, false);\n            }.bind(this));\n            h.subscribe(\"listeditor/friend_lists_changed\", function(nb, ob) {\n                if (ob.notify_state) {\n                    var pb = ((ob.added_uid ? ob.added_uid : ob.removed_uid));\n                    fb(jb, pb, ob.notify_state.is_notified);\n                }\n            ;\n            ;\n            }.bind(this));\n            db(jb, false);\n        },\n        getSubscriptions: function(jb) {\n            return {\n                level: ba[jb],\n                custom_categories: ca[jb]\n            };\n        },\n        setSubscriptions: function(jb, kb, lb, mb, nb, ob, pb, qb, rb, sb, tb, ub, vb) {\n            za(jb, ((pb + \"\")));\n            v[jb] = kb;\n            w[jb] = lb;\n            y[jb] = mb;\n            z[jb] = nb;\n            aa[jb] = ob;\n            da[jb] = ((rb + \"\"));\n            ca[jb] = qb.map(String);\n            ea[jb] = sb.map(String);\n            ia[jb] = vb;\n            x[jb] = tb;\n            la = ub;\n        }\n    };\n    e.exports = ((a.EditSubscriptions || ib));\n});\n__d(\"DynamicFriendListEducation\", [\"JSBNG__Event\",\"Arbiter\",\"AsyncRequest\",\"Dialog\",\"PageTransitions\",\"arrayContains\",\"createArrayFrom\",\"removeFromArray\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"Arbiter\"), i = b(\"AsyncRequest\"), j = b(\"Dialog\"), k = b(\"PageTransitions\"), l = b(\"arrayContains\"), m = b(\"createArrayFrom\"), n = b(\"removeFromArray\"), o, p, q, r, s, t;\n    function u() {\n        ((q && q.hide()));\n        ((r && r.hide()));\n    };\n;\n    function v(y) {\n        n(p, y);\n        u();\n        s({\n            accept_tag_education: true\n        });\n    };\n;\n    function w() {\n        u();\n        s({\n            nux_cancel: true\n        });\n    };\n;\n    var x = {\n        init: function(y, z) {\n            o = y;\n            p = m(z).map(String);\n            k.registerHandler(function() {\n                u();\n                o = false;\n                s = undefined;\n                p = [];\n            });\n        },\n        showDialog: function(y, z, aa) {\n            if (((o && l(p, y)))) {\n                u();\n                h.inform(\"DynamicFriendListEducation/dialogOpen\", {\n                    uid: z,\n                    flid: y\n                });\n                s = aa;\n                q = new j().setAsync(new i(\"/ajax/friends/lists/smart_list_education.php\").setMethod(\"GET\").setData({\n                    flid: y,\n                    uid: z\n                }).setReadOnly(true)).setHandler(v.bind(this, y)).setCloseHandler(function() {\n                    h.inform(\"DynamicFriendListEducation/dialogClosed\", {\n                        uid: z,\n                        flid: y\n                    });\n                }).setCancelHandler(function() {\n                    h.inform(\"DynamicFriendListEducation/dialogCancel\", {\n                        uid: z,\n                        flid: y\n                    });\n                }).show();\n            }\n             else aa();\n        ;\n        ;\n        },\n        showContextualDialog: function(y, z, aa, ba) {\n            if (((o && l(p, y)))) {\n                u();\n                t = aa;\n                s = ba;\n                new i(\"/ajax/friends/lists/smart_list_contextual_education.php\").setMethod(\"GET\").setData({\n                    flid: y,\n                    uid: z\n                }).setReadOnly(true).send();\n            }\n             else ba();\n        ;\n        ;\n        },\n        setContextualDialog: function(y, z, aa, ba) {\n            r = y;\n            r.setContext(t);\n            r.show();\n            g.listen(z, \"click\", v.bind(this, ba));\n            g.listen(aa, \"click\", w);\n        }\n    };\n    e.exports = x;\n});\n__d(\"FriendStatus\", [\"function-extensions\",\"Arbiter\",\"AsyncRequest\",\"arrayContains\",\"copyProperties\",\"createArrayFrom\",\"eachKeyVal\",], function(a, b, c, d, e, f) {\n    b(\"function-extensions\");\n    var g = b(\"Arbiter\"), h = b(\"AsyncRequest\"), i = b(\"arrayContains\"), j = b(\"copyProperties\"), k = b(\"createArrayFrom\"), l = b(\"eachKeyVal\");\n    function m(q, r, s) {\n        this.id = q;\n        this.update(r, s);\n    };\n;\n    j(m.prototype, {\n        update: function(q, r) {\n            ((q && (this.JSBNG__status = q)));\n            if (r) {\n                this.lists = k(r).map(String);\n                this._informListChange();\n            }\n        ;\n        ;\n        },\n        isComplete: function() {\n            return !!this.lists;\n        },\n        addToList: function(q) {\n            if (((this.lists && !i(this.lists, q)))) {\n                this.lists.push(q);\n            }\n        ;\n        ;\n            this._informListChange();\n        },\n        removeFromList: function(q) {\n            if (this.lists) {\n                var r = this.lists.indexOf(q);\n                ((((r !== -1)) && this.lists.splice(r, 1)));\n            }\n        ;\n        ;\n            this._informListChange();\n        },\n        updateList: function(q, r) {\n            ((r ? this.addToList(q) : this.removeFromList(q)));\n        },\n        _informListChange: function() {\n            g.inform(\"FriendListMembershipChange\", {\n                uid: this.id,\n                lists: this.lists\n            });\n        }\n    });\n    j(m, {\n        ARE_FRIENDS: 1,\n        INCOMING_REQUEST: 2,\n        OUTGOING_REQUEST: 3,\n        CAN_REQUEST: 4\n    });\n    var n = {\n    }, o = {\n    };\n    function p(q, r, s) {\n        if (!n[s.uid]) {\n            n[s.uid] = new m(s.uid, q);\n        }\n         else n[s.uid].update(q);\n    ;\n    ;\n        g.inform(\"FriendRequest/change\", {\n            uid: s.uid,\n            JSBNG__status: q\n        });\n    };\n;\n    g.subscribe([\"FriendRequest/cancel\",\"FriendRequest/unfriend\",\"FriendRequest/sendFail\",], p.curry(m.CAN_REQUEST));\n    g.subscribe([\"FriendRequest/confirmFail\",], p.curry(m.INCOMING_REQUEST));\n    g.subscribe([\"FriendRequest/cancelFail\",\"FriendRequest/sent\",\"FriendRequest/sending\",], p.curry(m.OUTGOING_REQUEST));\n    g.subscribe([\"FriendRequest/confirm\",\"FriendRequest/confirming\",], p.curry(m.ARE_FRIENDS));\n    j(m, {\n        CLOSE_FRIENDS: null,\n        ACQUAINTANCES: null,\n        getFriend: function(q, r) {\n            if (((n[q] && n[q].isComplete()))) {\n                r(n[q]);\n            }\n             else if (o[q]) {\n                o[q].push(r);\n            }\n             else {\n                o[q] = [r,];\n                new h().setURI(\"/ajax/friends/status.php\").setData({\n                    friend: q\n                }).setHandler(function(s) {\n                    var t = s.getPayload();\n                    m.initFriend.bind(m, q, t.JSBNG__status, t.lists).defer();\n                }).send();\n            }\n            \n        ;\n        ;\n        },\n        initFriend: function(q, r, s) {\n            var t = ((n[q] || new m(q)));\n            t.update(((t.JSBNG__status || r)), ((t.lists || s)));\n            n[q] = t;\n            ((o[q] && o[q].forEach(function(u) {\n                u(t);\n            })));\n            o[q] = null;\n        },\n        setSpecialLists: function(q) {\n            var r = ((m.CLOSE_FRIENDS === null));\n            m.CLOSE_FRIENDS = ((q.close + \"\"));\n            m.ACQUAINTANCES = ((q.acq + \"\"));\n            if (r) {\n                l(n, function(s, t) {\n                    t._informListChange();\n                });\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = m;\n});\n__d(\"FriendEditLists\", [\"Arbiter\",\"AsyncRequest\",\"CSS\",\"DOMQuery\",\"DynamicFriendListEducation\",\"EditSubscriptions\",\"FriendStatus\",\"MenuDeprecated\",\"Parent\",\"ScrollableArea\",\"URI\",\"$\",\"arrayContains\",\"copyProperties\",\"ge\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"AsyncRequest\"), i = b(\"CSS\"), j = b(\"DOMQuery\"), k = b(\"DynamicFriendListEducation\"), l = b(\"EditSubscriptions\"), m = b(\"FriendStatus\"), n = b(\"MenuDeprecated\"), o = b(\"Parent\"), p = b(\"ScrollableArea\"), q = b(\"URI\"), r = b(\"$\"), s = b(\"arrayContains\"), t = b(\"copyProperties\"), u = b(\"ge\"), v = 5, w = {\n    }, x = \"/ajax/profile/removefriendconfirm.php\", y = \"/ajax/friends/requests/cancel.php\", z = \"/ajax/choose/\", aa = \"/profile.php\", ba = \"/ajax/report/social.php\", ca, da;\n    function ea(pa, qa, ra) {\n        var sa = w[pa.id], ta = function(ua) {\n            var va = {\n                action: ((ra ? \"add_list\" : \"del_list\")),\n                to_friend: sa.id,\n                friendlists: [qa,],\n                source: ca\n            };\n            if (ua) {\n                t(va, ua);\n            }\n        ;\n        ;\n            sa.updateList(qa, ra);\n            var wa;\n            if (((ra && ((qa == m.CLOSE_FRIENDS))))) {\n                wa = ha(pa, m.ACQUAINTANCES);\n                if (n.isItemChecked(wa)) {\n                    n.toggleItem(wa);\n                    ea(pa, m.ACQUAINTANCES, false);\n                }\n            ;\n            ;\n            }\n             else if (((ra && ((qa == m.ACQUAINTANCES))))) {\n                wa = ha(pa, m.CLOSE_FRIENDS);\n                if (n.isItemChecked(wa)) {\n                    n.toggleItem(wa);\n                    ea(pa, m.CLOSE_FRIENDS, false);\n                }\n            ;\n            ;\n            }\n            \n        ;\n        ;\n            var xa = {\n                flid: qa,\n                uid: sa.id\n            }, ya = ((ra ? \"FriendListHovercard/add\" : \"FriendListHovercard/remove\"));\n            g.inform(ya, xa);\n            new h().setURI(\"/ajax/add_friend/action.php\").setData(va).send();\n        };\n        if (ra) {\n            k.showDialog(qa, sa.id, ta);\n        }\n         else ta();\n    ;\n    ;\n    };\n;\n    function fa(pa) {\n        var qa = j.scry(pa, \"input\")[0];\n        return ((qa && qa.value));\n    };\n;\n    function ga(pa, qa, ra) {\n        var sa = {\n            uid: qa.id\n        };\n        new h().setURI(y).setMethod(\"POST\").setData({\n            friend: qa.id\n        }).setHandler(g.inform.bind(g, \"FriendRequest/cancel\", sa)).setErrorHandler(g.inform.bind(g, \"FriendRequest/cancelFail\", sa)).setStatusElement(ra).send();\n    };\n;\n    function ha(pa, qa) {\n        var ra = n.getItems(pa);\n        for (var sa = 0; ((sa < ra.length)); sa++) {\n            if (((fa(ra[sa]) == qa))) {\n                return ra[sa];\n            }\n        ;\n        ;\n        };\n    ;\n        return null;\n    };\n;\n    function ia(pa, qa) {\n        var ra = n.getItems(pa);\n        ra.forEach(function(sa) {\n            var ta = fa(sa), ua = s(qa.lists, ta);\n            if (((n.isItemChecked(sa) !== ua))) {\n                n.toggleItem(sa);\n            }\n        ;\n        ;\n        });\n    };\n;\n    function ja(pa) {\n        var qa = n.getItems(pa), ra = ((!i.hasClass(pa, \"followButtonFlyout\") && !i.hasClass(pa, \"likeButtonFlyout\"))), sa = [], ta = [], ua = 0, va = 0;\n        qa.forEach(function(ab) {\n            if (i.hasClass(ab, \"neverHide\")) {\n                i.removeClass(ab, \"underShowMore\");\n                ua++;\n            }\n             else if (n.isItemChecked(ab)) {\n                sa.push(ab);\n            }\n             else if (((((i.hasClass(ab, \"neverShow\") || i.hasClass(ab, \"FriendListCreateTrigger\"))) || ((!ra && i.hasClass(ab, \"friendOptionsOnly\")))))) {\n                i.addClass(ab, \"underShowMore\");\n                va++;\n            }\n             else ta.push(ab);\n            \n            \n        ;\n        ;\n        });\n        var wa = ((v - ua)), xa = sa.concat(ta), ya = va;\n        xa.forEach(function(ab) {\n            if (i.hasClass(ab, \"ShowMoreItem\")) {\n                wa--;\n                return;\n            }\n        ;\n        ;\n            if (wa) {\n                i.removeClass(ab, \"underShowMore\");\n                wa--;\n            }\n             else {\n                i.addClass(ab, \"underShowMore\");\n                ya = true;\n            }\n        ;\n        ;\n        });\n        i.conditionClass(pa, \"hasMoreFriendListItems\", ya);\n        var za = j.scry(pa, \".FriendListMenuShowMore\");\n        za.forEach(function(ab) {\n            i.removeClass(ab, \"FriendListMenuShowMore\");\n        });\n    };\n;\n    function ka(pa, qa) {\n        i.conditionClass(pa, \"FriendListMemorializedUser\", qa);\n    };\n;\n    function la(pa, qa) {\n        i.conditionClass(pa, \"FriendListCannotSuggestFriends\", !qa);\n    };\n;\n    function ma(pa, qa) {\n        var ra = j.scry(pa, \".FriendListUnfriend\")[0], sa = j.scry(pa, \".FriendListCancel\")[0], ta = j.scry(pa, \".FriendListSuggestFriends\")[0], ua = j.scry(pa, \".FriendListFriendship\")[0], va = j.scry(pa, \".FriendListReportBlock\")[0];\n        if (sa) {\n            i.conditionShow(sa, ((qa.JSBNG__status == m.OUTGOING_REQUEST)));\n        }\n    ;\n    ;\n        if (ra) {\n            i.conditionShow(ra, ((qa.JSBNG__status == m.ARE_FRIENDS)));\n            var wa = j.JSBNG__find(ra, \"a\");\n            wa.setAttribute(\"ajaxify\", q(x).addQueryData({\n                uid: qa.id,\n                unref: da\n            }).toString());\n        }\n         else i.conditionClass(pa, \"NoFriendListActionSeparator\", ((!sa || ((qa.JSBNG__status != m.OUTGOING_REQUEST)))));\n    ;\n    ;\n        if (ta) {\n            j.JSBNG__find(ta, \"a\").setAttribute(\"href\", q(z).addQueryData({\n                type: \"suggest_friends\",\n                newcomer: qa.id,\n                ref: \"profile_others_dropdown\"\n            }).toString());\n        }\n    ;\n    ;\n        if (ua) {\n            i.conditionShow(ua, ((qa.JSBNG__status == m.ARE_FRIENDS)));\n            j.JSBNG__find(ua, \"a\").setAttribute(\"href\", q(aa).addQueryData({\n                and: qa.id\n            }).toString());\n        }\n    ;\n    ;\n        if (va) {\n            j.JSBNG__find(va, \"a\").setAttribute(\"ajaxify\", q(ba).addQueryData({\n                content_type: 0,\n                cid: qa.id,\n                rid: qa.id\n            }).toString());\n        }\n    ;\n    ;\n    };\n;\n    function na(pa, qa) {\n        var ra = j.scry(pa, \"div.FriendListSubscriptionsMenu\");\n        if (((ra.length !== 0))) {\n            l.init(pa, qa, 45);\n        }\n    ;\n    ;\n    };\n;\n    g.subscribe(\"FriendRequest/change\", function(pa, qa) {\n        {\n            var fin271keys = ((window.top.JSBNG_Replay.forInKeys)((w))), fin271i = (0);\n            var ra;\n            for (; (fin271i < fin271keys.length); (fin271i++)) {\n                ((ra) = (fin271keys[fin271i]));\n                {\n                    var sa = u(ra), ta = w[ra];\n                    if (((((sa && ta)) && ((ta.id == qa.uid))))) {\n                        ia(sa, ta);\n                        ma(sa, ta);\n                        ja(sa);\n                    }\n                ;\n                ;\n                };\n            };\n        };\n    ;\n    });\n    n.subscribe(\"select\", function(pa, qa) {\n        if (((i.hasClass(qa.item, \"ShowMoreItem\") && i.hasClass(qa.menu, \"FriendListMenu\")))) {\n            i.addClass(qa.menu, \"FriendListMenuShowMore\");\n            p.poke(qa.item);\n        }\n    ;\n    ;\n    });\n    var oa = {\n        init: function(pa, qa, ra, sa, ta, ua) {\n            pa = r(pa);\n            ca = ra;\n            da = ua;\n            if (!w[pa.id]) {\n                n.subscribe(\"select\", function(va, wa) {\n                    if (j.contains(pa, wa.item)) {\n                        if (o.byClass(wa.item, \"FriendListItem\")) {\n                            n.toggleItem(wa.item);\n                            var xa = fa(wa.item);\n                            ea(pa, xa, n.isItemChecked(wa.item));\n                        }\n                         else if (o.byClass(wa.item, \"FriendListCancel\")) {\n                            ga(pa, w[pa.id], wa.item);\n                        }\n                         else if (o.byClass(wa.item, \"FriendListUnfriend\")) {\n                            g.inform(\"FriendEditLists/unfriend\");\n                        }\n                        \n                        \n                    ;\n                    }\n                ;\n                ;\n                });\n            }\n        ;\n        ;\n            i.addClass(pa, \"async_saving\");\n            m.getFriend(qa, function(va) {\n                ka(pa, sa);\n                la(pa, ta);\n                ia(pa, va);\n                ma(pa, va);\n                w[pa.id] = va;\n                ja(pa);\n                na(pa, qa);\n                i.removeClass(pa, \"async_saving\");\n            }.bind(this));\n        }\n    };\n    e.exports = ((a.FriendEditLists || oa));\n});\n__d(\"FriendListFlyoutController\", [\"JSBNG__Event\",\"Arbiter\",\"AsyncRequest\",\"Button\",\"ContextualLayer\",\"CSS\",\"DataStore\",\"Dialog\",\"DOM\",\"DOMQuery\",\"FriendEditLists\",\"FriendStatus\",\"Keys\",\"Layer\",\"LayerHideOnEscape\",\"LayerTabIsolation\",\"MenuDeprecated\",\"Parent\",\"ScrollableArea\",\"Style\",\"TabbableElements\",\"UserAgent\",\"cx\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"Arbiter\"), i = b(\"AsyncRequest\"), j = b(\"Button\"), k = b(\"ContextualLayer\"), l = b(\"CSS\"), m = b(\"DataStore\"), n = b(\"Dialog\"), o = b(\"DOM\"), p = b(\"DOMQuery\"), q = b(\"FriendEditLists\"), r = b(\"FriendStatus\"), s = b(\"Keys\"), t = b(\"Layer\"), u = b(\"LayerHideOnEscape\"), v = b(\"LayerTabIsolation\"), w = b(\"MenuDeprecated\"), x = b(\"Parent\"), y = b(\"ScrollableArea\"), z = b(\"Style\"), aa = b(\"TabbableElements\"), ba = b(\"UserAgent\"), ca = b(\"cx\"), da = b(\"emptyFunction\"), ea, fa, ga = null, ha = null, ia, ja, ka, la, ma, na, oa = 1500, pa, qa = [\"uiButtonConfirm\",\"uiButtonSpecial\",\"_42gz\",\"_42g-\",\"_4jy2\",\"_51tl\",\"_4jy1\",], ra = {\n        init: function(tb, ub) {\n            ra.init = da;\n            ea = tb;\n            ea.subscribe(\"mouseenter\", ab);\n            ea.subscribe(\"mouseleave\", ob);\n            ea.subscribe(\"hide\", cb);\n            ea.enableBehavior(v);\n            ea.enableBehavior(u);\n            pa = ub;\n            if (ga) {\n                o.setContent(ea.getContent(), [ga,ha,]);\n            }\n        ;\n        ;\n            var vb = function(wb) {\n                var xb = x.byClass(wb.getTarget(), \"enableFriendListFlyout\");\n                if (xb) {\n                    if (((ia === xb))) {\n                        JSBNG__clearTimeout(la);\n                    }\n                     else {\n                        ((fa && qb()));\n                        nb(xb);\n                    }\n                ;\n                }\n            ;\n            ;\n            };\n            g.listen(JSBNG__document.documentElement, {\n                mouseover: vb,\n                click: vb,\n                keydown: function(JSBNG__event) {\n                    var wb = JSBNG__event.getTarget();\n                    if (JSBNG__event.getModifiers().any) {\n                        return;\n                    }\n                ;\n                ;\n                    if (((!fa || p.isNodeOfType(wb, [\"input\",\"textarea\",])))) {\n                        return;\n                    }\n                ;\n                ;\n                    var xb = g.getKeyCode(JSBNG__event), yb;\n                    switch (xb) {\n                      case s.UP:\n                    \n                      case s.DOWN:\n                        var zb = za();\n                        yb = xa(zb);\n                        va(zb[((yb + ((((xb === s.UP)) ? -1 : 1))))]);\n                        return false;\n                      case s.SPACE:\n                        var ac = wa(wb);\n                        if (ac) {\n                            sa(ac);\n                            JSBNG__event.prevent();\n                        }\n                    ;\n                    ;\n                        break;\n                      default:\n                        var bc = String.fromCharCode(xb).toLowerCase(), cc = za();\n                        yb = xa(cc);\n                        var dc = yb, ec = cc.length;\n                        while (((((~yb && (((dc = ((++dc % ec))) !== yb)))) || ((!~yb && ((++dc < ec))))))) {\n                            var fc = w.getItemLabel(cc[dc]);\n                            if (((fc && ((fc.charAt(0).toLowerCase() === bc))))) {\n                                va(cc[dc]);\n                                return false;\n                            }\n                        ;\n                        ;\n                        };\n                    ;\n                    };\n                ;\n                }\n            });\n            h.subscribe(\"FriendEditLists/unfriend\", qb);\n            h.subscribe(\"DynamicFriendListEducation/dialogOpen\", function() {\n                na = true;\n            });\n            h.subscribe(\"DynamicFriendListEducation/dialogClosed\", function() {\n                na = false;\n                ob();\n            });\n        },\n        initContent: function(tb) {\n            o.appendContent(JSBNG__document.body, tb);\n            db(tb);\n            (function() {\n                if (!ga) {\n                    ga = tb;\n                    ((ea && o.setContent(ea.getContent(), [ga,ha,])));\n                    l.show(ga);\n                    g.listen(ga, \"click\", rb);\n                    ((fa && kb(ia)));\n                }\n                 else {\n                    o.remove(tb);\n                    tb = null;\n                }\n            ;\n            ;\n            }).defer();\n        },\n        initNux: function(tb) {\n            if (ha) {\n                return;\n            }\n        ;\n        ;\n            ha = tb;\n            ((ea && o.setContent(ea.getContent(), [ga,ha,])));\n        },\n        show: function(tb) {\n            lb(tb);\n        },\n        hide: function(tb) {\n            ((((tb === false)) ? qb() : ob()));\n        },\n        setActiveNode: function(tb) {\n            ((fa && qb()));\n            ia = tb;\n            ja = g.listen(tb, \"mouseleave\", function() {\n                ia = null;\n                ((ja && ja.remove()));\n            });\n        },\n        setCloseListener: function(tb, ub) {\n            m.set(tb, \"flfcloselistener\", ub);\n            if (((ia != tb))) {\n                m.set(tb, \"flfcloselistenertimeout\", sb.curry(tb).defer(oa));\n            }\n        ;\n        ;\n        },\n        setCloseListenerTimeout: function(tb) {\n            oa = tb;\n        }\n    };\n    function sa(tb) {\n        ((ba.firefox() && ua(tb).JSBNG__blur()));\n        w.inform(\"select\", {\n            menu: ta(tb),\n            item: tb\n        });\n    };\n;\n    function ta(tb) {\n        if (l.hasClass(tb, \"uiMenuContainer\")) {\n            return tb;\n        }\n    ;\n    ;\n        return x.byClass(tb, \"uiMenu\");\n    };\n;\n    function ua(tb) {\n        return p.JSBNG__find(tb, \"a.itemAnchor\");\n    };\n;\n    function va(tb) {\n        if (((tb && ya(tb)))) {\n            w._removeSelected(ea.getContent());\n            l.addClass(tb, \"selected\");\n            ua(tb).JSBNG__focus();\n        }\n    ;\n    ;\n    };\n;\n    function wa(tb) {\n        return x.byClass(tb, \"uiMenuItem\");\n    };\n;\n    function xa(tb) {\n        if (JSBNG__document.activeElement) {\n            var ub = wa(JSBNG__document.activeElement);\n            return tb.indexOf(ub);\n        }\n    ;\n    ;\n        return -1;\n    };\n;\n    function ya(tb) {\n        return ((((!l.hasClass(tb, \"disabled\") && ((z.get(tb, \"display\") !== \"none\")))) && ((z.get(x.byClass(tb, \"uiMenu\"), \"display\") !== \"none\"))));\n    };\n;\n    function za() {\n        return w.getItems(ea.getContent()).filter(ya);\n    };\n;\n    function ab() {\n        JSBNG__clearTimeout(la);\n    };\n;\n    function bb(tb) {\n        for (var ub = 0; ((ub < qa.length)); ub++) {\n            if (l.hasClass(tb, qa[ub])) {\n                return false;\n            }\n        ;\n        ;\n        };\n    ;\n        return true;\n    };\n;\n    function cb() {\n        if (ia) {\n            if (bb(ia)) {\n                l.removeClass(ia, \"_52nd\");\n                if (((l.hasClass(ia, \"uiButton\") || l.hasClass(ia, \"_42fu\")))) {\n                    l.removeClass(ia, \"selected\");\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            if (m.get(ia, \"flfcloselistener\")) {\n                var tb = ia;\n                m.set(ia, \"flfcloselistenertimeout\", sb.curry(tb).defer(oa));\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n        fa = false;\n        jb();\n        ia = null;\n    };\n;\n    function db(tb) {\n        var ub = p.scry(tb, \"[tabindex=\\\"0\\\"]\");\n        ub.forEach(function(vb) {\n            vb.tabIndex = \"-1\";\n        });\n        ((ub[0] && (ub[0].tabIndex = \"0\")));\n    };\n;\n    function eb(tb) {\n        if (((p.isNodeOfType(tb, \"label\") && l.hasClass(tb, \"uiButton\")))) {\n            tb = j.getInputElement(tb);\n        }\n    ;\n    ;\n        return tb;\n    };\n;\n    function fb(tb) {\n        return m.get(eb(tb), \"profileid\");\n    };\n;\n    function gb(tb) {\n        return ((m.get(eb(tb), \"memorialized\") === \"true\"));\n    };\n;\n    function hb(tb) {\n        return ((m.get(eb(tb), \"cansuggestfriends\") === \"true\"));\n    };\n;\n    function ib(tb) {\n        return m.get(eb(tb), \"unref\");\n    };\n;\n    function jb() {\n        ((ja && ja.remove()));\n        ja = null;\n        ((ma && t.unsubscribe(ma)));\n        ma = null;\n        ((la && JSBNG__clearTimeout(la)));\n        la = null;\n    };\n;\n    function kb(tb) {\n        var ub = fb(tb), vb = gb(tb), wb = hb(tb), xb = m.get(tb, \"flloc\"), yb = ib(tb);\n        q.init(ga, ub, xb, vb, wb, yb);\n        l.conditionClass(ga, \"followButtonFlyout\", l.hasClass(tb, \"profileFollowButton\"));\n        l.conditionClass(ga, \"friendButtonFlyout\", ((((l.hasClass(tb, \"FriendRequestFriends\") || l.hasClass(tb, \"FriendRequestIncoming\"))) || l.hasClass(tb, \"FriendRequestOutgoing\"))));\n        l.conditionClass(ga, \"likeButtonFlyout\", l.hasClass(tb, \"profileLikeButton\"));\n        var zb = p.scry(ga, \"div.uiScrollableArea\")[0];\n        ((zb && y.poke(zb)));\n        var ac = aa.JSBNG__find(ga)[0];\n        ((ac && ac.JSBNG__focus()));\n    };\n;\n    function lb(tb) {\n        if (((!ea || fa))) {\n            return;\n        }\n    ;\n    ;\n        ea.setContext(tb);\n        ea.setCausalElement(tb);\n        tb.setAttribute(\"aria-expanded\", \"true\");\n        if (bb(tb)) {\n            l.addClass(tb, \"_52nd\");\n            if (((l.hasClass(tb, \"uiButton\") || l.hasClass(tb, \"_42fu\")))) {\n                l.addClass(tb, \"selected\");\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n        ea.show();\n        ia = tb;\n        fa = true;\n        var ub = null;\n        if (ga) {\n            ub = \"show\";\n            kb(tb);\n        }\n         else {\n            ub = \"init_show\";\n            new i().setURI(\"/ajax/friends/lists/flyout_content.php\").setStatusElement(ea.getContent()).send();\n        }\n    ;\n    ;\n        jb();\n        ja = g.listen(tb, \"mouseleave\", ob);\n        ma = t.subscribe(\"show\", mb);\n        if (m.get(tb, \"flfcloselistener\")) {\n            JSBNG__clearTimeout(m.remove(tb, \"flfcloselistenertimeout\"));\n        }\n    ;\n    ;\n        var vb = fb(tb);\n        r.getFriend(vb, function(wb) {\n            if (((wb.JSBNG__status == r.ARE_FRIENDS))) {\n                new i().setURI(\"/ajax/friends/lists/flyout_log.php\").setData({\n                    target_id: fb(tb),\n                    unref: ib(tb),\n                    action: ub\n                }).send();\n            }\n        ;\n        ;\n            if (!ha) {\n                return;\n            }\n        ;\n        ;\n            if (((wb.JSBNG__status == r.OUTGOING_REQUEST))) {\n                l.show(ha);\n                i.bootstrap(\"/ajax/friends/lists/nux_flyout.php\", null, true);\n            }\n             else l.hide(ha);\n        ;\n        ;\n        });\n    };\n;\n    function mb(tb, ub) {\n        if (((!((ub instanceof k)) || !p.contains(ia, ub.getContext())))) {\n            ob();\n        }\n    ;\n    ;\n    };\n;\n    function nb(tb) {\n        ia = tb;\n        ka = lb.curry(tb).defer(pa);\n        ja = g.listen(tb, \"mouseleave\", function() {\n            JSBNG__clearTimeout(ka);\n            ia = null;\n            ((ja && ja.remove()));\n        });\n    };\n;\n    function ob() {\n        la = qb.defer(150);\n    };\n;\n    function pb() {\n        var tb = n.getCurrent(), ub = ((tb && tb.getBody()));\n        return !!((ub && p.scry(ub, \".friendListDialogTourCarousel\")[0]));\n    };\n;\n    function qb() {\n        if (((na || pb()))) {\n            return;\n        }\n    ;\n    ;\n        ((((ba.ie() < 8)) && JSBNG__document.documentElement.JSBNG__focus()));\n        if (ea) {\n            ea.hide();\n            var tb = ea.getCausalElement();\n            ((tb && tb.setAttribute(\"aria-expanded\", \"false\")));\n        }\n    ;\n    ;\n    };\n;\n    function rb(JSBNG__event) {\n        var tb = x.byTag(JSBNG__event.getTarget(), \"a\");\n        if (((tb && l.hasClass(tb, \"FriendListActionItem\")))) {\n            ob();\n        }\n    ;\n    ;\n    };\n;\n    function sb(tb) {\n        var ub = m.remove(tb, \"flfcloselistener\");\n        ((ub && ub()));\n    };\n;\n    e.exports = ((a.FriendListFlyoutController || ra));\n});\n__d(\"AddFriendButton\", [\"JSBNG__Event\",\"Animation\",\"Arbiter\",\"AsyncRequest\",\"AsyncResponse\",\"collectDataAttributes\",\"CSS\",\"DOMQuery\",\"FriendListFlyoutController\",\"FriendStatus\",\"ge\",\"goURI\",\"Style\",\"URI\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"Animation\"), i = b(\"Arbiter\"), j = b(\"AsyncRequest\"), k = b(\"AsyncResponse\"), l = b(\"collectDataAttributes\"), m = b(\"CSS\"), n = b(\"DOMQuery\"), o = b(\"FriendListFlyoutController\"), p = b(\"FriendStatus\"), q = b(\"ge\"), r = b(\"goURI\"), s = b(\"Style\"), t = b(\"URI\"), u = {\n        ERROR_ALREADY_ADDED: 1431005,\n        init: function(v, w, x, y, z, aa, ba, ca, da, ea, fa, ga) {\n            var ha = v.id, ia = null, ja = n.scry(v, \".addButton\")[0], ka = n.scry(v, \".addFriendText\")[0], la = n.scry(v, \".outgoingButton\")[0], ma = n.scry(v, \".incomingButton\")[0], na = n.scry(v, \".friendButton\")[0];\n            function oa(ua, va, wa) {\n                var xa = new t(ja.getAttribute(\"ajaxify\")), ya = l(v, [\"ft\",\"gt\",]);\n                new j().setURI(aa).setData({\n                    to_friend: w,\n                    action: ua,\n                    how_found: y,\n                    ref_param: z,\n                    link_data: ya,\n                    outgoing_id: la.id,\n                    xids: xa.getQueryData().xids,\n                    logging_location: ba,\n                    no_flyout_on_click: ca,\n                    ego_log_data: da,\n                    http_referer: fa\n                }).setErrorHandler(va).setServerDialogCancelHandler(wa).setRelativeTo(la).send();\n                if (((ga && ((ua === \"add_friend\"))))) {\n                    new j().setURI(\"/ajax/add_friend/chain_pymk.php\").send();\n                }\n            ;\n            ;\n            };\n        ;\n            function pa(ua, va) {\n                if (ka) {\n                    m.hide(ka);\n                }\n                 else if (ja) {\n                    m.hide(ja);\n                }\n                \n            ;\n            ;\n                ((la && m.hide(la)));\n                ((ma && m.hide(ma)));\n                ((na && m.hide(na)));\n                if (ua) {\n                    m.show(ua);\n                }\n            ;\n            ;\n                if (((((((\"Outgoing\" == va)) && ((ia != va)))) && ea))) {\n                    new h(ua).from(\"backgroundColor\", \"#FFF8CC\").to(\"backgroundColor\", \"transparent\").from(\"borderColor\", \"#FFE222\").to(\"borderColor\", s.get(ua, \"borderLeftColor\")).duration(2000).go();\n                }\n            ;\n            ;\n                ((ia && m.removeClass(v, ((\"fStatus\" + ia)))));\n                ia = va;\n                m.addClass(v, ((\"fStatus\" + va)));\n            };\n        ;\n            function qa(ua) {\n                if (m.hasClass(ua, \"enableFriendListFlyout\")) {\n                    o.show(ua);\n                }\n                 else o.hide();\n            ;\n            ;\n            };\n        ;\n            var ra = i.subscribe(\"FriendRequest/change\", function(ua, va) {\n                ta();\n                if (((va.uid != w))) {\n                    return;\n                }\n            ;\n            ;\n                switch (va.JSBNG__status) {\n                  case p.ARE_FRIENDS:\n                    return pa(na, \"Friends\");\n                  case p.INCOMING_REQUEST:\n                    return pa(ma, \"Incoming\");\n                  case p.OUTGOING_REQUEST:\n                    return pa(la, \"Outgoing\");\n                  case p.CAN_REQUEST:\n                    return pa(((ka ? ka : ja)), \"Requestable\");\n                };\n            ;\n            }), sa;\n            if (x) {\n                sa = i.subscribe(\"FriendRequest/confirm\", function(ua, va) {\n                    ta();\n                    ((((va.uid == w)) && r(x)));\n                });\n            }\n        ;\n        ;\n            ((ja && g.listen(ja, \"click\", function() {\n                i.inform(\"FriendRequest/sending\", {\n                    uid: w\n                });\n                if (ca) {\n                    o.setActiveNode(la);\n                }\n                 else qa(la);\n            ;\n            ;\n                oa(\"add_friend\", function(ua) {\n                    var va = ((((ua.error == u.ERROR_ALREADY_ADDED)) ? \"FriendRequest/sent\" : \"FriendRequest/sendFail\"));\n                    i.inform(va, {\n                        uid: w\n                    });\n                    o.hide();\n                    k.defaultErrorHandler(ua);\n                }, function(ua) {\n                    i.inform(\"FriendRequest/sendFail\", {\n                        uid: w\n                    });\n                    o.hide();\n                });\n            })));\n            function ta() {\n                if (q(ha)) {\n                    return;\n                }\n            ;\n            ;\n                ((ra && ra.unsubscribe()));\n                ((sa && sa.unsubscribe()));\n                ra = sa = null;\n            };\n        ;\n        }\n    };\n    e.exports = u;\n});\n__d(\"FriendButtonIcon\", [\"Arbiter\",\"FriendStatus\",\"Button\",\"arrayContains\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"FriendStatus\"), i = b(\"Button\"), j = b(\"arrayContains\");\n    e.exports = {\n        register: function(k, l, m) {\n            g.subscribe(\"FriendListMembershipChange\", function(n, o) {\n                if (((o.uid == m))) {\n                    var p = j(o.lists, h.CLOSE_FRIENDS), q = j(o.lists, h.ACQUAINTANCES);\n                    if (((p && !q))) {\n                        i.setIcon(k, l.close);\n                    }\n                     else if (((q && !p))) {\n                        i.setIcon(k, l.acquaintance);\n                    }\n                     else i.setIcon(k, l.friend);\n                    \n                ;\n                ;\n                }\n            ;\n            ;\n            });\n        }\n    };\n});\n__d(\"PopoverMenuShowOnHover\", [\"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._popoverMenu = j;\n        this._listeners = [];\n    };\n;\n    h(i.prototype, {\n        enable: function() {\n            this._attachMouseListeners(this._popoverMenu.getTriggerElem());\n            this._setMenuSubscription = this._popoverMenu.subscribe(\"setMenu\", this._onSetMenu.bind(this));\n        },\n        disable: function() {\n            while (this._listeners.length) {\n                this._listeners.pop().remove();\n            ;\n            };\n        ;\n            if (this._setMenuSubscription) {\n                this._setMenuSubscription.unsubscribe();\n                this._setMenuSubscription = null;\n            }\n        ;\n        ;\n        },\n        _onSetMenu: function() {\n            this._attachMouseListeners(this._popoverMenu.getMenu().getRoot());\n        },\n        _attachMouseListeners: function(j) {\n            var k = this._popoverMenu.getPopover();\n            this._listeners.push(g.listen(j, \"mouseenter\", k.showLayer.bind(k)), g.listen(j, \"mouseleave\", k.hideLayer.bind(k)));\n        }\n    });\n    e.exports = i;\n});\n__d(\"OGCollectionAddDialog\", [\"AsyncRequest\",\"DataStore\",\"DOMQuery\",\"Form\",\"MenuDeprecated\",\"URI\",\"collectDataAttributes\",\"copyProperties\",\"csx\",\"tidyEvent\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = b(\"DataStore\"), i = b(\"DOMQuery\"), j = b(\"Form\"), k = b(\"MenuDeprecated\"), l = b(\"URI\"), m = b(\"collectDataAttributes\"), n = b(\"copyProperties\"), o = b(\"csx\"), p = b(\"tidyEvent\"), q = \"OGCollectionAddDialog\";\n    function r(s, t, u, v, w) {\n        this._dialog = s;\n        this._surface = t;\n        this._endpoint = l(v);\n        this._loadEditMenu = w.loadEditMenu;\n        this._listener = h.get(String(u), q);\n        this._audienceSelector = i.JSBNG__find(this._dialog.getContent(), \".audienceSelector\");\n        this._menu = i.JSBNG__find(this._dialog.getContent(), \"._4-jt\");\n        k.register(this._menu);\n        this._menuSubscriptionToken = k.subscribe(\"select\", this._onMenuClick.bind(this));\n        p([this._dialog.subscribe(\"show\", this._onDialogShow.bind(this)),this._dialog.subscribe(\"hide\", this._onDialogHide.bind(this)),]);\n        this._dialog.show();\n    };\n;\n    n(r, {\n        INSTANCE_KEY: q\n    });\n    n(r.prototype, {\n        _onDialogShow: function() {\n            this._listener.onDialogShow(this._dialog);\n        },\n        _onDialogHide: function() {\n            this._destroy();\n        },\n        _onMenuClick: function(s, t) {\n            if (((t.menu !== this._menu))) {\n                return;\n            }\n        ;\n        ;\n            var u = t.item;\n            this._listener.onMenuClick(u);\n            var v = i.JSBNG__find(u, \"._5581\"), w = v.getAttribute(\"value\");\n            this._submitRequest(w);\n        },\n        _submitRequest: function(s) {\n            this._endpoint.addQueryData({\n                collection_token: s\n            });\n            this._dialog.hide();\n            this._request = new g(this._endpoint).setData(n(j.serialize(this._audienceSelector), {\n                action: \"add\",\n                load_edit_menu: this._loadEditMenu,\n                surface: this._surface\n            }, m(this._dialog.getContext(), [\"ft\",]))).setHandler(function() {\n                this._listener.onAddSuccess();\n            }.bind(this));\n            this._request.send();\n        },\n        _destroy: function() {\n            this._listener.onDialogHide();\n            k.unsubscribe(this._menuSubscriptionToken);\n        }\n    });\n    e.exports = r;\n});\n__d(\"OGCollectionAddMenu\", [\"CSS\",\"DataStore\",\"DOM\",\"DOMQuery\",\"JSBNG__Event\",\"OGCollectionAddDialog\",\"Parent\",\"TidyArbiterMixin\",\"copyProperties\",\"csx\",\"cx\",\"tidyEvent\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSS\"), h = b(\"DataStore\"), i = b(\"DOM\"), j = b(\"DOMQuery\"), k = b(\"JSBNG__Event\"), l = b(\"OGCollectionAddDialog\"), m = b(\"Parent\"), n = b(\"TidyArbiterMixin\"), o = b(\"copyProperties\"), p = b(\"csx\"), q = b(\"cx\"), r = b(\"tidyEvent\");\n    function s(t, u, v, w, x, y) {\n        this._image = u;\n        this._container = v;\n        this._placeholder = w;\n        this._surface = x;\n        this._showPlaceholder = y.showPlaceholder;\n        this._rateControl = i.scry(this._container.parentNode, \"._5586\")[0];\n        s.inform(\"addButton\", {\n            button: this._image,\n            root: this._container\n        });\n        r(k.listen(this._container, \"click\", function(z) {\n            var aa = m.byClass(z.getTarget(), \"_5859\");\n            if (((this.isDialogShowing() && aa))) {\n                z.kill();\n            }\n        ;\n        ;\n        }.bind(this)));\n        if (((this._surface === \"friend_timeline_lhc\"))) {\n            this._handleAlwaysVisibleLHC();\n        }\n    ;\n    ;\n        h.set(String(t), l.INSTANCE_KEY, this);\n    };\n;\n    o(s, n);\n    o(s.prototype, n, {\n        destroy: function() {\n            i.remove(this._container);\n            this._placeholder.destroy();\n        },\n        hide: function() {\n            g.hide(this._container);\n            this._placeholder.hide();\n        },\n        getParent: function() {\n            return this._container.parentNode;\n        },\n        insertMenuIntoDialog: function(t) {\n            this._placeholder.insertIntoDialog(t);\n        },\n        onMenuClick: function(t) {\n            var u = j.JSBNG__find(t, \"._5582\");\n            this._showRate = ((this._rateControl && u.getAttribute(\"value\")));\n            g.hide(this._image);\n            if (this._showRate) {\n                g.show(this._rateControl);\n                k.fire(this._rateControl, \"click\");\n            }\n             else if (this._showPlaceholder) {\n                g.show(this._placeholder.getIcon());\n            }\n            \n        ;\n        ;\n        },\n        onAddSuccess: function() {\n            if (((!this._showPlaceholder && !this._showRate))) {\n                this.inform(\"reload\");\n            }\n        ;\n        ;\n        },\n        onDialogShow: function(t) {\n            var u = j.JSBNG__find(t.getContent(), \".audienceSelector\");\n            g.addClass(this._image, \"openToggler\");\n            s.inform(\"menuOpened\", {\n                audienceSelector: u.parentNode\n            });\n            this._dialogShowing = true;\n        },\n        onDialogHide: function() {\n            g.removeClass(this._image, \"openToggler\");\n            this._dialogShowing = false;\n        },\n        isDialogShowing: function() {\n            return this._dialogShowing;\n        },\n        _handleAlwaysVisibleLHC: function() {\n            var t = m.byClass(this._container, \"_4_ij\"), u = m.byClass(t, \"_5-r\");\n            if (g.hasClass(t, \"_58v0\")) {\n                r([this._alwaysVisibleToken = k.listen(u, \"mouseenter\", function() {\n                    g.removeClass(t, \"_58v0\");\n                    this._alwaysVisibleToken.remove();\n                }.bind(this)),]);\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = s;\n});\n__d(\"TimelineAppSectionCuration\", [\"Animation\",\"AppSectionCurationState\",\"Arbiter\",\"AsyncSignal\",\"CSS\",\"DOM\",\"Ease\",\"JSBNG__Event\",\"OnVisible\",\"Parent\",\"Style\",\"TidyArbiterMixin\",\"TimelineSection\",\"copyProperties\",\"cx\",\"queryThenMutateDOM\",\"tidyEvent\",], function(a, b, c, d, e, f) {\n    var g = b(\"Animation\"), h = b(\"AppSectionCurationState\"), i = b(\"Arbiter\"), j = b(\"AsyncSignal\"), k = b(\"CSS\"), l = b(\"DOM\"), m = b(\"Ease\"), n = b(\"JSBNG__Event\"), o = b(\"OnVisible\"), p = b(\"Parent\"), q = b(\"Style\"), r = b(\"TidyArbiterMixin\"), s = b(\"TimelineSection\"), t = b(\"copyProperties\"), u = b(\"cx\"), v = b(\"queryThenMutateDOM\"), w = b(\"tidyEvent\"), x = 0, y = {\n    }, z = {\n    };\n    function aa(fa, ga, ha) {\n        var ia, ja, ka = ((((ga != h.hide)) && ((ha != h.hide))));\n        v(function() {\n            ja = fa.offsetHeight;\n            ia = ((((ga === h.hide)) ? 0 : fa.firstChild.offsetHeight));\n        }, function() {\n            q.set(fa, \"height\", ((ja + \"px\")));\n            q.set(fa, \"overflow\", \"hidden\");\n            ((ia && k.addClass(fa.parentNode, \"_52bu\")));\n            o.checkBuffer.defer();\n            var la = l.getID(fa);\n            ((z[la] && z[la].JSBNG__stop()));\n            z[la] = new g(fa).to(\"height\", ia).ondone(function() {\n                delete z[la];\n                if (ia) {\n                    q.set(fa, \"overflow\", \"\");\n                    q.set(fa.parentNode, \"overflow\", \"\");\n                }\n            ;\n            ;\n                ((!ia && k.removeClass(fa.parentNode, \"_52bu\")));\n                i.inform(\"reflow\");\n            }).duration(((Math.abs(((ia - ja))) * ((ka ? 5 : 1.5))))).ease(m.sineOut).go();\n        });\n    };\n;\n    function ba(fa, ga) {\n        if (fa) {\n            k.show(ga);\n            k.hide(fa);\n        }\n    ;\n    ;\n    };\n;\n    function ca(fa, ga) {\n        if (fa) {\n            k.show(fa);\n            k.hide(ga);\n        }\n    ;\n    ;\n    };\n;\n    function da(fa, ga) {\n        s.callWithSection(fa, function(ha) {\n            new j(\"/ajax/timeline/collections/app_recs/\", {\n                collection_token: ha.getActiveCollection().getToken(),\n                event_type: ga\n            }).send();\n        });\n    };\n;\n    var ea = t({\n        addSection: function(fa, ga, ha) {\n            y[fa] = {\n                appClickLogged: false,\n                buttons: ga,\n                JSBNG__content: ha,\n                id: fa,\n                state: h.hide\n            };\n            q.set(ha, \"height\", \"0px\");\n            q.set(ha, \"overflow\", \"hidden\");\n            k.show(ha);\n            {\n                var fin272keys = ((window.top.JSBNG_Replay.forInKeys)((ga))), fin272i = (0);\n                var ia;\n                for (; (fin272i < fin272keys.length); (fin272i++)) {\n                    ((ia) = (fin272keys[fin272i]));\n                    {\n                        w([n.listen(ga[ia].hide_button, \"click\", ea.informState.curry(h.hide, fa)),n.listen(ga[ia].show_button, \"click\", ea.informState.curry(ia, fa)),]);\n                    ;\n                    };\n                };\n            };\n        ;\n            ea.register(fa, function(ja, ka, la, ma) {\n                new o(ha, aa.curry(ha, ja, ma), true, x);\n                {\n                    var fin273keys = ((window.top.JSBNG_Replay.forInKeys)((ga))), fin273i = (0);\n                    var na;\n                    for (; (fin273i < fin273keys.length); (fin273i++)) {\n                        ((na) = (fin273keys[fin273i]));\n                        {\n                            ca(ga[na].show_button, ga[na].hide_button);\n                        ;\n                        };\n                    };\n                };\n            ;\n                if (ga[ja]) {\n                    ba(ga[ja].show_button, ga[ja].hide_button);\n                }\n            ;\n            ;\n            });\n        },\n        informState: function(fa, ga) {\n            if (((y[ga] && ((y[ga].state !== fa))))) {\n                if (((((fa === h.showApps)) && !y[ga].appClickLogged))) {\n                    y[ga].appClickLogged = true;\n                    da(ga, \"add_apps_click\");\n                }\n            ;\n            ;\n                var ha = y[ga].state;\n                y[ga].state = fa;\n                ea.inform(fa, {\n                    obj: y[ga],\n                    oldState: ha\n                });\n            }\n        ;\n        ;\n        },\n        linkContent: function(fa, ga, ha) {\n            var ia = y[fa].buttons[h.showApps].show_button;\n            k.show(p.byClass(ia, \"hidden_elem\"));\n            new o(ia, function() {\n                if (((Math.floor(((Math.JSBNG__random() * 100))) === 0))) {\n                    da(fa, \"add_apps_imp\");\n                }\n            ;\n            ;\n            }, true, x);\n            ea.register(fa, function(ja, ka, la, ma) {\n                if (((ja == h.showItems))) {\n                    if (((ma == h.showApps))) {\n                        q.set(y[fa].JSBNG__content.parentNode, \"overflow\", \"hidden\");\n                    }\n                ;\n                ;\n                    k.show(ga);\n                    k.hide(ha);\n                }\n                 else if (((ja == h.showApps))) {\n                    k.hide(ga);\n                    k.show(ha);\n                }\n                \n            ;\n            ;\n            });\n        },\n        register: function(fa, ga) {\n            var ha = ea.subscribe([h.hide,h.showItems,h.showApps,], function(ia, ja) {\n                if (((ja.obj.id === fa))) {\n                    ga(ia, ja.obj, ha, ja.oldState);\n                }\n            ;\n            ;\n            });\n        },\n        getSectionState: function(fa) {\n            if (y[fa]) {\n                return y[fa].state;\n            }\n        ;\n        ;\n        }\n    }, r);\n    e.exports = ea;\n});\n__d(\"TimelineMonitor\", [\"Arbiter\",\"JSBNG__Event\",\"Run\",\"Vector\",\"ViewportBounds\",\"ge\",\"queryThenMutateDOM\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"JSBNG__Event\"), i = b(\"Run\"), j = b(\"Vector\"), k = b(\"ViewportBounds\"), l = b(\"ge\"), m = b(\"queryThenMutateDOM\"), n = {\n    }, o = {\n    }, p = 0, q = [], r = null, s = false;\n    function t() {\n        n = {\n        };\n        o = {\n        };\n        p = 0;\n        q.length = 0;\n        ((r && r.remove()));\n        r = null;\n        s = false;\n    };\n;\n    function u() {\n        if (!r) {\n            r = h.listen(window, \"JSBNG__scroll\", z);\n        }\n    ;\n    ;\n        if (!s) {\n            i.onLeave(t);\n            s = true;\n        }\n    ;\n    ;\n        z();\n    };\n;\n    var v = [], w = [];\n    function x() {\n        q.forEach(function(ea) {\n            var fa = aa.getSection(ea);\n            if (((fa && ((fa !== o[ea.id]))))) {\n                o[ea.id] = fa;\n                v.push({\n                    section: fa\n                });\n            }\n        ;\n        ;\n        });\n        var ba = ((k.getTop() + j.getScrollPosition().y));\n        {\n            var fin274keys = ((window.top.JSBNG_Replay.forInKeys)((n))), fin274i = (0);\n            var ca;\n            for (; (fin274i < fin274keys.length); (fin274i++)) {\n                ((ca) = (fin274keys[fin274i]));\n                {\n                    var da = n[ca];\n                    if (((((((ba >= da.boundary)) && ((p <= da.boundary)))) || ((((ba <= da.boundary)) && ((p >= da.boundary))))))) {\n                        n[ca].fromAbove = ((p < ba));\n                        w.push(n[ca]);\n                    }\n                ;\n                ;\n                };\n            };\n        };\n    ;\n        p = ba;\n    };\n;\n    function y() {\n        v.forEach(function(ba) {\n            g.inform(aa.SECTION_CHANGE, ba);\n        });\n        w.forEach(function(ba) {\n            g.inform(aa.BOUNDARY_PASSED, ba);\n        });\n        v.length = 0;\n        w.length = 0;\n    };\n;\n    function z() {\n        m(x, y, \"TimelineMonitor/scroll\");\n    };\n;\n    var aa = {\n        BOUNDARY_PASSED: \"TimelineMonitor/boundary\",\n        SECTION_CHANGE: \"TimelineMonitor/change\",\n        getSection: function(ba) {\n            var ca = ((k.getTop() + j.getScrollPosition().y)), da = ba.childSections.getHead();\n            while (da) {\n                if (((l(da.nodeID) && ((ca < ((j.getElementPosition(da.getNode()).y + j.getElementDimensions(da.getNode()).y))))))) {\n                    return da;\n                }\n            ;\n            ;\n                da = da.getNext();\n            };\n        ;\n        },\n        monitorBoundary: function(ba, ca) {\n            ca = ((ca || ba));\n            if (((!n[ca] || ((n[ca].boundary !== ba))))) {\n                n[ca] = {\n                    boundary: ba,\n                    id: ca\n                };\n                u();\n            }\n        ;\n        ;\n        },\n        monitorSection: function(ba) {\n            o[ba.id] = null;\n            q.push(ba);\n            u();\n            return aa.getSection(ba);\n        },\n        poke: function(ba) {\n            z();\n        }\n    };\n    e.exports = aa;\n});\n__d(\"TimelineAppSection\", [\"AppSectionCurationState\",\"Arbiter\",\"Class\",\"CSS\",\"DOM\",\"DOMQuery\",\"DOMScroll\",\"JSLogger\",\"MedleyPageletRequestData\",\"PageletSet\",\"Style\",\"TidyArbiter\",\"TidyArbiterMixin\",\"TimelineAppCollection\",\"TimelineAppSectionCuration\",\"TimelineDynamicSection\",\"TimelineMonitor\",\"TimelineSection\",\"TimelineSmartInsert\",\"TriggerablePageletLoader\",\"ViewportBounds\",\"copyProperties\",\"csx\",\"cx\",\"ge\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"AppSectionCurationState\"), h = b(\"Arbiter\"), i = b(\"Class\"), j = b(\"CSS\"), k = b(\"DOM\"), l = b(\"DOMQuery\"), m = b(\"DOMScroll\"), n = b(\"JSLogger\"), o = b(\"MedleyPageletRequestData\"), p = b(\"PageletSet\"), q = b(\"Style\"), r = b(\"TidyArbiter\"), s = b(\"TidyArbiterMixin\"), t = b(\"TimelineAppCollection\"), u = b(\"TimelineAppSectionCuration\"), v = b(\"TimelineDynamicSection\"), w = b(\"TimelineMonitor\"), x = b(\"TimelineSection\"), y = b(\"TimelineSmartInsert\"), z = b(\"TriggerablePageletLoader\"), aa = b(\"ViewportBounds\"), ba = b(\"copyProperties\"), ca = b(\"csx\"), da = b(\"cx\"), ea = b(\"ge\"), fa = b(\"tx\"), ga = 500, ha = 2, ia = 500, ja = 18, ka = \"_5bry\", la = \"_3s-\", ma = k.create(\"div\", {\n        className: \"_3s_\"\n    });\n    function na() {\n        return k.create(\"span\", {\n            className: \"_3s18\"\n        }, [k.create(\"a\", {\n            className: \"_3s19\",\n            href: \"#\"\n        }, \"More\"),k.create(\"span\", {\n            className: \"_3s1a\"\n        }),]);\n    };\n;\n    var oa = n.create(\"collections\"), pa = {\n        notes: 295,\n        events: 345,\n        photos: 555,\n        app_quoraapp: 569,\n        friends: 603,\n        app_foodspotting: 621,\n        map: 621,\n        favorites: 645,\n        app_pinterestapp: 699,\n        app_instapp: 699,\n        books: 699,\n        movies: 699,\n        tv: 699,\n        music: 725\n    };\n    function qa(sa) {\n        return pa[sa.replace(\"pagelet_timeline_medley_\", \"\")];\n    };\n;\n    function ra(sa, ta, ua, va) {\n        this.parent.construct(this, ra.getIDBySK(ta), sa, ua);\n        this._sk = ta;\n        this._title = va;\n    };\n;\n    i.extend(ra, v);\n    ba(ra, {\n        createFromArray: function(sa) {\n            return sa.map(function(ta) {\n                return new ra(ta.controller, ta.sk, ta.label, ta.title);\n            });\n        },\n        getIDBySK: function(sa) {\n            return ((\"pagelet_timeline_medley_\" + sa));\n        },\n        registerCollections: function(sa, ta, ua) {\n            x.callWithSection(ra.getIDBySK(sa), function(va) {\n                t.createFromArray(ta).forEach(va.appendSection.bind(va));\n                var wa = va.childSections.get(ua);\n                va.setActiveCollection(wa);\n                wa.setIsLoaded(true);\n            });\n        },\n        removeEmptyAppSection: function(sa) {\n            x.callWithSection(ra.getIDBySK(sa), function(ta) {\n                ta.remove();\n            });\n        }\n    }, s);\n    ba(ra.prototype, s, {\n        _createNode: function() {\n            var sa = this.parent._createNode();\n            sa.setAttribute(\"aria-labelledby\", ((\"medley_header_\" + this._sk)));\n            sa.setAttribute(\"aria-role\", \"region\");\n            k.prependContent(sa, k.create(\"div\", {\n                className: \"_3cz\"\n            }, [this._title,k.create(\"div\", {\n                className: \"_3dc\",\n                \"aria-role\": \"tablist\"\n            }),]));\n            this.resetMinHeight(sa);\n            return sa;\n        },\n        addAuxContent: function(sa) {\n            var ta = l.scry(this.getNode(), \"._6ph\")[0];\n            ((ta && k.appendContent(ta, sa)));\n            ((this._activeCollection && this._checkTabDimensions(this._activeCollection)));\n        },\n        nullStateCurationContent: function() {\n            if (!this._nullStateContent) {\n                return;\n            }\n        ;\n        ;\n            var sa = l.JSBNG__find(this.getNode(), \"._1_cb\");\n            k.replace(sa.firstChild, this._nullStateContent);\n        },\n        addCurationContent: function(sa, ta, ua) {\n            var va = l.scry(this.getNode(), \"._1_cb\")[0];\n            ((va && k.appendContent(va, sa)));\n            if (ua) {\n                this._nullStateContent = ua;\n            }\n        ;\n        ;\n            this._checkCurationContent(ta);\n        },\n        createTriggerLoader: function(sa) {\n            var ta = function(ua) {\n                this._parentSection._lastLoadedSection = this;\n                this.setIsLoaded(true);\n                y.enable();\n                y.run(this.getNode(), function() {\n                    ua();\n                    this.unsetMinHeight();\n                    w.poke(this._parentSection.id);\n                }.bind(this), \"viewport\");\n            }.bind(this);\n            r.subscribe(\"Medley/requestDataSet\", function() {\n                this._triggerLoader = new z({\n                    controller: this._controller,\n                    data: this.getData(),\n                    displayCallback: ta,\n                    options: {\n                        constHeight: true\n                    },\n                    node: this.getNode()\n                }, [{\n                    node: this.getNode(),\n                    onVisibleBuffer: ga,\n                    onVisibleStrict: true,\n                    type: ((sa ? z.TRIGGER_NOW : z.TRIGGER_ONVISIBLE))\n                },]);\n            }.bind(this));\n        },\n        freeze: function() {\n            j.addClass(this.getNode(), \"_c4e\");\n            if (((ea(this.nodeID) && !this.isLoaded()))) {\n                ((this._triggerLoader && this._triggerLoader.disableTriggers()));\n            }\n        ;\n        ;\n            this.freezeChildren();\n        },\n        getData: function() {\n            if (!this._data) {\n                this._data = ba({\n                    sk: this._sk\n                }, o.get(), {\n                    overview: ((this._parentSection._sk !== this._sk))\n                });\n            }\n        ;\n        ;\n            return this._data;\n        },\n        getActiveCollection: function() {\n            return this._activeCollection;\n        },\n        remove: function() {\n            if (p.hasPagelet(this.id)) {\n                p.removePagelet(this.id);\n            }\n        ;\n        ;\n            k.remove(this.getNode());\n            this._parentSection.childSections.remove(this.id);\n        },\n        setActiveCollection: function(sa) {\n            if (((((this._activeCollection === sa)) || !sa._tabNode))) {\n                return;\n            }\n        ;\n        ;\n            if (this._activeCollection) {\n                h.inform(\"TimelineSideAds/refresh\");\n                oa.log(\"change_collection\", {\n                    previous_collection: this._activeCollection.getToken(),\n                    new_collection: sa.getToken()\n                });\n                this.resetMinHeight();\n                this._activeCollection.disableContentLoader();\n                j.hide(this._activeCollection.getNode());\n                j.removeClass(this._activeCollection._tabNode, la);\n                k.scry(this._activeCollection._tabNode, \"div._3s_\").forEach(k.remove);\n                k.appendContent(sa._tabNode, ma.cloneNode(true));\n                ((this._activeCollection.auxContent && j.hide(this._activeCollection.auxContent)));\n                ((this._activeCollection.curationContent && j.hide(this._activeCollection.curationContent)));\n                this._activeCollection._tabNode.setAttribute(\"aria-selected\", \"false\");\n            }\n        ;\n        ;\n            ((sa.auxContent && j.show(sa.auxContent)));\n            this._checkCurationContent(sa);\n            j.addClass(sa._tabNode, la);\n            this._checkTabDimensions(sa);\n            this._activeCollection = sa;\n            ra.inform(\"changeCollection\");\n            if (!ea(sa.nodeID)) {\n                k.appendContent(l.JSBNG__find(this.getNode(), \"div._3i9\"), sa.getNode());\n            }\n        ;\n        ;\n            j.show(sa.getNode());\n            ((sa.isLoaded() && this.unsetMinHeight()));\n            sa._tabNode.setAttribute(\"aria-selected\", \"true\");\n            sa.enableContentLoader();\n        },\n        resetMinHeight: function(sa) {\n            ((sa || (sa = this.getNode())));\n            var ta = ((qa(this.id) || ((sa.offsetHeight - ha))));\n            ((((ta > 0)) && this._updateScrollAfterHeight(sa, ta)));\n        },\n        JSBNG__scrollTo: function(sa, ta) {\n            var ua = aa.getElementPosition(this.getNode());\n            ua.y -= ((sa || ja));\n            ((ta && this._parentSection.toggleScrollLoad(false)));\n            m.JSBNG__scrollTo(ua, ia, null, null, function() {\n                ua = aa.getElementPosition(this.getNode());\n                ua.y -= ((sa || ja));\n                m.JSBNG__scrollTo(ua);\n                ((ta && this._parentSection.toggleScrollLoad(true)));\n            }.bind(this));\n        },\n        thaw: function() {\n            j.removeClass(this.getNode(), \"_c4e\");\n            ((this._triggerLoader && this._triggerLoader.enableTriggers()));\n            this.thawChildren();\n        },\n        unsetMinHeight: function() {\n            this._updateScrollAfterHeight(this.getNode(), 0);\n        },\n        _updateScrollAfterHeight: function(sa, ta) {\n            q.set(sa, \"min-height\", ((ta + \"px\")));\n            h.inform(\"reflow\");\n        },\n        _checkCurationContent: function(sa) {\n            var ta = l.scry(this.getNode(), \"._2zh3\")[0];\n            if (ta) {\n                j.conditionShow(ta, sa.curationContent);\n                if (sa.curationContent) {\n                    j.show(sa.curationContent);\n                    if (sa.curationContentState) {\n                        u.informState(sa.curationContentState, this.id);\n                    }\n                ;\n                ;\n                }\n                 else u.informState(g.hide, this.id, g.showItems);\n            ;\n            ;\n            }\n        ;\n        ;\n        },\n        _getTabObj: function() {\n            if (!this._tabObj) {\n                this._tabObj = {\n                    aux: k.JSBNG__find(this.getNode(), \"._6ph\"),\n                    items: [],\n                    nav: k.JSBNG__find(this.getNode(), \"._1_ca\"),\n                    tabs: k.JSBNG__find(this.getNode(), \"._3dc\"),\n                    width: 0\n                };\n                j.addClass(this._tabObj.tabs, \"_5brz\");\n            }\n        ;\n        ;\n            return this._tabObj;\n        },\n        _checkTabDimensions: function(sa) {\n            var ta = this._getTabObj(), ua = ((ta.nav.offsetWidth - ta.aux.offsetWidth));\n            if (((ua >= ta.width))) {\n                if (((!ta.hidden && ((((ua - ta.tabs.offsetWidth)) >= 0))))) {\n                    return;\n                }\n            ;\n            ;\n                j.removeClass(ta.tabs, ka);\n            }\n        ;\n        ;\n            if (((ta.hidden && ((sa._tabNode.parentNode === ta.overflow))))) {\n                k.prependContent(ta.overflow, ta.dropdown.previousSibling);\n                k.insertBefore(ta.dropdown, sa._tabNode);\n            }\n        ;\n        ;\n            if (((((((ua - ta.tabs.offsetWidth)) >= 0)) && !ta.hidden))) {\n                return;\n            }\n        ;\n        ;\n            var va = ta.items.length;\n            if (((va && ta.hidden))) {\n                for (var wa = 0; ((wa < va)); wa++) {\n                    k.appendContent(ta.tabs, ta.items[wa]);\n                ;\n                };\n            ;\n                k.remove(ta.dropdown);\n            }\n        ;\n        ;\n            j.conditionClass(ta.tabs, ka, ((((ua - ta.tabs.offsetWidth)) < 0)));\n            ta.width = ua;\n            ta.hidden = 0;\n            if (((((ua - ta.tabs.offsetWidth)) >= 0))) {\n                return;\n            }\n        ;\n        ;\n            if (!ta.dropdown) {\n                ta.dropdown = na();\n                ta.overflow = k.JSBNG__find(ta.dropdown, \"._3s1a\");\n                ta.items = k.scry(this.getNode(), \"._3c_\");\n                va = ta.items.length;\n            }\n        ;\n        ;\n            k.appendContent(ta.tabs, ta.dropdown);\n            var xa = 0;\n            for (wa = ((va - 1)); ((((wa > 0)) && ((xa <= 0)))); wa--) {\n                if (((ta.items[wa] !== sa._tabNode))) {\n                    k.prependContent(ta.overflow, ta.items[wa]);\n                    xa = ((ua - ta.tabs.offsetWidth));\n                    ta.hidden++;\n                }\n            ;\n            ;\n            };\n        ;\n        }\n    });\n    e.exports = ra;\n});\n__d(\"TimelineCoverDisclaimer\", [\"Dialog\",], function(a, b, c, d, e, f) {\n    var g = b(\"Dialog\");\n    function h(i, j, k) {\n        if (((h.displayed === undefined))) {\n            h.displayed = true;\n        }\n         else return\n    ;\n        new g().setModal(true).setTitle(i).setBody(j).setButtonsMessage(k).setButtons(g.OK).show();\n    };\n;\n    e.exports = h;\n});\n__d(\"legacy:TimelineCoverDisclaimer\", [\"TimelineCoverDisclaimer\",], function(a, b, c, d) {\n    a.TimelineCoverDisclaimer = b(\"TimelineCoverDisclaimer\");\n}, 3);\n__d(\"TimelineMedley\", [\"Class\",\"CSS\",\"DOM\",\"DOMPosition\",\"DOMQuery\",\"PageTransitions\",\"TimelineAppSection\",\"TimelineDynamicSectionConfig\",\"TimelineMonitor\",\"TimelineSection\",\"URI\",\"ViewportBounds\",\"copyProperties\",\"csx\",\"cx\",\"ge\",\"$\",], function(a, b, c, d, e, f) {\n    var g = b(\"Class\"), h = b(\"CSS\"), i = b(\"DOM\"), j = b(\"DOMPosition\"), k = b(\"DOMQuery\"), l = b(\"PageTransitions\"), m = b(\"TimelineAppSection\"), n = b(\"TimelineDynamicSectionConfig\"), o = b(\"TimelineMonitor\"), p = b(\"TimelineSection\"), q = b(\"URI\"), r = b(\"ViewportBounds\"), s = b(\"copyProperties\"), t = b(\"csx\"), u = b(\"cx\"), v = b(\"ge\"), w = b(\"$\"), x = \"timeline-medley\", y = \"about\", z = 2, aa = false;\n    function ba(ea) {\n        var fa = ((ea.getQueryData().sk || ea.getPath().split(\"/\")[2]));\n        return ((n.skmapping[fa] || fa));\n    };\n;\n    function ca(ea) {\n        if (ea.getQueryData().id) {\n            return ea.getQueryData.id;\n        }\n    ;\n    ;\n        return ea.getPath().split(\"/\")[1];\n    };\n;\n    function da(ea, fa, ga) {\n        this.parent.construct(this, x);\n        this.isOverview = ((ea.length > 1));\n        n.breaker = ga.breaker;\n        m.createFromArray(ea).forEach(this.appendSection.bind(this));\n        o.monitorSection(this);\n        this._lastLoadedSection = this.childSections.get(m.getIDBySK(fa)).setIsLoaded(true);\n        p.setActiveSectionID(this._lastLoadedSection.id);\n        if (((aa && this.isMedleyView()))) {\n            this.addSectionPlaceholders();\n        }\n    ;\n    ;\n        var ha = q.getNextURI();\n        this._vanity = ca(ha);\n        this._sk = ba(ha);\n        if (this.isOverview) {\n            l.registerHandler(this._transitionHandler.bind(this));\n        }\n    ;\n    ;\n    };\n;\n    g.extend(da, p);\n    s(da, {\n        loadToSection: function(ea, fa) {\n            p.setActiveSectionID(ea);\n            p.callWithSection(x, function(ga) {\n                var ha = ga.childSections.getHead(), ia = 0;\n                while (((ha && ((ha.id !== ea))))) {\n                    ia++;\n                    ha = ha.getNext();\n                };\n            ;\n                if (!ia) {\n                    return fa(ha);\n                }\n            ;\n            ;\n                ia--;\n                ((ia && ga.addUpcomingSectionPlaceholders(ga.childSections.getHead(), ia)));\n                ga.addSectionPlaceholder(ha, ha.getPrev(), true);\n                var ja = ha.subscribe(\"loaded\", function() {\n                    fa(ha);\n                    ja.unsubscribe();\n                });\n            });\n        },\n        scrollToSection: function(ea, fa, ga) {\n            p.callWithSection(ea, function(ha) {\n                ha.JSBNG__scrollTo(fa, ga);\n            });\n        },\n        toggleScrollLoad: function(ea) {\n            aa = ea;\n            p.callWithSection(x, function(fa) {\n                fa.toggleScrollLoad(ea);\n            });\n        }\n    });\n    s(da.prototype, {\n        addSectionTeasers: function() {\n            if (!this.isMedleyView()) {\n                h.removeClass(this.getNode(), \"_c4f\");\n                this.thawChildren();\n                this.addSectionPlaceholders();\n                this.addSectionBreak();\n            }\n        ;\n        ;\n        },\n        addUpcomingSectionPlaceholders: function(ea, fa) {\n            fa = ((fa || z));\n            while (ea = ea.getNext()) {\n                if (((!this.addSectionPlaceholder(ea, ea.getPrev()) && ((--fa <= 0))))) {\n                    break;\n                }\n            ;\n            ;\n            };\n        ;\n        },\n        addSectionPlaceholder: function(ea, fa, ga) {\n            if (((!ea.isLoaded() && v(ea.nodeID)))) {\n                return false;\n            }\n        ;\n        ;\n            if (!v(ea.nodeID)) {\n                i.insertAfter(fa.getNode(), ea.getNode());\n                ea.createTriggerLoader(ga);\n                return false;\n            }\n        ;\n        ;\n            return true;\n        },\n        addSectionBreak: function() {\n            if (this._lastLoadedSection.getNext()) {\n                i.insertAfter(this.childSections.getHead().getNode(), n.breaker);\n            }\n             else i.remove(n.breaker);\n        ;\n        ;\n        },\n        addSectionPlaceholders: function() {\n            this.addUpcomingSectionPlaceholders(this._lastLoadedSection);\n        },\n        getNode: function() {\n            return w(this.id);\n        },\n        isMedleyView: function() {\n            return ((this._sk === y));\n        },\n        toggleScrollLoad: function(ea) {\n            aa = ea;\n            if (ea) {\n                this.thawChildren();\n                this.addSectionPlaceholders();\n            }\n             else this.freezeChildren();\n        ;\n        ;\n        },\n        _transitionHandler: function(ea) {\n            if (((ca(ea) !== this._vanity))) {\n                return false;\n            }\n        ;\n        ;\n            var fa = ba(ea);\n            if (!fa) {\n                return false;\n            }\n        ;\n        ;\n            if (((fa === y))) {\n                return false;\n            }\n             else {\n                var ga = ea.getQueryData();\n                if (!ga.next_cursor) {\n                    return false;\n                }\n            ;\n            ;\n                var ha = this.childSections.getHead();\n                while (ha) {\n                    if (((ha._sk === fa))) {\n                        if (((!ha._activeCollection && !k.scry(ha._activeCollection.getNode(), \"._3t3\")[0]))) {\n                            return false;\n                        }\n                    ;\n                    ;\n                        this._transitionToSection.bind(this, ha, ga).defer();\n                        return true;\n                    }\n                ;\n                ;\n                    ha = ha.getNext();\n                };\n            ;\n            }\n        ;\n        ;\n            return false;\n        },\n        _transitionToSection: function(ea, fa) {\n            var ga = ((j.getElementPosition(ea.getNode()).y - r.getTop()));\n            i.scry(ea.getNode(), \"._51k9\").forEach(function(ja) {\n                h.removeClass(ja, \"_51k9\");\n            });\n            this._sk = ea._sk;\n            p.setActiveSectionID(ea.id);\n            ea.thaw();\n            h.addClass(this.getNode(), \"_c4f\");\n            this.freezeChildren();\n            var ha = k.JSBNG__find(ea._activeCollection.getNode(), \"._3t3\");\n            ea._activeCollection.addContentLoader(ha, fa.next_cursor);\n            ea._activeCollection._contentLoader.load({\n                node: ha\n            });\n            var ia = this.childSections.getHead();\n            while (((ia && ((ia.id !== ea.id))))) {\n                ia.remove();\n                ia = this.childSections.getHead();\n            };\n        ;\n            p.inform(\"Medley/transitionToSection\", ea.id);\n            ea.JSBNG__scrollTo(((((ga < 0)) ? ga : 0)));\n            l.transitionComplete();\n        }\n    });\n    e.exports = da;\n});\n__d(\"TimelineNavLight\", [\"CSS\",\"DOM\",\"DOMQuery\",\"Parent\",\"TimelineSection\",\"csx\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSS\"), h = b(\"DOM\"), i = b(\"DOMQuery\"), j = b(\"Parent\"), k = b(\"TimelineSection\"), l = b(\"csx\"), m = b(\"cx\");\n    function n(o) {\n        var p = i.scry(o, \"._6-7\")[0], q = i.scry(o, \"._6-6\"), r = j.byClass(o, \"_70k\").offsetWidth, s = q[((q.length - 1))];\n        if (((((s.offsetLeft + s.offsetWidth)) > r))) {\n            g.addClass(o, \"_5215\");\n        }\n    ;\n    ;\n        for (var t = ((q.length - 1)); ((t > 1)); t--) {\n            if (((((q[t].offsetLeft + q[t].offsetWidth)) > r))) {\n                h.remove(q[t]);\n            }\n             else break;\n        ;\n        ;\n        };\n    ;\n        var u = \"_529n\";\n        g.removeClass(j.byClass(o, u), u);\n        k.subscribe(\"Medley/transitionToSection\", function(v, w) {\n            if (((p && ((w === p.getAttribute(\"data-medley-id\")))))) {\n                return;\n            }\n        ;\n        ;\n            ((p && g.removeClass(p, \"_6-7\")));\n            for (var x = 0; ((x < q.length)); ++x) {\n                if (((q[x].getAttribute(\"data-medley-id\") === w))) {\n                    g.addClass(q[x], \"_6-7\");\n                    p = q[x];\n                    return;\n                }\n            ;\n            ;\n            };\n        ;\n        });\n    };\n;\n    e.exports = n;\n});\n__d(\"TimelineOGCollectionAddSelector\", [\"AsyncRequest\",\"DOM\",\"Form\",\"TidyArbiterMixin\",\"copyProperties\",\"csx\",\"tidyEvent\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = b(\"DOM\"), i = b(\"Form\"), j = b(\"TidyArbiterMixin\"), k = b(\"copyProperties\"), l = b(\"csx\"), m = b(\"tidyEvent\");\n    function n(o, p, q, r) {\n        this._endpoint = q;\n        this._button = o;\n        this._buttonParent = o.parentNode;\n        this._audienceSelector = r;\n        var s = h.JSBNG__find(o, \"._4ihv\");\n        n.inform(\"addButton\", {\n            button: s,\n            root: this._buttonParent\n        });\n        m([p.getMenu().subscribe(\"rendered\", function(t, u) {\n            n.inform(\"menuOpened\", {\n                audienceSelector: r\n            });\n            h.appendContent(h.JSBNG__find(u, \"._54ng\"), r);\n        }),p.subscribe(\"itemselected\", this._onChange.bind(this)),]);\n    };\n;\n    k(n, j);\n    k(n.prototype, j, {\n        _onChange: function(o, p) {\n            var q = p.getValue(), r = ((this.inform(\"addedToCollection\", q) || {\n            }));\n            new g(this._endpoint).setData(k(i.serialize(this._audienceSelector), r, {\n                action: \"add\",\n                collection_token: q,\n                mechanism: \"add_selector\"\n            })).send();\n        }\n    });\n    e.exports = n;\n});\n__d(\"TimelineCurationNUXController\", [\"AppSectionCurationState\",\"AsyncRequest\",\"CSS\",\"DOM\",\"JSBNG__Event\",\"OGCollectionAddMenu\",\"TimelineOGCollectionAddSelector\",\"URI\",\"$\",\"csx\",\"cx\",\"tidyEvent\",], function(a, b, c, d, e, f) {\n    var g = b(\"AppSectionCurationState\"), h = b(\"AsyncRequest\"), i = b(\"CSS\"), j = b(\"DOM\"), k = b(\"JSBNG__Event\"), l = b(\"OGCollectionAddMenu\"), m = b(\"TimelineOGCollectionAddSelector\"), n = b(\"URI\"), o = b(\"$\"), p = b(\"csx\"), q = b(\"cx\"), r = b(\"tidyEvent\"), s = 5, t = \"pagelet_timeline_medley_movies\", u = 165, v, w, x, y, z, aa, ba = [], ca = {\n        reports: 0,\n        about: 1,\n        section: 2,\n        section_privacy: 3,\n        add_button: 4,\n        privacy: 5,\n        0: \"reports\",\n        1: \"about\",\n        2: \"section\",\n        3: \"section_privacy\",\n        4: \"add_button\",\n        5: \"privacy\"\n    };\n    function da() {\n        ba.forEach(function(na) {\n            ((na.button && na.button.setAttribute(\"data-hover\", \"tooltip\")));\n            ((na.listener && na.listener.remove()));\n        });\n        ba.length = 0;\n    };\n;\n    function ea(na) {\n        if (z[na]) {\n            z[na].destroy();\n            delete z[na];\n            ((((na === \"add_button\")) && da()));\n        }\n    ;\n    ;\n        ((((aa[na] && aa[na].parentNode)) && j.remove(aa[na])));\n    };\n;\n    function fa(na) {\n        if (!i.hasClass(na, \"_50_y\")) {\n            i.addClass(na, \"_50_y\");\n            d([\"Animation\",], function(oa) {\n                new oa(na).to(\"opacity\", 0).duration(300).ease(oa.ease.end).hide().go();\n            });\n        }\n    ;\n    ;\n    };\n;\n    function ga(na) {\n        ha(na);\n        var oa = ((ca[na] + 1));\n        ((oa && ia(ca[oa])));\n    };\n;\n    function ha(na) {\n        new h(\"/ajax/timeline/collections/tour/curation/\").setAllowCrossPageTransition(true).setData({\n            step: na\n        }).send();\n        ea(na);\n    };\n;\n    function ia(na) {\n        y = na;\n        switch (na) {\n          case \"reports\":\n            d([\"TimelineController\",], function(oa) {\n                oa.runOnceWhenSectionFullyLoaded(function() {\n                    ka(j.JSBNG__find(o(\"timeline_tab_content\"), \"._3rbg\"), na);\n                }, \"recent\", \"0\");\n            });\n            break;\n          case \"about\":\n            v = j.scry(o(\"fbTimelineHeadline\"), \"._6-6\")[1];\n            w = r(k.listen(v, \"click\", function() {\n                v = null;\n                w.remove();\n                y = \"section\";\n            }));\n            ka(v, na);\n            break;\n          case \"section\":\n            if (v) {\n                n(v.getAttribute(\"href\")).go();\n                v = null;\n                ((w && w.remove()));\n            }\n             else d([\"OnVisible\",\"TimelineMedley\",], function(oa, pa) {\n                j.appendContent(j.JSBNG__find(o(\"pagelet_timeline_main_column\"), \"._2w3\"), aa.section);\n                r(k.listen(aa.section, \"click\", function() {\n                    pa.scrollToSection(t, u, 1);\n                    fa(aa.section);\n                }));\n                pa.loadToSection(t, function() {\n                    ka(o(t), na);\n                    var qa = new oa(o(t), function() {\n                        fa(aa.section);\n                        qa.remove();\n                    }, false, -u);\n                });\n            });\n        ;\n        ;\n            break;\n          case \"section_privacy\":\n            d([\"TimelineAppSectionCuration\",], function(oa) {\n                oa.informState(g.showItems, t);\n                ka(j.scry(o(t), \".audienceSelector\")[0], na);\n            });\n            break;\n          case \"privacy\":\n            k.fire(x, \"click\");\n            break;\n        };\n    ;\n    };\n;\n    function ja(na, oa) {\n        if (z.add_button) {\n            var pa = j.scry(oa, \"[data-hover]\")[0];\n            ba.push({\n                button: pa,\n                listener: r(k.listen(na, \"mouseenter\", function() {\n                    x = na;\n                    ka(na, \"add_button\");\n                }))\n            });\n            ((pa && pa.removeAttribute(\"data-hover\")));\n        }\n    ;\n    ;\n    };\n;\n    function ka(na, oa) {\n        if (z[oa]) {\n            z[oa].setContext(na).setOffsetX(5).show();\n            if (((oa === \"privacy\"))) {\n                ea(\"add_button\");\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n    };\n;\n    function la(na, oa, pa) {\n        var qa = pa.getAttribute(\"data-action\");\n        if (((((qa === \"next\")) || ((qa === \"done\"))))) {\n            ga(na);\n        }\n         else ha(na);\n    ;\n    ;\n    };\n;\n    var ma = {\n        init: function(na) {\n            var oa = na.next_step, pa = ca[oa];\n            z = na.dialogs;\n            aa = ((na.links ? na.links : []));\n            da();\n            if (((((oa === \"section\")) && ((oa !== y))))) {\n                ea(\"section\");\n                ea(\"section_privacy\");\n                pa += 2;\n                oa = ca[pa];\n            }\n        ;\n        ;\n            {\n                var fin275keys = ((window.top.JSBNG_Replay.forInKeys)((z))), fin275i = (0);\n                var qa;\n                for (; (fin275i < fin275keys.length); (fin275i++)) {\n                    ((qa) = (fin275keys[fin275i]));\n                    {\n                        r(z[qa].subscribe(\"button\", la.curry(qa)));\n                    ;\n                    };\n                };\n            };\n        ;\n            if (z.add_button) {\n                var ra = ((na.isViewingSelf ? m : l));\n                r([ra.subscribe(\"menuOpened\", function(sa, ta) {\n                    ka.curry(j.JSBNG__find(ta.audienceSelector, \".audienceSelector\"), \"privacy\").defer(s);\n                }),ra.subscribe(\"addButton\", function(sa, ta) {\n                    ja.curry(ta.button, ta.root).defer(s);\n                }),]);\n            }\n        ;\n        ;\n            if (((na.isViewingSelf && ((pa < ca.add_button))))) {\n                ia(oa);\n            }\n        ;\n        ;\n        }\n    };\n    e.exports = ma;\n});\n__d(\"TimelineStickyRightColumn\", [\"Arbiter\",\"CSS\",\"DOMQuery\",\"JSBNG__Event\",\"PhotoSnowlift\",\"Run\",\"Style\",\"TimelineContentLoader\",\"Vector\",\"UserAgent\",\"csx\",\"queryThenMutateDOM\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"CSS\"), i = b(\"DOMQuery\"), j = b(\"JSBNG__Event\"), k = b(\"PhotoSnowlift\"), l = b(\"Run\"), m = b(\"Style\"), n = b(\"TimelineContentLoader\"), o = b(\"Vector\"), p = b(\"UserAgent\"), q = b(\"csx\"), r = b(\"queryThenMutateDOM\"), s = 100, t = 15, u = 15, v = 71, w = false, x = null, y = null, z, aa, ba, ca, da, ea, fa, ga;\n    function ha() {\n        if (k.getInstance().isOpen) {\n            return;\n        }\n    ;\n    ;\n        z = n.getCurrentSection();\n        if (((!z || !z.rightColumnFinished))) {\n            return;\n        }\n    ;\n    ;\n        var pa = i.scry(z.node, \"._3rbf\")[0], qa = i.scry(z.node, \"._3rbh\")[0];\n        aa = ((pa ? pa.offsetHeight : 0));\n        ba = ((qa ? qa.offsetHeight : 0));\n        ca = o.getViewportDimensions().y;\n        fa = ((pa ? o.getElementPosition(pa).y : 0));\n        ga = ((JSBNG__document.body.clientWidth < JSBNG__document.body.scrollWidth));\n    };\n;\n    function ia() {\n        if (k.getInstance().isOpen) {\n            return;\n        }\n    ;\n    ;\n        if (((y && ((y !== z))))) {\n            var pa = i.scry(y.node, \"._3rbh\")[0];\n            if (pa) {\n                ka(pa, \"\", \"\", \"\");\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n        var qa = i.scry(z.node, \"._3rbh\")[0];\n        if (!qa) {\n            return;\n        }\n    ;\n    ;\n        if (ga) {\n            ka(qa, \"\", \"\", \"\");\n            return;\n        }\n    ;\n    ;\n        if (((!z || !z.rightColumnFinished))) {\n            return;\n        }\n    ;\n    ;\n        ja(z);\n        y = ((h.hasClass(qa, \"fixed_always\") ? z : null));\n    };\n;\n    function ja(pa) {\n        if (((((ba >= aa)) || ((aa <= ca))))) {\n            return;\n        }\n    ;\n    ;\n        ea = da;\n        da = o.getScrollPosition().y;\n        var qa, ra = i.scry(pa.node, \"._3rbh\")[0];\n        if (!ra) {\n            return;\n        }\n    ;\n    ;\n        if (((da <= ((fa - la()))))) {\n            ka(ra, \"\", \"\", \"\");\n            return;\n        }\n    ;\n    ;\n        if (((((aa + fa)) <= ((da + Math.min(((ba + la())), ((((ca - u)) - v)))))))) {\n            ka(ra, \"absolute\", \"\", ((u + \"px\")));\n            return;\n        }\n    ;\n    ;\n        if (((ba > ((((ca - u)) - la()))))) {\n            if (((da < ea))) {\n                var sa = false;\n                if (((ra.style.position === \"absolute\"))) {\n                    if (((((ra.style.JSBNG__top !== \"\")) && ((((((da + la())) - fa)) <= parseInt(ra.style.JSBNG__top, 10)))))) {\n                        sa = true;\n                    }\n                     else if (((((ra.style.bottom !== \"\")) && ((da <= ((((((fa + aa)) - la())) - ba))))))) {\n                        sa = true;\n                    }\n                    \n                ;\n                }\n            ;\n            ;\n                if (sa) {\n                    ka(ra, \"fixed\", ((la() + \"px\")), \"\");\n                    return;\n                }\n                 else if (((((ra.style.position === \"absolute\")) && ra.style.JSBNG__top))) {\n                    return;\n                }\n                 else if (h.hasClass(ra, \"fixed_always\")) {\n                    if (((parseInt(ra.style.JSBNG__top, 10) >= la()))) {\n                        return;\n                    }\n                ;\n                ;\n                    qa = ((((da - fa)) - ((ba - ((ca - v))))));\n                    if (ea) {\n                        qa += ((ea - da));\n                    }\n                ;\n                ;\n                    ka(ra, \"absolute\", ((qa + \"px\")), \"\");\n                    return;\n                }\n                \n                \n            ;\n            ;\n            }\n             else {\n                var ta = false;\n                if (((((ra.style.position === \"absolute\")) || ((((ra.style.position === \"\")) && !h.hasClass(ra, \"fixed_always\")))))) {\n                    qa = ((ra.style.JSBNG__top ? parseInt(ra.style.JSBNG__top, 10) : 0));\n                    if (((((da + ca)) >= ((((((fa + qa)) + ba)) + v))))) {\n                        ta = true;\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n                if (ta) {\n                    qa = ((((((ca - ba)) - u)) - v));\n                    ka(ra, \"fixed\", ((qa + \"px\")), \"\");\n                    return;\n                }\n                 else if (((da == ea))) {\n                    return;\n                }\n                 else if (h.hasClass(ra, \"fixed_always\")) {\n                    if (((parseInt(ra.style.JSBNG__top, 10) >= la()))) {\n                        qa = ((((da - fa)) + la()));\n                        if (ea) {\n                            qa += ((ea - da));\n                        }\n                    ;\n                    ;\n                        ka(ra, \"absolute\", ((qa + \"px\")), \"\");\n                        return;\n                    }\n                ;\n                ;\n                }\n                 else if (((ra.style.position === \"absolute\"))) {\n                    return;\n                }\n                \n                \n                \n            ;\n            ;\n            }\n        ;\n        ;\n        }\n         else ka(ra, \"fixed\", ((la() + \"px\")), \"\");\n    ;\n    ;\n    };\n;\n    function ka(pa, qa, ra, sa) {\n        m.set(pa, \"bottom\", sa);\n        if (((qa === \"fixed\"))) {\n            h.addClass(pa, \"fixed_always\");\n            m.set(pa, \"position\", \"\");\n        }\n         else {\n            h.removeClass(pa, \"fixed_always\");\n            m.set(pa, \"position\", qa);\n        }\n    ;\n    ;\n        m.set(pa, \"JSBNG__top\", ra);\n        g.inform(\"reflow\");\n    };\n;\n    function la() {\n        return ((h.hasClass(JSBNG__document.documentElement, \"tinyViewport\") ? t : s));\n    };\n;\n    function ma() {\n        r(ha, ia);\n    };\n;\n    function na() {\n        w = false;\n        y = null;\n        while (x.length) {\n            x.pop().remove();\n        ;\n        };\n    ;\n        x = null;\n    };\n;\n    var oa = {\n        init: function() {\n            if (((w || ((p.ie() < 8))))) {\n                return;\n            }\n        ;\n        ;\n            w = true;\n            x = [j.listen(window, \"JSBNG__scroll\", ma),j.listen(window, \"resize\", ma),];\n            l.onLeave(na);\n        },\n        adjust: function() {\n            if (w) {\n                ha();\n                ia();\n            }\n        ;\n        ;\n        }\n    };\n    e.exports = oa;\n});");
// 18229
JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_190[0](o15,false,"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yg/r/5QLY1f97RlL.js",o16);
// undefined
o15 = null;
// undefined
o16 = null;
// 18241
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o7,"if (self.CavalryLogger) {\n    CavalryLogger.start_js([\"jsIYP\",]);\n}\n;\n__d(\"AdsCurrency\", [\"AdsCurrencyConfig\",], function(a, b, c, d, e, f) {\n    var g = b(\"AdsCurrencyConfig\").currencies;\n    function h(m) {\n        if (g[m]) {\n            return g[m][0]\n        };\n        return null;\n    };\n    function i(m) {\n        if (g[m]) {\n            return g[m][1]\n        };\n        return null;\n    };\n    function j(m) {\n        if (g[m]) {\n            return (1 * g[m][2])\n        };\n        return 1;\n    };\n    var k = [];\n    for (var l in g) {\n        if (g.hasOwnProperty(l)) {\n            k.push(l);\n        };\n    };\n    f.getFormat = h;\n    f.getSymbol = i;\n    f.getOffset = j;\n    f.currencyMapKeys = k;\n});\n__d(\"ads-lib-formatters\", [\"AdsCurrency\",], function(a, b, c, d, e, f) {\n    var g = b(\"AdsCurrency\"), h = \"USD\";\n    function i(t, u, v) {\n        t = (t || \"\");\n        v = (v || \"\");\n        u = ((typeof u === \"undefined\") ? t.length : u);\n        return ((t.length > u) ? ((t.substr(0, (u - v.length)) + v)) : t);\n    };\n    function j(t, u) {\n        if (((u === undefined) || (u === null))) {\n            u = \"\";\n        };\n        return function(v) {\n            return (!v ? u : i(v, t, \"...\"));\n        };\n    };\n    function k(t, u, v, w) {\n        if ((t === \"N/A\")) {\n            return t\n        };\n        t = (t || 0);\n        v = (v || \"\");\n        w = (w || \".\");\n        t = ((u !== null) ? l(t, u) : (t + \"\"));\n        var x = t.split(\".\"), y = x[0], z = x[1], aa = \"\", ba = /(\\d)(\\d\\d\\d)($|\\D)/, ca = ((\"$1\" + v) + \"$2$3\");\n        while (((aa = y.replace(ba, ca)) != y)) {\n            y = aa;;\n        };\n        var da = y;\n        if (z) {\n            da += (w + z);\n        };\n        return da;\n    };\n    function l(t, u) {\n        var v = Math.pow(10, u);\n        t = ((Math.round((t * v)) / v) + \"\");\n        if (!u) {\n            return t\n        };\n        var w = t.indexOf(\".\"), x = 0;\n        if ((w == -1)) {\n            t += \".\";\n            x = u;\n        }\n         else x = (u - (((t.length - w) - 1)));\n    ;\n        for (var y = 0, z = x; (y < z); y++) {\n            t += \"0\";;\n        };\n        return t;\n    };\n    function m(t) {\n        return function(u) {\n            return k(u, (t || 0), \",\", \".\");\n        };\n    };\n    function n(t, u) {\n        var v = ((u === false) ? 1 : 100);\n        return function(w) {\n            return (k((w * v), (t || 0), \",\", \".\") + \"%\");\n        };\n    };\n    var o = {\n    };\n    function p(t, u, v) {\n        if ((t === undefined)) {\n            t = 2;\n        };\n        if ((v === undefined)) {\n            v = false;\n        };\n        u = (u || h);\n        var w = ((((u + \"-\") + t) + \"-\") + v);\n        if (!o[w]) {\n            var x = (g.getFormat(u) || g.getFormat(h)), y = (g.getSymbol(u) || g.getSymbol(h)), z = (g.getOffset(u) || g.getOffset(h));\n            x = x.replace(\"{symbol}\", y);\n            o[w] = function(aa) {\n                if (v) {\n                    aa = (aa / z);\n                };\n                if (!((aa + \"\")).match(/^\\-?[\\d\\.,]*$/)) {\n                    return \"N/A\"\n                };\n                var ba = k(aa, t, \",\", \".\");\n                return x.replace(\"{amount}\", ba);\n            };\n        }\n    ;\n        return o[w];\n    };\n    function q(t) {\n        t = ((t + \"\")).trim().replace(/^[^\\d]*\\-/, \"\\u0002\");\n        if (!(((/^\\u0002?(\\d+,\\d*){2,}$/.test(t)) || (/^\\u0002?(\\d+\\.\\d*){2,}$/.test(t))))) {\n            t = t.replace(/[\\.,](\\d*\\D*)$/, \"\\u0001$1\");\n        };\n        t = t.replace(/[^0-9\\u0001\\u0002]/g, \"\").replace(\"\\u0001\", \".\").replace(\"\\u0002\", \"-\");\n        return (+t || 0);\n    };\n    function r() {\n        return function(t) {\n            return (k(t, 0, \",\", \".\") + \"%\");\n        };\n    };\n    function s(t) {\n        var u = t.currency(), v = ((t.offset() == 100) ? 2 : 0);\n        return p(v, u);\n    };\n    f.createTextTruncator = j;\n    f.chopString = i;\n    f.parseNumber = q;\n    f.formatNumber = k;\n    f.createNumberFormatter = m;\n    f.createPercentFormatter = n;\n    f.createMoneyFormatter = p;\n    f.createMoneyFormatterForAccount = s;\n    f.createInflationFormatter = r;\n});\n__d(\"ComposerXDatepickerIconReset\", [\"CSS\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSS\"), h = b(\"cx\");\n    function i(j) {\n        g.removeClass(j.element, \"_4_na\");\n        g.removeClass(j.element, \"_509o\");\n    };\n    e.exports = i;\n});\n__d(\"legacy:dom-html\", [\"HTML\",], function(a, b, c, d) {\n    a.HTML = b(\"HTML\");\n}, 3);\n__d(\"ScrollingPager\", [\"Arbiter\",\"copyProperties\",\"CSS\",\"OnVisible\",\"UIPagelet\",\"$\",\"ge\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"copyProperties\"), i = b(\"CSS\"), j = b(\"OnVisible\"), k = b(\"UIPagelet\"), l = b(\"$\"), m = b(\"ge\"), n = {\n    };\n    function o(p, q, r, s) {\n        this.scroll_loader_id = p;\n        this.pagelet_src = q;\n        this.data = r;\n        this.options = (s || {\n        });\n        if (this.options.target_id) {\n            this.target_id = this.options.target_id;\n            this.options.append = true;\n        }\n         else this.target_id = p;\n    ;\n        this.scroll_area_id = this.options.scroll_area_id;\n        this.handler = null;\n    };\n    h(o, {\n        REGISTERED: \"ScrollingPager/registered\",\n        getInstance: function(p) {\n            return n[p];\n        }\n    });\n    h(o.prototype, {\n        setBuffer: function(p) {\n            this.options.buffer = p;\n            (this.onvisible && this.onvisible.setBuffer(p));\n        },\n        getBuffer: function() {\n            return this.options.buffer;\n        },\n        register: function() {\n            this.onvisible = new j(l(this.scroll_loader_id), this.getHandler(), false, this.options.buffer, false, m(this.scroll_area_id));\n            n[this.scroll_loader_id] = this;\n            g.inform(o.REGISTERED, {\n                id: this.scroll_loader_id\n            });\n        },\n        getInstance: function(p) {\n            return n[p];\n        },\n        getHandler: function() {\n            if (this.handler) {\n                return this.handler\n            };\n            function p(q) {\n                var r = m(this.scroll_loader_id);\n                if (!r) {\n                    this.onvisible.remove();\n                    return;\n                }\n            ;\n                i.addClass(r.firstChild, \"async_saving\");\n                var s = this.options.handler;\n                this.options.handler = function() {\n                    g.inform(\"ScrollingPager/loadingComplete\");\n                    (s && s.apply(null, arguments));\n                };\n                if (q) {\n                    this.data.pager_fired_on_init = true;\n                };\n                k.loadFromEndpoint(this.pagelet_src, this.target_id, this.data, this.options);\n            };\n            return p.bind(this);\n        },\n        setHandler: function(p) {\n            this.handler = p;\n        },\n        removeOnVisible: function() {\n            this.onvisible.remove();\n        },\n        checkBuffer: function() {\n            (this.onvisible && this.onvisible.checkBuffer());\n        }\n    });\n    e.exports = o;\n});\n__d(\"StickyController\", [\"Event\",\"CSS\",\"Style\",\"Vector\",\"copyProperties\",\"queryThenMutateDOM\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"CSS\"), i = b(\"Style\"), j = b(\"Vector\"), k = b(\"copyProperties\"), l = b(\"queryThenMutateDOM\");\n    function m(n, o, p, q) {\n        this._element = n;\n        this._marginTop = o;\n        this._onchange = p;\n        this._proxy = (q || n.parentNode);\n        this._boundQueryOnScroll = this._queryOnScroll.bind(this);\n        this._boundMutateOnScroll = this._mutateOnScroll.bind(this);\n    };\n    k(m.prototype, {\n        handleScroll: function() {\n            l(this._boundQueryOnScroll, this._boundMutateOnScroll);\n        },\n        _queryOnScroll: function() {\n            this._shouldFix = (j.getElementPosition(this._proxy, \"viewport\").y <= this._marginTop);\n        },\n        _mutateOnScroll: function() {\n            var n = this._shouldFix;\n            if ((this.isFixed() !== n)) {\n                i.set(this._element, \"top\", (n ? (this._marginTop + \"px\") : \"\"));\n                h.conditionClass(this._element, \"fixed_elem\", n);\n                (this._onchange && this._onchange(n));\n            }\n        ;\n        },\n        start: function() {\n            if (this._event) {\n                return\n            };\n            this._event = g.listen(window, \"scroll\", this.handleScroll.bind(this));\n            this.handleScroll.bind(this).defer();\n        },\n        stop: function() {\n            (this._event && this._event.remove());\n            this._event = null;\n        },\n        isFixed: function() {\n            return h.hasClass(this._element, \"fixed_elem\");\n        }\n    });\n    e.exports = m;\n});\n__d(\"tidyEvent\", [\"Run\",], function(a, b, c, d, e, f) {\n    var g = b(\"Run\"), h = [];\n    function i() {\n        while (h.length) {\n            var k = h.shift();\n            if (k.remove) {\n                (k._handler && k.remove());\n            }\n             else (k && k.unsubscribe());\n        ;\n        };\n    };\n    function j(k) {\n        if (!h.length) {\n            g.onLeave(i);\n        };\n        if (Array.isArray(k)) {\n            h = h.concat(k);\n        }\n         else h.push(k);\n    ;\n        return k;\n    };\n    e.exports = j;\n});\n__d(\"TriggerablePageletLoader\", [\"function-extensions\",\"CSS\",\"Event\",\"OnVisible\",\"Run\",\"UIPagelet\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    b(\"function-extensions\");\n    var g = b(\"CSS\"), h = b(\"Event\"), i = b(\"OnVisible\"), j = b(\"Run\"), k = b(\"UIPagelet\"), l = b(\"copyProperties\"), m = [];\n    function n(p) {\n        if (!m[p]) {\n            return\n        };\n        (m[p].__trigger && m[p].__trigger.remove());\n        delete m[p];\n    };\n    function o(p, q) {\n        this._disabledTriggerKeys = [];\n        this._pageletConfig = p;\n        this._loaded = false;\n        this._loading = false;\n        this._triggerKeys = [];\n        if (q) {\n            q.forEach(this.addTrigger.bind(this));\n        };\n        j.onLeave(this.destroy.bind(this));\n    };\n    l(o, {\n        removeTrigger: function(p) {\n            for (var q in m) {\n                if ((m[q] && (m[q].node === p))) {\n                    n(q);\n                };\n            };\n        },\n        TRIGGER_CLICK: \"click\",\n        TRIGGER_ONVISIBLE: \"onvisible\",\n        TRIGGER_NOW: \"now\"\n    });\n    l(o.prototype, {\n        addTrigger: function(p) {\n            p.__trigger = this._createTrigger(p);\n            m.push(p);\n            this._triggerKeys.push((m.length - 1));\n        },\n        destroy: function() {\n            this.removeTriggers();\n            if (this._pageletRequest) {\n                this._pageletRequest.cancel();\n                this._pageletRequest = null;\n                this._loading = false;\n                this._loaded = false;\n            }\n        ;\n        },\n        disableTriggers: function() {\n            this._triggerKeys.forEach(function(p) {\n                if (m[p]) {\n                    m[p].__trigger.remove();\n                    this._disabledTriggerKeys.push(p);\n                }\n            ;\n            }.bind(this));\n        },\n        enableTriggers: function() {\n            if ((this._loaded || this._loading)) {\n                return\n            };\n            this._disabledTriggerKeys.forEach(function(p) {\n                if (m[p]) {\n                    m[p].__trigger = this._createTrigger(m[p]);\n                };\n            }.bind(this));\n            this._disabledTriggerKeys.length = 0;\n        },\n        _createTrigger: function(p) {\n            if ((this._loaded || this._loading)) {\n                return\n            };\n            var q = this.onTrigger.bind(this, p);\n            switch (p.type) {\n              case o.TRIGGER_CLICK:\n                return h.listen(p.node, \"click\", function(r) {\n                    r.prevent();\n                    q();\n                });\n              case o.TRIGGER_ONVISIBLE:\n                return new i(p.node, q, p.onVisibleStrict, p.onVisibleBuffer);\n              case o.TRIGGER_NOW:\n                return q();\n              default:\n            \n            };\n        },\n        load: function(p) {\n            if ((this._loaded || this._loading)) {\n                return\n            };\n            this._loading = true;\n            this._loaded = false;\n            g.addClass(this._pageletConfig.node, \"async_saving\");\n            if ((p && p.node)) {\n                g.addClass(p.node, \"async_saving\");\n            };\n            var q = (this._pageletConfig.options || {\n            });\n            q.displayCallback = this.onLoad.bind(this, p);\n            if ((q.crossPage === undefined)) {\n                q.crossPage = true;\n            };\n            this._pageletRequest = k.loadFromEndpoint(this._pageletConfig.controller, this._pageletConfig.node, this._pageletConfig.data, q);\n        },\n        onLoad: function(p, q) {\n            this._loaded = true;\n            this._pageletRequest = null;\n            g.removeClass(this._pageletConfig.node, \"async_saving\");\n            if ((p && p.node)) {\n                g.removeClass(p.node, \"async_saving\");\n            };\n            if (this._pageletConfig.displayCallback) {\n                this._pageletConfig.displayCallback(q);\n            }\n             else q();\n        ;\n        },\n        onTrigger: function(p) {\n            (p.callback && p.callback(p));\n            if ((!this._loaded && !this._loading)) {\n                this.load(p);\n            };\n        },\n        removeTriggers: function(p) {\n            this._triggerKeys.forEach(function(q) {\n                if ((m[q] && ((!p || (m[q].type === p))))) {\n                    n(q);\n                };\n            });\n        }\n    });\n    e.exports = o;\n});\n__d(\"MedleyPageletRequestData\", [\"Arbiter\",\"TidyArbiter\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"TidyArbiter\"), i = {\n    }, j = {\n        get: function() {\n            return i;\n        },\n        set: function(k) {\n            i = k;\n            h.inform(\"Medley/requestDataSet\", null, g.BEHAVIOR_STATE);\n        }\n    };\n    e.exports = j;\n});\n__d(\"TimelineSection\", [\"Arbiter\",\"DOMScroll\",\"DoublyLinkedListMap\",\"Run\",\"TidyArbiterMixin\",\"copyProperties\",\"ge\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"DOMScroll\"), i = b(\"DoublyLinkedListMap\"), j = b(\"Run\"), k = b(\"TidyArbiterMixin\"), l = b(\"copyProperties\"), m = b(\"ge\"), n = null;\n    function o() {\n        n = null;\n    };\n    function p(q, r, s) {\n        this.id = q;\n        this.label = s;\n        this.nodeID = r;\n        this._parentSection = null;\n        this.childSections = new i();\n        this._isLoaded = false;\n        p.inform.bind(p, (\"sectionInitialized/\" + q), {\n            section: this\n        }, g.BEHAVIOR_STATE).defer();\n    };\n    l(p, k, {\n        callWithSection: function(q, r) {\n            this.subscribe((\"sectionInitialized/\" + q), function(s, t) {\n                r(t.section);\n            });\n        },\n        setActiveSectionID: function(q) {\n            (!n && j.onLeave(o));\n            n = q;\n        }\n    });\n    l(p.prototype, {\n        appendSection: function(q) {\n            this.childSections.append(q.id, q);\n            q._parentSection = this;\n        },\n        freeze: function() {\n            this.freezeChildren();\n        },\n        freezeChildren: function() {\n            var q = this.childSections.getHead();\n            while (q) {\n                (!q.isActive() && q.freeze());\n                q = q.getNext();\n            };\n        },\n        getNext: function() {\n            return (this._parentSection && this._parentSection.childSections.getNext(this.id));\n        },\n        getPrev: function() {\n            return (this._parentSection && this._parentSection.childSections.getPrev(this.id));\n        },\n        isActive: function() {\n            var q = this;\n            while (q) {\n                if ((q.id === n)) {\n                    return true\n                };\n                q = q._parentSection;\n            };\n            return false;\n        },\n        isLoaded: function() {\n            return this._isLoaded;\n        },\n        setIsLoaded: function(q) {\n            this._isLoaded = q;\n            return this;\n        },\n        scrollTo: function() {\n            if (!m(this.nodeID)) {\n                return\n            };\n            h.scrollTo(this.getNode(), true, false, false, h.scrollTo.bind(this).curry(this.getNode(), 0));\n        },\n        thaw: function() {\n            this.thawChildren();\n        },\n        thawChildren: function() {\n            var q = this.childSections.getHead();\n            while (q) {\n                q.thaw();\n                q = q.getNext();\n            };\n        }\n    });\n    e.exports = p;\n});\n__d(\"TimelineDynamicSection\", [\"Class\",\"DOM\",\"TimelineSection\",\"copyProperties\",\"cx\",\"ge\",\"TimelineDynamicSectionConfig\",], function(a, b, c, d, e, f) {\n    var g = b(\"Class\"), h = b(\"DOM\"), i = b(\"TimelineSection\"), j = b(\"copyProperties\"), k = b(\"cx\"), l = b(\"ge\"), m = b(\"TimelineDynamicSectionConfig\");\n    function n(o, p, q) {\n        this._controller = p;\n        this._data = null;\n        this._node = null;\n        this._triggerLoader = null;\n        this.parent.construct(this, o, o, q);\n    };\n    g.extend(n, i);\n    j(n.prototype, {\n        _createNode: function() {\n            return h.create(\"div\", {\n                className: \"_30f\",\n                id: this.nodeID\n            }, [m.throbber.cloneNode(true),]);\n        },\n        getNode: function() {\n            if (!this._node) {\n                this._node = (l(this.nodeID) || this._createNode());\n            };\n            return this._node;\n        }\n    });\n    e.exports = n;\n});\n__d(\"TimelineAppCollection\", [\"function-extensions\",\"Class\",\"CSS\",\"DOM\",\"DOMQuery\",\"Event\",\"MedleyPageletRequestData\",\"NumberFormatConfig\",\"PageTransitions\",\"Parent\",\"Style\",\"TidyArbiter\",\"TidyArbiterMixin\",\"TimelineDynamicSection\",\"TimelineSection\",\"TriggerablePageletLoader\",\"TimelineDynamicSectionConfig\",\"copyProperties\",\"csx\",\"cx\",\"ads-lib-formatters\",\"ge\",], function(a, b, c, d, e, f) {\n    b(\"function-extensions\");\n    var g = b(\"Class\"), h = b(\"CSS\"), i = b(\"DOM\"), j = b(\"DOMQuery\"), k = b(\"Event\"), l = b(\"MedleyPageletRequestData\"), m = b(\"NumberFormatConfig\"), n = b(\"PageTransitions\"), o = b(\"Parent\"), p = b(\"Style\"), q = b(\"TidyArbiter\"), r = b(\"TidyArbiterMixin\"), s = b(\"TimelineDynamicSection\"), t = b(\"TimelineSection\"), u = b(\"TriggerablePageletLoader\"), v = b(\"TimelineDynamicSectionConfig\"), w = b(\"copyProperties\"), x = b(\"csx\"), y = b(\"cx\"), z = b(\"ads-lib-formatters\"), aa = b(\"ge\"), ba = 500, ca = 8;\n    function da(ha) {\n        var ia = aa(ga.getIDByToken(ha));\n        if (!ia) {\n            return\n        };\n        return i.scry(ia, \"._620\")[0];\n    };\n    function ea(ha, ia) {\n        ((ia && !ia.isDefaultRequested()) && ia.prevent());\n        var ja = ha._parentSection, ka = ja._parentSection;\n        t.setActiveSectionID(ja.id);\n        ja.setActiveCollection(ha);\n        if ((ja._sk === ka._sk)) {\n            if (!h.hasClass(ka.getNode(), \"_c4f\")) {\n                h.addClass(ka.getNode(), \"_c4f\");\n                ka.freezeChildren();\n            }\n        ;\n            (ha._isFullyLoaded && ka.addSectionTeasers());\n        }\n    ;\n        if ((!ka.isMedleyView() && (ja._sk === ka._sk))) {\n            var la = ha.href;\n            n.rewriteCurrentURI(n.getCurrentURI().getUnqualifiedURI(), la);\n        }\n    ;\n    };\n    function fa(ha, ia) {\n        ia.data.overview = (ha._parentSection._sk !== ha._parentSection._parentSection._sk);\n        ia.data.cursor = null;\n        ea(ha);\n    };\n    function ga(ha, ia, ja, ka, la, ma) {\n        this._contentLoader = null;\n        this._isFrozen = false;\n        this._isFullyLoaded = false;\n        this._cursor = 0;\n        this._tabNode = ja;\n        this._tabCount = ((ka > 0) ? ka : 0);\n        this._token = ha;\n        this._ftid = null;\n        this.auxContent = null;\n        this.curationContent = null;\n        this._order = la;\n        this.href = ma;\n        this._sortContent = null;\n        this.refreshCount();\n        this.parent.construct(this, ga.getIDByToken(ha), ia);\n        if (!ja) {\n            return\n        };\n        if (aa(this.nodeID)) {\n            k.listen(ja, \"click\", ea.curry(this));\n        }\n         else this.createTriggerLoader.bind(this).defer();\n    ;\n    };\n    g.extend(ga, s);\n    w(ga, r, {\n        NEW_ITEM: \"TimelineAppCollection/newItem\",\n        ADDING_PLACEHOLDER: \"TimelineAppCollection/addingPlaceholder\",\n        addPlaceholderToCollection: function(ha, ia, ja) {\n            ja = ((typeof ja !== \"undefined\") ? ja : {\n            });\n            if (!ja.suppressCount) {\n                this.incrementCount(ga.getIDByToken(ha));\n            };\n            t.callWithSection(ga.getIDByToken(ha), function(ka) {\n                var la = i.scry(ia, \"._gx7\")[0].cloneNode(true), ma = i.scry(ia, \"._gx8 .img\")[0], na = i.scry(ia, \"._3owb\")[0], oa = (na && na.getAttribute(\"data-obj\"));\n                if ((!la || !oa)) {\n                    return\n                };\n                ka.inform(ga.ADDING_PLACEHOLDER);\n                var pa = da(ha);\n                if (!pa) {\n                    return\n                };\n                var qa = i.scry(pa, ((\"[data-obj=\\\"\" + oa) + \"\\\"]\"))[0], ra = i.create(\"div\", {\n                    className: \"_4-he\"\n                });\n                if (ma) {\n                    p.set(ra, \"background-image\", ((\"url(\" + ma.src) + \")\"));\n                };\n                var sa = i.create(\"div\", {\n                    className: \"_gx8\"\n                }, [ra,]), ta = i.create(\"div\", {\n                    className: \"_gx6\"\n                }, [la,]), ua = i.create(\"div\", {\n                    className: \"_3owb\"\n                }, [sa,ta,]), va = i.create(\"li\", {\n                    className: \"_5rz\",\n                    id: (\"collectionItemPlaceholder\" + oa)\n                }, [ua,]);\n                if ((qa && ja.replaceExistingElement)) {\n                    i.replace(qa.parentNode, va);\n                }\n                 else {\n                    if (qa) {\n                        i.remove(qa.parentNode);\n                    }\n                     else if ((ka.isOverview() && (pa.children.length >= ca))) {\n                        h.addClass(pa.children[(ca - 1)], \"_51k9\");\n                    }\n                ;\n                    i.prependContent(pa, va);\n                }\n            ;\n            });\n        },\n        replaceItem: function(ha, ia, ja) {\n            var ka = o.byClass(ha, \"_620\"), la = i.scry(ka, ((\"div[data-obj=\\\"\" + ia) + \"\\\"]\"))[0];\n            if (la) {\n                ga.inform(ga.NEW_ITEM, {\n                    grid: ka,\n                    newItem: ja\n                });\n                i.replace(la.parentNode, ja);\n            }\n        ;\n        },\n        addItemToCollection: function(ha, ia, ja) {\n            var ka = aa(ja);\n            if (!ka) {\n                return\n            };\n            var la = i.scry(ka, \"._620\")[0], ma = la.parentNode.nextSibling;\n            if ((ma && h.hasClass(ma, \"_3t3\"))) {\n                i.remove(la.lastChild);\n            };\n            this.inform(ga.NEW_ITEM, {\n                grid: la,\n                newItem: ha\n            });\n            var na = aa((\"collectionItemPlaceholder\" + ia));\n            if (na) {\n                i.replace(na, ha);\n                return;\n            }\n        ;\n            i.prependContent(la, ha);\n        },\n        createFromArray: function(ha) {\n            return ha.map(function(ia) {\n                return new ga(ia.token, ia.controller, ia.tab_node, ia.tab_count, ia.order, ia.href);\n            });\n        },\n        decrementCount: function(ha) {\n            t.callWithSection(ha, function(ia) {\n                if ((ia._tabCount > 0)) {\n                    ia._tabCount--;\n                    ia.refreshCount();\n                    ia.flashCountIf();\n                }\n            ;\n            });\n        },\n        enableContentLoader: function(ha, ia, ja) {\n            t.callWithSection(ha, function(ka) {\n                ka.addContentLoader(ia, ja);\n            });\n        },\n        getIDByToken: function(ha) {\n            return (\"pagelet_timeline_app_collection_\" + ha);\n        },\n        incrementCount: function(ha) {\n            t.callWithSection(ha, function(ia) {\n                ia._tabCount++;\n                ia.refreshCount();\n                ia.flashCountIf();\n            });\n        },\n        registerAuxContent: function(ha, ia) {\n            t.callWithSection(ha, function(ja) {\n                ja.registerAuxContent(ia);\n            });\n        },\n        registerAddCurationContent: function(ha, ia, ja, ka) {\n            t.callWithSection(ha, function(la) {\n                la.registerAddCurationContent(ia, ja, ka);\n            });\n        },\n        registerSortContent: function(ha, ia, ja) {\n            t.callWithSection(ha, function(ka) {\n                ka.registerSortContent(ia, ja);\n            });\n        },\n        setLoaded: function(ha) {\n            t.callWithSection(ha, function(ia) {\n                ia.setIsLoaded(true);\n                ia._parentSection.inform(\"loaded\", ia);\n                ia._parentSection.unsetMinHeight();\n            });\n        },\n        setFullyLoaded: function(ha) {\n            t.callWithSection(ha, function(ia) {\n                ia._isFullyLoaded = true;\n                var ja = ia._parentSection;\n                ((ja._sk === ja._parentSection._sk) && ja._parentSection.addSectionTeasers());\n            });\n        },\n        setFTID: function(ha, ia) {\n            t.callWithSection(ha, function(ja) {\n                ja.setFTID(ia);\n            });\n        },\n        switchToNullStateCurationContent: function(ha) {\n            t.callWithSection(ga.getIDByToken(ha), function(ia) {\n                ia.nullStateCurationContent();\n            });\n        }\n    });\n    w(ga.prototype, r, {\n        addContentLoader: function(ha, ia) {\n            this._cursor = ia;\n            q.subscribe(\"Medley/requestDataSet\", function() {\n                var ja = {\n                    node: ha\n                };\n                if (h.hasClass(ha, \"_3t3\")) {\n                    ja.type = u.TRIGGER_CLICK;\n                }\n                 else if (this._isFrozen) {\n                    i.remove(ha);\n                    ja.node = v.pager.cloneNode(true);\n                    i.appendContent(this.getNode(), ja.node);\n                    ja.type = u.TRIGGER_CLICK;\n                }\n                 else {\n                    ja.onVisibleBuffer = ba;\n                    ja.onVisibleStrict = true;\n                    ja.type = u.TRIGGER_ONVISIBLE;\n                }\n                \n            ;\n                if ((ja.type === u.TRIGGER_CLICK)) {\n                    ja.callback = t.setActiveSectionID.curry(this.id);\n                };\n                var ka = w({\n                    displayCallback: function(la) {\n                        i.remove(ja.node);\n                        la();\n                    },\n                    options: {\n                        append: true\n                    }\n                }, this.getDefaultPageletConfig());\n                ka.data.overview = this.isOverview();\n                this._triggerLoader = null;\n                this._contentLoader = new u(ka, [ja,]);\n            }.bind(this));\n        },\n        _createNode: function() {\n            var ha = this.parent._createNode();\n            ha.setAttribute(\"aria-role\", \"tabpanel\");\n            return ha;\n        },\n        createTriggerLoader: function() {\n            q.subscribe(\"Medley/requestDataSet\", function() {\n                var ha = this.getDefaultPageletConfig(), ia = {\n                    callback: fa.curry(this, ha),\n                    node: this._tabNode,\n                    type: u.TRIGGER_CLICK\n                };\n                this._triggerLoader = new u(ha, [ia,]);\n            }.bind(this));\n        },\n        disableContentLoader: function() {\n            (this._contentLoader && this._contentLoader.disableTriggers());\n        },\n        enableContentLoader: function() {\n            var ha = (this._triggerLoader || this._contentLoader);\n            (ha && ha.enableTriggers());\n        },\n        freeze: function() {\n            this._isFrozen = true;\n            if ((!this._contentLoader || this._contentLoader._loading)) {\n                return\n            };\n            this._contentLoader.removeTriggers(u.TRIGGER_ONVISIBLE);\n            var ha = j.scry(this.getNode(), \"._3t3\");\n            if (!ha.length) {\n                var ia = j.scry(this.getNode(), \"._359\")[0];\n                (ia.length && this.addContentLoader(ia, this._cursor));\n            }\n        ;\n        },\n        getCount: function() {\n            return this._tabCount;\n        },\n        getDefaultPageletConfig: function() {\n            return {\n                controller: this._controller,\n                data: w({\n                    collection_token: this._token,\n                    cursor: this._cursor\n                }, l.get(), {\n                    ftid: this._ftid,\n                    order: this._order\n                }, {\n                    sk: this._parentSection._sk\n                }),\n                node: this.getNode()\n            };\n        },\n        getMedleySiteKey: function() {\n            return this._parentSection._parentSection._sk;\n        },\n        flashCountIf: function() {\n            if ((this._parentSection.getActiveCollection() != this)) {\n                h.addClass(this._tabNode, \"_4-k9\");\n                setTimeout(h.removeClass.curry(this._tabNode, \"_4-k9\"), 800);\n            }\n        ;\n        },\n        isOverview: function() {\n            return (this._parentSection._sk != this._parentSection._parentSection._sk);\n        },\n        registerAuxContent: function(ha) {\n            this.auxContent = ha;\n            if ((ha.nodeType == 11)) {\n                this.auxContent = i.create(\"span\", null, ha);\n            };\n            if ((this._parentSection._activeCollection !== this)) {\n                h.hide(this.auxContent);\n            };\n            this._parentSection.addAuxContent(this.auxContent);\n        },\n        registerAddCurationContent: function(ha, ia, ja) {\n            if (this.curationContent) {\n                return\n            };\n            this.curationContent = (((ha.nodeType == 11)) ? i.create(\"span\", null, ha) : ha);\n            this.curationContentState = ia;\n            this._parentSection.addCurationContent(this.curationContent, this, ja);\n        },\n        nullStateCurationContent: function() {\n            this._parentSection.nullStateCurationContent();\n        },\n        registerSortContent: function(ha, ia) {\n            (this._sortContent && i.remove(this._sortContent));\n            this._sortContent = ha;\n            ia.subscribeOnce(\"change\", function(ja, ka) {\n                i.setContent(i.find(ha, \"._57oy\"), ka.label);\n                this._sort(ka.value);\n            }.bind(this));\n        },\n        refreshCount: function() {\n            if (!this._tabNode) {\n                return\n            };\n            var ha = j.find(this._tabNode, \"._3d0\");\n            if ((this._tabCount > 0)) {\n                i.setContent(ha, z.formatNumber(this._tabCount, 0, m.numberDelimiter, \"\"));\n            }\n             else i.setContent(ha, \"\");\n        ;\n        },\n        _resetContent: function() {\n            (this._contentLoader && this._contentLoader.destroy());\n            i.remove(this.getNode());\n            this._node = null;\n            i.appendContent(j.find(this._parentSection.getNode(), \"div._3i9\"), this.getNode());\n            this.addContentLoader(j.find(this.getNode(), \"._359\"), 0);\n        },\n        setFTID: function(ha) {\n            this._ftid = ha;\n        },\n        _sort: function(ha) {\n            this._order = ha;\n            this._resetContent();\n            var ia = this._parentSection, ja = ia._parentSection;\n            if ((!ja.isMedleyView() && (ia._sk === ja._sk))) {\n                var ka = n.getCurrentURI();\n                ka.addQueryData({\n                    order: this._order\n                });\n                n.rewriteCurrentURI(n.getCurrentURI().getUnqualifiedURI(), ka);\n            }\n        ;\n        },\n        thaw: function() {\n            this._isFrozen = false;\n        },\n        getToken: function() {\n            return this._token;\n        }\n    });\n    e.exports = ga;\n});\n__d(\"TimelineCommentsLoader\", [\"Event\",\"CommentPrelude\",\"CSS\",\"DOM\",\"Parent\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"CommentPrelude\"), i = b(\"CSS\"), j = b(\"DOM\"), k = b(\"Parent\"), l = b(\"emptyFunction\"), m = {\n        init: function() {\n            m.init = l;\n            g.listen(document.body, \"click\", function(n) {\n                var o = k.byClass(n.getTarget(), \"fbTimelineFeedbackCommentLoader\");\n                if (o) {\n                    n.kill();\n                    h.click(o, false);\n                    var p = k.byTag(o, \"form\"), q = j.scry(p, \"li.uiUfiViewAll input\");\n                    if (!q.length) {\n                        q = j.scry(p, \"li.fbUfiViewPrevious input\");\n                    };\n                    if (!q.length) {\n                        q = j.scry(p, \"a.UFIPagerLink\");\n                    };\n                    q[0].click();\n                    i.show(j.find(p, \"li.uiUfiComments\"));\n                    i.removeClass(o, \"fbTimelineFeedbackCommentLoader\");\n                }\n            ;\n            });\n        }\n    };\n    e.exports = m;\n});\n__d(\"TimelineConstants\", [], function(a, b, c, d, e, f) {\n    var g = {\n        DS_HEIGHT: \"timeline-unit-height\",\n        DS_LOADED: \"timeline-capsule-loaded\",\n        DS_SIDEORG: \"timeline-unit-sideorg\",\n        DS_TAILBALANCE: \"timeline-capsule-tailbalance\",\n        DS_COLUMN_HEIGHT_DIFFERENTIAL: \"timeline-column-diff-height\",\n        FIXED_SIDE_LEFT: \"left\",\n        FIXED_SIDE_RIGHT: \"right\",\n        FIXED_SIDE_BOTH: \"both\",\n        FIXED_SIDE_NONE: \"none\",\n        SCROLL_TO_OFFSET: 30,\n        SUBSECTION_SCROLL_TO_OFFSET: 90,\n        SCRUBBER_DEFAULT_OFFSET: 38,\n        SECTION_LOADING: \"TimelineConstants/sectionLoading\",\n        SECTION_LOADED: \"TimelineConstants/sectionLoaded\",\n        SECTION_FULLY_LOADED: \"TimelineConstants/sectionFullyLoaded\",\n        SECTION_REGISTERED: \"TimelineConstants/sectionRegistered\"\n    };\n    e.exports = g;\n});\n__d(\"TimelineLegacySections\", [], function(a, b, c, d, e, f) {\n    var g = {\n    }, h = {\n        get: function(i) {\n            return g[i];\n        },\n        getAll: function() {\n            return g;\n        },\n        remove: function(i) {\n            delete g[i];\n        },\n        removeAll: function() {\n            g = {\n            };\n        },\n        set: function(i, j) {\n            g[i] = j;\n        }\n    };\n    e.exports = h;\n});\n__d(\"TimelineURI\", [\"URI\",], function(a, b, c, d, e, f) {\n    var g = b(\"URI\"), h = {\n        TIMELINE_KEY: \"timeline\",\n        WALL_KEY: \"wall\",\n        parseURI: function(i) {\n            i = g(i);\n            var j = i.getQueryData(), k = i.getPath(), l = k.split(\"/\").slice(1);\n            if (((l[0] == \"people\") || (l[0] == \"pages\"))) {\n                l = l.slice(2);\n            };\n            var m = ((j.sk || l[1]) || h.TIMELINE_KEY);\n            if ((m == h.WALL_KEY)) {\n                m = h.TIMELINE_KEY;\n            };\n            var n = null, o = null;\n            if ((m == h.TIMELINE_KEY)) {\n                o = (parseInt(l[2], 10) || null);\n                n = (parseInt(l[3], 10) || null);\n            }\n        ;\n            return {\n                path: k,\n                id: (j.id || l[0]),\n                key: m,\n                viewas: (j.viewas ? j.viewas : 0),\n                filter: (j.filter ? j.filter : null),\n                year: o,\n                month: n,\n                friendship: !!j.and\n            };\n        }\n    };\n    e.exports = h;\n});\n__d(\"TimelineController\", [\"Event\",\"Arbiter\",\"CSS\",\"DataStore\",\"DOMQuery\",\"Run\",\"ScrollingPager\",\"TidyArbiter\",\"TimelineConstants\",\"TimelineLegacySections\",\"TimelineURI\",\"Vector\",\"ViewportBounds\",\"$\",\"copyProperties\",\"ge\",\"tidyEvent\",\"queryThenMutateDOM\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"Arbiter\"), i = b(\"CSS\"), j = b(\"DataStore\"), k = b(\"DOMQuery\"), l = b(\"Run\"), m = b(\"ScrollingPager\"), n = b(\"TidyArbiter\"), o = b(\"TimelineConstants\"), p = b(\"TimelineLegacySections\"), q = b(\"TimelineURI\"), r = b(\"Vector\"), s = b(\"ViewportBounds\"), t = b(\"$\"), u = b(\"copyProperties\"), v = b(\"ge\"), w = b(\"tidyEvent\"), x = b(\"queryThenMutateDOM\"), y = 358, z = 48, aa = 740, ba = 1285, ca = null, da = false, ea, fa, ga, ha = {\n    }, ia = {\n    }, ja = [], ka = null, la = null, ma = false, na = false, oa = 0, pa = false, qa = false, ra = false, sa = {\n    }, ta = false;\n    function ua() {\n        (ka && ka.remove());\n        ka = null;\n    };\n    function va(hb, ib, jb) {\n        jb = (jb || []);\n        if (ha[hb]) {\n            return ha[hb][ib].apply(ha[hb], jb)\n        };\n        ia[hb] = (ia[hb] || {\n        });\n        ia[hb][ib] = jb;\n        return false;\n    };\n    function wa() {\n        if (!(((pa || ra) || qa))) {\n            ua();\n            return;\n        }\n    ;\n        var hb = r.getScrollPosition();\n        pa = (pa && ab(v(\"rightCol\"), hb, \"paddingTop\", true));\n        qa = (qa && ab(t(\"pagelet_above_header_timeline\"), hb, \"top\"));\n        ra = (ra && ab(t(\"blueBar\"), hb, \"paddingTop\"));\n    };\n    var xa = 0;\n    function ya() {\n        xa = r.getScrollPosition();\n    };\n    function za() {\n        x(ya, function() {\n            var hb = ((oa === 0) || (xa.y >= oa));\n            va(gb.STICKY_HEADER, \"toggle\", [hb,]);\n            va(gb.CONTENT, \"checkCurrentSectionChange\");\n        }, \"TimelineController/scrollListener\");\n    };\n    function ab(hb, ib, jb, kb) {\n        if (!hb) {\n            ua();\n            return;\n        }\n    ;\n        if ((ib.y <= 0)) {\n            bb(hb, jb);\n            return false;\n        }\n         else {\n            var lb = (kb && gb.getCurrentScrubber());\n            if ((lb && i.hasClass(lb.getRoot(), \"fixed_elem\"))) {\n                bb(hb, jb);\n                return false;\n            }\n             else {\n                var mb = (parseInt(hb.style[jb], 10) || 0);\n                if ((ib.y < mb)) {\n                    i.addClass(hb, \"timeline_fixed\");\n                    hb.style[jb] = (ib.y + \"px\");\n                }\n                 else i.removeClass(hb, \"timeline_fixed\");\n            ;\n            }\n        ;\n        }\n    ;\n        return true;\n    };\n    function bb(hb, ib) {\n        hb.style[ib] = \"0px\";\n        i.removeClass(hb, \"timeline_fixed\");\n    };\n    function cb() {\n        x(gb.shouldShowWideAds, function() {\n            va(gb.ADS, \"adjustAdsType\", [ma,]);\n            va(gb.ADS, \"adjustAdsToFit\");\n            va(gb.CONTENT, \"adjustContentPadding\");\n            va(gb.STICKY_HEADER_NAV, \"adjustMenuHeights\");\n        }, \"TimelineController/resize\");\n    };\n    function db(hb, ib) {\n        if ((hb == \"sidebar/initialized\")) {\n            ta = true;\n        };\n        va(gb.ADS, \"adjustAdsType\", [gb.shouldShowWideAds(),]);\n    };\n    function eb(hb, ib) {\n        var jb = v(\"rightCol\");\n        if (jb) {\n            jb.style.paddingTop = (ib + \"px\");\n            pa = true;\n        }\n    ;\n        var kb = t(\"pagelet_above_header_timeline\");\n        if (kb.firstChild) {\n            t(\"above_header_timeline_placeholder\").style.height = (kb.offsetHeight + \"px\");\n            kb.style.top = (ib + \"px\");\n            qa = true;\n        }\n    ;\n        var lb = document.documentElement;\n        ra = ((lb.clientHeight < 400) || (lb.clientWidth < lb.scrollWidth));\n        if (ra) {\n            t(\"blueBar\").style.paddingTop = (ib + \"px\");\n        };\n        ka = g.listen(window, \"scroll\", wa);\n        h.inform(\"reflow\");\n    };\n    function fb() {\n        while (ja.length) {\n            ja.pop().remove();;\n        };\n        for (var hb in ha) {\n            (ha[hb].reset && ha[hb].reset());;\n        };\n        ua();\n        ga.unsubscribe();\n        ga = null;\n        ca = null;\n        ea = null;\n        ha = {\n        };\n        ia = {\n        };\n        la = null;\n        na = false;\n        oa = 0;\n        qa = false;\n        if (pa) {\n            var ib = v(\"rightCol\");\n            if (ib) {\n                ib.style.paddingTop = \"\";\n                i.removeClass(ib, \"timeline_fixed\");\n            }\n        ;\n        }\n    ;\n        pa = false;\n        if (ra) {\n            t(\"blueBar\").style.paddingTop = \"\";\n            i.removeClass(t(\"blueBar\"), \"timeline_fixed\");\n        }\n    ;\n        ra = false;\n        ta = false;\n        da = false;\n        j.purge(o.DS_HEIGHT);\n        j.purge(o.DS_LOADED);\n        j.purge(o.DS_SIDEORG);\n        j.purge(o.DS_TAILBALANCE);\n        j.purge(o.DS_COLUMN_HEIGHT_DIFFERENTIAL);\n    };\n    var gb = {\n        NAV: \"nav\",\n        STICKY_HEADER: \"sticky_header\",\n        STICKY_HEADER_NAV: \"sticky_header_nav\",\n        SCRUBBER: \"scrubber\",\n        CONTENT: \"content\",\n        ADS: \"ads\",\n        LOGGING: \"logging\",\n        init: function(hb, ib, jb) {\n            if (da) {\n                return\n            };\n            if ((ib == q.WALL_KEY)) {\n                ib = q.TIMELINE_KEY;\n            };\n            da = true;\n            ea = hb;\n            fa = jb.has_fixed_ads;\n            na = jb.one_column_minimal;\n            sa = {\n                allactivity: true,\n                approve: true\n            };\n            if (!na) {\n                u(sa, {\n                    games: true,\n                    map: true,\n                    music: true,\n                    video: true\n                });\n            };\n            sa[q.TIMELINE_KEY] = true;\n            va(gb.CONTENT, \"adjustContentPadding\");\n            ja.push(g.listen(window, \"scroll\", za), g.listen(window, \"resize\", cb));\n            ga = h.subscribe([\"sidebar/initialized\",\"sidebar/show\",\"sidebar/hide\",], db);\n            w(n.subscribe(\"TimelineCover/coverCollapsed\", eb));\n            l.onLeave(fb);\n            gb.registerCurrentKey(ib);\n        },\n        setAdsTracking: function(hb) {\n            va(gb.ADS, \"start\", [hb,]);\n        },\n        pageHasScrubber: function(hb) {\n            return ((!hb || ((!na && hb.match(/^(og_)?app_/)))) || ((hb in sa)));\n        },\n        fixedAds: function() {\n            return fa;\n        },\n        registerCurrentKey: function(hb) {\n            ca = hb;\n            la = (((hb !== \"map\") && (r.getViewportDimensions().y < aa)) && gb.pageHasScrubber(hb));\n            la = (la || t(\"blueBar\").offsetTop);\n            va(gb.ADS, \"setShortMode\", [la,]);\n            va(gb.ADS, \"updateCurrentKey\", [hb,]);\n            oa = ((hb == q.TIMELINE_KEY) ? (y - z) : 0);\n        },\n        getCurrentKey: function() {\n            return ca;\n        },\n        getCurrentScrubber: function() {\n            return ha[gb.SCRUBBER];\n        },\n        getCurrentStickyHeaderNav: function() {\n            return ha[gb.STICKY_HEADER_NAV];\n        },\n        scrubberHasLoaded: function(hb) {\n            i.conditionClass(hb.getRoot(), \"fixed_elem\", !la);\n            va(gb.ADS, \"registerScrubber\", [hb,]);\n        },\n        scrubberHasChangedState: function() {\n            va(gb.ADS, \"adjustAdsToFit\");\n        },\n        scrubberWasClicked: function(hb) {\n            va(gb.LOGGING, \"logScrubberClick\", [hb,]);\n        },\n        stickyHeaderNavWasClicked: function(hb) {\n            va(gb.LOGGING, \"logStickyHeaderNavClick\", [hb,]);\n        },\n        sectionHasChanged: function(hb, ib) {\n            va(gb.STICKY_HEADER_NAV, \"updateSection\", [hb,ib,]);\n            va(gb.SCRUBBER, \"updateSection\", [hb,ib,]);\n            va(gb.ADS, \"loadAdsIfEnoughTimePassed\");\n            va(gb.LOGGING, \"logSectionChange\", [hb,ib,]);\n        },\n        navigateToSection: function(hb) {\n            va(gb.CONTENT, \"navigateToSection\", [hb,]);\n        },\n        shouldShowWideAds: function() {\n            if (!ta) {\n                ma = false;\n            }\n             else {\n                var hb = ((ba + s.getRight()) + s.getLeft());\n                ma = (r.getViewportDimensions().x >= hb);\n            }\n        ;\n            return ma;\n        },\n        sidebarInitialized: function() {\n            return ta;\n        },\n        adjustStickyHeaderWidth: function() {\n            va(gb.STICKY_HEADER, \"adjustWidth\");\n        },\n        isOneColumnMinimal: function() {\n            return na;\n        },\n        register: function(hb, ib) {\n            ha[hb] = ib;\n            if (ia[hb]) {\n                for (var jb in ia[hb]) {\n                    va(hb, jb, ia[hb][jb]);;\n                };\n                delete ia[hb];\n            }\n        ;\n        },\n        adjustScrollingPagerBuffer: function(hb, ib) {\n            var jb = j.get(o.DS_COLUMN_HEIGHT_DIFFERENTIAL, ib);\n            if (!jb) {\n                return\n            };\n            var kb = m.getInstance(hb);\n            (kb && kb.setBuffer((kb.getBuffer() + Math.abs(jb))));\n        },\n        runOnceWhenSectionFullyLoaded: function(hb, ib, jb) {\n            var kb = p.get(ib);\n            if (kb) {\n                var lb = false;\n                k.scry(kb.node, \".fbTimelineCapsule\").forEach(function(nb) {\n                    if ((!lb && (parseInt(j.get(o.DS_LOADED, nb.id), 10) >= parseInt(jb, 10)))) {\n                        hb();\n                        lb = true;\n                    }\n                ;\n                });\n                if (lb) {\n                    return\n                };\n            }\n        ;\n            var mb = h.subscribe(o.SECTION_FULLY_LOADED, function(nb, ob) {\n                if (((ob.scrubberKey === ib) && (ob.pageIndex === jb))) {\n                    hb();\n                    mb.unsubscribe();\n                }\n            ;\n            });\n        }\n    };\n    e.exports = gb;\n});\n__d(\"TimelineDrag\", [\"Event\",\"ArbiterMixin\",\"Locale\",\"Style\",\"Vector\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"ArbiterMixin\"), i = b(\"Locale\"), j = b(\"Style\"), k = b(\"Vector\"), l = b(\"copyProperties\");\n    function m(n, o, p) {\n        p = (p || {\n        });\n        this._listenOn = p.listenOn;\n        this._offsetInput = o;\n        this._defaultOffset = p.default_offset;\n        this._killClicks = p.killClicks;\n        this._vertical = true;\n        this._RTLXSwitch = false;\n        this.setPicture(n, p);\n    };\n    l(m.prototype, h, {\n        setPicture: function(n, o) {\n            if (!n) {\n                return false\n            };\n            o = (o || {\n            });\n            this._picture = n;\n            this._defaultOffset = o.default_offset;\n            if (o.offsetInput) {\n                this._offsetInput = o.offsetInput;\n            };\n            if ((o.vertical !== undefined)) {\n                this._vertical = o.vertical;\n            };\n            if (o.height) {\n                this._containerHeight = o.height;\n            };\n            if (o.width) {\n                this._containerWidth = o.width;\n            };\n            if (this._vertical) {\n                this._offsetType = \"top\";\n                this._eventCoord = \"y\";\n            }\n             else {\n                this._RTLXSwitch = i.isRTL();\n                this._offsetType = \"left\";\n                this._eventCoord = \"x\";\n            }\n        ;\n            if (this._picture.complete) {\n                this._initialLoad();\n            }\n             else this._loadListener = g.listen(this._picture, \"load\", function() {\n                this._loadListener.remove();\n                this._initialLoad();\n            }.bind(this));\n        ;\n        },\n        destroy: function() {\n            this._stopDrag();\n            this._saveOffset();\n            (this._mousedown && this._mousedown.remove());\n            (this._onclick && this._onclick.remove());\n            (this._loadListener && this._loadListener.remove());\n        },\n        _initialLoad: function() {\n            var n = (this._listenOn ? this._listenOn : this._picture);\n            (this._mousedown && this._mousedown.remove());\n            this._mousedown = g.listen(n, \"mousedown\", this._onMouseDown.bind(this));\n            if (this._vertical) {\n                this._maxOffset = (this._containerHeight - this._picture.offsetHeight);\n            }\n             else this._maxOffset = (this._containerWidth - this._picture.offsetWidth);\n        ;\n            if ((this._defaultOffset !== undefined)) {\n                this._setOffset(this._defaultOffset);\n            };\n            (this._onclick && this._onclick.remove());\n            if (this._killClicks) {\n                this._onclick = g.listen(n, \"click\", this._onClick.bind(this));\n            };\n            this._saveOffset();\n        },\n        _onClick: function(event) {\n            event.kill();\n        },\n        _onMouseDown: function(event) {\n            var n = (parseInt(j.get(this._picture, this._offsetType), 10) || 0);\n            this._pictureStartDragOffset = (n - k.getEventPosition(event)[this._eventCoord]);\n            this._startDrag();\n            event.kill();\n        },\n        _startDrag: function() {\n            if (!this._dragStarted) {\n                this.inform(\"startdrag\", this);\n                this._dragTokens = [g.listen(document.documentElement, \"mouseup\", this._onMouseUp.bind(this)),g.listen(document.documentElement, \"mousemove\", this._onMouseMove.bind(this)),];\n                this._dragStarted = true;\n            }\n        ;\n        },\n        _saveOffset: function() {\n            var n = parseInt(j.get(this._picture, this._offsetType), 10);\n            if (this._RTLXSwitch) {\n                this._offsetInput.value = ((n + this._containerWidth) - this._picture.offsetWidth);\n            }\n             else this._offsetInput.value = n;\n        ;\n        },\n        _stopDrag: function() {\n            if (this._dragStarted) {\n                this.inform(\"stopdrag\", this);\n                this._dragStarted = false;\n                this._dragTokens.forEach(function(n) {\n                    n.remove();\n                });\n                this._saveOffset();\n            }\n        ;\n        },\n        _onMouseUp: function(event) {\n            this._stopDrag();\n            event.kill();\n        },\n        _setOffset: function(n) {\n            if (this._RTLXSwitch) {\n                n = Math.max(0, Math.min(n, -this._maxOffset));\n            }\n             else n = Math.min(0, Math.max(n, this._maxOffset));\n        ;\n            j.set(this._picture, this._offsetType, (n + \"px\"));\n        },\n        _onMouseMove: function(event) {\n            this._setOffset((this._pictureStartDragOffset + k.getEventPosition(event)[this._eventCoord]));\n            event.kill();\n        }\n    });\n    e.exports = m;\n});\n__d(\"TimelineCover\", [\"Arbiter\",\"Button\",\"CSS\",\"DOM\",\"HTML\",\"Parent\",\"DOMScroll\",\"TimelineController\",\"TimelineDrag\",\"Style\",\"Vector\",\"$\",\"copyProperties\",\"cx\",\"ge\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"Button\"), i = b(\"CSS\"), j = b(\"DOM\"), k = b(\"HTML\"), l = b(\"Parent\"), m = b(\"DOMScroll\"), n = b(\"TimelineController\"), o = b(\"TimelineDrag\"), p = b(\"Style\"), q = b(\"Vector\"), r = b(\"$\"), s = b(\"copyProperties\"), t = b(\"cx\"), u = b(\"ge\");\n    function v(w, x, y) {\n        this.root = r(\"fbProfileCover\");\n        if ((typeof x === \"object\")) {\n            this._coverHeight = x.cover_height;\n            this._coverWidth = x.cover_width;\n            this.previewing = x.previewing;\n            this._isLegacy = false;\n        }\n         else {\n            this._isLegacy = true;\n            this._coverHeight = x;\n            this.previewing = y;\n        }\n    ;\n        this._parentSection = l.byClass(this.root, \"fbTimelineSection\");\n        this.cover = j.find(this.root, \".cover\");\n        v.instance = this;\n        this.editing = false;\n        if (!this._parentSection) {\n            this._parentSection = l.byClass(this.root, \"fbEventHeader\");\n        };\n        if (this.previewing) {\n            this.editMode();\n            this.updateCoverImage(this.previewing);\n        }\n    ;\n    };\n    v.instance = null;\n    v.getInstance = function() {\n        return v.instance;\n    };\n    s(v.prototype, {\n        showLoadingIndicator: function() {\n            var w = u(\"fbCoverImageContainer\");\n            if (w) {\n                i.addClass(w, \"opaquedLoading\");\n            };\n        },\n        hideLoadingIndicator: function() {\n            var w = u(\"fbCoverImageContainer\");\n            if (w) {\n                i.removeClass(w, \"opaquedLoading\");\n            };\n        },\n        isCoverImageVerticalFlow: function(w) {\n            return !(w.style.height);\n        },\n        editMode: function() {\n            h.setEnabled(j.find(this.root, \"button.cancelButton\"), true);\n            h.setEnabled(j.find(this.root, \"button.saveButton\"), true);\n            this.hideLoadingIndicator();\n            this._coverImage = j.scry(this.root, \".coverImage\")[0];\n            var w = j.scry(this._coverImage, \".coverWrap\")[0];\n            if (w) {\n                var x = j.find(w, \".coverPhotoImg\");\n                this._originalIsVertical = this.isCoverImageVerticalFlow(x);\n                this._originalOffset = p.get(x, (this._originalIsVertical ? \"top\" : \"left\"));\n            }\n        ;\n            i.addClass(this._parentSection, \"fbEditCover\");\n            m.scrollTo(this.root);\n            if (this.previewing) {\n                j.remove(this._coverImage);\n                i.show(this._coverImage);\n            }\n        ;\n            var y = j.scry(this._coverImage, \".coverPhotoImg\")[0];\n            if (y) {\n                this._createDragger();\n            };\n            this.editing = true;\n            g.inform(\"CoverPhotoEdit\", {\n                sender: this,\n                state: \"open\"\n            });\n        },\n        _exitEditMode: function() {\n            if (this._timelineDrag) {\n                this._timelineDrag.destroy();\n                this._timelineDrag = null;\n            }\n        ;\n            j.find(this.root, \"input.hiddenPhotoID\").value = null;\n            j.find(this.root, \"input.hiddenVideoID\").value = null;\n            h.setEnabled(j.find(this.root, \"button.cancelButton\"), false);\n            h.setEnabled(j.find(this.root, \"button.saveButton\"), false);\n            i.removeClass(this._parentSection, \"fbEditCover\");\n            this.hideLoadingIndicator();\n            this.previewing = false;\n            g.inform(\"CoverPhotoEdit\", {\n                sender: this,\n                state: \"closed\"\n            });\n        },\n        _createDragger: function(w) {\n            var x;\n            if (this._isLegacy) {\n                x = j.find(this.root, \"input.photoOffsetInput\");\n                this._originalIsVertical = true;\n            }\n             else {\n                var y = ((w === undefined) ? this._originalIsVertical : w);\n                x = (y ? j.find(this.root, \"input.photoOffsetYInput\") : j.find(this.root, \"input.photoOffsetXInput\"));\n            }\n        ;\n            this._timelineDrag = new o(j.find(this.root, \".coverImage .coverPhotoImg\"), x, {\n                height: this._coverHeight,\n                width: this._coverWidth,\n                listenOn: this.cover,\n                vertical: y,\n                killClicks: true\n            });\n        },\n        updateCoverImage: function(w, x, y) {\n            this.videoID = y;\n            if (x) {\n                this.editMode();\n            };\n            j.find(this.root, \"input.hiddenPhotoID\").value = w;\n            j.find(this.root, \"input.hiddenVideoID\").value = (y || null);\n            h.setEnabled(j.find(this.root, \"button.saveButton\"), true);\n            if (x) {\n                j.replace(j.find(this.root, \".coverImage\"), k(x));\n            };\n            var z = j.find(j.find(this.root, \".coverImage\"), \".coverPhotoImg\"), aa = this.isCoverImageVerticalFlow(z), ba;\n            if (this._isLegacy) {\n                ba = j.find(this.root, \"input.photoOffsetInput\");\n            }\n             else ba = (aa ? j.find(this.root, \"input.photoOffsetYInput\") : j.find(this.root, \"input.photoOffsetXInput\"));\n        ;\n            if (this._timelineDrag) {\n                this._timelineDrag.setPicture(z, {\n                    offsetInput: ba,\n                    vertical: aa\n                });\n            }\n             else this._createDragger(aa);\n        ;\n        },\n        cancelUpdate: function() {\n            j.remove(j.scry(this.root, \".coverImage\")[0]);\n            j.prependContent(this.cover, this._coverImage);\n            if ((this._originalOffset !== undefined)) {\n                p.set(j.find(this._coverImage, \".coverPhotoImg\"), (this._originalIsVertical ? \"top\" : \"left\"), this._originalOffset);\n            };\n            this._exitEditMode();\n        },\n        saveComplete: function() {\n            this._coverImage = j.scry(this.root, \".coverImage\")[0];\n            var w = l.byClass(this.root, \"fbTimelineTopSectionBase\");\n            (w && i.removeClass(w, \"_6_5\"));\n            this._exitEditMode();\n        },\n        isInEditMode: function() {\n            return this.editing;\n        }\n    });\n    e.exports = v;\n});\n__d(\"TimelineCapsule\", [\"Arbiter\",\"CSS\",\"DataStore\",\"DOM\",\"DOMQuery\",\"DOMScroll\",\"Parent\",\"TimelineConstants\",\"TimelineLegacySections\",\"UserAgent\",\"Vector\",\"$\",\"createArrayFrom\",\"csx\",\"isEmpty\",\"queryThenMutateDOM\",\"requestAnimationFrame\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"CSS\"), i = b(\"DataStore\"), j = b(\"DOM\"), k = b(\"DOMQuery\"), l = b(\"DOMScroll\"), m = b(\"Parent\"), n = b(\"TimelineConstants\"), o = b(\"TimelineLegacySections\"), p = b(\"UserAgent\"), q = b(\"Vector\"), r = b(\"$\"), s = b(\"createArrayFrom\"), t = b(\"csx\"), u = b(\"isEmpty\"), v = b(\"queryThenMutateDOM\"), w = b(\"requestAnimationFrame\"), x = (function() {\n        var y = 45, z = 15, aa = \"use\", ba = \"update\", ca = {\n        }, da = {\n        };\n        function ea(ra) {\n            return h.hasClass(ra, \"fbTimelineBalancer\");\n        };\n        function fa(ra) {\n            return ra.getAttribute(\"data-spine\");\n        };\n        function ga(ra) {\n            return h.hasClass(ra, \"placeholderUnit\");\n        };\n        function ha(ra, sa) {\n            if (sa) {\n                return ((i.get(n.DS_SIDEORG, ra.id) || ra.getAttribute(\"data-side\")))\n            };\n            return ra.getAttribute(\"data-side\");\n        };\n        var ia = function(ra, sa) {\n            if ((p.ie() <= 6)) {\n                ia = function(ta, ua) {\n                    i.set(n.DS_SIDEORG, ta.id, ha(ta, true));\n                    ta.setAttribute(\"data-side\", ua);\n                    h.removeClass(ta, \"leftColumn\");\n                    h.removeClass(ta, \"rightColumn\");\n                    h.addClass(ta, ((ua == \"l\") ? \"leftColumn\" : \"rightColumn\"));\n                };\n            }\n             else ia = function(ta, ua) {\n                i.set(n.DS_SIDEORG, ta.id, ha(ta, true));\n                ta.setAttribute(\"data-side\", ua);\n            };\n        ;\n            ia(ra, sa);\n        };\n        function ja(ra) {\n            return ra.getAttribute(\"data-size\");\n        };\n        function ka(ra) {\n            if (((h.hasClass(ra, \"fbTimelineOneColumn\") && ra.prevSibling) && h.hasClass(ra.prevSibling, \"fbTimelineOneColumn\"))) {\n                return (z * 2)\n            };\n            if (h.hasClass(ra, \"fbTimelineIndeterminateContent\")) {\n                return 0\n            };\n            return z;\n        };\n        function la(ra, sa) {\n            var ta = 0;\n            if ((h.shown(ra) && !h.hasClass(ra, \"placeholderUnit\"))) {\n                if ((sa === aa)) {\n                    ta = i.get(n.DS_HEIGHT, ra.id, null);\n                    if ((ta === null)) {\n                        ta = ra.getAttribute(\"data-calculatedheight\");\n                    };\n                }\n                 else ta = (ra.offsetHeight + ka(ra));\n            \n            };\n            if (((sa === aa) && (ta === null))) {\n                ta = 300;\n            };\n            i.set(n.DS_HEIGHT, ra.id, parseInt(ta, 10));\n        };\n        function ma(ra) {\n            var sa = i.get(n.DS_HEIGHT, ra.id, null);\n            return sa;\n        };\n        function na(ra, sa) {\n            if ((ja(sa) == \"2\")) {\n                return 0;\n            }\n             else if ((ha(sa) == \"r\")) {\n                return (ra + ma(sa));\n            }\n             else return (ra - ma(sa))\n            \n        ;\n        };\n        function oa(ra) {\n            k.scry(ra, \"._3ram\").forEach(function(sa) {\n                var ta = sa.getAttribute(\"data-endmarker\"), ua = sa.getAttribute(\"data-pageindex\"), va = function() {\n                    if (!sa.parentNode) {\n                        return\n                    };\n                    i.set(n.DS_LOADED, ra.id, ua);\n                    j.remove(sa);\n                    g.inform(n.SECTION_FULLY_LOADED, {\n                        scrubberKey: ta,\n                        pageIndex: ua,\n                        capsuleID: ra.id,\n                        childCount: ra.childNodes.length\n                    });\n                };\n                if (o.get(ta)) {\n                    va();\n                }\n                 else var wa = g.subscribe(n.SECTION_REGISTERED, function(xa, ya) {\n                    if ((ya.scrubberKey === ta)) {\n                        va();\n                        wa.unsubscribe();\n                    }\n                ;\n                })\n            ;\n            });\n            g.inform(\"TimelineCapsule/balanced\", {\n                capsule: ra\n            });\n        };\n        function pa(ra) {\n            if (u(ca[ra.id])) {\n                return\n            };\n            var sa = (ea(ra) ? ra.firstChild : ra), ta = sa.childNodes.length, ua = {\n            }, va = {\n            }, wa, xa = z, ya = z, za, ab = [];\n            for (var bb = 0; (bb < ta); bb++) {\n                wa = sa.childNodes[bb];\n                if (h.hasClass(wa, \"fbTimelineUnit\")) {\n                    za = k.scry(wa, \"div.timelineUnitContainer\")[0];\n                    if (za) {\n                        va[wa.id] = za.getAttribute(\"data-time\");\n                    };\n                    if ((!ga(wa) && h.shown(wa))) {\n                        if ((ja(wa) == \"2\")) {\n                            ua[wa.id] = Math.max(xa, ya);\n                            xa = ya = (ua[wa.id] + ma(wa));\n                        }\n                         else if ((ha(wa) == \"r\")) {\n                            ua[wa.id] = ya;\n                            ya += ma(wa);\n                        }\n                         else {\n                            ua[wa.id] = xa;\n                            xa += ma(wa);\n                        }\n                        \n                    ;\n                        if (((ha(wa, true) == \"l\") || (ja(wa) == \"2\"))) {\n                            ab.push(wa.id);\n                        };\n                    }\n                ;\n                }\n            ;\n            };\n            for (bb = 0; (bb < (ab.length - 1)); ++bb) {\n                var cb = ab[bb], db = ab[(bb + 1)], eb = (ua[cb] + y), fb = ua[db];\n                for (var gb in ca[ra.id]) {\n                    if ((eb > fb)) {\n                        break;\n                    };\n                    var hb = ca[ra.id][gb];\n                    if (h.shown(hb)) {\n                        continue;\n                    };\n                    if (((va[gb] <= va[cb]) && (va[gb] > va[db]))) {\n                        hb.style.top = (eb + \"px\");\n                        eb += y;\n                        h.show(hb);\n                    }\n                ;\n                };\n            };\n        };\n        function qa(ra, sa) {\n            var ta = m.byAttribute(ra, \"data-size\");\n            if (ta) {\n                if (h.hasClass(ra.parentNode, \"timelineReportContent\")) {\n                    sa(ra);\n                }\n                 else sa(ta);\n            ;\n                x.balanceCapsule(m.byClass(ta, \"fbTimelineCapsule\"));\n            }\n        ;\n        };\n        return {\n            removeUnit: function(ra) {\n                qa(ra, function(sa) {\n                    j.remove(sa);\n                });\n            },\n            hideUnit: function(ra) {\n                qa(ra, function(sa) {\n                    h.addClass(sa, \"fbTimelineColumnHidden\");\n                });\n            },\n            undoHideUnit: function(ra, sa) {\n                j.remove(m.byClass(sa, \"hiddenText\"));\n                qa(ra, function(ta) {\n                    h.removeClass(ta, \"fbTimelineColumnHidden\");\n                });\n            },\n            unplacehold: function(ra) {\n                var sa = r(ra);\n                sa.style.top = null;\n                h.removeClass(sa, \"visiblePlaceholder\");\n                h.removeClass(sa, \"placeholder\");\n                var ta = m.byClass(sa, \"fbTimelineCapsule\");\n                delete ca[ta.id][ra];\n                x.balanceCapsule(ta);\n            },\n            scrollToCapsule: function(ra) {\n                if (!da.hasOwnProperty(ra.id)) {\n                    var sa = q.getElementPosition(ra.parentNode);\n                    l.scrollTo(new q(q.getScrollPosition().x, (sa.y - n.SUBSECTION_SCROLL_TO_OFFSET), \"document\"));\n                    da[ra.id] = true;\n                }\n            ;\n            },\n            balanceCapsuleFromChild: function(ra, sa) {\n                x.balanceCapsule(m.byClass(ra, \"fbTimelineCapsule\"), sa);\n            },\n            balanceCapsuleDeferred: function(ra, sa) {\n                x.balanceCapsule.curry(ra, sa).defer();\n            },\n            balanceCapsule: function(ra, sa) {\n                if ((!ra || !ra.childNodes)) {\n                    return\n                };\n                var ta = 0, ua, va = document.createDocumentFragment(), wa = [], xa = [], ya = [], za = false, ab = (sa && sa.heights_action);\n                if ((sa && sa.tail_balance)) {\n                    i.set(n.DS_TAILBALANCE, ra.id, sa.tail_balance);\n                };\n                if (((ab !== ba) && ((p.chrome() || p.webkit())))) {\n                    h.toggleClass(ra, \"webkitFix\");\n                };\n                for (var bb = 0; (bb < ra.childNodes.length); bb++) {\n                    ua = ra.childNodes[bb];\n                    if (fa(ua)) {\n                        continue;\n                    }\n                     else if (ea(ua)) {\n                        s(ua.firstChild.childNodes).forEach(function(jb) {\n                            la(jb, ab);\n                        });\n                        continue;\n                    }\n                    \n                ;\n                    la(ua, ab);\n                    if ((ha(ua, true) == \"r\")) {\n                        xa.push(ua);\n                    }\n                     else wa.push(ua);\n                ;\n                    ya.push(ua);\n                    if ((ja(ua) != \"2\")) {\n                        if (((((ta > 0) && (ha(ua) == \"r\"))) || (((ta < 0) && (ha(ua) == \"l\"))))) {\n                            za = true;\n                        }\n                    };\n                    ta = na(ta, ua);\n                };\n                var cb = [], db = [], eb = [];\n                k.scry(ra, \"li.fbTimelineBalancer\").forEach(function(jb) {\n                    var kb = s(jb.firstChild.childNodes);\n                    if (jb.getAttribute(\"data-nonunits\")) {\n                        eb = eb.concat(kb);\n                    }\n                     else if ((ha(jb) == \"left\")) {\n                        cb = cb.concat(kb);\n                    }\n                     else if ((ha(jb) == \"right\")) {\n                        db = db.concat(kb);\n                    }\n                    \n                ;\n                });\n                if (za) {\n                    ra.style.minHeight = ra.offsetHeight;\n                    wa.forEach(function(jb) {\n                        if ((ja(jb) != \"2\")) {\n                            ia(jb, \"l\");\n                        };\n                    });\n                    xa.forEach(function(jb) {\n                        if ((ja(jb) != \"2\")) {\n                            ia(jb, \"r\");\n                        };\n                    });\n                    var fb = j.create(\"li\", {\n                        className: \"fbTimelineBalancer\"\n                    }, j.create(\"ol\", null, wa));\n                    fb.setAttribute(\"data-side\", \"left\");\n                    j.prependContent(ra, fb);\n                    cb = wa.concat(cb);\n                    var gb = j.create(\"li\", {\n                        className: \"fbTimelineBalancer\"\n                    }, j.create(\"ol\", null, xa));\n                    gb.setAttribute(\"data-side\", \"right\");\n                    j.prependContent(ra, gb);\n                    db = xa.concat(db);\n                    ta = 0;\n                }\n            ;\n                while (eb.length) {\n                    va.appendChild(eb.shift());;\n                };\n                while (((((ta >= 0) && cb.length)) || (((ta < 0) && db.length)))) {\n                    if ((ta >= 0)) {\n                        ua = cb.shift();\n                    }\n                     else ua = db.shift();\n                ;\n                    va.appendChild(ua);\n                    ta = na(ta, ua);\n                };\n                ra.appendChild(va);\n                k.scry(ra, \"li.fbTimelineBalancer\").forEach(function(jb) {\n                    if (!jb.firstChild.childNodes.length) {\n                        j.remove(jb);\n                    };\n                });\n                var hb = (((sa && sa.tail_balance)) || i.get(n.DS_TAILBALANCE, ra.id));\n                if (hb) {\n                    ta = x.tailBalance(ra, ta, hb);\n                };\n                if (za) {\n                    ya.forEach(function(jb) {\n                        if ((jb.parentNode !== ra)) {\n                            ra.appendChild(jb);\n                            ta = na(ta, jb);\n                        }\n                    ;\n                    });\n                    ra.style.minHeight = null;\n                }\n            ;\n                var ib = m.byClass(ra, \"fbTimelineSection\");\n                if (ib) {\n                    i.set(n.DS_COLUMN_HEIGHT_DIFFERENTIAL, ib.id, ta);\n                };\n                ca[ra.id] = {\n                };\n                k.scry(ra, \"li.placeholderUnit\").forEach(function(jb) {\n                    ca[ra.id][jb.id] = jb;\n                });\n                pa(ra);\n                oa(ra);\n                if ((ab === aa)) {\n                    sa.heights_action = ba;\n                    w(function() {\n                        w(x.balanceCapsule.curry(ra, sa));\n                    });\n                }\n            ;\n            },\n            tailBalance: function(ra, sa, ta) {\n                if (!ra) {\n                    return sa\n                };\n                var ua = [], va = [], wa = [], xa = [];\n                k.scry(ra, \"li.fbTimelineBalancer\").forEach(function(za) {\n                    var ab = s(za.firstChild.childNodes);\n                    if (za.getAttribute(\"data-nonunits\")) {\n                        xa = xa.concat(ab);\n                    }\n                     else if ((ha(za) == \"left\")) {\n                        va = va.concat(ab);\n                    }\n                     else if ((ha(za) == \"right\")) {\n                        wa = wa.concat(ab);\n                    }\n                    \n                ;\n                    ua = ua.concat(ab);\n                });\n                if (((((ta == n.FIXED_SIDE_RIGHT) && va.length)) || (((ta == n.FIXED_SIDE_LEFT) && wa.length)))) {\n                    return sa\n                };\n                var ya = document.createDocumentFragment();\n                if (ua) {\n                    while (ua.length) {\n                        if ((ta != n.FIXED_SIDE_NONE)) {\n                            if ((ja(ua[0]) != \"2\")) {\n                                if ((sa >= 0)) {\n                                    ia(ua[0], \"l\");\n                                }\n                                 else ia(ua[0], \"r\");\n                            \n                            }\n                        };\n                        sa = na(sa, ua[0]);\n                        ya.appendChild(ua.shift());\n                    }\n                };\n                ra.appendChild(ya);\n                k.scry(ra, \"li.fbTimelineBalancer\").forEach(function(za) {\n                    if (!za.firstChild.childNodes.length) {\n                        j.remove(za);\n                    };\n                });\n                return sa;\n            },\n            loadTwoColumnUnits: function(ra) {\n                var sa = r(ra);\n                v(function() {\n                    var ta = m.byClass(sa, \"fbTimelineSection\");\n                    if (ta) {\n                        var ua = k.find(sa, \"._3rbf\"), va = k.find(sa, \"._3rbh\"), wa = (va.offsetHeight - ua.offsetHeight);\n                        i.set(n.DS_COLUMN_HEIGHT_DIFFERENTIAL, ta.id, wa);\n                    }\n                ;\n                }, oa.curry(sa));\n            }\n        };\n    })();\n    e.exports = (a.TimelineCapsule || x);\n});\n__d(\"TimelineCapsuleUtilities\", [\"CSS\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSS\"), h = {\n        setFirstUnit: function(i) {\n            var j = true;\n            for (var k = 0; (k < i.childNodes.length); ++k) {\n                var l = i.childNodes[k];\n                if ((l.id.indexOf(\"tl_unit_\") === 0)) {\n                    if (j) {\n                        j = false;\n                        g.addClass(l, \"firstUnit\");\n                    }\n                     else {\n                        g.removeClass(l, \"firstUnit\");\n                        break;\n                    }\n                \n                };\n            };\n        }\n    };\n    e.exports = h;\n});\n__d(\"TimelineUnitSelector\", [\"DOMQuery\",\"Parent\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOMQuery\"), h = b(\"Parent\"), i = {\n        getUnitsWithTime: function(j) {\n            return g.scry(j, \"div.timelineUnitContainer\").filter(function(k) {\n                return (((h.byClass(k, \"fbTimelineCapsule\") === j) && k.getAttribute(\"data-time\")));\n            });\n        }\n    };\n    e.exports = i;\n});\n__d(\"TimelineComposerUtilities\", [\"Event\",\"Arbiter\",\"Bootloader\",\"CSS\",\"DOM\",\"DOMQuery\",\"Parent\",\"TimelineUnitSelector\",\"Vector\",\"cx\",\"csx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"Arbiter\"), i = b(\"Bootloader\"), j = b(\"CSS\"), k = b(\"DOM\"), l = b(\"DOMQuery\"), m = b(\"Parent\"), n = b(\"TimelineUnitSelector\"), o = b(\"Vector\"), p = b(\"cx\"), q = b(\"csx\"), r = (86400 * 31), s = 86400000, t = {\n        listenToSetEstimatedDate: function(u, v) {\n            return h.subscribe(\"ComposerXTimelineTagger/init\", function(w, x) {\n                if (l.contains(u, x.datePickerElement)) {\n                    t.setEstimatedDate(x.datePickerInstance, v());\n                    x.composerTimelineTagger.switchToTagger(\"date\");\n                }\n            ;\n            });\n        },\n        listenToSetEstimatedDateOld: function(u, v) {\n            return h.subscribe(\"TimelineBackdatedComposerTagger/initialized\", function(event, w) {\n                if ((w.composer === u)) {\n                    w.date_picker.subscribe(\"initialized\", function(x, y) {\n                        t.setEstimatedDate(y, v());\n                    });\n                };\n            });\n        },\n        listenToPublish: function(u, v) {\n            if (u.root) {\n                u = u.root;\n            };\n            return h.subscribe(\"composer/publish\", function(event, w) {\n                if ((w.composer_id === u.id)) {\n                    i.loadModules([\"TimelineStoryPublisher\",], function(x) {\n                        x.publish(w);\n                        (v && v());\n                    });\n                };\n            });\n        },\n        listenToAnotherComposerOpen: function(u, v) {\n            return h.subscribe(\"composer/mutate\", function(w, x) {\n                if ((x !== u)) {\n                    v();\n                };\n            });\n        },\n        listenToCancel: function(u, v) {\n            return g.listen(u, \"click\", function(event) {\n                if (m.byClass(event.getTarget(), \"_306\")) {\n                    v();\n                };\n            });\n        },\n        listenToCancelOld: function(u, v) {\n            return g.listen(u, \"click\", function(event) {\n                (m.byClass(event.getTarget(), \"cancelBtn\") && v());\n            });\n        },\n        hidePlaceIfAttachmentsTooTall: function(u) {\n            var v = l.find(u, \"._2_4\"), w = o.getElementDimensions(v).y;\n            if ((w > 50)) {\n                j.hide(l.find(v, \"._mg\"));\n            };\n        },\n        hidePlaceIfAttachmentsTooTallOld: function(u) {\n            var v = k.find(u, \"ul.fbTimelineComposerAttachments\"), w = o.getElementDimensions(v).y;\n            if ((w > 50)) {\n                var x = m.byTag(k.scry(v, \"span.placeAttachment\")[0], \"li\");\n                (x && j.hide(x));\n            }\n        ;\n        },\n        setEstimatedDate: function(u, v) {\n            var w, x;\n            if ((v && j.hasClass(v, \"fbTimelineCapsule\"))) {\n                w = v.getAttribute(\"data-start\");\n                x = v.getAttribute(\"data-end\");\n                if ((w && x)) {\n                    var y = new Date((x * 1000)), z = new Date();\n                    if ((y > z)) {\n                        u.setDate(z.getFullYear(), (z.getMonth() + 1), z.getDate());\n                    }\n                     else if (((x - w) > (2 * r))) {\n                        u.setDate(y.getFullYear());\n                    }\n                     else u.setDate(y.getFullYear(), (y.getMonth() + 1));\n                    \n                ;\n                }\n            ;\n                return;\n            }\n        ;\n            var aa = m.byClass(v, \"fbTimelineCapsule\");\n            if (aa) {\n                w = aa.getAttribute(\"data-start\");\n                x = aa.getAttribute(\"data-end\");\n                var ba = o.getElementPosition(v).y, ca = [x,null,], da = [w,null,], ea = n.getUnitsWithTime(aa);\n                for (var fa = 0; (fa < ea.length); fa++) {\n                    var ga = ea[fa], ha = k.scry(ga.parentNode, \".spinePointer\")[0];\n                    if (!ha) {\n                        continue;\n                    };\n                    var ia = o.getElementPosition(ha).y;\n                    if ((ia <= ba)) {\n                        if ((!ca[1] || (ia > ca[1]))) {\n                            ca = [ga.getAttribute(\"data-time\"),ia,];\n                        };\n                    }\n                     else if ((!da[1] || (ia < da[1]))) {\n                        da = [ga.getAttribute(\"data-time\"),ia,];\n                    }\n                ;\n                };\n                if (((ca[0] !== null) && (da[0] !== null))) {\n                    var ja = (Math.round((((parseInt(ca[0], 10) + parseInt(da[0], 10))) / 2)) * 1000);\n                    ja = Math.min((new Date() - s), ja);\n                    u.setDateWithTimestamp(ja);\n                }\n            ;\n            }\n        ;\n        },\n        showMLEFlyout: function(u) {\n            var v = (k.scry(document, \"a.fbTimelineSpine\").length === 0), w = function(x) {\n                x.showMLEFlyout(u);\n            };\n            if (v) {\n                i.loadModules([\"TimelineSpinelessComposer\",], w);\n            }\n             else i.loadModules([\"TimelineComposer\",], w);\n        ;\n        }\n    };\n    e.exports = t;\n});\n__d(\"TimelineComposer\", [\"Arbiter\",\"Bootloader\",\"CSS\",\"DOM\",\"Parent\",\"Run\",\"TimelineCapsule\",\"TimelineCapsuleUtilities\",\"TimelineComposerUtilities\",\"$\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"Bootloader\"), i = b(\"CSS\"), j = b(\"DOM\"), k = b(\"Parent\"), l = b(\"Run\"), m = b(\"TimelineCapsule\"), n = b(\"TimelineCapsuleUtilities\"), o = b(\"TimelineComposerUtilities\"), p = b(\"$\"), q = b(\"cx\"), r;\n    function s(x) {\n        if ((x.isScheduledPost || x.isOGPost)) {\n            return\n        };\n        if (!x.streamStory) {\n            window.location.reload();\n            return;\n        }\n    ;\n        if (x.backdatedTime) {\n            h.loadModules([\"TimelineStoryPublisher\",], function(z) {\n                z.publish(x);\n            });\n            return;\n        }\n    ;\n        var y = w.renderCapsuleBasedStory(r, x.streamStory);\n        g.inform(\"TimelineComposer/on_after_publish\", y, g.BEHAVIOR_PERSISTENT);\n    };\n    function t() {\n        var x = k.byClass(r, \"fbTimelineTwoColumn\");\n        return j.find(x, \".spinePointer\");\n    };\n    function u(x) {\n        var y = v();\n        i.show(y);\n        var z = x.subscribe(\"hide\", function() {\n            i.hide(y);\n            x.unsubscribe(z);\n        });\n    };\n    function v() {\n        var x = k.byClass(r, \"fbTimelineTwoColumn\"), y = j.scry(x, \"div.composerVeil\");\n        if ((y.length !== 1)) {\n            y = j.appendContent(x, j.create(\"div\", {\n                className: \"composerVeil hidden_elem\"\n            }));\n        };\n        return y[0];\n    };\n    var w = {\n        init: function(x) {\n            r = p(x);\n            var y = g.subscribe(\"composer/publish\", function(event, z) {\n                if ((z.composer_id === r.id)) {\n                    s(z);\n                };\n            });\n            l.onLeave(y.unsubscribe.bind(y));\n            if (i.hasClass(r, \"_mj\")) {\n                o.hidePlaceIfAttachmentsTooTall(r);\n            }\n             else o.hidePlaceIfAttachmentsTooTallOld(r);\n        ;\n        },\n        showMLEFlyout: function(x) {\n            x.setContext(t()).show();\n            u(x);\n        },\n        renderCapsuleBasedStory: function(x, y) {\n            var z = k.byClass(x, \"fbTimelineCapsule\");\n            if (!z) {\n                return\n            };\n            var aa = k.byClass(x, \"timelineUnitContainer\").parentNode;\n            if (aa.nextSibling.getAttribute(\"data-spine\")) {\n                aa = aa.nextSibling;\n            };\n            var ba = j.insertAfter(aa, y)[0];\n            h.loadModules([\"Animation\",], function(ca) {\n                new ca(ba.firstChild).from(\"backgroundColor\", \"#fff8dd\").to(\"backgroundColor\", \"#fff\").duration(2000).ease(ca.ease.both).go();\n            });\n            n.setFirstUnit(z);\n            m.balanceCapsule(z);\n            return ba;\n        }\n    };\n    e.exports = (a.TimelineComposer || w);\n});\n__d(\"TimelineSmartInsert\", [\"Run\",\"UserAgent\",\"Vector\",], function(a, b, c, d, e, f) {\n    var g = b(\"Run\"), h = b(\"UserAgent\"), i = b(\"Vector\"), j = 100;\n    function k(q) {\n        if ((q === \"viewport\")) {\n            return i.getViewportDimensions().y\n        };\n        return q;\n    };\n    var l = false, m = false;\n    function n() {\n        if (m) {\n            return\n        };\n        g.onLeave(o);\n        m = true;\n    };\n    function o() {\n        l = false;\n        m = false;\n    };\n    var p = {\n        run: function(q, r, s) {\n            n();\n            if ((!l || (h.ie() <= 8))) {\n                r();\n                return;\n            }\n        ;\n            var t = q.offsetHeight;\n            r();\n            var u = q.offsetHeight, v = i.getScrollPosition().y, w = i.getElementPosition(q).y;\n            if ((((u !== t) && (w < v)) && ((w + t) < (v + k((s || j)))))) {\n                window.scrollBy(0, (u - t));\n            };\n        },\n        enable: function() {\n            l = true;\n        }\n    };\n    e.exports = p;\n});\n__d(\"TimelineContentLoader\", [\"Event\",\"function-extensions\",\"Arbiter\",\"CSS\",\"DOM\",\"DOMScroll\",\"OnVisible\",\"ScrollingPager\",\"TimelineConstants\",\"TimelineController\",\"TimelineLegacySections\",\"TimelineSmartInsert\",\"TimelineURI\",\"UIPagelet\",\"UserAgent\",\"Vector\",\"$\",\"arrayContains\",\"copyProperties\",\"createArrayFrom\",\"csx\",\"debounce\",\"ge\",\"startsWith\",\"tx\",\"userAction\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\");\n    b(\"function-extensions\");\n    var h = b(\"Arbiter\"), i = b(\"CSS\"), j = b(\"DOM\"), k = b(\"DOMScroll\"), l = b(\"OnVisible\"), m = b(\"ScrollingPager\"), n = b(\"TimelineConstants\"), o = b(\"TimelineController\"), p = b(\"TimelineLegacySections\"), q = b(\"TimelineSmartInsert\"), r = b(\"TimelineURI\"), s = b(\"UIPagelet\"), t = b(\"UserAgent\"), u = b(\"Vector\"), v = b(\"$\"), w = b(\"arrayContains\"), x = b(\"copyProperties\"), y = b(\"createArrayFrom\"), z = b(\"csx\"), aa = b(\"debounce\"), ba = b(\"ge\"), ca = b(\"startsWith\"), da = b(\"tx\"), ea = b(\"userAction\"), fa = false, ga = false, ha, ia = null, ja = {\n    }, ka = [], la = [], ma = [], na = {\n    }, oa = {\n    }, pa = {\n    }, qa = {\n    }, ra = null, sa = null, ta = false, ua = null;\n    function va(eb, fb, gb, hb, ib) {\n        this.node = eb;\n        this.loaded = hb;\n        this.canScrollLoad = true;\n        this.canUnload = (fb != db.RECENT);\n        this.scrubberKey = fb;\n        this.historicUnitCount = ib;\n        this._pageletLoadData = gb;\n        this._expandPageletLoadData = {\n        };\n        this.rightColumnFinished = false;\n    };\n    x(va.prototype, {\n        load: function(eb, fb) {\n            if (this.loaded) {\n                return\n            };\n            var gb = this._pageletLoadData;\n            h.inform(n.SECTION_LOADING, {\n                data: gb,\n                scrubberKey: this.scrubberKey\n            });\n            this.loaded = true;\n            i.removeClass(this.node, \"fbTimelineTimePeriodUnexpanded\");\n            i.removeClass(this.node, \"fbTimelineTimePeriodSuppressed\");\n            var hb = \"ProfileTimelineSectionPagelet\", ib = (this.scrubberKey == db.WAY_BACK);\n            if (ib) {\n                hb = \"ProfileTimelineRemainingYearsPagelet\";\n            };\n            gb.time_cutoff = db.getTimeCutoff();\n            gb.highlight_unit_data = eb;\n            gb.parent_key = this.parentKey;\n            gb.force_no_friend_activity = ta;\n            i.addClass(this.node, \"fbTimelineSectionLoading\");\n            if (gb.combine_sections) {\n                i.addClass(this.node, \"combinedSections\");\n            };\n            if ((this.canUnload && ga)) {\n                var jb = this.node.firstChild.cloneNode(true);\n                i.hide(jb);\n                j.insertAfter(this.node, jb);\n            }\n             else this.canScrollLoad = false;\n        ;\n            var kb = null;\n            if ((fb && !mb)) {\n                var lb = this.node;\n                lb.style.minHeight = (window.innerHeight + \"px\");\n                kb = function() {\n                    lb.style.minHeight = null;\n                };\n            }\n        ;\n            var mb = (gb.combine_sections && ib);\n            pa[this.scrubberKey] = s.loadFromEndpoint(hb, (mb ? (gb.unit_container_id + \"_left\") : this.node.id), gb, {\n                usePipe: true,\n                jsNonblock: true,\n                constHeight: true,\n                append: mb,\n                finallyHandler: kb\n            });\n            cb(this.scrubberKey);\n        },\n        preload: function() {\n            i.addClass(this.node, \"fbTimelineTimePeriodSuppressed\");\n            i.removeClass(this.node, \"fbTimelineTimePeriodUnexpanded\");\n            var eb = j.find(this.node, \"span.sectionLabel\");\n            if (eb.getAttribute(\"data-original-label\")) {\n                j.setContent(eb, eb.getAttribute(\"data-original-label\"));\n                eb.removeAttribute(\"data-original-label\");\n            }\n        ;\n        },\n        unload: function() {\n            if ((!this.loaded || !this.canUnload)) {\n                return\n            };\n            this.loaded = false;\n            (pa[this.scrubberKey] && pa[this.scrubberKey].cancel());\n            i.addClass(this.node, \"fbTimelineTimePeriodUnexpanded\");\n            i.removeClass(this.node, \"fbTimelineTimePeriodSuppressed\");\n            if ((this.node.nextSibling && i.hasClass(this.node.nextSibling, \"fbTimelineSection\"))) {\n                j.setContent(this.node, this.node.nextSibling);\n                i.show(this.node.firstChild);\n            }\n             else j.empty(this.node);\n        ;\n            this.deactivateScrollLoad();\n        },\n        activateScrollLoad: function() {\n            this.canScrollLoad = true;\n            i.removeClass(this.node, \"fbTimelineTimePeriodSuppressed\");\n            i.addClass(this.node, \"fbTimelineTimePeriodUnexpanded\");\n            (oa[this.scrubberKey] && oa[this.scrubberKey].reset());\n        },\n        deactivateScrollLoad: function() {\n            if (!this.loaded) {\n                this.canScrollLoad = false;\n                i.removeClass(this.node, \"fbTimelineTimePeriodUnexpanded\");\n                i.addClass(this.node, \"fbTimelineTimePeriodSuppressed\");\n                (oa[this.scrubberKey] && oa[this.scrubberKey].remove());\n            }\n        ;\n        },\n        setExpandLoadData: function(eb) {\n            this._expandPageletLoadData = eb;\n            return this;\n        },\n        appendData: function(eb) {\n            x(this._pageleLoadData, eb);\n            return this;\n        },\n        expandSubSections: function() {\n            if (this.subSections.length) {\n                db.navigateToSection(this.subSections[0].scrubberKey);\n            };\n        },\n        expand: function(eb) {\n            if (!this.loaded) {\n                return\n            };\n            sa.add_event((\"expand_\" + this.scrubberKey));\n            var fb = j.find(this.node, \".fbTimelineSectionExpander\");\n            i.addClass(fb.firstChild, \"async_saving\");\n            (eb && i.addClass(eb, \"async_saving\"));\n            this._expandPageletLoadData.time_cutoff = db.getTimeCutoff();\n            db.navigateToSection(this.scrubberKey);\n            j.scry(this.node, \".fbTimelineCapsule\").forEach(j.remove);\n            this._expandPageletLoadData.new_expand = true;\n            (pa[this.scrubberKey] && pa[this.scrubberKey].cancel());\n            pa[this.scrubberKey] = s.loadFromEndpoint(\"ProfileTimelineSectionPagelet\", fb.id, this._expandPageletLoadData, {\n                usePipe: true,\n                jsNonblock: true,\n                constHeight: true\n            });\n        },\n        isPermalinkPeriod: function() {\n            return this._pageletLoadData.is_permalink_period;\n        }\n    });\n    function wa() {\n        if (fa) {\n            return\n        };\n        o.register(o.CONTENT, db);\n        sa = ea(\"timeline\").uai(\"init\", \"scrubber\", false);\n        fa = true;\n        if ((t.ie() <= 7)) {\n            ga = true;\n        };\n    };\n    var xa = aa(function(eb, fb, gb) {\n        var hb = p.get(eb).historicUnitCount;\n        fb -= hb;\n        gb -= 1;\n        if ((((hb == -1) || (gb <= 0)) || (fb < 0))) {\n            return\n        };\n        var ib = db.getNextSectionKey(eb);\n        if (ib) {\n            p.get(ib).load();\n            xa(ib, fb, gb);\n        }\n    ;\n    }, 500);\n    function ya(eb, fb, gb, hb) {\n        var ib = db.getNextSectionKey(fb);\n        if (ib) {\n            oa[ib] = new l(eb, za.curry(ib, eb), false, (gb || 1000));\n        }\n         else if ((fb !== db.WAY_BACK)) {\n            hb = (hb ? hb : 0);\n            if ((hb > 80)) {\n                return null\n            };\n            ya.curry(eb, fb, gb, (hb + 1)).defer(250);\n        }\n        \n    ;\n    };\n    function za(eb, fb) {\n        var gb = p.get(eb);\n        if ((gb && gb.canScrollLoad)) {\n            sa.add_event((\"scroll_load_\" + eb));\n            if (ga) {\n                gb.preload();\n            }\n             else {\n                gb.load();\n                if (ua) {\n                    xa(eb, ua.required_units, ua.max_parallelism);\n                };\n            }\n        ;\n            (fb && j.remove(fb));\n        }\n    ;\n    };\n    function ab() {\n        var eb, fb, gb = false;\n        for (var hb = 0; (hb < ka.length); hb++) {\n            var ib = ka[hb];\n            if (!ib) {\n                continue;\n            };\n            var jb = p.get(ib);\n            if ((jb && ((jb.canScrollLoad || jb.loaded)))) {\n                if (!jb.loaded) {\n                    i.removeClass(jb.node, \"fbTimelineTimePeriodSuppressed\");\n                    i.addClass(jb.node, \"fbTimelineTimePeriodUnexpanded\");\n                }\n            ;\n                if ((eb && fb)) {\n                    bb(eb, fb);\n                    if (gb) {\n                        eb.deactivateScrollLoad();\n                    };\n                    gb = true;\n                }\n            ;\n                eb = null;\n                fb = null;\n                continue;\n            }\n             else if (eb) {\n                fb = jb;\n                jb.deactivateScrollLoad();\n            }\n             else {\n                eb = jb;\n                if (gb) {\n                    jb.activateScrollLoad();\n                };\n            }\n            \n        ;\n            i.removeClass(jb.node, \"fbTimelineTimePeriodSuppressed\");\n            i.addClass(jb.node, \"fbTimelineTimePeriodUnexpanded\");\n        };\n    };\n    function bb(eb, fb) {\n        i.removeClass(fb.node, \"fbTimelineTimePeriodUnexpanded\");\n        i.addClass(fb.node, \"fbTimelineTimePeriodSuppressed\");\n        var gb = j.find(eb.node, \"span.sectionLabel\"), hb = j.find(fb.node, \"span.sectionLabel\");\n        if (!hb.getAttribute(\"data-original-label\")) {\n            hb.setAttribute(\"data-original-label\", j.getText(hb));\n        };\n        if (((gb.getAttribute(\"data-month\") && hb.getAttribute(\"data-month\")) && (gb.getAttribute(\"data-year\") == hb.getAttribute(\"data-year\")))) {\n            j.setContent(hb, da._(\"Show {month1} - {month2} {year}\", {\n                month1: hb.getAttribute(\"data-month\"),\n                month2: gb.getAttribute(\"data-month\"),\n                year: gb.getAttribute(\"data-year\")\n            }));\n        }\n         else if ((gb.getAttribute(\"data-year\") !== hb.getAttribute(\"data-year\"))) {\n            j.setContent(hb, da._(\"Show {year1} - {year2}\", {\n                year1: hb.getAttribute(\"data-year\"),\n                year2: gb.getAttribute(\"data-year\")\n            }));\n        }\n         else j.setContent(hb, da._(\"Show {year}\", {\n            year: hb.getAttribute(\"data-year\")\n        }));\n        \n    ;\n    };\n    function cb(eb) {\n        if (ga) {\n            for (var fb = 0; (fb < (ka.length - 1)); fb++) {\n                var gb = ka[fb];\n                if (!gb) {\n                    continue;\n                };\n                if ((gb != eb)) {\n                    var hb = p.get(gb);\n                    if ((hb.loaded && hb.canUnload)) {\n                        hb.unload();\n                    };\n                }\n            ;\n            }\n        };\n        ab();\n    };\n    var db = {\n        WAY_BACK: \"way_back\",\n        RECENT: \"recent\",\n        HEADER_SCROLL_CUTOFF: 80,\n        CURRENT_SECTION_OFFSET: 150,\n        FOOTER_HEIGHT: 60,\n        registerTimePeriod: function(eb, fb, gb, hb, ib, jb, kb) {\n            wa();\n            if (w(ma, fb)) {\n                return\n            };\n            if (la) {\n                x(gb, la);\n            };\n            var lb = new va(eb, fb, gb, hb, kb);\n            if (!ib) {\n                ka[jb] = fb;\n                ja[fb] = true;\n            }\n             else {\n                lb.parentKey = ib;\n                p.get(ib).subSections = (p.get(ib).subSections || []);\n                p.get(ib).subSections[jb] = lb;\n            }\n        ;\n            p.set(fb, lb);\n            db.checkCurrentSectionChange();\n            h.inform(n.SECTION_REGISTERED, {\n                scrubberKey: fb\n            });\n        },\n        reset: function() {\n            for (var eb in oa) {\n                oa[eb].remove();;\n            };\n            for (var fb in pa) {\n                (pa[fb] && pa[fb].cancel());;\n            };\n            for (var gb in qa) {\n                qa[gb].unsubscribe();\n                delete qa[gb];\n            };\n            (ha && ha.unsubscribe());\n            ha = null;\n            p.removeAll();\n            ia = null;\n            ja = {\n            };\n            ka = [];\n            la = [];\n            ma = [];\n            na = {\n            };\n            oa = {\n            };\n            pa = {\n            };\n            ra = null;\n            sa = null;\n            ta = false;\n            fa = false;\n        },\n        checkCurrentSectionChange: function() {\n            var eb = db.getCurrentSection(), fb = (ia && ia.scrubberKey);\n            if (((eb && (eb.scrubberKey !== fb)) && !eb.isPermalinkPeriod())) {\n                ia = eb;\n                var gb = eb.scrubberKey, hb = eb.parentKey;\n                if (!hb) {\n                    hb = gb;\n                    gb = null;\n                }\n            ;\n                o.sectionHasChanged(hb, gb);\n            }\n        ;\n        },\n        setTimeCutoff: function(eb) {\n            ra = eb;\n        },\n        getTimeCutoff: function() {\n            return ra;\n        },\n        setParallelLoadConfig: function(eb) {\n            ua = eb;\n        },\n        getCurrentSection: function() {\n            var eb = {\n            }, fb = p.getAll();\n            for (var gb in fb) {\n                var hb = fb[gb];\n                if ((!hb.loaded || na[hb.scrubberKey])) {\n                    continue;\n                };\n                var ib = u.getElementPosition(hb.node, \"viewport\").y;\n                if ((hb.scrubberKey == \"recent\")) {\n                    ib--;\n                };\n                if ((ib < db.CURRENT_SECTION_OFFSET)) {\n                    eb[ib] = hb;\n                };\n            };\n            var jb = Math.max.apply(null, Object.keys(eb)), kb = (jb == -Infinity);\n            if (!kb) {\n                return eb[jb];\n            }\n             else if (ka[0]) {\n                return p.get(ka[0])\n            }\n        ;\n            return null;\n        },\n        capsuleForCurrentSection: function() {\n            var eb = db.getCurrentSection();\n            return (eb && j.scry(eb.node, \".fbTimelineCapsule\")[0]);\n        },\n        enableScrollLoad: function(eb, fb, gb, hb) {\n            eb = v(eb);\n            var ib = j.scry(eb.parentNode, \".fbTimelineCapsule\")[0];\n            if (!ib) {\n                return\n            };\n            if ((gb === null)) {\n                ya(eb, fb, hb);\n            }\n             else o.runOnceWhenSectionFullyLoaded(ya.curry(eb, fb, hb), fb, gb);\n        ;\n        },\n        enableScrollLoadOnClick: function(eb, fb, gb) {\n            eb = v(eb);\n            g.listen(eb, \"click\", function(hb) {\n                hb.prevent();\n                db.enableScrollLoad(eb, fb, null, gb);\n            });\n        },\n        expandSectionOnClick: function(eb, fb) {\n            g.listen(eb, \"click\", function(gb) {\n                gb.prevent();\n                p.get(fb).expand();\n            });\n        },\n        expandSubSectionsOnClick: function(eb, fb) {\n            g.listen(eb, \"click\", function(gb) {\n                gb.prevent();\n                p.get(fb).expandSubSections();\n            });\n        },\n        getNextSectionKey: function(eb) {\n            for (var fb = 0; (fb < (ka.length - 1)); fb++) {\n                if ((ka[fb] == eb)) {\n                    while (((fb < (ka.length - 1)) && !ka[(fb + 1)])) {\n                        fb++;;\n                    };\n                    return ka[(fb + 1)];\n                }\n            ;\n            };\n            var gb = p.get(eb);\n            if ((!gb || !gb.parentKey)) {\n                return\n            };\n            var hb = p.get(gb.parentKey);\n            if (!hb) {\n                return\n            };\n            for (var ib = 0; (ib < (hb.subSections.length - 1)); ib++) {\n                if ((hb.subSections[ib].scrubberKey == eb)) {\n                    return hb.subSections[(ib + 1)].scrubberKey\n                };\n            };\n        },\n        hideSection: function(eb) {\n            var fb = p.get(eb);\n            (fb && i.hide(j.find(fb.node, \".fbTimelineSection\")));\n            var gb = o.getCurrentScrubber();\n            if (gb) {\n                var hb = o.getCurrentScrubber().getNav(eb);\n                (hb && i.hide(hb));\n            }\n        ;\n            var ib = o.getCurrentStickyHeaderNav();\n            (ib && ib.removeTimePeriod(eb));\n            na[eb] = true;\n        },\n        loadSectionOnClick: function(eb, fb) {\n            g.listen(eb, \"click\", function(gb) {\n                gb.prevent();\n                p.get(fb).load();\n            });\n        },\n        removeSection: function(eb) {\n            for (var fb in ka) {\n                if ((ka[fb] == eb)) {\n                    ka[fb] = null;\n                    break;\n                }\n            ;\n            };\n            p.remove(eb);\n            delete ja[eb];\n            if ((eb in oa)) {\n                oa[eb].remove();\n                delete oa[eb];\n            }\n        ;\n            var gb = o.getCurrentStickyHeaderNav();\n            (gb && gb.removeTimePeriod(eb));\n            ma.push(eb);\n        },\n        removeSectionParent: function(eb) {\n            j.remove(v(eb).parentNode);\n        },\n        navigateToSection: function(eb, fb, gb) {\n            sa.add_event((\"nav_\" + eb));\n            fb = !!fb;\n            var hb = eb, ib = p.get(eb);\n            if (!ib) {\n                return\n            };\n            if (!ib.loaded) {\n                q.enable();\n                j.scry(v(\"timeline_tab_content\"), \".fbTimelineShowOlderSections\").forEach(j.remove);\n            }\n        ;\n            if (!ja[eb]) {\n                ib.node.style.minHeight = (u.getViewportDimensions().y + \"px\");\n                var jb = h.subscribe(n.SECTION_FULLY_LOADED, function(rb, sb) {\n                    if ((sb.scrubberKey === eb)) {\n                        ib.node.style.minHeight = \"\";\n                        jb.unsubscribe();\n                    }\n                ;\n                });\n                hb = ib.parentKey;\n                var kb = p.get(hb).node;\n                if (!i.hasClass(kb, \"fbTimelineSectionExpanded\")) {\n                    k.scrollTo(kb, 0);\n                    i.addClass(kb, \"fbTimelineSectionExpanded\");\n                    j.scry(kb, \".fbTimelineCapsule\").forEach(j.remove);\n                    j.scry(kb, \"div.fbTimelineSectionExpandPager\").forEach(j.remove);\n                    j.scry(kb, \"div.fbTimelineContentHeader\").forEach(j.remove);\n                    j.scry(kb, \"._5vf\").forEach(function(rb) {\n                        if (!rb.getAttribute(\"data-subsection\")) {\n                            j.remove(rb);\n                        };\n                    });\n                }\n            ;\n                var lb = db.getNextSectionKey(hb);\n                if ((lb && oa[lb])) {\n                    oa[lb].setBuffer(0);\n                };\n            }\n        ;\n            for (var mb = 0; (mb < ka.length); mb++) {\n                var nb = ka[mb];\n                if (!nb) {\n                    continue;\n                };\n                if ((nb == hb)) {\n                    break;\n                };\n                p.get(nb).deactivateScrollLoad();\n                j.scry(v(\"timeline_tab_content\"), \".fbTimelineSectionExpandPager\").forEach(function(rb) {\n                    var sb = m.getInstance(rb.id);\n                    (sb && sb.removeOnVisible());\n                });\n            };\n            db.adjustContentPadding();\n            ib.load(gb, true);\n            ab();\n            var ob = u.getScrollPosition().x, pb = u.getElementPosition(ib.node).y;\n            if (!fb) {\n                var qb = (ja[eb] ? n.SCROLL_TO_OFFSET : n.SUBSECTION_SCROLL_TO_OFFSET);\n                k.scrollTo(new u(ob, (pb - qb), \"document\"), true, false, false, function() {\n                    var rb = u.getElementPosition(ib.node).y;\n                    k.scrollTo(new u(ob, (rb - qb), \"document\"), false);\n                    var sb = j.scry(ib.node, \"h3.uiHeaderTitle\")[0];\n                    if (sb) {\n                        sb.tabIndex = 0;\n                        sb.focus();\n                    }\n                ;\n                });\n            }\n        ;\n        },\n        adjustContentPadding: function() {\n            var eb = ba(\"timeline_tab_content\");\n            if (!eb) {\n                return\n            };\n            if (o.isOneColumnMinimal()) {\n                return\n            };\n            var fb = (o.getCurrentKey() || r.TIMELINE_KEY);\n            if ((fb !== r.TIMELINE_KEY)) {\n                return\n            };\n            var gb = (ka.length - 1), hb = p.get(ka[gb]);\n            eb.style.paddingBottom = ((hb && hb.loaded) ? null : ((((u.getViewportDimensions().y - db.CURRENT_SECTION_OFFSET) - db.HEADER_SCROLL_CUTOFF) - db.FOOTER_HEIGHT) + \"px\"));\n        },\n        adjustContentPaddingAfterLoad: function(eb, fb) {\n            o.runOnceWhenSectionFullyLoaded(db.adjustContentPadding, eb, fb);\n        },\n        appendContentAfterLoad: function(eb, fb, gb) {\n            o.runOnceWhenSectionFullyLoaded(j.appendContent.curry(v(eb), fb), gb, \"0\");\n        },\n        markSectionAsLoaded: function(eb, fb, gb) {\n            o.runOnceWhenSectionFullyLoaded(function() {\n                (ba(eb) && i.removeClass(v(eb).parentNode, \"fbTimelineSectionLoading\"));\n            }, fb, gb);\n        },\n        suppressSectionsAbove: function(eb) {\n            var fb, gb;\n            for (var hb = 0; (hb < ka.length); hb++) {\n                var ib = ka[hb];\n                if (!ib) {\n                    continue;\n                };\n                fb = p.get(ib).node;\n                gb = null;\n                if ((y(eb.parentNode.children).indexOf(eb) <= y(fb.parentNode.children).indexOf(fb))) {\n                    gb = ib;\n                    break;\n                }\n            ;\n                p.get(ib).deactivateScrollLoad();\n            };\n            if (gb) {\n                db.navigateToSection(gb, true);\n            };\n        },\n        forceNoFriendActivity: function() {\n            ta = true;\n        },\n        removeDupes: function(eb) {\n            var fb = ba(eb);\n            if (!fb) {\n                return\n            };\n            var gb = j.scry(fb, \"li.fbTimelineUnit\"), hb = {\n            };\n            for (var ib = 0; (ib < gb.length); ib++) {\n                var jb = gb[ib];\n                if ((jb.id && ca(jb.id, \"tl_unit_\"))) {\n                    var kb = jb.id.substring(8, jb.id.length), lb = (((jb.getAttribute(\"data-unit\") == \"ExperienceSummaryUnit\") ? jb.getAttribute(\"data-time\") : 1));\n                    if ((hb.hasOwnProperty(kb) && (hb[kb] == lb))) {\n                        jb.id = (\"dupe_unit_\" + Math.random());\n                        jb.className = \"hidden_elem\";\n                    }\n                     else hb[kb] = lb;\n                ;\n                }\n            ;\n            };\n        },\n        removeLoadingState: function(eb) {\n            (ba(eb) && i.removeClass(v(eb), \"fbTimelineSectionLoading\"));\n        },\n        setExpandLoadDataForSection: function(eb, fb) {\n            var gb = p.get(eb);\n            (gb && gb.setExpandLoadData(fb));\n        },\n        appendSectionDataForAllSections: function(eb) {\n            la = eb;\n            for (var fb = 0; (fb < (ka.length - 1)); fb++) {\n                var gb = ka[fb];\n                if (!gb) {\n                    continue;\n                };\n                var hb = p.get(gb);\n                (hb && hb.appendData(eb));\n            };\n        },\n        updatePagerAfterLoad: function(eb, fb, gb, hb, ib) {\n            var jb = m.getInstance(eb.firstChild.id);\n            if (!jb) {\n                qa[eb.firstChild.id] = h.subscribe(m.REGISTERED, function(kb, lb) {\n                    qa[eb.firstChild.id].unsubscribe();\n                    delete qa[eb.firstChild.id];\n                    if ((lb.id === eb.firstChild.id)) {\n                        db.updatePagerAfterLoad(eb, fb, gb, hb, ib);\n                    };\n                });\n                return;\n            }\n        ;\n            o.runOnceWhenSectionFullyLoaded(function() {\n                i.removeClass(eb, \"fbTimelineHiddenPager\");\n                jb.checkBuffer();\n            }, gb, hb);\n            if (ib) {\n                o.runOnceWhenSectionFullyLoaded(o.adjustScrollingPagerBuffer.curry(eb.firstChild.id, fb), gb, hb);\n            };\n        },\n        showAfterLoad: function(eb, fb, gb) {\n            o.runOnceWhenSectionFullyLoaded(function() {\n                var hb = ba(eb);\n                (hb && i.show(hb));\n            }, fb, gb);\n        },\n        repositionDialog: function(eb) {\n            h.subscribe(n.SECTION_LOADED, function() {\n                eb.updatePosition();\n            });\n        },\n        rightColumnFinished: function(eb) {\n            var fb = p.get(eb);\n            fb.rightColumnFinished = true;\n        },\n        registerUnrankedGroup: function(eb) {\n            g.listen(eb, \"click\", function(event) {\n                var fb = j.find(eb, \".unranked_group_placeholder\");\n                if ((event.getTarget() !== fb)) {\n                    return event.prevent()\n                };\n                j.remove(fb);\n                i.removeClass(j.find(eb, \".unranked_group_units\"), \"hidden_elem\");\n                return true;\n            });\n        }\n    };\n    e.exports = db;\n});\n__d(\"TimelineLogging\", [\"TimelineController\",\"reportData\",], function(a, b, c, d, e, f) {\n    var g = b(\"TimelineController\"), h = b(\"reportData\"), i = false, j = 0, k = null, l = null, m = {\n        init: function(n) {\n            if (i) {\n                return\n            };\n            j = n;\n            g.register(g.LOGGING, this);\n        },\n        reset: function() {\n            i = false;\n            j = 0;\n            k = null;\n        },\n        log: function(n, o) {\n            o.profile_id = j;\n            h(n, {\n                gt: o\n            });\n        },\n        logSectionChange: function(n, o) {\n            var p = {\n                timeline_section_change: 1,\n                key: n\n            };\n            if ((k && (n == k))) {\n                p.timeline_scrubber = 1;\n                k = null;\n            }\n        ;\n            if ((l && (n == l))) {\n                p.sticky_header_nav = 1;\n                l = null;\n            }\n        ;\n            m.log(\"timeline\", p);\n        },\n        logScrubberClick: function(n) {\n            k = n;\n        },\n        logStickyHeaderNavClick: function(n) {\n            l = n;\n        }\n    };\n    e.exports = m;\n});\n__d(\"TimelineSideAds\", [\"function-extensions\",\"Arbiter\",\"CSS\",\"DOM\",\"EgoAdsObjectSet\",\"Event\",\"StickyController\",\"TimelineConstants\",\"TimelineController\",\"UIPagelet\",\"URI\",\"Vector\",\"cx\",\"csx\",\"debounce\",\"ge\",], function(a, b, c, d, e, f) {\n    b(\"function-extensions\");\n    var g = b(\"Arbiter\"), h = b(\"CSS\"), i = b(\"DOM\"), j = b(\"EgoAdsObjectSet\"), k = b(\"Event\"), l = b(\"StickyController\"), m = b(\"TimelineConstants\"), n = b(\"TimelineController\"), o = b(\"UIPagelet\"), p = b(\"URI\"), q = b(\"Vector\"), r = b(\"cx\"), s = b(\"csx\"), t = b(\"debounce\"), u = b(\"ge\"), v = 3, w = 4, x = 75, y = \"data-height\", z = 30000, aa = 0, ba = false, ca, da, ea, fa, ga, ha = new j(), ia, ja = false, ka, la = Infinity, ma = 5, na = false, oa, pa, qa, ra, sa, ta, ua = false, va = [], wa;\n    function xa(ub, vb, wb) {\n        var xb = 0;\n        if (vb) {\n            xb += vb.getHeight();\n        };\n        if ((!cb() && !xb)) {\n            return\n        };\n        ub -= xb;\n        var yb = 0;\n        for (var zb = 0; (zb < wb); zb++) {\n            yb += lb(zb);;\n        };\n        if (vb) {\n            if ((ub < yb)) {\n                ub += vb.fold((yb - ub));\n            }\n             else if ((ub > yb)) {\n                ub -= vb.unfold((ub - yb));\n            }\n        \n        };\n        return ub;\n    };\n    function ya() {\n        var ub = da.cloneNode(true);\n        ub.id = \"\";\n        var vb = new j();\n        vb.init(i.scry(ub, \"div.ego_unit\"));\n        var wb = true;\n        vb.forEach(function(xb) {\n            if (wb) {\n                wb = false;\n            }\n             else i.remove(xb);\n        ;\n        });\n        h.addClass(ub, \"fixed_elem\");\n        return ub;\n    };\n    function za() {\n        ga = undefined;\n        if (!n.pageHasScrubber(ia)) {\n            db(ma);\n            gb();\n        }\n         else if (pa) {\n            eb(da, false);\n            var ub = qa;\n            (qa && i.remove(qa));\n            qa = ya();\n            if (ub) {\n                rb();\n            };\n            db(((n.sidebarInitialized() && ja) ? w : v));\n            gb();\n            if (!ka) {\n                var vb = n.getCurrentScrubber();\n                if (vb) {\n                    qb(vb.getRoot(), vb.getOffset());\n                };\n            }\n        ;\n            (ka && ka.start());\n        }\n         else tb.adjustAdsToFit();\n        \n    ;\n    };\n    function ab() {\n        if (qa) {\n            i.remove(qa);\n            qa = null;\n        }\n    ;\n        if (ka) {\n            ka.stop();\n            ka = null;\n        }\n    ;\n        if (cb()) {\n            h.conditionClass(da, \"fixed_elem\", !pa);\n            h.conditionClass(da, \"_22s\", !n.pageHasScrubber(ia));\n        }\n         else h.conditionClass(da, \"fixed_elem\", (!pa && n.pageHasScrubber(ia)));\n    ;\n    };\n    function bb(ub) {\n        var vb = q.getViewportDimensions().y, wb = n.getCurrentScrubber(), xb = (wb ? wb.getOffset() : m.SCRUBBER_DEFAULT_OFFSET), yb = ((vb - xb) - x);\n        if ((wb || cb())) {\n            return xa(yb, wb, ub)\n        };\n    };\n    function cb() {\n        return n.fixedAds();\n    };\n    function db(ub) {\n        fa = Math.min(ub, ha.getCount());\n        ha.forEach(function(vb, wb) {\n            eb(vb, (wb >= fa));\n        });\n        eb(da, (fa === 0));\n    };\n    function eb(ub, vb) {\n        h.conditionClass(ub, \"_22r\", vb);\n        ub.setAttribute(\"aria-hidden\", (vb ? \"true\" : \"false\"));\n    };\n    function fb(ub) {\n        var vb = i.find(ha.getUnit(ub), \"div._4u8\"), wb = vb.getAttribute(\"data-ad\");\n        return JSON.parse(wb).adid;\n    };\n    function gb() {\n        ib();\n        hb();\n    };\n    function hb() {\n        var ub;\n        if ((ga !== undefined)) {\n            ub = ha.getHoldoutAdIDsForSpace(ga, mb);\n        }\n         else ub = ha.getHoldoutAdIDsForNumAds(fa);\n    ;\n        if (ub) {\n            ub.forEach(jb);\n        };\n    };\n    function ib() {\n        if (!ra) {\n            return\n        };\n        for (var ub = (fa - 1); (ub >= 0); --ub) {\n            if (((ka && ka.isFixed()) && ((((ub !== 0)) || ((qa && !h.shown(qa))))))) {\n                continue;\n            };\n            var vb = fb(ub);\n            if (!ra[vb]) {\n                return\n            };\n            jb(vb);\n        };\n    };\n    function jb(ub) {\n        if (!ra[ub]) {\n            return\n        };\n        var vb = i.create(\"iframe\", {\n            src: p(\"/ai.php\").addQueryData({\n                aed: ra[ub]\n            }),\n            width: 0,\n            height: 0,\n            frameborder: 0,\n            scrolling: \"no\",\n            className: \"fbEmuTracking\"\n        });\n        vb.setAttribute(\"aria-hidden\", \"true\");\n        i.appendContent(da, vb);\n        delete ra[ub];\n    };\n    function kb(ub) {\n        var vb = 0;\n        while (((ub > 0) && (vb < ma))) {\n            ub -= lb(vb);\n            if ((ub >= 0)) {\n                vb++;\n            };\n        };\n        return vb;\n    };\n    function lb(ub) {\n        var vb = ha.getUnit(ub);\n        if (!vb) {\n            return 0\n        };\n        return mb(vb);\n    };\n    function mb(ub) {\n        if (!ub.getAttribute(y)) {\n            nb(ub);\n        };\n        return parseInt(ub.getAttribute(y), 10);\n    };\n    function nb(ub) {\n        ub.setAttribute(y, ub.offsetHeight);\n    };\n    function ob() {\n        for (var ub = 0; (ub < ha.getCount()); ub++) {\n            var vb = ha.getUnit(ub);\n            if (!vb) {\n                continue;\n            };\n            nb(vb);\n        };\n    };\n    function pb() {\n        var ub = i.scry(da, \"div.ego_unit\");\n        ha.init(ub);\n        var vb = ub.length;\n        if (!vb) {\n            return\n        };\n        h.addClass(ha.getUnit(0), \"ego_unit_no_top_border\");\n        na = vb;\n        za();\n        var wb = function(xb) {\n            nb(xb);\n            na = --vb;\n            tb.adjustAdsToFit();\n            if (!na) {\n                la = Date.now();\n            };\n        };\n        ub.forEach(function(xb) {\n            function yb() {\n                wb.curry(xb).defer();\n            };\n            var zb = i.scry(xb, \"img.img\")[0];\n            if (!zb) {\n                return\n            };\n            if (zb.complete) {\n                yb();\n            }\n             else k.listen(zb, {\n                load: yb,\n                error: yb,\n                abort: yb\n            });\n        ;\n        });\n    };\n    function qb(ub, vb) {\n        ka = new l(ub, vb, function(wb) {\n            if (wb) {\n                rb();\n            }\n             else {\n                i.remove(qa);\n                gb();\n            }\n        ;\n        });\n        if (qa) {\n            ka.start();\n        };\n    };\n    function rb() {\n        i.insertAfter(da, qa);\n        sb();\n    };\n    function sb() {\n        h.conditionShow(qa, ((lb(0) <= bb(1)) && !h.hasClass(document.documentElement, \"tinyViewport\")));\n    };\n    var tb = {\n        init: function(ub, vb, wb) {\n            if (ba) {\n                return\n            };\n            ma = wb.max_ads;\n            ca = wb.refresh_delay;\n            z = wb.refresh_threshold;\n            ba = true;\n            ea = vb;\n            da = ub;\n            tb.adjustAdsType(n.shouldShowWideAds());\n            sa = g.subscribe([\"UFI/CommentAddedActive\",\"UFI/CommentDeletedActive\",\"UFI/LikeActive\",\"Curation/Action\",\"ProfileBrowser/LoadMoreContent\",\"Ads/NewContentDisplayed\",], tb.loadAdsIfEnoughTimePassed);\n            ta = g.subscribe(\"TimelineSideAds/refresh\", tb.forceReloadAds);\n            wa = t(tb.loadAdsIfEnoughTimePassed, ca, this, true);\n            if (wb.mouse_move) {\n                va.push(k.listen(window, \"mousemove\", wa));\n                va.push(k.listen(window, \"scroll\", wa));\n                va.push(k.listen(window, \"resize\", wa));\n            }\n        ;\n            n.register(n.ADS, tb);\n        },\n        setShortMode: function(ub) {\n            pa = ub;\n        },\n        start: function(ub) {\n            ra = ub;\n            oa = null;\n            pb();\n        },\n        updateCurrentKey: function(ub) {\n            if ((ub == ia)) {\n                return\n            };\n            ia = ub;\n            ab();\n        },\n        loadAds: function(ub) {\n            if ((na || oa)) {\n                return\n            };\n            la = Infinity;\n            oa = o.loadFromEndpoint(\"WebEgoPane\", da.id, {\n                pid: 33,\n                data: [ea,(\"timeline_\" + ub),(pa ? w : ma),++aa,false,]\n            }, {\n                crossPage: true,\n                bundle: false\n            });\n        },\n        registerScrubber: function(ub) {\n            if (pa) {\n                qb(ub.getRoot(), ub.getOffset());\n            };\n            (!oa && tb.adjustAdsToFit());\n        },\n        loadAdsIfEnoughTimePassed: function() {\n            if (((((z && (((Date.now() - la) >= z))) && !h.hasClass(document.documentElement, \"tinyViewport\")) && ((!ka || ka.isFixed()))) && ((!ra || !ra[fb(0)])))) {\n                tb.loadAds(ia);\n            };\n            tb.adjustAdsToFit();\n        },\n        forceReloadAds: function() {\n            tb.loadAds(ia);\n        },\n        adjustAdsType: function(ub) {\n            if ((ub != ja)) {\n                h.conditionClass(da, \"_22q\", !ub);\n                h.conditionClass(da, \"_35q\", !ub);\n                (qa && h.conditionClass(qa, \"_22q\", !ub));\n                (qa && h.conditionClass(qa, \"_35q\", !ub));\n                ja = ub;\n                ob();\n                tb.adjustAdsToFit();\n                var vb = u(\"rightColContent\");\n                if (vb) {\n                    h.conditionClass(vb, \"fbTimelineWideRightCol\", ub);\n                };\n            }\n        ;\n        },\n        adjustAdsToFit: function() {\n            if ((!da || ua)) {\n                return\n            };\n            ua = true;\n            var ub = (ja ? w : v);\n            if (pa) {\n                if ((ka && qa)) {\n                    ka.handleScroll();\n                    if (ka.isFixed()) {\n                        h.conditionShow(qa, ((lb(0) <= bb(1)) && !h.hasClass(document.documentElement, \"tinyViewport\")));\n                    }\n                     else db(ub);\n                ;\n                    gb();\n                }\n            ;\n            }\n             else {\n                var vb = bb(ub);\n                if ((typeof vb !== \"undefined\")) {\n                    ga = vb;\n                    db(kb(vb));\n                    if (!na) {\n                        gb();\n                    };\n                }\n            ;\n            }\n        ;\n            ua = false;\n        },\n        reset: function() {\n            (ka && ka.stop());\n            (oa && oa.cancel());\n            ha = new j();\n            ja = false;\n            da = null;\n            ka = null;\n            oa = null;\n            aa = 0;\n            na = null;\n            pa = null;\n            qa = null;\n            ia = null;\n            la = Infinity;\n            ba = false;\n            (sa && g.unsubscribe(sa));\n            sa = null;\n            (ta && g.unsubscribe(ta));\n            ta = null;\n            va.forEach(function(ub) {\n                ub.remove();\n            });\n            va = [];\n            (wa && wa.reset());\n        }\n    };\n    e.exports = (a.TimelineSideAds || tb);\n});\n__d(\"TimelineStickyHeader\", [\"Animation\",\"Arbiter\",\"Bootloader\",\"CSS\",\"DOM\",\"Style\",\"TimelineController\",\"TimelineURI\",\"Vector\",\"ViewportBounds\",\"$\",\"ge\",\"queryThenMutateDOM\",], function(a, b, c, d, e, f) {\n    var g = b(\"Animation\"), h = b(\"Arbiter\"), i = b(\"Bootloader\"), j = b(\"CSS\"), k = b(\"DOM\"), l = b(\"Style\"), m = b(\"TimelineController\"), n = b(\"TimelineURI\"), o = b(\"Vector\"), p = b(\"ViewportBounds\"), q = b(\"$\"), r = b(\"ge\"), s = b(\"queryThenMutateDOM\"), t = 200, u = false, v = false, w, x, y, z, aa, ba, ca = {\n    }, da = {\n        VISIBLE: \"TimelineStickyHeader/visible\",\n        ADJUST_WIDTH: \"TimelineStickyHeader/adjustWidth\",\n        init: function(ea) {\n            if (u) {\n                return\n            };\n            u = true;\n            w = ea;\n            x = k.find(ea, \"div.name\");\n            y = k.find(ea, \"div.actions\");\n            v = j.hasClass(ea, \"fbTimelineStickyHeaderVisible\");\n            var fa = q(\"blueBar\"), ga, ha = false;\n            s(function() {\n                if (((fa.offsetTop && !r(\"page_admin_panel\")) && (m.getCurrentKey() !== n.TIMELINE_KEY))) {\n                    ga = o.getElementDimensions(fa).y;\n                    ha = true;\n                }\n            ;\n            }, function() {\n                if (ha) {\n                    i.loadModules([\"StickyController\",], function(ia) {\n                        new ia(ea, ga).start();\n                    });\n                }\n                 else j.addClass(ea, \"fixed_elem\");\n            ;\n                s(function() {\n                    aa = ea.offsetTop;\n                    ba = ea.scrollHeight;\n                }, function() {\n                    z = p.addTop(function() {\n                        return (v ? (aa + ba) : 0);\n                    });\n                }, \"TimelineStickyHeader/init\");\n                m.register(m.STICKY_HEADER, da);\n            }, \"TimelineStickyHeader/init\");\n        },\n        reset: function() {\n            u = false;\n            v = false;\n            w = null;\n            x = null;\n            y = null;\n            ca = {\n            };\n            z.remove();\n            z = null;\n        },\n        toggle: function(ea) {\n            if ((ea !== v)) {\n                var fa = (ea ? (aa - ba) : aa), ga = (ea ? aa : (aa - ba));\n                l.set(w, \"top\", (fa + \"px\"));\n                j.addClass(w, \"fbTimelineStickyHeaderAnimating\");\n                var ha = k.getID(w);\n                (ca[ha] && ca[ha].stop());\n                ca[ha] = new g(w).from(\"top\", fa).to(\"top\", ga).duration(t).ondone(function() {\n                    ca[ha] = null;\n                    j.conditionClass(w, \"fbTimelineStickyHeaderHidden\", !ea);\n                    w.setAttribute(\"aria-hidden\", (ea ? \"false\" : \"true\"));\n                    j.removeClass(w, \"fbTimelineStickyHeaderAnimating\");\n                    l.set(w, \"top\", \"\");\n                    h.inform(da.VISIBLE, ea);\n                }).go();\n                v = ea;\n            }\n        ;\n        },\n        adjustWidth: function() {\n            h.inform(da.ADJUST_WIDTH, x, h.BEHAVIOR_STATE);\n        },\n        getRoot: function() {\n            return w;\n        },\n        setActions: function(ea) {\n            if ((u && ea)) {\n                k.setContent(y, ea);\n                y = ea;\n            }\n        ;\n        }\n    };\n    e.exports = (a.TimelineStickyHeader || da);\n});\n__d(\"ButtonGroup\", [\"function-extensions\",\"copyProperties\",\"createArrayFrom\",\"CSS\",\"DataStore\",\"Parent\",], function(a, b, c, d, e, f) {\n    b(\"function-extensions\");\n    var g = b(\"copyProperties\"), h = b(\"createArrayFrom\"), i = b(\"CSS\"), j = b(\"DataStore\"), k = b(\"Parent\"), l = \"firstItem\", m = \"lastItem\";\n    function n(s, t) {\n        var u = k.byClass(s, t);\n        if (!u) {\n            throw new Error(\"invalid use case\")\n        };\n        return u;\n    };\n    function o(s) {\n        return (i.shown(s) && h(s.childNodes).some(i.shown));\n    };\n    function p(s) {\n        var t, u, v;\n        h(s.childNodes).forEach(function(w) {\n            v = o(w);\n            i.removeClass(w, l);\n            i.removeClass(w, m);\n            i.conditionShow(w, v);\n            if (v) {\n                t = (t || w);\n                u = w;\n            }\n        ;\n        });\n        (t && i.addClass(t, l));\n        (u && i.addClass(u, m));\n        i.conditionShow(s, t);\n    };\n    function q(s, t) {\n        var u = n(t, \"uiButtonGroupItem\");\n        s(u);\n        p(u.parentNode);\n    };\n    function r(s) {\n        this._root = n(s, \"uiButtonGroup\");\n        j.set(this._root, \"ButtonGroup\", this);\n        p(this._root);\n    };\n    r.getInstance = function(s) {\n        var t = n(s, \"uiButtonGroup\"), u = j.get(t, \"ButtonGroup\");\n        return (u || new r(t));\n    };\n    g(r.prototype, {\n        hideItem: q.curry(i.hide),\n        showItem: q.curry(i.show),\n        toggleItem: q.curry(i.toggle)\n    });\n    e.exports = r;\n});\n__d(\"TimelineStickyHeaderNav\", [\"Event\",\"function-extensions\",\"Arbiter\",\"ButtonGroup\",\"CSS\",\"DOM\",\"Parent\",\"SelectorDeprecated\",\"Style\",\"SubscriptionsHandler\",\"TimelineConstants\",\"TimelineController\",\"TimelineLegacySections\",\"URI\",\"UserAgent\",\"Vector\",\"ge\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\");\n    b(\"function-extensions\");\n    var h = b(\"Arbiter\"), i = b(\"ButtonGroup\"), j = b(\"CSS\"), k = b(\"DOM\"), l = b(\"Parent\"), m = b(\"SelectorDeprecated\"), n = b(\"Style\"), o = b(\"SubscriptionsHandler\"), p = b(\"TimelineConstants\"), q = b(\"TimelineController\"), r = b(\"TimelineLegacySections\"), s = b(\"URI\"), t = b(\"UserAgent\"), u = b(\"Vector\"), v = b(\"ge\"), w = b(\"tx\"), x = false, y, z, aa, ba, ca, da, ea, fa, ga, ha, ia, ja = {\n    }, ka = {\n    }, la = [], ma = false, na = [], oa = [], pa, qa = [\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\",];\n    function ra() {\n        var fb = m.getSelectorMenu(da);\n        pa.addSubscriptions(g.listen(fb, \"click\", sa), h.subscribe(p.SECTION_LOADED, wa));\n    };\n    function sa(event) {\n        var fb = l.byTag(event.getTarget(), \"a\");\n        if (fb) {\n            var gb = fb.getAttribute(\"data-key\");\n            q.stickyHeaderNavWasClicked(gb);\n            q.navigateToSection(gb);\n            event.prevent();\n        }\n    ;\n    };\n    function ta(fb, gb) {\n        var hb = m.getValue(gb);\n        if ((hb === \"allStories\")) {\n            r.get(fb).expandSubSections();\n        };\n        if ((hb !== \"activityLog\")) {\n            ua(gb);\n        };\n    };\n    function ua(fb) {\n        db(fb, \"highlights\");\n        db(fb, \"allStories\");\n        var gb = k.find(fb, \"li.separator\");\n        j.conditionShow(gb, gb.previousSibling);\n    };\n    function va(fb) {\n        if ((ga[fb] && !z.custom_subsection_menu)) {\n            ab(fb);\n        }\n         else xa();\n    ;\n        q.adjustStickyHeaderWidth();\n    };\n    function wa(fb, gb) {\n        var hb = gb.key;\n        if (ha[hb]) {\n            bb(hb);\n            va(hb);\n        }\n    ;\n    };\n    function xa() {\n        ba.hideItem(ea);\n    };\n    function ya(fb) {\n        var gb = fb.split(\"_\");\n        return qa[(gb.pop() - 1)];\n    };\n    function za(fb) {\n        var gb = fa[fb], hb = ga[fb];\n        if ((!gb && hb)) {\n            gb = fa[fb] = ea.cloneNode(true);\n            var ib = k.scry(gb, \"li.activityLog a\")[0];\n            if (ib) {\n                ib.href = s(ib.href).addQueryData({\n                    key: fb\n                });\n            };\n            var jb = q.getCurrentScrubber();\n            if (hb.length) {\n                j.show(k.find(gb, \"li.separator\"));\n            };\n            for (var kb = 0; (kb < hb.length); kb++) {\n                var lb = hb[kb].scrubberKey, mb = (jb ? jb.getLabelForSubnav(hb[kb].parentKey, lb) : mb = ya(lb));\n                if (mb) {\n                    cb(gb, {\n                        key: lb,\n                        label: mb\n                    });\n                };\n            };\n            pa.addSubscriptions(m.listen(gb, \"change\", ta.curry(fb, gb)), g.listen(gb, \"click\", sa));\n        }\n    ;\n        return gb;\n    };\n    function ab(fb) {\n        var gb = za(fb);\n        k.insertAfter(ea, gb);\n        j.hide(ea);\n        for (var hb in fa) {\n            var ib = fa[hb];\n            j.conditionShow(ib, (ib === gb));\n        };\n        ba.showItem(ea);\n    };\n    function bb(fb) {\n        ga[fb] = r.get(fb).subSections;\n    };\n    function cb(fb, gb) {\n        var hb = k.create(\"a\", {\n            href: \"#\",\n            rel: \"ignore\",\n            className: \"itemAnchor\",\n            tabIndex: 0\n        }, k.create(\"span\", {\n            className: \"itemLabel fsm\"\n        }, gb.label));\n        hb.setAttribute(\"data-key\", gb.key);\n        hb.setAttribute(\"aria-checked\", false);\n        var ib = k.create(\"li\", {\n            className: \"uiMenuItem uiMenuItemRadio uiSelectorOption\"\n        }, hb);\n        ib.setAttribute(\"data-label\", gb.label);\n        var jb = k.find(fb, \"ul.uiMenuInner\"), kb = k.create(\"option\", {\n            value: gb.key\n        }, gb.label), lb = k.find(fb, \"select\");\n        if ((gb.key === \"recent\")) {\n            k.prependContent(jb, ib);\n            k.insertAfter(lb.options[0], kb);\n        }\n         else {\n            k.appendContent(jb, ib);\n            k.appendContent(lb, kb);\n        }\n    ;\n    };\n    function db(fb, gb) {\n        var hb = k.scry(fb, \"li.uiMenuItem\");\n        if (!hb) {\n            return\n        };\n        for (var ib = 0; (ib < hb.length); ib++) {\n            var jb = hb[ib];\n            if ((j.hasClass(jb, gb) || (jb.firstChild.getAttribute(\"data-key\") == gb))) {\n                k.remove(jb);\n                break;\n            }\n        ;\n        };\n        var kb = k.find(fb, \"select\"), lb = k.scry(kb, \"option\");\n        for (ib = 0; (ib < lb.length); ib++) {\n            if ((lb[ib].value === gb)) {\n                k.remove(lb[ib]);\n                return;\n            }\n        ;\n        };\n    };\n    var eb = {\n        init: function(fb, gb) {\n            if (x) {\n                return\n            };\n            x = true;\n            y = fb;\n            z = (gb || {\n            });\n            ca = k.find(y, \"div.pageMenu\");\n            da = k.find(y, \"div.sectionMenu\");\n            ea = k.find(y, \"div.subsectionMenu\");\n            ia = k.find(ca, \"li.uiMenuSeparator\");\n            ba = i.getInstance(ca);\n            pa = new o();\n            fa = {\n            };\n            ga = {\n            };\n            ha = {\n            };\n            eb.adjustMenuHeights();\n            ra();\n            q.register(q.STICKY_HEADER_NAV, eb);\n            oa.forEach(function(hb) {\n                hb();\n            });\n        },\n        reset: function() {\n            x = false;\n            z = {\n            };\n            la = [];\n            ja = {\n            };\n            ka = {\n            };\n            ma = false;\n            na = [];\n            y = null;\n            ca = null;\n            da = null;\n            ea = null;\n            ia = null;\n            fa = {\n            };\n            ga = {\n            };\n            ha = {\n            };\n            pa.release();\n        },\n        addTimePeriod: function(fb) {\n            var gb = q.getCurrentScrubber();\n            if (!gb) {\n                return\n            };\n            var hb = gb.getLabelForNav(fb);\n            if (!hb) {\n                return\n            };\n            cb(da, {\n                key: fb,\n                label: hb\n            });\n            var ib = k.find(da, \"ul.uiMenuInner\");\n            if (((fb === \"recent\") || (ib.children.length < 2))) {\n                m.setSelected(da, fb, true);\n            };\n        },\n        updateSection: function(fb, gb) {\n            if (gb) {\n                var hb = za(fb);\n                if (hb) {\n                    m.setSelected(hb, gb);\n                    ua(hb);\n                }\n                 else aa = fb;\n            ;\n            }\n             else {\n                ha[fb] = true;\n                bb(fb);\n            }\n        ;\n            m.setSelected(da, fb, true);\n            va(fb);\n        },\n        adjustMenuHeights: function() {\n            if ((t.ie() <= 7)) {\n                return\n            };\n            [ca,da,].forEach(function(fb) {\n                var gb = \"\";\n                if (!j.hasClass(document.documentElement, \"tinyViewport\")) {\n                    gb = ((u.getViewportDimensions().y - u.getElementDimensions(v(\"blueBar\")).y) - 80);\n                    gb += \"px\";\n                }\n            ;\n                n.set(k.find(fb, \"ul.uiMenuInner\"), \"maxHeight\", gb);\n            });\n        },\n        initPageMenu: function(fb, gb) {\n            if (!x) {\n                oa.push(eb.initPageMenu.curry(fb, gb));\n                return;\n            }\n        ;\n            function hb(ib, jb) {\n                ib.forEach(function(kb) {\n                    var lb = ka[kb] = k.create(\"li\");\n                    j.hide(lb);\n                    (jb ? k.insertBefore(ia, lb) : k.appendContent(k.find(ca, \"ul.uiMenuInner\"), lb));\n                });\n            };\n            hb(fb, true);\n            hb(gb, false);\n            ja.info = k.scry(ca, \"li\")[0];\n            la = gb;\n            ma = true;\n            if (na.length) {\n                na.forEach(function(ib) {\n                    eb.registerPageMenuItem(ib.key, ib.item);\n                });\n            };\n        },\n        registerPageMenuItem: function(fb, gb) {\n            if (!ma) {\n                na.push({\n                    key: fb,\n                    item: gb\n                });\n                return;\n            }\n        ;\n            if (ka[fb]) {\n                k.replace(ka[fb], gb);\n                ja[fb] = gb;\n                delete ka[fb];\n                if ((la.indexOf(fb) >= 0)) {\n                    j.show(ia);\n                };\n            }\n        ;\n        },\n        removeTimePeriod: function(fb) {\n            db(da, fb);\n        }\n    };\n    e.exports = eb;\n});\n__d(\"TimelineSpinelessComposer\", [\"Arbiter\",\"Bootloader\",\"CSS\",\"DOM\",\"Parent\",\"Run\",\"TimelineComposer\",\"TimelineComposerUtilities\",\"csx\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"Bootloader\"), i = b(\"CSS\"), j = b(\"DOM\"), k = b(\"Parent\"), l = b(\"Run\"), m = b(\"TimelineComposer\"), n = b(\"TimelineComposerUtilities\"), o = b(\"csx\"), p = b(\"cx\"), q;\n    function r(w) {\n        if ((w.isScheduledPost || w.isOGPost)) {\n            return\n        };\n        if (!w.streamStory) {\n            window.location.reload();\n            return;\n        }\n    ;\n        if (w.backdatedTime) {\n            h.loadModules([\"TimelineStoryPublisher\",], function(x) {\n                x.publish(w);\n            });\n            return;\n        }\n    ;\n        m.renderCapsuleBasedStory(q, w.streamStory);\n    };\n    function s() {\n        return j.find(k.byClass(q, \"fbTimelineComposerCapsule\"), \"div._4s3\");\n    };\n    function t(w) {\n        var x = u();\n        i.show(x);\n        var y = w.subscribe(\"hide\", function() {\n            i.hide(x);\n            w.unsubscribe(y);\n        });\n    };\n    function u() {\n        var w = k.byClass(q, \"fbTimelineComposerCapsule\"), x = j.scry(w, \"div.composerVeil\");\n        if ((x.length !== 1)) {\n            x = j.appendContent(w, j.create(\"div\", {\n                className: \"composerVeil hidden_elem\"\n            }));\n        };\n        return x[0];\n    };\n    var v = {\n        init: function(w) {\n            q = w;\n            var x = g.subscribe(\"composer/publish\", function(event, y) {\n                if ((y.composer_id === q.id)) {\n                    r(y);\n                };\n            });\n            l.onLeave(x.unsubscribe.bind(x));\n            if (i.hasClass(q, \"_mj\")) {\n                n.hidePlaceIfAttachmentsTooTall(q);\n            }\n             else n.hidePlaceIfAttachmentsTooTallOld(q);\n        ;\n        },\n        showMLEFlyout: function(w) {\n            w.setContext(s()).show();\n            t(w);\n        }\n    };\n    e.exports = v;\n});\n__d(\"TimelineScrubber\", [\"Event\",\"CSS\",\"DOM\",\"Focus\",\"Keys\",\"Parent\",\"TimelineController\",\"Vector\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"CSS\"), i = b(\"DOM\"), j = b(\"Focus\"), k = b(\"Keys\"), l = b(\"Parent\"), m = b(\"TimelineController\"), n = b(\"Vector\"), o = b(\"copyProperties\");\n    function p(q) {\n        this._root = q;\n        this._navKeys = {\n        };\n        this._subNavKeys = {\n        };\n        this._rollups = {\n        };\n        this._rolledup = {\n        };\n        var r = q.childNodes;\n        this._currentNav = r[0];\n        for (var s = 0; (s < r.length); s++) {\n            var t = r[s].getAttribute(\"data-key\");\n            this._navKeys[t] = r[s];\n            var u = i.scry(r[s], \"ul\");\n            this._subNavKeys[t] = {\n            };\n            if (u.length) {\n                var v = u[0].childNodes;\n                for (var w = 0; (w < v.length); w++) {\n                    this._subNavKeys[t][v[w].getAttribute(\"data-key\")] = v[w];;\n                };\n            }\n        ;\n            var x = r[s].getAttribute(\"data-rollup\");\n            if (x) {\n                this._rollups[x] = (this._rollups[x] || []);\n                this._rollups[x].push(r[s]);\n            }\n        ;\n        };\n        this._clickListener = g.listen(this._root, \"click\", this._handleScrub.bind(this));\n        this._focusHandler = g.listen(this._root, \"keydown\", this._moveFocus.bind(this));\n        this._tabbableElement = i.scry(this._root, \"a\")[0];\n        h.show(this._root);\n        var y = (n.getViewportDimensions().y - this.SCRUBBER_NO_ADS_VERTICAL_BUFFER), z = this.getHeight();\n        if ((z > y)) {\n            this.fold((z - y));\n        };\n        m.register(m.SCRUBBER, this);\n        m.scrubberHasLoaded(this);\n    };\n    o(p.prototype, {\n        KEY_HEIGHT: 23,\n        SUBKEY_HEIGHT: 16,\n        OFFSET: 38,\n        SCRUBBER_NO_ADS_VERTICAL_BUFFER: 125,\n        reset: function() {\n            this._root = null;\n            this._navKeys = {\n            };\n            this._subNavKeys = {\n            };\n            this._rollups = {\n            };\n            this._rolledup = {\n            };\n        },\n        getRoot: function() {\n            return this._root;\n        },\n        getNav: function(q) {\n            return this._navKeys[q];\n        },\n        getSubnav: function(q, r) {\n            return this._subNavKeys[q][r];\n        },\n        getHeight: function() {\n            return this._root.offsetHeight;\n        },\n        getLabelForNav: function(q) {\n            var r = this.getNav(q);\n            return (r && i.getText(i.scry(r, \"a\")[0]));\n        },\n        getLabelForSubnav: function(q, r) {\n            var s = this.getSubnav(q, r);\n            return (s && i.getText(i.scry(s, \"a\")[0]));\n        },\n        fold: function(q) {\n            return this._adjustFolding(q, true);\n        },\n        unfold: function(q) {\n            return this._adjustFolding(q, false);\n        },\n        getOffset: function() {\n            return ((this.OFFSET + ((h.hasClass(document.body, \"hasVoiceBar\") ? 26 : 0))) + ((h.hasClass(\"rightColContent\", \"pagesTimelineRightColumn\") ? 48 : 0)));\n        },\n        updateSection: function(q, r) {\n            if (!this._navKeys[q]) {\n                return\n            };\n            var s = this._navKeys[q].getAttribute(\"data-rollup\");\n            if ((this._currentRollup && (this._currentRollup != s))) {\n                h.removeClass(this._currentRollup, \"selected\");\n                h.removeClass(i.scry(this._currentRollup, \"ul\")[0], \"loaded\");\n                delete this._currentRollup;\n            }\n        ;\n            if ((s && this._rolledup[s])) {\n                var t = this._rolledup[s];\n                if (t.getAttribute(\"data-rollup\")) {\n                    this._currentRollup = t;\n                    h.addClass(this._currentRollup, \"selected\");\n                    h.addClass(i.scry(this._currentRollup, \"ul\")[0], \"loaded\");\n                }\n            ;\n            }\n        ;\n            (this._currentNav && h.removeClass(this._currentNav, \"selected\"));\n            (this._currentSubNav && h.removeClass(this._currentSubNav, \"selected\"));\n            this._currentNav = null;\n            this._currentSubNav = null;\n            if (this._navKeys[q]) {\n                this._currentNav = this._navKeys[q];\n                h.addClass(this._currentNav, \"selected\");\n                if ((this.decadesAreSelectable && this._navKeys[r])) {\n                    this._currentSubNav = this._navKeys[r];\n                    h.addClass(this._currentSubNav, \"selected\");\n                }\n                 else if ((r && this._subNavKeys[q][r])) {\n                    this._currentSubNav = this._subNavKeys[q][r];\n                    h.addClass(this._currentSubNav, \"selected\");\n                }\n                \n            ;\n            }\n        ;\n        },\n        _getRollupSize: function(q) {\n            var r = this._currentNav, s = (r && r.getAttribute(\"data-rollup\")), t = (this.KEY_HEIGHT * ((this._rollups[q].length - 1)));\n            if ((q == s)) {\n                t += (this.SUBKEY_HEIGHT * i.scry(r, \"li\").length);\n                t -= (this.SUBKEY_HEIGHT * ((this._rollups[q].length - 1)));\n            }\n        ;\n            return t;\n        },\n        _adjustFolding: function(q, r) {\n            var s = q, t = Object.keys(this._rollups);\n            while (((q > 0) && t.length)) {\n                var u = t[(r ? \"pop\" : \"shift\")]();\n                if ((!r == !this._rolledup[u])) {\n                    continue;\n                };\n                var v = this._getRollupSize(u);\n                if ((v <= 0)) {\n                    continue;\n                };\n                if ((!r && (v > q))) {\n                    break;\n                };\n                this[(r ? \"_collapseRollup\" : \"_expandRollup\")](u);\n                q -= v;\n            };\n            return (s - q);\n        },\n        _collapseRollup: function(q) {\n            var r = this._rollups[q];\n            if (((!r || (r.length < 2)) || this._rolledup[q])) {\n                return\n            };\n            var s = r[0].previousSibling, t = r[0], u = i.create(\"a\", {\n                href: t.firstChild.href,\n                rel: \"ignore\",\n                tabindex: \"-1\"\n            }, [q,]), v = i.create(\"ul\", {\n                className: \"clearfix\"\n            });\n            for (var w = 0; (w < r.length); w++) {\n                v.appendChild(r[w]);;\n            };\n            var x = i.create(\"li\", null, [u,v,]);\n            if (this.decadesAreSelectable) {\n                var y = r[(r.length - 1)], z = (t.getAttribute(\"data-key\") + y.getAttribute(\"data-key\"));\n                x.setAttribute(\"data-start\", y.getAttribute(\"data-start\"));\n                x.setAttribute(\"data-end\", t.getAttribute(\"data-end\"));\n                x.setAttribute(\"data-key\", z);\n                this._navKeys[z] = x;\n            }\n             else x.setAttribute(\"data-key\", t.getAttribute(\"data-key\"));\n        ;\n            x.setAttribute(\"data-rollup\", q);\n            if (s) {\n                i.insertAfter(s, x);\n            }\n             else i.prependContent(this._root, x);\n        ;\n            this._rolledup[q] = x;\n            this._checkSelection();\n            this._ensureFocusableElementIsVisible();\n        },\n        _expandRollup: function(q) {\n            if (!this._rolledup[q]) {\n                return\n            };\n            var r = this._rolledup[q], s = i.scry(r, \"ul\")[0], t = document.createDocumentFragment();\n            while (s.childNodes.length) {\n                t.appendChild(s.firstChild);;\n            };\n            i.replace(r, t);\n            this._rolledup[q] = false;\n            this._checkSelection();\n        },\n        _checkSelection: function() {\n            if (this._currentNav) {\n                var q = (this._currentSubNav && this._currentSubNav.getAttribute(\"data-key\"));\n                this.updateSection(this._currentNav.getAttribute(\"data-key\"), q);\n            }\n        ;\n        },\n        _handleScrub: function(event) {\n            var q = event.getModifiers();\n            if (((event.isMiddleClick() || q.access) || q.meta)) {\n                return true\n            };\n            var r = l.byTag(event.getTarget(), \"a\"), s = (r && l.byAttribute(r, \"data-key\"));\n            if (s) {\n                m.scrubberWasClicked(s.getAttribute(\"data-key\"));\n                m.navigateToSection(s.getAttribute(\"data-key\"));\n                return event.prevent();\n            }\n        ;\n        },\n        _ensureFocusableElementIsVisible: function() {\n            while (!((this._tabbableElement.offsetHeight || this._tabbableElement.offsetWidth))) {\n                this._tabbableElement.tabIndex = -1;\n                var q = l.byTag(l.byTag(this._tabbableElement, \"li\"), \"li\");\n                this._tabbableElement = i.scry(q, \"a\")[0];\n                this._tabbableElement.tabIndex = 0;\n            };\n        },\n        _moveFocus: function(event) {\n            if (event.getModifiers().any) {\n                return\n            };\n            var q = g.getKeyCode(event);\n            if (((q === k.UP) || (q === k.DOWN))) {\n                var r = i.scry(this._root, \"a\").filter(function(u) {\n                    return (u.offsetHeight || u.offsetWidth);\n                }), s = r.indexOf(this._tabbableElement);\n                if ((s != -1)) {\n                    var t = r[(s + (((q === k.UP) ? -1 : 1)))];\n                    if (t) {\n                        t.tabindex = 0;\n                        j.set(t);\n                        this._tabbableElement.tabindex = -1;\n                        this._tabbableElement = t;\n                        event.prevent();\n                    }\n                ;\n                }\n            ;\n            }\n        ;\n        }\n    });\n    e.exports = p;\n});\n__d(\"TimelineMainScrubber\", [\"Arbiter\",\"Class\",\"CSS\",\"DOMQuery\",\"TimelineConstants\",\"TimelineController\",\"TimelineScrubber\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"Class\"), i = b(\"CSS\"), j = b(\"DOMQuery\"), k = b(\"TimelineConstants\"), l = b(\"TimelineController\"), m = b(\"TimelineScrubber\"), n = b(\"copyProperties\");\n    function o(p) {\n        this.parent.construct(this, p);\n        this._subscribe = g.subscribe(k.SECTION_LOADED, function(q, r) {\n            var s = this._navKeys[r.key], t = (s && j.scry(s, \"ul\")[0]);\n            if (t) {\n                i.addClass(t, \"loaded\");\n                l.scrubberHasChangedState();\n                if (r.hideSubSections) {\n                    i.hide(t);\n                };\n            }\n        ;\n        }.bind(this));\n    };\n    h.extend(o, m);\n    n(o.prototype, {\n        reset: function() {\n            this.parent.reset();\n            (this._subscribe && this._subscribe.unsubscribe());\n        }\n    });\n    e.exports = o;\n});\n__d(\"legacy:TimelineMainScrubber\", [\"TimelineMainScrubber\",], function(a, b, c, d) {\n    a.TimelineMainScrubber = b(\"TimelineMainScrubber\");\n}, 3);\n__d(\"legacy:TimelineCover\", [\"TimelineCover\",], function(a, b, c, d) {\n    a.TimelineCover = b(\"TimelineCover\");\n}, 3);\n__d(\"legacy:ui-scrolling-pager-js\", [\"ScrollingPager\",], function(a, b, c, d) {\n    a.ScrollingPager = b(\"ScrollingPager\");\n}, 3);\n__d(\"legacy:LegacyContextualDialog\", [\"LegacyContextualDialog\",], function(a, b, c, d) {\n    a.LegacyContextualDialog = b(\"LegacyContextualDialog\");\n}, 3);\n__d(\"ButtonGroupMonitor\", [\"ContextualDialog\",\"ContextualLayer\",\"CSS\",\"Layer\",\"Parent\",\"SelectorDeprecated\",], function(a, b, c, d, e, f) {\n    var g = b(\"ContextualDialog\"), h = b(\"ContextualLayer\"), i = b(\"CSS\"), j = b(\"Layer\"), k = b(\"Parent\"), l = b(\"SelectorDeprecated\");\n    function m(n) {\n        var o = (k.byClass(n, \"bg_stat_elem\") || k.byClass(n, \"uiButtonGroup\"));\n        (o && i.toggleClass(o, \"uiButtonGroupActive\"));\n    };\n    j.subscribe([\"hide\",\"show\",], function(n, o) {\n        if (((o instanceof h) || (o instanceof g))) {\n            m(o.getCausalElement());\n        };\n    });\n    l.subscribe([\"close\",\"open\",], function(n, o) {\n        m(o.selector);\n    });\n});\n__d(\"SubMenu\", [\"Event\",\"Arbiter\",\"copyProperties\",\"CSS\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"Arbiter\"), i = b(\"copyProperties\"), j = b(\"CSS\");\n    function k() {\n    \n    };\n    i(k.prototype, {\n        _subMenu: null,\n        _mainMenu: null,\n        _forward: null,\n        _backward: null,\n        init: function(l, m, n, o) {\n            this._subMenu = l;\n            this._mainMenu = m;\n            this._forward = n;\n            this._backward = o;\n            h.subscribe(\"SubMenu/Reset\", this._goToMainMenu.bind(this));\n            g.listen(n, \"click\", this._goToSubMenu.bind(this));\n            g.listen(o, \"click\", this._goToMainMenu.bind(this));\n        },\n        initAsyncChildMenu: function(l) {\n            g.listen(this._forward, \"click\", function() {\n                this._goToSubMenu();\n                l.load();\n            }.bind(this));\n        },\n        _goToMainMenu: function() {\n            j.hide(this._subMenu);\n            j.show(this._mainMenu);\n        },\n        _goToSubMenu: function() {\n            j.hide(this._mainMenu);\n            j.show(this._subMenu);\n        }\n    });\n    e.exports = k;\n});\n__d(\"legacy:ui-submenu\", [\"SubMenu\",], function(a, b, c, d) {\n    a.SubMenu = b(\"SubMenu\");\n}, 3);\n__d(\"AsyncMenu\", [\"AsyncRequest\",\"copyProperties\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = b(\"copyProperties\"), i = b(\"emptyFunction\");\n    function j(k, l) {\n        this._uri = k;\n        this._elem = l;\n    };\n    h(j.prototype, {\n        _uri: null,\n        _elem: null,\n        load: function() {\n            this.load = i;\n            g.bootstrap(this._uri, this._elem);\n        }\n    });\n    e.exports = j;\n});");
// 18242
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o7,"sb33c49282a87772f79f2c37aa2d65236bfd00c6c");
// 18572
o25.scrollTop = 1399;
// 18243
geval("if (JSBNG__self.CavalryLogger) {\n    CavalryLogger.start_js([\"jsIYP\",]);\n}\n;\n;\n__d(\"AdsCurrency\", [\"AdsCurrencyConfig\",], function(a, b, c, d, e, f) {\n    var g = b(\"AdsCurrencyConfig\").currencies;\n    function h(m) {\n        if (g[m]) {\n            return g[m][0];\n        }\n    ;\n    ;\n        return null;\n    };\n;\n    function i(m) {\n        if (g[m]) {\n            return g[m][1];\n        }\n    ;\n    ;\n        return null;\n    };\n;\n    function j(m) {\n        if (g[m]) {\n            return ((1 * g[m][2]));\n        }\n    ;\n    ;\n        return 1;\n    };\n;\n    var k = [];\n    {\n        var fin276keys = ((window.top.JSBNG_Replay.forInKeys)((g))), fin276i = (0);\n        var l;\n        for (; (fin276i < fin276keys.length); (fin276i++)) {\n            ((l) = (fin276keys[fin276i]));\n            {\n                if (g.hasOwnProperty(l)) {\n                    k.push(l);\n                }\n            ;\n            ;\n            };\n        };\n    };\n;\n    f.getFormat = h;\n    f.getSymbol = i;\n    f.getOffset = j;\n    f.currencyMapKeys = k;\n});\n__d(\"ads-lib-formatters\", [\"AdsCurrency\",], function(a, b, c, d, e, f) {\n    var g = b(\"AdsCurrency\"), h = \"USD\";\n    function i(t, u, v) {\n        t = ((t || \"\"));\n        v = ((v || \"\"));\n        u = ((((typeof u === \"undefined\")) ? t.length : u));\n        return ((((t.length > u)) ? ((t.substr(0, ((u - v.length))) + v)) : t));\n    };\n;\n    function j(t, u) {\n        if (((((u === undefined)) || ((u === null))))) {\n            u = \"\";\n        }\n    ;\n    ;\n        return function(v) {\n            return ((!v ? u : i(v, t, \"...\")));\n        };\n    };\n;\n    function k(t, u, v, w) {\n        if (((t === \"N/A\"))) {\n            return t;\n        }\n    ;\n    ;\n        t = ((t || 0));\n        v = ((v || \"\"));\n        w = ((w || \".\"));\n        t = ((((u !== null)) ? l(t, u) : ((t + \"\"))));\n        var x = t.split(\".\"), y = x[0], z = x[1], aa = \"\", ba = /(\\d)(\\d\\d\\d)($|\\D)/, ca = ((((\"$1\" + v)) + \"$2$3\"));\n        while ((((aa = y.replace(ba, ca)) != y))) {\n            y = aa;\n        ;\n        };\n    ;\n        var da = y;\n        if (z) {\n            da += ((w + z));\n        }\n    ;\n    ;\n        return da;\n    };\n;\n    function l(t, u) {\n        var v = Math.pow(10, u);\n        t = ((((Math.round(((t * v))) / v)) + \"\"));\n        if (!u) {\n            return t;\n        }\n    ;\n    ;\n        var w = t.indexOf(\".\"), x = 0;\n        if (((w == -1))) {\n            t += \".\";\n            x = u;\n        }\n         else x = ((u - ((((t.length - w)) - 1))));\n    ;\n    ;\n        for (var y = 0, z = x; ((y < z)); y++) {\n            t += \"0\";\n        ;\n        };\n    ;\n        return t;\n    };\n;\n    function m(t) {\n        return function(u) {\n            return k(u, ((t || 0)), \",\", \".\");\n        };\n    };\n;\n    function n(t, u) {\n        var v = ((((u === false)) ? 1 : 100));\n        return function(w) {\n            return ((k(((w * v)), ((t || 0)), \",\", \".\") + \"%\"));\n        };\n    };\n;\n    var o = {\n    };\n    function p(t, u, v) {\n        if (((t === undefined))) {\n            t = 2;\n        }\n    ;\n    ;\n        if (((v === undefined))) {\n            v = false;\n        }\n    ;\n    ;\n        u = ((u || h));\n        var w = ((((((((u + \"-\")) + t)) + \"-\")) + v));\n        if (!o[w]) {\n            var x = ((g.getFormat(u) || g.getFormat(h))), y = ((g.getSymbol(u) || g.getSymbol(h))), z = ((g.getOffset(u) || g.getOffset(h)));\n            x = x.replace(\"{symbol}\", y);\n            o[w] = function(aa) {\n                if (v) {\n                    aa = ((aa / z));\n                }\n            ;\n            ;\n                if (!((aa + \"\")).match(/^\\-?[\\d\\.,]*$/)) {\n                    return \"N/A\";\n                }\n            ;\n            ;\n                var ba = k(aa, t, \",\", \".\");\n                return x.replace(\"{amount}\", ba);\n            };\n        }\n    ;\n    ;\n        return o[w];\n    };\n;\n    function q(t) {\n        t = ((t + \"\")).trim().replace(/^[^\\d]*\\-/, \"\\u0002\");\n        if (!(((/^\\u0002?(\\d+,\\d*){2,}$/.test(t)) || (/^\\u0002?(\\d+\\.\\d*){2,}$/.test(t))))) {\n            t = t.replace(/[\\.,](\\d*\\D*)$/, \"\\u0001$1\");\n        }\n    ;\n    ;\n        t = t.replace(/[^0-9\\u0001\\u0002]/g, \"\").replace(\"\\u0001\", \".\").replace(\"\\u0002\", \"-\");\n        return ((+t || 0));\n    };\n;\n    function r() {\n        return function(t) {\n            return ((k(t, 0, \",\", \".\") + \"%\"));\n        };\n    };\n;\n    function s(t) {\n        var u = t.currency(), v = ((((t.offset() == 100)) ? 2 : 0));\n        return p(v, u);\n    };\n;\n    f.createTextTruncator = j;\n    f.chopString = i;\n    f.parseNumber = q;\n    f.formatNumber = k;\n    f.createNumberFormatter = m;\n    f.createPercentFormatter = n;\n    f.createMoneyFormatter = p;\n    f.createMoneyFormatterForAccount = s;\n    f.createInflationFormatter = r;\n});\n__d(\"ComposerXDatepickerIconReset\", [\"CSS\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSS\"), h = b(\"cx\");\n    function i(j) {\n        g.removeClass(j.element, \"_4_na\");\n        g.removeClass(j.element, \"_509o\");\n    };\n;\n    e.exports = i;\n});\n__d(\"legacy:dom-html\", [\"HTML\",], function(a, b, c, d) {\n    a.HTML = b(\"HTML\");\n}, 3);\n__d(\"ScrollingPager\", [\"Arbiter\",\"copyProperties\",\"CSS\",\"OnVisible\",\"UIPagelet\",\"$\",\"ge\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"copyProperties\"), i = b(\"CSS\"), j = b(\"OnVisible\"), k = b(\"UIPagelet\"), l = b(\"$\"), m = b(\"ge\"), n = {\n    };\n    function o(p, q, r, s) {\n        this.scroll_loader_id = p;\n        this.pagelet_src = q;\n        this.data = r;\n        this.options = ((s || {\n        }));\n        if (this.options.target_id) {\n            this.target_id = this.options.target_id;\n            this.options.append = true;\n        }\n         else this.target_id = p;\n    ;\n    ;\n        this.scroll_area_id = this.options.scroll_area_id;\n        this.handler = null;\n    };\n;\n    h(o, {\n        REGISTERED: \"ScrollingPager/registered\",\n        getInstance: function(p) {\n            return n[p];\n        }\n    });\n    h(o.prototype, {\n        setBuffer: function(p) {\n            this.options.buffer = p;\n            ((this.onvisible && this.onvisible.setBuffer(p)));\n        },\n        getBuffer: function() {\n            return this.options.buffer;\n        },\n        register: function() {\n            this.onvisible = new j(l(this.scroll_loader_id), this.getHandler(), false, this.options.buffer, false, m(this.scroll_area_id));\n            n[this.scroll_loader_id] = this;\n            g.inform(o.REGISTERED, {\n                id: this.scroll_loader_id\n            });\n        },\n        getInstance: function(p) {\n            return n[p];\n        },\n        getHandler: function() {\n            if (this.handler) {\n                return this.handler;\n            }\n        ;\n        ;\n            function p(q) {\n                var r = m(this.scroll_loader_id);\n                if (!r) {\n                    this.onvisible.remove();\n                    return;\n                }\n            ;\n            ;\n                i.addClass(r.firstChild, \"async_saving\");\n                var s = this.options.handler;\n                this.options.handler = function() {\n                    g.inform(\"ScrollingPager/loadingComplete\");\n                    ((s && s.apply(null, arguments)));\n                };\n                if (q) {\n                    this.data.pager_fired_on_init = true;\n                }\n            ;\n            ;\n                k.loadFromEndpoint(this.pagelet_src, this.target_id, this.data, this.options);\n            };\n        ;\n            return p.bind(this);\n        },\n        setHandler: function(p) {\n            this.handler = p;\n        },\n        removeOnVisible: function() {\n            this.onvisible.remove();\n        },\n        checkBuffer: function() {\n            ((this.onvisible && this.onvisible.checkBuffer()));\n        }\n    });\n    e.exports = o;\n});\n__d(\"StickyController\", [\"JSBNG__Event\",\"CSS\",\"Style\",\"Vector\",\"copyProperties\",\"queryThenMutateDOM\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"CSS\"), i = b(\"Style\"), j = b(\"Vector\"), k = b(\"copyProperties\"), l = b(\"queryThenMutateDOM\");\n    function m(n, o, p, q) {\n        this._element = n;\n        this._marginTop = o;\n        this._onchange = p;\n        this._proxy = ((q || n.parentNode));\n        this._boundQueryOnScroll = this._queryOnScroll.bind(this);\n        this._boundMutateOnScroll = this._mutateOnScroll.bind(this);\n    };\n;\n    k(m.prototype, {\n        handleScroll: function() {\n            l(this._boundQueryOnScroll, this._boundMutateOnScroll);\n        },\n        _queryOnScroll: function() {\n            this._shouldFix = ((j.getElementPosition(this._proxy, \"viewport\").y <= this._marginTop));\n        },\n        _mutateOnScroll: function() {\n            var n = this._shouldFix;\n            if (((this.isFixed() !== n))) {\n                i.set(this._element, \"JSBNG__top\", ((n ? ((this._marginTop + \"px\")) : \"\")));\n                h.conditionClass(this._element, \"fixed_elem\", n);\n                ((this._onchange && this._onchange(n)));\n            }\n        ;\n        ;\n        },\n        start: function() {\n            if (this._event) {\n                return;\n            }\n        ;\n        ;\n            this._event = g.listen(window, \"JSBNG__scroll\", this.handleScroll.bind(this));\n            this.handleScroll.bind(this).defer();\n        },\n        JSBNG__stop: function() {\n            ((this._event && this._event.remove()));\n            this._event = null;\n        },\n        isFixed: function() {\n            return h.hasClass(this._element, \"fixed_elem\");\n        }\n    });\n    e.exports = m;\n});\n__d(\"tidyEvent\", [\"Run\",], function(a, b, c, d, e, f) {\n    var g = b(\"Run\"), h = [];\n    function i() {\n        while (h.length) {\n            var k = h.shift();\n            if (k.remove) {\n                ((k._handler && k.remove()));\n            }\n             else ((k && k.unsubscribe()));\n        ;\n        ;\n        };\n    ;\n    };\n;\n    function j(k) {\n        if (!h.length) {\n            g.onLeave(i);\n        }\n    ;\n    ;\n        if (Array.isArray(k)) {\n            h = h.concat(k);\n        }\n         else h.push(k);\n    ;\n    ;\n        return k;\n    };\n;\n    e.exports = j;\n});\n__d(\"TriggerablePageletLoader\", [\"function-extensions\",\"CSS\",\"JSBNG__Event\",\"OnVisible\",\"Run\",\"UIPagelet\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    b(\"function-extensions\");\n    var g = b(\"CSS\"), h = b(\"JSBNG__Event\"), i = b(\"OnVisible\"), j = b(\"Run\"), k = b(\"UIPagelet\"), l = b(\"copyProperties\"), m = [];\n    function n(p) {\n        if (!m[p]) {\n            return;\n        }\n    ;\n    ;\n        ((m[p].__trigger && m[p].__trigger.remove()));\n        delete m[p];\n    };\n;\n    function o(p, q) {\n        this._disabledTriggerKeys = [];\n        this._pageletConfig = p;\n        this._loaded = false;\n        this._loading = false;\n        this._triggerKeys = [];\n        if (q) {\n            q.forEach(this.addTrigger.bind(this));\n        }\n    ;\n    ;\n        j.onLeave(this.destroy.bind(this));\n    };\n;\n    l(o, {\n        removeTrigger: function(p) {\n            {\n                var fin277keys = ((window.top.JSBNG_Replay.forInKeys)((m))), fin277i = (0);\n                var q;\n                for (; (fin277i < fin277keys.length); (fin277i++)) {\n                    ((q) = (fin277keys[fin277i]));\n                    {\n                        if (((m[q] && ((m[q].node === p))))) {\n                            n(q);\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n        },\n        TRIGGER_CLICK: \"click\",\n        TRIGGER_ONVISIBLE: \"onvisible\",\n        TRIGGER_NOW: \"now\"\n    });\n    l(o.prototype, {\n        addTrigger: function(p) {\n            p.__trigger = this._createTrigger(p);\n            m.push(p);\n            this._triggerKeys.push(((m.length - 1)));\n        },\n        destroy: function() {\n            this.removeTriggers();\n            if (this._pageletRequest) {\n                this._pageletRequest.cancel();\n                this._pageletRequest = null;\n                this._loading = false;\n                this._loaded = false;\n            }\n        ;\n        ;\n        },\n        disableTriggers: function() {\n            this._triggerKeys.forEach(function(p) {\n                if (m[p]) {\n                    m[p].__trigger.remove();\n                    this._disabledTriggerKeys.push(p);\n                }\n            ;\n            ;\n            }.bind(this));\n        },\n        enableTriggers: function() {\n            if (((this._loaded || this._loading))) {\n                return;\n            }\n        ;\n        ;\n            this._disabledTriggerKeys.forEach(function(p) {\n                if (m[p]) {\n                    m[p].__trigger = this._createTrigger(m[p]);\n                }\n            ;\n            ;\n            }.bind(this));\n            this._disabledTriggerKeys.length = 0;\n        },\n        _createTrigger: function(p) {\n            if (((this._loaded || this._loading))) {\n                return;\n            }\n        ;\n        ;\n            var q = this.onTrigger.bind(this, p);\n            switch (p.type) {\n              case o.TRIGGER_CLICK:\n                return h.listen(p.node, \"click\", function(r) {\n                    r.prevent();\n                    q();\n                });\n              case o.TRIGGER_ONVISIBLE:\n                return new i(p.node, q, p.onVisibleStrict, p.onVisibleBuffer);\n              case o.TRIGGER_NOW:\n                return q();\n              default:\n            \n            };\n        ;\n        },\n        load: function(p) {\n            if (((this._loaded || this._loading))) {\n                return;\n            }\n        ;\n        ;\n            this._loading = true;\n            this._loaded = false;\n            g.addClass(this._pageletConfig.node, \"async_saving\");\n            if (((p && p.node))) {\n                g.addClass(p.node, \"async_saving\");\n            }\n        ;\n        ;\n            var q = ((this._pageletConfig.options || {\n            }));\n            q.displayCallback = this.onLoad.bind(this, p);\n            if (((q.crossPage === undefined))) {\n                q.crossPage = true;\n            }\n        ;\n        ;\n            this._pageletRequest = k.loadFromEndpoint(this._pageletConfig.controller, this._pageletConfig.node, this._pageletConfig.data, q);\n        },\n        onLoad: function(p, q) {\n            this._loaded = true;\n            this._pageletRequest = null;\n            g.removeClass(this._pageletConfig.node, \"async_saving\");\n            if (((p && p.node))) {\n                g.removeClass(p.node, \"async_saving\");\n            }\n        ;\n        ;\n            if (this._pageletConfig.displayCallback) {\n                this._pageletConfig.displayCallback(q);\n            }\n             else q();\n        ;\n        ;\n        },\n        onTrigger: function(p) {\n            ((p.callback && p.callback(p)));\n            if (((!this._loaded && !this._loading))) {\n                this.load(p);\n            }\n        ;\n        ;\n        },\n        removeTriggers: function(p) {\n            this._triggerKeys.forEach(function(q) {\n                if (((m[q] && ((!p || ((m[q].type === p))))))) {\n                    n(q);\n                }\n            ;\n            ;\n            });\n        }\n    });\n    e.exports = o;\n});\n__d(\"MedleyPageletRequestData\", [\"Arbiter\",\"TidyArbiter\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"TidyArbiter\"), i = {\n    }, j = {\n        get: function() {\n            return i;\n        },\n        set: function(k) {\n            i = k;\n            h.inform(\"Medley/requestDataSet\", null, g.BEHAVIOR_STATE);\n        }\n    };\n    e.exports = j;\n});\n__d(\"TimelineSection\", [\"Arbiter\",\"DOMScroll\",\"DoublyLinkedListMap\",\"Run\",\"TidyArbiterMixin\",\"copyProperties\",\"ge\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"DOMScroll\"), i = b(\"DoublyLinkedListMap\"), j = b(\"Run\"), k = b(\"TidyArbiterMixin\"), l = b(\"copyProperties\"), m = b(\"ge\"), n = null;\n    function o() {\n        n = null;\n    };\n;\n    function p(q, r, s) {\n        this.id = q;\n        this.label = s;\n        this.nodeID = r;\n        this._parentSection = null;\n        this.childSections = new i();\n        this._isLoaded = false;\n        p.inform.bind(p, ((\"sectionInitialized/\" + q)), {\n            section: this\n        }, g.BEHAVIOR_STATE).defer();\n    };\n;\n    l(p, k, {\n        callWithSection: function(q, r) {\n            this.subscribe(((\"sectionInitialized/\" + q)), function(s, t) {\n                r(t.section);\n            });\n        },\n        setActiveSectionID: function(q) {\n            ((!n && j.onLeave(o)));\n            n = q;\n        }\n    });\n    l(p.prototype, {\n        appendSection: function(q) {\n            this.childSections.append(q.id, q);\n            q._parentSection = this;\n        },\n        freeze: function() {\n            this.freezeChildren();\n        },\n        freezeChildren: function() {\n            var q = this.childSections.getHead();\n            while (q) {\n                ((!q.isActive() && q.freeze()));\n                q = q.getNext();\n            };\n        ;\n        },\n        getNext: function() {\n            return ((this._parentSection && this._parentSection.childSections.getNext(this.id)));\n        },\n        getPrev: function() {\n            return ((this._parentSection && this._parentSection.childSections.getPrev(this.id)));\n        },\n        isActive: function() {\n            var q = this;\n            while (q) {\n                if (((q.id === n))) {\n                    return true;\n                }\n            ;\n            ;\n                q = q._parentSection;\n            };\n        ;\n            return false;\n        },\n        isLoaded: function() {\n            return this._isLoaded;\n        },\n        setIsLoaded: function(q) {\n            this._isLoaded = q;\n            return this;\n        },\n        JSBNG__scrollTo: function() {\n            if (!m(this.nodeID)) {\n                return;\n            }\n        ;\n        ;\n            h.JSBNG__scrollTo(this.getNode(), true, false, false, h.JSBNG__scrollTo.bind(this).curry(this.getNode(), 0));\n        },\n        thaw: function() {\n            this.thawChildren();\n        },\n        thawChildren: function() {\n            var q = this.childSections.getHead();\n            while (q) {\n                q.thaw();\n                q = q.getNext();\n            };\n        ;\n        }\n    });\n    e.exports = p;\n});\n__d(\"TimelineDynamicSection\", [\"Class\",\"DOM\",\"TimelineSection\",\"copyProperties\",\"cx\",\"ge\",\"TimelineDynamicSectionConfig\",], function(a, b, c, d, e, f) {\n    var g = b(\"Class\"), h = b(\"DOM\"), i = b(\"TimelineSection\"), j = b(\"copyProperties\"), k = b(\"cx\"), l = b(\"ge\"), m = b(\"TimelineDynamicSectionConfig\");\n    function n(o, p, q) {\n        this._controller = p;\n        this._data = null;\n        this._node = null;\n        this._triggerLoader = null;\n        this.parent.construct(this, o, o, q);\n    };\n;\n    g.extend(n, i);\n    j(n.prototype, {\n        _createNode: function() {\n            return h.create(\"div\", {\n                className: \"_30f\",\n                id: this.nodeID\n            }, [m.throbber.cloneNode(true),]);\n        },\n        getNode: function() {\n            if (!this._node) {\n                this._node = ((l(this.nodeID) || this._createNode()));\n            }\n        ;\n        ;\n            return this._node;\n        }\n    });\n    e.exports = n;\n});\n__d(\"TimelineAppCollection\", [\"function-extensions\",\"Class\",\"CSS\",\"DOM\",\"DOMQuery\",\"JSBNG__Event\",\"MedleyPageletRequestData\",\"NumberFormatConfig\",\"PageTransitions\",\"Parent\",\"Style\",\"TidyArbiter\",\"TidyArbiterMixin\",\"TimelineDynamicSection\",\"TimelineSection\",\"TriggerablePageletLoader\",\"TimelineDynamicSectionConfig\",\"copyProperties\",\"csx\",\"cx\",\"ads-lib-formatters\",\"ge\",], function(a, b, c, d, e, f) {\n    b(\"function-extensions\");\n    var g = b(\"Class\"), h = b(\"CSS\"), i = b(\"DOM\"), j = b(\"DOMQuery\"), k = b(\"JSBNG__Event\"), l = b(\"MedleyPageletRequestData\"), m = b(\"NumberFormatConfig\"), n = b(\"PageTransitions\"), o = b(\"Parent\"), p = b(\"Style\"), q = b(\"TidyArbiter\"), r = b(\"TidyArbiterMixin\"), s = b(\"TimelineDynamicSection\"), t = b(\"TimelineSection\"), u = b(\"TriggerablePageletLoader\"), v = b(\"TimelineDynamicSectionConfig\"), w = b(\"copyProperties\"), x = b(\"csx\"), y = b(\"cx\"), z = b(\"ads-lib-formatters\"), aa = b(\"ge\"), ba = 500, ca = 8;\n    function da(ha) {\n        var ia = aa(ga.getIDByToken(ha));\n        if (!ia) {\n            return;\n        }\n    ;\n    ;\n        return i.scry(ia, \"._620\")[0];\n    };\n;\n    function ea(ha, ia) {\n        ((((ia && !ia.isDefaultRequested())) && ia.prevent()));\n        var ja = ha._parentSection, ka = ja._parentSection;\n        t.setActiveSectionID(ja.id);\n        ja.setActiveCollection(ha);\n        if (((ja._sk === ka._sk))) {\n            if (!h.hasClass(ka.getNode(), \"_c4f\")) {\n                h.addClass(ka.getNode(), \"_c4f\");\n                ka.freezeChildren();\n            }\n        ;\n        ;\n            ((ha._isFullyLoaded && ka.addSectionTeasers()));\n        }\n    ;\n    ;\n        if (((!ka.isMedleyView() && ((ja._sk === ka._sk))))) {\n            var la = ha.href;\n            n.rewriteCurrentURI(n.getCurrentURI().getUnqualifiedURI(), la);\n        }\n    ;\n    ;\n    };\n;\n    function fa(ha, ia) {\n        ia.data.overview = ((ha._parentSection._sk !== ha._parentSection._parentSection._sk));\n        ia.data.cursor = null;\n        ea(ha);\n    };\n;\n    function ga(ha, ia, ja, ka, la, ma) {\n        this._contentLoader = null;\n        this._isFrozen = false;\n        this._isFullyLoaded = false;\n        this._cursor = 0;\n        this._tabNode = ja;\n        this._tabCount = ((((ka > 0)) ? ka : 0));\n        this._token = ha;\n        this._ftid = null;\n        this.auxContent = null;\n        this.curationContent = null;\n        this._order = la;\n        this.href = ma;\n        this._sortContent = null;\n        this.refreshCount();\n        this.parent.construct(this, ga.getIDByToken(ha), ia);\n        if (!ja) {\n            return;\n        }\n    ;\n    ;\n        if (aa(this.nodeID)) {\n            k.listen(ja, \"click\", ea.curry(this));\n        }\n         else this.createTriggerLoader.bind(this).defer();\n    ;\n    ;\n    };\n;\n    g.extend(ga, s);\n    w(ga, r, {\n        NEW_ITEM: \"TimelineAppCollection/newItem\",\n        ADDING_PLACEHOLDER: \"TimelineAppCollection/addingPlaceholder\",\n        addPlaceholderToCollection: function(ha, ia, ja) {\n            ja = ((((typeof ja !== \"undefined\")) ? ja : {\n            }));\n            if (!ja.suppressCount) {\n                this.incrementCount(ga.getIDByToken(ha));\n            }\n        ;\n        ;\n            t.callWithSection(ga.getIDByToken(ha), function(ka) {\n                var la = i.scry(ia, \"._gx7\")[0].cloneNode(true), ma = i.scry(ia, \"._gx8 .img\")[0], na = i.scry(ia, \"._3owb\")[0], oa = ((na && na.getAttribute(\"data-obj\")));\n                if (((!la || !oa))) {\n                    return;\n                }\n            ;\n            ;\n                ka.inform(ga.ADDING_PLACEHOLDER);\n                var pa = da(ha);\n                if (!pa) {\n                    return;\n                }\n            ;\n            ;\n                var qa = i.scry(pa, ((((\"[data-obj=\\\"\" + oa)) + \"\\\"]\")))[0], ra = i.create(\"div\", {\n                    className: \"_4-he\"\n                });\n                if (ma) {\n                    p.set(ra, \"background-image\", ((((\"url(\" + ma.src)) + \")\")));\n                }\n            ;\n            ;\n                var sa = i.create(\"div\", {\n                    className: \"_gx8\"\n                }, [ra,]), ta = i.create(\"div\", {\n                    className: \"_gx6\"\n                }, [la,]), ua = i.create(\"div\", {\n                    className: \"_3owb\"\n                }, [sa,ta,]), va = i.create(\"li\", {\n                    className: \"_5rz\",\n                    id: ((\"collectionItemPlaceholder\" + oa))\n                }, [ua,]);\n                if (((qa && ja.replaceExistingElement))) {\n                    i.replace(qa.parentNode, va);\n                }\n                 else {\n                    if (qa) {\n                        i.remove(qa.parentNode);\n                    }\n                     else if (((ka.isOverview() && ((pa.children.length >= ca))))) {\n                        h.addClass(pa.children[((ca - 1))], \"_51k9\");\n                    }\n                    \n                ;\n                ;\n                    i.prependContent(pa, va);\n                }\n            ;\n            ;\n            });\n        },\n        replaceItem: function(ha, ia, ja) {\n            var ka = o.byClass(ha, \"_620\"), la = i.scry(ka, ((((\"div[data-obj=\\\"\" + ia)) + \"\\\"]\")))[0];\n            if (la) {\n                ga.inform(ga.NEW_ITEM, {\n                    grid: ka,\n                    newItem: ja\n                });\n                i.replace(la.parentNode, ja);\n            }\n        ;\n        ;\n        },\n        addItemToCollection: function(ha, ia, ja) {\n            var ka = aa(ja);\n            if (!ka) {\n                return;\n            }\n        ;\n        ;\n            var la = i.scry(ka, \"._620\")[0], ma = la.parentNode.nextSibling;\n            if (((ma && h.hasClass(ma, \"_3t3\")))) {\n                i.remove(la.lastChild);\n            }\n        ;\n        ;\n            this.inform(ga.NEW_ITEM, {\n                grid: la,\n                newItem: ha\n            });\n            var na = aa(((\"collectionItemPlaceholder\" + ia)));\n            if (na) {\n                i.replace(na, ha);\n                return;\n            }\n        ;\n        ;\n            i.prependContent(la, ha);\n        },\n        createFromArray: function(ha) {\n            return ha.map(function(ia) {\n                return new ga(ia.token, ia.controller, ia.tab_node, ia.tab_count, ia.order, ia.href);\n            });\n        },\n        decrementCount: function(ha) {\n            t.callWithSection(ha, function(ia) {\n                if (((ia._tabCount > 0))) {\n                    ia._tabCount--;\n                    ia.refreshCount();\n                    ia.flashCountIf();\n                }\n            ;\n            ;\n            });\n        },\n        enableContentLoader: function(ha, ia, ja) {\n            t.callWithSection(ha, function(ka) {\n                ka.addContentLoader(ia, ja);\n            });\n        },\n        getIDByToken: function(ha) {\n            return ((\"pagelet_timeline_app_collection_\" + ha));\n        },\n        incrementCount: function(ha) {\n            t.callWithSection(ha, function(ia) {\n                ia._tabCount++;\n                ia.refreshCount();\n                ia.flashCountIf();\n            });\n        },\n        registerAuxContent: function(ha, ia) {\n            t.callWithSection(ha, function(ja) {\n                ja.registerAuxContent(ia);\n            });\n        },\n        registerAddCurationContent: function(ha, ia, ja, ka) {\n            t.callWithSection(ha, function(la) {\n                la.registerAddCurationContent(ia, ja, ka);\n            });\n        },\n        registerSortContent: function(ha, ia, ja) {\n            t.callWithSection(ha, function(ka) {\n                ka.registerSortContent(ia, ja);\n            });\n        },\n        setLoaded: function(ha) {\n            t.callWithSection(ha, function(ia) {\n                ia.setIsLoaded(true);\n                ia._parentSection.inform(\"loaded\", ia);\n                ia._parentSection.unsetMinHeight();\n            });\n        },\n        setFullyLoaded: function(ha) {\n            t.callWithSection(ha, function(ia) {\n                ia._isFullyLoaded = true;\n                var ja = ia._parentSection;\n                ((((ja._sk === ja._parentSection._sk)) && ja._parentSection.addSectionTeasers()));\n            });\n        },\n        setFTID: function(ha, ia) {\n            t.callWithSection(ha, function(ja) {\n                ja.setFTID(ia);\n            });\n        },\n        switchToNullStateCurationContent: function(ha) {\n            t.callWithSection(ga.getIDByToken(ha), function(ia) {\n                ia.nullStateCurationContent();\n            });\n        }\n    });\n    w(ga.prototype, r, {\n        addContentLoader: function(ha, ia) {\n            this._cursor = ia;\n            q.subscribe(\"Medley/requestDataSet\", function() {\n                var ja = {\n                    node: ha\n                };\n                if (h.hasClass(ha, \"_3t3\")) {\n                    ja.type = u.TRIGGER_CLICK;\n                }\n                 else if (this._isFrozen) {\n                    i.remove(ha);\n                    ja.node = v.pager.cloneNode(true);\n                    i.appendContent(this.getNode(), ja.node);\n                    ja.type = u.TRIGGER_CLICK;\n                }\n                 else {\n                    ja.onVisibleBuffer = ba;\n                    ja.onVisibleStrict = true;\n                    ja.type = u.TRIGGER_ONVISIBLE;\n                }\n                \n            ;\n            ;\n                if (((ja.type === u.TRIGGER_CLICK))) {\n                    ja.callback = t.setActiveSectionID.curry(this.id);\n                }\n            ;\n            ;\n                var ka = w({\n                    displayCallback: function(la) {\n                        i.remove(ja.node);\n                        la();\n                    },\n                    options: {\n                        append: true\n                    }\n                }, this.getDefaultPageletConfig());\n                ka.data.overview = this.isOverview();\n                this._triggerLoader = null;\n                this._contentLoader = new u(ka, [ja,]);\n            }.bind(this));\n        },\n        _createNode: function() {\n            var ha = this.parent._createNode();\n            ha.setAttribute(\"aria-role\", \"tabpanel\");\n            return ha;\n        },\n        createTriggerLoader: function() {\n            q.subscribe(\"Medley/requestDataSet\", function() {\n                var ha = this.getDefaultPageletConfig(), ia = {\n                    callback: fa.curry(this, ha),\n                    node: this._tabNode,\n                    type: u.TRIGGER_CLICK\n                };\n                this._triggerLoader = new u(ha, [ia,]);\n            }.bind(this));\n        },\n        disableContentLoader: function() {\n            ((this._contentLoader && this._contentLoader.disableTriggers()));\n        },\n        enableContentLoader: function() {\n            var ha = ((this._triggerLoader || this._contentLoader));\n            ((ha && ha.enableTriggers()));\n        },\n        freeze: function() {\n            this._isFrozen = true;\n            if (((!this._contentLoader || this._contentLoader._loading))) {\n                return;\n            }\n        ;\n        ;\n            this._contentLoader.removeTriggers(u.TRIGGER_ONVISIBLE);\n            var ha = j.scry(this.getNode(), \"._3t3\");\n            if (!ha.length) {\n                var ia = j.scry(this.getNode(), \"._359\")[0];\n                ((ia.length && this.addContentLoader(ia, this._cursor)));\n            }\n        ;\n        ;\n        },\n        getCount: function() {\n            return this._tabCount;\n        },\n        getDefaultPageletConfig: function() {\n            return {\n                controller: this._controller,\n                data: w({\n                    collection_token: this._token,\n                    cursor: this._cursor\n                }, l.get(), {\n                    ftid: this._ftid,\n                    order: this._order\n                }, {\n                    sk: this._parentSection._sk\n                }),\n                node: this.getNode()\n            };\n        },\n        getMedleySiteKey: function() {\n            return this._parentSection._parentSection._sk;\n        },\n        flashCountIf: function() {\n            if (((this._parentSection.getActiveCollection() != this))) {\n                h.addClass(this._tabNode, \"_4-k9\");\n                JSBNG__setTimeout(h.removeClass.curry(this._tabNode, \"_4-k9\"), 800);\n            }\n        ;\n        ;\n        },\n        isOverview: function() {\n            return ((this._parentSection._sk != this._parentSection._parentSection._sk));\n        },\n        registerAuxContent: function(ha) {\n            this.auxContent = ha;\n            if (((ha.nodeType == 11))) {\n                this.auxContent = i.create(\"span\", null, ha);\n            }\n        ;\n        ;\n            if (((this._parentSection._activeCollection !== this))) {\n                h.hide(this.auxContent);\n            }\n        ;\n        ;\n            this._parentSection.addAuxContent(this.auxContent);\n        },\n        registerAddCurationContent: function(ha, ia, ja) {\n            if (this.curationContent) {\n                return;\n            }\n        ;\n        ;\n            this.curationContent = ((((ha.nodeType == 11)) ? i.create(\"span\", null, ha) : ha));\n            this.curationContentState = ia;\n            this._parentSection.addCurationContent(this.curationContent, this, ja);\n        },\n        nullStateCurationContent: function() {\n            this._parentSection.nullStateCurationContent();\n        },\n        registerSortContent: function(ha, ia) {\n            ((this._sortContent && i.remove(this._sortContent)));\n            this._sortContent = ha;\n            ia.subscribeOnce(\"change\", function(ja, ka) {\n                i.setContent(i.JSBNG__find(ha, \"._57oy\"), ka.label);\n                this._sort(ka.value);\n            }.bind(this));\n        },\n        refreshCount: function() {\n            if (!this._tabNode) {\n                return;\n            }\n        ;\n        ;\n            var ha = j.JSBNG__find(this._tabNode, \"._3d0\");\n            if (((this._tabCount > 0))) {\n                i.setContent(ha, z.formatNumber(this._tabCount, 0, m.numberDelimiter, \"\"));\n            }\n             else i.setContent(ha, \"\");\n        ;\n        ;\n        },\n        _resetContent: function() {\n            ((this._contentLoader && this._contentLoader.destroy()));\n            i.remove(this.getNode());\n            this._node = null;\n            i.appendContent(j.JSBNG__find(this._parentSection.getNode(), \"div._3i9\"), this.getNode());\n            this.addContentLoader(j.JSBNG__find(this.getNode(), \"._359\"), 0);\n        },\n        setFTID: function(ha) {\n            this._ftid = ha;\n        },\n        _sort: function(ha) {\n            this._order = ha;\n            this._resetContent();\n            var ia = this._parentSection, ja = ia._parentSection;\n            if (((!ja.isMedleyView() && ((ia._sk === ja._sk))))) {\n                var ka = n.getCurrentURI();\n                ka.addQueryData({\n                    order: this._order\n                });\n                n.rewriteCurrentURI(n.getCurrentURI().getUnqualifiedURI(), ka);\n            }\n        ;\n        ;\n        },\n        thaw: function() {\n            this._isFrozen = false;\n        },\n        getToken: function() {\n            return this._token;\n        }\n    });\n    e.exports = ga;\n});\n__d(\"TimelineCommentsLoader\", [\"JSBNG__Event\",\"CommentPrelude\",\"CSS\",\"DOM\",\"Parent\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"CommentPrelude\"), i = b(\"CSS\"), j = b(\"DOM\"), k = b(\"Parent\"), l = b(\"emptyFunction\"), m = {\n        init: function() {\n            m.init = l;\n            g.listen(JSBNG__document.body, \"click\", function(n) {\n                var o = k.byClass(n.getTarget(), \"fbTimelineFeedbackCommentLoader\");\n                if (o) {\n                    n.kill();\n                    h.click(o, false);\n                    var p = k.byTag(o, \"form\"), q = j.scry(p, \"li.uiUfiViewAll input\");\n                    if (!q.length) {\n                        q = j.scry(p, \"li.fbUfiViewPrevious input\");\n                    }\n                ;\n                ;\n                    if (!q.length) {\n                        q = j.scry(p, \"a.UFIPagerLink\");\n                    }\n                ;\n                ;\n                    q[0].click();\n                    i.show(j.JSBNG__find(p, \"li.uiUfiComments\"));\n                    i.removeClass(o, \"fbTimelineFeedbackCommentLoader\");\n                }\n            ;\n            ;\n            });\n        }\n    };\n    e.exports = m;\n});\n__d(\"TimelineConstants\", [], function(a, b, c, d, e, f) {\n    var g = {\n        DS_HEIGHT: \"timeline-unit-height\",\n        DS_LOADED: \"timeline-capsule-loaded\",\n        DS_SIDEORG: \"timeline-unit-sideorg\",\n        DS_TAILBALANCE: \"timeline-capsule-tailbalance\",\n        DS_COLUMN_HEIGHT_DIFFERENTIAL: \"timeline-column-diff-height\",\n        FIXED_SIDE_LEFT: \"left\",\n        FIXED_SIDE_RIGHT: \"right\",\n        FIXED_SIDE_BOTH: \"both\",\n        FIXED_SIDE_NONE: \"none\",\n        SCROLL_TO_OFFSET: 30,\n        SUBSECTION_SCROLL_TO_OFFSET: 90,\n        SCRUBBER_DEFAULT_OFFSET: 38,\n        SECTION_LOADING: \"TimelineConstants/sectionLoading\",\n        SECTION_LOADED: \"TimelineConstants/sectionLoaded\",\n        SECTION_FULLY_LOADED: \"TimelineConstants/sectionFullyLoaded\",\n        SECTION_REGISTERED: \"TimelineConstants/sectionRegistered\"\n    };\n    e.exports = g;\n});\n__d(\"TimelineLegacySections\", [], function(a, b, c, d, e, f) {\n    var g = {\n    }, h = {\n        get: function(i) {\n            return g[i];\n        },\n        getAll: function() {\n            return g;\n        },\n        remove: function(i) {\n            delete g[i];\n        },\n        removeAll: function() {\n            g = {\n            };\n        },\n        set: function(i, j) {\n            g[i] = j;\n        }\n    };\n    e.exports = h;\n});\n__d(\"TimelineURI\", [\"URI\",], function(a, b, c, d, e, f) {\n    var g = b(\"URI\"), h = {\n        TIMELINE_KEY: \"timeline\",\n        WALL_KEY: \"wall\",\n        parseURI: function(i) {\n            i = g(i);\n            var j = i.getQueryData(), k = i.getPath(), l = k.split(\"/\").slice(1);\n            if (((((l[0] == \"people\")) || ((l[0] == \"pages\"))))) {\n                l = l.slice(2);\n            }\n        ;\n        ;\n            var m = ((((j.sk || l[1])) || h.TIMELINE_KEY));\n            if (((m == h.WALL_KEY))) {\n                m = h.TIMELINE_KEY;\n            }\n        ;\n        ;\n            var n = null, o = null;\n            if (((m == h.TIMELINE_KEY))) {\n                o = ((parseInt(l[2], 10) || null));\n                n = ((parseInt(l[3], 10) || null));\n            }\n        ;\n        ;\n            return {\n                path: k,\n                id: ((j.id || l[0])),\n                key: m,\n                viewas: ((j.viewas ? j.viewas : 0)),\n                filter: ((j.filter ? j.filter : null)),\n                year: o,\n                month: n,\n                friendship: !!j.and\n            };\n        }\n    };\n    e.exports = h;\n});\n__d(\"TimelineController\", [\"JSBNG__Event\",\"Arbiter\",\"CSS\",\"DataStore\",\"DOMQuery\",\"Run\",\"ScrollingPager\",\"TidyArbiter\",\"TimelineConstants\",\"TimelineLegacySections\",\"TimelineURI\",\"Vector\",\"ViewportBounds\",\"$\",\"copyProperties\",\"ge\",\"tidyEvent\",\"queryThenMutateDOM\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"Arbiter\"), i = b(\"CSS\"), j = b(\"DataStore\"), k = b(\"DOMQuery\"), l = b(\"Run\"), m = b(\"ScrollingPager\"), n = b(\"TidyArbiter\"), o = b(\"TimelineConstants\"), p = b(\"TimelineLegacySections\"), q = b(\"TimelineURI\"), r = b(\"Vector\"), s = b(\"ViewportBounds\"), t = b(\"$\"), u = b(\"copyProperties\"), v = b(\"ge\"), w = b(\"tidyEvent\"), x = b(\"queryThenMutateDOM\"), y = 358, z = 48, aa = 740, ba = 1285, ca = null, da = false, ea, fa, ga, ha = {\n    }, ia = {\n    }, ja = [], ka = null, la = null, ma = false, na = false, oa = 0, pa = false, qa = false, ra = false, sa = {\n    }, ta = false;\n    function ua() {\n        ((ka && ka.remove()));\n        ka = null;\n    };\n;\n    function va(hb, ib, jb) {\n        jb = ((jb || []));\n        if (ha[hb]) {\n            return ha[hb][ib].apply(ha[hb], jb);\n        }\n    ;\n    ;\n        ia[hb] = ((ia[hb] || {\n        }));\n        ia[hb][ib] = jb;\n        return false;\n    };\n;\n    function wa() {\n        if (!((((pa || ra)) || qa))) {\n            ua();\n            return;\n        }\n    ;\n    ;\n        var hb = r.getScrollPosition();\n        pa = ((pa && ab(v(\"rightCol\"), hb, \"paddingTop\", true)));\n        qa = ((qa && ab(t(\"pagelet_above_header_timeline\"), hb, \"JSBNG__top\")));\n        ra = ((ra && ab(t(\"blueBar\"), hb, \"paddingTop\")));\n    };\n;\n    var xa = 0;\n    function ya() {\n        xa = r.getScrollPosition();\n    };\n;\n    function za() {\n        x(ya, function() {\n            var hb = ((((oa === 0)) || ((xa.y >= oa))));\n            va(gb.STICKY_HEADER, \"toggle\", [hb,]);\n            va(gb.CONTENT, \"checkCurrentSectionChange\");\n        }, \"TimelineController/scrollListener\");\n    };\n;\n    function ab(hb, ib, jb, kb) {\n        if (!hb) {\n            ua();\n            return;\n        }\n    ;\n    ;\n        if (((ib.y <= 0))) {\n            bb(hb, jb);\n            return false;\n        }\n         else {\n            var lb = ((kb && gb.getCurrentScrubber()));\n            if (((lb && i.hasClass(lb.getRoot(), \"fixed_elem\")))) {\n                bb(hb, jb);\n                return false;\n            }\n             else {\n                var mb = ((parseInt(hb.style[jb], 10) || 0));\n                if (((ib.y < mb))) {\n                    i.addClass(hb, \"timeline_fixed\");\n                    hb.style[jb] = ((ib.y + \"px\"));\n                }\n                 else i.removeClass(hb, \"timeline_fixed\");\n            ;\n            ;\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n        return true;\n    };\n;\n    function bb(hb, ib) {\n        hb.style[ib] = \"0px\";\n        i.removeClass(hb, \"timeline_fixed\");\n    };\n;\n    function cb() {\n        x(gb.shouldShowWideAds, function() {\n            va(gb.ADS, \"adjustAdsType\", [ma,]);\n            va(gb.ADS, \"adjustAdsToFit\");\n            va(gb.CONTENT, \"adjustContentPadding\");\n            va(gb.STICKY_HEADER_NAV, \"adjustMenuHeights\");\n        }, \"TimelineController/resize\");\n    };\n;\n    function db(hb, ib) {\n        if (((hb == \"sidebar/initialized\"))) {\n            ta = true;\n        }\n    ;\n    ;\n        va(gb.ADS, \"adjustAdsType\", [gb.shouldShowWideAds(),]);\n    };\n;\n    function eb(hb, ib) {\n        var jb = v(\"rightCol\");\n        if (jb) {\n            jb.style.paddingTop = ((ib + \"px\"));\n            pa = true;\n        }\n    ;\n    ;\n        var kb = t(\"pagelet_above_header_timeline\");\n        if (kb.firstChild) {\n            t(\"above_header_timeline_placeholder\").style.height = ((kb.offsetHeight + \"px\"));\n            kb.style.JSBNG__top = ((ib + \"px\"));\n            qa = true;\n        }\n    ;\n    ;\n        var lb = JSBNG__document.documentElement;\n        ra = ((((lb.clientHeight < 400)) || ((lb.clientWidth < lb.scrollWidth))));\n        if (ra) {\n            t(\"blueBar\").style.paddingTop = ((ib + \"px\"));\n        }\n    ;\n    ;\n        ka = g.listen(window, \"JSBNG__scroll\", wa);\n        h.inform(\"reflow\");\n    };\n;\n    function fb() {\n        while (ja.length) {\n            ja.pop().remove();\n        ;\n        };\n    ;\n        {\n            var fin278keys = ((window.top.JSBNG_Replay.forInKeys)((ha))), fin278i = (0);\n            var hb;\n            for (; (fin278i < fin278keys.length); (fin278i++)) {\n                ((hb) = (fin278keys[fin278i]));\n                {\n                    ((ha[hb].reset && ha[hb].reset()));\n                ;\n                };\n            };\n        };\n    ;\n        ua();\n        ga.unsubscribe();\n        ga = null;\n        ca = null;\n        ea = null;\n        ha = {\n        };\n        ia = {\n        };\n        la = null;\n        na = false;\n        oa = 0;\n        qa = false;\n        if (pa) {\n            var ib = v(\"rightCol\");\n            if (ib) {\n                ib.style.paddingTop = \"\";\n                i.removeClass(ib, \"timeline_fixed\");\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n        pa = false;\n        if (ra) {\n            t(\"blueBar\").style.paddingTop = \"\";\n            i.removeClass(t(\"blueBar\"), \"timeline_fixed\");\n        }\n    ;\n    ;\n        ra = false;\n        ta = false;\n        da = false;\n        j.purge(o.DS_HEIGHT);\n        j.purge(o.DS_LOADED);\n        j.purge(o.DS_SIDEORG);\n        j.purge(o.DS_TAILBALANCE);\n        j.purge(o.DS_COLUMN_HEIGHT_DIFFERENTIAL);\n    };\n;\n    var gb = {\n        NAV: \"nav\",\n        STICKY_HEADER: \"sticky_header\",\n        STICKY_HEADER_NAV: \"sticky_header_nav\",\n        SCRUBBER: \"scrubber\",\n        CONTENT: \"JSBNG__content\",\n        ADS: \"ads\",\n        LOGGING: \"logging\",\n        init: function(hb, ib, jb) {\n            if (da) {\n                return;\n            }\n        ;\n        ;\n            if (((ib == q.WALL_KEY))) {\n                ib = q.TIMELINE_KEY;\n            }\n        ;\n        ;\n            da = true;\n            ea = hb;\n            fa = jb.has_fixed_ads;\n            na = jb.one_column_minimal;\n            sa = {\n                allactivity: true,\n                approve: true\n            };\n            if (!na) {\n                u(sa, {\n                    games: true,\n                    map: true,\n                    music: true,\n                    video: true\n                });\n            }\n        ;\n        ;\n            sa[q.TIMELINE_KEY] = true;\n            va(gb.CONTENT, \"adjustContentPadding\");\n            ja.push(g.listen(window, \"JSBNG__scroll\", za), g.listen(window, \"resize\", cb));\n            ga = h.subscribe([\"sidebar/initialized\",\"sidebar/show\",\"sidebar/hide\",], db);\n            w(n.subscribe(\"TimelineCover/coverCollapsed\", eb));\n            l.onLeave(fb);\n            gb.registerCurrentKey(ib);\n        },\n        setAdsTracking: function(hb) {\n            va(gb.ADS, \"start\", [hb,]);\n        },\n        pageHasScrubber: function(hb) {\n            return ((((!hb || ((!na && hb.match(/^(og_)?app_/))))) || ((hb in sa))));\n        },\n        fixedAds: function() {\n            return fa;\n        },\n        registerCurrentKey: function(hb) {\n            ca = hb;\n            la = ((((((hb !== \"map\")) && ((r.getViewportDimensions().y < aa)))) && gb.pageHasScrubber(hb)));\n            la = ((la || t(\"blueBar\").offsetTop));\n            va(gb.ADS, \"setShortMode\", [la,]);\n            va(gb.ADS, \"updateCurrentKey\", [hb,]);\n            oa = ((((hb == q.TIMELINE_KEY)) ? ((y - z)) : 0));\n        },\n        getCurrentKey: function() {\n            return ca;\n        },\n        getCurrentScrubber: function() {\n            return ha[gb.SCRUBBER];\n        },\n        getCurrentStickyHeaderNav: function() {\n            return ha[gb.STICKY_HEADER_NAV];\n        },\n        scrubberHasLoaded: function(hb) {\n            i.conditionClass(hb.getRoot(), \"fixed_elem\", !la);\n            va(gb.ADS, \"registerScrubber\", [hb,]);\n        },\n        scrubberHasChangedState: function() {\n            va(gb.ADS, \"adjustAdsToFit\");\n        },\n        scrubberWasClicked: function(hb) {\n            va(gb.LOGGING, \"logScrubberClick\", [hb,]);\n        },\n        stickyHeaderNavWasClicked: function(hb) {\n            va(gb.LOGGING, \"logStickyHeaderNavClick\", [hb,]);\n        },\n        sectionHasChanged: function(hb, ib) {\n            va(gb.STICKY_HEADER_NAV, \"updateSection\", [hb,ib,]);\n            va(gb.SCRUBBER, \"updateSection\", [hb,ib,]);\n            va(gb.ADS, \"loadAdsIfEnoughTimePassed\");\n            va(gb.LOGGING, \"logSectionChange\", [hb,ib,]);\n        },\n        navigateToSection: function(hb) {\n            va(gb.CONTENT, \"navigateToSection\", [hb,]);\n        },\n        shouldShowWideAds: function() {\n            if (!ta) {\n                ma = false;\n            }\n             else {\n                var hb = ((((ba + s.getRight())) + s.getLeft()));\n                ma = ((r.getViewportDimensions().x >= hb));\n            }\n        ;\n        ;\n            return ma;\n        },\n        sidebarInitialized: function() {\n            return ta;\n        },\n        adjustStickyHeaderWidth: function() {\n            va(gb.STICKY_HEADER, \"adjustWidth\");\n        },\n        isOneColumnMinimal: function() {\n            return na;\n        },\n        register: function(hb, ib) {\n            ha[hb] = ib;\n            if (ia[hb]) {\n                {\n                    var fin279keys = ((window.top.JSBNG_Replay.forInKeys)((ia[hb]))), fin279i = (0);\n                    var jb;\n                    for (; (fin279i < fin279keys.length); (fin279i++)) {\n                        ((jb) = (fin279keys[fin279i]));\n                        {\n                            va(hb, jb, ia[hb][jb]);\n                        ;\n                        };\n                    };\n                };\n            ;\n                delete ia[hb];\n            }\n        ;\n        ;\n        },\n        adjustScrollingPagerBuffer: function(hb, ib) {\n            var jb = j.get(o.DS_COLUMN_HEIGHT_DIFFERENTIAL, ib);\n            if (!jb) {\n                return;\n            }\n        ;\n        ;\n            var kb = m.getInstance(hb);\n            ((kb && kb.setBuffer(((kb.getBuffer() + Math.abs(jb))))));\n        },\n        runOnceWhenSectionFullyLoaded: function(hb, ib, jb) {\n            var kb = p.get(ib);\n            if (kb) {\n                var lb = false;\n                k.scry(kb.node, \".fbTimelineCapsule\").forEach(function(nb) {\n                    if (((!lb && ((parseInt(j.get(o.DS_LOADED, nb.id), 10) >= parseInt(jb, 10)))))) {\n                        hb();\n                        lb = true;\n                    }\n                ;\n                ;\n                });\n                if (lb) {\n                    return;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            var mb = h.subscribe(o.SECTION_FULLY_LOADED, function(nb, ob) {\n                if (((((ob.scrubberKey === ib)) && ((ob.pageIndex === jb))))) {\n                    hb();\n                    mb.unsubscribe();\n                }\n            ;\n            ;\n            });\n        }\n    };\n    e.exports = gb;\n});\n__d(\"TimelineDrag\", [\"JSBNG__Event\",\"ArbiterMixin\",\"Locale\",\"Style\",\"Vector\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"ArbiterMixin\"), i = b(\"Locale\"), j = b(\"Style\"), k = b(\"Vector\"), l = b(\"copyProperties\");\n    function m(n, o, p) {\n        p = ((p || {\n        }));\n        this._listenOn = p.listenOn;\n        this._offsetInput = o;\n        this._defaultOffset = p.default_offset;\n        this._killClicks = p.killClicks;\n        this._vertical = true;\n        this._RTLXSwitch = false;\n        this.setPicture(n, p);\n    };\n;\n    l(m.prototype, h, {\n        setPicture: function(n, o) {\n            if (!n) {\n                return false;\n            }\n        ;\n        ;\n            o = ((o || {\n            }));\n            this._picture = n;\n            this._defaultOffset = o.default_offset;\n            if (o.offsetInput) {\n                this._offsetInput = o.offsetInput;\n            }\n        ;\n        ;\n            if (((o.vertical !== undefined))) {\n                this._vertical = o.vertical;\n            }\n        ;\n        ;\n            if (o.height) {\n                this._containerHeight = o.height;\n            }\n        ;\n        ;\n            if (o.width) {\n                this._containerWidth = o.width;\n            }\n        ;\n        ;\n            if (this._vertical) {\n                this._offsetType = \"JSBNG__top\";\n                this._eventCoord = \"y\";\n            }\n             else {\n                this._RTLXSwitch = i.isRTL();\n                this._offsetType = \"left\";\n                this._eventCoord = \"x\";\n            }\n        ;\n        ;\n            if (this._picture.complete) {\n                this._initialLoad();\n            }\n             else this._loadListener = g.listen(this._picture, \"load\", function() {\n                this._loadListener.remove();\n                this._initialLoad();\n            }.bind(this));\n        ;\n        ;\n        },\n        destroy: function() {\n            this._stopDrag();\n            this._saveOffset();\n            ((this._mousedown && this._mousedown.remove()));\n            ((this._onclick && this._onclick.remove()));\n            ((this._loadListener && this._loadListener.remove()));\n        },\n        _initialLoad: function() {\n            var n = ((this._listenOn ? this._listenOn : this._picture));\n            ((this._mousedown && this._mousedown.remove()));\n            this._mousedown = g.listen(n, \"mousedown\", this._onMouseDown.bind(this));\n            if (this._vertical) {\n                this._maxOffset = ((this._containerHeight - this._picture.offsetHeight));\n            }\n             else this._maxOffset = ((this._containerWidth - this._picture.offsetWidth));\n        ;\n        ;\n            if (((this._defaultOffset !== undefined))) {\n                this._setOffset(this._defaultOffset);\n            }\n        ;\n        ;\n            ((this._onclick && this._onclick.remove()));\n            if (this._killClicks) {\n                this._onclick = g.listen(n, \"click\", this._onClick.bind(this));\n            }\n        ;\n        ;\n            this._saveOffset();\n        },\n        _onClick: function(JSBNG__event) {\n            JSBNG__event.kill();\n        },\n        _onMouseDown: function(JSBNG__event) {\n            var n = ((parseInt(j.get(this._picture, this._offsetType), 10) || 0));\n            this._pictureStartDragOffset = ((n - k.getEventPosition(JSBNG__event)[this._eventCoord]));\n            this._startDrag();\n            JSBNG__event.kill();\n        },\n        _startDrag: function() {\n            if (!this._dragStarted) {\n                this.inform(\"startdrag\", this);\n                this._dragTokens = [g.listen(JSBNG__document.documentElement, \"mouseup\", this._onMouseUp.bind(this)),g.listen(JSBNG__document.documentElement, \"mousemove\", this._onMouseMove.bind(this)),];\n                this._dragStarted = true;\n            }\n        ;\n        ;\n        },\n        _saveOffset: function() {\n            var n = parseInt(j.get(this._picture, this._offsetType), 10);\n            if (this._RTLXSwitch) {\n                this._offsetInput.value = ((((n + this._containerWidth)) - this._picture.offsetWidth));\n            }\n             else this._offsetInput.value = n;\n        ;\n        ;\n        },\n        _stopDrag: function() {\n            if (this._dragStarted) {\n                this.inform(\"stopdrag\", this);\n                this._dragStarted = false;\n                this._dragTokens.forEach(function(n) {\n                    n.remove();\n                });\n                this._saveOffset();\n            }\n        ;\n        ;\n        },\n        _onMouseUp: function(JSBNG__event) {\n            this._stopDrag();\n            JSBNG__event.kill();\n        },\n        _setOffset: function(n) {\n            if (this._RTLXSwitch) {\n                n = Math.max(0, Math.min(n, -this._maxOffset));\n            }\n             else n = Math.min(0, Math.max(n, this._maxOffset));\n        ;\n        ;\n            j.set(this._picture, this._offsetType, ((n + \"px\")));\n        },\n        _onMouseMove: function(JSBNG__event) {\n            this._setOffset(((this._pictureStartDragOffset + k.getEventPosition(JSBNG__event)[this._eventCoord])));\n            JSBNG__event.kill();\n        }\n    });\n    e.exports = m;\n});\n__d(\"TimelineCover\", [\"Arbiter\",\"Button\",\"CSS\",\"DOM\",\"HTML\",\"Parent\",\"DOMScroll\",\"TimelineController\",\"TimelineDrag\",\"Style\",\"Vector\",\"$\",\"copyProperties\",\"cx\",\"ge\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"Button\"), i = b(\"CSS\"), j = b(\"DOM\"), k = b(\"HTML\"), l = b(\"Parent\"), m = b(\"DOMScroll\"), n = b(\"TimelineController\"), o = b(\"TimelineDrag\"), p = b(\"Style\"), q = b(\"Vector\"), r = b(\"$\"), s = b(\"copyProperties\"), t = b(\"cx\"), u = b(\"ge\");\n    function v(w, x, y) {\n        this.root = r(\"fbProfileCover\");\n        if (((typeof x === \"object\"))) {\n            this._coverHeight = x.cover_height;\n            this._coverWidth = x.cover_width;\n            this.previewing = x.previewing;\n            this._isLegacy = false;\n        }\n         else {\n            this._isLegacy = true;\n            this._coverHeight = x;\n            this.previewing = y;\n        }\n    ;\n    ;\n        this._parentSection = l.byClass(this.root, \"fbTimelineSection\");\n        this.cover = j.JSBNG__find(this.root, \".cover\");\n        v.instance = this;\n        this.editing = false;\n        if (!this._parentSection) {\n            this._parentSection = l.byClass(this.root, \"fbEventHeader\");\n        }\n    ;\n    ;\n        if (this.previewing) {\n            this.editMode();\n            this.updateCoverImage(this.previewing);\n        }\n    ;\n    ;\n    };\n;\n    v.instance = null;\n    v.getInstance = function() {\n        return v.instance;\n    };\n    s(v.prototype, {\n        showLoadingIndicator: function() {\n            var w = u(\"fbCoverImageContainer\");\n            if (w) {\n                i.addClass(w, \"opaquedLoading\");\n            }\n        ;\n        ;\n        },\n        hideLoadingIndicator: function() {\n            var w = u(\"fbCoverImageContainer\");\n            if (w) {\n                i.removeClass(w, \"opaquedLoading\");\n            }\n        ;\n        ;\n        },\n        isCoverImageVerticalFlow: function(w) {\n            return !(w.style.height);\n        },\n        editMode: function() {\n            h.setEnabled(j.JSBNG__find(this.root, \"button.cancelButton\"), true);\n            h.setEnabled(j.JSBNG__find(this.root, \"button.saveButton\"), true);\n            this.hideLoadingIndicator();\n            this._coverImage = j.scry(this.root, \".coverImage\")[0];\n            var w = j.scry(this._coverImage, \".coverWrap\")[0];\n            if (w) {\n                var x = j.JSBNG__find(w, \".coverPhotoImg\");\n                this._originalIsVertical = this.isCoverImageVerticalFlow(x);\n                this._originalOffset = p.get(x, ((this._originalIsVertical ? \"JSBNG__top\" : \"left\")));\n            }\n        ;\n        ;\n            i.addClass(this._parentSection, \"fbEditCover\");\n            m.JSBNG__scrollTo(this.root);\n            if (this.previewing) {\n                j.remove(this._coverImage);\n                i.show(this._coverImage);\n            }\n        ;\n        ;\n            var y = j.scry(this._coverImage, \".coverPhotoImg\")[0];\n            if (y) {\n                this._createDragger();\n            }\n        ;\n        ;\n            this.editing = true;\n            g.inform(\"CoverPhotoEdit\", {\n                sender: this,\n                state: \"open\"\n            });\n        },\n        _exitEditMode: function() {\n            if (this._timelineDrag) {\n                this._timelineDrag.destroy();\n                this._timelineDrag = null;\n            }\n        ;\n        ;\n            j.JSBNG__find(this.root, \"input.hiddenPhotoID\").value = null;\n            j.JSBNG__find(this.root, \"input.hiddenVideoID\").value = null;\n            h.setEnabled(j.JSBNG__find(this.root, \"button.cancelButton\"), false);\n            h.setEnabled(j.JSBNG__find(this.root, \"button.saveButton\"), false);\n            i.removeClass(this._parentSection, \"fbEditCover\");\n            this.hideLoadingIndicator();\n            this.previewing = false;\n            g.inform(\"CoverPhotoEdit\", {\n                sender: this,\n                state: \"JSBNG__closed\"\n            });\n        },\n        _createDragger: function(w) {\n            var x;\n            if (this._isLegacy) {\n                x = j.JSBNG__find(this.root, \"input.photoOffsetInput\");\n                this._originalIsVertical = true;\n            }\n             else {\n                var y = ((((w === undefined)) ? this._originalIsVertical : w));\n                x = ((y ? j.JSBNG__find(this.root, \"input.photoOffsetYInput\") : j.JSBNG__find(this.root, \"input.photoOffsetXInput\")));\n            }\n        ;\n        ;\n            this._timelineDrag = new o(j.JSBNG__find(this.root, \".coverImage .coverPhotoImg\"), x, {\n                height: this._coverHeight,\n                width: this._coverWidth,\n                listenOn: this.cover,\n                vertical: y,\n                killClicks: true\n            });\n        },\n        updateCoverImage: function(w, x, y) {\n            this.videoID = y;\n            if (x) {\n                this.editMode();\n            }\n        ;\n        ;\n            j.JSBNG__find(this.root, \"input.hiddenPhotoID\").value = w;\n            j.JSBNG__find(this.root, \"input.hiddenVideoID\").value = ((y || null));\n            h.setEnabled(j.JSBNG__find(this.root, \"button.saveButton\"), true);\n            if (x) {\n                j.replace(j.JSBNG__find(this.root, \".coverImage\"), k(x));\n            }\n        ;\n        ;\n            var z = j.JSBNG__find(j.JSBNG__find(this.root, \".coverImage\"), \".coverPhotoImg\"), aa = this.isCoverImageVerticalFlow(z), ba;\n            if (this._isLegacy) {\n                ba = j.JSBNG__find(this.root, \"input.photoOffsetInput\");\n            }\n             else ba = ((aa ? j.JSBNG__find(this.root, \"input.photoOffsetYInput\") : j.JSBNG__find(this.root, \"input.photoOffsetXInput\")));\n        ;\n        ;\n            if (this._timelineDrag) {\n                this._timelineDrag.setPicture(z, {\n                    offsetInput: ba,\n                    vertical: aa\n                });\n            }\n             else this._createDragger(aa);\n        ;\n        ;\n        },\n        cancelUpdate: function() {\n            j.remove(j.scry(this.root, \".coverImage\")[0]);\n            j.prependContent(this.cover, this._coverImage);\n            if (((this._originalOffset !== undefined))) {\n                p.set(j.JSBNG__find(this._coverImage, \".coverPhotoImg\"), ((this._originalIsVertical ? \"JSBNG__top\" : \"left\")), this._originalOffset);\n            }\n        ;\n        ;\n            this._exitEditMode();\n        },\n        saveComplete: function() {\n            this._coverImage = j.scry(this.root, \".coverImage\")[0];\n            var w = l.byClass(this.root, \"fbTimelineTopSectionBase\");\n            ((w && i.removeClass(w, \"_6_5\")));\n            this._exitEditMode();\n        },\n        isInEditMode: function() {\n            return this.editing;\n        }\n    });\n    e.exports = v;\n});\n__d(\"TimelineCapsule\", [\"Arbiter\",\"CSS\",\"DataStore\",\"DOM\",\"DOMQuery\",\"DOMScroll\",\"Parent\",\"TimelineConstants\",\"TimelineLegacySections\",\"UserAgent\",\"Vector\",\"$\",\"createArrayFrom\",\"csx\",\"isEmpty\",\"queryThenMutateDOM\",\"JSBNG__requestAnimationFrame\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"CSS\"), i = b(\"DataStore\"), j = b(\"DOM\"), k = b(\"DOMQuery\"), l = b(\"DOMScroll\"), m = b(\"Parent\"), n = b(\"TimelineConstants\"), o = b(\"TimelineLegacySections\"), p = b(\"UserAgent\"), q = b(\"Vector\"), r = b(\"$\"), s = b(\"createArrayFrom\"), t = b(\"csx\"), u = b(\"isEmpty\"), v = b(\"queryThenMutateDOM\"), w = b(\"JSBNG__requestAnimationFrame\"), x = (function() {\n        var y = 45, z = 15, aa = \"use\", ba = \"update\", ca = {\n        }, da = {\n        };\n        function ea(ra) {\n            return h.hasClass(ra, \"fbTimelineBalancer\");\n        };\n    ;\n        function fa(ra) {\n            return ra.getAttribute(\"data-spine\");\n        };\n    ;\n        function ga(ra) {\n            return h.hasClass(ra, \"placeholderUnit\");\n        };\n    ;\n        function ha(ra, sa) {\n            if (sa) {\n                return ((i.get(n.DS_SIDEORG, ra.id) || ra.getAttribute(\"data-side\")));\n            }\n        ;\n        ;\n            return ra.getAttribute(\"data-side\");\n        };\n    ;\n        var ia = function(ra, sa) {\n            if (((p.ie() <= 6))) {\n                ia = function(ta, ua) {\n                    i.set(n.DS_SIDEORG, ta.id, ha(ta, true));\n                    ta.setAttribute(\"data-side\", ua);\n                    h.removeClass(ta, \"leftColumn\");\n                    h.removeClass(ta, \"rightColumn\");\n                    h.addClass(ta, ((((ua == \"l\")) ? \"leftColumn\" : \"rightColumn\")));\n                };\n            }\n             else ia = function(ta, ua) {\n                i.set(n.DS_SIDEORG, ta.id, ha(ta, true));\n                ta.setAttribute(\"data-side\", ua);\n            };\n        ;\n        ;\n            ia(ra, sa);\n        };\n        function ja(ra) {\n            return ra.getAttribute(\"data-size\");\n        };\n    ;\n        function ka(ra) {\n            if (((((h.hasClass(ra, \"fbTimelineOneColumn\") && ra.prevSibling)) && h.hasClass(ra.prevSibling, \"fbTimelineOneColumn\")))) {\n                return ((z * 2));\n            }\n        ;\n        ;\n            if (h.hasClass(ra, \"fbTimelineIndeterminateContent\")) {\n                return 0;\n            }\n        ;\n        ;\n            return z;\n        };\n    ;\n        function la(ra, sa) {\n            var ta = 0;\n            if (((h.shown(ra) && !h.hasClass(ra, \"placeholderUnit\")))) {\n                if (((sa === aa))) {\n                    ta = i.get(n.DS_HEIGHT, ra.id, null);\n                    if (((ta === null))) {\n                        ta = ra.getAttribute(\"data-calculatedheight\");\n                    }\n                ;\n                ;\n                }\n                 else ta = ((ra.offsetHeight + ka(ra)));\n            ;\n            }\n        ;\n        ;\n            if (((((sa === aa)) && ((ta === null))))) {\n                ta = 300;\n            }\n        ;\n        ;\n            i.set(n.DS_HEIGHT, ra.id, parseInt(ta, 10));\n        };\n    ;\n        function ma(ra) {\n            var sa = i.get(n.DS_HEIGHT, ra.id, null);\n            return sa;\n        };\n    ;\n        function na(ra, sa) {\n            if (((ja(sa) == \"2\"))) {\n                return 0;\n            }\n             else if (((ha(sa) == \"r\"))) {\n                return ((ra + ma(sa)));\n            }\n             else return ((ra - ma(sa)))\n            \n        ;\n        };\n    ;\n        function oa(ra) {\n            k.scry(ra, \"._3ram\").forEach(function(sa) {\n                var ta = sa.getAttribute(\"data-endmarker\"), ua = sa.getAttribute(\"data-pageindex\"), va = function() {\n                    if (!sa.parentNode) {\n                        return;\n                    }\n                ;\n                ;\n                    i.set(n.DS_LOADED, ra.id, ua);\n                    j.remove(sa);\n                    g.inform(n.SECTION_FULLY_LOADED, {\n                        scrubberKey: ta,\n                        pageIndex: ua,\n                        capsuleID: ra.id,\n                        childCount: ra.childNodes.length\n                    });\n                };\n                if (o.get(ta)) {\n                    va();\n                }\n                 else var wa = g.subscribe(n.SECTION_REGISTERED, function(xa, ya) {\n                    if (((ya.scrubberKey === ta))) {\n                        va();\n                        wa.unsubscribe();\n                    }\n                ;\n                ;\n                })\n            ;\n            });\n            g.inform(\"TimelineCapsule/balanced\", {\n                capsule: ra\n            });\n        };\n    ;\n        function pa(ra) {\n            if (u(ca[ra.id])) {\n                return;\n            }\n        ;\n        ;\n            var sa = ((ea(ra) ? ra.firstChild : ra)), ta = sa.childNodes.length, ua = {\n            }, va = {\n            }, wa, xa = z, ya = z, za, ab = [];\n            for (var bb = 0; ((bb < ta)); bb++) {\n                wa = sa.childNodes[bb];\n                if (h.hasClass(wa, \"fbTimelineUnit\")) {\n                    za = k.scry(wa, \"div.timelineUnitContainer\")[0];\n                    if (za) {\n                        va[wa.id] = za.getAttribute(\"data-time\");\n                    }\n                ;\n                ;\n                    if (((!ga(wa) && h.shown(wa)))) {\n                        if (((ja(wa) == \"2\"))) {\n                            ua[wa.id] = Math.max(xa, ya);\n                            xa = ya = ((ua[wa.id] + ma(wa)));\n                        }\n                         else if (((ha(wa) == \"r\"))) {\n                            ua[wa.id] = ya;\n                            ya += ma(wa);\n                        }\n                         else {\n                            ua[wa.id] = xa;\n                            xa += ma(wa);\n                        }\n                        \n                    ;\n                    ;\n                        if (((((ha(wa, true) == \"l\")) || ((ja(wa) == \"2\"))))) {\n                            ab.push(wa.id);\n                        }\n                    ;\n                    ;\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n            };\n        ;\n            for (bb = 0; ((bb < ((ab.length - 1)))); ++bb) {\n                var cb = ab[bb], db = ab[((bb + 1))], eb = ((ua[cb] + y)), fb = ua[db];\n                {\n                    var fin280keys = ((window.top.JSBNG_Replay.forInKeys)((ca[ra.id]))), fin280i = (0);\n                    var gb;\n                    for (; (fin280i < fin280keys.length); (fin280i++)) {\n                        ((gb) = (fin280keys[fin280i]));\n                        {\n                            if (((eb > fb))) {\n                                break;\n                            }\n                        ;\n                        ;\n                            var hb = ca[ra.id][gb];\n                            if (h.shown(hb)) {\n                                continue;\n                            }\n                        ;\n                        ;\n                            if (((((va[gb] <= va[cb])) && ((va[gb] > va[db]))))) {\n                                hb.style.JSBNG__top = ((eb + \"px\"));\n                                eb += y;\n                                h.show(hb);\n                            }\n                        ;\n                        ;\n                        };\n                    };\n                };\n            ;\n            };\n        ;\n        };\n    ;\n        function qa(ra, sa) {\n            var ta = m.byAttribute(ra, \"data-size\");\n            if (ta) {\n                if (h.hasClass(ra.parentNode, \"timelineReportContent\")) {\n                    sa(ra);\n                }\n                 else sa(ta);\n            ;\n            ;\n                x.balanceCapsule(m.byClass(ta, \"fbTimelineCapsule\"));\n            }\n        ;\n        ;\n        };\n    ;\n        return {\n            removeUnit: function(ra) {\n                qa(ra, function(sa) {\n                    j.remove(sa);\n                });\n            },\n            hideUnit: function(ra) {\n                qa(ra, function(sa) {\n                    h.addClass(sa, \"fbTimelineColumnHidden\");\n                });\n            },\n            undoHideUnit: function(ra, sa) {\n                j.remove(m.byClass(sa, \"hiddenText\"));\n                qa(ra, function(ta) {\n                    h.removeClass(ta, \"fbTimelineColumnHidden\");\n                });\n            },\n            unplacehold: function(ra) {\n                var sa = r(ra);\n                sa.style.JSBNG__top = null;\n                h.removeClass(sa, \"visiblePlaceholder\");\n                h.removeClass(sa, \"placeholder\");\n                var ta = m.byClass(sa, \"fbTimelineCapsule\");\n                delete ca[ta.id][ra];\n                x.balanceCapsule(ta);\n            },\n            scrollToCapsule: function(ra) {\n                if (!da.hasOwnProperty(ra.id)) {\n                    var sa = q.getElementPosition(ra.parentNode);\n                    l.JSBNG__scrollTo(new q(q.getScrollPosition().x, ((sa.y - n.SUBSECTION_SCROLL_TO_OFFSET)), \"JSBNG__document\"));\n                    da[ra.id] = true;\n                }\n            ;\n            ;\n            },\n            balanceCapsuleFromChild: function(ra, sa) {\n                x.balanceCapsule(m.byClass(ra, \"fbTimelineCapsule\"), sa);\n            },\n            balanceCapsuleDeferred: function(ra, sa) {\n                x.balanceCapsule.curry(ra, sa).defer();\n            },\n            balanceCapsule: function(ra, sa) {\n                if (((!ra || !ra.childNodes))) {\n                    return;\n                }\n            ;\n            ;\n                var ta = 0, ua, va = JSBNG__document.createDocumentFragment(), wa = [], xa = [], ya = [], za = false, ab = ((sa && sa.heights_action));\n                if (((sa && sa.tail_balance))) {\n                    i.set(n.DS_TAILBALANCE, ra.id, sa.tail_balance);\n                }\n            ;\n            ;\n                if (((((ab !== ba)) && ((p.chrome() || p.webkit()))))) {\n                    h.toggleClass(ra, \"webkitFix\");\n                }\n            ;\n            ;\n                for (var bb = 0; ((bb < ra.childNodes.length)); bb++) {\n                    ua = ra.childNodes[bb];\n                    if (fa(ua)) {\n                        continue;\n                    }\n                     else if (ea(ua)) {\n                        s(ua.firstChild.childNodes).forEach(function(jb) {\n                            la(jb, ab);\n                        });\n                        continue;\n                    }\n                    \n                ;\n                ;\n                    la(ua, ab);\n                    if (((ha(ua, true) == \"r\"))) {\n                        xa.push(ua);\n                    }\n                     else wa.push(ua);\n                ;\n                ;\n                    ya.push(ua);\n                    if (((ja(ua) != \"2\"))) {\n                        if (((((((ta > 0)) && ((ha(ua) == \"r\")))) || ((((ta < 0)) && ((ha(ua) == \"l\"))))))) {\n                            za = true;\n                        }\n                    ;\n                    }\n                ;\n                ;\n                    ta = na(ta, ua);\n                };\n            ;\n                var cb = [], db = [], eb = [];\n                k.scry(ra, \"li.fbTimelineBalancer\").forEach(function(jb) {\n                    var kb = s(jb.firstChild.childNodes);\n                    if (jb.getAttribute(\"data-nonunits\")) {\n                        eb = eb.concat(kb);\n                    }\n                     else if (((ha(jb) == \"left\"))) {\n                        cb = cb.concat(kb);\n                    }\n                     else if (((ha(jb) == \"right\"))) {\n                        db = db.concat(kb);\n                    }\n                    \n                    \n                ;\n                ;\n                });\n                if (za) {\n                    ra.style.minHeight = ra.offsetHeight;\n                    wa.forEach(function(jb) {\n                        if (((ja(jb) != \"2\"))) {\n                            ia(jb, \"l\");\n                        }\n                    ;\n                    ;\n                    });\n                    xa.forEach(function(jb) {\n                        if (((ja(jb) != \"2\"))) {\n                            ia(jb, \"r\");\n                        }\n                    ;\n                    ;\n                    });\n                    var fb = j.create(\"li\", {\n                        className: \"fbTimelineBalancer\"\n                    }, j.create(\"ol\", null, wa));\n                    fb.setAttribute(\"data-side\", \"left\");\n                    j.prependContent(ra, fb);\n                    cb = wa.concat(cb);\n                    var gb = j.create(\"li\", {\n                        className: \"fbTimelineBalancer\"\n                    }, j.create(\"ol\", null, xa));\n                    gb.setAttribute(\"data-side\", \"right\");\n                    j.prependContent(ra, gb);\n                    db = xa.concat(db);\n                    ta = 0;\n                }\n            ;\n            ;\n                while (eb.length) {\n                    va.appendChild(eb.shift());\n                ;\n                };\n            ;\n                while (((((((ta >= 0)) && cb.length)) || ((((ta < 0)) && db.length))))) {\n                    if (((ta >= 0))) {\n                        ua = cb.shift();\n                    }\n                     else ua = db.shift();\n                ;\n                ;\n                    va.appendChild(ua);\n                    ta = na(ta, ua);\n                };\n            ;\n                ra.appendChild(va);\n                k.scry(ra, \"li.fbTimelineBalancer\").forEach(function(jb) {\n                    if (!jb.firstChild.childNodes.length) {\n                        j.remove(jb);\n                    }\n                ;\n                ;\n                });\n                var hb = ((((sa && sa.tail_balance)) || i.get(n.DS_TAILBALANCE, ra.id)));\n                if (hb) {\n                    ta = x.tailBalance(ra, ta, hb);\n                }\n            ;\n            ;\n                if (za) {\n                    ya.forEach(function(jb) {\n                        if (((jb.parentNode !== ra))) {\n                            ra.appendChild(jb);\n                            ta = na(ta, jb);\n                        }\n                    ;\n                    ;\n                    });\n                    ra.style.minHeight = null;\n                }\n            ;\n            ;\n                var ib = m.byClass(ra, \"fbTimelineSection\");\n                if (ib) {\n                    i.set(n.DS_COLUMN_HEIGHT_DIFFERENTIAL, ib.id, ta);\n                }\n            ;\n            ;\n                ca[ra.id] = {\n                };\n                k.scry(ra, \"li.placeholderUnit\").forEach(function(jb) {\n                    ca[ra.id][jb.id] = jb;\n                });\n                pa(ra);\n                oa(ra);\n                if (((ab === aa))) {\n                    sa.heights_action = ba;\n                    w(function() {\n                        w(x.balanceCapsule.curry(ra, sa));\n                    });\n                }\n            ;\n            ;\n            },\n            tailBalance: function(ra, sa, ta) {\n                if (!ra) {\n                    return sa;\n                }\n            ;\n            ;\n                var ua = [], va = [], wa = [], xa = [];\n                k.scry(ra, \"li.fbTimelineBalancer\").forEach(function(za) {\n                    var ab = s(za.firstChild.childNodes);\n                    if (za.getAttribute(\"data-nonunits\")) {\n                        xa = xa.concat(ab);\n                    }\n                     else if (((ha(za) == \"left\"))) {\n                        va = va.concat(ab);\n                    }\n                     else if (((ha(za) == \"right\"))) {\n                        wa = wa.concat(ab);\n                    }\n                    \n                    \n                ;\n                ;\n                    ua = ua.concat(ab);\n                });\n                if (((((((ta == n.FIXED_SIDE_RIGHT)) && va.length)) || ((((ta == n.FIXED_SIDE_LEFT)) && wa.length))))) {\n                    return sa;\n                }\n            ;\n            ;\n                var ya = JSBNG__document.createDocumentFragment();\n                if (ua) {\n                    while (ua.length) {\n                        if (((ta != n.FIXED_SIDE_NONE))) {\n                            if (((ja(ua[0]) != \"2\"))) {\n                                if (((sa >= 0))) {\n                                    ia(ua[0], \"l\");\n                                }\n                                 else ia(ua[0], \"r\");\n                            ;\n                            }\n                        ;\n                        }\n                    ;\n                    ;\n                        sa = na(sa, ua[0]);\n                        ya.appendChild(ua.shift());\n                    };\n                }\n            ;\n            ;\n                ra.appendChild(ya);\n                k.scry(ra, \"li.fbTimelineBalancer\").forEach(function(za) {\n                    if (!za.firstChild.childNodes.length) {\n                        j.remove(za);\n                    }\n                ;\n                ;\n                });\n                return sa;\n            },\n            loadTwoColumnUnits: function(ra) {\n                var sa = r(ra);\n                v(function() {\n                    var ta = m.byClass(sa, \"fbTimelineSection\");\n                    if (ta) {\n                        var ua = k.JSBNG__find(sa, \"._3rbf\"), va = k.JSBNG__find(sa, \"._3rbh\"), wa = ((va.offsetHeight - ua.offsetHeight));\n                        i.set(n.DS_COLUMN_HEIGHT_DIFFERENTIAL, ta.id, wa);\n                    }\n                ;\n                ;\n                }, oa.curry(sa));\n            }\n        };\n    })();\n    e.exports = ((a.TimelineCapsule || x));\n});\n__d(\"TimelineCapsuleUtilities\", [\"CSS\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSS\"), h = {\n        setFirstUnit: function(i) {\n            var j = true;\n            for (var k = 0; ((k < i.childNodes.length)); ++k) {\n                var l = i.childNodes[k];\n                if (((l.id.indexOf(\"tl_unit_\") === 0))) {\n                    if (j) {\n                        j = false;\n                        g.addClass(l, \"firstUnit\");\n                    }\n                     else {\n                        g.removeClass(l, \"firstUnit\");\n                        break;\n                    }\n                ;\n                }\n            ;\n            ;\n            };\n        ;\n        }\n    };\n    e.exports = h;\n});\n__d(\"TimelineUnitSelector\", [\"DOMQuery\",\"Parent\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOMQuery\"), h = b(\"Parent\"), i = {\n        getUnitsWithTime: function(j) {\n            return g.scry(j, \"div.timelineUnitContainer\").filter(function(k) {\n                return ((((h.byClass(k, \"fbTimelineCapsule\") === j)) && k.getAttribute(\"data-time\")));\n            });\n        }\n    };\n    e.exports = i;\n});\n__d(\"TimelineComposerUtilities\", [\"JSBNG__Event\",\"Arbiter\",\"Bootloader\",\"CSS\",\"DOM\",\"DOMQuery\",\"Parent\",\"TimelineUnitSelector\",\"Vector\",\"cx\",\"csx\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"Arbiter\"), i = b(\"Bootloader\"), j = b(\"CSS\"), k = b(\"DOM\"), l = b(\"DOMQuery\"), m = b(\"Parent\"), n = b(\"TimelineUnitSelector\"), o = b(\"Vector\"), p = b(\"cx\"), q = b(\"csx\"), r = ((86400 * 31)), s = 86400000, t = {\n        listenToSetEstimatedDate: function(u, v) {\n            return h.subscribe(\"ComposerXTimelineTagger/init\", function(w, x) {\n                if (l.contains(u, x.datePickerElement)) {\n                    t.setEstimatedDate(x.datePickerInstance, v());\n                    x.composerTimelineTagger.switchToTagger(\"date\");\n                }\n            ;\n            ;\n            });\n        },\n        listenToSetEstimatedDateOld: function(u, v) {\n            return h.subscribe(\"TimelineBackdatedComposerTagger/initialized\", function(JSBNG__event, w) {\n                if (((w.composer === u))) {\n                    w.date_picker.subscribe(\"initialized\", function(x, y) {\n                        t.setEstimatedDate(y, v());\n                    });\n                }\n            ;\n            ;\n            });\n        },\n        listenToPublish: function(u, v) {\n            if (u.root) {\n                u = u.root;\n            }\n        ;\n        ;\n            return h.subscribe(\"composer/publish\", function(JSBNG__event, w) {\n                if (((w.composer_id === u.id))) {\n                    i.loadModules([\"TimelineStoryPublisher\",], function(x) {\n                        x.publish(w);\n                        ((v && v()));\n                    });\n                }\n            ;\n            ;\n            });\n        },\n        listenToAnotherComposerOpen: function(u, v) {\n            return h.subscribe(\"composer/mutate\", function(w, x) {\n                if (((x !== u))) {\n                    v();\n                }\n            ;\n            ;\n            });\n        },\n        listenToCancel: function(u, v) {\n            return g.listen(u, \"click\", function(JSBNG__event) {\n                if (m.byClass(JSBNG__event.getTarget(), \"_306\")) {\n                    v();\n                }\n            ;\n            ;\n            });\n        },\n        listenToCancelOld: function(u, v) {\n            return g.listen(u, \"click\", function(JSBNG__event) {\n                ((m.byClass(JSBNG__event.getTarget(), \"cancelBtn\") && v()));\n            });\n        },\n        hidePlaceIfAttachmentsTooTall: function(u) {\n            var v = l.JSBNG__find(u, \"._2_4\"), w = o.getElementDimensions(v).y;\n            if (((w > 50))) {\n                j.hide(l.JSBNG__find(v, \"._mg\"));\n            }\n        ;\n        ;\n        },\n        hidePlaceIfAttachmentsTooTallOld: function(u) {\n            var v = k.JSBNG__find(u, \"ul.fbTimelineComposerAttachments\"), w = o.getElementDimensions(v).y;\n            if (((w > 50))) {\n                var x = m.byTag(k.scry(v, \"span.placeAttachment\")[0], \"li\");\n                ((x && j.hide(x)));\n            }\n        ;\n        ;\n        },\n        setEstimatedDate: function(u, v) {\n            var w, x;\n            if (((v && j.hasClass(v, \"fbTimelineCapsule\")))) {\n                w = v.getAttribute(\"data-start\");\n                x = v.getAttribute(\"data-end\");\n                if (((w && x))) {\n                    var y = new JSBNG__Date(((x * 1000))), z = new JSBNG__Date();\n                    if (((y > z))) {\n                        u.setDate(z.getFullYear(), ((z.getMonth() + 1)), z.getDate());\n                    }\n                     else if (((((x - w)) > ((2 * r))))) {\n                        u.setDate(y.getFullYear());\n                    }\n                     else u.setDate(y.getFullYear(), ((y.getMonth() + 1)));\n                    \n                ;\n                ;\n                }\n            ;\n            ;\n                return;\n            }\n        ;\n        ;\n            var aa = m.byClass(v, \"fbTimelineCapsule\");\n            if (aa) {\n                w = aa.getAttribute(\"data-start\");\n                x = aa.getAttribute(\"data-end\");\n                var ba = o.getElementPosition(v).y, ca = [x,null,], da = [w,null,], ea = n.getUnitsWithTime(aa);\n                for (var fa = 0; ((fa < ea.length)); fa++) {\n                    var ga = ea[fa], ha = k.scry(ga.parentNode, \".spinePointer\")[0];\n                    if (!ha) {\n                        continue;\n                    }\n                ;\n                ;\n                    var ia = o.getElementPosition(ha).y;\n                    if (((ia <= ba))) {\n                        if (((!ca[1] || ((ia > ca[1]))))) {\n                            ca = [ga.getAttribute(\"data-time\"),ia,];\n                        }\n                    ;\n                    ;\n                    }\n                     else if (((!da[1] || ((ia < da[1]))))) {\n                        da = [ga.getAttribute(\"data-time\"),ia,];\n                    }\n                    \n                ;\n                ;\n                };\n            ;\n                if (((((ca[0] !== null)) && ((da[0] !== null))))) {\n                    var ja = ((Math.round(((((parseInt(ca[0], 10) + parseInt(da[0], 10))) / 2))) * 1000));\n                    ja = Math.min(((new JSBNG__Date() - s)), ja);\n                    u.setDateWithTimestamp(ja);\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n        },\n        showMLEFlyout: function(u) {\n            var v = ((k.scry(JSBNG__document, \"a.fbTimelineSpine\").length === 0)), w = function(x) {\n                x.showMLEFlyout(u);\n            };\n            if (v) {\n                i.loadModules([\"TimelineSpinelessComposer\",], w);\n            }\n             else i.loadModules([\"TimelineComposer\",], w);\n        ;\n        ;\n        }\n    };\n    e.exports = t;\n});\n__d(\"TimelineComposer\", [\"Arbiter\",\"Bootloader\",\"CSS\",\"DOM\",\"Parent\",\"Run\",\"TimelineCapsule\",\"TimelineCapsuleUtilities\",\"TimelineComposerUtilities\",\"$\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"Bootloader\"), i = b(\"CSS\"), j = b(\"DOM\"), k = b(\"Parent\"), l = b(\"Run\"), m = b(\"TimelineCapsule\"), n = b(\"TimelineCapsuleUtilities\"), o = b(\"TimelineComposerUtilities\"), p = b(\"$\"), q = b(\"cx\"), r;\n    function s(x) {\n        if (((x.isScheduledPost || x.isOGPost))) {\n            return;\n        }\n    ;\n    ;\n        if (!x.streamStory) {\n            window.JSBNG__location.reload();\n            return;\n        }\n    ;\n    ;\n        if (x.backdatedTime) {\n            h.loadModules([\"TimelineStoryPublisher\",], function(z) {\n                z.publish(x);\n            });\n            return;\n        }\n    ;\n    ;\n        var y = w.renderCapsuleBasedStory(r, x.streamStory);\n        g.inform(\"TimelineComposer/on_after_publish\", y, g.BEHAVIOR_PERSISTENT);\n    };\n;\n    function t() {\n        var x = k.byClass(r, \"fbTimelineTwoColumn\");\n        return j.JSBNG__find(x, \".spinePointer\");\n    };\n;\n    function u(x) {\n        var y = v();\n        i.show(y);\n        var z = x.subscribe(\"hide\", function() {\n            i.hide(y);\n            x.unsubscribe(z);\n        });\n    };\n;\n    function v() {\n        var x = k.byClass(r, \"fbTimelineTwoColumn\"), y = j.scry(x, \"div.composerVeil\");\n        if (((y.length !== 1))) {\n            y = j.appendContent(x, j.create(\"div\", {\n                className: \"composerVeil hidden_elem\"\n            }));\n        }\n    ;\n    ;\n        return y[0];\n    };\n;\n    var w = {\n        init: function(x) {\n            r = p(x);\n            var y = g.subscribe(\"composer/publish\", function(JSBNG__event, z) {\n                if (((z.composer_id === r.id))) {\n                    s(z);\n                }\n            ;\n            ;\n            });\n            l.onLeave(y.unsubscribe.bind(y));\n            if (i.hasClass(r, \"_mj\")) {\n                o.hidePlaceIfAttachmentsTooTall(r);\n            }\n             else o.hidePlaceIfAttachmentsTooTallOld(r);\n        ;\n        ;\n        },\n        showMLEFlyout: function(x) {\n            x.setContext(t()).show();\n            u(x);\n        },\n        renderCapsuleBasedStory: function(x, y) {\n            var z = k.byClass(x, \"fbTimelineCapsule\");\n            if (!z) {\n                return;\n            }\n        ;\n        ;\n            var aa = k.byClass(x, \"timelineUnitContainer\").parentNode;\n            if (aa.nextSibling.getAttribute(\"data-spine\")) {\n                aa = aa.nextSibling;\n            }\n        ;\n        ;\n            var ba = j.insertAfter(aa, y)[0];\n            h.loadModules([\"Animation\",], function(ca) {\n                new ca(ba.firstChild).from(\"backgroundColor\", \"#fff8dd\").to(\"backgroundColor\", \"#fff\").duration(2000).ease(ca.ease.both).go();\n            });\n            n.setFirstUnit(z);\n            m.balanceCapsule(z);\n            return ba;\n        }\n    };\n    e.exports = ((a.TimelineComposer || w));\n});\n__d(\"TimelineSmartInsert\", [\"Run\",\"UserAgent\",\"Vector\",], function(a, b, c, d, e, f) {\n    var g = b(\"Run\"), h = b(\"UserAgent\"), i = b(\"Vector\"), j = 100;\n    function k(q) {\n        if (((q === \"viewport\"))) {\n            return i.getViewportDimensions().y;\n        }\n    ;\n    ;\n        return q;\n    };\n;\n    var l = false, m = false;\n    function n() {\n        if (m) {\n            return;\n        }\n    ;\n    ;\n        g.onLeave(o);\n        m = true;\n    };\n;\n    function o() {\n        l = false;\n        m = false;\n    };\n;\n    var p = {\n        run: function(q, r, s) {\n            n();\n            if (((!l || ((h.ie() <= 8))))) {\n                r();\n                return;\n            }\n        ;\n        ;\n            var t = q.offsetHeight;\n            r();\n            var u = q.offsetHeight, v = i.getScrollPosition().y, w = i.getElementPosition(q).y;\n            if (((((((u !== t)) && ((w < v)))) && ((((w + t)) < ((v + k(((s || j)))))))))) {\n                window.JSBNG__scrollBy(0, ((u - t)));\n            }\n        ;\n        ;\n        },\n        enable: function() {\n            l = true;\n        }\n    };\n    e.exports = p;\n});\n__d(\"TimelineContentLoader\", [\"JSBNG__Event\",\"function-extensions\",\"Arbiter\",\"CSS\",\"DOM\",\"DOMScroll\",\"OnVisible\",\"ScrollingPager\",\"TimelineConstants\",\"TimelineController\",\"TimelineLegacySections\",\"TimelineSmartInsert\",\"TimelineURI\",\"UIPagelet\",\"UserAgent\",\"Vector\",\"$\",\"arrayContains\",\"copyProperties\",\"createArrayFrom\",\"csx\",\"debounce\",\"ge\",\"startsWith\",\"tx\",\"userAction\",], 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(\"DOM\"), k = b(\"DOMScroll\"), l = b(\"OnVisible\"), m = b(\"ScrollingPager\"), n = b(\"TimelineConstants\"), o = b(\"TimelineController\"), p = b(\"TimelineLegacySections\"), q = b(\"TimelineSmartInsert\"), r = b(\"TimelineURI\"), s = b(\"UIPagelet\"), t = b(\"UserAgent\"), u = b(\"Vector\"), v = b(\"$\"), w = b(\"arrayContains\"), x = b(\"copyProperties\"), y = b(\"createArrayFrom\"), z = b(\"csx\"), aa = b(\"debounce\"), ba = b(\"ge\"), ca = b(\"startsWith\"), da = b(\"tx\"), ea = b(\"userAction\"), fa = false, ga = false, ha, ia = null, ja = {\n    }, ka = [], la = [], ma = [], na = {\n    }, oa = {\n    }, pa = {\n    }, qa = {\n    }, ra = null, sa = null, ta = false, ua = null;\n    function va(eb, fb, gb, hb, ib) {\n        this.node = eb;\n        this.loaded = hb;\n        this.canScrollLoad = true;\n        this.canUnload = ((fb != db.RECENT));\n        this.scrubberKey = fb;\n        this.historicUnitCount = ib;\n        this._pageletLoadData = gb;\n        this._expandPageletLoadData = {\n        };\n        this.rightColumnFinished = false;\n    };\n;\n    x(va.prototype, {\n        load: function(eb, fb) {\n            if (this.loaded) {\n                return;\n            }\n        ;\n        ;\n            var gb = this._pageletLoadData;\n            h.inform(n.SECTION_LOADING, {\n                data: gb,\n                scrubberKey: this.scrubberKey\n            });\n            this.loaded = true;\n            i.removeClass(this.node, \"fbTimelineTimePeriodUnexpanded\");\n            i.removeClass(this.node, \"fbTimelineTimePeriodSuppressed\");\n            var hb = \"ProfileTimelineSectionPagelet\", ib = ((this.scrubberKey == db.WAY_BACK));\n            if (ib) {\n                hb = \"ProfileTimelineRemainingYearsPagelet\";\n            }\n        ;\n        ;\n            gb.time_cutoff = db.getTimeCutoff();\n            gb.highlight_unit_data = eb;\n            gb.parent_key = this.parentKey;\n            gb.force_no_friend_activity = ta;\n            i.addClass(this.node, \"fbTimelineSectionLoading\");\n            if (gb.combine_sections) {\n                i.addClass(this.node, \"combinedSections\");\n            }\n        ;\n        ;\n            if (((this.canUnload && ga))) {\n                var jb = this.node.firstChild.cloneNode(true);\n                i.hide(jb);\n                j.insertAfter(this.node, jb);\n            }\n             else this.canScrollLoad = false;\n        ;\n        ;\n            var kb = null;\n            if (((fb && !mb))) {\n                var lb = this.node;\n                lb.style.minHeight = ((window.JSBNG__innerHeight + \"px\"));\n                kb = function() {\n                    lb.style.minHeight = null;\n                };\n            }\n        ;\n        ;\n            var mb = ((gb.combine_sections && ib));\n            pa[this.scrubberKey] = s.loadFromEndpoint(hb, ((mb ? ((gb.unit_container_id + \"_left\")) : this.node.id)), gb, {\n                usePipe: true,\n                jsNonblock: true,\n                constHeight: true,\n                append: mb,\n                finallyHandler: kb\n            });\n            cb(this.scrubberKey);\n        },\n        preload: function() {\n            i.addClass(this.node, \"fbTimelineTimePeriodSuppressed\");\n            i.removeClass(this.node, \"fbTimelineTimePeriodUnexpanded\");\n            var eb = j.JSBNG__find(this.node, \"span.sectionLabel\");\n            if (eb.getAttribute(\"data-original-label\")) {\n                j.setContent(eb, eb.getAttribute(\"data-original-label\"));\n                eb.removeAttribute(\"data-original-label\");\n            }\n        ;\n        ;\n        },\n        unload: function() {\n            if (((!this.loaded || !this.canUnload))) {\n                return;\n            }\n        ;\n        ;\n            this.loaded = false;\n            ((pa[this.scrubberKey] && pa[this.scrubberKey].cancel()));\n            i.addClass(this.node, \"fbTimelineTimePeriodUnexpanded\");\n            i.removeClass(this.node, \"fbTimelineTimePeriodSuppressed\");\n            if (((this.node.nextSibling && i.hasClass(this.node.nextSibling, \"fbTimelineSection\")))) {\n                j.setContent(this.node, this.node.nextSibling);\n                i.show(this.node.firstChild);\n            }\n             else j.empty(this.node);\n        ;\n        ;\n            this.deactivateScrollLoad();\n        },\n        activateScrollLoad: function() {\n            this.canScrollLoad = true;\n            i.removeClass(this.node, \"fbTimelineTimePeriodSuppressed\");\n            i.addClass(this.node, \"fbTimelineTimePeriodUnexpanded\");\n            ((oa[this.scrubberKey] && oa[this.scrubberKey].reset()));\n        },\n        deactivateScrollLoad: function() {\n            if (!this.loaded) {\n                this.canScrollLoad = false;\n                i.removeClass(this.node, \"fbTimelineTimePeriodUnexpanded\");\n                i.addClass(this.node, \"fbTimelineTimePeriodSuppressed\");\n                ((oa[this.scrubberKey] && oa[this.scrubberKey].remove()));\n            }\n        ;\n        ;\n        },\n        setExpandLoadData: function(eb) {\n            this._expandPageletLoadData = eb;\n            return this;\n        },\n        appendData: function(eb) {\n            x(this._pageleLoadData, eb);\n            return this;\n        },\n        expandSubSections: function() {\n            if (this.subSections.length) {\n                db.navigateToSection(this.subSections[0].scrubberKey);\n            }\n        ;\n        ;\n        },\n        expand: function(eb) {\n            if (!this.loaded) {\n                return;\n            }\n        ;\n        ;\n            sa.add_event(((\"expand_\" + this.scrubberKey)));\n            var fb = j.JSBNG__find(this.node, \".fbTimelineSectionExpander\");\n            i.addClass(fb.firstChild, \"async_saving\");\n            ((eb && i.addClass(eb, \"async_saving\")));\n            this._expandPageletLoadData.time_cutoff = db.getTimeCutoff();\n            db.navigateToSection(this.scrubberKey);\n            j.scry(this.node, \".fbTimelineCapsule\").forEach(j.remove);\n            this._expandPageletLoadData.new_expand = true;\n            ((pa[this.scrubberKey] && pa[this.scrubberKey].cancel()));\n            pa[this.scrubberKey] = s.loadFromEndpoint(\"ProfileTimelineSectionPagelet\", fb.id, this._expandPageletLoadData, {\n                usePipe: true,\n                jsNonblock: true,\n                constHeight: true\n            });\n        },\n        isPermalinkPeriod: function() {\n            return this._pageletLoadData.is_permalink_period;\n        }\n    });\n    function wa() {\n        if (fa) {\n            return;\n        }\n    ;\n    ;\n        o.register(o.CONTENT, db);\n        sa = ea(\"timeline\").uai(\"init\", \"scrubber\", false);\n        fa = true;\n        if (((t.ie() <= 7))) {\n            ga = true;\n        }\n    ;\n    ;\n    };\n;\n    var xa = aa(function(eb, fb, gb) {\n        var hb = p.get(eb).historicUnitCount;\n        fb -= hb;\n        gb -= 1;\n        if (((((((hb == -1)) || ((gb <= 0)))) || ((fb < 0))))) {\n            return;\n        }\n    ;\n    ;\n        var ib = db.getNextSectionKey(eb);\n        if (ib) {\n            p.get(ib).load();\n            xa(ib, fb, gb);\n        }\n    ;\n    ;\n    }, 500);\n    function ya(eb, fb, gb, hb) {\n        var ib = db.getNextSectionKey(fb);\n        if (ib) {\n            oa[ib] = new l(eb, za.curry(ib, eb), false, ((gb || 1000)));\n        }\n         else if (((fb !== db.WAY_BACK))) {\n            hb = ((hb ? hb : 0));\n            if (((hb > 80))) {\n                return null;\n            }\n        ;\n        ;\n            ya.curry(eb, fb, gb, ((hb + 1))).defer(250);\n        }\n        \n    ;\n    ;\n    };\n;\n    function za(eb, fb) {\n        var gb = p.get(eb);\n        if (((gb && gb.canScrollLoad))) {\n            sa.add_event(((\"scroll_load_\" + eb)));\n            if (ga) {\n                gb.preload();\n            }\n             else {\n                gb.load();\n                if (ua) {\n                    xa(eb, ua.required_units, ua.max_parallelism);\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            ((fb && j.remove(fb)));\n        }\n    ;\n    ;\n    };\n;\n    function ab() {\n        var eb, fb, gb = false;\n        for (var hb = 0; ((hb < ka.length)); hb++) {\n            var ib = ka[hb];\n            if (!ib) {\n                continue;\n            }\n        ;\n        ;\n            var jb = p.get(ib);\n            if (((jb && ((jb.canScrollLoad || jb.loaded))))) {\n                if (!jb.loaded) {\n                    i.removeClass(jb.node, \"fbTimelineTimePeriodSuppressed\");\n                    i.addClass(jb.node, \"fbTimelineTimePeriodUnexpanded\");\n                }\n            ;\n            ;\n                if (((eb && fb))) {\n                    bb(eb, fb);\n                    if (gb) {\n                        eb.deactivateScrollLoad();\n                    }\n                ;\n                ;\n                    gb = true;\n                }\n            ;\n            ;\n                eb = null;\n                fb = null;\n                continue;\n            }\n             else if (eb) {\n                fb = jb;\n                jb.deactivateScrollLoad();\n            }\n             else {\n                eb = jb;\n                if (gb) {\n                    jb.activateScrollLoad();\n                }\n            ;\n            ;\n            }\n            \n        ;\n        ;\n            i.removeClass(jb.node, \"fbTimelineTimePeriodSuppressed\");\n            i.addClass(jb.node, \"fbTimelineTimePeriodUnexpanded\");\n        };\n    ;\n    };\n;\n    function bb(eb, fb) {\n        i.removeClass(fb.node, \"fbTimelineTimePeriodUnexpanded\");\n        i.addClass(fb.node, \"fbTimelineTimePeriodSuppressed\");\n        var gb = j.JSBNG__find(eb.node, \"span.sectionLabel\"), hb = j.JSBNG__find(fb.node, \"span.sectionLabel\");\n        if (!hb.getAttribute(\"data-original-label\")) {\n            hb.setAttribute(\"data-original-label\", j.getText(hb));\n        }\n    ;\n    ;\n        if (((((gb.getAttribute(\"data-month\") && hb.getAttribute(\"data-month\"))) && ((gb.getAttribute(\"data-year\") == hb.getAttribute(\"data-year\")))))) {\n            j.setContent(hb, da._(\"Show {month1} - {month2} {year}\", {\n                month1: hb.getAttribute(\"data-month\"),\n                month2: gb.getAttribute(\"data-month\"),\n                year: gb.getAttribute(\"data-year\")\n            }));\n        }\n         else if (((gb.getAttribute(\"data-year\") !== hb.getAttribute(\"data-year\")))) {\n            j.setContent(hb, da._(\"Show {year1} - {year2}\", {\n                year1: hb.getAttribute(\"data-year\"),\n                year2: gb.getAttribute(\"data-year\")\n            }));\n        }\n         else j.setContent(hb, da._(\"Show {year}\", {\n            year: hb.getAttribute(\"data-year\")\n        }));\n        \n    ;\n    ;\n    };\n;\n    function cb(eb) {\n        if (ga) {\n            for (var fb = 0; ((fb < ((ka.length - 1)))); fb++) {\n                var gb = ka[fb];\n                if (!gb) {\n                    continue;\n                }\n            ;\n            ;\n                if (((gb != eb))) {\n                    var hb = p.get(gb);\n                    if (((hb.loaded && hb.canUnload))) {\n                        hb.unload();\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n            };\n        }\n    ;\n    ;\n        ab();\n    };\n;\n    var db = {\n        WAY_BACK: \"way_back\",\n        RECENT: \"recent\",\n        HEADER_SCROLL_CUTOFF: 80,\n        CURRENT_SECTION_OFFSET: 150,\n        FOOTER_HEIGHT: 60,\n        registerTimePeriod: function(eb, fb, gb, hb, ib, jb, kb) {\n            wa();\n            if (w(ma, fb)) {\n                return;\n            }\n        ;\n        ;\n            if (la) {\n                x(gb, la);\n            }\n        ;\n        ;\n            var lb = new va(eb, fb, gb, hb, kb);\n            if (!ib) {\n                ka[jb] = fb;\n                ja[fb] = true;\n            }\n             else {\n                lb.parentKey = ib;\n                p.get(ib).subSections = ((p.get(ib).subSections || []));\n                p.get(ib).subSections[jb] = lb;\n            }\n        ;\n        ;\n            p.set(fb, lb);\n            db.checkCurrentSectionChange();\n            h.inform(n.SECTION_REGISTERED, {\n                scrubberKey: fb\n            });\n        },\n        reset: function() {\n            {\n                var fin281keys = ((window.top.JSBNG_Replay.forInKeys)((oa))), fin281i = (0);\n                var eb;\n                for (; (fin281i < fin281keys.length); (fin281i++)) {\n                    ((eb) = (fin281keys[fin281i]));\n                    {\n                        oa[eb].remove();\n                    ;\n                    };\n                };\n            };\n        ;\n            {\n                var fin282keys = ((window.top.JSBNG_Replay.forInKeys)((pa))), fin282i = (0);\n                var fb;\n                for (; (fin282i < fin282keys.length); (fin282i++)) {\n                    ((fb) = (fin282keys[fin282i]));\n                    {\n                        ((pa[fb] && pa[fb].cancel()));\n                    ;\n                    };\n                };\n            };\n        ;\n            {\n                var fin283keys = ((window.top.JSBNG_Replay.forInKeys)((qa))), fin283i = (0);\n                var gb;\n                for (; (fin283i < fin283keys.length); (fin283i++)) {\n                    ((gb) = (fin283keys[fin283i]));\n                    {\n                        qa[gb].unsubscribe();\n                        delete qa[gb];\n                    };\n                };\n            };\n        ;\n            ((ha && ha.unsubscribe()));\n            ha = null;\n            p.removeAll();\n            ia = null;\n            ja = {\n            };\n            ka = [];\n            la = [];\n            ma = [];\n            na = {\n            };\n            oa = {\n            };\n            pa = {\n            };\n            ra = null;\n            sa = null;\n            ta = false;\n            fa = false;\n        },\n        checkCurrentSectionChange: function() {\n            var eb = db.getCurrentSection(), fb = ((ia && ia.scrubberKey));\n            if (((((eb && ((eb.scrubberKey !== fb)))) && !eb.isPermalinkPeriod()))) {\n                ia = eb;\n                var gb = eb.scrubberKey, hb = eb.parentKey;\n                if (!hb) {\n                    hb = gb;\n                    gb = null;\n                }\n            ;\n            ;\n                o.sectionHasChanged(hb, gb);\n            }\n        ;\n        ;\n        },\n        setTimeCutoff: function(eb) {\n            ra = eb;\n        },\n        getTimeCutoff: function() {\n            return ra;\n        },\n        setParallelLoadConfig: function(eb) {\n            ua = eb;\n        },\n        getCurrentSection: function() {\n            var eb = {\n            }, fb = p.getAll();\n            {\n                var fin284keys = ((window.top.JSBNG_Replay.forInKeys)((fb))), fin284i = (0);\n                var gb;\n                for (; (fin284i < fin284keys.length); (fin284i++)) {\n                    ((gb) = (fin284keys[fin284i]));\n                    {\n                        var hb = fb[gb];\n                        if (((!hb.loaded || na[hb.scrubberKey]))) {\n                            continue;\n                        }\n                    ;\n                    ;\n                        var ib = u.getElementPosition(hb.node, \"viewport\").y;\n                        if (((hb.scrubberKey == \"recent\"))) {\n                            ib--;\n                        }\n                    ;\n                    ;\n                        if (((ib < db.CURRENT_SECTION_OFFSET))) {\n                            eb[ib] = hb;\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            var jb = Math.max.apply(null, Object.keys(eb)), kb = ((jb == -Infinity));\n            if (!kb) {\n                return eb[jb];\n            }\n             else if (ka[0]) {\n                return p.get(ka[0]);\n            }\n            \n        ;\n        ;\n            return null;\n        },\n        capsuleForCurrentSection: function() {\n            var eb = db.getCurrentSection();\n            return ((eb && j.scry(eb.node, \".fbTimelineCapsule\")[0]));\n        },\n        enableScrollLoad: function(eb, fb, gb, hb) {\n            eb = v(eb);\n            var ib = j.scry(eb.parentNode, \".fbTimelineCapsule\")[0];\n            if (!ib) {\n                return;\n            }\n        ;\n        ;\n            if (((gb === null))) {\n                ya(eb, fb, hb);\n            }\n             else o.runOnceWhenSectionFullyLoaded(ya.curry(eb, fb, hb), fb, gb);\n        ;\n        ;\n        },\n        enableScrollLoadOnClick: function(eb, fb, gb) {\n            eb = v(eb);\n            g.listen(eb, \"click\", function(hb) {\n                hb.prevent();\n                db.enableScrollLoad(eb, fb, null, gb);\n            });\n        },\n        expandSectionOnClick: function(eb, fb) {\n            g.listen(eb, \"click\", function(gb) {\n                gb.prevent();\n                p.get(fb).expand();\n            });\n        },\n        expandSubSectionsOnClick: function(eb, fb) {\n            g.listen(eb, \"click\", function(gb) {\n                gb.prevent();\n                p.get(fb).expandSubSections();\n            });\n        },\n        getNextSectionKey: function(eb) {\n            for (var fb = 0; ((fb < ((ka.length - 1)))); fb++) {\n                if (((ka[fb] == eb))) {\n                    while (((((fb < ((ka.length - 1)))) && !ka[((fb + 1))]))) {\n                        fb++;\n                    ;\n                    };\n                ;\n                    return ka[((fb + 1))];\n                }\n            ;\n            ;\n            };\n        ;\n            var gb = p.get(eb);\n            if (((!gb || !gb.parentKey))) {\n                return;\n            }\n        ;\n        ;\n            var hb = p.get(gb.parentKey);\n            if (!hb) {\n                return;\n            }\n        ;\n        ;\n            for (var ib = 0; ((ib < ((hb.subSections.length - 1)))); ib++) {\n                if (((hb.subSections[ib].scrubberKey == eb))) {\n                    return hb.subSections[((ib + 1))].scrubberKey;\n                }\n            ;\n            ;\n            };\n        ;\n        },\n        hideSection: function(eb) {\n            var fb = p.get(eb);\n            ((fb && i.hide(j.JSBNG__find(fb.node, \".fbTimelineSection\"))));\n            var gb = o.getCurrentScrubber();\n            if (gb) {\n                var hb = o.getCurrentScrubber().getNav(eb);\n                ((hb && i.hide(hb)));\n            }\n        ;\n        ;\n            var ib = o.getCurrentStickyHeaderNav();\n            ((ib && ib.removeTimePeriod(eb)));\n            na[eb] = true;\n        },\n        loadSectionOnClick: function(eb, fb) {\n            g.listen(eb, \"click\", function(gb) {\n                gb.prevent();\n                p.get(fb).load();\n            });\n        },\n        removeSection: function(eb) {\n            {\n                var fin285keys = ((window.top.JSBNG_Replay.forInKeys)((ka))), fin285i = (0);\n                var fb;\n                for (; (fin285i < fin285keys.length); (fin285i++)) {\n                    ((fb) = (fin285keys[fin285i]));\n                    {\n                        if (((ka[fb] == eb))) {\n                            ka[fb] = null;\n                            break;\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            p.remove(eb);\n            delete ja[eb];\n            if (((eb in oa))) {\n                oa[eb].remove();\n                delete oa[eb];\n            }\n        ;\n        ;\n            var gb = o.getCurrentStickyHeaderNav();\n            ((gb && gb.removeTimePeriod(eb)));\n            ma.push(eb);\n        },\n        removeSectionParent: function(eb) {\n            j.remove(v(eb).parentNode);\n        },\n        navigateToSection: function(eb, fb, gb) {\n            sa.add_event(((\"nav_\" + eb)));\n            fb = !!fb;\n            var hb = eb, ib = p.get(eb);\n            if (!ib) {\n                return;\n            }\n        ;\n        ;\n            if (!ib.loaded) {\n                q.enable();\n                j.scry(v(\"timeline_tab_content\"), \".fbTimelineShowOlderSections\").forEach(j.remove);\n            }\n        ;\n        ;\n            if (!ja[eb]) {\n                ib.node.style.minHeight = ((u.getViewportDimensions().y + \"px\"));\n                var jb = h.subscribe(n.SECTION_FULLY_LOADED, function(rb, sb) {\n                    if (((sb.scrubberKey === eb))) {\n                        ib.node.style.minHeight = \"\";\n                        jb.unsubscribe();\n                    }\n                ;\n                ;\n                });\n                hb = ib.parentKey;\n                var kb = p.get(hb).node;\n                if (!i.hasClass(kb, \"fbTimelineSectionExpanded\")) {\n                    k.JSBNG__scrollTo(kb, 0);\n                    i.addClass(kb, \"fbTimelineSectionExpanded\");\n                    j.scry(kb, \".fbTimelineCapsule\").forEach(j.remove);\n                    j.scry(kb, \"div.fbTimelineSectionExpandPager\").forEach(j.remove);\n                    j.scry(kb, \"div.fbTimelineContentHeader\").forEach(j.remove);\n                    j.scry(kb, \"._5vf\").forEach(function(rb) {\n                        if (!rb.getAttribute(\"data-subsection\")) {\n                            j.remove(rb);\n                        }\n                    ;\n                    ;\n                    });\n                }\n            ;\n            ;\n                var lb = db.getNextSectionKey(hb);\n                if (((lb && oa[lb]))) {\n                    oa[lb].setBuffer(0);\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            for (var mb = 0; ((mb < ka.length)); mb++) {\n                var nb = ka[mb];\n                if (!nb) {\n                    continue;\n                }\n            ;\n            ;\n                if (((nb == hb))) {\n                    break;\n                }\n            ;\n            ;\n                p.get(nb).deactivateScrollLoad();\n                j.scry(v(\"timeline_tab_content\"), \".fbTimelineSectionExpandPager\").forEach(function(rb) {\n                    var sb = m.getInstance(rb.id);\n                    ((sb && sb.removeOnVisible()));\n                });\n            };\n        ;\n            db.adjustContentPadding();\n            ib.load(gb, true);\n            ab();\n            var ob = u.getScrollPosition().x, pb = u.getElementPosition(ib.node).y;\n            if (!fb) {\n                var qb = ((ja[eb] ? n.SCROLL_TO_OFFSET : n.SUBSECTION_SCROLL_TO_OFFSET));\n                k.JSBNG__scrollTo(new u(ob, ((pb - qb)), \"JSBNG__document\"), true, false, false, function() {\n                    var rb = u.getElementPosition(ib.node).y;\n                    k.JSBNG__scrollTo(new u(ob, ((rb - qb)), \"JSBNG__document\"), false);\n                    var sb = j.scry(ib.node, \"h3.uiHeaderTitle\")[0];\n                    if (sb) {\n                        sb.tabIndex = 0;\n                        sb.JSBNG__focus();\n                    }\n                ;\n                ;\n                });\n            }\n        ;\n        ;\n        },\n        adjustContentPadding: function() {\n            var eb = ba(\"timeline_tab_content\");\n            if (!eb) {\n                return;\n            }\n        ;\n        ;\n            if (o.isOneColumnMinimal()) {\n                return;\n            }\n        ;\n        ;\n            var fb = ((o.getCurrentKey() || r.TIMELINE_KEY));\n            if (((fb !== r.TIMELINE_KEY))) {\n                return;\n            }\n        ;\n        ;\n            var gb = ((ka.length - 1)), hb = p.get(ka[gb]);\n            eb.style.paddingBottom = ((((hb && hb.loaded)) ? null : ((((((((u.getViewportDimensions().y - db.CURRENT_SECTION_OFFSET)) - db.HEADER_SCROLL_CUTOFF)) - db.FOOTER_HEIGHT)) + \"px\"))));\n        },\n        adjustContentPaddingAfterLoad: function(eb, fb) {\n            o.runOnceWhenSectionFullyLoaded(db.adjustContentPadding, eb, fb);\n        },\n        appendContentAfterLoad: function(eb, fb, gb) {\n            o.runOnceWhenSectionFullyLoaded(j.appendContent.curry(v(eb), fb), gb, \"0\");\n        },\n        markSectionAsLoaded: function(eb, fb, gb) {\n            o.runOnceWhenSectionFullyLoaded(function() {\n                ((ba(eb) && i.removeClass(v(eb).parentNode, \"fbTimelineSectionLoading\")));\n            }, fb, gb);\n        },\n        suppressSectionsAbove: function(eb) {\n            var fb, gb;\n            for (var hb = 0; ((hb < ka.length)); hb++) {\n                var ib = ka[hb];\n                if (!ib) {\n                    continue;\n                }\n            ;\n            ;\n                fb = p.get(ib).node;\n                gb = null;\n                if (((y(eb.parentNode.children).indexOf(eb) <= y(fb.parentNode.children).indexOf(fb)))) {\n                    gb = ib;\n                    break;\n                }\n            ;\n            ;\n                p.get(ib).deactivateScrollLoad();\n            };\n        ;\n            if (gb) {\n                db.navigateToSection(gb, true);\n            }\n        ;\n        ;\n        },\n        forceNoFriendActivity: function() {\n            ta = true;\n        },\n        removeDupes: function(eb) {\n            var fb = ba(eb);\n            if (!fb) {\n                return;\n            }\n        ;\n        ;\n            var gb = j.scry(fb, \"li.fbTimelineUnit\"), hb = {\n            };\n            for (var ib = 0; ((ib < gb.length)); ib++) {\n                var jb = gb[ib];\n                if (((jb.id && ca(jb.id, \"tl_unit_\")))) {\n                    var kb = jb.id.substring(8, jb.id.length), lb = ((((jb.getAttribute(\"data-unit\") == \"ExperienceSummaryUnit\")) ? jb.getAttribute(\"data-time\") : 1));\n                    if (((hb.hasOwnProperty(kb) && ((hb[kb] == lb))))) {\n                        jb.id = ((\"dupe_unit_\" + Math.JSBNG__random()));\n                        jb.className = \"hidden_elem\";\n                    }\n                     else hb[kb] = lb;\n                ;\n                ;\n                }\n            ;\n            ;\n            };\n        ;\n        },\n        removeLoadingState: function(eb) {\n            ((ba(eb) && i.removeClass(v(eb), \"fbTimelineSectionLoading\")));\n        },\n        setExpandLoadDataForSection: function(eb, fb) {\n            var gb = p.get(eb);\n            ((gb && gb.setExpandLoadData(fb)));\n        },\n        appendSectionDataForAllSections: function(eb) {\n            la = eb;\n            for (var fb = 0; ((fb < ((ka.length - 1)))); fb++) {\n                var gb = ka[fb];\n                if (!gb) {\n                    continue;\n                }\n            ;\n            ;\n                var hb = p.get(gb);\n                ((hb && hb.appendData(eb)));\n            };\n        ;\n        },\n        updatePagerAfterLoad: function(eb, fb, gb, hb, ib) {\n            var jb = m.getInstance(eb.firstChild.id);\n            if (!jb) {\n                qa[eb.firstChild.id] = h.subscribe(m.REGISTERED, function(kb, lb) {\n                    qa[eb.firstChild.id].unsubscribe();\n                    delete qa[eb.firstChild.id];\n                    if (((lb.id === eb.firstChild.id))) {\n                        db.updatePagerAfterLoad(eb, fb, gb, hb, ib);\n                    }\n                ;\n                ;\n                });\n                return;\n            }\n        ;\n        ;\n            o.runOnceWhenSectionFullyLoaded(function() {\n                i.removeClass(eb, \"fbTimelineHiddenPager\");\n                jb.checkBuffer();\n            }, gb, hb);\n            if (ib) {\n                o.runOnceWhenSectionFullyLoaded(o.adjustScrollingPagerBuffer.curry(eb.firstChild.id, fb), gb, hb);\n            }\n        ;\n        ;\n        },\n        showAfterLoad: function(eb, fb, gb) {\n            o.runOnceWhenSectionFullyLoaded(function() {\n                var hb = ba(eb);\n                ((hb && i.show(hb)));\n            }, fb, gb);\n        },\n        repositionDialog: function(eb) {\n            h.subscribe(n.SECTION_LOADED, function() {\n                eb.updatePosition();\n            });\n        },\n        rightColumnFinished: function(eb) {\n            var fb = p.get(eb);\n            fb.rightColumnFinished = true;\n        },\n        registerUnrankedGroup: function(eb) {\n            g.listen(eb, \"click\", function(JSBNG__event) {\n                var fb = j.JSBNG__find(eb, \".unranked_group_placeholder\");\n                if (((JSBNG__event.getTarget() !== fb))) {\n                    return JSBNG__event.prevent();\n                }\n            ;\n            ;\n                j.remove(fb);\n                i.removeClass(j.JSBNG__find(eb, \".unranked_group_units\"), \"hidden_elem\");\n                return true;\n            });\n        }\n    };\n    e.exports = db;\n});\n__d(\"TimelineLogging\", [\"TimelineController\",\"reportData\",], function(a, b, c, d, e, f) {\n    var g = b(\"TimelineController\"), h = b(\"reportData\"), i = false, j = 0, k = null, l = null, m = {\n        init: function(n) {\n            if (i) {\n                return;\n            }\n        ;\n        ;\n            j = n;\n            g.register(g.LOGGING, this);\n        },\n        reset: function() {\n            i = false;\n            j = 0;\n            k = null;\n        },\n        log: function(n, o) {\n            o.profile_id = j;\n            h(n, {\n                gt: o\n            });\n        },\n        logSectionChange: function(n, o) {\n            var p = {\n                timeline_section_change: 1,\n                key: n\n            };\n            if (((k && ((n == k))))) {\n                p.timeline_scrubber = 1;\n                k = null;\n            }\n        ;\n        ;\n            if (((l && ((n == l))))) {\n                p.sticky_header_nav = 1;\n                l = null;\n            }\n        ;\n        ;\n            m.log(\"timeline\", p);\n        },\n        logScrubberClick: function(n) {\n            k = n;\n        },\n        logStickyHeaderNavClick: function(n) {\n            l = n;\n        }\n    };\n    e.exports = m;\n});\n__d(\"TimelineSideAds\", [\"function-extensions\",\"Arbiter\",\"CSS\",\"DOM\",\"EgoAdsObjectSet\",\"JSBNG__Event\",\"StickyController\",\"TimelineConstants\",\"TimelineController\",\"UIPagelet\",\"URI\",\"Vector\",\"cx\",\"csx\",\"debounce\",\"ge\",], function(a, b, c, d, e, f) {\n    b(\"function-extensions\");\n    var g = b(\"Arbiter\"), h = b(\"CSS\"), i = b(\"DOM\"), j = b(\"EgoAdsObjectSet\"), k = b(\"JSBNG__Event\"), l = b(\"StickyController\"), m = b(\"TimelineConstants\"), n = b(\"TimelineController\"), o = b(\"UIPagelet\"), p = b(\"URI\"), q = b(\"Vector\"), r = b(\"cx\"), s = b(\"csx\"), t = b(\"debounce\"), u = b(\"ge\"), v = 3, w = 4, x = 75, y = \"data-height\", z = 30000, aa = 0, ba = false, ca, da, ea, fa, ga, ha = new j(), ia, ja = false, ka, la = Infinity, ma = 5, na = false, oa, pa, qa, ra, sa, ta, ua = false, va = [], wa;\n    function xa(ub, vb, wb) {\n        var xb = 0;\n        if (vb) {\n            xb += vb.getHeight();\n        }\n    ;\n    ;\n        if (((!cb() && !xb))) {\n            return;\n        }\n    ;\n    ;\n        ub -= xb;\n        var yb = 0;\n        for (var zb = 0; ((zb < wb)); zb++) {\n            yb += lb(zb);\n        ;\n        };\n    ;\n        if (vb) {\n            if (((ub < yb))) {\n                ub += vb.fold(((yb - ub)));\n            }\n             else if (((ub > yb))) {\n                ub -= vb.unfold(((ub - yb)));\n            }\n            \n        ;\n        }\n    ;\n    ;\n        return ub;\n    };\n;\n    function ya() {\n        var ub = da.cloneNode(true);\n        ub.id = \"\";\n        var vb = new j();\n        vb.init(i.scry(ub, \"div.ego_unit\"));\n        var wb = true;\n        vb.forEach(function(xb) {\n            if (wb) {\n                wb = false;\n            }\n             else i.remove(xb);\n        ;\n        ;\n        });\n        h.addClass(ub, \"fixed_elem\");\n        return ub;\n    };\n;\n    function za() {\n        ga = undefined;\n        if (!n.pageHasScrubber(ia)) {\n            db(ma);\n            gb();\n        }\n         else if (pa) {\n            eb(da, false);\n            var ub = qa;\n            ((qa && i.remove(qa)));\n            qa = ya();\n            if (ub) {\n                rb();\n            }\n        ;\n        ;\n            db(((((n.sidebarInitialized() && ja)) ? w : v)));\n            gb();\n            if (!ka) {\n                var vb = n.getCurrentScrubber();\n                if (vb) {\n                    qb(vb.getRoot(), vb.getOffset());\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            ((ka && ka.start()));\n        }\n         else tb.adjustAdsToFit();\n        \n    ;\n    ;\n    };\n;\n    function ab() {\n        if (qa) {\n            i.remove(qa);\n            qa = null;\n        }\n    ;\n    ;\n        if (ka) {\n            ka.JSBNG__stop();\n            ka = null;\n        }\n    ;\n    ;\n        if (cb()) {\n            h.conditionClass(da, \"fixed_elem\", !pa);\n            h.conditionClass(da, \"_22s\", !n.pageHasScrubber(ia));\n        }\n         else h.conditionClass(da, \"fixed_elem\", ((!pa && n.pageHasScrubber(ia))));\n    ;\n    ;\n    };\n;\n    function bb(ub) {\n        var vb = q.getViewportDimensions().y, wb = n.getCurrentScrubber(), xb = ((wb ? wb.getOffset() : m.SCRUBBER_DEFAULT_OFFSET)), yb = ((((vb - xb)) - x));\n        if (((wb || cb()))) {\n            return xa(yb, wb, ub);\n        }\n    ;\n    ;\n    };\n;\n    function cb() {\n        return n.fixedAds();\n    };\n;\n    function db(ub) {\n        fa = Math.min(ub, ha.getCount());\n        ha.forEach(function(vb, wb) {\n            eb(vb, ((wb >= fa)));\n        });\n        eb(da, ((fa === 0)));\n    };\n;\n    function eb(ub, vb) {\n        h.conditionClass(ub, \"_22r\", vb);\n        ub.setAttribute(\"aria-hidden\", ((vb ? \"true\" : \"false\")));\n    };\n;\n    function fb(ub) {\n        var vb = i.JSBNG__find(ha.getUnit(ub), \"div._4u8\"), wb = vb.getAttribute(\"data-ad\");\n        return JSON.parse(wb).adid;\n    };\n;\n    function gb() {\n        ib();\n        hb();\n    };\n;\n    function hb() {\n        var ub;\n        if (((ga !== undefined))) {\n            ub = ha.getHoldoutAdIDsForSpace(ga, mb);\n        }\n         else ub = ha.getHoldoutAdIDsForNumAds(fa);\n    ;\n    ;\n        if (ub) {\n            ub.forEach(jb);\n        }\n    ;\n    ;\n    };\n;\n    function ib() {\n        if (!ra) {\n            return;\n        }\n    ;\n    ;\n        for (var ub = ((fa - 1)); ((ub >= 0)); --ub) {\n            if (((((ka && ka.isFixed())) && ((((ub !== 0)) || ((qa && !h.shown(qa)))))))) {\n                continue;\n            }\n        ;\n        ;\n            var vb = fb(ub);\n            if (!ra[vb]) {\n                return;\n            }\n        ;\n        ;\n            jb(vb);\n        };\n    ;\n    };\n;\n    function jb(ub) {\n        if (!ra[ub]) {\n            return;\n        }\n    ;\n    ;\n        var vb = i.create(\"div\", {\n            src: p(\"/ai.php\").addQueryData({\n                aed: ra[ub]\n            }),\n            width: 0,\n            height: 0,\n            frameborder: 0,\n            scrolling: \"no\",\n            className: \"fbEmuTracking\"\n        });\n        vb.setAttribute(\"aria-hidden\", \"true\");\n        i.appendContent(da, vb);\n        delete ra[ub];\n    };\n;\n    function kb(ub) {\n        var vb = 0;\n        while (((((ub > 0)) && ((vb < ma))))) {\n            ub -= lb(vb);\n            if (((ub >= 0))) {\n                vb++;\n            }\n        ;\n        ;\n        };\n    ;\n        return vb;\n    };\n;\n    function lb(ub) {\n        var vb = ha.getUnit(ub);\n        if (!vb) {\n            return 0;\n        }\n    ;\n    ;\n        return mb(vb);\n    };\n;\n    function mb(ub) {\n        if (!ub.getAttribute(y)) {\n            nb(ub);\n        }\n    ;\n    ;\n        return parseInt(ub.getAttribute(y), 10);\n    };\n;\n    function nb(ub) {\n        ub.setAttribute(y, ub.offsetHeight);\n    };\n;\n    function ob() {\n        for (var ub = 0; ((ub < ha.getCount())); ub++) {\n            var vb = ha.getUnit(ub);\n            if (!vb) {\n                continue;\n            }\n        ;\n        ;\n            nb(vb);\n        };\n    ;\n    };\n;\n    function pb() {\n        var ub = i.scry(da, \"div.ego_unit\");\n        ha.init(ub);\n        var vb = ub.length;\n        if (!vb) {\n            return;\n        }\n    ;\n    ;\n        h.addClass(ha.getUnit(0), \"ego_unit_no_top_border\");\n        na = vb;\n        za();\n        var wb = function(xb) {\n            nb(xb);\n            na = --vb;\n            tb.adjustAdsToFit();\n            if (!na) {\n                la = JSBNG__Date.now();\n            }\n        ;\n        ;\n        };\n        ub.forEach(function(xb) {\n            function yb() {\n                wb.curry(xb).defer();\n            };\n        ;\n            var zb = i.scry(xb, \"img.img\")[0];\n            if (!zb) {\n                return;\n            }\n        ;\n        ;\n            if (zb.complete) {\n                yb();\n            }\n             else k.listen(zb, {\n                load: yb,\n                error: yb,\n                abort: yb\n            });\n        ;\n        ;\n        });\n    };\n;\n    function qb(ub, vb) {\n        ka = new l(ub, vb, function(wb) {\n            if (wb) {\n                rb();\n            }\n             else {\n                i.remove(qa);\n                gb();\n            }\n        ;\n        ;\n        });\n        if (qa) {\n            ka.start();\n        }\n    ;\n    ;\n    };\n;\n    function rb() {\n        i.insertAfter(da, qa);\n        sb();\n    };\n;\n    function sb() {\n        h.conditionShow(qa, ((((lb(0) <= bb(1))) && !h.hasClass(JSBNG__document.documentElement, \"tinyViewport\"))));\n    };\n;\n    var tb = {\n        init: function(ub, vb, wb) {\n            if (ba) {\n                return;\n            }\n        ;\n        ;\n            ma = wb.max_ads;\n            ca = wb.refresh_delay;\n            z = wb.refresh_threshold;\n            ba = true;\n            ea = vb;\n            da = ub;\n            tb.adjustAdsType(n.shouldShowWideAds());\n            sa = g.subscribe([\"UFI/CommentAddedActive\",\"UFI/CommentDeletedActive\",\"UFI/LikeActive\",\"Curation/Action\",\"ProfileBrowser/LoadMoreContent\",\"Ads/NewContentDisplayed\",], tb.loadAdsIfEnoughTimePassed);\n            ta = g.subscribe(\"TimelineSideAds/refresh\", tb.forceReloadAds);\n            wa = t(tb.loadAdsIfEnoughTimePassed, ca, this, true);\n            if (wb.mouse_move) {\n                va.push(k.listen(window, \"mousemove\", wa));\n                va.push(k.listen(window, \"JSBNG__scroll\", wa));\n                va.push(k.listen(window, \"resize\", wa));\n            }\n        ;\n        ;\n            n.register(n.ADS, tb);\n        },\n        setShortMode: function(ub) {\n            pa = ub;\n        },\n        start: function(ub) {\n            ra = ub;\n            oa = null;\n            pb();\n        },\n        updateCurrentKey: function(ub) {\n            if (((ub == ia))) {\n                return;\n            }\n        ;\n        ;\n            ia = ub;\n            ab();\n        },\n        loadAds: function(ub) {\n            if (((na || oa))) {\n                return;\n            }\n        ;\n        ;\n            la = Infinity;\n            oa = o.loadFromEndpoint(\"WebEgoPane\", da.id, {\n                pid: 33,\n                data: [ea,((\"timeline_\" + ub)),((pa ? w : ma)),++aa,false,]\n            }, {\n                crossPage: true,\n                bundle: false\n            });\n        },\n        registerScrubber: function(ub) {\n            if (pa) {\n                qb(ub.getRoot(), ub.getOffset());\n            }\n        ;\n        ;\n            ((!oa && tb.adjustAdsToFit()));\n        },\n        loadAdsIfEnoughTimePassed: function() {\n            if (((((((((z && ((((JSBNG__Date.now() - la)) >= z)))) && !h.hasClass(JSBNG__document.documentElement, \"tinyViewport\"))) && ((!ka || ka.isFixed())))) && ((!ra || !ra[fb(0)]))))) {\n                tb.loadAds(ia);\n            }\n        ;\n        ;\n            tb.adjustAdsToFit();\n        },\n        forceReloadAds: function() {\n            tb.loadAds(ia);\n        },\n        adjustAdsType: function(ub) {\n            if (((ub != ja))) {\n                h.conditionClass(da, \"_22q\", !ub);\n                h.conditionClass(da, \"_35q\", !ub);\n                ((qa && h.conditionClass(qa, \"_22q\", !ub)));\n                ((qa && h.conditionClass(qa, \"_35q\", !ub)));\n                ja = ub;\n                ob();\n                tb.adjustAdsToFit();\n                var vb = u(\"rightColContent\");\n                if (vb) {\n                    h.conditionClass(vb, \"fbTimelineWideRightCol\", ub);\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n        },\n        adjustAdsToFit: function() {\n            if (((!da || ua))) {\n                return;\n            }\n        ;\n        ;\n            ua = true;\n            var ub = ((ja ? w : v));\n            if (pa) {\n                if (((ka && qa))) {\n                    ka.handleScroll();\n                    if (ka.isFixed()) {\n                        h.conditionShow(qa, ((((lb(0) <= bb(1))) && !h.hasClass(JSBNG__document.documentElement, \"tinyViewport\"))));\n                    }\n                     else db(ub);\n                ;\n                ;\n                    gb();\n                }\n            ;\n            ;\n            }\n             else {\n                var vb = bb(ub);\n                if (((typeof vb !== \"undefined\"))) {\n                    ga = vb;\n                    db(kb(vb));\n                    if (!na) {\n                        gb();\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            ua = false;\n        },\n        reset: function() {\n            ((ka && ka.JSBNG__stop()));\n            ((oa && oa.cancel()));\n            ha = new j();\n            ja = false;\n            da = null;\n            ka = null;\n            oa = null;\n            aa = 0;\n            na = null;\n            pa = null;\n            qa = null;\n            ia = null;\n            la = Infinity;\n            ba = false;\n            ((sa && g.unsubscribe(sa)));\n            sa = null;\n            ((ta && g.unsubscribe(ta)));\n            ta = null;\n            va.forEach(function(ub) {\n                ub.remove();\n            });\n            va = [];\n            ((wa && wa.reset()));\n        }\n    };\n    e.exports = ((a.TimelineSideAds || tb));\n});\n__d(\"TimelineStickyHeader\", [\"Animation\",\"Arbiter\",\"Bootloader\",\"CSS\",\"DOM\",\"Style\",\"TimelineController\",\"TimelineURI\",\"Vector\",\"ViewportBounds\",\"$\",\"ge\",\"queryThenMutateDOM\",], function(a, b, c, d, e, f) {\n    var g = b(\"Animation\"), h = b(\"Arbiter\"), i = b(\"Bootloader\"), j = b(\"CSS\"), k = b(\"DOM\"), l = b(\"Style\"), m = b(\"TimelineController\"), n = b(\"TimelineURI\"), o = b(\"Vector\"), p = b(\"ViewportBounds\"), q = b(\"$\"), r = b(\"ge\"), s = b(\"queryThenMutateDOM\"), t = 200, u = false, v = false, w, x, y, z, aa, ba, ca = {\n    }, da = {\n        VISIBLE: \"TimelineStickyHeader/visible\",\n        ADJUST_WIDTH: \"TimelineStickyHeader/adjustWidth\",\n        init: function(ea) {\n            if (u) {\n                return;\n            }\n        ;\n        ;\n            u = true;\n            w = ea;\n            x = k.JSBNG__find(ea, \"div.JSBNG__name\");\n            y = k.JSBNG__find(ea, \"div.actions\");\n            v = j.hasClass(ea, \"fbTimelineStickyHeaderVisible\");\n            var fa = q(\"blueBar\"), ga, ha = false;\n            s(function() {\n                if (((((fa.offsetTop && !r(\"page_admin_panel\"))) && ((m.getCurrentKey() !== n.TIMELINE_KEY))))) {\n                    ga = o.getElementDimensions(fa).y;\n                    ha = true;\n                }\n            ;\n            ;\n            }, function() {\n                if (ha) {\n                    i.loadModules([\"StickyController\",], function(ia) {\n                        new ia(ea, ga).start();\n                    });\n                }\n                 else j.addClass(ea, \"fixed_elem\");\n            ;\n            ;\n                s(function() {\n                    aa = ea.offsetTop;\n                    ba = ea.scrollHeight;\n                }, function() {\n                    z = p.addTop(function() {\n                        return ((v ? ((aa + ba)) : 0));\n                    });\n                }, \"TimelineStickyHeader/init\");\n                m.register(m.STICKY_HEADER, da);\n            }, \"TimelineStickyHeader/init\");\n        },\n        reset: function() {\n            u = false;\n            v = false;\n            w = null;\n            x = null;\n            y = null;\n            ca = {\n            };\n            z.remove();\n            z = null;\n        },\n        toggle: function(ea) {\n            if (((ea !== v))) {\n                var fa = ((ea ? ((aa - ba)) : aa)), ga = ((ea ? aa : ((aa - ba))));\n                l.set(w, \"JSBNG__top\", ((fa + \"px\")));\n                j.addClass(w, \"fbTimelineStickyHeaderAnimating\");\n                var ha = k.getID(w);\n                ((ca[ha] && ca[ha].JSBNG__stop()));\n                ca[ha] = new g(w).from(\"JSBNG__top\", fa).to(\"JSBNG__top\", ga).duration(t).ondone(function() {\n                    ca[ha] = null;\n                    j.conditionClass(w, \"fbTimelineStickyHeaderHidden\", !ea);\n                    w.setAttribute(\"aria-hidden\", ((ea ? \"false\" : \"true\")));\n                    j.removeClass(w, \"fbTimelineStickyHeaderAnimating\");\n                    l.set(w, \"JSBNG__top\", \"\");\n                    h.inform(da.VISIBLE, ea);\n                }).go();\n                v = ea;\n            }\n        ;\n        ;\n        },\n        adjustWidth: function() {\n            h.inform(da.ADJUST_WIDTH, x, h.BEHAVIOR_STATE);\n        },\n        getRoot: function() {\n            return w;\n        },\n        setActions: function(ea) {\n            if (((u && ea))) {\n                k.setContent(y, ea);\n                y = ea;\n            }\n        ;\n        ;\n        }\n    };\n    e.exports = ((a.TimelineStickyHeader || da));\n});\n__d(\"ButtonGroup\", [\"function-extensions\",\"copyProperties\",\"createArrayFrom\",\"CSS\",\"DataStore\",\"Parent\",], function(a, b, c, d, e, f) {\n    b(\"function-extensions\");\n    var g = b(\"copyProperties\"), h = b(\"createArrayFrom\"), i = b(\"CSS\"), j = b(\"DataStore\"), k = b(\"Parent\"), l = \"firstItem\", m = \"lastItem\";\n    function n(s, t) {\n        var u = k.byClass(s, t);\n        if (!u) {\n            throw new Error(\"invalid use case\");\n        }\n    ;\n    ;\n        return u;\n    };\n;\n    function o(s) {\n        return ((i.shown(s) && h(s.childNodes).some(i.shown)));\n    };\n;\n    function p(s) {\n        var t, u, v;\n        h(s.childNodes).forEach(function(w) {\n            v = o(w);\n            i.removeClass(w, l);\n            i.removeClass(w, m);\n            i.conditionShow(w, v);\n            if (v) {\n                t = ((t || w));\n                u = w;\n            }\n        ;\n        ;\n        });\n        ((t && i.addClass(t, l)));\n        ((u && i.addClass(u, m)));\n        i.conditionShow(s, t);\n    };\n;\n    function q(s, t) {\n        var u = n(t, \"uiButtonGroupItem\");\n        s(u);\n        p(u.parentNode);\n    };\n;\n    function r(s) {\n        this._root = n(s, \"uiButtonGroup\");\n        j.set(this._root, \"ButtonGroup\", this);\n        p(this._root);\n    };\n;\n    r.getInstance = function(s) {\n        var t = n(s, \"uiButtonGroup\"), u = j.get(t, \"ButtonGroup\");\n        return ((u || new r(t)));\n    };\n    g(r.prototype, {\n        hideItem: q.curry(i.hide),\n        showItem: q.curry(i.show),\n        toggleItem: q.curry(i.toggle)\n    });\n    e.exports = r;\n});\n__d(\"TimelineStickyHeaderNav\", [\"JSBNG__Event\",\"function-extensions\",\"Arbiter\",\"ButtonGroup\",\"CSS\",\"DOM\",\"Parent\",\"SelectorDeprecated\",\"Style\",\"SubscriptionsHandler\",\"TimelineConstants\",\"TimelineController\",\"TimelineLegacySections\",\"URI\",\"UserAgent\",\"Vector\",\"ge\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\");\n    b(\"function-extensions\");\n    var h = b(\"Arbiter\"), i = b(\"ButtonGroup\"), j = b(\"CSS\"), k = b(\"DOM\"), l = b(\"Parent\"), m = b(\"SelectorDeprecated\"), n = b(\"Style\"), o = b(\"SubscriptionsHandler\"), p = b(\"TimelineConstants\"), q = b(\"TimelineController\"), r = b(\"TimelineLegacySections\"), s = b(\"URI\"), t = b(\"UserAgent\"), u = b(\"Vector\"), v = b(\"ge\"), w = b(\"tx\"), x = false, y, z, aa, ba, ca, da, ea, fa, ga, ha, ia, ja = {\n    }, ka = {\n    }, la = [], ma = false, na = [], oa = [], pa, qa = [\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\",];\n    function ra() {\n        var fb = m.getSelectorMenu(da);\n        pa.addSubscriptions(g.listen(fb, \"click\", sa), h.subscribe(p.SECTION_LOADED, wa));\n    };\n;\n    function sa(JSBNG__event) {\n        var fb = l.byTag(JSBNG__event.getTarget(), \"a\");\n        if (fb) {\n            var gb = fb.getAttribute(\"data-key\");\n            q.stickyHeaderNavWasClicked(gb);\n            q.navigateToSection(gb);\n            JSBNG__event.prevent();\n        }\n    ;\n    ;\n    };\n;\n    function ta(fb, gb) {\n        var hb = m.getValue(gb);\n        if (((hb === \"allStories\"))) {\n            r.get(fb).expandSubSections();\n        }\n    ;\n    ;\n        if (((hb !== \"activityLog\"))) {\n            ua(gb);\n        }\n    ;\n    ;\n    };\n;\n    function ua(fb) {\n        db(fb, \"highlights\");\n        db(fb, \"allStories\");\n        var gb = k.JSBNG__find(fb, \"li.separator\");\n        j.conditionShow(gb, gb.previousSibling);\n    };\n;\n    function va(fb) {\n        if (((ga[fb] && !z.custom_subsection_menu))) {\n            ab(fb);\n        }\n         else xa();\n    ;\n    ;\n        q.adjustStickyHeaderWidth();\n    };\n;\n    function wa(fb, gb) {\n        var hb = gb.key;\n        if (ha[hb]) {\n            bb(hb);\n            va(hb);\n        }\n    ;\n    ;\n    };\n;\n    function xa() {\n        ba.hideItem(ea);\n    };\n;\n    function ya(fb) {\n        var gb = fb.split(\"_\");\n        return qa[((gb.pop() - 1))];\n    };\n;\n    function za(fb) {\n        var gb = fa[fb], hb = ga[fb];\n        if (((!gb && hb))) {\n            gb = fa[fb] = ea.cloneNode(true);\n            var ib = k.scry(gb, \"li.activityLog a\")[0];\n            if (ib) {\n                ib.href = s(ib.href).addQueryData({\n                    key: fb\n                });\n            }\n        ;\n        ;\n            var jb = q.getCurrentScrubber();\n            if (hb.length) {\n                j.show(k.JSBNG__find(gb, \"li.separator\"));\n            }\n        ;\n        ;\n            for (var kb = 0; ((kb < hb.length)); kb++) {\n                var lb = hb[kb].scrubberKey, mb = ((jb ? jb.getLabelForSubnav(hb[kb].parentKey, lb) : mb = ya(lb)));\n                if (mb) {\n                    cb(gb, {\n                        key: lb,\n                        label: mb\n                    });\n                }\n            ;\n            ;\n            };\n        ;\n            pa.addSubscriptions(m.listen(gb, \"change\", ta.curry(fb, gb)), g.listen(gb, \"click\", sa));\n        }\n    ;\n    ;\n        return gb;\n    };\n;\n    function ab(fb) {\n        var gb = za(fb);\n        k.insertAfter(ea, gb);\n        j.hide(ea);\n        {\n            var fin286keys = ((window.top.JSBNG_Replay.forInKeys)((fa))), fin286i = (0);\n            var hb;\n            for (; (fin286i < fin286keys.length); (fin286i++)) {\n                ((hb) = (fin286keys[fin286i]));\n                {\n                    var ib = fa[hb];\n                    j.conditionShow(ib, ((ib === gb)));\n                };\n            };\n        };\n    ;\n        ba.showItem(ea);\n    };\n;\n    function bb(fb) {\n        ga[fb] = r.get(fb).subSections;\n    };\n;\n    function cb(fb, gb) {\n        var hb = k.create(\"a\", {\n            href: \"#\",\n            rel: \"ignore\",\n            className: \"itemAnchor\",\n            tabIndex: 0\n        }, k.create(\"span\", {\n            className: \"itemLabel fsm\"\n        }, gb.label));\n        hb.setAttribute(\"data-key\", gb.key);\n        hb.setAttribute(\"aria-checked\", false);\n        var ib = k.create(\"li\", {\n            className: \"uiMenuItem uiMenuItemRadio uiSelectorOption\"\n        }, hb);\n        ib.setAttribute(\"data-label\", gb.label);\n        var jb = k.JSBNG__find(fb, \"ul.uiMenuInner\"), kb = k.create(\"option\", {\n            value: gb.key\n        }, gb.label), lb = k.JSBNG__find(fb, \"select\");\n        if (((gb.key === \"recent\"))) {\n            k.prependContent(jb, ib);\n            k.insertAfter(lb.options[0], kb);\n        }\n         else {\n            k.appendContent(jb, ib);\n            k.appendContent(lb, kb);\n        }\n    ;\n    ;\n    };\n;\n    function db(fb, gb) {\n        var hb = k.scry(fb, \"li.uiMenuItem\");\n        if (!hb) {\n            return;\n        }\n    ;\n    ;\n        for (var ib = 0; ((ib < hb.length)); ib++) {\n            var jb = hb[ib];\n            if (((j.hasClass(jb, gb) || ((jb.firstChild.getAttribute(\"data-key\") == gb))))) {\n                k.remove(jb);\n                break;\n            }\n        ;\n        ;\n        };\n    ;\n        var kb = k.JSBNG__find(fb, \"select\"), lb = k.scry(kb, \"option\");\n        for (ib = 0; ((ib < lb.length)); ib++) {\n            if (((lb[ib].value === gb))) {\n                k.remove(lb[ib]);\n                return;\n            }\n        ;\n        ;\n        };\n    ;\n    };\n;\n    var eb = {\n        init: function(fb, gb) {\n            if (x) {\n                return;\n            }\n        ;\n        ;\n            x = true;\n            y = fb;\n            z = ((gb || {\n            }));\n            ca = k.JSBNG__find(y, \"div.pageMenu\");\n            da = k.JSBNG__find(y, \"div.sectionMenu\");\n            ea = k.JSBNG__find(y, \"div.subsectionMenu\");\n            ia = k.JSBNG__find(ca, \"li.uiMenuSeparator\");\n            ba = i.getInstance(ca);\n            pa = new o();\n            fa = {\n            };\n            ga = {\n            };\n            ha = {\n            };\n            eb.adjustMenuHeights();\n            ra();\n            q.register(q.STICKY_HEADER_NAV, eb);\n            oa.forEach(function(hb) {\n                hb();\n            });\n        },\n        reset: function() {\n            x = false;\n            z = {\n            };\n            la = [];\n            ja = {\n            };\n            ka = {\n            };\n            ma = false;\n            na = [];\n            y = null;\n            ca = null;\n            da = null;\n            ea = null;\n            ia = null;\n            fa = {\n            };\n            ga = {\n            };\n            ha = {\n            };\n            pa.release();\n        },\n        addTimePeriod: function(fb) {\n            var gb = q.getCurrentScrubber();\n            if (!gb) {\n                return;\n            }\n        ;\n        ;\n            var hb = gb.getLabelForNav(fb);\n            if (!hb) {\n                return;\n            }\n        ;\n        ;\n            cb(da, {\n                key: fb,\n                label: hb\n            });\n            var ib = k.JSBNG__find(da, \"ul.uiMenuInner\");\n            if (((((fb === \"recent\")) || ((ib.children.length < 2))))) {\n                m.setSelected(da, fb, true);\n            }\n        ;\n        ;\n        },\n        updateSection: function(fb, gb) {\n            if (gb) {\n                var hb = za(fb);\n                if (hb) {\n                    m.setSelected(hb, gb);\n                    ua(hb);\n                }\n                 else aa = fb;\n            ;\n            ;\n            }\n             else {\n                ha[fb] = true;\n                bb(fb);\n            }\n        ;\n        ;\n            m.setSelected(da, fb, true);\n            va(fb);\n        },\n        adjustMenuHeights: function() {\n            if (((t.ie() <= 7))) {\n                return;\n            }\n        ;\n        ;\n            [ca,da,].forEach(function(fb) {\n                var gb = \"\";\n                if (!j.hasClass(JSBNG__document.documentElement, \"tinyViewport\")) {\n                    gb = ((((u.getViewportDimensions().y - u.getElementDimensions(v(\"blueBar\")).y)) - 80));\n                    gb += \"px\";\n                }\n            ;\n            ;\n                n.set(k.JSBNG__find(fb, \"ul.uiMenuInner\"), \"maxHeight\", gb);\n            });\n        },\n        initPageMenu: function(fb, gb) {\n            if (!x) {\n                oa.push(eb.initPageMenu.curry(fb, gb));\n                return;\n            }\n        ;\n        ;\n            function hb(ib, jb) {\n                ib.forEach(function(kb) {\n                    var lb = ka[kb] = k.create(\"li\");\n                    j.hide(lb);\n                    ((jb ? k.insertBefore(ia, lb) : k.appendContent(k.JSBNG__find(ca, \"ul.uiMenuInner\"), lb)));\n                });\n            };\n        ;\n            hb(fb, true);\n            hb(gb, false);\n            ja.info = k.scry(ca, \"li\")[0];\n            la = gb;\n            ma = true;\n            if (na.length) {\n                na.forEach(function(ib) {\n                    eb.registerPageMenuItem(ib.key, ib.item);\n                });\n            }\n        ;\n        ;\n        },\n        registerPageMenuItem: function(fb, gb) {\n            if (!ma) {\n                na.push({\n                    key: fb,\n                    item: gb\n                });\n                return;\n            }\n        ;\n        ;\n            if (ka[fb]) {\n                k.replace(ka[fb], gb);\n                ja[fb] = gb;\n                delete ka[fb];\n                if (((la.indexOf(fb) >= 0))) {\n                    j.show(ia);\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n        },\n        removeTimePeriod: function(fb) {\n            db(da, fb);\n        }\n    };\n    e.exports = eb;\n});\n__d(\"TimelineSpinelessComposer\", [\"Arbiter\",\"Bootloader\",\"CSS\",\"DOM\",\"Parent\",\"Run\",\"TimelineComposer\",\"TimelineComposerUtilities\",\"csx\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"Bootloader\"), i = b(\"CSS\"), j = b(\"DOM\"), k = b(\"Parent\"), l = b(\"Run\"), m = b(\"TimelineComposer\"), n = b(\"TimelineComposerUtilities\"), o = b(\"csx\"), p = b(\"cx\"), q;\n    function r(w) {\n        if (((w.isScheduledPost || w.isOGPost))) {\n            return;\n        }\n    ;\n    ;\n        if (!w.streamStory) {\n            window.JSBNG__location.reload();\n            return;\n        }\n    ;\n    ;\n        if (w.backdatedTime) {\n            h.loadModules([\"TimelineStoryPublisher\",], function(x) {\n                x.publish(w);\n            });\n            return;\n        }\n    ;\n    ;\n        m.renderCapsuleBasedStory(q, w.streamStory);\n    };\n;\n    function s() {\n        return j.JSBNG__find(k.byClass(q, \"fbTimelineComposerCapsule\"), \"div._4s3\");\n    };\n;\n    function t(w) {\n        var x = u();\n        i.show(x);\n        var y = w.subscribe(\"hide\", function() {\n            i.hide(x);\n            w.unsubscribe(y);\n        });\n    };\n;\n    function u() {\n        var w = k.byClass(q, \"fbTimelineComposerCapsule\"), x = j.scry(w, \"div.composerVeil\");\n        if (((x.length !== 1))) {\n            x = j.appendContent(w, j.create(\"div\", {\n                className: \"composerVeil hidden_elem\"\n            }));\n        }\n    ;\n    ;\n        return x[0];\n    };\n;\n    var v = {\n        init: function(w) {\n            q = w;\n            var x = g.subscribe(\"composer/publish\", function(JSBNG__event, y) {\n                if (((y.composer_id === q.id))) {\n                    r(y);\n                }\n            ;\n            ;\n            });\n            l.onLeave(x.unsubscribe.bind(x));\n            if (i.hasClass(q, \"_mj\")) {\n                n.hidePlaceIfAttachmentsTooTall(q);\n            }\n             else n.hidePlaceIfAttachmentsTooTallOld(q);\n        ;\n        ;\n        },\n        showMLEFlyout: function(w) {\n            w.setContext(s()).show();\n            t(w);\n        }\n    };\n    e.exports = v;\n});\n__d(\"TimelineScrubber\", [\"JSBNG__Event\",\"CSS\",\"DOM\",\"Focus\",\"Keys\",\"Parent\",\"TimelineController\",\"Vector\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"CSS\"), i = b(\"DOM\"), j = b(\"Focus\"), k = b(\"Keys\"), l = b(\"Parent\"), m = b(\"TimelineController\"), n = b(\"Vector\"), o = b(\"copyProperties\");\n    function p(q) {\n        this._root = q;\n        this._navKeys = {\n        };\n        this._subNavKeys = {\n        };\n        this._rollups = {\n        };\n        this._rolledup = {\n        };\n        var r = q.childNodes;\n        this._currentNav = r[0];\n        for (var s = 0; ((s < r.length)); s++) {\n            var t = r[s].getAttribute(\"data-key\");\n            this._navKeys[t] = r[s];\n            var u = i.scry(r[s], \"ul\");\n            this._subNavKeys[t] = {\n            };\n            if (u.length) {\n                var v = u[0].childNodes;\n                for (var w = 0; ((w < v.length)); w++) {\n                    this._subNavKeys[t][v[w].getAttribute(\"data-key\")] = v[w];\n                ;\n                };\n            ;\n            }\n        ;\n        ;\n            var x = r[s].getAttribute(\"data-rollup\");\n            if (x) {\n                this._rollups[x] = ((this._rollups[x] || []));\n                this._rollups[x].push(r[s]);\n            }\n        ;\n        ;\n        };\n    ;\n        this._clickListener = g.listen(this._root, \"click\", this._handleScrub.bind(this));\n        this._focusHandler = g.listen(this._root, \"keydown\", this._moveFocus.bind(this));\n        this._tabbableElement = i.scry(this._root, \"a\")[0];\n        h.show(this._root);\n        var y = ((n.getViewportDimensions().y - this.SCRUBBER_NO_ADS_VERTICAL_BUFFER)), z = this.getHeight();\n        if (((z > y))) {\n            this.fold(((z - y)));\n        }\n    ;\n    ;\n        m.register(m.SCRUBBER, this);\n        m.scrubberHasLoaded(this);\n    };\n;\n    o(p.prototype, {\n        KEY_HEIGHT: 23,\n        SUBKEY_HEIGHT: 16,\n        OFFSET: 38,\n        SCRUBBER_NO_ADS_VERTICAL_BUFFER: 125,\n        reset: function() {\n            this._root = null;\n            this._navKeys = {\n            };\n            this._subNavKeys = {\n            };\n            this._rollups = {\n            };\n            this._rolledup = {\n            };\n        },\n        getRoot: function() {\n            return this._root;\n        },\n        getNav: function(q) {\n            return this._navKeys[q];\n        },\n        getSubnav: function(q, r) {\n            return this._subNavKeys[q][r];\n        },\n        getHeight: function() {\n            return this._root.offsetHeight;\n        },\n        getLabelForNav: function(q) {\n            var r = this.getNav(q);\n            return ((r && i.getText(i.scry(r, \"a\")[0])));\n        },\n        getLabelForSubnav: function(q, r) {\n            var s = this.getSubnav(q, r);\n            return ((s && i.getText(i.scry(s, \"a\")[0])));\n        },\n        fold: function(q) {\n            return this._adjustFolding(q, true);\n        },\n        unfold: function(q) {\n            return this._adjustFolding(q, false);\n        },\n        getOffset: function() {\n            return ((((this.OFFSET + ((h.hasClass(JSBNG__document.body, \"hasVoiceBar\") ? 26 : 0)))) + ((h.hasClass(\"rightColContent\", \"pagesTimelineRightColumn\") ? 48 : 0))));\n        },\n        updateSection: function(q, r) {\n            if (!this._navKeys[q]) {\n                return;\n            }\n        ;\n        ;\n            var s = this._navKeys[q].getAttribute(\"data-rollup\");\n            if (((this._currentRollup && ((this._currentRollup != s))))) {\n                h.removeClass(this._currentRollup, \"selected\");\n                h.removeClass(i.scry(this._currentRollup, \"ul\")[0], \"loaded\");\n                delete this._currentRollup;\n            }\n        ;\n        ;\n            if (((s && this._rolledup[s]))) {\n                var t = this._rolledup[s];\n                if (t.getAttribute(\"data-rollup\")) {\n                    this._currentRollup = t;\n                    h.addClass(this._currentRollup, \"selected\");\n                    h.addClass(i.scry(this._currentRollup, \"ul\")[0], \"loaded\");\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            ((this._currentNav && h.removeClass(this._currentNav, \"selected\")));\n            ((this._currentSubNav && h.removeClass(this._currentSubNav, \"selected\")));\n            this._currentNav = null;\n            this._currentSubNav = null;\n            if (this._navKeys[q]) {\n                this._currentNav = this._navKeys[q];\n                h.addClass(this._currentNav, \"selected\");\n                if (((this.decadesAreSelectable && this._navKeys[r]))) {\n                    this._currentSubNav = this._navKeys[r];\n                    h.addClass(this._currentSubNav, \"selected\");\n                }\n                 else if (((r && this._subNavKeys[q][r]))) {\n                    this._currentSubNav = this._subNavKeys[q][r];\n                    h.addClass(this._currentSubNav, \"selected\");\n                }\n                \n            ;\n            ;\n            }\n        ;\n        ;\n        },\n        _getRollupSize: function(q) {\n            var r = this._currentNav, s = ((r && r.getAttribute(\"data-rollup\"))), t = ((this.KEY_HEIGHT * ((this._rollups[q].length - 1))));\n            if (((q == s))) {\n                t += ((this.SUBKEY_HEIGHT * i.scry(r, \"li\").length));\n                t -= ((this.SUBKEY_HEIGHT * ((this._rollups[q].length - 1))));\n            }\n        ;\n        ;\n            return t;\n        },\n        _adjustFolding: function(q, r) {\n            var s = q, t = Object.keys(this._rollups);\n            while (((((q > 0)) && t.length))) {\n                var u = t[((r ? \"pop\" : \"shift\"))]();\n                if (((!r == !this._rolledup[u]))) {\n                    continue;\n                }\n            ;\n            ;\n                var v = this._getRollupSize(u);\n                if (((v <= 0))) {\n                    continue;\n                }\n            ;\n            ;\n                if (((!r && ((v > q))))) {\n                    break;\n                }\n            ;\n            ;\n                this[((r ? \"_collapseRollup\" : \"_expandRollup\"))](u);\n                q -= v;\n            };\n        ;\n            return ((s - q));\n        },\n        _collapseRollup: function(q) {\n            var r = this._rollups[q];\n            if (((((!r || ((r.length < 2)))) || this._rolledup[q]))) {\n                return;\n            }\n        ;\n        ;\n            var s = r[0].previousSibling, t = r[0], u = i.create(\"a\", {\n                href: t.firstChild.href,\n                rel: \"ignore\",\n                tabindex: \"-1\"\n            }, [q,]), v = i.create(\"ul\", {\n                className: \"clearfix\"\n            });\n            for (var w = 0; ((w < r.length)); w++) {\n                v.appendChild(r[w]);\n            ;\n            };\n        ;\n            var x = i.create(\"li\", null, [u,v,]);\n            if (this.decadesAreSelectable) {\n                var y = r[((r.length - 1))], z = ((t.getAttribute(\"data-key\") + y.getAttribute(\"data-key\")));\n                x.setAttribute(\"data-start\", y.getAttribute(\"data-start\"));\n                x.setAttribute(\"data-end\", t.getAttribute(\"data-end\"));\n                x.setAttribute(\"data-key\", z);\n                this._navKeys[z] = x;\n            }\n             else x.setAttribute(\"data-key\", t.getAttribute(\"data-key\"));\n        ;\n        ;\n            x.setAttribute(\"data-rollup\", q);\n            if (s) {\n                i.insertAfter(s, x);\n            }\n             else i.prependContent(this._root, x);\n        ;\n        ;\n            this._rolledup[q] = x;\n            this._checkSelection();\n            this._ensureFocusableElementIsVisible();\n        },\n        _expandRollup: function(q) {\n            if (!this._rolledup[q]) {\n                return;\n            }\n        ;\n        ;\n            var r = this._rolledup[q], s = i.scry(r, \"ul\")[0], t = JSBNG__document.createDocumentFragment();\n            while (s.childNodes.length) {\n                t.appendChild(s.firstChild);\n            ;\n            };\n        ;\n            i.replace(r, t);\n            this._rolledup[q] = false;\n            this._checkSelection();\n        },\n        _checkSelection: function() {\n            if (this._currentNav) {\n                var q = ((this._currentSubNav && this._currentSubNav.getAttribute(\"data-key\")));\n                this.updateSection(this._currentNav.getAttribute(\"data-key\"), q);\n            }\n        ;\n        ;\n        },\n        _handleScrub: function(JSBNG__event) {\n            var q = JSBNG__event.getModifiers();\n            if (((((JSBNG__event.isMiddleClick() || q.access)) || q.meta))) {\n                return true;\n            }\n        ;\n        ;\n            var r = l.byTag(JSBNG__event.getTarget(), \"a\"), s = ((r && l.byAttribute(r, \"data-key\")));\n            if (s) {\n                m.scrubberWasClicked(s.getAttribute(\"data-key\"));\n                m.navigateToSection(s.getAttribute(\"data-key\"));\n                return JSBNG__event.prevent();\n            }\n        ;\n        ;\n        },\n        _ensureFocusableElementIsVisible: function() {\n            while (!((this._tabbableElement.offsetHeight || this._tabbableElement.offsetWidth))) {\n                this._tabbableElement.tabIndex = -1;\n                var q = l.byTag(l.byTag(this._tabbableElement, \"li\"), \"li\");\n                this._tabbableElement = i.scry(q, \"a\")[0];\n                this._tabbableElement.tabIndex = 0;\n            };\n        ;\n        },\n        _moveFocus: function(JSBNG__event) {\n            if (JSBNG__event.getModifiers().any) {\n                return;\n            }\n        ;\n        ;\n            var q = g.getKeyCode(JSBNG__event);\n            if (((((q === k.UP)) || ((q === k.DOWN))))) {\n                var r = i.scry(this._root, \"a\").filter(function(u) {\n                    return ((u.offsetHeight || u.offsetWidth));\n                }), s = r.indexOf(this._tabbableElement);\n                if (((s != -1))) {\n                    var t = r[((s + ((((q === k.UP)) ? -1 : 1))))];\n                    if (t) {\n                        t.tabindex = 0;\n                        j.set(t);\n                        this._tabbableElement.tabindex = -1;\n                        this._tabbableElement = t;\n                        JSBNG__event.prevent();\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = p;\n});\n__d(\"TimelineMainScrubber\", [\"Arbiter\",\"Class\",\"CSS\",\"DOMQuery\",\"TimelineConstants\",\"TimelineController\",\"TimelineScrubber\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"Class\"), i = b(\"CSS\"), j = b(\"DOMQuery\"), k = b(\"TimelineConstants\"), l = b(\"TimelineController\"), m = b(\"TimelineScrubber\"), n = b(\"copyProperties\");\n    function o(p) {\n        this.parent.construct(this, p);\n        this._subscribe = g.subscribe(k.SECTION_LOADED, function(q, r) {\n            var s = this._navKeys[r.key], t = ((s && j.scry(s, \"ul\")[0]));\n            if (t) {\n                i.addClass(t, \"loaded\");\n                l.scrubberHasChangedState();\n                if (r.hideSubSections) {\n                    i.hide(t);\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n        }.bind(this));\n    };\n;\n    h.extend(o, m);\n    n(o.prototype, {\n        reset: function() {\n            this.parent.reset();\n            ((this._subscribe && this._subscribe.unsubscribe()));\n        }\n    });\n    e.exports = o;\n});\n__d(\"legacy:TimelineMainScrubber\", [\"TimelineMainScrubber\",], function(a, b, c, d) {\n    a.TimelineMainScrubber = b(\"TimelineMainScrubber\");\n}, 3);\n__d(\"legacy:TimelineCover\", [\"TimelineCover\",], function(a, b, c, d) {\n    a.TimelineCover = b(\"TimelineCover\");\n}, 3);\n__d(\"legacy:ui-scrolling-pager-js\", [\"ScrollingPager\",], function(a, b, c, d) {\n    a.ScrollingPager = b(\"ScrollingPager\");\n}, 3);\n__d(\"legacy:LegacyContextualDialog\", [\"LegacyContextualDialog\",], function(a, b, c, d) {\n    a.LegacyContextualDialog = b(\"LegacyContextualDialog\");\n}, 3);\n__d(\"ButtonGroupMonitor\", [\"ContextualDialog\",\"ContextualLayer\",\"CSS\",\"Layer\",\"Parent\",\"SelectorDeprecated\",], function(a, b, c, d, e, f) {\n    var g = b(\"ContextualDialog\"), h = b(\"ContextualLayer\"), i = b(\"CSS\"), j = b(\"Layer\"), k = b(\"Parent\"), l = b(\"SelectorDeprecated\");\n    function m(n) {\n        var o = ((k.byClass(n, \"bg_stat_elem\") || k.byClass(n, \"uiButtonGroup\")));\n        ((o && i.toggleClass(o, \"uiButtonGroupActive\")));\n    };\n;\n    j.subscribe([\"hide\",\"show\",], function(n, o) {\n        if (((((o instanceof h)) || ((o instanceof g))))) {\n            m(o.getCausalElement());\n        }\n    ;\n    ;\n    });\n    l.subscribe([\"close\",\"open\",], function(n, o) {\n        m(o.selector);\n    });\n});\n__d(\"SubMenu\", [\"JSBNG__Event\",\"Arbiter\",\"copyProperties\",\"CSS\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"Arbiter\"), i = b(\"copyProperties\"), j = b(\"CSS\");\n    function k() {\n    \n    };\n;\n    i(k.prototype, {\n        _subMenu: null,\n        _mainMenu: null,\n        _forward: null,\n        _backward: null,\n        init: function(l, m, n, o) {\n            this._subMenu = l;\n            this._mainMenu = m;\n            this._forward = n;\n            this._backward = o;\n            h.subscribe(\"SubMenu/Reset\", this._goToMainMenu.bind(this));\n            g.listen(n, \"click\", this._goToSubMenu.bind(this));\n            g.listen(o, \"click\", this._goToMainMenu.bind(this));\n        },\n        initAsyncChildMenu: function(l) {\n            g.listen(this._forward, \"click\", function() {\n                this._goToSubMenu();\n                l.load();\n            }.bind(this));\n        },\n        _goToMainMenu: function() {\n            j.hide(this._subMenu);\n            j.show(this._mainMenu);\n        },\n        _goToSubMenu: function() {\n            j.hide(this._mainMenu);\n            j.show(this._subMenu);\n        }\n    });\n    e.exports = k;\n});\n__d(\"legacy:ui-submenu\", [\"SubMenu\",], function(a, b, c, d) {\n    a.SubMenu = b(\"SubMenu\");\n}, 3);\n__d(\"AsyncMenu\", [\"AsyncRequest\",\"copyProperties\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = b(\"copyProperties\"), i = b(\"emptyFunction\");\n    function j(k, l) {\n        this._uri = k;\n        this._elem = l;\n    };\n;\n    h(j.prototype, {\n        _uri: null,\n        _elem: null,\n        load: function() {\n            this.load = i;\n            g.bootstrap(this._uri, this._elem);\n        }\n    });\n    e.exports = j;\n});");
// 19829
JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_190[0](o14,false,"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yJ/r/QYljgrU-Eo8.js",o77);
// undefined
o14 = null;
// undefined
o77 = null;
// 20728
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o7,"if (self.CavalryLogger) {\n    CavalryLogger.start_js([\"+h1d2\",]);\n}\n;\n__d(\"ImageUtils\", [\"UserAgent\",], function(a, b, c, d, e, f) {\n    var g = b(\"UserAgent\"), h = {\n        hasLoaded: function(i) {\n            if ((i.naturalWidth !== undefined)) {\n                return (i.complete && (i.width !== 0));\n            }\n             else if ((((i.height == 20) && (i.width == 20)) && i.complete)) {\n                return false;\n            }\n             else if (((i.complete === undefined) && (g.webkit() < 500))) {\n                var j = new Image();\n                j.src = i.src;\n                return j.complete;\n            }\n            \n            \n        ;\n            return i.complete;\n        }\n    };\n    e.exports = h;\n});\n__d(\"PhotoEverstoreLogger\", [\"Event\",\"AsyncRequest\",\"copyProperties\",\"ImageUtils\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"AsyncRequest\"), i = b(\"copyProperties\"), j = b(\"ImageUtils\"), k = {\n        BATCH_WINDOW_MS: 500,\n        storedLog: []\n    };\n    function l() {\n    \n    };\n    i(l, {\n        _log: function(n) {\n            k.storedLog.push(n);\n            if ((k.storedLog.length == 1)) {\n                setTimeout(m, k.BATCH_WINDOW_MS, false);\n            };\n        },\n        logImmediately: function(n) {\n            l._log(n);\n        },\n        registerForLogging: function(n) {\n            if (j.hasLoaded(n)) {\n                l._log(n.src);\n            }\n             else g.listen(n, \"load\", function(event) {\n                l._log(n.src);\n            });\n        ;\n        }\n    });\n    function m() {\n        var n = k.storedLog;\n        k.storedLog = [];\n        var o = JSON.stringify(n);\n        new h().setURI(\"/ajax/photos/logging/everstore_logging.php\").setData({\n            loggedUrls: o\n        }).setMethod(\"POST\").setOption(\"suppressErrorHandlerWarning\", true).setOption(\"suppressErrorAlerts\", true).send();\n    };\n    e.exports = l;\n});\n__d(\"PhotoSessionLog\", [\"AsyncRequest\",\"Run\",\"Vector\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = b(\"Run\"), i = b(\"Vector\"), j = b(\"copyProperties\");\n    function k() {\n    \n    };\n    j(k, {\n        UNKNOWN: 0,\n        ESC: 1,\n        X: 2,\n        OUTSIDE: 3,\n        UNLOAD: 4,\n        NAVIGATE: 5,\n        AGGREGATE: 6,\n        LEAVE: 7,\n        PERMALINK: 0,\n        SNOWLIFT: 6,\n        AGGREGATION_COUNT: 20,\n        set: null,\n        time: null,\n        views: 0,\n        fbidList: [],\n        details: {\n        },\n        width: 0,\n        height: 0,\n        first: false,\n        last: false,\n        logIds: false,\n        version: null,\n        source: null,\n        buttonLikes: 0,\n        pagingAction: \"\",\n        faceTagImpressions: 0,\n        cycle: false,\n        endOfRelevant: false,\n        relevantCount: 0,\n        initLogging: function(l) {\n            this.set = null;\n            this.time = new Date();\n            this.views = 0;\n            this.hiResLoads = 0;\n            this.fullScreenViews = {\n            };\n            this.first = true;\n            this.last = false;\n            this.logIds = false;\n            this.version = l;\n            this.buttonLikes = 0;\n            this.pagingAction = \"\";\n            this.faceTagImpressions = 0;\n            this.cycle = false;\n            this.endOfRelevant = false;\n            this.relevantCount = 0;\n            if ((l === k.SNOWLIFT)) {\n                var m = i.getViewportDimensions();\n                this.width = m.x;\n                this.height = m.y;\n            }\n        ;\n        },\n        setLogFbids: function(l) {\n            this.logIds = l;\n        },\n        setPhotoSet: function(l) {\n            this.set = l;\n        },\n        addButtonLike: function() {\n            this.buttonLikes++;\n        },\n        setPagingAction: function(l) {\n            this.pagingAction = l;\n        },\n        addFaceTagImpression: function() {\n            this.faceTagImpressions++;\n        },\n        setCycle: function(l) {\n            this.cycle = l;\n        },\n        setEndOfRelevant: function(l) {\n            this.endOfRelevant = l;\n        },\n        setRelevantCount: function(l) {\n            this.relevantCount = l;\n        },\n        setEndMetrics: function(l) {\n            this.endMetrics = l;\n        },\n        setSource: function(l) {\n            this.source = l;\n        },\n        addPhotoView: function(l, m, n) {\n            if ((this.logIds && (this.views >= this.AGGREGATION_COUNT))) {\n                this.logPhotoViews(this.AGGREGATE);\n            };\n            this.views++;\n            if (l) {\n                this.fbidList.push([l.fbid,l.owner,Date.now(),]);\n            };\n            if (m) {\n                this.hiResLoads++;\n            };\n            if (n) {\n                this.fullScreenViews[l.fbid] = true;\n            };\n        },\n        logEnterFullScreen: function(l) {\n            this.fullScreenViews[l] = true;\n        },\n        addDetailData: function(l, m) {\n            if (!this.details[l]) {\n                this.details[l] = {\n                    t: m.num_tags,\n                    l: m.has_location,\n                    c: m.has_caption,\n                    cm: m.comment_count,\n                    lk: m.like_count,\n                    w: m.width,\n                    h: m.height,\n                    ad: \"{}\",\n                    p: this.pagingAction\n                };\n            };\n        },\n        updateAdData: function(l, m) {\n            if (this.details[l]) {\n                this.details[l].ad = JSON.stringify(m);\n            };\n        },\n        logPhotoViews: function(l) {\n            if (((!this.views) || (((this.version === k.SNOWLIFT) && (l == k.LEAVE))))) {\n                return\n            };\n            if ((l != this.AGGREGATE)) {\n                this.last = true;\n            };\n            var m = {\n                set: this.set,\n                time: (new Date() - this.time),\n                fbids: (this.logIds ? this.fbidList : []),\n                details: (this.logIds ? this.details : {\n                }),\n                first: this.first,\n                last: this.last,\n                close: (l ? l : this.UNKNOWN),\n                button_likes: this.buttonLikes,\n                version: this.version,\n                face_imp: this.faceTagImpressions,\n                endmetric: this.endMetrics,\n                cycle: this.cycle,\n                end_relev: this.endOfRelevant,\n                relev_count: this.relevantCount,\n                source: this.source\n            };\n            if ((this.version === k.SNOWLIFT)) {\n                var n = i.getViewportDimensions();\n                m.width = (n.x || this.width);\n                m.height = (n.y || this.height);\n                if ((this.hiResLoads > 0)) {\n                    m.hires_loads = this.hiResLoads;\n                };\n                if (this.last) {\n                    var o = Object.keys(this.fullScreenViews).length;\n                    if ((o > 0)) {\n                        m.fullscreen = o;\n                    };\n                }\n            ;\n            }\n        ;\n            new g().setURI(\"/ajax/photos/logging/session_logging.php\").setAllowCrossPageTransition(true).setOption(\"asynchronous\", ((l != k.UNLOAD))).setOption(\"suppressErrorHandlerWarning\", true).setData(m).send();\n            this.views = 0;\n            this.hiResLoads = 0;\n            this.fbidList = [];\n            this.details = {\n            };\n            this.first = false;\n            this.buttonLikes = 0;\n            if (this.last) {\n                this.set = null;\n                this.logIds = false;\n                this.fullScreenViews = {\n                };\n            }\n        ;\n        }\n    });\n    h.onUnload(function() {\n        k.logPhotoViews(k.UNLOAD);\n    });\n    h.onLeave(function() {\n        k.logPhotoViews(k.LEAVE);\n    });\n    e.exports = k;\n});\n__d(\"PhotoViewerImage\", [\"PhotoEverstoreLogger\",\"URI\",\"Vector\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"PhotoEverstoreLogger\"), h = b(\"URI\"), i = b(\"Vector\"), j = b(\"copyProperties\");\n    function k(l) {\n        this._hiResDimensions = (l.hiResDimensions && i.deserialize(l.hiResDimensions));\n        this._normalDimensions = (l.normalDimensions && i.deserialize(l.normalDimensions));\n        this._info = l.info;\n        this._video = l.video;\n        this._shouldLog = l.everstoreLogThis;\n        this._hiResSrc = l.hiResSrc;\n        this._normalSrc = l.normalSrc;\n        this._thumbSrc = l.thumbSrc;\n        this._isInverted = false;\n        this._data = l;\n    };\n    j(k.prototype, {\n        getURIString: function() {\n            return h(this._info.permalink).getUnqualifiedURI().toString();\n        },\n        hasHiResDimensions: function() {\n            return !!this._hiResDimensions;\n        },\n        getHiResDimensions: function() {\n            return this._hiResDimensions;\n        },\n        getNormalDimensions: function() {\n            return this._normalDimensions;\n        },\n        getHiResSrc: function() {\n            return this._hiResSrc;\n        },\n        getNormalSrc: function() {\n            return this._normalSrc;\n        },\n        getThumbSrc: function() {\n            return this._thumbSrc;\n        },\n        getInfo: function() {\n            return this._info;\n        },\n        getPermalink: function() {\n            return this._info.permalink;\n        },\n        getHighestResSrc: function() {\n            return (this._hiResSrc || this._normalSrc);\n        },\n        preload: function(l) {\n            if (this.getHighestResSrc()) {\n                if ((l && !this._resource)) {\n                    this._resource = new Image();\n                    this._resource.src = this.getHighestResSrc();\n                    if (this._shouldLog) {\n                        g.logImmediately(this._resource.src);\n                    };\n                }\n                 else if ((!l && !this._small)) {\n                    this._small = new Image();\n                    this._small.src = (this._normalSrc || this._hiResSrc);\n                    if (this._shouldLog) {\n                        g.logImmediately(this._small.src);\n                    };\n                }\n                \n            \n            };\n        },\n        setDimensions: function(l, m) {\n            this.widthRatio = (l / this._hiResDimensions.x);\n            this.heightRatio = (m / this._hiResDimensions.y);\n            this._hiResDimensions = this._hiResDimensions.mul(this.widthRatio, this.heightRatio);\n            this._normalDimensions = this._normalDimensions.mul(this.widthRatio, this.heightRatio);\n        },\n        invertDimensions: function() {\n            this._hiResDimensions = new i(this._hiResDimensions.y, this._hiResDimensions.x);\n            this._normalDimensions = new i(this._normalDimensions.y, this._normalDimensions.x);\n            this._isInverted = !this._isInverted;\n        },\n        copy: function() {\n            return new k(this._data);\n        }\n    });\n    e.exports = k;\n});\n__d(\"PhotosConst\", [], function(a, b, c, d, e, f) {\n    var g = {\n        VIEWER_PERMALINK: 0,\n        VIEWER_SNOWLIFT: 6,\n        VIEWER_VAULTBOX: 8,\n        BULK_EDITOR: 3,\n        FLASH_UPLOADER: 4,\n        HTML5_UPLOADER: 10,\n        SIZE_NORMAL: \"n\",\n        PIC_NORMAL_FBX_SIZE: 180\n    };\n    e.exports = g;\n});\n__d(\"PhotosUtils\", [\"copyProperties\",\"Vector\",], function(a, b, c, d, e, f) {\n    var g = b(\"copyProperties\"), h = b(\"Vector\");\n    function i() {\n    \n    };\n    g(i, {\n        getNearestBox: function(j, k) {\n            var l = Infinity, m = null;\n            for (var n in j) {\n                var o = j[n];\n                if (o.contains(k)) {\n                    var p = k.distanceTo(o.getCenter());\n                    if ((p < l)) {\n                        l = p;\n                        m = n;\n                    }\n                ;\n                }\n            ;\n            };\n            return m;\n        },\n        absoluteToNormalizedPosition: function(j, k) {\n            var l = h.getElementPosition(j), m = h.getElementDimensions(j), n = k.sub(l).mul((100 / m.x), (100 / m.y));\n            n.domain = \"pure\";\n            return n;\n        },\n        normalizedToAbsolutePosition: function(j, k) {\n            var l = h.getElementPosition(j), m = h.getElementDimensions(j), n = k.mul((m.x / 100), (m.y / 100)).add(l);\n            n.domain = \"document\";\n            return n;\n        },\n        isFacebox: function(j) {\n            return j.match(/^face:/);\n        }\n    });\n    e.exports = i;\n});\n__d(\"PhotoStreamCache\", [\"DOM\",\"HTML\",\"PhotosConst\",\"PhotoEverstoreLogger\",\"PhotoViewerImage\",\"Rect\",\"UIPagelet\",\"URI\",\"Vector\",\"copyProperties\",\"createArrayFrom\",\"ge\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOM\"), h = b(\"HTML\"), i = b(\"PhotosConst\"), j = b(\"PhotoEverstoreLogger\"), k = b(\"PhotoViewerImage\"), l = b(\"Rect\"), m = b(\"UIPagelet\"), n = b(\"URI\"), o = b(\"Vector\"), p = b(\"copyProperties\"), q = b(\"createArrayFrom\"), r = b(\"ge\");\n    function s() {\n    \n    };\n    p(s, {\n        ERROR: \"error\",\n        HTML: \"html\",\n        IMAGE_DATA: \"image\",\n        EXTRA: \"extra\",\n        BUFFER_SIZE: 3,\n        INIT_BUCKET_SIZE: 4,\n        FULL_BUCKET_SIZE: 12,\n        ERROR_ID: -1,\n        INIT_PLACEHOLDER: 1\n    });\n    p(s.prototype, {\n        init: function(t, u, v) {\n            this.version = t;\n            this.pageletName = u;\n            this.pageletRootID = v;\n            this.bufferSize = s.BUFFER_SIZE;\n            this.fullBucketSize = s.FULL_BUCKET_SIZE;\n            this.initError = false;\n            this.isActive = true;\n            this.leftLock = false;\n            this.rightLock = false;\n            this.useAjaxPipe = true;\n            this.reset();\n        },\n        setUseAjaxPipe: function(t) {\n            this.useAjaxPipe = t;\n        },\n        reset: function() {\n            this.cache = {\n                image: {\n                },\n                extra: {\n                },\n                html: {\n                }\n            };\n            this.fbidList = [];\n            this.loaded = false;\n            this.allLoaded = false;\n            this.permalinkMap = {\n            };\n            this.position = 0;\n            this.totalCount = null;\n            this.firstCursor = null;\n            this.firstCursorIndex = null;\n        },\n        waitForInitData: function() {\n            this.fbidList.push(s.INIT_PLACEHOLDER);\n        },\n        destroy: function() {\n            this.reset();\n            this.isActive = false;\n        },\n        isLoaded: function() {\n            return this.loaded;\n        },\n        canPage: function() {\n            if (!this.isLoaded()) {\n                return false\n            };\n            if ((this.totalCount !== null)) {\n                return (this.totalCount > 1)\n            };\n            return (this.getLength() > 1);\n        },\n        errorInCurrent: function() {\n            if (this.initError) {\n                return true;\n            }\n             else if (!this.isLoaded()) {\n                return false\n            }\n        ;\n            return this.checkErrorAt(this.getCursor());\n        },\n        getLength: function() {\n            return this.fbidList.length;\n        },\n        getPhotoSet: function() {\n            return this.photoSetQuery.set;\n        },\n        getPhotoSetQuery: function() {\n            return this.photoSetQuery;\n        },\n        getCurrentImageData: function() {\n            return this.getImageData(this.getCursor());\n        },\n        getImageData: function(t) {\n            return this.getCacheContent(t, s.IMAGE_DATA);\n        },\n        getCurrentHtml: function() {\n            return this.getCacheContent(this.getCursor(), s.HTML);\n        },\n        getCurrentExtraData: function() {\n            return this.getCacheContent(this.getCursor(), s.EXTRA);\n        },\n        getCacheContent: function(t, u) {\n            if (((!t || (t === s.ERROR_ID)) || (t === s.INIT_PLACEHOLDER))) {\n                return null\n            };\n            return this.cache[u][t];\n        },\n        getCursorPos: function() {\n            return this.position;\n        },\n        getCursor: function() {\n            if (((this.position >= 0) && (this.position < this.getLength()))) {\n                return this.fbidList[this.position]\n            };\n            return null;\n        },\n        getCursorForURI: function(t) {\n            return this.permalinkMap[t];\n        },\n        calculatePositionForMovement: function(t) {\n            var u = (this.position + t);\n            if (this.allLoaded) {\n                var v = this.getLength();\n                u = (((v + (u % v))) % v);\n            }\n        ;\n            return u;\n        },\n        isValidMovement: function(t) {\n            if ((!this.isLoaded() || !this.canPage())) {\n                return false\n            };\n            var u = this.calculatePositionForMovement(t);\n            return ((this.getCursor() > 0) || (((u >= 0) && (u < this.getLength()))));\n        },\n        moveCursor: function(t) {\n            if (!this.isValidMovement(t)) {\n                return\n            };\n            this.position = this.calculatePositionForMovement(t);\n            if ((t !== 0)) {\n                this.loadMoreIfNeccessary((t > 0));\n            };\n        },\n        checkErrorAt: function(t) {\n            if (!this.isLoaded()) {\n                return false\n            };\n            if ((t === s.ERROR_ID)) {\n                return true\n            };\n            return false;\n        },\n        getRelativeMovement: function(t) {\n            for (var u = 0; (u < this.getLength()); u++) {\n                if ((this.fbidList[u] == t)) {\n                    return (u - this.position)\n                };\n            };\n            return null;\n        },\n        preloadImages: function(t) {\n            var u, v, w = this.getLength(), x = this.cache.image, y = s.BUFFER_SIZE;\n            if ((w > (y * 2))) {\n                u = ((((this.position + w) - (y % w))) % w);\n                v = (((this.position + y)) % w);\n            }\n             else {\n                u = 0;\n                v = (w - 1);\n            }\n        ;\n            while ((u != v)) {\n                var z = this.fbidList[u];\n                if ((this.version === i.VIEWER_VAULTBOX)) {\n                    (x[z] && x[z].preload(t));\n                }\n                 else if ((x[z] && x[z].url)) {\n                    if ((t && !x[z].resource)) {\n                        x[z].resource = new Image();\n                        x[z].resource.src = x[z].url;\n                        if ((x[z].everstoreLogThis === true)) {\n                            j.logImmediately(x[z].resource.src);\n                        };\n                    }\n                     else if ((!t && !x[z].small)) {\n                        x[z].small = new Image();\n                        x[z].small.src = (x[z].smallurl || x[z].url);\n                        if ((x[z].everstoreLogThis === true)) {\n                            j.logImmediately(x[z].small.src);\n                        };\n                    }\n                    \n                \n                }\n            ;\n                u = (((u + 1)) % w);\n            };\n        },\n        loadMoreIfNeccessary: function(t) {\n            if (((this.allLoaded || ((t && this.rightLock))) || ((!t && this.leftLock)))) {\n                return\n            };\n            var u = (t ? 1 : -1), v = (this.position + (this.bufferSize * u));\n            if (((v < 0) && !this.checkErrorAt(this.getEndCursor(false)))) {\n                this.leftLock = true;\n                this.fetch(this.fullBucketSize, false);\n            }\n             else if (((v > this.getLength()) && !this.checkErrorAt(this.getEndCursor(true)))) {\n                this.rightLock = true;\n                this.fetch(this.fullBucketSize, true);\n            }\n            \n        ;\n        },\n        getEndCursor: function(t) {\n            return (t ? this.fbidList[(this.getLength() - 1)] : this.fbidList[0]);\n        },\n        calculateRelativeIndex: function(t, u, v) {\n            if (!this.totalCount) {\n                return null\n            };\n            var w = this.fbidList.indexOf(u), x = this.fbidList.indexOf(v);\n            if (((w === -1) || (x === -1))) {\n                return null\n            };\n            var y = (x - w);\n            return ((((t + y) + this.totalCount)) % this.totalCount);\n        },\n        calculateDistance: function(t, u) {\n            var v = this.fbidList.indexOf(t), w = this.fbidList.indexOf(u);\n            if (((v === -1) || (w === -1))) {\n                return null\n            };\n            return ((((w - v) + this.getLength())) % this.getLength());\n        },\n        fetch: function(t, u) {\n            var v = this.getEndCursor(u), w = p({\n                cursor: v,\n                version: this.version,\n                end: this.getEndCursor(!u),\n                fetchSize: (u ? t : (-1 * t)),\n                relevant_count: this.relevantCount\n            }, this.photoSetQuery);\n            if ((this.totalCount && (this.firstCursorIndex !== null))) {\n                w.total = this.totalCount;\n                w.cursorIndex = this.calculateRelativeIndex(this.firstCursorIndex, this.firstCursor, v);\n            }\n        ;\n            var x = r(this.pageletRootID);\n            if (!x) {\n                x = g.create(\"div\", {\n                    id: this.pageletRootID\n                });\n                g.appendContent(document.body, x);\n            }\n        ;\n            m.loadFromEndpoint(this.pageletName, x, w, {\n                usePipe: this.useAjaxPipe,\n                automatic: true,\n                jsNonblock: true,\n                crossPage: true\n            });\n            if (!this.useAjaxPipe) {\n                this.setUseAjaxPipe(true);\n            };\n        },\n        storeToCache: function(t) {\n            var u = {\n            };\n            if (!this.isActive) {\n                return u\n            };\n            if ((\"error\" in t)) {\n                this.processErrorResult(t.error);\n                u.error = true;\n                return u;\n            }\n        ;\n            if ((\"init\" in t)) {\n                this.processInitResult(t.init);\n                u.init = {\n                    logids: t.init.logids,\n                    fbid: t.init.fbid,\n                    loggedin: t.init.loggedin,\n                    fromad: t.init.fromad,\n                    disablesessionads: t.init.disablesessionads,\n                    flashtags: t.init.flashtags\n                };\n            }\n        ;\n            if ((\"image\" in t)) {\n                this.processImageResult(t.image);\n                u.image = true;\n            }\n        ;\n            if ((\"data\" in t)) {\n                this.processDataResult(t.data);\n                u.data = true;\n            }\n        ;\n            return u;\n        },\n        processInitResult: function(t) {\n            if (this.loaded) {\n                return\n            };\n            this.loaded = true;\n            this.photoSetQuery = t.query;\n            if (t.bufferSize) {\n                this.bufferSize = t.bufferSize;\n            };\n            if (t.fullBucketSize) {\n                this.fullBucketSize = t.fullBucketSize;\n            };\n            if ((this.fbidList.length === 0)) {\n                this.fbidList.push(t.fbid);\n                this.rightLock = true;\n            }\n             else {\n                var u = this.fbidList.indexOf(s.INIT_PLACEHOLDER);\n                if ((u != -1)) {\n                    this.fbidList[u] = t.fbid;\n                };\n            }\n        ;\n            this.firstCursor = t.fbid;\n            if (((\"initIndex\" in t) && (\"totalCount\" in t))) {\n                this.firstCursorIndex = t.initIndex;\n                this.totalCount = t.totalCount;\n            }\n        ;\n            if ((this.version == i.VIEWER_PERMALINK)) {\n                this.fetch(s.INIT_BUCKET_SIZE, true);\n            };\n        },\n        processImageResult: function(t) {\n            for (var u in t) {\n                if (((u === this.firstCursor) && t[u].everstoreLogThis)) {\n                    j.logImmediately(t[u].url);\n                };\n                if ((this.version === i.VIEWER_VAULTBOX)) {\n                    var v = t[u];\n                    this.cache.image[u] = new k(v);\n                    this.permalinkMap[this.cache.image[u].getURIString()] = u;\n                }\n                 else {\n                    this.cache.image[u] = t[u];\n                    if (t[u].dimensions) {\n                        this.cache.image[u].dimensions = o.deserialize(t[u].dimensions);\n                    };\n                    if (t[u].smalldims) {\n                        this.cache.image[u].smalldims = o.deserialize(t[u].smalldims);\n                    };\n                    this.permalinkMap[n(t[u].info.permalink).getUnqualifiedURI().toString()] = u;\n                }\n            ;\n            };\n        },\n        attachToFbidsList: function(t, u, v) {\n            if (this.allLoaded) {\n                return\n            };\n            if ((u === -1)) {\n                for (var w = (t.length - 1); (w >= 0); w--) {\n                    this.fbidList.unshift(t[w]);\n                    this.position++;\n                };\n                this.leftLock = false;\n            }\n             else {\n                for (var x = 0; (x < t.length); x++) {\n                    this.fbidList.push(t[x]);;\n                };\n                this.rightLock = false;\n            }\n        ;\n            if (v) {\n                this.setAllLoaded();\n            };\n        },\n        setAllLoaded: function() {\n            this.allLoaded = true;\n            if ((this.getCursor() === null)) {\n                this.position = this.calculatePositionForMovement(0);\n            };\n        },\n        processDataResult: function(t) {\n            for (var u in t) {\n                if (!this.cache.html[u]) {\n                    this.cache.html[u] = {\n                    };\n                };\n                for (var v in t[u].html) {\n                    var w = t[u].html[v];\n                    if ((typeof w === \"string\")) {\n                        w = h(w).getRootNode();\n                    };\n                    this.cache.html[u][v] = q(w.childNodes);\n                };\n                if (!((\"extra\" in t[u]))) {\n                    this.cache.extra[u] = null;\n                    continue;\n                }\n            ;\n                this.cache.extra[u] = {\n                    tagRects: {\n                    }\n                };\n                if (!Array.isArray(t[u].extra.tagRects)) {\n                    for (var x in t[u].extra.tagRects) {\n                        if (t[u].extra.tagRects[x]) {\n                            this.cache.extra[u].tagRects[x] = l.deserialize(t[u].extra.tagRects[x]);\n                        };\n                    }\n                };\n                Object.keys(t[u].extra).forEach(function(y) {\n                    if ((y == \"tagRects\")) {\n                        return\n                    };\n                    this.cache.extra[u][y] = t[u].extra[y];\n                }.bind(this));\n            };\n        },\n        processErrorResult: function(t) {\n            if (!this.isLoaded()) {\n                this.initError = true;\n                return;\n            }\n        ;\n            var u = t.side, v = [s.ERROR_ID,];\n            this.attachToFbidsList(v, u);\n        },\n        setTotalCount: function(t) {\n            this.totalCount = t;\n        },\n        setFirstCursorIndex: function(t) {\n            this.firstCursorIndex = t;\n        }\n    });\n    e.exports = s;\n});\n__d(\"PhotoSnowliftAds\", [\"Event\",\"copyProperties\",\"CSS\",\"csx\",\"DataStore\",\"DOM\",\"PhotoSessionLog\",\"UIPagelet\",\"URI\",\"Vector\",\"extendArray\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"copyProperties\"), i = b(\"CSS\"), j = b(\"csx\"), k = b(\"DataStore\"), l = b(\"DOM\"), m = b(\"PhotoSessionLog\"), n = b(\"UIPagelet\"), o = b(\"URI\"), p = b(\"Vector\"), q = b(\"extendArray\"), r = {\n        DEFAULT_UNITS_REFRESH_RATE: 30000,\n        UNITS_REGISTER_DELAY: 1000,\n        root: null,\n        availableDimensions: null,\n        loadQuery: null,\n        lastLoadTime: 0,\n        minAds: 100,\n        units: null,\n        isLogAdData: null,\n        displayedCallback: null,\n        refreshUnitsRate: null,\n        position: null,\n        adsStatus: \"null\",\n        adsEvents: {\n        },\n        snowliftRedesign: false,\n        resetEvents: function() {\n            this.adsStatus = \"reset\";\n            this.adsEvents = {\n            };\n        },\n        addEvent: function(s, t) {\n            if (t) {\n                this.adsStatus = s;\n            };\n            var u = Date.now();\n            this.adsEvents[((s + \"_\") + u)] = u;\n        },\n        init: function(s, t, u, v) {\n            this.reset();\n            this.root = s;\n            this.snowlift = t;\n            this.minAds = u.min_ads;\n            this.displayedCallback = v;\n            this.addEvent(\"init\", true);\n            this.snowliftRedesign = u.snowlift_redesign;\n            this.refreshUnitsRate = r.DEFAULT_UNITS_REFRESH_RATE;\n            if (u.refresh_fast) {\n                this.refreshUnitsRate = u.refresh_rate;\n            };\n        },\n        reset: function() {\n            this.lastLoadTime = 0;\n            this.position = 0;\n            this.units = [];\n            this.resetEvents();\n            this.addEvent(\"reset\", true);\n        },\n        resize: function(s) {\n            this.availableDimensions = s;\n            this.loadQuery = this.snowlift.getLoadQuery();\n            this.processResize();\n        },\n        calculateUnitSizes: function(s, t, u) {\n            var v = {\n            };\n            s.forEach(function(w) {\n                var x = w.root.firstChild.offsetHeight;\n                w.units.forEach(function(z) {\n                    if ((!i.hasClass(z, \"hidden\") && !((this.getIsAds(z) && this.getIsHoldout(z))))) {\n                        var aa = this.getHeight(z.firstChild, t);\n                        x -= aa;\n                    }\n                ;\n                }.bind(this));\n                var y = {\n                    height: x,\n                    visible: false\n                };\n                w.units.forEach(function(z) {\n                    var aa = this.getIsAds(z), ba = this.getHeight(z.firstChild, t), ca = this.getUnitId(z), da = (aa && this.getIsHoldout(z));\n                    if ((da && u)) {\n                        return\n                    };\n                    v[ca] = {\n                        height: ba,\n                        visible: false,\n                        priority: 0,\n                        is_ads: aa,\n                        is_holdout: da,\n                        section_ref: y\n                    };\n                }.bind(this));\n            }.bind(this));\n            return v;\n        },\n        calculateVisibleUnits: function(s, t, u) {\n            var v = 0, w = this.getUnitPriority(t);\n            w.forEach(function(x) {\n                if (t.hasOwnProperty(x)) {\n                    var y = t[x], z = y.height;\n                    if (!y.section_ref.visible) {\n                        z += y.section_ref.height;\n                    };\n                    y.height_below = (u - z);\n                    y.visible = ((y.height_below >= 0) && (z > 0));\n                    if (y.visible) {\n                        y.section_ref.visible = true;\n                        u -= z;\n                        v++;\n                    }\n                ;\n                }\n            ;\n            }.bind(this));\n            return t;\n        },\n        displayUnits: function(s, t) {\n            s.forEach(function(u) {\n                var v = false, w = true;\n                u.units.forEach(function(x) {\n                    var y = this.getUnitId(x), z = t[y];\n                    if (!z) {\n                        return\n                    };\n                    var aa = z.visible, ba = z.height_below, ca = z.is_ads;\n                    i.conditionClass(x, \"hidden\", !aa);\n                    if (((ca && aa) && w)) {\n                        var da = l.find(x, \"div.ego_unit\");\n                        i.addClass(da, \"ego_unit_no_top_border\");\n                        w = false;\n                    }\n                ;\n                    v = (v || aa);\n                    this.calcUnitStats(this.units[ca][y], aa, ba);\n                }.bind(this));\n                i.conditionClass(u.root, \"hidden\", !v);\n            }.bind(this));\n        },\n        getUnitsDisplayed: function(s, t) {\n            var u = 0;\n            s.forEach(function(v) {\n                v.units.forEach(function(w) {\n                    var x = this.getUnitId(w), y = t[x];\n                    if ((!y || !y.visible)) {\n                        return\n                    };\n                    u++;\n                }.bind(this));\n            }.bind(this));\n            return u;\n        },\n        getHeightsRequired: function(s, t) {\n            var u = 0, v = [];\n            s.forEach(function(w) {\n                var x = false;\n                w.units.forEach(function(y) {\n                    var z = this.getUnitId(y), aa = t[z];\n                    if (!aa) {\n                        return\n                    };\n                    u += aa.height;\n                    if (!x) {\n                        u += aa.section_ref.height;\n                        x = true;\n                    }\n                ;\n                    v.push(u);\n                }.bind(this));\n            }.bind(this));\n            return v;\n        },\n        getUnitPriority: function(s) {\n            var t = [], u = 0, v = 0;\n            for (var w in s) {\n                var x = s[w];\n                t.push(w);\n                var y = ((this.minAds + u) + v);\n                if (x.is_ads) {\n                    if ((v < this.minAds)) {\n                        y = v;\n                    };\n                    v++;\n                }\n                 else u++;\n            ;\n                x.priority = y;\n            };\n            t = t.sort(function(z, aa) {\n                var ba = s[z], ca = s[aa];\n                return (ba.priority - ca.priority);\n            }.bind(this));\n            return t;\n        },\n        updateUnitsStatus: function() {\n            var s = this.availableDimensions.x, t = this.availableDimensions.y, u = this.calculateUnitSizes(this.sections, s);\n            u = this.calculateVisibleUnits(this.sections, u, t);\n            for (var v in u) {\n                if (!u.hasOwnProperty(v)) {\n                    continue;\n                };\n                var w = u[v];\n                if ((!w.is_holdout || !w.visible)) {\n                    continue;\n                };\n                var x = this.units[1][v];\n                this.calcUnitStats(x, w.visible, w.height_below);\n            };\n            u = this.calculateUnitSizes(this.sections, s, true);\n            u = this.calculateVisibleUnits(this.sections, u, t);\n            this.displayUnits(this.sections, u);\n            if (this.displayedCallback) {\n                var y = this.getUnitsDisplayed(this.sections, u), z = this.getHeightsRequired(this.sections, u);\n                this.displayedCallback(y, z);\n            }\n        ;\n        },\n        calcUnitStats: function(s, t, u) {\n            var v = Date.now();\n            if (s.visible) {\n                s.totalTime += (v - s.lastShowTime);\n            };\n            if (((s.trackingCode !== null) && (s.totalTime >= this.UNITS_REGISTER_DELAY))) {\n                var w = s.trackingCode;\n                s.trackingCode = null;\n                this.registerImpression(w, s.registerUrl);\n            }\n        ;\n            s.visible = t;\n            s.heightBelow = u;\n            s.lastShowTime = v;\n        },\n        prepareResize: function() {\n            var s = function(t) {\n                var u = l.create(\"div\", {\n                    className: \"inner\"\n                }), v = l.create(\"div\", {\n                    className: \"wrapper\"\n                }, u);\n                l.replace(t, v);\n                l.setContent(u, t);\n                return v;\n            };\n            this.sections = l.scry(this.root, \"div.ego_section\").map(function(t) {\n                return {\n                    root: s(t),\n                    units: l.scry(t, \"div.ego_unit\").map(s)\n                };\n            });\n        },\n        processResize: function() {\n            if (((this.isLoading || (this.lastLoadTime === 0)) || (this.availableDimensions === null))) {\n                this.setLogData();\n                return;\n            }\n        ;\n            this.updateUnitsStatus();\n            this.setLogData();\n            var s = this.nextRegisterTime();\n            if ((s !== Infinity)) {\n                this.processResize.bind(this).defer(s, true);\n            };\n        },\n        setIsLogAdData: function(s) {\n            this.isLogAdData = s;\n            this.addEvent(\"setIsLogAdData\", false);\n            this.setLogData();\n        },\n        setLogData: function() {\n            var s = this.snowlift.getImageId();\n            if ((this.isLogAdData && s)) {\n                var t = p.getElementDimensions(this.snowlift.getImage()), u = p.getElementDimensions(this.snowlift.getRHCHeader()), v = p.getElementDimensions(this.snowlift.getRHCBody()), w = p.getElementDimensions(this.snowlift.getRHCFooter()), x = {\n                    query_set: this.snowlift.getLoadQuery().set,\n                    window_x: window.innerWidth,\n                    window_y: window.innerHeight,\n                    image_x: t.x,\n                    image_y: t.y,\n                    header_x: u.x,\n                    header_y: u.y,\n                    body_x: v.x,\n                    body_y: v.y,\n                    footer_x: w.x,\n                    footer_y: w.y,\n                    ads_below_space: this.getAdsBelowSpace(),\n                    time: Date.now(),\n                    adsStatus: this.adsStatus,\n                    adsEvents: this.adsEvents,\n                    refreshRate: this.refreshUnitsRate,\n                    position: this.position\n                };\n                m.updateAdData(s, x);\n            }\n        ;\n        },\n        getAdsBelowSpace: function() {\n            var s = [], t = this.units[1];\n            for (var u in t) {\n                if ((t.hasOwnProperty(u) && !this.getIsHoldout(this.getAdUnit(u)))) {\n                    s.push(t[u].heightBelow);\n                };\n            };\n            return s;\n        },\n        getIsAds: function(s) {\n            var t = l.scry(s, \"div._4u8\");\n            return t.length;\n        },\n        getUnitId: function(s) {\n            if (this.getIsAds(s)) {\n                return this.getAdId(s);\n            }\n             else return this.getEgoId(s)\n        ;\n        },\n        getEgoId: function(s) {\n            var t = l.find(s, \"div.ego_unit\");\n            return t.getAttribute(\"data-ego-fbid\");\n        },\n        getAdData: function(s) {\n            var t = l.find(s, \"div._4u8\"), u = t.getAttribute(\"data-ad\");\n            return ((u && JSON.parse(u)) || {\n            });\n        },\n        getAdId: function(s) {\n            return this.getAdData(s).adid;\n        },\n        getIsHoldout: function(s) {\n            return (s && this.getAdData(s).holdout);\n        },\n        getAdUnit: function(s) {\n            if (!this.sections) {\n                return null\n            };\n            var t = [];\n            this.sections.forEach(function(v) {\n                q(t, v.units);\n            });\n            for (var u = 0; (u < t.length); u++) {\n                if ((this.getIsAds(t[u]) && (this.getAdId(t[u]) == s))) {\n                    return t[u]\n                };\n            };\n            return null;\n        },\n        nextRegisterTime: function() {\n            var s = Infinity, t = h(h({\n            }, this.units[0]), this.units[1]);\n            for (var u in t) {\n                if (t.hasOwnProperty(u)) {\n                    var v = t[u];\n                    if (((v.trackingCode !== null) && v.visible)) {\n                        s = Math.min(s, (this.UNITS_REGISTER_DELAY - v.totalTime));\n                    };\n                }\n            ;\n            };\n            return s;\n        },\n        getHeight: function(s, t) {\n            var u = k.get(s, \"height\");\n            if ((u && (u.x === t))) {\n                return u.y\n            };\n            return this.cacheHeight(s, t);\n        },\n        cacheHeight: function(s, t) {\n            var u = {\n                x: t,\n                y: s.offsetHeight\n            };\n            k.set(s, \"height\", u);\n            return u.y;\n        },\n        loadAdsAndEgo: function() {\n            this.resetEvents();\n            this.addEvent(\"adsRequested\", true);\n            this.position++;\n            n.loadFromEndpoint(\"WebEgoPane\", this.root, {\n                pid: 34,\n                data: [this.loadQuery.set,this.getCursorFBID(this.loadQuery),this.snowliftRedesign,]\n            }, {\n                crossPage: true,\n                bundle: false\n            });\n        },\n        getCursorFBID: function(s) {\n            if ((s.v !== undefined)) {\n                return s.v\n            };\n            if ((s.fbid !== undefined)) {\n                return s.fbid\n            };\n            return \"0\";\n        },\n        unitsLoaded: function(s, t) {\n            var u;\n            if (t) {\n                u = \"/ai.php\";\n                this.addEvent(\"adsLoaded\", true);\n            }\n             else {\n                u = \"/ajax/ei.php\";\n                this.addEvent(\"egoLoaded\", true);\n            }\n        ;\n            var v = {\n            };\n            for (var w in s) {\n                if (s.hasOwnProperty(w)) {\n                    v[w] = {\n                        trackingCode: s[w],\n                        totalTime: 0,\n                        lastShowTime: 0,\n                        heightBelow: -10000,\n                        visible: false,\n                        registerUrl: u\n                    };\n                };\n            };\n            this.units[t] = v;\n            if (t) {\n                this.waitForImages(this.imagesLoaded.bind(this));\n            };\n        },\n        imagesLoaded: function() {\n            this.prepareResize();\n            this.addEvent(\"imagesLoaded\", true);\n            this.lastLoadTime = Date.now();\n            this.isLoading = false;\n            this.processResize();\n            i.removeClass(this.root, \"loading\");\n        },\n        loadAdsFromUserActivity: function() {\n            var s = Date.now(), t = this.refreshUnitsRate;\n            if ((!this.isLoading && ((s - this.lastLoadTime) > t))) {\n                i.addClass(this.root, \"loading\");\n                this.isLoading = true;\n                this.loadAdsAndEgo();\n            }\n        ;\n        },\n        registerImpression: function(s, t) {\n            var u = l.create(\"iframe\", {\n                src: o(t).addQueryData({\n                    aed: s\n                }),\n                width: 0,\n                height: 0,\n                frameborder: 0,\n                scrolling: \"no\",\n                className: \"fbEmuTracking\"\n            });\n            u.setAttribute(\"aria-hidden\", \"true\");\n            l.appendContent(this.root, u);\n        },\n        waitForImages: function(s) {\n            var t = l.scry(this.root, \"img.img\"), u = t.length, v = u;\n            if ((v === 0)) {\n                s();\n            };\n            var w = function() {\n                v--;\n                if ((v === 0)) {\n                    s.defer();\n                };\n            };\n            for (var x = 0; (x < u); x++) {\n                var y = t[x];\n                if (y.complete) {\n                    w();\n                }\n                 else g.listen(y, {\n                    load: w,\n                    error: w,\n                    abort: w\n                });\n            ;\n            };\n        }\n    };\n    e.exports = r;\n});\n__d(\"PhotoViewer\", [\"Bootloader\",\"copyProperties\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"Bootloader\"), h = b(\"copyProperties\"), i = b(\"emptyFunction\");\n    function j() {\n        this.image = null;\n        this.root = null;\n        this.stream = null;\n    };\n    h(j, {\n        bootstrap: function(k, l) {\n            g.loadModules([\"PhotoSnowlift\",], function(m) {\n                m.bootstrap(k, l);\n            });\n        }\n    });\n    h(j.prototype, {\n        getEventPrefix: i.thatReturnsNull,\n        getEventString: function(k) {\n            var l = this.getEventPrefix();\n            if (l) {\n                return ((l + \".\") + k)\n            };\n            return null;\n        },\n        getImage: function() {\n            return this.image;\n        },\n        getPosition: function() {\n            return (this.stream ? this.stream.getCursor() : null);\n        },\n        getRoot: function() {\n            return this.root;\n        },\n        getSourceString: i.thatReturnsNull,\n        getVersionConst: i.thatReturnsNull,\n        getViewerSource: i.thatReturnsNull,\n        getViewerSet: i.thatReturnsNull\n    });\n    e.exports = j;\n});\n__d(\"PhotoSnowlift\", [\"function-extensions\",\"Arbiter\",\"AsyncDialog\",\"AsyncRequest\",\"Bootloader\",\"Class\",\"collectDataAttributes\",\"CSS\",\"Dialog\",\"DOM\",\"DOMControl\",\"Event\",\"FullScreen\",\"Input\",\"ImageUtils\",\"Keys\",\"Layer\",\"LinkController\",\"Locale\",\"PageTransitions\",\"Parent\",\"PhotosConst\",\"PhotoSessionLog\",\"PhotoSnowliftAds\",\"PhotoStreamCache\",\"PhotosUtils\",\"PhotoViewer\",\"Rect\",\"ScrollableArea\",\"Style\",\"Toggler\",\"UIPagelet\",\"URI\",\"UserAgent\",\"Vector\",\"$\",\"asyncCallback\",\"computeRelativeURI\",\"copyProperties\",\"createArrayFrom\",\"csx\",\"emptyFunction\",\"ge\",\"goURI\",\"shield\",\"startsWith\",\"tx\",\"userAction\",], function(a, b, c, d, e, f) {\n    b(\"function-extensions\");\n    var g = b(\"Arbiter\"), h = b(\"AsyncDialog\"), i = b(\"AsyncRequest\"), j = b(\"Bootloader\"), k = b(\"Class\"), l = b(\"collectDataAttributes\"), m = b(\"CSS\"), n = b(\"Dialog\"), o = b(\"DOM\"), p = b(\"DOMControl\"), q = b(\"Event\"), r = b(\"FullScreen\"), s = b(\"Input\"), t = b(\"ImageUtils\"), u = b(\"Keys\"), v = b(\"Layer\"), w = b(\"LinkController\"), x = b(\"Locale\"), y = b(\"PageTransitions\"), z = b(\"Parent\"), aa = b(\"PhotosConst\"), ba = b(\"PhotoSessionLog\"), ca = b(\"PhotoSnowliftAds\"), da = b(\"PhotoStreamCache\"), ea = b(\"PhotosUtils\"), fa = b(\"PhotoViewer\"), ga = b(\"Rect\"), ha = b(\"ScrollableArea\"), ia = b(\"Style\"), ja = b(\"Toggler\"), ka = b(\"UIPagelet\"), la = b(\"URI\"), ma = b(\"UserAgent\"), na = b(\"Vector\"), oa = b(\"$\"), pa = b(\"asyncCallback\"), qa = b(\"computeRelativeURI\"), ra = b(\"copyProperties\"), sa = b(\"createArrayFrom\"), ta = b(\"csx\"), ua = b(\"emptyFunction\"), va = b(\"ge\"), wa = b(\"goURI\"), xa = b(\"shield\"), ya = b(\"startsWith\"), za = b(\"tx\"), ab = b(\"userAction\");\n    function bb() {\n        this.parent.construct(this);\n    };\n    ra(bb, {\n        STATE_ERROR: \"error\",\n        STATE_HTML: \"html\",\n        STATE_IMAGE_PIXELS: \"image_pixels\",\n        STATE_IMAGE_DATA: \"image\",\n        LOADING_TIMEOUT: 2000,\n        PAGER_FADE: 3000,\n        FULL_SCREEN_PADDING: 10,\n        STAGE_HIRES_MAX: {\n            x: 2048,\n            y: 2048\n        },\n        STAGE_NORMAL_MAX: {\n            x: 960,\n            y: 960\n        },\n        STAGE_MIN: {\n            x: 520,\n            y: 520\n        },\n        SIDEBAR_SIZE_MAX: 360,\n        STAGE_CHROME: {\n            x: 82,\n            y: 42\n        },\n        VIDEO_BOTTOM_BAR_SPACE: 40,\n        GOPREV_AREA: 120,\n        TIMELINE_STRETCH_WIDTH: 843,\n        TIMELINE_STRETCH_MIN: 480,\n        MIN_TAG_DISTANCE: 83,\n        PADDING_MIN: 40,\n        MIN_UFI_HEIGHT: 250,\n        COLLECTIONS_UNTAGGED_PHOTOS: 3,\n        PHOTOS_OF_YOU_SUGGESTIONS: 28,\n        MIN_ADS_VISIBLE: 1,\n        _instance: null,\n        getInstance: function() {\n            if (!bb._instance) {\n                bb._instance = new bb();\n            };\n            return bb._instance;\n        },\n        initWithSpotlight: function(cb, db) {\n            bb.getInstance().init(cb, db);\n        },\n        touch: ua,\n        addPhotoFbids: function(cb, db, eb, fb) {\n            bb.getInstance().addPhotoFbids(cb, db, eb, fb);\n        },\n        attachFollowFlyout: function(cb) {\n            o.insertAfter(oa(\"fbPhotoSnowliftSubscribe\"), cb);\n        },\n        attachSubscribeFlyout: function(cb) {\n            o.insertAfter(oa(\"fbPhotoSnowliftSubscribe\"), cb);\n        },\n        attachTagger: function(cb) {\n            bb.getInstance().attachTagger(cb);\n        },\n        preload: function(cb, db) {\n            bb.getInstance().preload(cb, db);\n        },\n        bootstrap: function(cb, db) {\n            if ((cb && la(cb).getQueryData().hasOwnProperty(\"share_id\"))) {\n                j.loadModules([\"SpotlightShareViewer\",], function(eb) {\n                    eb.bootstrap(cb, db);\n                });\n                return;\n            }\n        ;\n            bb.getInstance().bootstrap(cb, db);\n        },\n        closeRefresh: function() {\n            bb.getInstance().closeRefresh();\n        },\n        deletePhoto: function(cb) {\n            bb.getInstance().deletePhoto(cb);\n        },\n        getImage: function() {\n            return bb.getInstance().getImage();\n        },\n        getImageId: function() {\n            return bb.getInstance().getImageId();\n        },\n        getLoadQuery: function() {\n            return bb.getInstance().getLoadQuery();\n        },\n        getRHCBody: function() {\n            return bb.getInstance().getRHCBody();\n        },\n        getRHCFooter: function() {\n            return bb.getInstance().getRHCFooter();\n        },\n        getRHCHeader: function() {\n            return bb.getInstance().getRHCHeader();\n        },\n        getRoot: function() {\n            return bb.getInstance().getRoot();\n        },\n        likePhotoSkipConfirmation: function(cb) {\n            bb.getInstance().likePhotoSkipConfirmation(cb);\n        },\n        saveTagsFromPayload: function(cb) {\n            bb.getInstance().saveTagsFromPayload(cb);\n        },\n        saveTagsFromPayloadDelayed: function(cb) {\n            bb.saveTagsFromPayload.curry(cb).defer(2000);\n        },\n        handleServerError: function(cb, db) {\n            bb.getInstance().handleServerError(cb, db);\n        },\n        setVideoWarning: function(cb, db) {\n            var eb = bb.getInstance(), fb = (\"video_warning_\" + cb);\n            if (!eb.videoWarnings) {\n                eb.videoWarnings = [];\n            };\n            eb.videoWarnings[fb] = db;\n        },\n        storeFromData: function(cb) {\n            bb.getInstance().storeFromData(cb);\n        },\n        swapData: function() {\n            bb.getInstance().swapData();\n        },\n        touchMarkup: ua,\n        updateTotalCount: function(cb, db, eb) {\n            bb.getInstance().updateTotalCount(cb, db, eb);\n        }\n    });\n    k.extend(bb, fa);\n    ra(bb.prototype, {\n        switchTimer: null,\n        imageRefreshTimer: null,\n        imageLoadingTimer: null,\n        lastPage: 0,\n        currentMinSize: null,\n        currentImageSize: null,\n        resetUriStack: true,\n        thumbSrc: null,\n        shouldStretch: false,\n        stageMax: bb.STAGE_NORMAL_MAX,\n        stageChrome: bb.STAGE_CHROME,\n        stagePagerPrev: null,\n        ua: null,\n        PhotoTagger: null,\n        showHover: false,\n        skipLikePhotoConfirmation: false,\n        isShowingLikePhotoConfirmation: false,\n        preload: function(cb, db) {\n            j.loadModules([\"PhotoTagger\",\"Live\",\"PhotoTagApproval\",\"PhotoTags\",\"TagTokenizer\",\"fb-photos-snowlift-fullscreen-css\",], function(fb) {\n                this.PhotoTagger = fb;\n            }.bind(this));\n            var eb = this.getImageSrc(la(cb).getQueryData());\n            if (eb) {\n                (new Image()).src = eb;\n            };\n        },\n        bootstrap: function(cb, db) {\n            if ((cb && la(cb).getQueryData().makeprofile)) {\n                this.enableCropperOnInit = true;\n                this.isUserProfilePic = la(cb).getQueryData().makeuserprofile;\n                this.isInProfilePicAlbum = la(cb).getQueryData().inprofilepicalbum;\n            }\n        ;\n            this.preload(cb, db);\n            if (this.closeDirty) {\n                this.bootstrap.bind(this, cb, db).defer();\n                return;\n            }\n        ;\n            ca.reset();\n            this.resetUriStack = true;\n            if (this.isOpen) {\n                if (this.openExplicitly) {\n                    this.closeCleanup();\n                    this.resetUriStack = false;\n                }\n                 else return\n            \n            };\n            this.ua = ab(\"snowlift\", db).uai(\"open\");\n            this.returningToStart = false;\n            (this.loading && m.removeClass(this.loading, \"loading\"));\n            if (db) {\n                m.addClass((this.loading = db), \"loading\");\n                if (this.container) {\n                    var eb = z.byClass(db, \"uiStreamStory\");\n                    if (eb) {\n                        this.container.setAttribute(\"data-ownerid\", eb.id);\n                    }\n                     else this.container.removeAttribute(\"data-ownerid\");\n                ;\n                }\n            ;\n                this.getThumbAndSize(db);\n            }\n             else this.loading = null;\n        ;\n            g.inform(\"PhotoSnowlift.GO\", cb, g.BEHAVIOR_STATE);\n            this.loadFrameIfUninitialized();\n        },\n        getCurrentImageServerSizeDimensions: function() {\n            return this.stream.getCurrentImageData().dimensions;\n        },\n        getEventPrefix: function() {\n            return \"PhotoSnowlift\";\n        },\n        getRoot: function() {\n            return this.root;\n        },\n        getSourceString: function() {\n            return \"snowlift\";\n        },\n        getViewerSource: function() {\n            return this.source;\n        },\n        getViewerSet: function() {\n            return this.stream.getPhotoSet();\n        },\n        getVersionConst: function() {\n            return aa.VIEWER_SNOWLIFT;\n        },\n        getImage: function() {\n            return this.image;\n        },\n        getImageId: function() {\n            return this.stream.getCursor();\n        },\n        getRHCHeader: function() {\n            return this.rhcHeader;\n        },\n        getRHCBody: function() {\n            return this.ufiForm;\n        },\n        getRHCFooter: function() {\n            return this.rhcFooter;\n        },\n        getLoadQuery: function() {\n            return this.loadQuery;\n        },\n        getCurrentPhotoInfo: function() {\n            var cb = this.stream.getCurrentImageData();\n            if (cb) {\n                return cb.info\n            };\n            return null;\n        },\n        getOwnerId: function() {\n            var cb = this.stream.getCurrentImageData();\n            if (cb) {\n                return cb.info.owner\n            };\n            return null;\n        },\n        getThumbAndSize: function(cb) {\n            this.currentImageSize = null;\n            this.thumbSrc = null;\n            var db = la(cb.getAttribute(\"ajaxify\")).getQueryData();\n            if (!db.size) {\n                return\n            };\n            var eb = na.deserialize(db.size);\n            if ((!eb.x || !eb.y)) {\n                return\n            };\n            this.currentImageSize = eb;\n            if (((!m.hasClass(cb, \"uiMediaThumb\") && !m.hasClass(cb, \"uiPhotoThumb\")) && !m.hasClass(cb, \"uiScaledThumb\"))) {\n                return\n            };\n            if (cb.getAttribute(\"data-cropped\")) {\n                return\n            };\n            var fb = o.scry(cb, \"img\")[0], gb = o.scry(cb, \"i\")[0], hb = z.byAttribute(cb, \"data-size\");\n            this.shouldStretch = ((((((hb && this.currentImageSize) && fb) && (hb.getAttribute(\"data-size\") === \"2\")) && (this.currentImageSize.x > this.currentImageSize.y)) && (this.currentImageSize.x <= bb.TIMELINE_STRETCH_WIDTH)) && (fb.offsetWidth === bb.TIMELINE_STRETCH_WIDTH));\n            var ib;\n            if (fb) {\n                ib = fb.src;\n            }\n             else if (gb) {\n                ib = ia.get(gb, \"backgroundImage\").replace(/.*url\\(\"?([^\"]*)\"?\\).*/, \"$1\");\n            }\n             else return\n            \n        ;\n            this.thumbSrc = ib;\n        },\n        loadFrameIfUninitialized: function() {\n            if (this.root) {\n                return\n            };\n            new i(\"/ajax/photos/snowlift/init.php\").setAllowCrossPageTransition(true).setMethod(\"GET\").setReadOnly(true).send();\n        },\n        init: function(cb, db) {\n            this.init = ua;\n            this.showHover = db.pivot_hover;\n            ba.setEndMetrics(db.pivot_end_metric);\n            this.enableSnowliftProfilePicCropper = db.snowlift_profile_pic_cropper;\n            this.pagersOnKeyboardNav = db.pagers_on_keyboard_nav;\n            this.hilitAllTagsAndBoxesOnHover = db.snowlift_hover_shows_all_tags_and_faces;\n            this.fullscreen = r.isSupported();\n            this.showOGVideos = db.og_videos;\n            this.resizeCommentsForAds = db.resize_comments_for_ads;\n            this.stageMax = bb.STAGE_HIRES_MAX;\n            this.spotlight = cb;\n            this.spotlight.subscribe(\"blur\", function() {\n                this.closingAction = ba.OUTSIDE;\n            }.bind(this));\n            this.spotlight.subscribe(\"hide\", xa(this.closeHandler, this));\n            this.spotlight.subscribe(\"key\", this.keyHandler.bind(this));\n            this.initializeNodes(this.spotlight.getRoot());\n            ca.init(this.sideAdUnit, this, db, this.adsDisplayedCallback.bind(this));\n            this.inAdsDisplayedCallback = false;\n            if (!this.subscription) {\n                w.registerHandler(this.handleNavigateAway.bind(this));\n                this.subscription = g.subscribe(\"PhotoSnowlift.GO\", function(eb, fb) {\n                    this.openExplicitly = true;\n                    (this.loading && m.removeClass(this.loading, \"loading\"));\n                    this.open(fb);\n                }.bind(this));\n            }\n        ;\n            this.transitionHandlerRegistered = false;\n            this.returningToStart = false;\n            y.registerHandler(this.openHandler.bind(this));\n            this.openHandlerRegistered = true;\n            g.subscribe(\"PhotoTagApproval.HILITE_TAG\", this.onHiliteTag.bind(this));\n            g.subscribe(\"PhotoTagApproval.UPDATE_TAG_BOX\", this.onUpdateTagBox.bind(this));\n            if (this.fullscreen) {\n                r.subscribe(\"changed\", this.onFullScreenChange.bind(this));\n            };\n        },\n        onFullScreenChange: function() {\n            var cb = r.isFullScreen();\n            m.conditionClass(document.body, \"fbPhotoSnowliftFullScreenMode\", cb);\n            if (cb) {\n                if (!m.hasClass(this.root, \"fbPhotoSnowliftEditMode\")) {\n                    this.collapseRHC();\n                };\n                var db = this.stream.getCurrentImageData();\n                if ((((db && db.url) && (this.image.src !== db.url)) && this.shouldShowHiRes(db))) {\n                    this.switchImage(db.url);\n                };\n                this.adjustForResize();\n            }\n             else {\n                this.uncollapseRHC();\n                if ((ma.chrome() && !m.hasClass(this.root, \"fbPhotoSnowliftEditMode\"))) {\n                    this.page(0, false);\n                };\n                g.inform(\"reflow\");\n            }\n        ;\n            ja.hide();\n            if (this.cropper) {\n                this.cropper.resetPhoto();\n            };\n        },\n        initializeNodes: function(cb) {\n            this.root = cb;\n            this.container = o.find(cb, \"div.fbPhotoSnowliftContainer\");\n            this.snowliftPopup = o.find(this.container, \"div.fbPhotoSnowliftPopup\");\n            this.rhc = o.find(this.snowliftPopup, \"div.rhc\");\n            this.rhcHeader = o.find(this.rhc, \"div.rhcHeader\");\n            this.rhcFooter = o.find(this.rhc, \"div.rhcFooter\");\n            this.ufiForm = o.find(this.rhc, \"form.fbPhotosSnowliftFeedbackForm\");\n            this.ufiInputContainer = o.find(this.rhc, \"div.fbPhotosSnowboxFeedbackInput\");\n            this.scroller = o.find(this.ufiForm, \"div.rhcScroller\");\n            this.scrollerBody = o.find(this.scroller, \"div.uiScrollableAreaBody\");\n            this.stageWrapper = o.find(this.snowliftPopup, \"div.stageWrapper\");\n            this.overlay = o.find(this.snowliftPopup, \"div.snowliftOverlay\");\n            this.errorBox = o.find(this.stageWrapper, \"div.stageError\");\n            this.image = o.find(this.stageWrapper, \"img.spotlight\");\n            this.stage = o.find(this.stageWrapper, \"div.stage\");\n            this.videoStage = o.find(this.stageWrapper, \"div.videoStage\");\n            this.prevPager = o.find(this.snowliftPopup, \"a.snowliftPager.prev\");\n            this.nextPager = o.find(this.snowliftPopup, \"a.snowliftPager.next\");\n            this.stageActions = o.find(cb, \"div.stageActions\");\n            this.buttonActions = o.find(this.stageActions, \"div.fbPhotosPhotoButtons\");\n            this.productMetadata = o.scry(this.rhc, \"div.fbPhotosSnowliftProductMetadata\").pop();\n            this.sideAdUnit = o.find(cb, \"._5ciw\");\n            g.inform(\"Amoeba/instrumentMulti\", [[this.container,\"snowlift\",],[this.rhc,\"rhc\",],[this.rhcHeader,\"rhc_header\",],[this.ufiForm,\"ufi_form\",],[this.ufiInputContainer,\"ufi_input\",],[this.prevPager,\"prev_pager\",],[this.nextPager,\"next_pager\",],[this.stageActions,\"stage_actions\",],[this.sideAdUnit,\"side_ads\",],], g.BEHAVIOR_PERSISTENT);\n            m.conditionClass(this.root, \"fullScreenAvailable\", this.fullscreen);\n        },\n        initializeScroller: function() {\n            this.initializeScroller = ua;\n            this.scrollableArea = ha.fromNative(this.scroller, {\n                fade: true,\n                persistent: true\n            });\n            var cb = function(event) {\n                var db = q.$E(event).getTarget();\n                if (o.contains(this.ufiInputContainer, db)) {\n                    var eb = p.getInstance(db);\n                    if (eb) {\n                        this.scrollableArea.scrollToBottom();\n                        var fb = eb.subscribe(\"resize\", function() {\n                            var hb = this.scrollableArea.isScrolledToBottom();\n                            this.adjustScroller();\n                            (hb && this.scrollableArea.scrollToBottom());\n                        }.bind(this)), gb = q.listen(db, \"blur\", function() {\n                            eb.unsubscribe(fb);\n                            gb.remove();\n                        });\n                    }\n                ;\n                }\n            ;\n            }.bind(this);\n            g.subscribe(\"ufi/changed\", function(db, eb) {\n                if ((this.ufiForm === eb.form)) {\n                    this.adjustScrollerIfNecessary();\n                };\n            }.bind(this));\n            g.subscribe(\"ufi/comment\", function(db, eb) {\n                if ((this.ufiForm === eb.form)) {\n                    if (eb.isranked) {\n                        this.scrollableArea.scrollToTop();\n                    }\n                     else this.scrollableArea.scrollToBottom();\n                \n                };\n            }.bind(this));\n            q.listen(this.rhc, \"click\", function(event) {\n                var db = event.getTarget();\n                if (((z.byTag(db, \"a\") || z.byTag(db, \"button\")) || o.isNodeOfType(db, \"input\"))) {\n                    this.adjustScrollerIfNecessary();\n                };\n            }.bind(this));\n            g.subscribe([\"reflow\",\"CommentUFI.Pager\",], function() {\n                if (this.isOpen) {\n                    this.adjustScroller();\n                };\n            }.bind(this));\n            q.listen(this.ufiForm, \"focusin\", cb);\n        },\n        openHandler: function(cb) {\n            if ((((((this.isOpen || (cb.getPath() != \"/photo.php\")) || this.returningToStart) || cb.getQueryData().closeTheater) || cb.getQueryData().permPage) || cb.getQueryData().makeprofile)) {\n                this.openHandlerRegistered = false;\n                return false;\n            }\n        ;\n            this.open(cb);\n            this._uriStack.push(la(cb).getQualifiedURI().toString());\n            y.transitionComplete(true);\n            return true;\n        },\n        getImageSrc: function(cb) {\n            if (cb.smallsrc) {\n                if (!cb.size) {\n                    return cb.smallsrc\n                };\n                var db = na.deserialize(cb.size), eb = this.getStageSize(db);\n                if (((eb.x <= bb.STAGE_NORMAL_MAX.x) && (eb.y <= bb.STAGE_NORMAL_MAX.y))) {\n                    return cb.smallsrc\n                };\n            }\n        ;\n            return cb.src;\n        },\n        open: function(cb) {\n            var db = la(cb).getQueryData(), eb = this.getImageSrc(db);\n            if (eb) {\n                delete db.src;\n                delete db.smallsrc;\n            }\n        ;\n            if (this.resetUriStack) {\n                this._uriStack = [];\n            };\n            if (!this.initialLoad) {\n                db.firstLoad = true;\n                this.initialLoad = true;\n            }\n        ;\n            this.sessionID = Date.now();\n            this.sessionPhotosHilited = {\n            };\n            this.loadQuery = ra(db, {\n                ssid: this.sessionID\n            });\n            this.isOpen = true;\n            this.pagersShown = false;\n            this.refreshOnClose = false;\n            this.hilitedTag = null;\n            this.loadingStates = {\n                image: false,\n                html: false\n            };\n            this.replaceUrl = false;\n            this.source = null;\n            this.saveTagSubscription = g.subscribe(\"PhotoTagger.SAVE_TAG\", this.onTagSaved.bind(this));\n            this.taggedPhotoIds = [];\n            this.stream = new da();\n            this.stream.init(aa.VIEWER_SNOWLIFT, \"PhotoViewerPagelet\", \"pagelet_photo_viewer\");\n            this.fetchInitialData();\n            this.setLoadingState(bb.STATE_HTML, true);\n            this.rhcCollapsed = false;\n            this._open(cb, eb);\n            if (this.enableSnowliftProfilePicCropper) {\n                j.loadModules([\"SnowliftPicCropper\",], function(fb) {\n                    this.cropper = fb.getInstance(this);\n                    this.cropper.init();\n                    if (this.enableCropperOnInit) {\n                        var gb = g.subscribe(\"PhotoSnowlift.SWITCH_IMAGE\", function() {\n                            if (this.isInProfilePicAlbum) {\n                                this.cropper.showPicInProfileAlbumDialog();\n                            }\n                             else this.cropper.enableCropping(this.isUserProfilePic);\n                        ;\n                            g.unsubscribe(gb);\n                        }.bind(this));\n                        this.enableCropperOnInit = false;\n                    }\n                ;\n                }.bind(this));\n            };\n            j.loadModules([\"PhotosButtonTooltips\",], function(fb) {\n                fb.init();\n            });\n        },\n        _open: function(cb, db) {\n            this.createLoader(db);\n            this.spotlight.show();\n            (this.ua && this.ua.add_event(\"frame\"));\n            g.inform(\"layer_shown\", {\n                type: \"PhotoSnowlift\"\n            });\n            g.inform(\"PhotoSnowlift.OPEN\");\n            this.stageHandlers = [q.listen(window, \"resize\", this.adjustForResize.bind(this)),q.listen(this.stageWrapper, \"click\", this.buttonListener.bind(this)),q.listen(this.stageWrapper, \"mouseleave\", function(event) {\n                var gb = event.getTarget();\n                if (!(((((((z.byClass(gb, \"snowliftOverlay\") || z.byClass(gb, \"fbPhotoSnowliftTagApproval\")) || z.byClass(gb, \"tagPointer\")) || z.byClass(gb, \"arrow\")) || z.byClass(gb, \"faceboxSuggestion\")) || z.byClass(gb, \"typeaheadWrapper\")) || z.byClass(gb, \"photoTagTypeahead\")))) {\n                    this.unhiliteAllTags();\n                };\n                this.hidePagers();\n            }.bind(this)),q.listen(this.stageWrapper, \"mousemove\", this.hilitePagerOnMouseMove.bind(this)),q.listen(this.stageWrapper, \"mousemove\", this.hiliteTagsOnMouseMove.bind(this)),q.listen(this.overlay, \"mouseenter\", this.unhiliteAllTags.bind(this)),];\n            this.stageHandlers.push(q.listen(this.container, \"click\", function(event) {\n                var gb = event.getTarget();\n                if (z.byClass(gb, \"rotateRight\")) {\n                    this.rotate(\"right\");\n                }\n                 else if (z.byClass(gb, \"rotateLeft\")) {\n                    this.rotate(\"left\");\n                }\n                 else if (z.byClass(gb, \"closeTheater\")) {\n                    if (r.isFullScreen()) {\n                        r.toggleFullScreen();\n                        return;\n                    }\n                ;\n                    this.closingAction = ba.X;\n                    this.closeHandler();\n                    return false;\n                }\n                 else if (this.fullscreen) {\n                    if (z.byClass(gb, \"fbPhotoSnowliftFullScreen\")) {\n                        this.toggleFullScreen();\n                    }\n                     else if (z.byClass(gb, \"fbPhotoSnowliftCollapse\")) {\n                        this.toggleCollapse();\n                    }\n                \n                }\n                \n                \n            ;\n            }.bind(this)));\n            var eb = va(\"fbPhotoSnowliftFeedback\");\n            if (eb) {\n                this.stageHandlers.push(q.listen(eb, \"click\", function(event) {\n                    var gb = event.getTarget();\n                    if ((z.byClass(gb, \"like_link\") || ((z.byClass(gb, \"UFILikeLink\") && z.byClass(gb, \"UIActionLinks\"))))) {\n                        this.toggleLikeButton();\n                    };\n                    var hb = z.byClass(event.getTarget(), \"uiUfiCollapsedComment\");\n                    if (hb) {\n                        m.addClass(hb, \"uiUfiCollapsedCommentToggle\");\n                    };\n                }.bind(this)));\n            };\n            var fb = va(\"fbPhotoSnowliftOnProfile\");\n            if (fb) {\n                this.stageHandlers.push(q.listen(fb, \"click\", function(event) {\n                    if (z.byClass(event.getTarget(), \"fbPhotoRemoveFromProfileLink\")) {\n                        this.refreshOnClose = true;\n                    };\n                }.bind(this)));\n            };\n            if (this.resetUriStack) {\n                this.startingURI = la.getMostRecentURI().addQueryData({\n                    closeTheater: 1\n                }).getUnqualifiedURI();\n            };\n            if (!db) {\n                this.setLoadingState(bb.STATE_IMAGE_DATA, true);\n            };\n            if (!this.transitionHandlerRegistered) {\n                y.registerHandler(this.transitionHandler.bind(this));\n                this.transitionHandlerRegistered = true;\n            }\n        ;\n            ba.initLogging(ba.SNOWLIFT);\n            if (this.pivots) {\n                ba.setRelevantCount(this.pivots.relevantCount);\n            };\n        },\n        toggleFullScreen: function() {\n            var cb = r.toggleFullScreen(document.documentElement);\n            if (cb) {\n                var db = this.stream.getCurrentImageData();\n                if ((((db && db.url) && (this.image.src !== db.url)) && this.shouldShowHiRes(db))) {\n                    (new Image()).src = db.url;\n                };\n                ba.logEnterFullScreen(this.stream.getCursor());\n            }\n        ;\n        },\n        getStream: function() {\n            return this.stream;\n        },\n        fetchInitialData: function() {\n            (this.ua && this.ua.add_event(\"init_data\"));\n            this.stream.waitForInitData();\n            var cb = l(this.container, [\"ft\",]);\n            if ((((cb && cb.ft) && cb.ft.ei) && this.loadQuery)) {\n                this.loadQuery.ei = cb.ft.ei;\n            };\n            ka.loadFromEndpoint(\"PhotoViewerInitPagelet\", va(\"pagelet_photo_viewer_init\", this.root), this.loadQuery, {\n                usePipe: true,\n                jsNonblock: true,\n                crossPage: true\n            });\n        },\n        toggleCollapse: function() {\n            if (this.rhcCollapsed) {\n                this.uncollapseRHC();\n            }\n             else this.collapseRHC();\n        ;\n        },\n        collapseRHC: function() {\n            this.rhcCollapsed = true;\n            m.addClass(this.root, \"collapseRHC\");\n            this.adjustForResize();\n        },\n        uncollapseRHC: function() {\n            this.rhcCollapsed = false;\n            m.removeClass(this.root, \"collapseRHC\");\n            this.adjustForResize();\n        },\n        closeHandler: function() {\n            if (!this.isOpen) {\n                return\n            };\n            this.closingAction = (this.closingAction || ba.ESC);\n            if ((la.getMostRecentURI().addQueryData({\n                closeTheater: 1\n            }).getUnqualifiedURI().toString() == this.startingURI.toString())) {\n                this.close();\n                return;\n            }\n        ;\n            this.returnToStartingURI(this.refreshOnClose);\n            this.close();\n        },\n        returnToStartingURI: function(cb, db) {\n            if (!cb) {\n                if (db) {\n                    this.squashNextTransition(wa.curry(db));\n                }\n                 else this.squashNextTransition();\n            \n            };\n            this.returningToStart = true;\n            var eb = g.subscribe(\"page_transition\", (function() {\n                this.returningToStart = false;\n                eb.unsubscribe();\n            }).bind(this)), fb = (cb || isNaN(ma.opera())), gb = this._uriStack.length;\n            if ((fb && (gb < window.history.length))) {\n                window.history.go(-gb);\n            }\n             else {\n                var hb = this.startingURI, ib = new la(hb).removeQueryData(\"closeTheater\");\n                if (((hb.getQueryData().sk == \"approve\") && (hb.getPath() == \"/profile.php\"))) {\n                    ib.removeQueryData(\"highlight\");\n                    ib.removeQueryData(\"notif_t\");\n                }\n            ;\n                wa(ib);\n            }\n        ;\n        },\n        squashNextTransition: function(cb) {\n            this.squashNext = true;\n            y.registerHandler(function db() {\n                if (this.squashNext) {\n                    this.squashNext = false;\n                    if (cb) {\n                        cb.defer();\n                    };\n                    y.transitionComplete(true);\n                    return true;\n                }\n            ;\n                return false;\n            }.bind(this), 7);\n        },\n        handleNavigateAway: function(cb) {\n            var db = qa(y._most_recent_uri.getQualifiedURI(), cb.getAttribute(\"href\"));\n            if ((this.isOpen && ya(db.getPath(), \"/hashtag/\"))) {\n                this.close();\n                y.transitionComplete(true);\n                this.squashNextTransition();\n                y.go(this.startingURI);\n                return true;\n            }\n        ;\n            if ((((this.isOpen && ((db instanceof la))) && (db.getUnqualifiedURI().toString() != this.startingURI.toString())) && (db.getPath() != \"/photo.php\"))) {\n                if (!this.closingAction) {\n                    this.closingAction = ba.NAVIGATE;\n                };\n                this.returnToStartingURI(false, db);\n                this.close();\n                return false;\n            }\n        ;\n            return true;\n        },\n        postProcessTaggedPhotos: function() {\n            if ((this.taggedPhotoIds && (this.taggedPhotoIds.length > 0))) {\n                var cb = null;\n                if ((this.source === bb.COLLECTIONS_UNTAGGED_PHOTOS)) {\n                    cb = \"/ajax/photos/photo/edit/skiptag/\";\n                }\n                 else if ((this.source === bb.PHOTOS_OF_YOU_SUGGESTIONS)) {\n                    cb = \"/ajax/photos/photo/add_to_star_grid/\";\n                }\n            ;\n                if (cb) {\n                    new i().setURI(cb).setAllowCrossPageTransition(true).setData({\n                        media_id: this.taggedPhotoIds\n                    }).send();\n                };\n            }\n        ;\n        },\n        onTagSaved: function(cb, db) {\n            if (this.taggedPhotoIds) {\n                if (((this.source === bb.PHOTOS_OF_YOU_SUGGESTIONS) && !db.self_tag)) {\n                    return\n                };\n                this.taggedPhotoIds.push(db.photo_fbid);\n            }\n        ;\n        },\n        close: function() {\n            if (!this.isOpen) {\n                return\n            };\n            this.isOpen = false;\n            if (this.fullscreen) {\n                r.disableFullScreen();\n            };\n            ab(\"snowlift\").uai(\"close\");\n            (this.cropper && this.cropper.disableCropping());\n            this.spotlight.hide();\n            this.openExplicitly = false;\n            this.postProcessTaggedPhotos();\n            g.unsubscribe(this.saveTagSubscription);\n            this.taggedPhotoIds = [];\n            this.closeDirty = true;\n            this.closeCleanup.bind(this).defer();\n        },\n        closeCleanup: function() {\n            this.closeDirty = false;\n            m.removeClass(this.root, \"dataLoading\");\n            ba.logPhotoViews(this.closingAction);\n            this.destroy();\n            m.hide(this.errorBox);\n            m.hide(this.image);\n            this.currentImageSize = null;\n            this.thumbSrc = null;\n            this.shouldStretch = false;\n            this.resetUriStack = true;\n            m.removeClass(this.stageWrapper, \"showVideo\");\n            o.empty(this.videoStage);\n            this.uncollapseRHC();\n            this.currentMinSize = null;\n            this.rhcMinHeight = null;\n            this.setStagePagersState(\"reset\");\n            this.recacheData();\n            o.empty(this.sideAdUnit);\n            this.stream.destroy();\n            var cb = (this.closingAction === ba.NAVIGATE);\n            this.closingAction = null;\n            if (!this.openHandlerRegistered) {\n                y.registerHandler(this.openHandler.bind(this));\n                this.openHandlerRegistered = true;\n            }\n        ;\n            g.inform(\"layer_hidden\", {\n                type: \"PhotoSnowlift\"\n            });\n            g.inform(\"PhotoSnowlift.CLOSE\", cb);\n            this.root.setAttribute(\"aria-busy\", \"true\");\n        },\n        createLoader: function(cb) {\n            if ((this.currentImageSize === null)) {\n                this.adjustStageSize(bb.STAGE_MIN);\n            }\n             else {\n                var db = this.getStageSize(this.currentImageSize);\n                db = new na(Math.max(db.x, bb.STAGE_MIN.x), Math.max(db.y, bb.STAGE_MIN.y));\n                var eb = this.getImageSizeInStage(this.currentImageSize, db);\n                if ((this.thumbSrc === null)) {\n                    this.adjustStageSize(eb);\n                }\n                 else this.useImage(o.create(\"img\", {\n                    className: \"spotlight\",\n                    alt: \"\",\n                    src: this.thumbSrc,\n                    style: {\n                        width: (eb.x + \"px\"),\n                        height: (eb.y + \"px\")\n                    }\n                }), eb, false);\n            ;\n            }\n        ;\n            this.setLoadingState(this.STATE_IMAGE_PIXELS, true);\n            if (cb) {\n                (function() {\n                    var fb = new Image(), gb = q.listen(fb, \"load\", pa(function() {\n                        if (!this.isOpen) {\n                            return\n                        };\n                        if ((!this.stream || !this.stream.errorInCurrent())) {\n                            this.switchImage(cb, this.currentImageSize);\n                            (this.ua && this.ua.add_event(\"image\"));\n                            this.setLoadingState(bb.STATE_IMAGE_DATA, false);\n                        }\n                    ;\n                    }.bind(this), \"photo_theater\"));\n                    g.subscribeOnce(\"PhotoSnowlift.PAGE\", gb.remove.bind(gb));\n                    fb.src = cb;\n                }).bind(this).defer();\n            };\n            m.hide(this.stageActions);\n            this.setStagePagersState(\"disabled\");\n        },\n        initDataFetched: function(cb) {\n            ba.setPhotoSet(this.stream.getPhotoSet());\n            ba.setLogFbids(cb.logids);\n            var db = this.stream.getCurrentImageData();\n            ba.addPhotoView(db.info, this.shouldShowHiRes(db), (this.fullscreen && r.isFullScreen()));\n            var eb = this.stream.getCurrentExtraData();\n            if ((eb && (eb.source !== undefined))) {\n                this.source = parseInt(eb.source, 10);\n                ba.setSource(this.source);\n            }\n        ;\n            if (!this.pageHandlers) {\n                this.pageHandlers = [q.listen(this.root, \"click\", this.pageListener.bind(this)),q.listen(this.root, \"mouseleave\", this.mouseLeaveListener.bind(this)),];\n            };\n            m.show(this.stageActions);\n            this.root.setAttribute(\"aria-busy\", \"false\");\n            this.isLoggedInViewer = cb.loggedin;\n            this.disableAdsForSession = (cb.disablesessionads || !this.isLoggedInViewer);\n            this.showFlashTags = !!cb.flashtags;\n            this.disableAds = (this.disableAdsForSession || cb.fromad);\n            this.loadAds();\n        },\n        adjustScrollerIfNecessary: function() {\n            clearTimeout(this.scrollerTimeout);\n            this.scrollerTimeout = this.adjustScroller.bind(this).defer();\n        },\n        adjustScroller: function(cb) {\n            clearTimeout(this.scrollerTimeout);\n            this.initializeScroller();\n            this.scrollableArea.resize();\n            var db = na.getElementDimensions(this.rhc), eb = db.y;\n            eb -= na.getElementDimensions(this.rhcHeader).y;\n            eb -= na.getElementDimensions(this.ufiInputContainer).y;\n            if (this.productMetadata) {\n                var fb = na.getElementDimensions(this.productMetadata);\n                if ((fb.x !== 0)) {\n                    eb -= fb.y;\n                };\n            }\n        ;\n            if ((cb == null)) {\n                cb = 0;\n            };\n            this.rhcMinHeight = (db.y - ((eb - bb.MIN_UFI_HEIGHT)));\n            eb = Math.max(0, eb);\n            var gb = na.getElementDimensions(this.scrollerBody).y, hb = Math.max(bb.MIN_UFI_HEIGHT, (eb - cb));\n            if ((gb >= hb)) {\n                ia.set(this.scroller, \"height\", (hb + \"px\"));\n                if ((eb > hb)) {\n                    m.removeClass(this.rhc, \"pinnedUfi\");\n                    eb -= hb;\n                }\n                 else {\n                    m.addClass(this.rhc, \"pinnedUfi\");\n                    eb = 0;\n                }\n            ;\n            }\n             else {\n                ia.set(this.scroller, \"height\", \"auto\");\n                m.removeClass(this.rhc, \"pinnedUfi\");\n                eb -= gb;\n            }\n        ;\n            var ib = o.scry(this.scrollerBody, \"li.UFIFirstComponent\");\n            if ((ib.length === 0)) {\n                var jb = o.scry(this.ufiInputContainer, \"li.UFIAddComment\");\n                if ((jb.length !== 0)) {\n                    m.addClass(jb[0], \"UFIFirstComponent\");\n                };\n            }\n        ;\n            var kb = na.getElementDimensions(this.ufiInputContainer).y;\n            ia.set(this.ufiForm, \"padding-bottom\", (kb + \"px\"));\n            ca.resize(new na(db.x, eb));\n            this.scrollableArea.adjustGripper();\n        },\n        adjustForResize: function() {\n            this.currentMinSize = null;\n            this.adjustStageSize();\n            this.adjustForNewData();\n        },\n        shouldShowHiRes: function(cb) {\n            if ((!cb || !cb.smallurl)) {\n                return false\n            };\n            var db = this.getStageSize(cb.dimensions), eb = this.getImageSizeInStage(cb.dimensions, db);\n            return (((eb.x > bb.STAGE_NORMAL_MAX.x) || (eb.y > bb.STAGE_NORMAL_MAX.y)));\n        },\n        getImageURL: function(cb) {\n            if (cb.video) {\n                return null;\n            }\n             else if ((cb.smallurl && !this.shouldShowHiRes(cb))) {\n                return cb.smallurl\n            }\n        ;\n            return cb.url;\n        },\n        getImageDimensions: function(cb) {\n            if ((cb.smalldims && ((!this.shouldShowHiRes(cb) || (this.image.src === cb.smallurl))))) {\n                return cb.smalldims\n            };\n            return cb.dimensions;\n        },\n        getStageSize: function(cb, db) {\n            var eb = na.getViewportDimensions(), fb = new na(cb.x, cb.y);\n            if (db) {\n                fb = new na(Math.max(cb.x, db.x), Math.max(cb.y, db.y));\n            };\n            var gb, hb;\n            if ((this.fullscreen && r.isFullScreen())) {\n                return new na(((this.rhcCollapsed ? screen.width : (screen.width - bb.SIDEBAR_SIZE_MAX))), (screen.height - (bb.FULL_SCREEN_PADDING * 2)));\n            }\n             else {\n                gb = Math.min(fb.x, this.stageMax.x, (((eb.x - bb.SIDEBAR_SIZE_MAX) - bb.STAGE_CHROME.x)));\n                hb = Math.min(fb.y, this.stageMax.y, (eb.y - bb.STAGE_CHROME.y));\n            }\n        ;\n            if (((gb === 0) && (hb === 0))) {\n                return new na(0, 0)\n            };\n            var ib = (gb / hb), jb = (fb.x / fb.y);\n            if ((ib < jb)) {\n                return new na(gb, Math.round((gb / jb)))\n            };\n            return new na(Math.round((hb * jb)), hb);\n        },\n        getImageSizeInStage: function(cb, db) {\n            var eb = cb.x, fb = cb.y;\n            if (((eb >= db.x) || (fb >= db.y))) {\n                var gb = (db.x / db.y), hb = (eb / fb);\n                if ((gb < hb)) {\n                    eb = db.x;\n                    fb = Math.round((eb / hb));\n                }\n                 else if ((gb > hb)) {\n                    fb = db.y;\n                    eb = Math.round((fb * hb));\n                }\n                 else {\n                    eb = db.x;\n                    fb = db.y;\n                }\n                \n            ;\n            }\n        ;\n            return new na(eb, fb);\n        },\n        adjustStageSize: function(cb) {\n            var db = this.currentImageSize;\n            if (cb) {\n                db = cb;\n            }\n             else {\n                var eb = (this.stream && this.stream.getCurrentImageData());\n                if (eb) {\n                    db = this.getImageDimensions(eb);\n                };\n            }\n        ;\n            if (!db) {\n                return\n            };\n            this.currentImageSize = db;\n            var fb = 0;\n            if (((((this.shouldStretch && !this.getVideoOnStage()) && (db.x > db.y)) && (db.x <= bb.TIMELINE_STRETCH_WIDTH)) && (db.x >= bb.TIMELINE_STRETCH_MIN))) {\n                db.y = Math.round(((db.y * bb.TIMELINE_STRETCH_WIDTH) / db.x));\n                db.x = bb.TIMELINE_STRETCH_WIDTH;\n            }\n             else if (this.getVideoOnStage()) {\n                fb = (bb.VIDEO_BOTTOM_BAR_SPACE * 2);\n            }\n        ;\n            var gb = this.getStageSize(db, this.currentMinSize);\n            if (!this.currentMinSize) {\n                this.currentMinSize = new na(0, 0);\n            };\n            if (!this.rhcMinHeight) {\n                this.rhcMinHeight = 0;\n            };\n            this.currentMinSize = new na(Math.max(gb.x, bb.STAGE_MIN.x, this.currentMinSize.x), Math.max(gb.y, bb.STAGE_MIN.y, this.currentMinSize.y));\n            var hb = this.getImageSizeInStage(db, this.currentMinSize), ib = (this.currentMinSize.x - hb.x), jb = (this.currentMinSize.y - hb.y);\n            if (((ib > 0) && (ib < bb.PADDING_MIN))) {\n                this.currentMinSize.x -= ib;\n            }\n             else if (((jb > 0) && (jb < bb.PADDING_MIN))) {\n                this.currentMinSize.y -= jb;\n            }\n        ;\n            var kb = o.scry(this.productMetadata, \"#fbPhotoSnowliftTaggedProducts .taggee\");\n            if (kb.length) {\n                this.currentMinSize.y = Math.max(this.currentMinSize.y, this.rhcMinHeight);\n            };\n            var lb = (this.currentMinSize.x + bb.SIDEBAR_SIZE_MAX);\n            if (this.rhcCollapsed) {\n                lb = this.currentMinSize.x;\n            };\n            this.snowliftPopup.style.cssText = (((((\"width:\" + lb) + \"px;\") + \"height:\") + this.currentMinSize.y) + \"px;\");\n            var mb = ((this.currentMinSize.y - fb) + \"px\");\n            if ((ma.firefox() || (ma.ie() < 8))) {\n                var nb = ia.get(this.stageWrapper, \"font-size\");\n                if ((ma.ie() && (nb.indexOf(\"px\") < 0))) {\n                    var ob = o.create(\"div\");\n                    ob.style.fontSize = nb;\n                    ob.style.height = \"1em\";\n                    nb = ob.style.pixelHeight;\n                }\n            ;\n                mb = (((((this.currentMinSize.y - fb)) / parseFloat(nb))) + \"em\");\n            }\n        ;\n            this.stageWrapper.style.cssText = (((((\"width:\" + this.currentMinSize.x) + \"px;\") + \"line-height:\") + mb) + \";\");\n            if ((ma.ie() < 8)) {\n                ia.set(this.root, \"height\", (na.getViewportDimensions().y + \"px\"));\n                ia.set(this.container, \"min-height\", (((this.currentMinSize.y + bb.STAGE_CHROME.y)) + \"px\"));\n            }\n        ;\n            this.image.style.cssText = (((((\"width:\" + hb.x) + \"px;\") + \"height:\") + hb.y) + \"px;\");\n            var pb = this.getTagger();\n            if (pb) {\n                pb.repositionTagger();\n            };\n            this.adjustScrollerIfNecessary();\n        },\n        adjustForNewData: function() {\n            if (!this.image) {\n                return\n            };\n            var cb = o.scry(this.stage, \"div.tagsWrapper\")[0], db = na.getElementDimensions(this.image);\n            if (cb) {\n                ia.set(cb, \"width\", (db.x + \"px\"));\n                ia.set(cb, \"height\", (db.y + \"px\"));\n                if ((ma.ie() <= 7)) {\n                    var eb = o.scry(this.root, \"div.tagContainer\")[0];\n                    if (eb) {\n                        m.conditionClass(cb, \"ie7VerticalFix\", (na.getElementDimensions(eb).y > db.y));\n                    };\n                }\n            ;\n            }\n        ;\n        },\n        adsDisplayedCallback: function(cb, db) {\n            if ((((((this.resizeCommentsForAds && !this.inAdsDisplayedCallback) && !this.disableAds) && (bb.MIN_ADS_VISIBLE > 0)) && (cb < bb.MIN_ADS_VISIBLE)) && (db.length >= bb.MIN_ADS_VISIBLE))) {\n                this.inAdsDisplayedCallback = true;\n                var eb = db[(bb.MIN_ADS_VISIBLE - 1)];\n                this.adjustScroller(eb);\n                this.inAdsDisplayedCallback = false;\n            }\n        ;\n        },\n        setLoadingState: function(cb, db) {\n            switch (cb) {\n              case bb.STATE_IMAGE_PIXELS:\n                m.conditionClass(this.root, \"imagePixelsLoading\", db);\n                break;\n              case bb.STATE_IMAGE_DATA:\n                this.loadingStates[cb] = db;\n                m.conditionClass(this.root, \"imageLoading\", db);\n                break;\n              case bb.STATE_HTML:\n                this.loadingStates[cb] = db;\n                m.conditionClass(this.root, \"dataLoading\", db);\n                this.rhc.setAttribute(\"aria-busy\", (db ? \"true\" : \"false\"));\n                break;\n            };\n        },\n        destroy: function() {\n            this.stageHandlers.forEach(function(cb) {\n                cb.remove();\n            });\n            if (this.pageHandlers) {\n                this.pageHandlers.forEach(function(cb) {\n                    cb.remove();\n                });\n                this.pageHandlers = null;\n            }\n        ;\n        },\n        checkState: function(cb) {\n            if (((cb != bb.STATE_ERROR) && !this.loadingStates[cb])) {\n                return\n            };\n            switch (cb) {\n              case bb.STATE_IMAGE_DATA:\n                var db = this.stream.getCurrentImageData();\n                if (db) {\n                    var eb = this.getImageURL(db);\n                    if (eb) {\n                        this.switchImage(eb, null, true);\n                    }\n                     else if (db.video) {\n                        this.switchVideo(db.video, true);\n                    }\n                ;\n                    this.setLoadingState(cb, false);\n                }\n            ;\n                break;\n              case bb.STATE_HTML:\n                if (this.stream.getCurrentHtml()) {\n                    this.swapData();\n                    this.showPagers(bb.PAGER_FADE);\n                    this.setLoadingState(cb, false);\n                }\n            ;\n                break;\n              default:\n                if (this.stream.errorInCurrent()) {\n                    m.hide(this.image);\n                    m.show(this.errorBox);\n                }\n            ;\n                break;\n            };\n        },\n        buttonListener: function(event) {\n            var cb = event.getTarget(), db = Date.now();\n            if (z.byClass(cb, \"fbPhotoTagApprovalBox\")) {\n                return\n            };\n            if (z.byClass(cb, \"fbPhotosCornerWantButton\")) {\n                event.stop();\n                return;\n            }\n        ;\n            if (((db - this.lastPage) < 350)) {\n                return\n            };\n            if (z.byClass(cb, \"fbPhotosPhotoLike\")) {\n                this.likePhoto();\n            }\n             else if (z.byClass(cb, \"tagApproveIgnore\")) {\n                this.updateTagBox(event, cb);\n            }\n        ;\n        },\n        likePhoto: function() {\n            ba.addButtonLike();\n            var cb = oa(\"fbPhotoSnowliftFeedback\"), db = o.scry(cb, \"button.like_link\")[0];\n            if (!db) {\n                db = o.scry(cb, \"a.UFILikeLink\")[0];\n            };\n            var eb = db.getAttribute(\"href\");\n            if (r.isFullScreen()) {\n                if (ma.chrome()) {\n                    db.setAttribute(\"href\", \"javascript:;\");\n                }\n            };\n            db.click();\n            db.setAttribute(\"href\", eb);\n        },\n        toggleLikeButton: function() {\n            var cb = o.scry(this.buttonActions, \"a.fbPhotosPhotoLike\")[0];\n            if (cb) {\n                var db = o.find(this.root, \".likeCount\"), eb = o.find(db, \".likeCountNum\");\n                if (db) {\n                    if (m.hasClass(cb, \"viewerLikesThis\")) {\n                        o.setContent(eb, (parseInt(eb.textContent, 10) - 1));\n                    }\n                     else o.setContent(eb, (parseInt(eb.textContent, 10) + 1));\n                \n                };\n                m.toggleClass(cb, \"viewerLikesThis\");\n                m.removeClass(cb, \"viewerAlreadyLikedThis\");\n            }\n        ;\n        },\n        likePhotoWithKey: function() {\n            if (this.isShowingLikePhotoConfirmation) {\n                return\n            };\n            if (this.skipLikePhotoConfirmation) {\n                this.likePhoto();\n            }\n             else h.send(new i(\"/photos/confirm_like.php\"), function(cb) {\n                this.isShowingLikePhotoConfirmation = true;\n                cb.subscribe(\"confirm\", this.onCloseLikePhotoConfirmDialog.bind(this));\n                cb.subscribe(\"cancel\", this.onCloseLikePhotoConfirmDialog.bind(this));\n            }.bind(this));\n        ;\n            return false;\n        },\n        likePhotoSkipConfirmation: function(cb) {\n            this.skipLikePhotoConfirmation = cb;\n            this.likePhoto();\n        },\n        onCloseLikePhotoConfirmDialog: function() {\n            this.isShowingLikePhotoConfirmation = false;\n        },\n        updateTagBox: function(cb, db) {\n            this.unhiliteAllTags();\n            var eb = va(cb);\n            if (!eb) {\n                return\n            };\n            m.addClass(eb, \"tagBox\");\n            m.addClass(eb, \"tagBoxPendingResponse\");\n            m.removeClass(eb, \"tagBoxPending\");\n            m.hide(o.find(eb, \"span.tagForm\"));\n            if (db) {\n                m.show(o.find(eb, \"span.tagApproved\"));\n            }\n             else m.show(o.find(eb, \"span.tagIgnored\"));\n        ;\n        },\n        rotate: function(cb) {\n            var db = this.stream.getCursor();\n            if (this.getVideoOnStage()) {\n                var eb = (((cb == \"left\")) ? 270 : 90);\n                j.loadModules([\"VideoRotate\",], function(gb) {\n                    new gb(db).motionRotate(eb);\n                });\n                return;\n            }\n        ;\n            var fb = ra({\n                fbid: db,\n                cs_ver: aa.VIEWER_SNOWLIFT\n            }, this.stream.getPhotoSetQuery());\n            fb[cb] = 1;\n            this.setLoadingState(bb.STATE_IMAGE_DATA, true);\n            this.setLoadingState(this.STATE_IMAGE_PIXELS, true);\n            m.hide(this.image);\n            new i(\"/ajax/photos/photo/rotate/\").setAllowCrossPageTransition(true).setData(fb).setErrorHandler(this.rotationError.bind(this, db)).setFinallyHandler(this.rotationComplete.bind(this, db)).setMethod(\"POST\").setReadOnly(false).send();\n        },\n        rotationComplete: function(cb, db) {\n            if ((cb == this.stream.getCursor())) {\n                this.setLoadingState(bb.STATE_IMAGE_DATA, false);\n                this.switchImage(this.getImageURL(this.stream.getCurrentImageData()));\n                this.swapData();\n            }\n        ;\n        },\n        rotationError: function(cb, db) {\n            if ((cb == this.stream.getCursor())) {\n                this.setLoadingState(bb.STATE_IMAGE_DATA, false);\n                this.switchImage(this.getImageURL(this.stream.getCurrentImageData()));\n                j.loadModules([\"AsyncResponse\",], function(eb) {\n                    eb.defaultErrorHandler(db);\n                });\n            }\n        ;\n        },\n        saveTagsFromPayload: function(cb) {\n            this.storeFromData(cb);\n            if (((\"data\" in cb) && (this.stream.getCursor() in cb.data))) {\n                this.swapData();\n            };\n        },\n        saveEdit: function() {\n            if (!m.hasClass(this.root, \"fbPhotoSnowliftEditMode\")) {\n                return\n            };\n            j.loadModules([\"PhotoInlineEditor\",\"Form\",], function(cb, db) {\n                var eb = cb.getInstance(this.getViewerConst());\n                (eb && db.bootstrap(eb.getForm().controller));\n            }.bind(this));\n        },\n        mouseLeaveListener: function(event) {\n            this.unhiliteAllTags();\n            this.reHilitePendingTag();\n        },\n        hilitePagerOnMouseMove: function(event) {\n            var cb = na.getEventPosition(event), db = na.getElementPosition(this.stage);\n            if (x.isRTL()) {\n                var eb = na.getElementDimensions(this.stage);\n                this.stagePagerPrev = ((eb.x - ((cb.x - db.x))) < bb.GOPREV_AREA);\n            }\n             else this.stagePagerPrev = ((cb.x - db.x) < bb.GOPREV_AREA);\n        ;\n            m.conditionClass(this.prevPager, \"hilightPager\", this.stagePagerPrev);\n            m.conditionClass(this.nextPager, \"hilightPager\", !this.stagePagerPrev);\n            var fb, gb = event.getTarget();\n            if (((!z.byClass(gb, \"snowliftOverlay\") && !z.byClass(gb, \"bottomBarActions\")) && !z.byClass(gb, \"snowliftPager\"))) {\n                fb = bb.PAGER_FADE;\n            };\n            this.showPagers(fb);\n        },\n        showPagers: function(cb) {\n            clearTimeout(this.fadePagerTimer);\n            this.setStagePagersState(\"active\");\n            if ((typeof cb !== \"undefined\")) {\n                this.fadePagerTimer = this.hidePagers.bind(this).defer(cb);\n            };\n        },\n        hidePagers: function() {\n            var cb = o.scry(this.getRoot(), \".fbPhotosPhotoActionsMenu\")[0];\n            if (cb) {\n                return\n            };\n            clearTimeout(this.fadePagerTimer);\n            this.setStagePagersState(\"inactive\");\n        },\n        getTagger: function() {\n            if (!this.PhotoTagger) {\n                return null\n            };\n            var cb = this.PhotoTagger.getInstance(aa.VIEWER_SNOWLIFT);\n            if ((!cb || !cb.tagHoverFacebox)) {\n                return null\n            };\n            return cb;\n        },\n        hiliteAllBoxes: function() {\n            o.scry(this.stage, \"div.tagsWrapper div.faceBox\").forEach(function(cb) {\n                m.addClass(cb, \"otherActive\");\n            });\n        },\n        flashAllTags: function() {\n            var cb = this.stream.getCurrentImageData().info.fbid;\n            if (this.sessionPhotosHilited[cb]) {\n                return\n            };\n            o.scry(this.stage, \"div.tagsWrapper div.tagBox\").forEach(function(db) {\n                m.addClass(db, \"hover\");\n            });\n            this.sessionPhotosHilited[cb] = true;\n            this.unhiliteTimer = this.unhiliteAllTags.bind(this).defer(2000, true);\n        },\n        unhiliteAllTags: function() {\n            clearTimeout(this.unhiliteTimer);\n            o.scry(this.stage, \"div.tagsWrapper div.hover\").forEach(function(db) {\n                m.removeClass(db, \"hover\");\n            });\n            if (this.hilitAllTagsAndBoxesOnHover) {\n                o.scry(this.stage, \"div.tagsWrapper div.otherActive\").forEach(function(db) {\n                    m.removeClass(db, \"otherActive\");\n                });\n            };\n            this.hilitedTag = null;\n            if (!m.hasClass(this.root, \"taggingMode\")) {\n                var cb = this.getTagger();\n                if (cb) {\n                    cb.hideTagger();\n                    cb.setCurrentFacebox(null);\n                }\n            ;\n            }\n        ;\n        },\n        switchHilitedTags: function(cb, db) {\n            if ((this.switchTimer !== null)) {\n                clearTimeout(this.switchTimer);\n                this.switchTimer = null;\n            }\n        ;\n            this.unhiliteAllTags();\n            if (this.hilitAllTagsAndBoxesOnHover) {\n                this.hiliteAllBoxes();\n            };\n            var eb = va(cb);\n            if (eb) {\n                this.hilitedTag = cb;\n                if ((!m.hasClass(this.root, \"taggingMode\") && ea.isFacebox(this.hilitedTag))) {\n                    var fb = this.getTagger();\n                    if (fb) {\n                        m.addClass(eb, \"hover\");\n                        var gb = fb.getFacebox(cb);\n                        fb.setCurrentFacebox(gb);\n                        if (gb) {\n                            fb.addTagFromFacebox(gb);\n                        };\n                    }\n                ;\n                }\n                 else m.addClass(eb, \"hover\");\n            ;\n                if (((m.hasClass(eb, \"tagBoxPending\") && !m.hasClass(eb, \"showPendingTagName\")) && (db === true))) {\n                    o.scry(this.stage, \"div.tagsWrapper div.showPendingTagName\").forEach(function(hb) {\n                        m.removeClass(hb, \"showPendingTagName\");\n                    });\n                    m.addClass(eb, \"showPendingTagName\");\n                }\n            ;\n            }\n        ;\n        },\n        reHilitePendingTag: function() {\n            var cb = va(this.hilitedTag);\n            if ((cb && m.hasClass(cb, \"showPendingTagName\"))) {\n                return\n            };\n            var db = o.scry(this.stage, \"div.tagsWrapper div.showPendingTagName\")[0];\n            if (db) {\n                this.switchHilitedTags(db.id);\n            };\n        },\n        hiliteTagsOnMouseMove: function(event) {\n            if ((!this.stream.getCurrentExtraData() || this.getVideoOnStage())) {\n                return\n            };\n            if ((this.switchTimer !== null)) {\n                return\n            };\n            var cb = event.getTarget();\n            if (((((((z.byClass(cb, \"snowliftOverlay\") || z.byClass(cb, \"fbPhotoSnowliftTagApproval\")) || z.byClass(cb, \"tagPointer\")) || z.byClass(cb, \"arrow\")) || z.byClass(cb, \"faceboxSuggestion\")) || z.byClass(cb, \"typeaheadWrapper\")) || z.byClass(cb, \"photoTagTypeahead\"))) {\n                return\n            };\n            var db = z.byClass(cb, \"tagBoxPending\"), eb = false;\n            if (this.hilitedTag) {\n                var fb = va(this.hilitedTag);\n                eb = (fb && m.hasClass(fb, \"tagBoxPending\"));\n            }\n        ;\n            var gb = ((((!this.hilitedTag && db)) || ((!eb && db))));\n            if (gb) {\n                this.switchHilitedTags(db.id);\n                return;\n            }\n        ;\n            if ((db && ((db.id == this.hilitedTag)))) {\n                return\n            };\n            var hb = 250, ib = ea.absoluteToNormalizedPosition(this.image, na.getEventPosition(event));\n            if (this.currentTagHasPrecedence(ib)) {\n                return\n            };\n            var jb = ea.getNearestBox(this.stream.getCurrentExtraData().tagRects, ib);\n            if (!jb) {\n                if (!eb) {\n                    this.unhiliteAllTags();\n                    this.reHilitePendingTag();\n                }\n            ;\n                return;\n            }\n        ;\n            var kb = null;\n            if (eb) {\n                var lb = {\n                };\n                lb[this.hilitedTag] = this.stream.getCurrentExtraData().tagRects[this.hilitedTag];\n                kb = ea.getNearestBox(lb, ib);\n            }\n        ;\n            if (((kb !== null) && eb)) {\n                return\n            };\n            if ((this.hilitedTag != jb)) {\n                if (eb) {\n                    this.switchTimer = this.switchHilitedTags.bind(this, jb).defer(hb);\n                }\n                 else {\n                    if (this.showHover) {\n                        if (!this.seenTags) {\n                            this.seenTags = [];\n                        };\n                        if (!this.seenTags[jb]) {\n                            ba.addFaceTagImpression();\n                            this.seenTags[jb] = true;\n                        }\n                    ;\n                    }\n                ;\n                    this.switchHilitedTags(jb);\n                }\n            \n            };\n        },\n        currentTagHasPrecedence: function(cb) {\n            if (!this.hilitedTag) {\n                return false\n            };\n            if ((this.stream.getCurrentExtraData().tagRects[this.hilitedTag] === undefined)) {\n                this.hilitedTag = null;\n                return false;\n            }\n        ;\n            var db = this.stream.getCurrentExtraData().tagRects[this.hilitedTag], eb = new ga((db.t + ((db.h() / 2))), db.r, (db.b + ((ea.isFacebox(this.hilitedTag) ? 10 : 0))), db.l, db.domain);\n            return eb.contains(cb);\n        },\n        getVideoOnStage: function() {\n            var cb = (this.stream && this.stream.getCurrentImageData());\n            return (cb && cb.video);\n        },\n        shouldPageOnAction: function(cb, db) {\n            if ((!this.isOpen || this.isShowingLikePhotoConfirmation)) {\n                return false\n            };\n            var eb = (o.isNode(db) && (((z.byClass(db, \"snowliftPager\") || z.byClass(db, \"stagePagers\")) || z.byClass(db, \"pivotPageColumn\")))), fb = (o.isNode(db) && z.byClass(db, \"stage\")), gb = m.hasClass(db, \"faceBox\"), hb = ((((((((fb && m.hasClass(this.root, \"taggingMode\"))) || z.byClass(db, \"tagBoxPending\")) || z.byClass(db, \"tagBoxPendingResponse\")) || z.byClass(db, \"fbPhotoTagApprovalBox\")) || z.byClass(db, \"tag\")) || ((this.cropper && this.cropper.croppingMode))));\n            if (hb) {\n                return false\n            };\n            return (((((cb == u.LEFT) || (cb == u.RIGHT)) || ((!m.hasClass(this.root, \"taggingMode\") && gb))) || eb) || fb);\n        },\n        keyHandler: function(cb, event) {\n            if ((event.getModifiers().any || (v.getTopmostLayer() !== this.spotlight))) {\n                return true\n            };\n            switch (q.getKeyCode(event)) {\n              case u.LEFT:\n            \n              case u.RIGHT:\n                if (!this.pagersOnKeyboardNav) {\n                    this.showPagers(bb.PAGER_FADE);\n                };\n                this.pageListener(event);\n                return false;\n              case 70:\n                return this.toggleFullScreen();\n              case 76:\n                return this.likePhotoWithKey();\n            };\n        },\n        pageListener: function(event) {\n            var cb = q.getKeyCode(event), db = event.getTarget();\n            if (!this.shouldPageOnAction(cb, db)) {\n                return\n            };\n            var eb = 0;\n            if ((cb == u.RIGHT)) {\n                eb = 1;\n                ba.setPagingAction(\"key_right\");\n            }\n             else if ((cb == u.LEFT)) {\n                eb = -1;\n                ba.setPagingAction(\"key_left\");\n            }\n             else if (z.byClass(db, \"next\")) {\n                eb = 1;\n                ba.setPagingAction(\"click_next\");\n            }\n             else if (z.byClass(db, \"prev\")) {\n                eb = -1;\n                ba.setPagingAction(\"click_prev\");\n            }\n             else if (!this.stagePagerPrev) {\n                eb = 1;\n                ba.setPagingAction(\"click_stage\");\n            }\n             else {\n                eb = -1;\n                ba.setPagingAction(\"click_stage_back\");\n            }\n            \n            \n            \n            \n        ;\n            var fb = o.scry(this.ufiForm, \"input.mentionsHidden\"), gb = false;\n            for (var hb = 0; (hb < fb.length); hb++) {\n                if (!s.isEmpty(fb[hb])) {\n                    gb = true;\n                    break;\n                }\n            ;\n            };\n            if (((gb || m.hasClass(this.root, \"fbPhotoSnowliftEditMode\")) || ((this.cropper && this.cropper.croppingMode)))) {\n                this.warnLeavePage(eb);\n            }\n             else {\n                this.page(eb, (ma.chrome() && r.isFullScreen()));\n                ab(\"snowlift\", db, event).uai(ba.pagingAction);\n            }\n        ;\n        },\n        warnLeavePage: function(cb) {\n            new n().setTitle(\"Are you sure you want to leave this page?\").setBody(\"You have unsaved changes that will be lost if you leave the page.\").setButtons([{\n                name: \"leave_page\",\n                label: \"Leave this Page\",\n                handler: this.page.bind(this, cb)\n            },{\n                name: \"continue_editing\",\n                label: \"Stay on this Page\",\n                className: \"inputaux\"\n            },]).setModal(true).show();\n        },\n        page: function(cb, db) {\n            if (!this.stream.isValidMovement(cb)) {\n                this.showPagers(bb.PAGER_FADE);\n                return;\n            }\n        ;\n            this.lastPage = Date.now();\n            this.unhiliteAllTags();\n            this.seenTags = [];\n            var eb = this.getVideoOnStage();\n            if (eb) {\n                this.switchVideo(eb, false);\n            };\n            if ((this.pivots && this.pivots.page(cb))) {\n                return\n            };\n            g.inform(\"PhotoSnowlift.PAGE\");\n            ja.hide();\n            this.recacheData();\n            this.stream.moveCursor(cb);\n            m.hide(this.image);\n            if (this.stream.errorInCurrent()) {\n                this.setLoadingState(bb.STATE_HTML, true);\n                m.show(this.errorBox);\n                return;\n            }\n        ;\n            var fb = this.stream.getCurrentImageData();\n            if (fb) {\n                var gb = this.getImageURL(fb);\n                if (gb) {\n                    this.switchImage(gb, null, true);\n                }\n                 else if (fb.video) {\n                    this.switchVideo(fb.video, true);\n                }\n            ;\n                if (!db) {\n                    this.replaceUrl = true;\n                    wa(fb.info.permalink);\n                }\n            ;\n                this.setLoadingState(bb.STATE_IMAGE_DATA, false);\n            }\n             else {\n                this.setLoadingState(bb.STATE_IMAGE_PIXELS, true);\n                this.setLoadingState(bb.STATE_IMAGE_DATA, true);\n            }\n        ;\n            if (this.stream.getCurrentHtml()) {\n                this.swapData();\n            }\n             else this.setLoadingState(bb.STATE_HTML, true);\n        ;\n            this.disableAds = this.disableAdsForSession;\n            this.loadAds();\n            if (this.cropper) {\n                this.cropper.resetPhoto();\n            };\n        },\n        logImpressionDetailsForPhoto: function() {\n            var cb = [].concat(o.scry(oa(\"fbPhotoSnowliftTagList\"), \"input.photoImpressionDetails\"), o.scry(oa(\"fbPhotoSnowliftFeedback\"), \"input.photoImpressionDetails\"));\n            if ((cb.length === 0)) {\n                return\n            };\n            var db = {\n            };\n            for (var eb = 0; (eb < cb.length); eb++) {\n                db[cb[eb].name] = cb[eb].value;;\n            };\n            if (this.getVideoOnStage()) {\n                db.width = 0;\n                db.height = 0;\n            }\n             else {\n                var fb = this.getImageDimensions(this.stream.getCurrentImageData());\n                db.width = fb.x;\n                db.height = fb.y;\n            }\n        ;\n            ba.addDetailData(this.stream.getCursor(), db);\n            ca.setIsLogAdData(true);\n        },\n        loadAds: function() {\n            if (this.disableAds) {\n                return\n            };\n            ca.loadAdsFromUserActivity();\n        },\n        transitionHandler: function(cb) {\n            if ((((cb.getQueryData().closeTheater || cb.getQueryData().permPage) || cb.getQueryData().makeprofile) || this.returningToStart)) {\n                if (this.isOpen) {\n                    this.close();\n                };\n                this.transitionHandlerRegistered = false;\n                return false;\n            }\n        ;\n            if (this.replaceUrl) {\n                this.replaceUrl = false;\n                this._uriStack.push(cb.getQualifiedURI().toString());\n                y.transitionComplete(true);\n                return true;\n            }\n        ;\n            var db = this._uriStack.length;\n            if (((db >= 2) && (this._uriStack[(db - 2)] == cb.getQualifiedURI().toString()))) {\n                this._uriStack.pop();\n            };\n            var eb = this.stream.getCursorForURI(cb.getUnqualifiedURI().toString());\n            if (eb) {\n                var fb = this.stream.getRelativeMovement(eb);\n                this.page(fb, true);\n                y.transitionComplete(false);\n                return true;\n            }\n        ;\n            if (this.isOpen) {\n                y.transitionComplete(true);\n                this.close();\n                return true;\n            }\n        ;\n            this.transitionHandlerRegistered = false;\n            return false;\n        },\n        recacheData: function() {\n            if (!this.loadingStates.html) {\n                var cb = this.stream.getCurrentHtml();\n                for (var db in cb) {\n                    cb[db] = sa(oa(db).childNodes);\n                    o.empty(oa(db));\n                };\n            }\n        ;\n        },\n        reloadIfTimeout: function() {\n            if (!t.hasLoaded(this.image)) {\n                var cb = this.makeNewImage(this.image.src, true);\n                q.listen(cb, \"load\", this.useImage.bind(this, cb, null, true));\n            }\n        ;\n        },\n        useImage: function(cb, db, eb) {\n            if ((eb && t.hasLoaded(this.image))) {\n                return\n            };\n            o.replace(this.image, cb);\n            this.image = cb;\n            g.inform(\"Amoeba/instrument\", [this.image,\"image\",], g.BEHAVIOR_PERSISTENT);\n            this.adjustStageSize(db);\n        },\n        makeNewImage: function(cb, db) {\n            if (this.imageLoadingTimer) {\n                clearTimeout(this.imageLoadingTimer);\n                this.imageLoadingTimer = null;\n            }\n             else if (!db) {\n                this.imageRefreshTimer = setTimeout(this.reloadIfTimeout.bind(this), bb.LOADING_TIMEOUT);\n            }\n        ;\n            var eb = o.create(\"img\", {\n                className: \"spotlight\",\n                alt: \"\"\n            });\n            eb.setAttribute(\"aria-describedby\", \"fbPhotosSnowliftCaption\");\n            eb.setAttribute(\"aria-busy\", \"true\");\n            q.listen(eb, \"load\", pa(function() {\n                clearTimeout(this.imageRefreshTimer);\n                this.image.setAttribute(\"aria-busy\", \"false\");\n                this.setLoadingState(this.STATE_IMAGE_PIXELS, false);\n                (function() {\n                    if (this.isOpen) {\n                        this.adjustStageSize();\n                        this.adjustForNewData();\n                    }\n                ;\n                }).bind(this).defer();\n            }.bind(this), \"photo_theater\"));\n            eb.src = cb;\n            return eb;\n        },\n        switchImage: function(cb, db, eb) {\n            m.hide(this.image);\n            m.hide(this.errorBox);\n            this.setLoadingState(this.STATE_IMAGE_PIXELS, true);\n            var fb = (this.stream && this.stream.getCurrentImageData());\n            if (fb) {\n                ba.addPhotoView(fb.info, this.shouldShowHiRes(fb), (this.fullscreen && r.isFullScreen()));\n            };\n            this.useImage(this.makeNewImage(cb, false), db, false);\n            if (eb) {\n                this.stream.preloadImages(this.shouldShowHiRes(fb));\n            };\n            if ((this.cropper && this.cropper.croppingMode)) {\n                this.cropper.resetPhoto();\n            };\n            g.inform(\"PhotoSnowlift.SWITCH_IMAGE\");\n        },\n        switchVideo: function(cb, db) {\n            var eb = (\"swf_\" + cb);\n            if (db) {\n                m.addClass(this.stageWrapper, \"showVideo\");\n                var fb = o.create(\"div\", {\n                    className: \"videoStageContainer\"\n                });\n                o.appendContent(this.videoStage, fb);\n                fb.id = cb;\n                if ((window[eb] && !va(eb))) {\n                    window[eb].write(cb);\n                };\n                var gb = (\"video_warning_\" + cb), hb = va(cb);\n                if (!this.videoWarnings) {\n                    this.videoWarnings = [];\n                };\n                if ((hb && this.videoWarnings[gb])) {\n                    o.setContent(hb, this.videoWarnings[gb]);\n                };\n                this.adjustStageSizeForVideo.bind(this, eb).defer();\n            }\n             else {\n                (window[eb] && window[eb].addVariable(\"video_autoplay\", 0));\n                (this.videoLoadTimer && clearTimeout(this.videoLoadTimer));\n                o.empty(this.videoStage);\n                m.removeClass(this.stageWrapper, \"showVideo\");\n            }\n        ;\n        },\n        checkVideoStatus: function(cb) {\n            if (this.videoLoadTimer) {\n                clearTimeout(this.videoLoadTimer);\n            };\n            var db = this.getVideoOnStage();\n            if (!db) {\n                return;\n            }\n             else {\n                var eb = (\"swf_\" + db);\n                if ((cb !== eb)) {\n                    return\n                };\n                this.adjustStageSizeForVideo(cb);\n            }\n        ;\n        },\n        adjustStageSizeForVideo: function(cb) {\n            var db = va(cb);\n            if (!db) {\n                this.videoLoadTimer = setTimeout(this.checkVideoStatus.bind(this, cb), 200);\n            }\n             else this.adjustStageSize(new na(db.width, db.height));\n        ;\n        },\n        handleServerError: function(cb, db) {\n            o.setContent(this.errorBox, cb);\n            this.storeFromData(db);\n        },\n        swapData: function() {\n            var cb, db = this.stream.getCurrentHtml();\n            if (db) {\n                this.setLoadingState(bb.STATE_HTML, false);\n                for (var eb in db) {\n                    cb = va(eb);\n                    (cb && o.setContent(cb, db[eb]));\n                };\n                g.inform(\"PhotoSnowlift.DATA_CHANGE\", this.stream.getCurrentImageData().info, g.BEHAVIOR_STATE);\n                if (this.stream.getCurrentExtraData()) {\n                    g.inform(\"PhotoSnowlift.EXTRA_DATA_CHANGE\", this.stream.getCurrentExtraData(), g.BEHAVIOR_STATE);\n                };\n            }\n        ;\n            this.adjustScroller();\n            this.adjustStageSize();\n            this.scrollableArea.showScrollbar(false);\n            this.adjustForNewData();\n            this.logImpressionDetailsForPhoto();\n            if (this.showFlashTags) {\n                this.flashAllTags();\n            };\n        },\n        updateTotalCount: function(cb, db, eb) {\n            var fb = this.stream.getCurrentHtml();\n            if (fb) {\n                var gb = oa(\"fbPhotoSnowliftPositionAndCount\");\n                o.replace(gb, eb);\n                gb = eb;\n                m.show(gb);\n                var hb = \"fbPhotoSnowliftPositionAndCount\";\n                fb[hb] = sa(gb.childNodes);\n            }\n        ;\n            this.stream.setTotalCount(cb);\n            this.stream.setFirstCursorIndex(db);\n        },\n        addPhotoFbids: function(cb, db, eb, fb) {\n            if (((fb && this.sessionID) && (fb != this.sessionID))) {\n                return\n            };\n            var gb = (this.stream.getCursor() === null);\n            this.stream.attachToFbidsList(cb, db, eb);\n            if ((eb && gb)) {\n                this.page(0, true);\n            };\n            if ((this.pivots && eb)) {\n                this.pivots.setCycleCount(this.stream.calculateDistance(this.stream.getCursor(), this.stream.firstCursor));\n            };\n            if ((!this.pagersShown && this.stream.canPage())) {\n                this.setStagePagersState(\"ready\");\n            };\n        },\n        attachTagger: function(cb) {\n            o.appendContent(this.stageActions, cb);\n        },\n        storeFromData: function(cb) {\n            if (!this.isOpen) {\n                return\n            };\n            if (((cb.ssid && this.sessionID) && (this.sessionID != cb.ssid))) {\n                return\n            };\n            var db = this.stream.storeToCache(cb);\n            if ((\"error\" in db)) {\n                this.checkState(bb.STATE_ERROR);\n                return;\n            }\n        ;\n            if ((\"init\" in db)) {\n                this.initDataFetched(db.init);\n                if (this.openExplicitly) {\n                    this.replaceUrl = true;\n                    wa(this.stream.getCurrentImageData().info.permalink);\n                }\n            ;\n                if (this.stream.canPage()) {\n                    this.setStagePagersState(\"ready\");\n                };\n                (this.ua && this.ua.add_event(\"ufi\"));\n            }\n        ;\n            if ((\"image\" in db)) {\n                this.checkState(bb.STATE_IMAGE_DATA);\n            };\n            if ((\"data\" in db)) {\n                this.checkState(bb.STATE_HTML);\n            };\n        },\n        setStagePagersState: function(cb) {\n            switch (cb) {\n              case \"ready\":\n                m.addClass(this.root, \"pagingReady\");\n                this.pagersShown = true;\n                (this.ua && this.ua.add_event(\"arrows\"));\n                return;\n              case \"active\":\n                m.addClass(this.root, \"pagingActivated\");\n                return;\n              case \"inactive\":\n                m.removeClass(this.root, \"pagingActivated\");\n                return;\n              case \"disabled\":\n            \n              case \"reset\":\n                m.removeClass(this.root, \"pagingReady\");\n                return;\n            };\n        },\n        deletePhoto: function(cb) {\n            this.closeRefresh();\n        },\n        closeRefresh: function() {\n            this.refreshOnClose = true;\n            this.closeHandler();\n        },\n        onHiliteTag: function(cb, db) {\n            if ((db.version != aa.VIEWER_SNOWLIFT)) {\n                return\n            };\n            var eb = db.tag;\n            if (eb) {\n                this.switchHilitedTags(eb, true);\n            };\n        },\n        onUpdateTagBox: function(cb, db) {\n            if ((db.version == aa.VIEWER_SNOWLIFT)) {\n                this.updateTagBox(db.id, db.approve);\n            };\n        }\n    });\n    e.exports = bb;\n});\n__d(\"Spotlight\", [\"JSXDOM\",\"Arbiter\",\"ArbiterMixin\",\"Class\",\"DOM\",\"Layer\",\"LayerAutoFocus\",\"LayerTabIsolation\",\"ModalLayer\",\"Vector\",\"copyProperties\",\"csx\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSXDOM\"), h = b(\"Arbiter\"), i = b(\"ArbiterMixin\"), j = b(\"Class\"), k = b(\"DOM\"), l = b(\"Layer\"), m = b(\"LayerAutoFocus\"), n = b(\"LayerTabIsolation\"), o = b(\"ModalLayer\"), p = b(\"Vector\"), q = b(\"copyProperties\"), r = b(\"csx\"), s = b(\"cx\");\n    function t(v, w) {\n        this.parent.construct(this, v, w);\n        this.stageMinSize = new p(0, 0);\n        this.stagePadding = new p(0, 0);\n    };\n    j.extend(t, l);\n    q(t.prototype, i, {\n        stageMinSize: null,\n        stagePadding: null,\n        _buildWrapper: function(v, w) {\n            return (g.div({\n                className: \"_n8 _3qx\"\n            }, g.div({\n                className: \"_n9\"\n            }, w)));\n        },\n        _getDefaultBehaviors: function() {\n            return this.parent._getDefaultBehaviors().concat([u,m,n,o,]);\n        },\n        getContentRoot: function() {\n            if (!this._content) {\n                this._content = k.find(this.getRoot(), \"div._n3\");\n            };\n            return this._content;\n        },\n        configure: function(v) {\n            if (v.stageMinSize) {\n                this.stageMinSize = v.stageMinSize;\n            };\n            if (v.stagePadding) {\n                this.stagePadding = v.stagePadding;\n            };\n        },\n        onContentLoaded: function() {\n            this.inform(\"content-load\");\n        },\n        updatePermalink: function(v) {\n            this.inform(\"permalinkchange\", v);\n        }\n    });\n    function u(v) {\n        this._layer = v;\n    };\n    q(u.prototype, {\n        _subscription: null,\n        enable: function() {\n            this._subscription = this._layer.subscribe([\"show\",\"hide\",], function(v, w) {\n                if ((v === \"show\")) {\n                    h.inform(\"layer_shown\", {\n                        type: \"Spotlight\"\n                    });\n                }\n                 else h.inform(\"layer_hidden\", {\n                    type: \"Spotlight\"\n                });\n            ;\n            });\n        },\n        disable: function() {\n            this._subscription.unsubscribe();\n            this._subscription = null;\n        }\n    });\n    e.exports = t;\n});");
// 20729
fpc.call(JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_1[0], o7,"s59b577b526f180e5d77954be1f7288f31b8c5e38");
// undefined
o7 = null;
// 20730
geval("if (JSBNG__self.CavalryLogger) {\n    CavalryLogger.start_js([\"+h1d2\",]);\n}\n;\n;\n__d(\"ImageUtils\", [\"UserAgent\",], function(a, b, c, d, e, f) {\n    var g = b(\"UserAgent\"), h = {\n        hasLoaded: function(i) {\n            if (((i.naturalWidth !== undefined))) {\n                return ((i.complete && ((i.width !== 0))));\n            }\n             else if (((((((i.height == 20)) && ((i.width == 20)))) && i.complete))) {\n                return false;\n            }\n             else if (((((i.complete === undefined)) && ((g.webkit() < 500))))) {\n                var j = new JSBNG__Image();\n                j.src = i.src;\n                return j.complete;\n            }\n            \n            \n        ;\n        ;\n            return i.complete;\n        }\n    };\n    e.exports = h;\n});\n__d(\"PhotoEverstoreLogger\", [\"JSBNG__Event\",\"AsyncRequest\",\"copyProperties\",\"ImageUtils\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"AsyncRequest\"), i = b(\"copyProperties\"), j = b(\"ImageUtils\"), k = {\n        BATCH_WINDOW_MS: 500,\n        storedLog: []\n    };\n    function l() {\n    \n    };\n;\n    i(l, {\n        _log: function(n) {\n            k.storedLog.push(n);\n            if (((k.storedLog.length == 1))) {\n                JSBNG__setTimeout(m, k.BATCH_WINDOW_MS, false);\n            }\n        ;\n        ;\n        },\n        logImmediately: function(n) {\n            l._log(n);\n        },\n        registerForLogging: function(n) {\n            if (j.hasLoaded(n)) {\n                l._log(n.src);\n            }\n             else g.listen(n, \"load\", function(JSBNG__event) {\n                l._log(n.src);\n            });\n        ;\n        ;\n        }\n    });\n    function m() {\n        var n = k.storedLog;\n        k.storedLog = [];\n        var o = JSON.stringify(n);\n        new h().setURI(\"/ajax/photos/logging/everstore_logging.php\").setData({\n            loggedUrls: o\n        }).setMethod(\"POST\").setOption(\"suppressErrorHandlerWarning\", true).setOption(\"suppressErrorAlerts\", true).send();\n    };\n;\n    e.exports = l;\n});\n__d(\"PhotoSessionLog\", [\"AsyncRequest\",\"Run\",\"Vector\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = b(\"Run\"), i = b(\"Vector\"), j = b(\"copyProperties\");\n    function k() {\n    \n    };\n;\n    j(k, {\n        UNKNOWN: 0,\n        ESC: 1,\n        X: 2,\n        OUTSIDE: 3,\n        UNLOAD: 4,\n        NAVIGATE: 5,\n        AGGREGATE: 6,\n        LEAVE: 7,\n        PERMALINK: 0,\n        SNOWLIFT: 6,\n        AGGREGATION_COUNT: 20,\n        set: null,\n        time: null,\n        views: 0,\n        fbidList: [],\n        details: {\n        },\n        width: 0,\n        height: 0,\n        first: false,\n        last: false,\n        logIds: false,\n        version: null,\n        source: null,\n        buttonLikes: 0,\n        pagingAction: \"\",\n        faceTagImpressions: 0,\n        cycle: false,\n        endOfRelevant: false,\n        relevantCount: 0,\n        initLogging: function(l) {\n            this.set = null;\n            this.time = new JSBNG__Date();\n            this.views = 0;\n            this.hiResLoads = 0;\n            this.fullScreenViews = {\n            };\n            this.first = true;\n            this.last = false;\n            this.logIds = false;\n            this.version = l;\n            this.buttonLikes = 0;\n            this.pagingAction = \"\";\n            this.faceTagImpressions = 0;\n            this.cycle = false;\n            this.endOfRelevant = false;\n            this.relevantCount = 0;\n            if (((l === k.SNOWLIFT))) {\n                var m = i.getViewportDimensions();\n                this.width = m.x;\n                this.height = m.y;\n            }\n        ;\n        ;\n        },\n        setLogFbids: function(l) {\n            this.logIds = l;\n        },\n        setPhotoSet: function(l) {\n            this.set = l;\n        },\n        addButtonLike: function() {\n            this.buttonLikes++;\n        },\n        setPagingAction: function(l) {\n            this.pagingAction = l;\n        },\n        addFaceTagImpression: function() {\n            this.faceTagImpressions++;\n        },\n        setCycle: function(l) {\n            this.cycle = l;\n        },\n        setEndOfRelevant: function(l) {\n            this.endOfRelevant = l;\n        },\n        setRelevantCount: function(l) {\n            this.relevantCount = l;\n        },\n        setEndMetrics: function(l) {\n            this.endMetrics = l;\n        },\n        setSource: function(l) {\n            this.source = l;\n        },\n        addPhotoView: function(l, m, n) {\n            if (((this.logIds && ((this.views >= this.AGGREGATION_COUNT))))) {\n                this.logPhotoViews(this.AGGREGATE);\n            }\n        ;\n        ;\n            this.views++;\n            if (l) {\n                this.fbidList.push([l.fbid,l.owner,JSBNG__Date.now(),]);\n            }\n        ;\n        ;\n            if (m) {\n                this.hiResLoads++;\n            }\n        ;\n        ;\n            if (n) {\n                this.fullScreenViews[l.fbid] = true;\n            }\n        ;\n        ;\n        },\n        logEnterFullScreen: function(l) {\n            this.fullScreenViews[l] = true;\n        },\n        addDetailData: function(l, m) {\n            if (!this.details[l]) {\n                this.details[l] = {\n                    t: m.num_tags,\n                    l: m.has_location,\n                    c: m.has_caption,\n                    cm: m.comment_count,\n                    lk: m.like_count,\n                    w: m.width,\n                    h: m.height,\n                    ad: \"{}\",\n                    p: this.pagingAction\n                };\n            }\n        ;\n        ;\n        },\n        updateAdData: function(l, m) {\n            if (this.details[l]) {\n                this.details[l].ad = JSON.stringify(m);\n            }\n        ;\n        ;\n        },\n        logPhotoViews: function(l) {\n            if ((((!this.views) || ((((this.version === k.SNOWLIFT)) && ((l == k.LEAVE))))))) {\n                return;\n            }\n        ;\n        ;\n            if (((l != this.AGGREGATE))) {\n                this.last = true;\n            }\n        ;\n        ;\n            var m = {\n                set: this.set,\n                time: ((new JSBNG__Date() - this.time)),\n                fbids: ((this.logIds ? this.fbidList : [])),\n                details: ((this.logIds ? this.details : {\n                })),\n                first: this.first,\n                last: this.last,\n                close: ((l ? l : this.UNKNOWN)),\n                button_likes: this.buttonLikes,\n                version: this.version,\n                face_imp: this.faceTagImpressions,\n                endmetric: this.endMetrics,\n                cycle: this.cycle,\n                end_relev: this.endOfRelevant,\n                relev_count: this.relevantCount,\n                source: this.source\n            };\n            if (((this.version === k.SNOWLIFT))) {\n                var n = i.getViewportDimensions();\n                m.width = ((n.x || this.width));\n                m.height = ((n.y || this.height));\n                if (((this.hiResLoads > 0))) {\n                    m.hires_loads = this.hiResLoads;\n                }\n            ;\n            ;\n                if (this.last) {\n                    var o = Object.keys(this.fullScreenViews).length;\n                    if (((o > 0))) {\n                        m.fullscreen = o;\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            new g().setURI(\"/ajax/photos/logging/session_logging.php\").setAllowCrossPageTransition(true).setOption(\"asynchronous\", ((l != k.UNLOAD))).setOption(\"suppressErrorHandlerWarning\", true).setData(m).send();\n            this.views = 0;\n            this.hiResLoads = 0;\n            this.fbidList = [];\n            this.details = {\n            };\n            this.first = false;\n            this.buttonLikes = 0;\n            if (this.last) {\n                this.set = null;\n                this.logIds = false;\n                this.fullScreenViews = {\n                };\n            }\n        ;\n        ;\n        }\n    });\n    h.onUnload(function() {\n        k.logPhotoViews(k.UNLOAD);\n    });\n    h.onLeave(function() {\n        k.logPhotoViews(k.LEAVE);\n    });\n    e.exports = k;\n});\n__d(\"PhotoViewerImage\", [\"PhotoEverstoreLogger\",\"URI\",\"Vector\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"PhotoEverstoreLogger\"), h = b(\"URI\"), i = b(\"Vector\"), j = b(\"copyProperties\");\n    function k(l) {\n        this._hiResDimensions = ((l.hiResDimensions && i.deserialize(l.hiResDimensions)));\n        this._normalDimensions = ((l.normalDimensions && i.deserialize(l.normalDimensions)));\n        this._info = l.info;\n        this._video = l.video;\n        this._shouldLog = l.everstoreLogThis;\n        this._hiResSrc = l.hiResSrc;\n        this._normalSrc = l.normalSrc;\n        this._thumbSrc = l.thumbSrc;\n        this._isInverted = false;\n        this._data = l;\n    };\n;\n    j(k.prototype, {\n        getURIString: function() {\n            return h(this._info.permalink).getUnqualifiedURI().toString();\n        },\n        hasHiResDimensions: function() {\n            return !!this._hiResDimensions;\n        },\n        getHiResDimensions: function() {\n            return this._hiResDimensions;\n        },\n        getNormalDimensions: function() {\n            return this._normalDimensions;\n        },\n        getHiResSrc: function() {\n            return this._hiResSrc;\n        },\n        getNormalSrc: function() {\n            return this._normalSrc;\n        },\n        getThumbSrc: function() {\n            return this._thumbSrc;\n        },\n        getInfo: function() {\n            return this._info;\n        },\n        getPermalink: function() {\n            return this._info.permalink;\n        },\n        getHighestResSrc: function() {\n            return ((this._hiResSrc || this._normalSrc));\n        },\n        preload: function(l) {\n            if (this.getHighestResSrc()) {\n                if (((l && !this._resource))) {\n                    this._resource = new JSBNG__Image();\n                    this._resource.src = this.getHighestResSrc();\n                    if (this._shouldLog) {\n                        g.logImmediately(this._resource.src);\n                    }\n                ;\n                ;\n                }\n                 else if (((!l && !this._small))) {\n                    this._small = new JSBNG__Image();\n                    this._small.src = ((this._normalSrc || this._hiResSrc));\n                    if (this._shouldLog) {\n                        g.logImmediately(this._small.src);\n                    }\n                ;\n                ;\n                }\n                \n            ;\n            }\n        ;\n        ;\n        },\n        setDimensions: function(l, m) {\n            this.widthRatio = ((l / this._hiResDimensions.x));\n            this.heightRatio = ((m / this._hiResDimensions.y));\n            this._hiResDimensions = this._hiResDimensions.mul(this.widthRatio, this.heightRatio);\n            this._normalDimensions = this._normalDimensions.mul(this.widthRatio, this.heightRatio);\n        },\n        invertDimensions: function() {\n            this._hiResDimensions = new i(this._hiResDimensions.y, this._hiResDimensions.x);\n            this._normalDimensions = new i(this._normalDimensions.y, this._normalDimensions.x);\n            this._isInverted = !this._isInverted;\n        },\n        copy: function() {\n            return new k(this._data);\n        }\n    });\n    e.exports = k;\n});\n__d(\"PhotosConst\", [], function(a, b, c, d, e, f) {\n    var g = {\n        VIEWER_PERMALINK: 0,\n        VIEWER_SNOWLIFT: 6,\n        VIEWER_VAULTBOX: 8,\n        BULK_EDITOR: 3,\n        FLASH_UPLOADER: 4,\n        HTML5_UPLOADER: 10,\n        SIZE_NORMAL: \"n\",\n        PIC_NORMAL_FBX_SIZE: 180\n    };\n    e.exports = g;\n});\n__d(\"PhotosUtils\", [\"copyProperties\",\"Vector\",], function(a, b, c, d, e, f) {\n    var g = b(\"copyProperties\"), h = b(\"Vector\");\n    function i() {\n    \n    };\n;\n    g(i, {\n        getNearestBox: function(j, k) {\n            var l = Infinity, m = null;\n            {\n                var fin287keys = ((window.top.JSBNG_Replay.forInKeys)((j))), fin287i = (0);\n                var n;\n                for (; (fin287i < fin287keys.length); (fin287i++)) {\n                    ((n) = (fin287keys[fin287i]));\n                    {\n                        var o = j[n];\n                        if (o.contains(k)) {\n                            var p = k.distanceTo(o.getCenter());\n                            if (((p < l))) {\n                                l = p;\n                                m = n;\n                            }\n                        ;\n                        ;\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            return m;\n        },\n        absoluteToNormalizedPosition: function(j, k) {\n            var l = h.getElementPosition(j), m = h.getElementDimensions(j), n = k.sub(l).mul(((100 / m.x)), ((100 / m.y)));\n            n.domain = \"pure\";\n            return n;\n        },\n        normalizedToAbsolutePosition: function(j, k) {\n            var l = h.getElementPosition(j), m = h.getElementDimensions(j), n = k.mul(((m.x / 100)), ((m.y / 100))).add(l);\n            n.domain = \"JSBNG__document\";\n            return n;\n        },\n        isFacebox: function(j) {\n            return j.match(/^face:/);\n        }\n    });\n    e.exports = i;\n});\n__d(\"PhotoStreamCache\", [\"DOM\",\"HTML\",\"PhotosConst\",\"PhotoEverstoreLogger\",\"PhotoViewerImage\",\"JSBNG__Rect\",\"UIPagelet\",\"URI\",\"Vector\",\"copyProperties\",\"createArrayFrom\",\"ge\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOM\"), h = b(\"HTML\"), i = b(\"PhotosConst\"), j = b(\"PhotoEverstoreLogger\"), k = b(\"PhotoViewerImage\"), l = b(\"JSBNG__Rect\"), m = b(\"UIPagelet\"), n = b(\"URI\"), o = b(\"Vector\"), p = b(\"copyProperties\"), q = b(\"createArrayFrom\"), r = b(\"ge\");\n    function s() {\n    \n    };\n;\n    p(s, {\n        ERROR: \"error\",\n        HTML: \"html\",\n        IMAGE_DATA: \"image\",\n        EXTRA: \"extra\",\n        BUFFER_SIZE: 3,\n        INIT_BUCKET_SIZE: 4,\n        FULL_BUCKET_SIZE: 12,\n        ERROR_ID: -1,\n        INIT_PLACEHOLDER: 1\n    });\n    p(s.prototype, {\n        init: function(t, u, v) {\n            this.version = t;\n            this.pageletName = u;\n            this.pageletRootID = v;\n            this.bufferSize = s.BUFFER_SIZE;\n            this.fullBucketSize = s.FULL_BUCKET_SIZE;\n            this.initError = false;\n            this.isActive = true;\n            this.leftLock = false;\n            this.rightLock = false;\n            this.useAjaxPipe = true;\n            this.reset();\n        },\n        setUseAjaxPipe: function(t) {\n            this.useAjaxPipe = t;\n        },\n        reset: function() {\n            this.cache = {\n                image: {\n                },\n                extra: {\n                },\n                html: {\n                }\n            };\n            this.fbidList = [];\n            this.loaded = false;\n            this.allLoaded = false;\n            this.permalinkMap = {\n            };\n            this.position = 0;\n            this.totalCount = null;\n            this.firstCursor = null;\n            this.firstCursorIndex = null;\n        },\n        waitForInitData: function() {\n            this.fbidList.push(s.INIT_PLACEHOLDER);\n        },\n        destroy: function() {\n            this.reset();\n            this.isActive = false;\n        },\n        isLoaded: function() {\n            return this.loaded;\n        },\n        canPage: function() {\n            if (!this.isLoaded()) {\n                return false;\n            }\n        ;\n        ;\n            if (((this.totalCount !== null))) {\n                return ((this.totalCount > 1));\n            }\n        ;\n        ;\n            return ((this.getLength() > 1));\n        },\n        errorInCurrent: function() {\n            if (this.initError) {\n                return true;\n            }\n             else if (!this.isLoaded()) {\n                return false;\n            }\n            \n        ;\n        ;\n            return this.checkErrorAt(this.getCursor());\n        },\n        getLength: function() {\n            return this.fbidList.length;\n        },\n        getPhotoSet: function() {\n            return this.photoSetQuery.set;\n        },\n        getPhotoSetQuery: function() {\n            return this.photoSetQuery;\n        },\n        getCurrentImageData: function() {\n            return this.getImageData(this.getCursor());\n        },\n        getImageData: function(t) {\n            return this.getCacheContent(t, s.IMAGE_DATA);\n        },\n        getCurrentHtml: function() {\n            return this.getCacheContent(this.getCursor(), s.HTML);\n        },\n        getCurrentExtraData: function() {\n            return this.getCacheContent(this.getCursor(), s.EXTRA);\n        },\n        getCacheContent: function(t, u) {\n            if (((((!t || ((t === s.ERROR_ID)))) || ((t === s.INIT_PLACEHOLDER))))) {\n                return null;\n            }\n        ;\n        ;\n            return this.cache[u][t];\n        },\n        getCursorPos: function() {\n            return this.position;\n        },\n        getCursor: function() {\n            if (((((this.position >= 0)) && ((this.position < this.getLength()))))) {\n                return this.fbidList[this.position];\n            }\n        ;\n        ;\n            return null;\n        },\n        getCursorForURI: function(t) {\n            return this.permalinkMap[t];\n        },\n        calculatePositionForMovement: function(t) {\n            var u = ((this.position + t));\n            if (this.allLoaded) {\n                var v = this.getLength();\n                u = ((((v + ((u % v)))) % v));\n            }\n        ;\n        ;\n            return u;\n        },\n        isValidMovement: function(t) {\n            if (((!this.isLoaded() || !this.canPage()))) {\n                return false;\n            }\n        ;\n        ;\n            var u = this.calculatePositionForMovement(t);\n            return ((((this.getCursor() > 0)) || ((((u >= 0)) && ((u < this.getLength()))))));\n        },\n        moveCursor: function(t) {\n            if (!this.isValidMovement(t)) {\n                return;\n            }\n        ;\n        ;\n            this.position = this.calculatePositionForMovement(t);\n            if (((t !== 0))) {\n                this.loadMoreIfNeccessary(((t > 0)));\n            }\n        ;\n        ;\n        },\n        checkErrorAt: function(t) {\n            if (!this.isLoaded()) {\n                return false;\n            }\n        ;\n        ;\n            if (((t === s.ERROR_ID))) {\n                return true;\n            }\n        ;\n        ;\n            return false;\n        },\n        getRelativeMovement: function(t) {\n            for (var u = 0; ((u < this.getLength())); u++) {\n                if (((this.fbidList[u] == t))) {\n                    return ((u - this.position));\n                }\n            ;\n            ;\n            };\n        ;\n            return null;\n        },\n        preloadImages: function(t) {\n            var u, v, w = this.getLength(), x = this.cache.image, y = s.BUFFER_SIZE;\n            if (((w > ((y * 2))))) {\n                u = ((((((this.position + w)) - ((y % w)))) % w));\n                v = ((((this.position + y)) % w));\n            }\n             else {\n                u = 0;\n                v = ((w - 1));\n            }\n        ;\n        ;\n            while (((u != v))) {\n                var z = this.fbidList[u];\n                if (((this.version === i.VIEWER_VAULTBOX))) {\n                    ((x[z] && x[z].preload(t)));\n                }\n                 else if (((x[z] && x[z].url))) {\n                    if (((t && !x[z].resource))) {\n                        x[z].resource = new JSBNG__Image();\n                        x[z].resource.src = x[z].url;\n                        if (((x[z].everstoreLogThis === true))) {\n                            j.logImmediately(x[z].resource.src);\n                        }\n                    ;\n                    ;\n                    }\n                     else if (((!t && !x[z].small))) {\n                        x[z].small = new JSBNG__Image();\n                        x[z].small.src = ((x[z].smallurl || x[z].url));\n                        if (((x[z].everstoreLogThis === true))) {\n                            j.logImmediately(x[z].small.src);\n                        }\n                    ;\n                    ;\n                    }\n                    \n                ;\n                }\n                \n            ;\n            ;\n                u = ((((u + 1)) % w));\n            };\n        ;\n        },\n        loadMoreIfNeccessary: function(t) {\n            if (((((this.allLoaded || ((t && this.rightLock)))) || ((!t && this.leftLock))))) {\n                return;\n            }\n        ;\n        ;\n            var u = ((t ? 1 : -1)), v = ((this.position + ((this.bufferSize * u))));\n            if (((((v < 0)) && !this.checkErrorAt(this.getEndCursor(false))))) {\n                this.leftLock = true;\n                this.fetch(this.fullBucketSize, false);\n            }\n             else if (((((v > this.getLength())) && !this.checkErrorAt(this.getEndCursor(true))))) {\n                this.rightLock = true;\n                this.fetch(this.fullBucketSize, true);\n            }\n            \n        ;\n        ;\n        },\n        getEndCursor: function(t) {\n            return ((t ? this.fbidList[((this.getLength() - 1))] : this.fbidList[0]));\n        },\n        calculateRelativeIndex: function(t, u, v) {\n            if (!this.totalCount) {\n                return null;\n            }\n        ;\n        ;\n            var w = this.fbidList.indexOf(u), x = this.fbidList.indexOf(v);\n            if (((((w === -1)) || ((x === -1))))) {\n                return null;\n            }\n        ;\n        ;\n            var y = ((x - w));\n            return ((((((t + y)) + this.totalCount)) % this.totalCount));\n        },\n        calculateDistance: function(t, u) {\n            var v = this.fbidList.indexOf(t), w = this.fbidList.indexOf(u);\n            if (((((v === -1)) || ((w === -1))))) {\n                return null;\n            }\n        ;\n        ;\n            return ((((((w - v)) + this.getLength())) % this.getLength()));\n        },\n        fetch: function(t, u) {\n            var v = this.getEndCursor(u), w = p({\n                cursor: v,\n                version: this.version,\n                end: this.getEndCursor(!u),\n                fetchSize: ((u ? t : ((-1 * t)))),\n                relevant_count: this.relevantCount\n            }, this.photoSetQuery);\n            if (((this.totalCount && ((this.firstCursorIndex !== null))))) {\n                w.total = this.totalCount;\n                w.cursorIndex = this.calculateRelativeIndex(this.firstCursorIndex, this.firstCursor, v);\n            }\n        ;\n        ;\n            var x = r(this.pageletRootID);\n            if (!x) {\n                x = g.create(\"div\", {\n                    id: this.pageletRootID\n                });\n                g.appendContent(JSBNG__document.body, x);\n            }\n        ;\n        ;\n            m.loadFromEndpoint(this.pageletName, x, w, {\n                usePipe: this.useAjaxPipe,\n                automatic: true,\n                jsNonblock: true,\n                crossPage: true\n            });\n            if (!this.useAjaxPipe) {\n                this.setUseAjaxPipe(true);\n            }\n        ;\n        ;\n        },\n        storeToCache: function(t) {\n            var u = {\n            };\n            if (!this.isActive) {\n                return u;\n            }\n        ;\n        ;\n            if (((\"error\" in t))) {\n                this.processErrorResult(t.error);\n                u.error = true;\n                return u;\n            }\n        ;\n        ;\n            if (((\"init\" in t))) {\n                this.processInitResult(t.init);\n                u.init = {\n                    logids: t.init.logids,\n                    fbid: t.init.fbid,\n                    loggedin: t.init.loggedin,\n                    fromad: t.init.fromad,\n                    disablesessionads: t.init.disablesessionads,\n                    flashtags: t.init.flashtags\n                };\n            }\n        ;\n        ;\n            if (((\"image\" in t))) {\n                this.processImageResult(t.image);\n                u.image = true;\n            }\n        ;\n        ;\n            if (((\"data\" in t))) {\n                this.processDataResult(t.data);\n                u.data = true;\n            }\n        ;\n        ;\n            return u;\n        },\n        processInitResult: function(t) {\n            if (this.loaded) {\n                return;\n            }\n        ;\n        ;\n            this.loaded = true;\n            this.photoSetQuery = t.query;\n            if (t.bufferSize) {\n                this.bufferSize = t.bufferSize;\n            }\n        ;\n        ;\n            if (t.fullBucketSize) {\n                this.fullBucketSize = t.fullBucketSize;\n            }\n        ;\n        ;\n            if (((this.fbidList.length === 0))) {\n                this.fbidList.push(t.fbid);\n                this.rightLock = true;\n            }\n             else {\n                var u = this.fbidList.indexOf(s.INIT_PLACEHOLDER);\n                if (((u != -1))) {\n                    this.fbidList[u] = t.fbid;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            this.firstCursor = t.fbid;\n            if (((((\"initIndex\" in t)) && ((\"totalCount\" in t))))) {\n                this.firstCursorIndex = t.initIndex;\n                this.totalCount = t.totalCount;\n            }\n        ;\n        ;\n            if (((this.version == i.VIEWER_PERMALINK))) {\n                this.fetch(s.INIT_BUCKET_SIZE, true);\n            }\n        ;\n        ;\n        },\n        processImageResult: function(t) {\n            {\n                var fin288keys = ((window.top.JSBNG_Replay.forInKeys)((t))), fin288i = (0);\n                var u;\n                for (; (fin288i < fin288keys.length); (fin288i++)) {\n                    ((u) = (fin288keys[fin288i]));\n                    {\n                        if (((((u === this.firstCursor)) && t[u].everstoreLogThis))) {\n                            j.logImmediately(t[u].url);\n                        }\n                    ;\n                    ;\n                        if (((this.version === i.VIEWER_VAULTBOX))) {\n                            var v = t[u];\n                            this.cache.image[u] = new k(v);\n                            this.permalinkMap[this.cache.image[u].getURIString()] = u;\n                        }\n                         else {\n                            this.cache.image[u] = t[u];\n                            if (t[u].dimensions) {\n                                this.cache.image[u].dimensions = o.deserialize(t[u].dimensions);\n                            }\n                        ;\n                        ;\n                            if (t[u].smalldims) {\n                                this.cache.image[u].smalldims = o.deserialize(t[u].smalldims);\n                            }\n                        ;\n                        ;\n                            this.permalinkMap[n(t[u].info.permalink).getUnqualifiedURI().toString()] = u;\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n        },\n        attachToFbidsList: function(t, u, v) {\n            if (this.allLoaded) {\n                return;\n            }\n        ;\n        ;\n            if (((u === -1))) {\n                for (var w = ((t.length - 1)); ((w >= 0)); w--) {\n                    this.fbidList.unshift(t[w]);\n                    this.position++;\n                };\n            ;\n                this.leftLock = false;\n            }\n             else {\n                for (var x = 0; ((x < t.length)); x++) {\n                    this.fbidList.push(t[x]);\n                ;\n                };\n            ;\n                this.rightLock = false;\n            }\n        ;\n        ;\n            if (v) {\n                this.setAllLoaded();\n            }\n        ;\n        ;\n        },\n        setAllLoaded: function() {\n            this.allLoaded = true;\n            if (((this.getCursor() === null))) {\n                this.position = this.calculatePositionForMovement(0);\n            }\n        ;\n        ;\n        },\n        processDataResult: function(t) {\n            {\n                var fin289keys = ((window.top.JSBNG_Replay.forInKeys)((t))), fin289i = (0);\n                var u;\n                for (; (fin289i < fin289keys.length); (fin289i++)) {\n                    ((u) = (fin289keys[fin289i]));\n                    {\n                        if (!this.cache.html[u]) {\n                            this.cache.html[u] = {\n                            };\n                        }\n                    ;\n                    ;\n                        {\n                            var fin290keys = ((window.top.JSBNG_Replay.forInKeys)((t[u].html))), fin290i = (0);\n                            var v;\n                            for (; (fin290i < fin290keys.length); (fin290i++)) {\n                                ((v) = (fin290keys[fin290i]));\n                                {\n                                    var w = t[u].html[v];\n                                    if (((typeof w === \"string\"))) {\n                                        w = h(w).getRootNode();\n                                    }\n                                ;\n                                ;\n                                    this.cache.html[u][v] = q(w.childNodes);\n                                };\n                            };\n                        };\n                    ;\n                        if (!((\"extra\" in t[u]))) {\n                            this.cache.extra[u] = null;\n                            continue;\n                        }\n                    ;\n                    ;\n                        this.cache.extra[u] = {\n                            tagRects: {\n                            }\n                        };\n                        if (!Array.isArray(t[u].extra.tagRects)) {\n                            {\n                                var fin291keys = ((window.top.JSBNG_Replay.forInKeys)((t[u].extra.tagRects))), fin291i = (0);\n                                var x;\n                                for (; (fin291i < fin291keys.length); (fin291i++)) {\n                                    ((x) = (fin291keys[fin291i]));\n                                    {\n                                        if (t[u].extra.tagRects[x]) {\n                                            this.cache.extra[u].tagRects[x] = l.deserialize(t[u].extra.tagRects[x]);\n                                        }\n                                    ;\n                                    ;\n                                    };\n                                };\n                            };\n                        }\n                    ;\n                    ;\n                        Object.keys(t[u].extra).forEach(function(y) {\n                            if (((y == \"tagRects\"))) {\n                                return;\n                            }\n                        ;\n                        ;\n                            this.cache.extra[u][y] = t[u].extra[y];\n                        }.bind(this));\n                    };\n                };\n            };\n        ;\n        },\n        processErrorResult: function(t) {\n            if (!this.isLoaded()) {\n                this.initError = true;\n                return;\n            }\n        ;\n        ;\n            var u = t.side, v = [s.ERROR_ID,];\n            this.attachToFbidsList(v, u);\n        },\n        setTotalCount: function(t) {\n            this.totalCount = t;\n        },\n        setFirstCursorIndex: function(t) {\n            this.firstCursorIndex = t;\n        }\n    });\n    e.exports = s;\n});\n__d(\"PhotoSnowliftAds\", [\"JSBNG__Event\",\"copyProperties\",\"CSS\",\"csx\",\"DataStore\",\"DOM\",\"PhotoSessionLog\",\"UIPagelet\",\"URI\",\"Vector\",\"extendArray\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"copyProperties\"), i = b(\"CSS\"), j = b(\"csx\"), k = b(\"DataStore\"), l = b(\"DOM\"), m = b(\"PhotoSessionLog\"), n = b(\"UIPagelet\"), o = b(\"URI\"), p = b(\"Vector\"), q = b(\"extendArray\"), r = {\n        DEFAULT_UNITS_REFRESH_RATE: 30000,\n        UNITS_REGISTER_DELAY: 1000,\n        root: null,\n        availableDimensions: null,\n        loadQuery: null,\n        lastLoadTime: 0,\n        minAds: 100,\n        units: null,\n        isLogAdData: null,\n        displayedCallback: null,\n        refreshUnitsRate: null,\n        position: null,\n        adsStatus: \"null\",\n        adsEvents: {\n        },\n        snowliftRedesign: false,\n        resetEvents: function() {\n            this.adsStatus = \"reset\";\n            this.adsEvents = {\n            };\n        },\n        addEvent: function(s, t) {\n            if (t) {\n                this.adsStatus = s;\n            }\n        ;\n        ;\n            var u = JSBNG__Date.now();\n            this.adsEvents[((((s + \"_\")) + u))] = u;\n        },\n        init: function(s, t, u, v) {\n            this.reset();\n            this.root = s;\n            this.snowlift = t;\n            this.minAds = u.min_ads;\n            this.displayedCallback = v;\n            this.addEvent(\"init\", true);\n            this.snowliftRedesign = u.snowlift_redesign;\n            this.refreshUnitsRate = r.DEFAULT_UNITS_REFRESH_RATE;\n            if (u.refresh_fast) {\n                this.refreshUnitsRate = u.refresh_rate;\n            }\n        ;\n        ;\n        },\n        reset: function() {\n            this.lastLoadTime = 0;\n            this.position = 0;\n            this.units = [];\n            this.resetEvents();\n            this.addEvent(\"reset\", true);\n        },\n        resize: function(s) {\n            this.availableDimensions = s;\n            this.loadQuery = this.snowlift.getLoadQuery();\n            this.processResize();\n        },\n        calculateUnitSizes: function(s, t, u) {\n            var v = {\n            };\n            s.forEach(function(w) {\n                var x = w.root.firstChild.offsetHeight;\n                w.units.forEach(function(z) {\n                    if (((!i.hasClass(z, \"hidden\") && !((this.getIsAds(z) && this.getIsHoldout(z)))))) {\n                        var aa = this.getHeight(z.firstChild, t);\n                        x -= aa;\n                    }\n                ;\n                ;\n                }.bind(this));\n                var y = {\n                    height: x,\n                    visible: false\n                };\n                w.units.forEach(function(z) {\n                    var aa = this.getIsAds(z), ba = this.getHeight(z.firstChild, t), ca = this.getUnitId(z), da = ((aa && this.getIsHoldout(z)));\n                    if (((da && u))) {\n                        return;\n                    }\n                ;\n                ;\n                    v[ca] = {\n                        height: ba,\n                        visible: false,\n                        priority: 0,\n                        is_ads: aa,\n                        is_holdout: da,\n                        section_ref: y\n                    };\n                }.bind(this));\n            }.bind(this));\n            return v;\n        },\n        calculateVisibleUnits: function(s, t, u) {\n            var v = 0, w = this.getUnitPriority(t);\n            w.forEach(function(x) {\n                if (t.hasOwnProperty(x)) {\n                    var y = t[x], z = y.height;\n                    if (!y.section_ref.visible) {\n                        z += y.section_ref.height;\n                    }\n                ;\n                ;\n                    y.height_below = ((u - z));\n                    y.visible = ((((y.height_below >= 0)) && ((z > 0))));\n                    if (y.visible) {\n                        y.section_ref.visible = true;\n                        u -= z;\n                        v++;\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n            }.bind(this));\n            return t;\n        },\n        displayUnits: function(s, t) {\n            s.forEach(function(u) {\n                var v = false, w = true;\n                u.units.forEach(function(x) {\n                    var y = this.getUnitId(x), z = t[y];\n                    if (!z) {\n                        return;\n                    }\n                ;\n                ;\n                    var aa = z.visible, ba = z.height_below, ca = z.is_ads;\n                    i.conditionClass(x, \"hidden\", !aa);\n                    if (((((ca && aa)) && w))) {\n                        var da = l.JSBNG__find(x, \"div.ego_unit\");\n                        i.addClass(da, \"ego_unit_no_top_border\");\n                        w = false;\n                    }\n                ;\n                ;\n                    v = ((v || aa));\n                    this.calcUnitStats(this.units[ca][y], aa, ba);\n                }.bind(this));\n                i.conditionClass(u.root, \"hidden\", !v);\n            }.bind(this));\n        },\n        getUnitsDisplayed: function(s, t) {\n            var u = 0;\n            s.forEach(function(v) {\n                v.units.forEach(function(w) {\n                    var x = this.getUnitId(w), y = t[x];\n                    if (((!y || !y.visible))) {\n                        return;\n                    }\n                ;\n                ;\n                    u++;\n                }.bind(this));\n            }.bind(this));\n            return u;\n        },\n        getHeightsRequired: function(s, t) {\n            var u = 0, v = [];\n            s.forEach(function(w) {\n                var x = false;\n                w.units.forEach(function(y) {\n                    var z = this.getUnitId(y), aa = t[z];\n                    if (!aa) {\n                        return;\n                    }\n                ;\n                ;\n                    u += aa.height;\n                    if (!x) {\n                        u += aa.section_ref.height;\n                        x = true;\n                    }\n                ;\n                ;\n                    v.push(u);\n                }.bind(this));\n            }.bind(this));\n            return v;\n        },\n        getUnitPriority: function(s) {\n            var t = [], u = 0, v = 0;\n            {\n                var fin292keys = ((window.top.JSBNG_Replay.forInKeys)((s))), fin292i = (0);\n                var w;\n                for (; (fin292i < fin292keys.length); (fin292i++)) {\n                    ((w) = (fin292keys[fin292i]));\n                    {\n                        var x = s[w];\n                        t.push(w);\n                        var y = ((((this.minAds + u)) + v));\n                        if (x.is_ads) {\n                            if (((v < this.minAds))) {\n                                y = v;\n                            }\n                        ;\n                        ;\n                            v++;\n                        }\n                         else u++;\n                    ;\n                    ;\n                        x.priority = y;\n                    };\n                };\n            };\n        ;\n            t = t.sort(function(z, aa) {\n                var ba = s[z], ca = s[aa];\n                return ((ba.priority - ca.priority));\n            }.bind(this));\n            return t;\n        },\n        updateUnitsStatus: function() {\n            var s = this.availableDimensions.x, t = this.availableDimensions.y, u = this.calculateUnitSizes(this.sections, s);\n            u = this.calculateVisibleUnits(this.sections, u, t);\n            {\n                var fin293keys = ((window.top.JSBNG_Replay.forInKeys)((u))), fin293i = (0);\n                var v;\n                for (; (fin293i < fin293keys.length); (fin293i++)) {\n                    ((v) = (fin293keys[fin293i]));\n                    {\n                        if (!u.hasOwnProperty(v)) {\n                            continue;\n                        }\n                    ;\n                    ;\n                        var w = u[v];\n                        if (((!w.is_holdout || !w.visible))) {\n                            continue;\n                        }\n                    ;\n                    ;\n                        var x = this.units[1][v];\n                        this.calcUnitStats(x, w.visible, w.height_below);\n                    };\n                };\n            };\n        ;\n            u = this.calculateUnitSizes(this.sections, s, true);\n            u = this.calculateVisibleUnits(this.sections, u, t);\n            this.displayUnits(this.sections, u);\n            if (this.displayedCallback) {\n                var y = this.getUnitsDisplayed(this.sections, u), z = this.getHeightsRequired(this.sections, u);\n                this.displayedCallback(y, z);\n            }\n        ;\n        ;\n        },\n        calcUnitStats: function(s, t, u) {\n            var v = JSBNG__Date.now();\n            if (s.visible) {\n                s.totalTime += ((v - s.lastShowTime));\n            }\n        ;\n        ;\n            if (((((s.trackingCode !== null)) && ((s.totalTime >= this.UNITS_REGISTER_DELAY))))) {\n                var w = s.trackingCode;\n                s.trackingCode = null;\n                this.registerImpression(w, s.registerUrl);\n            }\n        ;\n        ;\n            s.visible = t;\n            s.heightBelow = u;\n            s.lastShowTime = v;\n        },\n        prepareResize: function() {\n            var s = function(t) {\n                var u = l.create(\"div\", {\n                    className: \"JSBNG__inner\"\n                }), v = l.create(\"div\", {\n                    className: \"wrapper\"\n                }, u);\n                l.replace(t, v);\n                l.setContent(u, t);\n                return v;\n            };\n            this.sections = l.scry(this.root, \"div.ego_section\").map(function(t) {\n                return {\n                    root: s(t),\n                    units: l.scry(t, \"div.ego_unit\").map(s)\n                };\n            });\n        },\n        processResize: function() {\n            if (((((this.isLoading || ((this.lastLoadTime === 0)))) || ((this.availableDimensions === null))))) {\n                this.setLogData();\n                return;\n            }\n        ;\n        ;\n            this.updateUnitsStatus();\n            this.setLogData();\n            var s = this.nextRegisterTime();\n            if (((s !== Infinity))) {\n                this.processResize.bind(this).defer(s, true);\n            }\n        ;\n        ;\n        },\n        setIsLogAdData: function(s) {\n            this.isLogAdData = s;\n            this.addEvent(\"setIsLogAdData\", false);\n            this.setLogData();\n        },\n        setLogData: function() {\n            var s = this.snowlift.getImageId();\n            if (((this.isLogAdData && s))) {\n                var t = p.getElementDimensions(this.snowlift.getImage()), u = p.getElementDimensions(this.snowlift.getRHCHeader()), v = p.getElementDimensions(this.snowlift.getRHCBody()), w = p.getElementDimensions(this.snowlift.getRHCFooter()), x = {\n                    query_set: this.snowlift.getLoadQuery().set,\n                    window_x: window.JSBNG__innerWidth,\n                    window_y: window.JSBNG__innerHeight,\n                    image_x: t.x,\n                    image_y: t.y,\n                    header_x: u.x,\n                    header_y: u.y,\n                    body_x: v.x,\n                    body_y: v.y,\n                    footer_x: w.x,\n                    footer_y: w.y,\n                    ads_below_space: this.getAdsBelowSpace(),\n                    time: JSBNG__Date.now(),\n                    adsStatus: this.adsStatus,\n                    adsEvents: this.adsEvents,\n                    refreshRate: this.refreshUnitsRate,\n                    position: this.position\n                };\n                m.updateAdData(s, x);\n            }\n        ;\n        ;\n        },\n        getAdsBelowSpace: function() {\n            var s = [], t = this.units[1];\n            {\n                var fin294keys = ((window.top.JSBNG_Replay.forInKeys)((t))), fin294i = (0);\n                var u;\n                for (; (fin294i < fin294keys.length); (fin294i++)) {\n                    ((u) = (fin294keys[fin294i]));\n                    {\n                        if (((t.hasOwnProperty(u) && !this.getIsHoldout(this.getAdUnit(u))))) {\n                            s.push(t[u].heightBelow);\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            return s;\n        },\n        getIsAds: function(s) {\n            var t = l.scry(s, \"div._4u8\");\n            return t.length;\n        },\n        getUnitId: function(s) {\n            if (this.getIsAds(s)) {\n                return this.getAdId(s);\n            }\n             else return this.getEgoId(s)\n        ;\n        },\n        getEgoId: function(s) {\n            var t = l.JSBNG__find(s, \"div.ego_unit\");\n            return t.getAttribute(\"data-ego-fbid\");\n        },\n        getAdData: function(s) {\n            var t = l.JSBNG__find(s, \"div._4u8\"), u = t.getAttribute(\"data-ad\");\n            return ((((u && JSON.parse(u))) || {\n            }));\n        },\n        getAdId: function(s) {\n            return this.getAdData(s).adid;\n        },\n        getIsHoldout: function(s) {\n            return ((s && this.getAdData(s).holdout));\n        },\n        getAdUnit: function(s) {\n            if (!this.sections) {\n                return null;\n            }\n        ;\n        ;\n            var t = [];\n            this.sections.forEach(function(v) {\n                q(t, v.units);\n            });\n            for (var u = 0; ((u < t.length)); u++) {\n                if (((this.getIsAds(t[u]) && ((this.getAdId(t[u]) == s))))) {\n                    return t[u];\n                }\n            ;\n            ;\n            };\n        ;\n            return null;\n        },\n        nextRegisterTime: function() {\n            var s = Infinity, t = h(h({\n            }, this.units[0]), this.units[1]);\n            {\n                var fin295keys = ((window.top.JSBNG_Replay.forInKeys)((t))), fin295i = (0);\n                var u;\n                for (; (fin295i < fin295keys.length); (fin295i++)) {\n                    ((u) = (fin295keys[fin295i]));\n                    {\n                        if (t.hasOwnProperty(u)) {\n                            var v = t[u];\n                            if (((((v.trackingCode !== null)) && v.visible))) {\n                                s = Math.min(s, ((this.UNITS_REGISTER_DELAY - v.totalTime)));\n                            }\n                        ;\n                        ;\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            return s;\n        },\n        getHeight: function(s, t) {\n            var u = k.get(s, \"height\");\n            if (((u && ((u.x === t))))) {\n                return u.y;\n            }\n        ;\n        ;\n            return this.cacheHeight(s, t);\n        },\n        cacheHeight: function(s, t) {\n            var u = {\n                x: t,\n                y: s.offsetHeight\n            };\n            k.set(s, \"height\", u);\n            return u.y;\n        },\n        loadAdsAndEgo: function() {\n            this.resetEvents();\n            this.addEvent(\"adsRequested\", true);\n            this.position++;\n            n.loadFromEndpoint(\"WebEgoPane\", this.root, {\n                pid: 34,\n                data: [this.loadQuery.set,this.getCursorFBID(this.loadQuery),this.snowliftRedesign,]\n            }, {\n                crossPage: true,\n                bundle: false\n            });\n        },\n        getCursorFBID: function(s) {\n            if (((s.v !== undefined))) {\n                return s.v;\n            }\n        ;\n        ;\n            if (((s.fbid !== undefined))) {\n                return s.fbid;\n            }\n        ;\n        ;\n            return \"0\";\n        },\n        unitsLoaded: function(s, t) {\n            var u;\n            if (t) {\n                u = \"/ai.php\";\n                this.addEvent(\"adsLoaded\", true);\n            }\n             else {\n                u = \"/ajax/ei.php\";\n                this.addEvent(\"egoLoaded\", true);\n            }\n        ;\n        ;\n            var v = {\n            };\n            {\n                var fin296keys = ((window.top.JSBNG_Replay.forInKeys)((s))), fin296i = (0);\n                var w;\n                for (; (fin296i < fin296keys.length); (fin296i++)) {\n                    ((w) = (fin296keys[fin296i]));\n                    {\n                        if (s.hasOwnProperty(w)) {\n                            v[w] = {\n                                trackingCode: s[w],\n                                totalTime: 0,\n                                lastShowTime: 0,\n                                heightBelow: -10000,\n                                visible: false,\n                                registerUrl: u\n                            };\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            this.units[t] = v;\n            if (t) {\n                this.waitForImages(this.imagesLoaded.bind(this));\n            }\n        ;\n        ;\n        },\n        imagesLoaded: function() {\n            this.prepareResize();\n            this.addEvent(\"imagesLoaded\", true);\n            this.lastLoadTime = JSBNG__Date.now();\n            this.isLoading = false;\n            this.processResize();\n            i.removeClass(this.root, \"loading\");\n        },\n        loadAdsFromUserActivity: function() {\n            var s = JSBNG__Date.now(), t = this.refreshUnitsRate;\n            if (((!this.isLoading && ((((s - this.lastLoadTime)) > t))))) {\n                i.addClass(this.root, \"loading\");\n                this.isLoading = true;\n                this.loadAdsAndEgo();\n            }\n        ;\n        ;\n        },\n        registerImpression: function(s, t) {\n            var u = l.create(\"div\", {\n                src: o(t).addQueryData({\n                    aed: s\n                }),\n                width: 0,\n                height: 0,\n                frameborder: 0,\n                scrolling: \"no\",\n                className: \"fbEmuTracking\"\n            });\n            u.setAttribute(\"aria-hidden\", \"true\");\n            l.appendContent(this.root, u);\n        },\n        waitForImages: function(s) {\n            var t = l.scry(this.root, \"img.img\"), u = t.length, v = u;\n            if (((v === 0))) {\n                s();\n            }\n        ;\n        ;\n            var w = function() {\n                v--;\n                if (((v === 0))) {\n                    s.defer();\n                }\n            ;\n            ;\n            };\n            for (var x = 0; ((x < u)); x++) {\n                var y = t[x];\n                if (y.complete) {\n                    w();\n                }\n                 else g.listen(y, {\n                    load: w,\n                    error: w,\n                    abort: w\n                });\n            ;\n            ;\n            };\n        ;\n        }\n    };\n    e.exports = r;\n});\n__d(\"PhotoViewer\", [\"Bootloader\",\"copyProperties\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"Bootloader\"), h = b(\"copyProperties\"), i = b(\"emptyFunction\");\n    function j() {\n        this.image = null;\n        this.root = null;\n        this.stream = null;\n    };\n;\n    h(j, {\n        bootstrap: function(k, l) {\n            g.loadModules([\"PhotoSnowlift\",], function(m) {\n                m.bootstrap(k, l);\n            });\n        }\n    });\n    h(j.prototype, {\n        getEventPrefix: i.thatReturnsNull,\n        getEventString: function(k) {\n            var l = this.getEventPrefix();\n            if (l) {\n                return ((((l + \".\")) + k));\n            }\n        ;\n        ;\n            return null;\n        },\n        getImage: function() {\n            return this.image;\n        },\n        getPosition: function() {\n            return ((this.stream ? this.stream.getCursor() : null));\n        },\n        getRoot: function() {\n            return this.root;\n        },\n        getSourceString: i.thatReturnsNull,\n        getVersionConst: i.thatReturnsNull,\n        getViewerSource: i.thatReturnsNull,\n        getViewerSet: i.thatReturnsNull\n    });\n    e.exports = j;\n});\n__d(\"PhotoSnowlift\", [\"function-extensions\",\"Arbiter\",\"AsyncDialog\",\"AsyncRequest\",\"Bootloader\",\"Class\",\"collectDataAttributes\",\"CSS\",\"Dialog\",\"DOM\",\"DOMControl\",\"JSBNG__Event\",\"FullScreen\",\"Input\",\"ImageUtils\",\"Keys\",\"Layer\",\"LinkController\",\"Locale\",\"PageTransitions\",\"Parent\",\"PhotosConst\",\"PhotoSessionLog\",\"PhotoSnowliftAds\",\"PhotoStreamCache\",\"PhotosUtils\",\"PhotoViewer\",\"JSBNG__Rect\",\"ScrollableArea\",\"Style\",\"Toggler\",\"UIPagelet\",\"URI\",\"UserAgent\",\"Vector\",\"$\",\"asyncCallback\",\"computeRelativeURI\",\"copyProperties\",\"createArrayFrom\",\"csx\",\"emptyFunction\",\"ge\",\"goURI\",\"shield\",\"startsWith\",\"tx\",\"userAction\",], function(a, b, c, d, e, f) {\n    b(\"function-extensions\");\n    var g = b(\"Arbiter\"), h = b(\"AsyncDialog\"), i = b(\"AsyncRequest\"), j = b(\"Bootloader\"), k = b(\"Class\"), l = b(\"collectDataAttributes\"), m = b(\"CSS\"), n = b(\"Dialog\"), o = b(\"DOM\"), p = b(\"DOMControl\"), q = b(\"JSBNG__Event\"), r = b(\"FullScreen\"), s = b(\"Input\"), t = b(\"ImageUtils\"), u = b(\"Keys\"), v = b(\"Layer\"), w = b(\"LinkController\"), x = b(\"Locale\"), y = b(\"PageTransitions\"), z = b(\"Parent\"), aa = b(\"PhotosConst\"), ba = b(\"PhotoSessionLog\"), ca = b(\"PhotoSnowliftAds\"), da = b(\"PhotoStreamCache\"), ea = b(\"PhotosUtils\"), fa = b(\"PhotoViewer\"), ga = b(\"JSBNG__Rect\"), ha = b(\"ScrollableArea\"), ia = b(\"Style\"), ja = b(\"Toggler\"), ka = b(\"UIPagelet\"), la = b(\"URI\"), ma = b(\"UserAgent\"), na = b(\"Vector\"), oa = b(\"$\"), pa = b(\"asyncCallback\"), qa = b(\"computeRelativeURI\"), ra = b(\"copyProperties\"), sa = b(\"createArrayFrom\"), ta = b(\"csx\"), ua = b(\"emptyFunction\"), va = b(\"ge\"), wa = b(\"goURI\"), xa = b(\"shield\"), ya = b(\"startsWith\"), za = b(\"tx\"), ab = b(\"userAction\");\n    function bb() {\n        this.parent.construct(this);\n    };\n;\n    ra(bb, {\n        STATE_ERROR: \"error\",\n        STATE_HTML: \"html\",\n        STATE_IMAGE_PIXELS: \"image_pixels\",\n        STATE_IMAGE_DATA: \"image\",\n        LOADING_TIMEOUT: 2000,\n        PAGER_FADE: 3000,\n        FULL_SCREEN_PADDING: 10,\n        STAGE_HIRES_MAX: {\n            x: 2048,\n            y: 2048\n        },\n        STAGE_NORMAL_MAX: {\n            x: 960,\n            y: 960\n        },\n        STAGE_MIN: {\n            x: 520,\n            y: 520\n        },\n        SIDEBAR_SIZE_MAX: 360,\n        STAGE_CHROME: {\n            x: 82,\n            y: 42\n        },\n        VIDEO_BOTTOM_BAR_SPACE: 40,\n        GOPREV_AREA: 120,\n        TIMELINE_STRETCH_WIDTH: 843,\n        TIMELINE_STRETCH_MIN: 480,\n        MIN_TAG_DISTANCE: 83,\n        PADDING_MIN: 40,\n        MIN_UFI_HEIGHT: 250,\n        COLLECTIONS_UNTAGGED_PHOTOS: 3,\n        PHOTOS_OF_YOU_SUGGESTIONS: 28,\n        MIN_ADS_VISIBLE: 1,\n        _instance: null,\n        getInstance: function() {\n            if (!bb._instance) {\n                bb._instance = new bb();\n            }\n        ;\n        ;\n            return bb._instance;\n        },\n        initWithSpotlight: function(cb, db) {\n            bb.getInstance().init(cb, db);\n        },\n        touch: ua,\n        addPhotoFbids: function(cb, db, eb, fb) {\n            bb.getInstance().addPhotoFbids(cb, db, eb, fb);\n        },\n        attachFollowFlyout: function(cb) {\n            o.insertAfter(oa(\"fbPhotoSnowliftSubscribe\"), cb);\n        },\n        attachSubscribeFlyout: function(cb) {\n            o.insertAfter(oa(\"fbPhotoSnowliftSubscribe\"), cb);\n        },\n        attachTagger: function(cb) {\n            bb.getInstance().attachTagger(cb);\n        },\n        preload: function(cb, db) {\n            bb.getInstance().preload(cb, db);\n        },\n        bootstrap: function(cb, db) {\n            if (((cb && la(cb).getQueryData().hasOwnProperty(\"share_id\")))) {\n                j.loadModules([\"SpotlightShareViewer\",], function(eb) {\n                    eb.bootstrap(cb, db);\n                });\n                return;\n            }\n        ;\n        ;\n            bb.getInstance().bootstrap(cb, db);\n        },\n        closeRefresh: function() {\n            bb.getInstance().closeRefresh();\n        },\n        deletePhoto: function(cb) {\n            bb.getInstance().deletePhoto(cb);\n        },\n        getImage: function() {\n            return bb.getInstance().getImage();\n        },\n        getImageId: function() {\n            return bb.getInstance().getImageId();\n        },\n        getLoadQuery: function() {\n            return bb.getInstance().getLoadQuery();\n        },\n        getRHCBody: function() {\n            return bb.getInstance().getRHCBody();\n        },\n        getRHCFooter: function() {\n            return bb.getInstance().getRHCFooter();\n        },\n        getRHCHeader: function() {\n            return bb.getInstance().getRHCHeader();\n        },\n        getRoot: function() {\n            return bb.getInstance().getRoot();\n        },\n        likePhotoSkipConfirmation: function(cb) {\n            bb.getInstance().likePhotoSkipConfirmation(cb);\n        },\n        saveTagsFromPayload: function(cb) {\n            bb.getInstance().saveTagsFromPayload(cb);\n        },\n        saveTagsFromPayloadDelayed: function(cb) {\n            bb.saveTagsFromPayload.curry(cb).defer(2000);\n        },\n        handleServerError: function(cb, db) {\n            bb.getInstance().handleServerError(cb, db);\n        },\n        setVideoWarning: function(cb, db) {\n            var eb = bb.getInstance(), fb = ((\"video_warning_\" + cb));\n            if (!eb.videoWarnings) {\n                eb.videoWarnings = [];\n            }\n        ;\n        ;\n            eb.videoWarnings[fb] = db;\n        },\n        storeFromData: function(cb) {\n            bb.getInstance().storeFromData(cb);\n        },\n        swapData: function() {\n            bb.getInstance().swapData();\n        },\n        touchMarkup: ua,\n        updateTotalCount: function(cb, db, eb) {\n            bb.getInstance().updateTotalCount(cb, db, eb);\n        }\n    });\n    k.extend(bb, fa);\n    ra(bb.prototype, {\n        switchTimer: null,\n        imageRefreshTimer: null,\n        imageLoadingTimer: null,\n        lastPage: 0,\n        currentMinSize: null,\n        currentImageSize: null,\n        resetUriStack: true,\n        thumbSrc: null,\n        shouldStretch: false,\n        stageMax: bb.STAGE_NORMAL_MAX,\n        stageChrome: bb.STAGE_CHROME,\n        stagePagerPrev: null,\n        ua: null,\n        PhotoTagger: null,\n        showHover: false,\n        skipLikePhotoConfirmation: false,\n        isShowingLikePhotoConfirmation: false,\n        preload: function(cb, db) {\n            j.loadModules([\"PhotoTagger\",\"Live\",\"PhotoTagApproval\",\"PhotoTags\",\"TagTokenizer\",\"fb-photos-snowlift-fullscreen-css\",], function(fb) {\n                this.PhotoTagger = fb;\n            }.bind(this));\n            var eb = this.getImageSrc(la(cb).getQueryData());\n            if (eb) {\n                (new JSBNG__Image()).src = eb;\n            }\n        ;\n        ;\n        },\n        bootstrap: function(cb, db) {\n            if (((cb && la(cb).getQueryData().makeprofile))) {\n                this.enableCropperOnInit = true;\n                this.isUserProfilePic = la(cb).getQueryData().makeuserprofile;\n                this.isInProfilePicAlbum = la(cb).getQueryData().inprofilepicalbum;\n            }\n        ;\n        ;\n            this.preload(cb, db);\n            if (this.closeDirty) {\n                this.bootstrap.bind(this, cb, db).defer();\n                return;\n            }\n        ;\n        ;\n            ca.reset();\n            this.resetUriStack = true;\n            if (this.isOpen) {\n                if (this.openExplicitly) {\n                    this.closeCleanup();\n                    this.resetUriStack = false;\n                }\n                 else return\n            ;\n            }\n        ;\n        ;\n            this.ua = ab(\"snowlift\", db).uai(\"open\");\n            this.returningToStart = false;\n            ((this.loading && m.removeClass(this.loading, \"loading\")));\n            if (db) {\n                m.addClass((this.loading = db), \"loading\");\n                if (this.container) {\n                    var eb = z.byClass(db, \"uiStreamStory\");\n                    if (eb) {\n                        this.container.setAttribute(\"data-ownerid\", eb.id);\n                    }\n                     else this.container.removeAttribute(\"data-ownerid\");\n                ;\n                ;\n                }\n            ;\n            ;\n                this.getThumbAndSize(db);\n            }\n             else this.loading = null;\n        ;\n        ;\n            g.inform(\"PhotoSnowlift.GO\", cb, g.BEHAVIOR_STATE);\n            this.loadFrameIfUninitialized();\n        },\n        getCurrentImageServerSizeDimensions: function() {\n            return this.stream.getCurrentImageData().dimensions;\n        },\n        getEventPrefix: function() {\n            return \"PhotoSnowlift\";\n        },\n        getRoot: function() {\n            return this.root;\n        },\n        getSourceString: function() {\n            return \"snowlift\";\n        },\n        getViewerSource: function() {\n            return this.source;\n        },\n        getViewerSet: function() {\n            return this.stream.getPhotoSet();\n        },\n        getVersionConst: function() {\n            return aa.VIEWER_SNOWLIFT;\n        },\n        getImage: function() {\n            return this.image;\n        },\n        getImageId: function() {\n            return this.stream.getCursor();\n        },\n        getRHCHeader: function() {\n            return this.rhcHeader;\n        },\n        getRHCBody: function() {\n            return this.ufiForm;\n        },\n        getRHCFooter: function() {\n            return this.rhcFooter;\n        },\n        getLoadQuery: function() {\n            return this.loadQuery;\n        },\n        getCurrentPhotoInfo: function() {\n            var cb = this.stream.getCurrentImageData();\n            if (cb) {\n                return cb.info;\n            }\n        ;\n        ;\n            return null;\n        },\n        getOwnerId: function() {\n            var cb = this.stream.getCurrentImageData();\n            if (cb) {\n                return cb.info.owner;\n            }\n        ;\n        ;\n            return null;\n        },\n        getThumbAndSize: function(cb) {\n            this.currentImageSize = null;\n            this.thumbSrc = null;\n            var db = la(cb.getAttribute(\"ajaxify\")).getQueryData();\n            if (!db.size) {\n                return;\n            }\n        ;\n        ;\n            var eb = na.deserialize(db.size);\n            if (((!eb.x || !eb.y))) {\n                return;\n            }\n        ;\n        ;\n            this.currentImageSize = eb;\n            if (((((!m.hasClass(cb, \"uiMediaThumb\") && !m.hasClass(cb, \"uiPhotoThumb\"))) && !m.hasClass(cb, \"uiScaledThumb\")))) {\n                return;\n            }\n        ;\n        ;\n            if (cb.getAttribute(\"data-cropped\")) {\n                return;\n            }\n        ;\n        ;\n            var fb = o.scry(cb, \"img\")[0], gb = o.scry(cb, \"i\")[0], hb = z.byAttribute(cb, \"data-size\");\n            this.shouldStretch = ((((((((((((hb && this.currentImageSize)) && fb)) && ((hb.getAttribute(\"data-size\") === \"2\")))) && ((this.currentImageSize.x > this.currentImageSize.y)))) && ((this.currentImageSize.x <= bb.TIMELINE_STRETCH_WIDTH)))) && ((fb.offsetWidth === bb.TIMELINE_STRETCH_WIDTH))));\n            var ib;\n            if (fb) {\n                ib = fb.src;\n            }\n             else if (gb) {\n                ib = ia.get(gb, \"backgroundImage\").replace(/.*url\\(\"?([^\"]*)\"?\\).*/, \"$1\");\n            }\n             else return\n            \n        ;\n            this.thumbSrc = ib;\n        },\n        loadFrameIfUninitialized: function() {\n            if (this.root) {\n                return;\n            }\n        ;\n        ;\n            new i(\"/ajax/photos/snowlift/init.php\").setAllowCrossPageTransition(true).setMethod(\"GET\").setReadOnly(true).send();\n        },\n        init: function(cb, db) {\n            this.init = ua;\n            this.showHover = db.pivot_hover;\n            ba.setEndMetrics(db.pivot_end_metric);\n            this.enableSnowliftProfilePicCropper = db.snowlift_profile_pic_cropper;\n            this.pagersOnKeyboardNav = db.pagers_on_keyboard_nav;\n            this.hilitAllTagsAndBoxesOnHover = db.snowlift_hover_shows_all_tags_and_faces;\n            this.fullscreen = r.isSupported();\n            this.showOGVideos = db.og_videos;\n            this.resizeCommentsForAds = db.resize_comments_for_ads;\n            this.stageMax = bb.STAGE_HIRES_MAX;\n            this.spotlight = cb;\n            this.spotlight.subscribe(\"JSBNG__blur\", function() {\n                this.closingAction = ba.OUTSIDE;\n            }.bind(this));\n            this.spotlight.subscribe(\"hide\", xa(this.closeHandler, this));\n            this.spotlight.subscribe(\"key\", this.keyHandler.bind(this));\n            this.initializeNodes(this.spotlight.getRoot());\n            ca.init(this.sideAdUnit, this, db, this.adsDisplayedCallback.bind(this));\n            this.inAdsDisplayedCallback = false;\n            if (!this.subscription) {\n                w.registerHandler(this.handleNavigateAway.bind(this));\n                this.subscription = g.subscribe(\"PhotoSnowlift.GO\", function(eb, fb) {\n                    this.openExplicitly = true;\n                    ((this.loading && m.removeClass(this.loading, \"loading\")));\n                    this.open(fb);\n                }.bind(this));\n            }\n        ;\n        ;\n            this.transitionHandlerRegistered = false;\n            this.returningToStart = false;\n            y.registerHandler(this.openHandler.bind(this));\n            this.openHandlerRegistered = true;\n            g.subscribe(\"PhotoTagApproval.HILITE_TAG\", this.onHiliteTag.bind(this));\n            g.subscribe(\"PhotoTagApproval.UPDATE_TAG_BOX\", this.onUpdateTagBox.bind(this));\n            if (this.fullscreen) {\n                r.subscribe(\"changed\", this.onFullScreenChange.bind(this));\n            }\n        ;\n        ;\n        },\n        onFullScreenChange: function() {\n            var cb = r.isFullScreen();\n            m.conditionClass(JSBNG__document.body, \"fbPhotoSnowliftFullScreenMode\", cb);\n            if (cb) {\n                if (!m.hasClass(this.root, \"fbPhotoSnowliftEditMode\")) {\n                    this.collapseRHC();\n                }\n            ;\n            ;\n                var db = this.stream.getCurrentImageData();\n                if (((((((db && db.url)) && ((this.image.src !== db.url)))) && this.shouldShowHiRes(db)))) {\n                    this.switchImage(db.url);\n                }\n            ;\n            ;\n                this.adjustForResize();\n            }\n             else {\n                this.uncollapseRHC();\n                if (((ma.chrome() && !m.hasClass(this.root, \"fbPhotoSnowliftEditMode\")))) {\n                    this.page(0, false);\n                }\n            ;\n            ;\n                g.inform(\"reflow\");\n            }\n        ;\n        ;\n            ja.hide();\n            if (this.cropper) {\n                this.cropper.resetPhoto();\n            }\n        ;\n        ;\n        },\n        initializeNodes: function(cb) {\n            this.root = cb;\n            this.container = o.JSBNG__find(cb, \"div.fbPhotoSnowliftContainer\");\n            this.snowliftPopup = o.JSBNG__find(this.container, \"div.fbPhotoSnowliftPopup\");\n            this.rhc = o.JSBNG__find(this.snowliftPopup, \"div.rhc\");\n            this.rhcHeader = o.JSBNG__find(this.rhc, \"div.rhcHeader\");\n            this.rhcFooter = o.JSBNG__find(this.rhc, \"div.rhcFooter\");\n            this.ufiForm = o.JSBNG__find(this.rhc, \"form.fbPhotosSnowliftFeedbackForm\");\n            this.ufiInputContainer = o.JSBNG__find(this.rhc, \"div.fbPhotosSnowboxFeedbackInput\");\n            this.scroller = o.JSBNG__find(this.ufiForm, \"div.rhcScroller\");\n            this.scrollerBody = o.JSBNG__find(this.scroller, \"div.uiScrollableAreaBody\");\n            this.stageWrapper = o.JSBNG__find(this.snowliftPopup, \"div.stageWrapper\");\n            this.overlay = o.JSBNG__find(this.snowliftPopup, \"div.snowliftOverlay\");\n            this.errorBox = o.JSBNG__find(this.stageWrapper, \"div.stageError\");\n            this.image = o.JSBNG__find(this.stageWrapper, \"img.spotlight\");\n            this.stage = o.JSBNG__find(this.stageWrapper, \"div.stage\");\n            this.videoStage = o.JSBNG__find(this.stageWrapper, \"div.videoStage\");\n            this.prevPager = o.JSBNG__find(this.snowliftPopup, \"a.snowliftPager.prev\");\n            this.nextPager = o.JSBNG__find(this.snowliftPopup, \"a.snowliftPager.next\");\n            this.stageActions = o.JSBNG__find(cb, \"div.stageActions\");\n            this.buttonActions = o.JSBNG__find(this.stageActions, \"div.fbPhotosPhotoButtons\");\n            this.productMetadata = o.scry(this.rhc, \"div.fbPhotosSnowliftProductMetadata\").pop();\n            this.sideAdUnit = o.JSBNG__find(cb, \"._5ciw\");\n            g.inform(\"Amoeba/instrumentMulti\", [[this.container,\"snowlift\",],[this.rhc,\"rhc\",],[this.rhcHeader,\"rhc_header\",],[this.ufiForm,\"ufi_form\",],[this.ufiInputContainer,\"ufi_input\",],[this.prevPager,\"prev_pager\",],[this.nextPager,\"next_pager\",],[this.stageActions,\"stage_actions\",],[this.sideAdUnit,\"side_ads\",],], g.BEHAVIOR_PERSISTENT);\n            m.conditionClass(this.root, \"fullScreenAvailable\", this.fullscreen);\n        },\n        initializeScroller: function() {\n            this.initializeScroller = ua;\n            this.scrollableArea = ha.fromNative(this.scroller, {\n                fade: true,\n                persistent: true\n            });\n            var cb = function(JSBNG__event) {\n                var db = q.$E(JSBNG__event).getTarget();\n                if (o.contains(this.ufiInputContainer, db)) {\n                    var eb = p.getInstance(db);\n                    if (eb) {\n                        this.scrollableArea.scrollToBottom();\n                        var fb = eb.subscribe(\"resize\", function() {\n                            var hb = this.scrollableArea.isScrolledToBottom();\n                            this.adjustScroller();\n                            ((hb && this.scrollableArea.scrollToBottom()));\n                        }.bind(this)), gb = q.listen(db, \"JSBNG__blur\", function() {\n                            eb.unsubscribe(fb);\n                            gb.remove();\n                        });\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n            }.bind(this);\n            g.subscribe(\"ufi/changed\", function(db, eb) {\n                if (((this.ufiForm === eb.form))) {\n                    this.adjustScrollerIfNecessary();\n                }\n            ;\n            ;\n            }.bind(this));\n            g.subscribe(\"ufi/comment\", function(db, eb) {\n                if (((this.ufiForm === eb.form))) {\n                    if (eb.isranked) {\n                        this.scrollableArea.scrollToTop();\n                    }\n                     else this.scrollableArea.scrollToBottom();\n                ;\n                }\n            ;\n            ;\n            }.bind(this));\n            q.listen(this.rhc, \"click\", function(JSBNG__event) {\n                var db = JSBNG__event.getTarget();\n                if (((((z.byTag(db, \"a\") || z.byTag(db, \"button\"))) || o.isNodeOfType(db, \"input\")))) {\n                    this.adjustScrollerIfNecessary();\n                }\n            ;\n            ;\n            }.bind(this));\n            g.subscribe([\"reflow\",\"CommentUFI.Pager\",], function() {\n                if (this.isOpen) {\n                    this.adjustScroller();\n                }\n            ;\n            ;\n            }.bind(this));\n            q.listen(this.ufiForm, \"focusin\", cb);\n        },\n        openHandler: function(cb) {\n            if (((((((((((this.isOpen || ((cb.getPath() != \"/photo.php\")))) || this.returningToStart)) || cb.getQueryData().closeTheater)) || cb.getQueryData().permPage)) || cb.getQueryData().makeprofile))) {\n                this.openHandlerRegistered = false;\n                return false;\n            }\n        ;\n        ;\n            this.open(cb);\n            this._uriStack.push(la(cb).getQualifiedURI().toString());\n            y.transitionComplete(true);\n            return true;\n        },\n        getImageSrc: function(cb) {\n            if (cb.smallsrc) {\n                if (!cb.size) {\n                    return cb.smallsrc;\n                }\n            ;\n            ;\n                var db = na.deserialize(cb.size), eb = this.getStageSize(db);\n                if (((((eb.x <= bb.STAGE_NORMAL_MAX.x)) && ((eb.y <= bb.STAGE_NORMAL_MAX.y))))) {\n                    return cb.smallsrc;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            return cb.src;\n        },\n        open: function(cb) {\n            var db = la(cb).getQueryData(), eb = this.getImageSrc(db);\n            if (eb) {\n                delete db.src;\n                delete db.smallsrc;\n            }\n        ;\n        ;\n            if (this.resetUriStack) {\n                this._uriStack = [];\n            }\n        ;\n        ;\n            if (!this.initialLoad) {\n                db.firstLoad = true;\n                this.initialLoad = true;\n            }\n        ;\n        ;\n            this.sessionID = JSBNG__Date.now();\n            this.sessionPhotosHilited = {\n            };\n            this.loadQuery = ra(db, {\n                ssid: this.sessionID\n            });\n            this.isOpen = true;\n            this.pagersShown = false;\n            this.refreshOnClose = false;\n            this.hilitedTag = null;\n            this.loadingStates = {\n                image: false,\n                html: false\n            };\n            this.replaceUrl = false;\n            this.source = null;\n            this.saveTagSubscription = g.subscribe(\"PhotoTagger.SAVE_TAG\", this.onTagSaved.bind(this));\n            this.taggedPhotoIds = [];\n            this.stream = new da();\n            this.stream.init(aa.VIEWER_SNOWLIFT, \"PhotoViewerPagelet\", \"pagelet_photo_viewer\");\n            this.fetchInitialData();\n            this.setLoadingState(bb.STATE_HTML, true);\n            this.rhcCollapsed = false;\n            this._open(cb, eb);\n            if (this.enableSnowliftProfilePicCropper) {\n                j.loadModules([\"SnowliftPicCropper\",], function(fb) {\n                    this.cropper = fb.getInstance(this);\n                    this.cropper.init();\n                    if (this.enableCropperOnInit) {\n                        var gb = g.subscribe(\"PhotoSnowlift.SWITCH_IMAGE\", function() {\n                            if (this.isInProfilePicAlbum) {\n                                this.cropper.showPicInProfileAlbumDialog();\n                            }\n                             else this.cropper.enableCropping(this.isUserProfilePic);\n                        ;\n                        ;\n                            g.unsubscribe(gb);\n                        }.bind(this));\n                        this.enableCropperOnInit = false;\n                    }\n                ;\n                ;\n                }.bind(this));\n            }\n        ;\n        ;\n            j.loadModules([\"PhotosButtonTooltips\",], function(fb) {\n                fb.init();\n            });\n        },\n        _open: function(cb, db) {\n            this.createLoader(db);\n            this.spotlight.show();\n            ((this.ua && this.ua.add_event(\"frame\")));\n            g.inform(\"layer_shown\", {\n                type: \"PhotoSnowlift\"\n            });\n            g.inform(\"PhotoSnowlift.OPEN\");\n            this.stageHandlers = [q.listen(window, \"resize\", this.adjustForResize.bind(this)),q.listen(this.stageWrapper, \"click\", this.buttonListener.bind(this)),q.listen(this.stageWrapper, \"mouseleave\", function(JSBNG__event) {\n                var gb = JSBNG__event.getTarget();\n                if (!((((((((((((z.byClass(gb, \"snowliftOverlay\") || z.byClass(gb, \"fbPhotoSnowliftTagApproval\"))) || z.byClass(gb, \"tagPointer\"))) || z.byClass(gb, \"arrow\"))) || z.byClass(gb, \"faceboxSuggestion\"))) || z.byClass(gb, \"typeaheadWrapper\"))) || z.byClass(gb, \"photoTagTypeahead\")))) {\n                    this.unhiliteAllTags();\n                }\n            ;\n            ;\n                this.hidePagers();\n            }.bind(this)),q.listen(this.stageWrapper, \"mousemove\", this.hilitePagerOnMouseMove.bind(this)),q.listen(this.stageWrapper, \"mousemove\", this.hiliteTagsOnMouseMove.bind(this)),q.listen(this.overlay, \"mouseenter\", this.unhiliteAllTags.bind(this)),];\n            this.stageHandlers.push(q.listen(this.container, \"click\", function(JSBNG__event) {\n                var gb = JSBNG__event.getTarget();\n                if (z.byClass(gb, \"rotateRight\")) {\n                    this.rotate(\"right\");\n                }\n                 else if (z.byClass(gb, \"rotateLeft\")) {\n                    this.rotate(\"left\");\n                }\n                 else if (z.byClass(gb, \"closeTheater\")) {\n                    if (r.isFullScreen()) {\n                        r.toggleFullScreen();\n                        return;\n                    }\n                ;\n                ;\n                    this.closingAction = ba.X;\n                    this.closeHandler();\n                    return false;\n                }\n                 else if (this.fullscreen) {\n                    if (z.byClass(gb, \"fbPhotoSnowliftFullScreen\")) {\n                        this.toggleFullScreen();\n                    }\n                     else if (z.byClass(gb, \"fbPhotoSnowliftCollapse\")) {\n                        this.toggleCollapse();\n                    }\n                    \n                ;\n                }\n                \n                \n                \n            ;\n            ;\n            }.bind(this)));\n            var eb = va(\"fbPhotoSnowliftFeedback\");\n            if (eb) {\n                this.stageHandlers.push(q.listen(eb, \"click\", function(JSBNG__event) {\n                    var gb = JSBNG__event.getTarget();\n                    if (((z.byClass(gb, \"like_link\") || ((z.byClass(gb, \"UFILikeLink\") && z.byClass(gb, \"UIActionLinks\")))))) {\n                        this.toggleLikeButton();\n                    }\n                ;\n                ;\n                    var hb = z.byClass(JSBNG__event.getTarget(), \"uiUfiCollapsedComment\");\n                    if (hb) {\n                        m.addClass(hb, \"uiUfiCollapsedCommentToggle\");\n                    }\n                ;\n                ;\n                }.bind(this)));\n            }\n        ;\n        ;\n            var fb = va(\"fbPhotoSnowliftOnProfile\");\n            if (fb) {\n                this.stageHandlers.push(q.listen(fb, \"click\", function(JSBNG__event) {\n                    if (z.byClass(JSBNG__event.getTarget(), \"fbPhotoRemoveFromProfileLink\")) {\n                        this.refreshOnClose = true;\n                    }\n                ;\n                ;\n                }.bind(this)));\n            }\n        ;\n        ;\n            if (this.resetUriStack) {\n                this.startingURI = la.getMostRecentURI().addQueryData({\n                    closeTheater: 1\n                }).getUnqualifiedURI();\n            }\n        ;\n        ;\n            if (!db) {\n                this.setLoadingState(bb.STATE_IMAGE_DATA, true);\n            }\n        ;\n        ;\n            if (!this.transitionHandlerRegistered) {\n                y.registerHandler(this.transitionHandler.bind(this));\n                this.transitionHandlerRegistered = true;\n            }\n        ;\n        ;\n            ba.initLogging(ba.SNOWLIFT);\n            if (this.pivots) {\n                ba.setRelevantCount(this.pivots.relevantCount);\n            }\n        ;\n        ;\n        },\n        toggleFullScreen: function() {\n            var cb = r.toggleFullScreen(JSBNG__document.documentElement);\n            if (cb) {\n                var db = this.stream.getCurrentImageData();\n                if (((((((db && db.url)) && ((this.image.src !== db.url)))) && this.shouldShowHiRes(db)))) {\n                    (new JSBNG__Image()).src = db.url;\n                }\n            ;\n            ;\n                ba.logEnterFullScreen(this.stream.getCursor());\n            }\n        ;\n        ;\n        },\n        getStream: function() {\n            return this.stream;\n        },\n        fetchInitialData: function() {\n            ((this.ua && this.ua.add_event(\"init_data\")));\n            this.stream.waitForInitData();\n            var cb = l(this.container, [\"ft\",]);\n            if (((((((cb && cb.ft)) && cb.ft.ei)) && this.loadQuery))) {\n                this.loadQuery.ei = cb.ft.ei;\n            }\n        ;\n        ;\n            ka.loadFromEndpoint(\"PhotoViewerInitPagelet\", va(\"pagelet_photo_viewer_init\", this.root), this.loadQuery, {\n                usePipe: true,\n                jsNonblock: true,\n                crossPage: true\n            });\n        },\n        toggleCollapse: function() {\n            if (this.rhcCollapsed) {\n                this.uncollapseRHC();\n            }\n             else this.collapseRHC();\n        ;\n        ;\n        },\n        collapseRHC: function() {\n            this.rhcCollapsed = true;\n            m.addClass(this.root, \"collapseRHC\");\n            this.adjustForResize();\n        },\n        uncollapseRHC: function() {\n            this.rhcCollapsed = false;\n            m.removeClass(this.root, \"collapseRHC\");\n            this.adjustForResize();\n        },\n        closeHandler: function() {\n            if (!this.isOpen) {\n                return;\n            }\n        ;\n        ;\n            this.closingAction = ((this.closingAction || ba.ESC));\n            if (((la.getMostRecentURI().addQueryData({\n                closeTheater: 1\n            }).getUnqualifiedURI().toString() == this.startingURI.toString()))) {\n                this.close();\n                return;\n            }\n        ;\n        ;\n            this.returnToStartingURI(this.refreshOnClose);\n            this.close();\n        },\n        returnToStartingURI: function(cb, db) {\n            if (!cb) {\n                if (db) {\n                    this.squashNextTransition(wa.curry(db));\n                }\n                 else this.squashNextTransition();\n            ;\n            }\n        ;\n        ;\n            this.returningToStart = true;\n            var eb = g.subscribe(\"page_transition\", (function() {\n                this.returningToStart = false;\n                eb.unsubscribe();\n            }).bind(this)), fb = ((cb || isNaN(ma.JSBNG__opera()))), gb = this._uriStack.length;\n            if (((fb && ((gb < window.JSBNG__history.length))))) {\n                window.JSBNG__history.go(-gb);\n            }\n             else {\n                var hb = this.startingURI, ib = new la(hb).removeQueryData(\"closeTheater\");\n                if (((((hb.getQueryData().sk == \"approve\")) && ((hb.getPath() == \"/profile.php\"))))) {\n                    ib.removeQueryData(\"highlight\");\n                    ib.removeQueryData(\"notif_t\");\n                }\n            ;\n            ;\n                wa(ib);\n            }\n        ;\n        ;\n        },\n        squashNextTransition: function(cb) {\n            this.squashNext = true;\n            y.registerHandler(function db() {\n                if (this.squashNext) {\n                    this.squashNext = false;\n                    if (cb) {\n                        cb.defer();\n                    }\n                ;\n                ;\n                    y.transitionComplete(true);\n                    return true;\n                }\n            ;\n            ;\n                return false;\n            }.bind(this), 7);\n        },\n        handleNavigateAway: function(cb) {\n            var db = qa(y._most_recent_uri.getQualifiedURI(), cb.getAttribute(\"href\"));\n            if (((this.isOpen && ya(db.getPath(), \"/hashtag/\")))) {\n                this.close();\n                y.transitionComplete(true);\n                this.squashNextTransition();\n                y.go(this.startingURI);\n                return true;\n            }\n        ;\n        ;\n            if (((((((this.isOpen && ((db instanceof la)))) && ((db.getUnqualifiedURI().toString() != this.startingURI.toString())))) && ((db.getPath() != \"/photo.php\"))))) {\n                if (!this.closingAction) {\n                    this.closingAction = ba.NAVIGATE;\n                }\n            ;\n            ;\n                this.returnToStartingURI(false, db);\n                this.close();\n                return false;\n            }\n        ;\n        ;\n            return true;\n        },\n        postProcessTaggedPhotos: function() {\n            if (((this.taggedPhotoIds && ((this.taggedPhotoIds.length > 0))))) {\n                var cb = null;\n                if (((this.source === bb.COLLECTIONS_UNTAGGED_PHOTOS))) {\n                    cb = \"/ajax/photos/photo/edit/skiptag/\";\n                }\n                 else if (((this.source === bb.PHOTOS_OF_YOU_SUGGESTIONS))) {\n                    cb = \"/ajax/photos/photo/add_to_star_grid/\";\n                }\n                \n            ;\n            ;\n                if (cb) {\n                    new i().setURI(cb).setAllowCrossPageTransition(true).setData({\n                        media_id: this.taggedPhotoIds\n                    }).send();\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n        },\n        onTagSaved: function(cb, db) {\n            if (this.taggedPhotoIds) {\n                if (((((this.source === bb.PHOTOS_OF_YOU_SUGGESTIONS)) && !db.self_tag))) {\n                    return;\n                }\n            ;\n            ;\n                this.taggedPhotoIds.push(db.photo_fbid);\n            }\n        ;\n        ;\n        },\n        close: function() {\n            if (!this.isOpen) {\n                return;\n            }\n        ;\n        ;\n            this.isOpen = false;\n            if (this.fullscreen) {\n                r.disableFullScreen();\n            }\n        ;\n        ;\n            ab(\"snowlift\").uai(\"close\");\n            ((this.cropper && this.cropper.disableCropping()));\n            this.spotlight.hide();\n            this.openExplicitly = false;\n            this.postProcessTaggedPhotos();\n            g.unsubscribe(this.saveTagSubscription);\n            this.taggedPhotoIds = [];\n            this.closeDirty = true;\n            this.closeCleanup.bind(this).defer();\n        },\n        closeCleanup: function() {\n            this.closeDirty = false;\n            m.removeClass(this.root, \"dataLoading\");\n            ba.logPhotoViews(this.closingAction);\n            this.destroy();\n            m.hide(this.errorBox);\n            m.hide(this.image);\n            this.currentImageSize = null;\n            this.thumbSrc = null;\n            this.shouldStretch = false;\n            this.resetUriStack = true;\n            m.removeClass(this.stageWrapper, \"showVideo\");\n            o.empty(this.videoStage);\n            this.uncollapseRHC();\n            this.currentMinSize = null;\n            this.rhcMinHeight = null;\n            this.setStagePagersState(\"reset\");\n            this.recacheData();\n            o.empty(this.sideAdUnit);\n            this.stream.destroy();\n            var cb = ((this.closingAction === ba.NAVIGATE));\n            this.closingAction = null;\n            if (!this.openHandlerRegistered) {\n                y.registerHandler(this.openHandler.bind(this));\n                this.openHandlerRegistered = true;\n            }\n        ;\n        ;\n            g.inform(\"layer_hidden\", {\n                type: \"PhotoSnowlift\"\n            });\n            g.inform(\"PhotoSnowlift.CLOSE\", cb);\n            this.root.setAttribute(\"aria-busy\", \"true\");\n        },\n        createLoader: function(cb) {\n            if (((this.currentImageSize === null))) {\n                this.adjustStageSize(bb.STAGE_MIN);\n            }\n             else {\n                var db = this.getStageSize(this.currentImageSize);\n                db = new na(Math.max(db.x, bb.STAGE_MIN.x), Math.max(db.y, bb.STAGE_MIN.y));\n                var eb = this.getImageSizeInStage(this.currentImageSize, db);\n                if (((this.thumbSrc === null))) {\n                    this.adjustStageSize(eb);\n                }\n                 else this.useImage(o.create(\"img\", {\n                    className: \"spotlight\",\n                    alt: \"\",\n                    src: this.thumbSrc,\n                    style: {\n                        width: ((eb.x + \"px\")),\n                        height: ((eb.y + \"px\"))\n                    }\n                }), eb, false);\n            ;\n            ;\n            }\n        ;\n        ;\n            this.setLoadingState(this.STATE_IMAGE_PIXELS, true);\n            if (cb) {\n                (function() {\n                    var fb = new JSBNG__Image(), gb = q.listen(fb, \"load\", pa(function() {\n                        if (!this.isOpen) {\n                            return;\n                        }\n                    ;\n                    ;\n                        if (((!this.stream || !this.stream.errorInCurrent()))) {\n                            this.switchImage(cb, this.currentImageSize);\n                            ((this.ua && this.ua.add_event(\"image\")));\n                            this.setLoadingState(bb.STATE_IMAGE_DATA, false);\n                        }\n                    ;\n                    ;\n                    }.bind(this), \"photo_theater\"));\n                    g.subscribeOnce(\"PhotoSnowlift.PAGE\", gb.remove.bind(gb));\n                    fb.src = cb;\n                }).bind(this).defer();\n            }\n        ;\n        ;\n            m.hide(this.stageActions);\n            this.setStagePagersState(\"disabled\");\n        },\n        initDataFetched: function(cb) {\n            ba.setPhotoSet(this.stream.getPhotoSet());\n            ba.setLogFbids(cb.logids);\n            var db = this.stream.getCurrentImageData();\n            ba.addPhotoView(db.info, this.shouldShowHiRes(db), ((this.fullscreen && r.isFullScreen())));\n            var eb = this.stream.getCurrentExtraData();\n            if (((eb && ((eb.source !== undefined))))) {\n                this.source = parseInt(eb.source, 10);\n                ba.setSource(this.source);\n            }\n        ;\n        ;\n            if (!this.pageHandlers) {\n                this.pageHandlers = [q.listen(this.root, \"click\", this.pageListener.bind(this)),q.listen(this.root, \"mouseleave\", this.mouseLeaveListener.bind(this)),];\n            }\n        ;\n        ;\n            m.show(this.stageActions);\n            this.root.setAttribute(\"aria-busy\", \"false\");\n            this.isLoggedInViewer = cb.loggedin;\n            this.disableAdsForSession = ((cb.disablesessionads || !this.isLoggedInViewer));\n            this.showFlashTags = !!cb.flashtags;\n            this.disableAds = ((this.disableAdsForSession || cb.fromad));\n            this.loadAds();\n        },\n        adjustScrollerIfNecessary: function() {\n            JSBNG__clearTimeout(this.scrollerTimeout);\n            this.scrollerTimeout = this.adjustScroller.bind(this).defer();\n        },\n        adjustScroller: function(cb) {\n            JSBNG__clearTimeout(this.scrollerTimeout);\n            this.initializeScroller();\n            this.scrollableArea.resize();\n            var db = na.getElementDimensions(this.rhc), eb = db.y;\n            eb -= na.getElementDimensions(this.rhcHeader).y;\n            eb -= na.getElementDimensions(this.ufiInputContainer).y;\n            if (this.productMetadata) {\n                var fb = na.getElementDimensions(this.productMetadata);\n                if (((fb.x !== 0))) {\n                    eb -= fb.y;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            if (((cb == null))) {\n                cb = 0;\n            }\n        ;\n        ;\n            this.rhcMinHeight = ((db.y - ((eb - bb.MIN_UFI_HEIGHT))));\n            eb = Math.max(0, eb);\n            var gb = na.getElementDimensions(this.scrollerBody).y, hb = Math.max(bb.MIN_UFI_HEIGHT, ((eb - cb)));\n            if (((gb >= hb))) {\n                ia.set(this.scroller, \"height\", ((hb + \"px\")));\n                if (((eb > hb))) {\n                    m.removeClass(this.rhc, \"pinnedUfi\");\n                    eb -= hb;\n                }\n                 else {\n                    m.addClass(this.rhc, \"pinnedUfi\");\n                    eb = 0;\n                }\n            ;\n            ;\n            }\n             else {\n                ia.set(this.scroller, \"height\", \"auto\");\n                m.removeClass(this.rhc, \"pinnedUfi\");\n                eb -= gb;\n            }\n        ;\n        ;\n            var ib = o.scry(this.scrollerBody, \"li.UFIFirstComponent\");\n            if (((ib.length === 0))) {\n                var jb = o.scry(this.ufiInputContainer, \"li.UFIAddComment\");\n                if (((jb.length !== 0))) {\n                    m.addClass(jb[0], \"UFIFirstComponent\");\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            var kb = na.getElementDimensions(this.ufiInputContainer).y;\n            ia.set(this.ufiForm, \"padding-bottom\", ((kb + \"px\")));\n            ca.resize(new na(db.x, eb));\n            this.scrollableArea.adjustGripper();\n        },\n        adjustForResize: function() {\n            this.currentMinSize = null;\n            this.adjustStageSize();\n            this.adjustForNewData();\n        },\n        shouldShowHiRes: function(cb) {\n            if (((!cb || !cb.smallurl))) {\n                return false;\n            }\n        ;\n        ;\n            var db = this.getStageSize(cb.dimensions), eb = this.getImageSizeInStage(cb.dimensions, db);\n            return ((((eb.x > bb.STAGE_NORMAL_MAX.x)) || ((eb.y > bb.STAGE_NORMAL_MAX.y))));\n        },\n        getImageURL: function(cb) {\n            if (cb.video) {\n                return null;\n            }\n             else if (((cb.smallurl && !this.shouldShowHiRes(cb)))) {\n                return cb.smallurl;\n            }\n            \n        ;\n        ;\n            return cb.url;\n        },\n        getImageDimensions: function(cb) {\n            if (((cb.smalldims && ((!this.shouldShowHiRes(cb) || ((this.image.src === cb.smallurl))))))) {\n                return cb.smalldims;\n            }\n        ;\n        ;\n            return cb.dimensions;\n        },\n        getStageSize: function(cb, db) {\n            var eb = na.getViewportDimensions(), fb = new na(cb.x, cb.y);\n            if (db) {\n                fb = new na(Math.max(cb.x, db.x), Math.max(cb.y, db.y));\n            }\n        ;\n        ;\n            var gb, hb;\n            if (((this.fullscreen && r.isFullScreen()))) {\n                return new na(((this.rhcCollapsed ? JSBNG__screen.width : ((JSBNG__screen.width - bb.SIDEBAR_SIZE_MAX)))), ((JSBNG__screen.height - ((bb.FULL_SCREEN_PADDING * 2)))));\n            }\n             else {\n                gb = Math.min(fb.x, this.stageMax.x, ((((eb.x - bb.SIDEBAR_SIZE_MAX)) - bb.STAGE_CHROME.x)));\n                hb = Math.min(fb.y, this.stageMax.y, ((eb.y - bb.STAGE_CHROME.y)));\n            }\n        ;\n        ;\n            if (((((gb === 0)) && ((hb === 0))))) {\n                return new na(0, 0);\n            }\n        ;\n        ;\n            var ib = ((gb / hb)), jb = ((fb.x / fb.y));\n            if (((ib < jb))) {\n                return new na(gb, Math.round(((gb / jb))));\n            }\n        ;\n        ;\n            return new na(Math.round(((hb * jb))), hb);\n        },\n        getImageSizeInStage: function(cb, db) {\n            var eb = cb.x, fb = cb.y;\n            if (((((eb >= db.x)) || ((fb >= db.y))))) {\n                var gb = ((db.x / db.y)), hb = ((eb / fb));\n                if (((gb < hb))) {\n                    eb = db.x;\n                    fb = Math.round(((eb / hb)));\n                }\n                 else if (((gb > hb))) {\n                    fb = db.y;\n                    eb = Math.round(((fb * hb)));\n                }\n                 else {\n                    eb = db.x;\n                    fb = db.y;\n                }\n                \n            ;\n            ;\n            }\n        ;\n        ;\n            return new na(eb, fb);\n        },\n        adjustStageSize: function(cb) {\n            var db = this.currentImageSize;\n            if (cb) {\n                db = cb;\n            }\n             else {\n                var eb = ((this.stream && this.stream.getCurrentImageData()));\n                if (eb) {\n                    db = this.getImageDimensions(eb);\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            if (!db) {\n                return;\n            }\n        ;\n        ;\n            this.currentImageSize = db;\n            var fb = 0;\n            if (((((((((this.shouldStretch && !this.getVideoOnStage())) && ((db.x > db.y)))) && ((db.x <= bb.TIMELINE_STRETCH_WIDTH)))) && ((db.x >= bb.TIMELINE_STRETCH_MIN))))) {\n                db.y = Math.round(((((db.y * bb.TIMELINE_STRETCH_WIDTH)) / db.x)));\n                db.x = bb.TIMELINE_STRETCH_WIDTH;\n            }\n             else if (this.getVideoOnStage()) {\n                fb = ((bb.VIDEO_BOTTOM_BAR_SPACE * 2));\n            }\n            \n        ;\n        ;\n            var gb = this.getStageSize(db, this.currentMinSize);\n            if (!this.currentMinSize) {\n                this.currentMinSize = new na(0, 0);\n            }\n        ;\n        ;\n            if (!this.rhcMinHeight) {\n                this.rhcMinHeight = 0;\n            }\n        ;\n        ;\n            this.currentMinSize = new na(Math.max(gb.x, bb.STAGE_MIN.x, this.currentMinSize.x), Math.max(gb.y, bb.STAGE_MIN.y, this.currentMinSize.y));\n            var hb = this.getImageSizeInStage(db, this.currentMinSize), ib = ((this.currentMinSize.x - hb.x)), jb = ((this.currentMinSize.y - hb.y));\n            if (((((ib > 0)) && ((ib < bb.PADDING_MIN))))) {\n                this.currentMinSize.x -= ib;\n            }\n             else if (((((jb > 0)) && ((jb < bb.PADDING_MIN))))) {\n                this.currentMinSize.y -= jb;\n            }\n            \n        ;\n        ;\n            var kb = o.scry(this.productMetadata, \"#fbPhotoSnowliftTaggedProducts .taggee\");\n            if (kb.length) {\n                this.currentMinSize.y = Math.max(this.currentMinSize.y, this.rhcMinHeight);\n            }\n        ;\n        ;\n            var lb = ((this.currentMinSize.x + bb.SIDEBAR_SIZE_MAX));\n            if (this.rhcCollapsed) {\n                lb = this.currentMinSize.x;\n            }\n        ;\n        ;\n            this.snowliftPopup.style.cssText = ((((((((((\"width:\" + lb)) + \"px;\")) + \"height:\")) + this.currentMinSize.y)) + \"px;\"));\n            var mb = ((((this.currentMinSize.y - fb)) + \"px\"));\n            if (((ma.firefox() || ((ma.ie() < 8))))) {\n                var nb = ia.get(this.stageWrapper, \"font-size\");\n                if (((ma.ie() && ((nb.indexOf(\"px\") < 0))))) {\n                    var ob = o.create(\"div\");\n                    ob.style.fontSize = nb;\n                    ob.style.height = \"1em\";\n                    nb = ob.style.pixelHeight;\n                }\n            ;\n            ;\n                mb = ((((((this.currentMinSize.y - fb)) / parseFloat(nb))) + \"em\"));\n            }\n        ;\n        ;\n            this.stageWrapper.style.cssText = ((((((((((\"width:\" + this.currentMinSize.x)) + \"px;\")) + \"line-height:\")) + mb)) + \";\"));\n            if (((ma.ie() < 8))) {\n                ia.set(this.root, \"height\", ((na.getViewportDimensions().y + \"px\")));\n                ia.set(this.container, \"min-height\", ((((this.currentMinSize.y + bb.STAGE_CHROME.y)) + \"px\")));\n            }\n        ;\n        ;\n            this.image.style.cssText = ((((((((((\"width:\" + hb.x)) + \"px;\")) + \"height:\")) + hb.y)) + \"px;\"));\n            var pb = this.getTagger();\n            if (pb) {\n                pb.repositionTagger();\n            }\n        ;\n        ;\n            this.adjustScrollerIfNecessary();\n        },\n        adjustForNewData: function() {\n            if (!this.image) {\n                return;\n            }\n        ;\n        ;\n            var cb = o.scry(this.stage, \"div.tagsWrapper\")[0], db = na.getElementDimensions(this.image);\n            if (cb) {\n                ia.set(cb, \"width\", ((db.x + \"px\")));\n                ia.set(cb, \"height\", ((db.y + \"px\")));\n                if (((ma.ie() <= 7))) {\n                    var eb = o.scry(this.root, \"div.tagContainer\")[0];\n                    if (eb) {\n                        m.conditionClass(cb, \"ie7VerticalFix\", ((na.getElementDimensions(eb).y > db.y)));\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n        },\n        adsDisplayedCallback: function(cb, db) {\n            if (((((((((((this.resizeCommentsForAds && !this.inAdsDisplayedCallback)) && !this.disableAds)) && ((bb.MIN_ADS_VISIBLE > 0)))) && ((cb < bb.MIN_ADS_VISIBLE)))) && ((db.length >= bb.MIN_ADS_VISIBLE))))) {\n                this.inAdsDisplayedCallback = true;\n                var eb = db[((bb.MIN_ADS_VISIBLE - 1))];\n                this.adjustScroller(eb);\n                this.inAdsDisplayedCallback = false;\n            }\n        ;\n        ;\n        },\n        setLoadingState: function(cb, db) {\n            switch (cb) {\n              case bb.STATE_IMAGE_PIXELS:\n                m.conditionClass(this.root, \"imagePixelsLoading\", db);\n                break;\n              case bb.STATE_IMAGE_DATA:\n                this.loadingStates[cb] = db;\n                m.conditionClass(this.root, \"imageLoading\", db);\n                break;\n              case bb.STATE_HTML:\n                this.loadingStates[cb] = db;\n                m.conditionClass(this.root, \"dataLoading\", db);\n                this.rhc.setAttribute(\"aria-busy\", ((db ? \"true\" : \"false\")));\n                break;\n            };\n        ;\n        },\n        destroy: function() {\n            this.stageHandlers.forEach(function(cb) {\n                cb.remove();\n            });\n            if (this.pageHandlers) {\n                this.pageHandlers.forEach(function(cb) {\n                    cb.remove();\n                });\n                this.pageHandlers = null;\n            }\n        ;\n        ;\n        },\n        checkState: function(cb) {\n            if (((((cb != bb.STATE_ERROR)) && !this.loadingStates[cb]))) {\n                return;\n            }\n        ;\n        ;\n            switch (cb) {\n              case bb.STATE_IMAGE_DATA:\n                var db = this.stream.getCurrentImageData();\n                if (db) {\n                    var eb = this.getImageURL(db);\n                    if (eb) {\n                        this.switchImage(eb, null, true);\n                    }\n                     else if (db.video) {\n                        this.switchVideo(db.video, true);\n                    }\n                    \n                ;\n                ;\n                    this.setLoadingState(cb, false);\n                }\n            ;\n            ;\n                break;\n              case bb.STATE_HTML:\n                if (this.stream.getCurrentHtml()) {\n                    this.swapData();\n                    this.showPagers(bb.PAGER_FADE);\n                    this.setLoadingState(cb, false);\n                }\n            ;\n            ;\n                break;\n              default:\n                if (this.stream.errorInCurrent()) {\n                    m.hide(this.image);\n                    m.show(this.errorBox);\n                }\n            ;\n            ;\n                break;\n            };\n        ;\n        },\n        buttonListener: function(JSBNG__event) {\n            var cb = JSBNG__event.getTarget(), db = JSBNG__Date.now();\n            if (z.byClass(cb, \"fbPhotoTagApprovalBox\")) {\n                return;\n            }\n        ;\n        ;\n            if (z.byClass(cb, \"fbPhotosCornerWantButton\")) {\n                JSBNG__event.JSBNG__stop();\n                return;\n            }\n        ;\n        ;\n            if (((((db - this.lastPage)) < 350))) {\n                return;\n            }\n        ;\n        ;\n            if (z.byClass(cb, \"fbPhotosPhotoLike\")) {\n                this.likePhoto();\n            }\n             else if (z.byClass(cb, \"tagApproveIgnore\")) {\n                this.updateTagBox(JSBNG__event, cb);\n            }\n            \n        ;\n        ;\n        },\n        likePhoto: function() {\n            ba.addButtonLike();\n            var cb = oa(\"fbPhotoSnowliftFeedback\"), db = o.scry(cb, \"button.like_link\")[0];\n            if (!db) {\n                db = o.scry(cb, \"a.UFILikeLink\")[0];\n            }\n        ;\n        ;\n            var eb = db.getAttribute(\"href\");\n            if (r.isFullScreen()) {\n                if (ma.chrome()) {\n                    db.setAttribute(\"href\", \"javascript:;\");\n                }\n            ;\n            }\n        ;\n        ;\n            db.click();\n            db.setAttribute(\"href\", eb);\n        },\n        toggleLikeButton: function() {\n            var cb = o.scry(this.buttonActions, \"a.fbPhotosPhotoLike\")[0];\n            if (cb) {\n                var db = o.JSBNG__find(this.root, \".likeCount\"), eb = o.JSBNG__find(db, \".likeCountNum\");\n                if (db) {\n                    if (m.hasClass(cb, \"viewerLikesThis\")) {\n                        o.setContent(eb, ((parseInt(eb.textContent, 10) - 1)));\n                    }\n                     else o.setContent(eb, ((parseInt(eb.textContent, 10) + 1)));\n                ;\n                }\n            ;\n            ;\n                m.toggleClass(cb, \"viewerLikesThis\");\n                m.removeClass(cb, \"viewerAlreadyLikedThis\");\n            }\n        ;\n        ;\n        },\n        likePhotoWithKey: function() {\n            if (this.isShowingLikePhotoConfirmation) {\n                return;\n            }\n        ;\n        ;\n            if (this.skipLikePhotoConfirmation) {\n                this.likePhoto();\n            }\n             else h.send(new i(\"/photos/confirm_like.php\"), function(cb) {\n                this.isShowingLikePhotoConfirmation = true;\n                cb.subscribe(\"JSBNG__confirm\", this.onCloseLikePhotoConfirmDialog.bind(this));\n                cb.subscribe(\"cancel\", this.onCloseLikePhotoConfirmDialog.bind(this));\n            }.bind(this));\n        ;\n        ;\n            return false;\n        },\n        likePhotoSkipConfirmation: function(cb) {\n            this.skipLikePhotoConfirmation = cb;\n            this.likePhoto();\n        },\n        onCloseLikePhotoConfirmDialog: function() {\n            this.isShowingLikePhotoConfirmation = false;\n        },\n        updateTagBox: function(cb, db) {\n            this.unhiliteAllTags();\n            var eb = va(cb);\n            if (!eb) {\n                return;\n            }\n        ;\n        ;\n            m.addClass(eb, \"tagBox\");\n            m.addClass(eb, \"tagBoxPendingResponse\");\n            m.removeClass(eb, \"tagBoxPending\");\n            m.hide(o.JSBNG__find(eb, \"span.tagForm\"));\n            if (db) {\n                m.show(o.JSBNG__find(eb, \"span.tagApproved\"));\n            }\n             else m.show(o.JSBNG__find(eb, \"span.tagIgnored\"));\n        ;\n        ;\n        },\n        rotate: function(cb) {\n            var db = this.stream.getCursor();\n            if (this.getVideoOnStage()) {\n                var eb = ((((cb == \"left\")) ? 270 : 90));\n                j.loadModules([\"VideoRotate\",], function(gb) {\n                    new gb(db).motionRotate(eb);\n                });\n                return;\n            }\n        ;\n        ;\n            var fb = ra({\n                fbid: db,\n                cs_ver: aa.VIEWER_SNOWLIFT\n            }, this.stream.getPhotoSetQuery());\n            fb[cb] = 1;\n            this.setLoadingState(bb.STATE_IMAGE_DATA, true);\n            this.setLoadingState(this.STATE_IMAGE_PIXELS, true);\n            m.hide(this.image);\n            new i(\"/ajax/photos/photo/rotate/\").setAllowCrossPageTransition(true).setData(fb).setErrorHandler(this.rotationError.bind(this, db)).setFinallyHandler(this.rotationComplete.bind(this, db)).setMethod(\"POST\").setReadOnly(false).send();\n        },\n        rotationComplete: function(cb, db) {\n            if (((cb == this.stream.getCursor()))) {\n                this.setLoadingState(bb.STATE_IMAGE_DATA, false);\n                this.switchImage(this.getImageURL(this.stream.getCurrentImageData()));\n                this.swapData();\n            }\n        ;\n        ;\n        },\n        rotationError: function(cb, db) {\n            if (((cb == this.stream.getCursor()))) {\n                this.setLoadingState(bb.STATE_IMAGE_DATA, false);\n                this.switchImage(this.getImageURL(this.stream.getCurrentImageData()));\n                j.loadModules([\"AsyncResponse\",], function(eb) {\n                    eb.defaultErrorHandler(db);\n                });\n            }\n        ;\n        ;\n        },\n        saveTagsFromPayload: function(cb) {\n            this.storeFromData(cb);\n            if (((((\"data\" in cb)) && ((this.stream.getCursor() in cb.data))))) {\n                this.swapData();\n            }\n        ;\n        ;\n        },\n        saveEdit: function() {\n            if (!m.hasClass(this.root, \"fbPhotoSnowliftEditMode\")) {\n                return;\n            }\n        ;\n        ;\n            j.loadModules([\"PhotoInlineEditor\",\"Form\",], function(cb, db) {\n                var eb = cb.getInstance(this.getViewerConst());\n                ((eb && db.bootstrap(eb.getForm().controller)));\n            }.bind(this));\n        },\n        mouseLeaveListener: function(JSBNG__event) {\n            this.unhiliteAllTags();\n            this.reHilitePendingTag();\n        },\n        hilitePagerOnMouseMove: function(JSBNG__event) {\n            var cb = na.getEventPosition(JSBNG__event), db = na.getElementPosition(this.stage);\n            if (x.isRTL()) {\n                var eb = na.getElementDimensions(this.stage);\n                this.stagePagerPrev = ((((eb.x - ((cb.x - db.x)))) < bb.GOPREV_AREA));\n            }\n             else this.stagePagerPrev = ((((cb.x - db.x)) < bb.GOPREV_AREA));\n        ;\n        ;\n            m.conditionClass(this.prevPager, \"hilightPager\", this.stagePagerPrev);\n            m.conditionClass(this.nextPager, \"hilightPager\", !this.stagePagerPrev);\n            var fb, gb = JSBNG__event.getTarget();\n            if (((((!z.byClass(gb, \"snowliftOverlay\") && !z.byClass(gb, \"bottomBarActions\"))) && !z.byClass(gb, \"snowliftPager\")))) {\n                fb = bb.PAGER_FADE;\n            }\n        ;\n        ;\n            this.showPagers(fb);\n        },\n        showPagers: function(cb) {\n            JSBNG__clearTimeout(this.fadePagerTimer);\n            this.setStagePagersState(\"active\");\n            if (((typeof cb !== \"undefined\"))) {\n                this.fadePagerTimer = this.hidePagers.bind(this).defer(cb);\n            }\n        ;\n        ;\n        },\n        hidePagers: function() {\n            var cb = o.scry(this.getRoot(), \".fbPhotosPhotoActionsMenu\")[0];\n            if (cb) {\n                return;\n            }\n        ;\n        ;\n            JSBNG__clearTimeout(this.fadePagerTimer);\n            this.setStagePagersState(\"inactive\");\n        },\n        getTagger: function() {\n            if (!this.PhotoTagger) {\n                return null;\n            }\n        ;\n        ;\n            var cb = this.PhotoTagger.getInstance(aa.VIEWER_SNOWLIFT);\n            if (((!cb || !cb.tagHoverFacebox))) {\n                return null;\n            }\n        ;\n        ;\n            return cb;\n        },\n        hiliteAllBoxes: function() {\n            o.scry(this.stage, \"div.tagsWrapper div.faceBox\").forEach(function(cb) {\n                m.addClass(cb, \"otherActive\");\n            });\n        },\n        flashAllTags: function() {\n            var cb = this.stream.getCurrentImageData().info.fbid;\n            if (this.sessionPhotosHilited[cb]) {\n                return;\n            }\n        ;\n        ;\n            o.scry(this.stage, \"div.tagsWrapper div.tagBox\").forEach(function(db) {\n                m.addClass(db, \"hover\");\n            });\n            this.sessionPhotosHilited[cb] = true;\n            this.unhiliteTimer = this.unhiliteAllTags.bind(this).defer(2000, true);\n        },\n        unhiliteAllTags: function() {\n            JSBNG__clearTimeout(this.unhiliteTimer);\n            o.scry(this.stage, \"div.tagsWrapper div.hover\").forEach(function(db) {\n                m.removeClass(db, \"hover\");\n            });\n            if (this.hilitAllTagsAndBoxesOnHover) {\n                o.scry(this.stage, \"div.tagsWrapper div.otherActive\").forEach(function(db) {\n                    m.removeClass(db, \"otherActive\");\n                });\n            }\n        ;\n        ;\n            this.hilitedTag = null;\n            if (!m.hasClass(this.root, \"taggingMode\")) {\n                var cb = this.getTagger();\n                if (cb) {\n                    cb.hideTagger();\n                    cb.setCurrentFacebox(null);\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n        },\n        switchHilitedTags: function(cb, db) {\n            if (((this.switchTimer !== null))) {\n                JSBNG__clearTimeout(this.switchTimer);\n                this.switchTimer = null;\n            }\n        ;\n        ;\n            this.unhiliteAllTags();\n            if (this.hilitAllTagsAndBoxesOnHover) {\n                this.hiliteAllBoxes();\n            }\n        ;\n        ;\n            var eb = va(cb);\n            if (eb) {\n                this.hilitedTag = cb;\n                if (((!m.hasClass(this.root, \"taggingMode\") && ea.isFacebox(this.hilitedTag)))) {\n                    var fb = this.getTagger();\n                    if (fb) {\n                        m.addClass(eb, \"hover\");\n                        var gb = fb.getFacebox(cb);\n                        fb.setCurrentFacebox(gb);\n                        if (gb) {\n                            fb.addTagFromFacebox(gb);\n                        }\n                    ;\n                    ;\n                    }\n                ;\n                ;\n                }\n                 else m.addClass(eb, \"hover\");\n            ;\n            ;\n                if (((((m.hasClass(eb, \"tagBoxPending\") && !m.hasClass(eb, \"showPendingTagName\"))) && ((db === true))))) {\n                    o.scry(this.stage, \"div.tagsWrapper div.showPendingTagName\").forEach(function(hb) {\n                        m.removeClass(hb, \"showPendingTagName\");\n                    });\n                    m.addClass(eb, \"showPendingTagName\");\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n        },\n        reHilitePendingTag: function() {\n            var cb = va(this.hilitedTag);\n            if (((cb && m.hasClass(cb, \"showPendingTagName\")))) {\n                return;\n            }\n        ;\n        ;\n            var db = o.scry(this.stage, \"div.tagsWrapper div.showPendingTagName\")[0];\n            if (db) {\n                this.switchHilitedTags(db.id);\n            }\n        ;\n        ;\n        },\n        hiliteTagsOnMouseMove: function(JSBNG__event) {\n            if (((!this.stream.getCurrentExtraData() || this.getVideoOnStage()))) {\n                return;\n            }\n        ;\n        ;\n            if (((this.switchTimer !== null))) {\n                return;\n            }\n        ;\n        ;\n            var cb = JSBNG__event.getTarget();\n            if (((((((((((((z.byClass(cb, \"snowliftOverlay\") || z.byClass(cb, \"fbPhotoSnowliftTagApproval\"))) || z.byClass(cb, \"tagPointer\"))) || z.byClass(cb, \"arrow\"))) || z.byClass(cb, \"faceboxSuggestion\"))) || z.byClass(cb, \"typeaheadWrapper\"))) || z.byClass(cb, \"photoTagTypeahead\")))) {\n                return;\n            }\n        ;\n        ;\n            var db = z.byClass(cb, \"tagBoxPending\"), eb = false;\n            if (this.hilitedTag) {\n                var fb = va(this.hilitedTag);\n                eb = ((fb && m.hasClass(fb, \"tagBoxPending\")));\n            }\n        ;\n        ;\n            var gb = ((((!this.hilitedTag && db)) || ((!eb && db))));\n            if (gb) {\n                this.switchHilitedTags(db.id);\n                return;\n            }\n        ;\n        ;\n            if (((db && ((db.id == this.hilitedTag))))) {\n                return;\n            }\n        ;\n        ;\n            var hb = 250, ib = ea.absoluteToNormalizedPosition(this.image, na.getEventPosition(JSBNG__event));\n            if (this.currentTagHasPrecedence(ib)) {\n                return;\n            }\n        ;\n        ;\n            var jb = ea.getNearestBox(this.stream.getCurrentExtraData().tagRects, ib);\n            if (!jb) {\n                if (!eb) {\n                    this.unhiliteAllTags();\n                    this.reHilitePendingTag();\n                }\n            ;\n            ;\n                return;\n            }\n        ;\n        ;\n            var kb = null;\n            if (eb) {\n                var lb = {\n                };\n                lb[this.hilitedTag] = this.stream.getCurrentExtraData().tagRects[this.hilitedTag];\n                kb = ea.getNearestBox(lb, ib);\n            }\n        ;\n        ;\n            if (((((kb !== null)) && eb))) {\n                return;\n            }\n        ;\n        ;\n            if (((this.hilitedTag != jb))) {\n                if (eb) {\n                    this.switchTimer = this.switchHilitedTags.bind(this, jb).defer(hb);\n                }\n                 else {\n                    if (this.showHover) {\n                        if (!this.seenTags) {\n                            this.seenTags = [];\n                        }\n                    ;\n                    ;\n                        if (!this.seenTags[jb]) {\n                            ba.addFaceTagImpression();\n                            this.seenTags[jb] = true;\n                        }\n                    ;\n                    ;\n                    }\n                ;\n                ;\n                    this.switchHilitedTags(jb);\n                }\n            ;\n            }\n        ;\n        ;\n        },\n        currentTagHasPrecedence: function(cb) {\n            if (!this.hilitedTag) {\n                return false;\n            }\n        ;\n        ;\n            if (((this.stream.getCurrentExtraData().tagRects[this.hilitedTag] === undefined))) {\n                this.hilitedTag = null;\n                return false;\n            }\n        ;\n        ;\n            var db = this.stream.getCurrentExtraData().tagRects[this.hilitedTag], eb = new ga(((db.t + ((db.h() / 2)))), db.r, ((db.b + ((ea.isFacebox(this.hilitedTag) ? 10 : 0)))), db.l, db.domain);\n            return eb.contains(cb);\n        },\n        getVideoOnStage: function() {\n            var cb = ((this.stream && this.stream.getCurrentImageData()));\n            return ((cb && cb.video));\n        },\n        shouldPageOnAction: function(cb, db) {\n            if (((!this.isOpen || this.isShowingLikePhotoConfirmation))) {\n                return false;\n            }\n        ;\n        ;\n            var eb = ((o.isNode(db) && ((((z.byClass(db, \"snowliftPager\") || z.byClass(db, \"stagePagers\"))) || z.byClass(db, \"pivotPageColumn\"))))), fb = ((o.isNode(db) && z.byClass(db, \"stage\"))), gb = m.hasClass(db, \"faceBox\"), hb = ((((((((((((fb && m.hasClass(this.root, \"taggingMode\"))) || z.byClass(db, \"tagBoxPending\"))) || z.byClass(db, \"tagBoxPendingResponse\"))) || z.byClass(db, \"fbPhotoTagApprovalBox\"))) || z.byClass(db, \"tag\"))) || ((this.cropper && this.cropper.croppingMode))));\n            if (hb) {\n                return false;\n            }\n        ;\n        ;\n            return ((((((((((cb == u.LEFT)) || ((cb == u.RIGHT)))) || ((!m.hasClass(this.root, \"taggingMode\") && gb)))) || eb)) || fb));\n        },\n        keyHandler: function(cb, JSBNG__event) {\n            if (((JSBNG__event.getModifiers().any || ((v.getTopmostLayer() !== this.spotlight))))) {\n                return true;\n            }\n        ;\n        ;\n            switch (q.getKeyCode(JSBNG__event)) {\n              case u.LEFT:\n            \n              case u.RIGHT:\n                if (!this.pagersOnKeyboardNav) {\n                    this.showPagers(bb.PAGER_FADE);\n                }\n            ;\n            ;\n                this.pageListener(JSBNG__event);\n                return false;\n              case 70:\n                return this.toggleFullScreen();\n              case 76:\n                return this.likePhotoWithKey();\n            };\n        ;\n        },\n        pageListener: function(JSBNG__event) {\n            var cb = q.getKeyCode(JSBNG__event), db = JSBNG__event.getTarget();\n            if (!this.shouldPageOnAction(cb, db)) {\n                return;\n            }\n        ;\n        ;\n            var eb = 0;\n            if (((cb == u.RIGHT))) {\n                eb = 1;\n                ba.setPagingAction(\"key_right\");\n            }\n             else if (((cb == u.LEFT))) {\n                eb = -1;\n                ba.setPagingAction(\"key_left\");\n            }\n             else if (z.byClass(db, \"next\")) {\n                eb = 1;\n                ba.setPagingAction(\"click_next\");\n            }\n             else if (z.byClass(db, \"prev\")) {\n                eb = -1;\n                ba.setPagingAction(\"click_prev\");\n            }\n             else if (!this.stagePagerPrev) {\n                eb = 1;\n                ba.setPagingAction(\"click_stage\");\n            }\n             else {\n                eb = -1;\n                ba.setPagingAction(\"click_stage_back\");\n            }\n            \n            \n            \n            \n        ;\n        ;\n            var fb = o.scry(this.ufiForm, \"input.mentionsHidden\"), gb = false;\n            for (var hb = 0; ((hb < fb.length)); hb++) {\n                if (!s.isEmpty(fb[hb])) {\n                    gb = true;\n                    break;\n                }\n            ;\n            ;\n            };\n        ;\n            if (((((gb || m.hasClass(this.root, \"fbPhotoSnowliftEditMode\"))) || ((this.cropper && this.cropper.croppingMode))))) {\n                this.warnLeavePage(eb);\n            }\n             else {\n                this.page(eb, ((ma.chrome() && r.isFullScreen())));\n                ab(\"snowlift\", db, JSBNG__event).uai(ba.pagingAction);\n            }\n        ;\n        ;\n        },\n        warnLeavePage: function(cb) {\n            new n().setTitle(\"Are you sure you want to leave this page?\").setBody(\"You have unsaved changes that will be lost if you leave the page.\").setButtons([{\n                JSBNG__name: \"leave_page\",\n                label: \"Leave this Page\",\n                handler: this.page.bind(this, cb)\n            },{\n                JSBNG__name: \"continue_editing\",\n                label: \"Stay on this Page\",\n                className: \"inputaux\"\n            },]).setModal(true).show();\n        },\n        page: function(cb, db) {\n            if (!this.stream.isValidMovement(cb)) {\n                this.showPagers(bb.PAGER_FADE);\n                return;\n            }\n        ;\n        ;\n            this.lastPage = JSBNG__Date.now();\n            this.unhiliteAllTags();\n            this.seenTags = [];\n            var eb = this.getVideoOnStage();\n            if (eb) {\n                this.switchVideo(eb, false);\n            }\n        ;\n        ;\n            if (((this.pivots && this.pivots.page(cb)))) {\n                return;\n            }\n        ;\n        ;\n            g.inform(\"PhotoSnowlift.PAGE\");\n            ja.hide();\n            this.recacheData();\n            this.stream.moveCursor(cb);\n            m.hide(this.image);\n            if (this.stream.errorInCurrent()) {\n                this.setLoadingState(bb.STATE_HTML, true);\n                m.show(this.errorBox);\n                return;\n            }\n        ;\n        ;\n            var fb = this.stream.getCurrentImageData();\n            if (fb) {\n                var gb = this.getImageURL(fb);\n                if (gb) {\n                    this.switchImage(gb, null, true);\n                }\n                 else if (fb.video) {\n                    this.switchVideo(fb.video, true);\n                }\n                \n            ;\n            ;\n                if (!db) {\n                    this.replaceUrl = true;\n                    wa(fb.info.permalink);\n                }\n            ;\n            ;\n                this.setLoadingState(bb.STATE_IMAGE_DATA, false);\n            }\n             else {\n                this.setLoadingState(bb.STATE_IMAGE_PIXELS, true);\n                this.setLoadingState(bb.STATE_IMAGE_DATA, true);\n            }\n        ;\n        ;\n            if (this.stream.getCurrentHtml()) {\n                this.swapData();\n            }\n             else this.setLoadingState(bb.STATE_HTML, true);\n        ;\n        ;\n            this.disableAds = this.disableAdsForSession;\n            this.loadAds();\n            if (this.cropper) {\n                this.cropper.resetPhoto();\n            }\n        ;\n        ;\n        },\n        logImpressionDetailsForPhoto: function() {\n            var cb = [].concat(o.scry(oa(\"fbPhotoSnowliftTagList\"), \"input.photoImpressionDetails\"), o.scry(oa(\"fbPhotoSnowliftFeedback\"), \"input.photoImpressionDetails\"));\n            if (((cb.length === 0))) {\n                return;\n            }\n        ;\n        ;\n            var db = {\n            };\n            for (var eb = 0; ((eb < cb.length)); eb++) {\n                db[cb[eb].JSBNG__name] = cb[eb].value;\n            ;\n            };\n        ;\n            if (this.getVideoOnStage()) {\n                db.width = 0;\n                db.height = 0;\n            }\n             else {\n                var fb = this.getImageDimensions(this.stream.getCurrentImageData());\n                db.width = fb.x;\n                db.height = fb.y;\n            }\n        ;\n        ;\n            ba.addDetailData(this.stream.getCursor(), db);\n            ca.setIsLogAdData(true);\n        },\n        loadAds: function() {\n            if (this.disableAds) {\n                return;\n            }\n        ;\n        ;\n            ca.loadAdsFromUserActivity();\n        },\n        transitionHandler: function(cb) {\n            if (((((((cb.getQueryData().closeTheater || cb.getQueryData().permPage)) || cb.getQueryData().makeprofile)) || this.returningToStart))) {\n                if (this.isOpen) {\n                    this.close();\n                }\n            ;\n            ;\n                this.transitionHandlerRegistered = false;\n                return false;\n            }\n        ;\n        ;\n            if (this.replaceUrl) {\n                this.replaceUrl = false;\n                this._uriStack.push(cb.getQualifiedURI().toString());\n                y.transitionComplete(true);\n                return true;\n            }\n        ;\n        ;\n            var db = this._uriStack.length;\n            if (((((db >= 2)) && ((this._uriStack[((db - 2))] == cb.getQualifiedURI().toString()))))) {\n                this._uriStack.pop();\n            }\n        ;\n        ;\n            var eb = this.stream.getCursorForURI(cb.getUnqualifiedURI().toString());\n            if (eb) {\n                var fb = this.stream.getRelativeMovement(eb);\n                this.page(fb, true);\n                y.transitionComplete(false);\n                return true;\n            }\n        ;\n        ;\n            if (this.isOpen) {\n                y.transitionComplete(true);\n                this.close();\n                return true;\n            }\n        ;\n        ;\n            this.transitionHandlerRegistered = false;\n            return false;\n        },\n        recacheData: function() {\n            if (!this.loadingStates.html) {\n                var cb = this.stream.getCurrentHtml();\n                {\n                    var fin297keys = ((window.top.JSBNG_Replay.forInKeys)((cb))), fin297i = (0);\n                    var db;\n                    for (; (fin297i < fin297keys.length); (fin297i++)) {\n                        ((db) = (fin297keys[fin297i]));\n                        {\n                            cb[db] = sa(oa(db).childNodes);\n                            o.empty(oa(db));\n                        };\n                    };\n                };\n            ;\n            }\n        ;\n        ;\n        },\n        reloadIfTimeout: function() {\n            if (!t.hasLoaded(this.image)) {\n                var cb = this.makeNewImage(this.image.src, true);\n                q.listen(cb, \"load\", this.useImage.bind(this, cb, null, true));\n            }\n        ;\n        ;\n        },\n        useImage: function(cb, db, eb) {\n            if (((eb && t.hasLoaded(this.image)))) {\n                return;\n            }\n        ;\n        ;\n            o.replace(this.image, cb);\n            this.image = cb;\n            g.inform(\"Amoeba/instrument\", [this.image,\"image\",], g.BEHAVIOR_PERSISTENT);\n            this.adjustStageSize(db);\n        },\n        makeNewImage: function(cb, db) {\n            if (this.imageLoadingTimer) {\n                JSBNG__clearTimeout(this.imageLoadingTimer);\n                this.imageLoadingTimer = null;\n            }\n             else if (!db) {\n                this.imageRefreshTimer = JSBNG__setTimeout(this.reloadIfTimeout.bind(this), bb.LOADING_TIMEOUT);\n            }\n            \n        ;\n        ;\n            var eb = o.create(\"img\", {\n                className: \"spotlight\",\n                alt: \"\"\n            });\n            eb.setAttribute(\"aria-describedby\", \"fbPhotosSnowliftCaption\");\n            eb.setAttribute(\"aria-busy\", \"true\");\n            q.listen(eb, \"load\", pa(function() {\n                JSBNG__clearTimeout(this.imageRefreshTimer);\n                this.image.setAttribute(\"aria-busy\", \"false\");\n                this.setLoadingState(this.STATE_IMAGE_PIXELS, false);\n                (function() {\n                    if (this.isOpen) {\n                        this.adjustStageSize();\n                        this.adjustForNewData();\n                    }\n                ;\n                ;\n                }).bind(this).defer();\n            }.bind(this), \"photo_theater\"));\n            eb.src = cb;\n            return eb;\n        },\n        switchImage: function(cb, db, eb) {\n            m.hide(this.image);\n            m.hide(this.errorBox);\n            this.setLoadingState(this.STATE_IMAGE_PIXELS, true);\n            var fb = ((this.stream && this.stream.getCurrentImageData()));\n            if (fb) {\n                ba.addPhotoView(fb.info, this.shouldShowHiRes(fb), ((this.fullscreen && r.isFullScreen())));\n            }\n        ;\n        ;\n            this.useImage(this.makeNewImage(cb, false), db, false);\n            if (eb) {\n                this.stream.preloadImages(this.shouldShowHiRes(fb));\n            }\n        ;\n        ;\n            if (((this.cropper && this.cropper.croppingMode))) {\n                this.cropper.resetPhoto();\n            }\n        ;\n        ;\n            g.inform(\"PhotoSnowlift.SWITCH_IMAGE\");\n        },\n        switchVideo: function(cb, db) {\n            var eb = ((\"swf_\" + cb));\n            if (db) {\n                m.addClass(this.stageWrapper, \"showVideo\");\n                var fb = o.create(\"div\", {\n                    className: \"videoStageContainer\"\n                });\n                o.appendContent(this.videoStage, fb);\n                fb.id = cb;\n                if (((window[eb] && !va(eb)))) {\n                    window[eb].write(cb);\n                }\n            ;\n            ;\n                var gb = ((\"video_warning_\" + cb)), hb = va(cb);\n                if (!this.videoWarnings) {\n                    this.videoWarnings = [];\n                }\n            ;\n            ;\n                if (((hb && this.videoWarnings[gb]))) {\n                    o.setContent(hb, this.videoWarnings[gb]);\n                }\n            ;\n            ;\n                this.adjustStageSizeForVideo.bind(this, eb).defer();\n            }\n             else {\n                ((window[eb] && window[eb].addVariable(\"video_autoplay\", 0)));\n                ((this.videoLoadTimer && JSBNG__clearTimeout(this.videoLoadTimer)));\n                o.empty(this.videoStage);\n                m.removeClass(this.stageWrapper, \"showVideo\");\n            }\n        ;\n        ;\n        },\n        checkVideoStatus: function(cb) {\n            if (this.videoLoadTimer) {\n                JSBNG__clearTimeout(this.videoLoadTimer);\n            }\n        ;\n        ;\n            var db = this.getVideoOnStage();\n            if (!db) {\n                return;\n            }\n             else {\n                var eb = ((\"swf_\" + db));\n                if (((cb !== eb))) {\n                    return;\n                }\n            ;\n            ;\n                this.adjustStageSizeForVideo(cb);\n            }\n        ;\n        ;\n        },\n        adjustStageSizeForVideo: function(cb) {\n            var db = va(cb);\n            if (!db) {\n                this.videoLoadTimer = JSBNG__setTimeout(this.checkVideoStatus.bind(this, cb), 200);\n            }\n             else this.adjustStageSize(new na(db.width, db.height));\n        ;\n        ;\n        },\n        handleServerError: function(cb, db) {\n            o.setContent(this.errorBox, cb);\n            this.storeFromData(db);\n        },\n        swapData: function() {\n            var cb, db = this.stream.getCurrentHtml();\n            if (db) {\n                this.setLoadingState(bb.STATE_HTML, false);\n                {\n                    var fin298keys = ((window.top.JSBNG_Replay.forInKeys)((db))), fin298i = (0);\n                    var eb;\n                    for (; (fin298i < fin298keys.length); (fin298i++)) {\n                        ((eb) = (fin298keys[fin298i]));\n                        {\n                            cb = va(eb);\n                            ((cb && o.setContent(cb, db[eb])));\n                        };\n                    };\n                };\n            ;\n                g.inform(\"PhotoSnowlift.DATA_CHANGE\", this.stream.getCurrentImageData().info, g.BEHAVIOR_STATE);\n                if (this.stream.getCurrentExtraData()) {\n                    g.inform(\"PhotoSnowlift.EXTRA_DATA_CHANGE\", this.stream.getCurrentExtraData(), g.BEHAVIOR_STATE);\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            this.adjustScroller();\n            this.adjustStageSize();\n            this.scrollableArea.showScrollbar(false);\n            this.adjustForNewData();\n            this.logImpressionDetailsForPhoto();\n            if (this.showFlashTags) {\n                this.flashAllTags();\n            }\n        ;\n        ;\n        },\n        updateTotalCount: function(cb, db, eb) {\n            var fb = this.stream.getCurrentHtml();\n            if (fb) {\n                var gb = oa(\"fbPhotoSnowliftPositionAndCount\");\n                o.replace(gb, eb);\n                gb = eb;\n                m.show(gb);\n                var hb = \"fbPhotoSnowliftPositionAndCount\";\n                fb[hb] = sa(gb.childNodes);\n            }\n        ;\n        ;\n            this.stream.setTotalCount(cb);\n            this.stream.setFirstCursorIndex(db);\n        },\n        addPhotoFbids: function(cb, db, eb, fb) {\n            if (((((fb && this.sessionID)) && ((fb != this.sessionID))))) {\n                return;\n            }\n        ;\n        ;\n            var gb = ((this.stream.getCursor() === null));\n            this.stream.attachToFbidsList(cb, db, eb);\n            if (((eb && gb))) {\n                this.page(0, true);\n            }\n        ;\n        ;\n            if (((this.pivots && eb))) {\n                this.pivots.setCycleCount(this.stream.calculateDistance(this.stream.getCursor(), this.stream.firstCursor));\n            }\n        ;\n        ;\n            if (((!this.pagersShown && this.stream.canPage()))) {\n                this.setStagePagersState(\"ready\");\n            }\n        ;\n        ;\n        },\n        attachTagger: function(cb) {\n            o.appendContent(this.stageActions, cb);\n        },\n        storeFromData: function(cb) {\n            if (!this.isOpen) {\n                return;\n            }\n        ;\n        ;\n            if (((((cb.ssid && this.sessionID)) && ((this.sessionID != cb.ssid))))) {\n                return;\n            }\n        ;\n        ;\n            var db = this.stream.storeToCache(cb);\n            if (((\"error\" in db))) {\n                this.checkState(bb.STATE_ERROR);\n                return;\n            }\n        ;\n        ;\n            if (((\"init\" in db))) {\n                this.initDataFetched(db.init);\n                if (this.openExplicitly) {\n                    this.replaceUrl = true;\n                    wa(this.stream.getCurrentImageData().info.permalink);\n                }\n            ;\n            ;\n                if (this.stream.canPage()) {\n                    this.setStagePagersState(\"ready\");\n                }\n            ;\n            ;\n                ((this.ua && this.ua.add_event(\"ufi\")));\n            }\n        ;\n        ;\n            if (((\"image\" in db))) {\n                this.checkState(bb.STATE_IMAGE_DATA);\n            }\n        ;\n        ;\n            if (((\"data\" in db))) {\n                this.checkState(bb.STATE_HTML);\n            }\n        ;\n        ;\n        },\n        setStagePagersState: function(cb) {\n            switch (cb) {\n              case \"ready\":\n                m.addClass(this.root, \"pagingReady\");\n                this.pagersShown = true;\n                ((this.ua && this.ua.add_event(\"arrows\")));\n                return;\n              case \"active\":\n                m.addClass(this.root, \"pagingActivated\");\n                return;\n              case \"inactive\":\n                m.removeClass(this.root, \"pagingActivated\");\n                return;\n              case \"disabled\":\n            \n              case \"reset\":\n                m.removeClass(this.root, \"pagingReady\");\n                return;\n            };\n        ;\n        },\n        deletePhoto: function(cb) {\n            this.closeRefresh();\n        },\n        closeRefresh: function() {\n            this.refreshOnClose = true;\n            this.closeHandler();\n        },\n        onHiliteTag: function(cb, db) {\n            if (((db.version != aa.VIEWER_SNOWLIFT))) {\n                return;\n            }\n        ;\n        ;\n            var eb = db.tag;\n            if (eb) {\n                this.switchHilitedTags(eb, true);\n            }\n        ;\n        ;\n        },\n        onUpdateTagBox: function(cb, db) {\n            if (((db.version == aa.VIEWER_SNOWLIFT))) {\n                this.updateTagBox(db.id, db.approve);\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = bb;\n});\n__d(\"Spotlight\", [\"JSXDOM\",\"Arbiter\",\"ArbiterMixin\",\"Class\",\"DOM\",\"Layer\",\"LayerAutoFocus\",\"LayerTabIsolation\",\"ModalLayer\",\"Vector\",\"copyProperties\",\"csx\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSXDOM\"), h = b(\"Arbiter\"), i = b(\"ArbiterMixin\"), j = b(\"Class\"), k = b(\"DOM\"), l = b(\"Layer\"), m = b(\"LayerAutoFocus\"), n = b(\"LayerTabIsolation\"), o = b(\"ModalLayer\"), p = b(\"Vector\"), q = b(\"copyProperties\"), r = b(\"csx\"), s = b(\"cx\");\n    function t(v, w) {\n        this.parent.construct(this, v, w);\n        this.stageMinSize = new p(0, 0);\n        this.stagePadding = new p(0, 0);\n    };\n;\n    j.extend(t, l);\n    q(t.prototype, i, {\n        stageMinSize: null,\n        stagePadding: null,\n        _buildWrapper: function(v, w) {\n            return (g.div({\n                className: \"_n8 _3qx\"\n            }, g.div({\n                className: \"_n9\"\n            }, w)));\n        },\n        _getDefaultBehaviors: function() {\n            return this.parent._getDefaultBehaviors().concat([u,m,n,o,]);\n        },\n        getContentRoot: function() {\n            if (!this._content) {\n                this._content = k.JSBNG__find(this.getRoot(), \"div._n3\");\n            }\n        ;\n        ;\n            return this._content;\n        },\n        configure: function(v) {\n            if (v.stageMinSize) {\n                this.stageMinSize = v.stageMinSize;\n            }\n        ;\n        ;\n            if (v.stagePadding) {\n                this.stagePadding = v.stagePadding;\n            }\n        ;\n        ;\n        },\n        onContentLoaded: function() {\n            this.inform(\"content-load\");\n        },\n        updatePermalink: function(v) {\n            this.inform(\"permalinkchange\", v);\n        }\n    });\n    function u(v) {\n        this._layer = v;\n    };\n;\n    q(u.prototype, {\n        _subscription: null,\n        enable: function() {\n            this._subscription = this._layer.subscribe([\"show\",\"hide\",], function(v, w) {\n                if (((v === \"show\"))) {\n                    h.inform(\"layer_shown\", {\n                        type: \"Spotlight\"\n                    });\n                }\n                 else h.inform(\"layer_hidden\", {\n                    type: \"Spotlight\"\n                });\n            ;\n            ;\n            });\n        },\n        disable: function() {\n            this._subscription.unsubscribe();\n            this._subscription = null;\n        }\n    });\n    e.exports = t;\n});");
// 20923
JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_190[0](o37,false,"http://jsbngssl.fbstatic-a.akamaihd.net/rsrc.php/v2/yo/r/0gMMCDzw75A.js",o58);
// undefined
o37 = null;
// undefined
o58 = null;
// 21123
JSBNG_Replay.s5e7dba3ea700a5261ca8857ec975a807389e8969_457[0](22279.18699994916);
// 21196
o25.scrollTop = 1479;
// undefined
o25 = null;
// 21135
JSBNG_Replay.s5e7dba3ea700a5261ca8857ec975a807389e8969_457[0](22279.18699994916);
// 21506
JSBNG_Replay.s8ead2a036e92884168d3fc8f84e49d83e5bb9b50_757[0](false);
// 21637
JSBNG_Replay.s6de57b149b09c494ec606f82771caf93a5a215db_133[0](false);
// 22096
JSBNG_Replay.s8ead2a036e92884168d3fc8f84e49d83e5bb9b50_757[0](false);
// 22315
JSBNG_Replay.s8ead2a036e92884168d3fc8f84e49d83e5bb9b50_757[0](false);
// 22388
JSBNG_Replay.s8ead2a036e92884168d3fc8f84e49d83e5bb9b50_757[0](false);
// 22399
JSBNG_Replay.s8ead2a036e92884168d3fc8f84e49d83e5bb9b50_757[0](false);
// 22805
JSBNG_Replay.s8ead2a036e92884168d3fc8f84e49d83e5bb9b50_757[0](false);
// 23433
JSBNG_Replay.s8ead2a036e92884168d3fc8f84e49d83e5bb9b50_757[0](false);
// 25657
JSBNG_Replay.s8ead2a036e92884168d3fc8f84e49d83e5bb9b50_757[0](false);
// 26046
JSBNG_Replay.s8ead2a036e92884168d3fc8f84e49d83e5bb9b50_757[0](false);
// 31464
JSBNG_Replay.s8ead2a036e92884168d3fc8f84e49d83e5bb9b50_757[0](false);
// 33004
JSBNG_Replay.sf5cf39f60525a87dacca08ba47304e00dca09e9c_226[0](o8);
// undefined
o8 = null;
// 33023
cb(); return null; }
finalize(); })();
