CM – How Jack Antonoff found this magical moment of musical clarity

0

Since we founded Switched on Pop in 2014, we have had countless hours of conversation with artists like Taylor Swift, Lorde and Lana Del Ray, who were voiced by Jack Antonoff’s production work. When we were writing a book about 21st century pop, we dedicated a chapter to the song “We Are Young” by his band Fun. He’s been one of the artists we wanted to interview the most for seven years – so we finally sat down with him on a new album by his band Bleachers called Take the Sadness Out of Saturday Night to find out how he got on with his own work

Charlie Harding: It feels like you’re working something out on the sixth track on the album, “Stop Making This Hurt”. Can you bring us into your way of thinking about this song? The idea of ​​working out something is a trademark for me. When I know something in my work, it’s pretty hard to write about. That is why there are so few songs about how events unfolded. I have all the facts. The same is true for me. I know certain things about myself and they are profound and important, but I don’t feel the need to explore them. The things that make me write are when I feel something that scares me or fills me with joy or mystery. These are the things you write about because you want to find out.

My work can feel like a journal entry. It’s still all about me, but I use that as a device. This time I started looking around and saw so many people in my life struggling to keep joy and that terror in order to want a better life. I had this idea – « stop hurting this, say goodbye as you mean » – on my mind forever. And I didn’t know where to go.

But then I just started taking it apart. There is Daniel, my best friend. And there is Jimmy who is Lana (Del Ray). There is my father. The second verse is about my mother and sister and the political climate and just gave a brief overview of how everyone is in their own little mess. And then I’ll be the narrator who says, « Stop hurting this and say goodbye as you mean. » So you think, « Fuck it, we have to exist and find joy. »

Charlie: Your music transports me to a certain place and time every time I hear it. Is there a certain space this song allows for you? References are good because they can give you armor to help you get down to earth. I remember moments when I think of the phrasing of Dexys Midnight Runners or Talking Heads or Tom Tom Club or the way Television recorded the drums. You start in these places because it can be too scary to just say, « It’s going to be great, so I’ll do it. » You have to have a language. But then you shed it pretty quickly. When I feel like something is done or done, I just hear myself in it.

And that’s how I got this song, and it quickly litigates all the characters in my life with that gospel-like chorus, casts judgment and Hope and then hits all the way over the bridge, where I realized: this is kind of the journey. I want to hear the band. I want it to sound like the drummer is flying off the cliff. I want the horns to go back and forth on the bar to feel like some drunk guys playing better than anyone else. So you have all of these things. And then you just wait until you hear yourself in it. You wait until you hear the thing that scares you a little.

Nate Sloan: The music video is set in a diner in New Jersey. Yet you sing about breaking free from New Jersey. Can you tell us about this relationship? There is love for Jersey but the need to break free. Where is your home in this song? It’s a complicated place. The root of it all is that I’m just drifting more and more to where I come from. The place you come from is so deep in the way you write and how you see the world. And it’s not about nostalgia. It’s not about going back. It’s about recognizing where you’re reporting from. A perfect example of this is when you think of New York City Music. When you think about how the Strokes sound like they’re reporting from the center of the world. When you think of the music from New Jersey, it’s coverage from an inch out of the center of the world.

I started to see these parallels, how I feel, where I’m from, how I grew up and how I feel out there, but not there. One of the opening lines of the album reads, « I’m here, but I’m not. » Jersey is a special place because the people from there don’t have a small town mentality. It’s just an inch away from the world’s biggest and best city mentality. And how does that feel as a child? There’s a lot of Springsteen in the sense that when I was young when I heard Bruce’s music I first said, “Oh, not only do I know the little landmarks he’s talking about, I know that feeling. “And it made me proud of this place. That gets me out of here, I’m not going to die here melancholy with great hope. It’s a culture.

It’s that mix of deep melancholy because you’re not invited because you’re not in the mood – and then deep hope because you want to be there. It’s the opposite of New York City music, which is a lot less hopeful, but like two fingers up, welcome to the center of the world.

Charlie: You often quote Bruce Springsteen’s songwriting tips from « Blues in Verse, Gospel. » in the chorus « . You have to work with Bruce on the song « Chinatown » for this album. How did that come about? It was very organic. There’s no world where I could have said, « I want to do a song with Bruce » and then sit down and find out that song. He and his wife Patti are very important people in my life. I was there one day and we were playing music to each other. And I had the demo of Chinatown and they have a studio right there. So we’re all in the studio. Everyone tinkered with it. I didn’t think about it much until I listened a few days later. He was singing in the chorus and I thought, Jesus, this really works.

Charlie: The album is live quality. Was there anything you wanted to achieve for the sound of this album? Yeah, that’s the big pandemic story for me. I’ve always been in this group, playing live and making records, and I’ve always liked doing live stuff, but I never felt like, oh, the record has to sound like the show. They are very different expressions, and they should be. All that really matters, all you can get your hands on is that you can go out, run your ass, and find your audience. And when you find your audience, you can be with them and you can grow and that audience can grow. But if you focus on it, that’s the deepest version of that work. So there was never a feeling that that could ever go away.

Obviously, for many reasons, the pandemic was incredibly emotional and harsh on everyone. But in my corner of the world there was one thing that was wild: Oh, you can take that off the table. So this feeling arose: I wanted the band in the room. I said to my band: « Hey, play like your head is on fire – play like it’s your last day on earth. » These words hit quite differently than we actually knew when or if we would play again. So a lot of the sound of this album, especially “How Dare You Want More”, is that the guys in the room play with it knowing that we don’t know when or how it will ever be that way again.

Charlie: You could say, “Jack is a real traditionalist. He records albums. He focuses on projects. He records organic instruments. He makes references that don’t necessarily point to things that are happening. ”But you seem to feel that this is clearly the best way to produce music, both for the arts and for its commercial nature. I think you are right. I’m not cordoned off in some crazy traditional place. I’m pretty aware of everything that’s going on because I think it’s important to be. There is a difference between reaction and conversation. A few years ago I started hearing all these electronic things that I loved everywhere. And then I would sit down and make music. That was the beginning of the phase when I was doing Norman Fucking Rockwell with Lana, where we both thought, man, those sloppy live room drums and that 12-string sound so cool. It wasn’t like, fuck everyone. It’s a natural thing.

And you see, production is a whole universe, and it’s fascinating and beautiful, but at the end of the day it’s inferior to that feeling that it should be designed, right? You could intellectualize and talk about why, how, what you are using. At the end of the day it just doesn’t matter because the sum should be so much more than the parts.

Nate: It’s a fascinating glimpse into the gap between the creative process and then the id and the ego. The creative process, and turning it into something that can be analyzed and discussed instead of just having it. That’s the line we keep walking on this show where we ask, « Are we reading too far? » No, it’s designed that way. All of these things should be small worlds for themselves and read into them. Every Easter egg is likely real. And if not, then because I see writing and producing as two phases.

There is the search to find it, an almost free association between production and writing. And then, at some point you see the frame of the album, and as soon as you see that, it’s stage two and it’s instant and it hits you. Usually when I work with people, you’re so attuned to each other that it hits you at the same time. “Oh my god, that’s it, these are the through lines. That is the tone. So this sound is connected to this emotion. Blah, blah, blah. « And that’s actually the harder phase because then you know what it is, and you know what’s missing, and you know how to end it.

The reason I do this Mention is that these two processes leave little room to meditate on what is happening. All of this happens afterwards. There are so many lightning bolts in a bottle, if you are just trying to come up with ideas, there is nothing to talk about You just throw things against the wall and think, Huh, that’s weird. That’s interesting. And then one day you wake up and you find yourself further than you thought you are. Then you think: Oh my god, we are in.

It was also this idea to leave New York, go to Jersey, go home, take home someone you love, go home to find the future. I saw it as something visual, I saw this door, myself with all this baggage, and I was obsessed with the idea that you don’t have everything can bear. You can’t leave it, all the pieces you take will determine your future. It was so easy for me to move in darkness and sadness, but I loved that knock on the door, the next phase of your life. Because I thought there was so much joy. There is so much joy in this concept, but also so much fear. And that’s exactly where I wanted to be.

Charlie: Could you describe that moment when I made this record? Yeah, I had Chinatown, 45, How Dare You Want More, and a song called Secret Life. And then it was when I started getting this song called “What Do I Do With All This Faith” which is the last song that I said, “Fuck, I get it”.

Already a subscriber?
Log in or link your magazine subscription

Already a subscriber?
Log in or link your magazine subscription

Already a subscriber?
Log in or link your magazine subscription

