code:
App.EndWeek.farmyardReport = function farmyardReport() {
	const frag = new DocumentFragment();
	const text = new SpacedTextAccumulator(frag);

	const slaves = App.Utils.sortedEmployees(App.Entity.facilities.farmyard);
	const devBonus = (V.farmyardDecoration !== "standard") ? 1 : 0;
	const Farmer = S.Farmer ? App.SlaveAssignment.reportSlave(S.Farmer) : undefined;
	const profits = getProfits();
	const food = App.Facilities.Farmyard.foodProduction();

	// Statistics gathering
	V.facility = V.facility || {};
	V.facility.farmyard = initFacilityStatistics(V.facility.farmyard);

	const statsSpan = document.createElement("span");
	frag.append(statsSpan);

	text.push(
		farmyardDecoration(),
		farmyardMultipliers(),
		farmyardProfit(),
	);

	text.toParagraph();

	V.mods.food.amount += food;

	if (Farmer) {
		if ((V.experimental.favSeparateReport === 1 && V.favorites.includes(Farmer.ID)) || V.showEWD) {
			const farmerEntry = App.UI.DOM.appendNewElement("div", frag, null, ["slave-report"]);
			const artSpan = App.UI.DOM.appendNewElement("span", farmerEntry);
			App.Events.addNode(farmerEntry, [App.SlaveAssignment.saSlaveIntro(Farmer, `is serving as the Farmer.`), farmerText()]);
			farmerEntry.append(App.SlaveAssignment.standardSlaveReport(Farmer));
			App.SlaveAssignment.appendSlaveArt(artSpan, Farmer);
		} else {
			App.SlaveAssignment.standardSlaveReport(Farmer, true);
		}

		getSlaveStatisticData(S.Farmer, V.facility.farmyard);

		farmerChanges();
	}

	if (slaves) {
		const intro = App.UI.DOM.appendNewElement("p", frag, null, ["indent"]);

		$(intro).append(farmhandCount(slaves.length));

		for (const slave of App.SlaveAssignment.reportSlaves(slaves)) {
			slave.devotion += devBonus;

			if (V.showEWD || (V.experimental.favSeparateReport === 1 && V.favorites.includes(slave.ID))) {
				const slaveEntry = App.UI.DOM.appendNewElement("div", frag, null, ["slave-report"]);
				const artSpan = App.UI.DOM.appendNewElement("span", slaveEntry);
				slaveEntry.append(App.SlaveAssignment.saSlaveIntro(slave, `is working out of ${V.farmyardName}.`));

				farmhandLivingRules(slave);
				farmhandHealth(slave);
				farmhandDevotion(slave);
				farmhandTrust(slave);
				farmhandEnergy(slave);
				farmhandFood(slave);

				App.Events.addNode(slaveEntry, [
					App.SlaveAssignment.workTheFarm(slave),
					App.SlaveAssignment.standardSlaveReport(slave, false)
				], "div", ["indent"]);
				App.SlaveAssignment.appendSlaveArt(artSpan, slave);
			} else {	// silently discard return values
				App.SlaveAssignment.workTheFarm(slave);
				App.SlaveAssignment.standardSlaveReport(slave, true);
			}
		}

		farmyardStatsRecords();
	}

	frag.append(App.Facilities.Farmyard.Stats(false));
	statsSpan.append(App.Facilities.Farmyard.Stats(true));

	return frag;

	// Farmer

	function farmerChanges() {
		if (Farmer) {
			farmerHealth(Farmer);
			farmerDevotion(Farmer);
			farmerTrust(Farmer);
			farmerLivingRules(Farmer);
			farmerRestRules(Farmer);
			farmerCashBonus(Farmer);
		}
	}

	function farmerHealth(slave) {
		if (slave.health.condition < -80) {
			improveCondition(Farmer, 20);
		} else if (slave.health.condition < -40) {
			improveCondition(Farmer, 15);
		} else if (slave.health.condition < 0) {
			improveCondition(Farmer, 10);
		} else if (slave.health.condition < 90) {
			improveCondition(Farmer, 7);
		}
	}

	function farmerDevotion(slave) {
		slave.devotion += devBonus;

		if (slave.devotion < 45) {
			slave.devotion += 5;
		}
	}

	function farmerTrust(slave) {
		if (slave.trust < 45) {
			slave.trust += 5;
		}
	}

	function farmerLivingRules(slave) {
		slave.rules.living = 'luxurious';
	}
	function farmerRestRules(slave) {
		slave.rules.rest = 'restrictive';
	}

	function farmerCashBonus(slave) {
		let FarmerCashBonus = Math.min(0.2, slave.skill.farmer * 0.002);

		FarmerCashBonus += slave.intelligence + slave.intelligenceImplant > 15 ? 0.05 : 0;
		FarmerCashBonus += slave.dick > 2 && canPenetrate(slave) ? 0.05 : 0;
		FarmerCashBonus += !canSmell(slave) ? 0.05 : 0;

		if (slave.actualAge > 35) {
			FarmerCashBonus += 0.05;
		} else if (!V.AgePenalty) {
			FarmerCashBonus += 0.05;
		}

		if (App.Data.Careers.Leader.farmer.includes(slave.career)) {
			FarmerCashBonus += 0.05;
			if (slave.skill.farmer >= Constant.MASTERED_XP) {
				FarmerCashBonus += 0.05;
			}
		} else if (slave.skill.farmer >= Constant.MASTERED_XP) {
			FarmerCashBonus += 0.05;
		}

		// TODO: keep this?
		if (Farmer.relationshipTarget === slave.ID) {
			FarmerCashBonus -= 0.05;
		} else if (areRelated(Farmer, slave)) {
			FarmerCashBonus += 0.05;
		}

		FarmerCashBonus *= restEffects(Farmer);

		return FarmerCashBonus;
	}

	function farmerText() {
		const r = [];

		r.push(
			farmerRelationshipPC(Farmer),
			farmerFetishEffects(Farmer, farmerFetish(Farmer)),
			farmerSkill(Farmer),
			farmerExperience(Farmer),
			farmerTiredness(Farmer),
			farmerIntelligence(Farmer),
			farmerSmell(Farmer),
			farmerRelationshipSlaves(Farmer),
			farmerContracts(Farmer)
		);

		return r.join(' ');
	}

	function farmerFetish(slave) {
		if (slave.fetish !== 'dom') {
			if (fetishChangeChance(slave) > random(0, 100)) {
				slave.fetishKnown = 1;
				slave.fetish = 'dom';
				slave.fetishStrength = 10;
				return 1;
			}
		} else if (!slave.fetishKnown) {
			slave.fetishKnown = 1;
			return 1;
		} else {
			slave.fetishStrength += 4;
			return 2;
		}
	}

	function farmerFetishEffects(slave, fetish = 0) {
		const {he, his, himself, He} = getPronouns(slave);

		if (fetish === 1) {
			return `${He} isn't above sampling the merchandise ${himself}; before long it's obvious to ${his} workers that ${he} <span class="fetish gain">really likes fucking them.</span> `;
		} else if (fetish === 2) {
			return `${He}'s careful that all of the farmhands under ${his} supervision are all ready to work every morning, and ${he} <span class="fetish inc">becomes more dominant.</span> `;
		}
	}

	function farmerSkill(slave) {
		const {he, his, His} = getPronouns(slave);

		const r = [];

		if (slave.skill.farmer <= 10) {
			r.push(`Though ${slave.slaveName} does ${his} best to manage the farmyard, with ${his} lack of skill ${he} can do little.`);
		} else if (slave.skill.farmer <= 30) {
			r.push(`${slave.slaveName}'s basic skills marginally <span class="cash">improve</span> business at ${V.farmyardName}.`);
		} else if (slave.skill.farmer <= 60) {
			r.push(`${slave.slaveName}'s skills <span class="cash">improve</span> business at ${V.farmyardName}.`);
		} else if (slave.skill.farmer < 100) {
			r.push(`${slave.slaveName}'s skills greatly <span class="cash">improve</span> business at ${V.farmyardName}.`);
		} else {
			r.push(`${slave.slaveName}'s mastery immensely <span class="cash">improves</span> business at ${V.farmyardName}.`);
		}

		if (slave.actualAge > 35) {
			r.push(`${His} age and experience also contribute.`);
		}

		return r.join(' ');
	}

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

		if (App.Data.Careers.Leader.farmer.includes(slave.career)) {
			return `${He} has experience from ${his} life before ${he} was a slave that helps ${him} in the difficult life of managing animals and property.`;
		} else if (slave.skill.farmer >= Constant.MASTERED_XP) {
			return `${He} has experience from working for you that helps ${him} in the difficult life of managing animals and property.`;
		} else {
			const skillIncrease = random(1, Math.ceil((slave.intelligence + slave.intelligenceImplant) / 32));
			return slaveSkillIncrease('farmer', slave, skillIncrease);
		}
	}

	function farmerTiredness(slave) {
		const {he, his} = getPronouns(slave);

		if (slaveResting(slave)) {
			return `To avoid exhaustion, ${he} has to take breaks to maintain ${his} strength, limiting how much ${he} can work.`;
		}
	}

	function farmerRelationshipSlaves(Farmer) {
		const {he, his, He} = getPronouns(Farmer);

		const r = [];

		for (const slave of slaves) {
			if (Farmer.rivalryTarget === slave.ID) {
				r.push(`${He} leverages the fact that ${he} is ${slave.slaveName}'s superior to make ${his} ${rivalryTerm(Farmer)}'s life a living hell.`);
				slave.devotion -= 2; slave.trust -= 2;

				if (canDoVaginal(slave)) {
					seX(slave, 'vaginal', 'public', 'penetrative', 10);
				}

				if (canDoAnal(slave)) {
					seX(slave, 'anal', 'public', 'penetrative', 10);
				}

				seX(slave, 'oral', 'public', 'penetrative', 10);
				if (random(1, 100) > 65) {
					Farmer.rivalry++; slave.rivalry++;
				}
			} else if (Farmer.relationshipTarget === slave.ID) {
				r.push(`${He} dotes over ${his} ${relationshipTerm(Farmer)}, ${slave.slaveName}, making sure ${he} isn't worked too hard, but unfortunately manages to get in the way of ${his} work.`);
				slave.devotion++;
			} else if (areRelated(Farmer, slave)) {
				r.push(`${He} pays special attention to ${his} ${relativeTerm(Farmer, slave)}, ${slave.slaveName}, making sure ${he} is treated well and showing off ${his} skills.`);
				slave.trust++;
			}
		}

		return r;
	}

	function farmerContracts(slave) {
		const {he, his, himself} = getPronouns(slave);

		const r = [];
		const seed = Math.trunc(App.Facilities.Farmyard.farmShowsIncome(slave));

		if (!App.Entity.facilities.farmyard.employeesIDs()) {
			if (V.farmyardShows > 0) {
				r.push(`
Since ${he} doesn't have enough showgirls to entertain your arcology's citizens, ${he} puts on shows with your animals on ${his} own, earning ${cashFormat(seed)}.
`);
			} else {
				r.push(`<p class="indent">Since ${V.farmyardName} doesn't have anyone tending to the crops, ${he} looks after them ${himself}, earning <span class="cash">${cashFormat(seed)}.</span></p>`);
			}
		}
		return r;
	}

	function farmerRelationshipPC(slave) {
		const {he, his, wife} = getPronouns(slave);

		if (slave.relationship === -3 && slave.devotion > 50) {
			return `As your loving ${wife}, ${he} does ${his} best to ensure ${V.farmyardName} runs smoothly.`;
		}
	}

	function farmerIntelligence(slave) {
		const {He} = getPronouns(slave);

		if (slave.intelligence + slave.intelligenceImplant > 15) {
			return `${He} is a clever manager.`;
		}
	}

	function farmerSmell(slave) {
		const {him, His} = getPronouns(slave);

		if (!canSmell(slave)) {
			return `${His} lack of a sense of smell protects ${him} from that omnipresent barnyard stench.`;
		}
	}

	// Farmhands

	function farmhandCount(count) {
		return `<strong>There ${count > 1 ? `are ${count} farmhands` : `is one farmhand`} working out of ${V.farmyardName}.</strong>`;
	}

	function farmhandLivingRules(slave) {
		switch (V.farmyardDecoration) {
			case 'Degradationist':
			case 'standard':
				slave.rules.living = 'spare';
				break;
			case 'Roman Revivalist':
				slave.rules.living = 'luxurious';
				break;
			default:
				slave.rules.living = 'normal';
				break;
		}
	}

	function farmhandHealth(slave) {
		if (slave.health.condition < -80) {
			improveCondition(slave, 20);
		} else if (slave.health.condition < -40) {
			improveCondition(slave, 15);
		} else if (slave.health.condition < 0) {
			improveCondition(slave, 10);
		} else if (slave.health.condition < 90) {
			improveCondition(slave, 7);
		}
	}

	function farmhandDevotion(slave) {
		if (slave.devotion <= 20 && slave.trust >= -20) {
			slave.devotion -= 5; slave.trust -= 5;
		} else if (slave.devotion < 45) {
			slave.devotion += 4;
		} else if (slave.devotion > 50) {
			slave.devotion -= 4;
		}
	}

	function farmhandProfit(slave) {
		const incomeStats = getSlaveStatisticData(slave, slave.assignment === Job.FARMYARD ? V.facility.farmyard : undefined);
		return incomeStats.income || null;
	}

	function farmhandFood(slave) {
		const incomeStats = getSlaveStatisticData(slave, slave.assignment === Job.FARMYARD ? V.facility.farmyard : undefined);
		let foodWeek = incomeStats.food || 0;

		if (V.farmMenials > 0) {
			foodWeek += (V.farmMenials * 350);
		}

		return foodWeek;
	}

	function farmhandTrust(slave) {
		if (slave.trust < 30) {
			slave.trust += 5;
		}
	}

	function farmhandEnergy(slave) {
		if (slave.energy.isBetween(40, 95)) {
			slave.energy++;
		}
	}

	// Farmyard

	function farmyardStatsRecords() {
		const f = V.facility.farmyard;

		if (!f) {
			return;
		}

		f.whoreIncome = 0;
		f.customers = 0;
		f.whoreCosts = 0;
		f.rep = 0;
		f.food = 0;
		for (const si of f.income.values()) {
			f.whoreIncome += si.income + si.adsIncome;
			f.customers += si.customers;
			f.whoreCosts += si.cost;
			f.rep += si.rep;
			f.food += si.food;
		}
		f.maintenance = V.farmyard * V.facilityCost;
		f.totalIncome = f.whoreIncome + f.adsIncome;
		f.totalExpenses = f.whoreCosts + f.maintenance;
		f.profit = f.totalIncome - f.totalExpenses;
	}

	function farmyardDecoration() {
		const text = [];

		// TODO: add checks for the different FSs
		if (V.farmyardDecoration !== 'standard') {
			text.push(`${capFirstChar(V.farmyardName)}'s customer's enjoyed`);

			if (V.farmyardShows > 0) {
				if (V.seeBestiality && V.policies.bestialityOpenness && (V.animals.canine.length || V.animals.hooved.length || V.animals.feline.length)) {
					text.push(`<span class="reputation inc">watching farmhands fuck animals in ${V.farmyardDecoration} surroundings.</span>`);
				} else {
					text.push(`<span class="reputation inc">watching farmhands put on shows in ${V.farmyardDecoration} surroundings.</span>`);
				}
			} else {
				text.push(`<span class="reputation inc">partaking of ${V.farmyardName}'s fine produce in its ${V.farmyardDecoration} décor.</span>`);
			}
		}

		return text.join(' ');
	}

	function farmyardMultipliers() {
		const animals = [...V.animals.canine, ...V.animals.feline, ...V.animals.hooved].map(animal => getAnimal(animal));
		const total = animals.length;
		const exotic = animals.filter(animal => animal.rarity === "exotic");
		const text = [];
		const animalText = [];

		if (total > 1) {
			text.push(`Having a ${total > 6 ? `wide` : ``} variety of`);
			if (V.animals.canine.length > 0) {
				if (V.animals.canine.every(c => getAnimal(c).species === "dog")) {
					animalText.push(`dogs`);
				} else {
					animalText.push(`canines`);
				}
			}
			if (V.animals.hooved.length > 0) {
				animalText.push(`hooved animals`);
			}
			if (V.animals.feline.length > 0) {
				if (V.animals.feline.every(f => getAnimal(f).species === "cat")) {
					animalText.push(`cats`);
				} else {
					animalText.push(`felines`);
				}
			}
			text.push(`${toSentence(animalText)} keeps the guests of ${V.farmyardName} more entertained than they would have been otherwise, <span class="cash inc">earning you more.</span>`);
		}

		if (exotic.length > 0) {
			text.push(`The fact that some of the animals are normally only founds in zoos is not lost on your citizenry, either, and many are willing to pay more to watch shows with them.`);
		}

		return text.join(' ');
	}

	function farmyardProfit() {
		const text = [];

		if (profits || food) {
			text.push(capFirstChar(V.farmyardName));

			if (profits) {
				text.push(`makes you <span class="cash">${cashFormat(Math.trunc(profits))}</span>`);
			}

			if (V.mods.food.market) {
				if (profits && food) {
					text.push(`and`);
				}
				if (food) {
					text.push(`produced <span class="chocolate"> ${massFormat(food)}</span> of food`);
				}
			}
			text.push(`this week.`);
		}

		return text.join(' ');
	}

	function getProfits() {
		let total = 0;

		for (const slave of slaves) {
			total += farmhandProfit(slave);
		}

		return total;
	}
};


