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.growTime > 0) {
			tank.growTime -= V.incubator.upgrade.speed;
			r.push(`<span class="pink">${tank.slaveName}'s</span> growth is currently being accelerated. ${He}`);
			if (Math.round(tank.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.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 (V.incubator.setting.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 (V.incubator.setting.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 (V.incubator.setting.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 (V.incubator.setting.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 (V.incubator.setting.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 (V.incubator.setting.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 && V.incubator.setting.growthStims !== 0) {
			let heightLimit = Math.clamp((Height.mean(tank) * 1.25), 0, 274);
			let heightLimitAge = Height.mean(tank);
			if (tank.geneticQuirks.dwarfism === 2 && tank.geneticQuirks.gigantism !== 2) {
				heightLimit = Math.clamp((Height.mean(tank) * 0.95), 0, 160);
			} else if (tank.geneticQuirks.gigantism === 2 && tank.geneticQuirks.dwarfism !== 2) {
				heightLimit = Math.clamp((Height.mean(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);
				/* Generate new average height for slave of age limitAge */
				heightLimitAge = Height.mean(tank.nationality, tank.race, tank.genes, limitHeight);
				heightLimit = heightLimitAge; /* TODO: Add some variation, right now all NCS slaves will be the exact same height */
			} else if (tank.geneticQuirks.neoteny === 2 && tank.physicalAge > 12) {
				/* Generate new average height for slave of age 12 */
				heightLimitAge = Height.mean(tank.nationality, tank.race, tank.genes, 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 (V.incubator.setting.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 {
					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.setting.weight >= 1 && V.incubator.setting.muscles <= 1 && V.incubator.setting.reproduction <= 1) {
						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 {
						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 (V.incubator.setting.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;
			if (V.incubator.setting.reproduction === 2) {
				r.push(`${His} developing body is being flooded with hormones.`);
				if (V.incubator.setting.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 < 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 < 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 < 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 < 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 < 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 (V.incubator.setting.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 (V.incubator.setting.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 {
						if (tank.boobs < 400 && random(1, 100) > 60) {
							r.push(`The added estrogen <span class="green">causes ${his} breasts to swell.</span>`);
							tank.boobs += 50;
						}
						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 (V.incubator.setting.reproduction === 2) {
			tank.energy = 80;
			tank.need = 100;
		} else if (V.incubator.setting.reproduction === 1) {
			tank.energy = 50;
			tank.need = 20;
		} else {
			tank.energy = 0;
			tank.need = 0;
		}

		r = [];
		if (((V.incubator.setting.pregAdaptation === 1 && tank.genes === "XX") || (V.incubator.setting.pregAdaptation === 2 && tank.genes === "XY") || V.incubator.setting.pregAdaptation === 3) && tank.growTime > 0) {
			if (tank.incubatorPregAdaptationInWeek <= 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.incubatorPregAdaptationInWeek * 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.incubatorPregAdaptationInWeek = (15000 / 2000 - tank.pregAdaptation) / tank.growTime;
				}
				weekAdapt = tank.incubatorPregAdaptationInWeek * V.incubator.upgrade.speed;
				/* Now it should be fine */
				weekAdapt *= 1 + (V.incubator.setting.reproduction / 5);
				weekAdapt *= 1 + (tank.hormoneBalance / 1500);
				tank.pregAdaptation += weekAdapt;
				/* here goes side effect from intense and extreme settings: */
				if (random(1, 100) <= (tank.incubatorPregAdaptationPower - 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 = "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 */
	}

	return frag;
};


code:
App.EndWeek.masterSuiteReport = function() {
	let frag = document.createDocumentFragment();
	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() {
		let r = [];
		const {He, he, his, him, himself} = getPronouns(S.Concubine);

		r.push(`Your concubine ${SlaveFullName(S.Concubine)} is serving you in ${V.masterSuiteName}. More than any other slave, ${his} sexual brilliance and physical appeal are critical 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="green">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) {
				r.push(`Keeping such a prestigious slave as your concubine <span class="green">adds to your fame.</span>`);
				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 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 > 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 if (S.Concubine.balls > 0) {
						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} show you just what ${he} was capable of.`);
					} 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 (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) {
						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.`);
						}
					}
				}
			}
		}
		if (S.Concubine.porn.prestige > 2) {
			repX(800, "concubine", S.Concubine);
			r.push(`Having a porn star as your personal bed warmer <span class="green">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="green">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) {
				r.push(`Many citizens`);
				if (S.Concubine.counter.publicUse > 10) {
					r.push(`remember having had ${him} themselves, and`);
				}
				r.push(`<span class="green">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 */
		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 + (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);
		return r.join(' ');
	}

	/** Generate text specific to non-concubine MS slaves
	 * @param {App.Entity.SlaveState} slave
	 * @returns {string}
	 */
	function nonConcubineText(slave) {
		let r = [];
		r.push(`<span class='slave-name'>${SlaveFullName(slave)}</span>`);
		if (slave.choosesOwnAssignment === 2) {
			r.push(App.SlaveAssignment.choosesOwnJob(slave));
		} else {
			r.push(`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 r.join(' ');
	}

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

		if (V.masterSuiteUpgradeLuxury === 2 && msAvg.energy > random(40, 90)) {
			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 === "fuckable" && msAvg.dick > 2) {
				actX(slave, "mammary", random(1, 3) * energy);
			}
			if ((slave.trust >= -20) && (slave.devotion > -10) && (slave.fetishStrength <= 95) && slave.fetish !== "mindbroken") {
				const fetishChange = fetishChangeChance(slave);
				if (msAvg.milk > 2000 && fetishChange > random(0, 50)) {
					if (slave.fetish === "boobs") {
						if (V.verboseDescriptions === 1) {
							r.push(`${His}`);
						} else {
							r.push(`${slave.slaveName}'s`);
						}
						r.push(`<span class="lightcoral">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) {
							r.push(`${He}`);
						} else {
							r.push(slave.slaveName);
						}
						r.push(`<span class="lightcoral">acquires a boob fetish</span> after spending a lot of time in the fuckpit drinking from ${his} fellow fucktoys' tits.`);
						slave.fetish = "boobs";
						slave.fetishStrength = 65;
					}
				} else if (msAvg.dick > 3 && slave.anus > 0 && fetishChange > random(0, 50)) {
					r.push(`${He}`);
					if (slave.fetish === "buttslut") {
						r.push(`<span class="lightcoral">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="lightcoral">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 = "buttslut";
						slave.fetishStrength = 65;
					}
				} else if (msAvg.cum > 3 && fetishChange > random(0, 50)) {
					r.push(`${He}`);
					if (slave.fetish === "cumslut") {
						r.push(`<span class="lightcoral">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="lightcoral">acquires an oral fixation</span> after orally servicing your many fucktoys eager to blow their loads down ${his} throat.`);
						slave.fetish = "cumslut";
						slave.fetishStrength = 65;
					}
				} else if (msAvg.preg > 10 && fetishChange > random(0, 50)) {
					r.push(`${He}`);
					if (slave.fetish === "pregnancy") {
						r.push(`<span class="lightcoral">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="lightcoral">acquires a pregnancy fetish,</span> since many of ${his} sexual partners in the fuckpit are heavily pregnant.`);
						slave.fetish = "pregnancy";
						slave.fetishStrength = 65;
					}
				} else if (msAvg.dom < -25 && fetishChange > random(0, 50)) {
					r.push(`${He}`);
					if (slave.fetish === "dom") {
						r.push(`<span class="lightcoral">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="lightcoral">becomes sexually dominant</span> after having fun satisfying the many submissive fucktoys in the fuckpit who beg ${him} to top them.`);
						slave.fetish = "dom";
						slave.fetishStrength = 65;
					}
				} else if (msAvg.dom > 25 && fetishChange > random(0, 50)) {
					r.push(`${He}`);
					if (slave.fetish === "submissive") {
						r.push(`<span class="lightcoral">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="lightcoral">becomes sexually submissive</span> after the many dominant slaves in the fuckpit hold ${him} down and use ${him} for their pleasure.`);
						slave.fetish = "submissive";
						slave.fetishStrength = 65;
					}
				} else if (msAvg.sadism < -25 && fetishChange > random(0, 50)) {
					r.push(`${He}`);
					if (slave.fetish === "sadist") {
						r.push(`<span class="lightcoral">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="lightcoral">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 slap.`);
						slave.fetish = "sadist";
						slave.fetishStrength = 65;
					}
				} else if (msAvg.sadism > 25 && fetishChange > random(0, 50)) {
					if (slave.fetish === "masochist") {
						if (V.verboseDescriptions === 1) {
							r.push(`${His}`);
						} else {
							r.push(`${slave.slaveName}'s`);
						}
						r.push(`<span class="lightcoral">pain addiction deepens,</span> since the fuckpit is full of ladies happy to fuck ${him} while ${he} screams.`);
						slave.fetishStrength += 4;
					} else {
						if (V.verboseDescriptions === 1) {
							r.push(`${He}`);
						} else {
							r.push(slave.slaveName);
						}
						r.push(`<span class="lightcoral">learns masochism</span> after experiencing many orgasms under the exquisite sexual torture of the sadists in the fuckpit.`);
						slave.fetish = "masochist";
						slave.fetishStrength = 65;
					}
				}
			}
			// FIXME: fuckpit means servant milkers get no milk at all??
			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="green">greatly heightens ${his} libido.</span>`);
				slave.energy += 2;
			}
			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.masterSuitePregnancyFertilityDrugs === 1 && slave.drugs !== "fertility drugs" && canGetPregnant(slave)) {
				slave.drugs = "fertility drugs";
			} else if (V.masterSuiteHyperPregnancy === 1 && slave.drugs !== "super fertility drugs" && canGetPregnant(slave)) {
				slave.drugs = "super fertility drugs";
			} else if (
				(
					(V.masterSuitePregnancyFertilityDrugs === 0 && slave.drugs === "fertility drugs") ||
					(V.masterSuiteHyperPregnancy === 0 && slave.drugs === "super fertility drugs")
				) ||
				(!canGetPregnant(slave) && ["fertility drugs", "super fertility drugs"].includes(slave.drugs))
			) {
				slave.drugs = "no drugs";
			}
			/* We don't know they're pregnant for a month or so by game logic */
			if (slave.pregKnown === 1) {
				/* FIXME: should these effects have associated text? */
				/* If they're preggo and in the upgraded suite, give them extra devotion. More if they're being given lighter duties. */
				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.masterSuitePregnancySlaveLuxuries === 0) {
						improveCondition(slave, 15);
					} else {
						improveCondition(slave, 25);
					}
				}
			}
		}

		$(smallFrag).append(r.join(' '));

		if (V.verboseDescriptions === 1) {
			const msContent = App.UI.DOM.appendNewElement("div", smallFrag, '', "indent");
			$(msContent).append(`${He} ${App.SlaveAssignment.pleaseYou(slave)}`);

			if (V.servantMilkers === 1 && slave.lactation > 0 && slave.fuckdoll === 0 && slave.fetish !== "mindbroken" && canMove(slave) && slave.intelligence + slave.intelligenceImplant >= -90) {
				const milkingResults = App.SlaveAssignment.getMilked(slave, 0.25);
				const milkDiv = App.UI.DOM.appendNewElement("div", smallFrag, `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(smallFrag, [
				App.SlaveAssignment.choosesOwnClothes(slave),
				...App.SlaveAssignment.individualSlaveReport(slave),
			], "div", "indent");
		} else {
			// discard return values silently
			App.SlaveAssignment.choosesOwnJob(slave);
			App.SlaveAssignment.pleaseYou(slave);
			if (V.servantMilkers === 1 && slave.lactation > 0 && slave.fuckdoll === 0 && slave.fetish !== "mindbroken" && canMove(slave) && slave.intelligence + slave.intelligenceImplant >= -90) {
				App.SlaveAssignment.getMilked(slave, 0.25);
			}
			App.SlaveAssignment.choosesOwnClothes(slave);
			App.SlaveAssignment.individualSlaveReport(slave);
		}
		smallFrag.append(App.PersonalAttention.slaveReport(slave));
		App.Events.addNode(smallFrag, [App.SlaveAssignment.devotion(slave)], "div", "indent");

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

		return smallFrag;
	}

	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="green">improves</span> your reputation.`);

		if (V.arcologies[0].FSEgyptianRevivalist > 0 && slaves.length >= 5) {
			r.push(`Society <span class="green">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="green">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.`);
			}
		}
		$(intro).append(r.join(' '));
	}

	if (concubine) {
		tired(concubine);
		const slaveEntry = App.UI.DOM.appendNewElement("div", frag, '', "slave-report");
		const artSpan = App.UI.DOM.appendNewElement("span", slaveEntry);
		App.SlaveAssignment.appendSlaveLinks(slaveEntry, concubine);
		App.Events.addNode(slaveEntry, [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.SlaveAssignment.appendSlaveLinks(slaveEntry, slave);
		App.Events.addNode(slaveEntry, [nonConcubineText(slave), commonText(slave)]);
		App.SlaveAssignment.appendSlaveArt(artSpan, slave);
	}

	if (pregnantSlaves > 0 && V.arcologies[0].FSRestart !== "unset" && V.propOutcome !== 1 && V.eugenicsFullControl !== 1) {
		const eliteEffects = App.UI.DOM.appendNewElement("p", frag, '', "indent");
		$(eliteEffects).append(`The Societal Elite know what you are doing with your bedslaves. <span class="red">They do not approve.</span>`);
		V.failedElite += (5 * pregnantSlaves);
	}

	if (V.masterSuiteDecoration !== "standard") {
		const decorationEffects = App.UI.DOM.appendNewElement("p", frag, '', "indent");
		$(decorationEffects).append(`${capFirstChar(V.masterSuiteName)}'s ${V.masterSuiteDecoration} atmosphere <span class="hotpink">has a minor impact on your fucktoys.</span>`);
	}

	return frag;
};

repo_name: Fanatey/fc

license: mit


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];

	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() {
		if (S.Matron) {
			const {He, he, His, his, him} = getPronouns(S.Matron);

			let r = [];

			r.push(`${SlaveFullName(S.Matron)} is serving as your Matron.`);

			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}${V.nurseryNannies ? `and work the nannies hard` : ``}.`);

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

				matronBonus += V.nurseryNannies ? 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 >= V.masteredXP) {
				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.nursery) {
				let seed = jsRandom(1, 10) + ((V.nursery - 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);
			}
			return r.join(' ');
		}
	}

	const matronEffects = App.UI.DOM.appendNewElement("p", frag, '', "indent");

	matronChanges();
	$(matronEffects).append(matronText());

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

		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.`);
		}

		$(intro).append(r.join(' '));
	}

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

		if (V.showEWD !== 0) {
			const matronEntry = App.UI.DOM.appendNewElement("div", frag, '', "slave-report");
			const artSpan = App.UI.DOM.appendNewElement("span", matronEntry);
			App.SlaveAssignment.appendSlaveLinks(matronEntry, slave);
			$(matronEntry).append(`<span class="slave-name">${SlaveFullName(slave)}</span> is serving as your Matron.`);
			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) {
			const {He} = getPronouns(slave);
			const slaveEntry = App.UI.DOM.appendNewElement("div", frag, '', "slave-report");
			const artSpan = App.UI.DOM.appendNewElement("span", slaveEntry);
			App.SlaveAssignment.appendSlaveLinks(slaveEntry, slave);
			$(slaveEntry).append(`<span class="slave-name">${SlaveFullName(slave)}</span> `);

			if (slave.choosesOwnAssignment === 2) {
				$(slaveEntry).append(App.SlaveAssignment.choosesOwnJob(slave));
			} else {
				$(slaveEntry).append(`is working out of ${V.nurseryName}.`);
			}

			const nannyContent = App.UI.DOM.appendNewElement("div", slaveEntry, '', "indent");

			$(nannyContent).append(`${He} ${App.SlaveAssignment.nanny(slave, matronBonus)}`);	// FIXME: nanny() takes one argument

			slaveEntry.append(App.SlaveAssignment.standardSlaveReport(slave, false));
			App.SlaveAssignment.appendSlaveArt(artSpan, slave);
		} else {	// silently discard return values
			App.SlaveAssignment.nanny(slave, matronBonus);	// FIXME: nanny() takes one argument
			App.SlaveAssignment.standardSlaveReport(slave, true);
		}
	}

	if (V.nurseryDecoration !== "standard") {
		const decorationEffects = App.UI.DOM.appendNewElement("p", frag, '', "indent");

		$(decorationEffects).append(`${capFirstChar(V.nurseryName)}'s ${V.nurseryDecoration} atmosphere <span class="devotion inc">has a minor impact on your servants.</span>`);
	}

	return frag;
};