/*! * algoliasearch 2.5.2 * https://github.com/algolia/algoliasearch-client-js * Copyright 2014 Algolia SAS; Licensed MIT */ function AlgoliaExplainResults(a, b, c) { function d(a, b) { var c = []; if ("object" == typeof a && "matchedWords" in a && "value" in a) { for (var e = !1, f = 0; f < a.matchedWords.length; ++f) { var g = a.matchedWords[f]; g in b || (b[g] = 1, e = !0) } e && c.push(a.value) } else if ("[object Array]" === Object.prototype.toString.call(a)) for (var h = 0; h < a.length; ++h) { var i = d(a[h], b); c = c.concat(i) } else if ("object" == typeof a) for (var j in a) a.hasOwnProperty(j) && (c = c.concat(d(a[j], b))); return c } function e(a, b, c) { var f = a._highlightResult || a; if (-1 === c.indexOf(".")) return c in f ? d(f[c], b) : []; for (var g = c.split("."), h = f, i = 0; i < g.length; ++i) { if ("[object Array]" === Object.prototype.toString.call(h)) { for (var j = [], k = 0; k < h.length; ++k)j = j.concat(e(h[k], b, g.slice(i).join("."))); return j } if (!(g[i] in h)) return []; h = h[g[i]] } return d(h, b) } var f = {}, g = {}, h = e(a, g, b); if (f.title = h.length > 0 ? h[0] : "", f.subtitles = [], "undefined" != typeof c) for (var i = 0; i < c.length; ++i)for (var j = e(a, g, c[i]), k = 0; k < j.length; ++k)f.subtitles.push({ attr: c[i], value: j[k] }); return f } var ALGOLIA_VERSION = "2.5.2", AlgoliaSearch = function (a, b, c, d, e) { var f = this; this.applicationID = a, this.apiKey = b, this._isUndefined(e) && (e = [a + "-1.algolianet.com", a + "-2.algolianet.com", a + "-3.algolianet.com"]), this.hosts = []; for (var g = 0; g < e.length; ++g)Math.random() > .5 && this.hosts.reverse(), this.hosts.push(this._isUndefined(c) || null == c ? ("https:" == document.location.protocol ? "https" : "http") + "://" + e[g] : "https" === c || "HTTPS" === c ? "https://" + e[g] : "http://" + e[g]); Math.random() > .5 && this.hosts.reverse(), this.jsonp = null, this.jsonpWait = 0, this._jsonRequest({ method: "GET", url: "/1/isalive", callback: function (a) { f.jsonp = !a } }), this.extraHeaders = [] }; AlgoliaSearch.prototype = { deleteIndex: function (a, b) { this._jsonRequest({ method: "DELETE", url: "/1/indexes/" + encodeURIComponent(a), callback: b }) }, moveIndex: function (a, b, c) { var d = { operation: "move", destination: b }; this._jsonRequest({ method: "POST", url: "/1/indexes/" + encodeURIComponent(a) + "/operation", body: d, callback: c }) }, copyIndex: function (a, b, c) { var d = { operation: "copy", destination: b }; this._jsonRequest({ method: "POST", url: "/1/indexes/" + encodeURIComponent(a) + "/operation", body: d, callback: c }) }, getLogs: function (a, b, c) { this._isUndefined(b) && (b = 0), this._isUndefined(c) && (c = 10), this._jsonRequest({ method: "GET", url: "/1/logs?offset=" + b + "&length=" + c, callback: a }) }, listIndexes: function (a) { this._jsonRequest({ method: "GET", url: "/1/indexes", callback: a }) }, initIndex: function (a) { return new this.Index(this, a) }, listUserKeys: function (a) { this._jsonRequest({ method: "GET", url: "/1/keys", callback: a }) }, getUserKeyACL: function (a, b) { this._jsonRequest({ method: "GET", url: "/1/keys/" + a, callback: b }) }, deleteUserKey: function (a, b) { this._jsonRequest({ method: "DELETE", url: "/1/keys/" + a, callback: b }) }, addUserKey: function (a, b) { var c = {}; c.acl = a, this._jsonRequest({ method: "POST", url: "/1/keys", body: c, callback: b }) }, addUserKeyWithValidity: function (a, b, c, d, e) { var f = this, g = {}; g.acl = a, g.validity = b, g.maxQueriesPerIPPerHour = c, g.maxHitsPerQuery = d, this._jsonRequest({ method: "POST", url: "/1/indexes/" + f.indexName + "/keys", body: g, callback: e }) }, setSecurityTags: function (a) { if ("[object Array]" === Object.prototype.toString.call(a)) { for (var b = [], c = 0; c < a.length; ++c)if ("[object Array]" === Object.prototype.toString.call(a[c])) { for (var d = [], e = 0; e < a[c].length; ++e)d.push(a[c][e]); b.push("(" + d.join(",") + ")") } else b.push(a[c]); a = b.join(",") } this.tagFilters = a }, setUserToken: function (a) { this.userToken = a }, startQueriesBatch: function () { this.batch = [] }, addQueryInBatch: function (a, b, c) { var d = "query=" + encodeURIComponent(b); this._isUndefined(c) || null == c || (d = this._getSearchParams(c, d)), this.batch.push({ indexName: a, params: d }) }, clearCache: function () { this.cache = {} }, sendQueriesBatch: function (a, b) { var c = this, d = { requests: [], apiKey: this.apiKey, appID: this.applicationID }; this.userToken && (d["X-Algolia-UserToken"] = this.userToken), this.tagFilters && (d["X-Algolia-TagFilters"] = this.tagFilters); for (var e = 0; e < c.batch.length; ++e)d.requests.push(c.batch[e]); if (window.clearTimeout(c.onDelayTrigger), !this._isUndefined(b) && null != b && b > 0) { var f = window.setTimeout(function () { c._sendQueriesBatch(d, a) }, b); c.onDelayTrigger = f } else this._sendQueriesBatch(d, a) }, Index: function (a, b) { this.indexName = b, this.as = a, this.typeAheadArgs = null, this.typeAheadValueOption = null }, setExtraHeader: function (a, b) { this.extraHeaders.push({ key: a, value: b }) }, _sendQueriesBatch: function (a, b) { if (null == this.jsonp) { var c = this; return void this._waitReady(function () { c._sendQueriesBatch(a, b) }) } if (this.jsonp) { for (var d = "", e = 0; e < a.requests.length; ++e) { var f = "/1/indexes/" + encodeURIComponent(a.requests[e].indexName) + "?" + a.requests[e].params; d += e + "=" + encodeURIComponent(f) + "&" } this._jsonRequest({ cache: this.cache, method: "GET", jsonp: !0, url: "/1/indexes/*", body: { params: d }, callback: b }) } else this._jsonRequest({ cache: this.cache, method: "POST", url: "/1/indexes/*/queries", body: a, callback: b }) }, _jsonRequest: function (a) { var b = this, c = a.callback, d = null, e = a.url; if (this._isUndefined(a.body) || (e = a.url + "_body_" + JSON.stringify(a.body)), !this._isUndefined(a.cache) && (d = a.cache, !this._isUndefined(d[e]))) return void (this._isUndefined(c) || c(!0, d[e])); var f = function (g) { var h = 0; return b._isUndefined(g) || (h = g), b.hosts.length <= h ? void (b._isUndefined(c) || c(!1, { message: "Cannot contact server" })) : (a.callback = function (g, i, j, k) { i || b._isUndefined(k) || window.console && console.log("Error: " + k.message), i && !b._isUndefined(a.cache) && (d[e] = k), !i && g && h + 1 < b.hosts.length ? f(h + 1) : b._isUndefined(c) || c(i, k) }, a.hostname = b.hosts[h], void b._jsonRequestByHost(a)) }; f() }, _jsonRequestByHost: function (a) { var b = this, c = a.hostname + a.url; if (this.jsonp) { if (!a.jsonp) return void a.callback(!0, !1, null, { message: "Method " + a.method + " " + c + " is not supported by JSONP." }); this.jsonpCounter = this.jsonpCounter || 0, this.jsonpCounter += 1; var d = "algoliaJSONP_" + this.jsonpCounter; window[d] = function (b) { a.callback(!1, !0, null, b); try { delete window[d] } catch (c) { window[d] = void 0 } }; var e = document.createElement("script"); e.type = "text/javascript", e.src = c + "?callback=" + d + "," + this.applicationID + "," + this.apiKey, a["X-Algolia-TagFilters"] && (e.src += "&X-Algolia-TagFilters=" + a["X-Algolia-TagFilters"]), a["X-Algolia-UserToken"] && (e.src += "&X-Algolia-UserToken=" + a["X-Algolia-UserToken"]), a.body && a.body.params && (e.src += "&" + a.body.params); var f = document.getElementsByTagName("head")[0]; e.onerror = function () { a.callback(!0, !1, null, { message: "Failed to load JSONP script." }), f.removeChild(e); try { delete window[d] } catch (b) { window[d] = void 0 } }; var g = !1; e.onload = e.onreadystatechange = function () { if (!(g || this.readyState && "loaded" != this.readyState && "complete" != this.readyState)) { if (g = !0, "undefined" == typeof window[d + "_loaded"]) { a.callback(!0, !1, null, { message: "Failed to load JSONP script." }); try { delete window[d] } catch (b) { window[d] = void 0 } } else try { delete window[d + "_loaded"] } catch (b) { window[d + "_loaded"] = void 0 } e.onload = e.onreadystatechange = null, f.removeChild(e) } }, f.appendChild(e) } else { var h = null; this._isUndefined(a.body) || (h = JSON.stringify(a.body)); var i = window.XMLHttpRequest ? new XMLHttpRequest : {}; if ("withCredentials" in i) { i.open(a.method, c, !0), i.setRequestHeader("X-Algolia-API-Key", this.apiKey), i.setRequestHeader("X-Algolia-Application-Id", this.applicationID); for (var j = 0; j < this.extraHeaders.length; ++j)i.setRequestHeader(this.extraHeaders[j].key, this.extraHeaders[j].value); null != h && i.setRequestHeader("Content-type", "application/json") } else { if ("undefined" == typeof XDomainRequest) return window.console && console.log("Your browser is too old to support CORS requests"), void a.callback(!1, !1, null, { message: "CORS not supported" }); i = new XDomainRequest, i.open(a.method, c) } i.send(h), i.onload = function (c) { if (b._isUndefined(c) || null == c.target) a.callback(!1, !0, c, JSON.parse(i.responseText)); else { var d = 0 === c.target.status || 503 === c.target.status, e = 200 === c.target.status || 201 === c.target.status; a.callback(d, e, c.target, null != c.target.response ? JSON.parse(c.target.response) : null) } }, i.onerror = function (b) { a.callback(!0, !1, null, { message: "Could not connect to host", error: b }) } } }, _waitReady: function (a) { null == this.jsonp && (this.jsonpWait += 100, this.jsonpWait > 2e3 && (this.jsonp = !0), setTimeout(a, 100)) }, _getSearchParams: function (a, b) { if (this._isUndefined(a) || null == a) return b; for (var c in a) null != c && a.hasOwnProperty(c) && (b += 0 === b.length ? "?" : "&", b += c + "=" + encodeURIComponent("[object Array]" === Object.prototype.toString.call(a[c]) ? JSON.stringify(a[c]) : a[c])); return b }, _isUndefined: function (a) { return void 0 === a }, applicationID: null, apiKey: null, tagFilters: null, userToken: null, hosts: [], cache: {}, extraHeaders: [] }, AlgoliaSearch.prototype.Index.prototype = { clearCache: function () { this.cache = {} }, addObject: function (a, b, c) { var d = this; this.as._jsonRequest(this.as._isUndefined(c) ? { method: "POST", url: "/1/indexes/" + encodeURIComponent(d.indexName), body: a, callback: b } : { method: "PUT", url: "/1/indexes/" + encodeURIComponent(d.indexName) + "/" + encodeURIComponent(c), body: a, callback: b }) }, addObjects: function (a, b) { for (var c = this, d = { requests: [] }, e = 0; e < a.length; ++e) { var f = { action: "addObject", body: a[e] }; d.requests.push(f) } this.as._jsonRequest({ method: "POST", url: "/1/indexes/" + encodeURIComponent(c.indexName) + "/batch", body: d, callback: b }) }, getObject: function (a, b, c) { if (null == this.as.jsonp) { var d = this; return void this.as._waitReady(function () { d.getObject(a, b, c) }) } var e = this, f = ""; if (!this.as._isUndefined(c)) { f = "?attributes="; for (var g = 0; g < c.length; ++g)0 !== g && (f += ","), f += c[g] } this.as._jsonRequest({ method: "GET", jsonp: !0, url: "/1/indexes/" + encodeURIComponent(e.indexName) + "/" + encodeURIComponent(a) + f, callback: b }) }, partialUpdateObject: function (a, b) { var c = this; this.as._jsonRequest({ method: "POST", url: "/1/indexes/" + encodeURIComponent(c.indexName) + "/" + encodeURIComponent(a.objectID) + "/partial", body: a, callback: b }) }, partialUpdateObjects: function (a, b) { for (var c = this, d = { requests: [] }, e = 0; e < a.length; ++e) { var f = { action: "partialUpdateObject", objectID: a[e].objectID, body: a[e] }; d.requests.push(f) } this.as._jsonRequest({ method: "POST", url: "/1/indexes/" + encodeURIComponent(c.indexName) + "/batch", body: d, callback: b }) }, saveObject: function (a, b) { var c = this; this.as._jsonRequest({ method: "PUT", url: "/1/indexes/" + encodeURIComponent(c.indexName) + "/" + encodeURIComponent(a.objectID), body: a, callback: b }) }, saveObjects: function (a, b) { for (var c = this, d = { requests: [] }, e = 0; e < a.length; ++e) { var f = { action: "updateObject", objectID: a[e].objectID, body: a[e] }; d.requests.push(f) } this.as._jsonRequest({ method: "POST", url: "/1/indexes/" + encodeURIComponent(c.indexName) + "/batch", body: d, callback: b }) }, deleteObject: function (a, b) { if (null == a || 0 === a.length) return void b(!1, { message: "empty objectID" }); var c = this; this.as._jsonRequest({ method: "DELETE", url: "/1/indexes/" + encodeURIComponent(c.indexName) + "/" + encodeURIComponent(a), callback: b }) }, search: function (a, b, c, d) { var e = this, f = "query=" + encodeURIComponent(a); if (this.as._isUndefined(c) || null == c || (f = this.as._getSearchParams(c, f)), window.clearTimeout(e.onDelayTrigger), !this.as._isUndefined(d) && null != d && d > 0) { var g = window.setTimeout(function () { e._search(f, b) }, d); e.onDelayTrigger = g } else this._search(f, b) }, browse: function (a, b, c) { var d = this, e = "?page=" + a; _.isUndefined(c) || (e += "&hitsPerPage=" + c), this.as._jsonRequest({ method: "GET", url: "/1/indexes/" + encodeURIComponent(d.indexName) + "/browse" + e, callback: b }) }, ttAdapter: function (a) { var b = this; return function (c, d) { b.search(c, function (a, b) { a && d(b.hits) }, a) } }, waitTask: function (a, b) { var c = this; this.as._jsonRequest({ method: "GET", url: "/1/indexes/" + encodeURIComponent(c.indexName) + "/task/" + a, callback: function (d, e) { d ? "published" === e.status ? b(!0, e) : setTimeout(function () { c.waitTask(a, b) }, 100) : b(!1, e) } }) }, clearIndex: function (a) { var b = this; this.as._jsonRequest({ method: "POST", url: "/1/indexes/" + encodeURIComponent(b.indexName) + "/clear", callback: a }) }, getSettings: function (a) { var b = this; this.as._jsonRequest({ method: "GET", url: "/1/indexes/" + encodeURIComponent(b.indexName) + "/settings", callback: a }) }, setSettings: function (a, b) { var c = this; this.as._jsonRequest({ method: "PUT", url: "/1/indexes/" + encodeURIComponent(c.indexName) + "/settings", body: a, callback: b }) }, listUserKeys: function (a) { var b = this; this.as._jsonRequest({ method: "GET", url: "/1/indexes/" + encodeURIComponent(b.indexName) + "/keys", callback: a }) }, getUserKeyACL: function (a, b) { var c = this; this.as._jsonRequest({ method: "GET", url: "/1/indexes/" + encodeURIComponent(c.indexName) + "/keys/" + a, callback: b }) }, deleteUserKey: function (a, b) { var c = this; this.as._jsonRequest({ method: "DELETE", url: "/1/indexes/" + encodeURIComponent(c.indexName) + "/keys/" + a, callback: b }) }, addUserKey: function (a, b) { var c = this, d = {}; d.acl = a, this.as._jsonRequest({ method: "POST", url: "/1/indexes/" + encodeURIComponent(c.indexName) + "/keys", body: d, callback: b }) }, addUserKeyWithValidity: function (a, b, c, d, e) { var f = this, g = {}; g.acl = a, g.validity = b, g.maxQueriesPerIPPerHour = c, g.maxHitsPerQuery = d, this.as._jsonRequest({ method: "POST", url: "/1/indexes/" + encodeURIComponent(f.indexName) + "/keys", body: g, callback: e }) }, _search: function (a, b) { if (null == this.as.jsonp) { var c = this; return void this.as._waitReady(function () { c._search(a, b) }) } var d = { params: a, apiKey: this.as.apiKey, appID: this.as.applicationID }; this.as.tagFilters && (d["X-Algolia-TagFilters"] = this.as.tagFilters), this.as.userToken && (d["X-Algolia-UserToken"] = this.as.userToken), this.as._jsonRequest(this.as.jsonp ? { cache: this.cache, method: "GET", jsonp: !0, url: "/1/indexes/" + encodeURIComponent(this.indexName), body: d, callback: b } : { cache: this.cache, method: "POST", url: "/1/indexes/" + encodeURIComponent(this.indexName) + "/query", body: d, callback: b }) }, as: null, indexName: null, cache: {}, typeAheadArgs: null, typeAheadValueOption: null, emptyConstructor: function () { } }, function () { var a = function (a) { a = a || {}; for (var b = 1; b < arguments.length; b++)if (arguments[b]) for (var c in arguments[b]) arguments[b].hasOwnProperty(c) && (a[c] = arguments[b][c]); return a }; window.AlgoliaSearchHelper = function (b, c, d) { var e = { facets: [], disjunctiveFacets: [], hitsPerPage: 20 }; this.init(b, c, a({}, e, d)) }, AlgoliaSearchHelper.prototype = { init: function (a, b, c) { this.client = a, this.index = b, this.options = c, this.page = 0, this.refinements = {}, this.disjunctiveRefinements = {} }, search: function (a, b, c) { this.q = a, this.searchCallback = b, this.searchParams = c || {}, this.page = this.page || 0, this.refinements = this.refinements || {}, this.disjunctiveRefinements = this.disjunctiveRefinements || {}, this._search() }, clearRefinements: function () { this.disjunctiveRefinements = {}, this.refinements = {} }, addDisjunctiveRefine: function (a, b) { this.disjunctiveRefinements = this.disjunctiveRefinements || {}, this.disjunctiveRefinements[a] = this.disjunctiveRefinements[a] || {}, this.disjunctiveRefinements[a][b] = !0 }, removeDisjunctiveRefine: function (a, b) { this.disjunctiveRefinements = this.disjunctiveRefinements || {}, this.disjunctiveRefinements[a] = this.disjunctiveRefinements[a] || {}; try { delete this.disjunctiveRefinements[a][b] } catch (c) { this.disjunctiveRefinements[a][b] = void 0 } }, addRefine: function (a, b) { var c = a + ":" + b; this.refinements = this.refinements || {}, this.refinements[c] = !0 }, removeRefine: function (a, b) { var c = a + ":" + b; this.refinements = this.refinements || {}, this.refinements[c] = !1 }, toggleRefine: function (a, b) { for (var c = 0; c < this.options.facets.length; ++c)if (this.options.facets[c] == a) { var d = a + ":" + b; return this.refinements[d] = !this.refinements[d], this.page = 0, this._search(), !0 } this.disjunctiveRefinements[a] = this.disjunctiveRefinements[a] || {}; for (var e = 0; e < this.options.disjunctiveFacets.length; ++e)if (this.options.disjunctiveFacets[e] == a) return this.disjunctiveRefinements[a][b] = !this.disjunctiveRefinements[a][b], this.page = 0, this._search(), !0; return !1 }, isRefined: function (a, b) { var c = a + ":" + b; return this.refinements[c] ? !0 : this.disjunctiveRefinements[a] && this.disjunctiveRefinements[a][b] ? !0 : !1 }, nextPage: function () { this._gotoPage(this.page + 1) }, previousPage: function () { this.page > 0 && this._gotoPage(this.page - 1) }, gotoPage: function (a) { this._gotoPage(a) }, setPage: function (a) { this.page = a }, _gotoPage: function (a) { this.page = a, this._search() }, _search: function () { this.client.startQueriesBatch(), this.client.addQueryInBatch(this.index, this.q, this._getHitsSearchParams()); for (var a = 0; a < this.options.disjunctiveFacets.length; ++a)this.client.addQueryInBatch(this.index, this.q, this._getDisjunctiveFacetSearchParams(this.options.disjunctiveFacets[a])); var b = this; this.client.sendQueriesBatch(function (a, c) { if (!a) return void b.searchCallback(!1, c); var d = c.results[0]; d.disjunctiveFacets = {}, d.facetStats = {}; for (var e = 1; e < c.results.length; ++e) { for (var f in c.results[e].facets) if (d.disjunctiveFacets[f] = c.results[e].facets[f], b.disjunctiveRefinements[f]) for (var g in b.disjunctiveRefinements[f]) !d.disjunctiveFacets[f][g] && b.disjunctiveRefinements[f][g] && (d.disjunctiveFacets[f][g] = 0); for (var h in c.results[e].facets_stats) d.facetStats[h] = c.results[e].facets_stats[h] } b.searchCallback(!0, d) }) }, _getHitsSearchParams: function () { return a({}, this.searchParams, { hitsPerPage: this.options.hitsPerPage, page: this.page, facets: this.options.facets, facetFilters: this._getFacetFilters() }) }, _getDisjunctiveFacetSearchParams: function (b) { return a({}, this.searchParams, { hitsPerPage: 1, page: 0, facets: b, facetFilters: this._getFacetFilters(b) }) }, _getFacetFilters: function (a) { var b = []; for (var c in this.refinements) this.refinements[c] && b.push(c); for (var d in this.disjunctiveRefinements) if (d != a) { var e = []; for (var f in this.disjunctiveRefinements[d]) this.disjunctiveRefinements[d][f] && e.push(d + ":" + f); e.length > 0 && b.push(e) } return b } } }(), "object" != typeof JSON && (JSON = {}), function () { "use strict"; function f(a) { return 10 > a ? "0" + a : a } function quote(a) { return escapable.lastIndex = 0, escapable.test(a) ? '"' + a.replace(escapable, function (a) { var b = meta[a]; return "string" == typeof b ? b : "\\u" + ("0000" + a.charCodeAt(0).toString(16)).slice(-4) }) + '"' : '"' + a + '"' } function str(a, b) { var c, d, e, f, g, h = gap, i = b[a]; switch (i && "object" == typeof i && "function" == typeof i.toJSON && (i = i.toJSON(a)), "function" == typeof rep && (i = rep.call(b, a, i)), typeof i) { case "string": return quote(i); case "number": return isFinite(i) ? String(i) : "null"; case "boolean": case "null": return String(i); case "object": if (!i) return "null"; if (gap += indent, g = [], "[object Array]" === Object.prototype.toString.apply(i)) { for (f = i.length, c = 0; f > c; c += 1)g[c] = str(c, i) || "null"; return e = 0 === g.length ? "[]" : gap ? "[\n" + gap + g.join(",\n" + gap) + "\n" + h + "]" : "[" + g.join(",") + "]", gap = h, e } if (rep && "object" == typeof rep) for (f = rep.length, c = 0; f > c; c += 1)"string" == typeof rep[c] && (d = rep[c], e = str(d, i), e && g.push(quote(d) + (gap ? ": " : ":") + e)); else for (d in i) Object.prototype.hasOwnProperty.call(i, d) && (e = str(d, i), e && g.push(quote(d) + (gap ? ": " : ":") + e)); return e = 0 === g.length ? "{}" : gap ? "{\n" + gap + g.join(",\n" + gap) + "\n" + h + "}" : "{" + g.join(",") + "}", gap = h, e } } "function" != typeof Date.prototype.toJSON && (Date.prototype.toJSON = function () { return isFinite(this.valueOf()) ? this.getUTCFullYear() + "-" + f(this.getUTCMonth() + 1) + "-" + f(this.getUTCDate()) + "T" + f(this.getUTCHours()) + ":" + f(this.getUTCMinutes()) + ":" + f(this.getUTCSeconds()) + "Z" : null }, String.prototype.toJSON = Number.prototype.toJSON = Boolean.prototype.toJSON = function () { return this.valueOf() }); var cx, escapable, gap, indent, meta, rep; "function" != typeof JSON.stringify && (escapable = /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, meta = { "\b": "\\b", " ": "\\t", "\n": "\\n", "\f": "\\f", "\r": "\\r", '"': '\\"', "\\": "\\\\" }, JSON.stringify = function (a, b, c) { var d; if (gap = "", indent = "", "number" == typeof c) for (d = 0; c > d; d += 1)indent += " "; else "string" == typeof c && (indent = c); if (rep = b, b && "function" != typeof b && ("object" != typeof b || "number" != typeof b.length)) throw new Error("JSON.stringify"); return str("", { "": a }) }), "function" != typeof JSON.parse && (cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, JSON.parse = function (text, reviver) { function walk(a, b) { var c, d, e = a[b]; if (e && "object" == typeof e) for (c in e) Object.prototype.hasOwnProperty.call(e, c) && (d = walk(e, c), void 0 !== d ? e[c] = d : delete e[c]); return reviver.call(a, b, e) } var j; if (text = String(text), cx.lastIndex = 0, cx.test(text) && (text = text.replace(cx, function (a) { return "\\u" + ("0000" + a.charCodeAt(0).toString(16)).slice(-4) })), /^[\],:{}\s]*$/.test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, "@").replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, "]").replace(/(?:^|:|,)(?:\s*\[)+/g, ""))) return j = eval("(" + text + ")"), "function" == typeof reviver ? walk({ "": j }, "") : j; throw new SyntaxError("JSON.parse") }) }();