code:
App.Events.RESSPAServant = class RESSPAServant extends App.Events.BaseEvent {
	eventPrerequisites() {
		return [
			() => V.assistant.appearance !== "normal",
			() => V.assistant.personality === 1,
		]; // always valid if sufficient actors can be cast successfully
	}

	actorPrerequisites() {
		return [
			[ // single event slave
				s => s.fetish !== "mindbroken",
				hasAnyArms,
				hasAnyLegs,
				canTalk,
				s => s.devotion >= -20,
				s => s.devotion <= 50,
				canSee,
				s => [Job.HOUSE, Job.QUARTER].includes(s.assignment),
				s => canDoVaginal(s) || canDoAnal(s),
			]
		];
	}

	execute(node) {
		const [eventSlave] = this.actors.map(a => getSlave(a));
		const {
			His, He, he, his, him, himself, girl
		} = getPronouns(eventSlave);
		const {title: Master} = getEnunciation(eventSlave);
		const belly = bellyAdjective(eventSlave);
		const PC = V.PC;
		const {
			HeA, heA, himA, hisA, himselfA, girlA, womanA, loliA
		} = getPronouns(assistant.pronouns().main).appendSuffix("A");

		App.Events.drawEventArt(node, eventSlave);

		let r = [];
		r.push(`As you begin your day one morning, you hear the quiet`);
		switch (V.assistant.appearance) {
			case "monstergirl":
				r.push(`but unmistakably sensual voice of your monster${girlA}`);
				break;
			case "shemale":
				r.push(`but unmistakably lewd voice of your shemale`);
				break;
			case "amazon":
				r.push(`but unmistakably aggressive voice of your amazon`);
				break;
			case "businesswoman":
				r.push(`but unmistakably dominant voice of your business${womanA}`);
				break;
			case "fairy":
			case "pregnant fairy":
				r.push(`but unmistakably adorable voice of your fairy`);
				break;
			case "goddess":
			case "hypergoddess":
				r.push(`and kindly voice of your goddess`);
				break;
			case "loli":
				r.push(`and childish voice of your ${loliA}`);
				break;
			case "preggololi":
				r.push(`and childish, out of breath voice of your pregnant ${loliA}`);
				break;
			case "angel":
				r.push(`but unmistakably caring voice of your angel`);
				break;
			case "cherub":
				r.push(`yet overly cheerful voice of your cherub`);
				break;
			case "incubus":
				r.push(`and commanding, but obviously aroused voice of your incubus`);
				break;
			case "succubus":
				r.push(`and seductive, but obviously aroused voice of your succubus`);
				break;
			case "imp":
				r.push(`and harassing voice of your imp`);
				break;
			case "witch":
				r.push(`and oddly aroused voice of your witch`);
				break;
			case "ERROR_1606_APPEARANCE_FILE_CORRUPT":
				r.push(`and very distinct voice of your avatar`);
				break;
			case "schoolgirl":
				r.push(`but unmistakably suggestive voice of your school${girlA}`);
		}
		r.push(
			`personal assistant coming from your office. Looking in, you are treated to the sight of`,
			App.UI.DOM.combineNodes(contextualIntro(PC, eventSlave, true), "'s")
		);
		if (eventSlave.butt > 8) {
			r.push(`ridiculous bottom jiggling`);
		} else if (eventSlave.butt > 4) {
			r.push(`big behind bouncing`);
		} else {
			r.push(`cute rear`);
		}
		if (eventSlave.belly >= 5000) {
			r.push(r.pop() + `, and the ${belly} rounded belly hanging between ${his} legs,`);
		}
		r.push(`as ${he} reaches out over the glass top of your desk with a soft, dust-free cloth and a bottle of screen cleaner. ${capFirstChar(V.assistant.name)} is displaying ${hisA} avatar right under where the slave is cleaning the glass screen, and ${heA}'s displaying it nude. ${HeA}'s positioned ${himselfA} so that the poor slave appears to be wiping`);
		switch (V.assistant.appearance) {
			case "monstergirl":
				r.push(`${hisA} hair-tentacles`);
				break;
			case "shemale":
				r.push(`the shaft of ${hisA} massive prick`);
				break;
			case "amazon":
				r.push(`the insides of ${hisA} muscular thighs`);
				break;
			case "businesswoman":
				r.push(`${hisA} pussy`);
				break;
			case "fairy":
				r.push(`${hisA} tiny body`);
				break;
			case "pregnant fairy":
				r.push(`${hisA} tiny yet swollen body`);
				break;
			case "goddess":
				r.push(`${hisA} motherly tits`);
				break;
			case "hypergoddess":
				r.push(`${hisA} huge pregnant belly`);
				break;
			case "loli":
				r.push(`${hisA} flat chest`);
				break;
			case "preggololi":
				r.push(`${hisA} pregnant belly`);
				break;
			case "angel":
				r.push(`${hisA} wide-spread wings`);
				break;
			case "cherub":
				r.push(`${hisA} cute pussy`);
				break;
			case "incubus":
				r.push(`${hisA} throbbing prick`);
				break;
			case "succubus":
				r.push(`${hisA} lovely pussy`);
				break;
			case "imp":
				r.push(`${hisA} pussy`);
				break;
			case "witch":
				r.push(`${hisA} plump tits`);
				break;
			case "ERROR_1606_APPEARANCE_FILE_CORRUPT":
				r.push(`${hisA} phallic tentacles`);
				break;
			case "schoolgirl":
				r.push(`${hisA} perky tits`);
		}
		r.push(`down with screen cleaner, and is talking dirty to the furiously blushing servant. "Ohh, that feels good," ${heA} moans. "Rub me right there, you ${SlaveTitle(eventSlave)} slut! I love it!" The poor slave is doing ${his} best to hurry, embarrassed and unsure of how to react to ${V.assistant.name}'s behavior.`);

		App.Events.addParagraph(node, r);
		App.Events.addResponses(node, [
			new App.Events.Result(`Share the slave with your PA`, share, virginityWarning()),
			canDoAnal(eventSlave)
				? new App.Events.Result(`Double penetrate the slave with your PA`, double, virginityWarning())
				: new App.Events.Result()
		]);

		function virginityWarning() {
			if (canDoVaginal(eventSlave) && (eventSlave.vagina === 0)) {
				return `This option will take ${his} virginity`;
			} else if (!canDoVaginal(eventSlave) && (eventSlave.anus === 0)) {
				return `This option will take ${his} anal virginity`;
			}
		}

		function share() {
			const frag = document.createDocumentFragment();
			r = [];
			r.push(
				`You enter, eliciting an embarrassed`,
				Spoken(eventSlave, `"Um, hi ${Master}"`),
				`from ${eventSlave.slaveName} and a cheery wave from ${V.assistant.name}. At this stage of your morning ablutions, you're conveniently naked, so you`
			);
			if (PC.belly >= 5000) {
				r.push(`heft yourself`);
			} else if (PC.belly >= 1500) {
				r.push(`clamber up`);
			} else {
				r.push(`leap up`);
			}
			r.push(`onto the desktop and kneel upright, legs splayed. (Naturally, the desk is reinforced and sealed for exactly this reason.) You point meaningfully at your`);
			if (PC.dick !== 0) {
				r.push(`stiff prick`);
				if (PC.vagina !== -1) {
					r.push(`and flushed pussy`);
				}
				r.push(r.pop() + `, and the obedient slave`);
				if (eventSlave.belly >= 5000) {
					r.push(`hefts ${himself}`);
				} else {
					r.push(`clambers`);
				}
				r.push(`up to suck you off`);
				if (PC.vagina !== -1) {
					r.push(`and eat you out`);
				}
				r.push(r.pop() + `. When you're close, you surprise ${him} by pulling your cock out of ${his} mouth and blowing your load onto the glass.`);
			} else {
				r.push(`hot cunt, and the obedient slave`);
				if (eventSlave.belly >= 5000) {
					r.push(`hefts ${himself}`);
				} else {
					r.push(`clambers`);
				}
				r.push(`up to eat you out. You surprise ${him} by taking your time, drawing out the oral session with the ulterior motive of getting as much saliva and pussyjuice onto the glass as possible.`);
			}
			r.push(`${capFirstChar(V.assistant.name)} shifts ${hisA} avatar so that this lands all over ${hisA}`);
			switch (V.assistant.appearance) {
				case "monstergirl":
					r.push(`cocks.`);
					break;
				case "shemale":
					r.push(`huge cock.`);
					break;
				case "amazon":
					r.push(`muscular pussy.`);
					break;
				case "businesswoman":
					r.push(`mature pussy.`);
					break;
				case "fairy":
				case "pregnant fairy":
					r.push(`tiny body.`);
					break;
				case "goddess":
					r.push(`fertile pussy.`);
					break;
				case "hypergoddess":
					r.push(`gaping pussy.`);
					break;
				case "loli":
				case "cherub":
					r.push(`tight virgin pussy.`);
					break;
				case "preggololi":
					r.push(`tight young pussy.`);
					break;
				case "angel":
					r.push(`virgin pussy.`);
					break;
				case "incubus":
					r.push(`perfect dick.`);
					break;
				case "succubus":
					r.push(`lovely pussy.`);
					break;
				case "imp":
					r.push(`slutty pussy.`);
					break;
				case "witch":
					r.push(`plump breasts.`);
					break;
				case "ERROR_1606_APPEARANCE_FILE_CORRUPT":
					r.push(`pussy-like body.`);
					break;
				case "schoolgirl":
					r.push(`pretty young pussy.`);
			}
			r.push(`"Clean me off, ${eventSlave.slaveName}," ${heA} demands, winking broadly at you. The slave, knowing that commands from ${himA} are commands from you, repositions ${himself} to lick up the`);
			if (PC.dick !== 0) {
				r.push(`ejaculate`);
				if (PC.vagina !== -1) {
					r.push(`and`);
				}
			}
			if (PC.vagina !== -1) {
				r.push(`girlcum`);
			}
			r.push(r.pop() + `.`);
			App.Events.addParagraph(frag, r);

			r = [];
			r.push(`This brings the slave into a crouch with ${his} ass pointed at you,`);
			if (canDoVaginal(eventSlave)) {
				if (eventSlave.vagina > 2) {
					r.push(`${his} experienced pussy practically begging for a pounding.`);
				} else if (eventSlave.vagina > 1) {
					r.push(`${his} nice pussy practically begging for a good hard fucking.`);
				} else {
					r.push(`${his} tight little pussy completely vulnerable.`);
				}
				r.push(`As`);
				if (PC.dick !== 0) {
					if (PC.vagina !== -1) {
						r.push(`use manual stimulation of your pussy to get your dick`);
					} else {
						r.push(`stroke yourself`);
					}
					r.push(`rapidly back to full mast,`);
				} else {
					r.push(`don a strap-on,`);
				}
				r.push(`${V.assistant.name} opines helpfully, "Hey ${eventSlave.slaveName}! You're about to get fucked!" The slave reacts by obediently reaching back to spread ${his} buttocks and relaxing, but ${V.assistant.name} ruins ${his} attempt at graceful submission."`);
				if (PC.title === 1) {
					r.push(`Siiir,`);
				} else {
					r.push(`Ma'aaam,`);
				}
				r.push(`${he}'s bluuuushing," ${he} says tauntingly, and the slave stiffens with renewed embarrassment, not to mention stimulation, as you penetrate ${him}.`);
				r.push(VCheck.Vaginal(eventSlave, 1));
			} else {
				if (eventSlave.anus > 2) {
					r.push(`${his} big asspussy practically begging for a pounding.`);
				} else if (eventSlave.anus > 1) {
					r.push(`${his} nice asshole practically begging for a good hard fucking.`);
				} else {
					r.push(`${his} tight little rosebud completely vulnerable.`);
				}
				r.push(`As`);
				if (PC.dick !== 0) {
					if (PC.vagina !== -1) {
						r.push(`use manual stimulation of your pussy to get your dick`);
					} else {
						r.push(`stroke yourself`);
					}
					r.push(`rapidly back to full mast,`);
				} else {
					r.push(`don a strap-on,`);
				}
				r.push(`${V.assistant.name} opines helpfully, "Hey ${eventSlave.slaveName}! You're about to get buttfucked!" The slave reacts by obediently reaching back to spread ${his} buttocks, and relaxes ${his} anus, but ${V.assistant.name} ruins ${his} attempt at graceful anal submission."`);
				if (PC.title === 1) {
					r.push(`Siiir,`);
				} else {
					r.push(`Ma'aaam,`);
				}
				r.push(`${he}'s bluuuushing," ${heA} says tauntingly, and the slave stiffens with renewed embarrassment, not to mention discomfort, as you penetrate ${him}.`);
				r.push(VCheck.Anal(eventSlave, 1));
			}
			r.push(`${He} keeps licking away, cleaning up the mess you made as ${V.assistant.name} does everything ${he} can to make it seem like the slave is pleasuring ${him}. Partway through, ${V.assistant.name} sticks out a hand for a high-five from you, producing a gurgle of indignation or perhaps even laughter as ${his} owner and ${his} owner's personal assistant program high-five over ${his} back.`);
			eventSlave.trust += 4;
			seX(eventSlave, "oral", PC, "penetrative");
			App.Events.addParagraph(frag, r);
			return frag;
		}

		function double() {
			const frag = document.createDocumentFragment();
			r = [];
			r.push(
				`You enter, eliciting an embarrassed`,
				Spoken(eventSlave, `"Um, hi ${Master}"`),
				`from ${eventSlave.slaveName}, and ask ${V.assistant.name} if ${he}'d like to DP the slave with you.`);
			switch (V.assistant.appearance) {
				case "monstergirl":
					r.push(`"Oh yes," ${heA} purrs threateningly over the slave's moan of apprehension, and ${hisA} avatar begins to stroke ${hisA} dicks meaningfully.`);
					break;
				case "shemale":
				case "incubus":
					r.push(`"Fuck yes," ${heA} groans over the slave's moan of apprehension, and ${hisA} avatar begins to stroke ${hisA} cock meaningfully.`);
					break;
				case "amazon":
					r.push(`"Yeah!" ${heA} shouts over the slave's moan of apprehension, and ${hisA} avatar quickly dons a big strap-on carved from mammoth tusk.`);
					break;
				case "businesswoman":
					r.push(`"Oh yes," ${heA} purrs sadistically over the slave's moan of apprehension, and ${hisA} avatar quickly dons a big strap-on.`);
					break;
				case "fairy":
				case "pregnant fairy":
					r.push(`"Oh yeah!" ${heA} shouts over the slave's moan of apprehension, and ${hisA} avatar quickly conjures up a magic floating dick.`);
					break;
				case "goddess":
				case "hypergoddess":
					r.push(`"That would be lovely," ${heA} says radiantly over the slave's moan of apprehension, and ${hisA} avatar acquires a phallus of light.`);
					break;
				case "angel":
				case "cherub":
					r.push(`"If you insist," ${heA} says reluctantly over the slave's moan of apprehension, and ${hisA} avatar acquires a phallus of light.`);
					break;
				case "succubus":
					r.push(`"Just this once," ${heA} says stroking ${his} clit as it steadily swells into a fully functional cock.`);
					break;
				case "imp":
					r.push(`"Fuck yes," ${heA} groans over the slave's moan of apprehension, and ${hisA} avatar quickly dons a huge, spiked strap-on.`);
					break;
				case "ERROR_1606_APPEARANCE_FILE_CORRUPT":
					r.push(`"Of course," ${heA} shouts over the slave's moan of apprehension, and ${hisA} avatar quickly forms a huge, fleshy, bulbous cock.`);
					break;
				default:
					r.push(`"Fuck yeah!" ${heA} cheers over the slave's moan of apprehension, and ${hisA} avatar quickly dons a big strap-on.`);
			}
			r.push(`You indicate a fuckmachine in the corner of the room, and the slave obediently hurries over to it. It's vertical, and ${he} hops up on it, positioning ${his} anus over its`);
			switch (V.assistant.appearance) {
				case "monstergirl":
					r.push(`pair of dildos. They insert themselves`);
					break;
				case "shemale":
				case "incubus":
					r.push(`frighteningly big dildo. It inserts itself`);
					break;
				case "amazon":
					r.push(`animalistically ribbed dildo. It inserts itself`);
					break;
				case "imp":
					r.push(`terrifyingly spiked, huge dildo. It inserts itself`);
					break;
				case "ERROR_1606_APPEARANCE_FILE_CORRUPT":
					r.push(`frighteningly big, lumpy and uneven dildo. It inserts itself`);
					break;
				default:
					r.push(`large dildo. It inserts itself`);
			}
			r.push(`gently but firmly and then stops, the panting slave's`);
			if (eventSlave.weight > 130) {
				r.push(`thick`);
			} else if (eventSlave.weight > 95) {
				r.push(`chubby`);
			} else if (eventSlave.muscles > 30) {
				r.push(`heavily muscled`);
			} else if (eventSlave.preg >= eventSlave.pregData.normalBirth/8) {
				r.push(`motherly`);
			} else if (eventSlave.weight > 10) {
				r.push(`plush`);
			} else if (eventSlave.muscles > 5) {
				r.push(`toned`);
			} else {
				r.push(`feminine`);
			}
			r.push(`thighs quivering a little from supporting ${his} body in its perch atop the machine, and from the fullness of ${his} anus.`);
			r.push(VCheck.Anal(eventSlave, 3));
			r.push(`${He} knows this is going to be challenging, and is breathing deeply, doing ${his} best to stay relaxed. You cannot resist slapping your`);
			if (PC.dick !== 0) {
				r.push(`big cock lightly`);
			} else {
				r.push(`lubricated strap-on`);
			}
			r.push(`against ${his} cheek, producing a groan of apprehension.`);
			App.Events.addParagraph(frag, r);

			r = [];
			r.push(`You push ${him} gently backward, letting ${him} get accustomed to the new angle.`);
			if (eventSlave.boobs > 2000) {
				r.push(`${His} monstrous tits spread to either side of ${his}`);
				if (eventSlave.belly >= 5000) {
					r.push(belly);
					if (eventSlave.bellyPreg >= 3000) {
						r.push(`pregnant`);
					}
					r.push(`belly,`);
				} else {
					r.push(`now upright torso,`);
				}
				r.push(`and you take a moment to play with them as ${he} prepares ${himself}.`);
			}
			if (canDoVaginal(eventSlave)) {
				r.push(`${He} gasps as ${he} feels`);
				if (PC.dick !== 0) {
					r.push(`your hot dickhead`);
				} else {
					r.push(`the slick head of your strap-on`);
				}
				r.push(`part ${his} pussylips, no doubt feeling full already.`);
				r.push(VCheck.Vaginal(eventSlave, 3));
				r.push(`When you're all the way in, the`);
				if (V.assistant.appearance === "monstergirl") {
					r.push(`dildos in ${his} butt begin`);
				} else {
					r.push(`dildo in ${his} butt begins`);
				}
				r.push(`to fuck ${him}, harder and harder, as ${V.assistant.name} moans happily. The all-encompassing feeling of fullness as ${his} cunt and ass are fucked to the very limit of their capacities`);
			} else {
				r.push(`${He} gasps as ${he} feels you push a finger up ${his} already-full butt and pull ${his} sphincter a bit wider. You withdraw it and replace it with`);
				if (PC.dick !== 0) {
					r.push(`your turgid cock`);
				} else {
					r.push(`your strap-on`);
				}
				r.push(`the slave writhes involuntarily, ${his} body trying to refuse the invasion of yet another phallus.`);
				r.push(VCheck.Anal(eventSlave, 3));
				r.push(`When you're all the way in, the`);
				if (V.assistant.appearance === "monstergirl") {
					r.push(`dildos alongside your`);
					if (PC.dick !== 0) {
						r.push(`dick`);
					} else {
						r.push(`strap-on`);
					}
					r.push(`in ${his} butt begin`);
				} else {
					r.push(`dildo alongside your`);
					if (PC.dick !== 0) {
						r.push(`dick`);
					} else {
						r.push(`strap-on`);
					}
					r.push(`in ${his} butt begins`);
				}
				r.push(`to fuck ${him}, harder and harder, as ${V.assistant.name} moans happily. The all-encompassing feeling of fullness as ${his} ass is fucked to the very limit of its capacity`);
			}
			r.push(`quickly drives all feminine grace, presence of mind, or really, conscious thought out of the poor slave. After begging for mercy for a short while, ${he} lapses into animal groans, drooling and leaking tears out the corner of ${his} eyes as you and ${V.assistant.name} fuck ${him} into insensibility. When you climax, ${V.assistant.name} ejaculates, filling the slave's anus with warm fluid.`);
			App.Events.addParagraph(frag, r);

			r = [];
			r.push(`By this point ${he}'s so helpless that you`);
			if (eventSlave.belly >= 300000 || eventSlave.weight > 190) {
				r.push(`have to struggle to lift`);
			} else {
				r.push(`gently lift`);
			}
			r.push(`${him} off the fuckmachine and carry ${him} to the shower. You set ${him} down there, and ${V.assistant.name} activates the water, using the powerful jets in pulses to massage life back into your exhausted fuckpuppet. ${His} avatar appears on a screen behind the shower, creating an optical illusion that makes it look like ${he}'s petting the slave in time with the water. ${He} reassures to the slave as ${he} does:`);
			switch (V.assistant.appearance) {
				case "monstergirl":
					r.push(`"You're a good little cocksock," ${he} says kindly.`);
					break;
				case "shemale":
					r.push(`"I like your butthole," ${he} says politely.`);
					break;
				case "amazon":
					r.push(`"I like fucking your butthole," ${he} says kindly.`);
					break;
				case "businesswoman":
					r.push(`"I'm sure you won't be sold right away," ${he} says.`);
					break;
				case "fairy":
				case "pregnant fairy":
					r.push(`"You're a good ${girl}," ${he} says.`);
					break;
				case "goddess":
				case "hypergoddess":
					r.push(`"There, there," ${he} says kindly. "You are a good sex slave."`);
					break;
				case "angel":
				case "cherub":
					r.push(`"There, there," ${he} says kindly. "You are a good ${girl}."`);
					break;
				case "incubus":
				case "succubus":
				case "imp":
					r.push(`"You're a good little cocksleeve," ${he} says honestly.`);
					break;
				case "ERROR_1606_APPEARANCE_FILE_CORRUPT":
					r.push(`"You're a good little nursery," ${he} says.`);
					break;
				default:
					r.push(`"I like you," ${he} says cheerily.`);
			}
			eventSlave.devotion += 4;
			App.Events.addParagraph(frag, r);
			return frag;
		}
	}
};


