code:
/**
 * Displays a summary of the infant
 * @param {FC.InfantState} child
 * @returns {string}
 */
App.Facilities.Nursery.InfantSummary = function(child) {
	const weeksOwned = V.week - child.weekAcquired;
	const abbreviate = V.UI.slaveSummary.abbreviation;

	let r = ``;

	function InfantSummaryUncached() {
		// r += health();
		r += description();
		r += race();
		r += nationality();
		r += skin();
		r += age();
		r += face();

		r += `</span><br>`;

		if (V.seeImages !== 1 || V.seeSummaryImages !== 1 || V.imageChoice === 1) {
			r += "    ";
		}

		r += intelligence();
		if (child.prestige > 0) {
			r += prestige();
		}
		if (child.porn?.prestige > 0) {
			r += pornPrestige();
		}
		r += behavioralFlaw();
		r += sexualFlaw();

		if ((child.relationship !== 0) || (abbreviate.clothes === 2) || (abbreviate.rulesets === 2)) {
			r += `<br> `;
			if (V.seeImages !== 1 || V.seeSummaryImages !== 1 || V.imageChoice === 1) {
				r += `    `;
			}
		}

		r += extendedFamily();
		r += rival();

		r += `    `;

		if (abbreviate.origins === 2 && child.origin !== "") {
			r += origins();
		}

		return r;
	}

	// function health() {
	// if (abbreviate.health === 1) {
	// 	return shortHealth();
	// } else if (abbreviate.health === 2) {
	// 	return longHealth();
	// }
	// }

	function description() {
		let desc;

		if (abbreviate.nationality +
			abbreviate.genitalia +
			abbreviate.physicals +
			abbreviate.skills +
			abbreviate.mental !== 0) {
			r += `<br> `;
			if (V.seeImages !== 1 || V.seeSummaryImages !== 1 || V.imageChoice === 1) {
				r += "    ";
			}
		}

		if (child.actualAge > 0) {
			if (child.actualAge > 1) {
				desc = `toddler`;
			} else {
				desc = `baby`;
			}
		} else {
			if (weeksOwned <= 1) {
				desc = `newborn`;
			} else {
				desc = `baby`;
			}
		}

		const firstLetter = desc.substring(0, 1).toUpperCase();

		desc = firstLetter + desc.substring(1);
		r += `<strong><span class="coral">${desc}${abbreviate.physicals === 2 ? '.' : ''}</span></strong> `;

		return r;
	}

	function race() {
		let r = ``;

		if (V.seeRace) {
			r += `<span class="race">`;

			if (abbreviate.race === 1) {
				r += shortRace();
			} else if (abbreviate.race === 2) {
				r += App.Data.misc.filterRaces.get(child.race) || `${child.race.charAt(0).toUpperCase() + child.race.slice(1)}. `;
			}
			r += `</span> `;
		}

		return r;
	}

	function nationality() {
		if (abbreviate.nationality === 1) {
			return shortNationality();
		} else if (abbreviate.nationality === 2) {
			return longNationality();
		}
	}

	function skin() {
		if (abbreviate.physicals === 1) {
			return shortSkin();
		} else {
			return longSkin();
		}
	}

	function age() {
		if (abbreviate.physicals === 1) {
			return shortAge();
		} else if (abbreviate.physicals === 2) {
			return longAge();
		}
	}

	function face() {
		if (abbreviate.physicals === 1) {
			return shortFace();
		} else if (abbreviate.physicals === 2) {
			return longFace();
		}
	}

	function intelligence() {
		if (abbreviate.skills === 1) {
			return shortIntelligence();
		} else if (abbreviate.skills === 2) {
			return longIntelligence();
		}
	}

	function prestige() {
		if (abbreviate.skills === 1) {
			return shortPrestige();
		} else if (abbreviate.skills === 2) {
			return longPrestige();
		}
	}

	function pornPrestige() {
		if (abbreviate.skills === 1) {
			return shortPornPrestige();
		} else if (abbreviate.skills === 2) {
			return longPornPrestige();
		}
	}

	function behavioralFlaw() {
		if (abbreviate.mental === 1) {
			return shortBehaviorFlaw();
		} else if (abbreviate.mental === 2) {
			return longBehaviorFlaw();
		}
	}

	function sexualFlaw() {
		if (abbreviate.mental === 1) {
			return shortSexFlaw();
		} else if (abbreviate.mental === 2) {
			return longSexFlaw();
		}
	}

	function extendedFamily() {
		if (abbreviate.mental === 1) {
			let r = ``;

			r += `<span class="lightgreen">`;
			shortExtendedFamily();
			r += `</span> `;

			return r;
		} else if (abbreviate.mental === 2) {
			return longExtendedFamily();
		}
	}

	function rival() {
		if (abbreviate.mental === 1) {
			return shortRival();
		} else if (abbreviate.mental === 2) {
			return longRival();
		}
	}

	function origins() {
		let r = `<br> `;

		if (V.seeImages !== 1 || V.seeSummaryImages !== 1 || V.imageChoice === 1) {
			r += `    `;
		}
		r += `<span class="gray">${child.origin}</span> `;

		return r;
	}

	// /**	TODO: add health to infants
	// function shortHealth() {
	// 	if (child.health.condition < -20) {
	// 		r += `<strong><span class="red">H ${V.summaryStats ? `[${child.health.condition}]` : ''}</span></strong> `;
	// 	} else if (child.health.condition <= 20) {
	// 		r += `<strong><span class="yellow">H ${V.summaryStats ? `[${child.health.condition}]` : ''}</span></strong> `;
	// 	} else if (child.health.condition > 20) {
	// 		r += `<strong><span class="green">H ${V.summaryStats ? `[${child.health.condition}]` : ''}</span></strong> `;
	// 	}
	// 	r += " ";
	// }

	// function longHealth() {
	// 	if (child.health.condition < -90) {
	// 		r += `<span class="red">On the edge of death ${V.summaryStats ? `[${child.health.condition}]` : ''}.</span> `;
	// 	} else if (child.health.condition < -50) {
	// 		r += `<span class="red">Extremely unhealthy${V.summaryStats ? `[${child.health.condition}]` : ''}.</span> `;
	// 	} else if (child.health.condition < -20) {
	// 		r += `<span class="red">Unhealthy${V.summaryStats ? `[${child.health.condition}]` : ''}.</span> `;
	// 	} else if (child.health.condition <= 20) {
	// 		r += `<span class="yellow">Healthy${V.summaryStats ? `[${child.health.condition}]` : ''}.</span> `;
	// 	} else if (child.health.condition <= 50) {
	// 		r += `<span class="green">Very healthy${V.summaryStats ? `[${child.health.condition}]` : ''}.</span> `;
	// 	} else if (child.health.condition <= 90) {
	// 		r += `<span class="green">Extremely healthy${V.summaryStats ? `[${child.health.condition}]` : ''}.</span> `;
	// 	} else {
	// 		r += `<span class="green">Unnaturally healthy${V.summaryStats ? `[${child.health.condition}]` : ''}.</span> `;
	// 	}
	// 	r += " ";
	// }

	function shortRace() {
		let r = ``;

		switch (child.race) {
			case "white":
				r += `C`;
				break;
			case "asian":
				r += `A`;
				break;
			case "indo-aryan":
				r += `I`;
				break;
			case "latina":
				r += `L`;
				break;
			case "middle eastern":
				r += `ME`;
				break;
			case "black":
				r += `B`;
				break;
			case "pacific islander":
				r += `PI`;
				break;
			case "catgirl":
				r += `CT`;
				break;
			case "malay":
				r += `M`;
				break;
			case "amerindian":
				r += `AI`;
				break;
			case "semitic":
				r += `S`;
				break;
			case "southern european":
				r += `SE`;
				break;
			case "mixed race":
				r += `MR`;
				break;
			default:
				r += `${child.race.charAt(0).toUpperCase() + child.race.charAt(1) + child.race.charAt(2)}`;
				break;
		}

		return r;
	}

	function shortNationality() {
		let r = `<span class="tan">`;

		switch (child.nationality) {
			case "Afghan":
				r += `Afg`;
				break;
			case "Albanian":
				r += `Alb`;
				break;
			case "Algerian":
				r += `Alg`;
				break;
			case "American":
				r += `USA`;
				break;
			case "Andorran":
				r += `And`;
				break;
			case "Angolan":
				r += `Ang`;
				break;
			case "Antiguan":
				r += `AB`;
				break;
			case "Argentinian":
				r += `Arg`;
				break;
			case "Armenian":
				r += `Arm`;
				break;
			case "Aruban":
				r += `Aru`;
				break;
			case "Australian":
				r += `Aus`;
				break;
			case "Austrian":
				r += `Aut`;
				break;
			case "Azerbaijani":
				r += `Aze`;
				break;
			case "Bahamian":
				r += `Bah`;
				break;
			case "Bahraini":
				r += `Bah`;
				break;
			case "Bangladeshi":
				r += `Bgd`;
				break;
			case "Barbadian":
				r += `Bar`;
				break;
			case "Belarusian":
				r += `Ber`;
				break;
			case "Belgian":
				r += `Bel`;
				break;
			case "Belizean":
				r += `Blz`;
				break;
			case "Beninese":
				r += `Ben`;
				break;
			case "Bermudian":
				r += `Bmd`;
				break;
			case "Bhutanese":
				r += `Bhu`;
				break;
			case "Bissau-Guinean":
				r += `GB`;
				break;
			case "Bolivian":
				r += `Bol`;
				break;
			case "Bosnian":
				r += `Bos`;
				break;
			case "Brazilian":
				r += `Bra`;
				break;
			case "British":
				r += `UK`;
				break;
			case "Bruneian":
				r += `Bru`;
				break;
			case "Bulgarian":
				r += `Bul`;
				break;
			case "Burkinabé":
				r += `BF`;
				break;
			case "Burmese":
				r += `Bur`;
				break;
			case "Burundian":
				r += `Bnd`;
				break;
			case "Cambodian":
				r += `Kam`;
				break;
			case "Cameroonian":
				r += `Cam`;
				break;
			case "Canadian":
				r += `Can`;
				break;
			case "Cape Verdean":
				r += `CV`;
				break;
			case "Catalan":
				r += `Cat`;
				break;
			case "Central African":
				r += `CAR`;
				break;
			case "Chadian":
				r += `Cha`;
				break;
			case "Chilean":
				r += `Chl`;
				break;
			case "Chinese":
				r += `Chi`;
				break;
			case "Colombian":
				r += `Col`;
				break;
			case "Comorian":
				r += `Com`;
				break;
			case "Congolese":
				r += `RC`;
				break;
			case "a Cook Islander":
				r += `CI`;
				break;
			case "Costa Rican":
				r += `CR`;
				break;
			case "Croatian":
				r += `Cro`;
				break;
			case "Cuban":
				r += `Cub`;
				break;
			case "Curaçaoan":
				r += `Cur`;
				break;
			case "Cypriot":
				r += `Cyp`;
				break;
			case "Czech":
				r += `Cze`;
				break;
			case "Danish":
				r += `Den`;
				break;
			case "Djiboutian":
				r += `Dji`;
				break;
			case "Dominican":
				r += `DR`;
				break;
			case "Dominiquais":
				r += `Dom`;
				break;
			case "Dutch":
				r += `Nld`;
				break;
			case "East Timorese":
				r += `ET`;
				break;
			case "Ecuadorian":
				r += `Ecu`;
				break;
			case "Egyptian":
				r += `Egy`;
				break;
			case "Emirati":
				r += `UAE`;
				break;
			case "Equatoguinean":
				r += `EG`;
				break;
			case "Eritrean":
				r += `Eri`;
				break;
			case "Estonian":
				r += `Est`;
				break;
			case "Ethiopian":
				r += `Eth`;
				break;
			case "Fijian":
				r += `Fij`;
				break;
			case "Filipina":
				r += `Phl`;
				break;
			case "Finnish":
				r += `Fin`;
				break;
			case "French":
				r += `Fra`;
				break;
			case "French Guianan":
				r += `FG`;
				break;
			case "French Polynesian":
				r += `FP`;
				break;
			case "Gabonese":
				r += `Gab`;
				break;
			case "Gambian":
				r += `Gam`;
				break;
			case "Georgian":
				r += `Geo`;
				break;
			case "German":
				r += `Ger`;
				break;
			case "Ghanan":
				r += `Gha`;
				break;
			case "Greek":
				r += `Gre`;
				break;
			case "Greenlandic":
				r += `Grn`;
				break;
			case "Grenadian":
				r += `Gda`;
				break;
			case "Guamanian":
				r += `Gua`;
				break;
			case "Guatemalan":
				r += `Gtm`;
				break;
			case "Guinean":
				r += `Gui`;
				break;
			case "Guyanese":
				r += `Guy`;
				break;
			case "Haitian":
				r += `Hai`;
				break;
			case "Honduran":
				r += `Hon`;
				break;
			case "Hungarian":
				r += `Hun`;
				break;
			case "I-Kiribati":
				r += `Kir`;
				break;
			case "Icelandic":
				r += `Ice`;
				break;
			case "Indian":
				r += `Ind`;
				break;
			case "Indonesian":
				r += `Idn`;
				break;
			case "Iranian":
				r += `Irn`;
				break;
			case "Iraqi":
				r += `Irq`;
				break;
			case "Irish":
				r += `Irl`;
				break;
			case "Israeli":
				r += `Isr`;
				break;
			case "Italian":
				r += `Ita`;
				break;
			case "Ivorian":
				r += `IC`;
				break;
			case "Jamaican":
				r += `Jam`;
				break;
			case "Japanese":
				r += `Jpn`;
				break;
			case "Jordanian":
				r += `Jor`;
				break;
			case "Kazakh":
				r += `Kaz`;
				break;
			case "Kenyan":
				r += `Ken`;
				break;
			case "Kittitian":
				r += `SKN`;
				break;
			case "Korean":
				r += `Kor`;
				break;
			case "Kosovan":
				r += `Kos`;
				break;
			case "Kurdish":
				r += `Kur`;
				break;
			case "Kuwaiti":
				r += `Kuw`;
				break;
			case "Kyrgyz":
				r += `Kyr`;
				break;
			case "Laotian":
				r += `Lao`;
				break;
			case "Latvian":
				r += `Lat`;
				break;
			case "Lebanese":
				r += `Lbn`;
				break;
			case "Liberian":
				r += `Lib`;
				break;
			case "Libyan":
				r += `Lby`;
				break;
			case "a Liechtensteiner":
				r += `Lie`;
				break;
			case "Lithuanian":
				r += `Lit`;
				break;
			case "Luxembourgian":
				r += `Lux`;
				break;
			case "Macedonian":
				r += `Mac`;
				break;
			case "Malagasy":
				r += `Mad`;
				break;
			case "Malawian":
				r += `Mwi`;
				break;
			case "Malaysian":
				r += `Mys`;
				break;
			case "Maldivian":
				r += `Mdv`;
				break;
			case "Malian":
				r += `Mal`;
				break;
			case "Maltese":
				r += `Mlt`;
				break;
			case "Marshallese":
				r += `MI`;
				break;
			case "Mauritanian":
				r += `Mta`;
				break;
			case "Mauritian":
				r += `Mts`;
				break;
			case "Mexican":
				r += `Mex`;
				break;
			case "Micronesian":
				r += `FSM`;
				break;
			case "Moldovan":
				r += `Mol`;
				break;
			case "Monégasque":
				r += `Mnc`;
				break;
			case "Mongolian":
				r += `Mon`;
				break;
			case "Montenegrin":
				r += `Mng`;
				break;
			case "Moroccan":
				r += `Mor`;
				break;
			case "Mosotho":
				r += `Les`;
				break;
			case "Motswana":
				r += `Bot`;
				break;
			case "Mozambican":
				r += `Moz`;
				break;
			case "Namibian":
				r += `Nam`;
				break;
			case "Nauruan":
				r += `Nau`;
				break;
			case "Nepalese":
				r += `Npl`;
				break;
			case "New Caledonian":
				r += `NC`;
				break;
			case "a New Zealander":
				r += `NZ`;
				break;
			case "Ni-Vanuatu":
				r += `Van`;
				break;
			case "Nicaraguan":
				r += `Nic`;
				break;
			case "Nigerian":
				r += `Nga`;
				break;
			case "Nigerien":
				r += `Ngr`;
				break;
			case "Niuean":
				r += `Niu`;
				break;
			case "Norwegian":
				r += `Nor`;
				break;
			case "Omani":
				r += `Omn`;
				break;
			case "Pakistani":
				r += `Pak`;
				break;
			case "Palauan":
				r += `Plu`;
				break;
			case "Palestinian":
				r += `Pal`;
				break;
			case "Panamanian":
				r += `Pan`;
				break;
			case "Papua New Guinean":
				r += `PNG`;
				break;
			case "Paraguayan":
				r += `Par`;
				break;
			case "Peruvian":
				r += `Per`;
				break;
			case "Polish":
				r += `Pol`;
				break;
			case "Portuguese":
				r += `Por`;
				break;
			case "Puerto Rican":
				r += `PR`;
				break;
			case "Qatari":
				r += `Qat`;
				break;
			case "Romanian":
				r += `Rom`;
				break;
			case "Russian":
				r += `Rus`;
				break;
			case "Rwandan":
				r += `Rwa`;
				break;
			case "Sahrawi":
				r += `Sah`;
				break;
			case "Saint Lucian":
				r += `SL`;
				break;
			case "Salvadoran":
				r += `ES`;
				break;
			case "Sammarinese":
				r += `SM`;
				break;
			case "Samoan":
				r += `Sam`;
				break;
			case "São Toméan":
				r += `STP`;
				break;
			case "Saudi":
				r += `Sau`;
				break;
			case "Scottish":
				r += `Sco`;
				break;
			case "Senegalese":
				r += `Sen`;
				break;
			case "Serbian":
				r += `Srb`;
				break;
			case "Seychellois":
				r += `Sey`;
				break;
			case "Sierra Leonean":
				r += `Sie`;
				break;
			case "Singaporean":
				r += `Sng`;
				break;
			case "Slovak":
				r += `Svk`;
				break;
			case "Slovene":
				r += `Svn`;
				break;
			case "a Solomon Islander":
				r += `SI`;
				break;
			case "Somali":
				r += `Som`;
				break;
			case "South African":
				r += `RSA`;
				break;
			case "South Sudanese":
				r += `SS`;
				break;
			case "Spanish":
				r += `Spa`;
				break;
			case "Sri Lankan":
				r += `Sri`;
				break;
			case "Sudanese":
				r += `Sud`;
				break;
			case "Surinamese":
				r += `Sur`;
				break;
			case "Swazi":
				r += `Swa`;
				break;
			case "Swedish":
				r += `Swe`;
				break;
			case "Swiss":
				r += `Swi`;
				break;
			case "Syrian":
				r += `Syr`;
				break;
			case "Taiwanese":
				r += `Tai`;
				break;
			case "Tajik":
				r += `Taj`;
				break;
			case "Tanzanian":
				r += `Tza`;
				break;
			case "Thai":
				r += `Tha`;
				break;
			case "Tibetan":
				r += `Tib`;
				break;
			case "Togolese":
				r += `Tog`;
				break;
			case "Tongan":
				r += `Ton`;
				break;
			case "Trinidadian":
				r += `TT`;
				break;
			case "Tunisian":
				r += `Tun`;
				break;
			case "Turkish":
				r += `Tur`;
				break;
			case "Turkmen":
				r += `Tkm`;
				break;
			case "Tuvaluan":
				r += `Tuv`;
				break;
			case "Ugandan":
				r += `Uga`;
				break;
			case "Ukrainian":
				r += `Ukr`;
				break;
			case "Uruguayan":
				r += `Uru`;
				break;
			case "Uzbek":
				r += `Uzb`;
				break;
			case "Vatican":
				r += `VC`;
				break;
			case "Venezuelan":
				r += `Ven`;
				break;
			case "Vietnamese":
				r += `Vnm`;
				break;
			case "Vincentian":
				r += `SVG`;
				break;
			case "Yemeni":
				r += `Yem`;
				break;
			case "Zairian":
				r += `DRC`;
				break;
			case "Zambian":
				r += `Zam`;
				break;
			case "Zimbabwean":
				if (child.race === "white") {
					r += `Rho`;
				} else {
					r += `Zwe`;
				}
				break;
			case "Ancient Chinese Revivalist":
				r += `Chi Rev`;
				break;
			case "Ancient Egyptian Revivalist":
				r += `Egy Rev`;
				break;
			case "Arabian Revivalist":
				r += `Ara Rev`;
				break;
			case "Aztec Revivalist":
				r += `Azt Rev`;
				break;
			case "Edo Revivalist":
				r += `Edo Rev`;
				break;
			case "Roman Revivalist":
				r += `Rom Rev`;
				break;
			case "":
			case "none":
			case "child":
			case "Stateless":
				r += `None`;
				break;
			default:
				r += `${child.nationality.charAt(0) + child.nationality.charAt(1) + child.nationality.charAt(2)}`;
				break;
		}

		r += `</span> `;

		return r;
	}

	function longNationality() {
		let r = `<span class="nationality">`;

		switch (child.nationality) {
			case "a Cook Islander":
				r += `Cook Islander. `;
				break;
			case "a Liechtensteiner":
				r += `Liechtensteiner. `;
				break;
			case "a New Zealander":
				r += `New Zealander. `;
				break;
			case "a Solomon Islander":
				r += `Solomon Islander. `;
				break;
			case "Zimbabwean":
				if (child.race === "white") {
					r += `Rhodesian. `;
				} else {
					r += `${child.nationality}. `;
				}
				break;
			case "child":
			case "none":
			case "":
			case "Stateless":
				r += `Stateless. `;
				break;
			default:
				r += `${child.nationality}. `;
				break;
		}

		r += `</span> `;

		return r;
	}

	function shortSkin() {
		let r = `<span class="pink">`;

		switch (child.skin) {
			case "pure white":
				r += `P. Whi`;
				break;
			case "extremely fair":
				r += `E. Fai`;
				break;
			case "very fair":
				r += `V. Fai`;
				break;
			case "extremely pale":
				r += `E. Pal`;
				break;
			case "very pale":
				r += `V. Pal`;
				break;
			case "light brown":
				r += `L. Br`;
				break;
			case "dark brown":
				r += `D. Br`;
				break;
			case "light olive":
				r += `L. Oli`;
				break;
			case "dark olive":
				r += `D. Oli`;
				break;
			case "light beige":
				r += `L. Bei`;
				break;
			case "dark beige":
				r += `D. Bei`;
				break;
			case "tan":
				r += `Tan`;
				break;
			case "bronze":
				r += `Bron`;
				break;
			case "ebony":
				r += `Ebon`;
				break;
			case "pure black":
				r += `P. Bla`;
				break;
			case "black and white striped":
				r += `BnW`;
				break;
			case "yellow":
				r += `Ylw`;
				break;
			case "red":
				r += `Red`;
				break;
			case "dark":
			case "fair":
			case "pale":
				r += `${child.skin.charAt(0).toUpperCase() + child.skin.slice(1)}`;
				break;
			default:
				r += `${child.skin.charAt(0).toUpperCase() + child.skin.charAt(1) + child.skin.charAt(2)}`;
				break;
		}
		r += `</span> `;

		return r;
	}

	function longSkin() {
		return `<span class="pink">${child.skin.charAt(0).toUpperCase() + child.skin.slice(1)} skin.</span> `;
	}

	function shortAge() {
		let r = `<span class="pink">`;

		if (V.showAgeDetail === 1) {
			if (child.actualAge > 0) {
				r += `${capFirstChar(num(child.actualAge))}yrs. `;
			} else {
				if (weeksOwned > 4) {
					r += `${capFirstChar(num(Math.trunc(weeksOwned / 4)))}mos. `;
				} else {
					if (weeksOwned <= 1) {
						r += `Nwbrn. `;
					} else {
						r += `${capFirstChar(num(weeksOwned))}wks. `;
					}
				}
			}
		}

		return r;
	}

	function longAge() {
		let r = `<span class="pink">`;

		if (V.showAgeDetail) {
			if (child.actualAge > 0) {
				r += `${capFirstChar(num(child.actualAge))}-year-old `;
				if (child.actualAge > 1) {
					r += `toddler. `;
				} else {
					r += `baby. `;
				}
			} else {
				if (weeksOwned > 4) {
					r += `${capFirstChar(num(Math.trunc(weeksOwned / 4)))} months old. `;
				} else {
					if (weeksOwned <= 1) {
						r += `Newborn. `;
					} else {
						r += `${capFirstChar(num(weeksOwned))} weeks old. `;
					}
				}
			}
		}

		return r;
	}

	function shortFace() {
		let r = ``;

		if (child.face < -95) {
			r += `<span class="red">Face---${V.summaryStats ? `[${child.face}]` : ''}</span> `;
		} else if (child.face < -40) {
			r += `<span class="red">Face--${V.summaryStats ? `[${child.face}]` : ''}</span> `;
		} else if (child.face < -10) {
			r += `<span class="red">Face-${V.summaryStats ? `[${child.face}]` : ''}</span> `;
		} else if (child.face <= 10) {
			r += `Face${V.summaryStats ? `[${child.face}]` : ''}`;
		} else if (child.face <= 40) {
			r += `<span class="pink">Face+${V.summaryStats ? `[${child.face}]` : ''}</span> `;
		} else if (child.face <= 95) {
			r += `<span class="pink">Face++${V.summaryStats ? `[${child.face}]` : ''}</span> `;
		} else {
			r += `<span class="pink">Face+++${V.summaryStats ? `[${child.face}]` : ''}</span> `;
		}

		return r;
	}

	function longFace() {
		let r = `Likely to have `;

		if (child.face < -95) {
			r += `a <span class="red">very ugly${V.summaryStats ? `[${child.face}]`: ''}</span>`;
		} else if (child.face < -40) {
			r += `a <span class="red">ugly${V.summaryStats ? `[${child.face}]`: ''}</span>`;
		} else if (child.face < -10) {
			r += `a <span class="red">unattractive${V.summaryStats ? `[${child.face}]`: ''}</span>`;
		} else if (child.face <= 10) {
			r += `an average${V.summaryStats ? `[${child.face}]`: ''}`;
		} else if (child.face <= 40) {
			r += `an <span class="pink">attractive${V.summaryStats ? `[${child.face}]`: ''}</span>`;
		} else if (child.face <= 95) {
			r += `a <span class="pink">beautiful${V.summaryStats ? `[${child.face}]`: ''}</span>`;
		} else {
			r += `a <span class="pink">very beautiful${V.summaryStats ? `[${child.face}]`: ''}</span>`;
		}
		r += `, ${child.faceShape} face. `;

		return r;
	}

	function shortIntelligence() {
		let intelligence = child.intelligence;
		let r = ``;

		if (child.hasOwnProperty("intelligenceImplant")) {
			intelligence += child.intelligenceImplant;
		}

		if (child.fetish === Fetish.MINDBROKEN) {
			return;
		} else if (child.hasOwnProperty("intelligenceImplant") && child.intelligenceImplant >= 30) {
			if (intelligence >= 130) {
				r += `<span class="deepskyblue">I++++(e+)${V.summaryStats ? `[${intelligence}]` : ''}</span> `;
			} else if (intelligence > 95) {
				r += `<span class="deepskyblue">I+++(e+)${V.summaryStats ? `[${intelligence}]` : ''}</span> `;
			} else if (intelligence > 50) {
				r += `<span class="deepskyblue">I++(e+)${V.summaryStats ? `[${intelligence}]` : ''}</span> `;
			} else if (intelligence > 15) {
				r += `<span class="deepskyblue">I+(e+)${V.summaryStats ? `[${intelligence}]` : ''}</span> `;
			} else if (intelligence >= -15) {
				r += `I(e+)${V.summaryStats ? `[${intelligence}]` : ''}`;
			} else if (intelligence >= -50) {
				r += `<span class="orangered">I-(e+)${V.summaryStats ? `[${intelligence}]` : ''}</span> `;
			} else if (intelligence >= -95) {
				r += `<span class="orangered">I--(e+)${V.summaryStats ? `[${intelligence}]` : ''}</span> `;
			} else {
				r += `<span class="orangered">I---(e+)${V.summaryStats ? `[${intelligence}]` : ''}</span> `;
			}
		} else if (child.hasOwnProperty("intelligenceImplant") && child.intelligenceImplant >= 15) {
			if (intelligence > 95) {
				r += `<span class="deepskyblue">I+++(e)${V.summaryStats ? `[${intelligence}]` : ''}</span> `;
			} else if (intelligence > 50) {
				r += `<span class="deepskyblue">I++(e)${V.summaryStats ? `[${intelligence}]` : ''}</span> `;
			} else if (intelligence > 15) {
				r += `<span class="deepskyblue">I+(e)${V.summaryStats ? `[${intelligence}]` : ''}</span> `;
			} else if (intelligence >= -15) {
				r += `I(e)${V.summaryStats ? `[${intelligence}]` : ''}`;
			} else if (intelligence >= -50) {
				r += `<span class="orangered">I-(e)${V.summaryStats ? `[${intelligence}]` : ''}</span> `;
			} else if (intelligence >= -95) {
				r += `<span class="orangered">I--(e)${V.summaryStats ? `[${intelligence}]` : ''}</span> `;
			} else {
				r += `<span class="orangered">I---(e)${V.summaryStats ? `[${intelligence}]` : ''}</span> `;
			}
		} else {
			if (intelligence > 95) {
				r += `<span class="deepskyblue">I+++${V.summaryStats ? `[${intelligence}]` : ''}</span> `;
			} else if (intelligence > 50) {
				r += `<span class="deepskyblue">I++${V.summaryStats ? `[${intelligence}]` : ''}</span> `;
			} else if (intelligence > 15) {
				r += `<span class="deepskyblue">I+${V.summaryStats ? `[${intelligence}]` : ''}</span> `;
			} else if (intelligence >= -15) {
				r += `I${V.summaryStats ? `[${intelligence}]` : ''}`;
			} else if (intelligence >= -50) {
				r += `<span class="orangered">I-${V.summaryStats ? `[${intelligence}]` : ''}</span> `;
			} else if (intelligence >= -95) {
				r += `<span class="orangered">I--${V.summaryStats ? `[${intelligence}]` : ''}</span> `;
			} else {
				r += `<span class="orangered">I---${V.summaryStats ? `[${intelligence}]` : ''}</span> `;
			}
		}

		return r;
	}

	function longIntelligence() {
		let intelligence = child.intelligence;
		let r = ``;

		if (child.hasOwnProperty("intelligenceImplant")) {
			intelligence += child.intelligenceImplant;
		}

		if (child.intelligence > 95) {
			r += `<span class="deepskyblue">Likely to be brilliant${V.summaryStats ? `[${intelligence}]` : ''}.</span> `;
		} else if (intelligence > 50) {
			r += `<span class="deepskyblue">Likely to be very smart${V.summaryStats ? `[${intelligence}]` : ''}.</span> `;
		} else if (intelligence > 15) {
			r += `<span class="deepskyblue">Likely to be smart${V.summaryStats ? `[${intelligence}]` : ''}.</span> `;
		} else if (intelligence >= -15) {
			r += `Average intelligence${V.summaryStats ? `[${intelligence}]` : ''}. `;
		} else if (intelligence >= -50) {
			r += `<span class="orangered">Likely to be slow${V.summaryStats ? `[${intelligence}]` : ''}.</span> `;
		} else if (intelligence >= -95) {
			r += `<span class="orangered">Likely to be very slow${V.summaryStats ? `[${intelligence}]` : ''}.</span> `;
		} else {
			r += `<span class="orangered">Likely to be moronic${V.summaryStats ? `[${intelligence}]` : ''}.</span> `;
		}

		return r;
	}

	function shortPrestige() {
		let r = `<span class="green">`;

		if (child.prestige > 2) {
			r += `Prest++`;
		} else if (child.prestige === 2) {
			r += `Prest+`;
		} else if (child.prestige === 1) {
			r += `Prest`;
		}
		r += `</span> `;

		return r;
	}

	function longPrestige() {
		let r = `<span class="green">`;

		if (child.prestige > 2) {
			r += `Extremely prestigious. `;
		} else if (child.prestige === 2) {
			r += `Very prestigious. `;
		} else if (child.prestige === 1) {
			r += `Prestigious. `;
		}
		r += `</span> `;

		return r;
	}

	function shortPornPrestige() {
		let r = `<span class="green">`;

		if (child.porn?.prestige > 2) {
			r += `PPrest++`;
		} else if (child.porn?.prestige === 2) {
			r += `PPrest+`;
		} else if (child.porn?.prestige === 1) {
			r += `PPrest`;
		}
		r += `</span> `;

		return r;
	}

	function longPornPrestige() {
		let r = `<span class="green">`;

		if (child.porn?.prestige > 2) {
			r += `Porn star. `;
		} else if (child.porn?.prestige === 2) {
			r += `Porn slut. `;
		} else if (child.porn?.prestige === 1) {
			r += `Porn amateur. `;
		}
		r += `</span> `;

		return r;
	}

	function shortBehaviorFlaw() {
		let r = `<span class="red">`;

		switch (child.behavioralFlaw) {
			case "arrogant":
				r += `Arrog`;
				break;
			case "bitchy":
				r += `Bitchy`;
				break;
			case "odd":
				r += `Odd`;
				break;
			case "hates men":
				r += `Men-`;
				break;
			case "hates women":
				r += `Women-`;
				break;
			case "gluttonous":
				r += `Glut`;
				break;
			case "anorexic":
				r += `Ano`;
				break;
			case "devout":
				r += `Dev`;
				break;
			case "liberated":
				r += `Lib`;
				break;
			default:
				child.behavioralFlaw = "none";
				break;
		}
		r += `</span> `;

		return r;
	}

	function longBehaviorFlaw() {
		let r = `<span class="red">`;

		switch (child.behavioralFlaw) {
			case "arrogant":
				r += `Arrogant. `;
				break;
			case "bitchy":
				r += `Bitchy. `;
				break;
			case "odd":
				r += `Odd. `;
				break;
			case "hates men":
				r += `Hates men. `;
				break;
			case "hates women":
				r += `Hates women. `;
				break;
			case "gluttonous":
				r += `Stress eater. `;
				break;
			case "anorexic":
				r += `Anorexic. `;
				break;
			case "devout":
				r += `Devoutly religious. `;
				break;
			case "liberated":
				r += `Mentally liberated. `;
				break;
			default:
				child.behavioralFlaw = "none";
				break;
		}
		r += `</span> `;

		return r;
	}

	function shortSexFlaw() {
		let r = ``;

		switch (child.sexualFlaw) {
			case "hates oral":
				r += `<span class="red">Oral-</span> `;
				break;
			case "hates anal":
				r += `<span class="red">Anal-</span> `;
				break;
			case "hates penetration":
				r += `<span class="red">Fuck-</span> `;
				break;
			case "shamefast":
				r += `<span class="red">Shame</span> `;
				break;
			case "idealistic":
				r += `<span class="red">Ideal</span> `;
				break;
			case "repressed":
				r += `<span class="red">Repre</span> `;
				break;
			case "apathetic":
				r += `<span class="red">Apath</span> `;
				break;
			case "crude":
				r += `<span class="red">Crude</span> `;
				break;
			case "judgemental":
				r += `<span class="red">Judge</span> `;
				break;
			case "cum addict":
				r += `<span class="yellow">CumAdd</span> `;
				break;
			case "anal addict":
				r += `<span class="yellow">AnalAdd</span> `;
				break;
			case "attention whore":
				r += `<span class="yellow">Attention</span> `;
				break;
			case "breast growth":
				r += `<span class="yellow">BoobObsess</span> `;
				break;
			case "abusive":
				r += `<span class="yellow">Abusive</span> `;
				break;
			case "malicious":
				r += `<span class="yellow">Malice</span> `;
				break;
			case "self hating":
				r += `<span class="yellow">SelfHatr</span> `;
				break;
			case "neglectful":
				r += `<span class="yellow">SelfNeglect</span> `;
				break;
			case "breeder":
				r += `<span class="yellow">BreedObsess</span> `;
				break;
			default:
				child.sexualFlaw = "none";
				break;
		}

		return r;
	}

	function longSexFlaw() {
		let r = ``;

		switch (child.sexualFlaw) {
			case "hates oral":
				r += `<span class="red">Hates oral.</span> `;
				break;
			case "hates anal":
				r += `<span class="red">Hates anal.</span> `;
				break;
			case "hates penetration":
				r += `<span class="red">Hates penetration.</span> `;
				break;
			case "shamefast":
				r += `<span class="red">Shamefast.</span> `;
				break;
			case "idealistic":
				r += `<span class="red">Sexually idealistic.</span> `;
				break;
			case "repressed":
				r += `<span class="red">Sexually repressed.</span> `;
				break;
			case "apathetic":
				r += `<span class="red">Sexually apathetic.</span> `;
				break;
			case "crude":
				r += `<span class="red">Sexually crude.</span> `;
				break;
			case "judgemental":
				r += `<span class="red">Sexually judgemental.</span> `;
				break;
			case "cum addict":
				r += `<span class="yellow">Cum addict.</span> `;
				break;
			case "anal addict":
				r += `<span class="yellow">Anal addict.</span> `;
				break;
			case "attention whore":
				r += `<span class="yellow">Attention whore.</span> `;
				break;
			case "breast growth":
				r += `<span class="yellow">Breast obsession.</span> `;
				break;
			case "abusive":
				r += `<span class="yellow">Sexually abusive.</span> `;
				break;
			case "malicious":
				r += `<span class="yellow">Sexually malicious.</span> `;
				break;
			case "self hating":
				r += `<span class="yellow">Self hatred.</span> `;
				break;
			case "neglectful":
				r += `<span class="yellow">Self neglectful.</span> `;
				break;
			case "breeder":
				r += `<span class="yellow">Breeding obsession.</span> `;
				break;
			default:
				child.sexualFlaw = "none";
				break;
		}

		return r;
	}

	function shortExtendedFamily() {
		const {daughter, sister, wife} = getPronouns(child);

		let handled = 0;
		let r = ``;

		if (child.mother > 0) {
			const target = getSlaves().find(s => s.ID === child.mother)?.value;
			if (target) {
				r += `${SlaveFullName(target)}'s ${daughter}`;
				if (child.relationshipTarget === target.ID) {
					const friendShipShort = relationshipTermShort(child);
					r += ` & ${friendShipShort}`;
					handled = 1;
				}
			}
			r += " ";
		} else if (child.mother === SID.PC) {
			r += `Your ${daughter}`;
			if (child.relationship < -1) {
				r += ` & ${PCrelationshipTerm(child)}`;
				handled = 1;
			}
			r += " ";
		} else if (child.mother in V.missingTable && V.showMissingSlavesSD && V.showMissingSlaves) {
			r += `${V.missingTable[child.mother].fullName}'s ${daughter} `;
		}

		if (child.father > 0 && child.father !== child.mother) {
			const target = getSlaves().find(s => s.ID === child.father)?.value;
			if (target) {
				r += `${SlaveFullName(target)}'s ${daughter}`;
				if (child.relationshipTarget === target.ID && handled !== 1) {
					const friendShipShort = relationshipTermShort(child);
					r += ` & ${friendShipShort}`;
					handled = 1;
				}
			}
			r += " ";
		} else if (child.father === SID.PC && child.mother !== SID.PC) {
			r += `Your ${daughter}`;
			if (child.relationship < -1) {
				r += ` & ${PCrelationshipTerm(child)}`;
				handled = 1;
			}
			r += " ";
		} else if (child.father in V.missingTable && child.father !== child.mother && V.showMissingSlavesSD && V.showMissingSlaves) {
			r += `${V.missingTable[child.father].fullName}'s ${daughter}`;
		}

		if (child.daughters === 1) {
			let target = getSlaves().find(s => s.mother === child.ID)?.value;
			if (target) {
				r += `${SlaveFullName(target)}'s mother`;
				if (child.relationshipTarget === target.ID) {
					const friendShipShort = relationshipTermShort(child);
					r += ` & ${friendShipShort}`;
					handled = 1;
				}
			}
			r += " ";
			target = getSlaves().find(s => s.father === child.ID)?.value;
			if (target) {
				r += `${SlaveFullName(target)}'s father`;
				if (child.relationshipTarget === target.ID && handled !== 1) {
					const friendShipShort = relationshipTermShort(child);
					r += ` & ${friendShipShort}`;
					handled = 1;
				}
			}
			r += " ";
		} else if (child.daughters > 1) {
			r += `multiple daughters `;
		}

		if (child.sisters === 1) {
			const target = getSlaves().find(s => areSisters(s, child) > 0)?.value;
			if (target) {
				r += `${SlaveFullName(target)}'s ${sister}`;
				if (child.relationshipTarget === target.ID) {
					const friendShipShort = relationshipTermShort(child);
					r += `& ${friendShipShort}`;
					handled = 1;
				}
			}
			r += " ";
		} else if (child.sisters > 1) {
			r += `multiple sisters `;
		}

		if (child.relationship > 0 && handled !== 1) {
			const target = getSlaves().find(s => s.ID === child.relationshipTarget)?.value;
			if (target) {
				r += `${SlaveFullName(target)}'s`;
				const friendShipShort = relationshipTermShort(child);
				r += ` ${friendShipShort}`;
			}
		} else if (child.relationship === -3 && child.mother !== SID.PC && child.father !== SID.PC) {
			r += `Your ${wife}`;
		} else if (child.relationship === -2) {
			r += `E Bonded`;
		} else if (child.relationship === -1) {
			r += `E Slut`;
		}

		return r;
	}

	function longExtendedFamily() {
		const {daughter, sister, wife} = getPronouns(child);

		let handled = 0;
		let r = ``;

		if (child.mother > 0) {
			const target = getSlaves().find(s => s.ID === child.mother)?.value;
			if (target) {
				r += `${SlaveFullName(target)}'s <span class="lightgreen">${daughter}`;
				if (child.relationshipTarget === target.ID) {
					const friendShipShort = relationshipTerm(child);
					r += ` and ${friendShipShort}`;
					handled = 1;
				}
				r += `.</span> `;
			}
		} else if (child.mother === SID.PC) {
			r += `Your `;

			if (child.relationship < -1) {
				r += `<span class="lightgreen">${daughter} and ${PCrelationshipTerm(child)}.</span> `;
				handled = 1;
			} else {
				r += `<span class="lightgreen">${daughter}.</span> `;
			}
		} else if (child.mother in V.missingTable && V.showMissingSlavesSD && V.showMissingSlaves) {
			r += `${V.missingTable[child.mother].fullName}'s <span class="lightgreen">${daughter}.</span> `;
		}

		if (child.father > 0 && child.father !== child.mother) {
			const target = getSlaves().find(s => s.ID === child.father)?.value;
			if (target) {
				r += `${SlaveFullName(target)}'s <span class="lightgreen">${daughter}`;
				if (child.relationshipTarget === target.ID) {
					const friendShipShort = relationshipTerm(child);
					r += ` and ${friendShipShort}`;
					handled = 1;
				}
				r += `.</span> `;
			}
		} else if (child.father === SID.PC && child.father !== child.mother) {
			r += `Your `;
			if (child.relationship < -1) {
				r += `<span class="lightgreen">${daughter} and ${PCrelationshipTerm(child)}.</span> `;
				handled = 1;
			} else {
				r += `<span class="lightgreen">${daughter}.</span> `;
			}
		} else if (child.father in V.missingTable && child.father !== child.mother && V.showMissingSlavesSD && V.showMissingSlaves) {
			r += `${V.missingTable[child.father].fullName}'s <span class="lightgreen">${daughter}.</span> `;
		}

		if (child.daughters === 1) {
			let target = getSlaves().find(s => s.mother === child.ID)?.value;
			if (target) {
				r += `${SlaveFullName(target)}'s <span class="lightgreen">mother`;
				if (child.relationshipTarget === target.ID) {
					const friendShipShort = relationshipTerm(child);
					r += ` and ${friendShipShort}`;
					handled = 1;
				}
				r += `.</span> `;
			}
			target = getSlaves().find(s => s.father === child.ID)?.value;
			if (target) {
				r += `${SlaveFullName(target)}'s <span class="lightgreen">father`;
				if (child.relationshipTarget === target.ID) {
					const friendShipShort = relationshipTerm(child);
					r += ` and ${friendShipShort}`;
					handled = 1;
				}
				r += `.</span> `;
			}
		} else if (child.daughters > 1) {
			if (child.daughters > 10) {
				r += `<span class="lightgreen">Has tons of daughters.</span> `;
			} else if (child.daughters > 5) {
				r += `<span class="lightgreen">Has many daughters.</span> `;
			} else {
				r += `<span class="lightgreen">Has several daughters.</span> `;
			}
		}

		if (child.sisters === 1) {
			const target = getSlaves().find(s => areSisters(s, child) > 0)?.value;
			if (target) {
				r += `${SlaveFullName(target)}'s <span class="lightgreen">${sister}`;
				if (child.relationshipTarget === target.ID) {
					const friendShipShort = relationshipTerm(child);
					r += ` and ${friendShipShort}`;
					handled = 1;
				}
				r += `.</span> `;
			}
		} else if (child.sisters > 1) {
			if (child.sisters > 10) {
				r += `<span class="lightgreen">One of many sisters.</span> `;
			} else if (child.sisters > 5) {
				r += `<span class="lightgreen">Has many sisters.</span> `;
			} else {
				r += `<span class="lightgreen">Has several sisters.</span> `;
			}
		}

		if (child.relationship > 0 && handled !== 1) {
			const target = getSlaves().find(s => s.ID === child.relationshipTarget)?.value;
			if (target) {
				const friendship = relationshipTerm(child);
				r += `${SlaveFullName(target)}'s `;
				r += `<span class="lightgreen">${friendship}.</span> `;
			}
		} else if (child.relationship === -3 && child.mother !== SID.PC && child.father !== SID.PC) {
			r += `<span class="lightgreen">Your ${wife}.</span> `;
		} else if (child.relationship === -2) {
			r += `<span class="lightgreen">Emotionally bonded to you.</span> `;
		} else if (child.relationship === -1) {
			r += `<span class="lightgreen">Emotional slut.</span> `;
		}

		return r;
	}

	function shortRival() {
		let r = ``;

		if (child.rivalry !== 0) {
			r += `    `;
			const target = getSlaves().find(s => s.ID === child.rivalryTarget)?.value;
			if (target) {
				r += `<span class="lightsalmon">`;
				if (child.rivalry <= 1) {
					r += `Disl ${SlaveFullName(target)}`;
				} else if (child.rivalry <= 2) {
					r += `${SlaveFullName(target)}'s rival`;
				} else {
					r += `Hates ${SlaveFullName(target)}`;
				}
				r += `</span> `;
			}
		}

		return r;
	}

	function longRival() {
		let r = ``;

		if (child.rivalry !== 0) {
			r += `    `;
			const target = getSlaves().find(s => s.ID === child.rivalryTarget)?.value;

			if (target) {
				if (child.rivalry <= 1) {
					r += `<span class="lightsalmon">Dislikes</span> ${SlaveFullName(target)}. `;
				} else if (child.rivalry <= 2) {
					r += `${SlaveFullName(target)}'s <span class="lightsalmon">rival.</span> `;
				} else {
					r += `<span class="lightsalmon">Hates</span> ${SlaveFullName(target)}. `;
				}
			}
			r += " ";
		}

		return r;
	}

	return InfantSummaryUncached();
};


