<commit_before>(function(){
	"use strict";

	class KC3BlueprintsDefinition extends KC3ShipListGrid {
		constructor() {
			super("blueprints");
		}

		/* INIT
		Prepares initial static data needed.
		---------------------------------*/
		init() {
			this.defaultSorterDefinitions();
			this.defineSorter("materials", "Consumptions",
				(ls, rs) => (rs.materials.length - rs.materialsUsed)
					- (ls.materials.length - ls.materialsUsed)
					|| rs.materials.length - ls.materials.length
					|| ls.id - rs.id);
			this.defineSimpleFilter("materials", [], 0, (fd, ship) => ship.materials.length);
			this.defineSimpleFilter("hideUnlock", [], 0, (fd, ship) => !fd.currentIndex || !!ship.locked);
			this.defineSimpleFilter("hideDupe", [], 0, (fd, ship) => {
				if(!fd.currentIndex) return true;
				const dupeShips = this.shipList.filter(s => (
					ship.id !== s.id && RemodelDb.originOf(ship.masterId) === RemodelDb.originOf(s.masterId)
				));
				if(!dupeShips.length) return true;
				const dupeRemodelLevels = dupeShips.map(s => RemodelDb.remodelGroup(s.masterId).indexOf(s.masterId));
				const thisRemodelLevel = RemodelDb.remodelGroup(ship.masterId).indexOf(ship.masterId);
				return thisRemodelLevel >= Math.max(dupeRemodelLevels);
			});
			this.showListRowCallback = this.showRemodelMaterials;
			this.heartLockMode = 2;
			this.viewType = "owned";
			this.hideUnlock = false;
			this.hideDupe = false;
		}

		/* RELOAD
		Loads latest player or game data if needed.
		---------------------------------*/
		reload() {
			PlayerManager.loadConsumables();
			KC3ShipManager.load();
		}

		/* EXECUTE
		Places data onto the interface from scratch.
		---------------------------------*/
		execute() {
			const joinPageParams = () => (<commit_msg>* fix Strategy room blueprint dupe filter<commit_after>(function(){
	"use strict";

	class KC3BlueprintsDefinition extends KC3ShipListGrid {
		constructor() {
			super("blueprints");
		}

		/* INIT
		Prepares initial static data needed.
		---------------------------------*/
		init() {
			this.defaultSorterDefinitions();
			this.defineSorter("materials", "Consumptions",
				(ls, rs) => (rs.materials.length - rs.materialsUsed)
					- (ls.materials.length - ls.materialsUsed)
					|| rs.materials.length - ls.materials.length
					|| ls.id - rs.id);
			this.defineSimpleFilter("materials", [], 0, (fd, ship) => ship.materials.length);
			this.defineSimpleFilter("hideUnlock", [], 0, (fd, ship) => !fd.currentIndex || !!ship.locked);
			this.defineSimpleFilter("hideDupe", [], 0, (fd, ship) => {
				if(!fd.currentIndex) return true;
				const dupeShips = this.shipList.filter(s => (
					ship.id !== s.id && RemodelDb.originOf(ship.masterId) === RemodelDb.originOf(s.masterId)
				));
				if(!dupeShips.length) return true;
				const dupeRemodelLevels = dupeShips.map(s => RemodelDb.remodelGroup(s.masterId).indexOf(s.masterId));
				const thisRemodelLevel = RemodelDb.remodelGroup(ship.masterId).indexOf(ship.masterId);
				return thisRemodelLevel >= Math.max(...dupeRemodelLevels);
			});
			this.showListRowCallback = this.showRemodelMaterials;
			this.heartLockMode = 2;
			this.viewType = "owned";
			this.hideUnlock = false;
			this.hideDupe = false;
		}

		/* RELOAD
		Loads latest player or game data if needed.
		---------------------------------*/
		reload() {
			PlayerManager.loadConsumables();
			KC3ShipManager.load();
		}

		/* EXECUTE
		Places data onto the interface from scratch.
		---------------------------------*/
		execute() {
			const joinPageParams = () => (
{'fraction_non_alphanumeric': 0.1984732824427481, 'fraction_numerical': 0.003958156629912355, 'mean_word_length': 2.913716814159292, 'pattern_counts': {'":': 0, '<': 3, '<?xml version=': 0, '>': 19, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '1684644', 'n_tokens_mistral': 1341, 'n_tokens_neox': 1102, 'n_words': 206}