code:
App.Events.RESSAGift = class RESSAGift extends App.Events.BaseEvent {
	eventPrerequisites() {
		return []; // always valid if sufficient actors can be cast successfully
	}

	actorPrerequisites() {
		return [
			[ // single event slave
				s => s.fetish !== "mindbroken",
				s => s.devotion > 50,
				s => s.trust > 50,
				hasAnyArms,
				hasAnyLegs,
				canTalk,
				s => V.HeadGirlID !== s.ID // eventSlave.ID cannot be 0(?), therefore redundant to also allow V.headGirlID === 0
			]
		];
	}

	execute(node) {
		const [eventSlave] = this.actors.map(a => getSlave(a));
		const {His, He, he, his, him, himself, girl} = getPronouns(eventSlave);
		const {title: Master} = getEnunciation(eventSlave);
		const belly = bellyAdjective(eventSlave);
		const hands = hasBothArms(eventSlave) ? "hands" : "hand";

		App.Events.drawEventArt(node, eventSlave);

		const FSArray = FutureSocieties.activeFSes(V.arcologies[0]);
		const napkin = getNapkin();
		function getNapkin() {
			switch (FSArray.random()) {
				case "FSGenderRadicalist":
					return "a lily with a prominent stamen";
				case "FSGenderFundamentalist":
					return "a beautiful, feminine lily";
				case "FSSupremacist":
					return "a proud rose";
				case "FSSubjugationist":
					return "a makeshift whip";
				case "FSYouthPreferentialist":
					return "a cute little flowerbud";
				case "FSMaturityPreferentialist":
					return "a gorgeous mature orchid";
				case "FSPaternalist":
					return "a smooth, calming design";
				case "FSDegradationist":
					return "a spiky abstract design";
				case "FSTransformationFetishist":
					return "a big pair of fake lips";
				case "FSBodyPurist":
					return "a simple, unaltered flower";
				case "FSPastoralist":
					return "a sheaf of corn";
				case "FSPhysicalIdealist":
					return "a dumbbell";
				case "FSHedonisticDecadence":
					return "a hamburger";
				case "FSSlimnessEnthusiast":
					return "a lithe figure";
				case "FSAssetExpansionist":
					return "a figure with exaggerated breasts and buttocks";
				case "FSRepopulationFocus":
					return "a lotus flower";
				case "FSRestart":
					return "a makeshift chastity belt";
				case "FSIntellectualDependency":
					if (eventSlave.intelligence+eventSlave.intelligenceImplant >= -50) {
						return "a jasmine flower";
					} else {
						return "a dick";
					}
				case "FSSlaveProfessionalism":
					return "an iris";
				case "FSPetiteAdmiration":
					return "a cute little buttercup";
				case "FSStatuesqueGlorification":
					return "a large sunflower";
				case "FSChattelReligionist":
					return "a piece of religious iconography";
				case "FSNull":
					return "a daffodil";
				case "FSRomanRevivalist":
					return "a laurel wreath";
				case "FSNeoImperialist":
					return "an elegant coat of arms from another noble family";
				case "FSAztecRevivalist":
					return "a small statuette";
				case "FSEgyptianRevivalist":
					return "a perfect pyramid";
				case "FSEdoRevivalist":
					return "a Shinto arch";
				case "FSArabianRevivalist":
					return "a complex minaret";
				case "FSChineseRevivalist":
					return "an imperial pagoda";
				default:
					return "a beautiful flower";
			}
		}

		let r = [];
		r.push(`You're working at your desk when`);
		r.push(contextualIntro(V.PC, eventSlave, true));
		r.push(`walks by your office. ${He} checks to see whether you're in while trying very hard to look like ${he}'s minding ${his} own business, and turns to go once ${he}`);
		if (canSee(eventSlave)) {
			r.push(`sees`);
		} else if (canHear(eventSlave)) {
			r.push(`hears`);
		} else {
			r.push(`assumes`);
		}
		r.push(`that you're present. You`);
		if (canSee(eventSlave)) {
			r.push(`crook a finger at ${him}.`);
		} else if (canHear(eventSlave)) {
			r.push(`clear your throat at ${him}, signaling you want ${him} before you.`);
		} else {
			r.push(`remotely and quickly close the door behind ${him}.`);
		}
		r.push(`${He}'s a good ${girl} and not likely to be plotting anything nefarious, but letting nonsense like that slide would be stupid. ${He} hurries in, blushing furiously, with ${his} ${hands} behind ${his} back. Deciding to deal with the obvious thing first, you ask ${him} what ${he}'s got. ${He} blushes even harder, and brings ${his} ${hands} around to reveal one of the large cloth napkins used for entertaining, carefully folded into the shape of ${napkin}. It's very well done.`);
		App.Events.addParagraph(node, r);

		r = [];
		r.push(Spoken(eventSlave, `"I'm sorry, ${Master},"`), `${he} mumbles,`);
		if (canSee(eventSlave)) {
			r.push(`glancing down at ${his} feet.`);
		} else {
			r.push(`${his} head facing down at ${his} feet.`);
		}
		r.push(Spoken(eventSlave, `"One of the other girls ${canSee(eventSlave) ? "showed" : "taught"} us how to fold stuff when we were resting together. I wanted to make something for you, and this was the first thing that was good enough. I was just going to slip it onto your desk. I — I feel kind of stupid, now."`));

		App.Events.addParagraph(node, r);
		App.Events.addResponses(node, [
			new App.Events.Result(`That's nice`, nice),
			new App.Events.Result(`These slaves clearly have too much time on their hands`, time),
			(eventSlave.fetishKnown === 1 && eventSlave.fetish !== "none")
				? new App.Events.Result(`Give ${him} something in return`, give, ((eventSlave.anus === 0 && canDoAnal(eventSlave)) || (eventSlave.vagina === 0 && canDoVaginal(eventSlave)) ? `This option may take ${his} virginity` : null))
				: new App.Events.Result(),
			new App.Events.Result(`${He}'s already gift enough`, enough),
			// @ts-ignore
			(typeof eventSlave.napkin === "undefined")
				? new App.Events.Result(`Place it in your display case`, addTrinketLocal)
				: new App.Events.Result()
		]);

		function nice(){
			return `It's not just a feeling. However, slapping slaves for idiotic devotion isn't wise, since the idiotic part of idiotic devotion is less important than the devotion part. You thank ${him} kindly, tell ${him} to put ${his} offering on your desk, and go back to your work. ${He} flees, feeling relieved but foolish. When ${he}'s gone, you direct another slave to return the napkin to its proper place.`;
		}

		function time(){
			r = [];
			r.push(`You thank ${him} kindly, tell ${him} to put ${his} offering on your desk, and go back to your work. ${He} flees, and once ${he}'s gone, you`);
			if (S.HeadGirl) {
				r.push(`have ${V.assistant.name} pass a note to your Head Girl instructing ${getPronouns(S.HeadGirl).him}`);
			} else {
				r.push(`instruct ${V.assistant.name}`);
			}
			r.push(`to tighten up your slaves' schedules, since you feel that they have too much time on their hands. Then you direct another slave to return the napkin to its proper place. Your slaves find their spare moments occupied by household minutiae during the coming week, saving you some money on penthouse and slave upkeep.`);
			cashX(2000, "event", eventSlave);
			return r;
		}

		function give(){
			const {girlU} = getNonlocalPronouns(V.seeDicks).appendSuffix('U');

			r = [];
			r.push(`You thank ${him}, and tell ${him} you're considering what to give ${him} in return. ${He} looks flirty, and says,`);
			switch (eventSlave.fetish) {
				case "submissive":
					if (canDoAnal(eventSlave) || canDoVaginal(eventSlave)) {
						r.push(Spoken(eventSlave, `"Please, would you hold me down and fuck me, ${Master}?"`));
						r.push(`${He} drapes ${himself} submissively`);
						if (eventSlave.belly >= 300000) {
							r.push(`over ${his} ${belly} middle,`);
						} else {
							r.push(`over the couch,`);
						}
						r.push(`lest you misunderstand. You could hold ${him} down and fuck ${him}, and you do.`);
						if (canDoAnal(eventSlave)) {
							r.push(VCheck.Anal(eventSlave, 1));
						} else {
							r.push(VCheck.Vaginal(eventSlave, 1));
						}
					} else {
						r.push(Spoken(eventSlave, `"Please, would you hold me down and ${V.PC.dick !== 0 ? "fuck my throat" : "grind against my face"}, ${Master}?"`));
						r.push(`${He} drapes ${himself} submissively`);
						if (eventSlave.belly >= 300000) {
							r.push(`over ${his} ${belly} middle,`);
						} else {
							r.push(`over the couch,`);
						}
						r.push(`lest you misunderstand. You could hold ${him} down and`);
						if (V.PC.dick !== 0) {
							r.push(`facefuck ${him},`);
						} else {
							r.push(`make ${him} eat you out,`);
						}
						r.push(`and you do.`);
						seX(eventSlave, "oral", V.PC, "penetrative");
					}
					break;
				case "cumslut":
					r.push(Spoken(eventSlave, `"Please, may I`));
					if (V.PC.dick !== 0) {
						r.push(`give you a blowjob`);
						if (V.PC.vagina !== -1) {
							r.push(`and`);
						}
					}
					if (V.PC.vagina !== -1) {
						r.push(`eat you out`);
					}
					r.push(r.pop() + `, ${Master}?" ${He}`);
					if (eventSlave.belly >= 300000) {
						r.push(`leans onto ${his} ${belly} middle`);
					} else if (eventSlave.belly >= 10000) {
						r.push(`gently lowers ${his}`);
						if (eventSlave.bellyPreg >= 3000) {
							r.push(`pregnant`);
						} else {
							r.push(`heavy`);
						}
						r.push(`body to its knees`);
					} else {
						r.push(`gets down on ${his} knees`);
					}
					r.push(`and licks ${his} lips, lest you misunderstand. You could let ${him}`);
					if (V.PC.dick !== 0) {
						r.push(`give you a blowjob`);
						if (V.PC.vagina !== -1) {
							r.push(`and`);
						}
					}
					if (V.PC.vagina !== -1) {
						r.push(`eat you out`);
					}
					r.push(r.pop() + ",");
					r.push(`and you do.`);
					seX(eventSlave, "oral", V.PC, "penetrative");
					break;
				case "humiliation":
					if (canDoAnal(eventSlave) || canDoVaginal(eventSlave)) {
						r.push(Spoken(eventSlave, `"Please, would you fuck me in public, ${Master}?"`));
						r.push(`${He} edges towards the door, lest you misunderstand. You could fuck ${him} in public, and you do.`);
						if (canDoAnal(eventSlave)) {
							r.push(VCheck.Anal(eventSlave, 1));
						} else {
							r.push(VCheck.Vaginal(eventSlave, 1));
						}
					} else {
						r.push(Spoken(eventSlave, `"Please, may I`));
						if (V.PC.dick !== 0) {
							r.push(`give you a blowjob`);
							if (V.PC.vagina !== -1) {
								r.push(`and`);
							}
						}
						if (V.PC.vagina !== -1) {
							r.push(`eat you out`);
						}
						r.push(Spoken(eventSlave, `in public, ${Master}?"`));
						r.push(`${He} edges towards the door, lest you misunderstand. You could`);
						if (V.PC.dick !== 0) {
							r.push(`give you a blowjob`);
							if (V.PC.vagina !== -1) {
								r.push(`and`);
							}
						}
						if (V.PC.vagina !== -1) {
							r.push(`eat you out`);
						}
						r.push(`in public, and you do.`);
						seX(eventSlave, "oral", V.PC, "penetrative");
					}
					break;
				case "buttslut":
					if (canDoAnal(eventSlave)) {
						r.push(Spoken(eventSlave, `"Please, would you fuck my butt, ${Master}?"`));
						r.push(`${He} turns halfway and shakes ${his} rear enticingly, lest you misunderstand. You could fuck ${his} butt, and you do.`);
						r.push(VCheck.Anal(eventSlave, 1));
					} else {
						r.push(Spoken(eventSlave, `"Please, would you play with my butt, ${Master}?"`));
						r.push(`${He} turns halfway and shakes ${his} rear enticingly, lest you misunderstand. You could play with ${his} butt, and you do, managing intercourse several ways without penetrating ${him}.`);
					}
					break;
				case "boobs":
					r.push(Spoken(eventSlave, `"Please, would you play with my boobs, ${Master}?"`));
					r.push(`${He} sticks out ${his} chest and bounces ${his} breasts for you, lest you misunderstand. You could play with ${his} boobs, and you do, managing mammary intercourse several ways.`);
					seX(eventSlave, "mammary", V.PC, "penetrative", 3);
					break;
				case "pregnancy":
					if ((eventSlave.toyHole === "dick" || V.policies.sexualOpenness === 1) && canPenetrate(eventSlave) && V.PC.vagina !== -1) {
						if (canGetPregnant(V.PC)) {
							r.push(Spoken(eventSlave, `"Please, can I try to get you pregnant, ${Master}?"`));
							r.push(`${His} eyes are glued to your middle. You could let ${him} seed you, and you do, enjoying the feeling of ${his} hot cum jetting into your fertile pussy.`);
							if (canImpreg(V.PC, eventSlave)) {
								r.push(knockMeUp(V.PC, 20, 0, eventSlave.ID));
							}
						} else if (V.PC.belly >= 1500) {
							r.push(Spoken(eventSlave, `"Please, could I play with your pregnancy while I fuck you, ${Master}?"`));
							r.push(`{His} eyes are glued to your gravid middle. You could let ${him} play with your pregnancy, and you do, enjoying ${his} fondling as ${he} fucks your pussy.`);
						} else {
							r.push(Spoken(eventSlave, `"Please, would you pretend to be pregnant with my baby, ${Master}?"`));
							r.push(`${His} eyes are glued to your middle. You could play pretend with ${him}, and you do,`);
							if (isItemAccessible.entry("a small empathy belly", "bellyAccessory")) {
								r.push(`strapping an empathy belly on yourself before bending over for ${him}.`);
							} else {
								r.push(`tossing on a camisole and sticking a pillow under it before bending over for ${him}.`);
							}
						}
						seX(eventSlave, "penetrative", V.PC, "vaginal");
					} else {
						if (canDoVaginal(eventSlave) || canDoAnal(eventSlave)) {
							r.push(Spoken(eventSlave, `"Please, would you ${V.PC.dick !== 0? `fill me with your seed` : `fuck me`}, ${Master}?"`));
							r.push(`${He} reclines on the couch and offers ${himself} to you, lest you misunderstand. You could`);
							if (V.PC.dick !== 0) {
								r.push(`fill ${him} with your seed,`);
							} else {
								r.push(`fuck ${him},`);
							}
							r.push(`and you do.`);
							if (canDoVaginal(eventSlave)) {
								r.push(VCheck.Vaginal(eventSlave, 1));
							} else {
								r.push(VCheck.Anal(eventSlave, 1));
							}
						} else if (eventSlave.pregKnown === 1) {
							r.push(Spoken(eventSlave, `"Please, would you play with my pregnancy, ${Master}?"`));
							r.push(`${He} pokes out ${his} belly and sways it enticingly, lest you misunderstand. You could play with ${his} pregnancy, and you do, managing to get off several ways.`);
						} else {
							r.push(Spoken(eventSlave, `"Please, would you pretend that I'm pregnant with your baby, ${Master}?"`));
							r.push(`${He} pokes out ${his} belly and sways it enticingly, lest you misunderstand. You could play pretend with ${him}, and you do,`);
							if (isItemAccessible.entry("a small empathy belly", "bellyAccessory")) {
								r.push(`strapping an empathy belly on ${him} before feeling ${him} up.`);
							} else {
								r.push(`tossing ${him} a camisole and a pillow before feeling ${him} up.`);
							}
						}
					}
					break;
				case "dom":
					if ((eventSlave.toyHole === "dick" || V.policies.sexualOpenness === 1) && canPenetrate(eventSlave)) {
						r.push(Spoken(eventSlave, `"Please, could I bang you, ${Master}?"`));
						r.push(`${He} bounces on ${his} heels, rock-hard and biting ${his} lip with anticipation. You could let ${him} fuck your brains out, and you do, enjoying playing the sub for once.`);
						seX(eventSlave, "penetrative", V.PC, "vaginal");
						if (canImpreg(V.PC, eventSlave)) {
							r.push(knockMeUp(V.PC, 20, 0, eventSlave.ID));
						}
					} else {
						r.push(Spoken(eventSlave, `"Please, would you fuck my brains out, ${Master}?"`));
						r.push(`${He} bounces on ${his} heels, biting ${his} lip with anticipation. You could fuck ${his} brains out, and you do, enjoying the dominant slave's constant sexual one-upmanship.`);
						if (canDoVaginal(eventSlave)) {
							r.push(VCheck.Vaginal(eventSlave, 1));
						} else if (canDoAnal(eventSlave)) {
							r.push(VCheck.Anal(eventSlave, 1));
						} else {
							seX(eventSlave, "oral", V.PC, "penetrative");
						}
					}
					break;
				case "sadist":
					if ((eventSlave.toyHole === "dick" || V.policies.sexualOpenness === 1) && canPenetrate(eventSlave)) {
						r.push(Spoken(eventSlave, `"Please, can I pretend to rape you, ${Master}?"`));
						r.push(`${His} eyes are wild. You could let ${him} rape you, and you do, pretending to go about your day until ${he} shoves you onto the couch and roughly fucks your`);
						if (V.PC.vagina !== -1) {
							r.push(`pussy.`);
							if (canImpreg(V.PC, eventSlave)) {
								r.push(knockMeUp(V.PC, 20, 0, eventSlave.ID));
							}
						} else {
							r.push(`ass.`);
						}
					} else {
						r.push(Spoken(eventSlave, `"Please, would you let me rape someone, ${Master}?"`));
						r.push(`${His} eyes are wild. You could let ${him} rape someone, and you do, bringing in an appropriate slave and letting ${him} have ${his} way with the poor ${girlU}.`);
					}
					seX(eventSlave, "penetrative", V.PC, "vaginal");
					break;
				case "masochist":
					if ((eventSlave.toyHole === "dick" || V.policies.sexualOpenness === 1) && canPenetrate(eventSlave)) {
						r.push(Spoken(eventSlave, `"Please, would you rape me, ${Master}?"`));
						r.push(`${His} eyes are hungry. You could rape ${him}, and you do, throwing ${him} across the couch and riding ${him} through so many orgasms that ${he} begs for mercy.`);
						seX(eventSlave, "penetrative", V.PC, "vaginal");
						if (canImpreg(V.PC, eventSlave)) {
							r.push(knockMeUp(V.PC, 20, 0, eventSlave.ID));
						}
					} else {
						r.push(Spoken(eventSlave, `"Please, would you rape me, ${Master}?"`));
						r.push(`${His} eyes are hungry. You could rape ${him}, and you do, throwing ${him} across the couch and fucking ${him} so hard ${he} begs for mercy as ${he} orgasms.`);
						if (canDoVaginal(eventSlave)) {
							r.push(VCheck.Vaginal(eventSlave, 1));
						} else if (canDoAnal(eventSlave)) {
							r.push(VCheck.Anal(eventSlave, 1));
						} else {
							seX(eventSlave, "oral", V.PC, "penetrative");
						}
					}
					break;
				default:
					r.push(Spoken(eventSlave, `"I forgot what my fetish is, but I think it is ${eventSlave.fetish}."`));
					throw Error (`<span class="red">Error: rents is outside accepted range, please report this issue.</span>`);
			}
			if (eventSlave.fetishStrength > 95) {
				r.push(`This is very close to ${his} dream of the ideal sexual encounter, and getting rewarded for such devoted behavior with pleasure on such a level encourages ${him} to trust you.`);
				eventSlave.trust += 5;
			} else {
				r.push(`It isn't exactly an old world romance, but sharing this with you <span class="fetish inc">advances ${his} fetish.</span> In the Free Cities, it will do for romance.`);
				eventSlave.fetishStrength += 4;
			}
			r.push(`When ${he}'s gone, you direct another slave to return the napkin to its proper place.`);
			return r;
		}

		function enough(){
			r = [];
			r.push(`You smile gently at ${him} and tell ${him} to put ${his} gift down on your desk. ${He} does, looking doubtful, but then you thank ${him}, going on to say that it was very nice of ${him} to have the thought, but ${he}'s already gift enough. ${He} looks momentarily confused, but you continue, describing ${his} body in rhapsodic terms, lingering on ${his}`);
			if (eventSlave.boobs > 5000) {
				r.push(`gargantuan tits`);
			} else if (eventSlave.butt > 5) {
				r.push(`massive ass`);
			} else if (eventSlave.face > 40) {
				r.push(`model's face`);
			} else if (eventSlave.bellyPreg > 1500) {
				r.push(`rounded pregnancy`);
			} else if (eventSlave.belly > 1500) {
				r.push(`${belly} belly`);
			} else if (eventSlave.muscles > 30) {
				r.push(`ripped abs`);
			} else if (eventSlave.weight > 10) {
				r.push(`plush belly`);
			} else {
				r.push(`nice butt`);
			}
			r.push(`and`);
			if (eventSlave.boobs < 500) {
				r.push(`cute chest.`);
			} else if (eventSlave.butt < 3) {
				r.push(`cute rear.`);
			} else if (eventSlave.anus > 1) {
				r.push(`wonderful butthole.`);
			} else if (eventSlave.clit > 1) {
				r.push(`cute clit.`);
			} else if (eventSlave.waist < -10) {
				r.push(`wasp waist.`);
			} else if (eventSlave.nipples === "fuckable") {
				r.push(`fuckable chest.`);
			} else {
				r.push(`nice nipples.`);
			}
			r.push(`${He} blushes more and more furiously as you continue, alternately`);
			if (canSee(eventSlave)) {
				r.push(`glancing back down at ${his} feet and stealing looks at you, <span class="devotion inc">adoration</span> in ${his} eyes.`);
			} else {
				r.push(`facing ${his} feet and facing you, <span class="devotion inc">adoration</span> on ${his} face.`);
			}
			r.push(`When ${he}'s gone, you direct another slave to return the napkin to its proper place.`);
			eventSlave.devotion += 4;
			return r;
		}

		function addTrinketLocal(){
			eventSlave.devotion += 4;
			// @ts-ignore
			eventSlave.napkin = 1;
			addTrinket(`a cloth napkin`, {name: eventSlave.slaveName, id: eventSlave.ID, napkinShape: napkin});
			return `You thank ${him} kindly, and hold out your hand. ${He} places ${his} creation in your hands with something like reverence. You enter a secure command on your desk, and the display case behind you slides open. You place the folded napkin in its own little place within. ${eventSlave.slaveName} watches incredulously, unable to believe what you're doing. When ${he} finally processes it, ${he} bursts into inelegant tears. Cuffing them away from ${his} eyes and sniffling, ${he} tells you ${he} loves you.`;
		}
	}
};

