Lisa Vanderpump has a stable. She has a tiny pink stable in her backyard that is either a Hobbit house that her friend Mohamed brought back from Middle Earth, or is one of those Playschool tiny forts that they spray-painted pink. Lisa had to — yes, she just had to — get a stable for her backyard because otherwise the miniature ponies would just roam all around the estate, darling, leaving their droppings and cuteness all over the lawn where anyone could happen upon them or, more importantly, step in them. (That entire sentence should be read like your auditioning for Mary Poppins.)
Lisa Vanderpump’s Pretty in Pink Pony Stable (figures not included) is the very definition of a rich person’s problem. No one has ever dealt with this issue before her. Who else would have a tiny pony in Beverly Hills, not to mention two? Only Lisa Vanderpump. I don’t know if this makes her ridiculous in a way that I prize because of its outlandishness, or ridiculous in a way I despise because of its exhaustiveness. The jury’s still out. However, the ponies are not. They are in. They are in a stable in Lisa’s backyard.
The centerpiece of the episode is not the little ponies, but the weird dinner that Yolanda Bananas Foster hosts for all of her friends at Wally’s, one of those restaurants whose reputation you feel like you should recognize, but you don’t. I bet it has three-and-a-half stars on Yelp.
This is the most disjointed dinner in Housewives history for a few reasons. First of all, everyone is forced into their chairs upon arrival, and they are lined up two-by-two in a long row, which means those on one end of the table can’t talk to the other end of the table. A proper Housewives dinner party needs mingling time before the first course so everyone can queue up their grievances.
I’m worried that factions are forming this season, which is the death knell for any Real Housewives franchise. Just like in New York when Ramona and Jill Zarin were leading different squadrons, the factions here also seem to be divided along hair color. Yolanda, Eileen, and Erika are in one group; Lisa, Lisar, and Cult Jam on the other (in this instance, Cult Jam is Kyle). Kathryn isn’t on a team because no one wants to play with her because she makes up the rules as she goes along. Also, she has cooties.
Seriously, Kathryn did some messed-up shit to Erika Jaynerardi, which is part of the reason why there is so much drama at dinner. The two of them had lunch together and Kathryn was all like, “I will be your first ever lady friend. Whatever you tell me, I won’t repeat.” Then, later that night at Lisa’s house (pre-stable, but post–wine bar), Kathryn sat down and was like, “Who wants to know what Erika told me?” She looked around the table waiting for the women to all raise their hands, but they just stared at her, blinking, hoping she would give up the goods so they could deny trash-talking Erika later if things didn’t go their way. That’s when Kathryn told everyone that Erika said that Lisa is manipulative.
Erika in no way denies this or is trying to obfuscate the truth. When Lisa asks her about it, Erika says to her face, “Yeah, I think that you have a way of influencing people.” (That’s a little bit of a spin, but pretty much what she said.) However, the exchange between Lisa and Erika gets a little bit heated — a little too heated, if you ask me — especially because Erika gets hung up on a question that Lisa and Kathryn both ask about how long she has known Yolanda. Does that even matter? Who objects to that question? It’s like not letting them look through your bag at the movies out of some objection to NSA spying.
I can’t decide who is right or wrong here. I think Erika is right not to entirely trust Lisa, but I think Lisa should be a little taken aback that Erika has her number so quickly. These two were never going to get along in the first place. They’re both just too similar. This is why the gays only hang around with one girl at a time, because when you put two gurl’s girls (which is what I’m now calling women who enjoy the company of gay men) together, they’re always going to fight for who is on top. (That is because, in West Hollywood, there are no tops except gurl’s girls.)
Erika, in her absolutely amazing black-and-red-striped dress with the Jackie Collins shoulders, goes over to Kathryn and delicately, but expertly, diverts the conversation exactly to where she wants it to go: to what Kathryn said about her at Lisa’s. Kathryn then admits to what she told Lisa, which is good because Erika already knows. The only thing worse than being a rat is being both a liar and a rat. (Or maybe it’s being Pizza Rat? I don’t know, I think that’s maybe the best rat.)
What Kathryn does next is totally inexcusable and very much encapsulates what I don’t like about her. She says she assumed anything Erika would tell her was something that she would tell everyone, so she just repeated it. First of all, just because Erika might tell them to their faces, that is Erika’s opinion to tell. It’s like if Erika gave Kathryn a magic lip gloss and then Kathryn showed up at Lisa’s house and was like, “Look at the magic lip gloss Erika bought me. It makes your pussy invisible!” She’s showing off. Kathryn is using her information and using it competitively. This strategy is backfiring already.
Kathryn’s justification is also total garbage. It’s the kind of self-righteous thing people say to make themselves look better for being gossips, as if their transparency is somehow a virtue. It’s sort of like a porn star who uses his own name and then looks down on other people for using fake names. Too bad Tim O’Toole is the only guy whose Google results will be ruined when he’s finally too old for porn and can’t get a job at a Hobby Lobby somewhere in his home state of Arkansas.
To make it even worse, Kathryn goes, “If you didn’t know that I would repeat things, then that’s on you.” First of all, that is something an asshole says, plain and simple. Secondly, it shouldn’t be on Erika because Kathryn is the one who told Erika she would keep her secrets. If you haven’t noticed, I’m really upset about this whole thing, and not just because it happened to Erika, my new second favorite Housewife (#TeamEileen), but also because Kathryn was such a jerk about it. You know she went home from that dinner feeling totally blameless and wondering why she doesn’t have more friends.
Ugh, a sigh as deep as the foundation of the pony stable.
The dinner finally ends when David Foster, a pair of used schoolgirl panties you bought from a Japanese vending machine, invites everyone to hear a very special guest: Andrea Bocelli. Okay, yes, he gave a great performance, but wouldn’t you be a little mad if David played up this whole thing and then it was really just some opera singer only enjoyed by people who get AARP Magazine. The women all oohed and ahhed and I’m glad I wasn’t there. I would have been just like this little kid who unwrapped an avocado for Christmas.
Whatever to all of this noise, because we are probably going to dissect the minutiae of the Erika/Lisa/Kathryn triangle of doom for episodes to come, like trying to erect a ship in a bottle with false eyelashes and whispers. What I really want to talk about is Kim and Kyle. We all knew this was going to happen because Kyle’s dead mother sent a signal from heaven when Andrea Bocelli sang “Ave Maria” and that meant that they had to get back together. What you don’t really know is that underneath those sunglasses, Bocelli really has two Magic 8-Balls stuck in his skull. He’s a Ouija board with legs.
Shortly after her birthday dinner, during which Kim and Kyle signed a ceasefire after eight months of not speaking, Kim comes over to Kyle’s house for a little on-camera chat and the two of them have the first honest conversation that I’ve ever seen them have. I don’t know if enough time has passed and everything just settled, like a salad left too long on the counter, but they seem honest and open about disappointments on both sides and how they’re not sure how to mend their relationship.
Both of them have that Housewives ability to not dredge up things from the past, skating over it on the way to a shaky resolution, but they agree that they did need to address their past if they ever want to make it to the future. Holy hell, guys. What is happening here? Are the Sisters Richards actually having an insightful and intelligent discussion about their feelings? Did hell freeze over? Are pigs flying? Did McDonald’s start serving breakfast past 11 a.m.?
“We need to talk about this and do it quietly, not in front of a room full of people,” Kim says. “That’s where it went bad for you and I.” Wait, did Kim just admit that parading their shadow-demon history in front of a national television audience wasn’t a good idea? Who are these people? I don’t even recognize them anymore.
“I don’t know how to make a change,” Kyle says, finally admitting some guilt, finally realizing that she had some culpability in this mess and that it didn’t have everything to do with Kim’s sobriety. Holy crap! Did Kyle Richards, a woman who believes the sun rises and sets around her Birkin collection, actually realize that there are things that aren’t entirely about her?
Then Kim admitted that she resents Kyle, and Kyle admitted she thought Kim hated her, and Kim said, “I guess I’m hard to love,” and then my heart shattered into a million tiny little ice slivers and melted down my face. There were no tears on my face. No, I will not admit to crying because of the Sisters Richards on The Real Dr. Phils of Self-Help Junction. I will not. This did not make me cry at all.
As I wiped away my tears, Kim got up from the overstuffed sofa in Kyle’s Faye Resnick–designed living room and gave Kyle a hug. She looked at the producers and said, “Do you have everything you need?” Melissa said yes, she did, and pointed for Rusty, the sound guy, to come over and take off Kim’s microphone. He came over and she held her arms out like she was about to slip on a bullet-proof jacket or fly all the way back to Thousand Oaks. He pulled the battery pack off of her belt and un-snaked the cord from her body.
“I’ll see you later,” Kim said, picking up her purse and heading for the door. Kyle dabbed the corner of her eyes with her index finger and just nodded silently. Kim walked out to the curb, got in her car, started the motor, and drove to the end of the block. She parked on the next street, enjoying the hot of the car, the stifling air laying over her whole body like a zippered sleeping bag, drawing her into something like drowsy relaxation. Man, that had been hard for her, doing that in public again, knowing how bad it had been in the past. Kim put her forehead against the steering wheel, letting the blunt pressure remind her that she was still alive.
Kim closed her eyes for what might have been a minute, or might have been an hour, her thoughts running together and jumbling up, like the moment when whipping cream finally catches enough air to form stiff peaks, slowing the whisk to near stoppage. A car drove by and Kim jolted up, looking out the window. It was the production van, cruising through the shade provided by the heavy trees on one side of the road.
Kim started the car again and barely pressed on the accelerator as she turned around and went back down the road. She pulled up in front of Kyle’s again. She took off her high heels and threw them on the passengers seat and got out of the car without worrying about her microphone or setup shots or coverage. She walked half on the flagstones and half on the grass toward the door and knocked lightly, soft enough that if Kyle didn’t hear it, she could still turn away and get back in the car. But she did hear. The door opened. Kyle answered the door and stood there with little motes of dust making the evening sun look brighter, like it had consistency and heft. Then everything stopped for a moment as every molecule around them inhaled. “Hi.”
By submitting your email, you agree to our
Terms and Privacy Notice
and to receive email correspondence from us. This site is protected by reCAPTCHA and the Google
Privacy Policy and
Terms of Service apply.
or
Already a subscriber?
What is your email?
This email will be used to sign into all New York sites. By submitting your email, you agree to our Terms and Privacy Policy and to receive email correspondence from us.
Password must be at least 8 characters and contain:
Lower case letters (a-z)
Upper case letters (A-Z)
Numbers (0-9)
Special Characters (!@#$%^&*)
This password will be used to sign into all New York sites. By submitting your email, you agree to our Terms and Privacy Policy and to receive email correspondence from us.
You’re in!
As part of your account, you’ll receive occasional updates and offers from New York, which you can opt out of anytime.
or
Already a subscriber?
What is your email?
This email will be used to sign into all New York sites. By submitting your email, you agree to our Terms and Privacy Policy and to receive email correspondence from us.
Password must be at least 8 characters and contain:
Lower case letters (a-z)
Upper case letters (A-Z)
Numbers (0-9)
Special Characters (!@#$%^&*)
This password will be used to sign into all New York sites. By submitting your email, you agree to our Terms and Privacy Policy and to receive email correspondence from us.
You’re in!
As part of your account, you’ll receive occasional updates and offers from New York, which you can opt out of anytime.
Already a subscriber?
Already a subscriber?
`;
// integrate Sub(x) scripts and elements
if (hostname !== 'subs.nymag.com') { // do not integrate on this subdomain
document.head.appendChild(trackingScript);
document.body.insertAdjacentHTML('beforeend', subXAnimationElements);
}
There was an error processing the request. Please try again later."}).catch(e=>console.error("Error verifying email: ",e)))(r.querySelector(".content"),o.bannerCTAVerification)})):(l.remove(),s.remove()),o.dismissable||n.remove(),o.useAlertIcon||a.remove(),r.classList.add("show"),n.addEventListener("click",()=>{u(),r.classList.remove("show")})}else r.remove()}});
}, {"1":1,"6":6,"12":12,"35":35,"40":40}];
window.modules["global-nav.client"] = [function(require,module,exports){"use strict";const dom=require(4),auth=require(12),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(1),appendLandingPageParams=require(135),pageUri=require(124).getPageUri(),subscriptionPromoLinks=dom.findAll(".persist-params"),searchString=window.location.search||"";function closeDropdowns(e){let n=globalNav.querySelectorAll(".dropdown.open");dropdownItems.forEach(function(t){let o=t.querySelector(".dropdown");!n||t.contains(e.target)&&27!==e.keyCode||o.classList.remove("open")})}function gtmSendReport(e,n,t){let o={eventCategory:"ecommerce",eventAction:"componentClick",brand:e,dimension23:"global-nav",list:pageUri,pageZone:"header",variant:"nav-link"};"global-nav-link"===t&&(o.eventLabel=n.href),gtm.reportNow(o)}function updateElementTargetUrlsIfQueryStrings(e){if(searchString){const n=new URLSearchParams(searchString);let t=e.href;if(t.includes("?")){const o=t.split("?"),i=new URLSearchParams(o[1]);for(let e of n.entries())i.set(e[0],e[1]);t=`${o[0]}?${i.toString()}`,e.href=t}else e.href=`${t}?${n.toString()}`}}function init(e){const n=e.querySelectorAll(".to-landing-page");window.addEventListener("auth:init",()=>{signInButton.addEventListener("click",function(e){e.preventDefault(),auth.showEmbeddedLoginFlow("top navigation")}),signOutButton.addEventListener("click",function(e){e.preventDefault(),gtmSendReport("Sign Out",e.target,"user-info-link"),auth.logout()}),auth.isAuthenticated()&&e.classList.add("signed-in"),auth.isSubscriber()&&e.classList.add("subscribed"),e.querySelectorAll(".user-link").forEach(e=>{e.classList.add("active")}),subscriptionPromoLinks.forEach(e=>{updateElementTargetUrlsIfQueryStrings(e)}),appendLandingPageParams(n)})}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 n=e.target;n.classList.contains("global-nav-track")&>mSendReport(n.text,n,"global-nav-link")}),module.exports=init;
}, {"1":1,"4":4,"12":12,"124":124,"135":135}];
window.modules["aaa-module-mounting.legacy"] = [function(require,module,exports){"use strict";const _pickBy=require(221),_each=require(406),Fingerprint2=require(408),DS=require(407),Eventify=require(246);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();
}, {"221":221,"246":246,"406":406,"407":407,"408":408}];
window.modules["ads.legacy"] = [function(require,module,exports){"use strict";const _map=require(118),_forEach=require(107),_isString=require(268),_intersectionWith=require(409),_isEqual=require(274),_each=require(406),_debounce=require(182),_sortBy=require(205),page=require(124),visit=require(114);DS.service("adService",["Eventify","$cid","$document","$window",function(e,t,a,i){var o,n,s,r,d,c,u,l,g={},p=this,h=[],f=visit.getQueryParamsObject(["utm_campaign"]),m=document.querySelector('script[data-type="ad-a9"]'),b=[],w=!1,v=[],y=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||[],u=i.googletag,(m||y)&&(i.googletag.cmd=i.googletag.cmd||[],i.googletag.cmd.push(function(){i.googletag.pubads().disableInitialLoad()})),m&&(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)),y&&(b.push(new Promise(function(e){w?e():v.push(e)})),c=i.setTimeout(T,2500)),o=function(e){var t,a,o=e.data,n=[];return o.loaded?e:(o.loaded=!0,t=null,(t=o.sizes?u.defineSlot(o.name,o.sizes,o.id).addService(u.pubads()):u.defineOutOfPageSlot(o.name,o.id).addService(u.pubads())).setTargeting("adid",o.id),f.hasOwnProperty("utm_campaign")&&t.setTargeting("utmcamp",f.utm_campaign),a=p.getAdCount(o.label),t.setTargeting("label",o.label+"_"+o.site+"-"+a),u.display(o.id),u.pubads().addEventListener("slotOnload",function(){i.NYM.analytics.firstAdLoadTime||(i.NYM.analytics.firstAdLoadTime=i.performance.now(),i.NYM.analytics.firstAdLoadLabel=e.data.label)}),n=_(o),Promise.all(b).then(function(){n?window.apstag&&window.apstag.cleared?window.apstag.fetchBids({slots:[n],timeout:window.apstag.timeout},function(){u.cmd.push(function(){window.apstag.setDisplayBids(),u.pubads().refresh([t],{changeCorrelator:!1})})}):y&&u.pubads().refresh([t],{changeCorrelator:!1}):u.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},g[n]=this},r=function(e){u.cmd.push(function(){var t=o(e);g[e.data.id]=t})},s=function(e){var t=[];e.slot?(t=_(e))&&window.apstag&&window.apstag.cleared&&window.apstag.fetchBids({slots:[t],timeout:window.apstag.timeout},function(){u.cmd.push(function(){window.apstag.setDisplayBids(),u.pubads().refresh([e.slot],{changeCorrelator:!1})})}):e&&r(e)},u.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)})}),u.pubads().setTargeting("kw",o),u.pubads().setTargeting("entry_group",o),r=r.slice(r.lastIndexOf("/")+1),u.pubads().setTargeting("pn",r),u.companionAds().setRefreshUnfilledSlots(!0),u.pubads().enableAsyncRendering(),u.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(g);return _each(i,function(i){(t=g[i]).data.loaded&&t.data.label===e&&a++}),a},this.getById=function(e){return g[e]},d=_debounce(function(){var e={TopLeaderboard:1,RightColTopMPU:2,outOfPage:99,"homepageTakeover/TopLeaderboard":1},t=_sortBy(h,function(t){return e[t.data.label]||10});_forEach(t,function(e){return e.data.sizes?r(e):i.setTimeout(function(){r(e)},2e3)}),y&&window.PQ.cmd.push(()=>{try{window.PQ.loadSignals(["ids","bsc","vlp"],T)}catch(e){T(),console.error(`There has been an error loading Double Verify signals: ${e}`)}}),h=[]},10),this.addToPageLoadQueue=function(e){h.push(e),d()});function _(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 T(){i.clearTimeout(c),w=!0,_forEach(v,function(e){e()})}}]);
}, {"107":107,"114":114,"118":118,"124":124,"182":182,"205":205,"268":268,"274":274,"406":406,"409":409}];
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();
// ]]