code:
/**
 * Displays a detailed description of the infant
 * @param {FC.InfantState} child
 * @returns {string}
 */
App.Facilities.Nursery.LongInfantDescription = function(child) {
	const PC = V.PC;
	const arcology = V.arcologies[0];
	const weeksOwned = V.week - child.weekAcquired;

	let r = ``;
	let age;
	let title;
	/** @type {FC.Zeroable<FC.HumanState> | -1} */
	let father = 0;
	let fatherPC = 0;
	/** @type {FC.Zeroable<FC.HumanState> | -1} */
	let mother = 0;
	let motherPC = 0;

	const {he, his, He} = getPronouns(child);

	if (child.father === SID.PC && child.mother === SID.PC) {
		father = PC;
		fatherPC = 1;
		mother = PC;
		motherPC = 1;
	} else {
		if (child.father === SID.PC) {
			father = PC;
			fatherPC = 1;
			mother = getSlave(child.mother);
		} else if (child.mother === SID.PC) {
			father = getSlave(child.father);
			mother = PC;
			motherPC = 1;
		} else {
			if (child.father > 0) { /* Fathered by a current slave */
				father = getSlave(child.father);
			} else if (child.father < 0) { /* Fathered by a missing slave */
				father = -1;
			}
			if (child.father > 0) { /* Mothered by a current slave */
				mother = getSlave(child.mother);
			} else if (child.mother < 0) { /* Mothered by a missing slave */
				mother = -1;
			}
		}
	}

	// TODO: add infant art here

	r += `     `;

	r += `<span id="childName" class="slave name simple">${SlaveFullName(child)}</span> `;

	if (jsDef(child.custom)) {
		if (child.custom.label) {
			r += ` (<span class="custom-label">${child.custom.label}</span>) `;
		}
	}

	if (child.actualAge > 0) {
		age = `${num(child.actualAge)}-year-old`;
		if (child.actualAge > 1) {
			title = `toddler`;
		} else {
			title = `baby`;
		}
	} else {
		if (weeksOwned > 4) {
			age = `${num(Math.trunc(weeksOwned / 4))}-month-old`;
			title = `baby`;
		} else {
			if (weeksOwned <= 1) {
				age = ``;
				title = `newborn`;
			} else {
				age = `${num(weeksOwned)}-week-old`;
				title = `baby`;
			}
		}
	}

	r += ` is a ${age} <strong><span class="coral">${title}.</span></strong> ${He} was born in ${arcology.name} ${weeksOwned > 4 ? weeksOwned < 9 ? `about a month` : `${num(Math.trunc(weeksOwned / 4))} months` : weeksOwned <= 1 ? `last week` : `${num(weeksOwned)} weeks`}${weeksOwned > 1 ? ` ago` : ``}`;

	if (jsDef(child.counter)) {
		const oral = child.counter.oral;
		const vaginal = child.counter.vaginal;
		const anal = child.counter.oral;
		const mammary = child.counter.mammary;
		const penetrative = child.counter.penetrative;
		const total = oral + vaginal + anal + mammary + penetrative;

		if (total > 0) {
			r += ` and has been fucked about ${num(total)} times, including `;
			if ((vaginal + anal + mammary + penetrative) > 0) {
				if (vaginal > 0) {
					r += `${num(vaginal)} vanilla, `;
				}
				if (anal > 0) {
					r += `${num(anal)} anal, `;
				}
				if (mammary > 0) {
					r += `${num(mammary)} mammary `;
				}
				if (penetrative > 0) {
					r += `${num(penetrative)} penetrating, `;
				}
				r += ` and `;
			}
			r += `${num(oral)} oral sexual encounters. `;
		} else {
			if (weeksOwned >= 1) {
				r += ` and `;
			} else {
				r += `. ${He} `;
			}

			r += `has had little or no sexual experience `;
			if (child.weekAcquired !== 0) {
				r += `as your slave `;
			} else {
				r += `in your new arcology `;
			}
			r += `yet. `;

			let sortedCounts = [];
			sortedCounts.push(
				{type: "oral", value: oral},
				{type: "vaginal", value: vaginal},
				{type: "anal", value: anal},
				{type: "mammary", value: mammary},
				{type: "penetrative", value: penetrative}
			);
			sortedCounts = sortedCounts.sort(function(a, b) {	// sorts the counts from largest to smallest
				return b.value - a.value;
			});

			if (sortedCounts[0].type === "oral") {
				if (((weeksOwned * 112) / oral) < 4) {
					r += `Remarkably, this means that ${he}'s sucked something off `;
					if (((weeksOwned * 112) / oral) < 1) {
						r += `more than once every hour `;
					} else if (((weeksOwned * 112) / oral) < 1.5) {
						r += `about once every hour `;
					} else if (((weeksOwned * 112) / oral) < 2.5) {
						r += `about once every two hours `;
					} else if (((weeksOwned * 112) / oral) < 3.5) {
						r += `about once every three hours `;
					} else {
						r += `about once every four hours `;
					}
					r += ` ${he}'s spent awake. `;
				}
			} else if (sortedCounts[0].type === "vaginal") {
				if (((weeksOwned * 112) / oral) < 4) {
					r += `Remarkably, this means that ${his} pussy has been fucked `;
					if (((weeksOwned * 112) / oral) < 1) {
						r += `more than once every hour `;
					} else if (((weeksOwned * 112) / oral) < 1.5) {
						r += `about once every hour `;
					} else if (((weeksOwned * 112) / oral) < 2.5) {
						r += `about once every two hours `;
					} else if (((weeksOwned * 112) / oral) < 3.5) {
						r += `about once every three hours `;
					} else {
						r += `about once every four hours `;
					}
					r += ` ${he}'s spent awake. `;
				}
			} else if (sortedCounts[0].type === "anal") {
				if (((weeksOwned * 112) / oral) < 4) {
					r += `Remarkably, this means that ${he}'s been buttfucked `;
					if (((weeksOwned * 112) / oral) < 1) {
						r += `more than once every hour `;
					} else if (((weeksOwned * 112) / oral) < 1.5) {
						r += `about once every hour `;
					} else if (((weeksOwned * 112) / oral) < 2.5) {
						r += `about once every two hours `;
					} else if (((weeksOwned * 112) / oral) < 3.5) {
						r += `about once every three hours `;
					} else {
						r += `about once every four hours `;
					}
					r += ` ${he}'s spent awake. `;
				}
			} else if (sortedCounts[0].type === "mammary") {
				if (((weeksOwned * 112) / oral) < 4) {
					r += `Remarkably, this means that ${he}'s put ${his} tits to work `;
					if (((weeksOwned * 112) / oral) < 1) {
						r += `more than once every hour `;
					} else if (((weeksOwned * 112) / oral) < 1.5) {
						r += `about once every hour `;
					} else if (((weeksOwned * 112) / oral) < 2.5) {
						r += `about once every two hours `;
					} else if (((weeksOwned * 112) / oral) < 3.5) {
						r += `about once every three hours `;
					} else {
						r += `about once every four hours `;
					}
					r += ` ${he}'s spent awake. `;
				}
			} else if (sortedCounts[0].type === "penetrative") {
				if (((weeksOwned * 112) / oral) < 4) {
					r += `Remarkably, this means that ${he}'s pounded a hole `;
					if (((weeksOwned * 112) / oral) < 1) {
						r += `more than once every hour `;
					} else if (((weeksOwned * 112) / oral) < 1.5) {
						r += `about once every hour `;
					} else if (((weeksOwned * 112) / oral) < 2.5) {
						r += `about once every two hours `;
					} else if (((weeksOwned * 112) / oral) < 3.5) {
						r += `about once every three hours `;
					} else {
						r += `about once every four hours `;
					}
					r += ` ${he}'s spent awake. `;
				}
			}
		}
	} else {
		r += `. `;
	}

	// r += App.Desc.family(child) + ' '; TODO Assemble DOM instead of string to make this work again

	if (father && fatherPC) {
		if (child.eyeColor === PC.eye.origColor) {
			r += `${He} has your ${child.eyeColor} eyes, `;
		} else if (mother) {
			r += `${He} has ${his} mother ${mother.slaveName}'s ${child.eyeColor} eyes, `;
		}
	} else {
		if (father && child.eyeColor === father.eyeColor) {
			r += `${He} has ${his} father ${father.slaveName}'s ${child.eyeColor} eyes, `;
		} else if (mother) {
			r += `${He} has ${his} mother ${mother.slaveName}'s ${child.eyeColor} eyes, `;
		} else {
			r += `${He} has ${child.eyeColor} eyes, `;
		}
	}
	r += ` and ${he} will most likely have ${child.hColor} hair when ${he}'s older. `;

	r += `${He} ${V.seeRace ? `is ${child.race} and ${child.nationality}, and` : ``} has ${child.skin} skin. `;

	return r;
};