repo_name: Fanatey/fc

license: mit


code:
App.Events.RESSAgeImplant = class RESSAgeImplant extends App.Events.BaseEvent {
	eventPrerequisites() {
		return []; // always valid if sufficient actors can be cast successfully
	}

	actorPrerequisites() {
		return [
			[ // single event slave
				s => s.fetish !== "mindbroken",
				hasAnyArms,
				hasAnyLegs,
				canTalk,
				s => s.assignment !== Job.QUARTER,
				s => s.physicalAge > 30,
				s => s.ageImplant > 0,
				s => s.devotion > 20,
			]
		];
	}

	execute(node) {
		const [eventSlave] = this.actors.map(a => getSlave(a));
		const {
			His, He, he, his, him, himself, girl
		} = getPronouns(eventSlave);
		const {title: Master} = getEnunciation(eventSlave);
		const belly = bellyAdjective(eventSlave);
		const PC = V.PC;

		App.Events.drawEventArt(node, eventSlave, "no clothing");

		App.Events.addParagraph(node, [
			`In the morning the penthouse is a busy bustle of female energy. Slaves get up promptly, eat, shower, dress themselves, and head out to work. They chatter if able and allowed, and draw a good deal of strength from each other. As you pass by the kitchen, you are narrowly avoided by a rush of slaves heading to the showers. They're almost bouncing, feeding off each other's youthful energy. At the back of the pack is`,
			App.UI.DOM.combineNodes(contextualIntro(PC, eventSlave, true), `. ${He} looks as young as any of them, but after they're out, ${he} leans against the door frame for a moment and exhales slowly.`)
		]);
		let r = [];
		r.push(`${His} ${App.Desc.eyeColor(eventSlave)}-eyed gaze catches yours for a moment, and you are reminded that ${he} isn't as young as they are, not at all. ${His} face might look youthful, but ${his} eyes don't.`);
		if (canSee(eventSlave)) {
			r.push(`${He} sees your consideration, and murmurs,`);
		} else {
			r.push(`You make yourself known, and ${he} murmurs,`);
		}
		r.push(
			Spoken(eventSlave, `"Sorry, ${Master}. Just a little slow this morning."`),
			`${He} hurries after ${his} sisters, ${his}`
		);
		if (eventSlave.butt > 12) {
			r.push(`massive`);
		} else if (eventSlave.butt > 8) {
			r.push(`giant`);
		} else if (eventSlave.butt > 5) {
			r.push(`huge`);
		} else if (eventSlave.butt > 2) {
			r.push(`big`);
		} else {
			r.push(`pretty little`);
		}
		r.push(`naked ass catching your eye as ${he} goes.`);

		App.Events.addParagraph(node, r);
		App.Events.addResponses(node, [
			new App.Events.Result(`Go out clubbing to make ${him} feel young again`, clubbing),
			new App.Events.Result(`Attend a sporting event with ${him}`, sporting),
			new App.Events.Result(`Put the old whore in ${his} place`, old, (eventSlave.anus === 0 && canDoAnal(eventSlave)) || (eventSlave.vagina === 0 && canDoVaginal(eventSlave)) ? `This option will take ${his} virginity` : null),
		]);

		function clubbing() {
			r = [];
			r.push(`You call out to stop ${him}, and ${he} turns obediently to listen; you tell ${him} to take the day off and meet you that evening for a trip to ${V.arcologies[0].name}'s most fashionable nightclub. You emphasize slightly that it's a place you prefer to enjoy with a young slave, and ${his} eyes widen a little at the implied compliment and challenge. Right at the proper time, ${he} arrives in your office wearing neon ${eventSlave.hColor} makeup to match ${his} hair, and a tiny iridescent club${girl} outfit of the same color. The hem of the skirt is barely low enough to conceal ${him}`);
			if (eventSlave.dick > 0) {
				r.push(`dick,`);
			} else if (eventSlave.vagina === -1) {
				r.push(`total lack of private parts,`);
			} else {
				r.push(`pussy,`);
			}
			r.push(`and it's backless. The front is held up by a halter around ${his} pretty neck, and is`);
			if (eventSlave.boobs > 2000) {
				r.push(`specially tailored to cover ${his} massive tits`);
			} else if (eventSlave.boobs > 1000) {
				r.push(`strained by ${his} big tits`);
			} else if (eventSlave.boobs > 300) {
				r.push(`tightly filled by ${his} healthy tits`);
			} else {
				r.push(`tight against ${his} flat chest`);
			}
			if (eventSlave.belly >= 1500) {
				r.push(`and ${belly}`);
				if (eventSlave.bellyPreg >= 1500) {
					r.push(`pregnant`);
				}
				r.push(`belly`);
			}
			r.push(r.pop() + `. ${He} makes a gaudy and very fashionable spectacle, and in response to your`);
			if (canSee(eventSlave)) {
				r.push(`look`);
			} else if (canHear(eventSlave)) {
				r.push(`whistle`);
			} else {
				r.push(`gentle poke`);
			}
			r.push(`${he} raises`);
			if (!hasAnyArms(eventSlave)) {
				r.push(`the stumps of ${his} arms ever so slightly`);
				if (hasBothArms(eventSlave)) {
					r.push(`both arms`);
				} else {
					r.push(`${his} arm`);
				}
				r.push(`over ${his} head`);
			}
			r.push(
				`and twirls, shimmying ${his} body deliciously.`,
				Spoken(eventSlave, `"I hope they let me into the club without checking my I.D., ${Master},"`),
				`${he} jokes, for which ${he} receives a swat on ${his} rear as you head out. With the full day of rest, ${he} is full of vigor and ready to dance. ${He} eagerly heads out onto the floor with you,`);
			if (eventSlave.skill.entertainment >= 100) {
				r.push(`masterfully moving ${his}`);
				if (eventSlave.belly >= 1500) {
					if (eventSlave.bellyPreg >= 1500) {
						r.push(`gravid`);
					} else {
						r.push(`rounded`);
					}
				}
				r.push(`body to the heavy beat, grabbing the attention of all the men and most of the women in ${V.clubName}.`);
			} else if (eventSlave.skill.entertainment > 60) {
				r.push(`expertly moving ${his}`);
				if (eventSlave.belly >= 1500) {
					if (eventSlave.bellyPreg >= 1500) {
						r.push(`gravid`);
					} else {
						r.push(`rounded`);
					}
				}
				r.push(`body to the heavy beat, mesmerizing ${his} neighbors on the floor.`);
			} else if (eventSlave.skill.entertainment > 30) {
				r.push(`skillfully moving ${his}`);
				if (eventSlave.belly >= 1500) {
					if (eventSlave.bellyPreg >= 1500) {
						r.push(`gravid`);
					} else {
						r.push(`rounded`);
					}
				}
				r.push(`body to the heavy beat, drawing a lustful gaze or two.`);
			} else {
				r.push(`clumsily moving`);
				if (eventSlave.belly >= 1500) {
					if (eventSlave.bellyPreg >= 1500) {
						r.push(`gravid`);
					} else {
						r.push(`rounded`);
					}
				}
				r.push(`${his} body to the heavy beat, attracting little notice among the press of novices.`);
			}
			r.push(`It doesn't take long for ${him} to back ${himself} into you so ${he} can grind; ${he} cranes ${his} neck back to plant an <span class="devotion inc">earnest kiss</span> on your chin.`);
			eventSlave.devotion += 4;
			return r;
		}

		function sporting() {
			const frag = document.createDocumentFragment();
			r = [];
			r.push(`You call out to stop ${him}, and ${he} turns obediently to listen; you tell ${him} ${he}'ll be spending the day with you at a game outside the arcology, and ${he}'s to meet you at your VTOL pad in two hours. ${He} ponders for a moment but clearly understands this is related to ${his} age, somehow. Right at the proper time, ${he} arrives on the pad. ${He}'s clearly spent the whole time getting the right clothing; somehow ${he} used the clothing inventory system to find a cheerleader uniform from the home team. It's one size too small, though you're unsure whether this is intentional or not. The hem of the pleated cheerleader skirt is barely low enough to conceal ${his}`);
			if (eventSlave.dick > 0) {
				r.push(`dick,`);
			} else if (eventSlave.vagina === -1) {
				r.push(`lack of private parts,`);
			} else {
				r.push(`pussy,`);
			}
			r.push(`and ${he} bounces a little on ${his} heels for you to show off how ${he}'s going commando underneath it. ${His}`);
			if (eventSlave.belly >= 100000) {
				r.push(belly);
				if (eventSlave.bellyPreg >= 1500) {
					r.push(`pregnant`);
				}
			} else if (eventSlave.weight > 130) {
				r.push(`hugely soft`);
			} else if (eventSlave.belly >= 1500) {
				r.push(belly);
				if (eventSlave.bellyPreg >= 1500) {
					r.push(`pregnant`);
				}
			} else if (eventSlave.muscles > 30) {
				r.push(`ripped`);
			} else if (eventSlave.weight > 30) {
				r.push(`fat`);
			} else if (eventSlave.weight > 10) {
				r.push(`plush`);
			} else {
				r.push(`taut`);
			}
			r.push(`midriff is bare. The top`);
			if (eventSlave.boobs > 2000) {
				r.push(`somehow contains ${his} tits, with the team's logo at least`);
				if (V.showInches === 2) {
					r.push(`three feet`);
				} else {
					r.push(`a meter`);
				}
				r.push(`wide across ${his} chest.`);
			} else if (eventSlave.boobs > 1000) {
				r.push(`is a great location for the team's logo, since ${his} tits allow it to be quite large.`);
			} else if (eventSlave.boobs > 300) {
				r.push(`is a good location for the team's logo, since ${his} tits allow it to be pretty big.`);
			} else {
				r.push(`flatters ${his} flat chest, especially with the team logo over it.`);
			}
			r.push(`${He} even found a pair of appropriately colored pom-poms somewhere. The implicit message about age was understood; ${he}'s made up to look even younger.`);
			App.Events.addParagraph(frag, r);
			r = [];
			r.push(`You have a front-row seat, of course, and ${he} excitedly takes ${his} place beside you,`);
			if (eventSlave.butt > 12) {
				r.push(`thankful that you reserved a seat for both of ${his} massive cheeks.`);
			} else if (eventSlave.belly >= 300000) {
				r.push(`thankful that the front row has plenty of room for ${his} ${belly} belly to occupy.`);
			} else if (eventSlave.butt > 6) {
				r.push(`carefully fitting ${his} big bottom into the seat.`);
			} else if (eventSlave.boobs > 4000) {
				r.push(`${his} absurd boobs rubbing against your arm.`);
			}
			r.push(`${He} cheers lustily at all the right moments, earning repeated crowd focus shots on the big screen; many fans wonder who their ridiculously hot fellow fan is before recognizing you, putting two and two together, and realizing enviously that ${he}'s your sex slave. Since this is the Free Cities, the big screen gives ${him} more attention rather than cutting away when ${he} intentionally cheers hard enough that ${his} skirt rides up.`);
			if (eventSlave.broodmother === 2 && eventSlave.preg > 37) {
				r.push(`The only slightly embarrassing incident is when ${he}'s standing up to rally the crowd behind ${him}, facing away from the game and goes into labor on another of ${his} brood; the contractions forcing ${him} to lean forward onto ${his} r.push(belly);stomach and give the players below a clear view of ${his} crowning child.`);
			} else if (eventSlave.belly < 300000) {
				r.push(`The only slightly embarrassing incident is when ${he}'s standing up to rally the crowd behind ${him}, facing away from the game and bending down to show cleavage to the stands in such a way that ${his}`);
				if (eventSlave.butt > 5) {
					r.push(`massive ass`);
				} else if (eventSlave.butt > 2) {
					r.push(`big butt`);
				} else {
					r.push(`nice ass`);
				}
				r.push(`lifts ${his} skirt up enough that the players below can clearly see ${his}`);
				if (eventSlave.anus > 2) {
					r.push(`big slit of an asspussy`);
				} else if (eventSlave.anus > 1) {
					r.push(`nice asspussy`);
				} else if (eventSlave.anus > 0) {
					r.push(`tight asshole`);
				} else {
					r.push(`virgin asshole`);
				}
				if (eventSlave.vagina > 3) {
					r.push(`and gaping pussy`);
				} else if (eventSlave.vagina > 2) {
					r.push(`and used pussy`);
				} else if (eventSlave.vagina > 1) {
					r.push(`and lovely pussy`);
				} else if (eventSlave.vagina > 0) {
					r.push(`and tight pussy`);
				} else if (eventSlave.vagina === 0) {
					r.push(`and virgin pussy`);
				}
				r.push(r.pop() + `.`);
			} else {
				r.push(`The only slightly embarrassing incident is when ${he}'s standing up to rally the crowd behind ${him}, cheering while swinging ${his} absurd belly back and forth and accidentally smashes into a concession vendor, sending them to the floor. ${His} efforts to help him up forces ${him} to stand in such a way that ${his}`);
				if (eventSlave.butt > 5) {
					r.push(`massive ass`);
				} else if (eventSlave.butt > 2) {
					r.push(`big butt`);
				} else {
					r.push(`nice ass`);
				}
				r.push(`lifts ${his} skirt up enough that the players below can clearly see ${his}`);
				if (eventSlave.anus > 2) {
					r.push(`big slit of an asspussy`);
				} else if (eventSlave.anus > 1) {
					r.push(`nice asspussy`);
				} else if (eventSlave.anus > 0) {
					r.push(`tight asshole`);
				} else {
					r.push(`virgin asshole`);
				}
				if (eventSlave.vagina > 3) {
					r.push(`and gaping pussy`);
				} else if (eventSlave.vagina > 2) {
					r.push(`and used pussy`);
				} else if (eventSlave.vagina > 1) {
					r.push(`and lovely pussy`);
				} else if (eventSlave.vagina > 0) {
					r.push(`and tight pussy`);
				} else if (eventSlave.vagina === 0) {
					r.push(`and virgin pussy`);
				}
				r.push(r.pop() + `.`);
			}
			r.push(`A player from the visiting team is distracted enough to blow a play. Any fans who might have been inclined to disapprove forget their objections when the home team capitalizes on the mistake to score.`);
			repX(500, "event", eventSlave);
			App.Events.addParagraph(frag, r);
			return frag;
		}

		function old() {
			let didVaginal = false;
			let didAnal = false;
			r = [];
			r.push(`You call out to stop ${him}, and ${he} turns obediently to listen. You tell ${him} you're interested to see if ${his} old body can still perform. Something about the way you say 'old' makes ${him} flinch, and ${he}'s right to worry. You tell ${him} to go out and make you ${cashFormat(200)}, and to hurry back if ${he} wants to avoid punishment. ${He} hesitates for an instant before hurrying outside. A few hours later you check on ${him} remotely. The feed shows ${him}`);
			if (eventSlave.belly >= 10000) {
				r.push(`waddle`);
			} else {
				r.push(`walk`);
			}
			r.push(`quickly up to a couple out on the street; you can't hear what's said, but ${he}`);
			if (canDoAnal(eventSlave) || canDoVaginal(eventSlave)) {
				r.push(`turns around to rub ${his} bare butt against the crotch of the man's pants. He pulls them down and fucks ${him} right there`);
				if (canDoVaginal(eventSlave) && eventSlave.vagina === 0) {
					r.push(`<span class="virginity loss">taking ${his} virginity,</span>`);
					didVaginal = true;
				} else if (canDoAnal(eventSlave) && eventSlave.anus === 0) {
					r.push(`<span class="virginity loss">taking ${his} anal virginity,</span>`);
					didAnal = true;
				}
				r.push(`as the woman`);
				if (eventSlave.nipples !== "fuckable") {
					r.push(`pulls and abuses`);
				} else {
					r.push(`roughly fingers`);
				}
				r.push(`${his} poor nipples. Boring of this, he switches to torturing the poor slave's`);
				if (eventSlave.dick > 0) {
					r.push(`dick,`);
				} else if (eventSlave.vagina === -1) {
					r.push(`butthole,`);
				} else {
					r.push(`pussy,`);
				}
				r.push(`slapping ${him} until ${he} cries and then making out with the weeping whore. Much later, ${eventSlave.slaveName} limps tiredly into your office and gives you your  ${cashFormat(200)}. You ask ${him} how ${he}'s feeling, and ${he} mumbles,`,
					Spoken(eventSlave, `"I'm OK, ${Master}. Holes are pretty sore though. Kinda loose."`)
				);
			} else {
				r.push(`drops to ${his} ${hasBothLegs(eventSlave) ? "knees" : "knee"} to nuzzle against the man's pants. He pulls them down and facefucks ${him} right there, as the woman`);
				if (eventSlave.nipples !== "fuckable") {
					r.push(`pulls and abuses`);
				} else {
					r.push(`roughly fingers`);
				}
				r.push(`${his} poor nipples. Boring of this, ${he} switches to torturing the poor slave's`);
				if (eventSlave.dick > 0) {
					r.push(`dick,`);
				} else if (eventSlave.vagina === -1) {
					r.push(`butthole,`);
				} else {
					r.push(`pussy,`);
				}
				r.push(`slapping ${him} until ${he} cries and then making out with the weeping whore. Much later, ${eventSlave.slaveName} limps tiredly into your office and gives you your ${cashFormat(200)}. You ask ${him} how ${he}'s feeling, and ${he} mumbles,`,
					Spoken(eventSlave, `"I'm OK, ${Master}. My jaw kinda hurts and my legs are really sore."`)
				);
			}
			r.push(`You tell ${him} that's of little concern, since ${he} has relatively few years of use left: you may as well extract what value you can from ${him}. ${He}'s too exhausted to hide ${his} response, and collapses, sobbing.`);
			cashX(200, "event", eventSlave);
			eventSlave.trust -= 5;
			if (didAnal) {
				eventSlave.anus++;
				seX(eventSlave, "anal", "public", "penetrative");
				if (canGetPregnant(eventSlave) && eventSlave.eggType === "human") {
					r.push(knockMeUp(eventSlave, 10, 1, -2));
				}
			} else if (didVaginal) {
				eventSlave.vagina++;
				seX(eventSlave, "vaginal", "public", "penetrative");
				if (canGetPregnant(eventSlave) && eventSlave.eggType === "human") {
					r.push(knockMeUp(eventSlave, 10, 0, -2));
				}
			} else if (canDoVaginal(eventSlave)) {
				seX(eventSlave, "vaginal", "public", "penetrative");
				if (canGetPregnant(eventSlave) && eventSlave.eggType === "human") {
					r.push(knockMeUp(eventSlave, 10, 0, -2));
				}
			} else if (canDoAnal(eventSlave)) {
				seX(eventSlave, "anal", "public", "penetrative");
				if (canGetPregnant(eventSlave) && eventSlave.eggType === "human") {
					r.push(knockMeUp(eventSlave, 10, 1, -2));
				}
			} else {
				seX(eventSlave, "oral", "public", "penetrative");
			}
			return r;
		}
	}
};