code:
App.EndWeek.incubatorReport = function() {
	const frag = document.createDocumentFragment();

	if (V.incubator.capacity === 0) {
		return frag;
	}
	V.incubator.readySlaves = 0;

	for (const tank of V.incubator.tanks) {
		const entry = App.UI.DOM.appendNewElement('p', frag);
		let r = [];
		const {He, he, His, his, him} = getPronouns(tank);
		tank.birthWeek += 1;
		if (tank.birthWeek >= 52) {
			tank.birthWeek = 0;
			if (V.seeAge === 1) {
				tank.actualAge++;
				tank.ovaryAge++;
			}
		}
		if (tank.incubatorSettings.growTime > 0) {
			tank.incubatorSettings.growTime -= V.incubator.upgrade.speed;
			r.push(`<span class="pink">${tank.slaveName}'s</span> growth is currently being accelerated. ${He}`);
			if (Math.round(tank.incubatorSettings.growTime/V.incubator.upgrade.speed) <= 0) {
				r.push(`is <span class="lime">ready for release.</span> ${He} will be ejected from ${his} tank upon your approach.`);
			} else {
				r.push(`will be ready for release in about ${Math.round(tank.incubatorSettings.growTime/V.incubator.upgrade.speed)} weeks.`);
			}
		} else {
			r.push(`<span class="pink">${tank.slaveName}</span> is <span class="lime">ready for release.</span> ${He} will be ejected from ${his} tank upon your approach.`);
			V.incubator.readySlaves = 1;
		}
		App.Events.addNode(entry, r, "div");

		r = [];
		if (V.incubator.upgrade.weight === 1) {
			if (tank.incubatorSettings.weight === 1) {
				if (tank.weight < 200) {
					if (V.incubator.upgrade.speed === 52) {
						tank.weight += 70;
					} else if (V.incubator.upgrade.speed === 18) {
						tank.weight += 40;
					} else if (V.incubator.upgrade.speed === 9) {
						tank.weight += 20;
					} else if (V.incubator.upgrade.speed === 6) {
						tank.weight += 10;
					} else if (V.incubator.upgrade.speed === 5) {
						tank.weight += 5;
					}
				}
				r.push(`The weight monitoring systems are overloading ${his} intake causing <span class="red">rapid weight gain.</span>`);
			} else if (tank.incubatorSettings.weight === 2) {
				if (tank.weight > 10) {
					if (V.incubator.upgrade.speed === 52) {
						tank.weight -= 30;
					} else if (V.incubator.upgrade.speed === 18) {
						tank.weight -= 10;
					} else if (V.incubator.upgrade.speed === 9) {
						tank.weight -= 5;
					} else if (V.incubator.upgrade.speed === 6) {
						tank.weight -= 2;
					} else if (V.incubator.upgrade.speed === 5) {
						tank.weight -= 1;
					}
					r.push(`The weight monitoring systems detect ${he} is overweight and <span class="green">decrease ${his} caloric intake.</span>`);
				} else if (tank.weight < -10) {
					if (V.incubator.upgrade.speed === 52) {
						tank.weight += 30;
					} else if (V.incubator.upgrade.speed === 18) {
						tank.weight += 10;
					} else if (V.incubator.upgrade.speed === 9) {
						tank.weight += 5;
					} else if (V.incubator.upgrade.speed === 6) {
						tank.weight += 2;
					} else if (V.incubator.upgrade.speed === 5) {
						tank.weight += 1;
					}
					r.push(`The weight monitoring systems detect ${he} is underweight and <span class="green">increase ${his} caloric intake.</span>`);
				} else {
					r.push(`${He} is <span class="lime">currently at a healthy weight;</span> efforts will be made to maintain it.`);
				}
			} else if (tank.incubatorSettings.weight === 0) {
				if (tank.weight > -100) {
					r.push(`${His} developing body <span class="red">quickly sheds its gained weight.</span>`);
					tank.weight -= 40;
				}
			}
		} else {
			if (tank.weight > -100) {
				r.push(`${His} developing body <span class="red">quickly sheds its gained weight.</span>`);
				tank.weight -= 40;
			}
		}
		App.Events.addNode(entry, r, "div");

		r = [];
		if (V.incubator.upgrade.muscles === 1) {
			if (tank.incubatorSettings.muscles === 2) {
				if (tank.muscles < 100) {
					if (V.incubator.upgrade.speed === 52) {
						tank.muscles += 70;
					} else if (V.incubator.upgrade.speed === 18) {
						tank.muscles += 40;
					} else if (V.incubator.upgrade.speed === 9) {
						tank.muscles += 20;
					} else if (V.incubator.upgrade.speed === 6) {
						tank.muscles += 10;
					} else if (V.incubator.upgrade.speed === 5) {
						tank.muscles += 5;
					}
				}
				r.push(`The strength monitoring systems are overloading ${him} with steroids causing <span class="green">rapid muscle development.</span>`);
			} else if (tank.incubatorSettings.muscles === 1) {
				if (tank.muscles > 10) {
					if (V.incubator.upgrade.speed === 52) {
						tank.muscles -= 30;
					} else if (V.incubator.upgrade.speed === 18) {
						tank.muscles -= 10;
					} else if (V.incubator.upgrade.speed === 9) {
						tank.muscles -= 5;
					} else if (V.incubator.upgrade.speed === 6) {
						tank.muscles -= 2;
					} else if (V.incubator.upgrade.speed === 5) {
						tank.muscles--;
					}
					r.push(`The strength monitoring systems detect ${he} is overly muscular and <span class="green">decrease ${his} steroid dosage.</span>`);
				} else if (tank.muscles < -10) {
					if (V.incubator.upgrade.speed === 52) {
						tank.muscles += 30;
					} else if (V.incubator.upgrade.speed === 18) {
						tank.muscles += 10;
					} else if (V.incubator.upgrade.speed === 9) {
						tank.muscles += 5;
					} else if (V.incubator.upgrade.speed === 6) {
						tank.muscles += 2;
					} else if (V.incubator.upgrade.speed === 5) {
						tank.muscles++;
					}
					r.push(`The strength monitoring systems detect ${he} is weak and <span class="green">increase ${his} steroid dosage.</span>`);
				} else {
					r.push(`${He} has <span class="lime">a healthy musculature;</span> efforts will be made to maintain it.`);
				}
			} else if (tank.incubatorSettings.muscles === 0) {
				if (tank.muscles > -100) {
					r.push(`${His} developing body <span class="red">quickly loses its gained muscle.</span>`);
					tank.muscles -= 40;
				}
			}
		} else {
			if (tank.muscles > -100) {
				r.push(`${His} developing body <span class="red">quickly loses its gained muscle.</span>`);
				tank.muscles -= 40;
			}
		}
		App.Events.addNode(entry, r, "div");

		r = [];
		if (V.incubator.upgrade.growthStims === 1 && tank.incubatorSettings.growthStims !== 0) {
			let heightLimit = Math.clamp((Height.forAge(tank.natural.height, tank) * 1.25), 0, 274);
			let heightLimitAge = Height.forAge(tank.natural.height, tank);
			if (tank.geneticQuirks.dwarfism === 2 && tank.geneticQuirks.gigantism !== 2) {
				heightLimit = Math.clamp((Height.forAge(tank.natural.height, tank) * 0.95), 0, 160);
			} else if (tank.geneticQuirks.gigantism === 2 && tank.geneticQuirks.dwarfism !== 2) {
				heightLimit = Math.clamp((Height.forAge(tank.natural.height, tank) * 1.75), 0, 274);
			}
			if (tank.geneMods.NCS === 1) {
				/* NCS should block physical growth beyond that of a toddler, but some players might like
				 * a little more or less. So using V.minimumSlaveAge or 8, whichever is lesser.	*/
				const limitAge = Math.min(8, V.minimumSlaveAge);
				/* scale height to age 8 */
				heightLimitAge = Height.forAge(tank.natural.height, limitAge);
				heightLimit = heightLimitAge;
			} else if (tank.geneticQuirks.neoteny === 2 && tank.physicalAge > 12) {
				/* scale height to age 12 */
				heightLimitAge = Height.forAge(tank.natural.height, 12);
				heightLimit = Math.clamp((heightLimitAge * 1.25), 0, 274);
			}
			if (tank.height >= heightLimit) {
				r.push(`The monitoring system detects ${his} body is not able to support further increases in height, so it carefully regulates stimulant injections to maintain ${his} current stature.`);
				tank.height = heightLimit;
			} else if (tank.incubatorSettings.growthStims === 2) {
				if (tank.geneMods.NCS === 1) {
					r.push(`The monitoring system floods ${his} body with growth stimulants, but ${his} <span class="orange">NCS prevents an increase in ${his} growth rate.</span>`);
					tank.height = heightLimitAge;
				} else {
					if (tank.incubatorSettings.weight >= 1 && tank.incubatorSettings.muscles <= 1 && tank.incubatorSettings.reproduction <= 1) {
						r.push(`The monitoring system floods ${his} body with growth stimulants. ${His} caloric intake and expenditure rates are ideal for maximum response, causing <span class="green">explosive growth.</span>`);
						if (V.incubator.upgrade.speed === 52) {
							tank.height += random(3, 6);
						} else if (V.incubator.upgrade.speed === 18) {
							tank.height += random(2, 5);
						} else if (V.incubator.upgrade.speed === 9) {
							tank.height += random(1, 4);
						} else if (V.incubator.upgrade.speed === 6) {
							tank.height += random(1, 3);
						} else if (V.incubator.upgrade.speed === 5) {
							tank.height += random(1, 2);
						}
					} else {
						r.push(`The monitoring system floods ${his} body with growth stimulants, causing <span class="green">a sharp increase in growth rate.</span>`);
						if (V.incubator.upgrade.speed === 52) {
							tank.height += random(2, 5);
						} else if (V.incubator.upgrade.speed === 18) {
							tank.height += random(1, 4);
						} else if (V.incubator.upgrade.speed === 9) {
							tank.height += random(1, 3);
						} else if (V.incubator.upgrade.speed === 6) {
							tank.height += random(1, 2);
						} else if (V.incubator.upgrade.speed === 5) {
							tank.height += random(0, 1);
						}
					}
				}
			} else if (tank.incubatorSettings.growthStims === 1) {
				if (tank.geneMods.NCS === 1) {
					r.push(`The monitoring system detects ${he} is near the expected height for ${his} NCS condition, so it carefully regulates stimulant injections to maintain ${his} current stature.`);
					tank.height = heightLimitAge;
				} else if (tank.height > heightLimitAge) {
					r.push(`The monitoring systems detect ${he} is near the expected height, so it carefully regulates stimulant injections to <span class="yellow">maintain ${his} current stature.</span>`);
					if (random(1, 10) === 10) {
						if (V.incubator.upgrade.speed === 52) {
							tank.height += random(1, 4);
						} else if (V.incubator.upgrade.speed === 18) {
							tank.height += random(1, 3);
						} else if (V.incubator.upgrade.speed === 9) {
							tank.height += random(1, 2);
						} else if (V.incubator.upgrade.speed === 6) {
							tank.height += random(0, 1);
						} else if (V.incubator.upgrade.speed === 5) {
							tank.height += random(0, 1);
						}
					}
				} else {
					r.push(`The monitoring systems detect ${his} body is capable of developing more rapidly and <span class="green">increase ${his} growth stimulant dosage.</span>`);
					if (V.incubator.upgrade.speed === 52) {
						tank.height += random(1, 4);
					} else if (V.incubator.upgrade.speed === 18) {
						tank.height += random(1, 3);
					} else if (V.incubator.upgrade.speed === 9) {
						tank.height += random(1, 2);
					} else if (V.incubator.upgrade.speed === 6) {
						tank.height += random(0, 1);
					} else if (V.incubator.upgrade.speed === 5) {
						tank.height += random(0, 1);
					}
				}
			}
			tank.height = Math.clamp(tank.height, 0, heightLimit);
		} else {
			r.push(`With the growth stimulant injections offline, ${his} body is left to develop naturally.`);
		}
		App.Events.addNode(entry, r, "div");

		r = [];
		if (V.incubator.upgrade.reproduction === 1) {
			const rearQuirk = tank.geneticQuirks.rearLipedema === 2 ? 2 : 1;
			const rearLimit = 20; // current maximum ass size, used to avoid reporting failed growth
			if (tank.incubatorSettings.reproduction === 2) {
				r.push(`${His} developing body is being flooded with hormones.`);
				if (tank.incubatorSettings.weight === 1) {
					r.push(`Combined with the abundant food provided to ${him}, ${his} body grows rapidly.`);
					if (tank.ovaries === 1) {
						tank.pubertyXX = 1;
						if (tank.hormoneBalance < 500) {
							tank.hormoneBalance += 100;
						}
						tank.readyOva = V.seeHyperPreg === 1 ? random(25, 45) : random(3, 8);
						if (tank.geneMods.NCS === 1) {
							/* NCS blocks hormonal growth of all secondary sexual characteristics */
							r.push(`${His} <span class="orange">NCS blocks all growth</span> despite the excess estrogen-laced growth hormones flooding ${his} body.`);
						} else if (V.incubator.upgrade.speed === 52) {
							if (tank.boobs < 8000) {
								r.push(`The excess estrogen-laced growth hormones <span class="green">rapidly balloon ${his} breasts.</span>`);
								tank.boobs += 2000;
							}
							if (tank.hips < 2 && random(1, 100) > 50) {
								r.push(`The excess estrogen-laced growth hormones <span class="green">cause ${his} hips to widen for childbirth.</span>`);
								tank.hips = Math.clamp(tank.hips + 2, -2, 2);
							}
							if (tank.butt < rearLimit && tank.butt < 12*rearQuirk && random(1, 100) > 30/rearQuirk) {
								r.push(`The excess estrogen-laced growth hormones <span class="green">cause ${his} rear to grow fatter.</span>`);
								tank.butt += 4;
							}
						} else if (V.incubator.upgrade.speed === 18) {
							if (tank.boobs < 8000) {
								r.push(`The excess estrogen-laced growth hormones <span class="green">rapidly balloon ${his} breasts.</span>`);
								tank.boobs += 500;
							}
							if (tank.hips < 2 && random(1, 100) > 50) {
								r.push(`The excess estrogen-laced growth hormones <span class="green">cause ${his} hips to widen for childbirth.</span>`);
								tank.hips++;
							}
							if (tank.butt < rearLimit && tank.butt < 12*rearQuirk && random(1, 100) > 50/rearQuirk) {
								r.push(`The excess estrogen-laced growth hormones <span class="green">cause ${his} rear to grow fatter.</span>`);
								tank.butt += 3;
							}
						} else if (V.incubator.upgrade.speed === 9) {
							if (tank.boobs < 8000) {
								r.push(`The excess estrogen-laced growth hormones <span class="green">rapidly balloon ${his} breasts.</span>`);
								tank.boobs += 200;
							}
							if (tank.hips < 2 && random(1, 100) > 60) {
								r.push(`The excess estrogen-laced growth hormones <span class="green">causes ${his} hips to widen for childbirth.</span>`);
								tank.hips++;
							}
							if (tank.butt < rearLimit && tank.butt < 12*rearQuirk && random(1, 100) > 50/rearQuirk) {
								r.push(`The excess estrogen-laced growth hormones <span class="green">cause ${his} rear grow fatter.</span>`);
								tank.butt += 2;
							}
						} else if (V.incubator.upgrade.speed === 6) {
							if (tank.boobs < 8000) {
								r.push(`The excess estrogen-laced growth hormones <span class="green">rapidly balloon ${his} breasts.</span>`);
								tank.boobs += 100;
							}
							if (tank.hips < 2 && random(1, 100) > 70) {
								r.push(`The excess estrogen-laced growth hormones <span class="green">cause ${his} hips to widen for childbirth.</span>`);
								tank.hips++;
							}
							if (tank.butt < rearLimit && tank.butt < 12*rearQuirk && random(1, 100) > 60/rearQuirk) {
								r.push(`The excess estrogen-laced growth hormones <span class="green">cause ${his} rear to grow fatter.</span>`);
								tank.butt++;
							}
						} else if (V.incubator.upgrade.speed === 5) {
							if (tank.boobs < 8000) {
								r.push(`The excess estrogen-laced growth hormones <span class="green">rapidly balloon ${his} breasts.</span>`);
								tank.boobs += 100;
							}
							if (tank.hips < 2 && random(1, 100) > 80) {
								r.push(`The excess estrogen-laced growth hormones <span class="green">cause ${his} hips to widen for childbirth.</span>`);
								tank.hips++;
							}
							if (tank.butt < rearLimit && tank.butt < 12*rearQuirk && random(1, 100) > 70/rearQuirk) {
								r.push(`The excess estrogen-laced growth hormones <span class="green">cause ${his} rear to grow fatter.</span>`);
								tank.butt++;
							}
						}
					} else if (tank.balls > 0) {
						tank.pubertyXY = 1;
						if (tank.hormoneBalance > -500) {
							tank.hormoneBalance -= 100;
						}
						if (tank.geneMods.NCS === 1) {
							/* NCS blocks hormonal growth of all secondary sexual characteristics */
							r.push(`${His} <span class="orange">NCS blocks all growth</span> despite the excess testosterone-laced growth hormones flooding ${his} body.`);
						} else if (V.incubator.upgrade.speed === 52) {
							if (tank.balls < 40) {
								r.push(`The excess testosterone-laced growth hormones <span class="green">cause ${his} balls to balloon for extra cum production.</span>`);
								tank.balls += 16;
							}
							if (tank.dick < 10 && random(1, 100) > 20) {
								r.push(`The excess testosterone-laced growth hormones <span class="green">cause ${his} penis to swell.</span>`);
								tank.dick += 4;
							}
						} else if (V.incubator.upgrade.speed === 18) {
							if (tank.balls < 40 && random(1, 100) > 10) {
								r.push(`The excess testosterone-laced growth hormones <span class="green">cause ${his} balls to balloon for extra cum production.</span>`);
								tank.balls += 9;
							}
							if (tank.dick < 10 && random(1, 100) > 30) {
								r.push(`The excess testosterone-laced growth hormones <span class="green">cause ${his} penis to swell.</span>`);
								tank.dick += 3;
							}
						} else if (V.incubator.upgrade.speed === 9) {
							if (tank.balls < 40 && random(1, 100) > 20) {
								r.push(`The excess testosterone-laced growth hormones <span class="green">cause ${his} balls to balloon for extra cum production.</span>`);
								tank.balls += 4;
							}
							if (tank.dick < 10 && random(1, 100) > 50) {
								r.push(`The excess testosterone-laced growth hormones <span class="green">cause ${his} penis to swell.</span>`);
								tank.dick += 2;
							}
						} else if (V.incubator.upgrade.speed === 6) {
							if (tank.balls < 40 && random(1, 100) > 30) {
								r.push(`The excess testosterone-laced growth hormones <span class="green">cause ${his} balls to balloon for extra cum production.</span>`);
								tank.balls += 2;
							}
							if (tank.dick < 10 && random(1, 100) > 70) {
								r.push(`The excess testosterone-laced growth hormones <span class="green">cause ${his} penis to swell.</span>`);
								tank.dick++;
							}
						} else if (V.incubator.upgrade.speed === 5) {
							if (tank.balls < 40 && random(1, 100) > 30) {
								r.push(`The excess testosterone-laced growth hormones <span class="green">cause ${his} balls to balloon for extra cum production.</span>`);
								tank.balls++;
							}
							if (tank.dick < 10 && random(1, 100) > 80) {
								r.push(`The excess testosterone-laced growth hormones <span class="green">cause ${his} penis to swell.</span>`);
								tank.dick++;
							}
						}
					}
				} else if (tank.incubatorSettings.weight === 2) {
					r.push(`Combined with the healthy food provided to ${him}, ${his} body grows readily.`);
					if (tank.ovaries === 1) {
						tank.pubertyXX = 1;
						if (tank.hormoneBalance < 500) {
							tank.hormoneBalance += 100;
						}
						tank.readyOva = V.seeHyperPreg === 1 ? random(15, 25) : random(2, 6);
						if (tank.geneMods.NCS === 1) {
							/* NCS blocks hormonal growth of all secondary sexual characteristics */
							r.push(`${His} <span class="orange">NCS blocks all growth</span> despite the excess estrogen-laced growth hormones flooding ${his} body.`);
						} else if (V.incubator.upgrade.speed === 52) {
							if (tank.boobs < 4000) {
								r.push(`The excess estrogen-laced growth hormones <span class="green">rapidly balloon ${his} breasts.</span>`);
								tank.boobs += 1000;
							}
							if (tank.hips < 2 && random(1, 100) > 70) {
								r.push(`The excess estrogen-laced growth hormones <span class="green">cause ${his} hips to widen for childbirth.</span>`);
								tank.hips++;
							}
							if (tank.butt < 8*rearQuirk && random(1, 100) > 50/rearQuirk) {
								r.push(`The excess estrogen-laced growth hormones <span class="green">cause ${his} rear to grow fatter.</span>`);
								tank.butt += 3;
							}
						} else if (V.incubator.upgrade.speed === 18) {
							if (tank.boobs < 4000) {
								r.push(`The excess estrogen-laced growth hormones <span class="green">rapidly balloon ${his} breasts.</span>`);
								tank.boobs += 500;
							}
							if (tank.hips < 2 && random(1, 100) > 80) {
								r.push(`The excess estrogen-laced growth hormones <span class="green">cause ${his} hips to widen for childbirth.</span>`);
								tank.hips++;
							}
							if (tank.butt < 8*rearQuirk && random(1, 100) > 50/rearQuirk) {
								r.push(`The excess estrogen-laced growth hormones <span class="green">cause ${his} rear to grow fatter.</span>`);
								tank.butt++;
							}
						} else if (V.incubator.upgrade.speed === 9) {
							if (tank.boobs < 4000) {
								r.push(`The excess estrogen-laced growth hormones <span class="green">rapidly balloon ${his} breasts.</span>`);
								tank.boobs += 200;
							}
							if (tank.hips < 2 && random(1, 100) > 90) {
								r.push(`The excess estrogen-laced growth hormones <span class="green">cause ${his} hips to widen for childbirth.</span>`);
								tank.hips++;
							}
							if (tank.butt < 8*rearQuirk && random(1, 100) > 60/rearQuirk) {
								r.push(`The excess estrogen-laced growth hormones <span class="green">cause ${his} rear to grow fatter.</span>`);
								tank.butt++;
							}
						} else if (V.incubator.upgrade.speed === 6) {
							if (tank.boobs < 4000) {
								r.push(`The excess estrogen-laced growth hormones <span class="green">rapidly balloon ${his} breasts.</span>`);
								tank.boobs += 100;
							}
							if (tank.hips < 2 && random(1, 100) > 95) {
								r.push(`The excess estrogen-laced growth hormones <span class="green">cause ${his} hips to widen for childbirth.</span>`);
								tank.hips++;
							}
							if (tank.butt < 8*rearQuirk && random(1, 100) > 70/rearQuirk) {
								r.push(`The excess estrogen-laced growth hormones <span class="green">cause ${his} rear to grow fatter.</span>`);
								tank.butt++;
							}
						} else if (V.incubator.upgrade.speed === 5) {
							if (tank.boobs < 4000) {
								r.push(`The excess estrogen-laced growth hormones <span class="green">rapidly balloon ${his} breasts.</span>`);
								tank.boobs += 100;
							}
							if (tank.hips < 2 && random(1, 100) > 95) {
								r.push(`The excess estrogen-laced growth hormones <span class="green">cause ${his} hips to widen for childbirth.</span>`);
								tank.hips++;
							}
							if (tank.butt < 8*rearQuirk && random(1, 100) > 80/rearQuirk) {
								r.push(`The excess estrogen-laced growth hormones <span class="green">cause ${his} rear to grow fatter.</span>`);
								tank.butt++;
							}
						}
					} else if (tank.balls > 0) {
						tank.pubertyXY = 1;
						if (tank.hormoneBalance > -500) {
							tank.hormoneBalance -= 100;
						}
						if (tank.geneMods.NCS === 1) {
							/* NCS blocks hormonal growth of all secondary sexual characteristics */
							r.push(`${His} <span class="orange">NCS blocks all growth</span> despite the excess testosterone-laced growth hormones flooding ${his} body.`);
						} else if (V.incubator.upgrade.speed === 52) {
							if (tank.balls < 10) {
								r.push(`The excess testosterone-laced growth hormones <span class="green">cause ${his} balls to balloon for extra cum production.</span>`);
								tank.balls += 3;
							}
							if (tank.dick < 7 && random(1, 100) > 20) {
								r.push(`The excess testosterone-laced growth hormones <span class="green">cause ${his} penis to swell.</span>`);
								tank.dick += 2;
							}
						} else if (V.incubator.upgrade.speed === 18) {
							if (tank.balls < 10 && random(1, 100) > 10) {
								r.push(`The excess testosterone-laced growth hormones <span class="green">cause ${his} balls to balloon for extra cum production.</span>`);
								tank.balls += 2;
							}
							if (tank.dick < 7 && random(1, 100) > 30) {
								r.push(`The excess testosterone-laced growth hormones <span class="green">cause ${his} penis to swell.</span>`);
								tank.dick++;
							}
						} else if (V.incubator.upgrade.speed === 9) {
							if (tank.balls < 10 && random(1, 100) > 20) {
								r.push(`The excess testosterone-laced growth hormones <span class="green">cause ${his} balls to balloon for extra cum production.</span>`);
								tank.balls++;
							}
							if (tank.dick < 7 && random(1, 100) > 50) {
								r.push(`The excess testosterone-laced growth hormones <span class="green">cause ${his} penis to swell.</span>`);
								tank.dick++;
							}
						} else if (V.incubator.upgrade.speed === 6) {
							if (tank.balls < 10 && random(1, 100) > 30) {
								r.push(`The excess testosterone-laced growth hormones <span class="green">cause ${his} balls to balloon for extra cum production.</span>`);
								tank.balls++;
							}
							if (tank.dick < 7 && random(1, 100) > 70) {
								r.push(`The excess testosterone-laced growth hormones <span class="green">cause ${his} penis to swell.</span>`);
								tank.dick++;
							}
						} else if (V.incubator.upgrade.speed === 5) {
							if (tank.balls < 10 && random(1, 100) > 30) {
								r.push(`The excess testosterone-laced growth hormones <span class="green">cause ${his} balls to balloon for extra cum production.</span>`);
								tank.balls++;
							}
							if (tank.dick < 7 && random(1, 100) > 80) {
								r.push(`The excess testosterone-laced growth hormones <span class="green">cause ${his} penis to swell.</span>`);
								tank.dick++;
							}
						}
					}
				} else {
					r.push(`Since ${his} body has little to work with, ${his} growth is fairly minor.`);
					if (tank.ovaries === 1) {
						tank.pubertyXX = 1;
						if (tank.hormoneBalance < 500) {
							tank.hormoneBalance += 100;
						}
						tank.readyOva = V.seeHyperPreg === 1 ? random(10, 15) : random(2, 4);
						if (tank.geneMods.NCS === 1) {
							/* NCS blocks hormonal growth of all secondary sexual characteristics */
							r.push(`${His} <span class="orange">NCS blocks all growth</span> despite the excess estrogen-laced growth hormones flooding ${his} body.`);
						} else if (V.incubator.upgrade.speed === 52) {
							if (tank.boobs < 2000) {
								r.push(`The excess estrogen-laced growth hormones <span class="green">rapidly balloon ${his} breasts.</span>`);
								tank.boobs += 700;
							}
							if (tank.hips < 2 && random(1, 100) > 90) {
								r.push(`The excess estrogen-laced growth hormones <span class="green">cause ${his} hips to widen for childbirth.</span>`);
								tank.hips = Math.clamp(tank.hips + 2, -2, 2);
							}
							if (tank.butt < 6*rearQuirk && random(1, 100) > 70/rearQuirk) {
								r.push(`The excess estrogen-laced growth hormones <span class="green">cause ${his} rear to grow fatter.</span>`);
								tank.butt += 2;
							}
						} else if (V.incubator.upgrade.speed === 18) {
							if (tank.boobs < 2000) {
								r.push(`The excess estrogen-laced growth hormones <span class="green">rapidly balloon ${his} breasts.</span>`);
								tank.boobs += 200;
							}
							if (tank.hips < 2 && random(1, 100) > 80) {
								r.push(`The excess estrogen-laced growth hormones <span class="green">cause ${his} hips to widen for childbirth.</span>`);
								tank.hips++;
							}
							if (tank.butt < 6*rearQuirk && random(1, 100) > 70/rearQuirk) {
								r.push(`The excess estrogen-laced growth hormones <span class="green">cause ${his} rear to grow fatter.</span>`);
								tank.butt++;
							}
						} else if (V.incubator.upgrade.speed === 9) {
							if (tank.boobs < 2000) {
								r.push(`The excess estrogen-laced growth hormones <span class="green">rapidly balloon ${his} breasts.</span>`);
								tank.boobs += 50;
							}
							if (tank.hips < 2 && random(1, 100) > 80) {
								r.push(`The excess estrogen-laced growth hormones <span class="green">cause ${his} hips to widen for childbirth.</span>`);
								tank.hips++;
							}
							if (tank.butt < 6*rearQuirk && random(1, 100) > 90/rearQuirk) {
								r.push(`The excess estrogen-laced growth hormones <span class="green">cause ${his} rear to grow fatter.</span>`);
								tank.butt++;
							}
						} else if (V.incubator.upgrade.speed === 6) {
							if (tank.boobs < 2000) {
								r.push(`The excess estrogen-laced growth hormones <span class="green">rapidly grow ${his} breasts.</span>`);
								tank.boobs += 20;
							}
							if (tank.hips < 2 && random(1, 100) > 90) {
								r.push(`The excess estrogen-laced growth hormones <span class="green">cause ${his} hips to widen for childbirth.</span>`);
								tank.hips++;
							}
							if (tank.butt < 6*rearQuirk && random(1, 100) > 90/rearQuirk) {
								r.push(`The excess estrogen-laced growth hormones <span class="green">cause ${his} rear to grow fatter.</span>`);
								tank.butt++;
							}
						} else if (V.incubator.upgrade.speed === 5) {
							if (tank.boobs < 2000) {
								r.push(`The excess estrogen-laced growth hormones <span class="green">rapidly grow ${his} breasts.</span>`);
								tank.boobs += 10;
							}
							if (tank.hips < 2 && random(1, 100) > 95) {
								r.push(`The excess estrogen-laced growth hormones <span class="green">cause ${his} hips to widen for childbirth.</span>`);
								tank.hips++;
							}
							if (tank.butt < 6*rearQuirk && random(1, 100) > 90/rearQuirk) {
								r.push(`The excess estrogen-laced growth hormones <span class="green">cause ${his} rear to grow fatter.</span>`);
								tank.butt++;
							}
						}
					} else if (tank.balls > 0) {
						tank.pubertyXY = 1;
						if (tank.hormoneBalance > -500) {
							tank.hormoneBalance -= 100;
						}
						if (tank.geneMods.NCS === 1) {
							/* NCS blocks hormonal growth of all secondary sexual characteristics */
							r.push(`${His} <span class="orange">NCS blocks all growth</span> despite the excess testosterone-laced growth hormones flooding ${his} body.`);
						} else if (V.incubator.upgrade.speed === 52) {
							if (tank.balls < 6) {
								r.push(`The excess testosterone-laced growth hormones <span class="green">cause ${his} balls to grow for extra cum production.</span>`);
								tank.balls += 2;
							}
							if (tank.dick < 4 && random(1, 100) > 60) {
								r.push(`The excess testosterone-laced growth hormones <span class="green">cause ${his} penis to swell.</span>`);
								tank.dick++;
							}
						} else if (V.incubator.upgrade.speed === 18) {
							if (tank.balls < 6 && random(1, 100) > 50) {
								r.push(`The excess testosterone-laced growth hormones <span class="green">cause ${his} balls to grow for extra cum production.</span>`);
								tank.balls++;
							}
							if (tank.dick < 4 && random(1, 100) > 60) {
								r.push(`The excess testosterone-laced growth hormones <span class="green">cause ${his} penis to swell.</span>`);
								tank.dick++;
							}
						} else if (V.incubator.upgrade.speed === 9) {
							if (tank.balls < 6 && random(1, 100) > 60) {
								r.push(`The excess testosterone-laced growth hormones <span class="green">cause ${his} balls to balloon for extra cum production.</span>`);
								tank.balls++;
							}
							if (tank.dick < 4 && random(1, 100) > 70) {
								r.push(`The excess testosterone-laced growth hormones <span class="green">cause ${his} penis to swell.</span>`);
								tank.dick += 2;
							}
						} else if (V.incubator.upgrade.speed === 6) {
							if (tank.balls < 6 && random(1, 100) > 70) {
								r.push(`The excess testosterone-laced growth hormones <span class="green">cause ${his} balls to grow for extra cum production.</span>`);
								tank.balls++;
							}
							if (tank.dick < 4 && random(1, 100) > 80) {
								r.push(`The excess testosterone-laced growth hormones <span class="green">cause ${his} penis to swell.</span>`);
								tank.dick++;
							}
						} else if (V.incubator.upgrade.speed === 5) {
							if (tank.balls < 6 && random(1, 100) > 80) {
								r.push(`The excess testosterone-laced growth hormones <span class="green">cause ${his} balls to grow for extra cum production.</span>`);
								tank.balls++;
							}
							if (tank.dick < 4 && random(1, 100) > 90) {
								r.push(`The excess testosterone-laced growth hormones <span class="green">cause ${his} penis to swell.</span>`);
								tank.dick++;
							}
						}
					}
				}
			} else if (tank.incubatorSettings.reproduction === 1) {
				r.push(`${His} hormone levels are being carefully managed, <span class="green">encouraging early puberty.</span>`);
				if (tank.ovaries === 1) {
					tank.pubertyXX = 1;
					tank.hormoneBalance = 250;
					if (tank.geneMods.NCS === 1) {
						/* NCS blocks hormonal growth of all secondary sexual characteristics */
						r.push(`${His} <span class="orange">NCS blocks growth</span> despite the added estrogen.`);
					} else {
						// Inside the tank we cannot reach ridiculous sizes
						const origBoobs = tank.boobs;
						const boobsTarget = Math.min(tank.natural.boobs, 1200);
						if (tank.boobs < boobsTarget * 0.95) {
							tank.boobs += random(
								Math.floor(boobsTarget * 0.1),
								Math.floor(boobsTarget * 0.2)
							);
							// Once we reach max size, make regenerate the value, so we don't have any bias left over
							// from the random process before.
							if (tank.boobs >= boobsTarget * 0.95) {
								tank.boobs = random(boobsTarget * 0.95, boobsTarget * 1.05);
							}
						}
						if (tank.boobs < 400 && random(1, 100) > 60) {
							tank.boobs += 50;
						}
						if (tank.boobs > origBoobs) {
							r.push(`The added estrogen <span class="green">causes ${his} breasts to swell.</span>`);
						}
						if (tank.hips < 2 && random(1, 100) > 90) {
							r.push(`The added estrogen <span class="green">causes ${his} hips to widen.</span>`);
							tank.hips++;
						}
						if (tank.butt < 5 * rearQuirk && random(1, 100) > 80 / rearQuirk) {
							r.push(`The added estrogen <span class="green">causes ${his} butt to grow.</span>`);
							tank.butt++;
						}
					}
				} else if (tank.balls > 0) {
					tank.pubertyXY = 1;
					tank.hormoneBalance = -250;
					if (tank.geneMods.NCS === 1) {
						/* NCS blocks hormonal growth of all secondary sexual characteristics */
						r.push(`${His} <span class="orange">NCS blocks all growth</span> despite the added testosterone.`);
					} else {
						if (tank.balls < 3 && random(1, 100) > 80) {
							r.push(`The added testosterone <span class="green">causes ${his} balls to swell.</span>`);
							tank.balls++;
						}
						if (tank.dick < 3 && random(1, 100) > 60) {
							r.push(`The added testosterone <span class="green">causes ${his} penis to grow.</span>`);
							tank.dick++;
						}
					}
				}
				tank.readyOva = 0;
			} else {
				if (tank.hormoneBalance > 100) {
					tank.hormoneBalance -= 50;
				} else if (tank.hormoneBalance < -100) {
					tank.hormoneBalance += 50;
				}
				if (tank.balls > 0) {
					if (tank.balls > 1) {
						tank.balls -= 5;
					}
					if (tank.dick > 1) {
						tank.dick -= 5;
					}
					if (tank.balls <= 0) {
						tank.balls = 1;
					}
					if (tank.dick <= 0) {
						tank.dick = 1;
					}
				}
				if (tank.boobs > 0) {
					tank.boobs -= 500;
				}
				if (tank.butt > 0) {
					tank.butt -= 4;
				}
				tank.readyOva = 0;
			}
		} else {
			if (tank.hormoneBalance > 100) {
				tank.hormoneBalance -= 50;
			} else if (tank.hormoneBalance < -100) {
				tank.hormoneBalance += 50;
			}
			if (tank.balls > 0) {
				if (tank.balls > 1) {
					tank.balls -= 5;
				}
				if (tank.dick > 1) {
					tank.dick -= 5;
				}
				if (tank.balls <= 0) {
					tank.balls = 1;
				}
				if (tank.dick <= 0) {
					tank.dick = 1;
				}
			}
			if (tank.boobs > 0) {
				tank.boobs -= 500;
			}
			if (tank.butt > 0) {
				tank.butt -= 4;
			}
		}
		App.Events.addNode(entry, r, "div");

		if (tank.incubatorSettings.reproduction === 2) {
			tank.energy = 80;
			tank.need = 100;
		} else if (tank.incubatorSettings.reproduction === 1) {
			tank.energy = 50;
			tank.need = 20;
		} else {
			tank.energy = 0;
			tank.need = 0;
		}

		r = [];
		if (tank.incubatorSettings.pregAdaptation > 0 && tank.incubatorSettings.growTime > 0) {
			if (tank.incubatorSettings.pregAdaptationInWeek <= 0) {
				r.push(`${His} physique will be mature enough on release that the incubator's reproductive capacity system would have no effect on ${him} at current settings, so it is unused.`);
			} else {
				r.push(`The incubator is working on adapting ${his} abdomen and reproductive organs for future pregnancies.`);

				let weekAdapt = tank.incubatorSettings.pregAdaptationInWeek * V.incubator.upgrade.speed;
				if (isNaN(weekAdapt)) {
					/* NaN check AFTER multiply operation, against it result is critical here. Need to be absolutely sure about this operation, not about just tank property itself. This give me two very unpleasant hours to catch this */
					tank.incubatorSettings.pregAdaptationInWeek = (15000 / 2000 - tank.pregAdaptation) / tank.incubatorSettings.growTime;
				}
				weekAdapt = tank.incubatorSettings.pregAdaptationInWeek * V.incubator.upgrade.speed;
				/* Now it should be fine */
				weekAdapt *= 1 + (tank.incubatorSettings.reproduction / 5);
				weekAdapt *= 1 + (tank.hormoneBalance / 1500);
				tank.pregAdaptation += weekAdapt;
				/* here goes side effect from intense and extreme settings: */
				if (random(1, 100) <= (tank.incubatorSettings.pregAdaptationPower - 1) * (V.incubator.upgrade.speed / 2 + 1)) {
					switch (random(1, 9)) { /* side effect selection*/
						case 1:
							if (tank.preg > -2) {
								tank.preg = -2;
								r.push(`It caused <span class="red">reproductive damage</span> when excessive meddling damaged an organ.`);
							}
							break;
						case 2:
							if (((tank.ovaries === 1 || tank.mpreg === 1) && tank.preg > -3) || (tank.balls > 0 && tank.ballType !== "sterile")) {
								if (tank.ovaries === 1 || tank.mpreg === 1) {
									tank.preg = -3;
								}
								if (tank.balls > 0) {
									tank.ballType = "sterile";
								}
								r.push(`It caused <span class="red">severe reproductive damage</span> when excessive hormones shut down the associated organs.`);
							}
							break;
						case 3:
							if (tank.lactation < 1) {
								tank.lactation = 1;
								r.push(`It has <span class="orange">triggered a hormonal disorder,</span> causing ${his} breast glands to begin producing milk.`);
							}
							break;
						case 4:
							if (tank.bellySag < 100 || tank.bellySagPreg < 100) {
								tank.bellySag = 100;
								tank.bellySagPreg = 100;
								r.push(`It activated emergency protocols when overpressure to ${his} abdominal tissues and skin reached critical levels. ${His} belly has lost muscle tone and has begun to strongly sag.`);
							}
							break;
						case 5:
							tank.health.condition -= 15;
							r.push(`Overzealous prodding caused some <span class="red">internal bleeding.</span>`);
							break;
						case 6:
							if (tank.weight < 200) {
								tank.weight += 50;
								r.push(`An unexpected shift in hormones spurred <span class="red">massive weight gain</span> before it could be corrected.`);
							}
							break;
						case 7:
							if (tank.weight > -100) {
								tank.weight -= 50;
								r.push(`An unexpected shift in hormones spurred <span class="red">massive weight loss</span> before it could be corrected.`);
							}
							break;
						case 8:
							tank.boobs += 5000;
							tank.boobShape = BreastShape.SAGGY;
							r.push(`An unexpected shift in hormones encouraged <span class="green">explosive breast growth</span> before it could be corrected.`);
							break;
						case 9:
							if (tank.hips < 3) {
								tank.hips = 3;
								r.push(`A malfunction in the skeletal reconstruction software caused it to <span class="green">overwiden ${his} hips.</span>`);
							}
							break;
					}
				}
			}
		}
		App.Events.addNode(entry, r, "div");

		if (tank.preg > 0) {
			App.UI.DOM.appendNewElement("span", entry, `The incubator is displaying an alert that ${he} may be pregnant.`, 'red');
		}

		tank.weight = Math.clamp(tank.weight, -100, 200);
		tank.muscles = Math.clamp(tank.muscles, -100, 100);
		tank.dick = Math.clamp(tank.dick, 0, 10);
		tank.hips = Math.clamp(tank.hips, -2, 3);
		tank.balls = Math.clamp(tank.balls, 0, 40);
		tank.boobs = Math.clamp(tank.boobs, 10, 30000);
		tank.butt = Math.clamp(tank.butt, 0, 20);
		tank.height = Math.clamp(tank.height, 0, 274);
		tank.hormoneBalance = Math.clamp(tank.hormoneBalance, -500, 500);
		tank.foreskin = tank.dick;	/* simple, clean way of making sure foreskins and scrotums grow appropriately */
		tank.scrotum = tank.balls;	/* if we want dicks/balls to outgrow foreskins/scrotums, this will have to be removed */
		if (tank.pubertyXX === 1) {	/* workaround due to puberty() being skipped */
			tank.pubertyAgeXX = tank.physicalAge - 1;
			tank.geneticQuirks.gigantomastia = Math.min(tank.geneticQuirks.gigantomastia, 2);
			tank.geneticQuirks.macromastia = Math.min(tank.geneticQuirks.macromastia, 2);
			tank.geneticQuirks.galactorrhea = Math.min(tank.geneticQuirks.galactorrhea, 2);
		}
		if (tank.pubertyXY === 1) {
			tank.pubertyAgeXY = tank.physicalAge - 1;
			tank.geneticQuirks.galactorrhea = Math.min(tank.geneticQuirks.galactorrhea, 2);
		}
	}

	return frag;
};