= 0? (u = f.substr (0, v), c = f.substr (v 1)) 🙁 u = f, c = «  »), i = decodeURIComponent (u), l = decodeURIComponent (c), hasOwnProperty (o, i)? isArray (o [i])? o [i] .push (l): o [i] = [o [i], l]: o [i] = l } return o}; var isArray = Array.isArray || function (r) {return « [Object-Array] » === Object.prototype.toString.call (r)};
}, {}];
window.modules [« 1189 »] = [function (require, module, exports) {« use strict »; var stringifyPrimitive = function (r) {switch (typeof r) {case « string »: return r; case « boolean » : return r? « true »: « false »; case « number »: return isFinite (r)? r: «  »; default: return «  »}}; module.exports = function (r, e, t, n) {return e = e || « & », t = t || « = », null === r&& (r = void 0), « object » == typeof r? map (objectKeys (r), function (n ) {var i = encodeURIComponent (stringifyPrimitive (n)) t; return isArray (r [n])? map (r [n], function (r) {return i encodeURIComponent (stringifyPrimitive (r))}). join (e ): i encodeURIComponent (stringifyPrimitive (r [n]))}). join (e): n? encodeURIComponent (stringifyPrimitive (n)) t encodeURIComponent (stringifyPrimitive (r)): «  »}; var isArray = Array.isArray | | function (r) {return « [object Array] » === Object.prototype.toString.call (r)}; function map (r, e) {if (r.map) return r.map (e); for (var t = [], n = 0; n0&&a [a.length-1]) && (6 === i [0] || 2 === i [0])) {o = 0; next} if (3 === i [0] && (! a || i [1]> a [0] &&i [1] « : » akbar-men « , » ∑ « : » majmou « , » ¤ « : » omla « }, az: {}, ca: { » ∆ « : » delta « , » ∞ « : » infinit « , » ♥ « : » amor « , » & « : » i « , » | « : » o « , » « : » mes que « , » ∑ « : » suma dels « , » ¤ « : » moneda « }, cz: { » ∆ « : » delta « , » ∞ « : » nekonecno « , » ♥  » : « laska », « & »: « a », « | »: « nebo », «  »: « vice jako », « ∑ »: « soucet », « ¤ »: « mena »}, de: { » ∆ « : » delta « , » ∞ « : » infinite « , » ♥ « : » Love « , » & « : » and « , » | « : » or « , » « : » greater than « , » ∑  » : « Sum of », « ¤ »: « Currency »}, dv: {« ∆ »: « delta », « ∞ »: « kolunulaa », « ♥ »: « loabi », « & »: « aai », « | »: « noonee », «  »: « ah vure bodu », « ∑ »: « jumula », « ¤ »: « faisaa »}, en: {« ∆ »: « delta », « ∞ »:  » infinite « , » ♥ « : » love « , » & « : » and « , » | « : » or « , » « : » greater than « , » ∑ « : » sum « , » ¤ « : » currency  » }, es: {« ∆ »: « delta », « ∞ »: « infinito », « ♥ »: « amor », « & »: « y », « | »: « u », «  »: « mas que « , » ∑ « : » suma de los « , » ¤ « : » moneda « }, fr: { » ∆ « : » delta « , » ∞ « : » infinite « , » ♥ « : » Amour « , » & « : » et « , » | « : » ou « , » « : » superieure a « , » ∑ « : » somme des « , » ¤ « : » monnaie « }, gr: {}, hu: { » ∆ « : » delta « , » ∞ « : » vegtelen « , » ♥ « : » szerelem « , » & « : » es « , » | « : » vagy « , » « : » nagyobb mint « , » ∑ « : » szu mma « , » ¤  » : « penznem »}, it: {« ∆ »: « delta », « ∞ »: « infinito », « ♥ »: « amore », « & »: « e », « | »: « o »,  » « : » maggiore di « , » ∑ « : » somma « , » ¤ « : » moneta « }, lt: {}, lv: { » ∆ « : » delta « , » ∞ « : » bezgaliba « , » ♥ « : » milestiba « , » & « : » un « , » | « : » vai « , » « : » lielaks neka « , » ∑ « : » summa « , » ¤ « : » valuta « }, my: { « ∆ »: « kwahkhyaet », « ∞ »: « asaonasme », « ♥ »: « akhyait », « & »: « nhin », « | »: « tho », «  »: « kyithaw », « ∑ » : « paungld », « ¤ »: « ngwekye »}, mk: {}, nl: {« ∆ »: « delta », « ∞ »: « oneindig », « ♥ »: « fielde », « & »: « en », « | »: « of », «  »: « groter dan », « ∑ »: « som », « ¤ »: « valuta »}, pl: {« ∆ »: « delta », « ∞ « : » nieskonczonosc « , » ♥ « : » milosc « , » & « : » i « , » | « : » lub « , » « : » wieksze niz « , » ∑ « : » suma « , » ¤ « : « waluta »}, pt: {« ∆ »: « delta », « ∞ »: « infinito », « ♥ »: « amor », « & »: « e », « | »: « ou », «  » : « maior que », « ∑ »: « soma », « ¤ »: « moeda »}, ro: {« ∆ »: « delta », « ∞ »: « infinite », « ♥ »: « dragoste », « & »: « si », « | »: « sau », «  »: « mai mare ca », « ∑ « : » suma « , » ¤ « : » valuta « }, ru: { » ∆ « : » delta « , » ∞ « : » beskonechno « , » ♥ « : » lubov « , » & « : » i « , « | »: « ili », «  »: « bolshe », « ∑ »: « summa », « ¤ »: « valjuta »}, sk: {« ∆ »: « delta », « ∞ »: « nekonecno » , « ♥ »: « laska », « & »: « a », « | »: « alebo », «  »: « viac ako », « ∑ »: « sucet », « ¤ »: « mena »}, sr: {}, tr: {« ∆ »: « delta », « ∞ »: « sonsuzluk », « ♥ »: « ask », « & »: « ve », « | »: « veya », «  » : « buyuktur », « ∑ »: « toplam », « ¤ »: « para birimi »}, uk: {« ∆ »: « delta », « ∞ »: « bezkinechnist », « ♥ »: « lubov », « & »: « i », « | »: « abo », «  »: « bilshe », « ∑ »: « suma », « ¤ »: « valjuta »}, vn: {« ∆ »: « delta » , « ∞ »: « vo cuc », « ♥ »: « yeu », « & »: « va », « | »: « hoac », «  »: « lon hon », « ∑ »: « tong », « ¤ »: « tien te »}}; if (« string »! = Typeof e) return «  »; if (« string » == typeof a&& (A = a), m = I.en, c = C. en, « object » == typeof a) for (g in n = a.maintainCase ||! 1, O = a.custom&& « object » == typeof a.custom? a.custom: O, u = a.truncate > 1&&a.truncate ||! 1, l = a.uric ||! 1, s = a.uricNoSlash ||! 1, r = a.mark ||! 1, S =! 1! == a.symbols&&! 1! == a.lang , A = a.separator || A, l&& (p = b.join («  »)), s&& (p = z.join («  »)), r&& (p = [« . », « ! »,  » ~ « , » * « , » ‘ », » (« , ») « ]. join ( » « )), m = a.lang&&I [a.lang] && S? I [a.lang]: S? I .en: {}, c = a.lang&&C [a.lang]? C [a.lang] :! 1 === a.lang ||! 0 == = a.lang? {}: C.en, a.titleCase&& « number » == typeof a.titleCase.length&&Array.prototype.toString.call (a.titleCase)? (a.titleCase.forEach (function (e) {O [e « } ») = e  » , t =! 0): t = !! a.titleCase, a.custom&& « number » == typeof a.custom.length&&Array.prototype.toString.call (a. custom) &&a.custom (e )ach (function.forEach) {O [e «  »] = e «  »}), Object.keys (O) .forEach (function (a) {var n; n = a.length> 1? New RegExp (« \ b » o (a ) « \ b », « gi »): new RegExp (o (a), « gi »), e = e.replace (n, O [a])}), O) p = g; for (p = o (p = A), f =! 1, y =! 1, d = 0, k = (e = e. replace (/ (^ s | s $) / g, «  »)). length; d = 0? (j = g, g = «  ») :! 0 === y? (g = U [j ] v [g], j = «  »): g = f&&v [g] .match (/ [A-Za-z0-9] /)? «  » v [g]: v [g], f =! 1 , y =! 1): g in U? (j = g, g = «  », d === k-1&& (g = U [j]), y =! 0) :! m [g] || l&&-1! == b.join («  ») .indexOf (g) || s&&-1! == z.join («  »). indexOf (g)? (! 0 === y? (g = U [j] g, j = «  », y =! 1): f&& (/ [A-Za-z0-9] /. Test (g) || E.substr (-1). match (/ A-Za-z0-9] /)) && (g = «  » g), f =! 1) 🙁 g = f || E.substr (-1) .match (/ [A-Za -z0-9] /)? A m [g]: m [g], g = void 0! == e [d 1] &&e [d 1] .match (/ [A-Za-z0-9] / )? A: «  », f =! 0), E = g.replace (new RegExp (« [^ \ w \ s » p « _-] », « g »), A); return t&& ( E = E.replace (/ ( w) ( S *) / g, function (e, a, n) {var t = a.toUpperCase () (null! == n? N: «  »); return Object.keys (O) .indexOf (t.toLowerCase ()) u&& (h = E.charAt (u) === A, E = E.slice (0, u), h || (E = E.slice (0, E.lastIndexOf (A)))), n || t || (E = E.toLowerCase ()), E}, t = function (e) {return function (a) {return n (a, e )}}, o = function (e) {return e.replace (/ [- \ ^ $ *?. () | [] {} /] / g, « \ $ & »)}, i = function (e, a) {for (var n in a) if (a [n] === e) return! 0}; if (« undefined »! = typeof module&&module.exports) module.exports = n, module .exports.createSlug = t; else if (« undefined »! = typeof define&&define.amd) define ([], function () {return n}); else try {if (e.getSlug || e.createSlug) throw  » Speakingurl: globals exists / (getSlug | c reateSlug) / « ; e.getSlug = n, e.createSlug = t} catch (e) {}} (this);
}, {}];
window.modules [« 1222 »] = [function (require, module, exports) {var namespace = « expire_mixin »; function expirePlugin () {var e = this.createStore (this.storage, null, this._namespacePrefix namespace); return {set: function (t, n, a, r) ​​{this.hasNamespace (namespace) || e.set (n, r); return t ()}, get: function (e, n) {this.hasNamespace (namespace) || t.call (this, n); return e ()}, remove: function (t, n) {this.hasNamespace (namespace) || e.remove (n); return t ()}, getExpiration: function (t, n) {return e.get (n)}, removeExpiredKeys: function (e) {var n = []; this.each (function (e, t) {n.push (t)}) ; for (var a = 0; a = 0; r -) {var l = localStorage (). key (r); e (read (l), l)}} function remove (e) {return localStorage () .removeItem (e)} function clearAll () {return localStorage (). clear ()} module.exports = {name: « localStorage », read: read, write: write, each: each, remove: remove, clearAll: clearAll };
}, {« 1224 »: 1224}];
window.modules [« 1226 »] = [function (require, module, exports) {module.exports = {name: « memoryStorage », read: read, write: write, each: each, remove: remove, clearAll: clearAll} ; var memoryStorage = {}; function read (e) {return memoryStorage [e]} function write (e, r) {memoryStorage [e] = r} function each (e) {for (var r in memoryStorage) memoryStorage.hasOwnProperty (r) &&e (memoryStorage [r], r)} function remove (e) {delete memoryStorage [e]} function clearAll (e) {memoryStorage = {}}
}, {}];
window.modules [« 1247 »] = [function (require, module, exports) {! function (e) {var t = function (e) {return new y (e)}; t.version = « 0.6.8 » , « undefined »! = typeof module&&module.exports? module.exports = t: « function » == typeof define&&define.amd? define (function () {return t}): e.typogr = t; var n = function (e , t) {return new RegExp (e, t)}, s = /] *> / i, r = t.amp = function (e) {var t = / ( s |) (& | & | & # 38;) ( s |) / g; if (e || « string » == typeof e) return e.replace (/ ()? ([^)? / G, function (e, n, r, a) {return a = a || «  », (n = n || «  »). match (s)? nra: n (r = r.replace (t, ‘$ 1& $ 3’)) a})} , a = t.ord = function (e) {if (e || « string » == typeof e) {var t, n = f (e), r = [], a =! 1, p = / ( d) (st | nd | rd | th) / g; return n.forEach (function (e) {« tag » === e.type? (r.push (e.txt), t = s.exec (e.txt), a =! (! t || void 0! == t [1])): a? r.push (e.txt): r.push (e.txt.replace (p, ‘ $ 1 $ 2 ‘))}), r.join («  »)}}, p = t.initQuotes = function (e) {var t = n (« (?: (?:] *> | ^) \ s * (?:] *> \ s *) *) (?: ( « |“ | “) | (‘|’ | ‘)) », « i »); if (e || « string » = = typeof e) return e.replace (t, functio n (e, t, n) {var s = t? « dquo »: « quo », r = t || n; return [e.slice (0, e.lastIndexOf (r)),  », r, «  »] .join («  »)})}, c = t.widont = function (e) {var t = « (?:] *?>) *? [^ \ s] (? 🙁 ?: a | em | span | strong | i | b) [^>] *?>) *? « , s = n ( » (\ s « t » \ s « t ») (?: \ s) ([^ \ s] ( ?: \ s * (?: a | em | span | strong | i | b) [^>] *?> \ s * \. *) *? (?: \ s *? (?: p | h [1-6] | li | dt | dd)> | $)) « , » gi « ); return e.replace (s, ‘$ 1 $ 2’)}, i = t.caps = function (e ) {var t, r = f (e), a = [], p =! 1, c = n (« ((\ b [AZ \ d] * [AZ] \ d * [AZ] [ AZ \ d ‘] * \ b) | (\ b [AZ] \. \ s? (?: [AZ] \. \ s?)) (?: \ s | \ b | $)) « , » g « ); return r.forEach (function (e) { » tag « === e.type? (a.push (e.txt), t = s.exec (e. txt), p =! (! t || void 0! == t [1])): p? a.push (e.txt): a.push (e.txt.replace (c, function (e, t, n, s) {var r, a; return n? ‘% s’.replace (« % s », n) 🙁 «  » === s.slice (-1)? (r = s.slice (0, -1), a = «  ») 🙁 r = s, a = «  »), ‘% s1% s2’.replace (« % s1 », r) .replace (« % s2 », a) )}))}), a.join («  »)}; t.typogrify = function (e) {var t = e; return e.jquery&&e.html&& (t = e.html ()), t = r ( t), t = c (t), t = u (t), t = i (t), t = p (t), t = a (t)}; var l, o, u = t.smartypants = Function (e) {var t, n, r = f (e), a = [], p = [], c = «  », i = «  », l =! 1, o = «  »; return r. forEach (function (e) {if (« tag » === e.type) a.push (e.txt), null! == (i = s.exec (e.txt)) && (c = i [ 2]. ToLowerCa se (), i [1]? (p.length> 0&&c === p [p.length-1] &&p.pop (), 0 === p.length&& (l =! 1)) 🙁 p. push (c), l =! 0)); else {if (n = (n = e.txt) .replace (/ (rock) ‘n’ (roll) / gi, « $ 1’n ‘$ 2 »), t = n.slice (-1) ,! l) switch (n = g (n), n = h (n), n = d (n), n = x (n)) {case « ‘ »: n = / S / .test (o)? « ‘ »: « ‘ »; Break; case ‘ »‘: n = / S / .test (o)? » «  »: «  » « ; Break; default: n = m (n)} o = t, a.push (n)}}), a.join («  »)}, f = t.tokenize = function (e) {for (var t, n = [] , s = 0, r = / ([^] *>) / gi; zero! == (t = r.exec (e));) {var a = t [1], p = t [2]; a&&n.push ({type: « text », txt: a}), n.push ({type: « tag », txt: p}), s = r.lastIndex} return r.lastIndex) / g, « $ 1 -« )}, d = t.smartEllipses = function (e) {return e.replace (/…/ g, « … »). replace (/ . . ./ g, « … »)}, x = t.smartBackticks = function (e) {return e.replace ( /« /g, » » »).replace(/« /g, «  » « )}, m = t.smartQuotes = function (e) {var t = » (? =% s \ B)  » .replace (« % s », « [!  » # \ $ \% \ ‘() *, -. \ /:;? \ @ \ [\\] \ ^ _ `{|} ~] »), s = « [^ \ \ t \ r n \ [\ {\ (\ -] », r = n (« (\ s | | – | & [mn] dash; | – | – | ȁ [34];) ‘(? = \ w) « , » g « ), a = n ( » (« s »)’ (?! \ s | s \ b | \ d) « , » g « ), p = n ( » (« s ») ‘(?! \ s | s \ b) « , » g « ), c = n (‘(\ s | | – | & [mn] dash; | – | – | ȁ [34];) « (? = \ w)’, » g « ), i = n ( ‘ »(? = \ s)’, » g « ), l = n ( » (« s’) » ‘, « g »); return e.replace (n (« ^’% s » .replace ( « % s », t), « g »), « ‘ »). replace (n (‘ ^ « % s’.replace (« % s « , t), » g « ), » «  »). replace (/ »‘(?=w)/g, » »‘ »).replace(/ ‘ »(? = w) / g, »‘ «  »). replace (/ b ‘(? = d {2} s) / g, « ‘ »). Replace (r, « $ 1′ »). Replace (a, « $ 1 ‘ »). Replace (p, « $ 1’ $ 2 »). Replace (« ‘ », « ‘ ») .replace (c, « $ 1 » « ). replace (i, » «  »). replace (l, « $ 1 » « ). replace (‘ »‘, «  » « )}, y = function (e) {this._wrapped = e}, v = function (e, n) {y.prototype [e ] = function () {return e = n.call (t, this._wrapped), this._chain? t (e) .chain (): e; var e}}; for (l in t) t.hasOwnProperty ( l) && ((o = t [l]) &CS SEANDCHARo.constructor&&o.call&&o.apply) &&v (l, t this }, y.prototype.value = function () {return this._wrapped}} (dies);
}, {}];
window.modules [« 1317 »] = [function (require, module, exports) {« use strict »; module.exports = {isString: function (n) {return « string » == typeof n}, isObject: function ( n) {return « object » == typeof n&&null! == n}, isNull: function (n) {return null === n}, isNullOrUndefined: function (n) {return null == n}};
}, {}];
window.modules [« 1344 »] = [function (require, module, exports) {« use strict »; const universalAgora = require (1346), universalRest = require (20), universalQuery = require (1345), _ get = require ( 13); function searchByQueryWithRawResults (e, r) {const t = `// $ {r.site.host} $ {80! == r.site.port?`: $ {R.site.port} `: » « } $ {r.site.path} / _ agora / _search`; return universalRest.post (t, e,! 0)} function getProducts (e, r, t) {return searchByQueryWithRawResults (universalAgora.buildProductsQuery (e), r ) .then (e => {const r = universalQuery.formatSearchResult (e); return {total: e.hits.total, products: t? universalAgora.filterByLocale (r): r}})} function getMerchantsList (e) { return searchByQueryWithRawResults (universalAgora.buildMerchantsAggregation (1e6, _get (e, « site.agoraLocale »)), e) .then (universalQuery.formatAggregationResults ({aggregationName: « merchants », field: « key », subfield: « name »}) )} module.exports.getProduct = universalAgora.getProduct, module.exports.getProducts = getProducts, module.exports.getMerchantsList = getMerchantsList, module.exports.searchByCross yWith RawResults = searchByQueryWithRawResults, module.exports.buildMerchantsByUrlQuery = universalAgora.buildMerchantsByUrlQuery;
}, {« 13 »: 13, « 20 »: 20, « 1345 »: 1345, « 1346 »: 1346}];
window.modules [« 1345 »] = [function (require, module, exports) {« use strict »; const _map = require (75), _ get = require (13), _ isArray = require (174), _ set = require ( 131), _ isObject = require (112), _ cloneDeep = require (85), _ uniq = require (115); function formatSearchResult (e) {return _map (e.hits.hits, « _ source »)} function newQuery (e) { if (! e) throw new Error (« An` index` is required to create a query « ); return {index: e, type: » _ doc « , body: {query: {}}}} function addShould ( e, o) {var t = _get (e, « body.query.bool.should », void 0), r = _isArray (o); return t? r? _set (e, « body.query.bool.should « , t.concat (o)) 🙁 t.push (o), _ set (e, » body.query.bool.should « , t)): _ set (e, » body.query.bool.should « , r? o: [o]), e} function addMust (e, o) {var t = _get (e, « body.query.bool.must », void 0), r = _isArray (o); return t? r? _set (e, « body.query.bool.must », t.concat (o)) 🙁 t.push (o), _ set (e, « body.query.bool.must », t)): _ set ( e, « body.query.bool.must », r? o: [o]), e} function addMustNot (e, o) {var t = _get (e, « body.query.bool.must_not », void 0 ), r = _isArray (o); return t? r? _set (e, « body.query.bool.must_not », t .concat (o)) 🙁 t.push (o), _ set (e, « body .query.bool.must_not « , t)): _ set (e, » body.query.bool.must_not « , r? o: [o]), e} function addFilter (e, o) {var t = _get ( e, « body.query.bool.filter », void 0); if (! _ isObject (o)) throw new Error (« Filter query must be an object »); return t? _isArray (t)? (t.push ( o), _ set (e, « body.query.bool.filter », t)): _ set (e, « body .query.bool.filter », [_ cloneDeep (t), o]): _ set (e,  » body.query.bool.filter « , o), e} function addMinimumShould (e, o) {if ( » number « ! = typeof o) throw new Error ( » A number is required as a second argument « ); return _set ( e, « body.query.bool.minimum_should_match », o), e} function addSort (e, o) {var t = _get (e, « body.sort »); return _isArray (t) || _set (e, « body.sort », t = []), t.push (o), e} function addSize (e, o) {if (! o&CSSEANDC HAR0! == o) return e; if (o = parseInt (o), isNaN (o)) throw new Error (`Second argument must be a number: $ {o}`); return _set (e, « body. size « , o)} function addFrom (e, o) {if (! o&&0! == o) return e; if (o = parseInt (o), isNaN (o)) throw new Error (` Second argument must be a number be r: $ {o} `); return _set (e, » body.from « , o)} function onlyWithTheseFields (e, o) {if (! _ isArray (o)) throw new Error ( » Second argument must be an array « ); return _set (e, » body._source.include « , _ uniq (o)), e} function onlyWithinThisSite (e, o) {return o.subsiteSlug? addFilter (e, {term: {subsite: o .subsiteSlug }}) 🙁 addFilter (e, {term: {site: o.slug}}), addMustNot (e, {exists: {field: « subsite »}})), e} function onlyWithinThisDomain (e, o) { return addFilter (e, {prefix: {canonicalUrl: `http: // $ {o.host}`}}), e} function withinThisSiteAndCrossposts (e, o) {var t = {term: {}}, r = { bool: {should: [], minimum_should_match: 1}}; return t.term [« crosspost. » (o.subsiteSlug || o.slug)] =! 0, r.bool.should.push (t), o.subsiteSlug? r.bool.should.push ({term: {subsite: o.subsiteSlug}}) : (r.bool.should.push ({term: {site: o.slug}}), addMustNot (e, {exists: {field: « subsite »}})), addFilter (e, r), e} function withinThisDomainOrCrossposts (e, o) {return addShould (e, {term: {[`crosspost. $ {o.subsiteSlug || o.slug}`] :! 0}}), addShould (e, {prefix: {canonicalUrl : `http: // $ {o.host}`}}), addMinimumShould (e, 1), e} function moreLikeThis (e, o, t) {let r = {fields: [« tags »], like: {_index: e.index, _type: « _ doc », _ id: o}, include:! 1, min_term_freq: 1, max_query_terms: 12, min_doc_freq: 1}; return {more_like_this: Object.assign (r, t)}} Function addAggregation (e = {}, o) {const {body: t = {}} = e; return o? (T.aggs? _Set (e, « body.aggs », Object.assign (t.aggs, o )): _ set (e, « body.aggs », o), e): e} function formatAggregationResults ({aggregationName: e = «  », field: o = «  », subfield: t = «  », skipEmpty: r = ! 0}) {return function (s = {}) {let u = _get (s, `aggregations. $ {E} $ {t? ». « T ». « : ». « } Buckets`, []) ; return r&& (u = u.filter (e => 0! == _ get (e, « doc_cou nt « , 0))), u.map (e => e [o] || » « )}} function addGeo (e, o) {if (! _ isArray (o)) throw new Error ( » Second argument is required to be an array « ); if (2! == o.length) throw new Error ( » Array must have length 2 « ); if (o.some (isNaN)) throw new Error ( » Array may only be Contain numbers « ); return _set (e, » body.query.geo_shape.location.shape.type « , » point « ), _ set (e, » body.query.geo_shape.location.shape.coordinates « , o), e} combine functionFunctionScoreQueries (e, o) {let t = _cloneDeep (_get (e, « body.query », {})), r = _cloneDeep (_get (o, « body.query », {})), s = _get (e, « body.sort »); return _set (e, « body.query », {}), _ set (e, « body.query.function_score.functions », []), e.body.query .function_score.functions.push ({filter: t, weight: 20}), e.body.query.function_score.functions.push ({filter: r, weight: 10}), e.body.query.function_score.score_mode = « max », e.body. query.function_score.min_score = 10, _isArray (s) || _set (e, « body.sort », s = []), s.unshift ({_ score: « desc »}), e} function addNestedObjQuery (e, o, t) {if (! e) throw new Error (« There is no base query to run the addNestedObjQuery operation ion »); if (! o) throw new Error (« There is no nested object path to run the nested query » ); if (! t) throw new Error (« There is no nested query path to execute the nested query against »); return _set (e, « nested », {path: o, query: t}), e} function addMatchAll (e){return _set(e, »body.query »,{match_all:{}}) ,e}function addMultiMatch(e,o){const t=_get(e, »body.query.bool.must », void 0),{fields:r,type:s,string:u}=o,i= {multi_match:{query:u,fields:r,type:s}};return t?(t.push(i) ,_set(e, »body.query.bool.must »,t)):_set(e , »body.query.bool.must »,[i]),e}module.exports=newQuery,module.exports. addGeo=addGeo,module.exports.addAggregation=addAggregation,module.exports.addShould=addShould,module. exports.addFilter=addFilter,module.exports.addMust=addMust,module.exports.addMustNot=addMustNot,module.exports.addMinimumShould=addMinimumShould,module.exports.addSort=addSort,module.exports.addSize=addSize,module.exports addFrom=addFrom,module.exports.onlyWithTheseFields=onlyWithTheseFields,module.exports.onlyWithinThisS ite=onlyWithinThisSite,module.exports.onlyWithinThisDomain=onlyWithinThisDomain,module.exports.withinThisSiteAndCrossposts=withinThisSiteAndCrossposts,module.exports.withinThisDomainOrCrossposts=withinThisDomainOrCrossposts,module.exports.formatAggregationResults moreLikeThis,module.exports.combineFunctionScoreQueries=combineFunctionScoreQueries,module.exports.addNestedObjQuery=addNestedObjQuery,module.exports.addMatchAll=addMatchAll,module.exports.addMultiMatch=addMultiMatch;
}, {« 13 »: 13, « 75 »: 75, « 85 »: 85, « 112 »: 112, « 115 »: 115, « 131 »: 131, « 174 »: 174}];
window.modules[« 1346 »] = [Funktion(erfordern,Modul,Exporte){(Funktion (Prozess,__Dateiname){(Funktion (){
« use strikt »;const _forEach=require(66),_get=require(13),_filter=require(158),_map=require(75),_isEmpty=require(111),urlParse=require(76),log= require(11).setup({file:__filename}),queryService=require(1345),universalRest=require(20),AGORA_HOST=window.process.env.AGORA_HOST,AGORA_ELASTIC_PREFIX=window.process.env.AGORA_ELASTIC_PREFIX,= .GORA_END AGORA_HOST?`${AGORA_HOST}/api/v1`:null,requestHeader={« Content-Type »: »application/json »},PRODUCTS_INDEX= »agora-products »,AFFILIATES_INDEX= »affiliates »,RETAILERS_INDEX= »retailers » ,FILTER_KEY={merchants: »name »,affiliates: »affiliate »},URL_RE=/^https?://.*$/;function getProducts(e,t){const{limit:r=100,start :a=0,search:s= » »,sortDate:i= »desc »}=e,n=`${AGORA_ENDPOINT}/products?limit=${r}&start=${a}&search=${encodeURIComponent (s)}&sortDate=${i}`;return fetch(n).then(handleResponse).then(e=>t?filterByLocale(e,t):e).then(e=>({total:e .length,products:e})).catch(handleError(n))}function getProduct(e,t){const r=`${AGORA_END PO INT}/products/${e}`;if(!AGORA_ENDPOINT)throw new Error(« Es wurde kein Agora-Endpunkt festgelegt »);if(« string »!=typeof e)throw new Error(« Anfrage muss ein Produkt angeben id »);return fetch(r).then(handleResponse).then(e=>t?filterByLocale(e,t):e).catch(handleError(r))}function postProduct(e){const t=` ${AGORA_ENDPOINT}/products`,r={method: »POST »,headers:requestHeader,body:JSON.stringify(e)};return fetch(t,r).then(handleResponse).catch(handleError(t) )}Funktion putProduct(e,t){const r=`${AGORA_ENDPOINT}/products/${e}`,a={method: »PUT »,headers:requestHeader,body:JSON.stringify(t)}; return fetch(r,a).then(handleResponse).catch(handleError(r))}function patchProduct(e,t){const r=`${AGORA_ENDPOINT}/products/${e}`,a={method : »PATCH »,headers:requestHeader,body:JSON.stringify(t)};return fetch(r,a).then(handleResponse).catch(handleError(r))}function deleteProduct(e){const t=` ${AGORA_ENDPOINT}/products/${e}`;return fetch(t,{method: »DELETE »,headers:requestHeader}).then(handleResponse).catch(handleError(t))}Funktion getMerchantList(e){const{limit:t=100,fields:r= » »}=e;Return Promise.resolve([{name: »Amazon »}]).catch(handleError(«  »))}function getMerchant (e){const t=`${AGORA_ENDPOINT}/merchants/${e}`;if(« string »!=typeof e)throw new Error(« Anfrage muss eine Händler-ID angeben »);return fetch(t) .then(handleResponse).catch(handleError(t))}function patchMerchant(e,t){const r=`${AGORA_ENDPOINT}/merchants/${e}`,a={method: »PATCH »,headers: requestHeader,body:JSON.stringify(t)};return fetch(r,a).then(handleResponse).catch(handleError(r))}function postMerchant(e){const t=`${AGORA_ENDPO INT}/merchants` ,r={method: »POST »,headers:requestHeader,body:JSON.stringify(e)};return fetch(t,r).then(handleResponse).catch(handleError(t))}function putMerchant(e, t){const r=`${AGORA_ENDPOINT}/merchants/${e}`,a={method: »PUT »,headers:requestHeader,body:JSON.stringify(t)};return fetch(r,a) .then(handleResponse).catch(handleError(r))}function deleteMerchant(e){const t=`${AGORA_ENDPOINT}/merchants/${e}`;return fetch(t,{method: »DELETE »,hea ders:requestHeader}).then(handleResponse).catch(handleError(t))}function migrationMerchants(e){const t=`${AGORA_ENDPOINT}/merchants/migrate-affiliate`,r={method: »POST », headers:requestHeader,body:JSON.stringify(e)};return fetch(t,r).then(handleResponse).catch(handleError(t))}function getRetailers(e){const{limit:t=100,start :r=0}=e,a=`${AGORA_ENDPOINT}/retailers?limit=${t}&start=${r}`;return fetch(a).then(handleResponse).then(e=>({ total:e.length,retailers:e})).catch(handleError(a))}function getRetailer(e){const t=`${AGORA_ENDPOINT}/retailers/$ {e}`;return fetch(t). then(handleResponse).catch(handleError(t))}function postRetailer(e){const t=`${AGORA_ENDPOINT}/retailers`,r={method: »POST »,headers:requestHeader,body:JSON.stringify( e)};return fetch(t,r).then(handleResponse).catch(handleError(t))}function putRetailer(e,t){const r=`${AGORA_ENDPOINT}/retailers/${e}`, a={method: »PUT »,headers:requestHeader,body:JSON.stringify(t)};return fetch(r,a).then(handleResponse).catch(handleError(r))}fun ction deleteRetailer(e){const t=`${AGORA_ENDPOINT}/retailers/${e}`;return fetch(t,{method: »DELETE »,headers:requestHeader}).then(handleResponse).catch(handleError( t))}Funktion getAffiliates(e){const{limit:t=100,start:r=0}=e,a=`${AGORA_ENDPOINT}/affiliates?limit=${t}&start=${r}` ;return fetch(a).then(handleResponse).then(e=>({total:e.length,affiliates:e})).catch(handleError(a))}function getAffiliateRetailers(e){const t=` ${AGORA_ENDPOINT}/retailers/${e}/affiliates`;return fetch(t).then(handleResponse).catch(handleError(t))}function getAffiliateRetailer(e,t) {const r=`${AGORA_ENDPOINT} /retailers/${e}/affiliates/${t}`;return fetch(r).then(handleResponse).catch(handleError(r))}function postAffiliateRetailer(e,t){const r=`${AGORA_ENDPOINT }/retailers/${e}/affiliates`,a={method: »POST »,headers:requestHeader,body:JSON.stringify(t)};return fetch(r,a).then(handleResponse).catch( handleError(r))}Funktion putAffiliateRetailer(e,t,r){const a=`${AGORA_ENDPOINT}/retailers/${e}/affiliates/${t}`,s= {method: »PUT »,headers:requestHeader,body:JSON.stringify(r)};return fetch(a,s).then(handleResponse).catch(handleError(a))}function deleteAffiliateRetailer(e,t){ const r=`${AGORA_ENDPOINT}/retailers/${e}/affiliates/${t}`;return fetch(r,{method: »DELETE »,headers:requestHeader}).catch(handleError(r))} function postLocale(e){const t=`${AGORA_ENDPOINT}/locales/`,r={method: »POST »,headers:requestHeader,body:JSON.stringify(e)};return fetch(t,r). then(handleResponse).catch(handleError(t))}function patchLocale(e,t){const r=`${AGORA_ENDPOINT}/locales/${e}`,a={method: »PATCH »,headers:requestHeader ,body:JSON.stringify(t)};return fetch(r,a).then(handleResponse).catch(handleError(r))}function handleResponse(e){try{return e.json().then(t =>{if(e.status>=400){const e=_get(t, »message.details[0].message »);throw new Error(e)}return t})}catch(e){throw new Error(e.message)}}function handleError(e){return t=>{throw log(« warn »,`Fehlgeschlagene Anfrage an ${e}`,t),new Error(`Request an ${e} fehlgeschlagen`)}}Funktion buildProductsQue ry({search:e= » »,limit:t=100,start:r=0,sortDate:a= » »,filters:s,locale:i}){const n=queryService(PRODUCTS_INDEX),c=s&&Object .keys(s).length?Object.keys(s).filter(e=>Array.isArray(s[e])&&s[e].length):[],o={},l={}; if(prependElasticPrefix(n),e||c.length||i||queryService.addMatchAll(n),i&&(queryService.addMust(o,{match:{« locales.locale »:i}}),queryService. addMust(l,{match:{« merchants.locale »:i}})),e)if(isURL(e))queryService.addMust(n,[queryService.addNestedObjQuery({}, »merchants »,{match: {« merchants.buyUrl »:e}})]);else{const t={};queryService.addShould(t,[{match:{« locales.productId »:e}},{match:{« locales. name »:{query:e,boost:2}}}]),queryService.addMinimumShould(t,1),queryService.addMust(o,_get(t, »body.query »))}if(c.length) {const e={};c.forEach(t=>{const r=s[t],a=FILTER_KEY[t],i={};a&&(i[`merchants.${a}`]=r ,queryService.addMust(e,{terms:i}))}),queryService.addMust(l,_get(e, »body.query »))}return _isEmpty(o)||queryServi ce.addMust(n,[queryService.addNestedObjQuery({}, »locales »,_get(o, »body.query »))]),_isEmpty(l)||queryService.addMust(n,[queryService.addNestedObjQuery({ }, »merchants »,_get(l, »body.query »))]),queryService.addSize(n,t),r>=0&&q ueryService.addFrom(n,r), »desc »===a|| « asc »===a?queryService.addSort(n,{updatedAt:{order:a}}):e&&queryService.addSort(n,{_score:{order: »desc »}}),n}function prependElasticPrefix(e ){return e.index=AGORA_ELASTIC_PREFIX?`${AGORA_ELASTIC_PREFIX}_${e.index}`:e.index,e}function buildMerchantsAggregation(e=1e6,t){const r=queryService(PRODUCTS_INDEX);return prependElasticPrefix( r),queryService.addMust(r,{match:{active:!0}}),t&&queryService.addMust(r,queryService.addNestedObjQuery({}, »merchants »,_get(queryService.addMust({},{match: {« merchants.locale »:t}}), »body.query »))),queryService.addAggregation(r,{merchants:{nested:{path: »merchants »},aggs:{name:{terms:{ field: »merchants.name »,size:e}}}}}),queryService.addSize(r,0),r} function isURL(e){return URL_RE.test(e)}function filterByLocale(e,t,r={locales: »US »}){const a=Array.isArray(e);if(_isEmpty(e))return a?[]:{};const s=[« locales », »merchants »],i=a?e:[e],n=Object.keys(r),c=_map(i,e=>{ const a=Object.assign({},e);return _forEach(s,s=>{if(Object. keys(a).includes(s)){const i=t?_filter(e[s],[ « locale »,t]):e[s];a[s]=i,!i.length&&n.includes(s)&&(a[s]=(_filter(e[s],[« locale »,r [s]])||[]).map(e=>(e.id=null,e.locale=t,e)))}}),a.name=_get(a, »locales[0] .name », » »),a});return a&&c.length?c:_get(c, »[0] »,{})}Funktion searchByQueryWithRawResults(e,t){const r=`//${t .site.host}${80!==t.site.port?`:${t.site.port}`: » »}${t.site.path}/_agora/_search`;universalRest.post zurückgeben (r,e,!0)}function buildMerchantsByUrlQuery(e){const t=queryService(PRODUCTS_INDEX);return prependElasticPrefix(t),queryService.addNestedObjQuery(t.body.query, »merchants »,{match:{« merchants. buyUrl « : e}}), t} Function getAffiliatesByLocale (e, t) {const r = que ryService (AFFILIATES_INDEX); return prependElasticPrefix (r), queryService.addMust (r, {match: {locale: e}}), queryService.addSize (r, 1e3), queryService.addSort (r, {name: « asc »}), searchByQueryWithRawResults (r, t) .then (e => _ get (e, « hits.hits », []). map (e => _ get (e, « _ source », {})))} function buildRetailersQuery ({search: e = «  », limit: t = 50, start: r = 0, direction: a = « asc », locale: s = « US », sortColumn: i = « retailers »}) {const n = queryService (RETAILERS_INDEX); if (prependElasticPrefix (n), queryService.addMust (n, {match: {locale: s}}), e&&queryService.addMultiMatch (n, {fields: [« name », « domains ^ 2 »], string: e, type: « phrase_prefix »}), « Retailers » === i&&queryService.addSort (n, {« name.keyword « : a}), » affiliates « === i) {let e = {}; queryService .addNestedObjQuery (e, » affiliateRetailers « , {match_all: {}}), queryService.addMust (n, e), queryService. addSort (n, {« affiliateRetailers.affiliateName.keyword »: {order: a, nested_path: « affiliateRetailers »}})} return query Service.addSize (n, t), queryService.addFrom (n, r), n} function getRetailer sList (e, t) {return searchByQueryWithRawResults (buildRetailersQuery (e), t) .then (e => ({total: _get (e, « hits.total », 0), retailers: _get (e, « hits.hits », []). map (e => _ get (e, « _ source », {}))}))} function getRetailersByAffiliateId (e, t, r) {const a = queryService (RETAILERS_INDEX); return e? (prependElasticPrefix (a), queryService.addMust (a, {match: {locale: r}}), queryService.addMust (a, [ queryService.addNestedObjQuery ({}, « affiliateRetailers », {match: {« affiliateRetailers.affiliateId »: e}})]), queryService.addSize (a, 1e4), queryService.addSort (a, {« name.keyword »: « asc »}), searchByQueryWithRawResults (a, t) .then (e => _ get (e, « hits.hits », []). map (e => _ get (e, « _ source », {}))) ): Promise.reject ()} function getMerchantsList (e) {return searchByQueryWithRawResults (buildMerchantsAggregation (1e6, _get (e, « site.agoraLocale »)), e) .then (queryService.formatAggregationResults ({aggregationName: « . Merchants » : « key », subfield: « name »}))} function queryRetailersByUrl (e, t, r) {const a = urlPa rse (e) .host.split (« www. »). join («  »), s = queryService (RETAILERS_INDEX); return qu eryService.addMust (s, {match: {locale: r}}), queryService.addMust (s, {match: {domains: a}}), prependElasticPrefix (s), queryService.addSize (s, 10), searchByQueryWithRawResults (s, t) .then (e => _ get (e, « hits.hits », []). map (e => _ get (e, « _ source », {})))} function queryRetailersByName (e, t, r) {const a = queryService (RETAILERS_INDEX); Return queryService.addMust (a, {match : {locale: r}}), queryService.addMust (a, {match: {« name.keyword »: e}}), prependElasticPrefix (a), queryService.addSize (a, 10), searchByQueryWithRawResults (a, t) .then (e => _ get (e, « hits.hits », []). map (e => _ get (e, « _source », {})))} require (233), module.exports = {buildProductsQuery : buildProductsQuery, buildMerchantsAggregation: buildMerchantsAggregation, getProducts: getProducts, getProduct: getProduct, postProduct: postProduct, putProduct: putProduct, patchProduct: patchProduct, deleteProduct, patchProduct, deleteProduct, patch, postMerchant, patchMerchant, patch: getMerchantMerchant, patch: getMerchant, postProduct: getMerchant, postProduct: getMerchant: erchant, putMerchant: putMerchant, deleteMerchant: deleteMerchant, migrateMerchants: mig rate merchants, getRetailers: getRetailers, getRetailersList: getRetailersList, getRetailer: getRetailer, post retailer: post retailer, putRetailer: putRetailer, deleteRetailer: deleteRetailer, getRetailersByAffiliateId: getRetailersByAffiliateId, getAffiliates: getAffiliates, getAffiliateRetailers: getAffiliateRetailers , getAffiliateRetailer: getAffiliateRetailer, post affiliate retailer: post affiliate retailer, putAffiliateRetailer: putAffiliateRetailer, deleteAffiliateRetailer: deleteAffiliateRetailer, isURL: isURL, filterByLocale: filterByLocale, patch locale: patch locale, post locale: post locale, buildMerchantsByUrlQuery: buildMerchantsByUrlQuery, getAffiliatesByLocale: getAffiliatesByLocale, searchByQueryWithRawResults: searchByQueryWithRawResults, getMerchantsList: getMerchantsList, queryRetailersByUrl : queryRetailersByUrl, queryRetailersByName: queryRetailersByName};

}). call (this)}). call (this, require (26), « / services / universal / agora.js »)}, {« 11 »: 11, « 13 »: 13, « 20 »: 20 , « 26 »: 26, « 66 »: 66, « 75 »: 75, « 76 »: 76, « 111 »: 111, « 158 »: 158, « 233 »: 233, « 1345 »: 1345}] ;
window.modules [« 1347 »] = [function (require, module, exports) {« use strict »; const _map = require (75), _ mapValues ​​= require (228), _ reduce = require (113), _ assign = require ( 162), _ get = require (13), _ pickBy = require (163), _ find = require (67), affiliateFields = [« siteShortKey », « pageUri », « productId », « utmMedium », « utmSource », « sessionCount » , « format », « utmCampaign », « referrer », « deviceAbbreviation », « zone »], affiliateSettings = {amazon: {domains: [« amazon.com », « amazon.co.uk »], subtagKey: « ascsubtag « , maxLength: 99, delimiter: » standard « , encode:! 1}, narrative: {domains: [ » shop-links.co/ » ],subtagKey: »u1″,maxLength:99,delimiter: »standard « , encode:! 0}, rakuten: {domains: [« click.linksynergy.com/deeplink », »linksynergy.walmart.com/deeplink » ],subtagKey: »u1″,maxLength:72,delimiter: »standard »,encode :! 1}, shareasale: {domains: [« shareasale.com »], subtagKey: « afftrack », maxLength: 99, delimiter: « standard », encode:! 1}, skimlinks: {domains: [« go.redirectingat .com « ], subtagKey: » xcust « , maxLength: 50, delimiter: » alt « , encode:! 1}, impact: {domains: [], subtagKey: » subId2 « , maxLen gth: 99, delimiter: « standard », encode:! 1}, avantlink: {domains: [« avantlink.com »], subtagKey: « ctc », maxLength: 64, delimiter: « old », encode:! 1 }, cj: {domains: [« tkqlhce.com », « jdoqocy.com », « dpbolvw.net », « anrdoezrs.net », « kqzyfj.com »], subtagKey: « sid », maxLength: 64, separator : « alt », encode:! 1, joinBy: « / », assignBy: « / », positioned:! 0, position: « after », positionKey: « type / dlg / »}, partnerize: {domains: [ » prf .hn « ], subtagKey: » pubref « , maxLength: 100, delimiter: » alt « , encode:! 1, joinBy: » / « , assignBy: »: « , positioned:! 0, position: » before « , positionKey: « Target »}, pepperjam: {domains: [« gopjn.com », « pntrac.com », « pjtra.com », « pjatr.com », « pntrs.com », « pntra.com »], subtagKey: « sid », maxLength: 100, delimiter: « alt », encode:! 1}, awin: {domains: [« awin1.com »], subtagKey: « pref1 », maxLength: 100, delimiter: « alt » , encode:! 1, positioned:! 0, position: « before », positionKey: « ued »}}, subtagDictionary = {siteShortKey: «  », pageUri: « p », productId: « i », zone: « z » , device abbreviation: « d », utmSource: « s », utmMedium: « m », utmCampaign: « c », sessionCount: « u », referrer: « r », format: « t »}, d elimite rs = {standard: [« [« , « ] »], old: [« __ », « _ »]}; function parseValueFromSubtag (e, t, i) {const a = t [0] et [1] , s = i.split (a) [1] || «  »; return s? s.split (t [0]) [0]: null} function parseSubtag (e, t = delimiters.standard) {return _pickBy ( _mapValues ​​(subtagDictionary, i => parseValueFromSubtag (i, t, e)))} function generateSubtag (e, t, i = delimiters.standard, a =! 1) {const s = (e => t => `$ { e [0]} $ {t} $ {e [1]} `) (i); let n = _reduce (affiliateFields, (t, i) => {const a = s (subtagDictionary [i]), n = e [i]; return t (n? an: «  »)}, «  »); return a&& (n = encodeURIComponent (n)), n} function applySubtagMaxlength (e, t) {var i = t-3 * ( e .split (« , »). length-1 e.split (« | »). length-1); return e.substr (0, i)} function getSubtagData ({getters: e, fields: t = [] , visitState: i, locals: a, productLink: s}) {let n = {}; return t.forEach (t => {n [t] = e [t] &&e [t] ({visitState: i, locals : a, productLink: s})}), n} function parseQuery (e = «  ») {return e.split (« & »). reduce ((e, t) => {const i = t.split ( » = « ) [0], a = t.split ( » = « ) [1]; return void 0! == a&& (e [i ] = a), e}, {})} fun ction processSubtagPosition ({url: e, positionKey: t, subtagKey: i, position: a = « after », subtagString: s, joinBy: n, assignBy: o} = {}) {const [r, l] = e. split (t), u = `$ {i} $ {o} $ {s}`, g = []; if (« after » === a) {if (! l) return e; const [a, s = «  »] = l.split (`$ {i} $ {o}`), d = s.split (n) .slice (1) .join (n); g.push (`$ {r} $ {t} `, u), a&&g.push (a), d&&g.push (d)} if ( » before « === a) {const [e, a = » « ] = r.split (` $ {i} $ {o} `), s = a.split (n) .slice (1) .join (n); g.push (e), s&&g.push (s), g.push (u,` $ {t} $ {l} `)} return g.reduce ((e, t) => {return e.slice (-1) === n&& (e = e.slice (0, -1)), e.length? [e, t] .join (n): t}, «  »)} function processSubtag ({getters: e, affiliate: t, url: i, visitState: a = {}, locals: s}) {const n = affiliateFields, o = _get (affiliateSettings [t], « subtagKey »), r = _get (affiliateSettings [t], « maxLength »), l = _get (affiliateSettings [t], « encode »), u = _get (affiliateSettings [t], « delimiter »), g = _get (affiliateSettings [t], « positioned »,! 1), d = _get (affiliateSettings [t], « position »), c = _get (affiliateSettings [t ], « positionKey »), p = _get (affiliateSettings [t], « assignBy », « = »), m = _get (affiliateSettings [t], « joinBy », « & »), f = delimiters [u]; let b, y, S = i. indexOf (« ? »)> = 0? i.split (« ? »). pop (): «  », h = parseQuery (S), _ = getSubtagData ({getters: e, fields: n, visitState: a, locals: s, productLink: i}); return o&& (y = h [o] || «  », y = applySubtagMaxlength (b = generateSubtag (_ = _ assign (parseSubtag (y, f), _ pickBy (_)), t , f, l), r), h [o] = y, S = _map (h, (e, t) => `$ {t} = $ {e}`) .join (« & »), i = g? processSubtagPosition ({url: i, positionKey: c, subtagKey: o, position: d, subtagString: y, joinBy: m, assignBy: p}): i.split (« ? ») [0] `? $ {S} `), i} function getAffiliate (e) {const t = Object.keys (affiliateSettings); return _find (t, t => _ find (affiliateSettings [t] .domains, t => e.includes (t .toLowerCase ()))) || «  »} Function createSubtagProcessor (e) {return ({url: t, visitState: i, locals: a, affiliate: s}) => (s = getAffiliate (t) || s )? processSubtag ({getters: e, url: t, affiliate: s, visitState: i, locals: a}): «  »} module.exports.generateSubtag = generateSubtag, module.exports.getAffiliate = getAffiliate, module.exp orts .createSubtagProcessor = createSubtagProcessor, module.exports.processSubtag = processSubtag;
}, {« 13 »: 13, « 67 »: 67, « 75 »: 75, « 113 »: 113, « 162 »: 162, « 163 »: 163, « 228 »: 228}];
window.modules [« article-nav.client »] = [function (require, module, exports) {« use strict »; const dom = require (4), _ throttle = require (62), $ visibility = require (5) , $ popup = require (78), $ gtm = require (3), {reportSocial: reportSocial} = require (77), auth0 = require (10); module.exports = (t => {let e = dom.find (« .page-header »), i = dom.find (« . article-content »), r = dom.find (t, « . deepscroll-headline »), o = dom.find (t, « . deepscroll -rubric « ), s = dom.find (t, ». deepscroll-rubric-sponsored « ), l = dom.find (« . article .article-header .rubric « ), n = dom.find ( » # deepscroll_center_divider « ), a = dom.find (« . clay-paragraph « ), d = dom.find (t, ». logo « ), c = dom.find (t, ». dyn-cut-logo « ), p = dom.find (t, « . article-nav-top »), u = dom.find (t, « . article-nav-deepscroll »), m = dom.find (‘link [rel = « canonical »] ‘), f = m&&m.getAttribute (« href »), g = dom.find (‘ meta [property = « og: image »] ‘)? dom.find (‘ meta [property = « og: image »] ‘ ) .getAttribute (« content »): «  », h = dom.find (‘meta [property = « og: title »]’)? dom.find (‘meta [property = « og: title »]’). getAttribute (« content »): «  », y = dom.find ( t, « . shar e-link.facebook »), w = dom.find (t, « . share-link.twitter »), v = dom.find (t, « . share-link.pinterest »), b = t.classList. contains (« header-simple »), x = window.getComputedStyle (d, null) .getPropertyValue (« – targetFlexBasis »), L = window.getComputedStyle (d, null) .getPropertyValue (« – verticalStart ») || 0, C = window.getComputedStyle (d, null) .getPropertyValue (« – verticalEnd ») || 0, $ =! 1, _ = 55; function k () {_ = parseInt (window.getComputedStyle (d, null ) .getPropertyValue (« – stickyTop »)) || _, C = $ visibility.getViewportWidth ()> = 1180? window.getComputedStyle (d, null) .getPropertyValue (« – verticalEndDesktop ») || C: window. getComputedStyle (d, null) .getPropertyValue (« – verticalEnd ») || C} function S () {$ =! 1, P ()} function P () {let {top: r} = t.getBoundingClientRect () , o = window.getComputedStyle (d, null) .getPropertyValue (« – baseFlexBasis »), s = ox, l = (_- e.getBoundingClientRect (). top) / _, n = Math.max (0, Math .min (1, l)), m = LC-2, f = Math.round (L- (m * n 2)), g = Math.ceil (os * n); if (lt? e.classList. add (« header-after-scroll »): e.classList.remove (« header-after-scroll »), p.style.transform = `translateY ($ {C} px)`, u.style.transform = `translateY ($ {C} px)`, void (d.style.flexBasis = x « px »)} window.scrollY> r? t.classList.add (« after-scroll »): t.classList.remove ( « after-scroll »), window.scrollY> r? e.classList.add (« header-after-scroll »): e.classList .remove (« header-after-scroll »), p.style.transform = ` translateY ($ {f} px) `, u.style.transform =` translateY ($ {f} px) `, d.style. flexBasis = g » px « , c&& (c.style.flexBasis = g » px  » ), $ visibility.getViewportWidth ()> = 1180&&i&&function () {const t = a? $ visibility.getPageOffset (a) .top-70: 0, e = $ visibility.getPageOffset (i) .top, r = Math.max (e, t); return Math.max (window.scrollY, document.body.scrollTop)> = r} ()? T.classList .add (« deep-scroll »): t.classList.remove (« deep-scroll »)} function V (t) {var e = t.currentTarget, i = e.getAttribute (« href »), r = e .getAttribute (« data-handle »), o = $ popup.getPopupClass (e.classList), s = $ visibility.isBelowPrimaryContent (e)? « bottom »: « top »; $ gtm.reportNow ({event: « social -share-widget « , clickLocation: s, socialNet work: o}), reportSocial (o), $ visibility.getViewportWidth ()> = 768&&o&& (t.preventDefault (), $ popup.popWindow (o, r, i)) }! function () {const e = _throttle (P, 30); if (k (), dom.findAll (t, « . share-link »). forEach (t => t.addEventListener (« click », V )), y&& (y.href = « http: //www.facebook.com/sharer/sharer.php? u = » f « ? utm_source = fb&utm_medium = s3&utm_campaign = sharebutton-t »), wCSSEANDfCHARC (wCSSEANDfCHARC) « https://twitter.com/share? text = « encodeURIComponent (h) » &url = « f »? utm_source = tw&utm_medium = s3&utm_campaign = sharebutton-t&via = « w.getAttribute ( » data-handle « )), v&C: // pinterest. com / pin / create / button /? url = « f »? utm_source = pin&utm_medium = s3&utm_campaign = sharebutton-t&description = « encodeURIComponent (h) » &media = « g) », b) return; auth0.on (« init0.on ( » init ) => {auth0.isSubscriber () &&t.classList.add (« subscribed »)}), window.addEvent Listener (« scroll », e), window.addEventListener (« resize », S), window.addEventListener ( » resize « , k), l? l.classList.contains ( » rubric-sponsor-story « ) &&s? (o.classList.remove ( » visible « ), s.classList.add ( » visible « ), s.textContent = l.text || l.textContent) 🙁 o.textContent = l.text || l.textContent, o.href = l.href || « # ») 🙁 n.style.display = « none », o.style.display = « none »); S (), r.textContent = h} ()});
}, {« 3 »: 3, « 4 »: 4, « 5 »: 5, « 10 »: 10, « 62 »: 62, « 77 »: 77, « 78 »: 78}];
window.modules [« nav-search-button.client »] = [function (require, module, exports) {« use strict »; const dom = require (4), $ gtm = require (3), {reportSearch: reportSearch } = require (77), openClass = « open », closeClass = « closed »; module.exports = (e => {const s = e, t = dom.find (e, « . nav-search-button-trigger « ), n = dom.find (e, ». nav-search-form « ), o = dom.find (e, ». search-input « ); function i () {const e = dom.find ( » body « ); s.classList.toggle (closeClass), s.classList.toggle (openClass), e.classList.toggle ( » disabled « ), e.classList.toggle ( » search-active « )} function c () {i (), s.classList.contains (openClass) &&o.focus ()} function a (e) {! s.contains (e.target) &&s.classList.contains (openClass) &&i ()} function r (e ) {27 === e.keyCode&&s.classList.contains (openClass) &&i ()} function d (e) {e.preventDefault (), $ gtm.reportCustomEvent ({category: « search », label: « on = » window.location.href, action: o.value}), reportSearch ((o.value || «  »). split («  »), () => n.submit ())}! functi on (e, s, t) {s&&s.addEventListener (« click », c); t&&t.addEventListener (« submit », d); e.addEventListener (« click », a), document.addEventListener (« keydown », r), e .addEventListener (« touchend », a), n.addEventListener (« submit », d)} (dom.find (« body »), t, dom.find (e, « . nav-search-form Submit »)) });
}, {« 3 »: 3, « 4 »: 4, « 77 »: 77}];
window.modules [« nav-dropdown-button.client »] = [function (require, module, exports) {« use strict »; const dom = require (4), visibility = require (5), {reportSearch: reportSearch} = require (77); function getNextSiblings (e) {const t = []; let i = e; for (; i = i.nextElementSibling;) t.push (i); return t} function getMainChildren (e, t) {let i = [], n = e.firstChild; for (; n = n.nextElementSibling;) n.contains (t)? n.isSameNode (t) || (i = i.concat (getMainChildren (n, t ))): i.push (n); return i} function isMobile () {return visible.getViewportWidth () {let t; const i = e.querySelector (« . nav-dropdown-button-trigger »), n = dom.find (« body »), o = dom.find (« . top »), l = dom.find (« . confetti-list »), s = dom.find (« . nav-dropdown-button_nymag-homepage « ), r = dom.find ( » header.page-header « ) || o, c = dom.find (‘[data-editable = » main « ]’), a = dom.closest (e, ». page-header « ), d = a? a.querySelectorAll (« . confetti-image.blue « ): » « , g = a? a.querySelectorAll (« . confetti-image.green « ): » « , u = a? a.querySelectorAll (« . confetti-image.orange »): «  », f = a? a.querySelectorAll (« . confetti-image.orange2 »): «  », m = a? a.que rySe lectorAll (« . confetti-image.pink »): «  », p = a? a.querySelectorAll (« . confetti-image.purple »): «  », h = a? a.querySelectorAll (« . confetti-image . yellow « ): » « , y = e.querySelectorAll (« . dropdown-nav-search-form « ); function b (e) {let t = e.currentTarget, i = t.querySelector (« . nav-search- input « ), n = i? i.value.split ( » « ): []; e.preventDefault (), reportSearch (n, () => t.submit ())} i.addEventListener ( » click « , () => {initializeHeight (e), v ()}); for (let e = 0, t = y.length; e (function (e) {e.classList.remove (« c-right », « c -rightdown « , » c-left « , » c-leftdown « )}) (e))}, 500)} ()) 🙁 i.setAttribute ( » aria-expanded « , » true « ), t = window .scrollY), e.classList.toggle (« closed »), e.classList.toggle (« open »), n.classList.toggle (« disabled »), a&&e.isSameNode (s)? function () {if ( o.contains (e)) {const e = getMainChildren (o, s); S (e), w (o)} if (c.contains (e)) {const e = getMainChildren (c, s); o. classList.toggle (« hidden component »), w (c), S (e)} e.classList.toggle (« open-mobile »)} (): a&&! y&&r&& (w (r), function () { const i = e .classList.contains (« open »)? 0: t; window.scrollTo ({top: i})} ())} function w (e) {S (getNextSiblings (e))} function S ( e) {e .forE ach (e => {e.classList.toggle (« hidden-component »)})} n.addEventListener (« click », t => {! e.contains (t.target) &&e.classList.contains (« open « ) &&v ()}), document.addEventListener ( » keydown « , t => {27 === t.keyCode&&e.classList.contains ( » open « ) &&v ()})});
}, {« 4 »: 4, « 5 »: 5, « 77 »: 77}];
window.modules [« follow.client »] = [function (require, module, exports) {« use strict »; const _find = require (67), $ popup = require (78); DS.controller (« follow », [function () {function e (e) {this.el = e, this.handle = e.getAttribute (« data-handle »)} return e.prototype = {events: {click: « openFollow »}, openFollow: function (e) {var t, n, a = $ popup.position, o = $ popup.params, l = {}, r = {w: 780, h: 500}, s = new a (rw, rh) , c = this.el.classList; l.handle = this.handle, r.left = s.left, r.top = s.top, n = _find ([{className: « facebook », url: « https: //facebook.com/{handle} »,network: »Facebook »},{className: »pinterest »,url: »http://www.pinterest.com/ registers »,network: »Pinterest « }, {className: « instagram », url: « https://www.instagram.com/ Zonenhandle} », network: « Instagram »}, {className: « rss », url: « http: //feeds.feedburner. com / {handle} « , network: » RSS « }, {className: » twitter « , url: » https://twitter.com/intent/follow?screen_name=phiahandle Genealogie&tw_p=followbutton&variant=2.0 « , network: « Twitter »}, {className: « snapchat », url: « https://www.snapchat.com/discover/ Genealogiehandle} » , netw ork: « Snapchat »}], function (e) {return c.contains (e.className)}), l.url = n.url.replace (« {handle} », l.handle), l. network = n.network, l.name = « Follow » l.handle « on » l.network, t = new o (l, r), window.open (t.address, t.name, t.features), e. PreventDefault ()}}, e}]);
}, {« 67 »: 67, « 78 »: 78}];
window.modules [« comments-link.client »] = [function (require, module, exports) {« use strict »; const dom = require (4), _ get = require (13), _ isFinite = require (134), ajax = require (133); DS.controller (« comments-link », [function () {var t, e = « http: // » document.documentElement.getAttribute (« data-uri ») « .html »; Function n (n) {var o; (this.el = n, this.coral_talk_root = n.getAttribute (« data-coral-talk »), this.commentsCount = dom.find (n, « . Comments-link-count « ), this.commentsText = dom.find (n, ». comments-link-text « ), this.isNavVariation = n.classList.contains ( » comments-link_article-nav « ), this.cutoffCnt = n.getAttribute ( « data-cutoffCnt ») || 1e3, t = `$ {this.coral_talk_root} /api/v1/graph/ql`,this.shouldRenderCommentStream ()) && (o = this.onCommentCountFetched.bind (this), ajax. sendReceiveJson ({method: « GET », url: t ‘? query = {asset (url: « ‘ e ‘ ») {totalCommentCount}}’, dataType: « json »}, function (t, e) {var n = _get (e, « data.asset.totalCommentCount », 0); return t? o (t): _ isFinite (n)? void o (null, n): o (« Unexpected Coral Talk response »)})) } back ck n.prototype.onCommentCountFetched = function (t, e) {if (t) return console.warn (t); e> 0&& (this.isNavVariation&&e1? « s »: «  »), this.el.classList.remove (« no comments »))}, n.prototype.shouldRenderCommentStream = function () {return-1! == e.indexOf (« @ published »)}, n}]);
}, {« 4 »: 4, « 13 »: 13, « 133 »: 133, « 134 »: 134}];
window.modules [« head-gtm.client »] = [function (require, module, exports) {« use strict »; const {getCLS: getCLS, getFID: getFID, getLCP: getLCP} = require (166), isProduction = require (9) (); function reportWebVitals (e) {isProduction || console.log (« reportWebVitals:% O », e); const t = « string » == typeof e.name?e.name.toUpperCase () : e.name; window.dataLayer = window.dataLayer || [], window.dataLayer.push ({event: « analyticsEvent », event_action: t, event_category: « Web Vitals », event_label: e.id, event_value: e .delta, eventAction: t, eventCategory: « Web Vitals », eventLabel: e.id, eventNonInt:! 0, eventValue: e.delta, nonInteraction:! 0, transport: « beacon »})} getCLS (e => { e.delta = Math.round (1e3 * e.delta), reportWebVitals (e)}), getFID (e => {e.delta = Math.round (e.delta), reportWebVitals (e)}), getLCP ( e => {e.delta = Math.round (e.delta), reportWebVitals (e)});
}, {« 9 »: 9, « 166 »: 166}];
window.modules [« concert-ads.client »] = [function (require, module, exports) {« use strict »; const customMappings = {« crime-assault »: « power », « career money productivity »: « power « , » feminism-politics-identity « : » power « , » culture-media « : » culture « , celebrity: » culture « , living: » style « , fashion: » style « , shopping: » style « , weddings: « Style », Beauty: « Style », Animals: « Self », « Learn Creativity »: « Self », « Relationships-Friends-Family »: « Self », « Mental Health Personality Social Behavior »: « Self », « Learn creative « : » self « , » health-wellness « : » self « , parenting: » self « , » relationships-sex-dating marriage « : » self « }, striptags = require (79); function installConcertAds () {const e = new URLSearchParams (window.location.search) .get (« concert_config_url »), t = e || window.concertConfigUrl; window._nymPermutive || console.warn (« ConcertAds is initialized without permutive »), window.concertAds = createConcertAds (), window.concertAds.loadRemoteConfig (t) .then (function () {window.concertAds.install ()})} function createConcertAds () {const e = getAuth Status (); let t = getD ata (« title »), n = window.location.href, i = getData (« section »), o = «  », a = getData (« type »), r = getData ( « vertical »); t&& (t = striptags (htmlDecode (t)). split («  »)), n = n.slice (n.lastIndexOf (« / ») 1); const l = {kw: getKeywords () , network: r, page_type: a, entry_group: i, keywords: t, pn: n}; return « Homepage » === a? o = « homepage »: « Section Page » === a&& (o = (o = window.location.pathname). replace (/ // g, «  »)), i&&-1 === i.indexOf («  ») && (o = i), customMappings [i] && (o = customMappings [i]), window.location .hostname.match (/ . aws ./ i) ​​&& (l.clay_sandbox_env = r), new window.ConcertAds ({cmd: [], slots: [], dfpVariables: l, slugPath: « / » o. replace (/ – | – / g, « -« ), loggedIn: « unauthenticated »! == e, paywallActive: getPaywallStatus (e)})} function getKeywords () {try {const e = window._nymPermutive.article.keywords ; return e&&e.length> 0&&e.some (Boolean)? e: (document.querySelector (‘meta [name = « keywords »]’) || document.querySelector (‘meta [property = « article: tag »]’) ) .getAttribute (« content »). split (« , »). map (function (e) {return e.trim ()})} catch (e) {return}} function getData (e) {if (window. _nymPermutive) {if (e in window._nymPermutive) return window._nymPermutive [e]; if (window._nymPermutive.article&&e in window._nymPermutive.article) return window. _nymPermutive.article [e]; if (window._nymPermutive.user&&e in window._nymPermutive.user) return window._nymPermutive.user [e]}} function htmlDecode (e) {var t = document.createElement (« div »); return t.innerHTML = e, 0 === t.childNodes.length? «  »: t.childNodes [0] .nodeValue} function getAuthStatus () {const e = JSON.parse (localStorage.getItem (« auth0: profile » )), t = e? e [« http://nymag.com/app_metadata »]: null; return t? t.has_subscription? « entitled »: « unentitled »: « unauthenticated »} function getPaywallStatus (e) {const t = getData (« totalCount ») || 0; return Boolean (t> = 3&& « entitled »! == e)} window.ConcertAds? installConcertAds (): window.addEventListener (« concertAdsReady », in stallConcertAds);
}, {« 79 »: 79}];
window.modules [« latest-news.client »] = [function (require, module, exports) {« use strict »; const dom = require (4), lazyLoad = require (120); function lazyLoadImage (a) {const o = dom.find (a, « img [data-src] »), d = dom.findAll (a, « source [data-srcset] »), e = dom.closest (a, « . result »); if (o&&e) {new lazyLoad.LazyLoader (e, o, d) .init ()}} Function handleLazyLoad (a) {(dom.findAll (a, « . result ») || []). forEach (lazyLoadImage)} module.exports = (a => {handleLazyLoad (a)});
}, {« 4 »: 4, « 120 »: 120}];
window.modules [« coral-talk.client »] = [function (require, module, exports) {« use strict »; const dom = require (4), store = require (140), visibility = require (5), auth0 = require (10), TALK_AUTH = « talk: auth_token »; let coralEmbed, hasEmbedScriptLoaded =! 1, hasCoralTalkRendered =! 1; function renderComments (e) {if (hasEmbedScriptLoaded&&! hasCoralTalkRendered) {`$ {= talk e.CORAL_TALK_HOST} `, auth_token: getAuthToken (), asset_url: e.TALK_ASSET_URL}; hasCoralTalkRendered =! 0, coralEmbed = window.Coral.Talk.render (e.commentStreamContainer, t)}} function getAuthToken (e) {var = e&&e [« http://nymag.com/coral_talk »] || auth0.getTalkJwt (), i = store.get (TALK_AUTH); return t? i&&t == i? i: (store.set (TALK_AUTH, t ), t) 🙁 i&&store.remove (TALK_AUTH), null)} function coralLogin () {coralEmbed.login (getAuthToken ())} function embedScript (e, t) {let i = document.createElement (« script »); i.type = « text / javascript », i.async =! 0, i.src = e, i.addEventListener (« load », () => {hasEmbedScriptLoaded =! 0, renderComments (t)}), document.getElementsByTagName (« head ») [0] .appendChild (i)} function initVerificationMessage () {auth0.isAuthenticated () &&auth0.refresh (); let e = document.querySelector (« . coral -talk-container « ); auth0.isAuthenticated () &&! auth0.isEmailVerified () && (e.insertAdjacentHTML ( » beforebegin « , ‘ n n Please check your account to enable comments. Did not receive a conformation email? Send the email again now. N ‘), document.querySelector (« . Activation-link »). AddEventListener (« click », sendVerificationEmail))} function sendVerificationEmail () {let e = document.querySelector (« . Coral- talk -verify-address « ); return fetch (` https: // $ {window.location.host} / _user / verification-email? user_id = $ {auth0.getUserID ()} `, {method: » GET « , headers: {« Content-Type »: « application / json »}}). then (e => e) .then (t => {t&&200 == t.status? e.innerHTML = « Confirmation email was received sent successfully « : e.innerHTML =` $ {t.statusText} `}). catch (e => console.log (e))} Function attemptScriptEmbedding (e, t) {initVerificationMessage (), hasEmbedScriptLoaded? renderComments (t): embedScript (t .EMBED_URL, t)} function addVisibilityListener (e, t) {new Visibility.Visible (e, {preloadThreshold: 750}). on (« preload », () => attemptScriptEmbedding (e, t))} function removeSignInButton (e) {e&&e.parentNode&&dom.removeElement (e)} function init (e) {const t = e.getAttribute (« data-coral-talk-host »), i = `$ {t } / static / embed.js`, n = `http: // $ {document.documentElement.getAttribute ( » data-uri « )}. html`, a = » true « === e.getAttribute ( » data- maintenance « ), o = -1! == n.indexOf ( » @ published « ), r = e.querySelector (« . coral-talk-container « ), s = e.querySelector (« . coral-talk-btn -signin « ), c = {CORAL_TALK_HOST: t, EMBED_URL: i, commentStreamContainer: r, signInButton: s, TALK_ASSET_URL: n}; ), « . addEventListener (s.addEventListener », () => auth0.showLogin ()), auth0.isAuthenticated () &&removeSignInButton (s)}), auth0.on (« login », t => {removeSignInButton (s) , getAuthToken (t), visibility.isElementInViewport (e) &&attemptScriptEmbedding (c), hasCoralTalkRendered&&coralLogin ()}), auth0.on (« logout », () => {}.remove (TALK_ports) init;
}, {« 4 »: 4, « 5 »: 5, « 10 »: 10, « 140 »: 140}];
window.modules [« choreographer.client »] = [function (require, module, exports) {« use strict »; const cookie = require (65), _ get = require (13), _ omit = require (104), {insertSpeedBumpComponents : insertSpeedBumpComponents} = require (103), {insertNewsletterSpeedBumpComponents: insertNewsletterSpeedBumpComponents} = require (101), {generateGrowl: generateGrowl} = require (100), gtm = require (3), {getLocalStorage: getLocalStorage: setLocalSorage: setLocalS (t) 49) {reportPaywall: reportPaywall} = require (77), moment = require (54), {getClientHistory: getClientHistory, updateClientHistoryWithPageData: updateClientHistoryWithPageData} = require (102), auth0 = require (10), {Scenario: Scenario} = require (97) , cidReadyEvent = « nymcid-set », cidKey = « nymcid », isProduction = require (9) (), logger = require (98) .Logger (() => getLocalStorage (« show_choreographer_logs »)), {Verdon: Verdon} = require (99), TEST_COHORT_FLAG = « optimizeCohort »; function displayDebug (e = «  ») {if (« entitlement »! == e.split (« # »). pop ()) return; const t = _get (window , « dataLayer [0] .userDetails », {}), o = _get (w indow, « dataLayer [0] .pag eDetails.featureTypes « , » « ), n = o.includes ( » magazine « )? » magazine « : » « , r = o.includes ( » feature « )? » featured « : » « , i = » Value of the Article: « (n || r || » article « ), a = _get (JSON.parse (localStorage.getItem ( » auth0: profile « )), » http: // nymag. com / app_metadata « ), l = » Authentication status: « (a? » authenticated « : » unauthenticated « ), s = » Authorization status: « (!! a&&a.has_subscription? » entitled « : » unentitled « ), c = Object. keys (_omit (t, « newYorkMediaUserID »)). map (e => `$ {e}: $ {t [e]}`), d = document.body, g = document.createElement (« div »), u = document.createElement (« ul »); [i, l, s, … c] .map (e => {const t = document.createElement (« li »); return t.classList.add ( » debug-item « ), t.appendChild (document.createTextNode (e)), t}). forEach (e => {u.appendChild (e)}), u.classList.add ( » data-bullets « ), g.classList.add (« debug-choreographer »), g.classList.add (« display-debug-data »), g.appendChild (u), d.appendChild (g)} function initializeChoreographer (e) {const t = e.getAttribute (« data-site-slug »), o = pageShouldCountAsView (t), n = auth0.isSubs criber (); return t? getClientId (cidKey, 8e3) .then (e => (logger.h1 ( « Choreographer initialized »), logger.log (`clientId: $ {e}`), logger.log (`page counts as view: $ {o}`), window.nymViewsResponse || (o? UpdateClientHistoryWithPageData (e, t ): ge tClientHistory (e)))). then (r => {if (logger.group (), logger .h2 (« Client history »), logger.table (r), logger.groupEnd (), isNCR ()) return; const {scenarios: i, touts: a, testCohort: l = «  »} = readJSONFromScript (e. querySelector (« script »)); if (! (l === (document.body.dataset [TEST_COHORT_FLAG] || «  »))) return; const s = i.map (e => Scenario (Object.assign ( {}, e, {history: r, siteSlug: t, isSubscriber: n}))). filter (e => (logger.group (), logger.h2 (« Evaluate scenarios »), logger.log (e) , logger.groupEnd (), e.shouldShow)). reduce ((e, {action: t, min: o, count: n}) => {const r = a.find (({value: e}) = > e === t); Return r? (e [r.type] = r, e [r.type] .viewCount = no, e): e}, {}); logger.group (), logger. h2 (« Active Touts »), logger.log (s), logger.groupEnd (), executeTouts (e, o, s, r)}). catch (console.error): console.error (« siteSlug not found. « )} Function document I ncludesComponent (e) {return document.querySelector (` [data-uri * = « / $ {e} / »] `)} Function pageShouldCountAsView (e) {const t = » strategist « === e, o = [« product », « product-grid »]. find (e => documentIncludesComponent (e)); return t ||! o} Function executeTouts (e, t, o = {}, n) {const {global: r} = n, i = {featureArticleCount: r.Feature || 0, magazineArticleCount: r.Magazine || 0, standardArticleCount: r.Article || 0, totalArticleCount: r.total || 0}, a = window.concertAds , l = window.ConcertAds; if (o [« speed-bump »] && (_get (a, « adsBlocked »,! 0)? insertSpeedBumpComponents (findTemplate (e, « speed-bump »), o [« speed-bump « ], i): a.lifecycle.listenAndPlayback (l.events.slotsInserted, () => {insertSpeedBumpComponents (findTemplate (e, » speed-bump « ), o [ » speed-bump « ], i)})) , o [« newsletter-speed-bump »] && (_get (a, « adsBlocked »,! 0)? insertNewsletterSpeedBumpComponents (findTemplate ( e, « newsletter-speed-bump »), o [« newsletter-speed-bump »], i): a.lifecycle.listenAndPlayback (l.events.slotsInserted, () => {insertNewsletterSpeedBumpComponents (findTemplate (e, « newsletter -speed-bump « ), o [ » newsletter-speed-bump « ], i)})), o [ » branded-growl « ] &&brandedTakeoverTime (o [ » branded-growl « ]) &&t) return logger.log ( « should show Branded Growl »), void GrowlManager (findTemplate (e, « branded-growl »), {baseTrackingData: i, body: o [« branded-growl »]. brandedGrowlBody, contentClass: « branded-content », cta: o [« branded-growl »]. brandedGrowlCTA, imageUrl: o [« branded-growl »]. imageUrl, link: o [« branded-growl »]. brandedGrowlLink, name: o [« branded-growl »] .name, scrollDepth: o [« branded-growl »]. brandedGrowlScrollDepth, title: o [« branded-growl »]. brandedGrowlTitle, toutType: « branded-growl »}, « # branded-growl »); if (t&&o [« content- cliff « ]) contentCliff (findTemplate (e, » content-cliff « ), o [ » content-cliff « ], o [ » content-cliff « ]. viewsLeft, n); else {if (t&&o [ » cliff-takeo ver « ]) return / coronavirus news | pivot | paywall exclusive / i.test (window._nymGtmPage.tags)? void (isProduction&&logger.log ( » Content cliff no-op due to excluded tag match: « , window._nymGtmPage.tags) ): void cliffTakeover (findTemplate (e, « paywall-reader-interface »), i, o [« cliff-takeover »]); if (o [« growl-newletter »] ||! o [« Promo-Growl » ]) if (o [« Baby-Growl »]) babyGrowl (findTemplate (e, « Paywall-Reader-Interface »), i, o [« Baby-Growl »]); else {if (! o [« warning-growl-2 »]) return o [« warning-growl »] &&shouldWarn ()? (setContentCliffWarningDisplayed (), logger.log (« should show a warning »), void GrowlManager (findTemplate ( e, « warning-growl »), {contentClass: « warning-content », title: o [« warning-growl »]. warningGrowlTitle, name: o [« warning-growl »]. name, scrollDepth: o [« warning -growl « ]. warningGrowlScrollDepth, cta: o [ » warning-growl « ]. warningGrowlCTA, body: o [ » warning-growl « ]. warningGrowlBody, link: o [ » warning-growl « ]. warningGrowlLink, baseTrackingData: i, toutType: « warning Growl »}, « # warning-growl »)): void 0; warningGrowl (findTemplate (e, « paywall-reader-interface »), i, o [« warning-growl-2 »])} else growlManager (findTemplate (e, « growl-message »), {contentClass: « promo-content », title: void 0, name: o [« prom o-growl »]. name, scrollDepth: o [« promo-growl » ] .promoGrowlScrollDepth, cta: o [« promo-growl »]. promoGrowlCTA, body: o [« promo-growl »]. promoGrowlMessage, link: o [« promo-growl »]. promoGrowlLink, baseTrackingData: i, toutType:  » promo growl « }, » # growl-message « )}} functio n shouldWarn () {return! contentCliffWarningDisplayed ()} function getContentCliffWarningDisplayedKey () {const e = new Date, t = e.getMonth (); return`content-cliff-warning-displayed – $ {e.getFullYear ()} – $ {t} `} function contentCliffWarningDisplayed () {const e = getContentCliffWarningDisplayedKey (); return » true « === getLocalStorage (e)} function setContentCliffWarningDisplayed () {const e = getContentCliffWarningDisplayedKey (); return setLocalStorage (); return setLocalStorage (e) } function growlManager (e, {contentClass: t, scrollDepth: o, name: n, title: r, body: i, cta: a, link: l, baseTrackingData: s, toutType: c, imageUrl: d = null}, g = «  ») {const u = function () {const e = ` n n n n $ {r} n $ {d?  »: » « } n $ {i} n $ {d? « : «  »} n $ {a} n n n n `; return document.createRange (). createContextualFragment (e)} (), p = {creative: i, id: c , name: n, position: « growl »}; u.querySelector (« a »). addEventListener (« click », () => promotionReport (« Click », s, p)), generateGrowl (e, g, { content: u, scrollDep th: o, onShow: () => promotionReport (« View », s, p)})} function contentCliff (e, t, o, n) {const {first_visit: r, global: i} = n, a = {totalArticleCount: i.total || 0, standardArticleCount: i.Article || 0, featureArticleCount: i.Feature || 0, magazineArticleCount: i.Magazine || 0}, {contentCliffBody: l} = t, s = document. importNode (e,! 0) .querySelector (« . content-cliff »), c = document.querySelector (« . article-content> .clay-paragraph »), d = {creative: l, id: « content cliff » , name: « Content Cliff », position: « in-article »}; s&& (c.insertAdjacentHTML (« afterend », s.outerHTML), require (« content-cliff.client ») (document.querySelector (« . content -cliff « ), {contentCliffOptions: t, viewsLeft: o, firstVisit: Number (r), onShow: () => promotionReport ( » View « , a, d), onClickCliff: () => promotionReport ( » Click « , a, d)}))} function verdonFosseToutSetter (e, t, o, n, r) {const i = new Verdon ({container: « .paywall-reader-interface », url: « https: //fosse.nymag .com / fosse / v1.6.1 / index.html « }), a = e.type, l = {email: auth0.getEmail (), isAuthenticated: auth0.isAuthenticated (), isSubscriber: au th0.isSubscriber ()}; n.classList.add (a), i.once (« frame: ready », () => {i.sendMessage (« tout: show », {readerState: l, toutType: a, toutData: e}), r&&i.sendMessage (« frame: height »)}), i.on (« tout: visible », () => {promotionReport (« View », t, o)}), i.on (« tout: sign-in », () => {auth0.showLogin (window.location.href)}), i.on (« tout: log-out », () => {auth0.logout ()} ), i.on (« tout: dismiss », () => {n.classList.add (« dismiss »), i.sendMessage (« tout: hide », {toutType: a, toutData: e})}) , i.on (« tout: subscribe », () => {e.ctaLink = replaceQueryParams (e.ctaLink), promotionReport (« Click », t, o), window.location.href = e.ctaLink}), i.on (« frame: height », e => {n.style.height = `$ {e.payload.currentHeight 10} px`}), i.on ( » tout: view-account « , () = > {window.location.href = « https://subs.nymag.com/account »})} function pro motionReport (e, t, o) {const {creative: n, id: r, name: i, position : a} = o; t.event = `eec.promotion $ {e}`, t.ecommerce = {promoView: {promotions: [{creative: n.trim (), id: r, name: i, position: a}]}}, gtm.reportNow (t), reportPaywall ({creative: n.trim (), eventType: e, id: r, name: i, position: a})} function babyGrowl (e, t, o) {const n = document.importNode (e,! 0) .querySelector (« . paywall-reader-interface »), r = {creative: o. babygrowlDescription, id: « baby growl », name: « baby growl », position: « growl »}; document.body.appendChild (n), o.ctaLink = o.babygrowlCtaLink, o.ctaText = o.babygrowlMessage, o. headline = o.babygrowlDescription, verdonFosseToutSetter (o, t, r, n)} function cliffTakeover (e, t, o) {const {cliffTakeoverCTA: n, cliffTakeoverCtaLink: r, cliffTakeoverDescription: i, cliffTakeoverImage: a, cliffTake: loreStromPiff : s, type: c} = o, d = document.importNode (e,! 0) .querySelector (« . paywall-reader-interface »), g = document.querySelectorAll (« . clay-paragraph »), u = {creative: l, id: « content cliff », name: « Content Cliff », position: « growl »}, p = {cta: n, ctaLink: r, descriptio n: i, image: a, promo: l, status: s, type: c}; document.body.appendChild (d), g.forEach ((e, t) => {0! == t&&e.remove ()}), verdonFosseToutSetter (p, t, u, d,! 0), document.querySelector (« html »). style.overflowY = « hidden », document.body.style.position =  » fixed « } function warningGrowl (e, t, o) {const {type: n, warningGrowl2CTA: r, warningGrowl2CtaLink: i, warningGrowl2Description: a, warningGrowl2Image: l, warningGrowl2Promo: s, warningGrowl2Status: c} = o, d = document. importNode (e,! 0) .querySelector (« . paywall-reader-interface »), g = {creative: s, id: « warning growl », name: « Warning Growl », position: « growl »}, u = {cta: r, ctaLink: i, description: a, image: l, promo: s, status: c, type: n}; document.body.appendChild (d), verdonFosseToutSetter (u, t, g, d ,! 0)} function getClientId (e = «  », t = 8e3) {let o = cookie.get (e); return o? Promise.resolve (o): new Promise ((o, n) => {const r = setTimeout (() => {n (`could not find key: $ {e} on cookie after $ {t} ms`)}, t); window.addEventListener (cidReadyEvent, () => {clearTimeout (r), o (cookie.get (e))})})} function readJSONFromScript (e) {try {re turn JSON.parse (e.innerHTML)} catch (e) {return {touts: [], scenarios: []} }} function findTemplate (e, t = «  ») {const o = e&&e.querySelector (`[data-template-id = » $ {t} « ]`); return o&&o.content} function isNCR () {return / [? CS SEANDCHAR] source = ncr / .test (location.search)} function brandedTakeoverTime (e) {const {startTime: t, endTime: o, startDate: n, endDate: r} = e, i = n.concat («  », t), a = r.concat («  », o), l = moment (i), s = moment (a); return moment (). isBetween (l, s)} function optimizeDebugger () {return new Promise ( e => {const t = window.location.search || «  »; if (t) {const o = new URLSearchParams (t), n = o.get (« optimize-attribute-name ») || «  », r = o.get (« optimize-attribute-value ») || «  », i = o.get (« optimize-delay ») || 0, a = o.get (« optimize-cookie ») ||! 1; setTimeout (() => {a&& (document.cookie = randomNymcid ()), document.body.setAttribute (`data – $ {n}`, r), e ()}, i)} else e () })} function randomNymcid () {return`nymcid = $ {(() => ([1e7] -1e3 -4e3 -8e3 -1e11) .replace (/ [018] / g, e => (e ^ 16 * crypto.getRandomValues ​​(new Uint8Array (1)) [0] >> e / 4) .toString (16) [0])) ()} `} function replaceQueryParams (e) {const t = window.location.search || «  »; if (t) {const o = new URLSearchParams (t); if (e.includes (« ? »)) {const t = e.split (« ? »), n = new URLSearchParams (t [1] ); for (let e of o.entries ()) n.set (e [0], e [1 ]); e = `$ {t [0]}? $ {n.toString ()}`} else e = `$ {e}? $ {o.toString ()}`} return e} module.exports = (e => new Promise (e => {auth0.on (« init », () => {e ()})}). then (() => optimizeDebugger ()). then (() => { displayDebug (window.location.href), initializeChoreographer (e)}));
}, {« 3 »: 3, « 9 »: 9, « 10 »: 10, « 13 »: 13, « 49 »: 49, « 54 »: 54, « 65 »: 65, « 77 »: 77 , « 97 »: 97, « 98 »: 98, « 99 »: 99, « 100 »: 100, « 101 »: 101, « 102 »: 102, « 103 »: 103, « 104 »: 104,  » content-cliff.client « : » content-cliff.client « }];
window.modules [« growl.client »] = [function (require, module, exports) {« use strict »; require (164); const _some = require (84), dom = require (4), localStorageKeyRoot = « slideout – « , {getLocalStorage: getLocalStorage, setLocalStorage: setLocalStorage} = require (49); module.exports = ((e, t) => {const {content: o, onShow: s, scrollDepth: r = 50, dismissable: i =! 1} = t, n = Number (r || e.getAttribute (« data-display-at-page-scroll-percentage »)), a = dom.find (e, « . Modal »), l = « slideout- » (t.id || e.getAttribute (« id »)), c = getLocalStorage (l); function d () {a.classList.add (« hidden »)} function g () {setLocalStorage ( l,! 0), d ()} i&&c? e.remove () 🙁 o&&e.querySelector (« [data-content] »). appendChild (o), n&&function (e = 50) {constOb = newserver (intersection) e => {_ some (e, « isIntersecting ») && (a.style.top = « inherit », a.classList.remove (« hidden », « initial »), « function » == typeof s&&s (), t .unobserve (a))}); a.style.top = `$ {document.querySelector ( » body « ). scrollHeight / (100 / e)} px`, t.observe (a)} (n), e.querySelector (« . dismiss-modal »). addEventListener (« click », () => i? g (): d ()), e.addEventListener (« growl: hide » , d), e.addEventListener (« growl: dismiss », g))});
}, {« 4 »: 4, « 49 »: 49, « 84 »: 84, « 164 »: 164}];
window.modules [« newsletter-speed-bump.client »] = [function (require, module, exports) {« use strict »; const {loadRecaptcha: loadRecaptcha} = require (132), _ isEmpty = require (111), _ set = require (131), _ kebabCase = require (105), gtm = require (3), auth0 = require (10), visibility = require (5), COMPONENT_NAME = « newsletter-speed-bump », EMAIL_VALID_REGEX = / ^ (? : (?: [^ () [] \.,;: s @ « ] (?: . [^ () [] \.,;: s @ »]) *) | (« . »)) @ (?: (?: [[0-9] {1,3} . [0-9] {1,3} . [0-9] {1,3} . [0-9] {1,3}]) | (?: (?: [A-zA-Z -0-9] .) [A-zA-Z] {2,})) $ /, LOCAL_STORAGE_KEY_NAME = « newsletterSpeedBumpSignUpStatus _ », MAX_EMAIL_LENGTH = 50; function setClass (e, t) {e.classList.add (t)} function getRequestUrl (e) {return e.getAttribute (« action »)} function getPageType (e) {const t = e? e.getAttribute (« content »): «  »; return _kebabCase (t)} function getPayloadObject (e, t, r, s) {const n = {}; return _set (n, `vars. source _ $ {t} `,` $ {COMPONENT_NAME} _ $ {s} `), n.email = r, n.lists = {}, n.lists [t] =! 0, n.recaptcha = e, n .signuppage = `$ {document.location.href} _ $ {t}`, n [`source _ $ {t}`] = « newsleter_speedbump », n} module.exports = ((e, t) => {if (! t ||! e) return; if (« success » === window.localStorage.getItem (`$ {LOCAL_STORAGE_KEY_NAME} $ {t.newsletterSpeedBumpNewsletterId}`)) return void e.remove (); const {baseTrackingData: r, name: s, newsletterSpeedBumpCtaCopy: n, newsletterSpeedBumpDescription: i, newsletterSpeedBumpHeadline: a, newsletterSpeedBumpNewsletterId: o, newsletterSpeedBumpThankYouMessage: c, RECAPL} = t_get_KEY = lPEUBAPTCHA = t_KE0; ), d = e.querySelector (« . description »), p = e.querySelector (« . input.email »), m = e.querySelector (« . error-message »), h = e.querySelector (« . form « ), E = e.querySelector (« . form-container « ), y = e.querySelector (« . form-recaptcha-container « ), g = e.querySelector (« . headline « ), v = e. querySelector (« . container »), S = e.querySelector (« . input.newsletterId »), _ = e.querySelector (« . recaptcha-wrapper »), L = e.querySelector (« . input.submit »), w = e.querySelector (« . text-container »), q = new visibility.Visible (e, {shownThreshold: .5}); u&& (p.removeAttribute (« required »), e.classList.add (« signed -in « )), i.e. innerHTML = i, g.innerHTML = a, S.value = o, L .value = n, q.on (« shown », function () {if (visibility.isElementNotHidden (e)) {const e = r; e.event = « eec.promotionView », e.ecommerce = {promoView: { promotions: [{creative: `$ {a} | $ {i} `, id: » newsletter speed bump « , name: s, position: » in-article « }]}}, gtm.reportNow (e), q.destroy ()}}), p.addEventListener ( « focus », () => {_. classList.remove (« hidden »)}), h.addEventListener (« submit », t => {t.preventDefault (); const s = new XMLHttpRequest, n = u | | e.querySelector (« . input.email »). value, i = getPageType (document.querySelector (‘meta [name = « type »]’)); u ||! (n.length> = 50) &&EMAIL_VALID_REGEX. test (n)? loadRecaptcha (l, « newsletterSubmit »,! 0) .then (a => {s.open (« POST », getRequestUrl (h) ,! 0), s.setRequestHeader (« Content-Type », « application / json; charset = UTF-8 »), s.addEventListener (« load », s => {const a = s.currentTarget || s.target; if (a.status> = 200&&a.statussetClass (e, « success »)), [d, E, m, _]. forEach (e => setClass (e, « hidden »)), g.innerHTML = c.replace (« {{email}} », n), m.innerHTML = «  »; const s = JSON.parse (a.response), l = _isEmpty (s.sailthruIds)? «  »: Object.values ​​(s.sailthruIds) [0], u = r; u.event = « eec.purchase », u.ecommerce = {purchase: {actionField: {id: l, revenue: « 0.00 »}, products: [{category: « newsletter signup « , name: S.value, quantity: 1, variant:` $ {COMPONENT_NAME} – $ {i} `}]}}, gtm.reportNow (u), setTimeout (() => {e.classList.add ( « hidden »)}, 5e3), t.preventDefault ()} else m.innerHTML = « * An error has occurred. Please try again. « }), S.addEventListener ( » error « , () => {m.classList.remove ( » hidden « ), m.innerHTML = » * An error has occurred. Please try again. « }) , s.send (JSON.stringify (getPayloadObject (a, o, n, i))), t.preventDefault ()}): m.innerHTML = « * Please enter a valid email »})});
}, {« 3 »: 3, « 5 »: 5, « 10 »: 10, « 105 »: 105, « 111 »: 111, « 131 »: 131, « 132 »: 132}];
window.modules [« speed-bump.client »] = [function (require, module, exports) {« use strict »; const gtm = require (3), visibility = require (5); module.exports = ((e , i) => {if (! i ||! e) return; const {name: o, speedbumpDescription: r, speedbumpMessage: t, speedbumpLink: n, baseTrackingData: s} = i, c = new visibility.Visible (e , {shownThreshold: .5}); e.querySelector (« . description »). innerHTML = r, e.querySelector (« . promo-link »). innerHTML = t, e.querySelector (« . promo-link ») .href = n, e.classList.remove (« collapsed »), c.on (« shown », function () {if (visibility.isElementNotHidden (e)) {let e = s; e.event = « eec. promotionView « , e.ecommerce = {promoView: {promotions: [{name: o, creative: r, id: » speed bump « , position: » in-article « }]}}, gtm.reportNow (e), c .destroy ()}}), e.querySelector (« . promo-link »). addEventListener (« click », function () {let e = s; e.event = « eec.promotionClick », e.ecommerce = { promoClick: {promotions: [{name: o, creative: r, id: « speed bump », position: « in-article »}]}}, gtm.reportNow (e)})});
}, {« 3 »: 3, « 5 »: 5}];
window.modules [« content-cliff.client »] = [function (require, module, exports) {« use strict »; const auth0 = require (10), isProduction = require (9) (), logger = require (98 ) .Logger (() =>! IsProduction); module.exports = ((t, e) => {if (! E) return; logger.group (), logger.h2 (« Content Cliff »); const { contentCliffOptions: o, firstVisit: n, onShow: r, onClickCliff: i} = e, c = 300, l = Number (document.querySelector (« [data-components-count] »). getAttribute (« data-components-count « )), u = 3, s = [ » taboola « ], a = » # content-cliff « , f = t, d = function () {let t = 0; return document.querySelectorAll ( » [data-word -count] « ). forEach (function (e) {t = Number (e.getAttribute ( » data-word-count « ) || 0.10) || 0}), t} (), g = function ( t, e) {function o (t) {return Math.round (t.getTime () / 1e3 / 60)} const n = o (t), r = o (e); return no} (new Date, new Date (n)) {}, show: () => {r (), function () {(p = function (t = «  ») {return document.querySelectorAll (`$ {t} ~ *`)} ( a)). forEach (t => t.remove ()), function () {const {contentCliffStatus: e, contentCliffPromo: n, contentCliffCTA: r, contentCliffURL: c} = o, l = t.querySelector (« [data -content -cliff-status] « ), u = t.querySelector ( » [data-content-cliff-promo] « ), s = t.querySelector ( » [data-content-cliff-cta] « ); s&&s.setAttribute ( « href », c), s&&s.insertAdjacentHTML (« afterbegin », r), l&&l.insertAdjacentHTML (« afterbegin », e), u&&u.insertADJAR&u.insertE « click, sCenterCaddE, » sANDCHARu. } (), f.classList.remove (« collapsed »), e = s, e.forEach (t => {const e = document.querySelector (`[data-uri * = » / $ {t} / « ] `); e&&e.remove ()}), m.addEventListener ( » click « , () => auth0.showLogin ()); var e} ()}} [function () {if (dl) return logger.log (`article word count $ {d} was too short for the cliff`), logger.log (` article components count is smaller than $ {u} and not eligible for the cliff`), « noop »; if (g&&isProduction) return « noop »; g&&logger.log (`First session check was $ {g}! Showing the cliff anyway: isProduction => $ {isProduction} `); if (/ coronavirus news | pivot | paywall exclude / i.test (window._nymGtmPage.tags)) return isProduction&&logger.log ( » Content cliff no-op due to excluded tag match: « , window._nymGtmPage.tags), » noop « ; return » show « } ()], m = t.querySelector (« . content-cliff-login « ); let p = []; return logger .log (`should noop in production due to 30-minute first-session window: $ {g}`), logger.groupEnd (), auth0.on (« login », () => {f.classList.add ( « collapsed »), (p = Array.prototype.slice.call (p, 0) .reverse ()). forEach (t => f.insertAdjacentElement (« afterend », t)), p = []}), « function » == typeof h? h (): void 0});
}, {« 9 »: 9, « 10 »: 10, « 98 »: 98}];
window.modules [« ad.client »] = [function (require, module, exports) {« use strict »; const _forEach = require (66), _ max = require (68), _ find = require (67), _ includes = require (69), $ visibility = require (5), dom = require (4), MAX_MOBILE_RE = / [[0-9] {1,3} – (768 | 600) /, MAX_TABLET_RE = / [0-9] {3} – (1024 | 1180) /, DESKTOP_RE = / (1024 | 1180) -plus /, AD_NAME_SELECTOR = ‘[data-name ^ = « / 4088 / »], [data-name ^ = « / 172968584 / » ] ‘; var flaggedComponentsOnPage = function () {var e, t = document.querySelector (« . article-content »), n = []; return t&&_forEach ([‘. article-sidebar [data-width = « large »] ‘], function (a) {e = t.querySelectorAll (a), _ forEach (e, function (e) {n.push (e)})}), n} (); function getElementsVerticalOverlap (e, t) { var n = e.getBoundingClientRect (), a = t.getBoundingClientRect (); return! (n.top> a.bottom || n.righta.right)? a.bottom-n.top: 0} function getElementsOverlapAmount (e , t) {var n, a = []; return _forEach (t, function (t) {n = getElementsVerticalOverlap (e, t), a.push (n)}), _ max (a)} function getNYMagAdChannel (e) {var t = «  »; switch (e) {case « company information »: t = « comp any « ; break; case » new york guides & things to do « : t = » to-do « ; break; case » other « : t = e; break; case » sponsored guides « : t = » s-guides  » ; break; case « urbanist »: t = « urbanist »; break; default: t = «  »} return t} function appendSectionToDfpAds () {var e, t, n, a = document.querySelector (« meta [property = ‘ og: site_name ‘] « ), o = document.querySelector ( » article [data-content-channel] « ), i = document.querySelectorAll (AD_NAME_SELECTOR); a&& (e = a.content), o&& (t = o. getAttribute (« data-content-channel »). toLowerCase ()), t&& « New York Magazine » === e&& (n = getNYMagAdChannel (t)), n&&) {letPage) document.querySelector (« . body> div ») || {}, t = document.querySelector (« body ») || {}, n = e&&e.classList, a = n&&n.length? [… n]: [], o = _find (a, e => e.includes (« feature »)), i = document.querySelectorAll (AD_NAME_SELECTOR); n&& (o? appendPageNumberPositionToDfpAds (i, « Feature « ): n.contains ( » lede-gallery-content « )? appendPageNumberPositionToDfpAds (i, » Image_Gallery « ): t.classList.contains ( » one-column-layout « )? appendPageNumberPositionToDfpAds (i, » One_Column_Article « ): n .contains (« article-content ») &&appendPageNumberPositionToDfpAds (i, « Standard_Article »))} function appendPageNumberPositionToDfpAds (e, t) {const n = [« 528×379 », « 1100×200 », « 1×1 »]; let a = e || [], o = dom.find (« . ad-splash »), i = dom.find (« section.wrapper »), r = dom.find (« . secondary »), d = dom.find (« . bottom « ), s = dom.find (« . primary « ), c = {IA: {xsMobile: {normal: 1, grid: 1}, mobile: {normal: 1, grid: 1}, tablet: {normal : 1, grid: 1}, desktop: {normal: 1, grid: 1}}, BA: {xsMobile: {normal: 1, grid: 1}, mobile: {normal: 1, grid: 1}, tablet: {normal: 1, grid: 1}, desktop: {normal: 1, grid: 1}}}; a.forEach (e => {let a, l = «  », u = e.dataset.sizes, m = e.classList.value, p = _find (n, e => u.includes (e)), g = e.parentElement.classList.contains (« image-gallery-mobile-grid-ad »); if (u&&! p || e.setAttribute (« data-name », e.getAttribute (« data-name ») « / » t), iCSSEANDCHA R&u&&! P) {let n, u; if (o&&o.contains (e)? L = « LB »: i&&i.contains (e)? L = « IA » e (e) || s&&s.contains (e)) && (l = « BA »), c [l]) {if (! (u = checkForAdViewport (m))) return; g? (n = c [l] [u] .grid, c [l] [u] .grid) 🙁 n = c [l] [u] .normal, c [l] [u] .normal), a = n {e.setAttribute ( » data-name « , e.getAttribute ( » data-name « ) » / « t)})} function injectGoogleScripts () {var e = document.createElement ( » script « ), t = document.createElement ( » script « ) , n = document.createDocumentFragment (); e.src = « // www.googletagservices.com/tag/js/gpt.js »,e.async= »async »,t.src= »//pagead2.googlesyndication. com / pagead / js / adsbygoogle.js « , t.async = » async « , n.appendChild (e), n.appendChild (t), document.getElementsByTagName ( » body « ) [0] .appendChild (n)} appendSectionToDfpAds (), appendPageTypeToDfpAds (), injectGoogleScripts (), DS.controller (« ad », [« adService », function (e) {return function (t) {var n, a, o, i = t.getAttribu te (« data-offload »), r = new $ visibility.Visible (t, {preloadThreshold: i? window.innerHeight / 4: 200}), d =! 1; function s () {window.innerWidth> = 1180&&t .parentElement.classList.contains (« ad-repeat ») &&flaggedComponentsOnPage.length&& (a = getElementsOverlapAmount (t, flaggedComponentsOnPage), o = parseInt (10. marginTop = o 30 a « px »)} function c () {s (), e.refresh (n)} function l () {e.remove (n), d || (d =! 0, r.on (« shown », c))} document.querySelector (‘script [data-name = « concert-ads »]’) || (n = e.create (t), r.preload&& $ visibility.isElementNotHidden (t) ? (e.addToPageLoadQueue (n), i&&r.on (« hidden », l)) 🙁 r.on (« preload », function () {! n.slot&& $ visibility.isElementNotHidden (t) && (s) () , e.load (n))}), i&&r.on (« hidden », l)), this.adData = n)}}]);
}, {« 4 »: 4, « 5 »: 5, « 66 »: 66, « 67 »: 67, « 68 »: 68, « 69 »: 69}];
window.modules [« sticky-list.client »] = [function (require, module, exports) {« use strict »; const dom = require (4), $ gtm = require (3), _ get = require (13) , stickyContainer = require (« sticky-container.client »); DS.controller (« sticky-list », [« $ window », function (t) {var e = require (243), i = 40; function s ( s) {let n, r = function (t) {let s = t [0], n = 0, r = e.height (this.contentArea), o = this.contentArea.offsetHeight; if (this.containers&&this. containers.length) {if (s.target.offsetHeight) {let t = this.breakouts.findIndex (t => (function (t, e) {return t! == document.body&&t.contains (e)}) ( t, s.target.parentElement)); if (t> -1&&this.breakouts [t]) {let e = this.breakouts [t] .offsetHeight i; this.containers [t] .style.marginBottom = `$ { e} px`}} if (o! == this.currentHeigh) {const t = e.rect (this.rightRail, this.contentArea); this.currentHeight = o, this.rightRail.style.height = rt.top -a (this.rightRail) « px », this.breakouts.forEach ((s, r) => {let a = e.rect (s, this.contentArea), o = e.intersection (a, t); if (o) {let e, s = o.top-t .top-n; n = s o.height i, this.containers [r] .style.height = `$ {s} px`, this.containers [r] .style.minHeight =` $ {s} px` , e = this.breakouts [r] .offsetHeight i, this.containers [r] .style.marginBottom = `$ {e} px`}})}}}. bind (this); t.innerWidth {let n = _get (e, « dataset.name », «  »), r = n.slice (-1) || « 1 », a = [« Image_Gallery », « Standard_Article », « Feature », « One_Column_Article »]. find (t => n.includes (t)) || «  »; this.rightRail.parentElement.classList.contains (« tertiary ») &&a&& (e.dataset.name = parseInt (i, 10) se === t) || 0; return i.slice (s 1) .reduce ((t, e) => t (e.offsetHeight || 0), 0) || 0} return s.prototype = {setPins: function () { const t = e.rect (this.rightRail, this.contentArea), i = e.height (this.contentArea), s = it.top-a (this.rightRail); let n, o, h, l; if (this.populatePinsList (), s1&&t.classList.add (« multi-children »), l = 0; l {const t = Array.from (e.children); let o, a, i = 0; for (; i {handleLazyLoad (a)});
}, {« 4 »: 4, « 120 »: 120}];
window.modules [« article.client »] = [function (require, module, exports) {« use strict »; const $ visibility = require (5), $ gtm = require (3), ImageZoom = require (81), $ sentry = require (82); DS.controller (« article », [function () {var e = 40; function t (t) {const i = document.querySelector (« . wrapper> .tertiary »), n = t.querySelector (« . lede-image-wrapper.full-bleed »), r = t.querySelector (« . attribution.full-bleed »), o = t.querySelector (« . article-header »), l = o? o.querySelector (« img »): null, c = function () {let t = o.getBoundingClientRect (). height; n&& (t = n.getBoundingClientRect (). height 25, r&CSSEANDRect (t = r.getBounding () .height)), i.style.paddingTop = te « px »}; i&&o&& (window.innerWidtht (e)), document.addEventListener (« closeBanner », function () {i (e)}), $ sentry .initializeIDListeners ()}}]);
}, {« 3 »: 3, « 5 »: 5, « 81 »: 81, « 82 »: 82}];
window.modules [« tags.client »] = [function (require, module, exports) {« use strict »; const _forEach = require (66); DS.controller (« tags », [function () {function e ( e) {this.el = e} return e.prototype = {events: {« a.more click »: « showAll »}, showAll: function (e) {var t = e.target, o = this.el. querySelectorAll (« li.hidden »); _ forEach (o, function (e) {e.classList.remove (« hidden »)}), t.parentNode.removeChild (t), e.preventDefault ()}}, e} ]);
}, {« 66 »: 66}];
window.modules [« video.client »] = [function (require, module, exports) {« use strict »; const $ visibility = require (5), thirdParty = require (119); function replaceRight (i, e, n ) {var t = i.lastIndexOf (e); return-1 === t? i: i.substring (0, t) n i.substring (t e.length)} DS.controller (« video », [ function () {var i = .05, e = document.querySelectorAll (« . video-component »). length> = 3; function n (i) {var e = i.innerHTML; e = replaceRight (e = e. replace ( » x3c! -« , «  »), « – x3e », «  »), i.innerHTML = e} return thirdParty.includeScript (« https://www.youtube.com/iframe_api ») , function (t) {e? function (e) {var t = new $ visibility.Visible (e, {shownThreshold: i}); t.on (« shown », n.bind (this, e)), t .on (« hidden », function (i) {i.style.height = i.clientHeight « px », i.innerHTML =  » x3c! – » i.innerHTML « – x3e »}. bind (this , e))} (t): n (t)}}]);
}, {« 5 »: 5, « 119 »: 119}];
window.modules [« memo-pixel.client »] = [function (require, module, exports) {« use strict »; (() => {var e = document.createElement (« script »); e.async = ! 0, e.type = « text / javascript », e.src = document.location.protocol « //d16xpr36wrmcmk.cloudfront.net/js/memo.js »,(document.getElementsByTagName(« head »)[0] ||document.getElementsByTagName(« body »)[0]).appendChild(e)})(),module.exports=(()=>{});
}, {}];
window.modules[« affiliate-links.client »] = [function(require,module,exports){« use strict »;const dom=require(4),_includes=require(69),_startsWith=require(73),globalClick=require(71),visit=require(72),productSubtags=require(74);var excludedHostnames,skimlinksBaseUrl,skimlinksId,visitState,productUrl,ignoreDataAttribute= »data-affiliate-links-ignore »,article=window.document.querySelector(« article »),isSponsored=article&& »Sponsor Story »===article.getAttribute(« data-type »);function setExcludedHostnames(t){excludedHostnames=(t.getAttribute(« data-excluded-hostnames »)|| » »).toLowerCase().split(« , »)}function isSkimLink(t){return!!(skimlinksId=t.getAttribute(« data-skimlinks »))}function isExcluded(t){return _includes(excludedHostnames,t)||_startsWith(t, »www. »)&&_includes(excludedHostnames,t.slice(4))||isSponsored}function isUrlProtocol(t){return 0!==t.indexOf(« mailto: »)&&0!==t.indexOf(« javascript: »)}function getTargetHostname(t){return(t.hostname||t.host||t.href|| » »).toLowerCase()}function convertSkimlinkUrl(t){return(skimlinksBaseUrl=skimlinksBaseUrl||skimlinksId? »//go.redirectingat.com/?xs=1&id= » skimlinksId « &sref= » encodeURIComponent(window.location.href) « &url= »:void 0)&&skimlinksBaseUrl encodeURIComponent(t)}function hasIgnoreAttribute(t){return »true »===t.getAttribute(ignoreDataAttribute)}function convertSkimlink(t){var e,i,r,s=dom.closest(t.target, »a »),n=s&&s.href;n&&n.length&&!t.defaultPrevented&&(i=getTargetHostname(s),!isUrlProtocol(n)||isExcluded(i)||hasIgnoreAttribute(s)||productSubtags.getAffiliate(n)||(e=convertSkimlinkUrl(n))&&(productUrl=n,r=s&&s.getAttribute(« data-track-id »),s.href=productSubtags.ensureSubtag({url:e,productId:r,visitState:visitState,anchorEl:s})))}function revertSkimLink(t){var e=dom.closest(t.target, »a »),i=e&&e.href|| » »;i.includes(skimlinksBaseUrl)&&i&&i.length&&productUrl&&(e.href=productUrl)}module.exports=(t=>{const e=isSkimLink(t);visit.onceReady(function(t){visitState=t}),e&&(setExcludedHostnames(t),globalClick.addHandler(convertSkimlink,revertSkimLink))});
}, {« 4″:4, »69″:69, »71″:71, »72″:72, »73″:73, »74 »:74}];
window.modules[« gtm.client »] = [function(require,module,exports){« use strict »;const $gtm=require(3);DS.controller(« gtm »,[function(){return function(t){$gtm.init(t.getAttribute(« data-container-id »),t.getAttribute(« data-site-slug »))}}]);
}, {« 3 »:3}];
window.modules[« global-nav.client »] = [function(require,module,exports){« use strict »;const dom=require(4),auth0=require(10),signInButton=dom.find(« .user-signin »),signOutButton=dom.find(« .user-signout »),globalNav=dom.find(‘[class^= »global-nav »]’),body=dom.find(« body »),dropdownItems=dom.findAll(« .dropdown-wrap »),gtm=require(3),pageUri=require(160).getPageUri(),subscriptionPromoLinks=dom.findAll(« .persist-params »),searchString=window.location.search|| » »;function closeDropdowns(e){let t=globalNav.querySelectorAll(« .dropdown.open »);dropdownItems.forEach(function(n){let i=n.querySelector(« .dropdown »);!t||n.contains(e.target)&&27!==e.keyCode||i.classList.remove(« open »)})}function gtmSendReport(e,t,n){let i={eventCategory: »ecommerce »,eventAction: »componentClick »,brand:e,dimension23: »global-nav »,list:pageUri,pageZone: »header »,variant: »nav-link »}; »global-nav-link »===n&&(i.eventLabel=t.href),gtm.reportNow(i)}function updateElementTargetUrlsIfQueryStrings(e){if(searchString){const t=new URLSearchParams(searchString);let n=e.href;if(n.includes(« ? »)){const i=n.split(« ? »),o=new URLSearchParams(i[1]);for(let e of t.entries())o.set(e[0],e[1]);n=`${i[0]}?${o.toString()}`,e.href=n}else e.href=`${n}?${t.toString()}`}}function init(e){auth0.on(« init »,()=>{signInButton.addEventListener(« click »,function(e){e.preventDefault(),auth0.showLogin()}),signOutButton.addEventListener(« click »,function(e){e.preventDefault(),auth0.logout(),gtmSendReport(« Sign Out »,e.target, »user-info-link »)}),auth0.isAuthenticated()&&e.classList.add(« signed-in »),auth0.isSubscriber()&&e.classList.add(« subscribed »),e.querySelectorAll(« .user-link »).forEach(e=>{e.classList.add(« active »)}),subscriptionPromoLinks.forEach(e=>{updateElementTargetUrlsIfQueryStrings(e)})}),auth0.on(« login »,()=>{e.classList.add(« signed-in »),auth0.isSubscriber()&&e.classList.add(« subscribed »)}),auth0.on(« logout »,()=>{e.classList.remove(« signed-in »),e.classList.remove(« subscribed »)})}dropdownItems.forEach(function(e){e.addEventListener(« click »,function(){e.querySelector(« .dropdown »).classList.toggle(« open »)})}),body.addEventListener(« click »,closeDropdowns),document.addEventListener(« keydown »,closeDropdowns),globalNav.addEventListener(« click »,function(e){let t=e.target;t.classList.contains(« global-nav-track »)&&gtmSendReport(t.text,t, »global-nav-link »)}),module.exports=init;
}, {« 3″:3, »4″:4, »10″:10, »160 »:160}];
window.modules[« aaa-module-mounting.legacy »] = [function(require,module,exports){« use strict »;const _pickBy=require(163),_each=require(326),Fingerprint2=require(325),DS=require(324),Eventify=require(188);function registerGlobals(){window.DS=DS,window.Eventify=Eventify,window.Fingerprint2=Fingerprint2,DS.value(« Eventify »,Eventify),DS.value(« Fingerprint2 »,Fingerprint2),DS.value(« $document »,window.document),DS.value(« $window »,window)}function mountDollarSliceComponents(){DS.service(« components »,[« $document », »$module »,function(e,n){var o=_pickBy(n.definitions,e=>e.providerStrategy===n.providers.controller),r=Object.keys(o);function t(e){return o=>{try{n.get(e,o)}catch(e){logMountError(o,e)}}}_each(r,n=>{var o=e.querySelectorAll(‘[data-uri*= »/_components/’ n ‘/ »]’),r=e.querySelectorAll(‘[data-uri$= »/_components/’ n ‘ »]’);_each(o,t(n)),_each(r,t(n))}),this.components=r}]),DS.get(« components »)}function logMountError(e,n){const o=e.outerHTML.slice(0,e.outerHTML.indexOf(e.innerHTML));console.error(« Error attaching controller to  » o,n)}registerGlobals(), »loading »===document.readyState?document.addEventListener(« DOMContentLoaded »,()=>{mountDollarSliceComponents()}):mountDollarSliceComponents();
}, {« 163″:163, »188″:188, »324″:324, »325″:325, »326 »:326}];
window.modules[« ads.legacy »] = [function(require,module,exports){« use strict »;const _map=require(75),_forEach=require(66),_isString=require(207),_intersectionWith=require(327),_isEqual=require(214),_each=require(326),_debounce=require(124),_sortBy=require(147),page=require(160),visit=require(72);DS.service(« adService »,[« Eventify », »$cid », »$document », »$window »,function(e,t,a,i){var o,n,s,r,d,c,l,u,g,p,h={},m=this,f=[],b=visit.getQueryParamsObject([« utm_campaign »]),w=document.querySelector(‘script[data-type= »ad-a9″]’),v=[],y=!1,_=[],S=document.querySelector(‘script[data-name= »ad-doubleverify »]’);document.querySelector(‘script[data-name= »concert-ads »]’)||(i.NYM={},i.NYM.analytics={},i.NYM.analytics.adStartTime=i.performance.now(),i.googletag=i.googletag||{},i.googletag.cmd=i.googletag.cmd||[],c=i.googletag,(w||S)&&(i.googletag.cmd=i.googletag.cmd||[],i.googletag.cmd.push(function(){i.googletag.pubads().disableInitialLoad()})),w&&(l=i.setInterval(function(){void 0!==window.apstag&&void 0!==window.apstag.timeout&&(i.clearInterval(l),window.apstag.cleared=!0,l=null)},10),setTimeout(function(){l&&(i.clearInterval(l),i.googletag.pubads().refresh(),window.apstag||console.log(« MESSAGE: Timeout for A9 load exceeded, aborting »))},500)),S&&v.push(new Promise(function(e){y?e():_.push(e)})),u=document.createElement(« script »),g=document.createDocumentFragment(),p=document.getElementsByTagName(« head »)[0],u.src= »https://z.moatads.com/voxprebidheader841653991752/moatheader.js »,g.appendChild(u),p.insertBefore(g,p.firstChild),o=function(e){var t,a,o=e.data,n=[];return o.loaded?e:(o.loaded=!0,t=null,(t=o.sizes?c.defineSlot(o.name,o.sizes,o.id).addService(c.pubads()):c.defineOutOfPageSlot(o.name,o.id).addService(c.pubads())).setTargeting(« adid »,o.id),b.hasOwnProperty(« utm_campaign »)&&t.setTargeting(« utmcamp »,b.utm_campaign),a=m.getAdCount(o.label),t.setTargeting(« label »,o.label « _ » o.site « – » a),c.display(o.id),c.pubads().addEventListener(« slotOnload »,function(){i.NYM.analytics.firstAdLoadTime||(i.NYM.analytics.firstAdLoadTime=i.performance.now(),i.NYM.analytics.firstAdLoadLabel=e.data.label)}),n=T(o),Promise.all(v).then(function(){n?window.apstag&&window.apstag.cleared?window.apstag.fetchBids({slots:[n],timeout:window.apstag.timeout},function(){c.cmd.push(function(){window.apstag.setDisplayBids(),c.pubads().refresh([t],{changeCorrelator:!1})})}):S&&c.pubads().refresh([t],{changeCorrelator:!1}):c.pubads().refresh([t],{changeCorrelator:!1})}),e.slot=t,e)},n=function(e){var a,i,o,n=t(),s=e.getAttribute(« data-name »),r=e.getAttribute(« data-sizes »),d=e.getAttribute(« data-label »),c=e.getAttribute(« data-site »);n=e.id,r&&r.length?(r=r.split(« , »),a=[],_map(r,function(e){e=e.split(« x »),i=parseInt(e[0]),o=parseInt(e[1]),a.push([i,o])})):(e.classList.add(« oop »),a=!1),this.data={id:n,name:s,sizes:a,loaded:!1,label:d,site:c},h[n]=this},r=function(e){c.cmd.push(function(){var t=o(e);h[e.data.id]=t})},s=function(e){var t=[];e.slot?(t=T(e))&&window.apstag&&window.apstag.cleared&&window.apstag.fetchBids({slots:[t],timeout:window.apstag.timeout},function(){c.cmd.push(function(){window.apstag.setDisplayBids(),c.pubads().refresh([e.slot],{changeCorrelator:!1})})}):e&&r(e)},c.cmd.push(function(){var e,t,o,n=page.getMeta(« article:tag »),s=page.getMeta(« author »),r=i.location.href,d=(e=a.head.querySelector(« .head-gtm »),t=a.body.querySelector(« .gtm »),e&& »top »===e.getAttribute(« data-gtm »)? »gtmtop »:t&& »bottom »===t.getAttribute(« data-gtm »)? »gtmbottom »: » »);o=[],_forEach([n,s,d],function(e){_forEach(e.split(« , »),function(e){(e=e.trim().toLowerCase().replace(/s/g, »-« ).replace(/’|’/g, » »)).length&&o.push(e)})}),c.pubads().setTargeting(« kw »,o),c.pubads().setTargeting(« entry_group »,o),r=r.slice(r.lastIndexOf(« / ») 1),c.pubads().setTargeting(« pn »,r),c.companionAds().setRefreshUnfilledSlots(!0),c.pubads().enableAsyncRendering(),c.enableServices()}),this.load=r,this.create=function(e){return new n(e)},this.refresh=function(e){var t;_isString(e)?(t=this.getById(e),s(t)):s(e)},this.remove=function(e){var t=e.data.id;a.getElementById(t).innerHTML= » »},this.getAdCount=function(e){var t,a=0,i=Object.keys(h);return _each(i,function(i){(t=h[i]).data.loaded&&t.data.label===e&&a }),a},this.getById=function(e){return h[e]},d=_debounce(function(){var e={TopLeaderboard:1,RightColTopMPU:2,outOfPage:99, »homepageTakeover/TopLeaderboard »:1},t=_sortBy(f,function(t){return e[t.data.label]||10});_forEach(t,function(e){return e.data.sizes?r(e):i.setTimeout(function(){r(e)},2e3)}),S&&window.PQ.cmd.push(()=>{try{window.PQ.loadSignals([« ids », »bsc », »vlp »],q)}catch(e){q(),console.error(`There has been an error loading Double Verify signals: ${e}`)}}),f=[]},10),this.addToPageLoadQueue=function(e){f.push(e),d()});function T(e){var t,a=e.sizes;return a=_intersectionWith(a,[[970,250],[970,90],[728,90],[300,600],[300,250],[320,100],[320,50]],_isEqual),e.sizes&&e.sizes.length&&(t={slotID:e.id,sizes:a,slotName:e.label}),t}function q(){y=!0,_forEach(_,function(e){e()})}}]);
}, {« 66″:66, »72″:72, »75″:75, »124″:124, »147″:147, »160″:160, »207″:207, »214″:214, »326″:326, »327 »:327}];
window.modules[« cid.legacy »] = [function(require,module,exports){« use strict »;DS.service(« $cid »,function(){var r=Math.floor(100*Math.random());return function(){return »cid- » r}});
}, {}];
window.modules[« client.legacy »] = [function(require,module,exports){« use strict »;require(« cid.legacy »),require(« ads.legacy »),require(« facebook.legacy »),require(« aaa-module-mounting.legacy »);
}, {« cid.legacy »: »cid.legacy », »ads.legacy »: »ads.legacy », »facebook.legacy »: »facebook.legacy », »aaa-module-mounting.legacy »: »aaa-module-mounting.legacy »}];
window.modules[« facebook.legacy »] = [function(require,module,exports){« use strict »;DS.service(« facebook »,[function(){this.fb=function(i){window.FB&&window.FB[i].apply(this,Array.prototype.slice.call(arguments,1))}}]);
}, {}];
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 typeof key === ‘string’ && key.match(/.legacy$/)).forEach(key => window.require(key));
}

function tryToMount (fn, el, name) {
try {
fn (el); // init the controller
} catch (e) {
const elementTag = el.outerHTML.slice (0, el.outerHTML.indexOf (el.innerHTML));
console.error (`Error initializing controller for » $ {name} « on » $ {elementTag} « `, e);
}
}
/ **
* mount client.js component controllers
* /

function mountComponentModules () {
Object.keys (window.modules) .filter (key => typeof key === ‘string’ && key.match (/ . Client $ /)). ForEach (key => {
let controllerFn = window.require (key);

if (typeof controllerFn === ‘function’) {
const name = key.replace (‘. client’,  »),
instancesSelector = `[data-uri * = » _ components / $ {name} / « ]`,
defaultSelector = `[data-uri $ = » _ components $ {name} « ]`,
instances = document.querySelectorAll (instancesSelector),
defaults = document.querySelectorAll (defaultSelector);

for (let el of instances) {
tryToMount (controllerFn, el, name);
}

for (let el of defaults) {
tryToMount (controllerFn, el, name);
}
}
});
} // Make sure that a `window.process.env.NODE_ENV` is available in the client for any dependencies,
// services, or components that could require it
// note: the «  value is swapped for the actual environment variable in /lib/cmd/compile/scripts.js

window.process = window.process || {};
window.process.env = window.process.env || {};

if (! window.process.env.NODE_ENV) {
window.process.env.NODE_ENV =  »;
} // note: legacy controllers that require legacy services (e.g. dollar-slice) must
// wait for DOMContentLoaded to initialize themselves, as the files themselves must be mounted first

mountLegacyServices ();
mountComponentModules ();
//]]

Keywords:

Jack Antonoff,Bleachers,Bruce Springsteen,Jack Antonoff, Bleachers, Bruce Springsteen,,Pop and rock,Music,Culture,,,,switched on pop, bleachers, jack antonoff, music, summer hits, podcast, lorde, taylor swift, lana del rey,

Donnez votre avis et abonnez-vous pour plus d’infos

[gs-fb-comments]

Vidéo du jour: