diff --git a/css/002-variables/colors.css b/css/002-variables/colors.css
index 373459ca14ada07963c2f2c45ebb86c8766906ce..a592b04a14fca2a9b0b01f9cb309b3f036e00608 100644
--- a/css/002-variables/colors.css
+++ b/css/002-variables/colors.css
@@ -1,10 +1,10 @@
 :root {
-    --button-color: #252525;
-    --button-border-color: #333333;
-    --button-selected-color: #050505;
-    --button-hover-color: #414141;
-    --button-disabled-color: #1a1a1a;
+	--button-color: #252525;
+	--button-border-color: #333333;
+	--button-selected-color: #050505;
+	--button-hover-color: #414141;
+	--button-disabled-color: #1a1a1a;
 
-    --link-color: #68D;
-    --link-hover-color: #8af
+	--link-color: #68D;
+	--link-hover-color: #8af
 }
diff --git a/css/003-sugarcube-overwrite/general.css b/css/003-sugarcube-overwrite/general.css
index 341ec864ad0de37c9765bfa54e3a21915e44b655..1929c109f2e6d2a99a1e12b915b979fa3b172d85 100644
--- a/css/003-sugarcube-overwrite/general.css
+++ b/css/003-sugarcube-overwrite/general.css
@@ -1,29 +1,29 @@
 body {
-    overflow-x: hidden;
+	overflow-x: hidden;
 }
 
 /* clears SugarCube's default transition */
 .passage {
-    transition: none;
-    -webkit-transition: none;
+	transition: none;
+	-webkit-transition: none;
 }
 
 .passage-in {
-    opacity: 1 !important;
+	opacity: 1 !important;
 }
 
 #passages {
-    /* max-width: 54em */
-    max-width: 100%;
+	/* max-width: 54em */
+	max-width: 100%;
 }
 
 /* makes HR colorflip compatible */
 hr {
-    background:#ccc;
-    border:0;
+	background:#ccc;
+	border:0;
 }
 
 /* fix dialog title centering */
 #ui-dialog-title {
-    padding-left: 3.5em;
+	padding-left: 3.5em;
 }
diff --git a/css/003-sugarcube-overwrite/sidebar.css b/css/003-sugarcube-overwrite/sidebar.css
index a43d1b8df06cb7da002cf9538860637ae89bf423..de24a4c4ea90707f2aa2bef02d8d9e031b27a9d2 100644
--- a/css/003-sugarcube-overwrite/sidebar.css
+++ b/css/003-sugarcube-overwrite/sidebar.css
@@ -2,24 +2,24 @@
 
 /* make the sidebar more compact by reducing the space between major parts */
 #ui-bar-body {
-    /* height: calc(100% - 2.5em); */
-    /* margin: 2.5em 0; */
-    height: calc(100% - 1.5em);
-    margin: 1.5em 0;
+	/* height: calc(100% - 2.5em); */
+	/* margin: 2.5em 0; */
+	height: calc(100% - 1.5em);
+	margin: 1.5em 0;
 }
 
 #ui-bar-body > :not(:first-child) {
-    /* margin-top: 2em; */
-    margin-top: 1.5em;
+	/* margin-top: 2em; */
+	margin-top: 1.5em;
 }
 
 #story-author {
-    /* margin-top: 2em; */
-    margin-top: 0;
+	/* margin-top: 2em; */
+	margin-top: 0;
 }
 
 /* make cheat text boxes fit in sidebar */
 #story-caption input {
-    min-width: 0;
-    width: calc(100% - 0.8em - 2px);
+	min-width: 0;
+	width: calc(100% - 0.8em - 2px);
 }
diff --git a/css/art/art.css b/css/art/art.css
index 8e5fb0ac5aab147f1d25dbce5a792d8915cbde06..823dc50712358a9214b83de33ac234987354ec0a 100644
--- a/css/art/art.css
+++ b/css/art/art.css
@@ -1,117 +1,117 @@
 /* small trick to hide broken images */
 img {
-    text-indent: -10000px;
+	text-indent: -10000px;
 }
 
 .imageColumn { /* TODO: this is mostly a copy of imageRef to get its flex features working properly. They can probably be removed from imageRef at some point */
-    display: flex;
-    flex-direction: column;
-    flex-wrap: wrap;
-    align-items: flex-start;
-    position: relative;
-    float: right;
+	display: flex;
+	flex-direction: column;
+	flex-wrap: wrap;
+	align-items: flex-start;
+	position: relative;
+	float: right;
 }
 
 .imageRef {
-    display: flex;
-    flex-direction: column;
-    flex-wrap: wrap;
-    align-items: flex-start;
-    position: relative;
-    background-color: rgba(80, 80, 80, 0.5);
-    margin: 2px;
+	display: flex;
+	flex-direction: column;
+	flex-wrap: wrap;
+	align-items: flex-start;
+	position: relative;
+	background-color: rgba(80, 80, 80, 0.5);
+	margin: 2px;
 }
 
 .tinyImg {
-    height: 120px;
-    width: 120px;
-    float: left;
+	height: 120px;
+	width: 120px;
+	float: left;
 }
 
 .smlImg {
-    height: 150px;
-    width: 150px;
-    float: left;
+	height: 150px;
+	width: 150px;
+	float: left;
 }
 
 .smlImg > img, .smlImg > video {
-    height: auto;
+	height: auto;
 }
 
 .medImg {
-    height: 300px;
-    width: 300px;
-    float: right;
+	height: 300px;
+	width: 300px;
+	float: right;
 }
 
 .medImg > img, .medImg > video {
-    height: auto;
+	height: auto;
 }
 
 .lrgRender {
-    height: 531px;
-    width: 506px;
-    margin-right: -50px;
-    margin-left: 0px;
-    float: right;
+	height: 531px;
+	width: 506px;
+	margin-right: -50px;
+	margin-left: 0px;
+	float: right;
 }
 
 .lrgVector {
-    height: 600px;
-    width: 600px;
-    margin-right: -125px;
-    margin-left: -125px;
-    float: right;
-    z-index: -1;
+	height: 600px;
+	width: 600px;
+	margin-right: -125px;
+	margin-left: -125px;
+	float: right;
+	z-index: -1;
 }
 
 .lrgRender > div.mask {
-    width: 180px;
-    height: 100%;
-    background: linear-gradient(90deg, rgba(17, 17, 17, 1), rgba(17, 17, 17, 0.8) 60%, rgba(17, 17, 17, 0));
-    z-index: 1;
-    /*position: absolute;*/
+	width: 180px;
+	height: 100%;
+	background: linear-gradient(90deg, rgba(17, 17, 17, 1), rgba(17, 17, 17, 0.8) 60%, rgba(17, 17, 17, 0));
+	z-index: 1;
+	/*position: absolute;*/
 }
 
 .lrgRender > img, .lrgRender > video {
-    margin-left: -150px;
-    height: 531px;
-    width: auto;
+	margin-left: -150px;
+	height: 531px;
+	width: auto;
 }
 
 .lrgVector > div.mask {
-    width: 150px;
-    height: 100%;
-    background: linear-gradient(90deg, rgba(17, 17, 17, 1), rgba(17, 17, 17, 0.8) 60%, rgba(17, 17, 17, 0));
-    z-index: 1;
+	width: 150px;
+	height: 100%;
+	background: linear-gradient(90deg, rgba(17, 17, 17, 1), rgba(17, 17, 17, 0.8) 60%, rgba(17, 17, 17, 0));
+	z-index: 1;
 }
 
 .lrgVector > img, .lrgVector > video {
-    margin-left: -150px;
-    height: 600px;
-    width: auto;
+	margin-left: -150px;
+	height: 600px;
+	width: auto;
 }
 
 .lrgVector svg {
-    width: 336px;
+	width: 336px;
 }
 
 object {
-    object-fit: scale-down;
-    position: absolute;
-    top: 0;
-    left: 0;
+	object-fit: scale-down;
+	position: absolute;
+	top: 0;
+	left: 0;
 }
 
 img.paperdoll {
-    position: absolute;
-    top: 0;
-    left: 0;
-    margin-left: 0;
+	position: absolute;
+	top: 0;
+	left: 0;
+	margin-left: 0;
 }
 
 img.assistant {
-    float: right;
-    border: 3px hidden;
-    object-fit: contain;
+	float: right;
+	border: 3px hidden;
+	object-fit: contain;
 }
diff --git a/css/debugging/profileEvents.css b/css/debugging/profileEvents.css
index eb3d430426918cd4ba64fe71ac8744ae92a86f79..db7074763f7a20946b29a4f11a2786fb89d42890 100644
--- a/css/debugging/profileEvents.css
+++ b/css/debugging/profileEvents.css
@@ -1,5 +1,5 @@
 .profile-events {
-    display: grid;
-    grid-template-columns: max-content max-content max-content auto;
-    grid-column-gap: 1em;
+	display: grid;
+	grid-template-columns: max-content max-content max-content auto;
+	grid-column-gap: 1em;
 }
diff --git a/css/endWeek/slavesReport.css b/css/endWeek/slavesReport.css
index f07dbecbe1e82f6363fb316a8bff981287e33acf..041e1f7c6ef9f50e69d5dfdfbc73923104dac2ed 100644
--- a/css/endWeek/slavesReport.css
+++ b/css/endWeek/slavesReport.css
@@ -1,4 +1,4 @@
 div.slave-report {
-    margin-top: 1em;
-    margin-bottom: 1em;
+	margin-top: 1em;
+	margin-bottom: 1em;
 }
diff --git a/css/events/events.css b/css/events/events.css
index 5069b4d2229e91eef4928711d88ea5aea8fecc1c..22ec740529ae9765e01f4b113b6665c405a4a768 100644
--- a/css/events/events.css
+++ b/css/events/events.css
@@ -1,4 +1,4 @@
 div.event-section {
-    margin-top: 1em;
-    margin-bottom: 1em;
+	margin-top: 1em;
+	margin-bottom: 1em;
 }
diff --git a/css/facilities/wardrobe.css b/css/facilities/wardrobe.css
index 1132d65b924846d754218795725376f76590247b..dc49f435e6c6fbad27813d8b57290b5e0e2ee075 100644
--- a/css/facilities/wardrobe.css
+++ b/css/facilities/wardrobe.css
@@ -1,11 +1,11 @@
 .wardrobe-shopping-block {
-    display: flex;
-    flex-wrap: wrap;
+	display: flex;
+	flex-wrap: wrap;
 }
 
 .wardrobe-shopping-cell {
-    display: inline-block;
-    width: 20em;
+	display: inline-block;
+	width: 20em;
 	border: 1px solid var(--button-border-color);
 }
 
diff --git a/css/general/formatting.css b/css/general/formatting.css
index 15bdbc4850610db8c2b825b932782b975c7929b7..0d8c5e989fb7e03990bf3830f5389f931dfd25fc 100644
--- a/css/general/formatting.css
+++ b/css/general/formatting.css
@@ -2,100 +2,100 @@
 
 /* setting at the beginning of a scene / subscene */
 .scene-intro {
-    font-style: italic;
+	font-style: italic;
 }
 
 /* adds detail to an option: Do something. <span class="detail">Sentence that explains the effect/conditions */
 .detail {
-    font-style: italic;
+	font-style: italic;
 }
 
 /* additional information not related to a specific option */
 .note {
-    font-style: italic;
+	font-style: italic;
 }
 
 .icons {
-    font-family: 'tme-fa-icons';
+	font-family: 'tme-fa-icons';
 }
 
 .story-label, .regularParties, .underline {
-    text-decoration: underline;
+	text-decoration: underline;
 }
 
 /* Note: Do not do a linebreak after span in HTML, because it will underline the automatic space it inserts: "Matilda_is a cow" */
 .slave-name {
-    color: pink;
-    font-weight: bold;
-    text-decoration: underline;
-    text-decoration-color: white;
+	color: pink;
+	font-weight: bold;
+	text-decoration: underline;
+	text-decoration-color: white;
 }
 
 .name {
-    font-weight: bold;
+	font-weight: bold;
 }
 
 .custom-label {
-    color: yellow;
-    font-weight: bold;
+	color: yellow;
+	font-weight: bold;
 }
 
 /* strong & bold are deprecated, use custom classes instead */
 /* :not(.defiant) : quick fix to make defiant styles look correct */
 .major-link, .bold:not(.defiant), .strong {
-    font-weight: bold;
+	font-weight: bold;
 }
 
 .monospace {
-    font-family: monospace;
+	font-family: monospace;
 }
 
 .strikethrough {
-    text-decoration: line-through
+	text-decoration: line-through
 }
 
 .clear-formatting {
-    color: white;
-    font-weight: normal;
-    font-style: normal;
+	color: white;
+	font-weight: normal;
+	font-style: normal;
 }
 
 .clear-formatting a {
-    color: var(--link-color) !important;
+	color: var(--link-color) !important;
 }
 
 .major-warning {
-    font-weight: bold;
-    color: red;
+	font-weight: bold;
+	color: red;
 }
 
 input:invalid {
-    border-color: #900;
-    background-color: rgba(255, 0, 0, 0.25);
+	border-color: #900;
+	background-color: rgba(255, 0, 0, 0.25);
 }
 
 input:focus:invalid {
-    outline: none;
+	outline: none;
 }
 
 input:out-of-range {
-    background-color: rgba(255, 0, 0, 0.25);
-    border: 2px solid #900;
+	background-color: rgba(255, 0, 0, 0.25);
+	border: 2px solid #900;
 }
 
 .uppercase {
-    text-transform: uppercase;
+	text-transform: uppercase;
 }
 
 
 dt {
-    font-weight: bold;
+	font-weight: bold;
 }
 
 dd {
-    margin-bottom: 1em;
+	margin-bottom: 1em;
 }
 
 dt::after {
-    content: ":";
+	content: ":";
 }