repo_name: Nithhogg/fc

license: mit


code:
/**
 *
 * @param {FC.SlaveState} slave
 * @returns {DocumentFragment}
 */
App.Interact.fFuckdollAnal = function(slave) {
	const node = new DocumentFragment();
	let r = [];

	const {
		He, His,
		he, his, him
	} = getPronouns(slave);

	seX(slave, "anal", V.PC, "penetrative");
	r.push(`You decide to use the Fuckdoll's`);
	if (slave.anus > 3) {
		r.push(`gaping`);
	} else if (slave.anus === 3) {
		r.push(`loose`);
	} else if (slave.anus === 2) {
		r.push(`relaxed`);
	} else if (slave.anus === 1) {
		r.push(`tight`);
	}
	r.push(`rear hole.`);
	if (slave.fuckdoll <= 10) {
		r.push(`Since ${he} is not well adapted to life as a living sex toy yet, ${he} won't respond to position commands. So, you simply`);
		if (hasAnyLegs(slave)) {
			r.push(`walk over to ${him}`);
		} else {
			r.push(`flip ${him} over`);
		}
		r.push(`and ram`);
		if (V.PC.dick !== 0) {
			r.push(`your cock`);
		} else {
			r.push(`a strap-on`);
		}
		r.push(`up ${his} rear hole.`);
	} else if (slave.fuckdoll <= 80) {
		r.push(`${He} can follow intermediate commands, so you order ${him} to present ${his} rear hole. ${He} obediently`);
		if (hasAnyLegs(slave)) {
			r.push(`bends over, arches ${his} back, and`);
		} else {
			r.push(`flips over and`);
		}
		r.push(`winks ${his} anus until you insert`);
		if (V.PC.dick !== 0) {
			r.push(`your cock.`);
		} else {
			r.push(`a strap-on.`);
		}
	} else {
		r.push(`${He} can follow advanced commands, so you bring ${him} over to your chair`);
		if (hasAnyLegs(slave)) {
			r.push(`and order ${him} to squat down onto your`);
			if (V.PC.dick !== 0) {
				r.push(`cock`);
			} else {
				r.push(`strap-on`);
			}
			r.push(`and slide ${his} anus up and down`);
			if (V.PC.dick !== 0) {
				r.push(`your`);
			} else {
				r.push(`the`);
			}
			r.push(`shaft.`);
		} else {
			r.push(`and impale ${him} on`);
			if (V.PC.dick !== 0) {
				r.push(`your cock,`);
			} else {
				r.push(`your strap-on,`);
			}
			r.push(`ordering ${him} to do ${his} feeble best to bounce.`);
		}
	}
	if (slave.fuckdoll <= 20) {
		r.push(`${He}'s not fully used to having things suddenly forced up ${his} ass, so ${he} struggles, and ${his} sphincter spasms deliciously.`);
	} else if (slave.fuckdoll <= 40) {
		r.push(`Aware that ${he} is supposed to relax and accept anal rape, ${he} does ${his} best to accommodate the sodomy.`);
	} else {
		r.push(`You command ${him} to milk your`);
		if (V.PC.dick !== 0) {
			r.push(`cock`);
		} else {
			r.push(`strap-on`);
		}
		r.push(`with ${his} asshole, and ${he} obediently tightens ${his} sphincter against the invading phallus rhythmically.`);
	}
	if (slave.fuckdoll <= 60) {
		if (slave.energy > 60) {
			r.push(`Denied any other outlet for ${his} powerful sex drive, ${he} orgasms.`);
		}
	} else {
		r.push(`Tuned to enjoy any use by total denial of all other stimulation, ${he} orgasms repeatedly as you fuck ${his} anus.`);
	}
	if (slave.voice === 0) {
		r.push(`Though ${he} is mute, ${his} breath hisses loudly`);
		if (slave.lips > 95) {
			r.push(`past the lips of ${his} facepussy.`);
		} else {
			r.push(`through ${his} mouth insert.`);
		}
	} else {
		r.push(`${He} moans,`);
		if (slave.lips > 95) {
			r.push(`and the lips of ${his} facepussy quiver.`);
		} else {
			r.push(`struggling to force the sound past ${his} mouth insert.`);
		}
	}
	r.push(`You climax${(V.PC.dick !== 0) ? `, filling ${his} rectum with your cum,` : ``} and return ${him} to`);
	if (hasAnyLegs(slave)) {
		r.push(`a standing position.`);
	} else {
		r.push(`where ${he} was resting.`);
	}
	if (V.PC.dick !== 0) {
		if (slave.anus > 2) {
			r.push(`Your cum flows out of ${his} gaped rear hole and down the material of ${his} suit.`);
		} else if (slave.anus === 2) {
			r.push(`Your cum drips out of ${his} loosened rear hole and down the material of ${his} suit.`);
		} else {
			r.push(`${His} tight rear hole retains every drop of your cum.`);
		}
		if (canImpreg(slave, V.PC)) {
			r.push(knockMeUp(slave, 5, 0, -1));
		}
		r.push(`The Fuckdoll will be cleaned by another slave.`);
	}
	if (slave.anus === 0) {
		if (slave.fetish !== Fetish.MINDBROKEN) {
			r.push(`As you return to your business, ${he} shakes slightly in place, and a few low moans come out of ${his} face hole. This is probably a reaction to losing ${his} anal virginity.`);
		} else {
			r.push(`${He} gives no external indication that ${he}'s aware that ${he}'s just lost ${his} anal virginity.`);
		}
		r.push(`In any case, <span class="virginity loss">${his} rear hole has been broken in.</span>`);
		slave.anus = 1;
	}
	App.Events.addParagraph(node, r);
	return node;
};


