[ad_1]
This article is part of the Policing and Technology Project, a collaboration between Future Tense and the Tech, Law, & Security Program at American University Washington College of Law that examines the relationship between law enforcement, police reform, and technology. On Sept. 18 at noon Eastern, Future Tense will host “Power, Policing, and Tech,” an online event about the role of technology in law enforcement reform. For more information and to RSVP, visit the New America website.
Public scrutiny around data-driven technologies in the criminal justice system has been on a steady rise over the past few years, but with the recent widespread Black Lives Matter mobilization, it has reached a crescendo. Alongside a broader reckoning with the harms of the criminal justice system, technologies like facial recognition and predictive policing have been called out as racist systems that need to be dismantled. After being an early adopter of predictive policing, the Santa Cruz, California, became the first city in the United States to ban its use. An ethics committee of a police department in the United Kingdom unanimously rejected a proposal for the department to further develop an artificial intelligence system to predict gun and knife crime. And the use of pre-trial and sentencing risk assessments remain at the center of public debate on how to best address mass incarceration and racial disparities within the criminal justice system.
But a foundational piece of police technology is missing from this reckoning: criminal intelligence databases. They may be largely absent from the public debate because databases are typically considered simple record repositories, often seen as the “first stage” in the creation of more high-tech A.I. systems. But these databases perform varied and advanced functions of profiling, not unlike systems of predictive policing. The historical context and political ramifications of these systems also mirror the systematic stigmatization and “feedback loop” that is now commonly understood as a fallout of predictive A.I. systems.
Unlike investigative databases that are used to solve serious crimes and build prosecutors’ cases, criminal intelligence databases are populated with information about people who should be monitored and subjected to greater scrutiny because they might commit a future crime—for example, the notorious No Fly List created and maintained by the FBI’s Terrorist Screening Center, which prohibits people from boarding commercial aircraft for travel within, into, or out of the United States based on government threat assessments. Yet these databases are often seen as passive aids for information gathering, rather than new methods of surveillance, which has contributed to the lack of legal safeguards. In the U.S., for example, these databases do not need to comply with the same constitutional and legal standards that govern criminal investigations, like due process and freedom of association. These databases are heavily influenced by politics and public sentiments, and their composition and use often reflect the prerogatives and biases of law enforcement agencies.
Gang databases serve as a great example for understanding these complexities. They have been around for decades, but their use has expanded globally as a crime-fighting tool in recent years. Defining what constitutes a gang or who is a gang member, however, is not as clear-cut as one may think. Who (and what kinds of information) is included in a gang database is typically guided by formal or informal policies that provide a definition of “gang” or “gang members.” But in the United States the legal definitions of gangs and gang members are so inconsistent that someone who meets the definition of a gang member in one state may not be considered a gang member in a neighboring state. There is also no consensus on what constitutes gang activity, since gang membership is not a criminal offense in itself. The lack of clear guidance and rules means police officers have a lot of discretion in making such determinations.
Does making a gang hand symbol in a social media post mean that the individual is a gang member? Are explicit or violent rap lyrics evidence of gang or criminal activity? Does frequenting areas where gang members are known to meet warrant inclusion in a gang database? Without clear gang database policies, police officers more often than not rely on subjective judgments and stereotypes to determine gang members and gang activity. And research and reporting on gang databases have shown that these judgments on who and what to include in gang databases reflect a historic pattern of overpolicing Black, Latinx, and other racial and ethnic minority communities. The NYPD’s gang database is 99 percent Black and Latinx residents, the same demographic of residents targeted by the department’s unconstitutional stop-and-frisk program. In London, 78 percent of the Metropolitan Police’s Gang Matrix database are young Black men, even though the department’s own figures show that this demographic only makes up 27 percent of youth violence.
The history of criminalizing entire groups through database technologies far predates the digital. Current gang database practices in the U.K. have been linked to the British colonial strategy of criminalizing entire communities (designated “criminal tribes”) in India. In the United States, federal and local law enforcement have repeatedly created watchlists of political activists without any evidence of criminal activity; when criminal charges did arise they were primarily loosely constructed conspiracy cases. The more recent digitization of databases only amplifies the problems of stigmatization and hyper-surveillance. Digitized and networked databases can more easily break down the silos between different government agencies, allowing for more seamless information sharing, and as a result— more pervasive institutional profiling that can be used to justify differential treatment. Gang database designations are often shared with not only prosecutors, judges, and prison and jail officials but also schools, public housing authorities, immigration agencies, and employers. This means that the impact of being labelled and sorted in these systems carries significant and unique consequences for individuals and communities, far beyond the criminal justice system. Individuals identified in gang databases are subjected to increased police scrutiny and harassment, but so are their family members, neighbors, and other individuals that share any characteristics (such as race, age, height, and gender presentation). All of these negative consequences are based on the risk or assumption that individuals in databases will commit a crime, even when individuals have no prior criminal convictions.
Despite being functionally similar to predictive policing and other risk assessment tools, gang databases don’t seem to benefit from the degree of regulatory scrutiny and media attention afforded to other purportedly “new” technologies. To illustrate, even as the Chicago Police Department announced it will no longer use its controversial predictive policing program, it proudly announced it would be revamping its much-criticized gang database. If a gang database designation leads a judge to deny a defendant bail, how is that functionally different from a biased risk-assessment tool’s recommendation? If gang databases perform data analysis and inform government decision making, why are they seen as more elementary than other criminal justice technologies?
The policy interventions needed for criminal intelligence databases also mirror some of the advocacy demands being made of A.I. systems. For example, just as mandatory “algorithmic audits” or “algorithmic impact assessments” are gaining traction as a way to allow external researchers and advocates to interrogate the logics and data used in A.I. systems, advocates are demanding similar pathways to access the logic and contents of gang databases. As the public begins to reject “new” forms of police technology before they are entrenched, we must not miss the opportunity to question the legitimacy of legacy technologies, too.
Sign up for the Future Tense newsletter, published every other Saturday.
Future Tense
is a partnership of
Slate,
New America, and
Arizona State University
that examines emerging technologies, public policy, and society.
'));else {
if (!0 === d.b.getConfig("enableSendAllBids")) return;
p.native = {
title: (t = e.native).products[0].title,
body: t.products[0].description,
sponsoredBy: t.advertiser.description,
icon: t.advertiser.logo,
image: t.products[0].image,
clickUrl: t.products[0].click_url,
privacyLink: t.privacy.optout_click_url,
privacyIcon: t.privacy.optout_image_url,
cta: t.products[0].call_to_action,
price: t.products[0].price,
impressionTrackers: t.impression_pixels.map(function (t) {
return t.url;
})
}, p.mediaType = h.c;
}
} else e.video ? (p.vastUrl = e.displayurl, p.mediaType = h.d) : p.ad = e.creative;
c.push(p);
}), c;
},
onTimeout: function onTimeout(t) {
T() && Criteo.PubTag.Adapters.Prebid.GetAdapter(t.auctionId).handleBidTimeout();
},
onBidWon: function onBidWon(t) {
T() && Criteo.PubTag.Adapters.Prebid.GetAdapter(t.auctionId).handleBidWon(t);
},
onSetTargeting: function onSetTargeting(t) {
T() && Criteo.PubTag.Adapters.Prebid.GetAdapter(t.auctionId).handleSetTargeting(t);
}
};
function T() {
return "undefined" != typeof Criteo && Criteo.PubTag && Criteo.PubTag.Adapters && Criteo.PubTag.Adapters.Prebid;
}
function C(t) {
return f.deepAccess(t, "mediaTypes.banner.sizes") || t.sizes;
}
function A(t, e) {
return Array.isArray(t[0]) ? t.map(function (t) {
return e(t);
}) : [e(t)];
}
function S(t) {
return t[0] + "x" + t[1];
}
function I(t) {
return void 0 === t[0] && void 0 === t[1] ? "2x2" : t[0] + "x" + t[1];
}
function R(t) {
return void 0 !== f.deepAccess(t, "params.video") && void 0 !== f.deepAccess(t, "mediaTypes.video");
}
function x() {
try {
var t,
e,
r,
i,
o,
n = "criteo_fast_bid",
s = "// Hash: ",
a = y.getDataFromLocalStorage(n);
null !== a && (t = a.indexOf("n"), (e = a.substr(0, t).trim()).substr(0, s.length) !== s ? (f.logWarn("No hash found in FastBid"), y.removeDataFromLocalStorage(n)) : (r = e.substr(s.length), i = a.substr(t + 1), Object(p.verify)(i, r, g, b) ? (f.logInfo("Using Criteo FastBid"), (o = document.createElement("script")).type = "text/javascript", o.text = i, f.insertElement(o)) : (f.logWarn("Invalid Criteo FastBid found"), y.removeDataFromLocalStorage(n))));
} catch (t) {}
}
Object(i.registerBidder)(s);
},
382: function _(t, e, r) {
"use strict";
Object.defineProperty(e, "__esModule", {
value: !0
});
var a = r(383),
p = r(384);
e.verify = function (t, e, r, i) {
var o = new a.BigInteger(a.b64toHex(e)),
n = new a.BigInteger(a.b64toHex(r)),
s = o.modPowInt(i, n);
return a.removeExtraSymbols(s.toHexString()) === p.Sha256.hash(t);
};
},
383: function _(t, e, r) {
"use strict";
var i;
Object.defineProperty(e, "__esModule", {
value: !0
});
var o = (g.prototype.toHexString = function () {
if (this.s < 0) return "-" + this.negate().toHexString();
var t,
e = !1,
r = "",
i = this.t,
o = this.DB - i * this.DB % 4;
if (0 < i--) for (o < this.DB && 0 < (t = this[i] >> o) && (e = !0, r = c(t)); 0 <= i;) {
o < 4 ? (t = (this[i] & (1 << o) - 1) << 4 - o, t |= this[--i] >> (o += this.DB - 4)) : (t = this[i] >> (o -= 4) & 15, o <= 0 && (o += this.DB, --i)), 0 < t && (e = !0), e && (r += c(t));
}
return e ? r : "0";
}, g.prototype.fromHexString = function (t) {
if (null !== t) {
this.t = 0, this.s = 0;
for (var e = t.length, r = !1, i = 0; 0 <= --e;) {
var o = p(t, e);
o < 0 ? "-" == t.charAt(e) && (r = !0) : (r = !1, 0 == i ? this[this.t++] = o : i + 4 > this.DB ? (this[this.t - 1] |= (o & (1 << this.DB - i) - 1) << i, this[this.t++] = o >> this.DB - i) : this[this.t - 1] |= o << i, (i += 4) >= this.DB && (i -= this.DB));
}
this.clamp(), r && g.ZERO.subTo(this, this);
}
}, g.prototype.negate = function () {
var t = T();
return g.ZERO.subTo(this, t), t;
}, g.prototype.abs = function () {
return this.s < 0 ? this.negate() : this;
}, g.prototype.mod = function (t) {
var e = T();
return this.abs().divRemTo(t, null, e), this.s < 0 && 0 < e.compareTo(g.ZERO) && t.subTo(e, e), e;
}, g.prototype.copyTo = function (t) {
for (var e = this.t - 1; 0 <= e; --e) {
t[e] = this[e];
}
t.t = this.t, t.s = this.s;
}, g.prototype.lShiftTo = function (t, e) {
for (var r = t % this.DB, i = this.DB - r, o = (1 << i) - 1, n = Math.floor(t / this.DB), s = this.s << r & this.DM, a = this.t - 1; 0 <= a; --a) {
e[a + n + 1] = this[a] >> i | s, s = (this[a] & o) << r;
}
for (a = n - 1; 0 <= a; --a) {
e[a] = 0;
}
e[n] = s, e.t = this.t + n + 1, e.s = this.s, e.clamp();
}, g.prototype.invDigit = function () {
if (this.t < 1) return 0;
var t = this[0];
if (0 == (1 & t)) return 0;
var e = 3 & t;
return 0 < (e = (e = (e = (e = e * (2 - (15 & t) * e) & 15) * (2 - (255 & t) * e) & 255) * (2 - ((65535 & t) * e & 65535)) & 65535) * (2 - t * e % this.DV) % this.DV) ? this.DV - e : -e;
}, g.prototype.dlShiftTo = function (t, e) {
for (var r = this.t - 1; 0 <= r; --r) {
e[r + t] = this[r];
}
for (r = t - 1; 0 <= r; --r) {
e[r] = 0;
}
e.t = this.t + t, e.s = this.s;
}, g.prototype.squareTo = function (t) {
for (var e = this.abs(), r = t.t = 2 * e.t; 0 <= --r;) {
t[r] = 0;
}
for (r = 0; r < e.t - 1; ++r) {
var i = e.am(r, e[r], t, 2 * r, 0, 1);
(t[r + e.t] += e.am(r + 1, 2 * e[r], t, 2 * r + 1, i, e.t - r - 1)) >= e.DV && (t[r + e.t] -= e.DV, t[r + e.t + 1] = 1);
}
0 < t.t && (t[t.t - 1] += e.am(r, e[r], t, 2 * r, 0, 1)), t.s = 0, t.clamp();
}, g.prototype.multiplyTo = function (t, e) {
var r = this.abs(),
i = t.abs(),
o = r.t;
for (e.t = o + i.t; 0 <= --o;) {
e[o] = 0;
}
for (o = 0; o < i.t; ++o) {
e[o + r.t] = r.am(0, i[o], e, o, 0, r.t);
}
e.s = 0, e.clamp(), this.s != t.s && g.ZERO.subTo(e, e);
}, g.prototype.divRemTo = function (t, e, r) {
var i = t.abs();
if (!(i.t <= 0)) {
var o = this.abs();
if (o.t < i.t) return null != e && e.fromHexString("0"), void (null != r && this.copyTo(r));
null == r && (r = T());
var n = T(),
s = this.s,
a = t.s,
p = this.DB - C(i[i.t - 1]);
0 < p ? (i.lShiftTo(p, n), o.lShiftTo(p, r)) : (i.copyTo(n), o.copyTo(r));
var u = n.t,
c = n[u - 1];
if (0 != c) {
var d = c * (1 << this.F1) + (1 < u ? n[u - 2] >> this.F2 : 0),
h = this.FV / d,
f = (1 << this.F1) / d,
l = 1 << this.F2,
m = r.t,
v = m - u,
y = null == e ? T() : e;
for (n.dlShiftTo(v, y), 0 <= r.compareTo(y) && (r[r.t++] = 1, r.subTo(y, r)), g.ONE.dlShiftTo(u, y), y.subTo(n, n); n.t < u;) {
n[n.t++] = 0;
}
for (; 0 <= --v;) {
var b = r[--m] == c ? this.DM : Math.floor(r[m] * h + (r[m - 1] + l) * f);
if ((r[m] += n.am(0, b, r, v, 0, u)) < b) for (n.dlShiftTo(v, y), r.subTo(y, r); r[m] < --b;) {
r.subTo(y, r);
}
}
null != e && (r.drShiftTo(u, e), s != a && g.ZERO.subTo(e, e)), r.t = u, r.clamp(), 0 < p && r.rShiftTo(p, r), s < 0 && g.ZERO.subTo(r, r);
}
}
}, g.prototype.rShiftTo = function (t, e) {
e.s = this.s;
var r = Math.floor(t / this.DB);
if (r >= this.t) e.t = 0;else {
var i = t % this.DB,
o = this.DB - i,
n = (1 << i) - 1;
e[0] = this[r] >> i;
for (var s = r + 1; s < this.t; ++s) {
e[s - r - 1] |= (this[s] & n) << o, e[s - r] = this[s] >> i;
}
0 < i && (e[this.t - r - 1] |= (this.s & n) << o), e.t = this.t - r, e.clamp();
}
}, g.prototype.drShiftTo = function (t, e) {
for (var r = t; r < this.t; ++r) {
e[r - t] = this[r];
}
e.t = Math.max(this.t - t, 0), e.s = this.s;
}, g.prototype.subTo = function (t, e) {
for (var r = 0, i = 0, o = Math.min(t.t, this.t); r < o;) {
i += this[r] - t[r], e[r++] = i & this.DM, i >>= this.DB;
}
if (t.t < this.t) {
for (i -= t.s; r < this.t;) {
i += this[r], e[r++] = i & this.DM, i >>= this.DB;
}
i += this.s;
} else {
for (i += this.s; r < t.t;) {
i -= t[r], e[r++] = i & this.DM, i >>= this.DB;
}
i -= t.s;
}
e.s = i < 0 ? -1 : 0, i < -1 ? e[r++] = this.DV + i : 0 < i && (e[r++] = i), e.t = r, e.clamp();
}, g.prototype.clamp = function () {
for (var t = this.s & this.DM; 0 < this.t && this[this.t - 1] == t;) {
--this.t;
}
}, g.prototype.modPowInt = function (t, e) {
var r = new (t < 256 || e.isEven() ? d : f)(e);
return this.exp(t, r);
}, g.prototype.exp = function (t, e) {
if (4294967295 < t || t < 1) return g.ONE;
var r,
i = T(),
o = T(),
n = e.convert(this),
s = C(t) - 1;
for (n.copyTo(i); 0 <= --s;) {
e.sqrTo(i, o), 0 < (t & 1 << s) ? e.mulTo(o, n, i) : (r = i, i = o, o = r);
}
return e.revert(i);
}, g.prototype.isEven = function () {
return 0 == (0 < this.t ? 1 & this[0] : this.s);
}, g.prototype.compareTo = function (t) {
var e = this.s - t.s;
if (0 != e) return e;
var r = this.t;
if (0 != (e = r - t.t)) return this.s < 0 ? -e : e;
for (; 0 <= --r;) {
if (0 != (e = this[r] - t[r])) return e;
}
return 0;
}, g.prototype.am1 = function (t, e, r, i, o, n) {
for (; 0 <= --n;) {
var s = e * this[t++] + r[i] + o;
o = Math.floor(s / 67108864), r[i++] = 67108863 & s;
}
return o;
}, g.prototype.am2 = function (t, e, r, i, o, n) {
for (var s = 32767 & e, a = e >> 15; 0 <= --n;) {
var p = 32767 & this[t],
u = this[t++] >> 15,
c = a * p + u * s;
o = ((p = s * p + ((32767 & c) << 15) + r[i] + (1073741823 & o)) >>> 30) + (c >>> 15) + a * u + (o >>> 30), r[i++] = 1073741823 & p;
}
return o;
}, g.prototype.am3 = function (t, e, r, i, o, n) {
for (var s = 16383 & e, a = e >> 14; 0 <= --n;) {
var p = 16383 & this[t],
u = this[t++] >> 14,
c = a * p + u * s;
o = ((p = s * p + ((16383 & c) << 14) + r[i] + o) >> 28) + (c >> 14) + a * u, r[i++] = 268435455 & p;
}
return o;
}, g);
function g(t) {
null !== t && this.fromHexString(t);
}
function T() {
return new o(null);
}
function C(t) {
var e,
r = 1;
return 0 != (e = t >>> 16) && (t = e, r += 16), 0 != (e = t >> 8) && (t = e, r += 8), 0 != (e = t >> 4) && (t = e, r += 4), 0 != (e = t >> 2) && (t = e, r += 2), 0 != (e = t >> 1) && (t = e, r += 1), r;
}
e.BigInteger = o, e.nbi = T, e.nbits = C;
for (var n = [], s = "0".charCodeAt(0), a = 0; a <= 9; ++a) {
n[s++] = a;
}
for (s = "a".charCodeAt(0), a = 10; a < 36; ++a) {
n[s++] = a;
}
for (s = "A".charCodeAt(0), a = 10; a < 36; ++a) {
n[s++] = a;
}
function p(t, e) {
var r = n[t.charCodeAt(e)];
return null == r ? -1 : r;
}
e.intAt = p;
var u = "0123456789abcdefghijklmnopqrstuvwxyz";
function c(t) {
return u.charAt(t);
}
e.int2char = c;
e.b64toHex = function (t) {
for (var e = "", r = 0, i = 0, o = 0; o < t.length && "=" != t.charAt(o); ++o) {
var n = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".indexOf(t.charAt(o));
n < 0 || (r = 0 == r ? (e += c(n >> 2), i = 3 & n, 1) : 1 == r ? (e += c(i << 2 | n >> 4), i = 15 & n, 2) : 2 == r ? (e += c(i), e += c(n >> 2), i = 3 & n, 3) : (e += c(i << 2 | n >> 4), e += c(15 & n), 0));
}
return 1 == r && (e += c(i << 2)), e;
}, e.removeExtraSymbols = function (t) {
return t.replace(/^1f+00/, "").replace("3031300d060960864801650304020105000420"https://slate.com/,"");
};
var d = (h.prototype.convert = function (t) {
return t.s < 0 || 0 <= t.compareTo(this.m) ? t.mod(this.m) : t;
}, h.prototype.revert = function (t) {
return t;
}, h.prototype.reduce = function (t) {
t.divRemTo(this.m, null, t);
}, h.prototype.mulTo = function (t, e, r) {
t.multiplyTo(e, r), this.reduce(r);
}, h.prototype.sqrTo = function (t, e) {
t.squareTo(e), this.reduce(e);
}, h);
function h(t) {
this.m = t;
}
var f = (l.prototype.convert = function (t) {
var e = T();
return t.abs().dlShiftTo(this.m.t, e), e.divRemTo(this.m, null, e), t.s < 0 && 0 < e.compareTo(o.ZERO) && this.m.subTo(e, e), e;
}, l.prototype.revert = function (t) {
var e = T();
return t.copyTo(e), this.reduce(e), e;
}, l.prototype.reduce = function (t) {
for (; t.t <= this.mt2;) {
t[t.t++] = 0;
}
for (var e = 0; e < this.m.t; ++e) {
var r = 32767 & t[e],
i = r * this.mpl + ((r * this.mph + (t[e] >> 15) * this.mpl & this.um) << 15) & t.DM;
for (t[r = e + this.m.t] += this.m.am(0, i, t, e, 0, this.m.t); t[r] >= t.DV;) {
t[r] -= t.DV, t[++r]++;
}
}
t.clamp(), t.drShiftTo(this.m.t, t), 0 <= t.compareTo(this.m) && t.subTo(this.m, t); }, l.prototype.mulTo = function (t, e, r) { t.multiplyTo(e, r), this.reduce(r); }, l.prototype.sqrTo = function (t, e) { t.squareTo(e), this.reduce(e); }, l); function l(t) { this.m = t, this.mp = t.invDigit(), this.mpl = 32767 & this.mp, this.mph = this.mp >> 15, this.um = (1 << t.DB - 15) - 1, this.mt2 = 2 * t.t; } function m(t) { var e = T(); return e.fromHexString(t.toString()), e; } e.nbv = m, o.ZERO = m(0), o.ONE = m(1), i = "Microsoft Internet Explorer" == navigator.appName ? (o.prototype.am = o.prototype.am2, 30) : "Netscape" != navigator.appName ? (o.prototype.am = o.prototype.am1, 26) : (o.prototype.am = o.prototype.am3, 28), o.prototype.DB = i, o.prototype.DM = (1 << i) - 1, o.prototype.DV = 1 << i; o.prototype.FV = Math.pow(2, 52), o.prototype.F1 = 52 - i, o.prototype.F2 = 2 * i - 52; }, 384: function _(t, e, r) { "use strict"; Object.defineProperty(e, "__esModule", { value: !0 }); var i = (S.hash = function (t) { t = S.utf8Encode(t || ""); for (var e = [1116352408, 1899447441, 3049323471, 3921009573, 961987163, 1508970993, 2453635748, 2870763221, 3624381080, 310598401, 607225278, 1426881987, 1925078388, 2162078206, 2614888103, 3248222580, 3835390401, 4022224774, 264347078, 604807628, 770255983, 1249150122, 1555081692, 1996064986, 2554220882, 2821834349, 2952996808, 3210313671, 3336571891, 3584528711, 113926993, 338241895, 666307205, 773529912, 1294757372, 1396182291, 1695183700, 1986661051, 2177026350, 2456956037, 2730485921, 2820302411, 3259730800, 3345764771, 3516065817, 3600352804, 4094571909, 275423344, 430227734, 506948616, 659060556, 883997877, 958139571, 1322822218, 1537002063, 1747873779, 1955562222, 2024104815, 2227730452, 2361852424, 2428436474, 2756734187, 3204031479, 3329325298], r = [1779033703, 3144134277, 1013904242, 2773480762, 1359893119, 2600822924, 528734635, 1541459225], i = (t += String.fromCharCode(128)).length / 4 + 2, o = Math.ceil(i / 16), n = new Array(o), s = 0; s < o; s++) { n[s] = new Array(16); for (var a = 0; a < 16; a++) { n[s][a] = t.charCodeAt(64 * s + 4 * a) << 24 | t.charCodeAt(64 * s + 4 * a + 1) << 16 | t.charCodeAt(64 * s + 4 * a + 2) << 8 | t.charCodeAt(64 * s + 4 * a + 3) << 0; } } var p = 8 * (t.length - 1) / Math.pow(2, 32), u = 8 * (t.length - 1) >>> 0;
for (n[o - 1][14] = Math.floor(p), n[o - 1][15] = u, s = 0; s < o; s++) {
for (var c = new Array(64), d = 0; d < 16; d++) {
c[d] = n[s][d];
}
for (d = 16; d < 64; d++) {
c[d] = S.q1(c[d - 2]) + c[d - 7] + S.q0(c[d - 15]) + c[d - 16] >>> 0;
}
for (var h = r[0], f = r[1], l = r[2], m = r[3], v = r[4], y = r[5], b = r[6], g = r[7], d = 0; d < 64; d++) {
var T = g + S.z1(v) + S.Ch(v, y, b) + e[d] + c[d],
C = S.z0(h) + S.Maj(h, f, l);
g = b, b = y, y = v, v = m + T >>> 0, m = l, l = f, f = h, h = T + C >>> 0;
}
r[0] = r[0] + h >>> 0, r[1] = r[1] + f >>> 0, r[2] = r[2] + l >>> 0, r[3] = r[3] + m >>> 0, r[4] = r[4] + v >>> 0, r[5] = r[5] + y >>> 0, r[6] = r[6] + b >>> 0, r[7] = r[7] + g >>> 0;
}
for (var A = new Array(r.length), g = 0; g < r.length; g++) {
A[g] = ("00000000" + r[g].toString(16)).slice(-8);
}
return A.join("");
}, S.utf8Encode = function (e) {
try {
return new TextEncoder().encode(e).reduce(function (t, e) {
return t + String.fromCharCode(e);
}, "");
} catch (t) {
return unescape(encodeURIComponent(e));
}
}, S.ROTR = function (t, e) {
return e >>> t | e << 32 - t;
}, S.z0 = function (t) {
return S.ROTR(2, t) ^ S.ROTR(13, t) ^ S.ROTR(22, t);
}, S.z1 = function (t) {
return S.ROTR(6, t) ^ S.ROTR(11, t) ^ S.ROTR(25, t);
}, S.q0 = function (t) {
return S.ROTR(7, t) ^ S.ROTR(18, t) ^ t >>> 3;
}, S.q1 = function (t) {
return S.ROTR(17, t) ^ S.ROTR(19, t) ^ t >>> 10;
}, S.Ch = function (t, e, r) {
return t & e ^ ~t & r;
}, S.Maj = function (t, e, r) {
return t & e ^ t & r ^ e & r;
}, S);
function S() {}
e.Sha256 = i;
}
}, [380]);
pbjsChunk([187], {
481: function _(e, r, t) {
e.exports = t(482);
},
482: function _(e, r, t) {
"use strict";
Object.defineProperty(r, "__esModule", {
value: !0
}), t.d(r, "spec", function () {
return m;
});
var b = t(0),
y = t(2),
h = t(3),
i = t(11),
l = t.n(i),
a = t(483),
n = t.n(a),
s = t(1);
function v(e) {
return (v = "function" == typeof Symbol && "symbol" == _typeof(Symbol.iterator) ? function (e) {
return _typeof(e);
} : function (e) {
return e && "function" == typeof Symbol && e.constructor === Symbol && e !== Symbol.prototype ? "symbol" : _typeof(e);
})(e);
}
var o = [y.b, y.d],
g = 100,
w = 300,
x = 3600,
I = !0,
P = {
JPY: 1
};
function p(e) {
var r = {};
return r.id = e.bidId, r.ext = {}, r.ext.siteID = e.params.siteId, !e.params.hasOwnProperty("id") || "string" != typeof e.params.id && "number" != typeof e.params.id ? r.ext.sid = "".concat(e.params.size[0], "x").concat(e.params.size[1]) : r.ext.sid = String(e.params.id), e.params.hasOwnProperty("bidFloor") && e.params.hasOwnProperty("bidFloorCur") && (r.bidfloor = e.params.bidFloor, r.bidfloorcur = e.params.bidFloorCur), r;
}
function d(e) {
return Array.isArray(e) && 2 === e.length && n()(e[0]) && n()(e[1]);
}
function c(e, r) {
if (d(e)) return e[0] === r[0] && e[1] === r[1];
for (var t = 0; t < e.length; t++) { if (e[t][0] === r[0] && e[t][1] === r[1]) return 1; } } function u(e, r, t, i) { var a = []; if (window.headertag && "function" == typeof window.headertag.getIdentityInfo) { var n, s = window.headertag.getIdentityInfo(); if (s && "object" === v(s)) for (var o in s) { !s.hasOwnProperty(o) || !(n = s[o]).responsePending && n.data && "object" === v(n.data) && Object.keys(n.data).length && a.push(n.data); } } var d, p = {}; p.id = e[0].bidderRequestId, p.imp = t, p.site = {}, p.ext = {}, p.ext.source = "prebid", e[0].schain && (p.source = { ext: { schain: e[0].schain } }), 0 < a.length && (p.user = {}, p.user.eids = a), document.referrer && "" !== document.referrer && (p.site.ref = document.referrer), r && (r.gdprConsent && ((d = r.gdprConsent).hasOwnProperty("gdprApplies") && (p.regs = { ext: { gdpr: d.gdprApplies ? 1 : 0 } }), d.hasOwnProperty("consentString") && (p.user = p.user || {}, p.user.ext = { consent: d.consentString || "" })), r.uspConsent && b.deepSetValue(p, "regs.ext.us_privacy", r.uspConsent), r.refererInfo && (p.site.page = r.refererInfo.referer)); var c = {}, u = r && r.bidderCode || "ix", m = h.b.getConfig(u); if (m) { if ("object" === v(m.firstPartyData)) { var f = m.firstPartyData, y = "?"; for (var l in f) { f.hasOwnProperty(l) && (y += "".concat(encodeURIComponent(l), "=").concat(encodeURIComponent(f[l]), "&")); } y = y.slice(0, -1), p.site.page += y; } "number" == typeof m.timeout && (c.t = m.timeout); } return c.s = e[0].params.siteId, c.v = i, c.r = JSON.stringify(p), c.ac = "j", c.sd = 1, 8.1 === i && (c.nf = 1), { method: "GET", url: "https://as-sec.casalemedia.com/cygnus", data: c }; } var m = { code: "ix", gvlid: 10, supportedMediaTypes: o, isBidRequestValid: function isBidRequestValid(e) { if (!d(e.params.size)) return b.logError("ix bidder params: bid size has invalid format."), !1; if (!c(e.sizes, e.params.size)) return b.logError("ix bidder params: bid size is not included in ad unit sizes."), !1; if (e.hasOwnProperty("mediaType") && !b.contains(o, e.mediaType)) return !1; if (e.hasOwnProperty("mediaTypes") && !b.deepAccess(e, "mediaTypes.banner.sizes") && !b.deepAccess(e, "mediaTypes.video.playerSize")) return !1; if ("string" != typeof e.params.siteId && "number" != typeof e.params.siteId) return b.logError("ix bidder params: siteId must be string or number value."), !1; var r, t, i = e.params.hasOwnProperty("bidFloor"), a = e.params.hasOwnProperty("bidFloorCur"); return !!(!i && !a || i && a && (r = e.params.bidFloor, t = e.params.bidFloorCur, Boolean("number" == typeof r && "string" == typeof t && t.match(/^[A-Z]{3}$/)))) || (b.logError("ix bidder params: bidFloor / bidFloorCur parameter has invalid format."), !1); }, buildRequests: function buildRequests(e, r) { for (var t, i, a = [], n = [], s = [], o = null, d = 0; d < e.length; d++) { (o = e[d]).mediaType !== y.d && !b.deepAccess(o, "mediaTypes.video") || (o.mediaType === y.d || c(o.mediaTypes.video.playerSize, o.params.size) ? s.push(function (e) { var r = p(e); r.video = b.deepClone(e.params.video), r.video.w = e.params.size[0], r.video.h = e.params.size[1]; var t = b.deepAccess(e, "mediaTypes.video.context"); return t && ("instream" === t ? r.video.placement = 1 : "outstream" === t ? r.video.placement = 4 : b.logWarn("ix bidder params: video context '".concat(t, "' is not supported"))), r; }(o)) : b.logError("Bid size is not included in video playerSize")), o.mediaType !== y.b && !b.deepAccess(o, "mediaTypes.banner") && (o.mediaType || o.mediaTypes) || n.push((i = void 0, (i = p(t = o)).banner = {}, i.banner.w = t.params.size[0], i.banner.h = t.params.size[1], i.banner.topframe = b.inIframe() ? 0 : 1, i)); } return 0 < n.length && a.push(u(e, r, n, 7.2)), 0 < s.length && a.push(u(e, r, s, 8.1)), a; }, interpretResponse: function interpretResponse(e, r) { var t = []; if (!e.hasOwnProperty("body") || !e.body.hasOwnProperty("seatbid")) return t; for (var i, a, n, s, o = e.body, d = o.seatbid, p = 0; p < d.length; p++) { if (d[p].hasOwnProperty("bid")) for (var c = d[p].bid, u = JSON.parse(r.data.r), m = 0; m < c.length; m++) { var f = function (r, e) { if (r) return l()(e, function (e) { return e.id === r; }); }(c[m].impid, u.imp); i = c[m], a = o.cur, n = f, s = void 0, s = {}, P.hasOwnProperty(a) ? s.cpm = i.price / P[a] : s.cpm = i.price / g, s.requestId = i.impid, s.dealId = b.deepAccess(i, "ext.dealid"), s.netRevenue = I, s.currency = a, s.creativeId = i.hasOwnProperty("crid") ? i.crid : "-", b.deepAccess(i, "ext.vasturl") ? (s.vastUrl = i.ext.vasturl, s.width = n.video.w, s.height = n.video.h, s.mediaType = y.d, s.ttl = x) : (s.ad = i.adm, s.width = i.w, s.height = i.h, s.mediaType = y.b, s.ttl = w), s.meta = {}, s.meta.networkId = b.deepAccess(i, "ext.dspid"), s.meta.brandId = b.deepAccess(i, "ext.advbrandid"), s.meta.brandName = b.deepAccess(i, "ext.advbrand"), t.push(s); } } return t; }, transformBidParams: function transformBidParams(e) { return b.convertTypes({ siteID: "number" }, e); }, getUserSyncs: function getUserSyncs(e) { return e.iframeEnabled ? [{ type: "iframe", url: "https://js-sec.indexww.com/um/ixmatch.html" }] : []; } }; Object(s.registerBidder)(m); } }, [481]); pbjsChunk([184], { 493: function _(e, t, r) { e.exports = r(494); }, 494: function _(e, t, r) { "use strict"; Object.defineProperty(t, "__esModule", { value: !0 }), r.d(t, "spec", function () { return l; }); var s = r(0), d = r(3), n = r(1), a = r(9); function g() { return (g = Object.assign || function (e) { for (var t = 1; t < arguments.length; t++) { var r = arguments[t]; for (var n in r) { Object.prototype.hasOwnProperty.call(r, n) && (e[n] = r[n]); } } return e; }).apply(this, arguments); } var o, i, c, u = Object(a.b)(), l = { code: "kargo", isBidRequestValid: function isBidRequestValid(e) { return !(!e || !e.params) && !!e.params.placementId; }, buildRequests: function buildRequests(e, t) { var r, n = d.b.getConfig("currency"), a = n && n.adServerCurrency || "USD", o = {}, i = {}; s._each(e, function (e) { o[e.bidId] = e.params.placementId, i[e.bidId] = e.sizes; }), 0 < e.length && e[0].userId && e[0].userId.tdid && (r = e[0].userId.tdid); var c = g({}, { sessionId: l._getSessionId(), requestCount: l._getRequestCount(), timeout: t.timeout, currency: a, cpmGranularity: 1, timestamp: new Date().getTime(), cpmRange: { floor: 0, ceil: 20 }, bidIDs: o, bidSizes: i, prebidRawBidRequests: e }, l._getAllMetadata(r, t.uspConsent)), u = encodeURIComponent(JSON.stringify(c)); return g({}, t, { method: "GET", url: "".concat("https://krk.kargo.com"https://slate.com/,"/api/v2/bid"), data: "json=".concat(u), currency: a }); }, interpretResponse: function interpretResponse(e, t) { var r = e.body, n = []; for (var a in r) { var o = r[a], i = void 0; o.metadata && o.metadata.landingPageDomain && (i = { clickUrl: o.metadata.landingPageDomain }), n.push({ requestId: a, cpm: Number(o.cpm), width: o.width, height: o.height, ad: o.adm, ttl: 300, creativeId: o.id, dealId: o.targetingCustom, netRevenue: !0, currency: t.currency, meta: i }); } return n; }, getUserSyncs: function getUserSyncs(e) { var t = [], r = l._generateRandomUuid(), n = l._getClientId(); if (e.iframeEnabled && r && n) for (var a = 0; a < 5; a++) { t.push({ type: "iframe", url: "https://crb.kargo.com/api/v1/initsyncrnd/{UUID}?seed={SEED}&idx={INDEX}".replace("{UUID}", n).replace("{SEED}", r).replace("{INDEX}", a) }); } return t; }, _readCookie: function _readCookie(e) { if (!u.cookiesAreEnabled()) return null; for (var t = "".concat(e, "="), r = document.cookie.split(";"), n = 0; n < r.length; n++) { for (var a = r[n]; " " === a.charAt(0);) { a = a.substring(1, a.length); } if (0 === a.indexOf(t)) return a.substring(t.length, a.length); } return null; }, _getCrbFromCookie: function _getCrbFromCookie() { try { var e = JSON.parse(decodeURIComponent(l._readCookie("krg_crb"))); if (e && e.v) { var t = JSON.parse(atob(e.v)); if (t) return t; } return {}; } catch (e) { return {}; } }, _getCrbFromLocalStorage: function _getCrbFromLocalStorage() { try { return JSON.parse(atob(l._getLocalStorageSafely("krg_crb"))); } catch (e) { return {}; } }, _getCrb: function _getCrb() { var e = l._getCrbFromLocalStorage(); return Object.keys(e).length ? e : l._getCrbFromCookie(); }, _getKruxUserId: function _getKruxUserId() { return l._getLocalStorageSafely("kxkar_user"); }, _getKruxSegments: function _getKruxSegments() { return l._getLocalStorageSafely("kxkar_segs"); }, _getKrux: function _getKrux() { var e = l._getKruxSegments(), t = []; return e && (t = e.split(",")), { userID: l._getKruxUserId(), segments: t }; }, _getLocalStorageSafely: function _getLocalStorageSafely(e) { try { return u.getDataFromLocalStorage(e); } catch (e) { return null; } }, _getUserIds: function _getUserIds(e, t) { var r = l._getCrb(), n = { kargoID: r.userId, clientID: r.clientId, crbIDs: r.syncIds || {}, optOut: r.optOut, usp: t }; return e && (n.tdID = e), n; }, _getClientId: function _getClientId() { return l._getCrb().clientId; }, _getAllMetadata: function _getAllMetadata(e, t) { return { userIDs: l._getUserIds(e, t), krux: l._getKrux(), pageURL: window.location.href, rawCRB: l._readCookie("krg_crb"), rawCRBLocalStorage: l._getLocalStorageSafely("krg_crb") }; }, _getSessionId: function _getSessionId() { return o = o || l._generateRandomUuid(); }, _getRequestCount: function _getRequestCount() { return i === window.location.pathname ? ++c : (i = window.location.pathname, c = 0); }, _generateRandomUuid: function _generateRandomUuid() { try { var e = new Uint8Array(16); crypto.getRandomValues(e), e[6] = -177 & e[6] | 64, e[8] = -65 & e[8] | 128; var t = Array.prototype.map.call(new Uint8Array(e), function (e) { return ("00" + e.toString(16)).slice(-2); }).join(""); return t.slice(0, 8) + "-" + t.slice(8, 12) + "-" + t.slice(12, 16) + "-" + t.slice(16, 20) + "-" + t.slice(20); } catch (e) { return ""; } } }; Object(n.registerBidder)(l); } }, [493]); pbjsChunk([110], { 677: function _(e, r, t) { e.exports = t(678); }, 678: function _(e, r, t) { "use strict"; Object.defineProperty(r, "__esModule", { value: !0 }), t.d(r, "FASTLANE_ENDPOINT", function () { return o; }), t.d(r, "VIDEO_ENDPOINT", function () { return l; }), t.d(r, "SYNC_ENDPOINT", function () { return a; }), t.d(r, "spec", function () { return h; }), r.hasVideoMediaType = c, r.masSizeOrdering = S, r.determineRubiconVideoSizeId = C, r.getPriceGranularity = j, r.hasValidVideoParams = k, r.hasValidSupplyChainParams = T, r.encodeParam = w, r.resetUserSync = function () { R = !1; }; var g = t(0), i = t(1), b = t(3), u = t(2); function v(e, r) { return function (e) { if (Array.isArray(e)) return e; }(e) || function (e, r) { if ("undefined" == typeof Symbol || !(Symbol.iterator in Object(e))) return; var t = [], i = !0, n = !1, o = void 0; try { for (var a, s = e[Symbol.iterator](); !(i = (a = s.next()).done) && (t.push(a.value), !r || t.length !== r); i = !0) { ; } } catch (e) { n = !0, o = e; } finally { try { i || null == s.return || s.return(); } finally { if (n) throw o; } } return t; }(e, r) || function (e, r) { if (!e) return; if ("string" == typeof e) return n(e, r); var t = Object.prototype.toString.call(e).slice(8, -1); "Object" === t && e.constructor && (t = e.constructor.name); if ("Map" === t || "Set" === t) return Array.from(e); if ("Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)) return n(e, r); }(e, r) || function () { throw new TypeError("Invalid attempt to destructure non-iterable instance.nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }(); } function n(e, r) { (null == r || r > e.length) && (r = e.length);
for (var t = 0, i = new Array(r); t < r; t++) { i[t] = e[t]; } return i; } function y() { return (y = Object.assign || function (e) { for (var r = 1; r < arguments.length; r++) { var t = arguments[r]; for (var i in t) { Object.prototype.hasOwnProperty.call(t, i) && (e[i] = t[i]); } } return e; }).apply(this, arguments); } function p(e, r, t) { return r in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } function x(e) { return (x = "function" == typeof Symbol && "symbol" == _typeof(Symbol.iterator) ? function (e) { return _typeof(e); } : function (e) { return e && "function" == typeof Symbol && e.constructor === Symbol && e !== Symbol.prototype ? "symbol" : _typeof(e); })(e); } var o = "https://fastlane.rubiconproject.com/a/api/fastlane.json", l = "https://prebid-server.rubiconproject.com/openrtb2/auction", a = "https://eus.rubiconproject.com/usync.html", d = { FASTLANE: { id: "dt.id", keyv: "dt.keyv", pref: "dt.pref" }, PREBID_SERVER: { id: "id", keyv: "keyv" } }, f = { 1: "468x60", 2: "728x90", 5: "120x90", 8: "120x600", 9: "160x600", 10: "300x600", 13: "200x200", 14: "250x250", 15: "300x250", 16: "336x280", 17: "240x400", 19: "300x100", 31: "980x120", 32: "250x360", 33: "180x500", 35: "980x150", 37: "468x400", 38: "930x180", 39: "750x100", 40: "750x200", 41: "750x300", 42: "2x4", 43: "320x50", 44: "300x50", 48: "300x300", 53: "1024x768", 54: "300x1050", 55: "970x90", 57: "970x250", 58: "1000x90", 59: "320x80", 60: "320x150", 61: "1000x1000", 64: "580x500", 65: "640x480", 66: "930x600", 67: "320x480", 68: "1800x1000", 72: "320x320", 73: "320x160", 78: "980x240", 79: "980x300", 80: "980x400", 83: "480x300", 85: "300x120", 90: "548x150", 94: "970x310", 95: "970x100", 96: "970x210", 101: "480x320", 102: "768x1024", 103: "480x280", 105: "250x800", 108: "320x240", 113: "1000x300", 117: "320x100", 125: "800x250", 126: "200x600", 144: "980x600", 145: "980x150", 152: "1000x250", 156: "640x320", 159: "320x250", 179: "250x600", 195: "600x300", 198: "640x360", 199: "640x200", 213: "1030x590", 214: "980x360", 221: "1x1", 229: "320x180", 230: "2000x1400", 232: "580x400", 234: "6x6", 251: "2x2", 256: "480x820", 257: "400x600", 258: "500x200", 259: "998x200", 264: "970x1000", 265: "1920x1080", 274: "1800x200", 278: "320x500", 282: "320x400", 288: "640x380" }; g._each(f, function (e, r) { return f[e] = r; }); var h = { code: "rubicon", gvlid: 52, supportedMediaTypes: [u.b, u.d], isBidRequestValid: function isBidRequestValid(e) { if ("object" !== x(e.params)) return !1; for (var r = 0, t = ["accountId"https://slate.com/,"siteId"https://slate.com/,"zoneId"]; r < t.length; r++) { if (e.params[t[r]] = parseInt(e.params[t[r]]), isNaN(e.params[t[r]])) return g.logError("Rubicon: wrong format of accountId or siteId or zoneId."), !1; } var i = m(e, !0); return !!i && ("video" !== i || k(e)); }, buildRequests: function buildRequests(e, u) { var n, r = e.filter(function (e) { return "video" === m(e); }).map(function (e) { e.startTime = new Date().getTime(); var r, t, i = { id: e.transactionId, test: b.b.getConfig("debug") ? 1 : 0, cur: ["USD"], source: { tid: e.transactionId }, tmax: b.b.getConfig("TTL") || 1e3, imp: [{ exp: 300, id: e.adUnitCode, secure: 1, ext: p({}, e.bidder, e.params), video: g.deepAccess(e, "mediaTypes.video") || {} }], ext: { prebid: { cache: { vastxml: { returnCreative: !1 } }, targeting: { includewinners: !0, includebidderkeys: !1, pricegranularity: j(b.b) }, bidders: { rubicon: { integration: b.b.getConfig("rubicon.int_type") || "pbjs" } } } } }; "rubicon" !== e.bidder && (i.ext.prebid.aliases = p({}, e.bidder, "rubicon")), t = "function" != typeof e.getFloor || b.b.getConfig("rubicon.disableFloors") ? parseFloat(g.deepAccess(e, "params.floor")) : "object" !== x(r = e.getFloor({ currency: "USD", mediaType: "video", size: A(e, "video") })) || "USD" !== r.currency || isNaN(parseInt(r.floor)) ? void 0 : parseFloat(r.floor), isNaN(t) || (i.imp[0].bidfloor = t), i.imp[0].ext[e.bidder].video.size_id = C(e), function (r, t, e) { if (!r) return; "object" === x(b.b.getConfig("app")) ? r.app = b.b.getConfig("app") : r.site = { page: I(t, e) }; "object" === x(b.b.getConfig("device")) && (r.device = b.b.getConfig("device")); t.params.video.language && ["site"https://slate.com/,"device"].forEach(function (e) { r[e] && (r[e].content = y({ language: t.params.video.language }, r[e].content)); }); }(i, e, u), function (e, r) { "object" === x(e.imp[0].video) && void 0 === e.imp[0].video.skip && (e.imp[0].video.skip = r.params.video.skip); "object" === x(e.imp[0].video) && void 0 === e.imp[0].video.skipafter && (e.imp[0].video.skipafter = r.params.video.skipdelay); "object" === x(e.imp[0].video) && void 0 === e.imp[0].video.pos && ("atf" === r.params.position ? e.imp[0].video.pos = 1 : "btf" === r.params.position && (e.imp[0].video.pos = 3)); var t = A(r, "video"); e.imp[0].video.w = t[0], e.imp[0].video.h = t[1]; }(i, e); var n, o = _(e, "PREBID_SERVER"); o && g.deepSetValue(i, "user.ext.digitrust", o), u.gdprConsent && ("boolean" == typeof u.gdprConsent.gdprApplies && (n = u.gdprConsent.gdprApplies ? 1 : 0), g.deepSetValue(i, "regs.ext.gdpr", n), g.deepSetValue(i, "user.ext.consent", u.gdprConsent.consentString)), u.uspConsent && g.deepSetValue(i, "regs.ext.us_privacy", u.uspConsent), e.userId && "object" === x(e.userId) && (e.userId.tdid || e.userId.pubcid || e.userId.lipb || e.userId.idl_env) && (g.deepSetValue(i, "user.ext.eids", []), e.userId.tdid && i.user.ext.eids.push({ source: "adserver.org", uids: [{ id: e.userId.tdid, ext: { rtiPartner: "TDID" } }] }), e.userId.pubcid && i.user.ext.eids.push({ source: "pubcommon", uids: [{ id: e.userId.pubcid }] }), e.userId.lipb && e.userId.lipb.lipbid && (i.user.ext.eids.push({ source: "liveintent.com", uids: [{ id: e.userId.lipb.lipbid }] }), i.user.ext.tpid = { source: "liveintent.com", uid: e.userId.lipb.lipbid }, Array.isArray(e.userId.lipb.segments) && e.userId.lipb.segments.length && g.deepSetValue(i, "rp.target.LIseg", e.userId.lipb.segments)), e.userId.idl_env && i.user.ext.eids.push({ source: "liveramp.com", uids: [{ id: e.userId.idl_env }] })), !0 === b.b.getConfig("coppa") && g.deepSetValue(i, "regs.coppa", 1), e.schain && T(e.schain) && g.deepSetValue(i, "source.ext.schain", e.schain); var a, s = y({}, e.params.inventory, b.b.getConfig("fpd.context")), d = y({}, e.params.visitor, b.b.getConfig("fpd.user")); g.isEmpty(s) && g.isEmpty(d) || (a = { bidders: [u.bidderCode], config: { fpd: {} } }, g.isEmpty(s) || (a.config.fpd.site = s), g.isEmpty(d) || (a.config.fpd.user = d), g.deepSetValue(i, "ext.prebid.bidderconfig.0", a)); var c = g.deepAccess(e, "fpd.context.pbAdSlot"); return "string" == typeof c && c && g.deepSetValue(i.imp[0].ext, "context.data.adslot", c), e.storedAuctionResponse && g.deepSetValue(i.imp[0], "ext.prebid.storedauctionresponse.id", e.storedAuctionResponse.toString()), g.deepSetValue(i.imp[0], "ext.prebid.auctiontimestamp", u.auctionStart), { method: "POST", url: l, data: i, bidRequest: e }; }); return !0 !== b.b.getConfig("rubicon.singleRequest") ? r.concat(e.filter(function (e) { return "banner" === m(e); }).map(function (e) { var i = h.createSlotParams(e, u); return { method: "GET", url: o, data: h.getOrderedParams(i).reduce(function (e, r) { var t = i[r]; return g.isStr(t) && "" !== t || g.isNumber(t) ? "".concat(e).concat(w(r, t), "&") : e; }, "") + "slots=1&rand=".concat(Math.random()), bidRequest: e }; })) : (n = e.filter(function (e) { return "banner" === m(e); }).reduce(function (e, r) { return (e[r.params.siteId] = e[r.params.siteId] || []).push(r), e; }, {}), r.concat(Object.keys(n).reduce(function (r, e) { var t, i; return t = n[e], i = 10, t.map(function (e, r) { return r % i == 0 ? t.slice(r, r + i) : null; }).filter(function (e) { return e; }).forEach(function (e) { var i = h.combineSlotUrlParams(e.map(function (e) { return h.createSlotParams(e, u); })); r.push({ method: "GET", url: o, data: h.getOrderedParams(i).reduce(function (e, r) { var t = i[r]; return g.isStr(t) && "" !== t || g.isNumber(t) ? "".concat(e).concat(w(r, t), "&") : e; }, "") + "slots=".concat(e.length, "&rand=").concat(Math.random()), bidRequest: e }); }), r; }, []))); }, getOrderedParams: function getOrderedParams(e) { var r = /^tg_v/, t = /^tg_i/, i = ["account_id"https://slate.com/,"site_id"https://slate.com/,"zone_id"https://slate.com/,"size_id"https://slate.com/,"alt_size_ids"https://slate.com/,"p_pos"https://slate.com/,"gdpr"https://slate.com/,"gdpr_consent"https://slate.com/,"us_privacy"https://slate.com/,"rp_schain"https://slate.com/,"tpid_tdid"https://slate.com/,"tpid_liveintent.com"https://slate.com/,"tg_v.LIseg"https://slate.com/,"dt.id"https://slate.com/,"dt.keyv"https://slate.com/,"dt.pref"https://slate.com/,"rf"https://slate.com/,"p_geo.latitude"https://slate.com/,"p_geo.longitude"https://slate.com/,"kw"].concat(Object.keys(e).filter(function (e) { return r.test(e); })).concat(Object.keys(e).filter(function (e) { return t.test(e); })).concat(["tk_flint"https://slate.com/,"x_source.tid"https://slate.com/,"x_source.pchain"https://slate.com/,"p_screen_res"https://slate.com/,"rp_floor"https://slate.com/,"rp_secure"https://slate.com/,"tk_user_key"]); return i.concat(Object.keys(e).filter(function (e) { return -1 === i.indexOf(e); })); }, combineSlotUrlParams: function combineSlotUrlParams(n) { if (1 === n.length) return n[0]; var i = n.reduce(function (r, t, i) { return Object.keys(t).forEach(function (e) { r.hasOwnProperty(e) || (r[e] = new Array(n.length)), r[e].splice(i, 1, t[e]); }), r; }, {}), o = new RegExp("^([^;]*)(;\1)+$"); return Object.keys(i).forEach(function (e) { var r = i[e].join(";"), t = r.match(o); i[e] = t ? t[1] : r; }), i; }, createSlotParams: function createSlotParams(e, r) { e.startTime = new Date().getTime(); var t, i = e.params, n = A(e, "banner"), o = v(i.latLong || [], 2), a = o[0], s = o[1], d = b.b.getConfig("rubicon.int_type"), c = { account_id: i.accountId, site_id: i.siteId, zone_id: i.zoneId, size_id: n[0], alt_size_ids: n.slice(1).join(",") || void 0, rp_floor: .01 < (i.floor = parseFloat(i.floor)) ? i.floor : .01, rp_secure: "1", tk_flint: "".concat(d || "pbjs_lite"https://slate.com/,"_v3.23.0"), "x_source.tid": e.transactionId, "x_source.pchain": i.pchain, p_screen_res: [window.screen.width, window.screen.height].join("x"), tk_user_key: i.userId, "p_geo.latitude": isNaN(parseFloat(a)) ? void 0 : parseFloat(a).toFixed(4), "p_geo.longitude": isNaN(parseFloat(s)) ? void 0 : parseFloat(s).toFixed(4), "tg_fl.eid": e.code, rf: I(e, r) }; "function" != typeof e.getFloor || b.b.getConfig("rubicon.disableFloors") || (t = e.getFloor({ currency: "USD", mediaType: "banner", size: "*" }), c.rp_hard_floor = "object" !== x(t) || "USD" !== t.currency || isNaN(parseInt(t.floor)) ? void 0 : t.floor), c.p_pos = "atf" === i.position || "btf" === i.position ? i.position : "", e.userId && (e.userId.tdid && (c.tpid_tdid = e.userId.tdid), e.userId.lipb && e.userId.lipb.lipbid && (c["tpid_liveintent.com"] = e.userId.lipb.lipbid, Array.isArray(e.userId.lipb.segments) && e.userId.lipb.segments.length && (c["tg_v.LIseg"] = e.userId.lipb.segments.join(","))), e.userId.idl_env && (c["tpid_liveramp.com"] = e.userId.idl_env)), r.gdprConsent && ("boolean" == typeof r.gdprConsent.gdprApplies && (c.gdpr = Number(r.gdprConsent.gdprApplies)), c.gdpr_consent = r.gdprConsent.consentString), r.uspConsent && (c.us_privacy = encodeURIComponent(r.uspConsent)); var u = y({}, i.visitor, b.b.getConfig("fpd.user")); Object.keys(u).forEach(function (e) { null != u[e] && "keywords" !== e && (c["tg_v.".concat(e)] = "object" !== x(u[e]) || Array.isArray(u[e]) ? u[e].toString() : JSON.stringify(u[e])); }); var p = y({}, i.inventory, b.b.getConfig("fpd.context")); Object.keys(p).forEach(function (e) { null != p[e] && "keywords" !== e && (c["tg_i.".concat(e)] = "object" !== x(p[e]) || Array.isArray(p[e]) ? p[e].toString() : JSON.stringify(p[e])); }); var l = (i.keywords || []).concat(g.deepAccess(b.b.getConfig("fpd.user"), "keywords") || [], g.deepAccess(b.b.getConfig("fpd.context"), "keywords") || []); c.kw = Array.isArray(l) && l.length ? l.join(",") : ""; var f = g.deepAccess(e, "fpd.context.pbAdSlot"); "string" == typeof f && f && (c["tg_i.dfp_ad_unit_code"] = f.replace(/^/+/, "")); var m = _(e, "FASTLANE"); return y(c, m), !0 === b.b.getConfig("coppa") && (c.coppa = 1), e.schain && T(e.schain) && (c.rp_schain = h.serializeSupplyChain(e.schain)), c; }, serializeSupplyChain: function serializeSupplyChain(e) { if (!T(e)) return ""; var r = e.ver, t = e.complete, i = e.nodes; return "".concat(r, ",").concat(t, "!").concat(h.serializeSupplyChainNodes(i)); }, serializeSupplyChainNodes: function serializeSupplyChainNodes(e) { var t = ["asi"https://slate.com/,"sid"https://slate.com/,"hp"https://slate.com/,"rid"https://slate.com/,"name"https://slate.com/,"domain"]; return e.map(function (r) { return t.map(function (e) { return encodeURIComponent(r[e] || ""); }).join(","); }).join("!"); }, interpretResponse: function interpretResponse(d, e) { var c = e.bidRequest; if (!(d = d.body) || "object" !== x(d)) return []; if (d.seatbid) { var r = g.deepAccess(d, "ext.errors.rubicon"); Array.isArray(r) && 0 < r.length && g.logWarn("Rubicon: Error in video response"); var o = []; return d.seatbid.forEach(function (n) { (n.bid || []).forEach(function (e) { var r = { requestId: c.bidId, currency: d.cur || "USD", creativeId: e.crid, cpm: e.price || 0, bidderCode: n.seat, ttl: 300, netRevenue: !1 !== b.b.getConfig("rubicon.netRevenue"), width: e.w || g.deepAccess(c, "mediaTypes.video.w") || g.deepAccess(c, "params.video.playerWidth"), height: e.h || g.deepAccess(c, "mediaTypes.video.h") || g.deepAccess(c, "params.video.playerHeight") }; e.id && (r.seatBidId = e.id), e.dealid && (r.dealId = e.dealid); var t, i = g.deepAccess(d, "ext.responsetimemillis.rubicon"); c && i && (c.serverResponseTimeMs = i), g.deepAccess(e, "ext.prebid.type") === u.d ? (r.mediaType = u.d, (t = g.deepAccess(e, "ext.prebid.targeting")) && "object" === x(t) && (r.adserverTargeting = t), e.ext.prebid.cache && "object" === x(e.ext.prebid.cache.vastXml) && e.ext.prebid.cache.vastXml.cacheId && e.ext.prebid.cache.vastXml.url ? (r.videoCacheKey = e.ext.prebid.cache.vastXml.cacheId, r.vastUrl = e.ext.prebid.cache.vastXml.url) : t && t.hb_uuid && t.hb_cache_host && t.hb_cache_path && (r.videoCacheKey = t.hb_uuid, r.vastUrl = "https://".concat(t.hb_cache_host).concat(t.hb_cache_path, "?uuid=").concat(t.hb_uuid)), e.adm && (r.vastXml = e.adm), e.nurl && (r.vastUrl = e.nurl), !r.vastUrl && e.nurl && (r.vastUrl = e.nurl)) : g.logWarn("Rubicon: video response received non-video media type"), o.push(r); }); }), o; } var t = d.ads; return "object" !== x(c) || Array.isArray(c) || "video" !== m(c) || "object" !== x(t) || (t = t[c.adUnitCode]), !Array.isArray(t) || t.length < 1 ? [] : t.reduce(function (e, r, t) { if ("ok" !== r.status) return e; var i, n, o, a, s = Array.isArray(c) ? c[t] : c; return s && "object" === x(s) ? (i = { requestId: s.bidId, currency: "USD", creativeId: r.creative_id || "".concat(r.network || ""https://slate.com/,"-").concat(r.advertiser || ""), cpm: r.cpm || 0, dealId: r.deal, ttl: 300, netRevenue: !1 !== b.b.getConfig("rubicon.netRevenue"), rubicon: { advertiserId: r.advertiser, networkId: r.network }, meta: { advertiserId: r.advertiser, networkId: r.network } }, r.creative_type && (i.mediaType = r.creative_type), r.creative_type === u.d ? (i.width = s.params.video.playerWidth, i.height = s.params.video.playerHeight, i.vastUrl = r.creative_depot_url, i.impression_id = r.impression_id, i.videoCacheKey = r.impression_id) : (i.ad = (o = r.script, a = r.impression_id, "n
nnx3c!-- Rubicon Project Ad Tag --x3ennn")), n = v(f[r.size_id].split("x").map(function (e) {
return Number(e);
}), 2), i.width = n[0], i.height = n[1]), i.rubiconTargeting = (Array.isArray(r.targeting) ? r.targeting : []).reduce(function (e, r) {
return e[r.key] = r.values[0], e;
}, {
rpfl_elemid: s.adUnitCode
}), e.push(i)) : g.logError("Rubicon: bidRequest undefined at index position:".concat(t), c, d), e;
}, []).sort(function (e, r) {
return (r.cpm || 0) - (e.cpm || 0);
});
},
getUserSyncs: function getUserSyncs(e, r, t, i) {
if (!R && e.iframeEnabled) {
var n = "";
return t && "string" == typeof t.consentString && ("boolean" == typeof t.gdprApplies ? n += "?gdpr=".concat(Number(t.gdprApplies), "&gdpr_consent=").concat(t.consentString) : n += "?gdpr_consent=".concat(t.consentString)), i && (n += "".concat(n ? "&" : "?"https://slate.com/,"us_privacy=").concat(encodeURIComponent(i))), R = !0, {
type: "iframe",
url: a + n
};
}
},
transformBidParams: function transformBidParams(e) {
return g.convertTypes({
accountId: "number",
siteId: "number",
zoneId: "number"
}, e);
}
};
function _(e, r) {
var t,
i = 0 < arguments.length && void 0 !== e ? e : {},
n = 1 < arguments.length ? r : void 0;
if (!n || !d[n]) return null;
var o = d[n];
var a = function () {
var e = g.deepAccess(i, "userId.digitrustid.data");
if (e) return e;
var r = window.DigiTrust && (b.b.getConfig("digiTrustId") || window.DigiTrust.getUser({
member: "T9QSFKPDN9"
}));
return r && r.success && r.identity || null;
}();
if (!a || a.privacy && a.privacy.optout) return null;
var s = (p(t = {}, o.id, a.id), p(t, o.keyv, a.keyv), t);
return o.pref && (s[o.pref] = 0), s;
}
function I(e, r) {
var t = b.b.getConfig("pageUrl"),
t = e.params.referrer ? e.params.referrer : t || r.refererInfo.referer;
return e.params.secure ? t.replace(/^http:/i, "https:") : t;
}
function A(e, r) {
var t = e.params;
if ("video" === r) {
var i = [];
return t.video && t.video.playerWidth && t.video.playerHeight ? i = [t.video.playerWidth, t.video.playerHeight] : Array.isArray(g.deepAccess(e, "mediaTypes.video.playerSize")) && 1 === e.mediaTypes.video.playerSize.length ? i = e.mediaTypes.video.playerSize[0] : Array.isArray(e.sizes) && 0 < e.sizes.length && Array.isArray(e.sizes[0]) && 1 < e.sizes[0].length && (i = e.sizes[0]), i;
}
var n = [];
return Array.isArray(t.sizes) ? n = t.sizes : void 0 !== g.deepAccess(e, "mediaTypes.banner.sizes") ? n = s(e.mediaTypes.banner.sizes) : Array.isArray(e.sizes) && 0 < e.sizes.length ? n = s(e.sizes) : g.logWarn("Rubicon: no sizes are setup or found"), S(n);
}
function s(e) {
return g.parseSizesInput(e).reduce(function (e, r) {
var t = parseInt(f[r], 10);
return t && e.push(t), e;
}, []);
}
function c(e) {
return "object" === x(g.deepAccess(e, "params.video")) && void 0 !== g.deepAccess(e, "mediaTypes.".concat(u.d));
}
function m(e, r) {
var t = 1 < arguments.length && void 0 !== r && r;
return c(e) ? -1 === ["outstream"https://slate.com/,"instream"].indexOf(g.deepAccess(e, "mediaTypes.".concat(u.d, ".context"))) ? void (t && g.logError("Rubicon: mediaTypes.video.context must be outstream or instream")) : A(e, "video").length < 2 ? void (t && g.logError("Rubicon: could not determine the playerSize of the video")) : (t && g.logMessage("Rubicon: making video request for adUnit", e.adUnitCode), "video") : 0 === A(e, "banner").length ? void (t && g.logError("Rubicon: could not determine the sizes for banner request")) : (t && g.logMessage("Rubicon: making banner request for adUnit", e.adUnitCode), "banner");
}
function S(e) {
var n = [15, 2, 9];
return e.sort(function (e, r) {
var t = n.indexOf(e),
i = n.indexOf(r);
return -1 < t || -1 < i ? -1 === t ? 1 : -1 === i ? -1 : t - i : e - r;
});
}
function C(e) {
var r = parseInt(g.deepAccess(e, "params.video.size_id"));
return isNaN(r) ? "outstream" === g.deepAccess(e, "mediaTypes.".concat(u.d, ".context")) ? 203 : 201 : r;
}
function j(e) {
return {
ranges: {
low: [{
max: 5,
increment: .5
}],
medium: [{
max: 20,
increment: .1
}],
high: [{
max: 20,
increment: .01
}],
auto: [{
max: 5,
increment: .05
}, {
min: 5,
max: 10,
increment: .1
}, {
min: 10,
max: 20,
increment: .5
}],
dense: [{
max: 3,
increment: .01
}, {
min: 3,
max: 8,
increment: .05
}, {
min: 8,
max: 20,
increment: .5
}],
custom: e.getConfig("customPriceBucket") && e.getConfig("customPriceBucket").buckets
}[e.getConfig("priceGranularity")]
};
}
function k(r) {
var t = !0,
e = Object.prototype.toString.call([]),
i = Object.prototype.toString.call(0),
n = {
mimes: e,
protocols: e,
maxduration: i,
linearity: i,
api: e
};
return Object.keys(n).forEach(function (e) {
Object.prototype.toString.call(g.deepAccess(r, "mediaTypes.video." + e)) !== n[e] && (t = !1, g.logError("Rubicon: mediaTypes.video." + e + " is required and must be of type: " + n[e]));
}), t;
}
function T(e) {
var r = !1,
t = ["asi"https://slate.com/,"sid"https://slate.com/,"hp"];
return e.nodes && ((r = e.nodes.reduce(function (e, r) {
return e ? t.every(function (e) {
return r[e];
}) : e;
}, !0)) || g.logError("Rubicon: required schain params missing")), r;
}
function w(e, r) {
return "rp_schain" === e ? "rp_schain=".concat(r) : "".concat(e, "=").concat(encodeURIComponent(r));
}
var R = !1;
Object(i.registerBidder)(h);
}
}, [677]);
pbjsChunk([93], {
719: function _(e, t, r) {
e.exports = r(720);
},
720: function _(e, t, r) {
"use strict";
Object.defineProperty(t, "__esModule", {
value: !0
}), r.d(t, "spec", function () {
return o;
}), r.d(t, "_isInbounds", function () {
return a;
}), t._getPlatform = v;
var n = r(1),
y = r(0),
i = r(2),
c = r(3),
g = r(10),
d = r(44);
function h(e, t) {
return function (e) {
if (Array.isArray(e)) return e;
}(e) || function (e, t) {
if ("undefined" == typeof Symbol || !(Symbol.iterator in Object(e))) return;
var r = [],
n = !0,
i = !1,
s = void 0;
try {
for (var o, a = e[Symbol.iterator](); !(n = (o = a.next()).done) && (r.push(o.value), !t || r.length !== t); n = !0) {
;
}
} catch (e) {
i = !0, s = e;
} finally {
try {
n || null == a.return || a.return();
} finally {
if (i) throw s;
}
}
return r;
}(e, t) || function (e, t) {
if (!e) return;
if ("string" == typeof e) return s(e, t);
var r = Object.prototype.toString.call(e).slice(8, -1);
"Object" === r && e.constructor && (r = e.constructor.name);
if ("Map" === r || "Set" === r) return Array.from(e);
if ("Arguments" === r || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)) return s(e, t);
}(e, t) || function () {
throw new TypeError("Invalid attempt to destructure non-iterable instance.nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
}();
}
function s(e, t) {
(null == t || t > e.length) && (t = e.length);
for (var r = 0, n = new Array(t); r < t; r++) {
n[r] = e[r];
}
return n;
}
function u() {
return (u = Object.assign || function (e) {
for (var t = 1; t < arguments.length; t++) {
var r = arguments[t];
for (var n in r) {
Object.prototype.hasOwnProperty.call(r, n) && (e[n] = r[n]);
}
}
return e;
}).apply(this, arguments);
}
function p(e, t, r) {
return t in e ? Object.defineProperty(e, t, {
value: r,
enumerable: !0,
configurable: !0,
writable: !0
}) : e[t] = r, e;
}
var b = "sonobi",
l = Object(y.generateUUID)(),
o = {
code: b,
supportedMediaTypes: [i.b, i.d],
isBidRequestValid: function isBidRequestValid(e) {
if (!e.params) return !1;
if (!e.params.ad_unit && !e.params.placement_id) return !1;
if (!Object(y.deepAccess)(e, "mediaTypes.banner") && !Object(y.deepAccess)(e, "mediaTypes.video")) return !1;
if (Object(y.deepAccess)(e, "mediaTypes.banner")) {
if (!Object(y.deepAccess)(e, "mediaTypes.banner.sizes") && !e.params.sizes) return !1;
} else if (Object(y.deepAccess)(e, "mediaTypes.video")) {
if ("outstream" === Object(y.deepAccess)(e, "mediaTypes.video.context") && !e.params.sizes) return !1;
if ("instream" === Object(y.deepAccess)(e, "mediaTypes.video.context") && !Object(y.deepAccess)(e, "mediaTypes.video.playerSize")) return !1;
}
return !0;
},
buildRequests: function buildRequests(e, t) {
var r = e.map(function (e) {
var t = function (e) {
if (e.params.ad_unit) return e.params.ad_unit;
return e.params.placement_id;
}(e);
return /^[/]?[d]+[[/].+[/]?]?$/.test(t) ? (t = "/" === t.charAt(0) ? t : "/" + t, p({}, "".concat(t, "|").concat(e.bidId), "".concat(f(e)).concat(m(e)))) : /^[0-9a-fA-F]{20}$/.test(t) && 20 === t.length ? p({}, e.bidId, "".concat(t, "|").concat(f(e)).concat(m(e))) : void Object(y.logError)("The ad unit code or Sonobi Placement id for slot ".concat(e.bidId, " is invalid"));
}),
n = {};
r.forEach(function (e) {
u(n, e);
});
var i = {
key_maker: JSON.stringify(n),
ref: t.refererInfo.referer,
s: Object(y.generateUUID)(),
pv: l,
vp: v(),
lib_name: "prebid",
lib_v: "3.23.0",
us: 0
};
c.b.getConfig("userSync") && c.b.getConfig("userSync").syncsPerBidder && (i.us = c.b.getConfig("userSync").syncsPerBidder), d.a.canBidderRegisterSync("iframe", b) ? i.ius = 1 : i.ius = 0, Object(y.deepAccess)(e[0], "params.hfa") && (i.hfa = Object(y.deepAccess)(e[0], "params.hfa")), e[0].params.referrer && (i.ref = e[0].params.referrer), t && t.gdprConsent && (i.gdpr = t.gdprConsent.gdprApplies ? "true" : "false", t.gdprConsent.consentString && (i.consent_string = t.gdprConsent.consentString));
var s = function (t) {
var e = function () {
var e = window.DigiTrust && (c.b.getConfig("digiTrustId") || window.DigiTrust.getUser({
member: t
}));
return e && e.success && e.identity || null;
}();
if (!e || e.privacy && e.privacy.optout) return null;
return e;
}("fhnS5drwmH");
s && (i.digid = s.id, i.digkeyv = s.keyv), e[0].schain && (i.schain = JSON.stringify(e[0].schain)), Object(y.deepAccess)(e[0], "userId") && 0 < Object.keys(e[0].userId).length && (i.userid = JSON.stringify(e[0].userId));
var o = e[0].params.keywords;
if (o && (i.kw = o), t && t.uspConsent && (i.us_privacy = t.uspConsent), Object(y.isEmpty)(n)) return null;
var a = "https://apex.go.sonobi.com/trinity.json";
return Object(y.deepAccess)(e[0], "params.bid_request_url") && (a = Object(y.deepAccess)(e[0], "params.bid_request_url")), {
method: "GET",
url: a,
withCredentials: !0,
data: i,
bidderRequests: e
};
},
interpretResponse: function interpretResponse(e, l) {
var f = e.body,
m = [],
v = l.data.ref;
return 0 === Object.keys(f.slots).length || Object.keys(f.slots).forEach(function (e) {
var t = f.slots[e],
r = e.split("|").slice(-1)[0],
n = function (e, t) {
for (var r = 0; r < e.length; r++) {
if (e[r].bidId === t) return e[r];
}
}(l.bidderRequests, r),
i = null;
"video" === t.sbi_ct && (i = "video"https://slate.com/,"outstream" === Object(y.deepAccess)(n, "mediaTypes.video.context") && (i = "outstream"));
var s,
o,
a,
c,
d,
u,
p,
b = j(i, v);
t.sbi_aid && t.sbi_mouse && t.sbi_size && (a = void 0 === (o = (s = h(t.sbi_size.split("x"), 2))[0]) ? 1 : o, d = void 0 === (c = s[1]) ? 1 : c, u = {
requestId: r,
cpm: Number(t.sbi_mouse),
width: Number(a),
height: Number(d),
ad: b(f.sbi_dc, t.sbi_aid),
ttl: 500,
creativeId: t.sbi_crid || t.sbi_aid,
aid: t.sbi_aid,
netRevenue: !0,
currency: "USD"
}, t.sbi_dozer && (u.dealId = t.sbi_dozer), "video" === i ? (u.mediaType = "video", u.vastUrl = b(f.sbi_dc, t.sbi_aid), delete u.ad, delete u.width, delete u.height) : "outstream" === i && n && (u.mediaType = "video", u.vastUrl = b(f.sbi_dc, t.sbi_aid), u.renderer = function (e, t) {
var r = 2 < arguments.length && void 0 !== arguments[2] ? arguments[2] : {},
n = g.a.install({
id: t.aid,
url: "https://mtrx.go.sonobi.com/sbi_outstream_renderer.js",
config: r,
loaded: !1,
adUnitCode: e
});
try {
n.setRender(O);
} catch (e) {
Object(y.logWarn)("Prebid Error calling setRender on renderer", e);
}
return n.setEventHandlers({
impression: function impression() {
return Object(y.logMessage)("Sonobi outstream video impression event");
},
loaded: function loaded() {
return Object(y.logMessage)("Sonobi outstream video loaded event");
},
ended: function ended() {
Object(y.logMessage)("Sonobi outstream renderer video event");
}
}), n;
}(n.adUnitCode, u, Object(y.deepAccess)(n, "renderer.options")), p = Object(y.deepAccess)(n, "params.sizes"), Array.isArray(p) && Array.isArray(p[0]) && (p = p[0]), p && (u.width = p[0], u.height = p[1])), m.push(u));
}), m;
},
getUserSyncs: function getUserSyncs(e, t) {
var r = [];
try {
e.pixelEnabled && t[0].body.sbi_px.forEach(function (e) {
r.push({
type: e.type,
url: e.url
});
});
} catch (e) {}
return r;
}
};
function f(e) {
return Object(y.deepAccess)(e, "mediaTypes.video") ? "" : e.params.sizes ? Object(y.parseSizesInput)(e.params.sizes).join(",") : Object(y.deepAccess)(e, "mediaTypes.banner.sizes") ? Object(y.parseSizesInput)(Object(y.deepAccess)(e, "mediaTypes.banner.sizes")).join(",") : e.sizes ? Object(y.parseSizesInput)(e.sizes).join(",") : void 0;
}
function m(e) {
return e.params.floor ? "|f=".concat(e.params.floor) : "";
}
var j = function j(i, s) {
return function (e, t) {
return "video" === i || "outstream" === i ? (r = t, n = s, "https://".concat(e, "apex.go.sonobi.com/vast.xml?vid=").concat(r, "&ref=").concat(encodeURIComponent(n))) : '‘;
var r, n;
};
};
var a = function a(e) {
var r = 0 < arguments.length && void 0 !== e ? e : window;
return function () {
var e = 0 < arguments.length && void 0 !== arguments[0] ? arguments[0] : 0,
t = 1 < arguments.length && void 0 !== arguments[1] ? arguments[1] : Number.MAX_SAFE_INTEGER;
return r.innerWidth >= e && r.innerWidth < t;
};
};
function v() {
var e = 0 < arguments.length && void 0 !== arguments[0] ? arguments[0] : window,
t = a(e),
r = 992,
n = 768;
return t(0, 768) ? "mobile" : t(n, r) ? "tablet" : "desktop";
}
function O(i) {
i.renderer.push(function () {
var e = h(i.getSize().split("x"), 2),
t = e[0],
r = e[1],
n = new window.SbiOutstreamRenderer();
n.init({
vastUrl: i.vastUrl,
height: r,
width: t
}), n.setRootElement(i.adUnitCode);
});
}
Object(n.registerBidder)(o);
}
}, [719]);
pbjsChunk([85], {
741: function _(e, r, t) {
e.exports = t(742);
},
742: function _(e, r, t) {
"use strict";
Object.defineProperty(r, "__esModule", {
value: !0
}), t.d(r, "spec", function () {
return n;
});
var a = t(1),
d = t(0),
p = 12,
o = 11,
c = 0,
u = 22,
n = {
code: "teads",
supportedMediaTypes: ["video"https://slate.com/,"banner"],
isBidRequestValid: function isBidRequestValid(e) {
var r,
t,
a = !1;
return void 0 !== e.params && (r = i(d.getValue(e.params, "placementId")), t = i(d.getValue(e.params, "pageId")), a = r && t), a || d.logError("Teads placementId and pageId parameters are required. Bid aborted."), a;
},
buildRequests: function buildRequests(e, r) {
var t = e.map(I),
a = {
referrer: function (e) {
var r = "";
e && e.refererInfo && e.refererInfo.referer && (r = e.refererInfo.referer);
return r;
}(r),
data: t,
deviceWidth: screen.width,
hb_version: "3.23.0"
};
e[0].schain && (a.schain = e[0].schain);
var n,
d,
i,
s = r.gdprConsent;
return r && s && (n = "boolean" == typeof s.gdprApplies, d = "string" == typeof s.consentString, i = n ? function (e, r, t) {
var a = p;
e ? function (e, r) {
return e && 1 === r ? e.hasGlobalScope || e.hasGlobalConsent : !(!e || 2 !== r) && !e.isServiceSpecific;
}(r, t) && (a = o) : a = c;
return a;
}(s.gdprApplies, s.vendorData, s.apiVersion) : u, a.gdpr_iab = {
consent: d ? s.consentString : "",
status: i,
apiVersion: s.apiVersion
}), r && r.uspConsent && (a.us_privacy = r.uspConsent), {
method: "POST",
url: "https://a.teads.tv/hb/bid-request",
data: JSON.stringify(a)
};
},
interpretResponse: function interpretResponse(e) {
var t = [];
return (e = e.body).responses && e.responses.forEach(function (e) {
var r = {
cpm: e.cpm,
width: e.width,
height: e.height,
currency: e.currency,
netRevenue: !0,
ttl: e.ttl,
ad: e.ad,
requestId: e.bidId,
creativeId: e.creativeId,
placementId: e.placementId
};
e.dealId && (r.dealId = e.dealId), t.push(r);
}), t;
}
};
function I(e) {
var r,
t = {},
a = d.getValue(e.params, "placementId"),
n = d.getValue(e.params, "pageId");
return t.sizes = (r = e, d.parseSizesInput(function (e) {
var r = d.deepAccess(e, "mediaTypes.video.playerSize"),
t = d.deepAccess(e, "mediaTypes.video.sizes"),
a = d.deepAccess(e, "mediaTypes.banner.sizes");
return d.isArray(a) || d.isArray(r) || d.isArray(t) ? [a, t, r].reduce(function (r, e) {
return d.isArray(e) && (d.isArray(e[0]) ? e.forEach(function (e) {
r.push(e);
}) : r.push(e)), r;
}, []) : e.sizes;
}(r))), t.bidId = d.getBidIdParameter("bidId", e), t.bidderRequestId = d.getBidIdParameter("bidderRequestId", e), t.placementId = parseInt(a, 10), t.pageId = parseInt(n, 10), t.adUnitCode = d.getBidIdParameter("adUnitCode", e), t.auctionId = d.getBidIdParameter("auctionId", e), t.transactionId = d.getBidIdParameter("transactionId", e), t;
}
function i(e) {
return 0 < parseInt(e);
}
Object(a.registerBidder)(n);
}
}, [741]);
pbjsChunk([76], {
761: function _(r, e, t) {
r.exports = t(762);
},
762: function _(r, e, t) {
"use strict";
Object.defineProperty(e, "__esModule", {
value: !0
}), t.d(e, "tripleliftAdapterSpec", function () {
return s;
});
var n = t(2),
i = t(1),
o = t(0),
u = t(3);
function p(r) {
return function (r) {
if (Array.isArray(r)) return d(r);
}(r) || function (r) {
if ("undefined" != typeof Symbol && Symbol.iterator in Object(r)) return Array.from(r);
}(r) || function (r, e) {
if (!r) return;
if ("string" == typeof r) return d(r, e);
var t = Object.prototype.toString.call(r).slice(8, -1);
"Object" === t && r.constructor && (t = r.constructor.name);
if ("Map" === t || "Set" === t) return Array.from(r);
if ("Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)) return d(r, e);
}(r) || function () {
throw new TypeError("Invalid attempt to spread non-iterable instance.nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
}();
}
function d(r, e) {
(null == e || e > r.length) && (e = r.length);
for (var t = 0, n = new Array(e); t < e; t++) {
n[t] = r[t];
}
return n;
}
var a = !0,
c = null,
s = {
code: "triplelift",
supportedMediaTypes: [n.b],
isBidRequestValid: function isBidRequestValid(r) {
return void 0 !== r.params.inventoryCode;
},
buildRequests: function buildRequests(r, e) {
var t,
n = "https://tlx.3lift.com/header/auction?",
i = function (r) {
var e = {},
t = r[0].schain;
e.imp = r.map(function (r, e) {
return {
id: e,
tagid: r.params.inventoryCode,
floor: r.params.floor,
banner: {
format: r.sizes.filter(l).map(function (r) {
return {
w: r[0],
h: r[1]
};
})
}
};
});
var n = [].concat(p(function (r) {
return f(r, "tdid"https://slate.com/,"adserver.org"https://slate.com/,"TDID");
}(r)), p(function (r) {
return f(r, "idl_env"https://slate.com/,"liveramp.com"https://slate.com/,"idl");
}(r)), p(function (r) {
return f(r, "criteoId"https://slate.com/,"criteo.com"https://slate.com/,"criteoId");
}(r)));
0 < n.length && (e.user = {
ext: {
eids: n
}
});
t && (e.ext = {
schain: t
});
return e;
}(r);
return n = o.tryAppendQueryString(n, "lib"https://slate.com/,"prebid"), n = o.tryAppendQueryString(n, "v"https://slate.com/,"3.23.0"), e && e.refererInfo && (t = e.refererInfo.referer, n = o.tryAppendQueryString(n, "referrer", t)), e && e.timeout && (n = o.tryAppendQueryString(n, "tmax", e.timeout)), e && e.gdprConsent && (void 0 !== e.gdprConsent.gdprApplies && (a = e.gdprConsent.gdprApplies, n = o.tryAppendQueryString(n, "gdpr", a.toString())), void 0 !== e.gdprConsent.consentString && (c = e.gdprConsent.consentString, n = o.tryAppendQueryString(n, "cmp_cs", c))), e && e.uspConsent && (n = o.tryAppendQueryString(n, "us_privacy", e.uspConsent)), !0 === u.b.getConfig("coppa") && (n = o.tryAppendQueryString(n, "coppa", !0)), n.lastIndexOf("&") === n.length - 1 && (n = n.substring(0, n.length - 1)), o.logMessage("tlCall request built: " + n), {
method: "POST",
url: n,
data: i,
bidderRequest: e
};
},
interpretResponse: function interpretResponse(r, e) {
var t = e.bidderRequest;
return (r.body.bids || []).map(function (r) {
return function (r, e) {
var t = {},
n = e.width || 1,
i = e.height || 1,
u = e.deal_id || "",
o = e.crid || "";
0 != e.cpm && e.ad && (t = {
requestId: r.bids[e.imp_id].bidId,
cpm: e.cpm,
width: n,
height: i,
netRevenue: !0,
ad: e.ad,
creativeId: o,
dealId: u,
currency: "USD",
ttl: 300,
tl_source: e.tl_source
});
return t;
}(t, r);
});
},
getUserSyncs: function getUserSyncs(r, e, t, n) {
var i = function (r) {
if (!r) return;
if (r.iframeEnabled) return "iframe";
if (r.pixelEnabled) return "image";
}(r);
if (i) {
var u = "https://eb2.3lift.com/sync?";
return "image" === i && (u = o.tryAppendQueryString(u, "px", 1), u = o.tryAppendQueryString(u, "src"https://slate.com/,"prebid")), null !== c && (u = o.tryAppendQueryString(u, "gdpr", a), u = o.tryAppendQueryString(u, "cmp_cs", c)), n && (u = o.tryAppendQueryString(u, "us_privacy", n)), [{
type: i,
url: u
}];
}
}
};
function f(r, e, t, n) {
return r.map((o = e, function (r) {
return r && r.userId && r.userId[o];
})).filter(function (r) {
return !!r;
}).map((i = t, u = n, function (r) {
return {
source: i,
uids: [{
id: r,
ext: {
rtiPartner: u
}
}]
};
}));
var i, u, o;
}
function l(r) {
return 2 === r.length && "number" == typeof r[0] && "number" == typeof r[1];
}
Object(i.registerBidder)(s);
}
}, [761]);
pbjsChunk([75], {
763: function _(e, r, t) {
e.exports = t(764);
},
764: function _(e, r, t) {
"use strict";
Object.defineProperty(r, "__esModule", {
value: !0
}), t.d(r, "spec", function () {
return v;
});
var m = t(0),
s = t(1),
o = t(10),
c = t(2),
f = "Bid from response has no auid parameter - ",
l = "Bid from response has no adm parameter - ",
p = "Array of bid objects is empty",
g = "Can't find in requested bids the bid with auid - ",
u = "Seatbid array from response has empty item",
y = "Response is empty",
b = "Response has empty seatbid array",
h = "Seatbid from response has no array of bid objects - ",
v = {
code: "trustx",
supportedMediaTypes: [c.b, c.d],
isBidRequestValid: function isBidRequestValid(e) {
return !!e.params.uid;
},
buildRequests: function buildRequests(e, r) {
var a,
o,
p = [],
u = {},
c = {},
f = {},
l = "net";
(e || []).forEach(function (e) {
"gross" === e.params.priceType && (l = "gross"), o = e.bidderRequestId;
var r = e.params.uid,
t = e.adUnitCode;
p.push(r);
var s,
n = m.parseSizesInput(e.sizes);
a || m.isEmpty(e.params.keywords) || (0 < (s = m.transformBidderParamKeywords(e.params.keywords)).length && s.forEach(E), a = s), c[r] || (c[r] = {});
var d = c[r];
d[t] ? d[t].bids.push(e) : d[t] = {
adUnitCode: t,
bids: [e],
parents: []
};
var i = d[t];
n.forEach(function (e) {
f[e] = !0, u[r] || (u[r] = {}), u[r][e] ? u[r][e].push(i) : u[r][e] = [i], i.parents.push({
parent: u[r],
key: e,
uid: r
});
});
});
var t = {
pt: l,
auids: p.join(","),
sizes: m.getKeys(f).join(","),
r: o,
wrapperType: "Prebid_js",
wrapperVersion: "3.23.0"
};
return a && (t.keywords = JSON.stringify(a)), r && (r.refererInfo && r.refererInfo.referer && (t.u = r.refererInfo.referer), r.timeout && (t.wtimeout = r.timeout), r.gdprConsent && (r.gdprConsent.consentString && (t.gdpr_consent = r.gdprConsent.consentString), t.gdpr_applies = "boolean" == typeof r.gdprConsent.gdprApplies ? Number(r.gdprConsent.gdprApplies) : 1), r.uspConsent && (t.us_privacy = r.uspConsent)), {
method: "GET",
url: "https://sofia.trustx.org/hb",
data: m.parseQueryStringParameters(t).replace(/&$/, ""),
bidsMap: u
};
},
interpretResponse: function interpretResponse(e, r, t) {
var s = 2 < arguments.length && void 0 !== t ? t : o.a;
e = e && e.body;
var n,
d = [],
i = r.bidsMap,
a = r.data.pt;
return e ? e.seatbid && !e.seatbid.length && (n = b) : n = y, !n && e.seatbid && e.seatbid.forEach(function (e) {
!function (e, d, r, t, s) {
if (!e) return;
var n;
e.auid || (n = f + JSON.stringify(e));
{
var i, a, o, p, u;
e.adm ? (i = d[e.auid]) ? (a = "".concat(e.w, "x").concat(e.h), i[a] && (o = i[a][0], p = o.bids.shift(), u = {
requestId: p.bidId,
bidderCode: v.code,
cpm: e.price,
width: e.w,
height: e.h,
creativeId: e.auid,
currency: "USD",
netRevenue: "gross" !== r,
ttl: 360,
dealId: e.dealid
}, "video" === e.content_type ? (u.vastXml = e.adm, u.mediaType = c.d, u.adResponse = {
content: u.vastXml
}, p.renderer || p.mediaTypes && p.mediaTypes.video && "outstream" !== p.mediaTypes.video.context || (u.renderer = function (e, r) {
var t = r.install({
id: e.id,
url: e.url,
loaded: !1
});
try {
t.setRender(w);
} catch (e) {
m.logWarn("Prebid Error calling setRender on renderer", e);
}
return t;
}({
id: p.bidId,
url: "https://acdn.adnxs.com/video/outstream/ANOutstreamVideo.js"
}, s))) : (u.ad = e.adm, u.mediaType = c.b), t.push(u), o.bids.length || o.parents.forEach(function (e) {
var r = e.parent,
t = e.key,
s = e.uid,
n = r[t].indexOf(o);
-1 < n && r[t].splice(n, 1), r[t].length || (delete r[t], m.getKeys(r).length || delete d[s]);
}))) : n = g + e.auid : n = l + JSON.stringify(e);
}
n && m.logError(n);
}(function (e) {
e ? e.bid ? e.bid[0] || m.logError(p) : m.logError(h + JSON.stringify(e)) : m.logError(u);
return e && e.bid && e.bid[0];
}(e), i, a, d, s);
}), n && m.logError(n), d;
},
getUserSyncs: function getUserSyncs(e) {
if (e.pixelEnabled) return [{
type: "image",
url: "https://sofia.trustx.org/push_sync"
}];
}
};
function E(e) {
var r;
r = e.value, m.isArray(r) && 0 < r.length && "" === e.value[0] && delete e.value;
}
function w(e) {
e.renderer.push(function () {
window.ANOutstreamVideo.renderAd({
targetId: e.adUnitCode,
adResponse: e.adResponse
});
});
}
Object(s.registerBidder)(v);
}
}, [763]);
pbjs.processQueue();
}, {}];
window.modules["via.legacy"] = [function(require,module,exports){"use strict";
DS.service("via", function () {
"use strict"; // remove `via` from url, to be used after amplitude logs it to prevent users from sharing such urls
function removeFromLocation() {
var url = new URL(location.href);
url.searchParams.delete("via");
history.replaceState(null, "", url.toString());
} // and add `via` param to any outbound links
function addViaToUrl(href, via) {
if (!href || href.substr(0, 1) === "#") {
return href; // don't add to jumps on the current page, e.g. "Skip to main content"
}
var url = new URL(href);
var apexDomain = new URL(location.href).hostname.split(".").slice(-2).join(".");
if (url.hostname.indexOf(apexDomain) === -1) {
return href; // don't add it to external links
}
url.searchParams.set("via", via);
return url.toString();
} // keys correspond to "page_types" in editable_components.yml
var PREFIXES = {
article: "article",
homepage: "homepage",
"vertical front": "section",
"rubric front": "rubric"
};
var pageType;
function setPageType(amplitudePageType) {
pageType = PREFIXES[amplitudePageType];
}
var DELIMITER = "_";
function concatVia(node, via) {
var tag = node.dataset && node.dataset.via;
if (tag) {
via = (via.length ? tag + DELIMITER : tag) + via;
}
return via;
}
function addToClickedLinks() {
document.documentElement.addEventListener("click", function (e) {
var a;
var via = ""; // detect link nodes and collect via directives to append to the href
var node = e.target; // the element where this event originated may have been removed from the dom, e.g. in the case of the OIL CMP which disappears after you interact with it
while (node && node !== e.currentTarget) {
if (node.tagName === "A") {
a = node;
}
via = concatVia(node, via);
node = node.parentNode;
}
if (a && via) {
if (pageType) {
via = pageType + DELIMITER + via;
}
a.href = addViaToUrl(a.href, via);
}
});
}
function addToSubmittedForms() {
document.documentElement.addEventListener("submit", function (e) {
var form = e.target; // collect via directives
var via = "";
var node = e.target;
while (node !== e.currentTarget) {
via = concatVia(node, via);
node = node.parentNode;
}
if (via) {
if (pageType) {
via = pageType + DELIMITER + via;
} // dynamically create a hidden input for the form url
var input = document.createElement("input");
input.type = "hidden";
input.name = "via";
input.value = via;
form.appendChild(input);
}
});
} // start listening only once, when first injected
addToClickedLinks();
addToSubmittedForms();
return {
setPageType: setPageType,
removeFromLocation: removeFromLocation
};
});
}, {}];
window.modules["visibility.legacy"] = [function(require,module,exports){"use strict";
DS.service("$visibility", ["$document"https://slate.com/,"$window"https://slate.com/,"_throttle"https://slate.com/,"Eventify", function ($document, $window, _throttle, Eventify) {
var list = [],
Visible,
VisibleEvent;
/**
* @param {number} a
* @param {number} b
* @returns {*}
* @see http://jsperf.com/math-min-vs-if-condition-vs/8
*/
function min(a, b) {
return a < b ? a : b;
}
/**
* @param {number} a
* @param {number} b
* @returns {*}
* @see http://jsperf.com/math-min-vs-if-condition-vs/8
*/
function max(a, b) {
return a > b ? a : b;
}
/**
* Fast loop through watched elements
*/
function onScroll() {
list.forEach(updateVisibility);
}
/**
* updates seen property
* @param {Visble} item
* @param {{}} evt
* @fires Visible#shown
* @fires Visible#hidden
*/
function updateSeen(item, evt) {
var px = evt.visiblePx,
percent = evt.visiblePercent; // if some pixels are visible and we’re greater/equal to threshold
if (px && percent >= item.shownThreshold && !item.seen) {
item.seen = true;
setTimeout(function () {
item.trigger(“shown”, new VisibleEvent(“shown”, evt));
}, 15); // if no pixels or percent is less than threshold
} else if ((!px || percent < item.hiddenThreshold) && item.seen) {
item.seen = false;
setTimeout(function () {
item.trigger("hidden", new VisibleEvent("hidden", evt));
}, 15);
}
}
/**
* sets preload property
* @param {Visible} item
* @param {{}} evt
* @param {Number} innerHeight
* @fires Visible#preload
*/
function updatePreload(item, evt, innerHeight) {
if (!item.preload && item.preloadThreshhold && shouldBePreloaded(evt.target, evt.rect, item.preloadThreshhold, innerHeight)) {
item.preload = true;
setTimeout(function () {
item.trigger("preload", new VisibleEvent("preload", evt));
}, 15);
}
}
/**
* Trigger events
* @param {Visible} item
*/
function updateVisibility(item) {
var rect = item.el.getBoundingClientRect(),
innerHeight = $window.innerHeight || $document.documentElement.clientHeight,
px = getVerticallyVisiblePixels(rect, innerHeight),
percent = px / (rect.height || innerHeight),
evt = {
target: item.el,
rect: rect,
visiblePx: px,
visiblePercent: percent
};
updateSeen(item, evt);
updatePreload(item, evt, innerHeight);
}
/**
* Return normalized viewport height
* @return {number}
*/
function getViewportHeight() {
return $window.innerHeight || $document.documentElement.clientHeight || $document.body.clientHeight;
}
/**
* Return normalized viewport width
* @return {number}
*/
function getViewportWidth() {
return $window.innerWidth || $document.documentElement.clientWidth || $document.body.clientWidth;
}
/**
* make sure an element isn't hidden by styles or etc
* @param {Element} el
* @return {Boolean}
*/
function isElementNotHidden(el) {
return el && el.offsetParent !== null && !el.getAttribute("hidden") && getComputedStyle(el).display !== "none" && getComputedStyle(el).visibility !== "hidden";
}
/**
* Apparently the fastest way...
* @param {Element} el
* @returns {boolean}
* @example if (!$visibility.isElementInViewport(el)) { ... }
*/
function isElementInViewport(el) {
var rect = el.getBoundingClientRect();
return rect.top >= 0 && rect.left >= 0 && rect.bottom <= ($window.innerHeight || $document.documentElement.clientHeight) && rect.right <= ($window.innerWidth || $document.documentElement.clientWidth);
}
/**
* @param {Element} el
* @param {ClientRect} rect
* @param {Number} preloadThreshhold
* @param {Number} innerHeight
* @return {Boolean}
*/
function shouldBePreloaded(el, rect, preloadThreshhold, innerHeight) {
return rect.top <= innerHeight + preloadThreshhold && isElementNotHidden(el);
}
/**
* Create a one-dimensional spacial hash of x
* @param {number} x
* @param {number} stepSize
* @param {number} optimalK
* @param {number} base
* @return {number}
*/
function getLinearSpacialHash(x, stepSize, optimalK, base) {
var index = Math.floor(x / (stepSize || 1)),
remainder = x % stepSize,
result = index.toString(base);
if (optimalK > 1) {
result += getLinearSpacialHash(remainder, Math.floor(stepSize / base), optimalK – 1, base);
}
return result;
}
/**
* @param {ClientRect} rect
* @param {number} innerHeight
* @returns {number}
*/
function getVerticallyVisiblePixels(rect, innerHeight) {
return min(innerHeight, max(rect.bottom, 0)) – min(max(rect.top, 0), innerHeight);
}
/**
* Get offset of element relative to entire page
*
* @param {Element} el
* @returns {{left: number, top: number}}
* @see http://jsperf.com/offset-vs-getboundingclientrect/7
*/
function getPageOffset(el) {
var offsetLeft = el.offsetLeft,
offsetTop = el.offsetTop;
while (el = el.offsetParent) {
offsetLeft += el.offsetLeft;
offsetTop += el.offsetTop;
}
return {
left: offsetLeft,
top: offsetTop
};
}
/**
* Create a new Visible class to observe when elements enter and leave the viewport
*
* Call destroy function to stop listening (this is until we have better support for watching for Node Removal)
* @param {Element} el
* @param {{shownThreshold: number, hiddenThreshold: number}} [options]
* @class
* @example this.visible = new $visibility.Visible(el);
*/
Visible = function Visible(el, options) {
options = options || {};
this.el = el;
this.seen = false;
this.preload = false;
this.preloadThreshhold = options && options.preloadThreshhold || 0;
this.shownThreshold = options && options.shownThreshold || 0;
this.hiddenThreshold = options && min(options.shownThreshold, options.hiddenThreshold) || 0;
list.push(this);
updateVisibility(this); // set immediately to visible or not
};
Visible.prototype = {
/**
* Stop triggering.
*/
destroy: function destroy() {
// remove from list
list.splice(list.indexOf(this), 1);
}
/**
* @name Visible#on
* @function
* @param {‘shown’|’hidden’} e EventName
* @param {function} cb Callback
*/
/**
* @name Visible#trigger
* @function
* @param {‘shown’|’hidden’} e
* @param {{}}
*/
};
Eventify.enable(Visible.prototype);
VisibleEvent = function VisibleEvent(type, options) {
var _this = this;
this.type = type;
Object.keys(options).forEach(function (key) {
_this[key] = options[key];
});
}; // listen for scroll events (throttled)
$document.addEventListener(“scroll”, _throttle(onScroll, 200)); // public
this.getPageOffset = getPageOffset;
this.getLinearSpacialHash = getLinearSpacialHash;
this.getVerticallyVisiblePixels = getVerticallyVisiblePixels;
this.getViewportHeight = getViewportHeight;
this.getViewportWidth = getViewportWidth;
this.isElementNotHidden = isElementNotHidden;
this.isElementInViewport = isElementInViewport;
this.Visible = Visible;
}]);
}, {}];
require=(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==”function”&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(“Cannot find module ‘”+o+”‘”);throw f.code=”MODULE_NOT_FOUND”,f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==”function”&&require;for(var o=0;o
[ad_2]
Source link