diff --git a/css/general/layout.css b/css/general/layout.css
index 55246336e9e1260a2e2f294e66ad069a71ff0a48..7afeedf7bd19bfae455be300b9ac5d8b0f55d42b 100644
--- a/css/general/layout.css
+++ b/css/general/layout.css
@@ -1,46 +1,46 @@
 /* Styles that mainly affect where text is, but not how it looks */
 
 h1, h2, h3, h4 {
-    margin-bottom: 0;
-    margin-top: 0.25em;
+	margin-bottom: 0;
+	margin-top: 0.25em;
 }
 
 h1 + p, h2 + p, h3 + p, h4 + p {
-    margin-top: 0;
+	margin-top: 0;
 }
 
 .center {
-    margin-left: auto;
-    margin-right: auto;
-    text-align: center;
+	margin-left: auto;
+	margin-right: auto;
+	text-align: center;
 }
 
 div.flex-container {
-    display: flex;
+	display: flex;
 }
 
 /* makes the first line indented */
 div.indent, p.indent {
-    text-indent: 2em;
+	text-indent: 2em;
 }
 
 div.double-indent, p.double-indent {
-    text-indent: 4em;
+	text-indent: 4em;
 }
 
 /* makes every line indented */
 .choices, .choices {
-    margin-left: 2em;
+	margin-left: 2em;
 }
 
 .double-choices, .double-choices {
-    margin-left: 4em;
+	margin-left: 4em;
 }
 
 div.grid-2columns-auto {
-    display: grid;
-    grid-template-columns: max-content auto;
-    grid-column-gap: 1em;
+	display: grid;
+	grid-template-columns: max-content auto;
+	grid-column-gap: 1em;
 }
 
 .margin-top {
@@ -52,38 +52,38 @@ div.grid-2columns-auto {
 }
 
 .margin-left {
-    margin-left: 2em;
+	margin-left: 2em;
 }
 
 .margin-right {
-    margin-right: 2em;
+	margin-right: 2em;
 }
 
 .margin-x {
-    margin-left: 2em;
-    margin-right: 2em;
+	margin-left: 2em;
+	margin-right: 2em;
 }
 
 .margin-y {
-    margin-top: 1em;
-    margin-bottom: 1em;
+	margin-top: 1em;
+	margin-bottom: 1em;
 }
 
 .margin-full {
-    margin: 1em;
+	margin: 1em;
 }
 
 .space-evenly {
-    justify-content: space-evenly;
+	justify-content: space-evenly;
 }
 
 .absolute {
-    position: absolute;
+	position: absolute;
 }
 
 /* puts a div in the right upper corner while not influencing the layout of the rest of the page */
 div.cheat-menu {
-    font-style: italic;
-    position: absolute;
-    right: 50px;
+	font-style: italic;
+	position: absolute;
+	right: 50px;
 }
diff --git a/css/general/textColors.css b/css/general/textColors.css
index 95f5cfc484faeb834f40c8e199a6e6037dfab507..097192bde6509dd4fc9dfaafaf1274760c00b8ab 100644
--- a/css/general/textColors.css
+++ b/css/general/textColors.css
@@ -5,148 +5,148 @@
 
 /* link color */
 .link, .link a {
-    color: var(--link-color)
+	color: var(--link-color)
 }
 
 .aquamarine, .aquamarine a, .skill, .skill a {
-    color: aquamarine
+	color: aquamarine
 }
 
 .coral, .coral a, .fetish.loss, .fetish.loss a {
-    color: coral
+	color: coral
 }
 
 /* used for aphrodisiac & neighbor arcs */
 .cyan, .cyan a, .hotkey {
-    color: cyan
+	color: cyan
 }
 
 .darkgoldenrod, .darkgoldenrod a, .trust.extremely-terrified, .trust.extremely-terrified a {
-    color: darkgoldenrod
+	color: darkgoldenrod
 }
 
 .darkred, .darkred a, .defiant.full, .defiant.full a {
-    color: darkred
+	color: darkred
 }
 
 .darkviolet, .darkviolet a, .devotion.hateful, .devotion.hateful a {
-    color: darkviolet
+	color: darkviolet
 }
 
 /* used for devotion once & agent */
 .deeppink, .deeppink a, .devotion.devoted, .devotion.devoted a {
-    color: deeppink
+	color: deeppink
 }
 
 .steelblue, .steelblue a {
-    color: steelblue
+	color: steelblue
 }
 
 .deepskyblue, .deepskyblue a, .intelligent, .intelligent a {
-    color: deepskyblue
+	color: deepskyblue
 }
 
 .dodgerblue, .dodgerblue a {
-    color: dodgerblue
+	color: dodgerblue
 }
 
 .blue, .blue a {
-    color: blue
+	color: blue
 }
 
 .gold, .gold a, .trust.dec, .trust.dec a, .trust.frightened, .trust.frightened a {
-    color: gold
+	color: gold
 }
 
 .goldenrod, .goldenrod a, .trust.terrified, .trust.terrified a {
-    color: goldenrod
+	color: goldenrod
 }
 
 .gray, .gray a {
-    color: gray
+	color: gray
 }
 
 .green, .green a, .reputation.inc, .reputation.inc a, .improvement, .improvement a, .flaw.break, .flaw.break a,
 .skill.inc, .skill.inc a, .fuckdoll, .fuckdoll a, .positive, .positive a, .health.inc, .health.inc a, .prestigious,
 .prosperity.inc {
-    color: green
+	color: green
 }
 
 .hotpink, .hotpink a, .devotion.inc, .devotion.inc a, .devotion.accept, .devotion.accept a {
-    color: hotpink
+	color: hotpink
 }
 
 .lawngreen, .lawngreen a {
-    color: lawngreen
+	color: lawngreen
 }
 
 .lightblue, .lightblue a {
-    color: lightblue
+	color: lightblue
 }
 
 /* compare pink for fetish */
 .lightcoral, .lightcoral a, .fetish.gain, .fetish.gain a {
-    color: lightcoral
+	color: lightcoral
 }
 
 .lightgreen, .lightgreen a, .relationship, .relationship a, .rivalry.dec, .rivalry.dec a {
-    color: lightgreen
+	color: lightgreen
 }
 
 .lightpink, .lightpink a {
-    color: lightpink
+	color: lightpink
 }
 
 .lightsalmon, .lightsalmon a, .fetish.inc, .fetish.inc a, .rivalry.inc, .rivalry.inc a,
 .relationship.dec, .relationship.dec a {
-    color: lightsalmon
+	color: lightsalmon
 }
 
 /* tight orifices, breast changes, take virginity, not sure on good aliases */
 .lime, .lime a, .change.positive, .change.positive a, .virginity.loss, .virginity.loss a, .puberty, .puberty a,
 .pregnant, .pregnant a {
-    color: lime
+	color: lime
 }
 
 /* multiple questionable uses */
 .limegreen, .limegreen a {
-    color: limegreen
+	color: limegreen
 }
 
 .magenta, .magenta a, .devotion.worship, .devotion.worship a {
-    color: magenta
+	color: magenta
 }
 
 .mediumaquamarine, .mediumaquamarine a, .trust.inc, .trust.inc a, .trust.careful, .trust.careful a {
-    color: mediumaquamarine
+	color: mediumaquamarine
 }
 
 .mediumorchid, .mediumorchid a, .devotion.dec, .devotion.dec a, .devotion.resistant, .devotion.resistant a {
-    color: mediumorchid
+	color: mediumorchid
 }
 
 .mediumseagreen, .mediumseagreen a, .trust.trusting, .trust.trusting a {
-    color: mediumseagreen
+	color: mediumseagreen
 }
 
 /* generally between red and green, and a lot of other places */
 .orange, .orange a, .stupid, .stupid a, .change.negative, .change.negative a, .defiant.careful, .defiant.careful a,
 .ncs, .ncs a, .miscarriage, .miscarriage a, .intro.question {
-    color: orange
+	color: orange
 }
 
 .orangered, .orangered a, .defiant.inc, .defiant.inc a, .defiant.bold, .defiant.bold a, .education.neg a, .unintelligent {
-    color: orangered
+	color: orangered
 }
 
 /* used once (wrong? */
 .orchid, .orchid a {
-    color: orchid
+	color: orchid
 }
 
 /* also fetish start ??? , and a lot of other stuff */
 .pink, .pink a, .slave.name.simple {
-    color: pink
+	color: pink
 }
 
 /* generally bad stuff */
@@ -154,62 +154,62 @@
 .red, .red a, .health.dec, .health.dec a, .cash.dec, .cash.dec a, .stat.drop, .stat.drop a, .flaw, .flaw a, .flaw.gain, .flaw.gain a,
 .mindbreak, .mindbreak a, .error, .error a, .elites.loss, .elites.loss a, .reputation.dec, .reputation.dec a,
 .warning, .warning a, .prosperity.dec {
-    color: red
+	color: red
 }
 
 /* FIXME: not working correctly - displays at top right corner of screen instead of after content in container */
 div > span.warning.notification::after {
-    font-family: "tme-fa-icons";
-    position: absolute;
-    right: 5px;
-    top: 0;
-    content: "\e80c";
-    color: red;
-    font-style: normal;
+	font-family: "tme-fa-icons";
+	position: absolute;
+	right: 5px;
+	top: 0;
+	content: "\e80c";
+	color: red;
+	font-style: normal;
 }
 
 .seagreen, .seagreen a, .trust.prof-trusting, .trust.prof-trusting a {
-    color: seagreen
+	color: seagreen
 }
 
 .springgreen, .springgreen a, .skill.player, .skill.player a {
-    color: springgreen
+	color: springgreen
 }
 
 /* some ethnicity */
 .tan, .tan a {
-    color: tan
+	color: tan
 }
 
 .chocolate, .chocolate a, .food {
-    color: chocolate
+	color: chocolate
 }
 
 .saddlebrown, .saddlebrown a {
-    color: saddlebrown
+	color: saddlebrown
 }
 
 .teal, .teal a {
-    color: teal
+	color: teal
 }
 
 .yellow, .yellow a, .noteworthy, .noteworthy a, .paraphilia.gain, .paraphilia.gain a,
 .devotion.ambivalent, .devotion.ambivalent a, .trust.fearful, .trust.fearful a, .job.change {
-    color: yellow
+	color: yellow
 }
 
 .yellowgreen, .yellowgreen a, .cash.inc, .cash.inc a, .cash, .cash a {
-    color: yellowgreen
+	color: yellowgreen
 }
 
 .white a {
-    color: white
+	color: white
 }
 
 .violet, .libido.inc {
-    color: violet
+	color: violet
 }
 
 .khaki, .libido.dec {
-    color: khaki
+	color: khaki
 }
diff --git a/css/gui/favorite.css b/css/gui/favorite.css
index e6069066bcdaa3aa9953bb5751391e7a0e2605b3..8977f8344afd17fa1f8e84abaa8dc27ad55c493c 100644
--- a/css/gui/favorite.css
+++ b/css/gui/favorite.css
@@ -1,9 +1,9 @@
 .favorite, .favorite:hover {
-    color: yellow;
-    text-decoration: none;
+	color: yellow;
+	text-decoration: none;
 }
 
 .not-favorite, .not-favorite:hover {
-    color: grey;
-    text-decoration: none;
+	color: grey;
+	text-decoration: none;
 }
diff --git a/css/gui/hotkeySettings.css b/css/gui/hotkeySettings.css
index 08df500e4bc6e6c637c2739c4ff61c1f29494414..57716805ccf374860d76b800a45269a68fd3aa3c 100644
--- a/css/gui/hotkeySettings.css
+++ b/css/gui/hotkeySettings.css
@@ -1,42 +1,42 @@
 div.hotkey-settings {
-    display: grid;
-    grid-template-columns: repeat(3, max-content) auto;
+	display: grid;
+	grid-template-columns: repeat(3, max-content) auto;
 }
 
 @media only screen and (min-width: 1600px) {
-    div.hotkey-settings {
-        grid-template-columns: repeat(3, max-content) auto repeat(3, max-content) auto;
-    }
+	div.hotkey-settings {
+		grid-template-columns: repeat(3, max-content) auto repeat(3, max-content) auto;
+	}
 }
 
 div.hotkey-settings div.description {
-    margin-right: 10px;
-    /* center text vertically */
-    display: flex;
-    justify-content: center;
-    flex-direction: column;
+	margin-right: 10px;
+	/* center text vertically */
+	display: flex;
+	justify-content: center;
+	flex-direction: column;
 }
 
 div.hotkey-settings button {
-    margin: 5px;
-    border-width: 2px;
-    background-color: var(--button-color);
-    border-color: var(--button-border-color);
-    width: 70px;
+	margin: 5px;
+	border-width: 2px;
+	background-color: var(--button-color);
+	border-color: var(--button-border-color);
+	width: 70px;
 }
 
 div.hotkey-settings button.combination {
-    min-width: 150px;
-    border-width: 0;
+	min-width: 150px;
+	border-width: 0;
 }
 
 div.hotkey-settings button.inactive, div.hotkey-settings button.inactive:hover {
-    background-color: var(--button-selected-color);
-    cursor: default;
+	background-color: var(--button-selected-color);
+	cursor: default;
 
 }
 
 div.hotkey-settings button:hover {
-    background-color: var(--button-hover-color);
-    border-color: var(--button-border-color);
+	background-color: var(--button-hover-color);
+	border-color: var(--button-border-color);
 }
diff --git a/css/gui/linksStrip.css b/css/gui/linksStrip.css
index 7e11243e9b9cfa023148502f41328a30b510b768..18f2a89ff085ffcc47ffe79cd57ac496aa317ba1 100644
--- a/css/gui/linksStrip.css
+++ b/css/gui/linksStrip.css
@@ -1,20 +1,20 @@
 ul.choices-strip {
-    display: inline;
-    list-style-type: none;
-    padding: 0mm;
-    margin-left: 0em;
+	display: inline;
+	list-style-type: none;
+	padding: 0mm;
+	margin-left: 0em;
 }
 
 ul.choices-strip li {
-    display: inline;
+	display: inline;
 }
 
 ul.choices-strip li + li:before {
-    content: " | ";
+	content: " | ";
 }
 
 a.disabled {
-    color: white;
-    pointer-events: none;
-    cursor: default;
+	color: white;
+	pointer-events: none;
+	cursor: default;
 }
diff --git a/css/gui/options.css b/css/gui/options.css
index 606c2979f5d6e4b0988004447925d9002ed460b7..eb58e8fc6d38b45f2364ceb702c241983c14ca2f 100644
--- a/css/gui/options.css
+++ b/css/gui/options.css
@@ -135,8 +135,8 @@ div.options-group input.full-width {
 }
 
 table.invisible {
-    table-layout: fixed;
-    border-collapse: separate;
-    border-spacing: 5px;
-    margin:1em auto;
+	table-layout: fixed;
+	border-collapse: separate;
+	border-spacing: 5px;
+	margin:1em auto;
 }
diff --git a/css/gui/quicklinks.css b/css/gui/quicklinks.css
index 757b80238d053f4f9c1855ff94b3364e0bc9a40b..2392e4dd537c54bd5d01359987ffd3ba90879e9c 100644
--- a/css/gui/quicklinks.css
+++ b/css/gui/quicklinks.css
@@ -1,65 +1,65 @@
 div.quick-links {
-    /* Give quick links as much space as possible, any more and it start looking wrong. */
-    margin: 0 -7px;
-    /* the last menu link has a bottom outline, make enough space for it */
-    margin-bottom: 2px;
+	/* Give quick links as much space as possible, any more and it start looking wrong. */
+	margin: 0 -7px;
+	/* the last menu link has a bottom outline, make enough space for it */
+	margin-bottom: 2px;
 }
 
 div.quick-links div.toggle {
-    position: relative; /* so ::before/::after works in relation to this element */
-    background-color: #444444;
-    cursor: pointer;
+	position: relative; /* so ::before/::after works in relation to this element */
+	background-color: #444444;
+	cursor: pointer;
 }
 
 div.quick-links div.toggle:hover {
-    background-color: #5f5f5f;
+	background-color: #5f5f5f;
 }
 
 div.quick-links div.toggle::before {
-    font-family: "tme-fa-icons";
-    position: absolute;
-    left: 5px;
-    content: "\e818";
+	font-family: "tme-fa-icons";
+	position: absolute;
+	left: 5px;
+	content: "\e818";
 }
 
 div.quick-links div.collapsed div.toggle::before {
-    content: "\e81a";
+	content: "\e81a";
 }
 
 div.quick-links div.content {
-    margin: 0 5px;
+	margin: 0 5px;
 }
 
 div.quick-links div.collapsed div.content {
-    display: none
+	display: none
 }
 
 div.quick-links div.menu-link {
-    background-color: #2b2b2b;
-    border: solid #3c3c3c;
-    border-width: 0 2px;
-    margin: 0 2px;
-    /* we cannot detect if an element has something after it, so we just add a shadow to every element. Only for the
-        last element the shadow is not hidden behind another element. */
-    box-shadow: 0 2px 0 0 #3c3c3c;
-    /* make sure the notification is relative to the correct element */
-    position: relative;
+	background-color: #2b2b2b;
+	border: solid #3c3c3c;
+	border-width: 0 2px;
+	margin: 0 2px;
+	/* we cannot detect if an element has something after it, so we just add a shadow to every element. Only for the
+		last element the shadow is not hidden behind another element. */
+	box-shadow: 0 2px 0 0 #3c3c3c;
+	/* make sure the notification is relative to the correct element */
+	position: relative;
 }
 
 div.quick-links > div.menu-link:first-child, /* give the very first link an upper border */
 div.quick-links div:not(.menu-link):not(.collapsed) + div.menu-link /* give the link directly after an opened toggle an upper border */
 {
-    border-top-width: 2px;
+	border-top-width: 2px;
 }
 
 /* notification */
 div.quick-links div.notification:not(.category)::after /* notification for entry */,
 div.quick-links div.category.notification.collapsed > div.toggle::after /* notification for category, disable when uncollapsed */
 {
-    font-family: "tme-fa-icons";
-    position: absolute;
-    right: 5px;
-    top: 0;
-    content: "\e80c";
-    color: yellow;
+	font-family: "tme-fa-icons";
+	position: absolute;
+	right: 5px;
+	top: 0;
+	content: "\e80c";
+	color: yellow;
 }
diff --git a/css/gui/tooltips/tippy.css b/css/gui/tooltips/tippy.css
index b6880fe60b2ef2fa1c5918e1c7e142d89bb24064..ab4273b3700380a1de20978f2830d372b0b6b375 100644
--- a/css/gui/tooltips/tippy.css
+++ b/css/gui/tooltips/tippy.css
@@ -1,21 +1,21 @@
 .has-tooltip {
-    text-decoration: underline dotted;
+	text-decoration: underline dotted;
 }
 
 .tippy-content {
-    text-indent: initial;
+	text-indent: initial;
 }
 
 .tippy-content ul {
-    margin: 5px;
+	margin: 5px;
 }
 .tippy-content ul:not(.choices-strip) {
-    padding-left: 10px;
+	padding-left: 10px;
 }
 
 .tippy-content .tip-details {
-    font-size: smaller;
-    /* if there isn't enough space vertically, add a scrollbar */
-    overflow-y: auto;
-    max-height: 95vh;
+	font-size: smaller;
+	/* if there isn't enough space vertically, add a scrollbar */
+	overflow-y: auto;
+	max-height: 95vh;
 }
diff --git a/css/interaction/export.css b/css/interaction/export.css
index 72eabfbdb7af31eb594f96cf15d088517b088ca2..d54575954576d2049ff25d425cc8a7b9d21871b9 100644
--- a/css/interaction/export.css
+++ b/css/interaction/export.css
@@ -1,6 +1,6 @@
 div.output {
-    width: 100vw;
-    max-width: 100%;
-    word-break: break-all;
-    white-space: normal;
+	width: 100vw;
+	max-width: 100%;
+	word-break: break-all;
+	white-space: normal;
 }
diff --git a/css/interaction/slaveInteract.css b/css/interaction/slaveInteract.css
index 5eeb64e09bc85eabf060127f3802724decb9a8cb..8050ac2aea95201e974c5a3c031d8b788c1e719c 100644
--- a/css/interaction/slaveInteract.css
+++ b/css/interaction/slaveInteract.css
@@ -1,11 +1,11 @@
 .adjacent-slave {
-    font-weight: bold;
+	font-weight: bold;
 }
 
 .interact-name {
-    margin: 0 2em;
+	margin: 0 2em;
 }
 
 .si-header {
-    font-size: 1.5em;
+	font-size: 1.5em;
 }
diff --git a/css/interaction/wardrobe.css b/css/interaction/wardrobe.css
index bd0797ce1f11e79326f037c586173645b27e1995..506182e31a86ca4719ec0fcb4a18cf2106f874dd 100644
--- a/css/interaction/wardrobe.css
+++ b/css/interaction/wardrobe.css
@@ -1,3 +1,3 @@
 .filter-row .button-group {
-    margin: 1em;
+	margin: 1em;
 }
diff --git a/css/intro/customizeSlaveTrade.css b/css/intro/customizeSlaveTrade.css
index 7e521dc1f36ff9226170a7cd55d0588263437658..8d666835b95d0e991e000143e250dde345cf7e72 100644
--- a/css/intro/customizeSlaveTrade.css
+++ b/css/intro/customizeSlaveTrade.css
@@ -1,8 +1,8 @@
 .customize-slave-trade-ul {
-    list-style-type: none;
-    content: '';
-    width: 100%;
-    display: inline-block;
+	list-style-type: none;
+	content: '';
+	width: 100%;
+	display: inline-block;
 }
 
 .customize-slave-trade-li-container {
@@ -12,10 +12,10 @@
 }
 
 .customize-slave-trade-li {
-    text-align: center;
-    display: inline-block;
-    padding: 2px;
-    width: 15em;
+	text-align: center;
+	display: inline-block;
+	padding: 2px;
+	width: 15em;
 }
 
 span.plusButton {
diff --git a/css/manage/main.css b/css/manage/main.css
index 3b1c3042dd81fd8e6ed1c4756b96fd8921e051d1..6d38fbfb9a3ce4b62d4184c4d060699f4b475620 100644
--- a/css/manage/main.css
+++ b/css/manage/main.css
@@ -1,4 +1,4 @@
 .main-fcnn {
-    text-align: center;
-    margin: 0 auto;
+	text-align: center;
+	margin: 0 auto;
 }
diff --git a/css/neighbor/neighborDisplay.css b/css/neighbor/neighborDisplay.css
index 87c240223bf31ca5a97513c1f717993166fa8d28..5ba033775141de8bfb7208533a27c6b4ce7806f3 100644
--- a/css/neighbor/neighborDisplay.css
+++ b/css/neighbor/neighborDisplay.css
@@ -1,48 +1,48 @@
 .neighbor-container {
-  background-color: rgba(17,17,17,1);
-  padding: 5px;
-  max-width: fit-content;
-  margin: 0 auto;
+	background-color: rgba(17,17,17,1);
+	padding: 5px;
+	max-width: fit-content;
+	margin: 0 auto;
 }
 
 .neighbor-container-grid {
-  display: grid;
-  grid-template-columns: auto auto auto;
+	display: grid;
+	grid-template-columns: auto auto auto;
 }
 
 .neighbor-container-list {
-  display: flex;
-  flex-flow: row wrap;
-  align-items: flex-start;
+	display: flex;
+	flex-flow: row wrap;
+	align-items: flex-start;
 }
 
 .neighbor-item {
-  margin: 3px;
-  border: 5px solid;
-  padding: 10px;
-  text-align: center;
+	margin: 3px;
+	border: 5px solid;
+	padding: 10px;
+	text-align: center;
 }
 
 .neighbor-item-selected {
-  background-color: rgba(255, 255, 255, 0.2);
+	background-color: rgba(255, 255, 255, 0.2);
 }
 
 .neighbor-item-empty {
-  border-color: rgba(17,17,17,1);
+	border-color: rgba(17,17,17,1);
 }
 
 .neighbor-item-self {
-  border-color: white;
+	border-color: white;
 }
 
 .neighbor-item-owned {
-  border-color: steelblue;
+	border-color: steelblue;
 }
 
 .neighbor-item-unowned {
-  border-color: red;
+	border-color: red;
 }
 
 .neighbor-item-rival {
-  border-color: crimson;
+	border-color: crimson;
 }
diff --git a/css/rulesAssistant/raLists.css b/css/rulesAssistant/raLists.css
index 70cd924e242db5577c85ede9dd4c92025361e5e3..d2869900aa1bf6d795e91f8b10bdd5c6bf355c84 100644
--- a/css/rulesAssistant/raLists.css
+++ b/css/rulesAssistant/raLists.css
@@ -1,41 +1,41 @@
 .rajs-list-item {
-    display: inline-block;
-    color: var(--link-color);
-    margin-right: 1em;
+	display: inline-block;
+	color: var(--link-color);
+	margin-right: 1em;
 }
 
 .rajs-list-item.selected {
-    color: gray;
-    text-decoration: none;
+	color: gray;
+	text-decoration: none;
 }
 
 .rajs-list-item:last-of-type {
-    margin-right: 0;
+	margin-right: 0;
 }
 
 .rajs-list-item:hover {
-    cursor: pointer;
-    text-decoration: underline;
+	cursor: pointer;
+	text-decoration: underline;
 }
 
 .rajs-list-item.selected:hover {
-    cursor: default;
-    text-decoration: none;
+	cursor: default;
+	text-decoration: none;
 }
 
 .rajs-list strong:first-of-type, .rajs-list input {
-    margin-right: 2em;
+	margin-right: 2em;
 }
 
 .rajs-list-item input {
-    margin: 0.25em;
+	margin: 0.25em;
 }
 
 .rajs-section h1 {
-    border-bottom: 1px solid white;
-    cursor: pointer;
+	border-bottom: 1px solid white;
+	cursor: pointer;
 }
 
 .rajs-section h1:hover {
-    text-decoration: underline;
+	text-decoration: underline;
 }
diff --git a/css/rulesAssistant/raSummary.css b/css/rulesAssistant/raSummary.css
index ee40575e92c1d01f8f3a358c1d3a30c5f80ab236..2111d702d7180e1dff96d0e4b382a1802b90211a 100644
--- a/css/rulesAssistant/raSummary.css
+++ b/css/rulesAssistant/raSummary.css
@@ -1,37 +1,37 @@
 table.ra-sum {
-    text-align: left;
-    empty-cells: hide;
+	text-align: left;
+	empty-cells: hide;
 }
 
 th.ra-sum, td.ra-sum {
-    border: 1px solid grey;
+	border: 1px solid grey;
 }
 
 td.ra-sum {
-    white-space: nowrap;
-    overflow: hidden;
+	white-space: nowrap;
+	overflow: hidden;
 }
 
 tr.ra-sum:nth-child(even) {
-    background-color: #444444;
+	background-color: #444444;
 }
 
 tr.ra-sum.header {
-    position:sticky;
-    top:0px;
-    z-index:2;
-    background:#111;
+	position:sticky;
+	top:0px;
+	z-index:2;
+	background:#111;
 }
 
 th.ra-sum.first-header-cell {
-    empty-cells: show;
-    border-style: hidden 
+	empty-cells: show;
+	border-style: hidden 
 }
 
 td.ra-sum.row-title {
-    position:sticky;
-    left: 0px;
-    z-index:1;
-    background:#111;
-    opacity: 0.8;
+	position:sticky;
+	left: 0px;
+	z-index:1;
+	background:#111;
+	opacity: 0.8;
 }
diff --git a/devNotes/tests/diffProxyTest.js b/devNotes/tests/diffProxyTest.js
index 39fa429ac39725a13974370ca00c00c9da7789f9..72ec17ec588e68cdeda1321db39cd22df152e01f 100644
--- a/devNotes/tests/diffProxyTest.js
+++ b/devNotes/tests/diffProxyTest.js
@@ -14,9 +14,9 @@ function tests() {
 		const original = p.diffOriginal;
 		const diff = p.diffChange;
 		console.log("Original:", _.cloneDeep(original));
-		console.log("Diff:    ", diff);
+		console.log("Diff: ", diff);
 		App.Utils.Diff.applyDiff(original, diff);
-		console.log("Apply:   ", original);
+		console.log("Apply: ", original);
 	}
 
 	log("Proxy", getProxy(orig()));
diff --git a/devNotes/usefulJSFunctionDocumentation.md b/devNotes/usefulJSFunctionDocumentation.md
index 716e8ee6d6e98fcb8beae3aa506a410e13994b8b..7a483acadca3fab27ef5907f18652f6b8016479f 100644
--- a/devNotes/usefulJSFunctionDocumentation.md
+++ b/devNotes/usefulJSFunctionDocumentation.md
@@ -198,7 +198,7 @@ relationshipChecks [script] All work as expected with <<if X.rivalryTarget == $s
 
 	contextualIntro(context, actor, insertComma=false) // Introduces an actor by using any meaningful relationship(s) with an already on-screen actor, and their name.
 		//Returns strings like: "your husband John", "his growing rival and mother Alice", or "her best friend and twin sister Carla".
-		//If there is no known relationship between them, retuns the name alone.  If insertComma is true, it will generate "her father, Dave" instead of "her father Dave".
+		//If there is no known relationship between them, retuns the name alone. If insertComma is true, it will generate "her father, Dave" instead of "her father Dave".
 		//Use this function instead of just printing the slave's name when you'd like to let the player to know if two actors are related, even though it's not going to have any mechanical impact on the scene.
 
 bellyAdjective(slave) // Returns a string describing her belly size.
@@ -383,15 +383,15 @@ findFather(ID) // searches for the ID given and returns an object or undefined
 ```
 ## Release Functions ##
 ```js
-sexAllowed // returns true if both slaves are allowed to have sex with each other.  All non-assignment sex should check here first; use disobedience() to determine if the slave or slaves involved will ignore the rules.
+sexAllowed // returns true if both slaves are allowed to have sex with each other. All non-assignment sex should check here first; use disobedience() to determine if the slave or slaves involved will ignore the rules.
 
-hasPartnerSex // returns true if the slave has a romantic partner, the relationship is sexual, and they are allowed to sex.  Unless you are specifically checking the theoretical rule, check this instead of rules.release.partner.
+hasPartnerSex // returns true if the slave has a romantic partner, the relationship is sexual, and they are allowed to sex. Unless you are specifically checking the theoretical rule, check this instead of rules.release.partner.
 
-hasFamilySex // returns true if the slave has a close family member, they are allowed to have sex, and the player is OK with seeing the result.  Unless you are specifically checking the theoretical rule, check this instead of rules.release.family.
+hasFamilySex // returns true if the slave has a close family member, they are allowed to have sex, and the player is OK with seeing the result. Unless you are specifically checking the theoretical rule, check this instead of rules.release.family.
 
-hasNonassignmentSex // returns true if the slave is having some kind of sex while off-duty with a partner other than the PC.  This function provides the answer to "can I mention this slave having an off-duty sexual encounter of some kind."
+hasNonassignmentSex // returns true if the slave is having some kind of sex while off-duty with a partner other than the PC. This function provides the answer to "can I mention this slave having an off-duty sexual encounter of some kind."
 
-releaseRestricted // returns true if the slave has some kind of rule limiting the off-duty sex they have.  If it returns false, the slave is completely free to fuck whomever they want.
+releaseRestricted // returns true if the slave has some kind of rule limiting the off-duty sex they have. If it returns false, the slave is completely free to fuck whomever they want.
 ```
 ## Other Functions ##
 ```js
diff --git a/devTools/types/FC/human.d.ts b/devTools/types/FC/human.d.ts
index d683f534a7ed5f8f5bad8c3e329774a6add4127b..e87e00cad4a434540e89ec6f1c0a6684420490ae 100644
--- a/devTools/types/FC/human.d.ts
+++ b/devTools/types/FC/human.d.ts
@@ -163,7 +163,7 @@ declare global {
 			| "advocate">;
 
 		type SexualFlaw = WithNone<
-			/**  hates oral sex */
+			/** hates oral sex */
 			| "hates oral"
 			/** hates anal sex */
 			| "hates anal"
@@ -393,7 +393,7 @@ declare global {
 			/** slave can only ever birth girls */
 			girlsOnly: GeneticQuirk;
 			/** abnormal production of amniotic fluid
-			 *  only affects fetuses */
+			 * only affects fetuses */
 			polyhydramnios: GeneticQuirk;
 			/** inappropriate lactation*/
 			galactorrhea: GeneticQuirk | 3;
diff --git a/devTools/types/extensions.d.ts b/devTools/types/extensions.d.ts
index e0d7fb808ba794473b9b11ea4d1eaa46744450e8..73b867fe4f91cd9b8b03b25d09f274b3a236ba80 100644
--- a/devTools/types/extensions.d.ts
+++ b/devTools/types/extensions.d.ts
@@ -62,7 +62,7 @@ declare namespace d3dTree {
 		hideMarriageNodes: boolean;
 		marriageNodeSize: number;
 		/**
-		 *  Callbacks should only be overwritten on a need to basis.
+		 * Callbacks should only be overwritten on a need to basis.
 		 * See the section about callbacks below.
 		 */
 		callbacks: {
diff --git a/js/003-data/clothes/001-slaveWearData.js b/js/003-data/clothes/001-slaveWearData.js
index a5a64627b615e6ffb62f57a38bebbd9caf94c188..8258a864959cfbb0d485aefb9054b98c96b77772 100644
--- a/js/003-data/clothes/001-slaveWearData.js
+++ b/js/003-data/clothes/001-slaveWearData.js
@@ -37,7 +37,7 @@
  * @property {clothingDescription} [desc]
  */
 
-/** @type {Map.<FC.Clothes, clothes>} The string here will be what is applied to the relevant slave property.  Slave.clothes = "a bunny outfit", not "Bunny outfit".*/
+/** @type {Map.<FC.Clothes, clothes>} The string here will be what is applied to the relevant slave property. Slave.clothes = "a bunny outfit", not "Bunny outfit".*/
 App.Data.clothes = (new Map())
 	.set("a Fuckdoll suit",
 		{
@@ -1259,8 +1259,8 @@ App.Data.mouthAccessory = new Map([
  * @property {itemFS} [fs]
  * @property {boolean} [requirements]
  * @property {boolean} [harsh]
- * @property {number} heelHeight height in cm.  Over 4cm they may totter.  21cm and over (8 inch heels) will be painful/extreme
- * @property {number} platformHeight height in cm.  Adds to heel height.
+ * @property {number} heelHeight height in cm. Over 4cm they may totter. 21cm and over (8 inch heels) will be painful/extreme
+ * @property {number} platformHeight height in cm. Adds to heel height.
  */
 
 /**
diff --git a/js/003-data/futureSocietyData.js b/js/003-data/futureSocietyData.js
index d3771e1873fad74a3ad59cdb98997cbdaae81202..aab034f6f7a588daf3a39ee2ec404539043e1475 100644
--- a/js/003-data/futureSocietyData.js
+++ b/js/003-data/futureSocietyData.js
@@ -1,7 +1,8 @@
 App.Data.FutureSociety = {
-	/** Each future society contains a record here, along with a noun and adjective form for use in printed text, and the decoration string (normally also an adjective form).
-	 *  Most of the automatic mechanics for FS adoption, influence, facility decoration, etc, are handled directly from this data; flavor text is not.
-	 *  @type {Record<FC.FutureSociety, {noun: FC.FutureSocietyNoun, adj: FC.FutureSocietyAdj, deco: FC.FutureSocietyDeco, NPCOnly?: boolean, language?: string, nationality?: string}>} */
+	/**
+	 * Each future society contains a record here, along with a noun and adjective form for use in printed text, and the decoration string (normally also an adjective form).
+	 * Most of the automatic mechanics for FS adoption, influence, facility decoration, etc, are handled directly from this data; flavor text is not.
+	 * @type {Record<FC.FutureSociety, {noun: FC.FutureSocietyNoun, adj: FC.FutureSocietyAdj, deco: FC.FutureSocietyDeco, NPCOnly?: boolean, language?: string, nationality?: string}>} */
 	records: ({
 		FSSupremacist: {noun: "Racial Supremacism", adj: "Supremacist", deco: "Supremacist"},
 		FSSubjugationist: {noun: "Racial Subjugationism", adj: "Subjugationist", deco: "Subjugationist"},
@@ -78,8 +79,8 @@ App.Data.FutureSociety = {
 	}),
 
 	/** Each subarray in this array contains a set of Future Societies which are to be considered mutually exclusive.
-	 *  They cannot be adopted at the same time by the same arcology, and if adopted by different arcologies,
-	 *  will automatically conflict and reduce diplomatic relations. */
+	 * They cannot be adopted at the same time by the same arcology, and if adopted by different arcologies,
+	 * will automatically conflict and reduce diplomatic relations. */
 	mutexGroups: (/** @returns {FC.FutureSociety[][]} */ function() {
 		/* this tiny-but-hideous IIFE is the only way I can get typechecking to work properly here, without a JSDoc equivalent to TS "as const" to prevent literal type widening */
 		return [
diff --git a/js/003-data/gameVariableData.js b/js/003-data/gameVariableData.js
index 375aec5af024aa2159c96cc24d28d51fc4483005..e8d2ddd80abc685be787e9ccbeb45899058e2e84 100644
--- a/js/003-data/gameVariableData.js
+++ b/js/003-data/gameVariableData.js
@@ -1,4 +1,4 @@
-// A whitelist for ingame variables.  Used to init the game or fill in gaps.  Also used as a whitelist.  Anything not on this list will be removed on BC.
+// A whitelist for ingame variables. Used to init the game or fill in gaps. Also used as a whitelist. Anything not on this list will be removed on BC.
 App.Data.defaultGameStateVariables = {
 	// Page
 	nextButton: "Continue",
@@ -284,7 +284,7 @@ App.Data.illegalWares = [
 ];
 
 
-// The other half of the above whitelist.  However, entries in this array will be forced to the values set here upon starting NG+.
+// The other half of the above whitelist. However, entries in this array will be forced to the values set here upon starting NG+.
 App.Data.resetOnNGPlus = {
 	policies: {
 		retirement: {
@@ -1298,7 +1298,7 @@ App.Data.resetOnNGPlus = {
 	},
 	tempEventToggle: 0,
 	/**
-	 * Assignments texts for slaves who choose their own assignment, set at during the first pass in  App.SlaveAssignment.choosesOwnJob()
+	 * Assignments texts for slaves who choose their own assignment, set at during the first pass in App.SlaveAssignment.choosesOwnJob()
 	 * @type {Object.<number, string>}
 	 */
 	choosesOwnAssignmentText: {},
diff --git a/js/003-data/slaveGeneData.js b/js/003-data/slaveGeneData.js
index 60714aaacbda54c10d6048ea5f005ed8a3768e19..fb6a3ee3c9c8129e6191e243729630b10a35d748 100644
--- a/js/003-data/slaveGeneData.js
+++ b/js/003-data/slaveGeneData.js
@@ -216,7 +216,7 @@ App.Data.geneticMods = new Map([
 			title: "immortal",
 			abbreviation: "imrtl",
 			goodTrait: true,
-			description: "slave stops aging.  Can still die of other causes."
+			description: "slave stops aging. Can still die of other causes."
 		},
 	],
 ]);
diff --git a/js/003-data/slaveProstheticsData.js b/js/003-data/slaveProstheticsData.js
index e9e3c6fb4ead486fd109b4e3feed8c9f27e31a28..2da990f1fce2820dfa01c69ae0a05b52c827cfb0 100644
--- a/js/003-data/slaveProstheticsData.js
+++ b/js/003-data/slaveProstheticsData.js
@@ -10,7 +10,7 @@ App.Data.prostheticIDs =
  * @typedef {object} prosthetics
  * @property {string} name expected to singular and lowercase
  * @property {number} adjust time required to adjust an existing prosthetic to a slave
- * @property {number} craft time required to create a new, not to  a specific slave fitted prosthetic
+ * @property {number} craft time required to create a new, not to a specific slave fitted prosthetic
  * @property {number} research time required to research the prosthetic
  * @property {number} level minimum level the prosthetics lab needs to research/craft the prosthetic
  * @property {number} costs cash required to buy the prosthetic
diff --git a/js/utils.js b/js/utils.js
index 29aaf545acdedd31798d37bc7a830c82c4c491af..cba532a786ec80d7fb222f96415fb680c4e7d7e4 100644
--- a/js/utils.js
+++ b/js/utils.js
@@ -185,7 +185,7 @@ function ordinalSuffix(i) {
  * @param {number} i
  * @returns {string}
  * Takes a number and returns the appropriate ordinal.
- *  Example: `ordinalSuffix(1)` gives `first`.
+ * Example: `ordinalSuffix(1)` gives `first`.
  * For number greater than 19 identical to `ordinalSuffix(i)`
  */
 function ordinalSuffixWords(i) {
diff --git a/src/002-config/fc-version.js b/src/002-config/fc-version.js
index a792717a4d305682c464347c5bd0176adc690b50..ece1f97e2e1cf35b996683fda367b283ff27f2e7 100644
--- a/src/002-config/fc-version.js
+++ b/src/002-config/fc-version.js
@@ -2,5 +2,5 @@ App.Version = {
 	base: "0.10.7.1", // The vanilla version the mod is based off of, this should never be changed.
 	pmod: "4.0.0-alpha.10",
 	commitHash: null,
-	release: 1145 // When getting close to 2000,  please remove the check located within the onLoad() function defined at line five of src/js/eventHandlers.js.
+	release: 1145 // When getting close to 2000, please remove the check located within the onLoad() function defined at line five of src/js/eventHandlers.js.
 };
diff --git a/src/004-base/baseEvent.js b/src/004-base/baseEvent.js
index 19ca30806f7a181f783cc96b65ff8f2bdb9eb510..0479b8f8b00165679d6b8c9902017ed02625df72 100644
--- a/src/004-base/baseEvent.js
+++ b/src/004-base/baseEvent.js
@@ -1,8 +1,9 @@
 /** base class for class-based events */
 App.Events.BaseEvent = class BaseEvent {
-	/** build a new event
-	 *  parameters are necessary for serialization (so that saving with the event active will work correctly) and should not normally be used directly
-	 *  child classes will inherit this implementation automatically, and should not normally need their own constructor implementation
+	/**
+	 * build a new event
+	 * parameters are necessary for serialization (so that saving with the event active will work correctly) and should not normally be used directly
+	 * child classes will inherit this implementation automatically, and should not normally need their own constructor implementation
 	 * @param {Array<number>} [actors]
 	 * @param {object} [params]
 	 */
@@ -18,8 +19,8 @@ App.Events.BaseEvent = class BaseEvent {
 	 * @returns {boolean}
 	 */
 	/** generate an array of zero or more predicates which must all return true in order for the event to be valid.
-	 *  lambda predicates may add properties to {@link App.Events.BaseEvent#params the params member} in order to pass information on to the event.
-	 *  child classes should implement this.
+	 * lambda predicates may add properties to {@link App.Events.BaseEvent#params the params member} in order to pass information on to the event.
+	 * child classes should implement this.
 	 * @returns {Array<eventPredicate>}
 	 */
 	eventPrerequisites() {
@@ -32,7 +33,7 @@ App.Events.BaseEvent = class BaseEvent {
 	 * @returns {boolean}
 	 */
 	/** generate an array of zero or more arrays, each corresponding to an actor in the event, which contain zero or more predicates which must be satisfied by the actor.
-	 *  child classes should implement this, unless they don't need any actors, or are overriding castActors.
+	 * child classes should implement this, unless they don't need any actors, or are overriding castActors.
 	 * @returns {Array<Array<actorPredicate>>}
 	 */
 	actorPrerequisites() {
@@ -47,27 +48,27 @@ App.Events.BaseEvent = class BaseEvent {
 	}
 
 	/** run the event and attach DOM output to the event passage.
-	 *  child classes must implement this.
+	 * child classes must implement this.
 	 * @param {ParentNode} node - Document fragment which event output should be attached to
 	 */
 	execute(node) {
 	}
 
 	/** clone the event (needed for serialization).
-	 *  default implementation should suffice for child classes */
+	 * default implementation should suffice for child classes */
 	clone() {
 		return _.cloneDeep(this);
 	}
 
 	/** serialize the event instance so it persists through saves.
-	 *  default implementation should suffice for child classes assigned to App.Events */
+	 * default implementation should suffice for child classes assigned to App.Events */
 	toJSON() {
 		const reviveData = {actors: this.actors, params: this.params};
 		return JSON.reviveWrapper(`new App.Events.${this.constructor.name}($ReviveData$.actors, $ReviveData$.params)`, reviveData);
 	}
 
 	/** get the event's (human-readable) name. must not include ":".
-	 *  default implementation should generally suffice (though we might want to de-camelcase here or something).
+	 * default implementation should generally suffice (though we might want to de-camelcase here or something).
 	 * @returns {string}
 	 */
 	get eventName() {
@@ -75,7 +76,7 @@ App.Events.BaseEvent = class BaseEvent {
 	}
 
 	/** build the actual list of actors that will be involved in this event.
-	 *  default implementation should suffice for child classes with a fixed number of actors; may be overridden for events with variable actor count.
+	 * default implementation should suffice for child classes with a fixed number of actors; may be overridden for events with variable actor count.
 	 * @param {App.Entity.SlaveState} [firstActor] - if supplied, the first actor should be this slave (fail if she is not qualified)
 	 * @returns {boolean} - return false if sufficient qualified actors could not be found (cancel the event)
 	 */
diff --git a/src/004-base/facility.js b/src/004-base/facility.js
index 4ebe890f1bb7b862f5a9d023dc136e46e8529e60..1063d5cd6f86106b971ba49353ce67f6236598ea 100644
--- a/src/004-base/facility.js
+++ b/src/004-base/facility.js
@@ -598,5 +598,5 @@ App.Entity.Facilities.SingleJobFacility = class extends App.Entity.Facilities.Fa
 	}
 };
 
-/** Instances of all facility objects  */
+/** Instances of all facility objects */
 App.Entity.facilities = {};
diff --git a/src/004-base/facilityFramework.js b/src/004-base/facilityFramework.js
index afc53d284b0e7d8512af29b42b4298012880b153..475e96ac7d3d3a66748c9edc9df8a38f4b5b9895 100644
--- a/src/004-base/facilityFramework.js
+++ b/src/004-base/facilityFramework.js
@@ -74,7 +74,7 @@ App.Facilities.Facility = class {
 	/**
 	 * Adds new sections to the facility passage.
 	 *
-	 * @param  {...function():HTMLDivElement} args
+	 * @param {...function():HTMLDivElement} args
 	 *
 	 * @private
 	 * @returns {void}
@@ -96,7 +96,7 @@ App.Facilities.Facility = class {
 
 	/**
 	 * Adds new rules able to be set by the player.
-	 * @param  {...FC.Facilities.Rule} rules
+	 * @param {...FC.Facilities.Rule} rules
 	 *
 	 * @private
 	 * @returns {void}
diff --git a/src/Corporation/corporate-constants.js b/src/Corporation/corporate-constants.js
index 3cacb89f4cc564242aa0f55a072369eb02a1c680..61e5f46e13ff932f05c86ade64c9b90f6bea5358 100644
--- a/src/Corporation/corporate-constants.js
+++ b/src/Corporation/corporate-constants.js
@@ -497,14 +497,14 @@ App.Corporate.InitConstants = function() {
 		})
 	];
 	// divisionCategoriesList: Division maintenance categories are used to calculate the overhead that occurs from having multiple divisions within the same category.
-	//  id: The identifier that will be used in division.maintenance.category
-	//  freeDivisions: How many divisions must appear in this category before the overhead cost comes into play. For example, if this is 1, then the second division will cost divisionCost, and the third will bring the overhead up to four times divisionCost.
-	//  divisionCost: How much to multiply the overhead by in cash. The first division past the free divisions will cost this much, but the value will increase exponentially.
-	//  freeDevelopment: How many developments, totaled across all divisions in the category, are ignored by this category before overhead comes into play. Note: freeDivisions does *not* affect this; if freeDevelopment is 100 and freeDivisions is 1, if you only have a single division with 110 developments, you will be charged for the 10 developments over.
-	//  developmentCost: How much to multiply the squared developments by, in cash. The first development past the ignored value will cost this much, but the cost increases exponentially.
+	// id: The identifier that will be used in division.maintenance.category
+	// freeDivisions: How many divisions must appear in this category before the overhead cost comes into play. For example, if this is 1, then the second division will cost divisionCost, and the third will bring the overhead up to four times divisionCost.
+	// divisionCost: How much to multiply the overhead by in cash. The first division past the free divisions will cost this much, but the value will increase exponentially.
+	// freeDevelopment: How many developments, totaled across all divisions in the category, are ignored by this category before overhead comes into play. Note: freeDivisions does *not* affect this; if freeDevelopment is 100 and freeDivisions is 1, if you only have a single division with 110 developments, you will be charged for the 10 developments over.
+	// developmentCost: How much to multiply the squared developments by, in cash. The first development past the ignored value will cost this much, but the cost increases exponentially.
 	// corporate: The corporate-wide overhead for divisions, beyond the individual categories.
-	//  freeDivisions: How many total divisions, across all categories, are ignored before charging corporate level overhead.
-	//  divisionCost: How much to multiply the square of counted divisions in cash. The first counted division will cost this much, but the value increases exponentially.
+	// freeDivisions: How many total divisions, across all categories, are ignored before charging corporate level overhead.
+	// divisionCost: How much to multiply the square of counted divisions in cash. The first counted division will cost this much, but the value increases exponentially.
 	// Equations:
 	// divisionBaseOverhead = (divisions - freeDivisions) ^ 2 * divisionCost
 	// divisionOperationOverhead = (sum(development) - freeDevelopment) ^ 2 * developmentCost
diff --git a/src/Corporation/corporate-divisionProcessing.js b/src/Corporation/corporate-divisionProcessing.js
index 8a94086ad1341f9e88e982c3e280a539a1eefef1..c062900d3ef113dfcb9d0c11ecea0702a765931a 100644
--- a/src/Corporation/corporate-divisionProcessing.js
+++ b/src/Corporation/corporate-divisionProcessing.js
@@ -18,8 +18,8 @@ App.Corporate.Init_DivisionProcessing = function(shared) {
 		set activeSlaves(value) {		this.setStored("Slaves", Math.trunc(value)); }
 		get processRate() { return this._const.processing.center; }
 		get soldSlaveValue() {
-		  // TODO: find a way to cache this.
-		  return this.purchasedSlaveValue + this._const.addedValue;
+			// TODO: find a way to cache this.
+			return this.purchasedSlaveValue + this._const.addedValue;
 		}
 		get slaveAction() {
 			return this._const.slaveProcessDescription;
diff --git a/src/Corporation/manageCorporation.js b/src/Corporation/manageCorporation.js
index 6a2a92683ea21e76c8e1672b8c07f09127961b73..4f244d382b05e6b33f633f5869c9d44902d10e52 100644
--- a/src/Corporation/manageCorporation.js
+++ b/src/Corporation/manageCorporation.js
@@ -198,7 +198,7 @@ App.Corporate.manage = function() {
 						];
 						if (division.heldSlaves >= nextDiv.availableRoom) {
 							sendSlaveArray.push({
-								'name': `Fill  ${nextDiv.name} Division`,
+								'name': `Fill ${nextDiv.name} Division`,
 								'count': nextDiv.availableRoom
 							});
 						} else {
diff --git a/src/Mods/Catmod/events/CMREFS/refsTotallyLegitCatgirls.js b/src/Mods/Catmod/events/CMREFS/refsTotallyLegitCatgirls.js
index 1c78ad4bfbe7c3aeab73d7f54a0eafeb94e0a9f7..83ee5bd7d39ab1e729df884e197789e859a7612c 100644
--- a/src/Mods/Catmod/events/CMREFS/refsTotallyLegitCatgirls.js
+++ b/src/Mods/Catmod/events/CMREFS/refsTotallyLegitCatgirls.js
@@ -45,7 +45,7 @@ App.Events.refsTotallyLegitCatgirls = class refsTotallyLegitCatgirls extends App
 		}
 
 		function refuse() {
-			return `You ask the salesman if he thinks you're an idiot and tell him that these are clearly not legitimate catgirls. He smiles bashfully and shrugs his shoulder like a child being scolded. "Sure, sure, but they're still pretty good girls. And besides, it's something for all the people who can't afford a real one, right? Haha. So, anyway, you wanna buy one, or..?"  You roll your eyes at the persistent salesman. He's still making pitches at you as you leave.`;
+			return `You ask the salesman if he thinks you're an idiot and tell him that these are clearly not legitimate catgirls. He smiles bashfully and shrugs his shoulder like a child being scolded. "Sure, sure, but they're still pretty good girls. And besides, it's something for all the people who can't afford a real one, right? Haha. So, anyway, you wanna buy one, or..?" You roll your eyes at the persistent salesman. He's still making pitches at you as you leave.`;
 		}
 	}
 };
diff --git a/src/Mods/Catmod/events/SoSSniper.js b/src/Mods/Catmod/events/SoSSniper.js
index 858fc7a203128b15164cb37709f511091607759b..26e9ec402709b9379ef3548d20663dc100cf376d 100644
--- a/src/Mods/Catmod/events/SoSSniper.js
+++ b/src/Mods/Catmod/events/SoSSniper.js
@@ -49,7 +49,7 @@ App.Events.RESosSniper = class RESosSniper extends App.Events.BaseEvent {
 			r.push(`Two more shots slam into the wood around you as you all but leap into the citizen's apartment, one more bullet splintering the wood of the door as you close it shut behind you.`);
 		} else if (!S.Bodyguard || S.Bodyguard.intelligence + S.Bodyguard.intelligenceImplant <= 60) {
 			V.gameover = "snipedbysons";
-			setTimeout(() => Engine.play("Gameover"), Engine.minDomActionDelay); // TODO: uhh, do we not want to delay here?  If so, need to suspend the rest of the content.
+			setTimeout(() => Engine.play("Gameover"), Engine.minDomActionDelay); // TODO: uhh, do we not want to delay here? If so, need to suspend the rest of the content.
 		} else {
 			r.push(`You blink once at the message in confusion before ${S.Bodyguard.slaveName} tackles you, ${his} shoulder bursting out with an explosion of red as ${he} catches a bullet clearly meant for you. ${He} cries out in pain, but it doesn't look like the hit was lethal; even injured and bleeding, ${he} shields you as you hustle into the open apartment along with the spooked citizen, more shots impacting around you as you wildly scramble into cover. A final bullet splinters the wood of the door as you close it shut behind you.`);
 			cashX(-1000, "event", S.Bodyguard);
diff --git a/src/Mods/Catmod/events/SoSassassin.js b/src/Mods/Catmod/events/SoSassassin.js
index 0d8ba3cd3cfc0f523517423698d0260023b22c09..aefeb4e6dee45039c614d728827c14c4b997854b 100644
--- a/src/Mods/Catmod/events/SoSassassin.js
+++ b/src/Mods/Catmod/events/SoSassassin.js
@@ -43,7 +43,7 @@ App.Events.RESosAssassin = class RESosAssassin extends App.Events.BaseEvent {
 				r.push(`You shoot two rounds into the first assassin's chest, then snap around and blast the second before either man can fire.`);
 			} else {
 				V.gameover = "shotbysons";
-				setTimeout(() => Engine.play("Gameover"), Engine.minDomActionDelay); // TODO: uhh, do we not want to delay here?  If so, need to suspend the rest of the content.
+				setTimeout(() => Engine.play("Gameover"), Engine.minDomActionDelay); // TODO: uhh, do we not want to delay here? If so, need to suspend the rest of the content.
 			}
 			App.Events.addParagraph(node, r);
 			r = [];
@@ -77,7 +77,7 @@ App.Events.RESosAssassin = class RESosAssassin extends App.Events.BaseEvent {
 					r.push(`The two killers clash, but it's immediately apparent who's better trained. The assassin blocks every strike coming from ${S.Bodyguard.slaveName} and hits back twice as hard, forcing ${him} on the defensive. When ${S.Bodyguard.slaveName} stumbles, the assassin furiously kicks the blade out from ${his} hand and leaps atop ${him}, readying her own knife to slash the bodyguard's throat. You raise your handgun at the same time, one bullet left in the trigger, and fire a single round through the assassin's skull just before she can. Her head explodes backwards in a burst of gore, and she slumps off ${S.Bodyguard.slaveName}, her knife clattering to the ground. The citizens in the marketplace watch the <span class="red">minorly damaged</span> scene with a mixture of <span class="green">shock and admiration,</span> both you and ${S.Bodyguard.slaveName} panting in the wake of the attack and surrounded by bodies.`);
 				} else {
 					V.gameover = "sons assassinated with bodyguard";
-					setTimeout(() => Engine.play("Gameover"), Engine.minDomActionDelay); // TODO: uhh, do we not want to delay here?  If so, need to suspend the rest of the content.
+					setTimeout(() => Engine.play("Gameover"), Engine.minDomActionDelay); // TODO: uhh, do we not want to delay here? If so, need to suspend the rest of the content.
 				}
 			} else {
 				if (V.PC.skill.warfare >= 100 && V.personalArms > 0) {
@@ -97,7 +97,7 @@ App.Events.RESosAssassin = class RESosAssassin extends App.Events.BaseEvent {
 					repX(2500, "event");
 				} else {
 					V.gameover = "sons assassinated";
-					setTimeout(() => Engine.play("Gameover"), Engine.minDomActionDelay); // TODO: uhh, do we not want to delay here?  If so, need to suspend the rest of the content.
+					setTimeout(() => Engine.play("Gameover"), Engine.minDomActionDelay); // TODO: uhh, do we not want to delay here? If so, need to suspend the rest of the content.
 				}
 			}
 		} else if (S.Bodyguard && S.Bodyguard.intelligence + S.Bodyguard.intelligenceImplant > 80) {
@@ -140,7 +140,7 @@ App.Events.RESosAssassin = class RESosAssassin extends App.Events.BaseEvent {
 				r.push(`The two killers clash, but it's immediately apparent who's better trained. The assassin blocks every strike coming from ${S.Bodyguard.slaveName} and hits back twice as hard, forcing ${him} on the defensive. When ${S.Bodyguard.slaveName} stumbles, the assassin furiously kicks the blade out from ${his} hand and leaps atop ${him}, readying her own knife to slash the bodyguard's throat. You raise your handgun at the same time, one bullet left in the trigger, and fire a single round through the assassin's skull just before she can. Her head explodes backwards in a burst of gore, and she slumps off ${S.Bodyguard.slaveName}, her knife clattering to the ground. The citizens in the marketplace watch the <span class="red">minorly damaged</span> scene with a mixture of <span class="green">shock and admiration,</span> both you and ${S.Bodyguard.slaveName} panting in the wake of the attack and surrounded by bodies.`);
 			} else {
 				V.gameover = "sons assassinated with bodyguard";
-				setTimeout(() => Engine.play("Gameover"), Engine.minDomActionDelay); // TODO: uhh, do we not want to delay here?  If so, need to suspend the rest of the content.
+				setTimeout(() => Engine.play("Gameover"), Engine.minDomActionDelay); // TODO: uhh, do we not want to delay here? If so, need to suspend the rest of the content.
 			}
 			r.push(``);
 		} else {
@@ -151,7 +151,7 @@ App.Events.RESosAssassin = class RESosAssassin extends App.Events.BaseEvent {
 				r.push(`${S.Bodyguard.slaveName} quickly snaps to attention, pulling ${his} machine pistol from its holster and firing back at the two attackers. A bullet hits you in the arm and sends you sprawling back against the ground in agony, but ${S.Bodyguard.slaveName} drops both of the attackers before they can finish the job.`);
 			} else {
 				V.gameover = "shotbysons";
-				setTimeout(() => Engine.play("Gameover"), Engine.minDomActionDelay); // TODO: uhh, do we not want to delay here?  If so, need to suspend the rest of the content.
+				setTimeout(() => Engine.play("Gameover"), Engine.minDomActionDelay); // TODO: uhh, do we not want to delay here? If so, need to suspend the rest of the content.
 			}
 			r.push(`As the two would-be assassins collapse, the pretty woman draws a vicious-looking curved knife from her sleeve, swears in a foreign language, and lunges towards you.`);
 			App.Events.addParagraph(node, r);
@@ -175,11 +175,11 @@ App.Events.RESosAssassin = class RESosAssassin extends App.Events.BaseEvent {
 					removeSlave(S.Bodyguard);
 				} else {
 					V.gameover = "sons assassinated with bodyguard";
-					setTimeout(() => Engine.play("Gameover"), Engine.minDomActionDelay); // TODO: uhh, do we not want to delay here?  If so, need to suspend the rest of the content.
+					setTimeout(() => Engine.play("Gameover"), Engine.minDomActionDelay); // TODO: uhh, do we not want to delay here? If so, need to suspend the rest of the content.
 				}
 			} else {
 				V.gameover = "sons assassinated";
-				setTimeout(() => Engine.play("Gameover"), Engine.minDomActionDelay); // TODO: uhh, do we not want to delay here?  If so, need to suspend the rest of the content.
+				setTimeout(() => Engine.play("Gameover"), Engine.minDomActionDelay); // TODO: uhh, do we not want to delay here? If so, need to suspend the rest of the content.
 			}
 		}
 
diff --git a/src/Mods/Catmod/events/nonRandom/bodypuristriot.js b/src/Mods/Catmod/events/nonRandom/bodypuristriot.js
index ba0fea2e0dc9e219463ff8124d74d80c2cfc2f0d..81973958e9c7170b8b60ce12ce6499eb10722161 100644
--- a/src/Mods/Catmod/events/nonRandom/bodypuristriot.js
+++ b/src/Mods/Catmod/events/nonRandom/bodypuristriot.js
@@ -101,7 +101,7 @@ App.Events.SEBodyPuristRiot = class SEBodyPuristRiot extends App.Events.BaseEven
 		function reputation() {
 			const frag = new DocumentFragment();
 			let r = [];
-			r.push(`You brush some concrete dust from the thrown brick off your shoulder. This isn't the first enemy you've stared down, and it sure as hell isn't the scariest. Even above the crackle of electrobatons and the shouting of the crowd, the entire riot group seems to hear when you ask them coldly if they've forgotten who you are. As the crowd watches, you rattle off battlefields and massacres, the names of armies you've shattered and towns you've burnt to ashes, casually point a finger at the blonde man with the megaphone, say his full name, and tell him that if he says another word you'll give his two daughters to your mercenaries as rape-toys, cut off his dick, and use him as a whipping board until he bleeds out after a few years of abuse. The crowd might have guns and knives, but they still quiet down at your words, balking somewhat at the threat of brutality. You take the oppurtunity to remind them that the security cameras outside your penthouse has recorded every face in the crowd, and anyone who actually uses the weapons in their hands has their home, occupation, and family on file. No one moves a muscle.`); // "oppurtunity"...  spelling or cat pun? 🤔
+			r.push(`You brush some concrete dust from the thrown brick off your shoulder. This isn't the first enemy you've stared down, and it sure as hell isn't the scariest. Even above the crackle of electrobatons and the shouting of the crowd, the entire riot group seems to hear when you ask them coldly if they've forgotten who you are. As the crowd watches, you rattle off battlefields and massacres, the names of armies you've shattered and towns you've burnt to ashes, casually point a finger at the blonde man with the megaphone, say his full name, and tell him that if he says another word you'll give his two daughters to your mercenaries as rape-toys, cut off his dick, and use him as a whipping board until he bleeds out after a few years of abuse. The crowd might have guns and knives, but they still quiet down at your words, balking somewhat at the threat of brutality. You take the oppurtunity to remind them that the security cameras outside your penthouse has recorded every face in the crowd, and anyone who actually uses the weapons in their hands has their home, occupation, and family on file. No one moves a muscle.`); // "oppurtunity"... spelling or cat pun? 🤔
 			App.Events.addParagraph(frag, r);
 			r = [];
 			r.push(`You tell the frozen crowd that you'll be continuing your work on Project N, and that if any one of them ever shows up at your house again with a gun, it'll be the worst, and last, decision they ever make. A few people at the back start to break off from the crowd. You turn back to your penthouse and walk inside as the crowd disintegrates. You have work to do, and you get the feeling these people <span class="green">aren't going to bother you again.</span>`);
diff --git a/src/Mods/Catmod/interaction/fPet.js b/src/Mods/Catmod/interaction/fPet.js
index ed7c892e707e6511161b75af228384822d1c1498..2ac27c85ba78273f0f39527e876b940cb8af08d4 100644
--- a/src/Mods/Catmod/interaction/fPet.js
+++ b/src/Mods/Catmod/interaction/fPet.js
@@ -100,7 +100,7 @@ App.Interact.fPet = function(slave) {
 			r.push(`${He} makes a rude sign gesture.`);
 		} else {
 			r.push(`${He} mrowls,`);
-			r.push(Spoken(slave,  `"I'm a person, not some kind of dumb animal."`));
+			r.push(Spoken(slave, `"I'm a person, not some kind of dumb animal."`));
 		}
 	} else if (slave.devotion >= -20 && slave.trust >= -20) {
 		r.push(`${He} flinches back when you raise your hand towards ${him}, expecting to be hit. The tender petting that occurs obviously shocks ${him}, and for the first minute it looks like ${he}'s expecting you to change your mind at any moment and hit ${him} anyway. When you don't, only then does the scared cat${girl} allow ${himself} to get pet properly, slightly arching ${his} back to give you a range of motion against the silky fur as you stroke and play with your bioengineered cat${girl}. When you finally retract your hand, ${he} bats ${his} eyelashes at you, confused.`);
diff --git a/src/Mods/SecExp/buildings/propagandaHub.js b/src/Mods/SecExp/buildings/propagandaHub.js
index 9a31ee5ce5e8e21770064dc595810c7ec808a3de..b3ef273756735fa241ed1c5b9618070ac7abbcbf 100644
--- a/src/Mods/SecExp/buildings/propagandaHub.js
+++ b/src/Mods/SecExp/buildings/propagandaHub.js
@@ -154,7 +154,7 @@ App.SecExp.propHub = (function() {
 					"The authenticity dept. now provides a small amount of reputation as well as authority, but increases upkeep.",
 					"controlLeaks",
 					true,
-					"Institute a system able to release erroneous, but plausible, information about your business, leading your competitors to prepared financial traps.  "
+					"Institute a system able to release erroneous, but plausible, information about your business, leading your competitors to prepared financial traps. "
 				));
 			} else {
 				App.UI.DOM.appendNewElement("div", node);
diff --git a/src/Mods/SecExp/buildings/securityHQ.js b/src/Mods/SecExp/buildings/securityHQ.js
index 57b4d19a3cc9cb20fb23662942aa27022c02bf51..5709f81303164e5b877c7d296a705490aed4d1f0 100644
--- a/src/Mods/SecExp/buildings/securityHQ.js
+++ b/src/Mods/SecExp/buildings/securityHQ.js
@@ -316,7 +316,7 @@ App.SecExp.secHub = (function() {
 						"Will increase recon capabilities, but will require 5 extra slaves in the headquarters and increases upkeep. The remaining slaves will be more efficient in dealing with crime.",
 						"sensors")
 				);
-			}  else {
+			} else {
 				App.UI.DOM.appendNewElement("div", z, "You have installed perimeter seismic sensors able to detect movement with high accuracy.");
 			}
 			if (V.SecExp.buildings.secHub.upgrades.intel.signalIntercept === 0) {
diff --git a/src/Mods/SecExp/events/conflictReport.js b/src/Mods/SecExp/events/conflictReport.js
index 44a25843d2db9ab118ca0a531157417e836739de..95edc3385e67ae2ef994703df2bc2e6a32023f8e 100644
--- a/src/Mods/SecExp/events/conflictReport.js
+++ b/src/Mods/SecExp/events/conflictReport.js
@@ -1387,7 +1387,7 @@ const arcologyEffects = function(lowerClass, slaves, prosperity) {
 	V.arcologies[0].prosperity -= random(prosperity);
 };
 /**
- * @param {FC.SecExp.PlayerHumanUnitTypeModHuman}  [unit]
+ * @param {FC.SecExp.PlayerHumanUnitTypeModHuman} [unit]
  * @param {number} [averageLosses]
  */
 const rebellingUnitsFate = function(unit, averageLosses) {
diff --git a/src/Mods/SecExp/js/reportingRelatedFunctions.js b/src/Mods/SecExp/js/reportingRelatedFunctions.js
index cc41fcb9c8ed637bd0333296a59722d96e382280..a7224ac63b6379a6161a537a0d63bac9a0c93a93 100644
--- a/src/Mods/SecExp/js/reportingRelatedFunctions.js
+++ b/src/Mods/SecExp/js/reportingRelatedFunctions.js
@@ -155,7 +155,7 @@ App.SecExp.commanderEffectiveness = function(passage) {
 	let slave;
 	const isBodyguard = commander === "Bodyguard";
 
-	switch(commander) {
+	switch (commander) {
 		case "PC":
 			if (inHandler) {
 				if (V.SecExp.core.authority <= 2500 && V.SecExp.core.authority > 1000) {
@@ -895,7 +895,7 @@ App.SecExp.upkeep = (function() {
 	return {
 		cost,
 		edictsAuth
-	}
+	};
 
 	function cost() {
 		let secExpCost = 0;
@@ -910,8 +910,8 @@ App.SecExp.upkeep = (function() {
 		}
 		return secExpCost;
 		/** Upkeep cost of edicts, in cash
-   * @returns {number}
-   */
+		 * @returns {number}
+		 */
 		function edictsCash() {
 			let value = 0;
 			if (V.SecExp.edicts.slaveWatch) { value++; }
@@ -931,8 +931,8 @@ App.SecExp.upkeep = (function() {
 			return value * 1000;
 		}
 		/** Upkeep cost of Special Forces support edicts. They allow the two mods an additional layer of in-universe interaction.
-   * @returns {number}
-   */
+		 * @returns {number}
+		 */
 		function SF() {
 			let value = 0;
 			if (V.SecExp.edicts.SFSupportLevel >= 1) {
@@ -953,8 +953,8 @@ App.SecExp.upkeep = (function() {
 			return value;
 		}
 		/** Upkeep cost of buildings (in cash)
-   * @returns {number}
-   */
+		 * @returns {number}
+		 */
 		function buildings() {
 			let value = 0;
 			const base = V.facilityCost * 5; const upgrade = 50;
@@ -985,8 +985,8 @@ App.SecExp.upkeep = (function() {
 		}
 	}
 	/** Upkeep cost of edicts, in authority
-  * @returns {number}
-  */
+	 * @returns {number}
+	 */
 	function edictsAuth() {
 		let value = 0;
 		if (V.SecExp.edicts.enslavementRights > 0) {
diff --git a/src/Mods/SecExp/js/secExp.js b/src/Mods/SecExp/js/secExp.js
index b0c799b00924b945c0728e225b6df52ea16efaba..b64b946fe4fa1189955acbe69d659aa2d6b2be01 100644
--- a/src/Mods/SecExp/js/secExp.js
+++ b/src/Mods/SecExp/js/secExp.js
@@ -1,7 +1,7 @@
 /** Takes the passed input and returns a clamped V.SecExp.core.authority
  * @param {number} input defaults to zero
  */
-App.SecExp.authorityX = function(input = 0)  {
+App.SecExp.authorityX = function(input = 0) {
 	V.SecExp.core.authority = Math.trunc(Math.clamp(V.SecExp.core.authority + input, 0, 20000));
 };
 
diff --git a/src/Mods/SpecialForce/events/TrickShotNight.js b/src/Mods/SpecialForce/events/TrickShotNight.js
index 20845ecaa9a4a472a57460f97808b6437841ef86..bfdeba4feaf4b07a8a10bace808c11781ae8d1bd 100644
--- a/src/Mods/SpecialForce/events/TrickShotNight.js
+++ b/src/Mods/SpecialForce/events/TrickShotNight.js
@@ -13,7 +13,7 @@ App.Events.TrickShotNight = class TrickShotNight extends App.Events.BaseEvent {
 		const {
 			HeA
 		} = getPronouns(assistant.pronouns().main).appendSuffix("A");
-		const shootChance = Math.max(25 + V.PC.skill.warfare * 0.2, 25 + V.PC.skill.warfare * 0.65); // Odds increase slowly up to 0 skill, then greatly after.  Always some odds to succeed or fail.
+		const shootChance = Math.max(25 + V.PC.skill.warfare * 0.2, 25 + V.PC.skill.warfare * 0.65); // Odds increase slowly up to 0 skill, then greatly after. Always some odds to succeed or fail.
 
 		App.Events.addParagraph(node, [`Despite your direct elevator, interaction with the majority of your security force is relatively scarce. Aside from mutually exchanged nods in the firebase and the occasional briefing, your ${V.SF.Lower} enjoy a degree of autonomy.`]);
 
diff --git a/src/Mods/SpecialForce/upgrades/SpecialForceUpgradeFunctions.js b/src/Mods/SpecialForce/upgrades/SpecialForceUpgradeFunctions.js
index c5082bf7ea2b6eab62650875ce43402f4cf9d9fe..489d9b06b34b316afd8a9d65f49867cc4d12d5e5 100644
--- a/src/Mods/SpecialForce/upgrades/SpecialForceUpgradeFunctions.js
+++ b/src/Mods/SpecialForce/upgrades/SpecialForceUpgradeFunctions.js
@@ -9,7 +9,7 @@ App.SF.unlocked = (function() {
 
 	function secondTier() {
 		return V.SF.Squad.Firebase + V.SF.Squad.Armoury + V.SF.Squad.Drugs + V.SF.Squad.Drones +
-		(V.terrain !== "oceanic" ? V.SF.Squad.AV + V.SF.Squad.TV : 0) + V.SF.Squad.AA + V.SF.Squad.TA >= 30;
+			(V.terrain !== "oceanic" ? V.SF.Squad.AV + V.SF.Squad.TV : 0) + V.SF.Squad.AA + V.SF.Squad.TA >= 30;
 	}
 
 	function garage() {
@@ -150,9 +150,9 @@ App.SF.upgrades = (function() {
 		return node;
 
 		/**
-   * @param {string} unit
-   * @returns {DocumentFragment}
-   */
+		 * @param {string} unit
+		 * @returns {DocumentFragment}
+		 */
 		function checkUnit(unit) {
 			const node = new DocumentFragment();
 			const max = App.SF.upgrades.currentUnitMax(unit);
@@ -257,11 +257,11 @@ App.SF.upgrades = (function() {
 			/**
 			 * @param {number} cost
 			 * @returns {number}
-    */
+	*/
 			function getPrice(cost) {
 				const upgradeDiv = 1.65;
 				const S = V.SF.Squad;
-				let value = (cost/upgradeDiv) * App.SF.env() * Math.pow(1.15, V.SF.Squad[unit] + 1);
+				let value = (cost / upgradeDiv) * App.SF.env() * Math.pow(1.15, V.SF.Squad[unit] + 1);
 				if ([S.AircraftCarrier, S.Drones, S.GiantRobot, S.GunS, S.MissileSilo, S.Satellite, S.SpacePlane, S.Sub].includes(unit)) {
 					value *= V.HackingSkillMultiplier;
 				}
diff --git a/src/arcologyBuilding/base.js b/src/arcologyBuilding/base.js
index c2e8f4e4d173d85be11430082e1a21de45829da6..be563aa4cdffb8ba9e9b318bbb637b59f73e8558 100644
--- a/src/arcologyBuilding/base.js
+++ b/src/arcologyBuilding/base.js
@@ -106,8 +106,7 @@ App.Arcology.Section = class extends App.Entity.Serializable {
 	/**
 	 * @param {string} id unique ID
 	 * @param {Array<Array<App.Arcology.Cell.BaseCell>>} rows
-	 * @param {boolean} [groundLevel=false] if the section the ground level, all lower layers are automatically in the
-	 *     basement
+	 * @param {boolean} [groundLevel=false] if the section the ground level, all lower layers are automatically in the basement
 	 */
 	constructor(id, rows, groundLevel = false) {
 		super();
diff --git a/src/arcologyBuilding/presets.js b/src/arcologyBuilding/presets.js
index e7d60df03aa9c556bb9afcd84d46001f13f69432..058d31aa4cf56e9004a2d4707c0f18208133ddb9 100644
--- a/src/arcologyBuilding/presets.js
+++ b/src/arcologyBuilding/presets.js
@@ -242,8 +242,7 @@ App.Arcology.upgrades = function(building) {
 	 * @typedef upgrade
 	 * @property {string} id used to identify already build upgrades, unique!
 	 * @property {Array<string>} layouts
-	 * @property {Array<string>} exclusive any upgrade is always exclusive to itself. NOTE: keep in mind that
-	 *     exclusiveness has to be added to both upgrades!
+	 * @property {Array<string>} exclusive any upgrade is always exclusive to itself. NOTE: keep in mind that exclusiveness has to be added to both upgrades!
 	 * @property {string} name as shown to player.
 	 * @property {string} desc Fits in a sentence like this: The next major upgrade needed is "desc"
 	 * @property {number} cost
diff --git a/src/art/vector_revamp/vectorRevampedArtControl.js b/src/art/vector_revamp/vectorRevampedArtControl.js
index 1095c10bd2f19c06b221eb4ab996269b1fa46e72..eb22a38d30120172acee09fe76b7ea187308fb06 100644
--- a/src/art/vector_revamp/vectorRevampedArtControl.js
+++ b/src/art/vector_revamp/vectorRevampedArtControl.js
@@ -1104,17 +1104,17 @@ class ClothingControl {
 		return torsoSize;
 	}
 
-	/** This function must return a random item from the array in the input,
-	 *  but the index chosen must be constant for the same slave for the same week.
-	 *  Intended for an array of colors, but has other uses
-	 *  The idea is to make sure that the color for the same clothing remains
-	 *  the same for the same slave within a given week, so the color does not
-	 *  change upon image redraw.
-	 *  @template T
-	 *  @param {Array<T>} [possibleColors] array of strings representing colorSlave
-	 *  @param {number} [seedOffset] optional offset to the seed. Can be used to generate different
-	 *             					 results for different pieces of clothing
-	 * 	@returns {T}
+	/**
+	 * This function must return a random item from the array in the input,
+	 * but the index chosen must be constant for the same slave for the same week.
+	 * Intended for an array of colors, but has other uses
+	 * The idea is to make sure that the color for the same clothing remains
+	 * the same for the same slave within a given week, so the color does not
+	 * change upon image redraw.
+	 * @template T
+	 * @param {Array<T>} [possibleColors] array of strings representing colorSlave
+	 * @param {number} [seedOffset] optional offset to the seed. Can be used to generate different results for different pieces of clothing
+	 * @returns {T}
 	 */
 	randomItem(possibleColors = ['#FFFFFF'], seedOffset = 0) {
 		const a = this.randomNumber(seedOffset);
@@ -1122,14 +1122,14 @@ class ClothingControl {
 	}
 
 	/** This function must return a pseudo random number that is consistent for the
-	 *  same slave in the same week.
-	 *  To do this a pseudo random generator is used and called multiple times.
-	 *  First with the ID as seed, so the results are different for different slaves
-	 *  Second with lifetimeCashExpenses as seed, to get a number that changes from week to week
-	 *  And last with a seed calculated from the first two results and seedOffset
-	 *  @param {number} [seedOffset] optional offset to the seed. Can be used to generate different
-	 *  							 results for different pieces of clothing
-	 *  @returns {number}
+	 * same slave in the same week.
+	 * To do this a pseudo random generator is used and called multiple times.
+	 * First with the ID as seed, so the results are different for different slaves
+	 * Second with lifetimeCashExpenses as seed, to get a number that changes from week to week
+	 * And last with a seed calculated from the first two results and seedOffset
+	 * @param {number} [seedOffset] optional offset to the seed. Can be used to generate different
+	 * 							 results for different pieces of clothing
+	 * @returns {number}
 	 */
 	randomNumber(seedOffset = 0) {
 		let a = this.mulberry32(this.slave.ID); // Seed based on slave
@@ -1148,16 +1148,16 @@ class ClothingControl {
 	braStrapOpacity() {
 		let opa = [0, 0, 0];
 		let boobs = this.slave.boobs;
-		if ((boobs >=   300 && boobs <   400) || // Small
-			(boobs >=   600 && boobs <=  700) || // Medium_800
-			(boobs >   1000 && boobs <= 1500) || // Medium_1500
-			(boobs >   2500 && boobs <= 6500) || // Medium_7000
+		if ((boobs >= 300 && boobs < 400) || // Small
+			(boobs >= 600 && boobs <= 700) || // Medium_800
+			(boobs > 1000 && boobs <= 1500) || // Medium_1500
+			(boobs > 2500 && boobs <= 6500) || // Medium_7000
 			(boobs >= 15000 && boobs < 25000)) { // Huge
 			opa = [1, 0, 0]; // Use strap 1
-		} else if ((boobs >=   500 && boobs <    600) ||
-					(boobs >=   850 && boobs <=  1000) ||
-					(boobs >   2000 && boobs <=  2500) ||
-					(boobs >= 11000 && boobs <  15000) ||
+		} else if ((boobs >= 500 && boobs < 600) ||
+					(boobs >= 850 && boobs <= 1000) ||
+					(boobs > 2000 && boobs <= 2500) ||
+					(boobs >= 11000 && boobs < 15000) ||
 					(boobs >= 35000 )) {
 			opa = [0, 0, 1]; // Use strap 3
 		} else {
@@ -2633,7 +2633,7 @@ class RevampedArtControl {
 	get buttLayer() {
 		let result = [];
 		let buttSize = 0;
-		if (!hasAnyLegs(this.artSlave) || !this.showButt)  {
+		if (!hasAnyLegs(this.artSlave) || !this.showButt) {
 			return result;
 		}
 
@@ -2952,7 +2952,7 @@ class RevampedArtControl {
 		if (this.clothingControl.piecewiseClothing.shirt) {
 			let sleeve = "Long";
 			if (this.clothingControl.piecewiseClothing.schoolgirlNormal ||
-			    this.clothingControl.piecewiseClothing.schoolgirlShort ||
+				this.clothingControl.piecewiseClothing.schoolgirlShort ||
 				this.leftArmType === "" || this.rightArmType === "") {
 				sleeve = "Short";
 			}
@@ -3092,7 +3092,7 @@ class RevampedArtControl {
 			}
 		}
 		if (this.clothingControl.piecewiseClothing.tshirt ||
-		    this.clothingControl.piecewiseClothing.niceMaid) {
+			this.clothingControl.piecewiseClothing.niceMaid) {
 			if (this.bellyLevel === 0) {
 				result.push(`Art_Vector_Revamp_Torso_Outfit_Tshirt_${this.torsoSize}`);
 			} else {
@@ -3762,7 +3762,7 @@ class RevampedArtControl {
 	}
 
 	/** Convert from coordinate system in the svg file to the graphic coordinate on page
-	 *  The y-axis in svg counts from the bottom up and in browser it is top down with a canvas height of 1000.
+	 * The y-axis in svg counts from the bottom up and in browser it is top down with a canvas height of 1000.
 	 * @param {number[][]} M
 	 */
 	convertCoordinateSystem(M){
@@ -3787,7 +3787,7 @@ class RevampedArtControl {
 		// IMPORTANT: The start x,y points must be inversible (three distinct points not all on a line)
 
 		let M = [[start[0][0], start[0][1], 1],
-			     [start[1][0], start[1][1], 1],
+				 [start[1][0], start[1][1], 1],
 				 [start[2][0], start[2][1], 1]];
 		let Mi = this.matrix_invert(M);
 
@@ -3799,7 +3799,7 @@ class RevampedArtControl {
 		let d = Mi[1][0] * end[0][1] + Mi[1][1] * end[1][1] + Mi[1][2] * end[2][1];
 		let f = Mi[2][0] * end[0][1] + Mi[2][1] * end[1][1] + Mi[2][2] * end[2][1];
 
-		let end_check   = [[a*start[0][0] + c*start[0][1] + e, b*start[0][0] + d*start[0][1] + f], [a*start[1][0] + c*start[1][1] + e, b*start[1][0] + d*start[1][1] + f], [a*start[2][0] + c*start[2][1] + e, b*start[2][0] + d*start[2][1] + f]];
+		let end_check = [[a*start[0][0] + c*start[0][1] + e, b*start[0][0] + d*start[0][1] + f], [a*start[1][0] + c*start[1][1] + e, b*start[1][0] + d*start[1][1] + f], [a*start[2][0] + c*start[2][1] + e, b*start[2][0] + d*start[2][1] + f]];
 
 		this[name] = `matrix(${a},${b},${c},${d},${e},${f})`;
 	}
diff --git a/src/art/webgl/art.js b/src/art/webgl/art.js
index ce4f4041564c9a8b04d6199a3a621dc2397f1abb..46af9e020734f9d4e3d21674f3766fcd98e069eb 100644
--- a/src/art/webgl/art.js
+++ b/src/art/webgl/art.js
@@ -667,7 +667,7 @@ App.Art.applySurfaces = function(slave, scene, p) {
 	let cockSkin;
 	let skin;
 
-	let O =  App.Art.hexToRgb(skinColorCatcher(slave).skinColor);
+	let O = App.Art.hexToRgb(skinColorCatcher(slave).skinColor);
 
 	let A = [207/255, 198/255, 195/255];
 	let B = [201/255, 157/255, 134/255];
@@ -1159,7 +1159,7 @@ App.Art.applyMaterials = function(slave, scene, p) {
 	materials.push(["Sclera_Right", "Ka", [scleraColorRight[0]*0.8, scleraColorRight[1]*0.8, scleraColorRight[2]*0.8]]);
 
 	// expected skin color
-	let O =  App.Art.hexToRgb(skinColorCatcher(slave).skinColor);
+	let O = App.Art.hexToRgb(skinColorCatcher(slave).skinColor);
 
 	// average color of skintone texture
 	let A = [207/255, 198/255, 195/255];
diff --git a/src/art/webgl/engine.js b/src/art/webgl/engine.js
index cd5f070e7e6ebf56eb44e628fd778a7d75450efd..6e991a18a33ae83e20f452d154204859213daa95 100644
--- a/src/art/webgl/engine.js
+++ b/src/art/webgl/engine.js
@@ -2,10 +2,10 @@
 
 App.Art.Engine = class {
 	getVsSourceGeometry() {
-		return  `#version 300 es
-                uniform mat4 matModelViewProjection;
-                uniform mat4 matModelView;
-                uniform mat4 matModel;
+		return `#version 300 es
+				uniform mat4 matModelViewProjection;
+				uniform mat4 matModelView;
+				uniform mat4 matModel;
 				uniform mat4 matNormal;
 
 				in vec3 vertexNormal;
@@ -29,7 +29,7 @@ App.Art.Engine = class {
 	}
 
 	getFsSourceGeometry() {
-		return  `#version 300 es
+		return `#version 300 es
 				precision highp float;
 
 				layout(location = 0) out vec3 gPosition;
@@ -55,20 +55,20 @@ App.Art.Engine = class {
 	}
 
 	getVsSourceQuad() {
-		return  `#version 300 es
+		return `#version 300 es
 				in vec2 vertexPosition;
 				in vec2 textureCoordinate;
 
 				out vec2 textureCoord;
 
-                void main() {
+				void main() {
 					textureCoord = textureCoordinate;
 					gl_Position = vec4(vertexPosition, 0.0, 1.0);
-                }`;
+				}`;
 	}
 
 	getFsSourceSSAO() {
-		return  `#version 300 es
+		return `#version 300 es
 				precision highp float;
 
 				out float ao;
@@ -120,7 +120,7 @@ App.Art.Engine = class {
 						
 						// range check & accumulate
 						float rangeCheck = smoothstep(0.0, 1.0, radius / abs(pos.z - sampleDepth));
-						occlusion += (sampleDepth <= samplePos.z + bias ? 1.0 : 0.0) * rangeCheck;           
+						occlusion += (sampleDepth <= samplePos.z + bias ? 1.0 : 0.0) * rangeCheck; 
 					}
 					occlusion = 1.0 - (occlusion / scale);
 					
@@ -129,7 +129,7 @@ App.Art.Engine = class {
 	}
 
 	getFsSourceSSAOBlur() {
-		return  `#version 300 es
+		return `#version 300 es
 				precision highp float;
 
 				out float ao;
@@ -156,67 +156,67 @@ App.Art.Engine = class {
 
 	getFsSourceForwardPass(dl, pl) {
 		return `#version 300 es
-                precision highp float;
-                
-                uniform float lightInt[${dl}];
-                uniform vec3 lightColor[${dl}];
-                uniform vec3 lightVect[${dl}];
-
-                uniform float pointLightInt[${pl}];
-                uniform vec3 pointLightColor[${pl}];
-                uniform vec3 pointLightPos[${pl}];
-
-                uniform float whiteM;
-                uniform float gammaY;
+				precision highp float;
+				
+				uniform float lightInt[${dl}];
+				uniform vec3 lightColor[${dl}];
+				uniform vec3 lightVect[${dl}];
+
+				uniform float pointLightInt[${pl}];
+				uniform vec3 pointLightColor[${pl}];
+				uniform vec3 pointLightPos[${pl}];
+
+				uniform float whiteM;
+				uniform float gammaY;
 				uniform vec3 irradiance;
 				uniform float ssaoInt;
 
 				uniform float d;
 				uniform vec3 Ka;
-                uniform vec3 Ks;
+				uniform vec3 Ks;
 				uniform vec3 Ke;
-                uniform float Ni;
+				uniform float Ni;
 				uniform float r;
 				uniform float m;
 				uniform float s;
 
-                uniform float sNormals;
+				uniform float sNormals;
 				uniform float sSSAO;
 				uniform float sAO;
-                uniform float sAmbient;
-                uniform float sAlbedo;
-                uniform float sSpecular;
+				uniform float sAmbient;
+				uniform float sAlbedo;
+				uniform float sSpecular;
 				uniform float sEmission;
-                uniform float sAlpha;
-                uniform float sGamma;
-                uniform float sReinhard;
-                uniform float sNormal;
+				uniform float sAlpha;
+				uniform float sGamma;
+				uniform float sReinhard;
+				uniform float sNormal;
 				uniform float sHDR;
 
 				uniform float roughness;
 				uniform float metallic;
 				uniform vec3 fresnel;
-                
-                uniform vec3 cameraPos;
+				
+				uniform vec3 cameraPos;
 
-                uniform sampler2D textSampler[6];
+				uniform sampler2D textSampler[6];
 
 				in vec2 textureCoord;
 				in vec3 normal;
-                in vec3 pos;
+				in vec3 pos;
 
-                out vec4 outputColor;
+				out vec4 outputColor;
 
 				const float PI = 3.14159265359;
 
 				float distributionGGX(vec3 N, vec3 H, float roughness)
 				{
-					float a      = roughness*roughness;
-					float a2     = a*a;
-					float NdotH  = max(dot(N, H), 0.0);
+					float a = roughness*roughness;
+					float a2 = a*a;
+					float NdotH = max(dot(N, H), 0.0);
 					float NdotH2 = NdotH*NdotH;
 					
-					float num   = a2;
+					float num = a2;
 					float denom = (NdotH2 * (a2 - 1.0) + 1.0);
 					denom = PI * denom * denom;
 					
@@ -228,7 +228,7 @@ App.Art.Engine = class {
 					float r = (roughness + 1.0);
 					float k = (r*r) / 8.0;
 				
-					float num   = NdotV;
+					float num = NdotV;
 					float denom = NdotV * (1.0 - k) + k;
 					
 					return num / denom;
@@ -238,8 +238,8 @@ App.Art.Engine = class {
 				{
 					float NdotV = max(dot(N, V), 0.0);
 					float NdotL = max(dot(N, L), 0.0);
-					float ggx2  = geometrySchlickGGX(NdotV, roughness);
-					float ggx1  = geometrySchlickGGX(NdotL, roughness);
+					float ggx2 = geometrySchlickGGX(NdotV, roughness);
+					float ggx1 = geometrySchlickGGX(NdotL, roughness);
 					
 					return ggx1 * ggx2;
 				}
@@ -261,41 +261,41 @@ App.Art.Engine = class {
 					return mat3(tangent, bitangent, normal);
 				}
 
-                void main() {
+				void main() {
 					vec2 resolution = vec2(textureSize(textSampler[0], 0));
 					mat3 TBN = createTBNMatrix(pos, textureCoord, normal);
 
-                    vec3 new_normal = normal;
-                    vec3 map_Ka = vec3(0.0,0.0,0.0);
-                    vec3 map_Ks = vec3(0.0,0.0,0.0);
+					vec3 new_normal = normal;
+					vec3 map_Ka = vec3(0.0,0.0,0.0);
+					vec3 map_Ks = vec3(0.0,0.0,0.0);
 					vec3 map_Ke = vec3(0.0,0.0,0.0);
-                    float map_d = 1.0;
+					float map_d = 1.0;
 					float ao = 1.0;
 
 					
-                    if (sAlpha == 1.0)
-                        map_d = d * texture(textSampler[1], textureCoord).r;
+					if (sAlpha == 1.0)
+						map_d = d * texture(textSampler[1], textureCoord).r;
 
 					if (map_d < 0.05)
 						discard;
 
 					if (sNormal == 1.0) {
-                        vec3 map_Kn = texture(textSampler[5], textureCoord).rgb *2.0-1.0;
-                        if (map_Kn != vec3(-1.0,-1.0,-1.0))
+						vec3 map_Kn = texture(textSampler[5], textureCoord).rgb *2.0-1.0;
+						if (map_Kn != vec3(-1.0,-1.0,-1.0))
 							new_normal = normalize(TBN * map_Kn);
-                    }
+					}
 
 					if (sSSAO == 1.0)
 						ao = texture(textSampler[0], vec2(gl_FragCoord.x, gl_FragCoord.y) / resolution).r;
 
 					if (sAlbedo == 1.0)
-                        map_Ka = Ka * texture(textSampler[2], textureCoord).rgb;
+						map_Ka = Ka * texture(textSampler[2], textureCoord).rgb;
 
-                    if (sSpecular == 1.0)
-                        map_Ks = Ks * s * texture(textSampler[3], textureCoord).rgb;
+					if (sSpecular == 1.0)
+						map_Ks = Ks * s * texture(textSampler[3], textureCoord).rgb;
 
 					if (sEmission == 1.0)
-                        map_Ke = Ke * texture(textSampler[4], textureCoord).rgb;
+						map_Ke = Ke * texture(textSampler[4], textureCoord).rgb;
 
 					// material parameters
 					vec3 albedo = pow(map_Ka, vec3(2.2));
@@ -308,27 +308,27 @@ App.Art.Engine = class {
 					// reflectance equation
 					vec3 Lo = vec3(0.0);
 					vec3 Le = map_Ke;
-                    for (int i = 0; i < ${dl}; i++) {
+					for (int i = 0; i < ${dl}; i++) {
 						if (lightInt[i] <= 0.0)
 							continue;
 
 						// calculate per-light radiance
 						vec3 L = -lightVect[i];
 						vec3 H = normalize(V + L);
-						vec3 radiance     = lightColor[i] * lightInt[i];        
+						vec3 radiance = lightColor[i] * lightInt[i]; 
 						
 						// cook-torrance brdf
-						float NDF = distributionGGX(N, H, r);        
-						float G   = geometrySmith(N, V, L, r);      
-						vec3 F    = fresnelSchlick(max(dot(H, V), 0.0), F0);       
+						float NDF = distributionGGX(N, H, r); 
+						float G = geometrySmith(N, V, L, r); 
+						vec3 F = fresnelSchlick(max(dot(H, V), 0.0), F0); 
 						
-						vec3 numerator    = NDF * G * F;
+						vec3 numerator = NDF * G * F;
 						float denominator = 4.0 * max(dot(N, V), 0.0) * max(dot(N, L), 0.0) + 0.00001;
-						vec3 specular     = numerator / denominator;  
+						vec3 specular = numerator / denominator; 
 
 						// kS is equal to Fresnel
 						vec3 kD = vec3(1.0) - F;
-						kD *= 1.0 - m;	  
+						kD *= 1.0 - m;	 
 						
 						// add to outgoing radiance Lo
 						float NdotL = max(dot(N, L), 0.0);
@@ -342,20 +342,20 @@ App.Art.Engine = class {
 						// calculate per-light radiance
 						vec3 L = normalize(pointLightPos[i] - pos);
 						vec3 H = normalize(V + L);
-						vec3 radiance     = pointLightColor[i] * pointLightInt[i];        
+						vec3 radiance = pointLightColor[i] * pointLightInt[i]; 
 						
 						// cook-torrance brdf
-						float NDF = distributionGGX(N, H, r);        
-						float G   = geometrySmith(N, V, L, r);      
-						vec3 F    = fresnelSchlick(max(dot(H, V), 0.0), F0);       
+						float NDF = distributionGGX(N, H, r); 
+						float G = geometrySmith(N, V, L, r); 
+						vec3 F = fresnelSchlick(max(dot(H, V), 0.0), F0); 
 						
-						vec3 numerator    = NDF * G * F;
+						vec3 numerator = NDF * G * F;
 						float denominator = 4.0 * max(dot(N, V), 0.0) * max(dot(N, L), 0.0) + 0.00001;
-						vec3 specular     = numerator / denominator;  
+						vec3 specular = numerator / denominator; 
 
 						// kS is equal to Fresnel
 						vec3 kD = vec3(1.0) - F;
-						kD *= 1.0 - m;	  
+						kD *= 1.0 - m;	 
 						
 						// add to outgoing radiance Lo
 						float NdotL = max(dot(N, L), 0.0);
@@ -374,23 +374,23 @@ App.Art.Engine = class {
 						c = c * ao;
 
 					if (sReinhard == 1.0) {
-                        float l_old = 0.2126*c.r+0.7152*c.g+0.0722*c.b;
-                        float numerator = l_old * (1.0 + (l_old / (whiteM*whiteM)));
-                        float l_new = numerator / (1.0 + l_old);
-                        c = c * (l_new / l_old);
-                    }
+						float l_old = 0.2126*c.r+0.7152*c.g+0.0722*c.b;
+						float numerator = l_old * (1.0 + (l_old / (whiteM*whiteM)));
+						float l_new = numerator / (1.0 + l_old);
+						c = c * (l_new / l_old);
+					}
 
 					if (sGamma == 1.0)
-                        c = pow(c, vec3(1.0/gammaY));
+						c = pow(c, vec3(1.0/gammaY));
 					
-                    if (sNormals == 1.0)
-                        c = new_normal;
+					if (sNormals == 1.0)
+						c = new_normal;
 
 					if (sAO == 1.0)
 						c = vec3(ao);
 
-                    outputColor = vec4(c*map_d, map_d);
-                }`;
+					outputColor = vec4(c*map_d, map_d);
+				}`;
 	}
 
 	initBuffers(sceneData, dir) {
@@ -1260,9 +1260,9 @@ App.Art.Engine = class {
 
 	matrixMakeProjection(fov, aspect, near, far) {
 		return [[aspect * (1/Math.tan(fov*0.5/180*Math.PI)), 0, 0, 0],
-			    [0, (1/Math.tan(fov*0.5/180*Math.PI)), 0, 0],
-			    [0, 0, far/(far-near), 1],
-			    [0, 0, (-far*near)/(far-near), 0]];
+				[0, (1/Math.tan(fov*0.5/180*Math.PI)), 0, 0],
+				[0, 0, far/(far-near), 1],
+				[0, 0, (-far*near)/(far-near), 0]];
 	}
 
 	matrixPointAt(pos, target, up) {
@@ -1272,9 +1272,9 @@ App.Art.Engine = class {
 		let newRight = this.vectorCrossProduct(newUp, newForward);
 
 		return [[newRight[0], newRight[1], newRight[2], 0],
-			    [newUp[0], newUp[1], newUp[2], 0],
-			    [newForward[0], newForward[1], newForward[2], 0],
-			    [pos[0], pos[1], pos[2], 1]];
+				[newUp[0], newUp[1], newUp[2], 0],
+				[newForward[0], newForward[1], newForward[2], 0],
+				[pos[0], pos[1], pos[2], 1]];
 	}
 
 	matrixMakeRotation(xr, yr, zr) {
@@ -1299,40 +1299,40 @@ App.Art.Engine = class {
 
 	matrixMakeRotationY(r) {
 		return [[Math.cos(r), 0, Math.sin(r)],
-			    [0, 1, 0],
-			    [-Math.sin(r), 0, Math.cos(r)]];
+				[0, 1, 0],
+				[-Math.sin(r), 0, Math.cos(r)]];
 	}
 
 	matrixMakeRotationZ(r) {
 		return [[Math.cos(r), Math.sin(r), 0],
-			    [-Math.sin(r), Math.cos(r), 0],
-			    [0, 0, 1]];
+				[-Math.sin(r), Math.cos(r), 0],
+				[0, 0, 1]];
 	}
 
 	matrixMakeTranslation(x, y, z) {
 		return [[1, 0, 0, 0],
-			    [0, 1, 0, 0],
-			    [0, 0, 1, 0],
-			    [x, y, z, 1]];
+				[0, 1, 0, 0],
+				[0, 0, 1, 0],
+				[x, y, z, 1]];
 	}
 
 	matrixMakeScaling(s) {
 		return [[s, 0, 0, 0],
-			    [0, s, 0, 0],
-			    [0, 0, s, 0],
-			    [0, 0, 0, 1]];
+				[0, s, 0, 0],
+				[0, 0, s, 0],
+				[0, 0, 0, 1]];
 	}
 
 	matrixMulMatrix(m1, m2) {
 		return [[m1[0][0] * m2[0][0] + m1[0][1] * m2[1][0] + m1[0][2] * m2[2][0],
-			    m1[0][0] * m2[0][1] + m1[0][1] * m2[1][1] + m1[0][2] * m2[2][1],
-			    m1[0][0] * m2[0][2] + m1[0][1] * m2[1][2] + m1[0][2] * m2[2][2]],
-		        [m1[1][0] * m2[0][0] + m1[1][1] * m2[1][0] + m1[1][2] * m2[2][0],
-			    m1[1][0] * m2[0][1] + m1[1][1] * m2[1][1] + m1[1][2] * m2[2][1],
-			    m1[1][0] * m2[0][2] + m1[1][1] * m2[1][2] + m1[1][2] * m2[2][2]],
-		        [m1[2][0] * m2[0][0] + m1[2][1] * m2[1][0] + m1[2][2] * m2[2][0],
-			    m1[2][0] * m2[0][1] + m1[2][1] * m2[1][1] + m1[2][2] * m2[2][1],
-			    m1[2][0] * m2[0][2] + m1[2][1] * m2[1][2] + m1[2][2] * m2[2][2]]];
+				m1[0][0] * m2[0][1] + m1[0][1] * m2[1][1] + m1[0][2] * m2[2][1],
+				m1[0][0] * m2[0][2] + m1[0][1] * m2[1][2] + m1[0][2] * m2[2][2]],
+				[m1[1][0] * m2[0][0] + m1[1][1] * m2[1][0] + m1[1][2] * m2[2][0],
+				m1[1][0] * m2[0][1] + m1[1][1] * m2[1][1] + m1[1][2] * m2[2][1],
+				m1[1][0] * m2[0][2] + m1[1][1] * m2[1][2] + m1[1][2] * m2[2][2]],
+				[m1[2][0] * m2[0][0] + m1[2][1] * m2[1][0] + m1[2][2] * m2[2][0],
+				m1[2][0] * m2[0][1] + m1[2][1] * m2[1][1] + m1[2][2] * m2[2][1],
+				m1[2][0] * m2[0][2] + m1[2][1] * m2[1][2] + m1[2][2] * m2[2][2]]];
 	}
 
 	matrixMulMatrix4(m1, m2) {
@@ -1340,15 +1340,15 @@ App.Art.Engine = class {
 			m1[0][0] * m2[0][1] + m1[0][1] * m2[1][1] + m1[0][2] * m2[2][1] + m1[0][3] * m2[3][1],
 			m1[0][0] * m2[0][2] + m1[0][1] * m2[1][2] + m1[0][2] * m2[2][2] + m1[0][3] * m2[3][2],
 			m1[0][0] * m2[0][3] + m1[0][1] * m2[1][3] + m1[0][2] * m2[2][3] + m1[0][3] * m2[3][3]],
-		    [m1[1][0] * m2[0][0] + m1[1][1] * m2[1][0] + m1[1][2] * m2[2][0] + m1[1][3] * m2[3][0],
+			[m1[1][0] * m2[0][0] + m1[1][1] * m2[1][0] + m1[1][2] * m2[2][0] + m1[1][3] * m2[3][0],
 			m1[1][0] * m2[0][1] + m1[1][1] * m2[1][1] + m1[1][2] * m2[2][1] + m1[1][3] * m2[3][1],
 			m1[1][0] * m2[0][2] + m1[1][1] * m2[1][2] + m1[1][2] * m2[2][2] + m1[1][3] * m2[3][2],
 			m1[1][0] * m2[0][3] + m1[1][1] * m2[1][3] + m1[1][2] * m2[2][3] + m1[1][3] * m2[3][3]],
-		    [m1[2][0] * m2[0][0] + m1[2][1] * m2[1][0] + m1[2][2] * m2[2][0] + m1[2][3] * m2[3][0],
+			[m1[2][0] * m2[0][0] + m1[2][1] * m2[1][0] + m1[2][2] * m2[2][0] + m1[2][3] * m2[3][0],
 			m1[2][0] * m2[0][1] + m1[2][1] * m2[1][1] + m1[2][2] * m2[2][1] + m1[2][3] * m2[3][1],
 			m1[2][0] * m2[0][2] + m1[2][1] * m2[1][2] + m1[2][2] * m2[2][2] + m1[2][3] * m2[3][2],
 			m1[2][0] * m2[0][3] + m1[2][1] * m2[1][3] + m1[2][2] * m2[2][3] + m1[2][3] * m2[3][3]],
-		    [m1[3][0] * m2[0][0] + m1[3][1] * m2[1][0] + m1[3][2] * m2[2][0] + m1[3][3] * m2[3][0],
+			[m1[3][0] * m2[0][0] + m1[3][1] * m2[1][0] + m1[3][2] * m2[2][0] + m1[3][3] * m2[3][0],
 			m1[3][0] * m2[0][1] + m1[3][1] * m2[1][1] + m1[3][2] * m2[2][1] + m1[3][3] * m2[3][1],
 			m1[3][0] * m2[0][2] + m1[3][1] * m2[1][2] + m1[3][2] * m2[2][2] + m1[3][3] * m2[3][2],
 			m1[3][0] * m2[0][3] + m1[3][1] * m2[1][3] + m1[3][2] * m2[2][3] + m1[3][3] * m2[3][3]]];
@@ -1356,29 +1356,29 @@ App.Art.Engine = class {
 
 	matrixMulVector(m, v) {
 		return [v[0] * m[0][0] + v[1] * m[1][0] + v[2] * m[2][0],
-			    v[0] * m[0][1] + v[1] * m[1][1] + v[2] * m[2][1],
-			    v[0] * m[0][2] + v[1] * m[1][2] + v[2] * m[2][2]];
+				v[0] * m[0][1] + v[1] * m[1][1] + v[2] * m[2][1],
+				v[0] * m[0][2] + v[1] * m[1][2] + v[2] * m[2][2]];
 	}
 
 	matrixInverse(m) {
 		return [[m[0][0], m[1][0], m[2][0], 0],
-			    [m[0][1], m[1][1], m[2][1], 0],
-			    [m[0][2], m[1][2], m[2][2], 0],
-			    [-(m[3][0]*m[0][0]+m[3][1]*m[0][1]+m[3][2]*m[0][2]), -(m[3][0]*m[1][0]+m[3][1]*m[1][1]+m[3][2]*m[1][2]), -(m[3][0]*m[2][0]+m[3][1]*m[2][1]+m[3][2]*m[2][2]), 1]];
+				[m[0][1], m[1][1], m[2][1], 0],
+				[m[0][2], m[1][2], m[2][2], 0],
+				[-(m[3][0]*m[0][0]+m[3][1]*m[0][1]+m[3][2]*m[0][2]), -(m[3][0]*m[1][0]+m[3][1]*m[1][1]+m[3][2]*m[1][2]), -(m[3][0]*m[2][0]+m[3][1]*m[2][1]+m[3][2]*m[2][2]), 1]];
 	}
 
 	matrixTranspose(m) {
 		return [[m[0][0], m[1][0], m[2][0], m[3][0]],
-			    [m[0][1], m[1][1], m[2][1], m[3][1]],
-			    [m[0][2], m[1][2], m[2][2], m[3][2]],
-			    [m[0][3], m[1][3], m[2][3], m[3][3]]];
+				[m[0][1], m[1][1], m[2][1], m[3][1]],
+				[m[0][2], m[1][2], m[2][2], m[3][2]],
+				[m[0][3], m[1][3], m[2][3], m[3][3]]];
 	}
 
 	matrixFlatten(m) {
 		return [m[0][0], m[0][1], m[0][2], m[0][3],
-			    m[1][0], m[1][1], m[1][2], m[1][3],
-			    m[2][0], m[2][1], m[2][2], m[2][3],
-			    m[3][0], m[3][1], m[3][2], m[3][3]];
+				m[1][0], m[1][1], m[1][2], m[1][3],
+				m[2][0], m[2][1], m[2][2], m[2][3],
+				m[3][0], m[3][1], m[3][2], m[3][3]];
 	}
 
 	lerp(a, b, f) {
diff --git a/src/art/webgl/ui.js b/src/art/webgl/ui.js
index 1397baaa1f4cb960a6bed1f3e56d0691f1bda3ad..a71807d4eb64baec407d3baf11d64ac3f1f479c1 100644
--- a/src/art/webgl/ui.js
+++ b/src/art/webgl/ui.js
@@ -288,7 +288,7 @@ App.Art.AutoFrame = function(view, slaveHeight, cameraHeight, offset) {
 		if (a > Math.PI/2) {
 			h = n/((-(r + 1) - ((r+1)**2 + 4*r*Math.tan(a)**2)**(1/2))/(2*Math.tan(a)*r)); // take negative discriminant
 		} else {
-			h = n/((-(r + 1) +  ((r+1)**2 + 4*r*Math.tan(a)**2)**(1/2))/(2*Math.tan(a)*r)); // take positive discriminant
+			h = n/((-(r + 1) + ((r+1)**2 + 4*r*Math.tan(a)**2)**(1/2))/(2*Math.tan(a)*r)); // take positive discriminant
 		}
 	} else {
 		h = (m+n)/2 * Math.sin(Math.acos(((m+n)/2-n)/((m+n)/2))); // edge case
diff --git a/src/data/backwardsCompatibility/datatypeCleanup.js b/src/data/backwardsCompatibility/datatypeCleanup.js
index 9de73c1b1f570c5644aba8ec4567a94595126e01..2a9b789da728963540704971a6232ee1c2a6d386 100644
--- a/src/data/backwardsCompatibility/datatypeCleanup.js
+++ b/src/data/backwardsCompatibility/datatypeCleanup.js
@@ -2432,13 +2432,13 @@ App.Entity.Utils.RARuleDatatypeCleanup = function() {
 		if (set.piercing === undefined) {
 			set.piercing = new App.Entity.completePiercingState();
 			for (const piercing of Object.keys(App.Data.Piercings)) {
-				const oldPiercing = `${oldPiercings.get(piercing) || piercing}Piercing`; // the old variable names were sometimes plural and sometimes singular.  The new standard is to use singular when possible.
+				const oldPiercing = `${oldPiercings.get(piercing) || piercing}Piercing`; // the old variable names were sometimes plural and sometimes singular. The new standard is to use singular when possible.
 				set.piercing[piercing].desc = null;
 				if (piercing === "gentials" && set.piercing[piercing].smart === undefined) {
 					set.piercing[piercing].smart = null;
 				}
 				if (set.hasOwnProperty(oldPiercing)) {
-					if (set[oldPiercing] === 3) { // 3 used to indicate a smart piercing.  We now track this on a separate property as a bool.
+					if (set[oldPiercing] === 3) { // 3 used to indicate a smart piercing. We now track this on a separate property as a bool.
 						set.piercing[piercing].weight = 2;
 						set.piercing[piercing].smart = true;
 					} else {
@@ -2667,12 +2667,12 @@ App.Update.slavePiercingsDatatypeCleanup = function(slave) {
 	]);
 	for (const piercing in App.Data.Piercings) {
 		slave.piercing[piercing] = slave.piercing[piercing] || new App.Entity.piercingState();
-		const oldPiercing = `${oldPiercings.get(piercing) || piercing}Piercing`; // the old variable names were sometimes plural and sometimes singular.  The new standard is to use singular when possible.
+		const oldPiercing = `${oldPiercings.get(piercing) || piercing}Piercing`; // the old variable names were sometimes plural and sometimes singular. The new standard is to use singular when possible.
 		if (App.Data.Piercings[piercing].smart) {
 			slave.piercing[piercing].smart = slave.piercing[piercing].smart || false;
 		}
 		if (slave.hasOwnProperty(oldPiercing)) {
-			if (slave[oldPiercing] === 3) { // 3 used to indicate a smart piercing.  We now track this on a separate property as a bool.
+			if (slave[oldPiercing] === 3) { // 3 used to indicate a smart piercing. We now track this on a separate property as a bool.
 				slave.piercing[piercing].weight = 2;
 				slave.piercing[piercing].smart = true;
 			} else if (slave[oldPiercing]) {
diff --git a/src/endWeek/events/expire.js b/src/endWeek/events/expire.js
index e9ac09b1c206e8fd6bb90a3883e679bc8d1b5333..cdcb4170ff4c92644ae41cd1392d9b227f47cb2b 100644
--- a/src/endWeek/events/expire.js
+++ b/src/endWeek/events/expire.js
@@ -3,7 +3,7 @@ App.Events.SEExpiration = class SEExpiration extends App.Events.BaseEvent {
 		super(actors, params);
 	}
 
-	/** Custom casting: all expiring slaves are cast automatically.  if no slaves are cast, casting fails and the event does not run. */
+	/** Custom casting: all expiring slaves are cast automatically. If no slaves are cast, casting fails and the event does not run. */
 	castActors() {
 		this.actors = V.slaves.filter(s => s.indenture === 0).map(s => s.ID);
 		return this.actors.length > 0;
diff --git a/src/endWeek/healthFunctions.js b/src/endWeek/healthFunctions.js
index 38cd772da96fc8b09976a32592571381e53349fc..87e270578af3836966332185a3d16aaf32fee566 100644
--- a/src/endWeek/healthFunctions.js
+++ b/src/endWeek/healthFunctions.js
@@ -742,7 +742,7 @@ globalThis.tired = function(slave) {
 			}
 		}
 
-		tiredChange = livingRules + assignment + restRules + reward + punishment; //  + muscles + health
+		tiredChange = livingRules + assignment + restRules + reward + punishment; // + muscles + health
 		H.tired += tiredChange;
 
 		// HG special cases
diff --git a/src/endWeek/saRecruitGirls.js b/src/endWeek/saRecruitGirls.js
index 77b105fd9b5e52e845cdb86aa85a612553462f79..df74829d5370c2488dd128f216991859a694e1f7 100644
--- a/src/endWeek/saRecruitGirls.js
+++ b/src/endWeek/saRecruitGirls.js
@@ -932,9 +932,10 @@ App.SlaveAssignment.recruitGirls = (function() {
 
 		r.push(`${He} uses ${his} extra time and <span class="cash">recruitment allowance</span> this week to tour the arcology and post to your household's social media accounts more actively than usual, <span class="reputation inc">building up your reputation.</span>`);
 
-		/** Conditional push:
-		 *  if V.showEWM is set, is a function that pushes the arguments into r
-		 *  otherwise is a function that just silently consumes the arguments
+		/**
+		 * Conditional push:
+		 * if V.showEWM is set, is a function that pushes the arguments into r
+		 * otherwise is a function that just silently consumes the arguments
 		 * @type {function(...string): void}
 		 */
 		const pushEWM = V.showEWM === 1 ? (...str) => r.push(...str) : () => {};
diff --git a/src/endWeek/saRelationships.js b/src/endWeek/saRelationships.js
index 5fcab058fc1129e6fbf85264e23007dee9a53083..706cd45fcf941827c23002fab89c766872e4d5dd 100644
--- a/src/endWeek/saRelationships.js
+++ b/src/endWeek/saRelationships.js
@@ -710,7 +710,7 @@ App.SlaveAssignment.relationships = (function() {
 							slave.relationship++;
 							friend.relationship = slave.relationship;
 						} else if (V.seeIncest === 1 && slave.behavioralQuirk === "sinful" && areRelated(slave, friend) && random(1, 100) > (80 - seed)) {
-							r.push(`Aroused by the chance to commit the sin of incest, ${slave.slaveName} successfully seduces  ${his} ${relativeTerm(slave, friend)}, ${friend.slaveName}, making them <span class="relationship">friends with benefits.</span>`);
+							r.push(`Aroused by the chance to commit the sin of incest, ${slave.slaveName} successfully seduces ${his} ${relativeTerm(slave, friend)}, ${friend.slaveName}, making them <span class="relationship">friends with benefits.</span>`);
 							slave.relationship++;
 							friend.relationship = slave.relationship;
 						} else if (slave.energy > 95 && random(1, 100) > (80 - seed)) {
@@ -1191,7 +1191,7 @@ App.SlaveAssignment.relationships = (function() {
 	 */
 	function familyFeelings(slave) {
 		/** @param {Map<string, Array<App.Entity.SlaveState>>} map
-		 *  @param {App.Entity.SlaveState} relative */
+		 * @param {App.Entity.SlaveState} relative */
 		function addToRelativeMap(map, relative) {
 			const terms = relativeTerms(slave, relative);
 			for (const term of terms) {
@@ -1204,7 +1204,7 @@ App.SlaveAssignment.relationships = (function() {
 		}
 
 		/** @param {Map<string, Array<App.Entity.SlaveState>>} map
-		 *  @returns {Array<string>} */
+		 * @returns {Array<string>} */
 		function relativeMapToGroupArray(map) {
 			let groups = [];
 			for (const [type, people] of map) {
@@ -1218,7 +1218,7 @@ App.SlaveAssignment.relationships = (function() {
 		}
 
 		/** @param {Map<string, Array<App.Entity.SlaveState>>} map
-		 *  @returns {App.Entity.SlaveState} */
+		 * @returns {App.Entity.SlaveState} */
 		function singleRelativeInMap(map) {
 			if (map.size !== 1) {
 				return null;
@@ -1232,7 +1232,7 @@ App.SlaveAssignment.relationships = (function() {
 		}
 
 		/** @param {Map<string, Array<App.Entity.SlaveState>>} map
-		 *  @returns {number} */
+		 * @returns {number} */
 		function relativeMapTotalSize(map) {
 			let size = 0;
 			for (const people of map.values()) {
diff --git a/src/events/PE/UnderageConcubine.js b/src/events/PE/UnderageConcubine.js
index 5bb78c2d7db2bff90045450f1accb8811639e2d9..e6d8cbc45bf3bbcde189371416bae03c783008c3 100644
--- a/src/events/PE/UnderageConcubine.js
+++ b/src/events/PE/UnderageConcubine.js
@@ -70,7 +70,7 @@ App.Events.PEUnderageConcubine = class PEUnderageConcubine extends App.Events.Ba
 			t.push(`Your days of caring what the Old World has to say are long over. You tell both ${V.assistant.name} and ${concubine.slaveName} to ignore the fuss and go back to what they were doing as you reach over to play with ${concubine.slaveName}'s pretty ${num(concubine.actualAge)}-year-old ${concubine.toyHole === "all her holes" ? "body" : concubine.toyHole}.`);
 			App.Events.addParagraph(frag, t);
 
-			// doesn't matter, huh?  let's see about that...
+			// doesn't matter, huh? let's see about that...
 			const matureArc = arcologyGoesMature();
 			if (matureArc) {
 				t = [];
diff --git a/src/events/RE/REBusyArcade.js b/src/events/RE/REBusyArcade.js
index c31d8976ab259830dc042eaf0808dbc4ba7998dd..b6d3f1611268dc12d35307d69f571613dee20a51 100644
--- a/src/events/RE/REBusyArcade.js
+++ b/src/events/RE/REBusyArcade.js
@@ -8,7 +8,7 @@ App.Events.REBusyArcade = class REBusyArcade extends App.Events.BaseEvent {
 	actorPrerequisites() {
 		return [
 			[
-				s => s.assignment  === Job.ARCADE,
+				s => s.assignment === Job.ARCADE,
 				s => s.fetish !== "mindbroken",
 				s => canMove(s) || hasAnyLegs(s),
 				s => s.devotion < 45
diff --git a/src/events/RE/reHGReplacement.js b/src/events/RE/reHGReplacement.js
index 36206079b79fab8df718a78546e51e584571ef31..165546496da99b8d83c67167bdb1843f478208bc 100644
--- a/src/events/RE/reHGReplacement.js
+++ b/src/events/RE/reHGReplacement.js
@@ -90,7 +90,7 @@ App.Events.REHGReplacement = class REHGReplacement extends App.Events.BaseEvent
 			let r = [];
 			r.push(`After giving the matter some consideration, you agree, instructing ${V.assistant.name} that ${slave.slaveName} is now the Head Girl. ${slave.slaveName} is <span class="devotion inc">overjoyed,</span> and bounces to ${his} feet, clearly very eager to begin. You caution ${him} that ${he} is not to undermine ${S.HeadGirl.slaveName} by letting anyone know why you decided to change Head Girls. ${He} nods obediently. As far as ${S.HeadGirl.slaveName} knows, it's just a standard change of Head Girls, and ${he2}'s too good a slave to let it affect ${him2} seriously.`);
 			slave.devotion += 5;
-			assignJob(slave, Job.HEADGIRL);  // should we be removing the old HG here?
+			assignJob(slave, Job.HEADGIRL); // should we be removing the old HG here?
 			App.Events.addParagraph(frag, r);
 			return frag;
 		}
diff --git a/src/events/RE/reSiblingPlease.js b/src/events/RE/reSiblingPlease.js
index c7434d2fb4160a1a22b87e304d1c8686ed6eff12..725f549d0eef5576538f94655508a3787f2c8942 100644
--- a/src/events/RE/reSiblingPlease.js
+++ b/src/events/RE/reSiblingPlease.js
@@ -246,7 +246,7 @@ App.Events.RESiblingPlease = class RESiblingPlease extends App.Events.BaseEvent
 			fuckMom(t, disobedient);
 
 			if (mom.preg === -1) {
-				t.push(`You know it probably won't take today, but you've already ordered ${V.assistant.name} to discontinue ${his2} contraceptive regimen, and you'll be repeating this ritual all week.  ${He2}'s <span class="pregnant">bound to end up pregnant.</span>`);
+				t.push(`You know it probably won't take today, but you've already ordered ${V.assistant.name} to discontinue ${his2} contraceptive regimen, and you'll be repeating this ritual all week. ${He2}'s <span class="pregnant">bound to end up pregnant.</span>`);
 			} else {
 				t.push(`You won't know if it's taken right away, but you'll be repeating this ritual all week, so ${he2}'s <span class="pregnant">going to end up pregnant.</span>`);
 			}
@@ -288,7 +288,7 @@ App.Events.RESiblingPlease = class RESiblingPlease extends App.Events.BaseEvent
 			fuckDau(t);
 
 			if (dau.preg === -1) {
-				t.push(`You know it probably won't take today, but you've already ordered ${V.assistant.name} to discontinue ${his} contraceptive regimen, and you'll be repeating this ritual all week.  ${He}'s <span class="pregnant">bound to end up pregnant.</span>`);
+				t.push(`You know it probably won't take today, but you've already ordered ${V.assistant.name} to discontinue ${his} contraceptive regimen, and you'll be repeating this ritual all week. ${He}'s <span class="pregnant">bound to end up pregnant.</span>`);
 			} else {
 				t.push(`You won't know if it's taken right away, but you'll be repeating this ritual all week, so ${he}'s <span class="pregnant">going to end up pregnant.</span>`);
 			}
diff --git a/src/events/RESS/forbiddenMasturbation.js b/src/events/RESS/forbiddenMasturbation.js
index b3f7125d1ad7789b2ef18ead55c56a4c730d76ba..efa67ac905e5c9096ad61435bcdb50bac0e36756 100644
--- a/src/events/RESS/forbiddenMasturbation.js
+++ b/src/events/RESS/forbiddenMasturbation.js
@@ -218,7 +218,7 @@ App.Events.RESSForbiddenMasturbation = class RESSForbiddenMasturbation extends A
 		}
 
 		if (responses.length > 1) {
-			responses.splice(1, 0, new App.Events.Result(null, null, `Punish ${him}, but then let ${him} get off:`));  // Hack for providing a headline to certain responses
+			responses.splice(1, 0, new App.Events.Result(null, null, `Punish ${him}, but then let ${him} get off:`)); // Hack for providing a headline to certain responses
 		}
 		App.Events.addResponses(node, responses);
 
diff --git a/src/events/RESS/milkgasm.js b/src/events/RESS/milkgasm.js
index 74d38d302d42b6d522ead7026b0d1ddf66cb4784..1af30b58a0375452bedb6aef53bd50748d495079 100644
--- a/src/events/RESS/milkgasm.js
+++ b/src/events/RESS/milkgasm.js
@@ -289,7 +289,7 @@ App.Events.RESSMilkgasm = class RESSMilkgasm extends App.Events.BaseEvent {
 			} else {
 				r.push(`finger into each nipple.`);
 			}
-			r.push(`The  ${canTalk(eventSlave) ? "shrieking" : "whining"} reaches a paroxysm, but once they're`);
+			r.push(`The ${canTalk(eventSlave) ? "shrieking" : "whining"} reaches a paroxysm, but once they're`);
 			if (eventSlave.nipples !== "fuckable") {
 				r.push(`protruded,`);
 			} else {
diff --git a/src/events/RESS/scrubbing.js b/src/events/RESS/scrubbing.js
index 4abb0033e3e5c157a1df1d09dea182c9f1d7b6cc..dc56c339065e8de2653f03543728ae6ed7db6d48 100644
--- a/src/events/RESS/scrubbing.js
+++ b/src/events/RESS/scrubbing.js
@@ -143,10 +143,10 @@ App.Events.RESSScrubbing = class RESSScrubbing extends App.Events.BaseEvent {
 		App.Events.addParagraph(node, r);
 		App.Events.addResponses(node, [
 			canDoAnal(eventSlave)
-				? new App.Events.Result(`Use ${his} butt to help ${him} scrub`, scrub, eventSlave.anus  === 0 ? `This option will take ${his} anal virginity` : null)
+				? new App.Events.Result(`Use ${his} butt to help ${him} scrub`, scrub, eventSlave.anus === 0 ? `This option will take ${his} anal virginity` : null)
 				: new App.Events.Result(),
 			canDoVaginal(eventSlave)
-				? new App.Events.Result(`Avail yourself to ${his} pussy`, pussy, eventSlave.vagina  === 0 ? `This option will take ${his} virginity` : null)
+				? new App.Events.Result(`Avail yourself to ${his} pussy`, pussy, eventSlave.vagina === 0 ? `This option will take ${his} virginity` : null)
 				: new App.Events.Result(),
 			canDoAnal(eventSlave) || canDoVaginal(eventSlave)
 				? new App.Events.Result(`Give ${him} a bigger mess to deal with`, mess, virginityWarning())
diff --git a/src/events/assistant/assistantBody.js b/src/events/assistant/assistantBody.js
index 0a368690af5356a3f3edf1b88cf7674ab272fd86..2756572aa6f70842ff77193e2ca3c34093189e64 100644
--- a/src/events/assistant/assistantBody.js
+++ b/src/events/assistant/assistantBody.js
@@ -12,7 +12,7 @@ App.Events.assistantBody = class assistantBody extends App.Events.BaseEvent {
 	execute(node) {
 		const {
 			HeA,
-			heA, hisA, himA,  himselfA
+			heA, hisA, himA, himselfA
 		} = getPronouns(assistant.pronouns().main).appendSuffix("A");
 		let r = [];
 		App.Events.drawEventArt(node, "assistant");
diff --git a/src/events/eventUtils.js b/src/events/eventUtils.js
index 234f52e8a02832967458b93b1fe426c9258bf611..5733300cfe739a22d8d5fb616c01fc3b44f07277 100644
--- a/src/events/eventUtils.js
+++ b/src/events/eventUtils.js
@@ -1,4 +1,4 @@
-/** @typedef {App.Entity.SlaveState|"assistant"} EventArtObject  */
+/** @typedef {App.Entity.SlaveState|"assistant"} EventArtObject */
 
 App.Events.drawEventArt = (function() {
 	const validSingleOutfits = Array.from(App.Data.clothes.keys());
@@ -7,7 +7,7 @@ App.Events.drawEventArt = (function() {
 	 * @param {Node} node - DOM node to attach art to
 	 * @param {EventArtObject|EventArtObject[]} slaves - one or several objects (slave object or "assistant") to draw art for
 	 * @param {FC.Clothes|FC.Clothes[]} [clothesMode] - if the slaves' clothing should be overridden, what should they be wearing?
-	 * @param {object|object[]} [extraClothes] - if other parts of the slaves' clothing should be overridden, what should they be wearing?  For slave.vaginalAccessory, use [{"vaginalAccessory": "dildo"}]
+	 * @param {object|object[]} [extraClothes] - if other parts of the slaves' clothing should be overridden, what should they be wearing? For slave.vaginalAccessory, use [{"vaginalAccessory": "dildo"}]
 	 */
 	function draw(node, slaves, clothesMode, extraClothes) {
 		// do nothing if the player doesn't want images
@@ -121,7 +121,7 @@ App.Events.drawEventArt = (function() {
 /** Refresh previously drawn event art with new slaves or clothing
  * @param {EventArtObject|EventArtObject[]} slaves - one or several objects (slave object or "assistant") to draw art for
  * @param {FC.Clothes|FC.Clothes[]} [clothesMode] - if the slaves' clothing should be overridden, what should they be wearing?
- * @param {object|object[]} [extraClothes] - if other parts of the slaves' clothing should be overridden, what should they be wearing?  For slave.vaginalAccessory, use [{"vaginalAccessory": "dildo"}]
+ * @param {object|object[]} [extraClothes] - if other parts of the slaves' clothing should be overridden, what should they be wearing? For slave.vaginalAccessory, use [{"vaginalAccessory": "dildo"}]
  */
 App.Events.refreshEventArt = function(slaves, clothesMode, extraClothes) {
 	// do nothing if the player doesn't want images
@@ -411,8 +411,8 @@ App.Events.qualifiesForREFIsubSlave = function(slave, fetish) {
 	return slave.fetishKnown === 1 && slave.fetishStrength > 95 && isSlaveAvailable(slave) && slave.fetish === fetish;
 };
 
-/** Queue an event for scheduled execution on a later week.  Queued events are executed automatically at the end of Nonrandom Event on the chosen week.
- * @param {number} weeks - the number of weeks to wait before executing the event. 0 means execute this week, 1 execute next week, etc.  Note that events generally cannot safely queue other events for the same week; they should always pass 1 or more in this parameter.  Other parts of the game (Slave Interact, etc) can safely queue events for this week (i.e. the upcoming End Week cycle) by passing 0.
+/** Queue an event for scheduled execution on a later week. Queued events are executed automatically at the end of Nonrandom Event on the chosen week.
+ * @param {number} weeks - the number of weeks to wait before executing the event. 0 means execute this week, 1 execute next week, etc. Note that events generally cannot safely queue other events for the same week; they should always pass 1 or more in this parameter. Other parts of the game (Slave Interact, etc) can safely queue events for this week (i.e. the upcoming End Week cycle) by passing 0.
  * @param {App.Events.BaseEvent} event - the event to execute. note that this event is serialized normally, so changes to the class name or parameter structure will break the event in saved games!
  * @param {Object} [params] - any parameters to serialize with the event. when the event executes, these will be accessible in "this.params".
  */
diff --git a/src/events/nonRandom/daughters/pCollaborationChoice.js b/src/events/nonRandom/daughters/pCollaborationChoice.js
index 70dd262e81f602941933ea1c4f2fea44b59f10d7..d37a2800f96321317941ccc22ec0a044e98327d0 100644
--- a/src/events/nonRandom/daughters/pCollaborationChoice.js
+++ b/src/events/nonRandom/daughters/pCollaborationChoice.js
@@ -134,7 +134,7 @@ App.Events.PCoupCollaborationChoice = class PCoupCollaborationChoice extends App
 		function transmit() {
 			const frag = new DocumentFragment();
 			let r = [];
-			if (V.traitor === 0) { // for typing.  Why the fuck do I have to do this for a nested function.
+			if (V.traitor === 0) { // for typing. Why the fuck do I have to do this for a nested function.
 				return node;
 			}
 			r.push(`You transmit the access codes to your security systems.`);
diff --git a/src/events/nonRandom/mercs/pSlaveMedic.js b/src/events/nonRandom/mercs/pSlaveMedic.js
index df9b358e90dca4e94a64ca5d83c90b21c92cbd8a..b09ccbd08347556b222863fd5495c900161bdebe 100644
--- a/src/events/nonRandom/mercs/pSlaveMedic.js
+++ b/src/events/nonRandom/mercs/pSlaveMedic.js
@@ -98,7 +98,7 @@ App.Events.PSlaveMedic = class PSlaveMedic extends App.Events.BaseEvent {
 			} else {
 				r.push(`main living area,`);
 			}
-			r.push(`you see ${slave.slaveName} bending over a mercenary with most of his armor stripped off. ${He}'s the ${aNational(slave.nationality)} nurse they captured and enslaved, and ${he} seems to be doing pretty well in ${his} new life. ${He} seems to be checking the sutures on a minor wound to the man's flank. "Don't  squirm," ${he} says quietly. "I'll get you off when I've checked this." He chuckles and holds still; ${he} redresses the wound, stands up, and strips off ${his} fatigue pants.`);
+			r.push(`you see ${slave.slaveName} bending over a mercenary with most of his armor stripped off. ${He}'s the ${aNational(slave.nationality)} nurse they captured and enslaved, and ${he} seems to be doing pretty well in ${his} new life. ${He} seems to be checking the sutures on a minor wound to the man's flank. "Don't squirm," ${he} says quietly. "I'll get you off when I've checked this." He chuckles and holds still; ${he} redresses the wound, stands up, and strips off ${his} fatigue pants.`);
 			if (V.pedo_mode === 1) {
 				r.push(`${He}'s quite youthful, nimble and knows just how to manage ${his} impressive asset without it touching ${his} charge.`);
 			} else {
@@ -115,7 +115,7 @@ App.Events.PSlaveMedic = class PSlaveMedic extends App.Events.BaseEvent {
 		if (V.cash > lowBid) {
 			choices.push(new App.Events.Result(`Offer ${cashFormat(lowBid)} for ${him}`, offerLow));
 			if (V.cash > highBid) {
-				choices.push(new App.Events.Result(`Offer a very generous  ${cashFormat(highBid)} for ${him}`, offerHigh));
+				choices.push(new App.Events.Result(`Offer a very generous ${cashFormat(highBid)} for ${him}`, offerHigh));
 			} else {
 				choices.push(new App.Events.Result(null, null, `Cannot afford even a generous bid of ${cashFormat(highBid)}`));
 			}
diff --git a/src/events/nonRandom/pAbducted.js b/src/events/nonRandom/pAbducted.js
index 3e9d042b21ead4190af88696f0edba523f6b60b1..52e1c77032829a71448991af8ac3c42b9b1f60ba 100644
--- a/src/events/nonRandom/pAbducted.js
+++ b/src/events/nonRandom/pAbducted.js
@@ -113,7 +113,7 @@ App.Events.pAbducted = class pAbducted extends App.Events.BaseEvent {
 			App.Events.addParagraph(node, r);
 
 			r = [];
-			r.push(`Once the realization strikes that you've gone missing, your arcology descends into lawlessness as the less than reputable clash to see who can seize control of building, at least until a new owner arrives to clean them out. An indeterminate amount of time later, a slave that looks a lot like the lost owner of ${V.arcologies[0].name} is seen; who's to say if it is you, or somebody else though?  The story of your new life may be worth telling, but it must be told elsewhere.`);
+			r.push(`Once the realization strikes that you've gone missing, your arcology descends into lawlessness as the less than reputable clash to see who can seize control of building, at least until a new owner arrives to clean them out. An indeterminate amount of time later, a slave that looks a lot like the lost owner of ${V.arcologies[0].name} is seen; who's to say if it is you, or somebody else though? The story of your new life may be worth telling, but it must be told elsewhere.`);
 			App.Events.addParagraph(node, r);
 
 			App.Events.addParagraph(node, ["<span class='bold'>GAME OVER</span>"]);
diff --git a/src/events/nonRandom/rival/pRivalryHostage.js b/src/events/nonRandom/rival/pRivalryHostage.js
index 8680757cda44f29bcfca50005574b9f110039994..96768bcce2de284f580a08e0b5a20cf5405440ca 100644
--- a/src/events/nonRandom/rival/pRivalryHostage.js
+++ b/src/events/nonRandom/rival/pRivalryHostage.js
@@ -10,8 +10,8 @@ App.Events.pRivalryHostage = function() {
 		switch (V.rivalryFS) {
 			case "Maturity Preferentialism":
 			case "Petite Admiration":
-			case  "Statuesque Glorification":
-			case  "Youth Preferentialism":
+			case "Statuesque Glorification":
+			case "Youth Preferentialism":
 				V.hostageWife = GenerateNewSlave("XX");
 		}
 
diff --git a/src/events/randomEvent.js b/src/events/randomEvent.js
index c57ddb8cc01b48944fca35934064c936e400c6fa..6b5932640178db1c852fac583baa3ff303b71f5c 100644
--- a/src/events/randomEvent.js
+++ b/src/events/randomEvent.js
@@ -206,7 +206,7 @@ App.Events.getIndividualEvents = function() {
 };
 
 /** get a list of possible nonindividual events
- *  Note: recruitment events should NOT be added to this list; they go in getNonindividualRecruitmentEvents instead.
+ * Note: recruitment events should NOT be added to this list; they go in getNonindividualRecruitmentEvents instead.
  * @returns {Array<App.Events.BaseEvent>}
  */
 App.Events.getNonindividualEvents = function() {
@@ -333,7 +333,7 @@ App.Events.getNonindividualEvents = function() {
 };
 
 /** get a list of possible nonindividual recruitment events
- *  The probability of selecting recruitment events is capped, to allow the above events to trigger more frequently
+ * The probability of selecting recruitment events is capped, to allow the above events to trigger more frequently
  * @returns {Array<App.Events.BaseEvent>}
  */
 App.Events.getNonindividualRecruitmentEvents = function() {
@@ -488,7 +488,7 @@ App.Events.playRandomIndividualEvent = function() {
 			// pick a slave for a random individual event
 			const eventSlave = eligibleSlaves.random();
 
-			// pick a random individual event for that slave.  Use RE No Event if there are none she's eligible for.
+			// pick a random individual event for that slave. Use RE No Event if there are none she's eligible for.
 			const events = App.Events.getValidEvents(App.Events.getIndividualEvents(), eventSlave);
 			const event = events.random() || makeNoEvent(eventSlave.ID);
 
@@ -531,7 +531,7 @@ App.Events.playRandomNonindividualEvent = function() {
 			App.UI.DOM.appendNewElement("div", d, App.UI.DOM.passageLink("Skip week-end events", "Next Week"));
 			d.append(App.Events.renderEventDebugger("Random Nonindividual Event"));
 		} else {
-			// pick a random nonindividual event.  there should always be at least one.
+			// pick a random nonindividual event. there should always be at least one.
 			const maxRecruitNumber = Math.min(10, Math.floor(nonRecEvents.length/4) + 1);
 			if (recEvents.length > maxRecruitNumber) {
 				recEvents = recEvents.pluckMany(maxRecruitNumber);
diff --git a/src/events/scheduled/burst/burst.js b/src/events/scheduled/burst/burst.js
index 5bd6efbc5d2f9f90ce86a6dd2d2d595d3630133a..fc7de3835ca1f686f2bee62b75483293f109c0e9 100644
--- a/src/events/scheduled/burst/burst.js
+++ b/src/events/scheduled/burst/burst.js
@@ -3,7 +3,7 @@ App.Events.SEBurst = class SEBurst extends App.Events.BaseEvent {
 		super(actors, params);
 	}
 
-	/** Custom casting: all bursting slaves are cast automatically.  if no slaves are cast, casting fails and the event does not run. */
+	/** Custom casting: all bursting slaves are cast automatically. If no slaves are cast, casting fails and the event does not run. */
 	castActors() {
 		this.actors = V.slaves.filter(s => burstCheck(s)).map(s => s.ID);
 		return this.actors.length > 0;
diff --git a/src/events/scheduled/pitFightLethal.js b/src/events/scheduled/pitFightLethal.js
index b678b0a4bd99c6967559b34d5ab49e1c445290e6..c2fe9ef8b33febec7b839351e0212fc771d08a8f 100644
--- a/src/events/scheduled/pitFightLethal.js
+++ b/src/events/scheduled/pitFightLethal.js
@@ -105,8 +105,8 @@ App.Facilities.Pit.lethalFight = function(fighters) {
 	}
 
 	/**
-	 *  @param {DocumentFragment} parent
-	 *  @param {App.Entity.SlaveState} fighter
+	 * @param {DocumentFragment} parent
+	 * @param {App.Entity.SlaveState} fighter
 	 */
 	function fighterDeadliness(parent, fighter) {
 		const {he, his, him, himself, He, His} = getPronouns(fighter);
diff --git a/src/events/scheduled/pitFightNonlethal.js b/src/events/scheduled/pitFightNonlethal.js
index b63543361bc1b8b516bcfecb228e6cbd2b73bd64..7e670108ef5add555493346b1ad692d6ff8e1742 100644
--- a/src/events/scheduled/pitFightNonlethal.js
+++ b/src/events/scheduled/pitFightNonlethal.js
@@ -147,8 +147,8 @@ App.Facilities.Pit.nonlethalFight = function(fighters) {
 	}
 
 	/**
-	 *  @param {DocumentFragment} parent
-	 *  @param {App.Entity.SlaveState} fighter
+	 * @param {DocumentFragment} parent
+	 * @param {App.Entity.SlaveState} fighter
 	 */
 	function fighterDeadliness(parent, fighter) {
 		const {he, his, him, himself, He, His} = getPronouns(fighter);
diff --git a/src/events/scheduled/sePCBirthday.desc.js b/src/events/scheduled/sePCBirthday.desc.js
index 1edaa99dba75c3a592d54ec1eba42dcec1c13baa..0b1d37efcd426eacbbf1a60ef5270de812f01729 100644
--- a/src/events/scheduled/sePCBirthday.desc.js
+++ b/src/events/scheduled/sePCBirthday.desc.js
@@ -541,7 +541,7 @@ App.Events.pcBirthday.Desc = (function(bday) {
 				The moans become audible, starting from a soft whimper and growing into a desperate cry for release. ${pn.She}'s working ${pn.his} hips with fierce
 				urgency. ${pn.She}'ll be damned if ${pn.she} gets off without milking your dick for every fucking drop of cum that is ready to burst the dam. ${pn.She}
 				won't let go now; ${pn.his} limbs have such a vice grip on your pounding body that you'd have little chance to shake loose even if you wanted. The
-				${pn.girl} is wild. And hungry. And intense. And writhing. And  –
+				${pn.girl} is wild. And hungry. And intense. And writhing. And –
 			</p>
 			<p>
 				Brought to a crescendo, you release inside of ${pn.her}. An animalistic growl escapes ${pn.his} lips. ${pn.She} trembles underneath you, a series of
@@ -595,7 +595,7 @@ App.Events.pcBirthday.Desc = (function(bday) {
 				now, ${pn.his} pussy is planted firmly against yours, the direct mingling of your wetness sealing the kiss of your private lips.
 				${data.planner.slave.slaveName} bucks ${pn.his} hips and presses firmly down into you and the cadence quickly returns. ${pn.His} hands absently grope and
 				caress your body. ${pn.His} thrusts drive harder into you but the sticky friction of ${pn.his} groin against your clitoris never lets up. The ${pn.girl}
-				is wild. And hungry. And intense. And writhing. And  –
+				is wild. And hungry. And intense. And writhing. And –
 			</p>
 			<p>
 				Brought to a crescendo, you come spastically against each other. An animalistic growl escapes ${pn.his} lips. ${pn.She} trembles between your legs, a
@@ -648,7 +648,7 @@ App.Events.pcBirthday.Desc = (function(bday) {
 				urgency. ${pn.She}'ll be damned if ${pn.she} gets off without milking your dick for every fucking drop of cum that is ready to burst the dam. ${pn.His}
 				hips buck just as insatiably as yours. ${pn.She} releases your buttock only to reach down and pull your thigh over ${pn.his} hip. ${pn.She} rolls forward
 				enough to give you more leverage into ${pn.his} devouring asshole. ${pn.She} arches ${pn.his} back and begs you to pump ${pn.her} harder. The ${pn.girl} is
-				wild. And hungry. And intense. And writhing. And  –
+				wild. And hungry. And intense. And writhing. And –
 			</p>
 			<p>
 				Brought to a crescendo, you release inside of ${pn.her} and ${pn.she} onto the cotton sheets. An animalistic growl escapes ${pn.his} lips. ${pn.She}
@@ -695,7 +695,7 @@ App.Events.pcBirthday.Desc = (function(bday) {
 				The moans become audible, starting from a soft whimper and growing into a desperate cry for release. ${pn.She}'s working ${pn.his} hips with fierce urgency.
 				${pn.She}'ll be damned if ${pn.she} gets off without working ${pn.his} engorged tool against every sensitive spot inside you. You won't let go now; your limbs have
 				such a vice grip on ${pn.his} pounding body that ${pn.she}'d have little chance to shake loose even if ${pn.she} wanted. The ${pn.girl} is wild. And hungry. And
-				intense. And writhing. And  –
+				intense. And writhing. And –
 			</p>
 			<p>
 				Brought to a crescendo, ${pn.she} releases inside of you. An animalistic growl escapes ${pn.his} lips. ${pn.She} trembles above you, a series of shockwaves and
@@ -854,7 +854,7 @@ App.Events.pcBirthday.Desc = (function(bday) {
 				like a pommel horse; her face stops before yours just long enough to plant a finalé kiss on your cheek, and she disappears somewhere behind you.
 			</p>
 			<p>
-				As her body launched out of sight, however, another two bodies were waiting at your feet. Or  –  you begin to wonder if it is actually two, or
+				As her body launched out of sight, however, another two bodies were waiting at your feet. Or – you begin to wonder if it is actually two, or
 				if your vision is doubling from a random pill you pulled off a tray and the mystical atmosphere provided by the fog. But no, it's soon clear that
 				it's two redhead twins who had been warming each other up to prepare themselves for you. In stark and provocative contrast to the athlete before
 				them, these girls slide upon you with full, soft bodies. They kiss your nipples, your collarbone, your cheeks, and finally share your tongue
@@ -945,7 +945,7 @@ App.Events.pcBirthday.Desc = (function(bday) {
 				you like a pommel horse; her face stops before yours just long enough to plant a finalé kiss on your cheek, and she disappears somewhere behind you.
 			</p>
 			<p>
-				As her body launched out of sight, however, another two bodies were waiting at your feet. Or  –  you begin to wonder if it is actually two, or
+				As her body launched out of sight, however, another two bodies were waiting at your feet. Or – you begin to wonder if it is actually two, or
 				if your vision is doubling from a random pill you pulled off a tray and the mystical atmosphere provided by the fog. But no, it's soon clear that
 				it's two redhead twins who had been warming each other up to prepare themselves for you. In stark and provocative contrast to the athlete before
 				them, these girls slide upon you with full, soft bodies. They kiss your nipples, your collarbone, your cheeks, and finally share your tongue between
diff --git a/src/events/scheduled/sePCBirthday.js b/src/events/scheduled/sePCBirthday.js
index 5cfd6526af3b6e3307be5daa4690178314f91b5f..7974837fce57c1fe2e3c1fe7c77825d8570583e2 100644
--- a/src/events/scheduled/sePCBirthday.js
+++ b/src/events/scheduled/sePCBirthday.js
@@ -82,8 +82,8 @@ App.Events.pcBirthday = (function(events) {
 			// TODO: (snes): can be expanded to
 			// a) add more moods
 			// b) check state to change weights for moods,
-			//  e.g. if the player is doing poorly, the outcome
-			//  is more likely to be solumn
+			//	e.g. if the player is doing poorly, the outcome
+			//	is more likely to be solumn
 			//
 			// as a POC, just using rng for now
 			return App.Events.pcBirthday.forceMood || (Math.random() > 0.2 ? "happy" : "solemn");
diff --git a/src/events/timeGatedPlotEvent.js b/src/events/timeGatedPlotEvent.js
index c36a2c550dc387d953e7ee6320e6f3062469ce38..ffcd42130eb679938b32f69cac15c13464980b7c 100644
--- a/src/events/timeGatedPlotEvent.js
+++ b/src/events/timeGatedPlotEvent.js
@@ -5,7 +5,7 @@ App.Events.TimeGatedPlotEvent = class TimeGatedPlotEvent extends App.Events.Base
 		super(actors, params);
 
 		// sparse array, indexed by effective week
-		// maybe mercs should be a separate chain?  Oh well, they're here for now.
+		// maybe mercs should be a separate chain? Oh well, they're here for now.
 		this.events = [];
 		this.events[4] = new App.Events.PArcologyNaming();
 		this.events[6] = new App.Events.PStripClubClosing();
diff --git a/src/facilities/bodyModification/bodyModification.js b/src/facilities/bodyModification/bodyModification.js
index c9bf7f798ca1c45dfda83414ffec4494fbaefa47..088bbf7577bb3853456e07f0d4d7eb3c419933ed 100644
--- a/src/facilities/bodyModification/bodyModification.js
+++ b/src/facilities/bodyModification/bodyModification.js
@@ -223,7 +223,7 @@ App.UI.bodyModification = function(slave, cheat = false) {
 		}
 
 		if (pierced) {
-			App.UI.DOM.appendNewElement("div", el, `Reminder for writing custom content: slave pronouns are usually written in the masculine, and start with '$'.  "$His earlobes" becomes "Her earlobes" in text.`, "note");
+			App.UI.DOM.appendNewElement("div", el, `Reminder for writing custom content: slave pronouns are usually written in the masculine, and start with '$'. "$His earlobes" becomes "Her earlobes" in text.`, "note");
 		} else {
 			options.addComment(`${His} smooth ${slave.skin} skin is completely unpierced.`);
 		}
@@ -1217,7 +1217,7 @@ App.UI.scarSelect = function(category, slave, cheat = false) {
  *
  * @param {Object} variable
  * @param {string} property
- * @param {boolean | App.Entity.SlaveState} selector false means missing limbs.  True means no missing limbs.  Slave state checks the slave.
+ * @param {boolean | App.Entity.SlaveState} selector false means missing limbs. True means no missing limbs. Slave state checks the slave.
  * @returns {HTMLElement}
  */
 App.UI.bodyPartSelector = function(variable, property, selector) {
@@ -1290,7 +1290,7 @@ App.UI.bodyPartSelector = function(variable, property, selector) {
  * @param {string} bodyPart
  * @returns {string}
  */
-App.UI.bodyPartRoot =  function(bodyPart) {
+App.UI.bodyPartRoot = function(bodyPart) {
 	if (bodyPart.startsWith("left")) {
 		bodyPart = (bodyPart.replace(/left /g, ""));
 	} else if (bodyPart.startsWith("right")) {
diff --git a/src/facilities/farmyard/farmyard.js b/src/facilities/farmyard/farmyard.js
index 90c8ec78631c2addb431063d4b012ca1a0803d6b..a00a9c9c9eb029ffc91c8375a6425b448d7938e7 100644
--- a/src/facilities/farmyard/farmyard.js
+++ b/src/facilities/farmyard/farmyard.js
@@ -109,9 +109,9 @@ App.Facilities.Farmyard.farmyard = class Farmyard extends App.Facilities.Facilit
 			"Slimness Enthusiast": `It features trim animals and slaves alike, not a pound of excess among them. The feed for both livestock and crops are carefully maintained to ensure optimal growth without waste, letting them flourish without being weighed down.`,
 			"Hedonistic": `It features wider gates and stalls, for both the humans visiting or tending the occupants, and the animals starting to mimic their handlers${V.seeBestiality ? ` and company` : ``}, with plenty of seats along the way.`,
 			"Intellectual Dependency": `Large signs covered in cartoonish illustrations dot the pens, illustrating how to take care of the needs of the occupant within.${V.seeBestiality ? ` There is a strong emphasis on proper breeding positions for your slaves, with step by step instructions.` : ``}`,
-			"Slave Professionalism": `Despite the surroundings, those of your slaves that are allowed to wear clothes are dressed in clean outfits.${V.seeBestiality ? ` Those bearing litters walk with practiced care, protecting their young.` :  ``} They go about their tasks methodically and with care, with ${S.Farmer ? S.Farmer.slaveName : `senior farmhands`} watching carefully to correct any lax behaviour.`,
-			"Petite Admiration": `The buildings are squat, one story affairs that allow those of smaller stature easier access.  ${V.seeBestiality ? ` Those closer to physical perfection bear the cum stains of their recent breedings.` :  ``}`,
-			"Statuesque Glorification": `Those workers who are smaller and less fit have been given the worst jobs, mucking out the pens and stables. ${V.seeBestiality ? ` Those closer to physical perfection bear the cum stains of their recent breedings.` :  ``}`,
+			"Slave Professionalism": `Despite the surroundings, those of your slaves that are allowed to wear clothes are dressed in clean outfits.${V.seeBestiality ? ` Those bearing litters walk with practiced care, protecting their young.` : ``} They go about their tasks methodically and with care, with ${S.Farmer ? S.Farmer.slaveName : `senior farmhands`} watching carefully to correct any lax behaviour.`,
+			"Petite Admiration": `The buildings are squat, one story affairs that allow those of smaller stature easier access. ${V.seeBestiality ? ` Those closer to physical perfection bear the cum stains of their recent breedings.` : ``}`,
+			"Statuesque Glorification": `Those workers who are smaller and less fit have been given the worst jobs, mucking out the pens and stables. ${V.seeBestiality ? ` Those closer to physical perfection bear the cum stains of their recent breedings.` : ``}`,
 			"standard": `It is very much a converted warehouse still, sectioned off in various 'departments'${V.farmyardUpgrades.machinery ? ` with machinery placed where it can be` : V.farmyardUpgrades.hydroponics ? ` and plumbing for the hydroponics system running every which way` : ``}.`,
 			"": ``,
 		};
diff --git a/src/facilities/nursery/nurseryDatatypeCleanup.js b/src/facilities/nursery/nurseryDatatypeCleanup.js
index c4def25f184f9248d49c22b3f570474f86a7d1dc..f92a3b63a0171d67f00d6fb469c1f9803df1a498 100644
--- a/src/facilities/nursery/nurseryDatatypeCleanup.js
+++ b/src/facilities/nursery/nurseryDatatypeCleanup.js
@@ -227,9 +227,9 @@ App.Facilities.Nursery.ChildDatatypeCleanup = function(child) {
 		]);
 		for (const piercing of Object.keys(App.Data.Piercings)) {
 			child.piercing[piercing] = child.piercing[piercing] || new App.Entity.piercingState();
-			const oldPiercing = `${oldPiercings.get(piercing) || piercing}Piercing`; // the old variable names were sometimes plural and sometimes singular.  The new standard is to use singular when possible.
+			const oldPiercing = `${oldPiercings.get(piercing) || piercing}Piercing`; // the old variable names were sometimes plural and sometimes singular. The new standard is to use singular when possible.
 			if (child.hasOwnProperty(oldPiercing)) {
-				if (child[oldPiercing] === 3) { // 3 used to indicate a smart piercing.  We now track this on a separate property as a bool.
+				if (child[oldPiercing] === 3) { // 3 used to indicate a smart piercing. We now track this on a separate property as a bool.
 					child.piercing[piercing].weight = 2;
 					child.piercing[piercing].smart = true;
 				} else if (child[oldPiercing]) {
diff --git a/src/facilities/surgery/multiImplant.js b/src/facilities/surgery/multiImplant.js
index 867cbd6d2df341f852704fdd6458b9a7b3b4ac2a..380f85ff23f86007e9ccd7cfee682e320e5e2cd4 100644
--- a/src/facilities/surgery/multiImplant.js
+++ b/src/facilities/surgery/multiImplant.js
@@ -57,7 +57,7 @@ App.UI.multipleOrganImplant = function() {
 							V.surgeryType = "cochlear implant";
 							node.append(App.UI.SlaveInteract.surgeryDegradation(slave));
 						} else {
-							App.UI.DOM.appendNewElement("span", div, `Since ${he} has working ears the  ${App.Data.prosthetics.cochlear.name} will be put into storage.`, "note");
+							App.UI.DOM.appendNewElement("span", div, `Since ${he} has working ears the ${App.Data.prosthetics.cochlear.name} will be put into storage.`, "note");
 						}
 						break;
 					case "electrolarynx":
diff --git a/src/gui/options/options.js b/src/gui/options/options.js
index ae0691a369fabb6755628c0b06d114b14998f777..b0b5e1bb120b98f97defa2aad591f455ffa416f4 100644
--- a/src/gui/options/options.js
+++ b/src/gui/options/options.js
@@ -1112,7 +1112,7 @@ App.UI.artOptions = function() {
 				["Shokushu's rendered image pack", 0],
 			]);
 		if (V.imageChoice === 1) {
-			options.addComment("The only 2D art in somewhat recent development.  Contains many outfits.");
+			options.addComment("The only 2D art in somewhat recent development. Contains many outfits.");
 			options.addOption("Face artwork is", "seeFaces")
 				.addValue("Enabled", 1).on().addValue("Disabled", 0).off();
 
@@ -1136,7 +1136,7 @@ App.UI.artOptions = function() {
 			options.addOption("Clothing erection bulges are", "showClothingErection")
 				.addValue("Enabled", true).on().addValue("Disabled", false).off();
 		} else if (V.imageChoice === 4) {
-			options.addComment(`This art is currently (9/6/21) the most actively developed.  Real time 3D models. <a href='https://mega.nz/folder/HgZ0WTxB#o3mwURAAQfN5WZzutQvbXA' target='_blank'> Download the WebGL art assets</a> and place the 'webgl' folder into the resources/ folder where this HTML file is.
+			options.addComment(`This art is currently (9/6/21) the most actively developed. Real time 3D models. <a href='https://mega.nz/folder/HgZ0WTxB#o3mwURAAQfN5WZzutQvbXA' target='_blank'> Download the WebGL art assets</a> and place the 'webgl' folder into the resources/ folder where this HTML file is.
 			Then <b>refresh</b> the page.
 			Create the resources folder if it does not exist. <span class="warning">(Android/MacOS not supported)</span>`);
 
diff --git a/src/gui/sideBar.js b/src/gui/sideBar.js
index 07eb32e2ec9ec5eae003ef6054606d06b0d4ad57..d9c086210a02d3fccc704407847fd3446fab3ab9 100644
--- a/src/gui/sideBar.js
+++ b/src/gui/sideBar.js
@@ -1,6 +1,7 @@
-/** Notify the game that the sidebar needs to be refreshed as soon as possible, but do not do it immediately.
- *  This allows us to call this function repeatedly without impacting performance (for example, from repX() and cashX()).
- *  The game will redraw the sidebar exactly once, as soon as all the scripts have finished executing.
+/**
+ * Notify the game that the sidebar needs to be refreshed as soon as possible, but do not do it immediately.
+ * This allows us to call this function repeatedly without impacting performance (for example, from repX() and cashX()).
+ * The game will redraw the sidebar exactly once, as soon as all the scripts have finished executing.
  */
 App.Utils.scheduleSidebarRefresh = (function() {
 	let refresh = false;
diff --git a/src/interaction/sellSlave.js b/src/interaction/sellSlave.js
index a4660f1c4d0c8ac0c4098b8ae5d7e84ac0f86fdf..f7d5e8eb4a5c0ac1cd31ed2d6ef7e342909575b0 100644
--- a/src/interaction/sellSlave.js
+++ b/src/interaction/sellSlave.js
@@ -1831,7 +1831,7 @@ App.Interact.sellSlave = function(slave) {
 				cost: 200 * Math.trunc((cost * 2) / 200),
 				offerDesc: `from an obsessive fan who absolutely must have ${him} for himself.`,
 				get requirements() { return (slave.porn.prestige === 1); },
-				percentOdds: 69, // Who did this?  Seriously, who did this...
+				percentOdds: 69, // Who did this? Seriously, who did this...
 				get completeSale() {
 					const r = [];
 					let slaveImpact;
diff --git a/src/interaction/siRules.js b/src/interaction/siRules.js
index 90dd8a73dd7b74b68bf318d04d1a096a0d0c6da1..6034405bf2dcc7d0a8609d2ff2cf7f15de64c494 100644
--- a/src/interaction/siRules.js
+++ b/src/interaction/siRules.js
@@ -183,7 +183,7 @@ App.UI.SlaveInteract.rules = function(slave, refresh) {
 		choices = [
 			{value: "confinement", tooltip: App.UI.DOM.combineNodes(`Increases `, App.UI.DOM.makeElement("span", `fear`, ["trust", "dec"]), ` when the slave is punished.`)},
 			{value: "whipping", tooltip: App.UI.DOM.combineNodes(`Significantly increases `, App.UI.DOM.makeElement("span", `fear`, ["trust", "dec"]), ` at the cost of `, App.UI.DOM.makeElement("span", `health`, ["health", "dec"]), ` when the slave is punished.`)},
-			{value: "chastity", tooltip: App.UI.DOM.combineNodes(`Increases both `, App.UI.DOM.makeElement("span", `fear`, ["trust", "dec"]), ` and `, App.UI.DOM.makeElement("span", `devotion`, ["devotion", "inc"]),  ` at the cost of `, App.UI.DOM.makeElement("span", `libido`, ["libido", "dec"]), ` when the slave is punished.`)},
+			{value: "chastity", tooltip: App.UI.DOM.combineNodes(`Increases both `, App.UI.DOM.makeElement("span", `fear`, ["trust", "dec"]), ` and `, App.UI.DOM.makeElement("span", `devotion`, ["devotion", "inc"]), ` at the cost of `, App.UI.DOM.makeElement("span", `libido`, ["libido", "dec"]), ` when the slave is punished.`)},
 			{value: "situational", tooltip: App.UI.DOM.combineNodes(`Increases `, App.UI.DOM.makeElement("span", `fear`, ["trust", "dec"]), ` when the slave is punished.`)},
 		];
 		div.append(listChoices(choices, "punishment"));
diff --git a/src/interaction/siWork.js b/src/interaction/siWork.js
index ebe6d096fde62e8269f57f18da8bb8087dc91923..385f01610c10309f1358bd50b35fa9dfc93db90e 100644
--- a/src/interaction/siWork.js
+++ b/src/interaction/siWork.js
@@ -385,7 +385,7 @@ App.UI.SlaveInteract.work = function(slave, refresh) {
 			if (slave.vagina > -1) {
 				if (canDoVaginal(slave)) {
 					sexOptions.push({text: `Grope ${his} pussy`, scene: () => App.Interact.fondleVagina(slave)});
-					sexOptions.push({text: `Eat ${him} out`, scene:  () => App.Interact.fLickPussy(slave)});
+					sexOptions.push({text: `Eat ${him} out`, scene: () => App.Interact.fLickPussy(slave)});
 				}
 			}
 
@@ -687,7 +687,7 @@ App.UI.SlaveInteract.work = function(slave, refresh) {
 			if (slave.fetish !== "mindbroken" && slave.accent < 4 && ((canTalk(slave)) || hasAnyArms(slave))) {
 				sexOptions.push({text: `Ask ${him} about ${his} feelings`, scene: () => App.Interact.feelings(slave)});
 				if (V.PC.dick > 0) {
-					sexOptions.push({text: `Make ${him} beg`, scene: () =>  App.Interact.fBeg(slave)});
+					sexOptions.push({text: `Make ${him} beg`, scene: () => App.Interact.fBeg(slave)});
 				}
 			}
 			if (slave.devotion >= 100 && slave.relationship < 0 && slave.relationship > -3) {
@@ -721,7 +721,7 @@ App.UI.SlaveInteract.work = function(slave, refresh) {
 		let activeSlaveRepSacrifice = repGainSacrifice(slave, V.arcologies[0]);
 		if (activeSlaveRepSacrifice > 0) {
 			/*
-			TODO: fix this interaction.  Consider that it "takes a week" but is not tied to endweek.  Consider how easy it is to cheese for rep gains.
+			TODO: fix this interaction. Consider that it "takes a week" but is not tied to endweek. Consider how easy it is to cheese for rep gains.
 			sexOptions.push({
 				text: `Require ${him} to offer penance to Xochiquetzal`,
 				goto: `Aztec Slave Sacrifice Penance`,
diff --git a/src/js/DefaultRules.js b/src/js/DefaultRules.js
index 79ab592fa8e004ecf7db27d50c48f47c87677289..bcf2e42558140a61ad5a88373fbf2231497c29fa 100644
--- a/src/js/DefaultRules.js
+++ b/src/js/DefaultRules.js
@@ -1187,7 +1187,7 @@ globalThis.DefaultRules = (function() {
 				rule.growth.lips,
 				rule.growth.dick,
 				rule.growth.balls
-			].every(r => r === null)  // Check if all objects in list equal null
+			].every(r => r === null) // Check if all objects in list equal null
 		) {
 			ProcessOtherDrugs(slave, rule);
 			return;
diff --git a/src/js/SlaveState.js b/src/js/SlaveState.js
index 81716f12d29c70a82eca38e48ae8cce160504621..1c08c3d68b4baf56db7924a76d04ac1dd2d7715d 100644
--- a/src/js/SlaveState.js
+++ b/src/js/SlaveState.js
@@ -414,7 +414,7 @@ App.Entity.piercingState = class {
 		/** @type {FC.PiercingType} */
 		this.weight = 0;
 		/**
-		 * String describing piercing.  Leave empty to use default description.
+		 * String describing piercing. Leave empty to use default description.
 		 * @type {string}
 		 */
 		this.desc = "";
@@ -435,7 +435,7 @@ App.Entity.piercingStateRA = class {
 		/** @type {FC.PiercingType} */
 		this.weight = null;
 		/**
-		 * String describing piercing.  Leave empty to use default description.
+		 * String describing piercing. Leave empty to use default description.
 		 * @type {string}
 		 */
 		this.desc = null;
@@ -663,13 +663,13 @@ App.Entity.SlaveState = class SlaveState {
 		this.health = {
 			/**
 			 * slave 's health
-			 * * -90 - : On the edge of death
-			 * * -90 - -51: Extremely unhealthy
-			 * * -50 - -21: Unhealthy
-			 * * -20 -  20: Healthy
-			 * * 21  -  50: Very healthy
-			 * * 50  -  90: Extremely healthy
-			 * * 90  -  : Unnaturally healthy
+			 * * -90 -	: On the edge of death
+			 * * -90 -	-51: Extremely unhealthy
+			 * * -50 -	-21: Unhealthy
+			 * * -20 -	20: Healthy
+			 * * 21	-	50: Very healthy
+			 * * 50	-	90: Extremely healthy
+			 * * 90	-	: Unnaturally healthy
 			 */
 			condition: 0,
 			/** slave 's short term health damage */
diff --git a/src/js/assignJS.js b/src/js/assignJS.js
index e60b756d211140500a7f2f70efd946de7e9252a0..974a7d48a820fca37dd622d4bbea9fe89ded6c95 100644
--- a/src/js/assignJS.js
+++ b/src/js/assignJS.js
@@ -443,7 +443,7 @@ globalThis.assignJobSafely = function(slave, assignmentStr) {
 		slave.choosesOwnAssignment = 1;
 	} else if ([Job.AGENT, Job.AGENTPARTNER].includes(V.assignmentRecords[slave.ID])) { // it is NEVER safe to auto-reassign agents (we don't know which arcology they came from)
 		assignJob(slave, Job.REST);
-	} else if (!App.Utils.jobForAssignment(assignmentStr).canEmploy(slave).length) {  // If nothing complains about job requirements not being met
+	} else if (!App.Utils.jobForAssignment(assignmentStr).canEmploy(slave).length) { // If nothing complains about job requirements not being met
 		assignJob(slave, assignmentStr);
 	} else {
 		assignJob(slave, Job.REST);
diff --git a/src/js/birth/birth.js b/src/js/birth/birth.js
index 7127d4eb496e0f8357024afc76b956a3f5d437d0..603fb38c97acd579088442be4a3f05d0160e1e8d 100644
--- a/src/js/birth/birth.js
+++ b/src/js/birth/birth.js
@@ -3,7 +3,7 @@ App.Events.SEBirth = class SEBirth extends App.Events.BaseEvent {
 		super(actors, params);
 	}
 
-	/** Custom casting: all slaves in labor are cast automatically.  if no slaves are cast, casting fails and the event does not run. */
+	/** Custom casting: all slaves in labor are cast automatically. If no slaves are cast, casting fails and the event does not run. */
 	castActors() {
 		this.actors = V.slaves.filter(s => isInLabor(s)).map(s => s.ID);
 		return this.actors.length > 0;
diff --git a/src/js/extendedFamilyModeJS.js b/src/js/extendedFamilyModeJS.js
index 02e01e5d57c133df727e290ad3fbea9577d5b20b..6efec868244761fa9dd48daef110ac0b2c06df93 100644
--- a/src/js/extendedFamilyModeJS.js
+++ b/src/js/extendedFamilyModeJS.js
@@ -104,9 +104,9 @@ globalThis.sameParent = function(slave1, slave2) {
  */
 globalThis.specificCharacterID = function(ID) {
 	return (ID > 0 ||		// active slave
-		ID < -20 ||	    // missing slave
-		ID === -1 ||	// player
-		ID === -3);	// player's old master
+		ID < -20 ||			// missing slave
+		ID === -1 ||		// player
+		ID === -3);			// player's old master
 };
 
 /** Returns true if the father of slave is a specific, unique character (current or former slave, or the PC)
diff --git a/src/js/ibcJS.js b/src/js/ibcJS.js
index 8375a8346de0d2b9720b206b67099f5c8305140c..41ffff33f8a284a32c85ade6b73339c110dfb090 100644
--- a/src/js/ibcJS.js
+++ b/src/js/ibcJS.js
@@ -9,7 +9,7 @@
  * @property {number} [inbreedingCoeff]
  */
 
-//  TODO: replace snake_case with camelCase
+// TODO: replace snake_case with camelCase
 
 /* eslint-disable camelcase */
 /* eslint-disable eqeqeq */
@@ -22,7 +22,7 @@ globalThis.ibc = (() => {
 	let find_gp = (id) => (slaveStateById(id) || V.genePool.find((s) => s.ID === id) || ((id in V.missingTable) ? V.missingTable[id] : null) || null);
 
 	/** The player's old master is a known parent, but we don't normally have a slavelike object
-	 *  for him. We use this one instead, wherever necessary.
+	 * for him. We use this one instead, wherever necessary.
 	 * @type {IBCRelative} */
 	const oldMaster = {
 		ID: -3,
@@ -226,18 +226,18 @@ globalThis.ibc = (() => {
 	// NodeCodes are constructed recursively in this fashion:
 	//
 	// - Assign each of the founders (nodes with both parents === null) an unique ID, starting from
-	//   0 and incrementing each time (the order doesn't matter); a founder's set of NodeCodes has
-	//   exactly one NodeCode, which is [ID] (an array containing only their ID)
+	//	0 and incrementing each time (the order doesn't matter); a founder's set of NodeCodes has
+	//	exactly one NodeCode, which is [ID] (an array containing only their ID)
 	//
 	// - For each other node, let M be its child number w.r.t. its mother and N its child number
-	//   w.r.t. its father, i.e. the number of children that the respective parent has had before
-	//   this one (the order is not important to the algorithm, it's arbitrary here for
-	//   convenience). Its set of NodeCodes is the set of all its mother's NodeCodes with M appended
-	//   and all of its father's NodeCodes with N appended. For example, if its mother has the
-	//   NodeCodes [[2]] and M = 3 and its father has the NodeCodes [[0,1], [3,1]] and N = 1 then
-	//   the set of NodeCodes for this node would be
+	//	w.r.t. its father, i.e. the number of children that the respective parent has had before
+	//	this one (the order is not important to the algorithm, it's arbitrary here for
+	//	convenience). Its set of NodeCodes is the set of all its mother's NodeCodes with M appended
+	//	and all of its father's NodeCodes with N appended. For example, if its mother has the
+	//	NodeCodes [[2]] and M = 3 and its father has the NodeCodes [[0,1], [3,1]] and N = 1 then
+	//	the set of NodeCodes for this node would be
 	//
-	//       [[2, 3], [0, 1, 1], [3, 1, 1]]
+	//		[[2, 3], [0, 1, 1], [3, 1, 1]]
 	//
 	// We do this iteratively here, looping over the set of all nodes until each has been assigned
 	// a NodeCode. This requires looping through a number of times equal to the number of
@@ -363,7 +363,7 @@ globalThis.ibc = (() => {
 	};
 
 	/** Determine the coefficients of inbreeding of an array of slaves. Returns a mapping of their
-	 *  ID to their coefficient of inbreeding
+	 * ID to their coefficient of inbreeding
 	 * @param {IBCRelative[]} slaves
 	 * @param {boolean} [ignore_coeffs=false]
 	 * @returns {Object.<number, number>}
@@ -446,9 +446,9 @@ globalThis.ibc = (() => {
 	};
 
 	/** Recalculate the inbreeding coefficient for all slaves dependent on the passed IDs (e.g. the
-	 *  slaves themselves and all of their children). This will replace the inbreeding coefficients
-	 *  wherever they exist with the computed values, ignoring all cached values.
-	 *  This should be called if parents are changed.
+	 * slaves themselves and all of their children). This will replace the inbreeding coefficients
+	 * wherever they exist with the computed values, ignoring all cached values.
+	 * This should be called if parents are changed.
 	 * @param {number[]} ids
 	 */
 	let recalculate_coeff_ids = (ids) => {
diff --git a/src/js/pregJS.js b/src/js/pregJS.js
index 6c4186076788f39671caf09ead1fae7e3f732a87..e0facf9fe6d6f3ca93ade68995391bf32a3d6b0b 100644
--- a/src/js/pregJS.js
+++ b/src/js/pregJS.js
@@ -411,7 +411,7 @@ globalThis.setPregType = function(actor) {
 		*/
 		if (ovum < 1) { ovum = 1; }
 
-		// console.log("Name: ", actor.slaveName, "  ftVol:", ftVol, "  cmVol:", cmVol, "  maxVol:", maxVol, "  freeVol:", freeVol, "  coeff:", coeff, "  fertilityStack: ", fertilityStack, "  ovum: ", ovum);
+		// console.log("Name: ", actor.slaveName, " ftVol:", ftVol, " cmVol:", cmVol, " maxVol:", maxVol, " freeVol:", freeVol, " coeff:", coeff, " fertilityStack: ", fertilityStack, " ovum: ", ovum);
 	}
 
 	return Math.ceil(ovum);
diff --git a/src/js/rulesAssistantOptions.js b/src/js/rulesAssistantOptions.js
index 537d4805b20228b84ee519d4d2e01b9572d56ad0..30c2d7b15d936e3346f008fb86add32c65734c0c 100644
--- a/src/js/rulesAssistantOptions.js
+++ b/src/js/rulesAssistantOptions.js
@@ -905,7 +905,7 @@ App.RA.options = (function() {
 		}
 	}
 
-	//  Basically just a copy of NumericTargetEditor modified to handle strings as well
+	// Basically just a copy of NumericTargetEditor modified to handle strings as well
 	class ExpressiveNumericTargetEditor extends EditorWithShortcuts {
 		/**
 		 * @param {string} prefix
@@ -973,8 +973,8 @@ App.RA.options = (function() {
 		}
 
 		getTextData() {
-			const n = this.numEditor.value !== "" ? Number(this.numEditor.value) : Number.NaN;  // Attempt to convert numEditor.value to number,
-			const v = isNaN(n) ? this.numEditor.value : Math.floor(n);                         // return numEditor.value as number if !NaN (should result in realValue being of number)
+			const n = this.numEditor.value !== "" ? Number(this.numEditor.value) : Number.NaN;	// Attempt to convert numEditor.value to number,
+			const v = isNaN(n) ? this.numEditor.value : Math.floor(n);							// return numEditor.value as number if !NaN (should result in realValue being of number)
 			return v === null || v === "" ? null : {cond: this.opSelector.value, val: v};
 		}
 
@@ -1181,7 +1181,7 @@ App.RA.options = (function() {
 			// App.UI.DOM.appendNewElement("h1", div, `Rules Assistant`);
 			App.UI.DOM.appendNewElement("div", greeting, `${properTitle()}, I will review your slaves and make changes that will have a beneficial effect. Apologies, ${properTitle()}, but this function is... not fully complete. It may have some serious limitations. Please use the '${noDefaultSetting.text}' option to identify areas I should not address.`);
 			App.UI.DOM.appendNewElement("div", greeting, `For things like breast, butt, lip, dick, and ball injections, you need to only set the growth targets in Physical Regimen and I'll try to figure out how to best achieve them. You probably won't need a separate rule for each of them, or have to worry about ending the injections.`);
-			App.UI.DOM.appendNewElement("div", greeting, `Please note that surgeries will only be applied to slaves that are in the penthouse, and will not be applied until the end of the week.  Surgery outcomes are included in a slave's individual report, instead of with the other effects of the RA.`);
+			App.UI.DOM.appendNewElement("div", greeting, `Please note that surgeries will only be applied to slaves that are in the penthouse, and will not be applied until the end of the week. Surgery outcomes are included in a slave's individual report, instead of with the other effects of the RA.`);
 			const summary = App.UI.DOM.appendNewElement("div", greeting, `You can always see an overview of all of your rules in the `);
 			summary.append(App.UI.DOM.passageLink("summary view", "Rules Assistant Summary"));
 			summary.append(`.`);
diff --git a/src/js/slaveCostJS.js b/src/js/slaveCostJS.js
index 87ec1f54bd1dbd7881e5347a3513fe84496ec913..295e3ca948c58c9429708bf0b4032ea6dbb1f614 100644
--- a/src/js/slaveCostJS.js
+++ b/src/js/slaveCostJS.js
@@ -2286,7 +2286,7 @@ globalThis.slaveCost = function(slave, isStartingSlave = false, followLaws = fal
 			milkSpan.tabIndex = 0;
 			milkSpan.classList.add("has-tooltip");
 			tippy(milkSpan, {
-				content: `Value as a cow is greater than their value as a sex object.  Value is based on a year's fluids with current body.`,
+				content: `Value as a cow is greater than their value as a sex object. Value is based on a year's fluids with current body.`,
 				placement: "right", interactive: true, trigger: "click"
 			});
 		}
diff --git a/src/js/utilsAssessSlave.js b/src/js/utilsAssessSlave.js
index 4e2c6dc5dc382742b8e808893801c51ffb8b8c2c..0790308dafe937bb924148f54d8c152a8e3485a0 100644
--- a/src/js/utilsAssessSlave.js
+++ b/src/js/utilsAssessSlave.js
@@ -1,6 +1,6 @@
 /*
 *
-* This file focuses on slave related functions that assess qualities about slaves.  Are they/can they X?
+* This file focuses on slave related functions that assess qualities about slaves. Are they/can they X?
 *
 */
 
@@ -246,10 +246,10 @@ globalThis.canMoveToRoom = function(slave) {
 
 /**
  * @param {App.Entity.SlaveState} slave
- * @returns {0|1|2|3} 0: No heel boost at all.  1: Pumps, slight boost.  2: High heels.  3: Painfully/extreme high heels
+ * @returns {0|1|2|3} 0: No heel boost at all. 1: Pumps, slight boost. 2: High heels. 3: Painfully/extreme high heels
  */
 globalThis.shoeHeelCategory = function(slave) {
-	const height = App.Data.shoes.get(slave.shoes) ? App.Data.shoes.get(slave.shoes).heelHeight : 0;  // Height is in cm
+	const height = App.Data.shoes.get(slave.shoes) ? App.Data.shoes.get(slave.shoes).heelHeight : 0; // Height is in cm
 	if (height > 20) {
 		return 3;
 	} else if (height > 5) {
diff --git a/src/js/wombJS.js b/src/js/wombJS.js
index 725026f6b842c03c797f635a2d07b00e3ef5e4c3..c2a86bec54093f7ecf80e882e4528f5815861999 100644
--- a/src/js/wombJS.js
+++ b/src/js/wombJS.js
@@ -47,7 +47,7 @@ globalThis.WombInit = function(actor) {
 	if (actor.pregData === undefined) {
 		actor.pregData = clone(App.Data.misc.pregData.human);
 		// Setup should be through deep copy, so in future, if we like, these values can be changed individually. Gameplay expansion possibilities. But for dev time to simplify debugging:
-		// actor.pregData = setup.pregData.human;  // any changes in setup pregData template will be applied immediately to all. But can't be made separate changes.
+		// actor.pregData = setup.pregData.human; // any changes in setup pregData template will be applied immediately to all. But can't be made separate changes.
 	}
 
 	if (typeof actor.eggType !== 'string') {
@@ -313,7 +313,7 @@ globalThis.WombGetVolume = function(actor) { // most legacy code from pregJS.tw
 		rate = rateMin + (rateOne * cAge);
 
 		cSize = (min + (one * cAge));
-		// console.log("min:"+min+"  max:"+max+"  ageMin:"+ageMin+"  ageMax:"+ageMax+"  one:"+one+"  rateOne:"+rateOne+"  cAge:"+cAge+"  rate:"+rate+"  cSize:"+cSize+"  final size:"+cSize*rate);
+		// console.log("min:"+min+" max:"+max+" ageMin:"+ageMin+" ageMax:"+ageMax+" one:"+one+" rateOne:"+rateOne+" cAge:"+cAge+" rate:"+rate+" cSize:"+cSize+" final size:"+cSize*rate);
 
 		data.size = cSize;
 		data.rate = rate;
@@ -362,7 +362,7 @@ globalThis.WombGetVolume = function(actor) { // most legacy code from pregJS.tw
 
 				// oldVol = ((4 / 3) * (Math.PI) * (phi / 2) * (Math.pow((oldLen / 2), 3))); // for debug
 
-				// console.log("fetus.age:" + ft.age + "  oldLen:"+oldLen+"  targetLen:"+targetLen+"  ft.volume:"+ft.volume+ "  old volume:"+oldVol );
+				// console.log("fetus.age:" + ft.age + " oldLen:"+oldLen+" targetLen:"+targetLen+" ft.volume:"+ft.volume+ " old volume:"+oldVol );
 				/*
 					I found, that previous targetLen calculation not exactly accurate if compared to the actual medical data chart for fetal length. It's been rough approximation based only on pregnancy week (giving smaller fetus size then it should in most cases). So I need all this debug code to compare data and verify calculations. After final tweaking I will remove or comment out legacy code. Please not touch this before it.
 					Pregmodfan.
@@ -466,7 +466,7 @@ globalThis.FetusGetPrediction = function(actor, age) {
 		rate = rateMin + (rateOne * cAge);
 
 		cSize = (min + (one * cAge));
-		// console.log("min:"+min+"  max:"+max+"  ageMin:"+ageMin+"  ageMax:"+ageMax+"  one:"+one+"  rateOne:"+rateOne+"  cAge:"+cAge+"  rate:"+rate+"  cSize:"+cSize+"  final size:"+cSize*rate);
+		// console.log("min:"+min+" max:"+max+" ageMin:"+ageMin+" ageMax:"+ageMax+" one:"+one+" rateOne:"+rateOne+" cAge:"+cAge+" rate:"+rate+" cSize:"+cSize+" final size:"+cSize*rate);
 
 		data.size = cSize;
 		data.rate = rate;
@@ -826,9 +826,9 @@ globalThis.FetusGlobalReserveCount = function(reserveType) {
 };
 
 globalThis.WombSetGenericReserve = function(actor, type, count) {
-	// console.log ("actor: " + actor + "  type: " + type + "  typeof: " + typeof type + "  count: " + count);
+	// console.log ("actor: " + actor + " type: " + type + " typeof: " + typeof type + " count: " + count);
 	actor.womb.forEach(function(ft) {
-		// console.log ("  type: " + ft.reserve + "  typeof: " + typeof ft.reserve);
+		// console.log (" type: " + ft.reserve + " typeof: " + typeof ft.reserve);
 		if ((ft.reserve === "" || ft.reserve === type) && count > 0) {
 			// console.log ("!trigger");
 			ft.reserve = type;
diff --git a/src/npc/children/longChildDescription.js b/src/npc/children/longChildDescription.js
index c36b61100ccd257c89d337fd3f61166f815f2882..259dab8acf65f4772b17d3f7e11773151e32e3b2 100644
--- a/src/npc/children/longChildDescription.js
+++ b/src/npc/children/longChildDescription.js
@@ -7954,7 +7954,7 @@ App.Facilities.Nursery.LongChildDescription = function(child, {market = 0, event
 
 	if (child.inflation > 0) {
 		V.activeSlave = child;
-		r += `${App.Desc.bellyInflation(child)}  `; // TODO:
+		r += `${App.Desc.bellyInflation(child)} `; // TODO:
 	} else if (child.bellyImplant >= 2000) {
 		V.activeSlave = child;
 		r += App.Desc.bellyImplant(child); // TODO:
diff --git a/src/npc/databases/ddSlavesDatabase.js b/src/npc/databases/ddSlavesDatabase.js
index 0e213158b6dd7e22d7f8838e659dc3d87446cf59..e28317509d219ba5d212a797da627a629e262321 100644
--- a/src/npc/databases/ddSlavesDatabase.js
+++ b/src/npc/databases/ddSlavesDatabase.js
@@ -783,7 +783,7 @@ App.Data.HeroSlaves.DD = [
 		fetish: "buttslut",
 		fetishKnown: 1,
 		behavioralFlaw: "odd",
-		piercing: {dick: {weight: 1}, ear: {weight: 1}, navel: {weight: 1}, areola: {weight: 2, desc:  "$He has a large police badge made of polished silver pinned right to the skin with several barbell piercings just above $his left nipple."}},
+		piercing: {dick: {weight: 1}, ear: {weight: 1}, navel: {weight: 1}, areola: {weight: 2, desc: "$He has a large police badge made of polished silver pinned right to the skin with several barbell piercings just above $his left nipple."}},
 		custom: {desc: "$He wears two pairs of handcuffs as bracelets (one pair on each wrist); the handcuff keyholes are welded, so they cannot be unlocked and removed in any normal way."},
 		career: "a security guard"
 	},
diff --git a/src/npc/databases/dfSlavesDatabase.js b/src/npc/databases/dfSlavesDatabase.js
index 0cc8d4f8cbc521021d8f2d944cac99866b88c2f6..6edcee1307963eed15322f25d8942bb45bb3eac4 100644
--- a/src/npc/databases/dfSlavesDatabase.js
+++ b/src/npc/databases/dfSlavesDatabase.js
@@ -359,7 +359,7 @@ App.Data.HeroSlaves.DFextreme = [
 		fetishKnown: 1,
 		lipsTat: "Cored plums are tattooed on $his face.",
 		buttTat: "Cored plums are tattooed on $his buttocks.",
-		piercing: {nipple: {weight: 1}, vagina: {weight: 2}, genitals: {weight: 2}, corset: {weight: 1, desc:  "$He has massive C-clamp piercings in $his back that allow $him to act as furniture"}},
+		piercing: {nipple: {weight: 1}, vagina: {weight: 2}, genitals: {weight: 2}, corset: {weight: 1, desc: "$He has massive C-clamp piercings in $his back that allow $him to act as furniture"}},
 		sexualFlaw: "self hating",
 		clothes: "no clothing",
 		vaginalAccessory: "long, huge dildo"
diff --git a/src/npc/descriptions/belly/belly.js b/src/npc/descriptions/belly/belly.js
index 4042a7717cad4ba629aeb0804629e0686ef02bfb..6ef7655304bef01685488cd76a465f97b5dd1158 100644
--- a/src/npc/descriptions/belly/belly.js
+++ b/src/npc/descriptions/belly/belly.js
@@ -892,7 +892,7 @@ App.Desc.belly = function(slave, descType = DescType.NORMAL) {
 		} else if (slave.belly >= 300000) {
 			if (isBellyFluidLargest) {
 				// TODO: write me
-			}  else if (slave.bellyPreg > 0) {
+			} else if (slave.bellyPreg > 0) {
 				r.push(`${He} is massively pregnant, dwarfing any normal pregnancy,`);
 				if (slave.physicalAge <= 3) {
 					r.push(`and ${he} is nearly spherical. ${His} toddlerish form is utterly dwarfed by ${his} pregnancy, all ${he} can do is lean against it.`);
@@ -1364,7 +1364,7 @@ App.Desc.belly = function(slave, descType = DescType.NORMAL) {
 		} else if (slave.belly >= 105000) {
 			if (isBellyFluidLargest) {
 				// TODO: write me
-			}  else if (slave.bellyPreg > 0) {
+			} else if (slave.bellyPreg > 0) {
 				r.push(`${He} is enormously pregnant,`);
 				if (slave.physicalAge <= 3) {
 					r.push(`and ${his} toddlerish body is absolutely filled by ${his} womb making ${him} resemble an over inflated blow-up doll.`);
@@ -1628,7 +1628,7 @@ App.Desc.belly = function(slave, descType = DescType.NORMAL) {
 		} else if (slave.belly >= 75000) {
 			if (isBellyFluidLargest) {
 				// TODO: write me
-			}  else if (slave.bellyPreg > 0) {
+			} else if (slave.bellyPreg > 0) {
 				r.push(`${He} is enormously pregnant,`);
 				if (slave.physicalAge <= 3) {
 					r.push(`and ${his} toddlerish body is absolutely filled by ${his} womb making ${him} resemble an over inflated blow-up doll.`);
@@ -1761,7 +1761,7 @@ App.Desc.belly = function(slave, descType = DescType.NORMAL) {
 		} else if (slave.belly >= 60000) {
 			if (isBellyFluidLargest) {
 				// TODO: write me
-			}  else if (slave.bellyPreg > 0) {
+			} else if (slave.bellyPreg > 0) {
 				r.push(`${He} is enormously pregnant,`);
 				if (slave.physicalAge <= 3) {
 					r.push(`and ${his} toddlerish body is absolutely filled by ${his} womb making ${him} resemble an over inflated blow-up doll.`);
@@ -1894,7 +1894,7 @@ App.Desc.belly = function(slave, descType = DescType.NORMAL) {
 		} else if (slave.belly >= 45000) {
 			if (isBellyFluidLargest) {
 				// TODO: write me
-			}  else if (slave.bellyPreg > 0) {
+			} else if (slave.bellyPreg > 0) {
 				r.push(`${He} is enormously pregnant,`);
 				if (slave.physicalAge <= 3) {
 					r.push(`and ${his} toddlerish body is absolutely filled by ${his} womb making ${him} resemble an over inflated blow-up doll.`);
@@ -1993,7 +1993,7 @@ App.Desc.belly = function(slave, descType = DescType.NORMAL) {
 		} else if (slave.belly >= 30000) {
 			if (isBellyFluidLargest) {
 				// TODO: write me
-			}  else if (slave.bellyPreg > 0) {
+			} else if (slave.bellyPreg > 0) {
 				r.push(`${He} is enormously pregnant,`);
 				if (slave.physicalAge <= 3) {
 					r.push(`and ${his} toddlerish body is absolutely filled by ${his} womb making ${him} resemble an over inflated blow-up doll.`);
@@ -2090,7 +2090,7 @@ App.Desc.belly = function(slave, descType = DescType.NORMAL) {
 		} else if (slave.belly >= 15000) {
 			if (isBellyFluidLargest) {
 				// TODO: write me
-			}  else if (slave.bellyPreg > 0) {
+			} else if (slave.bellyPreg > 0) {
 				r.push(`${He} is enormously pregnant,`);
 				if (slave.physicalAge <= 3) {
 					r.push(`and ${his} toddlerish body is absolutely filled by ${his} womb making ${him} resemble an over inflated blow-up doll.`);
diff --git a/src/npc/descriptions/butt/butt.js b/src/npc/descriptions/butt/butt.js
index b1b16d079e3f4cb3444ea47f849edc1b9f7ee013..5590783afb0825063575f8de5979305b650f83c9 100644
--- a/src/npc/descriptions/butt/butt.js
+++ b/src/npc/descriptions/butt/butt.js
@@ -1314,7 +1314,7 @@ App.Desc.butt = function(slave, descType = DescType.NORMAL) {
 	} else if (slave.tailShape === "deer") {
 		r.push(`${He} has a short and soft ${slave.tailColor} deer tail that tends to wiggle when ${he} gets exited.`);
 	} else if (slave.tailShape === "succubus") {
-		r.push(`${He} has a long, slim  succubus tail; ${his} tail ends in a soft ${slave.tailColor} heart shape.`);
+		r.push(`${He} has a long, slim succubus tail; ${his} tail ends in a soft ${slave.tailColor} heart shape.`);
 	} else if (slave.tailShape === "dragon") {
 		r.push(`${He} has a long and thick draconic tail; ${his} tail is covered in ${slave.tailColor} scales.`);
 	} else if (slave.tail === "stinger") {
diff --git a/src/npc/descriptions/upperBack.js b/src/npc/descriptions/upperBack.js
index 4ffcffe14b755731b0f1268d5c79ac08f8962a4c..9301bdb8e875bc3ed37f2b8649d87f61e459ec47 100644
--- a/src/npc/descriptions/upperBack.js
+++ b/src/npc/descriptions/upperBack.js
@@ -5,7 +5,7 @@
 App.Desc.upperBack = function(slave) {
 	const r = [];
 	const {
-		him, he, He, his,  His
+		him, he, He, his, His
 	} = getPronouns(slave);
 
 
diff --git a/src/npc/generate/newSlaveIntro.js b/src/npc/generate/newSlaveIntro.js
index 659eb02459f9ba911167d27179daa8cce7ccda3e..f1fce83dff362c39d0c9ae8b5b3c0c49672274de 100644
--- a/src/npc/generate/newSlaveIntro.js
+++ b/src/npc/generate/newSlaveIntro.js
@@ -38,7 +38,7 @@ App.UI.newSlaveIntro = function(slave, slave2, {tankBorn = false, momInterest =
 
 	el.append(choices());
 
-	App.Utils.updateUserButton();  // Make sure the user button is up to date, since V.nextButton may have changed since it was created.
+	App.Utils.updateUserButton(); // Make sure the user button is up to date, since V.nextButton may have changed since it was created.
 
 	return el;
 
diff --git a/src/npc/infants/InfantState.js b/src/npc/infants/InfantState.js
index 01f76e0fd2f99f4ec17a72acd8ee97366c509f5b..1d74fcd36deeed36191af52fb613bd3c6de9f8a3 100644
--- a/src/npc/infants/InfantState.js
+++ b/src/npc/infants/InfantState.js
@@ -177,8 +177,9 @@ App.Facilities.Nursery.InfantState = class InfantState {
 			hyperFertility: 0,
 			/** pregnancy does not block ovulation, child can become pregnant even while pregnant */
 			superfetation: 0,
-			/** abnormal production of amniotic fluid
-			 *  only affects fetuses */
+			/**
+			 * abnormal production of amniotic fluid
+			 * only affects fetuses */
 			polyhydramnios: 0,
 			/** Pleasurable pregnancy and orgasmic birth. Wider hips, looser and wetter vagina. High pregadaptation and low birth damage. */
 			uterineHypersensitivity: 0,
diff --git a/src/npc/interaction/fDick.js b/src/npc/interaction/fDick.js
index fffb022fd15f6c329e9f6b48c0e54e6273298ded..a49eea4ef359242d4a39ff7fa186c7afc7a9a061 100644
--- a/src/npc/interaction/fDick.js
+++ b/src/npc/interaction/fDick.js
@@ -164,7 +164,7 @@ App.Interact.fDick = function(slave) {
 			}
 
 
-			r.push(`it seems  ${slave.slaveName} came too.`);
+			r.push(`it seems ${slave.slaveName} came too.`);
 			r.push(`Since ${he} is mindbroken, ${his} responses to you are purely physiological and your actions have no affect on ${him} mentally. You leave your toy for one of your other slaves to clean and maintain.`);
 		} else if (slave.devotion > 50) {
 			if (slave.trust < -20) {
diff --git a/src/npc/interaction/fEmbrace.js b/src/npc/interaction/fEmbrace.js
index dc2c4fd3fcc1c7ebbe77351ae489efb65786aa6a..f4e5edab785854c7e89f3b483bac82363b952116 100644
--- a/src/npc/interaction/fEmbrace.js
+++ b/src/npc/interaction/fEmbrace.js
@@ -19,7 +19,7 @@ App.Interact.fEmbrace = function(slave) {
 
 	addPartner(slave, -1);
 
-	r.push(`You tell  ${slave.slaveName} to`);
+	r.push(`You tell ${slave.slaveName} to`);
 	if (hasAnyLegs(slave)) {
 		r.push(`stand in front of you.`);
 	} else {
diff --git a/src/npc/interaction/fFeelings.js b/src/npc/interaction/fFeelings.js
index b0cd4581432646eb0718bdd83498efbfb09111a2..1991320622548c28ab2fd4705b418ab2faf7ba93 100644
--- a/src/npc/interaction/fFeelings.js
+++ b/src/npc/interaction/fFeelings.js
@@ -804,7 +804,7 @@ App.Interact.feelings = function(slave) {
 								break;
 							case "buttslut":
 								r.push(`I'm so horny, ${Master}.`);
-								if (plugWidth(slave) === 1 && slave.anus > 2)  {
+								if (plugWidth(slave) === 1 && slave.anus > 2) {
 									r.push(`I wear the buttplug you gave me, but it is so small... It reminds me of being fucked in the ass, but I can barely feel it. It drives me crazy.`);
 								} else if (
 									(plugWidth(slave) === 1 && slave.anus < 3) ||
diff --git a/src/npc/interaction/fRelation.js b/src/npc/interaction/fRelation.js
index 181c042eed4b50fb793c76ca1633e7a28541ef09..5b7649f352a278dbef9c6f73f1e66c0a3207ff9c 100644
--- a/src/npc/interaction/fRelation.js
+++ b/src/npc/interaction/fRelation.js
@@ -1,6 +1,6 @@
 /**
  * @param {App.Entity.SlaveState} slave - slave to fuck with partner.
- * @param {App.Entity.SlaveState} partner - partner to fuck slave with.  must be a close relative or relationship target of slave.
+ * @param {App.Entity.SlaveState} partner - partner to fuck slave with. Must be a close relative or relationship target of slave.
  * @returns {DocumentFragment|HTMLElement}
  */
 App.Interact.fRelation = function(slave, partner) {
diff --git a/src/npc/interaction/forceFeeding.js b/src/npc/interaction/forceFeeding.js
index cd1e4a798c102b05f7b664620ee3b4c31b18b77e..da30d589b1429276525d777bc7e441f4bf6a0bcb 100644
--- a/src/npc/interaction/forceFeeding.js
+++ b/src/npc/interaction/forceFeeding.js
@@ -196,7 +196,7 @@ App.Interact.forceFeeding = function(slave) {
 		r.push(`so you keep the cupfuls coming.`);
 	}
 
-	r.push(`You can feel ${his}  ${slave.skin} belly swelling with ${slave.inflationType} as it pushes out against your hand. Once ${he} has downed two liters, you give ${his} bloated belly a slap, eliciting`);
+	r.push(`You can feel ${his} ${slave.skin} belly swelling with ${slave.inflationType} as it pushes out against your hand. Once ${he} has downed two liters, you give ${his} bloated belly a slap, eliciting`);
 	if (slave.fetish === "mindbroken") {
 		r.push(`a small burp from the broken slave`);
 	} else if (slave.devotion < -20) {
diff --git a/src/npc/surgery/fatGraft.js b/src/npc/surgery/fatGraft.js
index a4e141270b8ff2dba339b984ae8db87a5bf5a6b3..85ea1572173aa4942e655818990acac095d46351 100644
--- a/src/npc/surgery/fatGraft.js
+++ b/src/npc/surgery/fatGraft.js
@@ -19,7 +19,7 @@ App.UI.SlaveInteract.fatGraft = function(slave) {
 		const {his} = getPronouns(slave);
 		let p;
 		let linkArray = [];
-		const buttCost = (slave.butt > 10) ? 5 : 2;  // Buttsizes are apparently not linear, so it takes a lot more fat to increase the largest booties.
+		const buttCost = (slave.butt > 10) ? 5 : 2; // Buttsizes are apparently not linear, so it takes a lot more fat to increase the largest booties.
 		r.push(`All surplus body fat was harvested, and enough is graftable for an additional ${availableFat * 100}ccs per breast or an additional ${num(Math.trunc(availableFat / buttCost))} sizes to ${his} rear.`);
 		if (availableFat === 0) {
 			r.push(`All fat marked for use.`);
diff --git a/src/player/personalAttentionSelect.js b/src/player/personalAttentionSelect.js
index 65c67149a487572692c8818b66ae53e569eed7ea..2981f6d4fc16ad6c195eb4460a3f124727930982 100644
--- a/src/player/personalAttentionSelect.js
+++ b/src/player/personalAttentionSelect.js
@@ -854,7 +854,7 @@ App.UI.Player.personalAttention = function() {
 		 * @param {string} regimen
 		 * @param {Array<HTMLAnchorElement|HTMLSpanElement>} links
 		 * @param {number} index
-		 * @param  {Link[]} args
+		 * @param {Link[]} args
 		 */
 		function addLinks(slave, regimen, links, index, ...args) {
 			args.forEach(link => {