code:
/**
 *
 * @param {FC.SlaveState} slave
 * @returns {DocumentFragment}
 */
App.Interact.fFuckdollImpreg = function(slave) {
	const node = new DocumentFragment();
	let r = [];

	const {
		He, His,
		he, his, him
	} = getPronouns(slave);

	const bonus = random(6, 20);
	seX(slave, slave.mpreg ? "anal" : 'vaginal', V.PC, "penetrative", bonus + 1);

	if (slave.mpreg === 1) {
		V.analTotal += bonus + 1;
	} else {
		V.vaginalTotal += bonus + 1;
	}

	r.push(`You decide to use the Fuckdoll's fertile womb to grow a child.`);
	if (slave.fuckdoll <= 10) {
		r.push(`Since ${he} is not well adapted to life as a living sex toy yet, ${he} won't respond to position commands. So, you simply`);
		if (hasAnyLegs(slave)) {
			r.push(`push ${him} down to lie on the couch`);
		} else {
			r.push(`set ${him} on your desk`);
		}
		r.push(`and shove`);
		if (V.PC.dick !== 0) {
			r.push(`your cock`);
		} else {
			r.push(`a strap-on`);
		}
		r.push(`inside ${his}`);
		if (slave.mpreg === 1) {
			r.push(`asshole.`);
		} else {
			r.push(`vagina.`);
		}
	} else if (slave.fuckdoll <= 70) {
		r.push(`${He} can follow intermediate commands, so you order ${him} into a position for use of ${his}`);
		if (slave.mpreg === 1) {
			r.push(`rear`);
		} else {
			r.push(`front`);
		}
		r.push(`hole. ${He} obediently`);
		if (hasAllLimbs(slave)) {
			r.push(`gets down on all fours and`);
		}
		r.push(`cocks ${his} hips, offering ${his}`);
		if (slave.mpreg === 1) {
			r.push(`asspussy`);
		} else {
			r.push(`cunt`);
		}
		r.push(`until you insert your`);
		if (V.PC.dick > 0) {
			r.push(`cock`);
		} else {
			r.push(`strap-on`);
		}
		r.push(`into ${his}`);
		if (slave.mpreg === 1) {
			r.push(`winking`);
		} else {
			r.push(`wet`);
		}
		r.push(`channel.`);
	} else {
		r.push(`${He} can follow advanced commands, so you bring ${him} over to your chair`);
		if (hasAnyLegs(slave)) {
			r.push(`and order ${him} to squat down onto your cock and ride.`);
		} else {
			r.push(`and impale ${him} on your cock, ordering ${him} to do ${his} feeble best to bounce.`);
		}
	}
	if (slave.fuckdoll <= 20) {
		r.push(`${He}'s not fully used to being raped without warning, so ${he} struggles, ${his} muscles spasming delightfully.`);
	} else if (slave.fuckdoll <= 40) {
		r.push(`Aware that ${he} is supposed to relax and accept rape, ${he} does ${his} best to let you take ${him} without resistance.`);
	} else {
		r.push(`You command ${him} to milk your cock with ${his}`);
		if (slave.mpreg === 1) {
			r.push(`anal`);
		} else {
			r.push(`vaginal`);
		}
		r.push(`walls, and ${he} obediently starts to flex ${his} well-developed`);
		if (slave.mpreg === 1) {
			r.push(`cunt`);
		} else {
			r.push(`anal`);
		}
		r.push(`muscles, squeezing you from base to tip.`);
	}
	if (slave.fuckdoll <= 60) {
		if (slave.energy > 40) {
			r.push(`Denied any other outlet for ${his} healthy sex drive, ${he} orgasms.`);
		}
	} else {
		r.push(`${He} orgasmed for the first time as you entered ${him}, and ${he} continues to do so as you fuck ${him}. ${He}'s perfectly tuned.`);
	}
	if (slave.voice === 0) {
		r.push(`Though ${he} is mute, ${his} breath hisses loudly`);
		if (slave.lips > 95) {
			r.push(`past the lips of ${his} facepussy.`);
		} else {
			r.push(`through ${his} mouth insert.`);
		}
	} else {
		r.push(`${He} moans,`);
		if (slave.lips > 95) {
			r.push(`and the lips of ${his} facepussy quiver.`);
		} else {
			r.push(`struggling to force the sound past ${his} mouth insert.`);
		}
	}
	r.push(`You climax, your cum shooting forward to splash against ${his} womb, and return ${he} to`);
	if (hasAnyLegs(slave)) {
		r.push(`a standing position`);
	} else {
		r.push(`where ${he} was resting`);
	}
	r.push(`to allow your seed to find ${his} mark.`);
	if (slave.mpreg === 1) {
		if (slave.anus > 2) {
			r.push(`Your cum flows out of ${his} gaping rear hole and down the material of ${his} suit.`);
		} else if (slave.anus === 2) {
			r.push(`Your cum drips out of ${his} well-fucked rear hole and down the material of ${his} suit.`);
		} else {
			r.push(`${His} tight rear hole retains almost every drop of your cum. A few escape and run down the material of ${his} suit.`);
		}
		r.push(`The Fuckdoll will be cleaned by another slave.`);
		if (slave.anus === 0) {
			if (slave.fetish !== Fetish.MINDBROKEN) {
				r.push(`As you return to your business, ${he} shakes slightly in place, and a few low moans come out of ${his} face hole. This is probably a reaction to losing ${his} anal virginity.`);
			} else {
				r.push(`${He} gives no external indication that ${he}'s aware that ${he}'s just lost ${his} virginity.`);
			}
			r.push(`In any case, <span class="virginity loss">${his} rear hole has been broken in.</span>`);
			slave.anus = 1;
		}
	} else {
		if (slave.vagina >= 10) {
			r.push(`Your cum steadily flows from its prolapsed front hole and down the material of ${his} suit.`);
		} else if (slave.vagina > 2) {
			r.push(`Your cum flows out of ${his} gaping front hole and down the material of ${his} suit.`);
		} else if (slave.vagina === 2) {
			r.push(`Your cum drips out of ${his} well-fucked front hole and down the material of ${his} suit.`);
		} else {
			r.push(`${His} tight front hole retains almost every drop of your cum. A few escape and run down the material of ${his} suit.`);
		}
		r.push(`The Fuckdoll will be cleaned by another slave.`);
		if (slave.vagina === 0) {
			if (slave.fetish !== Fetish.MINDBROKEN) {
				r.push(`As you return to your business, ${he} shakes slightly in place, and a few low moans come out of ${his} face hole. This is probably a reaction to losing ${his} virginity.`);
			} else {
				r.push(`${He} gives no external indication that ${he}'s aware that ${he}'s just lost ${his} virginity.`);
			}
			r.push(`In any case, <span class="virginity loss">${his} front hole has been broken in.</span>`);
			slave.vagina = 1;
		}
	}

	r.push(`You repeat this ritual throughout the week, ensuring that ${he} will be an <span class="pregnant">incubator for your child.</span>`);
	knockMeUp(slave, 100, 2, -1);

	if (FutureSocieties.isActive('FSRestart') && V.eugenicsFullControl !== 1) {
		if (slave.breedingMark !== 1 || V.propOutcome === 0) {
			r.push(`Rumors spread about you knocking up your playthings; the Societal Elite are <span class="elites loss">very displeased</span> by these rumors.`);
			V.failedElite += 5;
		}
	}
	App.Events.addParagraph(node, r);
	return node;
};