repo_name: Arkerthan/fc

license: mit


code:
App.EndWeek.masterSuiteReport = function() {
	const frag = new DocumentFragment();
	const concubine = S.Concubine ? App.SlaveAssignment.reportSlave(S.Concubine) : undefined;
	const slaves = App.Utils.sortedEmployees(App.Entity.facilities.masterSuite);
	const msAvg = App.Utils.masterSuiteAverages();

	const pregnantSlaves = V.masterSuiteUpgradePregnancy ? slaves.filter((s) => s.pregKnown > 0).length : 0;

	function concubineText() {
		const frag = new DocumentFragment();
		let r = [];
		const {He, he, his, him, himself} = getPronouns(S.Concubine);
		r.push(App.SlaveAssignment.saSlaveIntro(S.Concubine, `is serving as your concubine in ${V.masterSuiteName}.`));
		r.push(`More than any other slave, ${his} sexual brilliance and physical appeal are <span class="reputation inc">critical</span> to your reputation.`);

		if (S.Concubine.prestigeDesc === "You bankrupted and enslaved $him in revenge for $his part in the attack on your arcology by the Daughters of Liberty." && S.Concubine.newGamePlus === 0) {
			r.push(`${He} was once your rival, and your relationship is widely thought to be <span class="reputation inc">the perfect modern romance.</span>`);
			repX(500, "concubine", S.Concubine);
		}
		if (S.Concubine.prestige > 0) {
			repX(500 * S.Concubine.prestige, "concubine", S.Concubine);
			if (V.verboseDescriptions === 1 || (V.experimental.favSeparateReport === 1 && V.favorites.includes(S.Concubine.ID))) {
				r.push(`Keeping such a prestigious slave as your concubine <span class="reputation inc">adds to your fame.</span>`);
				if (S.Concubine.fetish !== Fetish.MINDBROKEN) {
					if (S.Concubine.prestigeDesc === "$He is a famed Free Cities whore, and commands top prices.") {
						r.push(`When ${he} has a free moment, ${he} refines ${his} flexibility so that ${he} is prepared`);
						if (isPlayerFrigid()) {
							r.push(`to give you the greatest sex of your life the moment you feel the slightest urge.`);
						} else {
							r.push(`for any sexual position you can think of, and many more that ${he} researched just for your pleasure.`);
						}
					}
					if (S.Concubine.prestigeDesc === "$He is a famed Free Cities slut, and can please anyone.") {
						r.push(`When ${he} has a free moment, ${he} pretties ${himself} up so that ${he} may be as beautiful as possible to make you look even better.`);
					}
					if (S.Concubine.prestigeDesc === "$He is remembered for winning best in show as a cockmilker.") {
						if (S.Concubine.balls > 0) {
							if (S.Concubine.balls.vasectomy !== 1) {
								if (isVirile(S.Concubine)) {
									if (S.Concubine.geneMods.aggressiveSperm === 1 && isFertile(V.PC) && V.seePreg) {
										r.push(`${He} tries ${his} hardest to not leave wriggling puddles of sperm in the bed, knowing that there's a high chance one of them will make it's way into your fertile womb, but finds it difficult to get them all when ${he} has to constantly relieve ${himself}.`);
										if (S.Concubine.fetish === Fetish.PREGNANCY) {
											if (S.Concubine.fetishKnown) {
												r.push(`The thought of your stomach swelling large with ${his} children doesn't help matters.`);
											} else {
												r.push(`You can't help but get the feeling ${he} would like that.`);
											}
											tryKnockMeUp(V.PC, -70, 2, S.Concubine);
										} else {
											tryKnockMeUp(V.PC, -80, 2, S.Concubine);
										}
									} else if (cumLoad(V.PC) > cumLoad(S.Concubine) && V.PC.balls > 0) {
										r.push(`When ${he} has a free moment, ${he} researches ways to increase the size of ${his} loads; ${he} is more than a little jealous that ${his} champion cumshots are second to yours.`);
									} else if (S.Concubine.balls > 10 && S.Concubine.prostate > 1) {
										r.push(`${He} does ${his} best to prevent ${himself} from making a mess when you don't want one. When ${he} has free time, ${he} researches new techniques to make use of ${his} huge loads to entertain you.`);
									} else {
										r.push(`When ${he} has a free moment, ${he} researches ways to increase the size of ${his} loads for you; ${he} dreams of the day ${he} can show you just what ${he} was capable of.`);
									}
								} else {
									r.push(`${He} can't wait to blow huge loads for you and yearns for the day that ${he} sexually matures enough to do so.`);
								}
							} else {
								r.push(`${He} wishes ${he} could blow huge loads for you, but with ${his} vas deferens snipped, it's simply impossible.`);
							}
						} else {
							r.push(`${He} wishes ${he} could blow huge loads for you, but without balls, there is little ${he} can do.`);
						}
					}
					if (S.Concubine.prestigeDesc === "$He is remembered for winning best in show as a dairy cow.") {
						if (milkLoad(V.PC) > milkLoad(S.Concubine) && S.Concubine.lactation > 0 && V.PC.lactation > 0) {
							r.push(`When ${he} has free time, ${he} is driven by ${his} competitive spirit to research ways to increase ${his} milk production in an effort to rival yours.`);
						} else if (S.Concubine.lactation > 1 || S.Concubine.lactationAdaptation > 90) {
							r.push(`${He} does ${his} best to prevent ${himself} from making a mess when you don't want one. When ${he} has free time, ${he} researches new techniques to make use of ${his} excessive milk to entertain you.`);
						} else if (S.Concubine.lactation > 0) {
							r.push(`${He} does ${his} best to prevent ${himself} from making a mess when you don't want one. When ${he} has free time, ${he} researches new techniques to make use of ${his} breast milk to entertain you.`);
						} else {
							r.push(`${He} wishes ${he} could lactate for you, but ${he} has dried up since ${his} glory days.`);
						}
					}
					if (S.Concubine.prestigeDesc === "$He is remembered for winning best in show as a breeder.") {
						if (S.Concubine.bellyPreg >= 5000) {
							if (V.PC.bellyPreg >= 5000) {
								if (V.PC.womb.length > S.Concubine.womb.length) {
									r.push(`When ${he} has a free moment, ${he} researches methods to assure ${he}'ll have more children with ${his} next pregnancy; ${he} can't help but be jealous over your heavily laden womb.`);
								} else {
									r.push(`When ${he} has a free moment, ${he} refines ${his} flexibility so that ${he} can perform any sexual position possible for ${him} in ${his} motherly state. ${He} takes the time to look up new positions to accommodate the large amount of belly shared between you both.`);
								}
							} else {
								r.push(`When ${he} has a free moment, ${he} refines ${his} flexibility so that ${he} can perform any sexual position possible for ${him} in ${his} motherly state. ${He} takes the time to look up new positions to work around ${his} growing pregnancy.`);
							}
						} else if (isFertile(S.Concubine) || S.Concubine.preg > 0) {
							r.push(`When ${he} has a free moment, ${he} refines ${his} flexibility so that ${he} is prepared for any sexual position you can think of, no matter how heavy ${he} becomes with children.`);
						} else {
							r.push(`When ${he} has a free moment, ${he} researches ways to restore ${his} fertility; ${he} dreams of the day ${he} can carry`);
							if (V.PC.dick !== 0) {
								r.push(`your children.`);
							} else {
								r.push(`children for you.`);
							}
						}
					}
				} else {
					if (S.Concubine.prestigeDesc === "$He is remembered for winning best in show as a cockmilker.") {
						if (S.Concubine.geneMods.aggressiveSperm === 1 && isVirile(S.Concubine) && isFertile(V.PC) && V.seePreg) {
							r.push(`${He} has a very bad habit of leaving large puddles of aggressive sperm around the room, and that's not counting the nocturnal emissions. You know ${he} can't help it,`);
							tryKnockMeUp(V.PC, 25, 2, S.Concubine);
							if (V.PC.preg > 0) {
								r.push(`just as you can't help <span class="pregnancy">becoming pregnant.</span>`);
							} else {
								r.push(`but it still feels really weird as it crawls across you.`);
							}
						}
					}
				}
			}
		}
		if (S.Concubine.porn.prestige > 2) {
			repX(800, "concubine", S.Concubine);
			r.push(`Having a porn star as your personal bed warmer <span class="reputation inc">reflects on your standing.</span> Your citizens can only wonder at what kinky things happen behind closed doors.`);
		} else if (S.Concubine.porn.prestige > 1) {
			repX(300, "concubine", S.Concubine);
			r.push(`Having a rising porn star as your personal bed warmer <span class="reputation inc">reflects on your standing.</span>`);
		}
		if (S.Concubine.counter.oral + S.Concubine.counter.anal + S.Concubine.counter.vaginal + S.Concubine.counter.mammary + S.Concubine.counter.penetrative > 1000) {
			if (V.verboseDescriptions === 1 || (V.experimental.favSeparateReport === 1 && V.favorites.includes(S.Concubine.ID))) {
				r.push(`Many citizens`);
				if (S.Concubine.counter.publicUse > 10) {
					r.push(`remember having had ${him} themselves, and`);
				}
				r.push(`<span class="reputation inc">respectfully</span> envy you ${his} exclusive company.`);
			}
			repX(300, "concubine", S.Concubine);
		}
		/* Perform facility based rule changes - FIXME - dev/trust living condition changes probably should be in saRules; there's no text reporting these changes here */
		// move the stat changes there too!
		if (V.masterSuiteUpgradeLuxury > 0) {
			S.Concubine.rules.living = "luxurious";
			S.Concubine.devotion += 4;
			S.Concubine.trust += 4;
		} else {
			S.Concubine.rules.living = "normal";
			S.Concubine.devotion += 2;
			S.Concubine.trust += 2;
		}
		repX(Beauty(S.Concubine) * 5 + (adjustedPenSkill(S.Concubine, true) || 0) + (S.Concubine.skill.vaginal || 0) + (S.Concubine.skill.anal || 0) + (S.Concubine.skill.oral || 0) + (S.Concubine.skill.whoring || 0) + (S.Concubine.skill.entertainment || 0), "concubine", S.Concubine);

		App.Events.addNode(frag, r);

		return frag;
	}

	/** Generate text specific to non-concubine MS slaves
	 * @param {App.Entity.SlaveState} slave
	 * @returns {DocumentFragment}
	 */
	function nonConcubineText(slave) {
		const frag = new DocumentFragment();
		frag.append(App.SlaveAssignment.saSlaveIntro(slave, `sees to your pleasure in ${V.masterSuiteName}.`));

		/* Perform facility based rule changes - FIXME - dev/trust living condition changes probably should be in saRules; there's no text reporting these changes here */
		if (V.masterSuiteUpgradeLuxury === 1) {
			slave.rules.living = "luxurious";
			if (slave.devotion <= 95) {
				slave.devotion += 2;
			}
			if (slave.trust < 60) {
				slave.trust++;
			}
		} else if (V.masterSuiteUpgradeLuxury === 2) {
			slave.rules.living = "luxurious";
			if (slave.energy > 90) {
				if (slave.devotion <= 95) {
					slave.devotion += 2;
				}
				if (slave.trust <= 95) {
					slave.trust += 2;
				}
			} else {
				if (slave.devotion <= 60) {
					slave.devotion++;
				}
				if (slave.trust < 60) {
					slave.trust++;
				}
			}
		} else {
			slave.rules.living = "spare";
			if (slave.devotion <= 20 && slave.trust >= -20) {
				slave.devotion -= 2;
				slave.trust -= 5;
			} else if (slave.devotion <= 60) {
				slave.devotion += 2;
			} else if (slave.devotion > 60) {
				slave.devotion -= 2;
			}
			if (slave.trust < 60) {
				slave.trust++;
			}
		}
		// decoration dev bonus (reported at end)
		if (V.masterSuiteDecoration !== "standard") {
			slave.devotion++;
		}

		return frag;
	}

	/** Generate text shared by concubine and non-concubine MS slaves
	 * @param {FC.ReportSlave} slave
	 * @returns {DocumentFragment}
	 */
	function commonText(slave) {
		const frag = new DocumentFragment();
		let r = [];
		const {He, he, His, his, him, himself} = getPronouns(slave);

		if (V.masterSuiteUpgradeLuxury === 2 && msAvg.energy > random(40, 90) && slaves > 1) {
			const energy = (Math.ceil(slave.energy / 5) * 7);
			SimpleSexAct.Slave(slave, energy);
			if (canPenetrate(slave)) {
				actX(slave, "penetrative", random(1, 3) * energy);
			}
			if (slave.nipples === NippleShape.FUCKABLE && msAvg.dick > 2) {
				actX(slave, "mammary", random(1, 3) * energy);
			}
			if (slave.trust >= -20 && slave.devotion > -10 && slave.fetishStrength <= 95 && slave.fetish !== Fetish.MINDBROKEN) {
				const fetishChange = fetishChangeChance(slave);
				if (msAvg.milk > 2000 && fetishChange > random(0, 50)) {
					if (slave.fetish === Fetish.BOOBS) {
						if (V.verboseDescriptions === 1 || (V.experimental.favSeparateReport === 1 && V.favorites.includes(slave.ID))) {
							r.push(`${His}`);
						} else {
							r.push(`${slave.slaveName}'s`);
						}
						r.push(`<span class="fetish inc">boob fetish is strengthened</span> by the constant availability of milky nipples for ${him} to play with.`);
						slave.fetishStrength += 4;
					} else {
						if (V.verboseDescriptions === 1 || (V.experimental.favSeparateReport === 1 && V.favorites.includes(slave.ID))) {
							r.push(`${He}`);
						} else {
							r.push(slave.slaveName);
						}
						r.push(`<span class="fetish gain">acquires a boob fetish</span> after spending a lot of time in the fuckpit drinking from ${his} fellow fucktoys' tits.`);
						slave.fetish = Fetish.BOOBS;
						slave.fetishStrength = 65;
						slave.fetishKnown = 1;
					}
				} else if (msAvg.dick > 3 && slave.anus > 0 && canDoAnal(slave) && fetishChange > random(0, 50)) {
					r.push(`${He}`);
					if (slave.fetish === Fetish.BUTTSLUT) {
						r.push(`<span class="fetish inc">sinks farther into anal pleasure,</span> since ${he} spends ${his} time in the fuckpit with at least one of the many available cocks up ${his} butt.`);
						slave.fetishStrength += 4;
					} else {
						r.push(`<span class="fetish gain">acquires an anal fetish</span> after helplessly orgasming at the mercy of your many fucktoys eager to shove their big stiff penises up ${his} ass.`);
						slave.fetish = Fetish.BUTTSLUT;
						slave.fetishStrength = 65;
						slave.fetishKnown = 1;
					}
				} else if (msAvg.cum > 3 && fetishChange > random(0, 50)) {
					r.push(`${He}`);
					if (slave.fetish === Fetish.CUMSLUT) {
						r.push(`<span class="fetish inc">sinks farther into cum addiction,</span> since ${he} spends ${his} time in the fuckpit eagerly sucking down ejaculate, straight from the many sources.`);
						slave.fetishStrength += 4;
					} else {
						r.push(`<span class="fetish gain">acquires an oral fixation</span> after orally servicing your many fucktoys eager to blow their loads down ${his} throat.`);
						slave.fetish = Fetish.CUMSLUT;
						slave.fetishStrength = 65;
						slave.fetishKnown = 1;
					}
				} else if (msAvg.preg > 10 && fetishChange > random(0, 50)) {
					r.push(`${He}`);
					if (slave.fetish === Fetish.PREGNANCY) {
						r.push(`<span class="fetish inc">sinks farther into pregnancy obsession,</span> since ${he} never wants for a pregnant girl to make love to.`);
						slave.fetishStrength += 4;
					} else {
						r.push(`<span class="fetish gain">acquires a pregnancy fetish,</span> since many of ${his} sexual partners in the fuckpit are heavily pregnant.`);
						slave.fetish = Fetish.PREGNANCY;
						slave.fetishStrength = 65;
						slave.fetishKnown = 1;
					}
				} else if (msAvg.dom < -25 && fetishChange > random(0, 50)) {
					r.push(`${He}`);
					if (slave.fetish === Fetish.DOM) {
						r.push(`<span class="fetish inc">becomes more dominant,</span> since there are so many subs in the fuckpit who beg ${him} to fuck them hard.`);
						slave.fetishStrength += 4;
					} else {
						r.push(`<span class="fetish gain">becomes sexually dominant</span> after having fun satisfying the many submissive fucktoys in the fuckpit who beg ${him} to top them.`);
						slave.fetish = Fetish.DOM;
						slave.fetishStrength = 65;
						slave.fetishKnown = 1;
					}
				} else if (msAvg.dom > 25 && fetishChange > random(0, 50)) {
					r.push(`${He}`);
					if (slave.fetish === Fetish.SUBMISSIVE) {
						r.push(`<span class="fetish inc">becomes even more submissive,</span> since there are so many doms in the fuckpit that ${he}'s often used by more than one at once.`);
						slave.fetishStrength += 4;
					} else {
						r.push(`<span class="fetish gain">becomes sexually submissive</span> after the many dominant slaves in the fuckpit hold ${him} down and use ${him} for their pleasure.`);
						slave.fetish = Fetish.SUBMISSIVE;
						slave.fetishStrength = 65;
						slave.fetishKnown = 1;
					}
				} else if (msAvg.sadism < -25 && fetishChange > random(0, 50)) {
					r.push(`${He}`);
					if (slave.fetish === Fetish.SADIST) {
						r.push(`<span class="fetish inc">becomes more sadistic,</span> since there are so many sluts in the fuckpit who will do anything for ${him} if ${he}'ll only spank them.`);
						slave.fetishStrength += 4;
					} else {
						r.push(`<span class="fetish gain">becomes a bit of a sadist</span> after ${he} notices that so many of ${his} fellow fucktoys cum harder if ${he} gives them a good`);
						if (hasAnyArms(slave)) {
							r.push(`slap.`);
						} else {
							r.push(`smack.`);
						}
						slave.fetish = Fetish.SADIST;
						slave.fetishStrength = 65;
						slave.fetishKnown = 1;
					}
				} else if (msAvg.sadism > 25 && fetishChange > random(0, 50)) {
					if (slave.fetish === Fetish.MASOCHIST) {
						if (V.verboseDescriptions === 1 || (V.experimental.favSeparateReport === 1 && V.favorites.includes(slave.ID))) {
							r.push(`${His}`);
						} else {
							r.push(`${slave.slaveName}'s`);
						}
						r.push(`<span class="fetish inc">pain addiction deepens,</span> since the fuckpit is full of ladies happy to fuck ${him} while ${he}.`);
						if (canTalk(slave)) {
							r.push(`screams.`);
						} else {
							r.push(`writhes.`);
						}
						slave.fetishStrength += 4;
					} else {
						if (V.verboseDescriptions === 1 || (V.experimental.favSeparateReport === 1 && V.favorites.includes(slave.ID))) {
							r.push(`${He}`);
						} else {
							r.push(slave.slaveName);
						}
						r.push(`<span class="fetish gain">learns masochism</span> after experiencing many orgasms under the exquisite sexual torture of the sadists in the fuckpit.`);
						slave.fetish = Fetish.MASOCHIST;
						slave.fetishStrength = 65;
						slave.fetishKnown = 1;
					}
				}
			}
			// If a slave isn't drinking it, then someone is probably squeezing it, hence no milk to be spared.
			// But doesn't the servants milking block run anyway? At the worst, it just loses any backed up milk.
			if (slave.lactation > 0) {
				slave.lactationDuration = 2;
				slave.boobs -= slave.boobsMilk;
				slave.boobsMilk = 0;
			}
			if (slave.energy.isBetween(40, 95)) {
				r.push(`Being a constant part of the fuckpit orgy <span class="libido inc">greatly heightens ${his} libido.</span>`);
				slave.energy += 2;
			}
			if (msAvg.aggroSperm > 2 && msAvg.cum > 4) {
				r.push(`A large number of aggressive sperm inhabit the fuckpit, eager to seek shelter in any unoccupied, and hopefully fertile, holes.`);
				tryKnockMeUp(slave, (-50 + msAvg.aggroSperm * 30), 2, slaves.filter((s) => s.geneMods.aggressiveSperm === 1 && isVirile(s)).random());
			}
			slave.need -= 50;
		}

		if (V.masterSuiteUpgradePregnancy === 1) {
			/* If they're not on fertility drugs and the toggle is active, stick them on (if they can take them). Otherwise take them off. */
			if (V.masterSuiteHyperPregnancy === 1 && slave.drugs !== Drug.SUPERFERTILITY && canGetPregnant(slave)) {
				slave.drugs = Drug.SUPERFERTILITY;
			} else if (V.masterSuitePregnancyFertilityDrugs === 1 && slave.drugs !== Drug.FERTILITY && canGetPregnant(slave)) {
				slave.drugs = Drug.FERTILITY;
			} else if (
				(
					(V.masterSuitePregnancyFertilityDrugs === 0 && slave.drugs === Drug.FERTILITY) ||
					(V.masterSuiteHyperPregnancy === 0 && slave.drugs === Drug.SUPERFERTILITY)
				) ||
				(!canGetPregnant(slave) && [Drug.FERTILITY, Drug.SUPERFERTILITY].includes(slave.drugs))
			) {
				slave.drugs = Drug.NONE;
			}
			/* We don't know they're pregnant for a month or so by game logic */
			if (slave.pregKnown === 1) {
				/* If they're preggo and in the upgraded suite, give them extra devotion. More if they're being given lighter duties. */
				if (V.verboseDescriptions === 1 || (V.experimental.favSeparateReport === 1 && V.favorites.includes(slave.ID))) {
					r.push(`Expecting ${slave.pregType > 1 ? "children" : "a child"} can be stressful, so ${he} truly appreciates the <span class="devotion inc">comforts</span> and <span class="trust inc">support</span> being given to ${him}.`);
					if (V.masterSuitePregnancySlaveLuxuries === 1) {
						r.push(`Being treated like royalty and having no obligations outside of steadily expanding and spending time with you only sweetens the deal.`);
					}
				}
				if (slave.devotion <= 100) {
					if (V.masterSuitePregnancySlaveLuxuries === 0) {
						slave.devotion += 2;
					} else {
						slave.devotion += 5;
					}
				}
				/* If they're preggo and in the upgraded suite, give them extra trust. More if they're being given lighter duties. */
				if (slave.trust <= 100) {
					if (V.masterSuitePregnancySlaveLuxuries === 0) {
						slave.trust += 2;
					} else {
						slave.trust += 5;
					}
				}
				/* If they're preggo and in the upgraded suite, give them extra health. More if they're being given lighter duties. */
				if (slave.health.condition < 100) {
					if (V.verboseDescriptions === 1 || (V.experimental.favSeparateReport === 1 && V.favorites.includes(slave.ID))) {
						r.push(`As a mother to be, ${his} health is paramount for the sake of the baby; no expense is spared to keep ${him} in <span class="health inc">peak condition.</span>`);
					}
					if (V.masterSuitePregnancySlaveLuxuries === 0) {
						improveCondition(slave, 15);
					} else {
						improveCondition(slave, 25);
					}
				}
			}
		}

		App.Events.addNode(frag, r);

		if (V.verboseDescriptions === 1 || (V.experimental.favSeparateReport === 1 && V.favorites.includes(slave.ID))) {
			App.Events.addNode(frag, [He, App.SlaveAssignment.pleaseYou(slave)], "div", ["indent"]);

			if (V.servantMilkers === 1 && slave.lactation > 0 && slave.fuckdoll === 0 && slave.fetish !== Fetish.MINDBROKEN && canMove(slave) && slave.intelligence + slave.intelligenceImplant >= -90) {
				const milkingResults = App.SlaveAssignment.getMilked(slave, 0.25);
				const milkDiv = App.UI.DOM.appendNewElement("div", frag, `When ${his} breasts begin to feel full and you aren't around, ${he} avails ${himself} to the penthouse milkers and gives ${milkingResults.milk} liters of milk over the week, which is sold for `, ["indent"]);
				App.UI.DOM.appendNewElement("span", milkDiv, `${cashFormat(milkingResults.milkSale)}.`, ["cash", "inc"]);
			}
			App.Events.addNode(frag, [
				App.SlaveAssignment.choosesOwnClothes(slave),
				...App.SlaveAssignment.individualSlaveReport(slave),
			], "div", ["indent"]);
		} else {
			// discard return values silently
			App.SlaveAssignment.pleaseYou(slave);
			if (V.servantMilkers === 1 && slave.lactation > 0 && slave.fuckdoll === 0 && slave.fetish !== Fetish.MINDBROKEN && canMove(slave) && slave.intelligence + slave.intelligenceImplant >= -90) {
				App.SlaveAssignment.getMilked(slave, 0.25);
			}
			App.SlaveAssignment.choosesOwnClothes(slave);
			App.SlaveAssignment.individualSlaveReport(slave);
		}
		frag.append(App.PersonalAttention.slaveReport(slave));
		App.Events.addNode(frag, [App.SlaveAssignment.devotion(slave)], "div", ["indent"]);

		if (slave.health.condition < 80) {
			if (V.masterSuiteUpgradeLuxury === 1) {
				improveCondition(slave, 20);
			} else {
				improveCondition(slave, 10);
			}
		}

		return frag;
	}

	if (slaves.length > 0) {
		const intro = App.UI.DOM.appendNewElement("p", frag, '', ["indent"]);
		let r = [];
		if (S.Concubine) {
			r.push(`<strong>${SlaveFullName(S.Concubine)} and ${numberWithPluralOne(slaves.length, "other slave")} are`);
		} else if (slaves.length > 1) {
			r.push(`<strong>There are ${slaves.length} slaves`);
		} else {
			r.push(`<strong>There is one slave`);
		}
		r.push(`seeing to your pleasure in the master suite.</strong> Such sexual opulence <span class="reputation inc">improves</span> your reputation.`);

		if (V.arcologies[0].FSEgyptianRevivalist > 0 && slaves.length >= 5) {
			r.push(`Society <span class="reputation inc">approves</span> of your keeping a large number of women. This advances the Egyptian revivalist ideal of multiple concubinage.`);
			FutureSocieties.Change("Egyptian Revivalist", 2);
		}
		if (pregnantSlaves >= 1) {
			r.push(`The suite is supporting the pregnancies of the slaves`);
			if (V.masterSuitePregnancyFertilityDrugs === 1 || V.masterSuiteHyperPregnancy === 1) {
				r.push(`within, and is providing them with fertility drugs`);
				if (V.masterSuitePregnancyFertilitySupplements === 1) {
					r.push(`and supplements to encourage impregnation.`);
				} else {
					r.push(`to encourage impregnation.`);
				}
			} else {
				r.push(`within.`);
			}
			if (V.arcologies[0].FSHedonisticDecadence > 0) {
				r.push(`Society <span class="reputation inc">approves</span> of the pampering your pregnant harem receives. This advances the ideal that everyone's desires should be fulfilled.`);
				FutureSocieties.Change("Hedonistic", 1);
			}
		}
		if (slaves.length > 1) {
			r.push(`The level of sexual energy in the suite is`);
			if (V.masterSuiteUpgradeLuxury === 1) {
				if (msAvg.energy > 90) {
					r.push(`intense. When you enter your luxurious retreat, you can set off pent-up orgasms with a touch.`);
				} else if (msAvg.energy > 60) {
					r.push(`high; there is strong competition for your favors whenever you enter your retreat.`);
				} else {
					r.push(`relatively normal; the slaves serve your pleasure before their own.`);
				}
			} else if (V.masterSuiteUpgradeLuxury === 2) {
				if (msAvg.energy > 90) {
					r.push(`intense. Your slaves spend almost all their time in the fuckpit, having sex in a big pile.`);
				} else if (msAvg.energy > 60) {
					r.push(`high; your slaves spend much of their time in the fuckpit, having sex with each other.`);
				} else {
					r.push(`relatively normal; the slaves lounging in the fuckpit get each other off when they feel like it.`);
				}
				if (msAvg.cum > 4) {
					r.push(`Unless it's right after an automated cleaning, everything in the fuckpit is spattered with cum.`);
				}
				if (msAvg.milk > 4000) {
					r.push(`There's so much lactation going on that the lowest level of the fuckpit is a pool of milk.`);
				}
			} else {
				r.push(`relatively normal.`);
			}
		}
		App.Events.addNode(intro, r);
	}

	if (concubine) {
		tired(concubine);
		const concubineEntry = App.UI.DOM.appendNewElement("div", frag, '', ["slave-report"]);
		const artSpan = App.UI.DOM.appendNewElement("span", concubineEntry);
		App.Events.addNode(concubineEntry, [concubineText(), commonText(concubine)]);
		App.SlaveAssignment.appendSlaveArt(artSpan, concubine);
	}

	for (const slave of App.SlaveAssignment.reportSlaves(slaves)) {
		const slaveEntry = App.UI.DOM.appendNewElement("div", frag, '', ["slave-report"]);
		const artSpan = App.UI.DOM.appendNewElement("span", slaveEntry);
		App.Events.addNode(slaveEntry, [nonConcubineText(slave), commonText(slave)]);
		App.SlaveAssignment.appendSlaveArt(artSpan, slave);
	}

	if (pregnantSlaves > 0 && FutureSocieties.isActive('FSRestart') && V.propOutcome !== 1 && V.eugenicsFullControl !== 1) {
		App.Events.addNode(frag, [`The Societal Elite know what you are doing with your bedslaves. <span class="warning">They do not approve.</span>`], "p", ["indent"]);
		V.failedElite += (5 * pregnantSlaves);
	}

	if (V.masterSuiteDecoration !== "standard") {
		App.Events.addNode(frag, [`${capFirstChar(V.masterSuiteName)}'s ${V.masterSuiteDecoration} atmosphere <span class="devotion inc">has a minor impact on your fucktoys.</span>`], "p", ["indent"]);
	}

	return frag;
};