code:
App.Events.RESSAmpDevoted = class RESSAmpDevoted extends App.Events.BaseEvent {
	eventPrerequisites() {
		return []; // always valid if sufficient actors can be cast successfully
	}

	actorPrerequisites() {
		return [
			[ // single event slave
				s => s.fetish !== "mindbroken",
				s => s.devotion > 20,
				s => s.assignment !== Job.QUARTER,
				isAmputee,
			]
		];
	}

	execute(node) {
		const [eventSlave] = this.actors.map(a => getSlave(a));
		const {
			His, He, he, his, him, himself, girl
		} = getPronouns(eventSlave);
		const belly = bellyAdjective(eventSlave);

		App.Events.drawEventArt(node, eventSlave);

		let r = [];
		r.push(`Lying on the couch next to your desk as you work is`);
		r.push(App.UI.DOM.combineNodes(contextualIntro(V.PC, eventSlave, true), ","));
		r.push(`looking like the neglected`);
		if (eventSlave.belly >= 600000) {
			if (eventSlave.bellyPreg > 0) {
				r.push(`baby-filled womb`);
			} else {
				r.push(`overinflated sex toy`);
			}
		} else if (eventSlave.belly >= 5000) {
			if (eventSlave.bellyPreg >= 3000) {
				r.push(`pregnant`);
			} else if (eventSlave.bellyImplant >= 3000) {
				r.push(`blow-up`);
			} else {
				r.push(`${eventSlave.inflationType} filled`);
			}
			r.push(`sex toy`);
		} else {
			r.push(`little sex toy`);
		}
		r.push(`that ${he} is. You've been busy and haven't used ${him} for a while, and since ${he}'s accepted ${his} place as a helpless living fucktoy, ${he}'s gotten quite aroused with nothing to do but lie there and watch ${his} ${getWrittenTitle(eventSlave)} work. It's not like ${he} can touch ${himself} any more.`);
		if (eventSlave.chastityPenis === 1) {
			r.push(`${His} caged cock reduces ${him} to a set of holes in a limbless torso.`);
		} else if (eventSlave.dick > 0 && !canAchieveErection(eventSlave)) {
			r.push(`${His} penis hangs limp and useless from ${his} limbless torso.`);
		} else if (eventSlave.dick >= 5) {
			r.push(`${His} huge erection pokes out from ${his} limbless torso, ${his} only remaining appendage.`);
		} else if (eventSlave.dick > 2) {
			r.push(`${His} still-proud erection pokes out from ${his} limbless torso.`);
		} else if (eventSlave.dick > 0) {
			r.push(`${His} pathetic little erection pokes out from ${his} limbless torso.`);
		} else if (eventSlave.clit > 0) {
			r.push(`${His} engorged clit juts out from ${his} legless hips.`);
		} else if (eventSlave.vagina === -1) {
			if (canDoAnal(eventSlave)) {
				r.push(`${His} asspussy is on total display, unobscured by thighs.`);
			} else {
				r.push(`${His} anal chastity is on total display, unobscured by thighs.`);
			}
		} else {
			if (canDoVaginal(eventSlave)) {
				r.push(`${His} moist pussy is on total display, unobscured by thighs.`);
			} else {
				r.push(`${His} vaginal chastity is on total display, unobscured by thighs.`);
			}
		}
		if (eventSlave.belly >= 10000) {
			r.push(`${His}`);
			if (eventSlave.bellyPreg >= 8000) {
				r.push(`advanced pregnancy`);
			} else {
				r.push(`greatly distended belly`);
			}
			r.push(`gives ${him} a comically rounded appearance.`);
		}
		if (eventSlave.boobs > 4000) {
			r.push(`${He}'s almost smothered by ${his} gigantic breasts as ${he} lies there; ${his} remaining body is almost half breasts.`);
		}
		App.Events.addParagraph(node, r);

		let choices = [];
		if (eventSlave.belly < 1500 && (canDoAnal(eventSlave) || canDoVaginal(eventSlave))) {
			choices.push(new App.Events.Result(`Carry ${him} over to your work`, work, virginityCheck()));
		}
		if ((V.PC.dick !== 0) && (canDoAnal(eventSlave) || canDoVaginal(eventSlave)) && V.PC.belly < 100) {
			choices.push(new App.Events.Result(`Carry ${him} outside`, outside, virginityCheck()));
		}
		choices.push(new App.Events.Result(`See how high ${his} arousal will go`, high));
		App.Events.addResponses(node, choices);

		function virginityCheck() {
			if (canDoVaginal(eventSlave) && (eventSlave.vagina === 0)) {
				return `This option will take ${his} virginity`;
			} else if (!canDoVaginal(eventSlave) && (eventSlave.anus === 0)) {
				return `This option will take ${his} anal virginity`;
			}
		}

		function work() {
			const {
				hisP, heP, himP
			} = getPronouns(V.PC).appendSuffix("P");
			r = [];
			r.push(`Since you're so busy, you find a way of working and seeing to your sex toy both. You scoop ${him} up, eliciting whimpers of joy at the impending relief,`);
			if (V.PC.dick === 0) {
				r.push(`and move over to the couch so you can work lying down. You sit ${him} on top of you, reversed so ${his} head is between your legs for a little oral service, and slide a dildo`);
				if (canDoVaginal(eventSlave)) {
					r.push(`into ${his} pussy so you can tease ${him} at leisure when you have a spare moment.`);
					r.push(VCheck.Vaginal(eventSlave, 1));
				} else {
					r.push(`up ${his} butt so you can sodomize ${him} at leisure when you have a spare moment.`);
					r.push(VCheck.Anal(eventSlave, 1));
				}
			} else {
				r.push(`and sit back down at your desk. You slide ${him} onto your erect member and carefully secure ${him} with a few straps so ${he} can serve as your living cocksleeve as you see to your business.`);
			}
			r.push(`There isn't much thrusting as you continue with your affairs, but ${he}'s so horny ${he} doesn't need it. ${He} has become more submissive to you. There's no telling what the day's faceless business interlocutors would think if they knew the person on the other side of their communications had`);
			if (V.PC.dick === 0) {
				r.push(`a limbless slave gently sucking ${hisP} clit while they spoke with ${himP}.`);
			} else {
				r.push(`${hisP} cock inside a limbless slave as ${heP} dealt with them.`);
			}
			eventSlave.devotion += 4;
			return r;
		}

		function outside(){
			r = [];
			if (eventSlave.belly >= 600000) {
				r.push(`You struggle to heft ${his} overfilled body up, eliciting whimpers of joy at the impending relief and the pressure removed from ${his} body, and carefully secure ${him} with a few straps so ${he} can serve as your living cocksleeve. ${He}'s attached to the front of your torso`);
				if (eventSlave.belly >= 5000) {
					r.push(r.pop() + ",");
					r.push(`${his} ${belly}`);
					if (eventSlave.bellyPreg >= 3000) {
						r.push(`pregnancy`);
					} else {
						r.push(`stomach`);
					}
					r.push(`forcing you to experience what it is like to carry ${eventSlave.pregType} children,`);
				}
				r.push(`with your cock up inside ${him}, and the gentle motion of your member as you waddle outside brings ${him} to climax within a few steps. You carefully stroll around the nicer levels of the arcology, admiring the views and`);
				if (canSee(eventSlave)) {
					r.push(`showing ${eventSlave.slaveName} the sights ${he} now requires assistance to see`);
				} else if (canHear(eventSlave)) {
					r.push(`explaining the sights as ${eventSlave.slaveName} soaks in the sounds`);
					if (canSmell(eventSlave)) {
						r.push(`and smells`);
					}
					r.push(`${he} now requires assistance to experience`);
				} else {
					r.push(`explaining everything around ${him} as ${he} basks in the feeling of the fresh air on ${his} ${eventSlave.skin} skin`);
				}
				r.push(`and leaving a large wake as people make room for your gravid mass. ${He} has become more devoted to you. The sight of you waddling around with a living fucktoy on your cock certainly cements your reputation as an arcology owner who has everything, once they figure out that the belly attached to you is, in fact, owned by a barely visible slave${girl}.`);
			} else if (eventSlave.belly >= 300000) {
				r.push(`You heft ${his} heavy body up, eliciting whimpers of joy at the impending relief, and carefully secure ${him} with a few straps so ${he} can serve as your living cocksleeve. ${He}'s attached to the front of your torso`);
				if (eventSlave.belly >= 5000) {
					r.push(r.pop() + ",");
					r.push(`${his} ${belly}`);
					if (eventSlave.bellyPreg >= 3000) {
						r.push(`pregnancy`);
					} else {
						r.push(`stomach`);
					}
					r.push(`massively jutting out in front of you,`);
				}
				r.push(`with your cock up inside ${him}, and the gentle motion of your member as you waddle outside brings ${him} to climax within a few steps. You carefully stroll around the nicer levels of the arcology, admiring the views and`);
				if (canSee(eventSlave)) {
					r.push(`showing ${eventSlave.slaveName} the sights ${he} now requires assistance to see.`);
				} else if (canHear(eventSlave)) {
					r.push(`explaining the sights as ${eventSlave.slaveName} soaks in the sounds`);
					if (canSmell(eventSlave)) {
						r.push(`and smells`);
					}
					r.push(`${he} now requires assistance to experience.`);
				} else {
					r.push(`explaining everything around ${him} as ${he} basks in the feeling of the fresh air on ${his} ${eventSlave.skin} skin.`);
				}
				r.push(`${He} has become more devoted to you. The sight of you waddling around with a living fucktoy on your cock certainly cements your reputation as an arcology owner who has everything.`);
			} else {
				r.push(`You scoop ${him} up, eliciting whimpers of joy at the impending relief, and carefully secure ${him} with a few straps so ${he} can serve as your living cocksleeve. ${He}'s attached to the front of your torso`);
				if (eventSlave.belly >= 5000) {
					r.push(r.pop() + ",");
					r.push(`${his} ${belly}`);
					if (eventSlave.bellyPreg >= 3000) {
						r.push(`pregnancy`);
					} else {
						r.push(`stomach`);
					}
					r.push(`jutting out in front of you,`);
				}
				r.push(`with your cock up inside ${him}, and the gentle motion of your member as you walk outside brings ${him} to climax within a few steps. You take your time and stroll around the nicer levels of the arcology, admiring the views and`);
				if (canSee(eventSlave)) {
					r.push(`showing ${eventSlave.slaveName} the sights ${he} now requires assistance to see.`);
				} else if (canHear(eventSlave)) {
					r.push(`explaining the sights as ${eventSlave.slaveName} soaks in the sounds`);
					if (canSmell(eventSlave)) {
						r.push(`and smells`);
					}
					r.push(`${he} now requires assistance to experience.`);
				} else {
					r.push(`explaining everything around ${him} as ${he} basks in the feeling of the fresh air on ${his} ${eventSlave.skin} skin.`);
				}
				r.push(`${He} has become more devoted to you. The sight of you walking around with a living fucktoy on your cock certainly cements your reputation as an arcology owner who has everything.`);
			}
			eventSlave.devotion += 4;
			repX(500, "event", eventSlave);
			if (canDoVaginal(eventSlave)) {
				r.push(VCheck.Vaginal(eventSlave, 1));
			} else {
				r.push(VCheck.Anal(eventSlave, 1));
			}
			return r;
		}

		function high(){
			const inch = V.showInches === 2 ? "inch" : "centimeter";
			r = [];
			r.push(`You scoop ${him} up, eliciting whimpers of joy at the impending relief. ${He} moans with disappointment, however, to find ${himself} laid unceremoniously across your desk as you return to your work. You surreptitiously set your desk to monitor ${his} vital signs and gauge ${his} closeness to orgasm. Whenever you can do so without tipping ${his} over, you gently run your fingers across a helpless nipple, across ${his}`);
			if (eventSlave.vagina === -1) {
				r.push(`groin,`);
			} else {
				r.push(`moist lips,`);
			}
			if (eventSlave.belly >= 10000) {
				r.push(`around the edge of ${his}`);
				if (eventSlave.bellyPreg >= 3000) {
					r.push(`pregnant`);
				}
			} else if (eventSlave.belly >= 1500) {
				r.push(`over the peak of ${his}`);
				if (eventSlave.bellyPreg >= 1500) {
					r.push(`pregnant`);
				}
			}
			r.push(`belly, or along ${his} surgical scars.`);
			if (canDoVaginal(eventSlave) && eventSlave.vagina > 0) {
				r.push(`After so much of this that ${he}'s clearly ready to orgasm at the slightest further touch, you gently massage ${his} nether lips with a single finger and ${he} comes spastically, abdominal muscles quivering. ${His} pussy relaxes and opens naturally; taking the cue, you pick ${him} up and lower ${him}, ${inch} by moaning ${inch}, onto`);
				if (V.PC.dick === 0) {
					r.push(`a strap-on you put on while playing with ${his}.`);
				} else {
					r.push(`your cock.`);
				}
				r.push(VCheck.Vaginal(eventSlave, 1));
				r.push(`After pumping ${his} helpless torso up and down with your arms, a parody of masturbation with ${his} helpless body,`);
			} else if (canDoAnal(eventSlave) && eventSlave.anus > 0) {
				r.push(`After so much of this that ${he}'s clearly ready to orgasm at the slightest further touch, you gently massage ${his} anus with a single finger and ${he} comes spastically, abdominal muscles quivering. ${His} sphincter relaxes and opens naturally; taking the cue, you pick ${him} up and lower ${his} rectum, ${inch} by sobbing ${inch}, onto`);
				if (V.PC.dick === 0) {
					r.push(`a strap-on you put on while playing with ${his}.`);
				} else {
					r.push(`your cock.`);
				}
				r.push(VCheck.Anal(eventSlave, 1));
				r.push(`After pumping ${his} helpless torso up and down with your arms, a parody of masturbation with ${his} helpless body,`);
			} else {
				r.push(`After so much of this that ${he}'s clearly ready to orgasm at the slightest further touch, you grab ${his}`);
				if (eventSlave.boobs > 8000) {
					r.push(`massive tits`);
				} else if ((eventSlave.boobsImplant/eventSlave.boobs) >= .60) {
					r.push(`fake tits`);
				} else if (eventSlave.boobs > 2000) {
					r.push(`huge boobs`);
				} else if (eventSlave.boobs > 400) {
					r.push(`boobs`);
				} else {
					r.push(`petite chest`);
				}
				r.push(`and ${he} comes spastically, soaking ${himself} and your desk with fluids. Once you tire of vigorously groping ${him},`);
			}
			r.push(`you carry your toy to the shower to wash ${him}. <span class="trust inc">${He} has become more trusting of you.</span>`);
			eventSlave.trust += 4;
			return r;
		}
	}
};