code:
// cSpell:ignore beribbon

/**
 *
 * @param {FC.SlaveState} slave
 * @returns {DocumentFragment}
 */
App.Interact.fFuckdollOral = function(slave) {
	const node = new DocumentFragment();
	let r = [];

	const {
		He,
		he, his, him
	} = getPronouns(slave);

	seX(slave, "oral", V.PC, "penetrative");
	r.push(`You decide to use the Fuckdoll's`);
	if (slave.lips > 95) {
		r.push(`facepussy.`);
	} else {
		r.push(`face hole.`);
	}
	if (slave.fuckdoll <= 10) {
		r.push(`Since ${he} is not well adapted to life as a living sex toy yet, ${he} won't respond to position commands. So, you simply`);
		if (hasBothLegs(slave)) {
			r.push(`shove ${him} into a kneeling position`);
		} else {
			r.push(`set ${him} on the couch`);
		}
		r.push(`and straddle ${his} face.`);
	} else if (slave.fuckdoll <= 80) {
		r.push(`${He} can follow intermediate commands, so you order ${him} into a position for use of ${his} face hole. ${He} obediently`);
		if (hasBothLegs(slave)) {
			r.push(`gets to ${his} knees`);
		} else {
			r.push(`cranes ${his} neck up`);
		}
		r.push(`and sticks ${his} tongue out as far as it will go, wiggling it invitingly. You straddle ${his} face.`);
	} else {
		r.push(`${He} can follow advanced commands, so you order ${him} into a position for use of ${his} face hole. ${He} instantly`);
		if (hasAnyLegs(slave)) {
			if (V.PC.dick !== 0) {
				r.push(`bends at the waist and turns ${his} head upward, placing ${his} throat horizontally and at waist height.`);
			} else {
				r.push(`gets to ${his} knees and turns ${his} head upward at just the right angle for a pussy to ride ${his} face hole.`);
			}
		} else {
			r.push(`cranes ${his} neck up and sticks ${his} tongue out as far as it will go, wiggling it invitingly.`);
		}
		r.push(`You straddle ${his} face.`);
	}
	if (slave.fuckdoll <= 20) {
		r.push(`${He}'s not fully used to being surprised with face rape, so ${he} struggles, and ${his} difficulty breathing`);
		if (V.PC.dick !== 0) {
			r.push(`makes ${his} ${canPenetrateThroat(V.PC) ? `throat spasm around` : `tongue spasm against`} your dickhead.`);
		} else {
			r.push(`feels lovely on your cunt.`);
		}
	} else if (slave.fuckdoll <= 50) {
		r.push(`Aware that ${he} is supposed to relax and let you rape ${his} face, ${he} does ${his} best to let you`);
		if (V.PC.dick !== 0) {
			if (canPenetrateThroat(V.PC)) {
				r.push(`fuck ${his} throat.`);
			} else {
				r.push(`fuck ${his} mouth.`);
			}
		} else {
			r.push(`ride ${his} face.`);
		}
	} else {
		r.push(`You command ${him} to`);
		if (V.PC.dick !== 0) {
			r.push(`milk your dick, and ${he} begins to suck with almost frightening force.`);
		} else {
			r.push(`pleasure your cunt, and ${he} begins to eat you out with almost frightening hunger.`);
		}
	}
	if (slave.fuckdoll <= 60) {
		if (slave.energy > 80) {
			r.push(`Denied any other outlet for ${his} extreme sex drive, ${he} orgasms from nothing more than oral stimulation.`);
		}
	} else {
		r.push(`${He}'s so perfectly tuned that ${he} begins to orgasm from nothing more than oral stimulation, and ${he} continues to shiver with repeated orgasms as ${he} sucks.`);
	}
	r.push(`You climax,`);
	if (V.PC.dick !== 0) {
		if (canPenetrateThroat(V.PC)) {
			r.push(`blowing your load down ${his} throat,`);
		} else {
			r.push(`filling ${his} mouth with your load,`);
		}
	} else {
		r.push(`giving ${him} a good amount of femcum to swallow,`);
	}
	r.push(`and return ${him} to`);
	if (hasAnyLegs(slave)) {
		r.push(`a standing position.`);
	} else {
		r.push(`where ${he} was resting.`);
	}
	if (V.PC.dick !== 0) {
		if (slave.lips > 95) {
			r.push(`${He} gives sloppy blowjobs, ${his} lips being too big for much control, and strings of your cum beribbon ${his} suit. The Fuckdoll will be cleaned by another slave.`);
		} else {
			r.push(`${He} swallows repeatedly as ${he} returns to ${his} resting posture.`);
		}
	}
	App.Events.addParagraph(node, r);
	return node;
};