code:
/**
 * Creates a full report of the Nursery
 * @returns {DocumentFragment}
 */
App.Facilities.Nursery.nurseryReport = function nurseryReport() {
	const frag = new DocumentFragment();

	const slaves = App.Utils.sortedEmployees(App.Entity.facilities.nursery);
	const devBonus = (V.nurseryDecoration !== "standard") ? 1 : 0;
	const arcology = V.arcologies[0];
	const NL = App.Entity.facilities.nursery.employeesIDs().size;

	let matronBonus = 0;

	App.EndWeek.saVars.flSex = App.EndWeek.getFLSex(App.Entity.facilities.nursery);

	function matronChanges() {
		if (S.Matron) {
			S.Matron.devotion += devBonus;

			if (S.Matron.health.condition < -80) {
				improveCondition(S.Matron, 20);
			} else if (S.Matron.health.condition < -40) {
				improveCondition(S.Matron, 15);
			} else if (S.Matron.health.condition < 0) {
				improveCondition(S.Matron, 10);
			} else if (S.Matron.health.condition < 90) {
				improveCondition(S.Matron, 7);
			}

			if (S.Matron.devotion <= 60) {
				S.Matron.devotion++;
			}

			if (S.Matron.trust < 60) {
				S.Matron.trust++;
			}

			if (S.Matron.rules.living !== "luxurious") {
				S.Matron.rules.living = "luxurious";
			}
			if (S.Matron.rules.rest !== "restrictive") {
				S.Matron.rules.rest = "restrictive";
			}
		}
	}

	function matronText() {
		const frag = new DocumentFragment();

		if (S.Matron) {
			const {He, he, His, his, him} = getPronouns(S.Matron);

			let r = [];
			if (S.Matron.relationship === -3 && S.Matron.devotion > 50) {
				r.push(`${He} does ${his} best to ${V.nurseryChildren
					? `properly raise and look after the children in ${V.nurseryName}`
					: `look after ${V.nurseryName} and keep it tidy and running smoothly`}.`);
			}

			if (S.Matron.health.condition < 10) {
				r.push(`${He} does ${his} best to take good care of ${V.nurseryChildren ? `the children` : `${V.nurseryName}`}, but ${his} poor health limits ${his} ability to do so.`);
			} else if (S.Matron.health.condition < 80) {
				r.push(`${His} good health allows ${him} to keep up with the demands of ${V.nurseryName}${NL ? `and work the nannies hard` : ``}.`);

				matronBonus += NL ? 50 : 0;
			} else {
				r.push(`${His} perfect health allows ${him} to really stay on top of things in ${V.nurseryName}${NL > 0 ? ` and really drive the nannies hard.` : ``}`);

				matronBonus += NL ? 75 : 0;
			}

			if (App.Data.Careers.Leader.matron.includes(S.Matron.career)) {
				r.push(`${He} has experience with looking after children from ${his} life before ${he} was a slave.`);

				matronBonus += 25;
			} else if (S.Matron.skill.matron >= Constant.MASTERED_XP) {
				r.push(`${He} has applicable experience with taking care of children from working for you.`);

				matronBonus += 25;
			} else {
				const skillIncrease = jsRandom(1, Math.ceil((
					S.Matron.intelligence + S.Matron.intelligenceImplant
				) / 15) + 8);
				r.push(slaveSkillIncrease('matron', S.Matron, skillIncrease));
			}

			if (S.Matron.actualAge > 35) {
				r.push(`${His} age and experience make ${him} more effective.`);

				matronBonus += 25;
			} else if (!V.AgePenalty) {
				matronBonus += 25;
			}

			if (S.Matron.intelligence + S.Matron.intelligenceImplant > 15) {
				r.push(`${He}'s intelligent enough that ${he} is more effectively able to take care of ${V.nurseryName}${V.nurseryChildren ? ` and its children` : ``}.`);

				matronBonus += S.Matron.intelligence + S.Matron.intelligenceImplant;
			}

			if (V.nurseryChildren < V.nurseryCribs) {
				let seed = jsRandom(1, 10) + ((V.nurseryCribs - V.nurseryChildren) * (jsRandom(150, 170) + (matronBonus * 10)));
				cashX(seed, "nursery", S.Matron);

				r.push(`
Since ${he} doesn't have enough children to occupy all ${his} time, ${V.nurseryName} takes in citizens' children on a contract basis and ${he} cares for them too, earning ${cashFormat(seed)}.
`);
			}

			if (arcology.FSRepopulationFocus > 0 && V.nurseryChildren > 0) {
				r.push(`Society <span class='green'>loves</span> the way you are raising more children for ${arcology.name}.`);
				FutureSocieties.Change("Repopulationist", 2);
			}

			App.Events.addNode(frag, r);
		}

		return frag;
	}

	if (slaves) {
		let r = [];

		r.push(`${slaves.length > 1 ? `There are ${slaves.length} slaves` : `There is one slave`} working in ${V.nurseryName}.</strong>`);

		if (arcology.FSRepopulationFocus > 0 && V.nurseryChildren > 0) {
			r.push(`Society <span class="green">approves</span> of your bringing more children into this world.`);
		} else if (arcology.FSGenderFundamentalist > 0) {
			r.push(`Society <span class="green">approves</span> of your assigning slaves to a traditionally feminine role.`);
		}

		App.Events.addNode(frag, r);
	}

	if (S.Matron) {
		const slave = App.SlaveAssignment.reportSlave(S.Matron);

		matronChanges();

		if (V.showEWD || (V.experimental.favSeparateReport === 1 && V.favorites.includes(slave.ID))) {
			const matronEntry = App.UI.DOM.appendNewElement("div", frag, '', ["slave-report"]);
			const artSpan = App.UI.DOM.appendNewElement("span", matronEntry);
			App.Events.addNode(matronEntry, [App.SlaveAssignment.saSlaveIntro(slave, `is serving as your Matron.`), matronText()]);
			matronEntry.append(App.SlaveAssignment.standardSlaveReport(slave, false));
			App.SlaveAssignment.appendSlaveArt(artSpan, slave);
		} else {
			App.SlaveAssignment.standardSlaveReport(slave, true);
		}
	}

	// FIXME: check these numbers over to make sure they make sense
	for (const slave of App.SlaveAssignment.reportSlaves(slaves)) {
		slave.devotion += devBonus;

		if (slave.devotion <= 20 && slave.trust >= -20) {
			slave.devotion -= 5;
			slave.trust -= 5;
		} else if (slave.devotion <= 10) {
			slave.devotion += 2;
		} else if (slave.devotion >= 80) {
			slave.devotion -= 2;
		}

		if (slave.trust < -20) {
			slave.trust += 3;
		} else if (slave.trust < -50) {
			slave.trust += 2;
		} else if (slave.trust < -30) {
			slave.trust += 1;
		}

		if (slave.health.condition < -80) {
			improveCondition(slave, 20);
		} else if (slave.health.condition < -40) {
			improveCondition(slave, 10);
		} else if (slave.health.condition < 0) {
			improveCondition(slave, 7);
		} else if (slave.health.condition < 90) {
			improveCondition(slave, 3);
		}

		// TODO: add more cases
		switch (V.nurseryDecoration) {
			case "Repopulationist":
				slave.rules.living = "luxurious";
				break;
			case "Degradationist":
				slave.rules.living = "spare";
				break;
			default:
				slave.rules.living = "normal";
				break;
		}

		if (V.showEWD || (V.experimental.favSeparateReport === 1 && V.favorites.includes(slave.ID))) {
			const {He} = getPronouns(slave);
			const slaveEntry = App.UI.DOM.appendNewElement("div", frag, '', ["slave-report"]);
			const artSpan = App.UI.DOM.appendNewElement("span", slaveEntry);
			slaveEntry.append(App.SlaveAssignment.saSlaveIntro(slave, `is working out of ${V.nurseryName}.`));

			App.Events.addNode(slaveEntry, [He, App.SlaveAssignment.nanny(slave)], "div", ["indent"]);
			slaveEntry.append(App.SlaveAssignment.standardSlaveReport(slave, false));
			App.SlaveAssignment.appendSlaveArt(artSpan, slave);
		} else {	// silently discard return values
			App.SlaveAssignment.nanny(slave);
			App.SlaveAssignment.standardSlaveReport(slave, true);
		}
	}

	if (V.nurseryDecoration !== "standard") {
		App.Events.addNode(frag, [`${capFirstChar(V.nurseryName)}'s ${V.nurseryDecoration} atmosphere <span class="devotion inc">has a minor impact on your servants.</span>`]);
	}

	App.EndWeek.saVars.flSex = new Set();

	return frag;
};