@jsprismarine/prismarine
Version:
Dedicated Minecraft Bedrock Edition server written in TypeScript
155 lines (148 loc) • 19 kB
JavaScript
;
Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: 'Module' } });
const block_BlockMappings = require('../../block/BlockMappings.cjs.cjs');
const BinaryStream = require('@jsprismarine/jsbinaryutils');
const math = require('@jsprismarine/math');
const world_chunk_SubChunk = require('./SubChunk.cjs.cjs');
const _interopDefault = e => e && e.__esModule ? e : { default: e };
const BinaryStream__default = /*#__PURE__*/_interopDefault(BinaryStream);
const MAX_SUBCHUNKS = 16;
class Chunk {
x;
z;
hasChanged;
subChunks = /* @__PURE__ */ new Map();
static EMPTY_SUBCHUNK = new world_chunk_SubChunk.default();
constructor(chunkX = 0, chunkZ = 0, _subChunks = /* @__PURE__ */ new Map()) {
this.x = chunkX;
this.z = chunkZ;
this.hasChanged = false;
}
getX() {
return this.x;
}
getZ() {
return this.z;
}
getHasChanged() {
return this.hasChanged;
}
getHeight() {
return this.subChunks.size;
}
/**
* Returns the highest empty sub chunk (so we don't send empty sub chunks).
* @returns {number} The highest empty sub chunk.
*/
getTopEmpty() {
let topEmpty = MAX_SUBCHUNKS - 1;
while (topEmpty >= 0 && !this.subChunks.has(topEmpty) || this.subChunks.has(topEmpty) && this.subChunks.get(topEmpty).isEmpty()) {
topEmpty--;
}
return ++topEmpty;
}
/**
* Returns the Chunk slice at the given layer.
* @param {number} y - The layer to get.
*/
getSubChunk(y) {
if (y < 0 || y > MAX_SUBCHUNKS) {
throw new Error(`Invalid subchunk height: ${y}`);
}
return this.subChunks.get(y) ?? null;
}
getOrCreateSubChunk(y) {
const subChunk = new world_chunk_SubChunk.default();
this.subChunks.set(y, subChunk);
return subChunk;
}
getSubChunks() {
return this.subChunks;
}
getHighestBlockAt(_x, _z) {
return 100;
}
/**
* Returns block legacy id (DATA) in the corresponding sub chunk.
* Use world to get the actual block instance (this is to keep code clean).
* @param {Vector3 | number} x - block x.
* @param {number} [y=0] - block y.
* @param {number} [z=0] - block z.
* @param {number} [layer=0] - block storage layer (0 for blocks, 1 for liquids).
*/
getBlock(x, y = 0, z = 0, layer = 0) {
if (x instanceof math.Vector3) {
return this.getBlock(x.getX(), x.getY(), x.getZ(), layer);
}
const subChunk = this.getSubChunk(Math.floor(y / 16));
if (!subChunk) return block_BlockMappings.BlockMappings.getLegacyId(block_BlockMappings.BlockMappings.getRuntimeId("minecraft:air"));
return subChunk.getBlock(x, y & 15, z, layer);
}
/**
* Sets a block into the chunk by its runtime Id.
* @param {number} x - block x
* @param {number} y - block y
* @param {number} z - block z
* @param {Block} block - block to set
* @param {number} [layer=0] - block storage layer (0 for blocks, 1 for liquids)
*/
setBlock(x, y, z, block, layer = 0) {
let subChunk = this.getSubChunk(Math.floor(y / 16));
if (!subChunk) subChunk = this.getOrCreateSubChunk(y >> 4);
subChunk.setBlock(x, y & 15, z, block_BlockMappings.BlockMappings.getRuntimeId(block.getName()), layer);
this.hasChanged = true;
}
/**
* Helper method used to hash into a single 64 bits integer
* both Chunk X and Z coordinates.
* @param {number} chunkX - Target Chunk X coordinate.
* @param {number} chunkZ - Target Chunk Z coordinate.
* @returns {bigint} A 64 bit intger containing a hash of X and Z.
*/
static packXZ(chunkX, chunkZ) {
return (BigInt(chunkX) & 0xffffffffn) << 32n | BigInt(chunkZ) & 0xffffffffn;
}
/**
* Helper method used to decode a 64 bit hash containing
* both Chunk X and Z coordinates.
* @param {bigint} packed - Target Chunk coordinate hash.
* @returns {number[]} An array containing decoded Chunk X and Z coordinates.
*/
static unpackXZ(packed) {
return [Number(BigInt.asIntN(32, packed >> 32n)), Number(BigInt.asIntN(32, packed & 0xffffffffn))];
}
networkSerialize() {
const stream = new BinaryStream__default.default();
for (let y = 0; y < 4; ++y) {
stream.writeByte(8);
stream.writeByte(0);
}
for (let y = 0; y < this.getTopEmpty(); ++y) {
(this.subChunks.get(y) ?? Chunk.EMPTY_SUBCHUNK).networkSerialize(stream);
}
for (let i = 0; i < 24; i++) {
stream.writeByte(0);
stream.writeUnsignedVarInt(1 << 1);
}
stream.writeByte(0);
return stream.getBuffer();
}
/**
* Deserialize network stream into chunk
* useful for client applications and/or our Filesystem impl
* @param {BinaryStream} stream - the network stream
* @param {number} [x] - the chunk x coordinate
* @param {number} [z] - the chunk z coordinate
*/
static networkDeserialize(stream, x, z) {
stream.read(8);
const subChunks = /* @__PURE__ */ new Map();
for (let i = 0; i < MAX_SUBCHUNKS; i++) {
subChunks.set(i, world_chunk_SubChunk.default.networkDeserialize(stream));
}
const chunk = new Chunk(x, z, subChunks);
return chunk;
}
}
exports.default = Chunk;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ2h1bmsuY2pzLmNqcyIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3dvcmxkL2NodW5rL0NodW5rLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgTGVnYWN5SWQgfSBmcm9tICcuLi8uLi9ibG9jay9CbG9ja01hcHBpbmdzJztcbmltcG9ydCB7IEJsb2NrTWFwcGluZ3MgfSBmcm9tICcuLi8uLi9ibG9jay9CbG9ja01hcHBpbmdzJztcblxuaW1wb3J0IEJpbmFyeVN0cmVhbSBmcm9tICdAanNwcmlzbWFyaW5lL2pzYmluYXJ5dXRpbHMnO1xuaW1wb3J0IHsgVmVjdG9yMyB9IGZyb20gJ0Bqc3ByaXNtYXJpbmUvbWF0aCc7XG5pbXBvcnQgdHlwZSB7IEJsb2NrIH0gZnJvbSAnLi4vLi4vYmxvY2svQmxvY2snO1xuaW1wb3J0IFN1YkNodW5rIGZyb20gJy4vU3ViQ2h1bmsnO1xuXG5jb25zdCBNQVhfU1VCQ0hVTktTID0gMTY7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENodW5rIHtcbiAgICBwcml2YXRlIHg6IG51bWJlcjtcbiAgICBwcml2YXRlIHo6IG51bWJlcjtcbiAgICBwcml2YXRlIGhhc0NoYW5nZWQ6IGJvb2xlYW47XG5cbiAgICBwcml2YXRlIHN1YkNodW5rczogTWFwPG51bWJlciwgU3ViQ2h1bms+ID0gbmV3IE1hcCgpO1xuICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IEVNUFRZX1NVQkNIVU5LID0gbmV3IFN1YkNodW5rKCk7XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IoY2h1bmtYID0gMCwgY2h1bmtaID0gMCwgX3N1YkNodW5rczogTWFwPG51bWJlciwgU3ViQ2h1bms+ID0gbmV3IE1hcCgpKSB7XG4gICAgICAgIHRoaXMueCA9IGNodW5rWDtcbiAgICAgICAgdGhpcy56ID0gY2h1bmtaO1xuICAgICAgICB0aGlzLmhhc0NoYW5nZWQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0WCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy54O1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRaKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLno7XG4gICAgfVxuXG4gICAgcHVibGljIGdldEhhc0NoYW5nZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmhhc0NoYW5nZWQ7XG4gICAgfVxuXG4gICAgcHVibGljIGdldEhlaWdodCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5zdWJDaHVua3Muc2l6ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBoaWdoZXN0IGVtcHR5IHN1YiBjaHVuayAoc28gd2UgZG9uJ3Qgc2VuZCBlbXB0eSBzdWIgY2h1bmtzKS5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBUaGUgaGlnaGVzdCBlbXB0eSBzdWIgY2h1bmsuXG4gICAgICovXG4gICAgcHVibGljIGdldFRvcEVtcHR5KCk6IG51bWJlciB7XG4gICAgICAgIGxldCB0b3BFbXB0eSA9IE1BWF9TVUJDSFVOS1MgLSAxO1xuICAgICAgICB3aGlsZSAoXG4gICAgICAgICAgICAodG9wRW1wdHkgPj0gMCAmJiAhdGhpcy5zdWJDaHVua3MuaGFzKHRvcEVtcHR5KSkgfHxcbiAgICAgICAgICAgICh0aGlzLnN1YkNodW5rcy5oYXModG9wRW1wdHkpICYmIHRoaXMuc3ViQ2h1bmtzLmdldCh0b3BFbXB0eSkhLmlzRW1wdHkoKSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgICB0b3BFbXB0eS0tO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiArK3RvcEVtcHR5O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIENodW5rIHNsaWNlIGF0IHRoZSBnaXZlbiBsYXllci5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0geSAtIFRoZSBsYXllciB0byBnZXQuXG4gICAgICovXG4gICAgcHVibGljIGdldFN1YkNodW5rKHk6IG51bWJlcik6IFN1YkNodW5rIHwgbnVsbCB7XG4gICAgICAgIGlmICh5IDwgMCB8fCB5ID4gTUFYX1NVQkNIVU5LUykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHN1YmNodW5rIGhlaWdodDogJHt5fWApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnN1YkNodW5rcy5nZXQoeSkgPz8gbnVsbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0T3JDcmVhdGVTdWJDaHVuayh5OiBudW1iZXIpOiBTdWJDaHVuayB7XG4gICAgICAgIGNvbnN0IHN1YkNodW5rID0gbmV3IFN1YkNodW5rKCk7XG4gICAgICAgIHRoaXMuc3ViQ2h1bmtzLnNldCh5LCBzdWJDaHVuayk7XG4gICAgICAgIHJldHVybiBzdWJDaHVuaztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0U3ViQ2h1bmtzKCk6IE1hcDxudW1iZXIsIFN1YkNodW5rPiB7XG4gICAgICAgIHJldHVybiB0aGlzLnN1YkNodW5rcztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0SGlnaGVzdEJsb2NrQXQoX3g6IG51bWJlciwgX3o6IG51bWJlcik6IG51bWJlciB7XG4gICAgICAgIHJldHVybiAxMDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBibG9jayBsZWdhY3kgaWQgKERBVEEpIGluIHRoZSBjb3JyZXNwb25kaW5nIHN1YiBjaHVuay5cbiAgICAgKiBVc2Ugd29ybGQgdG8gZ2V0IHRoZSBhY3R1YWwgYmxvY2sgaW5zdGFuY2UgKHRoaXMgaXMgdG8ga2VlcCBjb2RlIGNsZWFuKS5cbiAgICAgKiBAcGFyYW0ge1ZlY3RvcjMgfCBudW1iZXJ9IHggLSBibG9jayB4LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbeT0wXSAtIGJsb2NrIHkuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFt6PTBdIC0gYmxvY2sgei5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2xheWVyPTBdIC0gYmxvY2sgc3RvcmFnZSBsYXllciAoMCBmb3IgYmxvY2tzLCAxIGZvciBsaXF1aWRzKS5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0QmxvY2soeDogVmVjdG9yMyB8IG51bWJlciwgeTogbnVtYmVyID0gMCwgejogbnVtYmVyID0gMCwgbGF5ZXIgPSAwKTogTGVnYWN5SWQge1xuICAgICAgICBpZiAoeCBpbnN0YW5jZW9mIFZlY3RvcjMpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldEJsb2NrKHguZ2V0WCgpLCB4LmdldFkoKSwgeC5nZXRaKCksIGxheWVyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHN1YkNodW5rID0gdGhpcy5nZXRTdWJDaHVuayhNYXRoLmZsb29yKHkgLyAxNikpO1xuICAgICAgICBpZiAoIXN1YkNodW5rKSByZXR1cm4gQmxvY2tNYXBwaW5ncy5nZXRMZWdhY3lJZChCbG9ja01hcHBpbmdzLmdldFJ1bnRpbWVJZCgnbWluZWNyYWZ0OmFpcicpKTtcbiAgICAgICAgcmV0dXJuIHN1YkNodW5rLmdldEJsb2NrKHgsIHkgJiAweGYsIHosIGxheWVyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIGEgYmxvY2sgaW50byB0aGUgY2h1bmsgYnkgaXRzIHJ1bnRpbWUgSWQuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHggLSBibG9jayB4XG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHkgLSBibG9jayB5XG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHogLSBibG9jayB6XG4gICAgICogQHBhcmFtIHtCbG9ja30gYmxvY2sgLSBibG9jayB0byBzZXRcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2xheWVyPTBdIC0gYmxvY2sgc3RvcmFnZSBsYXllciAoMCBmb3IgYmxvY2tzLCAxIGZvciBsaXF1aWRzKVxuICAgICAqL1xuICAgIHB1YmxpYyBzZXRCbG9jayh4OiBudW1iZXIsIHk6IG51bWJlciwgejogbnVtYmVyLCBibG9jazogQmxvY2ssIGxheWVyID0gMCk6IHZvaWQge1xuICAgICAgICBsZXQgc3ViQ2h1bmsgPSB0aGlzLmdldFN1YkNodW5rKE1hdGguZmxvb3IoeSAvIDE2KSk7XG4gICAgICAgIGlmICghc3ViQ2h1bmspIHN1YkNodW5rID0gdGhpcy5nZXRPckNyZWF0ZVN1YkNodW5rKHkgPj4gNCk7XG4gICAgICAgIHN1YkNodW5rLnNldEJsb2NrKHgsIHkgJiAweGYsIHosIEJsb2NrTWFwcGluZ3MuZ2V0UnVudGltZUlkKGJsb2NrLmdldE5hbWUoKSksIGxheWVyKTtcblxuICAgICAgICB0aGlzLmhhc0NoYW5nZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEhlbHBlciBtZXRob2QgdXNlZCB0byBoYXNoIGludG8gYSBzaW5nbGUgNjQgYml0cyBpbnRlZ2VyXG4gICAgICogYm90aCBDaHVuayBYIGFuZCBaIGNvb3JkaW5hdGVzLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBjaHVua1ggLSBUYXJnZXQgQ2h1bmsgWCBjb29yZGluYXRlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBjaHVua1ogLSBUYXJnZXQgQ2h1bmsgWiBjb29yZGluYXRlLlxuICAgICAqIEByZXR1cm5zIHtiaWdpbnR9IEEgNjQgYml0IGludGdlciBjb250YWluaW5nIGEgaGFzaCBvZiBYIGFuZCBaLlxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgcGFja1haKGNodW5rWDogbnVtYmVyLCBjaHVua1o6IG51bWJlcik6IGJpZ2ludCB7XG4gICAgICAgIHJldHVybiAoKEJpZ0ludChjaHVua1gpICYgMHhmZmZmZmZmZm4pIDw8IDMybikgfCAoQmlnSW50KGNodW5rWikgJiAweGZmZmZmZmZmbik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSGVscGVyIG1ldGhvZCB1c2VkIHRvIGRlY29kZSBhIDY0IGJpdCBoYXNoIGNvbnRhaW5pbmdcbiAgICAgKiBib3RoIENodW5rIFggYW5kIFogY29vcmRpbmF0ZXMuXG4gICAgICogQHBhcmFtIHtiaWdpbnR9IHBhY2tlZCAtIFRhcmdldCBDaHVuayBjb29yZGluYXRlIGhhc2guXG4gICAgICogQHJldHVybnMge251bWJlcltdfSBBbiBhcnJheSBjb250YWluaW5nIGRlY29kZWQgQ2h1bmsgWCBhbmQgWiBjb29yZGluYXRlcy5cbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIHVucGFja1haKHBhY2tlZDogYmlnaW50KTogbnVtYmVyW10ge1xuICAgICAgICByZXR1cm4gW051bWJlcihCaWdJbnQuYXNJbnROKDMyLCBwYWNrZWQgPj4gMzJuKSksIE51bWJlcihCaWdJbnQuYXNJbnROKDMyLCBwYWNrZWQgJiAweGZmZmZmZmZmbikpXTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbmV0d29ya1NlcmlhbGl6ZSgpOiBCdWZmZXIge1xuICAgICAgICBjb25zdCBzdHJlYW0gPSBuZXcgQmluYXJ5U3RyZWFtKCk7XG5cbiAgICAgICAgLy8gRm9yIHNvbWUgcmVhc29ucyB3ZSBuZWVkIHRoaXMgaGFjayBzaW5jZSAxLjE4LFxuICAgICAgICAvLyBzZWVtcyBsaWtlIHRoZSBjbGllbnQgbm93IGhhcyBzb21lIG5lZ2F0aXZlIHNwYWNlLlxuICAgICAgICAvLyBUT0RPOiBmaWd1cmUgb3V0IHdoYXQgaXMgdGhpc1xuICAgICAgICBmb3IgKGxldCB5ID0gMDsgeSA8IDQ7ICsreSkge1xuICAgICAgICAgICAgc3RyZWFtLndyaXRlQnl0ZSg4KTsgLy8gc3ViY2h1bmsgdmVyc2lvbiA4XG4gICAgICAgICAgICBzdHJlYW0ud3JpdGVCeXRlKDApOyAvLyAwIGxheWVycyAoYWxsIGFpcilcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAobGV0IHkgPSAwOyB5IDwgdGhpcy5nZXRUb3BFbXB0eSgpOyArK3kpIHtcbiAgICAgICAgICAgICh0aGlzLnN1YkNodW5rcy5nZXQoeSkgPz8gQ2h1bmsuRU1QVFlfU1VCQ0hVTkspLm5ldHdvcmtTZXJpYWxpemUoc3RyZWFtKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRPRE86IDNEIGJpb21lc1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDI0OyBpKyspIHtcbiAgICAgICAgICAgIHN0cmVhbS53cml0ZUJ5dGUoMCk7IC8vIGZha2UgYmlvbWUgcGFsZXR0ZSwgbm9uIHBlcnNpc3RlbnRcbiAgICAgICAgICAgIHN0cmVhbS53cml0ZVVuc2lnbmVkVmFySW50KDEgPDwgMSk7IC8vIHBsYWluc1xuICAgICAgICB9XG5cbiAgICAgICAgc3RyZWFtLndyaXRlQnl0ZSgwKTsgLy8gYm9yZGVyID9cblxuICAgICAgICAvLyBUT0RPOiB0aWxlc1xuICAgICAgICByZXR1cm4gc3RyZWFtLmdldEJ1ZmZlcigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlc2VyaWFsaXplIG5ldHdvcmsgc3RyZWFtIGludG8gY2h1bmtcbiAgICAgKiB1c2VmdWwgZm9yIGNsaWVudCBhcHBsaWNhdGlvbnMgYW5kL29yIG91ciBGaWxlc3lzdGVtIGltcGxcbiAgICAgKiBAcGFyYW0ge0JpbmFyeVN0cmVhbX0gc3RyZWFtIC0gdGhlIG5ldHdvcmsgc3RyZWFtXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFt4XSAtIHRoZSBjaHVuayB4IGNvb3JkaW5hdGVcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3pdIC0gdGhlIGNodW5rIHogY29vcmRpbmF0ZVxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgbmV0d29ya0Rlc2VyaWFsaXplKHN0cmVhbTogQmluYXJ5U3RyZWFtLCB4PzogbnVtYmVyLCB6PzogbnVtYmVyKTogQ2h1bmsge1xuICAgICAgICBzdHJlYW0ucmVhZCg4KTsgLy8gc2tpcCBmYWtlIHN1YmNodW5rc1xuXG4gICAgICAgIGNvbnN0IHN1YkNodW5rczogTWFwPG51bWJlciwgU3ViQ2h1bms+ID0gbmV3IE1hcCgpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IE1BWF9TVUJDSFVOS1M7IGkrKykge1xuICAgICAgICAgICAgc3ViQ2h1bmtzLnNldChpLCBTdWJDaHVuay5uZXR3b3JrRGVzZXJpYWxpemUoc3RyZWFtKSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjaHVuayA9IG5ldyBDaHVuayh4LCB6LCBzdWJDaHVua3MpO1xuICAgICAgICByZXR1cm4gY2h1bms7XG4gICAgfVxufVxuIl0sIm5hbWVzIjpbIlN1YkNodW5rIiwiVmVjdG9yMyIsIkJsb2NrTWFwcGluZ3MiLCJCaW5hcnlTdHJlYW0iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7QUFRQSxNQUFNLGFBQWdCLEdBQUEsRUFBQTtBQUV0QixNQUFxQixLQUFNLENBQUE7QUFBQSxFQUNmLENBQUE7QUFBQSxFQUNBLENBQUE7QUFBQSxFQUNBLFVBQUE7QUFBQSxFQUVBLFNBQUEsdUJBQXVDLEdBQUksRUFBQTtBQUFBLEVBQ25ELE9BQXdCLGNBQWlCLEdBQUEsSUFBSUEsNEJBQVMsRUFBQTtBQUFBLEVBRS9DLFdBQUEsQ0FBWSxTQUFTLENBQUcsRUFBQSxNQUFBLEdBQVMsR0FBRyxVQUFvQyxtQkFBQSxJQUFJLEtBQU8sRUFBQTtBQUN0RixJQUFBLElBQUEsQ0FBSyxDQUFJLEdBQUEsTUFBQTtBQUNULElBQUEsSUFBQSxDQUFLLENBQUksR0FBQSxNQUFBO0FBQ1QsSUFBQSxJQUFBLENBQUssVUFBYSxHQUFBLEtBQUE7QUFBQTtBQUN0QixFQUVPLElBQWUsR0FBQTtBQUNsQixJQUFBLE9BQU8sSUFBSyxDQUFBLENBQUE7QUFBQTtBQUNoQixFQUVPLElBQWUsR0FBQTtBQUNsQixJQUFBLE9BQU8sSUFBSyxDQUFBLENBQUE7QUFBQTtBQUNoQixFQUVPLGFBQXlCLEdBQUE7QUFDNUIsSUFBQSxPQUFPLElBQUssQ0FBQSxVQUFBO0FBQUE7QUFDaEIsRUFFTyxTQUFvQixHQUFBO0FBQ3ZCLElBQUEsT0FBTyxLQUFLLFNBQVUsQ0FBQSxJQUFBO0FBQUE7QUFDMUI7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU1PLFdBQXNCLEdBQUE7QUFDekIsSUFBQSxJQUFJLFdBQVcsYUFBZ0IsR0FBQSxDQUFBO0FBQy9CLElBQUEsT0FDSyxZQUFZLENBQUssSUFBQSxDQUFDLEtBQUssU0FBVSxDQUFB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