code:
/**
 *
 * @param {FC.SlaveState} slave
 * @returns {DocumentFragment}
 */
App.Interact.fFuckdollVaginal = function(slave) {
	const node = new DocumentFragment();
	let r = [];

	const {
		He, His,
		he, his, him
	} = getPronouns(slave);

	seX(slave, "vaginal", V.PC, "penetrative");
	r.push(`You decide to use the Fuckdoll's`);
	if (slave.vagina > 3) {
		r.push(`cavernous`);
	} else if (slave.vagina === 3) {
		r.push(`soft`);
	} else if (slave.vagina === 2) {
		r.push(`inviting`);
	} else if (slave.vagina === 1) {
		r.push(`tight`);
	}
	r.push(`front hole.`);
	if (slave.fuckdoll <= 10) {
		r.push(`Since ${he} is not well adapted to life as a living sex toy yet, ${he} won't respond to position commands. So, you simply`);
		if (hasAnyLegs(slave)) {
			r.push(`push ${him} down to lie on the couch`);
		} else {
			r.push(`set ${him} on your desk`);
		}
		r.push(`and shove`);
		if (V.PC.dick !== 0) {
			r.push(`your cock`);
		} else {
			r.push(`a strap-on`);
		}
		r.push(`inside ${his} vagina.`);
	} else if (slave.fuckdoll <= 70) {
		r.push(`${He} can follow intermediate commands, so you order ${him} into a position for use of ${his} front hole. ${He} obediently`);
		if (hasAllLimbs(slave)) {
			r.push(`gets down on all fours and`);
		} else if (hasAnyLegs(slave)) {
			r.push(`bends over and`);
		}
		r.push(`cocks ${his} hips, offering ${his} cunt until you insert`);
		if (V.PC.dick !== 0) {
			r.push(`your cock`);
		} else {
			r.push(`a strap-on`);
		}
		r.push(`into ${his} wet channel.`);
	} else {
		r.push(`${He} can follow advanced commands, so you bring ${him} over to your chair`);
		if (hasAnyLegs(slave)) {
			r.push(`and order ${him} to squat down onto your`);
			if (V.PC.dick !== 0) {
				r.push(`cock`);
			} else {
				r.push(`strap-on`);
			}
			r.push(`and ride.`);
		} else {
			r.push(`and impale ${him} on`);
			if (V.PC.dick !== 0) {
				r.push(`your cock,`);
			} else {
				r.push(`your strap-on,`);
			}
			r.push(`ordering ${him} to do ${his} feeble best to bounce.`);
		}
	}
	if (slave.fuckdoll <= 20) {
		r.push(`${He}'s not fully used to being raped without warning, so ${he} struggles, ${his} muscles spasming delightfully.`);
	} else if (slave.fuckdoll <= 40) {
		r.push(`Aware that ${he} is supposed to relax and accept rape, ${he} does ${his} best to let you take ${him} without resistance.`);
	} else {
		r.push(`You command ${him} to milk your`);
		if (V.PC.dick !== 0) {
			r.push(`cock`);
		} else {
			r.push(`strap-on`);
		}
		r.push(`with ${his} vaginal walls, and ${he} obediently starts to flex ${his} well-developed cunt muscles, squeezing`);
		if (V.PC.dick !== 0) {
			r.push(`you`);
		} else {
			r.push(`your strap-on`);
		}
		r.push(`from base to tip.`);
	}
	if (slave.fuckdoll <= 60) {
		if (slave.energy > 40) {
			r.push(`Denied any other outlet for ${his} healthy sex drive, ${he} orgasms.`);
		}
	} else {
		r.push(`${He} orgasmed for the first time as you entered ${him}, and ${he} continues to do so as you fuck ${him}. ${He}'s perfectly tuned.`);
	}
	if (slave.voice === 0) {
		r.push(`Though ${he} is mute, ${his} breath hisses loudly`);
		if (slave.lips > 95) {
			r.push(`past the lips of ${his} facepussy.`);
		} else {
			r.push(`through ${his} mouth insert.`);
		}
	} else {
		r.push(`${He} moans,`);
		if (slave.lips > 95) {
			r.push(`and the lips of ${his} facepussy quiver.`);
		} else {
			r.push(`struggling to force the sound past ${his} mouth insert.`);
		}
	}
	r.push(`You climax${(V.PC.dick !== 0) ? `, your cum shooting forward to splash against ${his} womb,` : ``} and return ${him} to`);
	if (hasAnyLegs(slave)) {
		r.push(`a standing position.`);
	} else {
		r.push(`where ${he} was resting.`);
	}
	if (V.PC.dick !== 0) {
		if (slave.vagina > 2) {
			r.push(`Your cum flows out of ${his} gaping front hole and down the material of ${his} suit.`);
		} else if (slave.vagina === 2) {
			r.push(`Your cum drips out of ${his} well-fucked front hole and down the material of ${his} suit.`);
		} else {
			r.push(`${His} tight front hole retains almost every drop of your cum. A few escape and run down the material of ${his} suit.`);
		}
		if (canImpreg(slave, V.PC)) {
			r.push(knockMeUp(slave, 5, 1, -1));
		}
		r.push(`The Fuckdoll will be cleaned by another slave.`);
	}
	if (slave.vagina === 0) {
		if (slave.fetish !== Fetish.MINDBROKEN) {
			r.push(`As you return to your business, ${he} shakes slightly in place, and a few low moans come out of ${his} face hole. This is probably a reaction to losing ${his} virginity.`);
		} else {
			r.push(`${He} gives no external indication that ${he}'s aware that ${he}'s just lost ${his} virginity.`);
		}
		r.push(`In any case, <span class="lime">${his} front hole has been broken in.</span>`);
		slave.vagina = 1;
	}
	App.Events.addParagraph(node, r);
	return node;
};