code:
App.Events.RESSAraAra = class RESSAraAra extends App.Events.BaseEvent {
	eventPrerequisites() {
		return []; // always valid if sufficient actors can be cast successfully
	}

	actorPrerequisites() {
		return [
			[ // single event slave
				s => s.fetish !== "mindbroken",
				hasAnyArms,
				hasAnyLegs,
				canTalk,
				s => s.assignment !== Job.QUARTER,
				s => s.physicalAge > 35,
				s => s.rules.speech !== "restrictive",
				s => [Job.PUBLIC, Job.WHORE].includes(s.assignment),
				s => s.devotion >= -20,
				s => s.devotion <= 95,
			]
		];
	}

	execute(node) {
		const [eventSlave] = this.actors.map(a => getSlave(a));
		const {
			His, He, he, his, him, himself, girl
		} = getPronouns(eventSlave);
		const {title: Master, say} = getEnunciation(eventSlave);
		const belly = bellyAdjective(eventSlave);

		App.Events.drawEventArt(node, eventSlave, "no clothing");

		const r = new SpacedTextAccumulator(node);
		r.push(`Passing by the kitchen in the morning, you take a moment to listen to the low hum of your slaves chatting as they`);
		if (V.feeder !== 0) {
			r.push(`wait their turn at the phallic feeders.`);
		} else {
			r.push(`drink their breakfasts.`);
		}
		r.push(App.UI.DOM.slaveDescriptionDialog(eventSlave));
		r.push(`is nearest the door, and you overhear ${his}`);
		if (eventSlave.voice === 1) {
			r.push(`low`);
		} else if (eventSlave.voice === 2) {
			r.push(`pretty`);
		} else {
			r.push(`high`);
		}
		r.push(
			`voice clearly as ${he} expresses confusion to another slave.`,
			Spoken(eventSlave, `"I don't understand it,"`),
			`${he} ${say}s.`,
			Spoken(eventSlave, `"Why are so many men interested in an old slave like me? I never got this much attention when I was free! Now`)
		);
		if (eventSlave.assignment === Job.WHORE || eventSlave.assignment === Job.BROTHEL) {
			r.push(Spoken(eventSlave, `guys line up to pay to fuck me!"`));
		} else {
			r.push(Spoken(eventSlave, `every guy I approach wants to fuck me!"`));
		}
		r.toParagraph();
		if (V.arcologies[0].FSMaturityPreferentialist !== "unset") {
			r.push(`"It's different here," the other slave explains. "Almost everyone here has a thing for older ${V.seeDicks < 100 ? "women. MILFs" : "men. DILFs"} get all the attention."`); // review seeDicks here
		} else if (V.arcologies[0].FSGenderRadicalist !== "unset" && (eventSlave.dick > 0 || eventSlave.vagina === -1)) {
			if (eventSlave.vagina > -1) {
				r.push(`"Well, you're a futa," the other slave explains. "A chick with a dick. Everyone here is going to want to fuck you, since you've got both."`);
			} else if (eventSlave.balls > 0) {
				r.push(`"Well, I bet you cum when they fuck you," the other slave explains. "They love it when you do that here."`);
			} else if (eventSlave.dick === 0) {
				r.push(`"You've got nothing in front," the other slave explains. "That's like an advertisement that your ass is public, here."`);
			} else {
				r.push(`"You've got a soft girldick," the other slave explains. "That's like an advertisement that you love it up the butt, here."`);
			}
		} else if (V.arcologies[0].FSAssetExpansionist !== "unset" && eventSlave.boobs > 4000) {
			r.push(`"It's your boobs," the other slave explains. "There's no such thing as too big, here. Everyone who sees your boobs here is going to want to fuck you."`);
		} else if (V.arcologies[0].FSAssetExpansionist !== "unset" && eventSlave.butt > 7) {
			r.push(`"It's your ass," the other slave explains. "There's no such thing as too big, here. Everyone who sees your ass here is going to want to fuck you."`);
		} else if ((V.arcologies[0].FSRepopulationFocus !== "unset") && eventSlave.belly >= 5000) {
			r.push(`"It's your belly," the other slave explains. "They love how big and round it is. If you look pregnant, they'll be all over you. Even if it's fake, they won't care."`);
		} else if (V.arcologies[0].FSRepopulationFocusPregPolicy === 1 && eventSlave.bellyPreg >= 5000) {
			r.push(`"It's your belly," the other slave explains. "Preggos are in these days and you aren't exactly lacking in the 'with child' department."`);
		} else if (V.arcologies[0].FSPastoralist !== "unset" && eventSlave.boobs >= 800 && eventSlave.lactation > 0 && eventSlave.lactationAdaptation > 50) {
			r.push(`"It's those plump, milky titties you have," the other slave explains. "Everyone here is thirsty for a motherly body like yours, in more ways than one."`);
		} else if ((V.arcologies[0].FSTransformationFetishist !== "unset" && eventSlave.boobsImplant/eventSlave.boobs) >= .50) {
			r.push(`"It's your fake tits," the other slave explains. "They love how fake they look, here. If you look like a bimbo, they don't care if you're a little mature."`);
		} else if (V.arcologies[0].FSHedonisticDecadence !== "unset" && eventSlave.weight > 95) {
			r.push(`"You're so fat," the other slave explains. "Everyone here loves thick ${girl}s. They don't care that you're a little mature; that just means you understand life's pleasures more."`);
		} else if (V.arcologies[0].FSPhysicalIdealist !== "unset" && eventSlave.muscles > 50) {
			r.push(`"It's how ripped you are," the other slave explains. "It promises you won't give out after one fuck, no matter how old you are."`);
		} else if (V.arcologies[0].FSSlimnessEnthusiast !== "unset" && eventSlave.boobs < 800 && eventSlave.butt < 3) {
			r.push(`"You're so slim," the other slave explains. "Everyone here loves slender ${girl}s. They don't care that you're a little mature; they think you're hot."`);
		} else if (V.arcologies[0].FSStatuesqueGlorification !== "unset" && heightPass(eventSlave)) {
			r.push(`"You're really fucking tall," the other slave explains. "Guys here love a ${girl} that tower over them and you're, like, the definition of tall."`);
		} else if (V.arcologies[0].FSPetiteAdmiration !== "unset" && heightPass(eventSlave)) {
			r.push(`"You're so small," the other slave explains. "A guy can just scoop you up and carry you off for a good time."`);
		} else if (V.arcologies[0].FSBodyPurist !== "unset" && eventSlave.boobsImplant === 0 && eventSlave.health.condition > 50) {
			r.push(`"It's how healthy you are, and your natural boobs," the other slave explains. "You look good and natural, and everyone likes that here, especially if you're mature."`);
		} else if ((V.arcologies[0].FSIntellectualDependency !== "unset") && bimboScore(eventSlave) >= 6) {
			r.push(`"You're so hot," the other slave explains. "Guys love a ${girl} who knows a good time and your body screams 'ravish me'."`);
		} else if (eventSlave.face > 95) {
			r.push(`"It might have something to do with how incredibly beautiful you are," the other slave explains sarcastically. "Come on, you could be a model. Of course they want you."`);
		} else if (eventSlave.boobs > 4000) {
			r.push(`"It might have something to do with the fact that your tits are bigger than your head," the other slave explains sarcastically. "You look like a teenager's wet dream."`);
		} else if (eventSlave.butt > 7) {
			r.push(`"It might have something to do with that outrageous caboose you have," the other slave explains sarcastically. "You look like an ass man's wet dream."`);
		} else if (eventSlave.face > 10) {
			r.push(`"You're very pretty," the other slave explains reassuringly. "Come on, you are. It's not surprising that guys want you."`);
		} else {
			r.push(`"Is it really that surprising?" the other slave asks rhetorically. "Guys like sex. You're sex. Why shouldn't they like you? I bet fucking you feels great."`);
		}
		r.push(`There's a pause, and then the other slave continues in a more serious tone, asking, "You're not, like, unhappy with that, are you? It's really good for a slave to be in demand, you know."`);
		r.toParagraph();
		r.push(
			Spoken(eventSlave, `"Oh no, I didn't mean it like that,"`),
			`replies ${eventSlave.slaveName} hurriedly.`
		);
		if (eventSlave.energy > 80) {
			r.push(Spoken(eventSlave, `"I'm so horny all the time, it's good. I'd probably go crazy if I didn't get that much attention. Whenever anyone's done with me I can't wait for the next.`));
		} else if (eventSlave.fetish === "humiliation") {
			r.push(Spoken(eventSlave, `"It's embarrassing, but I, um, really like being so popular in public, um, like that. Where everyone can see.`));
		} else if (eventSlave.devotion > 50) {
			r.push(Spoken(eventSlave, `"I really want to do well, and it feels good that I'm able to help.`));
		} else if (eventSlave.devotion > 20) {
			r.push(Spoken(eventSlave, `"I, um, know I have to. And it's not bad, I mean, it's okay.`));
		} else {
			r.push(Spoken(eventSlave, `"I know it means I'm worth something. It's reassuring, and I remind myself of it whenever I get scared about being a slave, you know.`));
		}
		r.push(
			Spoken(eventSlave, `I didn't mean to sound conceited, either. I guess I'm still getting used to life here, that's all. Sometimes I think like I'm not, um, here, and I'm surprised so many people want me. It's kind of nice, actually,"`),
			`${he} ${say}s with some self-confidence.`
		);
		if (eventSlave.fetish === "humiliation" && eventSlave.fetishKnown === 0) {
			r.push(`It sounds like ${he} has a <span class="fetish gain">humiliation fetish!</span>`);
			eventSlave.fetishKnown = 1;
		}

		r.toParagraph();
		App.Events.addResponses(node, [
			new App.Events.Result(`Praise ${his} outlook`, praise),
			new App.Events.Result(`Let ${him} know you think ${he}'s attractive, too`, attractive, virginityWarning()),
		]);

		function virginityWarning() {
			if (canDoVaginal(eventSlave) && (eventSlave.vagina === 0) && V.PC.dick !== 0) {
				return `This option will take ${his} virginity`;
			} else if (canDoAnal(eventSlave) && (eventSlave.anus === 0) && V.PC.dick !== 0) {
				return `This option will take ${his} anal virginity`;
			}
		}

		function praise() {
			const r = new SpacedTextAccumulator();
			r.push(`You speak from where you are, and without preamble, startling both slaves badly. Doing their best to recover, they listen as you tell ${eventSlave.slaveName} that ${he} has a good, praiseworthy outlook on life as a sex slave.`);
			if (eventSlave.energy > 80) {
				r.push(`${His} extreme appetite for sex will serve ${him} well. It's important to love what you do, and if ${he} wakes up every morning wanting to get fucked, ${he}'ll enjoy ${his} life as a`);
				if (eventSlave.assignment === Job.WHORE || eventSlave.assignment === Job.BROTHEL) {
					r.push(`slave prostitute.`);
				} else {
					r.push(`public slut.`);
				}
			} else if (eventSlave.fetish === "humiliation") {
				r.push(`${He} should feel lucky to have a fetish for public use. It's important to love what you do, and if being openly passed around gets ${him} off, ${he}'ll enjoy ${his} life as a`);
				if (eventSlave.assignment === Job.WHORE || eventSlave.assignment === Job.BROTHEL) {
					r.push(`slave prostitute.`);
				} else {
					r.push(`public slut.`);
				}
			} else if (eventSlave.devotion > 50) {
				r.push(`It's great that ${he}'s internalized ${his} role, and wants to do well. As long as ${he} wants to perform well and applies ${himself}, you're confident that ${he}'ll continue to improve and become a better and more valuable slave.`);
			} else if (eventSlave.devotion > 20) {
				r.push(`${His} obedience is commendable. You understand that ${he} struggles with ${his} life as an involuntary sex object at times. ${He}'ll learn to do better, and as ${he} improves, ${he}'ll be all right as long as ${he} obeys you and does ${his} best.`);
			} else {
				r.push(`To describe ${his} situation bluntly, the best possible approach for ${him} is to obey you and do ${his} best. There's not really any possible outcome in which slaves can lose out by doing their best to be useful and valuable. It's in ${his} interest to do ${his} best.`);
			}
			r.push(
				Spoken(eventSlave, `"Yes, ${Master},"`),
				`they chorus automatically. You turn and go. ${eventSlave.slaveName} is taken a bit aback by your apparent omnipresence in the penthouse, but reminds ${himself} that your guidance seemed straightforward and genuine. ${He}'s confirmed in ${his} understanding of what it means to be a good ${SlaveTitle(eventSlave)}.`
			);
			eventSlave.trust += 5;
			r.toParagraph();
			return r.container();
		}

		function attractive() {
			const r = new SpacedTextAccumulator();
			const {himU, heU} = getNonlocalPronouns(V.seeDicks).appendSuffix('U');
			r.push(`The slaves continue their gossip until ${eventSlave.slaveName} feels a pair of`);
			if (V.PC.title === 1) {
				r.push(`strong`);
			} else {
				r.push(`firm, feminine`);
			}
			r.push(`hands grip the sides of ${his}`);
			if (eventSlave.belly >= 150000) {
				r.push(`${belly} distended`);
			} else if (eventSlave.weight > 95) {
				r.push(`fat`);
			} else if (eventSlave.belly >= 5000) {
				if (eventSlave.bellyPreg >= 3000) {
					r.push(`pregnancy swollen`);
				} else if (eventSlave.bellyImplant >= 3000) {
					r.push(`implant swollen`);
				} else {
					r.push(`${eventSlave.inflationType}-bloated`);
				}
			} else if (eventSlave.weight > 30) {
				r.push(`pudgy`);
			} else if (eventSlave.waist < -95) {
				r.push(`cartoonishly narrow`);
			} else if (eventSlave.muscles > 30) {
				r.push(`ripped`);
			} else if (eventSlave.waist < -10) {
				r.push(`wasp`);
			} else if (eventSlave.weight > 10) {
				r.push(`soft`);
			} else if (eventSlave.muscles > 5) {
				r.push(`toned`);
			} else if (eventSlave.weight >= -10) {
				r.push(`trim`);
			} else {
				r.push(`skinny`);
			}
			r.push(`waist. ${He} starts but doesn't try to turn, and shivers as you run your hands up`);
			if (eventSlave.weight > 130) {
				r.push(`the thick, soft flesh that pads ${his} ribs`);
			} else if (eventSlave.muscles > 30) {
				r.push(`the muscles that jacket ${his} ribs`);
			} else if (eventSlave.weight > 30) {
				r.push(`the soft flesh that pads ${his} ribs`);
			} else {
				r.push(`${his} ribcage`);
			}
			r.push(`and forward`);
			if (eventSlave.boobs > 3000) {
				r.push(`into the soft, weighty place formed by the overhang of ${his} massive breasts`);
			} else if (eventSlave.boobs > 300) {
				r.push(`to cup ${his} breasts`);
			} else {
				r.push(`to clasp ${him} around the sternum`);
			}
			r.push(`and pull ${him} back into your arms. The other slave watches silently, awaiting some cue as to whether ${heU}'s to join in or return to breakfast; you give ${himU} a flick of your chin, and ${heU} turns away, leaving you with ${eventSlave.slaveName}, embracing among the eating slaves.`);
			r.toParagraph();
			r.push(`You whisper into ${his} ear that you think ${he}'s attractive,`);
			if (V.PC.dick !== 0) {
				r.push(`and point out that ${he} can feel the proof between ${his} buttocks. You're hard, and your stiff prick is poking ${him} in the rear. ${He} gasps and shifts a little, and you nestle your dick even closer into the warm place between ${his} legs and ass.`);
			} else {
				r.push(`and tell ${him} that you can prove it. You grab one of ${his} hands and pull it around behind ${him}, between you, making ${him} feel your pussy. ${He} gasps at how wet it is.`);
			}
			r.push(
				Spoken(eventSlave, `"An old slave like me, ${Master}?"`),
				`${he} echoes in a small voice. An old slave like ${him}, you confirm, and tell ${him} that right now,`
			);
			if (V.PC.dick !== 0 && (canDoVaginal(eventSlave) || canDoAnal(eventSlave))) {
				if (canDoVaginal(eventSlave)) {
					r.push(`you've decided to fuck ${his} pussy. ${He} starts at the sudden vulgarity, even with your cock resting against the soft skin between the bottom of ${his} vulva and ${his} anus, and shudders with sudden pleasure as you use a hand to guide yourself inside ${his} welcoming channel.`);
					r.push(VCheck.Vaginal(eventSlave, 1));
				} else {
					r.push(`${his} ass is yours. ${He} starts at the sudden vulgarity, even though`);
					if (canHear(eventSlave)) {
						r.push(`hearing`);
					} else {
						r.push(`discovering`);
					}
					r.push(`that the cock that's pressing against ${his} butt will be going inside it soon can't be that surprising. ${He} cocks ${his} hips obediently, letting you force your dick up ${his} asshole.`);
					r.push(VCheck.Anal(eventSlave, 1));
				}
				r.push(`You take ${him} standing,`);
			} else {
				r.push(`some oral sex from a slave like ${him} sounds just right. You push ${him} to ${his} knees and`);
				if (V.PC.dick !== 0) {
					r.push(`push your dick into ${his} mouth,`);
				} else {
					r.push(`hold ${his} mouth to your cunt,`);
				}
				r.push(`taking your pleasure from ${him}`);
				seX(eventSlave, "oral", V.PC, "penetrative");
			}
			r.push(`right there among your breakfasting slaves, who try to ignore you or watch with appreciation, according to their own natures. When you're finished, you`);
			if (V.PC.dick !== 0) {
				r.push(`spin ${him} around and kiss ${him},`);
			} else {
				r.push(`pull ${him} up to ${his} feet and kiss ${him}, tasting yourself on ${his} lips and`);
			}
			r.push(`making sure ${he} knows <span class="devotion inc">you appreciate ${his} mature body</span> just as much as`);
			if (eventSlave.assignment === Job.WHORE || eventSlave.assignment === Job.BROTHEL) {
				r.push(`${his} customers do.`);
			} else {
				r.push(`your citizens do.`);
			}
			eventSlave.devotion += 5;
			r.toParagraph();
			return r.container();
		}
	}
};