var IS_CLIENT_SIDE = "undefined" != typeof window
  , IS_ANDROID_WEBVIEW = Boolean(IS_CLIENT_SIDE && window.AndroidBridge)
  , IS_IOS_WEBVIEW = Boolean(IS_CLIENT_SIDE && window.webkit && window.webkit.messageHandlers && window.webkit.messageHandlers.VKWebAppClose)
  , IS_WEB = IS_CLIENT_SIDE && !IS_ANDROID_WEBVIEW && !IS_IOS_WEBVIEW
  , androidBridge = IS_CLIENT_SIDE ? window.AndroidBridge : void 0
  , iosBridge = IS_IOS_WEBVIEW ? window.webkit.messageHandlers : void 0;
function _bridgeSend(e, t) {
    androidBridge && androidBridge[e] ? androidBridge[e](JSON.stringify(t)) : iosBridge && iosBridge[e] && "function" == typeof iosBridge[e].postMessage && iosBridge[e].postMessage(t)
}
function _bridgeSupports(e) {
    return IS_ANDROID_WEBVIEW ? androidBridge && "function" == typeof androidBridge[e] : !!IS_IOS_WEBVIEW && (iosBridge && iosBridge[e] && "function" == typeof iosBridge[e].postMessage)
}
var IS_BRIDGE_AVAILABLE = !IS_WEB && _bridgeSupports("VKWebAppConversionHit");
if (function(e) {
    if (!e.fastXDM) {
        var t = {}
          , o = {}
          , i = []
          , n = {};
        e.fastXDM = {
            _id: 0,
            helperUrl: "https://vk.com/js/api/xdmHelper.js",
            Server: function(o, i, n) {
                this.methods = o || {},
                this.filter = i,
                this.options = n || {},
                this.id = e.fastXDM._id++,
                this.key = function() {
                    for (var e = "", t = 0; t < 5; t++)
                        e += Math.ceil(15 * Math.random()).toString(16);
                    return e
                }(),
                this.frameName = "fXD" + this.key,
                this.server = !0,
                this.methods["%init%"] = this.methods.__fxdm_i = function() {
                    d((function(t) {
                        for (var o in this.methods)
                            if (this.methods[o]instanceof e.fastXDM.Server) {
                                var i = this.methods[o];
                                "p" === t.protocol && t.send(this, t.json.stringify(["%proxy%", [o, i.key]])),
                                this.methods[o] = function() {
                                    this.callMethod.apply(this, arguments)
                                }
                                .bind(i)
                            }
                    }
                    ), this),
                    e.fastXDM.run(this.id),
                    this.methods.onInit && this.methods.onInit()
                }
                ,
                t[this.key] = [p, this]
            },
            Client: function(i, n) {
                if (this.methods = i || {},
                this.options = n || {},
                this.id = e.fastXDM._id++,
                this.client = !0,
                e.fastXDM.run(this.id),
                0 !== window.name.indexOf("fXD"))
                    throw Error("Wrong window.name property.");
                this.key = window.name.substring(3, 8),
                this.caller = window.parent,
                o[this.key] || (o[this.key] = {}),
                this.methods["%proxy%"] = function(e, t) {
                    e && t && this.caller.frames["fXD" + t] && (o[this.key][e] = {
                        key: t,
                        frame: {
                            contentWindow: this.caller.frames["fXD" + t]
                        }
                    })
                }
                .bind(this),
                t[this.key] = [p, this],
                e.fastXDM.on("helper", (function() {
                    e.fastXDM.onClientStart(this)
                }
                ), this),
                d((function(e) {
                    e.send(this, e.json.stringify(["%init%"]));
                    var t = this.methods;
                    setTimeout((function() {
                        t.onInit && t.onInit()
                    }
                    ), 0)
                }
                ), this)
            },
            onMessage: function(e) {
                var o = e.data;
                if (!o)
                    return !1;
                if ("string" != typeof o && !(o instanceof String))
                    return !1;
                var i = o.substr(0, 5);
                if (t[i]) {
                    var n = t[i][1];
                    !n || n.filter && !n.filter(e.origin) || t[i][0](o.substr(6), n, e.origin)
                }
            },
            setJSON: function(e) {
                n.json = e
            },
            getJSON: function(e) {
                if (!e)
                    return n.json;
                d((function(t) {
                    e(t.json)
                }
                ))
            },
            getProxyToServer: function(e, t) {
                return o[e] && o[e][t]
            },
            setEnv: function(e) {
                for (var t in e)
                    n[t] = e[t];
                l()
            },
            _q: {},
            on: function(e, t, o) {
                this._q[e] || (this._q[e] = []),
                -1 == this._q[e] ? t.apply(o) : this._q[e].push([t, o])
            },
            run: function(e) {
                for (var t = (this._q[e] || []).length, o = 0; o < t; o++)
                    this._q[e][o][0].apply(this._q[e][o][1]);
                this._q[e] = -1
            },
            waitFor: r
        },
        e.fastXDM.Server.prototype.start = function(t, o) {
            if (t.contentWindow)
                this.caller = t.contentWindow,
                this.frame = t,
                e.fastXDM.on("helper", (function() {
                    e.fastXDM.onServerStart(this)
                }
                ), this);
            else {
                var i = this;
                (o = o || 0) < 50 && setTimeout((function() {
                    i.start.apply(i, [t, o + 1])
                }
                ), 100)
            }
        }
        ,
        e.fastXDM.Server.prototype.destroy = function() {
            delete t[this.key]
        }
        ,
        e.fastXDM.Server.prototype.append = function(e, t, o) {
            var i = document.createElement("DIV");
            i.innerHTML = '<iframe name="' + this.frameName + '" ' + (o || "") + "></iframe>";
            var n = i.firstChild
              , r = this;
            return setTimeout((function() {
                n.frameBorder = "0",
                t && u(n, t),
                e.insertBefore(n, e.firstChild),
                r.start(n)
            }
            ), 0),
            n
        }
        ,
        e.fastXDM.Client.prototype.callMethod = e.fastXDM.Server.prototype.callMethod = function() {
            for (var t = Array.prototype.slice.call(arguments), o = t.shift(), i = 0, n = t.length; i < n; i++)
                if ("function" == typeof t[i]) {
                    this.funcsCount = (this.funcsCount || 0) + 1;
                    var s = t[i]
                      , l = "_func" + this.funcsCount;
                    this.methods[l] = function() {
                        s.apply(this, arguments),
                        delete this.methods[l]
                    }
                    ,
                    t[i] = {
                        _func: this.funcsCount
                    }
                } else
                    this.options.safe && (t[i] = a(t[i], !1));
            r(this, "caller", (function() {
                e.fastXDM.on(this.id, (function() {
                    d((function(i) {
                        var n = this
                          , r = e.fastXDM.getProxyToServer(this.key, o);
                        r && (n = r,
                        o = t.shift()),
                        i.send(n, i.json.stringify([o, t]))
                    }
                    ), this)
                }
                ), this)
            }
            ), this)
        }
        ,
        e.fastXDM.Client.prototype.isUnsafeMethod = e.fastXDM.Server.prototype.isUnsafeMethod = function(e) {
            return ~["%proxy%", "%init%"].indexOf(e) || this.options.unsafeMethods && ~this.options.unsafeMethods.indexOf(e)
        }
        ,
        e.JSON && "object" == typeof e.JSON && e.JSON.parse && e.JSON.stringify && '{"a":[1,2,3]}' === e.JSON.stringify({
            a: [1, 2, 3]
        }).replace(/ /g, "") ? n.json = {
            parse: e.JSON.parse,
            stringify: e.JSON.stringify
        } : e.fastXDM._needJSON = !0,
        e.postMessage ? (n.protocol = "p",
        n.send = function(e, t) {
            var o = e.frame ? e.frame.contentWindow : e.caller;
            if (o)
                try {
                    o.postMessage(e.key + ":" + t, "*")
                } catch (i) {
                    window.postMessage.call(o, e.key + ":" + t, "*")
                }
        }
        ,
        e.addEventListener ? e.addEventListener("message", e.fastXDM.onMessage, !1) : e.attachEvent("onmessage", e.fastXDM.onMessage),
        e.fastXDM._needJSON ? (e.fastXDM._onlyJSON = !0,
        s()) : l()) : s()
    }
    function r(e, t, o, i, n) {
        e[t] ? o.apply(i) : (n = n || 0) < 1e3 && setTimeout((function() {
            r(e, t, o, i, n + 1)
        }
        ), 0)
    }
    function s(t) {
        setTimeout((function() {
            var o = document.createElement("script");
            o.type = "text/javascript",
            o.src = t || e.fastXDM.helperUrl,
            r(document, "body", (function() {
                document.getElementsByTagName("HEAD")[0].appendChild(o)
            }
            ))
        }
        ), 0)
    } что это за код