patchwork-mapconverter
Version:
Executable wrapper for https://github.com/ChiefOfGxBxL/WC3MapTranslator
523 lines • 51.8 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.InfoTranslator = void 0;
/* eslint-disable @typescript-eslint/strict-boolean-expressions */
const HexBuffer_1 = require("../HexBuffer");
const W3Buffer_1 = require("../W3Buffer");
const Info_1 = require("../data/Info");
class InfoTranslator {
constructor() { }
static getInstance() {
if (this.instance == null) {
this.instance = new this();
}
return this.instance;
}
static jsonToWar(info) {
return this.getInstance().jsonToWar(info);
}
static warToJson(buffer) {
return this.getInstance().warToJson(buffer);
}
jsonToWar(infoJson) {
const outBufferToWar = new HexBuffer_1.HexBuffer();
outBufferToWar.addInt(33); // format version
outBufferToWar.addInt(infoJson.saves != null ? infoJson.saves : 0);
outBufferToWar.addInt(infoJson.editorVersion != null ? infoJson.editorVersion : 0);
outBufferToWar.addInt(infoJson.gameVersion.major);
outBufferToWar.addInt(infoJson.gameVersion.minor);
outBufferToWar.addInt(infoJson.gameVersion.patch);
outBufferToWar.addInt(infoJson.gameVersion.build);
// Map information
outBufferToWar.addString(infoJson.map.name);
outBufferToWar.addString(infoJson.map.author);
outBufferToWar.addString(infoJson.map.description);
outBufferToWar.addString(infoJson.map.recommendedPlayers);
// Camera bounds (8 floats total)
for (let cbIndex = 0; cbIndex < 8; cbIndex++) {
outBufferToWar.addFloat(infoJson.camera.bounds[cbIndex]);
}
// Camera complements (4 ints total)
for (let ccIndex = 0; ccIndex < 4; ccIndex++) {
outBufferToWar.addInt(infoJson.camera.complements[ccIndex]);
}
// Playable area
outBufferToWar.addInt(infoJson.map.playableArea.width);
outBufferToWar.addInt(infoJson.map.playableArea.height);
/*
* Flags
*/
let flags = 0;
if (infoJson.map.flags != null) { // can leave out the entire flags object, all flags will default to false
if (infoJson.map.flags.hideMinimapInPreview)
flags |= 0x0001; // hide minimap in preview screens
if (infoJson.map.flags.modifyAllyPriorities)
flags |= 0x0002; // modify ally priorities
if (infoJson.map.flags.isMeleeMap)
flags |= 0x0004; // melee map
if (infoJson.map.flags.nonDefaultTilesetMapSizeLargeNeverBeenReducedToMedium)
flags |= 0x0008; // playable map size was large and never reduced to medium (?)
if (infoJson.map.flags.maskedPartiallyVisible)
flags |= 0x0010; // masked area are partially visible
if (infoJson.map.flags.fixedPlayerSetting)
flags |= 0x0020; // fixed player setting for custom forces
if (infoJson.map.flags.useCustomForces)
flags |= 0x0040; // use custom forces
if (infoJson.map.flags.useCustomTechtree)
flags |= 0x0080; // use custom techtree
if (infoJson.map.flags.useCustomAbilities)
flags |= 0x0100; // use custom abilities
if (infoJson.map.flags.useCustomUpgrades)
flags |= 0x0200; // use custom upgrades
if (infoJson.map.flags.mapPropertiesMenuOpenedAtLeastOnce)
flags |= 0x0400; // map properties menu opened at least once since map creation (?)
if (infoJson.map.flags.waterWavesOnCliffShores)
flags |= 0x0800; // show water waves on cliff shores
if (infoJson.map.flags.waterWavesOnRollingShores)
flags |= 0x1000; // show water waves on rolling shores
if (infoJson.map.flags.useTerrainFog)
flags |= 0x2000;
if (infoJson.map.flags.tftRequired)
flags |= 0x4000;
if (infoJson.map.flags.useItemClassificationSystem)
flags |= 0x8000;
if (infoJson.map.flags.enableWaterTinting)
flags |= 0x10000;
if (infoJson.map.flags.useAccurateProbabilityForCalculations)
flags |= 0x20000;
if (infoJson.map.flags.useCustomAbilitySkins)
flags |= 0x40000;
if (infoJson.map.flags.disableDenyIcon)
flags |= 0x80000;
if (infoJson.map.flags.forceDefaultCameraZoom)
flags |= 0x100000;
if (infoJson.map.flags.forceMaxCameraZoom)
flags |= 0x200000;
if (infoJson.map.flags.forceMinCameraZoom)
flags |= 0x400000;
// 0x800000
// 8 -unknown bits?
}
outBufferToWar.addInt(flags); // Add flags
// Map main ground type
outBufferToWar.addChar(infoJson.map.mainTileType);
// Loading screen
outBufferToWar.addInt(infoJson.loadingScreen.background);
outBufferToWar.addString(infoJson.loadingScreen.path);
outBufferToWar.addString(infoJson.loadingScreen.text);
outBufferToWar.addString(infoJson.loadingScreen.title);
outBufferToWar.addString(infoJson.loadingScreen.subtitle);
// Use game data set
outBufferToWar.addInt(infoJson.gameDataSet);
// Prologue
outBufferToWar.addString(infoJson.prologue.path);
outBufferToWar.addString(infoJson.prologue.text);
outBufferToWar.addString(infoJson.prologue.title);
outBufferToWar.addString(infoJson.prologue.subtitle);
// Fog
outBufferToWar.addInt(infoJson.fog.type);
outBufferToWar.addFloat(infoJson.fog.startHeight);
outBufferToWar.addFloat(infoJson.fog.endHeight);
outBufferToWar.addFloat(infoJson.fog.density);
outBufferToWar.addByte(infoJson.fog.color[0]);
outBufferToWar.addByte(infoJson.fog.color[1]);
outBufferToWar.addByte(infoJson.fog.color[2]);
outBufferToWar.addByte(infoJson.fog.color[3]);
// Misc.
// // If globalWeather is not defined or is set to 'none', use 0 sentinel value, else add char[4] -- why this distinct crap? it just breaks the w3i for me.
// if (infoJson.globalWeather == null || infoJson.globalWeather.toLowerCase() === 'none') {
// outBufferToWar.addInt(0)
// } else {
outBufferToWar.addInt(infoJson.globalWeather);
// }
outBufferToWar.addString(infoJson.customSoundEnvironment != null ? infoJson.customSoundEnvironment : '');
outBufferToWar.addByte(infoJson.customLightEnv);
// Custom water tinting
outBufferToWar.addByte(infoJson.water[0]);
outBufferToWar.addByte(infoJson.water[1]);
outBufferToWar.addByte(infoJson.water[2]);
outBufferToWar.addByte(infoJson.water[3]);
outBufferToWar.addInt(infoJson.scriptLanguage);
outBufferToWar.addInt(infoJson.supportedModes);
outBufferToWar.addInt(infoJson.gameDataVersion);
outBufferToWar.addInt(infoJson.forcedDefaultCamDistance);
outBufferToWar.addInt(infoJson.forcedMaxCamDistance);
outBufferToWar.addInt(infoJson.forcedMinCamDistance);
// Players
outBufferToWar.addInt(infoJson.players?.length || 0);
infoJson.players?.forEach((player) => {
outBufferToWar.addInt(player.playerNum);
outBufferToWar.addInt(player.type);
outBufferToWar.addInt(player.race);
outBufferToWar.addInt(player.startingPos.fixed ? 1 : 0);
outBufferToWar.addString(player.name);
outBufferToWar.addFloat(player.startingPos.x);
outBufferToWar.addFloat(player.startingPos.y);
outBufferToWar.addInt(player.allyLowPriorities); // ally low prio flags
outBufferToWar.addInt(player.allyHighPriorities); // ally high prio flags
outBufferToWar.addInt(player.enemyLowPriorities); // enemy low prio flags
outBufferToWar.addInt(player.enermyHighPriorities); // enemy high prio flags
});
// Forces
outBufferToWar.addInt(infoJson.forces?.length || 0);
infoJson.forces?.forEach((force) => {
// Calculate flags
let forceFlags = 0;
if (force.flags.allied)
forceFlags |= 0x0001;
if (force.flags.alliedVictory)
forceFlags |= 0x0002;
// Skip 0x0004
if (force.flags.shareVision)
forceFlags |= 0x0008;
if (force.flags.shareUnitControl)
forceFlags |= 0x0010;
if (force.flags.shareAdvUnitControl)
forceFlags |= 0x0020;
outBufferToWar.addInt(forceFlags);
outBufferToWar.addInt(force.players);
outBufferToWar.addString(force.name);
});
// Struct: upgrade avail.
outBufferToWar.addInt(infoJson.upgrades?.length || 0);
infoJson.upgrades?.forEach(upgrade => {
outBufferToWar.addInt(upgrade.playerFlags);
outBufferToWar.addChars(upgrade.upgradeId);
outBufferToWar.addInt(upgrade.level);
outBufferToWar.addInt(upgrade.availability);
});
// Struct: tech avail.
outBufferToWar.addInt(infoJson.techBlacklist?.length || 0);
infoJson.techBlacklist?.forEach(tech => {
outBufferToWar.addInt(tech.playerFlags);
outBufferToWar.addChars(tech.techId);
});
// Struct: random unit table
outBufferToWar.addInt(infoJson.randomUnitTables?.length || 0);
infoJson.randomUnitTables?.forEach(randomUnitTable => {
outBufferToWar.addInt(randomUnitTable.id);
outBufferToWar.addString(randomUnitTable.name);
outBufferToWar.addInt(randomUnitTable.positions?.length || 0);
randomUnitTable.positions?.forEach(position => outBufferToWar.addInt(position));
outBufferToWar.addInt(randomUnitTable.chances?.length || 0);
randomUnitTable.chances?.forEach(chance => {
outBufferToWar.addInt(chance.chance);
chance.unitIds.forEach(unitId => outBufferToWar.addChars(unitId)); //Amount of units must match amount of positions
});
});
// Struct: random item table
outBufferToWar.addInt(infoJson.randomItemTables?.length || 0);
infoJson.randomItemTables?.forEach(randomItemTable => {
outBufferToWar.addInt(randomItemTable.id);
outBufferToWar.addString(randomItemTable.name);
outBufferToWar.addInt(randomItemTable.rows?.length || 0);
randomItemTable.rows?.forEach(randomItemPool => {
outBufferToWar.addInt(randomItemPool.objects?.length || 0);
randomItemPool.objects?.forEach(randomItem => {
outBufferToWar.addInt(randomItem.chance);
outBufferToWar.addChars(randomItem.objectId);
});
});
});
return {
errors: [],
buffer: outBufferToWar.getBuffer()
};
}
warToJson(buffer) {
const result = {
map: {
name: '',
author: '',
description: '',
recommendedPlayers: '',
playableArea: {
width: 64,
height: 64
},
mainTileType: '',
flags: {
hideMinimapInPreview: false,
modifyAllyPriorities: true,
isMeleeMap: false,
nonDefaultTilesetMapSizeLargeNeverBeenReducedToMedium: false,
maskedPartiallyVisible: false,
fixedPlayerSetting: false,
useCustomForces: false,
useCustomTechtree: false,
useCustomAbilities: false,
useCustomUpgrades: false,
mapPropertiesMenuOpenedAtLeastOnce: false,
waterWavesOnCliffShores: false,
waterWavesOnRollingShores: false,
useTerrainFog: false,
tftRequired: false,
useItemClassificationSystem: false,
enableWaterTinting: false,
useAccurateProbabilityForCalculations: false,
useCustomAbilitySkins: false,
disableDenyIcon: false,
forceDefaultCameraZoom: false,
forceMaxCameraZoom: false,
forceMinCameraZoom: false // 0x400000
}
},
loadingScreen: {
background: 0,
path: '',
text: '',
title: '',
subtitle: ''
},
prologue: {
path: '',
text: '',
title: '',
subtitle: ''
},
fog: {
type: Info_1.FogType.Linear,
startHeight: 0,
endHeight: 0,
density: 0,
color: [0, 0, 0, 1]
},
camera: {
bounds: [],
complements: []
},
players: [],
forces: [],
saves: 0,
editorVersion: 0,
scriptLanguage: Info_1.ScriptLanguage.JASS,
supportedModes: Info_1.SupportedModes.Both,
forcedDefaultCamDistance: 1250,
forcedMaxCamDistance: 1250,
forcedMinCamDistance: 1250,
gameVersion: {
major: 0,
minor: 0,
patch: 0,
build: 0
},
globalWeather: 0,
customSoundEnvironment: '',
customLightEnv: 0,
water: [],
gameDataVersion: 0,
gameDataSet: 0,
upgrades: [],
techBlacklist: [],
randomUnitTables: [],
randomItemTables: []
};
const outBufferToJSON = new W3Buffer_1.W3Buffer(buffer);
const fileVersion = outBufferToJSON.readInt();
result.saves = outBufferToJSON.readInt();
result.editorVersion = outBufferToJSON.readInt();
result.gameVersion = {
major: outBufferToJSON.readInt(),
minor: outBufferToJSON.readInt(),
patch: outBufferToJSON.readInt(),
build: outBufferToJSON.readInt()
};
result.map.name = outBufferToJSON.readString();
result.map.author = outBufferToJSON.readString();
result.map.description = outBufferToJSON.readString();
result.map.recommendedPlayers = outBufferToJSON.readString();
result.camera.bounds = [
outBufferToJSON.readFloat(), outBufferToJSON.readFloat(), outBufferToJSON.readFloat(), outBufferToJSON.readFloat(),
outBufferToJSON.readFloat(), outBufferToJSON.readFloat(), outBufferToJSON.readFloat(), outBufferToJSON.readFloat()
];
result.camera.complements = [
outBufferToJSON.readInt(), outBufferToJSON.readInt(), outBufferToJSON.readInt(), outBufferToJSON.readInt()
];
result.map.playableArea = {
width: outBufferToJSON.readInt(),
height: outBufferToJSON.readInt()
};
const flags = outBufferToJSON.readInt();
result.map.flags = {
hideMinimapInPreview: !!(flags & 0x0001),
modifyAllyPriorities: !!(flags & 0x0002),
isMeleeMap: !!(flags & 0x0004),
nonDefaultTilesetMapSizeLargeNeverBeenReducedToMedium: !!(flags & 0x0008),
maskedPartiallyVisible: !!(flags & 0x0010),
fixedPlayerSetting: !!(flags & 0x0020),
useCustomForces: !!(flags & 0x0040),
useCustomTechtree: !!(flags & 0x0080),
useCustomAbilities: !!(flags & 0x0100),
useCustomUpgrades: !!(flags & 0x0200),
mapPropertiesMenuOpenedAtLeastOnce: !!(flags & 0x0400),
waterWavesOnCliffShores: !!(flags & 0x0800),
waterWavesOnRollingShores: !!(flags & 0x1000),
useTerrainFog: !!(flags & 0x2000),
tftRequired: !!(flags & 0x4000),
useItemClassificationSystem: !!(flags & 0x8000),
enableWaterTinting: !!(flags & 0x10000),
useAccurateProbabilityForCalculations: !!(flags & 0x20000),
useCustomAbilitySkins: !!(flags & 0x40000),
disableDenyIcon: !!(flags & 0x80000),
forceDefaultCameraZoom: !!(flags & 0x100000),
forceMaxCameraZoom: !!(flags & 0x200000),
forceMinCameraZoom: !!(flags & 0x400000)
};
result.map.mainTileType = outBufferToJSON.readChars();
result.loadingScreen.background = outBufferToJSON.readInt();
result.loadingScreen.path = outBufferToJSON.readString();
result.loadingScreen.text = outBufferToJSON.readString();
result.loadingScreen.title = outBufferToJSON.readString();
result.loadingScreen.subtitle = outBufferToJSON.readString();
result.gameDataSet = outBufferToJSON.readInt(); // 0 = standard
result.prologue = {
path: outBufferToJSON.readString(),
text: outBufferToJSON.readString(),
title: outBufferToJSON.readString(),
subtitle: outBufferToJSON.readString()
};
result.fog = {
type: outBufferToJSON.readInt(),
startHeight: outBufferToJSON.readFloat(),
endHeight: outBufferToJSON.readFloat(),
density: outBufferToJSON.readFloat(),
color: [outBufferToJSON.readByte(), outBufferToJSON.readByte(), outBufferToJSON.readByte(), outBufferToJSON.readByte()] // R G B A
};
result.globalWeather = outBufferToJSON.readInt();
result.customSoundEnvironment = outBufferToJSON.readString();
result.customLightEnv = outBufferToJSON.readByte();
result.water = [outBufferToJSON.readByte(), outBufferToJSON.readByte(), outBufferToJSON.readByte(), outBufferToJSON.readByte()]; // R G B A
result.scriptLanguage = outBufferToJSON.readInt();
result.supportedModes = outBufferToJSON.readInt();
result.gameDataVersion = outBufferToJSON.readInt();
if (fileVersion >= 32) {
result.forcedDefaultCamDistance = outBufferToJSON.readInt();
result.forcedMaxCamDistance = outBufferToJSON.readInt();
}
if (fileVersion >= 33) {
result.forcedMinCamDistance = outBufferToJSON.readInt();
}
// Struct: players
const numPlayers = outBufferToJSON.readInt();
for (let i = 0; i < numPlayers; i++) {
const player = {
name: '',
startingPos: { x: 0, y: 0, fixed: false },
playerNum: 0,
type: 0,
race: 0,
allyLowPriorities: 0,
allyHighPriorities: 0,
enemyLowPriorities: 0,
enermyHighPriorities: 0
};
player.playerNum = outBufferToJSON.readInt();
player.type = outBufferToJSON.readInt(); // 1=Human, 2=Computer, 3=Neutral, 4=Rescuable
player.race = outBufferToJSON.readInt(); // 1=Human, 2=Orc, 3=Undead, 4=Night Elf
const isPlayerStartPositionFixed = outBufferToJSON.readInt() === 1; // 00000001 = fixed start position
player.name = outBufferToJSON.readString();
player.startingPos = {
x: outBufferToJSON.readFloat(),
y: outBufferToJSON.readFloat(),
fixed: isPlayerStartPositionFixed
};
player.allyLowPriorities = outBufferToJSON.readInt(); // ally low priorities flags (bit "x"=1 --> set for player "x")
player.allyHighPriorities = outBufferToJSON.readInt(); // ally high priorities flags (bit "x"=1 --> set for player "x")
player.enemyLowPriorities = outBufferToJSON.readInt(); // enemy low priorities flags
player.enermyHighPriorities = outBufferToJSON.readInt(); // enemy high priorities flags
result.players.push(player);
}
// Struct: forces
const numForces = outBufferToJSON.readInt();
for (let i = 0; i < numForces; i++) {
const force = {
flags: { allied: false, alliedVictory: true, shareVision: true, shareUnitControl: false, shareAdvUnitControl: false },
players: 0,
name: ''
};
const forceFlag = outBufferToJSON.readInt();
force.flags = {
allied: !!(forceFlag & 0b1),
alliedVictory: !!(forceFlag & 0b10),
// 0x00000004: share vision (the documentation has this incorrect)
shareVision: !!(forceFlag & 0b1000),
shareUnitControl: !!(forceFlag & 0b10000),
shareAdvUnitControl: !!(forceFlag & 0b100000) // 0x00000020: share advanced unit control
};
force.players = outBufferToJSON.readInt(); // UNSUPPORTED: (bit "x"=1 --> player "x" is in this force; but carried over for accurate translation
force.name = outBufferToJSON.readString();
result.forces.push(force);
}
// Struct: upgrade avail.
const numUpgrades = outBufferToJSON.readInt();
for (let i = 0; i < numUpgrades; i++) {
result.upgrades.push({
playerFlags: outBufferToJSON.readInt(),
upgradeId: outBufferToJSON.readChars(4),
level: outBufferToJSON.readInt(),
availability: outBufferToJSON.readInt() // Availability (0 = unavailable, 1 = available, 2 = researched)
});
}
// Struct: tech avail.
const numTech = outBufferToJSON.readInt();
for (let i = 0; i < numTech; i++) {
result.techBlacklist.push({
playerFlags: outBufferToJSON.readInt(),
techId: outBufferToJSON.readChars(4) // tech id (this can be an item, unit or ability)
});
}
// Struct: random unit table
const numUnitTable = outBufferToJSON.readInt();
for (let i = 0; i < numUnitTable; i++) {
result.randomUnitTables.push({
id: outBufferToJSON.readInt(),
name: outBufferToJSON.readString(),
positions: [],
chances: []
});
const numPositions = outBufferToJSON.readInt(); // Number "m" of positions
for (let j = 0; j < numPositions; j++) {
result.randomUnitTables[i].positions.push(outBufferToJSON.readInt()); // Apparently, the following is false: unit table (=0), a building table (=1) or an item table (=2)
}
const numChances = outBufferToJSON.readInt();
for (let j = 0; j < numChances; j++) {
result.randomUnitTables[i].chances.push({
chance: outBufferToJSON.readInt(),
unitIds: []
});
for (let k = 0; k < numPositions; k++) {
result.randomUnitTables[i].chances[j].unitIds.push(outBufferToJSON.readChars(4)); // unit/item id's for this line specified
}
}
}
// Struct: random item table
const numItemTable = outBufferToJSON.readInt();
for (let i = 0; i < numItemTable; i++) {
result.randomItemTables.push({
id: outBufferToJSON.readInt(),
name: outBufferToJSON.readString(),
rows: []
});
const itemSetsCurrentTable = outBufferToJSON.readInt(); // Number "m" of item sets on the current item table
for (let j = 0; j < itemSetsCurrentTable; j++) {
result.randomItemTables[i].rows.push({
type: 2,
objects: []
});
const itemsInItemSet = outBufferToJSON.readInt(); // Number "i" of items on the current item set
for (let k = 0; k < itemsInItemSet; k++) {
result.randomItemTables[i].rows[j].objects.push({
chance: outBufferToJSON.readInt(),
objectId: outBufferToJSON.readChars(4) // Item id (as in ItemData.slk)
});
}
}
}
return {
errors: [],
json: result
};
}
}
exports.InfoTranslator = InfoTranslator;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSW5mb1RyYW5zbGF0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvd2MzbWFwdHJhbnNsYXRvci90cmFuc2xhdG9ycy9JbmZvVHJhbnNsYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxrRUFBa0U7QUFDbEUsNENBQXdDO0FBQ3hDLDBDQUFzQztBQUd0Qyx1Q0FBMEc7QUFFMUcsTUFBYSxjQUFjO0lBR3pCLGdCQUF3QixDQUFDO0lBRWxCLE1BQU0sQ0FBQyxXQUFXO1FBQ3ZCLElBQUksSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLEVBQUU7WUFDekIsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLElBQUksRUFBRSxDQUFBO1NBQzNCO1FBQ0QsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFBO0lBQ3RCLENBQUM7SUFFTSxNQUFNLENBQUMsU0FBUyxDQUFDLElBQVU7UUFDaEMsT0FBTyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFBO0lBQzNDLENBQUM7SUFFTSxNQUFNLENBQUMsU0FBUyxDQUFDLE1BQWM7UUFDcEMsT0FBTyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFBO0lBQzdDLENBQUM7SUFFTSxTQUFTLENBQUMsUUFBYztRQUM3QixNQUFNLGNBQWMsR0FBRyxJQUFJLHFCQUFTLEVBQUUsQ0FBQTtRQUV0QyxjQUFjLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFBLENBQUMsaUJBQWlCO1FBQzNDLGNBQWMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBQ2xFLGNBQWMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLGFBQWEsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FB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